001
014
015 package com.liferay.portlet.wiki.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.PortletDataException;
020 import com.liferay.portal.kernel.lar.PortletDataHandlerBoolean;
021 import com.liferay.portal.kernel.lar.PortletDataHandlerControl;
022 import com.liferay.portal.kernel.log.Log;
023 import com.liferay.portal.kernel.log.LogFactoryUtil;
024 import com.liferay.portal.kernel.util.GetterUtil;
025 import com.liferay.portal.kernel.util.MapUtil;
026 import com.liferay.portal.kernel.util.StringPool;
027 import com.liferay.portal.kernel.util.Validator;
028 import com.liferay.portal.kernel.xml.Document;
029 import com.liferay.portal.kernel.xml.Element;
030 import com.liferay.portal.kernel.xml.SAXReaderUtil;
031 import com.liferay.portlet.journal.lar.JournalPortletDataHandlerImpl;
032 import com.liferay.portlet.wiki.NoSuchNodeException;
033 import com.liferay.portlet.wiki.model.WikiNode;
034 import com.liferay.portlet.wiki.model.WikiPage;
035 import com.liferay.portlet.wiki.service.persistence.WikiNodeUtil;
036 import com.liferay.portlet.wiki.util.WikiCacheThreadLocal;
037 import com.liferay.portlet.wiki.util.WikiCacheUtil;
038
039 import java.util.Map;
040
041 import javax.portlet.PortletPreferences;
042
043
046 public class WikiDisplayPortletDataHandlerImpl extends BasePortletDataHandler {
047
048 @Override
049 public PortletDataHandlerControl[] getExportControls() {
050 return new PortletDataHandlerControl[] {
051 _nodesAndPages
052 };
053 }
054
055 @Override
056 public PortletDataHandlerControl[] getExportMetadataControls() {
057 return new PortletDataHandlerControl[] {
058 new PortletDataHandlerBoolean(
059 _NAMESPACE, "wiki-pages", true,
060 WikiPortletDataHandlerImpl.getMetadataControls()
061 )
062 };
063 }
064
065 @Override
066 public PortletDataHandlerControl[] getImportControls() {
067 return new PortletDataHandlerControl[] {
068 _nodesAndPages
069 };
070 }
071
072 @Override
073 public PortletDataHandlerControl[] getImportMetadataControls() {
074 return new PortletDataHandlerControl[] {
075 new PortletDataHandlerBoolean(
076 _NAMESPACE, "wiki-pages", true,
077 WikiPortletDataHandlerImpl.getMetadataControls()
078 )
079 };
080 }
081
082 @Override
083 public PortletPreferences importData(
084 PortletDataContext portletDataContext, String portletId,
085 PortletPreferences portletPreferences, String data)
086 throws PortletDataException {
087
088 WikiCacheThreadLocal.setClearCache(false);
089
090 try {
091 return super.importData(
092 portletDataContext, portletId, portletPreferences, data);
093 }
094 finally {
095 WikiCacheThreadLocal.setClearCache(true);
096 }
097 }
098
099 @Override
100 protected PortletPreferences doDeleteData(
101 PortletDataContext portletDataContext, String portletId,
102 PortletPreferences portletPreferences)
103 throws Exception {
104
105 portletPreferences.setValue("title", StringPool.BLANK);
106 portletPreferences.setValue("nodeId", StringPool.BLANK);
107
108 return portletPreferences;
109 }
110
111 @Override
112 protected String doExportData(
113 PortletDataContext portletDataContext, String portletId,
114 PortletPreferences portletPreferences)
115 throws Exception {
116
117 long nodeId = GetterUtil.getLong(
118 portletPreferences.getValue("nodeId", StringPool.BLANK));
119
120 if (nodeId <= 0) {
121 if (_log.isWarnEnabled()) {
122 _log.warn(
123 "No node id found in preferences of portlet " + portletId);
124 }
125
126 return StringPool.BLANK;
127 }
128
129 String title = portletPreferences.getValue("title", null);
130
131 if (title == null) {
132 if (_log.isWarnEnabled()) {
133 _log.warn(
134 "No title found in preferences of portlet " + portletId);
135 }
136
137 return StringPool.BLANK;
138 }
139
140 WikiNode node = null;
141
142 try {
143 node = WikiNodeUtil.findByPrimaryKey(nodeId);
144 }
145 catch (NoSuchNodeException nsne) {
146 if (_log.isWarnEnabled()) {
147 _log.warn(nsne, nsne);
148 }
149
150 return StringPool.BLANK;
151 }
152
153 portletDataContext.addPermissions(
154 "com.liferay.portlet.wiki", portletDataContext.getScopeGroupId());
155
156 Document document = SAXReaderUtil.createDocument();
157
158 Element rootElement = document.addElement("wiki-display-data");
159
160 rootElement.addAttribute(
161 "group-id", String.valueOf(portletDataContext.getScopeGroupId()));
162
163 Element nodesElement = rootElement.addElement("nodes");
164 Element pagesElement = rootElement.addElement("pages");
165
166 WikiPortletDataHandlerImpl.exportNode(
167 portletDataContext, nodesElement, pagesElement, node);
168
169 return document.formattedString();
170 }
171
172 @Override
173 protected PortletPreferences doImportData(
174 PortletDataContext portletDataContext, String portletId,
175 PortletPreferences portletPreferences, String data)
176 throws Exception {
177
178 portletDataContext.importPermissions(
179 "com.liferay.portlet.wiki", portletDataContext.getSourceGroupId(),
180 portletDataContext.getScopeGroupId());
181
182 if (Validator.isNull(data)) {
183 return null;
184 }
185
186 Document document = SAXReaderUtil.read(data);
187
188 Element rootElement = document.getRootElement();
189
190 Element nodesElement = rootElement.element("nodes");
191
192 for (Element nodeElement : nodesElement.elements("node")) {
193 String path = nodeElement.attributeValue("path");
194
195 if (!portletDataContext.isPathNotProcessed(path)) {
196 continue;
197 }
198
199 WikiNode node = (WikiNode)portletDataContext.getZipEntryAsObject(
200 path);
201
202 WikiPortletDataHandlerImpl.importNode(portletDataContext, node);
203 }
204
205 Element pagesElement = rootElement.element("pages");
206
207 JournalPortletDataHandlerImpl.importReferencedData(
208 portletDataContext, pagesElement);
209
210 for (Element pageElement : pagesElement.elements("page")) {
211 String path = pageElement.attributeValue("path");
212
213 if (!portletDataContext.isPathNotProcessed(path)) {
214 continue;
215 }
216
217 WikiPage page = (WikiPage)portletDataContext.getZipEntryAsObject(
218 path);
219
220 WikiPortletDataHandlerImpl.importPage(
221 portletDataContext, pageElement, page);
222 }
223
224 Map<Long, Long> nodePKs =
225 (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
226 WikiNode.class);
227
228 for (long nodeId : nodePKs.values()) {
229 WikiCacheUtil.clearCache(nodeId);
230 }
231
232 long nodeId = GetterUtil.getLong(
233 portletPreferences.getValue("nodeId", StringPool.BLANK));
234
235 if (nodeId > 0) {
236 nodeId = MapUtil.getLong(nodePKs, nodeId, nodeId);
237
238 portletPreferences.setValue("nodeId", String.valueOf(nodeId));
239 }
240
241 return portletPreferences;
242 }
243
244 private static final String _NAMESPACE = "wiki";
245
246 private static Log _log = LogFactoryUtil.getLog(
247 WikiDisplayPortletDataHandlerImpl.class);
248
249 private static PortletDataHandlerBoolean _nodesAndPages =
250 new PortletDataHandlerBoolean(
251 _NAMESPACE, "wikis-and-pages", true, true);
252
253 }