KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > openedit > links > LinkModule


1 /*
2  * Created on Dec 22, 2004
3  */

4 package org.openedit.links;
5
6 import java.io.StringWriter JavaDoc;
7 import java.io.Writer JavaDoc;
8
9 import org.apache.commons.logging.Log;
10 import org.apache.commons.logging.LogFactory;
11 import org.openedit.links.webtree.LinkTreeModel;
12 import org.openedit.repository.ContentItem;
13 import org.openedit.repository.filesystem.StringItem;
14
15 import com.openedit.OpenEditException;
16 import com.openedit.PageAccessListener;
17 import com.openedit.WebPageRequest;
18 import com.openedit.modules.BaseModule;
19 import com.openedit.page.Page;
20 import com.openedit.page.manage.PageManager;
21 import com.openedit.users.User;
22 import com.openedit.util.PathUtilities;
23 import com.openedit.webui.tree.WebTree;
24 import com.openedit.webui.tree.WebTreeNodeTreeRenderer;
25
26 /**
27  * TODO: Make the linktree name a param that can be set externally
28  * @author cburkey
29  *
30  */

31 public class LinkModule extends BaseModule implements PageAccessListener
32 {
33     protected static final String JavaDoc FILESIZE = "filesize";
34     protected FileSize fieldFileSize;
35     private static final Log log = LogFactory.getLog(LinkModule.class);
36     protected boolean fieldForceReload;
37     
38     public FileSize getFileSize()
39     {
40         //TODO: Move this to its own module method
41
if ( fieldFileSize == null)
42         {
43             fieldFileSize = new FileSize();
44             fieldFileSize.setPageManager(getPageManager());
45             fieldFileSize.setRoot(getRoot());
46         }
47         return fieldFileSize;
48     }
49     public void setFileSize(FileSize inFileSize)
50     {
51         fieldFileSize = inFileSize;
52     }
53
54     public LinkTree loadLinks(WebPageRequest inReq) throws OpenEditException
55     {
56         return getLinkTree(inReq);
57     }
58     
59     public void setSelectedLinkByUrl(WebPageRequest inReq) throws OpenEditException
60     {
61         LinkTree tree = getLinkTree(inReq);
62         String JavaDoc path = inReq.getContentPage().getPath();
63         
64         Link newselection = tree.findSelectedLinkByUrl(path);
65         tree.setSelectedLink(newselection);
66     }
67     protected void init()
68     {
69         getPageManager().addPageAccessListener(this);
70         
71     }
72     
73     protected LinkTree getLinkTree(WebPageRequest inReq) throws OpenEditException
74     {
75         String JavaDoc path =findValue("linkpath", inReq);
76         if ( path == null)
77         {
78             path = "/links.xml";
79         }
80         String JavaDoc name = findValue("linktreename", inReq);
81         
82         if ( name == null)
83         {
84             name = "linktree";
85         }
86
87         Page linkpage = getPageManager().getPage(path,inReq ); //may be draft if it exists
88
// String id = null;
89

90 // User user = inReq.getUser();
91
// if ( user != null)
92
// {
93
// if ( user.hasProperty("oe.edit.draftmode" ))
94
// {
95
// String draftPath = PathUtilities.createDraftPath(path);
96
// id = name + draftPath;
97
// }
98
// }
99
// if( id == null)
100
// {
101
String JavaDoc draft = "false";
102         User user = inReq.getUser();
103         if( user != null && user.hasPermission("oe.edit.draftmode") )
104         {
105             draft = "true";
106         }
107         String JavaDoc id = path + "_" + draft +"_"+ name +"_" + getLoaderName(inReq);
108 // }
109
LinkTree tree = (LinkTree)inReq.getSessionValue(id);
110         
111         if ( tree == null && !linkpage.exists())
112         {
113             log.info( path + " not found");
114             tree = new LinkTree();
115             Link root = new Link();
116             root.setPath("/index.html");
117             root.setId("index");
118             root.setText("Index");
119             tree.setRootLink(root);
120             tree.setPage(linkpage);
121             tree.setId(id);
122             //throw new OpenEditException("could not find " + slink);
123
}
124         else
125         {
126             boolean needsUpdate = true;
127             String JavaDoc selectedLink = null;
128             long newModified = linkpage.getLastModified().getTime();
129             if ( tree != null )
130             {
131                 needsUpdate = (tree.getLastModified() != newModified);
132                 if ( tree.getSelectedLink() != null)
133                 {
134                     selectedLink = tree.getSelectedLink().getId();
135                 }
136             }
137             if( isForceReload() )
138             {
139                 //TODO: Change this to work for multiple browsers.
140
//TODO: Being used by htmlLinkLoader
141
setForceReload(false);
142                 needsUpdate = true;
143             }
144             if ( needsUpdate )
145             {
146                 if (linkpage.exists())
147                 {
148                     XmlLinkLoader loader = getLinkLoader(inReq);
149                     tree = loader.loadLinks(linkpage);
150 // log.info("loaded " + linkpage.getContentItem().getActualPath() + " into " + id);
151
// log.info("Count " + tree.getRootLink().getChildren().size());
152
tree.setLastModified(newModified);
153                 }
154                 else
155                 {
156                     log.info("deleted links.xml file");
157                 }
158                 tree.setSelectedLink( selectedLink );
159                 tree.setId(id);
160                 inReq.putSessionValue(id, tree);
161                 tree.setPage(linkpage);
162             }
163         }
164         //need to put the right tree in here if we are in draft mode
165
// log.info(tree.getRootLink().hashCode() + "Returning " + id +" Count " + tree.getRootLink().getChildren().size());
166
inReq.putPageValue(name,tree);
167         //loadSizer(inReq); call the action if needed
168
return tree;
169     }
170     
171     public String JavaDoc getLoaderName(WebPageRequest inReq)
172     {
173         String JavaDoc linkLoader = inReq.getPage().get("linkloader");
174             
175         if (linkLoader == null && inReq.getCurrentAction()!= null )
176         {
177             linkLoader = inReq.getCurrentAction().getChildValue("linkloader");
178         }
179         if( linkLoader == null )
180         {
181             linkLoader = "htmlLinkLoader";
182         }
183         if( linkLoader.equals("SimpleLinkLoader")) //Old name
184
{
185             linkLoader = "xmlLinkLoader";
186         }
187         return linkLoader;
188     }
189     
190     public XmlLinkLoader getLinkLoader(WebPageRequest inReq)
191     {
192         String JavaDoc linkLoader = getLoaderName(inReq);
193         return (XmlLinkLoader) getModuleManager().getBean(linkLoader);
194     }
195     public void loadSizer(WebPageRequest inReq)
196     {
197         inReq.putSessionValue(FILESIZE, getFileSize());
198     }
199     protected void save(WebPageRequest inReq, String JavaDoc inMessage) throws Exception JavaDoc
200     {
201         LinkTree tree = getLinkTree(inReq);
202         XmlLinkLoader loader = new XmlLinkLoader();
203
204         //TODO: Dont hard code the links.xml location
205
String JavaDoc path = tree.getPath();
206         path = PathUtilities.createDraftPath(path);
207
208         Page linkpage = getPageManager().getPage(path, inReq);
209         
210         Writer JavaDoc out = new StringWriter JavaDoc();
211         try
212         {
213             loader.saveLinks(tree, out, linkpage.getCharacterEncoding());
214         }
215         finally
216         {
217             out.close();
218         }
219         StringItem item = new StringItem(linkpage.getPath(),out.toString(),linkpage.getCharacterEncoding() );
220         item.setAuthor(inReq.getUser().getUserName());
221         item.setMessage(inMessage);
222         item.setType(ContentItem.TYPE_EDITED);
223         linkpage.setContentItem(item);
224         getPageManager().putPage(linkpage);
225         //log.info("Saved: " + tree.getPath() );
226

227     }
228
229     public void saveLink(WebPageRequest inReq) throws Exception JavaDoc
230     {
231         inReq.getUser().put("oe.edit.draftmode", "true");
232
233         LinkTree tree = getLinkTree(inReq);
234         Link link = tree.getSelectedLink();
235
236         String JavaDoc name = inReq.getRequestParameter("linktext");
237         String JavaDoc url = inReq.getRequestParameter("url");
238         String JavaDoc userdata = inReq.getRequestParameter("userdata");
239         String JavaDoc newLinkId = inReq.getRequestParameter("newlinkid");
240         if (newLinkId != null && !newLinkId.equals(link.getId()))
241         {
242             getLinkTree(inReq).changeLinkId(link, newLinkId);
243         }
244         link.setUserData(userdata);
245         link.setText(name);
246         link.setPath(url);
247         
248         String JavaDoc redirectpath = inReq.getRequestParameter("redirectPath");
249         String JavaDoc accessKey = inReq.getRequestParameter("accesskey");
250         link.setRedirectPath(redirectpath);
251         String JavaDoc autoloadchildren = inReq.getRequestParameter("autoloadchildren");
252         link.setAutoLoadChildren(Boolean.parseBoolean(autoloadchildren));
253         link.setAccessKey(accessKey);
254         save(inReq, "Saved " + name);
255
256     }
257
258     public void appendLink(WebPageRequest inReq) throws Exception JavaDoc
259     {
260         inReq.getUser().put("oe.edit.draftmode", "true");
261
262         LinkTree tree = getLinkTree(inReq);
263
264         Link newlink = new Link();//getLinkTree().addLink(userdata,getLinkTree().nextId(),parentId,url,name);
265
String JavaDoc userdata = inReq.getRequestParameter("userdata");
266         newlink.setUserData(userdata);
267         String JavaDoc name = "New Link";
268         newlink.setText(name);
269
270         if ( tree.getRootLink() == null)
271         {
272             newlink.setId("index");
273             tree.setRootLink( newlink);
274             log.error("No index link. Creating one.");
275             return;
276         }
277         String JavaDoc parentId = inReq.getRequestParameter("linkid");
278         if( parentId == null)
279         {
280             parentId = "index";
281         }
282         Link link = tree.getLink(parentId);
283         if ( link == null)
284         {
285             log.error("No link selected");
286             return;
287         }
288         String JavaDoc url = PathUtilities.extractDirectoryPath(link.getUrl()) + "/newlink.html"; //inReq.getRequestParameter("url");
289
newlink.setId(tree.nextId());
290         newlink.setPath(url);
291         tree.addLink(parentId,newlink);
292         save(inReq, "Added New link");
293         
294         //getLinkTree(inReq).setSelectedLink(newlink);
295
tree.setSelectedLink(newlink.getId());
296     }
297     public void copyLink(WebPageRequest inReq) throws Exception JavaDoc
298     {
299         inReq.getUser().put("oe.edit.draftmode", "true");
300
301         LinkTree tree = getLinkTree(inReq);
302         Link link = tree.getSelectedLink();
303         if ( link == null)
304         {
305             log.error("No link selected");
306             return;
307         }
308         link = link.getParentLink();
309
310         String JavaDoc name = inReq.getRequestParameter("linktext");
311         String JavaDoc url = inReq.getRequestParameter("url");
312         String JavaDoc userdata = inReq.getRequestParameter("userdata");
313
314         Link newlink = new Link();//getLinkTree().addLink(userdata,getLinkTree().nextId(),parentId,url,name);
315
newlink.setUserData(userdata);
316         String JavaDoc newLinkId = inReq.getRequestParameter("newlinkid");
317         if ( tree.getLink(newLinkId) != null )
318         {
319             newlink.setId(tree.nextId());
320         }
321         else
322         {
323             newlink.setId(newLinkId);
324         }
325         newlink.setPath(url);
326         newlink.setText(name);
327
328         tree.addLink(link.getId(),newlink);
329         save(inReq,"Copy link");
330         
331         //getLinkTree(inReq).setSelectedLink(newlink);
332
tree.setSelectedLink(newlink.getId());
333         
334     }
335
336     public void selectLink(WebPageRequest inReq) throws Exception JavaDoc
337     {
338         String JavaDoc linkId = inReq.getRequestParameter("linkid");
339         if( linkId != null)
340         {
341             inReq.getUser().put("oe.edit.draftmode", "true");
342             getLinkTree(inReq).setSelectedLink(linkId);
343         }
344     }
345
346     public void removeLink(WebPageRequest inReq) throws Exception JavaDoc
347     {
348         inReq.getUser().put("oe.edit.draftmode", "true");
349
350             Link link = getLinkTree(inReq).getSelectedLink();
351             getLinkTree(inReq).removeLink(link);
352             save(inReq, "Removed Link");
353     }
354     public void moveUp(WebPageRequest inReq) throws Exception JavaDoc
355     {
356         inReq.getUser().put("oe.edit.draftmode", "true");
357
358         Link link = getLinkTree(inReq).getSelectedLink();
359         getLinkTree(inReq).moveUp(link);
360         save(inReq,"Moved up");
361     }
362     public void moveDown(WebPageRequest inReq) throws Exception JavaDoc
363     {
364         inReq.getUser().put("oe.edit.draftmode", "true");
365
366         Link link = getLinkTree(inReq).getSelectedLink();
367         getLinkTree(inReq).moveDown(link);
368         save(inReq,"Moved down");
369     }
370     public void moveRight(WebPageRequest inReq) throws Exception JavaDoc
371     {
372         inReq.getUser().put("oe.edit.draftmode", "true");
373
374         Link link = getLinkTree(inReq).getSelectedLink();
375         getLinkTree(inReq).moveRight(link);
376         save(inReq,"Moved Right");
377     }
378     public void moveLeft(WebPageRequest inReq) throws Exception JavaDoc
379     {
380         inReq.getUser().put("oe.edit.draftmode", "true");
381
382         Link link = getLinkTree(inReq).getSelectedLink();
383         getLinkTree(inReq).moveLeft(link);
384         save(inReq,"Moved left");
385     }
386     /**
387      * @param inReq
388      * @param pageManager
389      * @throws OpenEditException
390      */

391     public void checkLinksRedirect(WebPageRequest inReq) throws OpenEditException
392     {
393         if ( !inReq.getContentPage().isHtml() )
394         {
395             return;
396         }
397         LinkTree tree = loadLinks(inReq);
398         if ( tree != null)
399         {
400             //look in the /links.xml file, if a matching link has a redirectPath defined, then redirect
401
String JavaDoc redirect = tree.findRedirect( inReq.getPath() );
402             if ( redirect != null)
403             {
404                 if(redirect.toLowerCase().startsWith("http"))
405                 {
406                     inReq.redirectPermanently(redirect);
407                 }
408                 else
409                 {
410                     PageManager pageManager = getPageManager();
411
412                     Page redirectPage = pageManager.getPage(redirect);
413                     if (redirectPage.exists())
414                     {
415                         inReq.redirectPermanently(redirect);
416                     }
417                     
418                 }
419             }
420
421         }
422     }
423     public void pageAdded(Page inPage)
424     {
425         setForceReload(true);
426     }
427     public void pageModified(Page inPage)
428     {
429         setForceReload(true);
430     }
431     public void pageRemoved(Page inPage)
432     {
433         setForceReload(true);
434     }
435     public void pageRequested(Page inPage)
436     {
437     }
438     public boolean isForceReload()
439     {
440         return fieldForceReload;
441     }
442     public void setForceReload(boolean inForceReload)
443     {
444         fieldForceReload = inForceReload;
445     }
446     
447     public WebTree getWebTree( WebPageRequest inRequest ) throws OpenEditException
448     {
449         String JavaDoc name = findValue("tree-name",inRequest);
450                 
451         String JavaDoc treeid = inRequest.getRequestParameter("treeid");
452         if( treeid == null)
453         {
454             treeid = name + inRequest.getUserName();
455         }
456         WebTree webTree = (WebTree) inRequest.getSessionValue( treeid );
457
458         LinkTree linktree = getLinkTree(inRequest);
459         if ( webTree == null )
460         {
461             log.info("No web link tree in Session, creating new " + name);
462
463             webTree = new WebTree();
464             webTree.setName(name);
465             webTree.setId( treeid);
466             WebTreeNodeTreeRenderer renderer = new WebTreeNodeTreeRenderer( webTree );
467             renderer.setFoldersLinked( true );
468             String JavaDoc prefix = findValue( "url-prefix", inRequest );
469             prefix = inRequest.getPage().getPageSettings().replaceProperty(prefix);
470             renderer.setUrlPrefix(prefix );
471             String JavaDoc postfix = findValue( "url-postfix", inRequest );
472             renderer.setUrlPostfix(postfix );
473             webTree.setTreeRenderer(renderer);
474             String JavaDoc home = (String JavaDoc) inRequest.getPageValue( "home" );
475             renderer.setHome(home);
476             
477             //expand just the top level
478
/* for (Iterator iter = main.getChildren().iterator(); iter.hasNext();)
479             {
480                 Category child = (Category) iter.next();
481                 renderer.expandNode(child);
482             }*/

483             LinkTreeModel model = new LinkTreeModel(linktree);
484             webTree.setModel(model);
485             renderer.expandAll(model.getRoot());
486             inRequest.putSessionValue(treeid, webTree);
487         }
488         else
489         {
490             LinkTreeModel model = new LinkTreeModel(linktree);
491             webTree.setModel(model);
492         }
493
494         inRequest.putPageValue(name, webTree);
495         return webTree;
496     }
497
498     
499 }
500
Popular Tags