On Thu, Feb 12, 2009 at 1:08 PM, Claus Ibsen <[email protected]> wrote: > Hi > > Maybe we should have had a doShutdown() callback as well, so we can do > house cleaning if eg Camel is being shut down.
When Camel shuts down, all those maps get garbage collected as RestletComponent goes away, right? > > Okay you are on top of that, just add a code comment in the stop that > the maps should not be cleared if eg the component is started again > and we want to be in sync with the Restlet Component > Sure. will do. > > On Thu, Feb 12, 2009 at 5:38 PM, William Tam <[email protected]> wrote: >> Hi Claus, >> >> I think routers.clear() is not necessary because router gets removed >> from the map when RestletConsumer stops. It gets added back when >> ResletConsumer starts. No need to clear routers map outside of those >> routines. And, servers.clear() is not desirable because it causes >> the "our" servers map to be out of sync with "servers" in the actual >> Restlet Component object. (Look at >> RestletComponent.addServerIfNeccessary(), the Restlet component object >> its a server list. If we clear our servers map, we could end up >> trying to call component.getServers().add(...) again.) >> >>> @@ -96,9 +118,20 @@ >>> @Override >>> protected void doStop() throws Exception { >>> component.stop(); >>> + // just clear maps, component will stop the servers and routes >>> + servers.clear(); >>> + routers.clear(); >>> super.doStop(); >>> } >> >> I think we can put the header filter strategy in the endpoint level. >> Let me see if I can do it. >> >> Thanks, >> William >> >> >> On Thu, Feb 12, 2009 at 9:27 AM, <[email protected]> wrote: >>> Author: davsclaus >>> Date: Thu Feb 12 14:27:53 2009 >>> New Revision: 743762 >>> >>> URL: http://svn.apache.org/viewvc?rev=743762&view=rev >>> Log: >>> CAMEL-1289: a little cleanup in the restlet component. the endpoint should >>> NOT know about URI parameters from the component. >>> >>> Modified: >>> >>> camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java >>> >>> camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletEndpoint.java >>> >>> camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletQueryTest.java >>> >>> Modified: >>> camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java >>> URL: >>> http://svn.apache.org/viewvc/camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java?rev=743762&r1=743761&r2=743762&view=diff >>> ============================================================================== >>> --- >>> camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java >>> (original) >>> +++ >>> camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java >>> Thu Feb 12 14:27:53 2009 >>> @@ -16,6 +16,7 @@ >>> */ >>> package org.apache.camel.component.restlet; >>> >>> +import java.net.URI; >>> import java.util.HashMap; >>> import java.util.Map; >>> >>> @@ -24,6 +25,8 @@ >>> import org.apache.camel.impl.DefaultComponent; >>> import org.apache.camel.spi.HeaderFilterStrategy; >>> import org.apache.camel.util.CamelContextHelper; >>> +import org.apache.camel.util.URISupport; >>> +import org.apache.camel.util.UnsafeUriCharactersEncoder; >>> import org.apache.commons.logging.Log; >>> import org.apache.commons.logging.LogFactory; >>> import org.restlet.Component; >>> @@ -42,21 +45,20 @@ >>> public class RestletComponent extends DefaultComponent implements >>> HeaderFilterStrategyAware { >>> private static final Log LOG = >>> LogFactory.getLog(RestletComponent.class); >>> >>> - private Map<String, Server> servers = new HashMap<String, Server>(); >>> - private Map<String, MethodBasedRouter> routers = new HashMap<String, >>> MethodBasedRouter>(); >>> - private Component component = new Component(); >>> + private final Map<String, Server> servers = new HashMap<String, >>> Server>(); >>> + private final Map<String, MethodBasedRouter> routers = new >>> HashMap<String, MethodBasedRouter>(); >>> + private final Component component = new Component(); >>> private HeaderFilterStrategy headerFilterStrategy = new >>> RestletHeaderFilterStrategy(); >>> >>> @Override >>> - protected Endpoint createEndpoint(String uri, String remaining, >>> - Map parameters) throws Exception { >>> + @SuppressWarnings("unchecked") >>> + protected Endpoint createEndpoint(String uri, String remaining, Map >>> parameters) throws Exception { >>> >>> RestletBinding restletBinding = null; >>> // lookup binding in registry if provided >>> String ref = getAndRemoveParameter(parameters, "restletBindingRef", >>> String.class); >>> if (ref != null) { >>> - restletBinding = >>> CamelContextHelper.mandatoryLookup(getCamelContext(), >>> - ref, RestletBinding.class); >>> + restletBinding = >>> CamelContextHelper.mandatoryLookup(getCamelContext(), ref, >>> RestletBinding.class); >>> } >>> >>> if (restletBinding == null) { >>> @@ -74,16 +76,36 @@ >>> } >>> >>> Method method = getAndRemoveParameter(parameters, "restletMethod", >>> Method.class); >>> - RestletEndpoint result = new RestletEndpoint(this, remaining, >>> parameters, restletBinding); >>> - >>> + >>> + // construct URI so we can use it to get the splitted information >>> + URI u = new URI(UnsafeUriCharactersEncoder.encode(remaining)); >>> + String protocol = u.getScheme(); >>> + >>> + String uriPattern = u.getPath(); >>> + if (parameters.size() > 0) { >>> + uriPattern = uriPattern + "?" + >>> URISupport.createQueryString(parameters); >>> + } >>> + >>> + int port = 0; >>> + String host = u.getHost(); >>> + if (u.getPort() > 0) { >>> + port = u.getPort(); >>> + } >>> + >>> + RestletEndpoint result = new RestletEndpoint(this, remaining, >>> restletBinding); >>> + result.setProtocol(protocol); >>> + result.setUriPattern(uriPattern); >>> + result.setHost(host); >>> + if (port > 0) { >>> + result.setPort(port); >>> + } >>> if (method != null) { >>> result.setRestletMethod(method); >>> } >>> - >>> if (realm != null) { >>> result.setRealm(realm); >>> } >>> - >>> + >>> return result; >>> } >>> >>> @@ -96,9 +118,20 @@ >>> @Override >>> protected void doStop() throws Exception { >>> component.stop(); >>> + // just clear maps, component will stop the servers and routes >>> + servers.clear(); >>> + routers.clear(); >>> super.doStop(); >>> } >>> >>> + public HeaderFilterStrategy getHeaderFilterStrategy() { >>> + return headerFilterStrategy; >>> + } >>> + >>> + public void setHeaderFilterStrategy(HeaderFilterStrategy strategy) { >>> + this.headerFilterStrategy = strategy; >>> + } >>> + >>> public void connect(RestletConsumer consumer) throws Exception { >>> RestletEndpoint endpoint = (RestletEndpoint)consumer.getEndpoint(); >>> addServerIfNeccessary(endpoint); >>> @@ -127,33 +160,30 @@ >>> LOG.debug("Attached methodRouter uriPattern: " + >>> endpoint.getUriPattern()); >>> } >>> } >>> - >>> - LOG.debug("Attached restlet uriPattern: " + >>> endpoint.getUriPattern() + " method: " >>> - + endpoint.getRestletMethod()); >>> >>> + if (LOG.isDebugEnabled()) { >>> + LOG.debug("Attached restlet uriPattern: " + >>> endpoint.getUriPattern() + " method: " + endpoint.getRestletMethod()); >>> + } >>> } >>> >>> public void disconnect(RestletConsumer consumer) throws Exception { >>> RestletEndpoint endpoint = (RestletEndpoint)consumer.getEndpoint(); >>> MethodBasedRouter router = >>> getMethodRouter(endpoint.getUriPattern()); >>> router.removeRoute(endpoint.getRestletMethod()); >>> - LOG.debug("Detached restlet uriPattern: " + >>> endpoint.getUriPattern() + " method: " >>> - + endpoint.getRestletMethod()); >>> - } >>> - >>> - public HeaderFilterStrategy getHeaderFilterStrategy() { >>> - return headerFilterStrategy; >>> - } >>> >>> - public void setHeaderFilterStrategy(HeaderFilterStrategy strategy) { >>> - this.headerFilterStrategy = strategy; >>> - } >>> + if (LOG.isDebugEnabled()) { >>> + LOG.debug("Detached restlet uriPattern: " + >>> endpoint.getUriPattern() + " method: " + endpoint.getRestletMethod()); >>> + } >>> + } >>> >>> private MethodBasedRouter getMethodRouter(String uriPattern) { >>> synchronized (routers) { >>> MethodBasedRouter result = routers.get(uriPattern); >>> if (result == null) { >>> result = new MethodBasedRouter(uriPattern); >>> + if (LOG.isDebugEnabled()) { >>> + LOG.debug("Added method based router: " + result); >>> + } >>> routers.put(uriPattern, result); >>> } >>> return result; >>> @@ -162,14 +192,15 @@ >>> >>> private void addServerIfNeccessary(RestletEndpoint endpoint) throws >>> Exception { >>> String key = buildKey(endpoint); >>> - Server server = null; >>> + Server server; >>> synchronized (servers) { >>> server = servers.get(key); >>> if (server == null) { >>> - server = >>> component.getServers().add(Protocol.valueOf(endpoint.getProtocol()), >>> - endpoint.getPort()); >>> + server = >>> component.getServers().add(Protocol.valueOf(endpoint.getProtocol()), >>> endpoint.getPort()); >>> servers.put(key, server); >>> - LOG.info("Add server: " + key); >>> + if (LOG.isDebugEnabled()) { >>> + LOG.debug("Added server: " + key); >>> + } >>> server.start(); >>> } >>> } >>> >>> Modified: >>> camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletEndpoint.java >>> URL: >>> http://svn.apache.org/viewvc/camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletEndpoint.java?rev=743762&r1=743761&r2=743762&view=diff >>> ============================================================================== >>> --- >>> camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletEndpoint.java >>> (original) >>> +++ >>> camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletEndpoint.java >>> Thu Feb 12 14:27:53 2009 >>> @@ -14,18 +14,14 @@ >>> * See the License for the specific language governing permissions and >>> * limitations under the License. >>> */ >>> - >>> package org.apache.camel.component.restlet; >>> >>> -import java.net.URI; >>> import java.util.Map; >>> >>> import org.apache.camel.Consumer; >>> import org.apache.camel.Processor; >>> import org.apache.camel.Producer; >>> import org.apache.camel.impl.DefaultEndpoint; >>> -import org.apache.camel.util.URISupport; >>> -import org.apache.camel.util.UnsafeUriCharactersEncoder; >>> import org.restlet.data.Method; >>> >>> /** >>> @@ -46,24 +42,10 @@ >>> private String uriPattern; >>> private RestletBinding restletBinding; >>> private Map<String, String> realm; >>> - >>> - public RestletEndpoint(RestletComponent component, String remaining, >>> - Map<String, String> parameters, RestletBinding restletBinding) >>> throws Exception { >>> + >>> + public RestletEndpoint(RestletComponent component, String remaining, >>> RestletBinding restletBinding) throws Exception { >>> super(remaining, component); >>> this.restletBinding = restletBinding; >>> - >>> - URI u = new URI(UnsafeUriCharactersEncoder.encode(remaining)); >>> - protocol = u.getScheme(); >>> - >>> - uriPattern = u.getPath(); >>> - if (parameters.size() > 0) { >>> - uriPattern = uriPattern + "?" + >>> URISupport.createQueryString(parameters); >>> - } >>> - >>> - host = u.getHost(); >>> - if (u.getPort() > 0) { >>> - port = u.getPort(); >>> - } >>> } >>> >>> public boolean isSingleton() { >>> @@ -75,7 +57,7 @@ >>> // true to allow dynamic URI options to be configured and passed to >>> external system. >>> return true; >>> } >>> - >>> + >>> public Consumer createConsumer(Processor processor) throws Exception { >>> return new RestletConsumer(this, processor); >>> } >>> @@ -84,82 +66,67 @@ >>> return new RestletProducer(this); >>> } >>> >>> - /** >>> - * @param restletConsumer >>> - */ >>> public void connect(RestletConsumer restletConsumer) throws Exception { >>> ((RestletComponent)getComponent()).connect(restletConsumer); >>> } >>> >>> - /** >>> - * @param restletConsumer >>> - */ >>> public void disconnect(RestletConsumer restletConsumer) throws >>> Exception { >>> ((RestletComponent)getComponent()).disconnect(restletConsumer); >>> } >>> >>> - /** >>> - * @return the protocol >>> - */ >>> + public Method getRestletMethod() { >>> + return restletMethod; >>> + } >>> + >>> + public void setRestletMethod(Method restletMethod) { >>> + this.restletMethod = restletMethod; >>> + } >>> + >>> public String getProtocol() { >>> return protocol; >>> } >>> >>> - /** >>> - * @return the host >>> - */ >>> + public void setProtocol(String protocol) { >>> + this.protocol = protocol; >>> + } >>> + >>> public String getHost() { >>> return host; >>> } >>> >>> - /** >>> - * @return the port >>> - */ >>> + public void setHost(String host) { >>> + this.host = host; >>> + } >>> + >>> public int getPort() { >>> return port; >>> } >>> - >>> - /** >>> - * @return the uriPattern >>> - */ >>> + >>> + public void setPort(int port) { >>> + this.port = port; >>> + } >>> + >>> public String getUriPattern() { >>> return uriPattern; >>> } >>> >>> - /** >>> - * @return the restletBinding >>> - */ >>> + public void setUriPattern(String uriPattern) { >>> + this.uriPattern = uriPattern; >>> + } >>> + >>> public RestletBinding getRestletBinding() { >>> return restletBinding; >>> } >>> >>> - /** >>> - * @param restletMethod the restletMethod to set >>> - */ >>> - public void setRestletMethod(Method restletMethod) { >>> - this.restletMethod = restletMethod; >>> + public void setRestletBinding(RestletBinding restletBinding) { >>> + this.restletBinding = restletBinding; >>> } >>> >>> - /** >>> - * @return the restletMethod >>> - */ >>> - public Method getRestletMethod() { >>> - return restletMethod; >>> + public Map<String, String> getRealm() { >>> + return realm; >>> } >>> >>> - /** >>> - * @param realm >>> - */ >>> public void setRealm(Map<String, String> realm) { >>> this.realm = realm; >>> } >>> - >>> - /** >>> - * @return the realm >>> - */ >>> - public Map<String, String> getRealm() { >>> - return realm; >>> - } >>> - >>> - >>> } >>> >>> Modified: >>> camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletQueryTest.java >>> URL: >>> http://svn.apache.org/viewvc/camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletQueryTest.java?rev=743762&r1=743761&r2=743762&view=diff >>> ============================================================================== >>> --- >>> camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletQueryTest.java >>> (original) >>> +++ >>> camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletQueryTest.java >>> Thu Feb 12 14:27:53 2009 >>> @@ -31,26 +31,21 @@ >>> public class RestletQueryTest extends ContextTestSupport { >>> private static final String QUERY_STRING = "foo=bar&test=123"; >>> >>> - >>> @Override >>> protected RouteBuilder createRouteBuilder() { >>> - >>> return new RouteBuilder() { >>> @Override >>> public void configure() throws Exception { >>> from("restlet:http://localhost:9080/users/{username}") >>> .process(new SetUserProcessor()); >>> - >>> } >>> - >>> }; >>> } >>> >>> class SetUserProcessor implements Processor { >>> >>> public void process(Exchange exchange) throws Exception { >>> - assertEquals(QUERY_STRING, >>> exchange.getIn().getHeader(RestletConstants.QUERY_STRING, >>> - String.class)); >>> + assertEquals(QUERY_STRING, >>> exchange.getIn().getHeader(RestletConstants.QUERY_STRING, String.class)); >>> } >>> >>> } >>> >>> >>> >> > > > > -- > Claus Ibsen > Apache Camel Committer > > Open Source Integration: http://fusesource.com > Blog: http://davsclaus.blogspot.com/ >
