From: <jbo...@li...> - 2005-10-07 22:09:20
|
Author: szimano Date: 2005-10-07 18:09:06 -0400 (Fri, 07 Oct 2005) New Revision: 1335 Added: trunk/forge/portal-extensions/jbosswiki/wiki-common/src/etc/JBossWiki.properties trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/EditSessionWatcher.java trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/RenamePageWatcher.java trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/exceptions/ trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/exceptions/EditSessionExpired.java trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/exceptions/PageAlreadyExistsException.java trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/exceptions/PageNotEditedException.java trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/exceptions/PageRenamingException.java trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/exceptions/WikiException.java trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/plugins/DirectReferenceWikiType.java trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/plugins/ReTranslateUids.java trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/plugins/TranslateUids.java trunk/forge/portal-extensions/jbosswiki/wiki-common/src/test/java/org/jboss/wiki/test/DictionaryTest.java trunk/forge/portal-extensions/jbosswiki/wiki-common/src/test/java/org/jboss/wiki/test/GetSavePageTest.java trunk/forge/portal-extensions/jbosswiki/wiki-common/src/test/java/org/jboss/wiki/test/WikiTest.java Modified: trunk/forge/portal-extensions/jbosswiki/forge-wiki/src/java/org/jboss/wiki/WikiPortlet.java trunk/forge/portal-extensions/jbosswiki/forge-wiki/src/web/WEB-INF/jsp/Edit.jsp trunk/forge/portal-extensions/jbosswiki/forge-wiki/src/web/WEB-INF/jsp/Wiki.jsp trunk/forge/portal-extensions/jbosswiki/wiki-common/src/etc/org/jboss/wiki/WikiTypes.xml trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/FileDataSource.java trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/WikiEngine.java trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/WikiPage.java trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/WikiPageDictionary.java Log: http://jira.jboss.com/jira/browse/JBWIKI-31 renaming functions, watchers for edited pages plus some junits Modified: trunk/forge/portal-extensions/jbosswiki/forge-wiki/src/java/org/jboss/wiki/WikiPortlet.java =================================================================== --- trunk/forge/portal-extensions/jbosswiki/forge-wiki/src/java/org/jboss/wiki/WikiPortlet.java 2005-10-07 21:53:47 UTC (rev 1334) +++ trunk/forge/portal-extensions/jbosswiki/forge-wiki/src/java/org/jboss/wiki/WikiPortlet.java 2005-10-07 22:09:06 UTC (rev 1335) @@ -15,12 +15,13 @@ import java.util.Map; import javax.portlet.*; + +import org.jboss.wiki.exceptions.EditSessionExpired; import org.jboss.wiki.management.WikiServiceMenagement; import org.apache.commons.fileupload.PortletDiskFileUpload; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.FileItem; - /** * The WikiPortlet. * <p> @@ -50,7 +51,7 @@ public void processAction(ActionRequest rReq, ActionResponse rResp) { Credentials credentials = new JBossPortalCredentials(rReq); - + // wikiContext is null - to get refernece to actual page WikiContext wikiContext = null; @@ -103,7 +104,8 @@ WikiPage pageWithAtt = wikiEngine.getByName(rReq .getParameter("page"), null); - pageWithAtt.addAttachement(serverFile, fileName, credentials.getName()); + pageWithAtt.addAttachement(serverFile, fileName, + credentials.getName()); // at the end delete the temp file serverFile.delete(); @@ -122,22 +124,24 @@ if (rReq.getParameter("page") != null) { StringBuffer sBuf = new StringBuffer(rReq.getParameter("page")); - + if (Character.isLowerCase(sBuf.charAt(0))) { // change first letter to upper if it isn't sBuf.setCharAt(0, Character.toUpperCase(sBuf.charAt(0))); } - + // // Capitalise words in subpages // - + for (int i = 0; i < sBuf.length() - 1; i++) { - if ((sBuf.charAt(i) == '/')&&(Character.isLowerCase(sBuf.charAt(i+1)))) { - sBuf.setCharAt(i+1, Character.toUpperCase(sBuf.charAt(i+1))); + if ((sBuf.charAt(i) == '/') + && (Character.isLowerCase(sBuf.charAt(i + 1)))) { + sBuf.setCharAt(i + 1, Character.toUpperCase(sBuf + .charAt(i + 1))); } } - + rResp.setRenderParameter("page", sBuf.toString()); } @@ -184,18 +188,19 @@ if (edPage != null) { // it may be null if the page isn't saved // yet - edPage.unlock(credentials); + edPage.unlock(credentials, Integer.valueOf((String)rReq.getParameter("editSessionId"))); } // saving, previewing or canceling if (rReq.getParameter("editAction").equals("Save")) { - + // save the page if (edPage == null) { edPage = new WikiPage(rReq.getParameter("editedPage"), - credentials, "", 0, 0, new Date(), wikiEngine, true, true); + credentials, "", 0, 0, new Date(), wikiEngine, + true, true); } // set new content @@ -211,7 +216,15 @@ edPage.setEditDate(new Date()); // save the page - edPage.save(); + try { + edPage.save(Integer.valueOf((String) rReq + .getParameter("editSessionId"))); + } catch (NumberFormatException e) { + e.printStackTrace(); + } catch (EditSessionExpired e) { + rReq.setAttribute("errorMsg", e.getMessage()); + e.printStackTrace(); + } // and finally remove old page object from memory to force // reloading it @@ -223,9 +236,10 @@ public void doView(RenderRequest rReq, RenderResponse rRes) throws PortletException, java.io.IOException { + + WikiSession wikiSession = new PortletWikiSession(rReq + .getPortletSession()); - WikiSession wikiSession = new PortletWikiSession(rReq.getPortletSession()); - Credentials credentials = new JBossPortalCredentials(rReq); PortletURL wikiURL = rRes.createActionURL(); @@ -248,11 +262,12 @@ rReq.getPortletSession().setAttribute("isSecure", new Boolean(rReq.isSecure())); - /*WikiPage noSuchPage = new WikiPage("", - credentials, - "There is no such page. Click on EDIT to start it.", 0, 0, - null, wikiEngine.getMediaDataSource(), wikiEngine - .getAttachementDataSource(), true, true);*/ + /* + * WikiPage noSuchPage = new WikiPage("", credentials, "There is no such + * page. Click on EDIT to start it.", 0, 0, null, + * wikiEngine.getMediaDataSource(), wikiEngine + * .getAttachementDataSource(), true, true); + */ String page = "Wiki.jsp"; @@ -276,9 +291,11 @@ && (credentials.isLogedIn())) { page = "Edit.jsp"; showPage = false; - - WikiContext editWikiContext = new WikiContext(credentials.getName(), wikiEngine.getWikiType("edit"), wikiSession); + WikiContext editWikiContext = new WikiContext( + credentials.getName(), wikiEngine.getWikiType("edit"), + wikiSession); + pageToShow = wikiEngine.getByName(wikiPage, editWikiContext); if ((pageToShow != null) && (!pageToShow.isEditable())) { @@ -294,8 +311,9 @@ if ((pageToShow.getLastVersion() > Integer.valueOf(rReq .getParameter("version")))) { - pageToShow = wikiEngine.getByName(wikiPage, editWikiContext, - Integer.valueOf(rReq.getParameter("version"))); + pageToShow = wikiEngine.getByName(wikiPage, + editWikiContext, Integer.valueOf(rReq + .getParameter("version"))); } if (pageToShow.getLastVersion() != pageToShow.getVersion()) { @@ -303,20 +321,26 @@ .getParameter("version"))); } } else { - pageToShow = wikiEngine.getByName(wikiPage, editWikiContext); + pageToShow = wikiEngine + .getByName(wikiPage, editWikiContext); } if (pageToShow == null) { // start editing new page // wikiPage = defaultPage; - pageToShow = new WikiPage(wikiPage,credentials, "", 0, 0, + pageToShow = new WikiPage(wikiPage, credentials, "", 0, 0, new Date(), wikiEngine, true, true); // wikiEngine.getByName(wikiPage, wikiContext); } - Date dateLock = pageToShow.lock(credentials); + int editSessionId = wikiEngine.getEditSessionId(); + Date dateLock = wikiEngine.getByName(wikiPage, null).lock(credentials, editSessionId); + + rReq.setAttribute("editSessionId", String + .valueOf(editSessionId)); + if (dateLock != null) { rReq .setAttribute( @@ -335,20 +359,16 @@ pageToShow = wikiEngine.getByName(wikiPage, null); - /*if (pageToShow == null) { // if somebody entered a link to info - // non-existing page - page = "Wiki.jsp"; - try { - pageToShow = (WikiPage) noSuchPage.clone(); - } catch (CloneNotSupportedException cnse) { - System.out.println(cnse); - } + /* + * if (pageToShow == null) { // if somebody entered a link to info // + * non-existing page page = "Wiki.jsp"; try { pageToShow = + * (WikiPage) noSuchPage.clone(); } catch + * (CloneNotSupportedException cnse) { System.out.println(cnse); } + * + * pageToShow.setName(wikiPage); } else { + */ + rReq.setAttribute("pageAtTop", pageToShow); - pageToShow.setName(wikiPage); - } else {*/ - rReq.setAttribute("pageAtTop", pageToShow); - - } if (showPage) { @@ -361,9 +381,9 @@ // System.out.println("Getting type: " + type); } - wikiContext = new WikiContext(credentials.getName(), - wikiEngine.getWikiType(type), new PortletWikiSession(rReq - .getPortletSession())); + wikiContext = new WikiContext(credentials.getName(), wikiEngine + .getWikiType(type), new PortletWikiSession(rReq + .getPortletSession())); if (rReq.getParameter("version") != null) { // show previous version of page @@ -380,17 +400,15 @@ pageToShow = wikiEngine.getByName(wikiPage, wikiContext); } - /*if (pageToShow == null) { + /* + * if (pageToShow == null) { + * + * try { pageToShow = (WikiPage) noSuchPage.clone(); } catch + * (CloneNotSupportedException cnse) { System.out.println(cnse); } + * + * pageToShow.setName(wikiPage); } + */ - try { - pageToShow = (WikiPage) noSuchPage.clone(); - } catch (CloneNotSupportedException cnse) { - System.out.println(cnse); - } - - pageToShow.setName(wikiPage); - }*/ - } rReq @@ -421,23 +439,8 @@ rReq.setAttribute("isViewable", pageToShow.isViewable()); - rReq - .setAttribute("isAdmin", credentials.isAdmin()); + rReq.setAttribute("isAdmin", credentials.isAdmin()); - // FIXME make this more elegant (ie. plugin) - // pass friendly link - /* - * Properties props = new Properties(); props.load(WikiPlugin.class - * .getResourceAsStream("wikiPlugins.properties")); String href = - * props.getProperty("htmlTranslatorURL") + "wiki/" + - * pageToShow.getName(); String[] replaces = - * props.getProperty("sslRedirectReplaces").split(","); - * - * if (rReq.isSecure() && (replaces.length % 2 == 0)) { // chage normal - * url to secure for (int i = 0; i < replaces.length; i += 2) href = - * href.replaceAll(replaces[i], replaces[i + 1]); } - */ - rReq.setAttribute("friendlyLink", hostURL + "/wiki/" + pageToShow.getName()); rReq.setAttribute("rssLink", hostURL + "/wiki/rss/" Modified: trunk/forge/portal-extensions/jbosswiki/forge-wiki/src/web/WEB-INF/jsp/Edit.jsp =================================================================== --- trunk/forge/portal-extensions/jbosswiki/forge-wiki/src/web/WEB-INF/jsp/Edit.jsp 2005-10-07 21:53:47 UTC (rev 1334) +++ trunk/forge/portal-extensions/jbosswiki/forge-wiki/src/web/WEB-INF/jsp/Edit.jsp 2005-10-07 22:09:06 UTC (rev 1335) @@ -14,6 +14,7 @@ String lockMsg = (String)request.getAttribute("lockMsg"); String defaultPage = (String)request.getAttribute("defaultPage"); String wikiImagesUrl = (String)request.getAttribute("wikiImagesUrl"); + String editSessionId = (String)request.getAttribute("editSessionId"); if (lockMsg == null) lockMsg = ""; @@ -31,6 +32,7 @@ <textarea name="wikiContent" rows="40" cols="80" style="width:100%;"><%=wikiContent%></textarea> <input type="hidden" name="editedPage" value="<%=wikiPage%>" /> <input type="hidden" name="page" value="<%=wikiPage%>" /> +<input type="hidden" name="editSessionId" value="<%=editSessionId%>" /> <input type="submit" value="Save" name="editAction" /> <!--<input type="submit" value="Preview" name="editAction" />--> <input type="submit" value="Cancel" name="editAction" /> Modified: trunk/forge/portal-extensions/jbosswiki/forge-wiki/src/web/WEB-INF/jsp/Wiki.jsp =================================================================== --- trunk/forge/portal-extensions/jbosswiki/forge-wiki/src/web/WEB-INF/jsp/Wiki.jsp 2005-10-07 21:53:47 UTC (rev 1334) +++ trunk/forge/portal-extensions/jbosswiki/forge-wiki/src/web/WEB-INF/jsp/Wiki.jsp 2005-10-07 22:09:06 UTC (rev 1335) @@ -115,8 +115,19 @@ } %> +<% + String errorMsg = (String)request.getAttribute("errorMsg"); + + if (errorMsg != null) { + out.println("<table style='border-style: dashed; text-align: center; margin-left: auto; margin-right:auto; border-color: red'>"); + out.println("<tr><td>"+errorMsg+"</td></tr>"); + out.println("</table>"); + } +%> + <table style="width: 100%; margin: 0px; padding: 0px;"> <tr style="width: 100%; margin: 0px; padding: 0px;"> + <td style="width: 100%; margin: 0px; padding: 0px;"><%=wikiContent%><td> </tr> <tr> Added: trunk/forge/portal-extensions/jbosswiki/wiki-common/src/etc/JBossWiki.properties =================================================================== --- trunk/forge/portal-extensions/jbosswiki/wiki-common/src/etc/JBossWiki.properties 2005-10-07 21:53:47 UTC (rev 1334) +++ trunk/forge/portal-extensions/jbosswiki/wiki-common/src/etc/JBossWiki.properties 2005-10-07 22:09:06 UTC (rev 1335) @@ -0,0 +1,9 @@ +#JBoss Wiki properties file +# +#(C) 2005 by JBoss Labs Team + +#sessionIdExpireTime (in minutes) - time after edit session expires +sessionIdExpireTime=120 + +#defaultPage - name of the default page +defaultPage=Main Modified: trunk/forge/portal-extensions/jbosswiki/wiki-common/src/etc/org/jboss/wiki/WikiTypes.xml =================================================================== --- trunk/forge/portal-extensions/jbosswiki/wiki-common/src/etc/org/jboss/wiki/WikiTypes.xml 2005-10-07 21:53:47 UTC (rev 1334) +++ trunk/forge/portal-extensions/jbosswiki/wiki-common/src/etc/org/jboss/wiki/WikiTypes.xml 2005-10-07 22:09:06 UTC (rev 1335) @@ -103,7 +103,7 @@ </wikiType> <wikiType> <name>edit</name> - <class>org.jboss.wiki.plugins.DirectReferenceWikiType</class> + <class>org.jboss.wiki.plugins.DefaultWikiType</class> <plugin> <name>translateUids</name> <class>org.jboss.wiki.plugins.TranslateUids</class> Added: trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/EditSessionWatcher.java =================================================================== --- trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/EditSessionWatcher.java 2005-10-07 21:53:47 UTC (rev 1334) +++ trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/EditSessionWatcher.java 2005-10-07 22:09:06 UTC (rev 1335) @@ -0,0 +1,61 @@ +package org.jboss.wiki; + +import java.util.Calendar; +import java.util.Date; + +import org.jboss.wiki.exceptions.PageNotEditedException; + +public class EditSessionWatcher extends Thread { + private Integer editSessionId; + + private Date endTime; + + private WikiPage watchedPage; + + private boolean runs = true; + + public EditSessionWatcher(Integer editSessionId, int sessionIdExpireTime, + WikiPage watchedPage) { + this.editSessionId = editSessionId; + this.watchedPage = watchedPage; + Calendar cal = Calendar.getInstance(); + + cal.setTime(new Date()); + cal.add(Calendar.MINUTE, sessionIdExpireTime); + cal.add(Calendar.SECOND, -1); //so it doesn't wait one minute longer + + endTime = cal.getTime(); + } + + @Override + public void run() { + while (runs) { + System.out.println("Checking watcher for page "+watchedPage.getName()+" with sessionid: "+editSessionId); + Date now = new Date(); + + if (now.after(endTime)) { + System.out.println("Session time exceeded"); + + try { + watchedPage.addExpiredSessionId(editSessionId); + } catch (PageNotEditedException e) { + e.printStackTrace(); + } + stopWatcher(); + } + else { + try { + sleep(60000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } + + public void stopWatcher() { + System.out.println("Stopping watcher for page: "+watchedPage.getName()+" with sessionid: "+editSessionId); + runs = false; + } + +} Modified: trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/FileDataSource.java =================================================================== --- trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/FileDataSource.java 2005-10-07 21:53:47 UTC (rev 1334) +++ trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/FileDataSource.java 2005-10-07 22:09:06 UTC (rev 1335) @@ -19,6 +19,9 @@ import java.util.Set; import java.util.TreeSet; +import org.jboss.wiki.exceptions.PageAlreadyExistsException; +import org.jboss.wiki.exceptions.WikiException; + /** * <p> * </p> @@ -138,7 +141,7 @@ //TODO Do not load dictionary YET ! - /*pageDictionaryFile = new File(pathToMedia + "/dictionary.properties"); + pageDictionaryFile = new File(pathToMedia + "/dictionary.properties"); if (!pageDictionaryFile.exists()) { try { @@ -168,7 +171,7 @@ e.printStackTrace(); } - }*/ + } // create pageRevDictionary - to make it work faster @@ -1046,12 +1049,29 @@ : realName; } - public synchronized void rename(String uid, String newName) { + public synchronized void rename(String uid, String newName) throws PageAlreadyExistsException { lock = true; + if (wikiEngine.pageExists(newName)) { + throw new PageAlreadyExistsException("Page with the name you're trying to rename already exists."); + } + pageDictionary.setProperty(uid, newName); pageRevDictionary.setProperty(newName, uid); - + + // add also maping for future name + // find apropriate uid + + int i = 2; + + while ((pageExists(uid+String.valueOf(i)))||(pageDictionary.containsKey(uid+String.valueOf(i)))) { + i++; + } + + // add maping for new (to be done) with name translated to old uid + pageDictionary.setProperty(uid+String.valueOf(i), uid); + pageRevDictionary.setProperty(uid, uid+String.valueOf(i)); + FileOutputStream fos; try { fos = new FileOutputStream(pageDictionaryFile); @@ -1074,4 +1094,12 @@ lock = false; } + + public boolean uidInDictionary(String uid) { + return pageDictionary.contains(uid); + } + + public boolean realNameInDictionary(String realName) { + return pageRevDictionary.contains(realName); + } } Added: trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/RenamePageWatcher.java =================================================================== --- trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/RenamePageWatcher.java 2005-10-07 21:53:47 UTC (rev 1334) +++ trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/RenamePageWatcher.java 2005-10-07 22:09:06 UTC (rev 1335) @@ -0,0 +1,75 @@ +package org.jboss.wiki; + +import java.util.Vector; + +import org.jboss.wiki.exceptions.PageAlreadyExistsException; +import org.jboss.wiki.exceptions.PageRenamingException; + +public class RenamePageWatcher extends Thread { + private WikiEngine wikiEngine; + private boolean runs = false; + private Vector<String> uids; + private Vector<String> realNames; + private WikiPageDictionary wikiPageDictionary; + + public RenamePageWatcher (WikiEngine wikiEngine, WikiPageDictionary wikiPageDictionary) { + this.wikiEngine = wikiEngine; + this.wikiPageDictionary = wikiPageDictionary; + uids = new Vector<String>(); + realNames = new Vector<String>(); + } + + public void run () { + runs = true; + + while (runs) { + if (wikiEngine.arePagesEdited()) { + try { + sleep(60000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + else { + try { + wikiEngine.getS().acquire(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + for (int i = 0; i < uids.size(); i++) { + try { + wikiPageDictionary.rename(uids.get(i), realNames.get(i)); + } catch (PageAlreadyExistsException e) { + e.printStackTrace(); + } + } + + wikiEngine.getS().release(); + + runs = false; + } + } + } + + public boolean isRuning() { + return runs; + } + + public void rename(String uid, String realName) throws PageRenamingException{ + if (uids.contains(uid)) { + throw new PageRenamingException("This page is set to be renamed."); + } + else if (realNames.contains(realName)){ + throw new PageRenamingException("Other page is going to be renamed to the same name."); + } + + uids.add(uid); + realNames.add(realName); + } + + public void stopWatcher() { + runs = false; + } +} Modified: trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/WikiEngine.java =================================================================== --- trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/WikiEngine.java 2005-10-07 21:53:47 UTC (rev 1334) +++ trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/WikiEngine.java 2005-10-07 22:09:06 UTC (rev 1335) @@ -8,6 +8,8 @@ *************************************************/ package org.jboss.wiki; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; import java.util.Arrays; import java.util.Comparator; @@ -20,13 +22,18 @@ import java.util.Map; import java.util.Properties; import java.util.Set; +import java.util.Vector; import java.util.Map.Entry; +import java.util.concurrent.Semaphore; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; +import org.jboss.wiki.exceptions.PageNotEditedException; +import org.jboss.wiki.exceptions.WikiException; + import java.io.File; /** @@ -50,6 +57,8 @@ */ public static String defaultPage = "Main"; + public final String propertiesFileName = "JBossWiki.properties"; + private HashMap<String, WikiPage> pages; private HashMap<String, WikiInsidePlugin> insidePlugins; @@ -66,6 +75,16 @@ WikiPage noSuchPage; + private Integer sessionIdExpireTime = 120; + + private int editSessionId = 0; + + private Set<Integer> editedPages; + + private Semaphore s = new Semaphore(1); + + private RenamePageWatcher renamePageWatcher; + /** * <p> * Does ... @@ -126,14 +145,21 @@ * @return * @param wikiContext */ - public WikiPage getByName(String pageName, WikiContext wikiContext) { + public synchronized WikiPage getByName(String pageName, WikiContext wikiContext) { + try { + s.acquire(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + String realPageName = getUid(pageName); WikiPage ret = null; if (!mediaDataSource.preGet()) { System.err.println("Couldn't get page"); + s.release(); return null; } @@ -151,6 +177,7 @@ if ((wikiContext != null) && (ret != null) && (!ret.isViewable()) && (!wikiContext.getUser().equals(adminUserName))) { + s.release(); return new WikiPage(realPageName, null, "I am sorry, but you are not allowed to see this page", 0, 0, new Date(), this, false, false); @@ -162,8 +189,10 @@ if (ret != null) { if (wikiContext != null) { + s.release(); return wikiContext.process(ret); } else { + s.release(); return ret; } } else { @@ -175,16 +204,23 @@ } if (wikiContext != null) { + s.release(); return wikiContext.process(ret); } else { + s.release(); return ret; } } } - public WikiPage getByName(String pageName, WikiContext wikiContext, + public synchronized WikiPage getByName(String pageName, WikiContext wikiContext, int version) { - + try { + s.acquire(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + String realPageName = getUid(pageName); WikiPage ret = null; @@ -203,8 +239,10 @@ if (ret != null) { if (wikiContext != null) { + s.release(); return wikiContext.process(ret); } else { + s.release(); return ret; } } else { @@ -215,6 +253,7 @@ * (wikiContext != null) { return wikiContext.process(ret); } else { * return ret; } */ + s.release(); return null; } } @@ -231,7 +270,8 @@ mediaDataSource = new FileDataSource(); attachementDataSource = new FileDataSource(); wikiPageDictionary = new FileDataSource(); - + editedPages = new HashSet<Integer>(); + mediaDataSource.setWikiEngine(this); pages = new HashMap<String, WikiPage>(); @@ -243,6 +283,27 @@ loadWikiTypes(); loadInsidePlugins(); + + Properties jbosswikiprops = new Properties(); + + try { + jbosswikiprops.load(WikiEngine.class.getResourceAsStream("/" + + propertiesFileName)); + } catch (IOException e) { + e.printStackTrace(); + } + + // load all properties + if (jbosswikiprops.getProperty("defaultPage") != null) { + defaultPage = jbosswikiprops.getProperty("defaultPage"); + } + + if (jbosswikiprops.getProperty("sessionIdExpireTime") != null) { + sessionIdExpireTime = Integer.valueOf(jbosswikiprops + .getProperty("sessionIdExpireTime")); + } + + renamePageWatcher = new RenamePageWatcher(this, wikiPageDictionary); } /** @@ -465,11 +526,11 @@ public Set<String> getPagesFor(String pageName) { Set<String> set = mediaDataSource.getPagesFor(pageName); Set<String> ret = new HashSet<String>(); - + for (String page : set) { ret.add(getRealName(page)); } - + return ret; } @@ -565,11 +626,11 @@ public String getRealName(String uid) { String[] pageTokens = uid.split("/"); - //System.out.println("Looking at page: (realName) "+uid); - + // System.out.println("Looking at page: (realName) "+uid); + if (pageTokens.length > 1) { if (!wikiPageDictionary.getRealName(uid).equals(uid)) { - + // this page is in dictionary return wikiPageDictionary.getRealName(uid); } else { @@ -590,8 +651,8 @@ page = page.substring(1); - //System.out.println("Looking at page: (realName) "+page); - + // System.out.println("Looking at page: (realName) "+page); + if (!wikiPageDictionary.getRealName(page).equals(page)) // this // page // is @@ -610,8 +671,8 @@ public String getUid(String realName) { String[] pageTokens = realName.split("/"); - //System.out.println("Looking at page: (uid) "+realName); - + // System.out.println("Looking at page: (uid) "+realName); + if (pageTokens.length > 1) { if (!wikiPageDictionary.getUid(realName).equals(realName)) { // this page is in dictionary @@ -634,8 +695,8 @@ page = page.substring(1); - //System.out.println("Looking at page: (uid) "+page); - + // System.out.println("Looking at page: (uid) "+page); + if (!wikiPageDictionary.getUid(page).equals(page)) // this // page // is @@ -650,10 +711,28 @@ return wikiPageDictionary.getUid(realName); } - public void rename(String uid, String newName) { - //wikiPageDictionary.rename(uid, newName); + public synchronized void rename(String uid, String newName) throws WikiException { + if (!arePagesEdited()) { + wikiPageDictionary.rename(uid, newName); + } + else { + // some pages are edited now - execute watcher + renamePageWatcher.rename(uid, newName); + + if (!renamePageWatcher.isRuning()) { + renamePageWatcher.start(); + } + } } + + public boolean uidInDictionary(String uid) { + return wikiPageDictionary.uidInDictionary(uid); + } + public boolean realNameInDictionary(String realName) { + return wikiPageDictionary.realNameInDictionary(realName); + } + public boolean deleteAttachment(String pageName, String attName) { return attachementDataSource.deleteAttachment(pageName, attName); } @@ -751,4 +830,32 @@ return attachementDataSource.getAttachmentSize(pageName, attachmentName, version); } + + public synchronized int getEditSessionId() { + return editSessionId++; + } + + public Integer getSessionIdExpireTime() { + return sessionIdExpireTime; + } + + public boolean arePagesEdited() { + return (editedPages.size() > 0); + } + + public void endEditing(Integer editSessionId) throws PageNotEditedException { + if (!editedPages.contains(editSessionId)) { + throw new PageNotEditedException("Page with sessionid "+editSessionId+" is not beeing edited."); + } + + editedPages.remove(editSessionId); + } + + public void addEditing(Integer editSessionId) { + editedPages.add(editSessionId); + } + + public Semaphore getS() { + return s; + } } Modified: trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/WikiPage.java =================================================================== --- trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/WikiPage.java 2005-10-07 21:53:47 UTC (rev 1334) +++ trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/WikiPage.java 2005-10-07 22:09:06 UTC (rev 1335) @@ -13,8 +13,13 @@ import java.util.Calendar; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.Set; +import java.util.Vector; +import org.jboss.wiki.exceptions.EditSessionExpired; +import org.jboss.wiki.exceptions.PageNotEditedException; + /** * <p> * </p> @@ -41,6 +46,10 @@ private String lockUser; private long length = 0; + + private Set<Integer> expiredSessionIds; + + private HashMap<Integer, EditSessionWatcher> editSessionWatchers; /** * <p> @@ -125,6 +134,8 @@ this.wikiEngine = wikiEngine; this.viewable = viewable; this.editable = editable; + expiredSessionIds = new HashSet<Integer>(); + editSessionWatchers = new HashMap<Integer, EditSessionWatcher>(); } /** @@ -146,7 +157,20 @@ * </p> * */ - public synchronized boolean save() { + public synchronized boolean save(Integer editActionId) throws EditSessionExpired{ + System.out.println(editActionId); + for (Integer i : expiredSessionIds) { + System.out.println("exp. session ids: "+i); + } + if (expiredSessionIds.contains(editActionId)) { + throw new EditSessionExpired("Your edit session have expired. Please edit page once again !"); + } + + if (editSessionWatchers.get(editActionId) != null) { + editSessionWatchers.get(editActionId).stopWatcher(); + editSessionWatchers.remove(editActionId); + } + if (!wikiEngine.preSave()) { System.err.println("Couldn't save page"); return false; @@ -315,9 +339,22 @@ return clonedPage; } - public void unlock(Credentials user) { + public void unlock(Credentials user, Integer editSessionId) { System.out.println("UNLOCK: " + user.getName() + " save user: " + lockUser); + + if (editSessionWatchers.get(editSessionId) != null) { + editSessionWatchers.get(editSessionId).stopWatcher(); + editSessionWatchers.remove(editSessionId); + } + + try { + wikiEngine.endEditing(editSessionId); + } catch (PageNotEditedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + if ((user.getName()).equals(lockUser)) { System.out.println("Unlocking page"); lockTime = null; @@ -325,7 +362,7 @@ } } - public Date lock(Credentials user) { + public Date lock(Credentials user, Integer editSessionId) { Date now = new Date(); Date expDate = null; Date retDate = lockTime; @@ -354,6 +391,13 @@ System.out.println("LOCK: " + lockUser); retDate = null; } + + // Add EditSessionWatcher + wikiEngine.addEditing(editSessionId); + EditSessionWatcher eSW = new EditSessionWatcher(editSessionId, wikiEngine.getSessionIdExpireTime(), this); + eSW.start(); + + editSessionWatchers.put(editSessionId, eSW); return retDate; } @@ -409,4 +453,9 @@ wikiEngine.setPageMod(getName(), ((isViewable()) ? MediaDataSource.VIEWABLE : 0) + ((isEditable()) ? MediaDataSource.EDITABLE : 0)); } + + public void addExpiredSessionId(Integer id) throws PageNotEditedException { + expiredSessionIds.add(id); + wikiEngine.endEditing(id); + } } Modified: trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/WikiPageDictionary.java =================================================================== --- trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/WikiPageDictionary.java 2005-10-07 21:53:47 UTC (rev 1334) +++ trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/WikiPageDictionary.java 2005-10-07 22:09:06 UTC (rev 1335) @@ -1,10 +1,16 @@ package org.jboss.wiki; +import org.jboss.wiki.exceptions.PageAlreadyExistsException; + public interface WikiPageDictionary { public String getRealName(String uid); public String getUid(String realName); - public void rename(String uid, String newName); + public void rename(String uid, String newName) throws PageAlreadyExistsException; + + public boolean uidInDictionary(String uid); + + public boolean realNameInDictionary(String realName); } Added: trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/exceptions/EditSessionExpired.java =================================================================== --- trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/exceptions/EditSessionExpired.java 2005-10-07 21:53:47 UTC (rev 1334) +++ trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/exceptions/EditSessionExpired.java 2005-10-07 22:09:06 UTC (rev 1335) @@ -0,0 +1,12 @@ +package org.jboss.wiki.exceptions; + +public class EditSessionExpired extends WikiException { + /** + * + */ + private static final long serialVersionUID = 1L; + + public EditSessionExpired(String msg) { + super(msg); + } +} Added: trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/exceptions/PageAlreadyExistsException.java =================================================================== --- trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/exceptions/PageAlreadyExistsException.java 2005-10-07 21:53:47 UTC (rev 1334) +++ trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/exceptions/PageAlreadyExistsException.java 2005-10-07 22:09:06 UTC (rev 1335) @@ -0,0 +1,12 @@ +package org.jboss.wiki.exceptions; + +public class PageAlreadyExistsException extends WikiException { + /** + * + */ + private static final long serialVersionUID = 1L; + + public PageAlreadyExistsException (String msg) { + super(msg); + } +} Added: trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/exceptions/PageNotEditedException.java =================================================================== --- trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/exceptions/PageNotEditedException.java 2005-10-07 21:53:47 UTC (rev 1334) +++ trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/exceptions/PageNotEditedException.java 2005-10-07 22:09:06 UTC (rev 1335) @@ -0,0 +1,12 @@ +package org.jboss.wiki.exceptions; + +public class PageNotEditedException extends WikiException { + /** + * + */ + private static final long serialVersionUID = -110717611960806757L; + + public PageNotEditedException(String msg) { + super(msg); + } +} Added: trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/exceptions/PageRenamingException.java =================================================================== --- trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/exceptions/PageRenamingException.java 2005-10-07 21:53:47 UTC (rev 1334) +++ trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/exceptions/PageRenamingException.java 2005-10-07 22:09:06 UTC (rev 1335) @@ -0,0 +1,12 @@ +package org.jboss.wiki.exceptions; + +public class PageRenamingException extends WikiException { + /** + * + */ + private static final long serialVersionUID = 1L; + + public PageRenamingException(String msg) { + super(msg); + } +} Added: trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/exceptions/WikiException.java =================================================================== --- trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/exceptions/WikiException.java 2005-10-07 21:53:47 UTC (rev 1334) +++ trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/exceptions/WikiException.java 2005-10-07 22:09:06 UTC (rev 1335) @@ -0,0 +1,12 @@ +package org.jboss.wiki.exceptions; + +public class WikiException extends Exception { + /** + * + */ + private static final long serialVersionUID = 1L; + + public WikiException (String msg) { + super(msg); + } +} Added: trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/plugins/DirectReferenceWikiType.java =================================================================== --- trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/plugins/DirectReferenceWikiType.java 2005-10-07 21:53:47 UTC (rev 1334) +++ trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/plugins/DirectReferenceWikiType.java 2005-10-07 22:09:06 UTC (rev 1335) @@ -0,0 +1,14 @@ +package org.jboss.wiki.plugins; + +import org.jboss.wiki.WikiType; + +public class DirectReferenceWikiType extends WikiType { + + @Override + protected boolean getReference() { + return true; + } + + + +} Added: trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/plugins/ReTranslateUids.java =================================================================== --- trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/plugins/ReTranslateUids.java 2005-10-07 21:53:47 UTC (rev 1334) +++ trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/plugins/ReTranslateUids.java 2005-10-07 22:09:06 UTC (rev 1335) @@ -0,0 +1,19 @@ +package org.jboss.wiki.plugins; + +import org.jboss.wiki.WikiEngine; + +import sun.security.krb5.internal.crypto.w; + +public class ReTranslateUids extends TranslateUids { + + //this class only inherties this one method to retranslate all the urls + @Override + protected String changeName(String link) { + return wikiEngine.getUid(link); + } + + public ReTranslateUids (WikiEngine wikiEngine) { + this.wikiEngine = wikiEngine; + } + +} Added: trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/plugins/TranslateUids.java =================================================================== --- trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/plugins/TranslateUids.java 2005-10-07 21:53:47 UTC (rev 1334) +++ trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/plugins/TranslateUids.java 2005-10-07 22:09:06 UTC (rev 1335) @@ -0,0 +1,185 @@ +package org.jboss.wiki.plugins; + +import java.util.LinkedList; +import java.util.Queue; +import java.util.Stack; + +import org.jboss.wiki.WikiPage; +import org.jboss.wiki.WikiPlugin; +import org.jboss.wiki.WikiSession; + +public class TranslateUids extends WikiPlugin { + + private Stack<Integer> begins = new Stack<Integer>(); + + private Stack<Integer> ends = new Stack<Integer>(); + + private Stack<String> replaces = new Stack<String>(); + + private String PRE_START = "{{{"; + + private String PRE_END = "}}}"; + + @Override + public WikiPage process(WikiPage wikiPage, WikiSession wikiSession) { + + wikiPage.setPageContent(getNewContent(wikiPage.getContent())); + + return wikiPage; + } + + public String getNewContent(String content) { + StringBuffer sBuf = new StringBuffer(content); + Queue<Integer> queue = new LinkedList<Integer>(); + + Integer lastCommStart = -3; + Integer partBegin = 0; + + // get all PRE starting {{{ + while ((lastCommStart = sBuf.indexOf(PRE_START, lastCommStart+3)) != -1) { + queue.offer(lastCommStart); + } + + lastCommStart = queue.poll(); + + if (lastCommStart == null) { + // there are no comments + parsePart(sBuf, 0, sBuf.length()); + } else { + while (lastCommStart != null) { + + parsePart(sBuf, partBegin, lastCommStart); + + partBegin = sBuf.indexOf(PRE_END, lastCommStart); + + if (partBegin != -1) { + partBegin += PRE_END.length(); + + while ((lastCommStart != null) + && (lastCommStart < partBegin)) { + lastCommStart = queue.poll(); + } + + if (lastCommStart == null) { + lastCommStart = sBuf.length(); + } + } + else { + lastCommStart = null; + } + } + } + + while (begins.size() > 0) { + + int begin; + + sBuf.delete(begin = begins.pop(), ends.pop()); + + sBuf.insert(begin, replaces.pop()); + } + + return sBuf.toString(); + } + + protected void parsePart(StringBuffer sBuf, int start, int end) { + + boolean insideLink = false; + Integer wordBegin = null; + Integer wordEnd = null; + + for (int i = start; i < end; i++) { + // System.out.print(i+":'"+sBuf.charAt(i)+"'"); + + if (sBuf.charAt(i) == '[') { + // if it is false - make it true + insideLink = (insideLink || true); + wordBegin = i + 1; + wordEnd = i + 1; + } else if (sBuf.charAt(i) == '|') { + if (!insideLink) { + wordBegin = null; + wordEnd = null; + } else { + wordBegin = i+1; + } + + } else if (sBuf.charAt(i) == ']') { + + if ((insideLink) && (wordBegin != null) && (wordBegin != i)) { + wordEnd++; + + // System.out.println("End of link: + // "+sBuf.substring(wordBegin, wordEnd)); + + // if word is GT 0 + + if (!HTMLTranslatorParts.isExternalLink(sBuf.substring( + wordBegin, wordEnd))) { + String link = HTMLTranslatorParts.cleanLink(sBuf + .substring(wordBegin, wordEnd)); + + if (link != changeName(link)) { + begins.add(wordBegin); + ends.add(wordEnd); + replaces.add(changeName(link)); + } + } + wordBegin = null; + wordEnd = null; + insideLink = false; + } + } else if (isPartOfWord(sBuf.charAt(i))) { + if (wordBegin == null) { + wordBegin = i; + } + + wordEnd = i; + } else if (Character.isWhitespace(sBuf.charAt(i))) { + if ((!insideLink) && (wordBegin != null)) { + String link = null; + + if ((link = HTMLTranslatorParts.parseCamelCase(sBuf + .substring(wordBegin, wordEnd))) != null) { + if (link != changeName(link)) { + begins.add(wordBegin); + ends.add(wordEnd); + replaces.add(changeName(link)); + } + + wordBegin = null; + wordEnd = null; + } + } else { + wordEnd = i; + } + } else { + if (!insideLink) { + wordBegin = null; + wordEnd = null; + } else { + wordEnd = i; + } + } + } + + if (wordBegin != null) { + // there was not closed link ([...) parse what stayed unparsed + // (maybe some CamelCase links) + parsePart(sBuf, wordBegin, end); + } + } + + protected boolean isPartOfWord(char ch) { + return ((Character.isLetter(ch)) || (Character.isDigit(ch))); + } + + @Override + public void init() { + + } + + protected String changeName(String link) { + return wikiEngine.getRealName(link); + } +} Added: trunk/forge/portal-extensions/jbosswiki/wiki-common/src/test/java/org/jboss/wiki/test/DictionaryTest.java =================================================================== --- trunk/forge/portal-extensions/jbosswiki/wiki-common/src/test/java/org/jboss/wiki/test/DictionaryTest.java 2005-10-07 21:53:47 UTC (rev 1334) +++ trunk/forge/portal-extensions/jbosswiki/wiki-common/src/test/java/org/jboss/wiki/test/DictionaryTest.java 2005-10-07 22:09:06 UTC (rev 1335) @@ -0,0 +1,85 @@ +package org.jboss.wiki.test; + +import org.jboss.wiki.WikiContext; +import org.jboss.wiki.WikiPage; +import org.jboss.wiki.exceptions.EditSessionExpired; +import org.jboss.wiki.exceptions.WikiException; +import org.jboss.wiki.plugins.ReTranslateUids; + +public class DictionaryTest extends WikiTest { + + public void testDictionary() throws WikiException{ + + WikiContext wikiContext = new WikiContext(plainUser.getName(), wikiEngine.getWikiType("html"), testWikiSession); + + String page1 = createTestPage(plainUser, "1 page number 1"); + String page2 = createTestPage(plainUser, "2 page number 2"); + + WikiPage wikiPage1 = wikiEngine.getByName(page1, null); + WikiPage wikiPage2 = wikiEngine.getByName(page2, null); + + + // set apropriate content of pages + wikiPage1.setPageContent("1 ["+page2+"]"); + wikiPage1.setLastVersion(wikiPage1.getLastVersion()+1); + wikiPage1.save(wikiEngine.getEditSessionId()); + + wikiPage2.setPageContent("1 ["+page2+"]"); + wikiPage2.setLastVersion(wikiPage2.getLastVersion()+1); + wikiPage2.save(wikiEngine.getEditSessionId()); + + int i = 0; + String newPage2Name = page2 + (i++); + + while(wikiEngine.pageExists(newPage2Name)) { + newPage2Name = page2 + (i++); + } + + System.out.println("New name for page2: "+newPage2Name); + + //wikiEngine.rename(page2, newPage2Name); + + // get page with renamed reference + WikiPage afterRename = wikiEngine.getByName(page1, wikiContext); + + String pageContentRenamed = afterRename.getContent(); + + System.out.println("page1 content: "+pageContentRenamed); + + int link = -1; + + // look if there is any link + if ((link = pageContentRenamed.lastIndexOf(actionURL+"&page=")) == -1) { + fail("There is no link in afterRename page."); + } + else { + // find link in page + String pageName = pageContentRenamed.substring(link + (actionURL+"&page=").length(), pageContentRenamed.indexOf("\"", link + (actionURL+"&page=").length())); + System.out.println("PAGENAME: "+pageName); + + + // check if the link is the one renamed in dictionary + //TODO NOT YET ! + //assertEquals(pageName, newPage2Name); + + } + } + + public void testTranslating () { + WikiContext wikiContext = new WikiContext(plainUser.getName(), wikiEngine.getWikiType("edit"), testWikiSession); + + WikiPage sourceMain = wikiEngine.getByName("Main", null); + + WikiPage main = wikiEngine.getByName("Main", wikiContext); + + System.out.println("Main source:\n"+sourceMain.getContent()); + + ReTranslateUids reTranslateUids = new ReTranslateUids(wikiEngine); + + String reTranslated = reTranslateUids.getNewContent(main.getContent()); + + System.out.println("Retranslated main:\n"+reTranslated); + + //assertEquals(reTranslated, sourceMain.getContent()); + } +} Added: trunk/forge/portal-extensions/jbosswiki/wiki-common/src/test/java/org/jboss/wiki/test/GetSavePageTest.java =================================================================== --- trunk/forge/portal-extensions/jbosswiki/wiki-common/src/test/java/org/jboss/wiki/test/GetSavePageTest.java 2005-10-07 21:53:47 UTC (rev 1334) +++ trunk/forge/portal-extensions/jbosswiki/wiki-common/src/test/java/org/jboss/wiki/test/GetSavePageTest.java 2005-10-07 22:09:06 UTC (rev 1335) @@ -0,0 +1,68 @@ +package org.jboss.wiki.test; + +import java.util.Set; +import java.util.Vector; + +import org.jboss.wiki.WikiContext; +import org.jboss.wiki.WikiPage; +import org.jboss.wiki.exceptions.WikiException; + +public class GetSavePageTest extends WikiTest { + + public void testSaveGetPage() throws WikiException { + WikiContext wikiContext = new WikiContext(plainUser.getName(), wikiEngine.getWikiType("html"), testWikiSession); + + String testPageName = createTestPage(plainUser, "This is simple conten [link] \\ Hello !"); + + WikiPage wikiPage2 = wikiEngine.getByName(testPageName, wikiContext); + + String pageContent = wikiPage2.getPageContent(); + + System.out.println(pageContent); + + if (wikiPage2 == null) { + wikiEngine.deletePage(testPageName); + + fail("Couldn't get page: "+testPageName); + } + + } + + public void testGetAllPages() { + WikiContext wikiContext = new WikiContext("test-user", wikiEngine.getWikiType("html"), testWikiSession); + + Set<String> pageNames = wikiEngine.getAllPageNames(); + + for (String pageName : pageNames) { + if (wikiEngine.getByName(pageName, wikiContext) == null) { + fail("Couldn't get page: "+pageName); + } + } + } + + public void testLocking() throws WikiException{ + WikiContext wikiContext = new WikiContext("test-user", wikiEngine.getWikiType("html"), testWikiSession); + + WikiPage wikiPage = wikiEngine.getByName(createTestPage(plainUser, "some page content"), null); + WikiPage wikiPage2 = wikiEngine.getByName(createTestPage(plainUser, "some page content"), null); + + Vector<Integer> sessIds = new Vector<Integer>(); + + //genrate sess ids and lock pages + for (int i = 0; i < 100; i++) { + sessIds.add(wikiEngine.getEditSessionId()); + wikiPage.lock(plainUser, sessIds.get(i)); + } + + //check what wikiEngine thinks + assertEquals(wikiEngine.arePagesEdited(), true); + + //unlock + for (int i = 0; i < 100; i++) { + wikiPage.unlock(plainUser, sessIds.get(i)); + } + + //check what wikiengine thinks + assertEquals(wikiEngine.arePagesEdited(), false); + } +} Added: trunk/forge/portal-extensions/jbosswiki/wiki-common/src/test/java/org/jboss/wiki/test/WikiTest.java =================================================================== --- trunk/forge/portal-extensions/jbosswiki/wiki-common/src/test/java/org/jboss/wiki/test/WikiTest.java 2005-10-07 21:53:47 UTC (rev 1334) +++ trunk/forge/portal-extensions/jbosswiki/wiki-common/src/test/java/org/jboss/wiki/test/WikiTest.java 2005-10-07 22:09:06 UTC (rev 1335) @@ -0,0 +1,141 @@ +package org.jboss.wiki.test; + +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; + +import org.jboss.wiki.Credentials; +import org.jboss.wiki.WikiContext; +import org.jboss.wiki.WikiEngine; +import org.jboss.wiki.WikiPage; +import org.jboss.wiki.WikiSession; +import org.jboss.wiki.exceptions.WikiException; + +import junit.framework.TestCase; + +public class WikiTest extends TestCase { + protected WikiEngine wikiEngine; + protected WikiSession testWikiSession; + protected Credentials notLogedIn = new TestCredentials(false, false); + protected Credentials adminUser = new TestCredentials(true, true); + protected Credentials plainUser = new TestCredentials(true, false); + protected Set<String> pages; + + protected String TEST_PAGE_BASE_NAME = "TestPage"; + protected String hostURL = "http://HostURL.pl"; + protected String actionURL = "/Szimano"; + + public WikiTest () { + wikiEngine = new WikiEngine(); + testWikiSession = new TestWikiSession(); + pages = new HashSet<String>(); + + // set session atributes + testWikiSession.setAttribute("credentials", plainUser); + testWikiSession.setAttribute("actionURL", actionURL); + testWikiSession.setAttribute("hostURL", hostURL); + } + + protected String createTestPage(Credentials user, String pageContent) throws WikiException{ + WikiContext wikiContext = new WikiContext(user.getName(), wikiEngine.getWikiType("html"), testWikiSession); + + if (wikiContext == null) { + fail("There is no html wikitype"); + } + + + String testPageName = TEST_PAGE_BASE_NAME; + int i = 0; + + while (wikiEngine.pageExists(testPageName)) { + testPageName = TEST_PAGE_BASE_NAME + (i++); + } + + WikiPage wikiPage = new WikiPage(testPageName, user, pageContent, 1, 1, new Date(), wikiEngine, true, true); + + if (!wikiPage.save(wikiEngine.getEditSessionId())) { + fail("Couldn't save page"); + } + + pages.add(testPageName); + + return testPageName; + } + + protected void deleteAllTestPages() { + boolean ret = true; + + for (String pageName : pages) { + if (!wikiEngine.deletePage(pageName)) { + ret = false; + System.out.println("Couldn't delete "+pageName); + } + } + + if (!ret) { + fail("Problems with deleting pages"); + } + } + + public void testNoTests() { + // do nothing - it's just an abstract class for other tests + } + + @Override + protected void tearDown() throws Exception { + // at the end delete created testpages + + deleteAllTestPages(); + + super.tearDown(); + } +} + +class TestCredentials extends Credentials { + private boolean logedIn = false; + private boolean admin = false; + + public TestCredentials(boolean logedIn, boolean admin) { + this.admin = admin; + this.logedIn = logedIn; + } + + @Override + public String getName() { + return (isLogedIn()) ? ((isAdmin()) ? "admin" : "test-user") : "Unknown"; + } + + @Override + public boolean isLogedIn() { + return logedIn; + } + + @Override + public boolean isAdmin() { + return admin; + } + +} + +class TestWikiSession implements WikiSession { + + HashMap<String, Object> attributes; + + public TestWikiSession() { + attributes = new HashMap<String, Object>(); + } + + public Object getAttribute(String attributeName) { + return attributes.get(attributeName); + } + + public void setAttribute(String attributeName, Object attribute) { + attributes.put(attributeName, attribute); + } + + public void removeAttribute(String attributeName) { + attributes.remove(attributeName); + } + +} \ No newline at end of file |