blob: 269733cbb24fa3a343abb1f4e6c01237c20de9e5 [file] [log] [blame]
/*
* Copyright (c) 2010, Stanislav Muhametsin. All Rights Reserved.
* Copyright (c) 2010, Paul Merlin. All Rights Reserved.
*
* 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.apache.zest.entitystore.sql.internal;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import org.apache.zest.api.configuration.Configuration;
import org.apache.zest.api.injection.scope.Service;
import org.apache.zest.api.injection.scope.Structure;
import org.apache.zest.api.injection.scope.This;
import org.apache.zest.api.injection.scope.Uses;
import org.apache.zest.api.service.ServiceDescriptor;
import org.apache.zest.api.structure.Application;
import org.apache.zest.api.structure.Application.Mode;
import org.apache.zest.api.util.NullArgumentException;
import org.apache.zest.library.sql.common.SQLConfiguration;
import org.apache.zest.library.sql.common.SQLUtil;
import org.apache.zest.spi.entitystore.EntityStoreException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sql.generation.api.vendor.SQLVendor;
@SuppressWarnings( "ProtectedField" )
public abstract class DatabaseSQLServiceCoreMixin
implements DatabaseSQLService
{
private static final Logger LOGGER = LoggerFactory.getLogger( DatabaseSQLServiceCoreMixin.class );
@Structure
private Application application;
@Service
private DataSource dataSource;
@This
private DatabaseSQLServiceState state;
@This
protected DatabaseSQLServiceSpi spi;
@This
private DatabaseSQLStringsBuilder sqlStrings;
@Uses
private ServiceDescriptor descriptor;
@This
private Configuration<SQLConfiguration> configuration;
@Override
public Connection getConnection()
throws SQLException
{
return dataSource.getConnection();
}
@Override
public void startDatabase()
throws Exception
{
Connection connection = getConnection();
String schema = this.getConfiguredSchemaName( SQLs.DEFAULT_SCHEMA_NAME );
if ( schema == null ) {
throw new EntityStoreException( "Schema name must not be null." );
} else {
state.schemaName().set( schema );
state.vendor().set( this.descriptor.metaInfo( SQLVendor.class ) );
sqlStrings.init();
if ( !spi.schemaExists( connection ) ) {
LOGGER.debug( "Database Schema '{}' NOT found!", schema );
Statement stmt = null;
try {
stmt = connection.createStatement();
for ( String sql : sqlStrings.buildSQLForSchemaCreation() ) {
stmt.execute( sql );
}
} finally {
SQLUtil.closeQuietly( stmt );
}
LOGGER.debug( "Database Schema '{}' created", schema );
}
if ( !spi.tableExists( connection ) ) {
Statement stmt = null;
try {
stmt = connection.createStatement();
for ( String sql : sqlStrings.buildSQLForTableCreation() ) {
stmt.execute( sql );
}
for ( String sql : sqlStrings.buildSQLForIndexCreation() ) {
stmt.execute( sql );
}
} finally {
SQLUtil.closeQuietly( stmt );
}
LOGGER.trace( "Table {} created", SQLs.TABLE_NAME );
}
connection.setAutoCommit( false );
}
SQLUtil.closeQuietly( connection );
}
@Override
public void stopDatabase()
throws Exception
{
if ( Mode.production == application.mode() ) {
// NOOP
}
}
/**
* Configuration is optional at both assembly and runtime.
*/
protected String getConfiguredSchemaName( String defaultSchemaName )
{
if ( configuration == null ) {
NullArgumentException.validateNotNull( "default schema name", defaultSchemaName );
LOGGER.debug( "No configuration, will use default schema name: '{}'", defaultSchemaName );
return defaultSchemaName;
}
String result = configuration.get().schemaName().get();
if ( result == null ) {
NullArgumentException.validateNotNull( "default schema name", defaultSchemaName );
result = defaultSchemaName;
LOGGER.debug( "No database schema name in configuration, will use default: '{}'", defaultSchemaName );
} else {
LOGGER.debug( "Will use configured database schema name: '{}'", result );
}
return result;
}
}