001    /**
002     * Copyright (c) 2000-2011 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
014    
015    package com.liferay.portal.metadata;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.exception.SystemException;
019    import com.liferay.portal.kernel.log.Log;
020    import com.liferay.portal.kernel.log.LogFactoryUtil;
021    import com.liferay.portal.kernel.metadata.RawMetadataProcessor;
022    import com.liferay.portlet.dynamicdatamapping.storage.Fields;
023    
024    import java.io.File;
025    import java.io.InputStream;
026    
027    import java.lang.reflect.Field;
028    
029    import java.util.HashMap;
030    import java.util.Map;
031    import java.util.Set;
032    
033    import org.apache.tika.metadata.ClimateForcast;
034    import org.apache.tika.metadata.CreativeCommons;
035    import org.apache.tika.metadata.DublinCore;
036    import org.apache.tika.metadata.Geographic;
037    import org.apache.tika.metadata.HttpHeaders;
038    import org.apache.tika.metadata.MSOffice;
039    import org.apache.tika.metadata.Message;
040    import org.apache.tika.metadata.Metadata;
041    import org.apache.tika.metadata.Property;
042    import org.apache.tika.metadata.TIFF;
043    import org.apache.tika.metadata.TikaMetadataKeys;
044    import org.apache.tika.metadata.TikaMimeKeys;
045    
046    /**
047     * @author Alexander Chow
048     */
049    public abstract class BaseRawMetadataProcessor implements RawMetadataProcessor {
050    
051            public Map<String, Field[]> getFields() {
052                    return _fields;
053            }
054    
055            public Map<String, Fields> getRawMetadataMap(
056                            String extension, String mimeType, File file)
057                    throws PortalException, SystemException {
058    
059                    Metadata metadata = extractMetadata(extension, mimeType, file);
060    
061                    return createDDMFieldsMap(metadata, getFields());
062            }
063    
064            public Map<String, Fields> getRawMetadataMap(
065                            String extension, String mimeType, InputStream inputStream)
066                    throws PortalException, SystemException {
067    
068                    Metadata metadata = extractMetadata(extension, mimeType, inputStream);
069    
070                    return createDDMFieldsMap(metadata, getFields());
071            }
072    
073            protected Fields createDDMFields(Metadata metadata, Field[] fields) {
074                    Fields ddmFields = new Fields();
075    
076                    for (Field field : fields) {
077                            String value = getMetadataValue(metadata, field);
078    
079                            if (value == null) {
080                                    continue;
081                            }
082    
083                            com.liferay.portlet.dynamicdatamapping.storage.Field ddmField =
084                                    new com.liferay.portlet.dynamicdatamapping.storage.Field(
085                                            field.getName(), value);
086    
087                            ddmFields.put(ddmField);
088                    }
089    
090                    return ddmFields;
091            }
092    
093            protected Map<String, Fields> createDDMFieldsMap(
094                    Metadata metadata, Map<String, Field[]> fieldsMap) {
095    
096                    Map<String, Fields> ddmFieldsMap = new HashMap<String, Fields>();
097    
098                    if (metadata == null) {
099                            return ddmFieldsMap;
100                    }
101    
102                    for (String key : fieldsMap.keySet()) {
103                            Field[] fields = fieldsMap.get(key);
104    
105                            Fields ddmFields = createDDMFields(metadata, fields);
106    
107                            Set<String> names = ddmFields.getNames();
108    
109                            if (names.isEmpty()) {
110                                    continue;
111                            }
112    
113                            ddmFieldsMap.put(key, ddmFields);
114                    }
115    
116                    return ddmFieldsMap;
117            }
118    
119            protected abstract Metadata extractMetadata(
120                            String extension, String mimeType, File file)
121                    throws PortalException, SystemException;
122    
123            protected abstract Metadata extractMetadata(
124                            String extension, String mimeType, InputStream inputStream)
125                    throws PortalException, SystemException;
126    
127            protected Object getFieldValue(Metadata metadata, Field field) {
128                    Object fieldValue = null;
129    
130                    try {
131                            fieldValue = field.get(metadata);
132                    }
133                    catch (IllegalAccessException iae) {
134                            if (_log.isWarnEnabled()) {
135                                    _log.warn(
136                                            "The property " + field.getName() +
137                                                    " will not be added to the metatada set");
138                            }
139                    }
140    
141                    return fieldValue;
142            }
143    
144            protected String getMetadataValue(Metadata metadata, Field field) {
145                    Object fieldValue = getFieldValue(metadata, field);
146    
147                    if (fieldValue instanceof String) {
148                            return metadata.get((String)fieldValue);
149                    }
150                    else {
151                            Property property = (Property)fieldValue;
152    
153                            return metadata.get(property.getName());
154                    }
155            }
156    
157            private static Log _log = LogFactoryUtil.getLog(
158                    BaseRawMetadataProcessor.class);
159    
160            private static Map<String, Field[]> _fields =
161                    new HashMap<String, Field[]>();
162    
163            static {
164                    _fields.put(
165                            ClimateForcast.class.getSimpleName(),
166                            ClimateForcast.class.getFields());
167                    _fields.put(
168                            CreativeCommons.class.getSimpleName(),
169                            CreativeCommons.class.getFields());
170                    _fields.put(
171                            DublinCore.class.getSimpleName(), DublinCore.class.getFields());
172                    _fields.put(
173                            Geographic.class.getSimpleName(), Geographic.class.getFields());
174                    _fields.put(
175                            HttpHeaders.class.getSimpleName(), HttpHeaders.class.getFields());
176                    _fields.put(
177                            Message.class.getSimpleName(), Message.class.getFields());
178                    _fields.put(
179                            MSOffice.class.getSimpleName(), MSOffice.class.getFields());
180                    _fields.put(TIFF.class.getSimpleName(), TIFF.class.getFields());
181                    _fields.put(
182                            TikaMetadataKeys.class.getSimpleName(),
183                            TikaMetadataKeys.class.getFields());
184                    _fields.put(
185                            TikaMimeKeys.class.getSimpleName(), TikaMimeKeys.class.getFields());
186                    _fields.put(XMPDM.class.getSimpleName(), XMPDM.class.getFields());
187            }
188    
189    }