1   /**
2    * Copyright (c) 2000-2008 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
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  /**
70   * <a href="IGPortletDataHandlerImpl.java.html"><b><i>View Source</i></b></a>
71   *
72   * @author Bruno Farache
73   *
74   */
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              // Folders
85  
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             // Folders
114 
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             // IGImages
148 
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             // Folders
221 
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             // IGImages
241 
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 }