001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
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    /**
056     * @author Sergio Gonz??lez
057     * @author Miguel Pastor
058     * @author Roberto D??az
059     */
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    }