ingo@1022: /* ingo@1022: * Copyright (c) 2010 by Intevation GmbH ingo@1022: * ingo@1022: * This program is free software under the LGPL (>=v2.1) ingo@1022: * Read the file LGPL.txt coming with the software for details ingo@1022: * or visit http://www.gnu.org/licenses/ if it does not exist. ingo@1022: */ ingo@1022: ingo@670: package de.intevation.gnv.action; ingo@670: sascha@683: import java.io.IOException; ingo@670: import java.io.InputStream; ingo@673: import java.util.List; ingo@670: ingo@670: import javax.servlet.http.HttpServletRequest; ingo@670: import javax.servlet.http.HttpServletResponse; ingo@670: ingo@670: import org.apache.commons.fileupload.FileItemIterator; ingo@670: import org.apache.commons.fileupload.FileItemStream; ingo@670: import org.apache.commons.fileupload.servlet.ServletFileUpload; ingo@670: import org.apache.log4j.Logger; ingo@670: import org.apache.struts.action.ActionForm; ingo@670: import org.apache.struts.action.ActionForward; ingo@673: import org.apache.struts.action.ActionMapping; tim@963: import org.w3c.dom.Document; ingo@670: tim@963: import de.intevation.gnv.action.sessionmodel.SessionModel; tim@963: import de.intevation.gnv.action.sessionmodel.SessionModelFactory; tim@963: import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient; tim@963: import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClientFactory; tim@963: import de.intevation.gnv.artifactdatabase.client.exception.ArtifactDatabaseClientException; tim@963: import de.intevation.gnv.artifactdatabase.objects.Artifact; tim@963: import de.intevation.gnv.artifactdatabase.objects.ArtifactFactory; tim@963: import de.intevation.gnv.util.ArtifactNamespaceContext; tim@963: import de.intevation.gnv.util.XMLUtils; ingo@670: ingo@670: /** ingo@690: * This controller is called for reloading projects from xml files. It waits for ingo@690: * an xml document named 'document' and feeds the artifact server with this ingo@690: * document. After a successful feed, the artifact description is fetched and ingo@690: * displayed in the gui. sascha@699: * sascha@684: * @author Ingo Weinzierl ingo@670: */ ingo@670: public class LoadAction extends ArtifactDatabaseActionBase { ingo@670: ingo@673: public static final String RESOURCE_UPLOAD_FAILURE = "upload.failure"; ingo@673: public static final String RESOURCE_INVALID_ARTIFACT = "invalid.artifact"; ingo@670: tim@963: /** tim@963: * the logger, used to log exceptions and additonaly information tim@963: */ ingo@670: private static Logger logger = Logger.getLogger(LoadAction.class); ingo@670: tim@963: /** tim@963: * Constructor tim@963: */ ingo@670: public LoadAction() { ingo@670: super(); ingo@670: } ingo@670: tim@963: @Override ingo@670: public ActionForward execute( ingo@670: ActionMapping mapping, ingo@670: ActionForm form, ingo@670: HttpServletRequest request, ingo@670: HttpServletResponse response) ingo@670: throws Exception ingo@670: { ingo@991: if (isSessionExhausted(request)) { ingo@991: return sessionExhaustedForward(mapping, form, request, response); ingo@991: } ingo@991: ingo@670: logger.info("Import artifact."); ingo@670: ingo@670: ServletFileUpload upload = new ServletFileUpload(); ingo@670: Document artifactDocument = null; ingo@670: ingo@673: try { ingo@673: FileItemIterator iter = upload.getItemIterator(request); ingo@673: while (iter.hasNext()) { ingo@673: FileItemStream item = (FileItemStream) iter.next(); ingo@673: String name = item.getFieldName(); ingo@670: ingo@673: // the file input field of our form is named 'document' ingo@673: if (name.equals("document")) { ingo@673: InputStream stream = item.openStream(); ingo@673: ingo@673: if (stream.available() == 0) { ingo@673: logger.error("No artifact document found."); ingo@673: request.setAttribute( ingo@673: CommunicationKeys.REQUEST_EXCEPTION_PROJECT, ingo@673: RESOURCE_UPLOAD_FAILURE); ingo@673: ingo@673: return super.getExceptionForward(mapping); ingo@673: } ingo@673: ingo@673: artifactDocument = XMLUtils.readDocument(stream); ingo@673: if (artifactDocument == null) { ingo@673: request.setAttribute( ingo@673: CommunicationKeys.REQUEST_EXCEPTION_PROJECT, ingo@673: RESOURCE_INVALID_ARTIFACT); ingo@673: ingo@673: return super.getExceptionForward(mapping); ingo@673: } ingo@673: ingo@714: try { ingo@714: ArtifactDatabaseClientFactory adcf = ingo@714: ArtifactDatabaseClientFactory.getInstance(); ingo@714: ArtifactDatabaseClient adc = ingo@714: adcf.getArtifactDatabaseClient(getLocale(request)); ingo@714: ArtifactFactory factory = (ArtifactFactory) ingo@714: (( List)adc.getArtifactFactories()).get(0); ingo@673: ingo@714: SessionModelFactory sf = ingo@714: SessionModelFactory.getInstance(); ingo@714: SessionModel sm = sf.getSessionModel(request); ingo@714: sm.selectArtifactFactory(factory.getId()); ingo@673: ingo@714: Document describe = adc.doImport( ingo@714: factory, ingo@714: artifactDocument); ingo@673: ingo@714: String uuid = XMLUtils.xpathString( ingo@714: describe, ingo@714: "/art:result/art:uuid/@value", ingo@714: ArtifactNamespaceContext.INSTANCE); ingo@714: String hash = XMLUtils.xpathString( ingo@714: describe, ingo@714: "/art:result/art:hash/@value", ingo@714: ArtifactNamespaceContext.INSTANCE); ingo@714: ingo@714: Artifact artifact = new Artifact(uuid, hash); ingo@714: sm.setCurrentArtifact(artifact); ingo@714: ingo@714: if (logger.isDebugEnabled()) { ingo@714: logger.debug( ingo@714: "Imported artifact UUID: "+artifact.getId()); ingo@714: logger.debug( ingo@714: "Imported artifact HASH: "+artifact.getHash()); ingo@714: } ingo@714: } ingo@714: catch (ArtifactDatabaseClientException adce) { ingo@714: logger.error(adce, adce); ingo@714: request.setAttribute( ingo@714: CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID, ingo@714: adce.getMessage()); ingo@714: ingo@714: // XXX ingo@714: return super.getExceptionForward(mapping); ingo@673: } ingo@673: ingo@673: return new DescribeUIAction().execute( ingo@673: mapping, form, request, response); ingo@673: } ingo@670: } ingo@670: } ingo@673: catch (IOException ioe) { ingo@673: logger.error(ioe, ioe); ingo@670: request.setAttribute( ingo@670: CommunicationKeys.REQUEST_EXCEPTION_PROJECT, ingo@673: ioe.getMessage()); ingo@670: ingo@670: return super.getExceptionForward(mapping); ingo@670: } ingo@670: ingo@673: // no document found or not valid ingo@673: logger.error("Upload failure: No document found or invalid."); ingo@673: ingo@673: request.setAttribute( ingo@673: CommunicationKeys.REQUEST_EXCEPTION_PROJECT, ingo@673: RESOURCE_UPLOAD_FAILURE); ingo@673: ingo@673: return super.getExceptionForward(mapping); ingo@670: } ingo@670: } ingo@670: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :