org.onebusaway.webapp.impl.WebappServiceServletImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.onebusaway.webapp.impl.WebappServiceServletImpl.java

Source

/**
 * Copyright (C) 2011 Brian Ferris <bdferris@onebusaway.org>
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.onebusaway.webapp.impl;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.ParseException;
import java.util.Date;
import java.util.List;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;

import org.onebusaway.exceptions.ServiceException;
import org.onebusaway.geospatial.model.CoordinatePoint;
import org.onebusaway.transit_data.model.AgencyWithCoverageBean;
import org.onebusaway.transit_data.model.ListBean;
import org.onebusaway.transit_data.model.RouteBean;
import org.onebusaway.transit_data.model.RoutesAndStopsBean;
import org.onebusaway.transit_data.model.RoutesBean;
import org.onebusaway.transit_data.model.SearchQueryBean;
import org.onebusaway.transit_data.model.StopBean;
import org.onebusaway.transit_data.model.StopScheduleBean;
import org.onebusaway.transit_data.model.StopWithArrivalsAndDeparturesBean;
import org.onebusaway.transit_data.model.StopsBean;
import org.onebusaway.transit_data.model.StopsForRouteBean;
import org.onebusaway.transit_data.model.oba.LocalSearchResult;
import org.onebusaway.transit_data.model.oba.MinTransitTimeResult;
import org.onebusaway.transit_data.model.oba.MinTravelTimeToStopsBean;
import org.onebusaway.transit_data.model.oba.TimedPlaceBean;
import org.onebusaway.transit_data.model.tripplanning.ConstraintsBean;
import org.onebusaway.transit_data.model.tripplanning.ItinerariesBean;
import org.onebusaway.transit_data.model.tripplanning.TransitShedConstraintsBean;
import org.onebusaway.transit_data.model.trips.TripDetailsBean;
import org.onebusaway.transit_data.model.trips.TripsForBoundsQueryBean;
import org.onebusaway.users.client.model.UserBean;
import org.onebusaway.webapp.gwt.where_library.rpc.WebappService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.google.gwt.user.server.rpc.SerializationPolicy;
import com.google.gwt.user.server.rpc.SerializationPolicyLoader;

public class WebappServiceServletImpl extends RemoteServiceServlet implements WebappService {

    private static final long serialVersionUID = 1L;

    private WebappService _service;

    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        WebApplicationContext context = WebApplicationContextUtils
                .getWebApplicationContext(config.getServletContext());
        context.getAutowireCapableBeanFactory().autowireBean(this);
    }

    protected SerializationPolicy doGetSerializationPolicy(HttpServletRequest request, String moduleBaseURL,
            String strongName) {

        return customLoadSerializationPolicy(this, request, moduleBaseURL, strongName);
        // return super.doGetSerializationPolicy(request, moduleBaseURL,
        // strongName);
    }

    @Override
    public List<AgencyWithCoverageBean> getAgencies() throws ServiceException {
        return _service.getAgencies();
    }

    @Autowired
    public void setService(WebappService service) {
        _service = service;
    }

    @Override
    public StopWithArrivalsAndDeparturesBean getArrivalsByStopId(String stopId) throws ServiceException {
        return _service.getArrivalsByStopId(stopId);
    }

    @Override
    public UserBean getCurrentUser() {
        return _service.getCurrentUser();
    }

    @Override
    public UserBean setDefaultLocationForUser(String locationName, double lat, double lon) {
        return _service.setDefaultLocationForUser(locationName, lat, lon);
    }

    @Override
    public UserBean clearDefaultLocationForUser() {
        return _service.clearDefaultLocationForUser();
    }

    @Override
    public MinTransitTimeResult getMinTravelTimeToStopsFrom(CoordinatePoint location, long time,
            TransitShedConstraintsBean constraints, int timeSegmentSize) throws ServiceException {
        return _service.getMinTravelTimeToStopsFrom(location, time, constraints, timeSegmentSize);
    }

    @Override
    public RouteBean getRouteForId(String routeId) throws ServiceException {
        return _service.getRouteForId(routeId);
    }

    @Override
    public RoutesBean getRoutes(SearchQueryBean query) throws ServiceException {
        return _service.getRoutes(query);
    }

    @Override
    public StopScheduleBean getScheduleForStop(String stopId, Date date) throws ServiceException {
        return _service.getScheduleForStop(stopId, date);
    }

    @Override
    public RoutesAndStopsBean getRoutesAndStops(SearchQueryBean query) throws ServiceException {
        return _service.getRoutesAndStops(query);
    }

    @Override
    public StopsBean getStops(SearchQueryBean query) throws ServiceException {
        return _service.getStops(query);
    }

    @Override
    public StopBean getStop(String stopId) throws ServiceException {
        return _service.getStop(stopId);
    }

    @Override
    public StopsForRouteBean getStopsForRoute(String routeId) throws ServiceException {
        return _service.getStopsForRoute(routeId);
    }

    @Override
    public ListBean<TripDetailsBean> getTripsForBounds(TripsForBoundsQueryBean query) {
        return _service.getTripsForBounds(query);
    }

    @Override
    public ItinerariesBean getTripsBetween(CoordinatePoint from, CoordinatePoint to, long time,
            ConstraintsBean constraints) throws ServiceException {
        return _service.getTripsBetween(from, to, time, constraints);
    }

    @Override
    public List<TimedPlaceBean> getLocalPathsToStops(ConstraintsBean constraints,
            MinTravelTimeToStopsBean travelTimes, List<LocalSearchResult> localResults) throws ServiceException {
        return _service.getLocalPathsToStops(constraints, travelTimes, localResults);
    }

    /****
     * 
     ****/

    /**
     * Used by HybridServiceServlet.
     */
    private static SerializationPolicy customLoadSerializationPolicy(HttpServlet servlet,
            HttpServletRequest request, String moduleBaseURL, String strongName) {

        // The request can tell you the path of the web app relative to the
        // container root.
        String contextPath = request.getContextPath();

        String modulePath = null;
        if (moduleBaseURL != null) {
            try {
                modulePath = new URL(moduleBaseURL).getPath();
            } catch (MalformedURLException ex) {
                // log the information, we will default
                servlet.log("Malformed moduleBaseURL: " + moduleBaseURL, ex);
            }
        }

        SerializationPolicy serializationPolicy = null;

        /*
         * Check that the module path must be in the same web app as the servlet
         * itself. If you need to implement a scheme different than this, override
         * this method.
         */
        if (modulePath == null) {
            String message = "ERROR: The module path requested, " + modulePath
                    + ", is not in the same web application as this servlet, " + contextPath
                    + ".  Your module may not be properly configured or your client and server code maybe out of date.";
            servlet.log(message, null);
        } else {

            // TODO : Hack for Nokia demo
            // /Users/bdferris/Documents/Aptana%20Studio%20Workspace/nokia-hello-world/
            if (modulePath.endsWith("nokia-hello-world/"))
                modulePath = "/where/mobile/";

            if (!modulePath.startsWith(contextPath))
                modulePath = contextPath + modulePath;

            // Strip off the context path from the module base URL. It should be a
            // strict prefix.
            String contextRelativePath = modulePath.substring(contextPath.length());

            String serializationPolicyFilePath = SerializationPolicyLoader
                    .getSerializationPolicyFileName(contextRelativePath + strongName);

            // Open the RPC resource file and read its contents.
            InputStream is = servlet.getServletContext().getResourceAsStream(serializationPolicyFilePath);
            try {
                if (is != null) {
                    try {
                        serializationPolicy = SerializationPolicyLoader.loadFromStream(is, null);
                    } catch (ParseException e) {
                        servlet.log("ERROR: Failed to parse the policy file '" + serializationPolicyFilePath + "'",
                                e);
                    } catch (IOException e) {
                        servlet.log("ERROR: Could not read the policy file '" + serializationPolicyFilePath + "'",
                                e);
                    }
                } else {
                    String message = "ERROR: The serialization policy file '" + serializationPolicyFilePath
                            + "' was not found; did you forget to include it in this deployment?";
                    servlet.log(message, null);
                }
            } finally {
                if (is != null) {
                    try {
                        is.close();
                    } catch (IOException e) {
                        // Ignore this error
                    }
                }
            }
        }

        return serializationPolicy;
    }

}