Java Spring启动应用程序未呈现index.jsp

Java Spring启动应用程序未呈现index.jsp,java,spring,spring-boot,Java,Spring,Spring Boot,在找出所有可能的解决方案后,我将发布此消息 几天前,我的spring boot应用程序运行良好。我可以在tomcat上部署它,还可以导出war并在我的应用服务器上部署它。但突然间,它在部署上出现了空白页。可能的原因是什么 在pom.xml中,我拥有所有依赖项: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:x

在找出所有可能的解决方案后,我将发布此消息

几天前,我的spring boot应用程序运行良好。我可以在tomcat上部署它,还可以导出war并在我的应用服务器上部署它。但突然间,它在部署上出现了空白页。可能的原因是什么

在pom.xml中,我拥有所有依赖项:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.sdigital</groupId>
    <artifactId>cheapTravelTicket</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <name></name>
    <description>cheap Travel Ticket</description>
  <!--  Default from spring boot -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.3.RELEASE</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
         <!--  Web Application -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>


        <!-- Spring  data jpa -->

        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>       

        <!-- Spring  Webservices -->

        <dependency>
               <groupId>org.springframework.ws</groupId>
               <artifactId>spring-ws-core</artifactId>
        </dependency>

        <dependency> 
            <groupId>xml-apis</groupId>
            <artifactId>xml-apis</artifactId>
            <version>1.4.01</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.w3c/dom -->
        <dependency>
            <groupId>org.w3c</groupId>
            <artifactId>dom</artifactId>
            <version>2.3.0-jaxb-1.0.6</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/sax/sax -->
        <dependency>
            <groupId>sax</groupId>
            <artifactId>sax</artifactId>
            <version>2.0.1</version>
        </dependency>

         <!--  Embedded Tomcat -->
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

         <!-- Slug generator -->
        <dependency>
            <groupId>com.github.slugify</groupId>
            <artifactId>slugify</artifactId>
            <version>2.1.7</version>
        </dependency>

       <!-- Common String -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.4</version>
        </dependency>

        <!-- Apache Commons IO --> 
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>

        <!-- JSTL for JSP -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <scope>provided</scope>
        </dependency>

        <!-- Need this to compile JSP -->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>

        <!-- Need this to compile JSP,
            tomcat-embed-jasper version is not working, no idea why -->
        <dependency>
            <groupId>org.eclipse.jdt.core.compiler</groupId>
            <artifactId>ecj</artifactId>
            <version>4.6.1</version>
            <scope>provided</scope>
        </dependency>

        <!-- Optional, test for static content, bootstrap CSS-->
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap</artifactId>
            <version>3.3.7</version>
        </dependency>

        <dependency>
          <groupId>org.postgresql</groupId>     
          <artifactId>postgresql</artifactId>       
          </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.3.5</version>
        </dependency>  

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpcore</artifactId>
            <version>4.4.6</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.jcabi/jcabi-xml -->
        <dependency>
            <groupId>com.jcabi</groupId>
            <artifactId>jcabi-xml</artifactId>
            <version>0.18.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/joda-time/joda-time -->
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.3</version>
        </dependency>

    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.2.4</version>
    </dependency>

    </dependencies>

    <build>
        <plugins>
         <!--  Spring boot maven support -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>
控制器

package com.sdigital.controller;

import java.net.URISyntaxException;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;

import com.sdigital.bus.distribution.domain.ConnectionRequest;
import com.sdigital.cache.SearchCache;
import com.sdigital.domain.JourneyRequest;
import com.sdigital.domain.TimeTableRequest;
import com.sdigital.domain.XmlUrl;
import com.sdigital.domain.XmlUrlSet;
import com.sdigital.model.BusProvider;
import com.sdigital.model.City;
import com.sdigital.model.CustomForm;
import com.sdigital.model.Route;
import com.sdigital.model.SeoConfig;
import com.sdigital.model.SiteMap;
import com.sdigital.repositories.BusProviderRepository;
import com.sdigital.repositories.CityRepository;
import com.sdigital.repositories.RouteRepository;
import com.sdigital.repositories.SeoConfigRepository;
import com.sdigital.repositories.SiteMapRepository;
import com.sdigital.repositories.StationConfigRepository;
import com.sdigital.service.AppService;
import com.sdigital.utils.CTTConstant;
import com.sdigital.utils.CommonUtils;

@Controller
@SessionAttributes({"searchRequest", "searchBusRequest"})
public class AppController {

    @Autowired
    private AppService appServc;

    @Autowired
    private StationConfigRepository strepo;

    @Autowired
    private RouteRepository rtrepo;

    @Autowired
    private CityRepository ctrepo;

    @Autowired
    private BusProviderRepository busrepo;

    @Autowired
    private SeoConfigRepository repo;

    @Autowired
    private SearchCache searchCache;

    @Autowired
    private SiteMapRepository siteMap;

    @RequestMapping("/")
    public ModelAndView home(){
        //List<Route> cttPopular = rtrepo.findOneByPopularType(CTTConstant.CTT_POPULAR_TYPE);
        List<City> cttPopular = ctrepo.findAllByOrderByPriorityAsc();
        List<Route> popular = rtrepo.findByPopularType(CTTConstant.POPULAR_TYPE);
        ModelAndView model = new ModelAndView("index");
        model.addObject("cttPopular", cttPopular);
        model.addObject("popular", popular);
        SeoConfig seoCon = repo.findByPageType(3);
        model.addObject("title", seoCon.getPageTitle());
        model.addObject("meta_title", seoCon.getMetaTitle());
        model.addObject("meta_description", seoCon.getMetaDescription());
        model.addObject("meta_keywords", seoCon.getMetaKeywords());
        model.addObject("seo_url", seoCon.getSeoUrl());
        model.addObject("description", seoCon.getDescription());
        model.addObject("desc1", seoCon.getDesc1());
        model.addObject("desc2", seoCon.getDesc2());
        model.addObject("desc3", seoCon.getDesc3());
        List<City> topCities = ctrepo.findTop10ByOrderByPriorityAsc();
        List<Route> topRoutes = rtrepo.findTop10ByOrderByPriorityAsc();
        model.addObject("topCities", topCities);
        model.addObject("topRoutes", topRoutes);
        List<BusProvider> topBusProviders = busrepo.findTop10ByPublishOrderByPriorityAsc(true);
        model.addObject("topBusProviders", topBusProviders);
        return model;
    }

    @RequestMapping(value = "/book")
    public ModelAndView portalBook(@ModelAttribute("journeyRequest") JourneyRequest  journeyRequest) throws URISyntaxException {
        ModelAndView m = null;
        m = appServc.getView(journeyRequest);
        return m;
    }

    @RequestMapping(value="/search")
    public ModelAndView portalSearch(@ModelAttribute("searchRequest") TimeTableRequest  searchRequest, 
            @RequestParam(name="sort_by", required = false) String sortBy,
            @RequestParam(name="s", required = false) String start,
            @RequestParam(name="orig", required = false) String originuic,
            @RequestParam(name="dest", required = false) String destinationuic, HttpSession session){

        /*System.out.println("*** Session data ***");
          Enumeration<String> e = session.getAttributeNames();
          while (e.hasMoreElements()){
            String s = e.nextElement();
            System.out.println(s);
            System.out.println("**" + session.getAttribute(s));
          }*/

        if(originuic!=null && destinationuic!=null){
            searchRequest.setChildren(0);
            searchRequest.setRailcards(null);
            searchRequest.setTravelclass("standard");
            searchRequest.setRetdatetime(null);
            searchRequest.setAdults(1);
            searchRequest.setDestinationuic(destinationuic);
            searchRequest.setOriginuic(originuic);  
            searchRequest.setReturnjry(false);
            searchRequest.setOutdatetime(CommonUtils.getFormatedDate(CTTConstant.DEFAULT_SEARCH_FORMAT, new Date()));
            searchRequest.setOutsearchTime(CommonUtils.getCurrentUTCTimeSearchable(false));
        }

        ModelAndView m = appServc.getView(searchRequest, sortBy, start);
        List<City> topCities = ctrepo.findTop10ByOrderByPriorityAsc();
        List<Route> topRoutes = rtrepo.findTop10ByOrderByPriorityAsc();
        m.addObject("topCities", topCities);
        m.addObject("topRoutes", topRoutes);
        List<BusProvider> topBusProviders = busrepo.findTop10ByPublishOrderByPriorityAsc(true);
        m.addObject("topBusProviders", topBusProviders);
        m.addObject("currentDate", CommonUtils.getFormatedDate(CTTConstant.DEFAULT_SEARCH_FORMAT, new Date()));
        return m;
    }

    @ModelAttribute("searchRequest")
    public TimeTableRequest createFormModelAttribute(HttpSession session) {
        TimeTableRequest req = (TimeTableRequest)session.getAttribute("searchRequest"); 
        if(req!=null)
            return req;
        TimeTableRequest req1 = new TimeTableRequest();
        req1.setAdults(1);
        req1.setOutdatetime(CommonUtils.getFormatedDate(CTTConstant.DEFAULT_SEARCH_FORMAT, new Date()));
        req1.setOutsearchTime(CommonUtils.getCurrentUTCTimeSearchable(false));
        req1.setRetsearchTime(CommonUtils.getCurrentUTCTimeSearchable(true));
        return req1;
    }

    @RequestMapping(value="/bus-search")
    public ModelAndView portalSearch(@ModelAttribute("searchBusRequest") ConnectionRequest  searchRequest, 
            @RequestParam(name="sort_by", required = false) String sortBy,
            @RequestParam(name="s", required = false) String start,
            @RequestParam(name="orig", required = false) String originuic,
            @RequestParam(name="dest", required = false) String destinationuic, HttpSession session){

        if(originuic!=null && destinationuic!=null){
            searchRequest.setChildren1(0);
            searchRequest.setRetdatetime(null);
            searchRequest.setAdults1(1);
            searchRequest.setDestinationuic1(destinationuic);
            searchRequest.setOriginuic1(originuic); 
            searchRequest.setReturnjry(false);
            searchRequest.setCurrency("EUR");
            searchRequest.setDatetime(CommonUtils.getFormatedDate(CTTConstant.DEFAULT_SEARCH_FORMAT, new Date()));
        }

        ModelAndView m = appServc.getView(searchRequest, sortBy, start);
        List<City> topCities = ctrepo.findTop10ByOrderByPriorityAsc();
        List<Route> topRoutes = rtrepo.findTop10ByOrderByPriorityAsc();
        m.addObject("topCities", topCities);
        m.addObject("topRoutes", topRoutes);
        List<BusProvider> topBusProviders = busrepo.findTop10ByPublishOrderByPriorityAsc(true);
        m.addObject("topBusProviders", topBusProviders);
        m.addObject("currentDate", CommonUtils.getFormatedDate(CTTConstant.DEFAULT_SEARCH_FORMAT, new Date()));
        return m;
    }

    @ModelAttribute("searchBusRequest")
    public ConnectionRequest createFormModelAttribute() {
        return new ConnectionRequest();
    }

    @ModelAttribute("journeyRequest")
    public JourneyRequest createFormModelAttribute1() {
        return new JourneyRequest();
    }    

    @RequestMapping(value="/{seo:.+}")
    public ModelAndView portalLocation(@PathVariable("seo") String seo, HttpServletResponse response, @RequestParam(name="status", required = false) String status){
        ModelAndView m = appServc.getView(seo, response, status);
        List<City> topCities = ctrepo.findTop10ByOrderByPriorityAsc();
        List<Route> topRoutes = rtrepo.findTop10ByOrderByPriorityAsc();
        m.addObject("topCities", topCities);
        m.addObject("topRoutes", topRoutes);
        List<BusProvider> topBusProviders = busrepo.findTop10ByPublishOrderByPriorityAsc(true);
        m.addObject("topBusProviders", topBusProviders);
        return m;
    }

    @RequestMapping(value="/{seo1}/{seo2:.+}")
    public ModelAndView portalChildLocation(@PathVariable("seo1") String seo1, @PathVariable("seo2") String seo2, HttpServletResponse response, @RequestParam(name="status", required = false) String status){
        ModelAndView m = appServc.getView(seo1+"/"+seo2, response, status);
        List<City> topCities = ctrepo.findTop10ByOrderByPriorityAsc();
        List<Route> topRoutes = rtrepo.findTop10ByOrderByPriorityAsc();
        m.addObject("topCities", topCities);
        m.addObject("topRoutes", topRoutes);
        List<BusProvider> topBusProviders = busrepo.findTop10ByPublishOrderByPriorityAsc(true);
        m.addObject("topBusProviders", topBusProviders);
        return m;
    }

    @ResponseBody
    @RequestMapping(value="/schedular/trains")
    public boolean portalSchedularToUpdateTrains(){
        appServc.updateTrainsForCityToCity();
        return true;
    }

    @RequestMapping(value = "/robots.txt")
    @ResponseBody
    public String getRobots(HttpServletRequest request) {
        return "User-agent: * \n Disallow: /";
    }

    @RequestMapping(value = "/sitemap.xml", method = RequestMethod.GET)
    @ResponseBody
    public XmlUrlSet getSiteMap(HttpServletRequest request) {
        XmlUrlSet xmlUrlSet = new XmlUrlSet();
        create(xmlUrlSet, "", "1.0", request);          
        List<SiteMap> seoUrls = siteMap.findByPublish(1);
        for(SiteMap sUrl : seoUrls){
            create(xmlUrlSet, "/"+sUrl.getSeoUrl(), null, request);
        }
        return xmlUrlSet;
    }

    private void create(XmlUrlSet xmlUrlSet, String link, String priority, HttpServletRequest request) {
        String rootUrl = request.getScheme() + "://" + request.getServerName() + request.getContextPath();
        xmlUrlSet.addUrl(new XmlUrl(rootUrl + link, priority));
    }

    @RequestMapping(value="/information/rail-cards")
    public ModelAndView railCardInfo(){
        ModelAndView model = new ModelAndView("railinfo");
        return model;
    }

    @RequestMapping(value="/form/post")
    public String formPost(@ModelAttribute("addRequest") CustomForm  addRequest){
        String r = appServc.addData(addRequest);
        return r;
    }


    @ExceptionHandler(Exception.class)
    public ModelAndView handleError(HttpServletRequest req, Exception ex) {
        ModelAndView m = new ModelAndView("exception");
        List<City> topCities = ctrepo.findTop10ByOrderByPriorityAsc();
        List<Route> topRoutes = rtrepo.findTop10ByOrderByPriorityAsc();
        m.addObject("topCities", topCities);
        m.addObject("topRoutes", topRoutes);
        List<BusProvider> topBusProviders = busrepo.findTop10ByPublishOrderByPriorityAsc(true);
        m.addObject("topBusProviders", topBusProviders);
        m.addObject("searchRequest", new TimeTableRequest());
        return m;
    }

}
package com.sdigital.controller;
导入java.net.URISyntaxException;
导入java.util.Date;
导入java.util.List;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
导入javax.servlet.http.HttpSession;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.stereotype.Controller;
导入org.springframework.web.bind.annotation.ExceptionHandler;
导入org.springframework.web.bind.annotation.ModelAttribute;
导入org.springframework.web.bind.annotation.PathVariable;
导入org.springframework.web.bind.annotation.RequestMapping;
导入org.springframework.web.bind.annotation.RequestMethod;
导入org.springframework.web.bind.annotation.RequestParam;
导入org.springframework.web.bind.annotation.ResponseBody;
导入org.springframework.web.bind.annotation.SessionAttributes;
导入org.springframework.web.servlet.ModelAndView;
导入com.sdigital.bus.distribution.domain.ConnectionRequest;
导入com.sdigital.cache.SearchCache;
导入com.sdigital.domain.JourneyRequest;
导入com.sdigital.domain.TimeTableRequest;
导入com.sdigital.domain.XmlUrl;
导入com.sdigital.domain.XmlUrlSet;
导入com.sdigital.model.BusProvider;
导入com.sdigital.model.City;
导入com.sdigital.model.CustomForm;
导入com.sdigital.model.Route;
导入com.sdigital.model.SeoConfig;
导入com.sdigital.model.SiteMap;
导入com.sdigital.repositories.BusProviderRepository;
导入com.sdigital.repositories.CityRepository;
导入com.sdigital.repositories.RouteRepository;
导入com.sdigital.repositories.SeoConfigRepository;
导入com.sdigital.repositories.SiteMapRepository;
导入com.sdigital.repositories.stationconfiggrepository;
导入com.sdigital.service.AppService;
导入com.sdigital.utils.CTTConstant;
导入com.sdigital.utils.CommonUtils;
@控制器
@SessionAttributes({“searchRequest”,“searchBusRequest”})
公共类AppController{
@自动连线
专用AppService appServc;
@自动连线
私人车站,可聚集街;
@自动连线
私有路由存储式rtrepo;
@自动连线
私人城市报告中心;
@自动连线
专用总线提供商存储库busrepo;
@自动连线
私人股票回购;
@自动连线
私有搜索缓存;
@自动连线
私有站点地图存储库站点地图;
@请求映射(“/”)
公共模型和视图主页(){
//List cttPopular=rtrepo.findOneByPopularType(CTTConstant.CTT\u POPULAR\u TYPE);
List cttPopular=ctrepo.findAllByOrderByPriorityAsc();
List popular=rtrepo.findByPopularType(CTTConstant.popular\u类型);
ModelAndView模型=新的ModelAndView(“索引”);
addObject(“cttPopular”,cttPopular);
model.addObject(“流行”,流行);
SeoConfig seoCon=repo.findByPageType(3);
model.addObject(“title”,seoCon.getPageTitle());
model.addObject(“meta_title”,seoCon.getMetaTitle());
addObject(“元描述”,seoCon.getMetaDescription());
addObject(“meta_关键字”,seoCon.getMetaKeywords());
addObject(“seo_url”,seoCon.getSeoUrl());
model.addObject(“description”,seoCon.getDescription());
model.addObject(“desc1”,seoCon.getDesc1());
model.addObject(“desc2”,seoCon.getDesc2());
model.addObject(“desc3”,seoCon.getDesc3());
List topCities=ctrepo.findTop10ByOrderByPriorityAsc();
List topRoutes=rtrepo.findTop10ByOrderByPriorityAsc();
model.addObject(“topCities”,topCities);
model.addObject(“topRoutes”,topRoutes);
List topBusProviders=busrepo.findTop10ByPublishOrderByPriorityAsc(true);
addObject(“topBusProviders”,topBusProviders);
收益模型;
}
@请求映射(value=“/book”)
公共ModelAndView portalBook(@ModelAttribute(“journeyRequest”)journeyRequest journeyRequest)引发URI语法异常{
ModelAndView m=null;
m=appServc.getView(journeyRequest);
返回m;
}
@请求映射(value=“/search”)
公共模型和视图portalSearch(@ModelAttribute(“searchRequest”)TimeTableRequest searchRequest,
@RequestParam(name=“sort_by”,required=false)字符串sortBy,
@RequestParam(name=“s”,required=false)字符串开始,
@RequestParam(name=“orig”,required=false)字符串originuic,
@RequestParam(name=“dest”,required=false)字符串destinationuic,HttpSession(会话){
/*System.out.println(“***会话数据***”);
枚举e=session.getAttributeNames();
而(e.hasMoreElements()){
字符串s=e.nextElement();
系统输出打印项次;
System.out.println(“**”+session.getAttribute));
}*/
if(originuic!=null&&destinationuic!=null){
searchRequest.setChildren(0);
searchRequest.setRailcards(空);
searchRequest.setTravelclass(“标准”);
searchRequest.setRetdatetime(null);
搜索请求。设置成人(1);
searchRequest.setdestinationic(destinationic);
searchRequest.setOriginuic(originuic);
searchRequest.setReturnjry(false);
searchRequest.setOutdatetime(CommonUtils.getFormattedDate(CTTConstant.DEFAULT_SEARCH_格式,new Date());
searchRequest.setOutsearchTime(CommonUtils.getCurrentUTCTimeSearchable(false));
}
ModelAndView m=appServc.getView(searchRequest,sortBy,start);
L
package com.sdigital;

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;


// TODO: Auto-generated Javadoc
/**
 * The Class ServletInitializer.
 */
public class ServletInitializer extends SpringBootServletInitializer {

    /* (non-Javadoc)
     * SpringApplication Builder
     */
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {        

        return application.sources(CTTApplication.class);
    }

}
package com.sdigital.controller;

import java.net.URISyntaxException;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;

import com.sdigital.bus.distribution.domain.ConnectionRequest;
import com.sdigital.cache.SearchCache;
import com.sdigital.domain.JourneyRequest;
import com.sdigital.domain.TimeTableRequest;
import com.sdigital.domain.XmlUrl;
import com.sdigital.domain.XmlUrlSet;
import com.sdigital.model.BusProvider;
import com.sdigital.model.City;
import com.sdigital.model.CustomForm;
import com.sdigital.model.Route;
import com.sdigital.model.SeoConfig;
import com.sdigital.model.SiteMap;
import com.sdigital.repositories.BusProviderRepository;
import com.sdigital.repositories.CityRepository;
import com.sdigital.repositories.RouteRepository;
import com.sdigital.repositories.SeoConfigRepository;
import com.sdigital.repositories.SiteMapRepository;
import com.sdigital.repositories.StationConfigRepository;
import com.sdigital.service.AppService;
import com.sdigital.utils.CTTConstant;
import com.sdigital.utils.CommonUtils;

@Controller
@SessionAttributes({"searchRequest", "searchBusRequest"})
public class AppController {

    @Autowired
    private AppService appServc;

    @Autowired
    private StationConfigRepository strepo;

    @Autowired
    private RouteRepository rtrepo;

    @Autowired
    private CityRepository ctrepo;

    @Autowired
    private BusProviderRepository busrepo;

    @Autowired
    private SeoConfigRepository repo;

    @Autowired
    private SearchCache searchCache;

    @Autowired
    private SiteMapRepository siteMap;

    @RequestMapping("/")
    public ModelAndView home(){
        //List<Route> cttPopular = rtrepo.findOneByPopularType(CTTConstant.CTT_POPULAR_TYPE);
        List<City> cttPopular = ctrepo.findAllByOrderByPriorityAsc();
        List<Route> popular = rtrepo.findByPopularType(CTTConstant.POPULAR_TYPE);
        ModelAndView model = new ModelAndView("index");
        model.addObject("cttPopular", cttPopular);
        model.addObject("popular", popular);
        SeoConfig seoCon = repo.findByPageType(3);
        model.addObject("title", seoCon.getPageTitle());
        model.addObject("meta_title", seoCon.getMetaTitle());
        model.addObject("meta_description", seoCon.getMetaDescription());
        model.addObject("meta_keywords", seoCon.getMetaKeywords());
        model.addObject("seo_url", seoCon.getSeoUrl());
        model.addObject("description", seoCon.getDescription());
        model.addObject("desc1", seoCon.getDesc1());
        model.addObject("desc2", seoCon.getDesc2());
        model.addObject("desc3", seoCon.getDesc3());
        List<City> topCities = ctrepo.findTop10ByOrderByPriorityAsc();
        List<Route> topRoutes = rtrepo.findTop10ByOrderByPriorityAsc();
        model.addObject("topCities", topCities);
        model.addObject("topRoutes", topRoutes);
        List<BusProvider> topBusProviders = busrepo.findTop10ByPublishOrderByPriorityAsc(true);
        model.addObject("topBusProviders", topBusProviders);
        return model;
    }

    @RequestMapping(value = "/book")
    public ModelAndView portalBook(@ModelAttribute("journeyRequest") JourneyRequest  journeyRequest) throws URISyntaxException {
        ModelAndView m = null;
        m = appServc.getView(journeyRequest);
        return m;
    }

    @RequestMapping(value="/search")
    public ModelAndView portalSearch(@ModelAttribute("searchRequest") TimeTableRequest  searchRequest, 
            @RequestParam(name="sort_by", required = false) String sortBy,
            @RequestParam(name="s", required = false) String start,
            @RequestParam(name="orig", required = false) String originuic,
            @RequestParam(name="dest", required = false) String destinationuic, HttpSession session){

        /*System.out.println("*** Session data ***");
          Enumeration<String> e = session.getAttributeNames();
          while (e.hasMoreElements()){
            String s = e.nextElement();
            System.out.println(s);
            System.out.println("**" + session.getAttribute(s));
          }*/

        if(originuic!=null && destinationuic!=null){
            searchRequest.setChildren(0);
            searchRequest.setRailcards(null);
            searchRequest.setTravelclass("standard");
            searchRequest.setRetdatetime(null);
            searchRequest.setAdults(1);
            searchRequest.setDestinationuic(destinationuic);
            searchRequest.setOriginuic(originuic);  
            searchRequest.setReturnjry(false);
            searchRequest.setOutdatetime(CommonUtils.getFormatedDate(CTTConstant.DEFAULT_SEARCH_FORMAT, new Date()));
            searchRequest.setOutsearchTime(CommonUtils.getCurrentUTCTimeSearchable(false));
        }

        ModelAndView m = appServc.getView(searchRequest, sortBy, start);
        List<City> topCities = ctrepo.findTop10ByOrderByPriorityAsc();
        List<Route> topRoutes = rtrepo.findTop10ByOrderByPriorityAsc();
        m.addObject("topCities", topCities);
        m.addObject("topRoutes", topRoutes);
        List<BusProvider> topBusProviders = busrepo.findTop10ByPublishOrderByPriorityAsc(true);
        m.addObject("topBusProviders", topBusProviders);
        m.addObject("currentDate", CommonUtils.getFormatedDate(CTTConstant.DEFAULT_SEARCH_FORMAT, new Date()));
        return m;
    }

    @ModelAttribute("searchRequest")
    public TimeTableRequest createFormModelAttribute(HttpSession session) {
        TimeTableRequest req = (TimeTableRequest)session.getAttribute("searchRequest"); 
        if(req!=null)
            return req;
        TimeTableRequest req1 = new TimeTableRequest();
        req1.setAdults(1);
        req1.setOutdatetime(CommonUtils.getFormatedDate(CTTConstant.DEFAULT_SEARCH_FORMAT, new Date()));
        req1.setOutsearchTime(CommonUtils.getCurrentUTCTimeSearchable(false));
        req1.setRetsearchTime(CommonUtils.getCurrentUTCTimeSearchable(true));
        return req1;
    }

    @RequestMapping(value="/bus-search")
    public ModelAndView portalSearch(@ModelAttribute("searchBusRequest") ConnectionRequest  searchRequest, 
            @RequestParam(name="sort_by", required = false) String sortBy,
            @RequestParam(name="s", required = false) String start,
            @RequestParam(name="orig", required = false) String originuic,
            @RequestParam(name="dest", required = false) String destinationuic, HttpSession session){

        if(originuic!=null && destinationuic!=null){
            searchRequest.setChildren1(0);
            searchRequest.setRetdatetime(null);
            searchRequest.setAdults1(1);
            searchRequest.setDestinationuic1(destinationuic);
            searchRequest.setOriginuic1(originuic); 
            searchRequest.setReturnjry(false);
            searchRequest.setCurrency("EUR");
            searchRequest.setDatetime(CommonUtils.getFormatedDate(CTTConstant.DEFAULT_SEARCH_FORMAT, new Date()));
        }

        ModelAndView m = appServc.getView(searchRequest, sortBy, start);
        List<City> topCities = ctrepo.findTop10ByOrderByPriorityAsc();
        List<Route> topRoutes = rtrepo.findTop10ByOrderByPriorityAsc();
        m.addObject("topCities", topCities);
        m.addObject("topRoutes", topRoutes);
        List<BusProvider> topBusProviders = busrepo.findTop10ByPublishOrderByPriorityAsc(true);
        m.addObject("topBusProviders", topBusProviders);
        m.addObject("currentDate", CommonUtils.getFormatedDate(CTTConstant.DEFAULT_SEARCH_FORMAT, new Date()));
        return m;
    }

    @ModelAttribute("searchBusRequest")
    public ConnectionRequest createFormModelAttribute() {
        return new ConnectionRequest();
    }

    @ModelAttribute("journeyRequest")
    public JourneyRequest createFormModelAttribute1() {
        return new JourneyRequest();
    }    

    @RequestMapping(value="/{seo:.+}")
    public ModelAndView portalLocation(@PathVariable("seo") String seo, HttpServletResponse response, @RequestParam(name="status", required = false) String status){
        ModelAndView m = appServc.getView(seo, response, status);
        List<City> topCities = ctrepo.findTop10ByOrderByPriorityAsc();
        List<Route> topRoutes = rtrepo.findTop10ByOrderByPriorityAsc();
        m.addObject("topCities", topCities);
        m.addObject("topRoutes", topRoutes);
        List<BusProvider> topBusProviders = busrepo.findTop10ByPublishOrderByPriorityAsc(true);
        m.addObject("topBusProviders", topBusProviders);
        return m;
    }

    @RequestMapping(value="/{seo1}/{seo2:.+}")
    public ModelAndView portalChildLocation(@PathVariable("seo1") String seo1, @PathVariable("seo2") String seo2, HttpServletResponse response, @RequestParam(name="status", required = false) String status){
        ModelAndView m = appServc.getView(seo1+"/"+seo2, response, status);
        List<City> topCities = ctrepo.findTop10ByOrderByPriorityAsc();
        List<Route> topRoutes = rtrepo.findTop10ByOrderByPriorityAsc();
        m.addObject("topCities", topCities);
        m.addObject("topRoutes", topRoutes);
        List<BusProvider> topBusProviders = busrepo.findTop10ByPublishOrderByPriorityAsc(true);
        m.addObject("topBusProviders", topBusProviders);
        return m;
    }

    @ResponseBody
    @RequestMapping(value="/schedular/trains")
    public boolean portalSchedularToUpdateTrains(){
        appServc.updateTrainsForCityToCity();
        return true;
    }

    @RequestMapping(value = "/robots.txt")
    @ResponseBody
    public String getRobots(HttpServletRequest request) {
        return "User-agent: * \n Disallow: /";
    }

    @RequestMapping(value = "/sitemap.xml", method = RequestMethod.GET)
    @ResponseBody
    public XmlUrlSet getSiteMap(HttpServletRequest request) {
        XmlUrlSet xmlUrlSet = new XmlUrlSet();
        create(xmlUrlSet, "", "1.0", request);          
        List<SiteMap> seoUrls = siteMap.findByPublish(1);
        for(SiteMap sUrl : seoUrls){
            create(xmlUrlSet, "/"+sUrl.getSeoUrl(), null, request);
        }
        return xmlUrlSet;
    }

    private void create(XmlUrlSet xmlUrlSet, String link, String priority, HttpServletRequest request) {
        String rootUrl = request.getScheme() + "://" + request.getServerName() + request.getContextPath();
        xmlUrlSet.addUrl(new XmlUrl(rootUrl + link, priority));
    }

    @RequestMapping(value="/information/rail-cards")
    public ModelAndView railCardInfo(){
        ModelAndView model = new ModelAndView("railinfo");
        return model;
    }

    @RequestMapping(value="/form/post")
    public String formPost(@ModelAttribute("addRequest") CustomForm  addRequest){
        String r = appServc.addData(addRequest);
        return r;
    }


    @ExceptionHandler(Exception.class)
    public ModelAndView handleError(HttpServletRequest req, Exception ex) {
        ModelAndView m = new ModelAndView("exception");
        List<City> topCities = ctrepo.findTop10ByOrderByPriorityAsc();
        List<Route> topRoutes = rtrepo.findTop10ByOrderByPriorityAsc();
        m.addObject("topCities", topCities);
        m.addObject("topRoutes", topRoutes);
        List<BusProvider> topBusProviders = busrepo.findTop10ByPublishOrderByPriorityAsc(true);
        m.addObject("topBusProviders", topBusProviders);
        m.addObject("searchRequest", new TimeTableRequest());
        return m;
    }

}