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.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
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 }