/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.modelgenerator.ldap;
import java.util.Collection;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.datatools.connectivity.IConnectionProfile;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.teiid.core.designer.util.StringConstants;
import org.teiid.core.designer.util.StringUtilities;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.types.DatatypeConstants;
import org.teiid.designer.core.types.DatatypeManager;
import org.teiid.designer.core.workspace.ModelResource;
import org.teiid.designer.datatools.connection.ConnectionInfoHelper;
import org.teiid.designer.datatools.profiles.ldap.LDAPConnectionInfoProvider;
import org.teiid.designer.metamodels.core.ModelAnnotation;
import org.teiid.designer.metamodels.core.ModelType;
import org.teiid.designer.metamodels.relational.BaseTable;
import org.teiid.designer.metamodels.relational.Column;
import org.teiid.designer.metamodels.relational.NullableType;
import org.teiid.designer.metamodels.relational.RelationalFactory;
import org.teiid.designer.metamodels.relational.RelationalPackage;
import org.teiid.designer.modelgenerator.ldap.ui.ModelGeneratorLdapUiConstants;
import org.teiid.designer.modelgenerator.ldap.ui.wizards.ILdapAttributeNode;
import org.teiid.designer.modelgenerator.ldap.ui.wizards.ILdapEntryNode;
import org.teiid.designer.ui.viewsupport.ModelUtilities;
/**
* The Model Builder for creating the physical model for LDAP services.
*/
public class RelationalModelBuilder {
private RelationalFactory factory;
private DatatypeManager datatypeManager;
private LDAPConnectionInfoProvider connProvider;
/**
* Create a new instance
*/
public RelationalModelBuilder() {
this.factory = org.teiid.designer.metamodels.relational.RelationalPackage.eINSTANCE.getRelationalFactory();
this.datatypeManager = ModelerCore.getBuiltInTypesManager();
this.connProvider = new LDAPConnectionInfoProvider();
}
private ModelResource createNewModelResource(IContainer modelLocation, String modelName) {
if (! modelName.endsWith(StringConstants.DOT_XMI)) {
// Will probably not include it if the model is new but will certainly include
// it if the model already exists.
modelName = modelName + StringConstants.DOT_XMI;
}
Path modelPath = new Path(modelName);
IFile modelFile = modelLocation.getFile(modelPath);
ModelResource resource = ModelerCore.create(modelFile);
return resource;
}
/**
* @param entry
* @param entryModel
*/
private void modelEntry(ILdapEntryNode entry, ModelResource entryModel) throws Exception {
BaseTable entryTable = factory.createBaseTable();
entryModel.getEmfResource().getContents().add(entryTable);
entryTable.setName(entry.getLabel());
entryTable.setNameInSource(entry.getSourceName() + entry.getSourceNameSuffix());
for (ILdapAttributeNode attribute : entry.getAttributes()) {
Column attrColumn = factory.createColumn();
entryTable.getColumns().add(attrColumn);
attrColumn.setName(attribute.getLabel());
attrColumn.setNameInSource(attribute.getId());
attrColumn.setNullValueCount(attribute.getNullValueCount());
attrColumn.setDistinctValueCount(attribute.getDistinctValueCount());
attrColumn.setLength(attribute.getMaximumValueLength());
attrColumn.setType(datatypeManager.getBuiltInDatatype(DatatypeConstants.BuiltInNames.STRING));
attrColumn.setNullable(NullableType.NULLABLE_UNKNOWN_LITERAL);
attrColumn.setCaseSensitive(true);
attrColumn.setRadix(0);
attrColumn.setSigned(false);
}
}
/**
* Create a new model resource and populate it with the given contents
*
* @param modelLocation destination folder of the new model
* @param modelName name of the model file
* @param connectionProfile profile containing all connection information
* @param ldapModelEntries collection of LDAP entries with attributes to be modelled as tables
*
* @throws Exception
*/
public ModelResource modelEntries(IContainer modelLocation, String modelName, IConnectionProfile connectionProfile, Collection<ILdapEntryNode> ldapModelEntries) throws Exception {
final ModelResource entryModel = createNewModelResource(modelLocation, modelName);
ModelAnnotation modelAnnotation = entryModel.getModelAnnotation();
modelAnnotation.setModelType(ModelType.PHYSICAL_LITERAL);
modelAnnotation.setPrimaryMetamodelUri(RelationalPackage.eNS_URI);
for (ILdapEntryNode entry : ldapModelEntries) {
modelEntry(entry, entryModel);
}
// Inject the connection profile properties into the physical model
connProvider.setConnectionInfo(entryModel, connectionProfile);
WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
@Override
public void execute(final IProgressMonitor monitor) {
try {
ModelUtilities.saveModelResource(entryModel, monitor, false, this);
} catch (Exception e) {
ModelGeneratorLdapUiConstants.UTIL.log(e);
}
}
};
IProgressMonitor monitor = new NullProgressMonitor();
operation.run(monitor);
return entryModel;
}
}