package net.sf.minuteProject.integration.bean;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.lang.StringUtils;
import net.sf.minuteProject.configuration.bean.BeanCommon;
import net.sf.minuteProject.configuration.bean.BusinessModel;
import net.sf.minuteProject.configuration.bean.BusinessPackage;
import net.sf.minuteProject.configuration.bean.Condition;
import net.sf.minuteProject.configuration.bean.Configuration;
import net.sf.minuteProject.configuration.bean.DataModel;
import net.sf.minuteProject.configuration.bean.GenerationCondition;
import net.sf.minuteProject.configuration.bean.Model;
import net.sf.minuteProject.configuration.bean.Target;
import net.sf.minuteProject.configuration.bean.Targets;
import net.sf.minuteProject.configuration.bean.WebServiceModel;
import net.sf.minuteProject.configuration.bean.connection.Driver;
import net.sf.minuteProject.configuration.bean.enrichment.Enrichment;
import net.sf.minuteProject.configuration.bean.enrichment.convention.Convention;
import net.sf.minuteProject.configuration.bean.enrichment.convention.Conventions;
import net.sf.minuteProject.configuration.bean.enrichment.convention.KernelConvention;
import net.sf.minuteProject.configuration.bean.enrichment.convention.TableDefaultPrimaryKeyConvention;
import net.sf.minuteProject.configuration.bean.enrichment.convention.TargetConvention;
import net.sf.minuteProject.configuration.bean.enrichment.convention.ViewPrimaryKeyConvention;
import net.sf.minuteProject.configuration.bean.strategy.datamodel.PrimaryKeyPolicy;
import net.sf.minuteProject.configuration.bean.strategy.datamodel.PrimaryKeyPolicyPattern;
import net.sf.minuteProject.configuration.bean.strategy.datamodel.PrimaryKeyPolicyPatternEnum;
import net.sf.minuteProject.loader.catalog.databasecatalog.node.Database;
import net.sf.minuteProject.loader.catalog.databasecatalog.node.MavenArtifact;
import net.sf.minuteProject.loader.catalog.technologycatalog.TechnologycatalogHolder;
import net.sf.minuteProject.loader.catalog.technologycatalog.node.Technology;
import net.sf.minuteProject.utils.catalog.CatalogUtils;
import net.sf.minuteProject.utils.catalog.DatabaseCatalogUtils;
import net.sf.minuteProject.utils.catalog.TechnologyCatalogUtils;
import net.sf.minuteProject.utils.io.FileUtils;
import net.sf.minuteProject.utils.parser.ParserUtils;
import net.sf.minuteProject.utils.technology.TechnologyUtils;
public class BasicIntegrationConfiguration extends BeanCommon{
private String
schema,
driver,
url,
username,
password,
targetTechnology,
database,
rootpackage,
businesspackage,
version,
modelName,
outputDir,
catalogDir,
sequencePattern,
sequenceGlobalName,
sequenceEntitySuffix,
filterFile,
filterFileType,
virtualPrimaryKey,
templateRootDir
;
private PrimaryKeyPolicyPatternEnum primaryKeyPolicy;
private Technology choosenTechnology;
private Database choosenDatabase;
private List<Condition> conditions;
private List<Convention> conventions, kernelConventions;
private Boolean areTablesIncluded, areViewsIncluded, enableUpdatableAreaConvention, isPkConventionSet=false;
private WebServiceModel webServiceModel;
public Configuration getConfiguration () {
Configuration configuration = new Configuration();
configuration.setModel(getModel());
configuration.setTargets(getTargets());
configuration.setCatalogDir(getCatalogDir());
configuration.setConventions(getKernelConventions());
return configuration;
}
private Targets getTargets() {
Targets targets = new Targets();
// Target target = getChoosenTarget();
// targets.addTarget(target);
for (Target target2 : getAllRelatedTechnologies()) {
targets.addTarget(target2);
}
return targets;
}
private List<Target> getDependentTargetTechnologies() {
List<Target> list = new ArrayList<Target>();
List<Technology> technologies = TechnologyCatalogUtils.getDependentTechnologies(getChoosenTechnology(), getCatalogDir());
for (Technology technology : technologies) {
list.add(getTarget(technology, false));
}
return list;
}
private List<Target> getAllRelatedTechnologies() {
boolean isDefaultOutputToAppend = false;
List<Target> list = new ArrayList<Target>();
List<Technology> technologies = TechnologyCatalogUtils.getAllRelatedTechnologies(getChoosenTechnology(), getCatalogDir());
// if (isDefaultOutputToAppend(technologies))
isDefaultOutputToAppend = true;
for (Technology technology : technologies) {
// //add properties
// technology.getProperties().addAll(getChoosenTechnology().getProperties());
list.add(getTarget(technology, isDefaultOutputToAppend));
}
return list;
}
private boolean isDefaultOutputToAppend(List<Technology> technologies) {
int i = 0;
for (Technology technology : technologies) {
if (technology.isGenerable())
i++;
if (i>1)
return true;
}
return false;
}
private Target getTarget(Technology technology, boolean isDefaultOutputToAppend) {
Target target = new Target();
target.setName(technology.getName());
target.setProperties(technology.getProperties());
target.setFileName(technology.getTemplateConfigFileName());
target.setDir(getTemplateSetFullPath(technology.getTemplateConfigFileName()));
target.setTemplatedirRoot(TechnologyUtils.getTechnologyTemplateDir(technology, templateRootDir));
target.setOutputdirRoot(getOutputDir(technology, isDefaultOutputToAppend));
target.setIsGenerable(technology.isGenerable());
return target;
}
private String getTemplateSetFullPathAndFileName(String fileName) {
return FileUtils.getFileFullPathFromFileInRootClassPath(getCatalogDir()+"/"+ fileName);
}
private String getTemplateSetFullPath(String fileName) {
String canonicalFileName = getTemplateSetFullPathAndFileName(fileName);
return StringUtils.removeEnd(canonicalFileName, fileName);
}
private Database getChoosenDatabase() {
if (choosenDatabase==null)
choosenDatabase = DatabaseCatalogUtils.getPublishedDatabase(getDatabase(), getCatalogDir());
return choosenDatabase;
}
// private Target getChoosenTarget() {
// Technology technology = getChoosenTechnology();
// Target target = getTarget(technology);
// return target;
// }
private Technology getChoosenTechnology() {
if (choosenTechnology==null)
choosenTechnology = TechnologyCatalogUtils.getPublishedTechnology(targetTechnology, getCatalogDir());
return choosenTechnology;
}
private Model getModel() {
Model model = new Model();
model.setDataModel(getDataModel());
// model.setWebServiceModel(getWebServiceModel());
model.setName(modelName);
model.setPackageRoot(rootpackage);
model.setVersion(getVersion());
model.setBusinessModel(getBusinessModel());
return model;
}
private WebServiceModel getWebServiceModel() {
return webServiceModel;
}
private BusinessModel getBusinessModel() {
BusinessModel businessModel = new BusinessModel();
businessModel.setGenerationCondition(getGenerationCondition());
businessModel.setBusinessPackage(getBusinessPackage());
businessModel.setEnrichment(getEnrichment());
return businessModel;
}
private Enrichment getEnrichment() {
Enrichment enrichment = new Enrichment();
enrichment.setConventions(getConventions());
return enrichment;
}
private Conventions getKernelConventions() {
Conventions conventions = new Conventions();
fillKernelConventions();
conventions.setConventions(getKernelConventionList());
return conventions;
}
private Conventions getConventions() {
Conventions conventions = new Conventions();
fillPkConventions();
conventions.setConventions(getConventionList());
return conventions;
}
private List<Convention> getConventionList() {
if (conventions==null)
conventions = new ArrayList<Convention>();
return conventions;
}
private List<Convention> getKernelConventionList() {
if (kernelConventions==null)
kernelConventions = new ArrayList<Convention>();
return kernelConventions;
}
private void fillPkConventions() {
if (isPkConventionSet) {
getConventionList().add(getPkForTableConvention());
getConventionList().add(getPkForViewConvention());
}
}
private void fillKernelConventions() {
if (isEnableUpdatableAreaConvention()) {
getKernelConventionList().add(getEnableUpdatableAreaConvention());
}
}
private Convention getEnableUpdatableAreaConvention() {
Convention convention = new TargetConvention();
convention.setType(TargetConvention.ENABLE_UPDATABLE_CODE);
return convention;
}
private Convention getPkForTableConvention() {
Convention convention = new TableDefaultPrimaryKeyConvention ();
convention.setDefaultValue(getVirtualPrimaryKey());
return convention;
}
private Convention getPkForViewConvention() {
Convention convention = new ViewPrimaryKeyConvention ();
convention.setDefaultValue(getVirtualPrimaryKey());
return convention;
}
private BusinessPackage getBusinessPackage() {
BusinessPackage businessPackage = new BusinessPackage();
businessPackage.setDefaultPackage(getModelName());
businessPackage.setConditions(conditions);
return businessPackage;
}
private GenerationCondition getGenerationCondition() {
GenerationCondition generationCondition = new GenerationCondition();
generationCondition.setExcludeTables(!getAreTablesIncluded());
generationCondition.setExcludeViews(!getAreViewsIncluded());
generationCondition.setDefaultType(getFilterFileType());
List<String> filenames = ParserUtils.getList(getFilterFile());
String conditionType = getConditionType();
for (String filename : filenames) {
generationCondition.addCondition(getCondition(filename, conditionType));
}
return generationCondition;
}
private String getConditionType() {
if (filterFileType==null)
return GenerationCondition.FILTER_FILE_TYPE_INCLUDE;
return (filterFileType.equals(GenerationCondition.FILTER_FILE_TYPE_EXCLUDE))? GenerationCondition.FILTER_FILE_TYPE_INCLUDE: GenerationCondition.FILTER_FILE_TYPE_EXCLUDE;
}
private Condition getCondition(String filename, String type) {
Condition condition = new Condition();
condition.setType(type);
condition.setStartsWith(filename);
return condition;
}
private DataModel getDataModel() {
DataModel dataModel = new DataModel();
dataModel.setBasicDataSource(getBasicDataSource());
if (getChoosenDatabase().useSchema())
dataModel.setSchema(schema);
dataModel.setPrimaryKeyPolicy(getPrimaryKeyPolicyConfig());
dataModel.setDriver(getDriverMaven());
return dataModel;
}
private Driver getDriverMaven() {
Driver driver = new Driver();
MavenArtifact mavenArtifact = getChoosenDatabase().getMavenArtifact();
driver.setArtifactId(mavenArtifact.getMvnArtifactId());
driver.setGroupId(mavenArtifact.getMvnGroupId());
driver.setVersion(mavenArtifact.getMvnVersion());
return driver;
}
private PrimaryKeyPolicy getPrimaryKeyPolicyConfig() {
PrimaryKeyPolicy primaryKeyPolicy = new PrimaryKeyPolicy();
boolean isGlobalForEach = getOneForEach();
primaryKeyPolicy.setOneForEachTable(isGlobalForEach);
primaryKeyPolicy.setOneGlobal(!isGlobalForEach);
primaryKeyPolicy.addPrimaryKeyPolicyPattern(getPrimaryKeyPolicyPattern());
return primaryKeyPolicy;
}
private boolean getOneForEach() {
if (primaryKeyPolicy.equals(PrimaryKeyPolicyPatternEnum.SEQUENCE)) {
if (sequencePattern.equals("global sequence")) return false;
else return true;
}
return false;
}
private PrimaryKeyPolicyPattern getPrimaryKeyPolicyPattern() {
PrimaryKeyPolicyPattern primaryKeyPolicyPattern = new PrimaryKeyPolicyPattern();
if (primaryKeyPolicy.equals(PrimaryKeyPolicyPatternEnum.SEQUENCE)) {
primaryKeyPolicyPattern.setName(PrimaryKeyPolicyPattern.SEQUENCE);
if (sequencePattern.equals("global sequence")) {
primaryKeyPolicyPattern.setSequenceName(getSequenceGlobalName());
} else {
primaryKeyPolicyPattern.setSuffix(getSequenceEntitySuffix());
}
}
else if (primaryKeyPolicy.equals("autoincrement"))
primaryKeyPolicyPattern.setName(PrimaryKeyPolicyPattern.AUTOINCREMENT);
return primaryKeyPolicyPattern;
}
private BasicDataSource getBasicDataSource() {
BasicDataSource basicDataSource = new BasicDataSource();
basicDataSource.setUrl(url);
basicDataSource.setUsername(username);
basicDataSource.setPassword(password);
basicDataSource.setDriverClassName(driver);
return basicDataSource;
}
public String getSchema() {
return schema;
}
public void setSchema(String schema) {
this.schema = schema;
}
public String getDriver() {
return driver;
}
public void setDriver(String driver) {
this.driver = driver;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public PrimaryKeyPolicyPatternEnum getPrimaryKeyPolicy() {
return primaryKeyPolicy;
}
public void setPrimaryKeyPolicy(PrimaryKeyPolicyPatternEnum primaryKeyPolicy) {
this.primaryKeyPolicy = primaryKeyPolicy;
}
public void setTargetTechnology(String targetTechnology) {
this.targetTechnology = targetTechnology;
}
public String getDatabase() {
return database;
}
public void setDatabase(String database) {
this.database = database;
}
public String getRootpackage() {
return rootpackage;
}
public void setRootpackage(String rootpackage) {
this.rootpackage = rootpackage;
}
public String getBusinesspackage() {
return businesspackage;
}
public void setBusinesspackage(String businesspackage) {
this.businesspackage = businesspackage;
}
public String getVersion() {
if (version==null)
version = "1.0";
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getModelName() {
return modelName;
}
public void setModelName(String modelName) {
this.modelName = modelName;
}
public String getOutputDir(Technology technology, boolean isDefaultOutputToAppend) {
if (isDefaultOutputToAppend)
return outputDir+"/"+technology.getDefaultOutputdir();
return outputDir;
}
public String getOutputDir() {
return outputDir;
}
public void setOutputDir(String outputDir) {
this.outputDir = outputDir;
}
public String getCatalogDir() {
if (catalogDir==null)
catalogDir=CatalogUtils.getDefaultCatalogDir();
return catalogDir;
}
public void setCatalogDir(String catalogDir) {
this.catalogDir = catalogDir;
}
public String getSequencePattern() {
return sequencePattern;
}
public void setSequencePattern(String sequencePattern) {
this.sequencePattern = sequencePattern;
}
public String getSequenceGlobalName() {
return sequenceGlobalName;
}
public void setSequenceGlobalName(String sequenceGlobalName) {
this.sequenceGlobalName = sequenceGlobalName;
}
public String getSequenceEntitySuffix() {
return sequenceEntitySuffix;
}
public void setSequenceEntitySuffix(String sequenceEntitySuffix) {
this.sequenceEntitySuffix = sequenceEntitySuffix;
}
public String getFilterFile() {
return filterFile;
}
public void setFilterFile(String filterFile) {
this.filterFile = filterFile;
}
public String getFilterFileType() {
return filterFileType;
}
public void setFilterFileType(String filterFileType) {
this.filterFileType = filterFileType;
}
public void setPackageConditions(List<Condition> conditions) {
this.conditions = conditions;
}
public Boolean getAreTablesIncluded() {
return areTablesIncluded;
}
public void setAreTablesIncluded(Boolean areTablesIncluded) {
this.areTablesIncluded = areTablesIncluded;
}
public Boolean getAreViewsIncluded() {
return areViewsIncluded;
}
public void setAreViewsIncluded(Boolean areViewsIncluded) {
this.areViewsIncluded = areViewsIncluded;
}
public String getVirtualPrimaryKey() {
return virtualPrimaryKey;
}
public void setVirtualPrimaryKey(String virtualPrimaryKey) {
this.isPkConventionSet=true;
this.virtualPrimaryKey = virtualPrimaryKey;
}
public Boolean getIsPkConventionSet() {
return isPkConventionSet;
}
public void setIsPkConventionSet(Boolean isPkConventionSet) {
this.isPkConventionSet = isPkConventionSet;
}
public void addConvention(Convention convention) {
getConventionList().add(convention);
}
public String getTemplateRootDir() {
return templateRootDir;
}
public void setTemplateRootDir(String templateRootDir) {
this.templateRootDir = templateRootDir;
}
public void setEnableUpdatableAreaConvention(boolean value) {
this.enableUpdatableAreaConvention = value;
}
public boolean isEnableUpdatableAreaConvention() {
return enableUpdatableAreaConvention;
}
public void setWebServiceModel(WebServiceModel webServiceModel) {
this.webServiceModel = webServiceModel;
}
}