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