# HG changeset patch # User Ingo Weinzierl # Date 1266946996 0 # Node ID bd67164cf28baf7c7d47925d8348596a5d75d2b8 # Parent 3f7bbc6dc7514c4c7891838b0d9827743548ea0b Devided actions and exports. Adjusted output and export actions. gnv/trunk@704 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r 3f7bbc6dc751 -r bd67164cf28b gnv/ChangeLog --- a/gnv/ChangeLog Tue Feb 23 15:26:50 2010 +0000 +++ b/gnv/ChangeLog Tue Feb 23 17:43:16 2010 +0000 @@ -1,3 +1,38 @@ +2010-02-23 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultOutputMode.java, + src/main/java/de/intevation/gnv/artifactdatabase/objects/OutputMode.java: + New method returning export modes. + + * src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultExportMode.java, + src/main/java/de/intevation/gnv/artifactdatabase/objects/ExportMode.java: + Object storing information about mime-type, description and name of an + export mode. + + * src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java: + Parse export modes from describe document and put them into OutputMode + objects. + + * src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java: Now, this + action is able to adjust histogram parameter as well. + + * src/main/java/de/intevation/gnv/action/DoExportAction.java: An export is + triggered regarding a new parameter 'mode' which value can be 'pdf', + 'svg' or 'img'. Before, we just took care on 'target' parameter. + + * src/main/resources/applicationMessages.properties, + src/main/resources/applicationMessages_en.properties: Transformed draw + button into an update button. + + * src/main/webapp/images/arrow_refresh.png: Icon for update button. (source: + famfamfam) + + * src/main/webapp/WEB-INF/jsp/includes/display_histogram_options_inc.jsp, + src/main/webapp/WEB-INF/jsp/includes/display_diagramm_options_inc.jsp, + src/main/webapp/WEB-INF/jsp/includes/display_export_inc.jsp: Moved + exports from action panel into options panel. Actions (chart, histogram, + etc) are devided from exports (png, pdf, svg). + 2010-02-23 Ingo Weinzierl * src/main/webapp/WEB-INF/config/struts-config.xml: Foward to wmslayout.jsp @@ -7,6 +42,9 @@ client (OpenLayers). JavaScript loading take place in this page. If the user select the wms target, a forward to this page will be done. + TODO: Include OpenLayers library from local filesystem instead of loading + it from openlayers.org! + * src/main/webapp/WEB-INF/jsp/mainlayout.jsp: Removed OpenLayers JavaScript library and function to initialize OpenLayers. This reduces traffic while parameterization. diff -r 3f7bbc6dc751 -r bd67164cf28b gnv/src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java --- a/gnv/src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java Tue Feb 23 15:26:50 2010 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java Tue Feb 23 17:43:16 2010 +0000 @@ -79,7 +79,7 @@ request.setAttribute("furthertargets", true); } else { - request.setAttribute("chart", true); + request.setAttribute(target, true); } return super.execute(mapping, form, request, response); diff -r 3f7bbc6dc751 -r bd67164cf28b gnv/src/main/java/de/intevation/gnv/action/DoExportAction.java --- a/gnv/src/main/java/de/intevation/gnv/action/DoExportAction.java Tue Feb 23 15:26:50 2010 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/action/DoExportAction.java Tue Feb 23 17:43:16 2010 +0000 @@ -8,11 +8,38 @@ import org.apache.log4j.Logger; +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.DefaultInputParameter; +import de.intevation.gnv.artifactdatabase.objects.ExportMode; +import de.intevation.gnv.artifactdatabase.objects.InputParameter; +import de.intevation.gnv.artifactdatabase.objects.OutputMode; +import de.intevation.gnv.artifactdatabase.objects.OutputParameter; + +import java.io.OutputStream; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; + +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; + /** * @author Tim Englich * */ -public class DoExportAction extends DoOutputAction { +public class DoExportAction extends ArtifactDatabaseActionBase { /** * the logger, used to log exceptions and additonaly information @@ -26,13 +53,93 @@ super(); } + /** + * @see de.intevation.gnv.action.ArtifactDatabaseActionBase#execute(org.apache.struts.action.ActionMapping, + * org.apache.struts.action.ActionForm, + * javax.servlet.http.HttpServletRequest, + * javax.servlet.http.HttpServletResponse) + */ @Override + public ActionForward execute( + ActionMapping mapping, + ActionForm form, + HttpServletRequest request, + HttpServletResponse response) + throws Exception + { + try { + String target = request.getParameter("target"); + String mimeType = request.getParameter("mimetype"); + String mode = request.getParameter("mode"); + + log.debug("Target: " + target); + log.debug("MimeType: " + mimeType); + log.debug("ExportMode: " + mode); + + SessionModel sm = SessionModelFactory.getInstance() + .getSessionModel(request); + OutputMode outputMode = sm.getOutputMode(target); + if (outputMode != null) { + ExportMode exportMode = outputMode.getExportMode(mode); + + if (target.equals(mode) || (exportMode != null + && exportMode.getMimeType().equals(mimeType))) + { + Collection inputParameter = outputMode + .getOutputParameters(); + Collection ips = null; + if (inputParameter != null) { + ips = new ArrayList(inputParameter.size()); + Iterator it = inputParameter.iterator(); + while (it.hasNext()) { + String name = it.next().getName(); + String[] values = request.getParameterValues(name); + InputParameter ip = new DefaultInputParameter(name, + values); + ips.add(ip); + } + } + + ArtifactDatabaseClient adc = ArtifactDatabaseClientFactory + .getInstance() + .getArtifactDatabaseClient(getLocale(request)); + + this.setHeaders(mode, mimeType, response, request); + + OutputStream outputStream = response.getOutputStream(); + adc.doOutput(sm.getSelectedArtifactFactory(), sm + .getCurrentArtifact(), outputStream, mode, mimeType, + ips); + + outputStream.flush(); + outputStream.close(); + } + else { + if (outputMode == null) { + log.error("Outputmode is not supported."); + } + else if (!exportMode.getMimeType().equals(mimeType)) { + log.error("MimeType "+mimeType+" wis not supported."); + } + // TODO FIXME: Fehlerbehandlung + } + } + return super.execute(mapping, form, request, response); + } catch (Exception e) { + log.error(e, e); + request.setAttribute( + CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID, e + .getMessage()); + return super.getExceptionForward(mapping); + } + } + protected void setHeaders(String target, String mimeType, HttpServletResponse response, HttpServletRequest request) { log.debug("DoExportAction.setHeaders"); try { - super.setHeaders(target, mimeType, response, request); + response.setHeader("Content-Type", mimeType); String fileName = "GNVEXPORT_" + System.currentTimeMillis() + "."; target = target.toLowerCase(); diff -r 3f7bbc6dc751 -r bd67164cf28b gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java --- a/gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java Tue Feb 23 15:26:50 2010 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java Tue Feb 23 17:43:16 2010 +0000 @@ -38,8 +38,10 @@ import de.intevation.gnv.artifactdatabase.objects.ArtifactStatisticsSet; import de.intevation.gnv.artifactdatabase.objects.DefaultArtifactStatisticValue; import de.intevation.gnv.artifactdatabase.objects.DefaultArtifactStatisticsSet; +import de.intevation.gnv.artifactdatabase.objects.DefaultExportMode; import de.intevation.gnv.artifactdatabase.objects.DefaultOutputMode; import de.intevation.gnv.artifactdatabase.objects.DefaultOutputParameter; +import de.intevation.gnv.artifactdatabase.objects.ExportMode; import de.intevation.gnv.artifactdatabase.objects.InputParameter; import de.intevation.gnv.artifactdatabase.objects.OutputMode; import de.intevation.gnv.artifactdatabase.objects.OutputParameter; @@ -478,8 +480,28 @@ outputParameterNode, "@type"))); } } + + NodeList exportNodes = xmlUtils.getNodeSetXPath( + outputModeNode, "art:exports/art:export"); + Map exports = null; + + if (exportNodes != null) { + int size = exportNodes.getLength(); + exports = new HashMap(size); + + for (int k = 0; k < size; k++) { + Node export = exportNodes.item(k); + String expName = xmlUtils.getStringXPath( + export, "@name"); + exports.put(expName, new DefaultExportMode( + expName, + xmlUtils.getStringXPath(export, "@description"), + xmlUtils.getStringXPath(export, "@mime-type"))); + } + } + outputModes.put(name, new DefaultOutputMode(name, - mimeType, parameter)); + mimeType, parameter, exports)); } } diff -r 3f7bbc6dc751 -r bd67164cf28b gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultExportMode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultExportMode.java Tue Feb 23 17:43:16 2010 +0000 @@ -0,0 +1,31 @@ +package de.intevation.gnv.artifactdatabase.objects; + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public class DefaultExportMode +implements ExportMode +{ + protected String name; + protected String description; + protected String mimeType; + + public DefaultExportMode(String name, String description, String mimeType){ + this.name = name; + this.description = description; + this.mimeType = mimeType; + } + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } + + public String getMimeType() { + return mimeType; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r 3f7bbc6dc751 -r bd67164cf28b gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultOutputMode.java --- a/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultOutputMode.java Tue Feb 23 15:26:50 2010 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultOutputMode.java Tue Feb 23 17:43:16 2010 +0000 @@ -4,6 +4,7 @@ package de.intevation.gnv.artifactdatabase.objects; import java.util.Collection; +import java.util.Map; /** * @author Tim Englich @@ -22,12 +23,19 @@ private Collection outputParameter = null; - public DefaultOutputMode(String name, String mimeType, - Collection outputParameter) { + private Map exports; + + public DefaultOutputMode( + String name, + String mimeType, + Collection outputParameter, + Map exports) + { super(); - this.name = name; - this.mimeType = mimeType; + this.name = name; + this.mimeType = mimeType; this.outputParameter = outputParameter; + this.exports = exports; } /** @@ -51,4 +59,7 @@ return this.outputParameter; } + public ExportMode getExportMode(String mode) { + return exports.get(mode); + } } diff -r 3f7bbc6dc751 -r bd67164cf28b gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/ExportMode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/ExportMode.java Tue Feb 23 17:43:16 2010 +0000 @@ -0,0 +1,15 @@ +package de.intevation.gnv.artifactdatabase.objects; + +import java.io.Serializable; + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public interface ExportMode +extends Serializable +{ + public String getName(); + public String getDescription(); + public String getMimeType(); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r 3f7bbc6dc751 -r bd67164cf28b gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/OutputMode.java --- a/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/OutputMode.java Tue Feb 23 15:26:50 2010 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/OutputMode.java Tue Feb 23 17:43:16 2010 +0000 @@ -18,4 +18,5 @@ public Collection getOutputParameters(); + public ExportMode getExportMode(String mode); } diff -r 3f7bbc6dc751 -r bd67164cf28b gnv/src/main/resources/applicationMessages.properties --- a/gnv/src/main/resources/applicationMessages.properties Tue Feb 23 15:26:50 2010 +0000 +++ b/gnv/src/main/resources/applicationMessages.properties Tue Feb 23 17:43:16 2010 +0000 @@ -29,7 +29,7 @@ gnviewer.fis.fis_icestations = Eismeldungen gnviewer.select.button = Ausw\u00e4hlen -gnviewer.draw.button = Zeichnen +gnviewer.draw.button = Aktualisieren gnviewer.productselection.overlay.title = Die Anfrage wird bearbeitet, bitte gedulden Sie sich einen Moment. gnviewer.productselection.fisselection.title = Fachinformationssystem diff -r 3f7bbc6dc751 -r bd67164cf28b gnv/src/main/resources/applicationMessages_en.properties --- a/gnv/src/main/resources/applicationMessages_en.properties Tue Feb 23 15:26:50 2010 +0000 +++ b/gnv/src/main/resources/applicationMessages_en.properties Tue Feb 23 17:43:16 2010 +0000 @@ -29,7 +29,7 @@ gnviewer.fis.fis_icestations = Ice Station Report gnviewer.select.button = Choose -gnviewer.draw.button = Draw +gnviewer.draw.button = Update gnviewer.productselection.overlay.title = Your request will be processed. Please wait... gnviewer.productselection.fisselection.title = Data set diff -r 3f7bbc6dc751 -r bd67164cf28b gnv/src/main/webapp/WEB-INF/jsp/includes/display_diagramm_options_inc.jsp --- a/gnv/src/main/webapp/WEB-INF/jsp/includes/display_diagramm_options_inc.jsp Tue Feb 23 15:26:50 2010 +0000 +++ b/gnv/src/main/webapp/WEB-INF/jsp/includes/display_diagramm_options_inc.jsp Tue Feb 23 17:43:16 2010 +0000 @@ -4,15 +4,51 @@ <%@page import="de.intevation.gnv.action.sessionmodel.SessionModelFactory"%> <%@page import="de.intevation.gnv.artifactdatabase.objects.OutputMode"%> <%@page import="de.intevation.gnv.action.sessionmodel.SessionModel"%> +<%@page import="de.intevation.gnv.artifactdatabase.objects.OutputParameter"%> +<%@page import="de.intevation.gnv.artifactdatabase.objects.ExportMode"%> <%@page import="java.util.Collection"%> -<%@page import="de.intevation.gnv.artifactdatabase.objects.OutputParameter"%> <%@page import="java.util.Iterator"%> +<%@page import="java.net.URLEncoder"%> <% - SessionModel sm = SessionModelFactory.getInstance().getSessionModel(request); - DiagrammOptions diagrammOptions = sm.getDiagrammOptions(); - boolean useDiagrammOptions = diagrammOptions != null; - String target = "chart"; - OutputMode outputMode = sm.getOutputMode(target); + String target = "chart"; + String targetPDF = "pdf"; + String targetSVG = "svg"; + String targetIMG = "img"; + SessionModel sm = SessionModelFactory.getInstance().getSessionModel(request); + OutputMode outputMode = sm.getOutputMode(target); + DiagrammOptions diagrammOptions = sm.getDiagrammOptions(); + + boolean useDiagrammOptions = diagrammOptions != null; + ExportMode supportIMG = outputMode.getExportMode(targetIMG); + ExportMode supportPDF = outputMode.getExportMode(targetPDF); + ExportMode supportSVG = outputMode.getExportMode(targetSVG); + + String mimeType = outputMode.getMimeType(); + String parameterString = ""; + Collection op = outputMode.getOutputParameters(); + + if (op != null){ + Iterator it = op.iterator(); + while (it.hasNext()){ + OutputParameter parameter = it.next(); + parameterString = parameterString +"&"+parameter.getName()+"="+(diagrammOptions != null ? diagrammOptions.getValue(parameter.getName()): parameter.getValue()); + } + } + + + String mimeTypeIMG = null; + if (supportIMG != null) { + mimeTypeIMG = supportIMG.getMimeType(); + } + String mimeTypePDF = null; + if (supportPDF != null) { + mimeTypePDF = supportPDF.getMimeType(); + } + String mimeTypeSVG = null; + if (supportSVG != null) { + mimeTypeSVG = supportSVG.getMimeType(); + mimeTypeSVG = URLEncoder.encode(mimeTypeSVG, "UTF-8"); + } %>
@@ -43,9 +79,25 @@ <%}%> - - "/> - <%}%> +
+ "/> + <%}%> + <%if (supportIMG != null) { %> + "> + + + <%}%> + <%if (supportPDF != null) { %> + "> + + + <%}%> + <%if (supportSVG != null) { %> + "> + + + <%}%> +
diff -r 3f7bbc6dc751 -r bd67164cf28b gnv/src/main/webapp/WEB-INF/jsp/includes/display_export_inc.jsp --- a/gnv/src/main/webapp/WEB-INF/jsp/includes/display_export_inc.jsp Tue Feb 23 15:26:50 2010 +0000 +++ b/gnv/src/main/webapp/WEB-INF/jsp/includes/display_export_inc.jsp Tue Feb 23 17:43:16 2010 +0000 @@ -8,18 +8,15 @@ <%@page import="java.util.Iterator"%> <%@page import="java.net.URLEncoder"%> <% - SessionModel sm = SessionModelFactory.getInstance().getSessionModel(request); - ArtifactObject artifact = sm.getCurrentArtifact(); - String mimeType = null; - String parameterString = ""; - String wmslayer = null; - + SessionModel sm = SessionModelFactory.getInstance().getSessionModel(request); + ArtifactObject artifact = sm.getCurrentArtifact(); + String mimeType = null; + String wmslayer = null; + String parameterString = ""; String target = "chart"; String targetCSV = "csv"; String targetODV = "odv"; - String targetPDF = "pdf"; - String targetSVG = "svg"; String targetZIP = "zip"; String targetWMS = "wms"; String targetSta = "statistics"; @@ -28,8 +25,6 @@ boolean supportChart = sm.getOutputMode(target) != null; boolean supportCSV = sm.getOutputMode(targetCSV) != null; boolean supportODV = sm.getOutputMode(targetODV) != null; - boolean supportPDF = sm.getOutputMode(targetPDF) != null; - boolean supportSVG = sm.getOutputMode(targetSVG) != null; boolean supportZIP = sm.getOutputMode(targetZIP) != null; boolean supportWMS = sm.getOutputMode(targetWMS) != null; boolean supportSta = sm.getOutputMode(targetSta) != null; @@ -49,15 +44,6 @@ } } - String mimeTypePDF = null; - if (supportPDF) { - mimeTypePDF = sm.getOutputMode(targetPDF).getMimeType(); - } - String mimeTypeSVG = null; - if (supportSVG) { - mimeTypeSVG = sm.getOutputMode(targetSVG).getMimeType(); - mimeTypeSVG = URLEncoder.encode(mimeTypeSVG, "UTF-8"); - } String mimeTypeCSV = null; if (supportCSV){ mimeTypeCSV = sm.getOutputMode(targetCSV).getMimeType(); @@ -81,7 +67,7 @@ %> <%-- display export options if one is supported in this state --%> -<% if (supportPDF || supportSVG || supportCSV || supportODV || supportWMS || supportZIP) { %> +<% if (supportChart || supportCSV || supportODV || supportWMS || supportZIP) { %>
@@ -89,29 +75,6 @@ "> - "> - - - <%}%> - <%if (supportPDF) { %> - "> - - - <%}%> - <%if (supportSVG) { %> - "> - - - <%}%> - <%if (supportCSV) { %> - "> - - - <%}%> - <%if (supportODV) { %> - "> - - <%}%> <%if (supportWMS) { %> "> @@ -134,6 +97,16 @@ " title=""> + <%}%> + <%if (supportCSV) { %> + "> + + + <%}%> + <%if (supportODV) { %> + "> + + <%}%>
diff -r 3f7bbc6dc751 -r bd67164cf28b gnv/src/main/webapp/WEB-INF/jsp/includes/display_histogram_options_inc.jsp --- a/gnv/src/main/webapp/WEB-INF/jsp/includes/display_histogram_options_inc.jsp Tue Feb 23 15:26:50 2010 +0000 +++ b/gnv/src/main/webapp/WEB-INF/jsp/includes/display_histogram_options_inc.jsp Tue Feb 23 17:43:16 2010 +0000 @@ -4,15 +4,50 @@ <%@page import="de.intevation.gnv.action.sessionmodel.SessionModelFactory"%> <%@page import="de.intevation.gnv.artifactdatabase.objects.OutputMode"%> <%@page import="de.intevation.gnv.action.sessionmodel.SessionModel"%> +<%@page import="de.intevation.gnv.artifactdatabase.objects.OutputParameter"%> +<%@page import="de.intevation.gnv.artifactdatabase.objects.ExportMode"%> <%@page import="java.util.Collection"%> -<%@page import="de.intevation.gnv.artifactdatabase.objects.OutputParameter"%> <%@page import="java.util.Iterator"%> +<%@page import="java.net.URLEncoder"%> <% - SessionModel sm = SessionModelFactory.getInstance().getSessionModel(request); - DiagrammOptions diagrammOptions = sm.getDiagrammOptions(); - boolean useDiagrammOptions = diagrammOptions != null; - String target = "histogram"; - OutputMode outputMode = sm.getOutputMode(target); + String target = "histogram"; + String targetPDF = "pdf"; + String targetSVG = "svg"; + String targetIMG = "img"; + SessionModel sm = SessionModelFactory.getInstance().getSessionModel(request); + OutputMode outputMode = sm.getOutputMode(target); + DiagrammOptions diagrammOptions = sm.getDiagrammOptions(); + + boolean useDiagrammOptions = diagrammOptions != null; + ExportMode supportIMG = outputMode.getExportMode(targetIMG); + ExportMode supportPDF = outputMode.getExportMode(targetPDF); + ExportMode supportSVG = outputMode.getExportMode(targetSVG); + + String mimeType = outputMode.getMimeType(); + String parameterString = ""; + Collection op = outputMode.getOutputParameters(); + + if (op != null){ + Iterator it = op.iterator(); + while (it.hasNext()){ + OutputParameter parameter = it.next(); + parameterString = parameterString +"&"+parameter.getName()+"="+(diagrammOptions != null ? diagrammOptions.getValue(parameter.getName()): parameter.getValue()); + } + } + + String mimeTypeIMG = null; + if (supportIMG != null) { + mimeTypeIMG = supportIMG.getMimeType(); + } + String mimeTypePDF = null; + if (supportPDF != null) { + mimeTypePDF = supportPDF.getMimeType(); + } + String mimeTypeSVG = null; + if (supportSVG != null) { + mimeTypeSVG = supportSVG.getMimeType(); + mimeTypeSVG = URLEncoder.encode(mimeTypeSVG, "UTF-8"); + } %>
@@ -43,9 +78,23 @@ <%}%> - - "/> + "/> <%}%> + <%if (supportIMG != null) { %> + "> + + + <%}%> + <%if (supportPDF != null) { %> + "> + + + <%}%> + <%if (supportSVG != null) { %> + "> + + + <%}%>
diff -r 3f7bbc6dc751 -r bd67164cf28b gnv/src/main/webapp/images/arrow_refresh.png Binary file gnv/src/main/webapp/images/arrow_refresh.png has changed