/** * Copyright 2005-2014 Restlet * * The contents of this file are subject to the terms of one of the following * open source licenses: Apache 2.0 or or EPL 1.0 (the "Licenses"). You can * select the license that you prefer but you may not use this file except in * compliance with one of these Licenses. * * You can obtain a copy of the Apache 2.0 license at * http://www.opensource.org/licenses/apache-2.0 * * You can obtain a copy of the EPL 1.0 license at * http://www.opensource.org/licenses/eclipse-1.0 * * See the Licenses for the specific language governing permissions and * limitations under the Licenses. * * Alternatively, you can obtain a royalty free commercial license with less * limitations, transferable or non-transferable, directly at * http://restlet.com/products/restlet-framework * * Restlet is a registered trademark of Restlet S.A.S. */ package org.restlet.engine; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; import org.restlet.Context; import org.restlet.Request; import org.restlet.Response; import org.restlet.Restlet; import org.restlet.data.Parameter; import org.restlet.service.MetadataService; import org.restlet.util.Series; /** * Delegate used by API classes to get support from the implementation classes. * Note that this is an SPI class that is not intended for public usage. * * @author Jerome Louvel */ public abstract class RestletHelper<T extends Restlet> extends Helper { /** * The map of attributes exchanged between the API and the Engine via this * helper. */ private final Map<String, Object> attributes; /** * The helped Restlet. */ private volatile T helped; /** * Constructor. * * @param helped * The helped Restlet. */ public RestletHelper(T helped) { this.attributes = new ConcurrentHashMap<String, Object>(); this.helped = helped; } /** * Returns the map of attributes exchanged between the API and the Engine * via this helper. * * @return The map of attributes. */ public Map<String, Object> getAttributes() { return this.attributes; } /** * Returns the helped Restlet context. * * @return The helped Restlet context. */ public Context getContext() { return getHelped().getContext(); } /** * Returns the helped Restlet. * * @return The helped Restlet. */ public T getHelped() { return this.helped; } /** * Returns the helped Restlet parameters. * * @return The helped Restlet parameters. */ public Series<Parameter> getHelpedParameters() { Series<Parameter> result = null; if ((getHelped() != null) && (getHelped().getContext() != null)) { result = getHelped().getContext().getParameters(); } else { // [ifndef gwt] instruction result = new Series<Parameter>(Parameter.class); // [ifdef gwt] instruction uncomment // result = new org.restlet.engine.util.ParameterSeries(); } return result; } /** * Returns the helped Restlet logger. * * @return The helped Restlet logger. */ public Logger getLogger() { if (getHelped() != null && getHelped().getContext() != null) { return getHelped().getContext().getLogger(); } return Context.getCurrentLogger(); } /** * Returns the metadata service. If the parent application doesn't exist, a * new instance is created. * * @return The metadata service. */ public MetadataService getMetadataService() { MetadataService result = null; // [ifndef gwt] if (getHelped() != null) { org.restlet.Application application = getHelped().getApplication(); if (application != null) { result = application.getMetadataService(); } } // [enddef] if (result == null) { result = new MetadataService(); } return result; } /** * Handles a call. * * @param request * The request to handle. * @param response * The response to update. */ public void handle(Request request, Response response) { // [ifndef gwt] // Associate the response to the current thread Response.setCurrent(response); // Associate the context to the current thread if (getContext() != null) { Context.setCurrent(getContext()); } // [enddef] } /** * Sets the helped Restlet. * * @param helpedRestlet * The helped Restlet. */ public void setHelped(T helpedRestlet) { this.helped = helpedRestlet; } /** Start callback. */ public abstract void start() throws Exception; /** Stop callback. */ public abstract void stop() throws Exception; /** * Update callback with less impact than a {@link #stop()} followed by a * {@link #start()}. */ public abstract void update() throws Exception; }