Ejemplo n.º 1
0
  @Override
  public void init(ServletConfig servletConfig) throws ServletException {
    super.init(servletConfig);

    NcwmsConfig config;
    /*
     * Set the default dataset factory - will be used when a dataset factory
     * name is not specified
     */
    DatasetFactory.setDefaultDatasetFactoryClass(CdmGridDatasetFactory.class);

    /*
     * Load the XML config for ncWMS, or create it if it doesn't yet exist.
     */
    Properties appProperties = new Properties();

    String configDir = null;
    String homeDir = System.getProperty("user.home").replace("\\", "\\\\");
    try {
      /*
       * See if we have a properties file which defines a configDir,
       * replacing $HOME with the actual home directory
       */
      appProperties.load(getClass().getResourceAsStream("/config.properties"));
      configDir = appProperties.getProperty("configDir");
      if (configDir != null) {
        configDir = configDir.replaceAll("\\$HOME", homeDir);
      }
    } catch (Exception e) {
      configDir = null;
      e.printStackTrace();
    }

    /*
     * If we didn't define a config directory, use the user's home as a
     * default
     */
    if (configDir == null) {
      configDir = homeDir + File.separator + ".ncWMS-edal";
    }

    /*
     * If the config location doesn't exist, create it.
     */
    File configDirFile = new File(configDir);
    if (!configDirFile.exists()) {
      configDirFile.mkdirs();
    }

    DatasetFactory.setWorkingDirectory(configDirFile);

    /*
     * If necessary, create a directory for logs.
     */
    File logDirFile = new File(configDir + File.separator + "logs");
    if (!logDirFile.exists()) {
      logDirFile.mkdir();
    }

    /*
     * Get the file appending logger and set the log location
     */
    // Set up the log4j logging system
    Properties logProps = new Properties();
    InputStream log4jInputStream = getClass().getResourceAsStream("/log4j.properties");
    try {
      logProps.load(log4jInputStream);
      logProps.put("log4j.appender.file.File", logDirFile.getPath() + File.separator + "ncwms.log");
      PropertyConfigurator.configure(logProps);
    } catch (IOException e) {
      log.error("Problem setting logging properties", e);
      /*
       * This is a problem, but not a fatal one.  Logging will go to its default location.
       */
    }

    /*
     * Now either create or read the ncWMS config.xml
     */
    File configFile = new File(configDir + File.separator, "config.xml");
    try {
      if (configFile.exists()) {
        config = NcwmsConfig.readFromFile(configFile);
      } else {
        config = new NcwmsConfig(configFile);
      }

    } catch (JAXBException e) {
      log.error("Config file is invalid - creating new one", e);
      try {
        config = new NcwmsConfig(configFile);
      } catch (Exception e1) {
        throw new ServletException("Old config is invalid, and a new one cannot be created", e1);
      }
    } catch (FileNotFoundException e) {
      /*
       * We shouldn't get here. It means that we've checked that a config
       * file exists and then the FileReader has thrown a
       * FileNotFoundException
       */
      log.error(
          "Cannot find config file - has it been deleted during startup?  Creating new one", e);
      try {
        config = new NcwmsConfig(configFile);
      } catch (Exception e1) {
        throw new ServletException("Old config is missing, and a new one cannot be created", e1);
      }
    } catch (IOException e) {
      log.error("Problem writing new config file", e);
      throw new ServletException("Cannot create a new config file", e);
    }
    try {
      catalogue = new NcwmsCatalogue(config);
    } catch (IOException e) {
      log.error("Problem loading datasets", e);
    }

    /*
     * Store the config in the ServletContext, so that the other servlets
     * can access it. All other servlets are loaded after this one.
     */
    servletConfig.getServletContext().setAttribute("NcwmsCatalogue", catalogue);

    /*
     * Now create a VelocityEngine to load velocity templates, and make it
     * available to other servlets in the same way
     */
    Properties props = new Properties();
    props.put("resource.loader", "class");
    props.put(
        "class.resource.loader.class",
        "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
    velocityEngine = new VelocityEngine();
    velocityEngine.setProperty(
        RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS,
        "org.apache.velocity.runtime.log.Log4JLogChute");
    velocityEngine.setProperty("runtime.log.logsystem.log4j.logger", "velocity");
    velocityEngine.init(props);
    servletConfig.getServletContext().setAttribute("VelocityEngine", velocityEngine);
  }