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@409: package de.intevation.gnv.action; ingo@409: ingo@706: import java.util.Locale; ingo@703: import java.util.ResourceBundle; ingo@703: ingo@409: import javax.servlet.http.HttpServletRequest; ingo@409: import javax.servlet.http.HttpServletResponse; ingo@991: import javax.servlet.http.HttpSession; ingo@409: import javax.xml.xpath.XPathConstants; ingo@409: ingo@409: import org.apache.log4j.Logger; ingo@682: import org.apache.struts.Globals; ingo@409: import org.apache.struts.action.ActionForm; ingo@409: import org.apache.struts.action.ActionForward; ingo@409: import org.apache.struts.action.ActionMapping; tim@963: import org.w3c.dom.Node; ingo@409: 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.objects.ArtifactDescription; tim@963: import de.intevation.gnv.artifactdatabase.objects.ArtifactObject; tim@963: import de.intevation.gnv.util.ArtifactNamespaceContext; tim@963: import de.intevation.gnv.util.XMLUtils; tim@963: import de.intevation.gnv.util.XSLTransformer; ingo@409: ingo@409: /** ingo@690: * This controller is called to fetch the current artifact description using the ingo@690: * describe operation. The describe document is used to feed an XSL transformer ingo@690: * that parses the xml and creats html output representing the parameter panel. ingo@690: * The html code is stored as attribute on the request object which is queried ingo@690: * in a jsp page later. sascha@699: * sascha@684: * @author Ingo Weinzierl ingo@409: */ ingo@409: public class DescribeUIAction extends ArtifactDatabaseActionBase { ingo@409: ingo@409: public static final String XPATH_DYNAMIC_UI = "art:dynamic"; ingo@409: public static final String XPATH_STATIC_UI = "art:static"; ingo@409: ingo@409: public static final String XSL_SHEET_DYNAMIC = ingo@409: "WEB-INF/config/templates/describe-ui.xsl"; ingo@409: ingo@409: public static final String XSL_SHEET_STATIC = ingo@409: "WEB-INF/config/templates/describe-ui-static.xsl"; ingo@409: tim@963: /** tim@963: * the logger, used to log exceptions and additonaly information tim@963: */ ingo@409: private static Logger logger = Logger.getLogger(DescribeUIAction.class); ingo@409: ingo@409: tim@963: /** tim@963: * Constructor tim@963: */ ingo@409: public DescribeUIAction() { ingo@409: super(); ingo@409: } ingo@409: ingo@409: ingo@409: @Override ingo@409: public ActionForward execute( ingo@409: ActionMapping mapping, ingo@409: ActionForm form, ingo@409: HttpServletRequest request, ingo@409: HttpServletResponse response ingo@409: ) throws Exception ingo@409: { ingo@991: if (isSessionExhausted(request)) { ingo@991: // session timed out before ingo@991: return sessionExhaustedForward(mapping, form, request, response); ingo@991: } ingo@991: ingo@409: logger.info("describe user interface"); ingo@409: try { ingo@409: // render describe document and create user interface ingo@409: SessionModel sm = SessionModelFactory.getInstance().getSessionModel( ingo@409: request); ingo@706: Locale tmp = sm.getCurrentLocale(); ingo@706: Locale locale = tmp != null ? tmp : request.getLocale(); ingo@409: ingo@409: ArtifactDatabaseClient adc = ArtifactDatabaseClientFactory ingo@706: .getInstance().getArtifactDatabaseClient(locale); ingo@706: request.getSession().setAttribute(Globals.LOCALE_KEY, locale); ingo@715: ArtifactObject artifactFactory = sm.getSelectedArtifactFactory(); ingo@715: ingo@715: if (artifactFactory == null) { ingo@715: logger.error("No connection to artifact server."); ingo@715: request.setAttribute( ingo@715: CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID, ingo@715: "java.io.ioexception..connection.refused"); ingo@715: ingo@715: return super.getExceptionForward(mapping); ingo@715: } ingo@409: ingo@409: ArtifactDescription artifactDescription = ingo@409: adc.getCurrentStepDescription( ingo@715: artifactFactory, ingo@409: sm.getCurrentArtifact(), ingo@409: true); ingo@409: ingo@409: Node currentUI = artifactDescription.getCurrentUI(); ingo@409: if (currentUI != null) { ingo@703: ResourceBundle res = ResourceBundle.getBundle( ingo@706: "applicationMessages", locale); ingo@1008: String editText = res.getString( ingo@966: "gnviewer.history.back.button"); ingo@966: String exampleLinestring = res.getString( ingo@966: "gnviewer.example.linestring"); ingo@966: String examplePolygon = res.getString( ingo@966: "gnviewer.example.polygon"); ingo@703: ingo@409: XSLTransformer transformer = new XSLTransformer(); ingo@409: ingo@409: String url = response.encodeURL( ingo@409: mapping.findForward("back").getPath()); ingo@409: transformer.addParameter("back-url", url); ingo@703: transformer.addParameter("edit", editText); ingo@966: transformer.addParameter("example-polygon", examplePolygon); ingo@966: transformer.addParameter( ingo@966: "example-linestring", ingo@966: exampleLinestring); ingo@409: ingo@409: String fisUrl = response.encodeURL( ingo@409: mapping.findForward("selectfis").getPath()); ingo@409: transformer.addParameter("selectfis", fisUrl); ingo@409: ingo@409: // fetch dynamic part from describe document and transform it ingo@409: Node dynamicNode = (Node) XMLUtils.xpath( ingo@409: currentUI, ingo@409: XPATH_DYNAMIC_UI, ingo@409: XPathConstants.NODE, ingo@409: ArtifactNamespaceContext.INSTANCE ingo@409: ); ingo@409: ingo@409: String ui = transformer.transform( ingo@1008: dynamicNode, ingo@409: "UTF-8", ingo@1008: request.getRealPath(XSL_SHEET_DYNAMIC ingo@1008: )); ingo@409: ingo@409: if (ui != null && ui.length() > 1) ingo@409: request.setAttribute("ui", ui); ingo@409: ingo@409: // fetch static part from describe document and transform it ingo@409: Node staticNode = (Node) XMLUtils.xpath( ingo@409: currentUI, ingo@409: XPATH_STATIC_UI, ingo@409: XPathConstants.NODE, ingo@409: ArtifactNamespaceContext.INSTANCE ingo@409: ); ingo@409: ingo@409: String staticUI = transformer.transform( ingo@409: staticNode, ingo@409: "UTF-8", ingo@409: request.getRealPath(XSL_SHEET_STATIC)); ingo@409: ingo@409: if (staticUI != null && staticUI.length() > 1) sascha@681: request.setAttribute("staticui", staticUI); ingo@409: } ingo@409: ingo@409: return super.execute(mapping, form, request, response); ingo@409: } ingo@409: catch (Exception e) { ingo@409: logger.error(e, e); ingo@409: request.setAttribute( ingo@409: CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID, ingo@409: e.getMessage()); ingo@409: ingo@409: return super.getExceptionForward(mapping); ingo@409: } ingo@409: } ingo@409: } ingo@409: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :