[jboss-cvs] jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/engine ...
Christian Bauer
christian at hibernate.org
Tue Dec 18 23:29:18 EST 2007
User: cbauer
Date: 07/12/18 23:29:18
Modified: examples/wiki/src/main/org/jboss/seam/wiki/core/engine
WikiLink.java DefaultWikiLinkResolver.java
NullWikiTextRenderer.java WikiLinkResolver.java
WikiTextRenderer.java WikiTextParser.java
Added: examples/wiki/src/main/org/jboss/seam/wiki/core/engine
MacroWikiTextRenderer.java
Log:
Major rewrite of the most of the application
Revision Changes Path
1.2 +11 -5 jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/engine/WikiLink.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: WikiLink.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/engine/WikiLink.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- WikiLink.java 22 Mar 2007 12:47:50 -0000 1.1
+++ WikiLink.java 19 Dec 2007 04:29:18 -0000 1.2
@@ -1,6 +1,6 @@
package org.jboss.seam.wiki.core.engine;
-import org.jboss.seam.wiki.core.model.Node;
+import org.jboss.seam.wiki.core.model.WikiFile;
/**
* Simple value holder for link resolution and rendering.
@@ -8,7 +8,9 @@
* @author Christian Bauer
*/
public class WikiLink {
- Node node;
+
+ int identifier;
+ WikiFile file;
boolean requiresUpdating = false;
String url;
String description;
@@ -19,8 +21,12 @@
this.broken = broken;
this.external = external;
}
- public Node getNode() { return node; }
- public void setNode(Node node) { this.node = node; }
+
+ public int getIdentifier() { return identifier; }
+ public void setIdentifier(int identifier) { this.identifier = identifier; }
+
+ public WikiFile getFile() { return file; }
+ public void setFile(WikiFile file) { this.file = file; }
public String getUrl() { return url; }
public void setUrl(String url) { this.url = url; }
@@ -35,6 +41,6 @@
public void setRequiresUpdating(boolean requiresUpdating) { this.requiresUpdating = requiresUpdating; }
public String toString() {
- return "Node:" + node + " Description: " + description + " URL: " + url;
+ return "File:" + file + " Description: " + description + " URL: " + url;
}
}
1.5 +36 -33 jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/engine/DefaultWikiLinkResolver.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: DefaultWikiLinkResolver.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/engine/DefaultWikiLinkResolver.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- DefaultWikiLinkResolver.java 24 Sep 2007 08:23:22 -0000 1.4
+++ DefaultWikiLinkResolver.java 19 Dec 2007 04:29:18 -0000 1.5
@@ -1,16 +1,18 @@
package org.jboss.seam.wiki.core.engine;
-import org.jboss.seam.annotations.*;
-import org.jboss.seam.wiki.core.model.Directory;
-import org.jboss.seam.wiki.core.dao.NodeDAO;
+import org.jboss.seam.annotations.AutoCreate;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Logger;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.log.Log;
+import org.jboss.seam.wiki.core.dao.WikiNodeDAO;
import org.jboss.seam.wiki.core.model.*;
import org.jboss.seam.wiki.util.WikiUtil;
-import org.jboss.seam.log.Log;
-
-import java.util.regex.Pattern;
-import java.util.regex.Matcher;
import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
/**
* A default implementation of <tt>WikiLinkResolver</tt>.
@@ -24,16 +26,16 @@
@Logger static Log log;
// Render these strings whenever [=>wiki://123] needs to be resolved but can't
- public static final String BROKENLINK_URL = "PageDoesNotExist";
+ public static final String BROKENLINK_URL = "FileNotFound";
public static final String BROKENLINK_DESCRIPTION = "?BROKEN LINK?";
@In
- private NodeDAO nodeDAO;
+ private WikiNodeDAO wikiNodeDAO;
@In
Map<String, LinkProtocol> linkProtocolMap;
- public String convertToWikiProtocol(Long currentAreaNumber, String wikiText) {
+ public String convertToWikiProtocol(Set<WikiFile> linkTargets, Long currentAreaNumber, String wikiText) {
if (wikiText == null) return null;
StringBuffer replacedWikiText = new StringBuffer(wikiText.length());
@@ -42,8 +44,11 @@
// Replace with [Link Text=>wiki://<node id>] or leave as is if not found
while (matcher.find()) {
String linkText = matcher.group(2);
- Node node = resolveCrossAreaLinkText(currentAreaNumber, linkText);
- if (node != null) matcher.appendReplacement(replacedWikiText, "[$1=>wiki://" + node.getId() + "]");
+ WikiFile file = resolveCrossAreaLinkText(currentAreaNumber, linkText);
+ if (file != null) {
+ matcher.appendReplacement(replacedWikiText, "[$1=>wiki://" + file.getId() + "]");
+ linkTargets.add(file);
+ }
}
matcher.appendTail(replacedWikiText);
return replacedWikiText.toString();
@@ -59,16 +64,16 @@
while (matcher.find()) {
// Find the node by PK
- Node node = nodeDAO.findNode(Long.valueOf(matcher.group(2)));
+ WikiFile file = wikiNodeDAO.findWikiFile(Long.valueOf(matcher.group(2)));
// Node is in current area, just use its name
- if (node != null && node.getAreaNumber().equals(currentAreaNumber)) {
- matcher.appendReplacement(replacedWikiText, "[$1=>" + node.getName() + "]");
+ if (file != null && file.getAreaNumber().equals(currentAreaNumber)) {
+ matcher.appendReplacement(replacedWikiText, "[$1=>" + file.getName() + "]");
// Node is in different area, prepend the area name
- } else if (node != null && !node.getAreaNumber().equals(currentAreaNumber)) {
- Directory area = nodeDAO.findArea(node.getAreaNumber());
- matcher.appendReplacement(replacedWikiText, "[$1=>" + area.getName() + "|" + node.getName() + "]");
+ } else if (file != null && !file.getAreaNumber().equals(currentAreaNumber)) {
+ WikiDirectory area = wikiNodeDAO.findArea(file.getAreaNumber());
+ matcher.appendReplacement(replacedWikiText, "[$1=>" + area.getName() + "|" + file.getName() + "]");
// Couldn't find it anymore, its a broken link
} else {
@@ -101,11 +106,11 @@
} else if (wikiProtocolMatcher.find()) {
// Find the node by PK
- Node node = nodeDAO.findNode(Long.valueOf(wikiProtocolMatcher.group(1)));
- if (node != null) {
+ WikiFile file = wikiNodeDAO.findWikiFile(Long.valueOf(wikiProtocolMatcher.group(1)));
+ if (file != null) {
wikiLink = new WikiLink(false, false);
- wikiLink.setNode(node);
- wikiLink.setDescription(node.getName());
+ wikiLink.setFile(file);
+ wikiLink.setDescription(file.getName());
log.debug("wiki link resolved to existing node: " + linkText);
} else {
// Can't do anything, [=>wiki://123] no longer exists
@@ -137,12 +142,12 @@
} else {
// Try a WikiWord search in the current or named area
- Node node = resolveCrossAreaLinkText(currentAreaNumber, linkText);
- if (node!=null) {
+ WikiFile doc = resolveCrossAreaLinkText(currentAreaNumber, linkText);
+ if (doc!=null) {
wikiLink = new WikiLink(false, false);
- wikiLink.setNode(node);
- wikiLink.setDescription(node.getName());
+ wikiLink.setFile(doc);
+ wikiLink.setDescription(doc.getName());
// Indicate that caller should update the wiki text that contains this link
wikiLink.setRequiresUpdating(true);
log.debug("resolved wiki word link, this needs updating to the real identifier: " + linkText);
@@ -168,20 +173,18 @@
links.put(linkText, wikiLink);
}
- private Node resolveCrossAreaLinkText(Long currentAreaNumber, String linkText) {
+ private WikiFile resolveCrossAreaLinkText(Long currentAreaNumber, String linkText) {
Matcher crossLinkMatcher = Pattern.compile(REGEX_WIKILINK_CROSSAREA).matcher(linkText);
if (crossLinkMatcher.find()) {
// Try to find the node in the referenced area
String areaName = crossLinkMatcher.group(1);
String nodeName = crossLinkMatcher.group(2);
- Node crossLinkArea = nodeDAO.findArea(WikiUtil.convertToWikiName(areaName));
- if ( crossLinkArea != null && (nodeName == null || nodeName.length() == 0) )
- return crossLinkArea; // Support [=>This is an Area Link|] syntax
- else if (crossLinkArea != null)
- return nodeDAO.findNodeInArea(crossLinkArea.getAreaNumber(), WikiUtil.convertToWikiName(nodeName));
+ WikiNode crossLinkArea = wikiNodeDAO.findArea(WikiUtil.convertToWikiName(areaName));
+ if (crossLinkArea != null)
+ return wikiNodeDAO.findWikiFileInArea(crossLinkArea.getAreaNumber(), WikiUtil.convertToWikiName(nodeName));
} else {
// Try the current area
- return nodeDAO.findNodeInArea(currentAreaNumber, WikiUtil.convertToWikiName(linkText));
+ return wikiNodeDAO.findWikiFileInArea(currentAreaNumber, WikiUtil.convertToWikiName(linkText));
}
return null;
}
1.2 +3 -0 jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/engine/NullWikiTextRenderer.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: NullWikiTextRenderer.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/engine/NullWikiTextRenderer.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- NullWikiTextRenderer.java 12 Nov 2007 11:14:29 -0000 1.1
+++ NullWikiTextRenderer.java 19 Dec 2007 04:29:18 -0000 1.2
@@ -1,5 +1,7 @@
package org.jboss.seam.wiki.core.engine;
+import org.jboss.seam.wiki.core.model.WikiMacro;
+
import java.util.List;
/**
@@ -16,6 +18,7 @@
public void setAttachmentLinks(List<WikiLink> attachmentLinks) {}
public void setExternalLinks(List<WikiLink> externalLinks) {}
public String renderMacro(String macroName) { return null; }
+ public void addMacro(WikiMacro macro) {}
public String renderParagraphOpenTag() { return "<p>\n"; }
public String renderPreformattedOpenTag() { return "<pre>\n"; }
public String renderBlockquoteOpenTag() { return "<blockquote>\n"; }
1.5 +5 -1 jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/engine/WikiLinkResolver.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: WikiLinkResolver.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/engine/WikiLinkResolver.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- WikiLinkResolver.java 17 Aug 2007 13:00:32 -0000 1.4
+++ WikiLinkResolver.java 19 Dec 2007 04:29:18 -0000 1.5
@@ -6,7 +6,10 @@
*/
package org.jboss.seam.wiki.core.engine;
+import org.jboss.seam.wiki.core.model.WikiFile;
+
import java.util.Map;
+import java.util.Set;
import java.util.regex.Pattern;
/**
@@ -94,11 +97,12 @@
* }
* </pre>
*
+ * @param linkTargets This collection will be filled with <tt>WikiFile</tt> instances which are the link targets in the wiki text
* @param currentAreaNumber The currennt area useable as the namespace for scoped resolving
* @param wikiText Text with wiki markup containing [=>Target Name] links
* @return The <tt>wikiText</tt> with all <tt>[=>Target Name]<tt> links replaced with <tt>[=>wiki://id]</tt>
*/
- public String convertToWikiProtocol(Long currentAreaNumber, String wikiText);
+ public String convertToWikiProtocol(Set<WikiFile> linkTargets, Long currentAreaNumber, String wikiText);
/**
* Replace stored text links such as <tt>[Link description=>wiki://id]</tt> with clear text target names, so
1.5 +3 -0 jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/engine/WikiTextRenderer.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: WikiTextRenderer.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/engine/WikiTextRenderer.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- WikiTextRenderer.java 12 Nov 2007 11:14:29 -0000 1.4
+++ WikiTextRenderer.java 19 Dec 2007 04:29:18 -0000 1.5
@@ -1,5 +1,7 @@
package org.jboss.seam.wiki.core.engine;
+import org.jboss.seam.wiki.core.model.WikiMacro;
+
import java.util.List;
/**
@@ -14,6 +16,7 @@
public String renderThumbnailImageInlineLink(WikiLink inlineLink);
public String renderFileAttachmentLink(int attachmentNumber, WikiLink attachmentLink);
public String renderMacro(String macroName);
+ public void addMacro(WikiMacro macro);
public String renderParagraphOpenTag();
public String renderPreformattedOpenTag();
1.11 +42 -67 jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/engine/WikiTextParser.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: WikiTextParser.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/engine/WikiTextParser.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- WikiTextParser.java 12 Nov 2007 11:14:29 -0000 1.10
+++ WikiTextParser.java 19 Dec 2007 04:29:18 -0000 1.11
@@ -6,22 +6,18 @@
*/
package org.jboss.seam.wiki.core.engine;
-import org.jboss.seam.text.SeamTextParser;
-import org.jboss.seam.text.SeamTextLexer;
-import org.jboss.seam.wiki.core.model.File;
-import org.jboss.seam.wiki.core.model.Document;
-import org.jboss.seam.wiki.core.model.Node;
-import org.jboss.seam.wiki.util.WikiUtil;
import antlr.ANTLRException;
+import org.jboss.seam.text.SeamTextLexer;
+import org.jboss.seam.text.SeamTextParser;
+import org.jboss.seam.wiki.core.model.*;
-import java.util.*;
import java.io.StringReader;
+import java.util.*;
/**
* Parses SeamText markup and also resolves link and macro tags as wiki links and wiki plugins.
* <p>
- * Don't forget to set the resolver and renderer base with <tt>setCurrentDirectory()</tt> and
- * <tt>setCurrentDocument</tt>.
+ * Don't forget to set the resolver and renderer base with <tt>setCurrentAreaNumber()</tt>!
* </p><p>
* Picks the <tt>WikiLinkResolver</tt> present in the contextual variable <tt>wikiLinkResolver</tt>. Calls
* out to a <tt>WikiTextRender</tt> for the actual in-document rendering of wiki links and wiki plugins. Might update
@@ -35,10 +31,11 @@
*/
public class WikiTextParser extends SeamTextParser {
+ private int linkCounter = 0;
+
private WikiTextRenderer renderer;
private WikiLinkResolver resolver;
- private Node currentDirectory;
- private Document currentDocument;
+ private Long currentAreaNumber;
private Map<String, WikiLink> resolvedLinks = new HashMap<String, WikiLink>();
private List<WikiLink> attachments = new ArrayList<WikiLink>();
@@ -79,53 +76,23 @@
* The render/link resolving base
* @return the called instance
*/
- public WikiTextParser setCurrentDirectory(Node currentDirectory) {
- this.currentDirectory = currentDirectory;
- return this;
- }
- /*
- * The render/link resolving base
- * @return the called instance
- */
- public WikiTextParser setCurrentDocument(Document currentDocument) {
- this.currentDocument = currentDocument;
- return this;
+ public void setCurrentAreaNumber(Long currentAreaNumber) {
+ this.currentAreaNumber = currentAreaNumber;
}
/**
* Start parsing the wiki text and resolve wiki links and wiki plugins.
* <p>
- * If <tt>updateResolvedLinks</tt> is enabled, the <t>currentDocument</tt>'s content will
- * be udpated after parsing the wiki text. This only occurs if we hit a link during link
- * resolution that needs to be updated. You should flush this modification to the data store.
- *
- * @param updateResolvedLinks Set updated content on <tt>currentDocument</tt>
* @throws ANTLRException if lexer or parser errors occur, see
*/
- public void parse(boolean updateResolvedLinks) throws ANTLRException {
- if (resolver == null) throw new IllegalStateException("WikiTextParser requires setResolver() call");
- if (renderer == null) throw new IllegalStateException("WikiTextParser requires setRenderer() call");
- if (currentDocument == null) throw new IllegalStateException("WikiTextParser requires setCurrentDocument() call");
- if (currentDirectory == null) throw new IllegalStateException("WikiTextParser requires setCurrentDirectory() call");
+ public void parse() throws ANTLRException {
+ if (resolver == null) throw new IllegalStateException("WikiTextParser requires not null setResolver()");
+ if (renderer == null) throw new IllegalStateException("WikiTextParser requires not null setRenderer()");
+ if (currentAreaNumber == null) throw new IllegalStateException("WikiTextParser requires not null setCurrentAreaNumber()");
startRule();
- if (updateResolvedLinks) {
- for (Map.Entry<String, WikiLink> entry: resolvedLinks.entrySet()) {
- if(entry.getValue().isRequiresUpdating()) {
- // One of the links we parsed and resolved requires updating of the current document, run
- // the protocol converter - which is usally only called when storing a document.
- currentDocument.setContent(
- resolver.convertToWikiProtocol(currentDirectory.getAreaNumber(), currentDocument.getContent())
- );
- // Yes, this might happen during rendering, you should lush() and UPDATE the document!
-
- break; // One is enough
- }
- }
- }
-
renderer.setAttachmentLinks(attachments);
renderer.setExternalLinks(externalLinks);
}
@@ -139,25 +106,27 @@
return renderer.renderInlineLink(unresolvedLink);
}
- resolver.resolveLinkText(currentDirectory.getAreaNumber(), resolvedLinks, linkText);
+ resolver.resolveLinkText(currentAreaNumber, resolvedLinks, linkText);
WikiLink link = resolvedLinks.get((linkText));
if (link == null) return "";
+ // Set an internal identifier, used for attachments and external links we later push into a hashmap into the contexts
+ link.setIdentifier(linkCounter++);
+
// Override the description of the WikiLink with description found in tag
String finalDescriptionText =
(descriptionText!=null && descriptionText.length() > 0 ? descriptionText : link.getDescription());
link.setDescription(finalDescriptionText);
- // Link to file (inline or attached)
- if (WikiUtil.isFile(link.getNode())) {
- File file = (File)link.getNode();
-
- if (file.getImageMetaInfo() == null || 'A' == file.getImageMetaInfo().getThumbnail()) {
- // It's an attachment
- if (!attachments.contains(link)) attachments.add(link);
+ // Link to upload (inline or attached)
+ if (link.getFile() != null && link.getFile().isInstance(WikiUpload.class)) {
+ WikiUpload upload = (WikiUpload)link.getFile();
+ if (upload.isAttachedToDocuments()) {
+ if (!attachments.contains(link)) {
+ attachments.add(link);
+ }
return renderer.renderFileAttachmentLink((attachments.indexOf(link)+1), link);
} else {
- // It's an embedded thumbnail
return renderer.renderThumbnailImageInlineLink(link);
}
}
@@ -172,17 +141,6 @@
return renderer.renderInlineLink(link);
}
- protected String macroInclude(String macroName) {
- // Filter out any dangerous characters
- String filteredName = macroName.replaceAll("[^\\p{Alnum}]+", "");
- if ( (macroNames.contains(filteredName) && renderDuplicateMacros) || !macroNames.contains(filteredName)) {
- macroNames.add(filteredName);
- return renderer.renderMacro(filteredName);
- } else {
- return "[Can't use the same macro twice!]";
- }
- }
-
protected String paragraphOpenTag() {
return renderer.renderParagraphOpenTag();
}
@@ -226,4 +184,21 @@
protected String unorderedListItemOpenTag() {
return renderer.renderUnorderedListItemOpenTag();
}
+
+ protected String macroInclude(SeamTextMacro macro) {
+ // Filter out any dangerous characters
+ String filteredName = macro.name.replaceAll("[^\\p{Alnum}]+", "");
+ if ( (macroNames.contains(filteredName) && renderDuplicateMacros) || !macroNames.contains(filteredName)) {
+ macroNames.add(filteredName);
+
+ WikiMacro wikiMacro = new WikiMacro(macro.name);
+ wikiMacro.setParams(macro.params);
+ renderer.addMacro(wikiMacro);
+
+ return renderer.renderMacro(filteredName);
+ } else {
+ return "[Can't use the same macro twice!]";
+ }
+ }
+
}
1.1 date: 2007/12/19 04:29:18; author: cbauer; state: Exp;jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/engine/MacroWikiTextRenderer.java
Index: MacroWikiTextRenderer.java
===================================================================
package org.jboss.seam.wiki.core.engine;
import org.jboss.seam.wiki.core.model.WikiMacro;
import org.jboss.seam.Component;
import java.util.Set;
import java.util.LinkedHashSet;
import antlr.RecognitionException;
import antlr.ANTLRException;
public class MacroWikiTextRenderer extends NullWikiTextRenderer {
private Set<WikiMacro> macros = new LinkedHashSet<WikiMacro>();
private StringBuilder macrosString = new StringBuilder();
public void addMacro(WikiMacro macro) {
macros.add(macro);
macrosString.append(macro.getName()).append(" ");
}
public Set<WikiMacro> getMacros() {
return macros;
}
public String getMacrosString() {
return macrosString.toString();
}
public static MacroWikiTextRenderer renderMacros(Long areaNumber, String wikiText) {
WikiTextParser parser = new WikiTextParser(wikiText, false, false);
parser.setCurrentAreaNumber(areaNumber);
parser.setResolver((WikiLinkResolver) Component.getInstance("wikiLinkResolver"));
MacroWikiTextRenderer renderer = new MacroWikiTextRenderer();
try {
parser.setRenderer(renderer).parse();
} catch (RecognitionException rex) {
// Swallowing, we don't really care if there was a parse error
} catch (ANTLRException ex) {
// All other errors are fatal;
throw new RuntimeException(ex);
}
return renderer;
}
}
More information about the jboss-cvs-commits
mailing list