org.onebusaway.webapp.actions.rss.TripProblemReportsAction.java Source code

Java tutorial

Introduction

Here is the source code for org.onebusaway.webapp.actions.rss.TripProblemReportsAction.java

Source

/**
 * Copyright (C) 2011 Brian Ferris <bdferris@onebusaway.org>
 * Copyright (C) 2012 Google, Inc.
 *
 * 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.actions.rss;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.onebusaway.presentation.client.RoutePresenter;
import org.onebusaway.transit_data.model.AgencyBean;
import org.onebusaway.transit_data.model.ListBean;
import org.onebusaway.transit_data.model.StopBean;
import org.onebusaway.transit_data.model.problems.EProblemReportStatus;
import org.onebusaway.transit_data.model.problems.TripProblemReportBean;
import org.onebusaway.transit_data.model.problems.TripProblemReportQueryBean;
import org.onebusaway.transit_data.model.trips.TripBean;
import org.onebusaway.transit_data.services.TransitDataService;
import org.springframework.beans.factory.annotation.Autowired;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.validator.annotations.RequiredStringValidator;
import com.sun.syndication.feed.synd.SyndContent;
import com.sun.syndication.feed.synd.SyndContentImpl;
import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndEntryImpl;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.feed.synd.SyndFeedImpl;

@Results({ @Result(type = "rome") })
public class TripProblemReportsAction extends ActionSupport {

    private static final long serialVersionUID = 1L;

    private TransitDataService _transitDataService;

    private String _agencyId;

    private int _days = 7;

    private String _status;

    private String _label;

    private SyndFeed _feed;

    @Autowired
    public void setTransitDataService(TransitDataService transitDataService) {
        _transitDataService = transitDataService;
    }

    @RequiredStringValidator(key = "requiredField")
    public void setAgencyId(String agencyId) {
        _agencyId = agencyId;
    }

    public String getAgencyId() {
        return _agencyId;
    }

    public void setDays(int days) {
        _days = days;
    }

    public void setStatus(String status) {
        _status = status;
    }

    public void setLabel(String label) {
        _label = label;
    }

    public String getLabel() {
        return _label;
    }

    public SyndFeed getFeed() {
        return _feed;
    }

    @Override
    public String execute() {

        AgencyBean agency = _transitDataService.getAgency(_agencyId);

        if (agency == null)
            return INPUT;

        Calendar c = Calendar.getInstance();
        long timeTo = c.getTimeInMillis();
        c.add(Calendar.DAY_OF_WEEK, -_days);
        long timeFrom = c.getTimeInMillis();

        TripProblemReportQueryBean query = new TripProblemReportQueryBean();
        query.setAgencyId(_agencyId);
        query.setTimeFrom(timeFrom);
        query.setTimeTo(timeTo);
        if (_status != null)
            query.setStatus(EProblemReportStatus.valueOf(_status));
        query.setLabel(_label);

        ListBean<TripProblemReportBean> result = _transitDataService.getTripProblemReports(query);
        List<TripProblemReportBean> reports = result.getList();

        _feed = new SyndFeedImpl();

        StringBuilder title = new StringBuilder();
        title.append(getText("rss.OneBusAwayTripProblemReports"));
        title.append(" - ");
        title.append(agency.getName());
        title.append(" - ");
        title.append(getText("rss.LastXDays", Arrays.asList((Object) _days)));

        HttpServletRequest request = ServletActionContext.getRequest();

        StringBuilder b = new StringBuilder();
        b.append("http://");
        b.append(request.getServerName());
        if (request.getServerPort() != 80)
            b.append(":").append(request.getServerPort());
        if (request.getContextPath() != null)
            b.append(request.getContextPath());
        String baseUrl = b.toString();

        _feed.setTitle(title.toString());
        _feed.setLink(baseUrl);
        _feed.setDescription(
                getText("rss.UserSubmittedTripProblemReports", Arrays.asList((Object) agency.getName(), _days)));

        List<SyndEntry> entries = new ArrayList<SyndEntry>();
        _feed.setEntries(entries);

        for (TripProblemReportBean report : reports) {

            StopBean stop = report.getStop();
            TripBean trip = report.getTrip();

            SyndEntry entry = new SyndEntryImpl();

            StringBuilder entryTitle = new StringBuilder();
            if (trip == null) {
                entryTitle.append("trip_id=");
                entryTitle.append(report.getTripId());
                entryTitle.append(" (?)");
            } else {
                entryTitle.append(RoutePresenter.getNameForRoute(trip));
                entryTitle.append(" - ");
                entryTitle.append(trip.getTripHeadsign());
            }
            if (stop == null) {
                entryTitle.append(" - stop_id=");
                entryTitle.append(report.getStopId());
                entryTitle.append(" (?)");
            } else {
                entryTitle.append(" - ");
                entryTitle.append(getText("StopNum", new String[] { stop.getCode() }));
                entryTitle.append(" - ");
                entryTitle.append(stop.getName());
                if (stop.getDirection() != null) {
                    entryTitle.append(" - ");
                    entryTitle.append(getText("bound", new String[] { stop.getDirection() }));
                }
            }

            StringBuilder entryUrl = new StringBuilder();
            entryUrl.append(baseUrl);
            entryUrl.append("/admin/problems/trip-problem-report.action?tripId=");
            entryUrl.append(report.getTripId());
            entryUrl.append("&id=");
            entryUrl.append(report.getId());

            StringBuilder entryDesc = new StringBuilder();
            entryDesc.append(getText("Data"));
            entryDesc.append(": ");
            entryDesc.append(report.getData());
            entryDesc.append("<br/>");

            if (report.getUserComment() != null) {
                entryDesc.append(getText("Comment"));
                entryDesc.append(": ");
                entryDesc.append(report.getUserComment());
                entryDesc.append("<br/>");
            }

            if (report.getStatus() != null) {
                entryDesc.append(getText("Status"));
                entryDesc.append(": ");
                entryDesc.append(report.getStatus());
                entryDesc.append("<br/>");
            }

            entry = new SyndEntryImpl();
            entry.setTitle(entryTitle.toString());
            entry.setLink(entryUrl.toString());
            entry.setPublishedDate(new Date(report.getTime()));

            SyndContent description = new SyndContentImpl();
            description.setType("text/html");
            description.setValue(entryDesc.toString());
            entry.setDescription(description);
            entries.add(entry);
        }

        return SUCCESS;
    }
}