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@21: package de.intevation.artifactdatabase.rest;
sascha@21: 
sascha@207: import de.intevation.artifacts.common.utils.XMLUtils;
sascha@93: 
sascha@93: import de.intevation.artifacts.ArtifactDatabase;
sascha@93: import de.intevation.artifacts.ArtifactDatabaseException;
sascha@93: import de.intevation.artifacts.ArtifactNamespaceContext;
sascha@93: 
sascha@21: import java.io.IOException;
sascha@21: 
tim@75: import org.apache.log4j.Logger;
sascha@93: 
ingo@101: import org.restlet.Response;
ingo@101: 
tim@75: import org.restlet.data.MediaType;
tim@75: import org.restlet.data.Status;
sascha@93: 
tim@75: import org.restlet.ext.xml.DomRepresentation;
sascha@93: 
tim@75: import org.restlet.representation.EmptyRepresentation;
tim@75: import org.restlet.representation.Representation;
tim@75: 
sascha@93: import org.restlet.resource.ResourceException;
sascha@93: 
sascha@93: import org.w3c.dom.Document;
sascha@26: 
sascha@21: /**
sascha@88:  * Resource to create a new artifact within artifact database.
sascha@77:  * @author <a href="mailto:sascha.teichmann@intevation">Sascha L. Teichmann</a>
sascha@21:  */
sascha@21: public class CreateResource
sascha@40: extends      BaseResource
sascha@21: {
sascha@21:     private static Logger logger = Logger.getLogger(CreateResource.class);
sascha@21: 
sascha@88:     /**
sascha@88:      * server URL where to reach the resource.
sascha@88:      */
sascha@21:     public static final String PATH = "/create";
sascha@21: 
sascha@88:     /**
sascha@88:      * XPATH to figure out the name of the factory which should be used
sascha@88:      * to create the new artifact.
sascha@88:      */
ingo@65:     public static final String XPATH_FACTORY = "/art:action/art:factory/@name";
sascha@26: 
sascha@88:     /**
sascha@88:      * Error message if no factory was given.
sascha@88:      */
sascha@26:     public static final String NO_FACTORY_MESSAGE = "No factory given";
sascha@26: 
sascha@88:     /**
sascha@88:      * Error message if no artifact was created.
sascha@88:      */
sascha@26:     public static final String NO_ARTIFACT_CREATED = "No artifact created";
sascha@26: 
sascha@89:     @Override
sascha@40:     protected Representation innerPost(Representation requestRepr)
sascha@40:     throws ResourceException
sascha@40:     {
sascha@21:         Document inputDocument = null;
sascha@21:         try {
sascha@21:             DomRepresentation input = new DomRepresentation(requestRepr);
ingo@65:             input.setNamespaceAware(true);
sascha@21:             inputDocument = input.getDocument();
sascha@21:         }
sascha@21:         catch (IOException ioe) {
sascha@21:             logger.error(ioe.getMessage());
sascha@21:             Response response = getResponse();
sascha@21:             response.setStatus(Status.CLIENT_ERROR_BAD_REQUEST, ioe);
sascha@21:             return new EmptyRepresentation();
sascha@21:         }
sascha@26: 
sascha@26:         String factory = XMLUtils.xpathString(
sascha@26:             inputDocument,
sascha@26:             XPATH_FACTORY,
sascha@26:             ArtifactNamespaceContext.INSTANCE);
sascha@26: 
sascha@26:         if (factory == null || factory.length() == 0) {
sascha@26:             Response response = getResponse();
sascha@32:             response.setStatus(
sascha@32:                 Status.CLIENT_ERROR_BAD_REQUEST, NO_FACTORY_MESSAGE);
sascha@26:             return new EmptyRepresentation();
sascha@26:         }
sascha@26: 
sascha@26:         if (logger.isDebugEnabled()) {
sascha@26:             logger.debug("Create artifact with factory '" + factory + "'");
sascha@26:         }
sascha@26: 
ingo@131:         ArtifactDatabase db = getArtifactDatabase();
sascha@26: 
sascha@32:         try {
sascha@32:             return new DomRepresentation(
sascha@32:                 MediaType.APPLICATION_XML,
sascha@86:                 db.createArtifactWithFactory(factory,
tim@75:                                              getCallMeta(),
tim@75:                                              inputDocument));
sascha@32:         }
sascha@32:         catch (ArtifactDatabaseException adbe) {
sascha@26:             Response response = getResponse();
sascha@32:             response.setStatus(
sascha@32:                 Status.CLIENT_ERROR_UNPROCESSABLE_ENTITY, adbe.getMessage());
sascha@26:             return new EmptyRepresentation();
sascha@26:         }
sascha@21:     }
sascha@21: }
sascha@91: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :