001    /**
002     * Copyright (c) 2000-2012 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.portlet.portletdisplaytemplate.lar;
016    
017    import com.liferay.portal.kernel.lar.BasePortletDataHandler;
018    import com.liferay.portal.kernel.lar.PortletDataContext;
019    import com.liferay.portal.kernel.lar.PortletDataHandlerBoolean;
020    import com.liferay.portal.kernel.lar.PortletDataHandlerControl;
021    import com.liferay.portal.kernel.portletdisplaytemplate.PortletDisplayTemplateHandlerRegistryUtil;
022    import com.liferay.portal.kernel.util.StringBundler;
023    import com.liferay.portal.kernel.xml.Document;
024    import com.liferay.portal.kernel.xml.Element;
025    import com.liferay.portal.kernel.xml.SAXReaderUtil;
026    import com.liferay.portal.util.PortletKeys;
027    import com.liferay.portlet.dynamicdatamapping.lar.DDMPortletDataHandlerImpl;
028    import com.liferay.portlet.dynamicdatamapping.model.DDMTemplate;
029    import com.liferay.portlet.dynamicdatamapping.service.DDMTemplateLocalServiceUtil;
030    
031    import java.util.List;
032    
033    import javax.portlet.PortletPreferences;
034    
035    /**
036     * @author Juan Fernández
037     */
038    public class PortletDisplayTemplatePortletDataHandlerImpl
039            extends BasePortletDataHandler {
040    
041            @Override
042            public PortletDataHandlerControl[] getExportControls() {
043                    return new PortletDataHandlerControl[] {_portletDisplayTemplates};
044            }
045    
046            @Override
047            public PortletDataHandlerControl[] getImportControls() {
048                    return new PortletDataHandlerControl[] {_portletDisplayTemplates};
049            }
050    
051            @Override
052            public boolean isAlwaysExportable() {
053                    return _ALWAYS_EXPORTABLE;
054            }
055    
056            @Override
057            protected String doExportData(
058                            PortletDataContext portletDataContext, String portletId,
059                            PortletPreferences portletPreferences)
060                    throws Exception {
061    
062                    Document document = SAXReaderUtil.createDocument();
063    
064                    Element rootElement = document.addElement("portlet-display-templates");
065    
066                    exportPortletDisplayTemplates(portletDataContext, rootElement);
067    
068                    return document.formattedString();
069            }
070    
071            @Override
072            protected PortletPreferences doImportData(
073                            PortletDataContext portletDataContext, String portletId,
074                            PortletPreferences portletPreferences, String data)
075                    throws Exception {
076    
077                    Document document = SAXReaderUtil.read(data);
078    
079                    Element rootElement = document.getRootElement();
080    
081                    List<Element> ddmTemplateElements = rootElement.elements("template");
082    
083                    for (Element ddmTemplateElement : ddmTemplateElements) {
084                            DDMPortletDataHandlerImpl.importTemplate(
085                                    portletDataContext, ddmTemplateElement);
086                    }
087    
088                    return null;
089            }
090    
091            protected void exportPortletDisplayTemplates(
092                            PortletDataContext portletDataContext,
093                            Element portletDisplayTemplatesElement)
094                    throws Exception {
095    
096                    long[] classNameIds =
097                            PortletDisplayTemplateHandlerRegistryUtil.getClassNameIds();
098    
099                    for (long classNameId : classNameIds) {
100                            List<DDMTemplate> ddmTemplates =
101                                    DDMTemplateLocalServiceUtil.getTemplates(
102                                            portletDataContext.getScopeGroupId(), classNameId);
103    
104                            for (DDMTemplate ddmTemplate : ddmTemplates) {
105                                    DDMPortletDataHandlerImpl.exportTemplate(
106                                            portletDataContext, portletDisplayTemplatesElement,
107                                            getTemplatePath(portletDataContext, ddmTemplate),
108                                            ddmTemplate);
109                            }
110                    }
111            }
112    
113            protected String getTemplatePath(
114                    PortletDataContext portletDataContext, DDMTemplate template) {
115    
116                    StringBundler sb = new StringBundler(4);
117    
118                    sb.append(
119                            portletDataContext.getPortletPath(
120                                    PortletKeys.PORTLET_DISPLAY_TEMPLATES));
121                    sb.append("/templates/");
122                    sb.append(template.getTemplateId());
123                    sb.append(".xml");
124    
125                    return sb.toString();
126            }
127    
128            private static final boolean _ALWAYS_EXPORTABLE = true;
129    
130            private static final String _NAMESPACE = "portlet_display_templates";
131    
132            private static PortletDataHandlerBoolean _portletDisplayTemplates =
133                    new PortletDataHandlerBoolean(
134                            _NAMESPACE, "application-display-templates");
135    
136    }