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:
tim@12: package de.intevation.gnv.action;
sascha@683:
tim@12: import java.util.ArrayList;
tim@12: import java.util.Collection;
tim@12: import java.util.Iterator;
ingo@706: import java.util.Locale;
ingo@395: import java.util.Map;
tim@12:
tim@12: import javax.servlet.http.HttpServletRequest;
tim@12: import javax.servlet.http.HttpServletResponse;
tim@12:
tim@12: import org.apache.log4j.Logger;
tim@12: import org.apache.struts.action.ActionForm;
tim@12: import org.apache.struts.action.ActionForward;
tim@12: import org.apache.struts.action.ActionMapping;
tim@12:
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.ArtifactDatabaseInputException;
tim@963: import de.intevation.gnv.artifactdatabase.objects.ArtifactDescription;
tim@963: import de.intevation.gnv.artifactdatabase.objects.DefaultInputParameter;
tim@963: import de.intevation.gnv.artifactdatabase.objects.InputParameter;
tim@963:
tim@12: /**
ingo@690: * This controller feeds the artifact server with the current input data and
ingo@690: * refreshes the gui with the current artifact description after the next state
ingo@690: * is reached.
sascha@699: *
sascha@684: * @author Tim Englich
sascha@684: * @author Ingo Weinzierl
tim@12: */
ingo@409: public class NextArtifactStepAction extends DescribeUIAction {
ingo@408:
tim@12: /**
tim@12: * the logger, used to log exceptions and additonaly information
tim@12: */
tim@36: private static Logger log = Logger
tim@36: .getLogger(SelectArtifactFactoryAction.class);
tim@36:
tim@12: /**
tim@12: * Constructor
tim@12: */
tim@12: public NextArtifactStepAction() {
tim@12: super();
tim@12: }
tim@12:
tim@12: @Override
tim@12: public ActionForward execute(ActionMapping mapping, ActionForm form,
tim@38: HttpServletRequest request,
tim@38: HttpServletResponse response) throws Exception {
tim@34: log.debug("NextArtifactStepAction.execute");
tim@36: SessionModel sm = SessionModelFactory.getInstance()
tim@36: .getSessionModel(request);
tim@34: ArtifactDescription ad = sm.getArtifactDescription();
ingo@706:
ingo@706: Locale tmp = sm.getCurrentLocale();
ingo@706: Locale locale = tmp != null ? tmp : request.getLocale();
ingo@706:
tim@163: if (ad != null){
tim@163: Collection inputParameter = ad.getInputParameter();
tim@163: Collection ips = null;
tim@163: if (inputParameter != null) {
tim@163: ips = new ArrayList(inputParameter.size());
tim@163: Iterator it = inputParameter.iterator();
tim@163: while (it.hasNext()) {
tim@163: String name = it.next();
tim@163: String[] values = request.getParameterValues(name);
tim@163: InputParameter ip = new DefaultInputParameter(name, values);
tim@163: ips.add(ip);
tim@154: }
tim@154: }
tim@163: ArtifactDatabaseClient adc = ArtifactDatabaseClientFactory
ingo@706: .getInstance().getArtifactDatabaseClient(locale);
ingo@706:
ingo@395: Map outs = ad.getOutputModes();
ingo@395: if (outs == null || outs.isEmpty()) {
tim@163: // TODO: Woher kommt der zu erreichende Status;
tim@163: String target = null;
tim@163: if (ad.getReachableStates().size() > 1) {
tim@163: target = request.getParameter("product"); // TODO HACK for
tim@163: // Propducts every
tim@163: // other Step has
tim@163: // currently only
tim@163: // one reachable
tim@163: // state.
tim@163: } else {
tim@163: target = ad.getReachableStates().iterator().next();
tim@163: }
sascha@681:
tim@163: try {
ingo@409: adc.doNextStep(
sascha@681: sm.getSelectedArtifactFactory(),
ingo@409: sm.getCurrentArtifact(),
ingo@409: target,
ingo@409: ips
ingo@409: );
ingo@665: }
ingo@665: catch (ArtifactDatabaseInputException e) {
ingo@1008: log.error(e, e);
tim@163: request.setAttribute(
ingo@665: CommunicationKeys.REQUEST_EXCEPTION_INPUT_ID,
ingo@665: e.getMessage());
ingo@665: }
ingo@665: catch (Exception e) {
ingo@665: log.error(e, e);
ingo@665: request.setAttribute(
ingo@665: CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID,
ingo@665: e.getMessage());
tim@163: }
sascha@681:
ingo@395: Map tmpOuts = ad.getOutputModes();
ingo@395: request.setAttribute(
ingo@395: "furthertargets",
ingo@1008: tmpOuts == null || tmpOuts.isEmpty()
ingo@395: );
tim@163: } else {
tim@163: try{
ingo@409: adc.getCurrentStepDescription(
ingo@408: sm.getSelectedArtifactFactory(),
ingo@408: sm.getCurrentArtifact(),
ingo@408: true
ingo@408: );
sascha@681:
tim@163: request.setAttribute("diagramm", true);
sascha@681:
ingo@665: }
ingo@665: catch (ArtifactDatabaseInputException e) {
ingo@665: log.error(e, e);
ingo@665: request.setAttribute(
ingo@665: CommunicationKeys.REQUEST_EXCEPTION_INPUT_ID,
ingo@665: e.getMessage());
ingo@665: }
ingo@665: catch (Exception e) {
tim@163: log.error(e, e);
tim@163: request.setAttribute(
ingo@409: CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID,
ingo@409: e.getMessage());
tim@163: }
sascha@681:
ingo@1008: request.setAttribute("furthertargets", false);
tim@150: }
tim@163: }else{
tim@163: log.warn("SessionTimeout has occured");
ingo@991: return sessionExhaustedForward(mapping, form, request, response);
tim@34: }
tim@34: return super.execute(mapping, form, request, response);
tim@12: }
tim@12:
tim@12: }
ingo@409: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :