blob: ddb2d3e8f215acfb48c004a4dd6e7ec420a4fb55 [file] [log] [blame]
/*
* Copyright (c) 2012, 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.sample.sqlsupport;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import org.apache.zest.api.entity.EntityBuilder;
import org.apache.zest.api.query.Query;
import org.apache.zest.api.query.QueryBuilder;
import org.apache.zest.api.structure.Application;
import org.apache.zest.api.structure.Module;
import org.apache.zest.api.unitofwork.UnitOfWork;
import org.apache.zest.bootstrap.Energy4Java;
import org.apache.zest.entitystore.sql.assembly.PostgreSQLEntityStoreAssembler;
import org.apache.zest.entitystore.sql.internal.SQLs;
import org.apache.zest.index.sql.assembly.PostgreSQLIndexQueryAssembler;
import org.apache.zest.index.sql.support.postgresql.PostgreSQLAppStartup;
import org.apache.zest.library.sql.common.SQLConfiguration;
import org.apache.zest.library.sql.common.SQLUtil;
import static org.apache.zest.api.query.QueryExpressions.eq;
import static org.apache.zest.api.query.QueryExpressions.templateFor;
/**
* SQL Support Sample Main Class.
* <p><strong>psql postgres</strong></p>
* <p>CREATE USER jdbc_test_login WITH PASSWORD 'password';</p>
* <p>CREATE DATABASE jdbc_test_db;</p>
* <p>GRANT ALL PRIVILEGES ON DATABASE jdbc_test_db TO jdbc_test_login;</p>
* <p><strong>psql -d jdbc_test_db</strong></p>
* <p>CREATE EXTENSION ltree;</p>
*/
public class Main
{
public static void main( String[] args )
throws Exception
{
final Application application = new Energy4Java().newApplication( new AppAssembler() );
application.activate();
Runtime.getRuntime().addShutdownHook( new Thread( new Runnable()
{
@Override
@SuppressWarnings( "CallToThreadDumpStack" )
public void run()
{
try {
application.passivate();
} catch ( Exception ex ) {
System.err.println( "Unable to passivate Zest application!" );
ex.printStackTrace();
}
}
} ) );
Module domainModule = application.findModule( "app", "domain" );
int exitStatus = 0;
try {
UnitOfWork uow = domainModule.newUnitOfWork();
EntityBuilder<PretextEntity> builder = uow.newEntityBuilder( PretextEntity.class );
PretextEntity pretext = builder.instance();
pretext.reason().set( "Testing purpose" );
builder.newInstance();
uow.complete();
uow = domainModule.newUnitOfWork();
QueryBuilder<PretextEntity> queryBuilder = domainModule.newQueryBuilder( PretextEntity.class );
queryBuilder = queryBuilder.where( eq( templateFor( PretextEntity.class ).reason(), "Testing purpose" ) );
Query<PretextEntity> query = uow.newQuery( queryBuilder );
pretext = query.find();
if ( pretext == null ) {
System.err.println( "ERROR: Unable to find pretext!" );
exitStatus = -1;
} else {
System.out.println( "SUCCESS: Found Pretext with reason: " + pretext.reason().get() );
}
uow.discard();
} finally {
deleteData( application.findModule( "infra", "persistence" ) );
}
System.exit( exitStatus );
}
/**
* Completely delete data so the sample can be run multiple times.
*/
private static void deleteData( Module persistenceModule )
throws SQLException
{
// EntityStore Data
{
UnitOfWork uow = persistenceModule.newUnitOfWork();
try {
SQLConfiguration config = uow.get( SQLConfiguration.class,
PostgreSQLEntityStoreAssembler.DEFAULT_ENTITYSTORE_IDENTITY );
Connection connection = persistenceModule.findService( DataSource.class ).get().getConnection();
connection.setAutoCommit( false );
connection.setReadOnly( false );
String schemaName = config.schemaName().get();
if ( schemaName == null ) {
schemaName = SQLs.DEFAULT_SCHEMA_NAME;
}
Statement stmt = null;
try {
stmt = connection.createStatement();
stmt.execute( "DROP SCHEMA " + schemaName + " CASCADE" );
connection.commit();
} finally {
SQLUtil.closeQuietly( stmt );
}
} finally {
uow.discard();
}
}
// Indexing Data
{
UnitOfWork uow = persistenceModule.newUnitOfWork();
try {
SQLConfiguration config = uow.get( SQLConfiguration.class, PostgreSQLIndexQueryAssembler.DEFAULT_IDENTITY );
Connection connection = persistenceModule.findService( DataSource.class ).get().getConnection();
connection.setAutoCommit( false );
connection.setReadOnly( false );
String schemaName = config.schemaName().get();
if ( schemaName == null ) {
schemaName = PostgreSQLAppStartup.DEFAULT_SCHEMA_NAME;
}
Statement stmt = null;
try {
stmt = connection.createStatement();
stmt.execute( "DROP SCHEMA " + schemaName + " CASCADE" );
connection.commit();
} finally {
SQLUtil.closeQuietly( stmt );
SQLUtil.closeQuietly( connection );
}
} finally {
uow.discard();
}
}
}
}