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