view gnv/src/main/java/de/intevation/gnv/action/LoadAction.java @ 1022:28a0628b11b0

Added license file and license header. gnv/trunk@1258 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Tue, 02 Nov 2010 17:15:08 +0000
parents 33198e55371c
children
line wrap: on
line source
/*
 * Copyright (c) 2010 by Intevation GmbH
 *
 * This program is free software under the LGPL (>=v2.1)
 * Read the file LGPL.txt coming with the software for details
 * or visit http://www.gnu.org/licenses/ if it does not exist.
 */

package de.intevation.gnv.action;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.w3c.dom.Document;

import de.intevation.gnv.action.sessionmodel.SessionModel;
import de.intevation.gnv.action.sessionmodel.SessionModelFactory;
import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient;
import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClientFactory;
import de.intevation.gnv.artifactdatabase.client.exception.ArtifactDatabaseClientException;
import de.intevation.gnv.artifactdatabase.objects.Artifact;
import de.intevation.gnv.artifactdatabase.objects.ArtifactFactory;
import de.intevation.gnv.util.ArtifactNamespaceContext;
import de.intevation.gnv.util.XMLUtils;

/**
 * This controller is called for reloading projects from xml files. It waits for
 * an xml document named 'document' and feeds the artifact server with this
 * document. After a successful feed, the artifact description is fetched and
 * displayed in the gui.
 *
 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
 */
public class LoadAction extends ArtifactDatabaseActionBase {

    public static final String RESOURCE_UPLOAD_FAILURE   = "upload.failure";
    public static final String RESOURCE_INVALID_ARTIFACT = "invalid.artifact";

    /**
     * the logger, used to log exceptions and additonaly information
     */
    private static Logger logger = Logger.getLogger(LoadAction.class);

    /**
     * Constructor
     */
    public LoadAction() {
        super();
    }

    @Override
    public ActionForward execute(
        ActionMapping       mapping,
        ActionForm          form,
        HttpServletRequest  request,
        HttpServletResponse response)
    throws Exception
    {
        if (isSessionExhausted(request)) {
            return sessionExhaustedForward(mapping, form, request, response);
        }

        logger.info("Import artifact.");

        ServletFileUpload upload  = new ServletFileUpload();
        Document artifactDocument = null;

        try {
            FileItemIterator iter = upload.getItemIterator(request);
            while (iter.hasNext()) {
                FileItemStream item = (FileItemStream) iter.next();
                String name         = item.getFieldName();

                // the file input field of our form is named 'document'
                if (name.equals("document")) {
                    InputStream stream = item.openStream();

                    if (stream.available() == 0) {
                        logger.error("No artifact document found.");
                        request.setAttribute(
                            CommunicationKeys.REQUEST_EXCEPTION_PROJECT,
                            RESOURCE_UPLOAD_FAILURE);

                        return super.getExceptionForward(mapping);
                    }

                    artifactDocument   = XMLUtils.readDocument(stream);
                    if (artifactDocument == null) {
                        request.setAttribute(
                            CommunicationKeys.REQUEST_EXCEPTION_PROJECT,
                            RESOURCE_INVALID_ARTIFACT);

                        return super.getExceptionForward(mapping);
                    }

                    try {
                        ArtifactDatabaseClientFactory adcf =
                            ArtifactDatabaseClientFactory.getInstance();
                        ArtifactDatabaseClient adc =
                            adcf.getArtifactDatabaseClient(getLocale(request));
                        ArtifactFactory factory = (ArtifactFactory)
                            (( List)adc.getArtifactFactories()).get(0);

                        SessionModelFactory sf =
                            SessionModelFactory.getInstance();
                        SessionModel        sm = sf.getSessionModel(request);
                        sm.selectArtifactFactory(factory.getId());

                        Document describe = adc.doImport(
                            factory,
                            artifactDocument);

                        String uuid = XMLUtils.xpathString(
                            describe,
                            "/art:result/art:uuid/@value",
                            ArtifactNamespaceContext.INSTANCE);
                        String hash = XMLUtils.xpathString(
                            describe,
                            "/art:result/art:hash/@value",
                            ArtifactNamespaceContext.INSTANCE);

                        Artifact artifact = new Artifact(uuid, hash);
                        sm.setCurrentArtifact(artifact);

                        if (logger.isDebugEnabled()) {
                            logger.debug(
                                "Imported artifact UUID: "+artifact.getId());
                            logger.debug(
                                "Imported artifact HASH: "+artifact.getHash());
                        }
                    }
                    catch (ArtifactDatabaseClientException adce) {
                        logger.error(adce, adce);
                        request.setAttribute(
                            CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID,
                            adce.getMessage());

                        // XXX
                        return super.getExceptionForward(mapping);
                    }

                    return new DescribeUIAction().execute(
                        mapping, form, request, response);
                }
            }
        }
        catch (IOException ioe) {
            logger.error(ioe, ioe);
            request.setAttribute(
                CommunicationKeys.REQUEST_EXCEPTION_PROJECT,
                ioe.getMessage());

            return super.getExceptionForward(mapping);
        }

        // no document found or not valid
        logger.error("Upload failure: No document found or invalid.");

        request.setAttribute(
            CommunicationKeys.REQUEST_EXCEPTION_PROJECT,
            RESOURCE_UPLOAD_FAILURE);

        return super.getExceptionForward(mapping);
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :

http://dive4elements.wald.intevation.org