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