001: /*
002: * Created on Dec 22, 2004
003: */
004: package org.openedit.links;
005:
006: import java.io.StringWriter;
007: import java.io.Writer;
008:
009: import org.apache.commons.logging.Log;
010: import org.apache.commons.logging.LogFactory;
011: import org.openedit.links.webtree.LinkTreeModel;
012: import org.openedit.repository.ContentItem;
013: import org.openedit.repository.filesystem.StringItem;
014:
015: import com.openedit.OpenEditException;
016: import com.openedit.PageAccessListener;
017: import com.openedit.WebPageRequest;
018: import com.openedit.modules.BaseModule;
019: import com.openedit.modules.workflow.WorkFlow;
020: import com.openedit.page.Page;
021: import com.openedit.page.manage.PageManager;
022: import com.openedit.users.User;
023: import com.openedit.util.PathUtilities;
024: import com.openedit.webui.tree.WebTree;
025: import com.openedit.webui.tree.WebTreeNodeTreeRenderer;
026:
027: /**
028: * TODO: Make the linktree name a param that can be set externally
029: * @author cburkey
030: *
031: */
032: public class LinkModule extends BaseModule implements
033: PageAccessListener {
034: protected static final String FILESIZE = "filesize";
035: protected FileSize fieldFileSize;
036: private static final Log log = LogFactory.getLog(LinkModule.class);
037: protected boolean fieldForceReload;
038: protected WorkFlow fieldWorkFlow;
039:
040: public FileSize getFileSize() {
041: //TODO: Move this to its own module method
042: if (fieldFileSize == null) {
043: fieldFileSize = new FileSize();
044: fieldFileSize.setPageManager(getPageManager());
045: fieldFileSize.setRoot(getRoot());
046: }
047: return fieldFileSize;
048: }
049:
050: public void setFileSize(FileSize inFileSize) {
051: fieldFileSize = inFileSize;
052: }
053:
054: public LinkTree loadLinks(WebPageRequest inReq)
055: throws OpenEditException {
056: return getLinkTree(inReq);
057: }
058:
059: public void setSelectedLinkByUrl(WebPageRequest inReq)
060: throws OpenEditException {
061: LinkTree tree = getLinkTree(inReq);
062: String path = inReq.getContentPage().getPath();
063:
064: Link newselection = tree.findSelectedLinkByUrl(path);
065: tree.setSelectedLink(newselection);
066: }
067:
068: protected void init() {
069: getPageManager().addPageAccessListener(this );
070:
071: }
072:
073: protected LinkTree getLinkTree(WebPageRequest inReq)
074: throws OpenEditException {
075: String path = inReq.findValue("linkpath");
076: if (path == null) {
077: path = "/links.xml";
078: }
079: String name = inReq.findValue("linktreename");
080:
081: if (name == null) {
082: name = "linktree";
083: }
084:
085: Page linkpage = getPageManager().getPage(path, inReq); //may be draft if it exists
086: // String id = null;
087:
088: // User user = inReq.getUser();
089: // if ( user != null)
090: // {
091: // if ( user.hasProperty("oe.edit.draftmode" ))
092: // {
093: // String draftPath = PathUtilities.createDraftPath(path);
094: // id = name + draftPath;
095: // }
096: // }
097: // if( id == null)
098: // {
099: String draft = "false";
100: User user = inReq.getUser();
101: if (user != null && user.hasPermission("oe.edit.draftmode")) {
102: draft = "true";
103: }
104: String id = path + "_" + draft + "_" + name + "_"
105: + getLoaderName(inReq);
106: // }
107: LinkTree tree = (LinkTree) inReq.getSessionValue(id);
108:
109: if (tree == null && !linkpage.exists()) {
110: log.info(path + " not found");
111: tree = new LinkTree();
112: Link root = new Link();
113: root.setPath("/index.html");
114: root.setId("index");
115: root.setText("Index");
116: tree.setRootLink(root);
117: tree.setPage(linkpage);
118: tree.setId(id);
119: //throw new OpenEditException("could not find " + slink);
120: } else {
121: boolean needsUpdate = true;
122: String selectedLink = null;
123: long newModified = linkpage.getLastModified().getTime();
124: if (tree != null) {
125: needsUpdate = (tree.getLastModified() != newModified);
126: if (tree.getSelectedLink() != null) {
127: selectedLink = tree.getSelectedLink().getId();
128: }
129: }
130: if (isForceReload()) {
131: //TODO: Change this to work for multiple browsers.
132: //TODO: Being used by htmlLinkLoader
133: setForceReload(false);
134: needsUpdate = true;
135: }
136: if (needsUpdate) {
137: if (linkpage.exists()) {
138: XmlLinkLoader loader = getLinkLoader(inReq);
139: tree = loader.loadLinks(linkpage);
140: // log.info("loaded " + linkpage.getContentItem().getActualPath() + " into " + id);
141: // log.info("Count " + tree.getRootLink().getChildren().size());
142: tree.setLastModified(newModified);
143: } else {
144: log.info("deleted links.xml file");
145: }
146: tree.setSelectedLink(selectedLink);
147: tree.setId(id);
148: inReq.putSessionValue(id, tree);
149: tree.setPage(linkpage);
150: }
151: }
152: //need to put the right tree in here if we are in draft mode
153: // log.info(tree.getRootLink().hashCode() + "Returning " + id +" Count " + tree.getRootLink().getChildren().size());
154: inReq.putPageValue(name, tree);
155: //loadSizer(inReq); call the action if needed
156: return tree;
157: }
158:
159: public String getLoaderName(WebPageRequest inReq) {
160: String linkLoader = inReq.getPage().get("linkloader");
161:
162: if (linkLoader == null && inReq.getCurrentAction() != null) {
163: linkLoader = inReq.getCurrentAction().getChildValue(
164: "linkloader");
165: }
166: if (linkLoader == null) {
167: linkLoader = "htmlLinkLoader";
168: }
169: if (linkLoader.equals("SimpleLinkLoader")) //Old name
170: {
171: linkLoader = "xmlLinkLoader";
172: }
173: return linkLoader;
174: }
175:
176: public XmlLinkLoader getLinkLoader(WebPageRequest inReq)
177: throws OpenEditException {
178: String linkLoader = getLoaderName(inReq);
179: return (XmlLinkLoader) getModuleManager().getBean(linkLoader);
180: }
181:
182: public void loadSizer(WebPageRequest inReq) {
183: inReq.putSessionValue(FILESIZE, getFileSize());
184: }
185:
186: protected void save(WebPageRequest inReq, String inMessage)
187: throws Exception {
188: LinkTree tree = getLinkTree(inReq);
189: XmlLinkLoader loader = new XmlLinkLoader();
190:
191: //TODO: Dont hard code the links.xml location
192: String path = tree.getPath();
193: path = PathUtilities.createDraftPath(path);
194:
195: Page linkpage = getPageManager().getPage(path, inReq);
196:
197: Writer out = new StringWriter();
198: try {
199: loader
200: .saveLinks(tree, out, linkpage
201: .getCharacterEncoding());
202: } finally {
203: out.close();
204: }
205: StringItem item = new StringItem(linkpage.getPath(), out
206: .toString(), linkpage.getCharacterEncoding());
207: item.setAuthor(inReq.getUser().getUserName());
208: item.setMessage(inMessage);
209: item.setType(ContentItem.TYPE_EDITED);
210: linkpage.setContentItem(item);
211: getPageManager().putPage(linkpage);
212: //log.info("Saved: " + tree.getPath() );
213:
214: }
215:
216: public void saveLink(WebPageRequest inReq) throws Exception {
217: inReq.getUser().put("oe.edit.draftmode", "true");
218:
219: LinkTree tree = getLinkTree(inReq);
220: Link link = tree.getSelectedLink();
221:
222: String name = inReq.getRequestParameter("linktext");
223: String url = inReq.getRequestParameter("url");
224: String userdata = inReq.getRequestParameter("userdata");
225: String newLinkId = inReq.getRequestParameter("newlinkid");
226: if (newLinkId != null && !newLinkId.equals(link.getId())) {
227: getLinkTree(inReq).changeLinkId(link, newLinkId);
228: }
229: link.setUserData(userdata);
230: link.setText(name);
231: link.setPath(url);
232:
233: String redirectpath = inReq.getRequestParameter("redirectPath");
234: String accessKey = inReq.getRequestParameter("accesskey");
235: link.setRedirectPath(redirectpath);
236: String autoloadchildren = inReq
237: .getRequestParameter("autoloadchildren");
238: link
239: .setAutoLoadChildren(Boolean
240: .parseBoolean(autoloadchildren));
241: link.setAccessKey(accessKey);
242: save(inReq, "Saved " + name);
243:
244: }
245:
246: public void appendLink(WebPageRequest inReq) throws Exception {
247: inReq.getUser().put("oe.edit.draftmode", "true");
248:
249: LinkTree tree = getLinkTree(inReq);
250:
251: Link newlink = new Link();//getLinkTree().addLink(userdata,getLinkTree().nextId(),parentId,url,name);
252: String userdata = inReq.getRequestParameter("userdata");
253: newlink.setUserData(userdata);
254: String name = inReq.getRequestParameter("linktext");
255: if (name == null) {
256: name = "New Link";
257: }
258: newlink.setText(name);
259:
260: if (tree.getRootLink() == null) {
261: newlink.setId("index");
262: tree.setRootLink(newlink);
263: log.error("No index link. Creating one.");
264: return;
265: }
266: String parentId = inReq.getRequestParameter("linkid");
267: if (parentId == null) {
268: parentId = "index";
269: }
270: Link link = tree.getLink(parentId);
271: if (link == null) {
272: log.error("No link selected");
273: return;
274: }
275: String url = inReq.getRequestParameter("url");
276: if (url == null) {
277: url = PathUtilities.extractDirectoryPath(link.getUrl())
278: + "/newlink.html"; //inReq.getRequestParameter("url");
279: }
280: String newid = inReq.getRequestParameter("newlinkid");
281: if (newid == null) {
282: newid = tree.nextId();
283: }
284: newlink.setId(newid);
285:
286: newlink.setPath(url);
287: tree.addLink(parentId, newlink);
288: save(inReq, "Added New link " + url);
289:
290: //getLinkTree(inReq).setSelectedLink(newlink);
291: tree.setSelectedLink(newlink.getId());
292: }
293:
294: public void copyLink(WebPageRequest inReq) throws Exception {
295: inReq.getUser().put("oe.edit.draftmode", "true");
296:
297: LinkTree tree = getLinkTree(inReq);
298: Link link = tree.getSelectedLink();
299: if (link == null) {
300: log.error("No link selected");
301: return;
302: }
303: link = link.getParentLink();
304:
305: String name = inReq.getRequestParameter("linktext");
306: String url = inReq.getRequestParameter("url");
307: String userdata = inReq.getRequestParameter("userdata");
308:
309: Link newlink = new Link();//getLinkTree().addLink(userdata,getLinkTree().nextId(),parentId,url,name);
310: newlink.setUserData(userdata);
311: String newLinkId = inReq.getRequestParameter("newlinkid");
312: if (tree.getLink(newLinkId) != null) {
313: newlink.setId(tree.nextId());
314: } else {
315: newlink.setId(newLinkId);
316: }
317: newlink.setPath(url);
318: newlink.setText(name);
319:
320: tree.addLink(link.getId(), newlink);
321: save(inReq, "Copy link");
322:
323: //getLinkTree(inReq).setSelectedLink(newlink);
324: tree.setSelectedLink(newlink.getId());
325:
326: }
327:
328: public void selectLink(WebPageRequest inReq) throws Exception {
329: String linkId = inReq.getRequestParameter("linkid");
330: if (linkId != null) {
331: inReq.getUser().put("oe.edit.draftmode", "true");
332: getLinkTree(inReq).setSelectedLink(linkId);
333: }
334: }
335:
336: public void removeLink(WebPageRequest inReq) throws Exception {
337: inReq.getUser().put("oe.edit.draftmode", "true");
338:
339: Link link = getLinkTree(inReq).getSelectedLink();
340: getLinkTree(inReq).removeLink(link);
341: save(inReq, "Removed Link");
342: }
343:
344: public void moveUp(WebPageRequest inReq) throws Exception {
345: inReq.getUser().put("oe.edit.draftmode", "true");
346:
347: Link link = getLinkTree(inReq).getSelectedLink();
348: getLinkTree(inReq).moveUp(link);
349: save(inReq, "Moved up");
350: }
351:
352: public void moveDown(WebPageRequest inReq) throws Exception {
353: inReq.getUser().put("oe.edit.draftmode", "true");
354:
355: Link link = getLinkTree(inReq).getSelectedLink();
356: getLinkTree(inReq).moveDown(link);
357: save(inReq, "Moved down");
358: }
359:
360: public void moveRight(WebPageRequest inReq) throws Exception {
361: inReq.getUser().put("oe.edit.draftmode", "true");
362:
363: Link link = getLinkTree(inReq).getSelectedLink();
364: getLinkTree(inReq).moveRight(link);
365: save(inReq, "Moved Right");
366: }
367:
368: public void moveLeft(WebPageRequest inReq) throws Exception {
369: inReq.getUser().put("oe.edit.draftmode", "true");
370:
371: Link link = getLinkTree(inReq).getSelectedLink();
372: getLinkTree(inReq).moveLeft(link);
373: save(inReq, "Moved left");
374: }
375:
376: /**
377: * @param inReq
378: * @param pageManager
379: * @throws OpenEditException
380: */
381: public void checkLinksRedirect(WebPageRequest inReq)
382: throws OpenEditException {
383: if (!inReq.getContentPage().isHtml()) {
384: return;
385: }
386: LinkTree tree = loadLinks(inReq);
387: if (tree != null) {
388: //look in the /links.xml file, if a matching link has a redirectPath defined, then redirect
389: String redirect = tree.findRedirect(inReq.getPath());
390: if (redirect != null) {
391: if (redirect.toLowerCase().startsWith("http")) {
392: inReq.redirectPermanently(redirect);
393: } else {
394: PageManager pageManager = getPageManager();
395:
396: Page redirectPage = pageManager.getPage(redirect);
397: if (redirectPage.exists()) {
398: inReq.redirectPermanently(redirect);
399: }
400:
401: }
402: }
403:
404: }
405: }
406:
407: public void pageAdded(Page inPage) {
408: setForceReload(true);
409: }
410:
411: public void pageModified(Page inPage) {
412: setForceReload(true);
413: }
414:
415: public void pageRemoved(Page inPage) {
416: setForceReload(true);
417: }
418:
419: public void pageRequested(Page inPage) {
420: }
421:
422: public boolean isForceReload() {
423: return fieldForceReload;
424: }
425:
426: public void setForceReload(boolean inForceReload) {
427: fieldForceReload = inForceReload;
428: }
429:
430: public WebTree getWebTree(WebPageRequest inRequest)
431: throws OpenEditException {
432: String name = inRequest.findValue("tree-name");
433:
434: String treeid = inRequest.getRequestParameter("treeid");
435: if (treeid == null) {
436: treeid = name + inRequest.getUserName();
437: }
438: WebTree webTree = (WebTree) inRequest.getSessionValue(treeid);
439:
440: LinkTree linktree = getLinkTree(inRequest);
441: if (webTree == null) {
442: log.info("No web link tree in Session, creating new "
443: + name);
444:
445: webTree = new WebTree();
446: webTree.setName(name);
447: webTree.setId(treeid);
448: WebTreeNodeTreeRenderer renderer = new WebTreeNodeTreeRenderer(
449: webTree);
450: renderer.setFoldersLinked(true);
451: String prefix = inRequest.findValue("url-prefix");
452: prefix = inRequest.getPage().getPageSettings()
453: .replaceProperty(prefix);
454: renderer.setUrlPrefix(prefix);
455: String postfix = inRequest.findValue("url-postfix");
456: renderer.setUrlPostfix(postfix);
457: webTree.setTreeRenderer(renderer);
458: String home = (String) inRequest.getPageValue("home");
459: renderer.setHome(home);
460:
461: //expand just the top level
462: /* for (Iterator iter = main.getChildren().iterator(); iter.hasNext();)
463: {
464: Category child = (Category) iter.next();
465: renderer.expandNode(child);
466: }*/
467: LinkTreeModel model = new LinkTreeModel(linktree);
468: webTree.setModel(model);
469: renderer.expandAll(model.getRoot());
470: inRequest.putSessionValue(treeid, webTree);
471: } else {
472: LinkTreeModel model = new LinkTreeModel(linktree);
473: webTree.setModel(model);
474: }
475:
476: inRequest.putPageValue(name, webTree);
477: return webTree;
478: }
479:
480: public void approveDraft(WebPageRequest inReq)
481: throws OpenEditException {
482: LinkTree tree = loadLinks(inReq);
483: if (tree.isDraft()) {
484: getWorkFlow().approve(tree.getPage().getPath(),
485: inReq.getUser());
486: }
487: }
488:
489: public WorkFlow getWorkFlow() {
490: return fieldWorkFlow;
491: }
492:
493: public void setWorkFlow(WorkFlow inWorkFlow) {
494: fieldWorkFlow = inWorkFlow;
495: }
496:
497: }
|