IndexFromConfluence.java
package org.jbehave.core.io.rest.confluence;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;
import org.jbehave.core.io.rest.RESTClient;
import org.jbehave.core.io.rest.RESTClient.Type;
import org.jbehave.core.io.rest.Resource;
import org.jbehave.core.io.rest.ResourceIndexer;
import org.jbehave.core.io.rest.confluence.Confluence.Page;
public class IndexFromConfluence implements ResourceIndexer {
private static final String DISPLAY = "/display/";
private final Confluence confluence;
public IndexFromConfluence() {
this(null, null);
}
public IndexFromConfluence(String username, String password) {
this(new RESTClient(Type.XML, username, password));
}
public IndexFromConfluence(RESTClient client) {
this.confluence = new Confluence(client);
}
@Override
public Map<String, Resource> indexResources(String rootURI) {
return indexResources(rootURI, null);
}
@Override
public Map<String, Resource> indexResources(String rootURI, String rootPath, String syntax, String includes) {
return indexResources(rootURI, includes);
}
protected Map<String, Resource> indexResources(String rootURI, String includePattern) {
if (rootURI == null || !rootURI.contains(DISPLAY)) {
throw new RuntimeException("Root URI is not in correct format: " + rootURI);
}
String[] split = rootURI.split(DISPLAY);
String baseUrl = split[0];
if (split.length == 1) {
throw new RuntimeException("URI does not contain space and page: " + rootURI);
}
String[] searchTerms = split[1].split("/");
if (split.length != 2) {
throw new RuntimeException("URI does not contain space and page: " + rootURI);
}
return createResourceMap(baseUrl, searchTerms[0], searchTerms[1], includePattern);
}
private Map<String, Resource> createResourceMap(String baseUrl, String spaceKey, String pageName, String pattern) {
Map<String, Resource> result = new HashMap<>();
Page rootPage = confluence.loadRootPage(baseUrl, spaceKey, pageName);
addPage(result, rootPage.getSelfReference(), pattern);
return result;
}
private void addPage(Map<String, Resource> result, String href, String pattern) {
Page page = confluence.loadPage(href, true);
Resource resource = new Resource(page.getSelfReference(), page.getTitle());
resource.setContent(page.getBody());
if (pattern == null || (pattern != null && Pattern.matches(pattern, page.getTitle()))) {
result.put(page.getTitle(), resource);
}
if (page.hasChildren()) {
for (Page child : page.getChildren()) {
addPage(result, child.getSelfReference(), pattern);
}
}
}
}