blob: 4de59336ecc6df8af9083ca7adf2d4a34ecc5f1a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.empire.samples.cxf.wssample.server;
import java.sql.Connection;
import java.sql.DriverManager;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import org.apache.empire.db.DBCommand;
import org.apache.empire.db.DBDatabaseDriver;
import org.apache.empire.db.DBRecord;
import org.apache.empire.db.DBSQLScript;
import org.apache.empire.db.hsql.DBDatabaseDriverHSql;
import org.apache.empire.db.mysql.DBDatabaseDriverMySQL;
import org.apache.empire.db.oracle.DBDatabaseDriverOracle;
import org.apache.empire.db.sqlserver.DBDatabaseDriverMSSQL;
import org.apache.empire.samples.cxf.wssample.common.EmployeeService;
import org.apache.empire.samples.cxf.wssample.server.db.SampleDB;
public class ServerControl
{
private static final Log log = LogFactory.getLog(EmployeeServiceImpl.class);
public static final String serviceName = "employeeService";
public static final String serviceAddress = "http://localhost:8081/" + serviceName;
private SampleDB db = null;
private Connection conn = null;
private SampleConfig config = null;
private DBDatabaseDriver driver = null;
private String configPath = "config.xml";
private org.apache.cxf.endpoint.Server endpoint = null;
private JaxWsServerFactoryBean svrFactory = null;
public ServerControl()
{
init();
}
// stops the service
public void stop()
{
db.commit(conn);
log.info("[stop] commit to database");
db.close(conn);
log.info("[stop] close database connection");
endpoint.stop();
log.info("[stop] stopped werbservice endpoint");
}
// starts the service
public void start()
{
// create the server
endpoint = svrFactory.create();
// service is now created and may be started
log.info("[init] " + serviceName + " successfully created ...");
if (endpoint != null)
{
db.open(driver, conn);
endpoint.start();
log.info("[start] " + serviceName + " successfully started!");
} else
{
log.error("[start] The webservice seems not to be initialized correctly!");
}
}
public void appendLogger(LoggingOutInterceptor out, LoggingInInterceptor in)
{
svrFactory.getOutInterceptors().add(out);
svrFactory.getInInterceptors().add(in);
}
private void init()
{
initDB();
initWS();
}
/*
* init database, create tables if necessary ...
*/
private void initDB()
{
config = new SampleConfig();
db = new SampleDB();
config.init(configPath);
driver = getDatabaseDriver(config.getDatabaseProvider());
conn = getJDBCConnection();
// Open Database (and create if not existing)
log.info("*** open database ***");
db.open(driver, conn);
if (!databaseExists(conn))
{
// STEP 4: Create Database
log.info("*** create Database ***");
createSampleDatabase(driver, conn);
}
log.info("[init] Database successfully initialized!");
}
/*
* init webservice, create implemantion, connect to server ...
*/
private void initWS()
{
// create new instance of the service implmentation
EmployeeService impl = new EmployeeServiceImpl(db, conn);
// construct/configure factory to create our specific service
svrFactory = new JaxWsServerFactoryBean();
//svrFactory.getInInterceptors().add(new LoggingInInterceptor());
//svrFactory.getOutInterceptors().add(new LoggingOutInterceptor());
// specify our implementation class
svrFactory.setServiceClass(EmployeeService.class);
// specify the address
svrFactory.setAddress(serviceAddress);
// set the instance to be used
svrFactory.setServiceBean(impl);
}
private Connection getJDBCConnection()
{
// Establish a new database connection
Connection conn = null;
String jdbcURL = config.getJdbcURL();
// Connect
log.info("Connecting to Database'" + jdbcURL + "' / User=" + config.getJdbcUser());
try
{ // Connect to the databse
Class.forName(config.getJdbcClass()).newInstance();
conn = DriverManager.getConnection(jdbcURL, config.getJdbcUser(), config.getJdbcPwd());
log.info("Connected successfully");
// Set the AutoCommit to false this session.
// You must commit explicitly now.
conn.setAutoCommit(false);
log.info("AutoCommit is " + conn.getAutoCommit());
} catch (Exception e)
{
log.error("Failed to connect directly to '" + config.getJdbcURL() + "' / User=" + config.getJdbcUser());
log.error(e.toString());
throw new RuntimeException(e);
}
return conn;
}
private DBDatabaseDriver getDatabaseDriver(String provider)
{
if (provider.equalsIgnoreCase("mysql"))
{
DBDatabaseDriverMySQL driver = new DBDatabaseDriverMySQL();
// Set Driver specific properties (if any)
driver.setDatabaseName(config.getSchemaName());
return driver;
} else if (provider.equalsIgnoreCase("oracle"))
{
DBDatabaseDriverOracle driver = new DBDatabaseDriverOracle();
// Set Driver specific properties (if any)
return driver;
} else if (provider.equalsIgnoreCase("sqlserver"))
{
DBDatabaseDriverMSSQL driver = new DBDatabaseDriverMSSQL();
// Set Driver specific properties (if any)
driver.setDatabaseName(config.getSchemaName());
return driver;
} else if (provider.equalsIgnoreCase("hsqldb"))
{
DBDatabaseDriverHSql driver = new DBDatabaseDriverHSql();
// Set Driver specific properties (if any)
return driver;
} else
{ // Unknown Provider
throw new RuntimeException("Unknown Database Provider " + provider);
}
}
private boolean databaseExists(Connection conn)
{
// Check wether DB exists
DBCommand cmd = db.createCommand();
cmd.select(db.DEPARTMENTS.count());
int deps = db.querySingleInt(cmd, -1, conn);
return (deps >= 0);
}
/*
* creates a DDL Script for the entire SampleDB Database then checks if the department table exists by running
* "select count(*) from DEPARTMENTS" if the department tables does not exist, the entire dll-script is executed line by
* line
*/
private void createSampleDatabase(DBDatabaseDriver driver, Connection conn)
{
// create DLL for Database Definition
DBSQLScript script = new DBSQLScript();
db.getCreateDDLScript(driver, script);
// Show DLL Statements
System.out.println(script.toString());
// Execute Script
script.executeAll(driver, conn, false);
db.commit(conn);
// Open again
if (!db.isOpen()){
db.open(driver, conn);
}
// Insert Sample Departments
int idDevDep = insertDepartmentSampleRecord(conn, "Development", "ITTK");
int idSalDep = insertDepartmentSampleRecord(conn, "Sales", "ITTK");
// Insert Sample Employees
insertEmployeeSampleRecord(conn, "Mr.", "Eugen", "Miller", "M", idDevDep);
insertEmployeeSampleRecord(conn, "Mr.", "Max", "Mc. Callahan", "M", idDevDep);
insertEmployeeSampleRecord(conn, "Mrs.", "Anna", "Smith", "F", idSalDep);
// Commit
db.commit(conn);
}
/*
* Insert a department
*/
private int insertDepartmentSampleRecord(Connection conn, String department_name, String businessUnit)
{
// Insert a Department
DBRecord rec = new DBRecord();
rec.create(db.DEPARTMENTS);
rec.setValue(db.DEPARTMENTS.NAME, department_name);
rec.setValue(db.DEPARTMENTS.BUSINESS_UNIT, businessUnit);
rec.update(conn);
// Return Department ID
return rec.getInt(db.DEPARTMENTS.DEPARTMENT_ID);
}
/*
* Insert a person
*/
private int insertEmployeeSampleRecord(Connection conn, String salutation, String firstName, String lastName,
String gender, int depID)
{
// Insert an Employee
DBRecord rec = new DBRecord();
rec.create(db.EMPLOYEES);
rec.setValue(db.EMPLOYEES.SALUTATION, salutation);
rec.setValue(db.EMPLOYEES.FIRSTNAME, firstName);
rec.setValue(db.EMPLOYEES.LASTNAME, lastName);
rec.setValue(db.EMPLOYEES.GENDER, gender);
rec.setValue(db.EMPLOYEES.DEPARTMENT_ID, depID);
rec.update(conn);
// Return Employee ID
return rec.getInt(db.EMPLOYEES.EMPLOYEE_ID);
}
}