001
014
015 package com.liferay.portal.events;
016
017 import com.liferay.portal.kernel.events.ActionException;
018 import com.liferay.portal.kernel.language.LanguageUtil;
019 import com.liferay.portal.kernel.metadata.RawMetadataProcessorUtil;
020 import com.liferay.portal.kernel.upgrade.util.UpgradeProcessUtil;
021 import com.liferay.portal.kernel.util.ArrayUtil;
022 import com.liferay.portal.kernel.util.GetterUtil;
023 import com.liferay.portal.kernel.util.LocaleUtil;
024 import com.liferay.portal.kernel.util.StringBundler;
025 import com.liferay.portal.kernel.util.StringPool;
026 import com.liferay.portal.kernel.xml.Document;
027 import com.liferay.portal.kernel.xml.Element;
028 import com.liferay.portal.kernel.xml.SAXReaderUtil;
029 import com.liferay.portal.model.Group;
030 import com.liferay.portal.service.GroupLocalServiceUtil;
031 import com.liferay.portal.service.ServiceContext;
032 import com.liferay.portal.service.UserLocalServiceUtil;
033 import com.liferay.portal.util.PortalUtil;
034 import com.liferay.portlet.documentlibrary.NoSuchFileEntryTypeException;
035 import com.liferay.portlet.documentlibrary.model.DLFileEntryMetadata;
036 import com.liferay.portlet.documentlibrary.model.DLFileEntryTypeConstants;
037 import com.liferay.portlet.documentlibrary.service.DLFileEntryTypeLocalServiceUtil;
038 import com.liferay.portlet.documentlibrary.util.RawMetadataProcessor;
039 import com.liferay.portlet.dynamicdatamapping.io.DDMFormXSDDeserializerUtil;
040 import com.liferay.portlet.dynamicdatamapping.model.DDMForm;
041 import com.liferay.portlet.dynamicdatamapping.model.DDMStructure;
042 import com.liferay.portlet.dynamicdatamapping.model.DDMStructureConstants;
043 import com.liferay.portlet.dynamicdatamapping.service.DDMStructureLocalServiceUtil;
044
045 import java.io.StringReader;
046
047 import java.lang.reflect.Field;
048
049 import java.util.ArrayList;
050 import java.util.HashMap;
051 import java.util.List;
052 import java.util.Locale;
053 import java.util.Map;
054
055
060 public class AddDefaultDocumentLibraryStructuresAction
061 extends BaseDefaultDDMStructureAction {
062
063 @Override
064 public void run(String[] ids) throws ActionException {
065 try {
066 doRun(GetterUtil.getLong(ids[0]));
067 }
068 catch (Exception e) {
069 throw new ActionException(e);
070 }
071 }
072
073 protected void addDLFileEntryType(
074 long userId, long groupId, String languageKey,
075 String dlFileEntryTypeKey, List<String> ddmStructureNames,
076 ServiceContext serviceContext)
077 throws Exception {
078
079 List<Long> ddmStructureIds = new ArrayList<Long>();
080
081 for (String ddmStructureName : ddmStructureNames) {
082 String ddmStructureKey = ddmStructureName;
083
084 DDMStructure ddmStructure =
085 DDMStructureLocalServiceUtil.fetchStructure(
086 groupId,
087 PortalUtil.getClassNameId(DLFileEntryMetadata.class),
088 ddmStructureKey);
089
090 if (ddmStructure == null) {
091 continue;
092 }
093
094 ddmStructureIds.add(ddmStructure.getStructureId());
095 }
096
097 Locale locale = PortalUtil.getSiteDefaultLocale(groupId);
098
099 String definition = getDynamicDDMStructureDefinition(
100 "document-library-structures.xml", languageKey, locale);
101
102 serviceContext.setAttribute("definition", definition);
103
104 try {
105 DLFileEntryTypeLocalServiceUtil.getFileEntryType(
106 groupId, dlFileEntryTypeKey);
107 }
108 catch (NoSuchFileEntryTypeException nsfete) {
109 Map<Locale, String> localizationMap = getLocalizationMap(
110 languageKey);
111
112 DLFileEntryTypeLocalServiceUtil.addFileEntryType(
113 userId, groupId, dlFileEntryTypeKey, localizationMap,
114 localizationMap,
115 ArrayUtil.toArray(
116 ddmStructureIds.toArray(new Long[ddmStructureIds.size()])),
117 serviceContext);
118 }
119 }
120
121 protected void addDLFileEntryTypes(
122 long userId, long groupId, ServiceContext serviceContext)
123 throws Exception {
124
125 List<String> ddmStructureNames = new ArrayList<String>();
126
127 addDLFileEntryType(
128 userId, groupId, DLFileEntryTypeConstants.NAME_CONTRACT,
129 DLFileEntryTypeConstants.FILE_ENTRY_TYPE_KEY_CONTRACT,
130 ddmStructureNames, serviceContext);
131
132 ddmStructureNames.clear();
133
134 ddmStructureNames.add("Marketing Campaign Theme Metadata");
135
136 addDLFileEntryType(
137 userId, groupId, DLFileEntryTypeConstants.NAME_MARKETING_BANNER,
138 DLFileEntryTypeConstants.FILE_ENTRY_TYPE_KEY_MARKETING_BANNER,
139 ddmStructureNames, serviceContext);
140
141 ddmStructureNames.clear();
142
143 ddmStructureNames.add("Learning Module Metadata");
144
145 addDLFileEntryType(
146 userId, groupId, DLFileEntryTypeConstants.NAME_ONLINE_TRAINING,
147 DLFileEntryTypeConstants.FILE_ENTRY_TYPE_KEY_ONLINE_TRAINING,
148 ddmStructureNames, serviceContext);
149
150 ddmStructureNames.clear();
151
152 ddmStructureNames.add("Meeting Metadata");
153
154 addDLFileEntryType(
155 userId, groupId, DLFileEntryTypeConstants.NAME_SALES_PRESENTATION,
156 DLFileEntryTypeConstants.FILE_ENTRY_TYPE_KEY_SALES_PRESENTATION,
157 ddmStructureNames, serviceContext);
158
159 if (UpgradeProcessUtil.isCreateIGImageDocumentType()) {
160 addDLFileEntryType(
161 userId, groupId, DLFileEntryTypeConstants.NAME_IG_IMAGE,
162 DLFileEntryTypeConstants.FILE_ENTRY_TYPE_KEY_IG_IMAGE,
163 ddmStructureNames, serviceContext);
164 }
165 }
166
167 protected void addDLRawMetadataStructures(
168 long userId, long groupId, ServiceContext serviceContext)
169 throws Exception {
170
171 Locale locale = PortalUtil.getSiteDefaultLocale(groupId);
172
173 String xsd = buildDLRawMetadataXML(
174 RawMetadataProcessorUtil.getFields(), locale);
175
176 Document document = SAXReaderUtil.read(new StringReader(xsd));
177
178 Element rootElement = document.getRootElement();
179
180 List<Element> structureElements = rootElement.elements("structure");
181
182 for (Element structureElement : structureElements) {
183 String name = structureElement.elementText("name");
184 String description = structureElement.elementText("description");
185
186 Element structureElementRootElement = structureElement.element(
187 "root");
188
189 String structureElementRootXML =
190 structureElementRootElement.asXML();
191
192 DDMStructure ddmStructure =
193 DDMStructureLocalServiceUtil.fetchStructure(
194 groupId,
195 PortalUtil.getClassNameId(RawMetadataProcessor.class),
196 name);
197
198 if (ddmStructure != null) {
199 ddmStructure.setDefinition(structureElementRootXML);
200
201 DDMStructureLocalServiceUtil.updateDDMStructure(ddmStructure);
202 }
203 else {
204 Map<Locale, String> nameMap = new HashMap<Locale, String>();
205
206 nameMap.put(locale, name);
207
208 Map<Locale, String> descriptionMap =
209 new HashMap<Locale, String>();
210
211 descriptionMap.put(locale, description);
212
213 DDMForm ddmForm = DDMFormXSDDeserializerUtil.deserialize(
214 structureElementRootXML);
215
216 DDMStructureLocalServiceUtil.addStructure(
217 userId, groupId,
218 DDMStructureConstants.DEFAULT_PARENT_STRUCTURE_ID,
219 PortalUtil.getClassNameId(RawMetadataProcessor.class), name,
220 nameMap, descriptionMap, ddmForm, "xml",
221 DDMStructureConstants.TYPE_DEFAULT, serviceContext);
222 }
223 }
224 }
225
226 protected String buildDLRawMetadataElementXML(Field field, Locale locale) {
227 StringBundler sb = new StringBundler(15);
228
229 sb.append("<dynamic-element dataType=\"string\" indexType=\"text\" ");
230 sb.append("name=\"");
231
232 Class<?> fieldClass = field.getDeclaringClass();
233
234 sb.append(fieldClass.getSimpleName());
235 sb.append(StringPool.UNDERLINE);
236 sb.append(field.getName());
237 sb.append("\" required=\"false\" showLabel=\"true\" type=\"text\">");
238 sb.append("<meta-data locale=\"");
239 sb.append(locale);
240 sb.append("\">");
241 sb.append("<entry name=\"label\"><![CDATA[metadata.");
242 sb.append(fieldClass.getSimpleName());
243 sb.append(StringPool.PERIOD);
244 sb.append(field.getName());
245 sb.append("]]></entry><entry name=\"predefinedValue\">");
246 sb.append("<![CDATA[]]></entry></meta-data></dynamic-element>");
247
248 return sb.toString();
249 }
250
251 protected String buildDLRawMetadataStructureXML(
252 String name, Field[] fields, Locale locale) {
253
254 StringBundler sb = new StringBundler(12 + fields.length);
255
256 sb.append("<structure><name><![CDATA[");
257 sb.append(name);
258 sb.append("]]></name>");
259 sb.append("<description><![CDATA[");
260 sb.append(name);
261 sb.append("]]></description>");
262 sb.append("<root available-locales=\"");
263 sb.append(locale);
264 sb.append("\" default-locale=\"");
265 sb.append(locale);
266 sb.append("\">");
267
268 for (Field field : fields) {
269 sb.append(buildDLRawMetadataElementXML(field, locale));
270 }
271
272 sb.append("</root></structure>");
273
274 return sb.toString();
275 }
276
277 protected String buildDLRawMetadataXML(
278 Map<String, Field[]> fields, Locale locale) {
279
280 StringBundler sb = new StringBundler(2 + fields.size());
281
282 sb.append("<?xml version=\"1.0\"?><root>");
283
284 for (String key : fields.keySet()) {
285 sb.append(
286 buildDLRawMetadataStructureXML(key, fields.get(key), locale));
287 }
288
289 sb.append("</root>");
290
291 return sb.toString();
292 }
293
294 protected void doRun(long companyId) throws Exception {
295 ServiceContext serviceContext = new ServiceContext();
296
297 serviceContext.setAddGuestPermissions(true);
298 serviceContext.setAddGroupPermissions(true);
299
300 Group group = GroupLocalServiceUtil.getCompanyGroup(companyId);
301
302 serviceContext.setScopeGroupId(group.getGroupId());
303
304 long defaultUserId = UserLocalServiceUtil.getDefaultUserId(companyId);
305
306 serviceContext.setUserId(defaultUserId);
307
308 addDDMStructures(
309 defaultUserId, group.getGroupId(),
310 PortalUtil.getClassNameId(DLFileEntryMetadata.class),
311 "document-library-structures.xml", serviceContext);
312 addDLFileEntryTypes(defaultUserId, group.getGroupId(), serviceContext);
313 addDLRawMetadataStructures(
314 defaultUserId, group.getGroupId(), serviceContext);
315 }
316
317 protected Map<Locale, String> getLocalizationMap(String content) {
318 Map<Locale, String> localizationMap = new HashMap<Locale, String>();
319
320 Locale defaultLocale = LocaleUtil.getDefault();
321
322 String defaultValue = LanguageUtil.get(defaultLocale, content);
323
324 for (Locale locale : LanguageUtil.getSupportedLocales()) {
325 String value = LanguageUtil.get(locale, content);
326
327 if (!locale.equals(defaultLocale) && value.equals(defaultValue)) {
328 continue;
329 }
330
331 localizationMap.put(locale, value);
332 }
333
334 return localizationMap;
335 }
336
337 }