Projet

Général

Profil

Télécharger (6,13 ko) Statistiques
| Branche: | Tag: | Révision:
/*
* Copyright (C) 2007 ETH Zurich
*
* This file is part of Fosstrak (www.fosstrak.org).
*
* Fosstrak is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* Fosstrak is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with Fosstrak; if not, write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
/*
* Copied from org.fosstrak.epcis.repository.query.QueryInitServlet
*/
package fr.unicaen.iota.eta.query;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.sql.DataSource;
import javax.xml.ws.Endpoint;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.cxf.BusFactory;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.transport.servlet.CXFNonSpringServlet;
import org.fosstrak.epcis.soap.EPCISServicePortType;

/**
* This HttpServlet is used to initialize the QueryOperationsModule. It will
* read the application's properties file from the class path, read the data
* source from a JNDI name, and load the CXF Web service bus in order to set up
* the QueryOperationsModule with the required values. <p> Note: this servlet is
* only required if you do not wire the application with Spring! To use this
* servlet, and bypass Spring, replace
* <code>WEB-INF/web.xml</code> with
* <code>WEB-INF/non-spring-web.xml</code>.
*/
public class QueryInitServlet extends CXFNonSpringServlet {

private static final long serialVersionUID = -5839101192038037389L;
private static final String APP_CONFIG_LOCATION = "appConfigLocation";
private static final String PROP_SERVICE_VERSION = "service.version";
private static final String PROP_JNDI_DATASOURCE_NAME = "jndi.datasource.name";
private static final Log LOG = LogFactory.getLog(QueryInitServlet.class);
private Properties properties;

/**
* {@inheritDoc}
*
* @see
* org.apache.cxf.transport.servlet.CXFNonSpringServlet#loadBus(javax.servlet.ServletConfig)
*/
@Override
public void loadBus(ServletConfig servletConfig) throws ServletException {
super.loadBus(servletConfig);
BusFactory.setDefaultBus(getBus());
if (LOG.isDebugEnabled()) {
getBus().getInInterceptors().add(new LoggingInInterceptor());
getBus().getOutInterceptors().add(new LoggingOutInterceptor());
getBus().getOutFaultInterceptors().add(new LoggingOutInterceptor());
getBus().getInFaultInterceptors().add(new LoggingInInterceptor());
}
EPCISServicePortType service = setupQueryOperationsModule(servletConfig);

LOG.debug("Publishing query operations module service at /query");
Endpoint.publish("/query", service);
}

private EPCISServicePortType setupQueryOperationsModule(ServletConfig servletConfig) {
loadApplicationProperties(servletConfig);
String jndiName = properties.getProperty(PROP_JNDI_DATASOURCE_NAME);
DataSource dataSource = loadDataSource(jndiName);

LOG.debug("Initializing query operations module");
QueryOperationsModule module = new QueryOperationsModule();
module.setServiceVersion(properties.getProperty(PROP_SERVICE_VERSION));
module.setDataSource(dataSource);
module.setServletContext(servletConfig.getServletContext());
module.setBackend(new QueryOperationsBackendSQL());

LOG.debug("Initializing query operations web service");
QueryOperationsWebService service = new QueryOperationsWebService(module);
return service;
}

/**
* Loads the application property file and populates a java.util.Properties
* instance.
*
* @param servletConfig The ServletConfig used to locate the application
* property file.
*/
private void loadApplicationProperties(ServletConfig servletConfig) {
properties = new Properties();

// read application.properties from classpath
String path = "/";
String appConfigFile = "application.properties";
InputStream is = QueryInitServlet.class.getResourceAsStream(path + appConfigFile);

try {
if (is == null) {
// read properties from file specified in servlet context
ServletContext ctx = servletConfig.getServletContext();
path = ctx.getRealPath("/");
appConfigFile = ctx.getInitParameter(APP_CONFIG_LOCATION);
is = new FileInputStream(path + appConfigFile);
}
properties.load(is);
is.close();
LOG.debug("Loaded application properties from " + path + appConfigFile);
} catch (IOException e) {
LOG.error("Unable to load application properties from " + path + appConfigFile, e);
}
}

/**
* Loads the data source from the application context via JNDI.
*
* @param jndiName The name of the JNDI data source holding the connection
* to the database.
* @return The application DataSource instance.
*/
private DataSource loadDataSource(String jndiName) {
DataSource dataSource = null;
try {
Context ctx = new InitialContext();
dataSource = (DataSource) ctx.lookup(jndiName);
LOG.debug("Loaded data source via JNDI from " + jndiName);
} catch (NamingException e) {
LOG.error("Unable to load data source via JNDI from " + jndiName, e);
}
return dataSource;
}
}
(2-2/7)