1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
66 protected PageManager pageManager;
67 protected PortletRegistry registry;
68 protected DecorationFactory decorationFactory;
69
70
71 protected final static String SESSION_FOLDERS = "jetspeed.site.manager.folders";
72 protected final static String SESSION_ROOT = "jetspeed.site.manager.root";
73
74
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
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
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
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 }