ingo@100: /*
ingo@100:  * Copyright (c) 2010 by Intevation GmbH
ingo@100:  *
ingo@100:  * This program is free software under the LGPL (>=v2.1)
ingo@100:  * Read the file LGPL.txt coming with the software for details
ingo@100:  * or visit http://www.gnu.org/licenses/ if it does not exist.
ingo@100:  */
ingo@100: 
sascha@40: package de.intevation.artifactdatabase.rest;
sascha@40: 
sascha@93: import de.intevation.artifactdatabase.DefaultCallMeta;
sascha@93: import de.intevation.artifactdatabase.DefaultPreferredLocale;
sascha@93: 
sascha@48: import de.intevation.artifacts.CallMeta;
sascha@48: import de.intevation.artifacts.PreferredLocale;
sascha@48: 
sascha@93: import java.util.Iterator;
sascha@93: import java.util.List;
sascha@93: 
sascha@40: import org.apache.log4j.Logger;
sascha@40: 
sascha@93: import org.restlet.data.ClientInfo;
sascha@93: import org.restlet.data.Language;
sascha@93: import org.restlet.data.Preference;
sascha@40: 
sascha@40: import org.restlet.representation.Representation;
sascha@40: 
sascha@93: import org.restlet.resource.ResourceException;
sascha@93: import org.restlet.resource.ServerResource;
sascha@48: 
sascha@40: /**
sascha@88:  * Base class for the resources of REST interface of the artifact database.
sascha@88:  * Primarily used to unify the logging.
sascha@77:  * @author <a href="mailto:sascha.teichmann@intevation">Sascha L. Teichmann</a>
sascha@40:  */
sascha@40: public class BaseResource
sascha@40: extends      ServerResource
sascha@40: {
sascha@40:     private static Logger logger = Logger.getLogger(BaseResource.class);
sascha@40: 
sascha@88:     /**
sascha@88:      * Default constructor.
sascha@88:      */
sascha@40:     public BaseResource() {
sascha@40:     }
sascha@40: 
sascha@88:     /**
sascha@88:      * Overrides the post method of ServerResource to handle some
sascha@88:      * exceptions and to the required logging.
sascha@88:      * The call bridges to #innerPost(Representation) which
sascha@88:      * should be overwitten by the subclasses to do the real
sascha@88:      * request processing.
sascha@88:      * @param requestRepr The incoming represention of the HTTP request.
sascha@88:      * @return The representation produced by #innerPost(Representation).
sascha@88:      * @throws ResourceException Thrown if something went wrong during
sascha@88:      * request processing.
sascha@88:      */
sascha@88:     @Override
sascha@40:     protected Representation post(Representation requestRepr)
sascha@40:     throws    ResourceException
sascha@40:     {
sascha@40:         try {
sascha@40:             return innerPost(requestRepr);
sascha@40:         }
sascha@40:         catch (ResourceException re) {
sascha@40:             throw re;
sascha@40:         }
sascha@40:         catch (RuntimeException re) {
sascha@40:             logger.error(re.getLocalizedMessage(), re);
sascha@40:             throw re;
sascha@40:         }
sascha@40:     }
sascha@40: 
sascha@88:     /**
sascha@88:      * Trivial implementation of innerPost() which is called by
sascha@88:      * #post(Representation) which simply calls super.post(Representation).
sascha@88:      * This should be overwritten by subclasses which need POST support.
sascha@88:      * @param requestRepr The incoming representation of the request.
sascha@88:      * @return The representation produced by super.post(Representation).
sascha@88:      * @throws ResourceException Thrown if something went wrong during
sascha@88:      * request processing.
sascha@88:      */
sascha@40:     protected Representation innerPost(Representation requestRepr)
sascha@40:     throws    ResourceException
sascha@40:     {
sascha@40:         return super.post(requestRepr);
sascha@40:     }
sascha@40: 
sascha@88:     /**
sascha@88:      * Wrapper around get() of the super class to handle some exceptions
sascha@88:      * and do the corresponing logging. The call is bridged to #innerGet()
sascha@88:      * which should be overwritten by subclasses.
sascha@88:      * @return The representation produced by #innerGet()
sascha@88:      * @throws ResourceException Thrown if something went wrong during
sascha@88:      * request processing.
sascha@88:      */
sascha@88:     @Override
sascha@47:     protected Representation get()
sascha@40:     throws    ResourceException
sascha@40:     {
sascha@40:         try {
sascha@40:             return innerGet();
sascha@40:         }
sascha@40:         catch (ResourceException re) {
sascha@40:             throw re;
sascha@40:         }
sascha@40:         catch (RuntimeException re) {
sascha@40:             logger.error(re.getLocalizedMessage(), re);
sascha@40:             throw re;
sascha@40:         }
sascha@40:     }
sascha@40: 
sascha@88:     /**
sascha@88:      * Trivial implementaion of innerGet() which simply calls
sascha@88:      * super.get() to produce some output representation. This method
sascha@88:      * should be overwritten by subclasses which need GET support.
sascha@88:      * @return The representation produced by super.get().
sascha@88:      * @throws ResourceException Thrown if something went wrong during
sascha@88:      * request processing.
sascha@88:      */
sascha@40:     protected Representation innerGet()
sascha@40:     throws    ResourceException
sascha@40:     {
sascha@40:         return super.get();
sascha@40:     }
sascha@48: 
sascha@88:     /**
sascha@88:      * Returns meta information (preferred languages et. al.)
sascha@88:      * of the current HTTP request.
sascha@88:      * @return the meta information
sascha@88:      */
sascha@48:     protected CallMeta getCallMeta() {
sascha@48:         ClientInfo clientInfo = getClientInfo();
sascha@48: 
sascha@48:         List<Preference<Language>> pl = clientInfo.getAcceptedLanguages();
sascha@48: 
sascha@48:         PreferredLocale [] languages = new PreferredLocale[pl.size()];
sascha@48: 
sascha@48:         int index = 0;
sascha@48: 
sascha@94:         for (Preference<Language> p: pl) {
sascha@48:             String lang    = p.getMetadata().getName();
sascha@48:             float  quality = p.getQuality();
sascha@86:             languages[index++] = new DefaultPreferredLocale(lang, quality);
sascha@48:         }
sascha@48: 
sascha@48:         return new DefaultCallMeta(languages);
sascha@48:     }
sascha@40: }
sascha@88: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :