001    /**
002     * Copyright (c) 2000-2013 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.kernel.lar;
016    
017    import com.liferay.portal.kernel.log.Log;
018    import com.liferay.portal.kernel.log.LogFactoryUtil;
019    import com.liferay.portal.kernel.util.GetterUtil;
020    import com.liferay.portal.kernel.util.StringPool;
021    import com.liferay.portal.kernel.util.Time;
022    import com.liferay.portal.kernel.util.Validator;
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    
027    import java.io.IOException;
028    
029    import javax.portlet.PortletPreferences;
030    
031    /**
032     * @author Brian Wing Shun Chan
033     */
034    public abstract class BasePortletDataHandler implements PortletDataHandler {
035    
036            public PortletPreferences deleteData(
037                            PortletDataContext portletDataContext, String portletId,
038                            PortletPreferences portletPreferences)
039                    throws PortletDataException {
040    
041                    long startTime = 0;
042    
043                    if (_log.isInfoEnabled()) {
044                            _log.info("Deleting portlet " + portletId);
045    
046                            startTime = System.currentTimeMillis();
047                    }
048    
049                    try {
050                            return doDeleteData(
051                                    portletDataContext, portletId, portletPreferences);
052                    }
053                    catch (Exception e) {
054                            throw new PortletDataException(e);
055                    }
056                    finally {
057                            if (_log.isInfoEnabled()) {
058                                    long duration = System.currentTimeMillis() - startTime;
059    
060                                    _log.info("Deleted portlet in " + Time.getDuration(duration));
061                            }
062                    }
063            }
064    
065            public String exportData(
066                            PortletDataContext portletDataContext, String portletId,
067                            PortletPreferences portletPreferences)
068                    throws PortletDataException {
069    
070                    long startTime = 0;
071    
072                    if (_log.isInfoEnabled()) {
073                            _log.info("Exporting portlet " + portletId);
074    
075                            startTime = System.currentTimeMillis();
076                    }
077    
078                    try {
079                            return doExportData(
080                                    portletDataContext, portletId, portletPreferences);
081                    }
082                    catch (Exception e) {
083                            throw new PortletDataException(e);
084                    }
085                    finally {
086                            if (_log.isInfoEnabled()) {
087                                    long duration = System.currentTimeMillis() - startTime;
088    
089                                    _log.info("Exported portlet in " + Time.getDuration(duration));
090                            }
091                    }
092            }
093    
094            public String[] getDataPortletPreferences() {
095                    return _dataPortletPreferences;
096            }
097    
098            public PortletDataHandlerControl[] getExportControls() {
099                    return _exportControls;
100            }
101    
102            public PortletDataHandlerControl[] getExportMetadataControls() {
103                    return _exportMetadataControls;
104            }
105    
106            public PortletDataHandlerControl[] getImportControls() {
107                    return _importControls;
108            }
109    
110            public PortletDataHandlerControl[] getImportMetadataControls() {
111                    return _importMetadataControls;
112            }
113    
114            public PortletPreferences importData(
115                            PortletDataContext portletDataContext, String portletId,
116                            PortletPreferences portletPreferences, String data)
117                    throws PortletDataException {
118    
119                    long startTime = 0;
120    
121                    if (_log.isInfoEnabled()) {
122                            _log.info("Importing portlet " + portletId);
123    
124                            startTime = System.currentTimeMillis();
125                    }
126    
127                    long sourceGroupId = portletDataContext.getSourceGroupId();
128    
129                    try {
130                            if (Validator.isXml(data)) {
131                                    Document document = SAXReaderUtil.read(data);
132    
133                                    Element rootElement = document.getRootElement();
134    
135                                    portletDataContext.setImportDataRootElement(rootElement);
136    
137                                    long portletSourceGroupId = GetterUtil.getLong(
138                                            rootElement.attributeValue("group-id"));
139    
140                                    if (portletSourceGroupId != 0) {
141                                            portletDataContext.setSourceGroupId(portletSourceGroupId);
142                                    }
143                            }
144    
145                            return doImportData(
146                                    portletDataContext, portletId, portletPreferences, data);
147                    }
148                    catch (Exception e) {
149                            throw new PortletDataException(e);
150                    }
151                    finally {
152                            portletDataContext.setSourceGroupId(sourceGroupId);
153    
154                            if (_log.isInfoEnabled()) {
155                                    long duration = System.currentTimeMillis() - startTime;
156    
157                                    _log.info("Imported portlet in " + Time.getDuration(duration));
158                            }
159                    }
160            }
161    
162            public boolean isAlwaysExportable() {
163                    return _alwaysExportable;
164            }
165    
166            public boolean isAlwaysStaged() {
167                    return _alwaysStaged;
168            }
169    
170            public boolean isDataLocalized() {
171                    return _dataLocalized;
172            }
173    
174            public boolean isPublishToLiveByDefault() {
175                    return _publishToLiveByDefault;
176            }
177    
178            protected Element addExportDataRootElement(
179                    PortletDataContext portletDataContext) {
180    
181                    Document document = SAXReaderUtil.createDocument();
182    
183                    Class<?> clazz = getClass();
184    
185                    Element rootElement = document.addElement(clazz.getSimpleName());
186    
187                    portletDataContext.setExportDataRootElement(rootElement);
188    
189                    return rootElement;
190            }
191    
192            protected PortletPreferences doDeleteData(
193                            PortletDataContext portletDataContext, String portletId,
194                            PortletPreferences portletPreferences)
195                    throws Exception {
196    
197                    return portletPreferences;
198            }
199    
200            protected String doExportData(
201                            PortletDataContext portletDataContext, String portletId,
202                            PortletPreferences portletPreferences)
203                    throws Exception {
204    
205                    return null;
206            }
207    
208            protected PortletPreferences doImportData(
209                            PortletDataContext portletDataContext, String portletId,
210                            PortletPreferences portletPreferences, String data)
211                    throws Exception {
212    
213                    return null;
214            }
215    
216            protected String getExportDataRootElementString(Element rootElement) {
217                    if (rootElement == null) {
218                            return StringPool.BLANK;
219                    }
220    
221                    try {
222                            Document document = rootElement.getDocument();
223    
224                            return document.formattedString();
225                    }
226                    catch (IOException ioe) {
227                            return StringPool.BLANK;
228                    }
229            }
230    
231            protected void setAlwaysExportable(boolean alwaysExportable) {
232                    _alwaysExportable = alwaysExportable;
233            }
234    
235            protected void setAlwaysStaged(boolean alwaysStaged) {
236                    _alwaysStaged = alwaysStaged;
237            }
238    
239            protected void setDataLocalized(boolean dataLocalized) {
240                    _dataLocalized = dataLocalized;
241            }
242    
243            protected void setDataPortletPreferences(String... dataPortletPreferences) {
244                    _dataPortletPreferences = dataPortletPreferences;
245            }
246    
247            protected void setExportControls(
248                    PortletDataHandlerControl... exportControls) {
249    
250                    _exportControls = exportControls;
251    
252                    setImportControls(exportControls);
253            }
254    
255            protected void setExportMetadataControls(
256                    PortletDataHandlerControl... exportMetadataControls) {
257    
258                    _exportMetadataControls = exportMetadataControls;
259    
260                    setImportMetadataControls(exportMetadataControls);
261            }
262    
263            protected void setImportControls(
264                    PortletDataHandlerControl... importControls) {
265    
266                    _importControls = importControls;
267            }
268    
269            protected void setImportMetadataControls(
270                    PortletDataHandlerControl... importMetadataControls) {
271    
272                    _importMetadataControls = importMetadataControls;
273            }
274    
275            protected void setPublishToLiveByDefault(boolean publishToLiveByDefault) {
276                    _publishToLiveByDefault = publishToLiveByDefault;
277            }
278    
279            private static Log _log = LogFactoryUtil.getLog(
280                    BasePortletDataHandler.class);
281    
282            private boolean _alwaysExportable;
283            private boolean _alwaysStaged;
284            private boolean _dataLocalized;
285            private String[] _dataPortletPreferences = new String[0];
286            private PortletDataHandlerControl[] _exportControls =
287                    new PortletDataHandlerControl[0];
288            private PortletDataHandlerControl[] _exportMetadataControls =
289                    new PortletDataHandlerControl[0];
290            private PortletDataHandlerControl[] _importControls =
291                    new PortletDataHandlerControl[0];
292            private PortletDataHandlerControl[] _importMetadataControls =
293                    new PortletDataHandlerControl[0];
294            private boolean _publishToLiveByDefault;
295    
296    }