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