Author: aadamchik
Date: Sun Sep 17 19:11:46 2006
New Revision: 447187
URL: http://svn.apache.org/viewvc?view=rev&rev=447187
Log:
porting the docs importer to 2.0 branch
Modified:
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-ant/ant/doc.xml
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocGenTask.java
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocGenerator.java
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocPage.java
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocPageRenderer.java
Modified:
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-ant/ant/doc.xml
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-ant/ant/doc.xml?view=diff&rev=447187&r1=447186&r2=447187
==============================================================================
--- incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-ant/ant/doc.xml
(original)
+++ incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-ant/ant/doc.xml
Sun Sep 17 19:11:46 2006
@@ -47,7 +47,8 @@
</delete>
<!-- Build HTML documentation from Confluence -->
- <docgen spaceKey="CAYDOC" docBase="${cayenne.other}/wiki-docs"
startPage="Documentation"
+ <docgen spaceKey="CAYDOC20"
docBase="${cayenne.other}/wiki-docs"
baseUrl="http://cwiki.apache.org/confluence/"
+ startPage="Documentation"
username="${cayenne.confluence.user}"
password="${cayenne.confluence.password}" />
</target>
Modified:
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocGenTask.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocGenTask.java?view=diff&rev=447187&r1=447186&r2=447187
==============================================================================
---
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocGenTask.java
(original)
+++
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocGenTask.java
Sun Sep 17 19:11:46 2006
@@ -30,6 +30,7 @@
*/
public class DocGenTask extends Task {
+ private String baseUrl;
private String spaceKey;
private String docBase;
private String startPage;
@@ -41,10 +42,19 @@
public void execute() {
log("Exporting space '" + spaceKey + "' to " + docBase);
-
+
try {
- new DocGenerator(spaceKey, docBase, startPage, username, password,
template)
- .generateDocs();
+ DocGenerator generator = new DocGenerator(
+ baseUrl,
+ spaceKey,
+ docBase,
+ startPage,
+ username,
+ password,
+ template);
+
+ log("Confluence base URL '" + generator.getBaseUrl() + "'");
+ generator.generateDocs();
}
catch (Exception e) {
throw new BuildException(e);
@@ -97,5 +107,17 @@
public void setUsername(String username) {
this.username = username;
+ }
+
+ public String getBaseUrl() {
+ return baseUrl;
+ }
+
+ /**
+ * Sets a root URL of a confluence instance. SOAP service URL is derived
from it
+ * internally.
+ */
+ public void setBaseUrl(String baseUrl) {
+ this.baseUrl = baseUrl;
}
}
Modified:
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocGenerator.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocGenerator.java?view=diff&rev=447187&r1=447186&r2=447187
==============================================================================
---
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocGenerator.java
(original)
+++
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocGenerator.java
Sun Sep 17 19:11:46 2006
@@ -39,6 +39,8 @@
public class DocGenerator {
private static final String DEFAULT_TEMPLATE = "doctemplates/default.vm";
+ private static final String ENDPOINT_SUFFIX =
"/rpc/soap-axis/confluenceservice-v1";
+ private String baseUrl;
private String spaceKey;
private String docBase;
private String startPage;
@@ -53,17 +55,41 @@
private DocPageRenderer parser;
- public DocGenerator(String spaceKey, String docBase, String startPage,
- String username, String password, String template) {
+ public DocGenerator(String baseUrl, String spaceKey, String docBase,
+ String startPage, String username, String password, String
template) {
+
+ ConfluenceSoapServiceProxy service = new ConfluenceSoapServiceProxy();
+
+ // derive service URL from base URL
+ if (baseUrl != null) {
+ if (baseUrl.endsWith("/")) {
+ baseUrl = baseUrl.substring(0, baseUrl.length() - 1);
+ }
+
+ String endpoint = baseUrl + ENDPOINT_SUFFIX;
+ service.setEndpoint(endpoint);
+ }
+ // service base URL from service default URL
+ else if (service.getEndpoint().endsWith(ENDPOINT_SUFFIX)) {
+ String endpoint = service.getEndpoint();
+ baseUrl = endpoint.substring(0, endpoint.length() -
ENDPOINT_SUFFIX.length());
+ }
+ else {
+ throw new IllegalArgumentException("Null base url and invalid
service URL");
+ }
+
+ this.baseUrl = baseUrl;
+ this.service = service;
this.spaceKey = spaceKey;
this.docBase = docBase;
this.startPage = startPage;
this.username = username;
this.password = password;
-
+
if (template == null) {
this.template = DEFAULT_TEMPLATE;
- } else {
+ }
+ else {
this.template = template;
}
}
@@ -72,6 +98,10 @@
login();
+ // only works for adminstrators
+ //String url = service.exportSite(token, true);
+
+ //URL foo = new URL(url);
createPath(docBase);
// Build a page hierarchy first..
@@ -90,7 +120,6 @@
for (int i = 0; i < children.length; i++) {
DocPage child = getPage(parent, children[i].getTitle());
-
parent.addChild(child);
iterateChildren(child);
@@ -106,7 +135,7 @@
FileWriter fw = new FileWriter(currentPath + "/index.html");
parser.render(page, fw);
fw.close();
-
+
writeAttachments(currentPath, page);
for (Iterator childIter = page.getChildren().iterator();
childIter.hasNext();) {
@@ -144,9 +173,8 @@
}
protected void login() throws Exception {
- service = new ConfluenceSoapServiceProxy();
token = service.login(username, password);
- parser = new DocPageRenderer(service, token, spaceKey, template);
+ parser = new DocPageRenderer(service, baseUrl, token, spaceKey,
template);
}
protected DocPage getPage(DocPage parentPage, String pageTitle) throws
Exception {
@@ -157,6 +185,10 @@
protected void createPath(String path) {
new File(path).mkdirs();
+ }
+
+ public String getBaseUrl() {
+ return baseUrl;
}
}
Modified:
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocPage.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocPage.java?view=diff&rev=447187&r1=447186&r2=447187
==============================================================================
---
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocPage.java
(original)
+++
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocPage.java
Sun Sep 17 19:11:46 2006
@@ -55,7 +55,8 @@
return (DocPage) titleMap.get(title);
}
- public DocPage(DocPage parentRef, String title, long id, String
rawContent) {
+ @SuppressWarnings("unchecked")
+ public DocPage(DocPage parentRef, String title, long id, String
rawContent) {
this.parentRef = parentRef;
this.title = title;
this.id = id;
@@ -82,7 +83,8 @@
children = new ArrayList();
}
- public void addChild(DocPage child) {
+ @SuppressWarnings("unchecked")
+ public void addChild(DocPage child) {
child.depth = depth + 1;
children.add(child);
}
Modified:
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocPageRenderer.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocPageRenderer.java?view=diff&rev=447187&r1=447186&r2=447187
==============================================================================
---
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocPageRenderer.java
(original)
+++
incubator/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-other/src/tools/java/org/apache/cayenne/tools/ant/docgen/DocPageRenderer.java
Sun Sep 17 19:11:46 2006
@@ -27,192 +27,221 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import junit.framework.TestCase;
-
+import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.gen.ClassGeneratorResourceLoader;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.runtime.RuntimeConstants;
import org.apache.velocity.runtime.log.NullLogSystem;
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.gen.ClassGeneratorResourceLoader;
import
org.objectstyle.confluence.rpc.soap_axis.confluenceservice_v1.ConfluenceSoapService;
/**
- * Extracts embedded links from Confluence documentation and converts them to
local fs references
+ * Extracts embedded links from Confluence documentation and converts them to
+ * local fs references
*
* @author Cris Daniluk
*/
-public class DocPageRenderer extends TestCase {
-
- private static final String URL_PREFIX = "/confluence";
- private static final String CONFLUENCE_URL =
"http://www.objectstyle.org/confluence";
-
- /**
- * Only attachments within the page are supported right now. This could
easily be
- * adjusted to find attachments in external documents if necessary.
- */
- private static final Pattern attachmentPattern =
Pattern.compile("(href|src)=\"" + URL_PREFIX +
"/download/attachments/(.*?)/(.*?)\"");
-
- /**
- * When browsing the local filesystem, browsers like %20 (hex encoded)
instead of + (legacy HTTP 0.9) for
- * spaces.
- */
- private static final Pattern spaceEncoderPattern =
Pattern.compile("href=\"(?!http://).*?\\+.*?\"");
-
-
- /**
- * Not all images are supported - only the ones referenced by current docs.
- */
- private static final Pattern confluenceImagePattern =
Pattern.compile("src=\"" + URL_PREFIX + "/images/icons/(.*?)\"");
-
- /**
- * Take any confluence links to non-doc content and add the url
- */
- private Pattern confluenceLinkPattern = Pattern.compile("href=\"(" +
URL_PREFIX + "/display/.*?)\"");
-
- private Pattern embeddedLinkPattern;
-
- private ConfluenceSoapService service;
- private String token;
- private String spaceKey;
-
- private VelocityContext velCtxt;
- private Template pageTemplate;
-
- public DocPageRenderer(ConfluenceSoapService service, String token, String
spaceKey, String template) throws Exception {
-
- // Note that these regexps have a fairly narrow capture - since the
HTML is machine-generated,
- // we're kind of assuming it is well-formed
- embeddedLinkPattern = Pattern.compile("href=\"" + URL_PREFIX +
"/display/" + spaceKey + "/(.*?)\"");
-
- this.service = service;
- this.token = token;
- this.spaceKey = spaceKey;
-
- velCtxt = new VelocityContext();
-
- initializeClassTemplate(template);
- }
-
-
- private void initializeClassTemplate(String template) throws Exception {
- VelocityEngine velocityEngine = new VelocityEngine();
- try {
-
- // use ClasspathResourceLoader for velocity templates lookup
- // if Cayenne URL is not null, load resource from this URL
- Properties props = new Properties();
-
- // null logger that will prevent velocity.log from being generated
- props.put(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS,
NullLogSystem.class
- .getName());
-
- props.put("resource.loader", "cayenne");
-
- props.put("cayenne.resource.loader.class",
ClassGeneratorResourceLoader.class
- .getName());
-
- velocityEngine.init(props);
- }
- catch (Exception ex) {
- throw new CayenneRuntimeException("Can't initialize Velocity", ex);
- }
-
- pageTemplate = velocityEngine.getTemplate(template);
- }
-
- public void render(DocPage page, Writer out) throws Exception {
-
- // Add the TOC, unless this is the top-level page
- StringBuffer toc = new StringBuffer();
- if (page.getParentRef() != null) {
- toc.append("<div id=\"cayenne_toc\">\n");
-
- DocPage root = page.getRoot();
-
- iterateChildren(toc, page, root);
- toc.append("</div>\n");
- }
-
- // Figure out the level of nesting for relative links
- String basePath = "";
- for (int i = 1; i <= page.getDepth(); i++) {
- basePath += "../";
- }
-
- String renderedContent = service.renderContent(token, spaceKey,
page.getId(), page.getRawContent(), new HashMap(
- Collections.singletonMap("style", "clean")));
-
- // Replace cross-doc links
- Matcher linkMatcher = embeddedLinkPattern.matcher(renderedContent);
- StringBuffer replacementBuffer = new StringBuffer();
- while (linkMatcher.find()) {
- DocPage destPage =
DocPage.getPageByTitle(linkMatcher.group(1).replace('+', ' '));
-
- // If we don't understand the link, just leave it alone to be safe
- if (destPage == null) {
- continue;
- }
- linkMatcher.appendReplacement(replacementBuffer, "href=\"" +
basePath + destPage.getLinkPath() + "/index.html\"");
- }
- linkMatcher.appendTail(replacementBuffer);
-
- renderedContent = replacementBuffer.toString();
-
- //renderedContent =
embeddedLinkPattern.matcher(renderedContent).replaceAll("href=\"$1/index.html\"");
-
- // Replace attachment links
- renderedContent =
attachmentPattern.matcher(renderedContent).replaceAll("$1=\"$3\"");
-
- // Convert confluence images to relative links
- renderedContent =
confluenceImagePattern.matcher(renderedContent).replaceAll("src=\"" + basePath
+ "images/$1\"");
-
- // Replace wiki links
- renderedContent =
confluenceLinkPattern.matcher(renderedContent).replaceAll("href=\"" +
CONFLUENCE_URL + "$1\"");
-
- // Convert local links with + to %20 to make browsers happy (wtf?)
- Matcher matcher = spaceEncoderPattern.matcher(renderedContent);
-
- replacementBuffer = new StringBuffer();
- while (matcher.find()) {
- matcher.appendReplacement(replacementBuffer,
matcher.group(0).replace("+", "%20"));
- }
- matcher.appendTail(replacementBuffer);
-
- renderedContent = replacementBuffer.toString();
-
-
- velCtxt.put("page", page);
- velCtxt.put("basePath", basePath);
- velCtxt.put("pageContent", toc.toString() + renderedContent);
-
- pageTemplate.merge(velCtxt, out);
-
-
- }
-
- private void iterateChildren(StringBuffer toc, DocPage currentPage,
DocPage basePage) {
- toc.append("<ul>\n");
- for (Iterator baseIter = basePage.getChildren().iterator();
baseIter.hasNext(); ) {
-
- DocPage child = (DocPage) baseIter.next();
-
- toc.append("<li>").append("<a href=\"");
- for (int i = 1; i <= currentPage.getDepth(); i++) {
- toc.append("../");
- }
- toc.append(child.getLinkPath()).append("/index.html\">");
- toc.append(child.getTitle()).append("</a>");
- if (child.hasDescendent(currentPage)) {
- // render children
- iterateChildren(toc, currentPage, child);
- }
-
- toc.append("</li>\n");
- }
+public class DocPageRenderer {
+
+ private static final String URL_PREFIX = "/confluence";
+
+ /**
+ * Only attachments within the page are supported right now. This could
+ * easily be adjusted to find attachments in external documents if
+ * necessary.
+ */
+ private static final Pattern attachmentPattern = Pattern
+ .compile("(href|src)=\"" + URL_PREFIX
+ +
"/download/attachments/(.*?)/(.*?)\"");
+
+ /**
+ * When browsing the local filesystem, browsers like %20 (hex encoded)
+ * instead of + (legacy HTTP 0.9) for spaces.
+ */
+ private static final Pattern spaceEncoderPattern = Pattern
+ .compile("href=\"(?!http://).*?\\+.*?\"");
+
+ /**
+ * Not all images are supported - only the ones referenced by current
docs.
+ */
+ private static final Pattern confluenceImagePattern = Pattern
+ .compile("src=\"" + URL_PREFIX +
"/images/icons/(.*?)\"");
+
+ /**
+ * Take any confluence links to non-doc content and add the url
+ */
+ private Pattern confluenceLinkPattern = Pattern.compile("href=\"("
+ + URL_PREFIX + "/display/.*?)\"");
+
+ private Pattern embeddedLinkPattern;
+
+ private ConfluenceSoapService service;
+
+ private String token;
+
+ private String spaceKey;
+
+ private String baseUrl;
+
+ private VelocityContext velCtxt;
+
+ private Template pageTemplate;
+
+ public DocPageRenderer(ConfluenceSoapService service, String baseUrl,
+ String token, String spaceKey, String template) throws
Exception {
+
+ // Note that these regexps have a fairly narrow capture - since
the HTML
+ // is
+ // machine-generated,
+ // we're kind of assuming it is well-formed
+ embeddedLinkPattern = Pattern.compile("href=\"" + URL_PREFIX
+ + "/display/" + spaceKey + "/(.*?)\"");
+
+ this.service = service;
+ this.baseUrl = baseUrl;
+ this.token = token;
+ this.spaceKey = spaceKey;
+
+ velCtxt = new VelocityContext();
+
+ initializeClassTemplate(template);
+ }
+
+ private void initializeClassTemplate(String template) throws Exception {
+ VelocityEngine velocityEngine = new VelocityEngine();
+ try {
+
+ // use ClasspathResourceLoader for velocity templates
lookup
+ // if Cayenne URL is not null, load resource from this
URL
+ Properties props = new Properties();
+
+ // null logger that will prevent velocity.log from
being generated
+ props.put(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS,
+ NullLogSystem.class.getName());
+
+ props.put("resource.loader", "cayenne");
+
+ props.put("cayenne.resource.loader.class",
+
ClassGeneratorResourceLoader.class.getName());
+
+ velocityEngine.init(props);
+ } catch (Exception ex) {
+ throw new CayenneRuntimeException("Can't initialize
Velocity", ex);
+ }
+
+ pageTemplate = velocityEngine.getTemplate(template);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void render(DocPage page, Writer out) throws Exception {
+
+ // Add the TOC, unless this is the top-level page
+ StringBuffer toc = new StringBuffer();
+ if (page.getParentRef() != null) {
+ toc.append("<div id=\"cayenne_toc\">\n");
+
+ DocPage root = page.getRoot();
+
+ iterateChildren(toc, page, root);
+ toc.append("</div>\n");
+ }
+
+ // Figure out the level of nesting for relative links
+ String basePath = "";
+ for (int i = 1; i <= page.getDepth(); i++) {
+ basePath += "../";
+ }
+
+ String renderedContent = null;
+ try {
+ renderedContent = service.renderContent(token,
spaceKey, page
+ .getId(), page.getRawContent(), new
HashMap(Collections
+ .singletonMap("style", "clean")));
+ } catch (Throwable t) {
+ // could have hit a DOS prevention bit so
+ // sleep for 250ms and try again
+ Thread.sleep(250);
+ renderedContent = service.renderContent(token,
spaceKey, page
+ .getId(), page.getRawContent(), new
HashMap(Collections
+ .singletonMap("style", "clean")));
+ }
+ // Replace cross-doc links
+ Matcher linkMatcher =
embeddedLinkPattern.matcher(renderedContent);
+ StringBuffer replacementBuffer = new StringBuffer();
+ while (linkMatcher.find()) {
+ DocPage destPage =
DocPage.getPageByTitle(linkMatcher.group(1)
+ .replace('+', ' '));
+
+ // If we don't understand the link, just leave it alone
to be safe
+ if (destPage == null) {
+ continue;
+ }
+ linkMatcher.appendReplacement(replacementBuffer,
"href=\""
+ + basePath + destPage.getLinkPath() +
"/index.html\"");
+ }
+ linkMatcher.appendTail(replacementBuffer);
+
+ renderedContent = replacementBuffer.toString();
+
+ // renderedContent =
+ //
embeddedLinkPattern.matcher(renderedContent).replaceAll("href=\"$1/index.html\"");
+
+ // Replace attachment links
+ renderedContent = attachmentPattern.matcher(renderedContent)
+ .replaceAll("$1=\"$3\"");
+
+ // Convert confluence images to relative links
+ renderedContent =
confluenceImagePattern.matcher(renderedContent)
+ .replaceAll("src=\"" + basePath +
"images/$1\"");
+
+ // Replace wiki links
+ renderedContent = confluenceLinkPattern.matcher(renderedContent)
+ .replaceAll("href=\"" + baseUrl + "$1\"");
+
+ // Convert local links with + to %20 to make browsers happy
(wtf?)
+ Matcher matcher = spaceEncoderPattern.matcher(renderedContent);
+
+ replacementBuffer = new StringBuffer();
+ while (matcher.find()) {
+ matcher.appendReplacement(replacementBuffer,
matcher.group(0)
+ .replace("+", "%20"));
+ }
+ matcher.appendTail(replacementBuffer);
+
+ renderedContent = replacementBuffer.toString();
+
+ velCtxt.put("page", page);
+ velCtxt.put("basePath", basePath);
+ velCtxt.put("pageContent", toc.toString() + renderedContent);
+
+ pageTemplate.merge(velCtxt, out);
+
+ }
+
+ private void iterateChildren(StringBuffer toc, DocPage currentPage,
+ DocPage basePage) {
+ toc.append("<ul>\n");
+ for (Iterator baseIter = basePage.getChildren().iterator();
baseIter
+ .hasNext();) {
+
+ DocPage child = (DocPage) baseIter.next();
+
+ toc.append("<li>").append("<a href=\"");
+ for (int i = 1; i <= currentPage.getDepth(); i++) {
+ toc.append("../");
+ }
+
toc.append(child.getLinkPath()).append("/index.html\">");
+ toc.append(child.getTitle()).append("</a>");
+ if (child.hasDescendent(currentPage)) {
+ // render children
+ iterateChildren(toc, currentPage, child);
+ }
+
+ toc.append("</li>\n");
+ }
- toc.append("</ul>\n");
- }
+ toc.append("</ul>\n");
+ }
}