package org.atomhopper.util; import org.apache.commons.lang.StringUtils; import org.atomhopper.abdera.TargetResolverField; public class TargetRegexBuilder { private static final String REPLACEMENT_ELEMENT = "@_", WORKSPACE_TEMPLATE = "/(" + REPLACEMENT_ELEMENT + ")?(" + REPLACEMENT_ELEMENT + ")/?(\\?[^#]+)?", FEED_TEMPLATE = "/(" + REPLACEMENT_ELEMENT + ")?(" + REPLACEMENT_ELEMENT + ")/(" + REPLACEMENT_ELEMENT + ")/?(\\?[^#]+)?", ENTRY_TEMPLATE = "/(" + REPLACEMENT_ELEMENT + ")?(" + REPLACEMENT_ELEMENT + ")/(" + REPLACEMENT_ELEMENT + ")/entries/([^/#?]+)/?(\\?[^#]+)?"; private String contextPath, workspace, feed; public TargetRegexBuilder() { workspace = null; feed = null; contextPath = ""; } public TargetRegexBuilder(TargetRegexBuilder copyMe) { contextPath = copyMe.contextPath; workspace = copyMe.workspace; feed = copyMe.feed; } public void setContextPath(String contextPath) { final StringBuilder builder = new StringBuilder(); if (contextPath.startsWith("/")) { builder.append(contextPath.substring(1)); } else { builder.append(contextPath); } if (!contextPath.endsWith("/")) { builder.append("/"); } this.contextPath = builder.toString(); } public void setFeed(String feed) { feed = feed.replace("\\", "\\\\"); this.feed = StringUtils.strip(feed, "/"); } public void setWorkspace(String workspace) { workspace = workspace.replace("\\", "\\\\"); this.workspace = StringUtils.strip(workspace, "/"); } public String getContextPath() { return contextPath; } public String getFeedResource() { return feed; } public String getWorkspaceResource() { return workspace; } private void checkWorkspaceString() { if (StringUtils.isBlank(workspace)) { throw new IllegalStateException("Can not produce a regex pattern without the workspace field of the builder being set!"); } } private void checkFeedString() { checkWorkspaceString(); if (StringUtils.isBlank(feed)) { throw new IllegalStateException("Can not produce a regex pattern without the workspace or feed fields of the builder being set!"); } } private String insertContextPath(String base) { return base.replaceFirst(REPLACEMENT_ELEMENT, contextPath); } private String asWorkspacePattern(String base) { return insertContextPath(base).replaceFirst(REPLACEMENT_ELEMENT, workspace); } private String asFeedPattern(String base) { return asWorkspacePattern(base).replaceFirst(REPLACEMENT_ELEMENT, feed); } public String toWorkspacePattern() { checkWorkspaceString(); return asWorkspacePattern(WORKSPACE_TEMPLATE); } public String toFeedPattern() { checkFeedString(); return asFeedPattern(FEED_TEMPLATE); } public String toEntryPattern() { checkFeedString(); return asFeedPattern(ENTRY_TEMPLATE); } public static String[] getWorkspaceResolverFieldList() { return new String[]{ TargetResolverField.CONTEXT_PATH.toString(), TargetResolverField.WORKSPACE.toString() }; } public static String[] getFeedResolverFieldList() { return new String[]{ TargetResolverField.CONTEXT_PATH.toString(), TargetResolverField.WORKSPACE.toString(), TargetResolverField.FEED.toString() }; } public static String[] getEntryResolverFieldList() { return new String[]{ TargetResolverField.CONTEXT_PATH.toString(), TargetResolverField.WORKSPACE.toString(), TargetResolverField.FEED.toString(), TargetResolverField.ENTRY.toString() }; } }