source: ether_megapoli/trunk/web/src/com/ether/ControllerSimulationPlot.java @ 561

Last change on this file since 561 was 561, checked in by vmipsl, 12 years ago

simulation

  • contours ok
File size: 8.2 KB
Line 
1package com.ether;
2
3import com.medias.Context;
4import org.apache.commons.logging.Log;
5import org.apache.commons.logging.LogFactory;
6import org.jetbrains.annotations.NotNull;
7import org.jetbrains.annotations.Nullable;
8import org.springframework.context.ApplicationContext;
9import org.springframework.web.context.support.WebApplicationContextUtils;
10
11import javax.imageio.ImageIO;
12import javax.servlet.ServletConfig;
13import javax.servlet.ServletException;
14import javax.servlet.http.HttpServlet;
15import javax.servlet.http.HttpServletRequest;
16import javax.servlet.http.HttpServletResponse;
17import java.awt.image.BufferedImage;
18import java.io.IOException;
19import java.util.ArrayList;
20import java.util.Calendar;
21import java.util.Date;
22import java.util.LinkedHashSet;
23import java.util.List;
24import java.util.Set;
25
26/**
27 * @author vmipsl
28 * @date 04 september 2012
29 */
30public class ControllerSimulationPlot
31        extends HttpServlet
32{
33    public void init( final ServletConfig servletConfig )
34            throws ServletException
35    {
36        try
37        {
38            final ApplicationContext appContext = WebApplicationContextUtils.getRequiredWebApplicationContext( servletConfig.getServletContext() );
39            _etherPlotService = (EtherPlotService) appContext.getBean( "etherPlotService", EtherPlotService.class );
40            _etherService = (EtherService) appContext.getBean( "etherService", EtherService.class );
41        }
42        catch( Throwable tx )
43        {
44            LOGGER.error( "Error initializing EtherService.", tx );
45            throw new ServletException( "Error initializing EtherService.", tx );
46        }
47    }
48
49    /**
50     * Creates an image with the plot and send it to the response
51     * Call by a jsp with <img src="simulation/plotSimulationEther?....">
52     *
53     * @param request
54     * @param response
55     * @throws javax.servlet.ServletException
56     */
57    public void doGet( final HttpServletRequest request, final HttpServletResponse response )
58            throws ServletException
59    {
60        try
61        {
62            final String title = request.getParameter( ParameterConstants.PARAMETER_TITLE );
63            final Integer modelId = Integer.valueOf( request.getParameter( ParameterConstants.PARAMETER_MODEL_ID ) );
64            final Integer variableId = Integer.valueOf( request.getParameter( ParameterConstants.PARAMETER_VARIABLE_ID ) );
65            final String variableName = request.getParameter( ParameterConstants.PARAMETER_VARIABLE_NAME );
66            final Integer dateNumber = Integer.parseInt( request.getParameter( ParameterConstants.PARAMETER_DATE_NUMBER ) );
67            final String date = request.getParameter( ParameterConstants.PARAMETER_DATE );
68            final Integer level = Integer.parseInt( request.getParameter( ParameterConstants.PARAMETER_VARIABLE_LEVEL ) );
69            final boolean isRasterContour = Boolean.parseBoolean( request.getParameter( "isRasterContour" ) );
70            final boolean displayRealData = Boolean.parseBoolean( request.getParameter( "isRealDataToDisplay" ) );
71
72            Integer plateformId = null;
73            if( null != request.getParameter( ParameterConstants.PARAMETER_PLATEFORM_ID ) )
74                plateformId = Integer.parseInt( request.getParameter( ParameterConstants.PARAMETER_PLATEFORM_ID ) );
75
76            // Create plot
77            final SimulationPlot megapoliPlot = new SimulationPlot();
78            megapoliPlot.setTitle( title );
79            megapoliPlot.setModelId( modelId );
80            megapoliPlot.setVariableId( variableId );
81            megapoliPlot.setVariableName( variableName );
82            megapoliPlot.setLevel( level );
83            megapoliPlot.setDate( date );
84            megapoliPlot.setRasterContour( isRasterContour );
85            megapoliPlot.setRealDataToDisplay( displayRealData );
86
87            // Extract simulated values from file
88            final List<Double> allParameterValues = _etherService.extractValuesByModelByVariableByDateByLevelFromFile( megapoliPlot.getModelId(), megapoliPlot.getVariableName(), dateNumber, level, true );
89            final List<Double> allLatitudeValues = _etherService.extractValuesByModelByVariableByDateByLevelFromFile( megapoliPlot.getModelId(), "lat", dateNumber, level, true );
90            final List<Double> allLongitudeValues = _etherService.extractValuesByModelByVariableByDateByLevelFromFile( megapoliPlot.getModelId(), "lon", dateNumber, level, true );
91
92            // Extract real data from database
93            if( megapoliPlot.isRealDataToDisplay() && null != plateformId )
94            {
95                final Integer parameterId = _etherService.getParameterByCode( variableName );
96                // Dates
97                final Calendar calendar = Calendar.getInstance();
98                final Date formatedDateBegin = DateHelper.parseDate( date, "yyyy-MM-dd" );
99                calendar.setTime( formatedDateBegin );
100                calendar.add( Calendar.DAY_OF_YEAR, 1 );
101                final Date formatedDateEnd = calendar.getTime();
102
103                final Data realValuesLists = _etherService.getListsByPlateformByParameterByPeriodFor2D( plateformId, parameterId, formatedDateBegin, formatedDateEnd );
104                megapoliPlot.setRealData( realValuesLists );
105                megapoliPlot.setRealDataNumber( ( (ArrayList) realValuesLists.getFirstArray() ).size() );
106            }
107
108            // If we have to display the real data, we need probably to zoom all the data on the same geographic map, otherwise we keep all values
109            final Data allZoomedData = _etherService.makeZoom( allParameterValues, allLatitudeValues, allLongitudeValues, megapoliPlot.getRealData() );
110            final List<Double> parameterValues = (List<Double>) allZoomedData.getFirstArray();
111            final List<Double> latitudeValues = (List<Double>) allZoomedData.getSecondArray();
112            final List<Double> longitudeValues = (List<Double>) allZoomedData.getThirdArray();
113
114            final Data valuesLists;
115            // If we display the contours, the latitudes and longitudes must contain only unique value, we remove the duplicated values
116            if( isRasterContour )
117            {
118                final Set<Double> latitudeValuesSet = new LinkedHashSet<Double>( latitudeValues );
119                final Set<Double> longitudeValuesSet = new LinkedHashSet<Double>( longitudeValues );
120                // We have to flip the parameter values
121                final List<Double> flipedParameterValues = _etherService.flipList( parameterValues, latitudeValuesSet.size(), longitudeValuesSet.size() );
122                valuesLists = new Data( flipedParameterValues, new ArrayList<Double>( latitudeValuesSet ), new ArrayList<Double>( longitudeValuesSet ) );
123            }
124            else
125                valuesLists = new Data( parameterValues, new ArrayList<Double>( latitudeValues ), new ArrayList<Double>( longitudeValues ) );
126
127            megapoliPlot.setData( valuesLists );
128            megapoliPlot.setValuesNumber( parameterValues.size() );
129
130            final BufferedImage bufferedImage = _etherPlotService.createMainPane( megapoliPlot, Context.getLocale( request ) );
131            ImageIO.write( bufferedImage, "png", response.getOutputStream() );
132        }
133        catch( Exception e1 )
134        {
135            try
136            {
137                createErrorPane( response, request, "", e1 );
138            }
139            catch( Exception e2 )
140            {
141                throw new ServletException( "Error : no possibity to write image in response", e2 );
142            }
143        }
144    }
145
146    private void createErrorPane( final HttpServletResponse response, final HttpServletRequest request, @NotNull final String mainError, @Nullable final Exception e )
147            throws IOException
148    {
149        final BufferedImage errorImage;
150        if( null != e )
151            errorImage = _etherPlotService.createErrorPane( mainError, e.toString(), Context.getLocale( request ) );
152        else
153            errorImage = _etherPlotService.createErrorPane( mainError, null, Context.getLocale( request ) );
154
155        ImageIO.write( errorImage, "png", response.getOutputStream() );
156    }
157
158    private static final Log LOGGER = LogFactory.getLog( ControllerSimulationPlot.class );
159
160    private EtherPlotService _etherPlotService;
161    private EtherService _etherService;
162}
Note: See TracBrowser for help on using the repository browser.