# HG changeset patch # User Ingo Weinzierl # Date 1268993068 0 # Node ID 93b4dedc4e37374b3dca4fff72ab3692838b55ec # Parent e9d54c989110d51b2a43dc0d9cb143ea09c1b515 Implemented a mechanism to import artifacts from xml structured documents. gnv/trunk@801 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r e9d54c989110 -r 93b4dedc4e37 gnv/ChangeLog --- a/gnv/ChangeLog Fri Mar 19 08:51:45 2010 +0000 +++ b/gnv/ChangeLog Fri Mar 19 10:04:28 2010 +0000 @@ -1,3 +1,29 @@ +2010-03-19 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/action/LoadAction.java: Use the uploaded + file to start an artifact import. Create a new Artifact object if the + import was successful and fetch the current artifact description with user + interface part to restore the gui. Display an error message if something + failed while importing. + + * src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java, + src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java: + Added a new method doImport to import artifacts from xml documents. A + describe document without ui part is returned if an import was successful. + + * src/main/resources/applicationMessages.properties, + src/main/resources/applicationMessages_en.properties: Added error messages + for the case that something failed while importing artifacts from xml + documents. + + * src/main/webapp/WEB-INF/jsp/header.jsp: Replace whitespaces from exception + request parameter with dots. Exceptions thrown by the artifact server + corresponds to a specific resource key. Failures coming from the artifact + server are displayed language specific on this way. + + * src/main/webapp/WEB-INF/config/struts-config.xml: Added missing forwards + to import action. + 2010-03-19 Tim Englich * src/main/java/de/intevation/gnv/artifactdatabase/objects/ParametrizedArtifactFactory.java (addParameters): diff -r e9d54c989110 -r 93b4dedc4e37 gnv/src/main/java/de/intevation/gnv/action/LoadAction.java --- a/gnv/src/main/java/de/intevation/gnv/action/LoadAction.java Fri Mar 19 08:51:45 2010 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/action/LoadAction.java Fri Mar 19 10:04:28 2010 +0000 @@ -1,10 +1,17 @@ package de.intevation.gnv.action; -import de.intevation.gnv.propertiesreader.PropertiesReaderFactory; -import de.intevation.gnv.propertiesreader.PropertiesReader; +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.objects.Artifact; +import de.intevation.gnv.artifactdatabase.objects.ArtifactFactory; +import de.intevation.gnv.util.ArtifactNamespaceContext; import de.intevation.gnv.util.XMLUtils; import java.io.InputStream; +import java.io.IOException; +import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -17,7 +24,7 @@ import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; -import org.apache.struts.action.ActionMapping; +import org.apache.struts.action.ActionMapping; import org.w3c.dom.Document; @@ -26,7 +33,8 @@ */ public class LoadAction extends ArtifactDatabaseActionBase { - public static final String RESOURCE_UPLOAD_FAILURE = "upload.failure"; + public static final String RESOURCE_UPLOAD_FAILURE = "upload.failure"; + public static final String RESOURCE_INVALID_ARTIFACT = "invalid.artifact"; private static Logger logger = Logger.getLogger(LoadAction.class); @@ -46,32 +54,88 @@ ServletFileUpload upload = new ServletFileUpload(); Document artifactDocument = null; - FileItemIterator iter = upload.getItemIterator(request); - while (iter.hasNext()) { - FileItemStream item = (FileItemStream) iter.next(); - String name = item.getFieldName(); + try { + FileItemIterator iter = upload.getItemIterator(request); + while (iter.hasNext()) { + FileItemStream item = (FileItemStream) iter.next(); + String name = item.getFieldName(); - if (name.equals("document")) { - InputStream stream = item.openStream(); - artifactDocument = XMLUtils.readDocument(stream); + // 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); + } + + 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()); + } + + return new DescribeUIAction().execute( + mapping, form, request, response); + } } } - - // no document found or not valid - if (artifactDocument == null) { - logger.error("Upload failure: No document found or invalid."); - + catch (IOException ioe) { + logger.error(ioe, ioe); request.setAttribute( CommunicationKeys.REQUEST_EXCEPTION_PROJECT, - RESOURCE_UPLOAD_FAILURE); + ioe.getMessage()); return super.getExceptionForward(mapping); } - // TODO Do something with our nice xml document - // Use DescribeUI Action to set required attributes which are parsed in - // jsp files. - return super.execute(mapping, form, request, response); + // 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 : diff -r e9d54c989110 -r 93b4dedc4e37 gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java --- a/gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java Fri Mar 19 08:51:45 2010 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java Fri Mar 19 10:04:28 2010 +0000 @@ -10,6 +10,7 @@ import de.intevation.gnv.artifactdatabase.client.exception.ArtifactDatabaseClientException; import de.intevation.gnv.artifactdatabase.client.exception.ArtifactDatabaseInputException; import de.intevation.gnv.artifactdatabase.objects.ArtifactDescription; +import de.intevation.gnv.artifactdatabase.objects.ArtifactFactory; import de.intevation.gnv.artifactdatabase.objects.ArtifactObject; import de.intevation.gnv.artifactdatabase.objects.ArtifactStatisticsSet; import de.intevation.gnv.artifactdatabase.objects.InputParameter; @@ -115,6 +116,12 @@ OutputStream out) throws ArtifactDatabaseClientException; + + public Document doImport( + ArtifactFactory factory, + Document document) + throws ArtifactDatabaseClientException, IOException; + /** * @param factory * @param artifact diff -r e9d54c989110 -r 93b4dedc4e37 gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java --- a/gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java Fri Mar 19 08:51:45 2010 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java Fri Mar 19 10:04:28 2010 +0000 @@ -257,9 +257,6 @@ */ private InputStream doPostRequest(String requestUrl, Document requestBody) throws IOException { - log.debug("##################################################"); - log.debug(new XMLUtils().writeDocument2String(requestBody)); - log.debug("##################################################"); Client client = new Client(Protocol.HTTP); Request request = initialize(new Request(Method.POST, requestUrl)); String documentBody = new XMLUtils().writeDocument2String(requestBody); @@ -394,6 +391,7 @@ throws ArtifactDatabaseClientException, ArtifactDatabaseInputException { try { String url = this.getArtifactUrl(artifactFactory, currentArtifact); + log.debug("DESCRIBE URL: " + url); Document request = this.createDescribeRequestBody(currentArtifact, includeUI); InputStream describeResult = this.doPostRequest(url, request); @@ -729,17 +727,13 @@ throws ArtifactDatabaseClientException { try { - //String url = getArtifactUrl(artifactFactory, currentArtifact); String url = ((ArtifactFactory) artifactFactory).getDataBaseUrl(); url += "/export/" + currentArtifact.getId(); - log.debug("+++++++++++++++++++++++++++++++++++++++++++++++++++++++"); - log.debug("REQUEST: " + url); Document response = doGetRequest(url); XMLUtils.toStream(response, out); } catch (Exception e) { - log.debug("THIS IS MY ERROR."); log.error(e, e); throw new ArtifactDatabaseClientException(e); } @@ -747,6 +741,18 @@ } + public Document doImport( + ArtifactFactory factory, + Document document) + throws ArtifactDatabaseClientException, IOException + { + String url = factory.getDataBaseUrl() + "/import"; + InputStream response = doPostRequest(url, document); + + return XMLUtils.readDocument(response); + } + + private Document createOutRequestBody( ArtifactObject currentArtifact, String target, diff -r e9d54c989110 -r 93b4dedc4e37 gnv/src/main/resources/applicationMessages.properties --- a/gnv/src/main/resources/applicationMessages.properties Fri Mar 19 08:51:45 2010 +0000 +++ b/gnv/src/main/resources/applicationMessages.properties Fri Mar 19 10:04:28 2010 +0000 @@ -104,3 +104,6 @@ input.not.a.double= ist keine g\u00fcltige Flie\u00dfkommazahl. Bitte versuchen Sie es erneut. upload.failure=Beim Hochladen der Datei ist ein Fehler aufgetreten. no.artifact.chosen=Es ist noch kein FIS gew\u00e4hlt. +invalid.artifact=Ung\u00fcltiges Artefakt Dokument gefunden. +mismatching.checksum=Ung\u00fcltiges Artefakt Dokument gefunden. +no.such.factory=Ung\u00fcltiges Artefakt Dokument gefunden. diff -r e9d54c989110 -r 93b4dedc4e37 gnv/src/main/resources/applicationMessages_en.properties --- a/gnv/src/main/resources/applicationMessages_en.properties Fri Mar 19 08:51:45 2010 +0000 +++ b/gnv/src/main/resources/applicationMessages_en.properties Fri Mar 19 10:04:28 2010 +0000 @@ -102,3 +102,6 @@ input.not.a.double= is not a valid floating-point number. Please try again. upload.failure=An error occured while uploading file. no.artifact.chosen=No fis selected yet. +invalid.artifact=Invalid artifact found. +mismatching.checksum=Invalid artifact found. +no.such.factory=Invalid artifact found. diff -r e9d54c989110 -r 93b4dedc4e37 gnv/src/main/webapp/WEB-INF/config/struts-config.xml --- a/gnv/src/main/webapp/WEB-INF/config/struts-config.xml Fri Mar 19 08:51:45 2010 +0000 +++ b/gnv/src/main/webapp/WEB-INF/config/struts-config.xml Fri Mar 19 10:04:28 2010 +0000 @@ -54,6 +54,12 @@ + + <%@page import="de.intevation.gnv.action.CommunicationKeys"%>