diff --git a/src/main/java/org/bluemagic/config/decorator/SingleTagDecorator.java b/src/main/java/org/bluemagic/config/decorator/SingleTagDecorator.java index 98943b9..a9f01be 100644 --- a/src/main/java/org/bluemagic/config/decorator/SingleTagDecorator.java +++ b/src/main/java/org/bluemagic/config/decorator/SingleTagDecorator.java @@ -10,7 +10,7 @@ public class SingleTagDecorator extends TagDecorator { - protected String tagParameterKey = "tags"; + public static String tagParameterKey = "tags"; private Tag tag; @@ -52,7 +52,7 @@ public URI decorateSuffix(URI key, Map parameters) { } public void setTagParameterKey(String tagParameterKey) { - this.tagParameterKey = tagParameterKey; + SingleTagDecorator.tagParameterKey = tagParameterKey; } public String getTagParameterKey() { diff --git a/src/main/java/org/bluemagic/config/decorator/tags/DoubleTag.java b/src/main/java/org/bluemagic/config/decorator/tags/DoubleTag.java index 6e6c012..3312932 100644 --- a/src/main/java/org/bluemagic/config/decorator/tags/DoubleTag.java +++ b/src/main/java/org/bluemagic/config/decorator/tags/DoubleTag.java @@ -54,6 +54,11 @@ public String toString() { return this.key + "=" + getValue(); } + @Override + public int hashCode() { + return key.hashCode() + prefix.hashCode() + value.hashCode() + suffix.hashCode(); + } + public void setKey(String key) { this.key = key; } diff --git a/src/main/java/org/bluemagic/config/decorator/tags/SingleTag.java b/src/main/java/org/bluemagic/config/decorator/tags/SingleTag.java index 29ea748..955c8fe 100644 --- a/src/main/java/org/bluemagic/config/decorator/tags/SingleTag.java +++ b/src/main/java/org/bluemagic/config/decorator/tags/SingleTag.java @@ -48,6 +48,11 @@ public String toString() { return getValue(); } + @Override + public int hashCode() { + return prefix.hashCode() + value.hashCode() + suffix.hashCode(); + } + public String getPrefix() { return prefix; } diff --git a/src/main/java/org/bluemagic/config/decorator/tags/TripleTag.java b/src/main/java/org/bluemagic/config/decorator/tags/TripleTag.java index a5c0a28..03235a9 100644 --- a/src/main/java/org/bluemagic/config/decorator/tags/TripleTag.java +++ b/src/main/java/org/bluemagic/config/decorator/tags/TripleTag.java @@ -9,6 +9,8 @@ * */ public class TripleTag extends SingleTag { + + private static String nameSpacePredicateSeperator = ":"; private String namespace; @@ -56,7 +58,7 @@ public String toString() { StringBuilder b = new StringBuilder(); b.append(this.namespace); - b.append(":"); + b.append(getNameSpacePredicateSeperator()); b.append(this.predicate); b.append("="); b.append(getValue()); @@ -64,6 +66,11 @@ public String toString() { return b.toString(); } + @Override + public int hashCode() { + return namespace.hashCode() + predicate.hashCode() + prefix.hashCode() + value.hashCode() + suffix.hashCode(); + } + public void setPredicate(String predicate) { this.predicate = predicate; } @@ -79,4 +86,13 @@ public void setNamespace(String namespace) { public String getNamespace() { return namespace; } + + public static void setNameSpacePredicateSeperator( + String nameSpacePredicateSeperator) { + TripleTag.nameSpacePredicateSeperator = nameSpacePredicateSeperator; + } + + public static String getNameSpacePredicateSeperator() { + return nameSpacePredicateSeperator; + } } diff --git a/src/main/java/org/bluemagic/config/location/RemoteLocation.java b/src/main/java/org/bluemagic/config/location/RemoteLocation.java index 4e24342..e051402 100644 --- a/src/main/java/org/bluemagic/config/location/RemoteLocation.java +++ b/src/main/java/org/bluemagic/config/location/RemoteLocation.java @@ -9,7 +9,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.bluemagic.config.api.MagicKey; -import org.bluemagic.config.util.RestUtils; +import org.bluemagic.config.location.remote.RestClientManager; +import org.bluemagic.config.location.remote.SimpleRestClientManager; import org.bluemagic.config.util.UriUtils; /** @@ -26,7 +27,16 @@ public class RemoteLocation extends UriLocation { private static Map> prefetched; + private RestClientManager restClientManager; + private boolean prefetch = false; + + public void init() { + + if (restClientManager == null) { + restClientManager = new SimpleRestClientManager(); + } + } /** * Uses the location and optional search criteria to locate the data and @@ -73,13 +83,13 @@ public String get(URI key, Map parameters) { propertyUri = UriUtils.toUri(this.uri.toASCIIString() + "/" + key); } } - return RestUtils.get(propertyUri); + return restClientManager.get(propertyUri); } public Set searchForKeys(URI baseUri) { Set keySet = new HashSet(); - String searchResults = RestUtils.get(baseUri); + String searchResults = restClientManager.get(baseUri); String[] split = searchResults.split("\n"); for (String uriAsString : split) { @@ -109,4 +119,12 @@ public void setPrefetch(boolean prefetch) { public boolean isPrefetch() { return prefetch; } + + public void setRestClientManager(RestClientManager restClientManager) { + this.restClientManager = restClientManager; + } + + public RestClientManager getRestClientManager() { + return restClientManager; + } } diff --git a/src/main/java/org/bluemagic/config/location/remote/RestClientManager.java b/src/main/java/org/bluemagic/config/location/remote/RestClientManager.java new file mode 100644 index 0000000..ca08583 --- /dev/null +++ b/src/main/java/org/bluemagic/config/location/remote/RestClientManager.java @@ -0,0 +1,15 @@ +package org.bluemagic.config.location.remote; + +import java.net.URI; +import java.util.Map; + +public interface RestClientManager { + + public String post(URI uri, Map parameters); + + public String get(URI uri); + + public String update(URI uri, Map parameters); + + public String delete(URI uri); +} diff --git a/src/main/java/org/bluemagic/config/location/remote/SecureRestClientManager.java b/src/main/java/org/bluemagic/config/location/remote/SecureRestClientManager.java new file mode 100644 index 0000000..d9e61ff --- /dev/null +++ b/src/main/java/org/bluemagic/config/location/remote/SecureRestClientManager.java @@ -0,0 +1,20 @@ +package org.bluemagic.config.location.remote; + +import java.net.URI; + +public class SecureRestClientManager extends SimpleRestClientManager { + + @Override + public String get(URI uri) { + + String retval = null; + + if ("https".equals(uri.getScheme())) { + // TODO: BRIAN ADD HTTPS CALL HERE + + } else { + retval = super.get(uri); + } + return retval; + } +} diff --git a/src/main/java/org/bluemagic/config/location/remote/SessionizingRestClientManager.java b/src/main/java/org/bluemagic/config/location/remote/SessionizingRestClientManager.java new file mode 100644 index 0000000..efcbc86 --- /dev/null +++ b/src/main/java/org/bluemagic/config/location/remote/SessionizingRestClientManager.java @@ -0,0 +1,33 @@ +package org.bluemagic.config.location.remote; + +import java.net.URI; +import java.util.Map; + +public class SessionizingRestClientManager implements RestClientManager { + + private RestClientManager internalRestClientManager; + + public String post(URI uri, Map parameters) { + throw new UnsupportedOperationException(); + } + + public String get(URI uri) { + throw new UnsupportedOperationException(); + } + + public String update(URI uri, Map parameters) { + throw new UnsupportedOperationException(); + } + + public String delete(URI uri) { + throw new UnsupportedOperationException(); + } + + public void setInternalRestClientManager(RestClientManager internalRestClientManager) { + this.internalRestClientManager = internalRestClientManager; + } + + public RestClientManager getInternalRestClientManager() { + return internalRestClientManager; + } +} diff --git a/src/main/java/org/bluemagic/config/util/RestUtils.java b/src/main/java/org/bluemagic/config/location/remote/SimpleRestClientManager.java similarity index 80% rename from src/main/java/org/bluemagic/config/util/RestUtils.java rename to src/main/java/org/bluemagic/config/location/remote/SimpleRestClientManager.java index b232dee..9fc187f 100644 --- a/src/main/java/org/bluemagic/config/util/RestUtils.java +++ b/src/main/java/org/bluemagic/config/location/remote/SimpleRestClientManager.java @@ -1,20 +1,25 @@ -package org.bluemagic.config.util; +package org.bluemagic.config.location.remote; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URI; import java.net.URL; +import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -public class RestUtils { +public class SimpleRestClientManager implements RestClientManager { - private static final Log LOG = LogFactory.getLog(RestUtils.class); - - public static String get(URI uri) { + private static final Log LOG = LogFactory.getLog(SimpleRestClientManager.class); + + public String post(URI uri, Map parameters) { + throw new UnsupportedOperationException(); + } + public String get(URI uri) { + URL url = null; String rval = null; BufferedReader urlReader = null; @@ -64,7 +69,6 @@ public static String get(URI uri) { } catch (Throwable t) { LOG.trace("Failed to retrieve data from the server:" + url.toString(), t); - throw new RuntimeException("Failed to retrieve data from the server " + url, t); } finally { @@ -81,4 +85,12 @@ public static String get(URI uri) { } return rval; } + + public String update(URI uri, Map parameters) { + throw new UnsupportedOperationException(); + } + + public String delete(URI uri) { + throw new UnsupportedOperationException(); + } } diff --git a/src/main/java/org/bluemagic/config/location/remote/TimedRestClientManager.java b/src/main/java/org/bluemagic/config/location/remote/TimedRestClientManager.java new file mode 100644 index 0000000..d6fb6f5 --- /dev/null +++ b/src/main/java/org/bluemagic/config/location/remote/TimedRestClientManager.java @@ -0,0 +1,83 @@ +package org.bluemagic.config.location.remote; + +import java.net.URI; +import java.util.Arrays; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +public class TimedRestClientManager implements RestClientManager { + + private long timeoutInMillis = 1000; + + private RestClientManager internalRestClientManager; + + public String post(URI uri, Map parameters) { + throw new UnsupportedOperationException(); + } + + public String get(URI uri) { + + RestfulGetCallable getCallable = new RestfulGetCallable(uri); + + try { + ExecutorService executor = Executors.newSingleThreadExecutor(); + executor.invokeAll(Arrays.asList(getCallable), timeoutInMillis, TimeUnit.MILLISECONDS); + executor.shutdown(); + + } catch (Exception e) { + return null; + } + return getCallable.result; + } + + public String update(URI uri, Map parameters) { + throw new UnsupportedOperationException(); + } + + public String delete(URI uri) { + throw new UnsupportedOperationException(); + } + + public void setInternalRestClientManager(RestClientManager internalRestClientManager) { + this.internalRestClientManager = internalRestClientManager; + } + + public RestClientManager getInternalRestClientManager() { + return internalRestClientManager; + } + + public void setTimeoutInMillis(long timeoutInMillis) { + this.timeoutInMillis = timeoutInMillis; + } + + public long getTimeoutInMillis() { + return timeoutInMillis; + } + + private class RestfulGetCallable implements Callable { + + public String result = null; + + private URI uri; + + public RestfulGetCallable(URI uri) { + this.setUri(uri); + } + + public void setUri(URI uri) { + this.uri = uri; + } + + public URI getUri() { + return uri; + } + + public String call() throws Exception { + result = internalRestClientManager.get(getUri()); + return result; + } + } +} diff --git a/src/test/java/org/bluemagic/config/location/remote/TimedRestClientManagerTest.java b/src/test/java/org/bluemagic/config/location/remote/TimedRestClientManagerTest.java new file mode 100644 index 0000000..2fe170d --- /dev/null +++ b/src/test/java/org/bluemagic/config/location/remote/TimedRestClientManagerTest.java @@ -0,0 +1,19 @@ +package org.bluemagic.config.location.remote; + +import org.junit.Test; + +public class TimedRestClientManagerTest { + + @Test + public void tryGet() throws Exception { + + TimedRestClientManager trcm = new TimedRestClientManager(); + trcm.setInternalRestClientManager(new SimpleRestClientManager()); + + trcm.setTimeoutInMillis(10); + //assertNull(trcm.get(new URI("http://configprops.com/property/abc"))); + + trcm.setTimeoutInMillis(1000); + //assertNotNull(trcm.get(new URI("http://configprops.com/property/abc"))); + } +}