001    /**
002     * Copyright (c) 2000-2013 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.portal.kernel.util.LocaleUtil;
023    import com.liferay.portal.kernel.util.StringPool;
024    import com.liferay.portlet.dynamicdatamapping.storage.Fields;
025    
026    import java.io.File;
027    import java.io.InputStream;
028    
029    import java.lang.reflect.Field;
030    
031    import java.util.ArrayList;
032    import java.util.HashMap;
033    import java.util.List;
034    import java.util.Map;
035    import java.util.Set;
036    
037    import org.apache.tika.metadata.ClimateForcast;
038    import org.apache.tika.metadata.CreativeCommons;
039    import org.apache.tika.metadata.DublinCore;
040    import org.apache.tika.metadata.Geographic;
041    import org.apache.tika.metadata.HttpHeaders;
042    import org.apache.tika.metadata.MSOffice;
043    import org.apache.tika.metadata.Message;
044    import org.apache.tika.metadata.Metadata;
045    import org.apache.tika.metadata.Property;
046    import org.apache.tika.metadata.TIFF;
047    import org.apache.tika.metadata.TikaMetadataKeys;
048    import org.apache.tika.metadata.TikaMimeKeys;
049    
050    /**
051     * @author Alexander Chow
052     */
053    public abstract class BaseRawMetadataProcessor implements RawMetadataProcessor {
054    
055            @Override
056            public Map<String, Field[]> getFields() {
057                    return _fields;
058            }
059    
060            @Override
061            public Map<String, Fields> getRawMetadataMap(
062                            String extension, String mimeType, File file)
063                    throws PortalException, SystemException {
064    
065                    Metadata metadata = extractMetadata(extension, mimeType, file);
066    
067                    return createDDMFieldsMap(metadata, getFields());
068            }
069    
070            @Override
071            public Map<String, Fields> getRawMetadataMap(
072                            String extension, String mimeType, InputStream inputStream)
073                    throws PortalException, SystemException {
074    
075                    Metadata metadata = extractMetadata(extension, mimeType, inputStream);
076    
077                    return createDDMFieldsMap(metadata, getFields());
078            }
079    
080            protected Fields createDDMFields(Metadata metadata, Field[] fields) {
081                    Fields ddmFields = new Fields();
082    
083                    for (Field field : fields) {
084                            Class<?> fieldClass = field.getDeclaringClass();
085    
086                            String fieldClassName = fieldClass.getSimpleName();
087    
088                            String name = fieldClassName.concat(
089                                    StringPool.UNDERLINE).concat(field.getName());
090    
091                            String value = getMetadataValue(metadata, field);
092    
093                            if (value == null) {
094                                    continue;
095                            }
096    
097                            com.liferay.portlet.dynamicdatamapping.storage.Field ddmField =
098                                    new com.liferay.portlet.dynamicdatamapping.storage.Field(
099                                            name, value);
100    
101                            ddmField.setDefaultLocale(LocaleUtil.getSiteDefault());
102    
103                            ddmFields.put(ddmField);
104                    }
105    
106                    return ddmFields;
107            }
108    
109            protected Map<String, Fields> createDDMFieldsMap(
110                    Metadata metadata, Map<String, Field[]> fieldsMap) {
111    
112                    Map<String, Fields> ddmFieldsMap = new HashMap<String, Fields>();
113    
114                    if (metadata == null) {
115                            return ddmFieldsMap;
116                    }
117    
118                    for (String key : fieldsMap.keySet()) {
119                            Field[] fields = fieldsMap.get(key);
120    
121                            Fields ddmFields = createDDMFields(metadata, fields);
122    
123                            Set<String> names = ddmFields.getNames();
124    
125                            if (names.isEmpty()) {
126                                    continue;
127                            }
128    
129                            ddmFieldsMap.put(key, ddmFields);
130                    }
131    
132                    return ddmFieldsMap;
133            }
134    
135            protected abstract Metadata extractMetadata(
136                            String extension, String mimeType, File file)
137                    throws PortalException, SystemException;
138    
139            protected abstract Metadata extractMetadata(
140                            String extension, String mimeType, InputStream inputStream)
141                    throws PortalException, SystemException;
142    
143            protected Object getFieldValue(Metadata metadata, Field field) {
144                    Object fieldValue = null;
145    
146                    try {
147                            fieldValue = field.get(metadata);
148                    }
149                    catch (IllegalAccessException iae) {
150                            if (_log.isWarnEnabled()) {
151                                    _log.warn(
152                                            "The property " + field.getName() +
153                                                    " will not be added to the metatada set");
154                            }
155                    }
156    
157                    return fieldValue;
158            }
159    
160            protected String getMetadataValue(Metadata metadata, Field field) {
161                    Object fieldValue = getFieldValue(metadata, field);
162    
163                    if (fieldValue instanceof String) {
164                            return metadata.get((String)fieldValue);
165                    }
166    
167                    Property property = (Property)fieldValue;
168    
169                    return metadata.get(property.getName());
170            }
171    
172            private static void _addFields(Class<?> clazz, List<Field> fields) {
173                    for (Field field : clazz.getFields()) {
174                            fields.add(field);
175                    }
176            }
177    
178            private static Log _log = LogFactoryUtil.getLog(
179                    BaseRawMetadataProcessor.class);
180    
181            private static Map<String, Field[]> _fields =
182                    new HashMap<String, Field[]>();
183    
184            static {
185                    List<Field> fields = new ArrayList<Field>();
186    
187                    _addFields(ClimateForcast.class, fields);
188                    _addFields(CreativeCommons.class, fields);
189                    _addFields(DublinCore.class, fields);
190                    _addFields(Geographic.class, fields);
191                    _addFields(HttpHeaders.class, fields);
192                    _addFields(Message.class, fields);
193                    _addFields(MSOffice.class, fields);
194                    _addFields(TIFF.class, fields);
195                    _addFields(TikaMetadataKeys.class, fields);
196                    _addFields(TikaMimeKeys.class, fields);
197                    _addFields(XMPDM.class, fields);
198    
199                    _fields.put(
200                            "TIKARAWMETADATA", fields.toArray(new Field[fields.size()]));
201            }
202    
203    }