1
22
23 package com.liferay.portlet.imagegallery.lar;
24
25 import com.liferay.portal.PortalException;
26 import com.liferay.portal.SystemException;
27 import com.liferay.portal.kernel.lar.PortletDataContext;
28 import com.liferay.portal.kernel.lar.PortletDataException;
29 import com.liferay.portal.kernel.lar.PortletDataHandler;
30 import com.liferay.portal.kernel.lar.PortletDataHandlerBoolean;
31 import com.liferay.portal.kernel.lar.PortletDataHandlerControl;
32 import com.liferay.portal.kernel.lar.PortletDataHandlerKeys;
33 import com.liferay.portal.kernel.util.StringPool;
34 import com.liferay.portal.model.Image;
35 import com.liferay.portal.service.persistence.ImageUtil;
36 import com.liferay.portal.util.PortalUtil;
37 import com.liferay.portlet.imagegallery.NoSuchFolderException;
38 import com.liferay.portlet.imagegallery.NoSuchImageException;
39 import com.liferay.portlet.imagegallery.model.IGFolder;
40 import com.liferay.portlet.imagegallery.model.IGImage;
41 import com.liferay.portlet.imagegallery.model.impl.IGFolderImpl;
42 import com.liferay.portlet.imagegallery.service.IGFolderLocalServiceUtil;
43 import com.liferay.portlet.imagegallery.service.IGImageLocalServiceUtil;
44 import com.liferay.portlet.imagegallery.service.persistence.IGFolderUtil;
45 import com.liferay.portlet.imagegallery.service.persistence.IGImageFinderUtil;
46 import com.liferay.portlet.imagegallery.service.persistence.IGImageUtil;
47 import com.liferay.util.CollectionFactory;
48 import com.liferay.util.FileUtil;
49 import com.liferay.util.MapUtil;
50
51 import com.thoughtworks.xstream.XStream;
52
53 import java.io.File;
54
55 import java.util.ArrayList;
56 import java.util.Iterator;
57 import java.util.List;
58 import java.util.Map;
59
60 import javax.portlet.PortletPreferences;
61
62 import org.apache.commons.logging.Log;
63 import org.apache.commons.logging.LogFactory;
64
65 import org.dom4j.Document;
66 import org.dom4j.DocumentHelper;
67 import org.dom4j.Element;
68
69
75 public class IGPortletDataHandlerImpl implements PortletDataHandler {
76
77 public PortletPreferences deleteData(
78 PortletDataContext context, String portletId,
79 PortletPreferences prefs)
80 throws PortletDataException {
81
82 try {
83
84
86 if (!context.addPrimaryKey(
87 IGPortletDataHandlerImpl.class, "deleteData")) {
88
89 IGFolderLocalServiceUtil.deleteFolders(context.getGroupId());
90 }
91
92 return null;
93 }
94 catch (Exception e) {
95 throw new PortletDataException(e);
96 }
97 }
98
99 public String exportData(
100 PortletDataContext context, String portletId,
101 PortletPreferences prefs)
102 throws PortletDataException {
103
104 try {
105 XStream xStream = new XStream();
106
107 Document doc = DocumentHelper.createDocument();
108
109 Element root = doc.addElement("image-gallery");
110
111 root.addAttribute("group-id", String.valueOf(context.getGroupId()));
112
113
115 List folders = IGFolderUtil.findByGroupId(context.getGroupId());
116
117 List igImages = new ArrayList();
118
119 Iterator itr = folders.iterator();
120
121 while (itr.hasNext()) {
122 IGFolder folder = (IGFolder)itr.next();
123
124 if (context.addPrimaryKey(
125 IGFolder.class, folder.getPrimaryKeyObj())) {
126
127 itr.remove();
128 }
129 else {
130 folder.setUserUuid(folder.getUserUuid());
131
132 List folderIGImages = IGImageUtil.findByFolderId(
133 folder.getFolderId());
134
135 igImages.addAll(folderIGImages);
136 }
137 }
138
139 String xml = xStream.toXML(folders);
140
141 Element el = root.addElement("ig-folders");
142
143 Document tempDoc = PortalUtil.readDocumentFromXML(xml);
144
145 el.content().add(tempDoc.getRootElement().createCopy());
146
147
149 itr = igImages.iterator();
150
151 while (itr.hasNext()) {
152 IGImage igImage = (IGImage)itr.next();
153
154 if (context.addPrimaryKey(
155 IGImage.class, igImage.getPrimaryKeyObj())) {
156
157 itr.remove();
158 }
159 else {
160 igImage.setUserUuid(igImage.getUserUuid());
161
162 if (context.getBooleanParameter(_NAMESPACE, "tags")) {
163 context.addTagsEntries(
164 IGImage.class, igImage.getPrimaryKeyObj());
165 }
166
167 try {
168 Image largeImage = ImageUtil.findByPrimaryKey(
169 igImage.getLargeImageId());
170
171 igImage.setImageType(largeImage.getType());
172
173 context.getZipWriter().addEntry(
174 getIGImageDir(igImage), largeImage.getTextObj());
175 }
176 catch (com.liferay.portal.NoSuchImageException nsie) {
177 }
178 }
179 }
180
181 xml = xStream.toXML(igImages);
182
183 el = root.addElement("ig-images");
184
185 tempDoc = PortalUtil.readDocumentFromXML(xml);
186
187 el.content().add(tempDoc.getRootElement().createCopy());
188
189 return doc.asXML();
190 }
191 catch (Exception e) {
192 throw new PortletDataException(e);
193 }
194 }
195
196 public PortletDataHandlerControl[] getExportControls()
197 throws PortletDataException {
198
199 return new PortletDataHandlerControl[] {_foldersAndImages, _tags};
200 }
201
202 public PortletDataHandlerControl[] getImportControls()
203 throws PortletDataException {
204
205 return new PortletDataHandlerControl[] {_foldersAndImages, _tags};
206 }
207
208 public PortletPreferences importData(
209 PortletDataContext context, String portletId,
210 PortletPreferences prefs, String data)
211 throws PortletDataException {
212
213 try {
214 XStream xStream = new XStream();
215
216 Document doc = PortalUtil.readDocumentFromXML(data);
217
218 Element root = doc.getRootElement();
219
220
222 Element el = root.element("ig-folders").element("list");
223
224 Document tempDoc = DocumentHelper.createDocument();
225
226 tempDoc.content().add(el.createCopy());
227
228 Map folderPKs = CollectionFactory.getHashMap();
229
230 List folders = (List)xStream.fromXML(tempDoc.asXML());
231
232 Iterator itr = folders.iterator();
233
234 while (itr.hasNext()) {
235 IGFolder folder = (IGFolder)itr.next();
236
237 importFolder(context, folderPKs, folder);
238 }
239
240
242 el = root.element("ig-images").element("list");
243
244 tempDoc = DocumentHelper.createDocument();
245
246 tempDoc.content().add(el.createCopy());
247
248 List igImages = (List)xStream.fromXML(tempDoc.asXML());
249
250 itr = igImages.iterator();
251
252 while (itr.hasNext()) {
253 IGImage igImage = (IGImage)itr.next();
254
255 importIGImage(context, folderPKs, igImage);
256 }
257
258 return null;
259 }
260 catch (Exception e) {
261 throw new PortletDataException(e);
262 }
263 }
264
265 protected String getIGImageDir(IGImage igImage)
266 throws PortalException, SystemException {
267
268 return _IMAGE_GALLERY_FOLDER + igImage.getPrimaryKey() + "." +
269 igImage.getImageType();
270 }
271
272 protected void importFolder(
273 PortletDataContext context, Map folderPKs, IGFolder folder)
274 throws Exception {
275
276 long userId = context.getUserId(folder.getUserUuid());
277 long plid = context.getPlid();
278 long parentFolderId = MapUtil.getLong(
279 folderPKs, folder.getParentFolderId(), folder.getParentFolderId());
280
281 boolean addCommunityPermissions = true;
282 boolean addGuestPermissions = true;
283
284 IGFolder existingFolder = null;
285
286 try {
287 if (parentFolderId != IGFolderImpl.DEFAULT_PARENT_FOLDER_ID) {
288 IGFolderUtil.findByPrimaryKey(parentFolderId);
289 }
290
291 if (context.getDataStrategy().equals(
292 PortletDataHandlerKeys.DATA_STRATEGY_MIRROR)) {
293
294 existingFolder = IGFolderUtil.fetchByUUID_G(
295 folder.getUuid(), context.getGroupId());
296
297 if (existingFolder == null) {
298 existingFolder = IGFolderLocalServiceUtil.addFolder(
299 folder.getUuid(), userId, plid, parentFolderId,
300 folder.getName(), folder.getDescription(),
301 addCommunityPermissions, addGuestPermissions);
302 }
303 else {
304 existingFolder = IGFolderLocalServiceUtil.updateFolder(
305 existingFolder.getFolderId(), parentFolderId,
306 folder.getName(), folder.getDescription(), false);
307 }
308 }
309 else {
310 existingFolder = IGFolderLocalServiceUtil.addFolder(
311 userId, plid, parentFolderId, folder.getName(),
312 folder.getDescription(), addCommunityPermissions,
313 addGuestPermissions);
314 }
315
316 folderPKs.put(
317 folder.getPrimaryKeyObj(), existingFolder.getPrimaryKeyObj());
318 }
319 catch (NoSuchFolderException nsfe) {
320 _log.error(
321 "Could not find the parent folder for folder " +
322 folder.getFolderId());
323 }
324 }
325
326 protected void importIGImage(
327 PortletDataContext context, Map folderPKs, IGImage igImage)
328 throws Exception {
329
330 long userId = context.getUserId(igImage.getUserUuid());
331 long folderId = MapUtil.getLong(
332 folderPKs, igImage.getFolderId(), igImage.getFolderId());
333
334 File imageFile = null;
335
336 byte[] byteArray = context.getZipReader().getEntryAsByteArray(
337 getIGImageDir(igImage));
338
339 if (byteArray == null) {
340 _log.error(
341 "Could not find image for IG image " + igImage.getImageId());
342
343 return;
344 }
345 else {
346 imageFile = File.createTempFile(
347 String.valueOf(igImage.getPrimaryKey()),
348 StringPool.PERIOD + igImage.getImageType());
349
350 FileUtil.write(imageFile, byteArray);
351 }
352
353 String[] tagsEntries = null;
354
355 if (context.getBooleanParameter(_NAMESPACE, "tags")) {
356 tagsEntries = context.getTagsEntries(
357 IGImage.class, igImage.getPrimaryKeyObj());
358 }
359
360 boolean addCommunityPermissions = true;
361 boolean addGuestPermissions = true;
362
363 IGImage existingImage = null;
364
365 try {
366 IGFolderUtil.findByPrimaryKey(folderId);
367
368 if (context.getDataStrategy().equals(
369 PortletDataHandlerKeys.DATA_STRATEGY_MIRROR)) {
370
371 try {
372 existingImage = IGImageFinderUtil.findByUuid_G(
373 igImage.getUuid(), context.getGroupId());
374
375 IGImageLocalServiceUtil.updateImage(
376 userId, existingImage.getImageId(), folderId,
377 igImage.getDescription(), imageFile,
378 igImage.getImageType(), tagsEntries);
379 }
380 catch (NoSuchImageException nsie) {
381 IGImageLocalServiceUtil.addImage(
382 igImage.getUuid(), userId, folderId,
383 igImage.getDescription(), imageFile,
384 igImage.getImageType(), tagsEntries,
385 addCommunityPermissions, addGuestPermissions);
386 }
387 }
388 else {
389 IGImageLocalServiceUtil.addImage(
390 userId, folderId, igImage.getDescription(), imageFile,
391 igImage.getImageType(), tagsEntries,
392 addCommunityPermissions, addGuestPermissions);
393 }
394 }
395 catch (NoSuchFolderException nsfe) {
396 _log.error(
397 "Could not find the parent folder for IG image " +
398 igImage.getImageId());
399 }
400 }
401
402 private static final String _NAMESPACE = "image_gallery";
403
404 private static final String _IMAGE_GALLERY_FOLDER = "image-gallery/";
405
406 private static final PortletDataHandlerBoolean _foldersAndImages =
407 new PortletDataHandlerBoolean(
408 _NAMESPACE, "folders-and-images", true, true);
409
410 private static final PortletDataHandlerBoolean _tags =
411 new PortletDataHandlerBoolean(_NAMESPACE, "tags");
412
413 private static Log _log = LogFactory.getLog(IGPortletDataHandlerImpl.class);
414
415 }