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

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

simulation

  • ajout exemple ds index
File size: 8.4 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                if( !( (ArrayList) realValuesLists.getFirstArray() ).isEmpty() && !( (ArrayList) realValuesLists.getSecondArray() ).isEmpty() && !( (ArrayList) realValuesLists.getThirdArray() ).isEmpty() )
105                    megapoliPlot.setRealData( realValuesLists );
106                megapoliPlot.setRealDataNumber( ( (ArrayList) realValuesLists.getFirstArray() ).size() );
107            }
108
109            // 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
110            final Data allZoomedData = _etherService.makeZoom( allParameterValues, allLatitudeValues, allLongitudeValues, megapoliPlot.getRealData() );
111            final List<Double> parameterValues = (List<Double>) allZoomedData.getFirstArray();
112            final List<Double> latitudeValues = (List<Double>) allZoomedData.getSecondArray();
113            final List<Double> longitudeValues = (List<Double>) allZoomedData.getThirdArray();
114
115            final Data valuesLists;
116            // If we display the contours, the latitudes and longitudes must contain only unique value, we remove the duplicated values
117            if( isRasterContour )
118            {
119                final Set<Double> latitudeValuesSet = new LinkedHashSet<Double>( latitudeValues );
120                final Set<Double> longitudeValuesSet = new LinkedHashSet<Double>( longitudeValues );
121                // We have to flip the parameter values
122                final List<Double> flipedParameterValues = _etherService.flipList( parameterValues, latitudeValuesSet.size(), longitudeValuesSet.size() );
123                valuesLists = new Data( flipedParameterValues, new ArrayList<Double>( latitudeValuesSet ), new ArrayList<Double>( longitudeValuesSet ) );
124            }
125            else
126                valuesLists = new Data( parameterValues, new ArrayList<Double>( latitudeValues ), new ArrayList<Double>( longitudeValues ) );
127
128            megapoliPlot.setData( valuesLists );
129            megapoliPlot.setValuesNumber( parameterValues.size() );
130
131            final BufferedImage bufferedImage = _etherPlotService.createMainPane( megapoliPlot, Context.getLocale( request ) );
132            ImageIO.write( bufferedImage, "png", response.getOutputStream() );
133        }
134        catch( Exception e1 )
135        {
136            try
137            {
138                createErrorPane( response, request, "", e1 );
139            }
140            catch( Exception e2 )
141            {
142                throw new ServletException( "Error : no possibity to write image in response", e2 );
143            }
144        }
145    }
146
147    private void createErrorPane( final HttpServletResponse response, final HttpServletRequest request, @NotNull final String mainError, @Nullable final Exception e )
148            throws IOException
149    {
150        final BufferedImage errorImage;
151        if( null != e )
152            errorImage = _etherPlotService.createErrorPane( mainError, e.toString(), Context.getLocale( request ) );
153        else
154            errorImage = _etherPlotService.createErrorPane( mainError, null, Context.getLocale( request ) );
155
156        ImageIO.write( errorImage, "png", response.getOutputStream() );
157    }
158
159    private static final Log LOGGER = LogFactory.getLog( ControllerSimulationPlot.class );
160
161    private EtherPlotService _etherPlotService;
162    private EtherService _etherService;
163}
Note: See TracBrowser for help on using the repository browser.