/*****************************************************************
* 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.cayenne.tools;
import org.apache.cayenne.conn.DataSourceInfo;
import org.apache.cayenne.dbsync.DbSyncModule;
import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
import org.apache.cayenne.dbsync.reverse.configuration.ToolsModule;
import org.apache.cayenne.dbsync.reverse.dbimport.Catalog;
import org.apache.cayenne.dbsync.reverse.dbimport.DbImportAction;
import org.apache.cayenne.dbsync.reverse.dbimport.DbImportConfigurationValidator;
import org.apache.cayenne.dbsync.reverse.dbimport.DbImportConfiguration;
import org.apache.cayenne.dbsync.reverse.dbimport.DbImportModule;
import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeColumn;
import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeProcedure;
import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeTable;
import org.apache.cayenne.dbsync.reverse.dbimport.IncludeColumn;
import org.apache.cayenne.dbsync.reverse.dbimport.IncludeProcedure;
import org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable;
import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
import org.apache.cayenne.dbsync.reverse.dbimport.Schema;
import org.apache.cayenne.dbsync.reverse.filters.FiltersConfigBuilder;
import org.apache.cayenne.di.DIBootstrap;
import org.apache.cayenne.di.Injector;
import org.apache.cayenne.util.Util;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.slf4j.Logger;
import org.apache.tools.ant.Task;
import java.io.File;
public class DbImporterTask extends Task {
private final DbImportConfiguration config;
private ReverseEngineering reverseEngineering;
public DbImporterTask() {
this.config = new DbImportConfiguration();
this.config.setUsePrimitives(true);
this.config.setUseJava7Types(false);
this.config.setNamingStrategy(DefaultObjectNameGenerator.class.getName());
// reverse engineering config is flattened into task...
this.reverseEngineering = new ReverseEngineering();
}
public void addIncludeColumn(IncludeColumn includeColumn) {
reverseEngineering.addIncludeColumn(includeColumn);
}
public void addExcludeColumn(ExcludeColumn excludeColumn) {
reverseEngineering.addExcludeColumn(excludeColumn);
}
public void addIncludeTable(IncludeTable includeTable) {
reverseEngineering.addIncludeTable(includeTable);
}
public void addExcludeTable(ExcludeTable excludeTable) {
reverseEngineering.addExcludeTable(excludeTable);
}
public void addIncludeProcedure(IncludeProcedure includeProcedure) {
reverseEngineering.addIncludeProcedure(includeProcedure);
}
public void addExcludeProcedure(ExcludeProcedure excludeProcedure) {
reverseEngineering.addExcludeProcedure(excludeProcedure);
}
public void setSkipRelationshipsLoading(boolean skipRelationshipsLoading) {
reverseEngineering.setSkipRelationshipsLoading(skipRelationshipsLoading);
}
public void setSkipPrimaryKeyLoading(boolean skipPrimaryKeyLoading) {
reverseEngineering.setSkipPrimaryKeyLoading(skipPrimaryKeyLoading);
}
public void addConfiguredTableType(AntTableType type) {
reverseEngineering.addTableType(type.getName());
}
public void addConfiguredSchema(Schema schema) {
reverseEngineering.addSchema(schema);
}
public void addCatalog(Catalog catalog) {
reverseEngineering.addCatalog(catalog);
}
@Override
public void execute() {
config.setFiltersConfig(new FiltersConfigBuilder(reverseEngineering).build());
validateAttributes();
Logger logger = new AntLogger(this);
config.setLogger(logger);
config.setSkipRelationshipsLoading(reverseEngineering.getSkipRelationshipsLoading());
config.setSkipPrimaryKeyLoading(reverseEngineering.getSkipPrimaryKeyLoading());
config.setTableTypes(reverseEngineering.getTableTypes());
Injector injector = DIBootstrap.createInjector(new DbSyncModule(), new ToolsModule(logger), new DbImportModule());
DbImportConfigurationValidator validator = new DbImportConfigurationValidator(reverseEngineering, config, injector);
try {
validator.validate();
} catch (Exception ex) {
throw new BuildException(ex.getMessage(), ex);
}
try {
injector.getInstance(DbImportAction.class).execute(config);
} catch (Exception ex) {
Throwable th = Util.unwindException(ex);
String message = "Error importing database schema";
if (th.getLocalizedMessage() != null) {
message += ": " + th.getLocalizedMessage();
}
log(message, Project.MSG_ERR);
throw new BuildException(message, th);
} finally {
injector.shutdown();
}
}
/**
* Validates attributes that are not related to internal
* DefaultClassGenerator. Throws BuildException if attributes are invalid.
*/
protected void validateAttributes() throws BuildException {
StringBuilder error = new StringBuilder("");
if (config.getTargetDataMap() == null) {
error.append("The 'map' attribute must be set.\n");
}
DataSourceInfo dataSourceInfo = config.getDataSourceInfo();
if (dataSourceInfo.getJdbcDriver() == null) {
error.append("The 'driver' attribute must be set.\n");
}
if (dataSourceInfo.getDataSourceUrl() == null) {
error.append("The 'url' attribute must be set.\n");
}
if (error.length() > 0) {
throw new BuildException(error.toString());
}
}
/**
* @since 4.0
*/
public void setDefaultPackage(String defaultPackage) {
config.setDefaultPackage(defaultPackage);
}
/**
* @since 4.0
*/
public void setMeaningfulPkTables(String meaningfulPkTables) {
config.setMeaningfulPkTables(meaningfulPkTables);
}
public void setNamingStrategy(String namingStrategy) {
config.setNamingStrategy(namingStrategy);
}
/**
* @since 4.0
*/
public void setStripFromTableNames(String pattern) {
config.setStripFromTableNames(pattern);
}
public void setAdapter(String adapter) {
config.setAdapter(adapter);
}
public void setDriver(String driver) {
config.setDriver(driver);
}
public void setPassword(String password) {
config.setPassword(password);
}
public void setUrl(String url) {
config.setUrl(url);
}
public void setUserName(String username) {
config.setUsername(username);
}
public void setUsePrimitives(boolean flag) {
config.setUsePrimitives(flag);
}
public void setUseJava7Types(boolean flag) {
config.setUseJava7Types(flag);
}
public void setForceDataMapCatalog(boolean flag) {
config.setForceDataMapCatalog(flag);
}
public void setForceDataMapSchema(boolean flag) {
config.setForceDataMapSchema(flag);
}
public ReverseEngineering getReverseEngineering() {
return reverseEngineering;
}
public File getMap() {
return config.getTargetDataMap();
}
public void setMap(File map) {
config.setTargetDataMap(map);
}
public DbImportConfiguration toParameters() {
return config;
}
}