View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    * 
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   * 
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.jetspeed.portlets.site;
18  
19  import java.io.BufferedOutputStream;
20  import java.io.File;
21  import java.io.FileOutputStream;
22  import java.io.IOException;
23  import java.io.InputStream;
24  import java.io.OutputStream;
25  import java.util.Enumeration;
26  import java.util.Iterator;
27  import java.util.zip.ZipEntry;
28  import java.util.zip.ZipFile;
29  
30  import javax.portlet.ActionRequest;
31  import javax.portlet.ActionResponse;
32  import javax.portlet.PortletConfig;
33  import javax.portlet.PortletException;
34  import javax.portlet.RenderRequest;
35  import javax.portlet.RenderResponse;
36  
37  import org.apache.commons.fileupload.FileItem;
38  import org.apache.commons.fileupload.disk.DiskFileItemFactory;
39  import org.apache.commons.fileupload.portlet.PortletFileUpload;
40  import org.apache.commons.logging.Log;
41  import org.apache.commons.logging.LogFactory;
42  import org.apache.jetspeed.CommonPortletServices;
43  import org.apache.jetspeed.PortalReservedParameters;
44  import org.apache.jetspeed.components.portletregistry.PortletRegistry;
45  import org.apache.jetspeed.decoration.DecorationFactory;
46  import org.apache.jetspeed.exception.JetspeedException;
47  import org.apache.jetspeed.headerresource.HeaderResource;
48  import org.apache.jetspeed.om.folder.Folder;
49  import org.apache.jetspeed.om.page.Link;
50  import org.apache.jetspeed.om.page.Page;
51  import org.apache.jetspeed.page.PageManager;
52  import org.apache.jetspeed.request.RequestContext;
53  import org.apache.portals.gems.dojo.AbstractDojoVelocityPortlet;
54  
55  /***
56   * Manage the Portal Site
57   * 
58   * @author <a href="mailto:taylor@apache.org">David Sean Taylor</a>
59   * @version $Id: $
60   */
61  public class PortalSiteManager extends AbstractDojoVelocityPortlet 
62  {
63      protected final Log log = LogFactory.getLog(this.getClass());
64      
65      // components
66      protected PageManager pageManager;
67      protected PortletRegistry registry;
68      protected DecorationFactory decorationFactory;
69      
70      // session
71      protected final static String SESSION_FOLDERS = "jetspeed.site.manager.folders";
72      protected final static String SESSION_ROOT = "jetspeed.site.manager.root";
73      
74      // context
75      public final static String FOLDERS = "folders";
76      public final static String JSROOT = "jsroot";   
77      public static final String ALL_SECURITY_REFS = "allSecurityRefs";
78      
79  	protected PageManager castorPageManager;
80      
81      public void init(PortletConfig config)
82      throws PortletException 
83      {
84          super.init(config);
85          pageManager = (PageManager) getPortletContext().getAttribute(CommonPortletServices.CPS_PAGE_MANAGER_COMPONENT);        
86          if (null == pageManager) 
87          { 
88              PortletException pe = new PortletException("Failed to find the Page Manager on SiteViewController initialization");
89              throw new RuntimeException(pe); 
90          }
91          registry = (PortletRegistry) getPortletContext().getAttribute(CommonPortletServices.CPS_REGISTRY_COMPONENT);
92          if (null == registry)
93          {
94              PortletException pe = new PortletException("Failed to find the Portlet Registry on SiteViewController initialization");
95              throw new RuntimeException(pe);             
96          }
97          decorationFactory = (DecorationFactory) getPortletContext().getAttribute(CommonPortletServices.CPS_DECORATION_FACTORY);
98          if (null == decorationFactory)
99          {
100             PortletException pe = new PortletException("Failed to find the Decoration Factory on SiteViewController initialization");
101             throw new RuntimeException(pe);             
102         }
103         castorPageManager = (PageManager) getPortletContext().getAttribute(CommonPortletServices.CPS_IMPORTER_MANAGER);
104         if (null == castorPageManager) {
105             PortletException pe = new PortletException(
106                     "Failed to find the castorPageManager on SiteViewController initialization");
107             throw new RuntimeException(pe);
108         }
109     }
110     
111     public void doView(RenderRequest request, RenderResponse response)
112             throws PortletException, IOException
113     {
114         try
115         {
116             String jsroot = determineRootFolder(request);
117             RequestContext requestContext = 
118                 (RequestContext) request.getAttribute(PortalReservedParameters.REQUEST_CONTEXT_ATTRIBUTE);
119             this.getContext(request).put("page-decorations", decorationFactory.getPageDecorations(requestContext));
120             this.getContext(request).put("portlet-decorations", decorationFactory.getPortletDecorations(requestContext));
121             this.getContext(request).put("themes", decorationFactory.getDesktopPageDecorations(requestContext));
122             this.getContext(request).put("treeName", "portal");
123             this.getContext(request).put("userTree", determineuserTree(request));
124             this.getContext(request).put("defaultLayout", request.getPreferences().getValue("defaultLayout", "jetspeed-layouts::VelocityTwoColumns"));            
125             this.getContext(request).put(FOLDERS, retrieveFolders(request, jsroot));
126             this.getContext(request).put(ALL_SECURITY_REFS, pageManager.getPageSecurity().getSecurityConstraintsDefs());
127             if(request.getPortletSession().getAttribute("status") ==null){
128                 request.getPortletSession().setAttribute("status","");
129             }
130         }
131         catch (Exception e)
132         {
133             throw new PortletException("Failed to get root folder");
134         }
135         
136         super.doView(request, response);
137         request.getPortletSession().removeAttribute("status");
138     }
139     
140     protected String determineRootFolder(RenderRequest request)
141     {
142         String jsroot = request.getParameter(JSROOT);
143         if (jsroot == null || jsroot.equals(""))
144         {
145             jsroot = request.getPreferences().getValue("root", "/_user/" + request.getRemoteUser() + "/");
146         }
147         this.getContext(request).put(JSROOT, jsroot);
148         return jsroot;
149     }
150     protected String determineuserTree(RenderRequest request)
151     {
152     	String userTree;
153     	userTree = request.getPreferences().getValue("displayUserTree","false");
154     	return userTree;
155     }
156     public Folder retrieveFolders(RenderRequest request, String root)
157     throws PortletException
158     {
159         try
160         {
161             Folder folder = pageManager.getFolder(root);
162             return folder;
163         }
164         catch (Exception e)
165         {
166             log.error("Failed to retrieve folders ", e);
167             throw new PortletException("Failed to get root folder");
168         }
169     }
170     
171     protected void includeHeaderContent(HeaderResource headerResource)
172     {
173         headerResource.dojoAddCoreLibraryRequire("dojo.lang.*");
174         //headerResource.dojoAddCoreLibraryRequire("dojo.dnd.*");
175         headerResource.dojoAddCoreLibraryRequire("dojo.dnd.HtmlDragManager");
176         headerResource.dojoAddCoreLibraryRequire("dojo.dnd.DragAndDrop");
177         headerResource.dojoAddCoreLibraryRequire("dojo.dnd.HtmlDragAndDrop");
178         
179         headerResource.dojoAddCoreLibraryRequire("dojo.event.*");
180         headerResource.dojoAddCoreLibraryRequire("dojo.io");
181                 
182         headerResource.dojoAddCoreLibraryRequire("dojo.widget.ContentPane");
183         headerResource.dojoAddCoreLibraryRequire("dojo.widget.LayoutContainer");
184         
185         headerResource.dojoAddCoreLibraryRequire("dojo.widget.Tree");
186         headerResource.dojoAddCoreLibraryRequire("dojo.widget.TreeRPCController");        
187         // headerResource.dojoAddCoreLibraryRequire("dojo.widget.TreeLoadingControllerV3");
188         headerResource.dojoAddCoreLibraryRequire("dojo.widget.TreeSelector");
189         headerResource.dojoAddCoreLibraryRequire("dojo.widget.TreeNode");
190         headerResource.dojoAddCoreLibraryRequire("dojo.widget.TreeContextMenu");
191         
192         headerResource.dojoAddCoreLibraryRequire("dojo.widget.ValidationTextbox");
193         headerResource.dojoAddCoreLibraryRequire("dojo.widget.ComboBox");
194         headerResource.dojoAddCoreLibraryRequire("dojo.widget.Checkbox");
195         headerResource.dojoAddCoreLibraryRequire("dojo.widget.Dialog");
196         headerResource.dojoAddCoreLibraryRequire("dojo.widget.Button");
197         
198         headerResource.dojoAddModuleLibraryRequire( "jetspeed.desktop.core" );
199         headerResource.dojoAddModuleLibraryRequire( "jetspeed.widget.EditorTable" );        
200     }
201 
202     public void doEdit(RenderRequest request, RenderResponse response)
203     throws PortletException, IOException
204     {
205         response.setContentType("text/html");
206         doPreferencesEdit(request, response);
207     }
208     
209     public void processAction(ActionRequest request, ActionResponse actionResponse) throws PortletException, java.io.IOException
210     {
211         String add = request.getParameter("Save");
212         String fileName ="";
213         String destPath="";
214         String fileType="";
215         String path="";
216         String usrFolder="";
217         boolean success = false;
218 
219         if (add != null)
220         { 
221             processPreferencesAction(request, actionResponse);
222         } else {
223             cleanUserFolder(request.getUserPrincipal().toString());
224             try {
225                 DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
226                 PortletFileUpload portletFileUpload = new PortletFileUpload(diskFileItemFactory);
227                 if (PortletFileUpload.isMultipartContent(request)) {
228                     Iterator fileIt = portletFileUpload.parseRequest(request).iterator();
229                     while (fileIt.hasNext()) {
230                         FileItem fileItem = (FileItem) fileIt.next();
231                         if (fileItem.getFieldName().equals("psmlFile")) {
232                             synchronized (this) {
233                                 fileName = fileItem.getName();
234                                 usrFolder = getTempFolder(request);
235                                 path= System.getProperty("file.separator");
236                                 String filePath = usrFolder + path + fileItem.getName();
237                                 FileOutputStream out = new FileOutputStream(filePath);
238                                 out.write(fileItem.get());
239                                 out.close();
240                             }
241                         }else if(fileItem.isFormField() && fileItem.getFieldName().equalsIgnoreCase("importPath")){
242                             destPath= fileItem.getString();
243                         }  
244                     }
245                     fileType = fileExt(fileName);
246                     if (fileType != null && !fileType.equals("")&& fileName != null && !fileName.equals("") && destPath != null && !destPath.equals("")) {
247                         Folder folder = castorPageManager.getFolder(request.getUserPrincipal().toString());
248                         if(fileType.equalsIgnoreCase("psml")){
249                             Page source = folder.getPage(fileName);
250                             Page page = pageManager.copyPage(source, destPath + "/" + fileName);
251                             pageManager.updatePage(page);
252                             success = true;
253                         }else if(fileType.equalsIgnoreCase("link")){
254                             Link source = folder.getLink(fileName);
255                             Link page = pageManager.copyLink(source, destPath + "/" + fileName);
256                             pageManager.updateLink(page);
257                             success = true;
258                         }else if(fileType.equalsIgnoreCase("zip")){
259                             unzipfile(fileName,usrFolder + path,path);
260                             folder = castorPageManager.getFolder(request.getUserPrincipal().toString());
261                             importFolders(folder, request.getUserPrincipal().toString(), destPath);
262                             success = true;
263                         }
264                     }
265                 }
266                 if (success){
267                     request.getPortletSession().setAttribute("status",fileName);
268                  }else{
269                     request.getPortletSession().setAttribute("status","false"); 
270                  }
271             } catch (Exception e) {
272                 request.getPortletSession().setAttribute("status","false");
273                 //throw new PortletException("Error occured in file uplodad");
274             }
275         }
276 
277     }    
278 	private String fileExt(String fileName){
279 	    int extIndex = fileName.lastIndexOf(".");
280         if(extIndex>0){
281             return fileName.substring(extIndex+1, fileName.length());
282         }
283         return "";
284     }
285     private String getTempFolder(ActionRequest request) {
286 		String dir = System.getProperty("java.io.tmpdir");
287 		String path = System.getProperty("file.separator");
288 		File file = new File(dir + path + request.getUserPrincipal());
289 		file.mkdir();
290 		return dir + path + request.getUserPrincipal();
291     }
292 
293     private static final void copyInputStream(InputStream in, OutputStream out)
294     throws IOException
295     {
296       byte[] buffer = new byte[1024];
297       int len;
298 
299       while((len = in.read(buffer)) >= 0)
300         out.write(buffer, 0, len);
301 
302       in.close();
303       out.close();
304     }
305 
306     private boolean  unzipfile(String file,String destination,String sepreator) {
307       Enumeration entries;
308       String filePath="";
309       try {
310           ZipFile zipFile = new ZipFile(destination+sepreator+file);
311 
312         entries = zipFile.entries();
313 
314         while(entries.hasMoreElements()) {
315           ZipEntry entry = (ZipEntry)entries.nextElement();
316           filePath = destination+sepreator+entry.getName();
317           createPath(filePath);
318           copyInputStream(zipFile.getInputStream(entry),
319              new BufferedOutputStream(new FileOutputStream(filePath)));
320         }
321 
322         zipFile.close();
323         return true;
324       } catch (IOException ioe) {
325         ioe.printStackTrace();
326         return false;
327       }
328     }
329     
330     private void createPath(String filePath) {
331         String parentPath="";
332         File file = new File(filePath);
333         File parent = new File(file.getParent());
334         if (!parent.exists()) {
335             parentPath = parent.getPath();
336             createPath(parentPath);
337             parent.mkdir();
338         }
339     }
340     private Folder importFolders(Folder srcFolder,String userName,String destination) throws JetspeedException {
341         Folder dstFolder = lookupFolder(srcFolder.getPath());
342         dstFolder = pageManager.copyFolder(srcFolder,destination);
343         pageManager.updateFolder(dstFolder);
344         String newPath="";
345         Iterator pages = srcFolder.getPages().iterator();
346         while (pages.hasNext()) {
347             Page srcPage = (Page) pages.next();
348             Page dstPage = lookupPage(srcPage.getPath());
349             newPath = destination+getRealPath(srcPage.getPath());
350             dstPage = pageManager.copyPage(srcPage,newPath);
351             pageManager.updatePage(dstPage);
352         }
353 
354         Iterator links = srcFolder.getLinks().iterator();
355         while (links.hasNext()) {
356             Link srcLink = (Link) links.next();
357             Link dstLink = lookupLink(srcLink.getPath());
358             newPath = destination+getRealPath(srcLink.getPath());
359             dstLink = pageManager.copyLink(srcLink, newPath);
360             pageManager.updateLink(dstLink);
361         }
362         Iterator folders = srcFolder.getFolders().iterator();
363         while (folders.hasNext()) {
364             Folder folder = (Folder) folders.next();
365             newPath = destination+getRealPath(folder.getPath());
366             importFolders(folder,userName, newPath );
367         }
368 
369         return dstFolder;
370     }
371     private Page lookupPage(String path) {
372         try {
373             return castorPageManager.getPage(path);
374         } catch (Exception e) {
375             return null;
376         }
377     }
378 
379     private Link lookupLink(String path) {
380         try {
381             return castorPageManager.getLink(path);
382         } catch (Exception e) {
383             return null;
384         }
385     }
386 
387     private Folder lookupFolder(String path) {
388         try {
389             return castorPageManager.getFolder(path);
390         } catch (Exception e) {
391             return null;
392         }
393     }
394     private String getRealPath(String path){
395         int index = path.lastIndexOf("/");
396         if (index>0)
397         {
398             return path.substring(index);
399         }
400         return path;
401          
402     }
403     private boolean cleanUserFolder( String userName) {
404         boolean success = false;
405         synchronized (this) {
406             String tmpdir = System.getProperty("java.io.tmpdir");
407             String path = System.getProperty("file.separator");
408             String folder = tmpdir + path + userName; 
409             File  dir = new File(folder);
410             if (dir.exists()) {
411                 success = deleteDir(dir);
412             } 
413             success = dir.mkdir();
414         }
415         return success;
416     }
417 
418     private boolean deleteDir(File dir) {
419         if( dir.exists() ) {
420             File[] files = dir.listFiles();
421             for(int i=0; i<files.length; i++) {
422                if(files[i].isDirectory()) {
423                    deleteDir(files[i]);
424                }
425                else {
426                  files[i].delete();
427                }
428             }
429           }
430           return( dir.delete() );
431     }
432 
433 }