use of ch.interlis.ili2c.metamodel.Viewable in project ili2db by claeis.
the class TransferFromXtf method getXtfTables.
private static ArrayList<Viewable> getXtfTables(TransferDescription td, Topic topic) {
ArrayList<Viewable> ret = new ArrayList<Viewable>();
Iterator iter = topic.getViewables().iterator();
while (iter.hasNext()) {
Object obj = iter.next();
if ((obj instanceof Viewable) && !AbstractPatternDef.suppressViewableInTransfer((Viewable) obj)) {
Viewable v = (Viewable) obj;
ret.add(v);
}
}
return ret;
}
use of ch.interlis.ili2c.metamodel.Viewable in project ili2db by claeis.
the class TransferFromXtf method getStructs.
private HashSet<AbstractClassDef> getStructs(String topicQName) {
Topic def = TransferToXtf.getTopicDef(td, topicQName);
HashSet<AbstractClassDef> visitedStructs = new HashSet<AbstractClassDef>();
while (def != null) {
Iterator classi = def.iterator();
while (classi.hasNext()) {
Object classo = classi.next();
if (classo instanceof Viewable) {
if (classo instanceof Table && ((Table) classo).isIdentifiable()) {
getStructs_Helper((AbstractClassDef) classo, visitedStructs);
}
}
}
def = (Topic) def.getExtending();
}
return visitedStructs;
}
use of ch.interlis.ili2c.metamodel.Viewable in project ili2db by claeis.
the class TransferFromXtf method doit.
public void doit(IoxReader reader, Config config, Map<Long, BasketStat> stat) throws IoxException, Ili2dbException {
if (functionCode == Config.FC_UPDATE || functionCode == Config.FC_REPLACE) {
if (!createBasketCol) {
throw new Ili2dbException("update/replace requires a basket column");
}
}
// limit import to given BIDs
HashSet<String> limitedToBids = null;
{
String baskets = config.getBaskets();
if (baskets != null) {
String[] basketidv = baskets.split(ch.interlis.ili2c.Main.MODELS_SEPARATOR);
limitedToBids = new HashSet<String>();
for (String basketid : basketidv) {
limitedToBids.add(basketid);
}
}
}
// limit import to given TOPICs
HashSet<String> limitedToTopics = null;
{
String topics = config.getTopics();
if (topics != null) {
String[] topicv = topics.split(ch.interlis.ili2c.Main.MODELS_SEPARATOR);
limitedToTopics = new HashSet<String>();
for (String topic : topicv) {
limitedToTopics.add(topic);
}
}
}
String datasetName = config.getDatasetName();
Long datasetSqlId = null;
today = new java.sql.Timestamp(System.currentTimeMillis());
if (doItfLineTables) {
tag2class = ch.interlis.iom_j.itf.ModelUtilities.getTagMap(td);
} else {
tag2class = ch.interlis.ili2c.generator.XSDGenerator.getTagMap(td);
}
isItfReader = reader instanceof ItfReader;
unknownTypev = new HashSet();
structQueue = new ArrayList();
boolean surfaceAsPolyline = true;
boolean ignoreUnresolvedReferences = false;
recman = new ObjectPoolManager();
try {
objPool = recman.newObjectPool();
long importSqlId = 0;
long basketSqlId = 0;
long startTid = 0;
long endTid = 0;
long objCount = 0;
boolean referrs = false;
recConv = new FromXtfRecordConverter(td, ili2sqlName, tag2class, config, idGen, geomConv, conn, dbusr, isItfReader, oidPool, trafoConfig, class2wrapper, datasetName);
if (functionCode == Config.FC_DELETE || functionCode == Config.FC_REPLACE) {
if (datasetName == null) {
throw new Ili2dbException("delete/replace requires a dataset name");
}
// delete existing data base on basketSqlId
datasetSqlId = Ili2db.getDatasetId(datasetName, conn, config);
if (datasetSqlId == null) {
if (functionCode == Config.FC_DELETE) {
// nothing to do
} else if (functionCode == Config.FC_REPLACE) {
// new dataset, not a replace!
datasetSqlId = oidPool.newObjSqlId();
try {
writeDataset(datasetSqlId, datasetName);
importSqlId = writeImportStat(datasetSqlId, xtffilename, today, dbusr);
} catch (SQLException e) {
EhiLogger.logError(e);
} catch (ConverterException e) {
EhiLogger.logError(e);
}
}
} else {
deleteObjectsOfExistingDataset(datasetSqlId, config);
if (functionCode == Config.FC_DELETE) {
String sqlName = DbNames.DATASETS_TAB;
if (schema != null) {
sqlName = schema + "." + sqlName;
}
java.sql.PreparedStatement getstmt = null;
try {
String stmt = "DELETE FROM " + sqlName + " WHERE " + colT_ID + "= ?";
EhiLogger.traceBackendCmd(stmt);
getstmt = conn.prepareStatement(stmt);
getstmt.setLong(1, datasetSqlId);
getstmt.executeUpdate();
} catch (java.sql.SQLException ex) {
throw new Ili2dbException("failed to delete from " + sqlName, ex);
} finally {
if (getstmt != null) {
try {
getstmt.close();
getstmt = null;
} catch (java.sql.SQLException ex) {
EhiLogger.logError(ex);
}
}
}
}
try {
importSqlId = writeImportStat(datasetSqlId, xtffilename, today, dbusr);
} catch (SQLException e) {
EhiLogger.logError(e);
} catch (ConverterException e) {
EhiLogger.logError(e);
}
}
} else if (functionCode == Config.FC_UPDATE) {
if (datasetName == null) {
throw new Ili2dbException("update requires a dataset name");
}
try {
datasetSqlId = Ili2db.getDatasetId(datasetName, conn, config);
if (datasetSqlId != null) {
} else {
datasetSqlId = oidPool.newObjSqlId();
writeDataset(datasetSqlId, datasetName);
}
importSqlId = writeImportStat(datasetSqlId, xtffilename, today, dbusr);
} catch (SQLException e) {
EhiLogger.logError(e);
} catch (ConverterException e) {
EhiLogger.logError(e);
}
} else if (functionCode == Config.FC_IMPORT) {
try {
if (datasetName == null) {
datasetSqlId = oidPool.newObjSqlId();
if (xtffilename != null) {
datasetName = new java.io.File(xtffilename).getName() + "-" + Long.toString(datasetSqlId);
} else {
datasetName = Long.toString(datasetSqlId);
}
} else {
datasetSqlId = Ili2db.getDatasetId(datasetName, conn, config);
if (datasetSqlId != null) {
throw new Ili2dbException("dataset " + datasetName + " already exists");
} else {
datasetSqlId = oidPool.newObjSqlId();
}
}
writeDataset(datasetSqlId, datasetName);
importSqlId = writeImportStat(datasetSqlId, xtffilename, today, dbusr);
} catch (SQLException e) {
EhiLogger.logError(e);
} catch (ConverterException e) {
EhiLogger.logError(e);
}
} else {
throw new IllegalArgumentException("unexpected function code " + functionCode);
}
if (functionCode == Config.FC_DELETE) {
return;
}
if (reader instanceof ItfReader) {
((ItfReader) reader).setBidPrefix(datasetName);
} else if (reader instanceof ItfReader2) {
((ItfReader2) reader).setBidPrefix(datasetName);
}
ch.interlis.iox_j.validator.Validator validator = null;
if (config.isValidation()) {
ValidationConfig modelConfig = new ValidationConfig();
modelConfig.mergeIliMetaAttrs(td);
String configFilename = config.getValidConfigFile();
if (configFilename != null) {
try {
modelConfig.mergeConfigFile(new File(configFilename));
} catch (FileNotFoundException e) {
EhiLogger.logError("validator config file <" + configFilename + "> not found");
}
}
modelConfig.setConfigValue(ValidationConfig.PARAMETER, ValidationConfig.AREA_OVERLAP_VALIDATION, config.isDisableAreaValidation() ? ValidationConfig.OFF : null);
modelConfig.setConfigValue(ValidationConfig.PARAMETER, ValidationConfig.DEFAULT_GEOMETRY_TYPE_VALIDATION, config.isSkipGeometryErrors() ? ValidationConfig.OFF : null);
modelConfig.setConfigValue(ValidationConfig.PARAMETER, ValidationConfig.ALLOW_ONLY_MULTIPLICITY_REDUCTION, config.isOnlyMultiplicityReduction() ? ValidationConfig.ON : null);
IoxLogging errHandler = new ch.interlis.iox_j.logging.Log2EhiLogger();
LogEventFactory errFactory = new LogEventFactory();
errFactory.setDataSource(xtffilename);
PipelinePool pipelinePool = new PipelinePool();
validator = new ch.interlis.iox_j.validator.Validator(td, modelConfig, errHandler, errFactory, pipelinePool, config);
if (reader instanceof ItfReader2) {
((ItfReader2) reader).setIoxDataPool(pipelinePool);
}
}
// setup list of objects that have external/forward references
delayedObjects = new ArrayList<FixIomObjectExtRefs>();
HashMap<String, ClassStat> objStat = null;
StartBasketEvent basket = null;
// more baskets?
IoxEvent event = reader.read();
try {
boolean skipBasket = false;
while (event != null) {
if (event instanceof StartBasketEvent) {
basket = (StartBasketEvent) event;
// do not import this this basket?
if ((limitedToBids != null && !limitedToBids.contains(basket.getBid())) || (limitedToTopics != null && !limitedToTopics.contains(basket.getType()))) {
// do not import this basket
skipBasket = true;
EhiLogger.logState("Skip Basket " + basket.getType() + "(oid " + basket.getBid() + ")");
if (validator != null)
validator.validate(event);
if (languageFilter != null) {
event = languageFilter.filter(event);
}
} else {
// import this basket
EhiLogger.logState("Basket " + basket.getType() + "(oid " + basket.getBid() + ")...");
skipBasket = false;
try {
if (validator != null)
validator.validate(event);
if (languageFilter != null) {
event = languageFilter.filter(event);
}
Long existingBasketSqlId = null;
if (functionCode == Config.FC_UPDATE) {
// read existing oid/sqlid mapping (but might also be a new basket)
existingObjectsOfCurrentBasket = new HashMap<String, HashSet<Long>>();
existingBasketSqlId = readExistingSqlObjIds(reader instanceof ItfReader, basket.getBid());
if (existingBasketSqlId == null) {
// new basket
basketSqlId = oidPool.getBasketSqlId(basket.getBid());
} else {
// existing basket
basketSqlId = existingBasketSqlId;
// drop existing structeles
dropExistingStructEles(basket.getType(), basketSqlId);
}
} else {
basketSqlId = oidPool.getBasketSqlId(basket.getBid());
}
if (attachmentKey == null) {
if (xtffilename != null) {
attachmentKey = new java.io.File(xtffilename).getName() + "-" + Long.toString(basketSqlId);
} else {
attachmentKey = Long.toString(basketSqlId);
}
config.setAttachmentKey(attachmentKey);
}
if (existingBasketSqlId == null) {
writeBasket(datasetSqlId, basket, basketSqlId, attachmentKey);
} else {
// TODO update attachmentKey of existing basket
}
} catch (SQLException ex) {
EhiLogger.logError("Basket " + basket.getType() + "(oid " + basket.getBid() + ")", ex);
} catch (ConverterException ex) {
EhiLogger.logError("Basket " + basket.getType() + "(oid " + basket.getBid() + ")", ex);
}
startTid = oidPool.getLastSqlId();
objStat = new HashMap<String, ClassStat>();
objCount = 0;
}
} else if (event instanceof EndBasketEvent) {
if (validator != null)
validator.validate(event);
if (languageFilter != null) {
event = languageFilter.filter(event);
}
if (reader instanceof ItfReader2) {
ArrayList<IoxInvalidDataException> dataerrs = ((ItfReader2) reader).getDataErrs();
if (dataerrs.size() > 0) {
if (!skipBasket) {
if (!config.isSkipGeometryErrors()) {
for (IoxInvalidDataException dataerr : dataerrs) {
EhiLogger.logError(dataerr);
}
}
}
((ItfReader2) reader).clearDataErrs();
}
}
if (!skipBasket) {
// fix external/forward references
ArrayList<FixIomObjectExtRefs> fixedObjects = new ArrayList<FixIomObjectExtRefs>();
for (FixIomObjectExtRefs fixref : delayedObjects) {
boolean skipObj = false;
for (IomObject ref : fixref.getRefs()) {
String xtfid = ref.getobjectrefoid();
Viewable aclass = fixref.getTargetClass(ref);
String rootClassName = Ili2cUtility.getRootViewable(aclass).getScopedName(null);
if (oidPool.containsXtfid(rootClassName, xtfid)) {
// reference now resolvable
} else {
// reference not yet known, try to resolve again at end of transfer
skipObj = true;
}
}
if (!skipObj) {
doObject(datasetName, basketSqlId, objPool.get(fixref.getRootTid()), objStat);
fixedObjects.add(fixref);
}
}
delayedObjects.removeAll(fixedObjects);
if (functionCode == Config.FC_UPDATE) {
// delete no longer existing objects
deleteExisitingObjects(existingObjectsOfCurrentBasket);
}
// TODO update import counters
endTid = oidPool.getLastSqlId();
try {
String filename = null;
if (xtffilename != null) {
filename = new java.io.File(xtffilename).getName();
}
long importId = writeImportBasketStat(importSqlId, basketSqlId, startTid, endTid, objCount);
saveObjStat(stat, importId, basket.getBid(), basketSqlId, filename, basket.getType(), objStat);
} catch (SQLException ex) {
EhiLogger.logError("Basket " + basket.getType() + "(oid " + basket.getBid() + ")", ex);
} catch (ConverterException ex) {
EhiLogger.logError("Basket " + basket.getType() + "(oid " + basket.getBid() + ")", ex);
}
}
skipBasket = false;
} else if (event instanceof ObjectEvent) {
if (validator != null)
validator.validate(event);
if (!skipBasket) {
if (languageFilter != null) {
event = languageFilter.filter(event);
}
objCount++;
IomObject iomObj = ((ObjectEvent) event).getIomObject();
if (allReferencesKnown(basketSqlId, iomObj)) {
// translate object
doObject(datasetName, basketSqlId, iomObj, objStat);
}
}
} else if (event instanceof EndTransferEvent) {
if (validator != null)
validator.validate(event);
if (languageFilter != null) {
event = languageFilter.filter(event);
}
{
for (FixIomObjectExtRefs fixref : delayedObjects) {
boolean skipObj = false;
for (IomObject ref : fixref.getRefs()) {
String xtfid = ref.getobjectrefoid();
Viewable aclass = fixref.getTargetClass(ref);
String rootClassName = Ili2cUtility.getRootViewable(aclass).getScopedName(null);
if (oidPool.containsXtfid(rootClassName, xtfid)) {
// skip it; now resolvable
} else {
// object in another basket
if (readIliTid || (aclass instanceof AbstractClassDef && ((AbstractClassDef) aclass).getOid() != null)) {
// read object
Long sqlid = readObjectSqlid(aclass, xtfid);
if (sqlid == null) {
if (!ignoreUnresolvedReferences) {
EhiLogger.logError("unknown referenced object " + aclass.getScopedName(null) + " TID " + xtfid + " referenced from " + fixref.getRootTag() + " TID " + fixref.getRootTid());
referrs = true;
skipObj = true;
}
}
} else {
if (!ignoreUnresolvedReferences) {
EhiLogger.logError("unknown referenced object " + aclass.getScopedName(null) + " TID " + xtfid + " referenced from " + fixref.getRootTag() + " TID " + fixref.getRootTid());
referrs = true;
skipObj = true;
}
}
}
}
if (!skipObj) {
objStat = stat.get(fixref.getBasketSqlId()).getObjStat();
doObject(datasetName, fixref.getBasketSqlId(), objPool.get(fixref.getRootTid()), objStat);
}
}
}
break;
} else if (event instanceof StartTransferEvent) {
if (validator != null)
validator.validate(event);
if (languageFilter != null) {
event = languageFilter.filter(event);
}
}
event = reader.read();
}
if (referrs) {
throw new IoxException("dangling references");
}
} finally {
if (validator != null) {
validator.close();
validator = null;
}
if (languageFilter != null) {
languageFilter.close();
}
}
} finally {
recman.close();
}
}
use of ch.interlis.ili2c.metamodel.Viewable in project ili2db by claeis.
the class FromIliRecordConverter method generateTable.
public void generateTable(ViewableWrapper def, int pass) throws Ili2dbException {
if (!def.isSecondaryTable()) {
surfaceAttrs = new ArrayList<AttributeDef>();
}
// EhiLogger.debug("viewable "+def);
if (pass == 1) {
DbTableName sqlName = new DbTableName(schema.getName(), def.getSqlTablename());
DbTable dbTable = new DbTable();
dbTable.setName(sqlName);
schema.addTable(dbTable);
return;
}
// second pass; add columns
DbTableName sqlName = new DbTableName(schema.getName(), def.getSqlTablename());
DbTable dbTable = schema.findTable(sqlName);
ViewableWrapper base = def.getExtending();
{
StringBuffer cmt = new StringBuffer();
String cmtSep = "";
if (!def.isSecondaryTable()) {
dbTable.setIliName(def.getViewable().getScopedName(null));
if (def.getViewable().getDocumentation() != null) {
cmt.append(cmtSep + def.getViewable().getDocumentation());
cmtSep = nl;
}
cmt.append(cmtSep + "@iliname " + def.getViewable().getScopedName(null));
cmtSep = nl;
}
if (cmt.length() > 0) {
dbTable.setComment(cmt.toString());
}
}
if (deleteExistingData) {
dbTable.setDeleteDataIfTableExists(true);
}
if (base == null && !def.isSecondaryTable()) {
dbTable.setRequiresSequence(true);
}
String baseRef = "";
DbColId dbColId = addKeyCol(dbTable);
if (base != null) {
dbColId.setScriptComment("REFERENCES " + base.getViewable().getScopedName(null));
if (createFk) {
dbColId.setReferencedTable(getSqlType(base.getViewable()));
}
} else if (def.isSecondaryTable()) {
if (createFk) {
dbColId.setReferencedTable(new DbTableName(schema.getName(), def.getMainTable().getSqlTablename()));
}
}
if (createBasketCol) {
// add basketCol
DbColId t_basket = new DbColId();
t_basket.setName(DbNames.T_BASKET_COL);
t_basket.setNotNull(true);
t_basket.setScriptComment("REFERENCES " + DbNames.BASKETS_TAB);
if (createFk) {
t_basket.setReferencedTable(new DbTableName(schema.getName(), DbNames.BASKETS_TAB));
}
if (createFkIdx) {
t_basket.setIndex(true);
}
dbTable.addColumn(t_basket);
}
if (createDatasetCol) {
DbColVarchar t_dsName = new DbColVarchar();
t_dsName.setName(DbNames.T_DATASET_COL);
t_dsName.setSize(DbNames.DATASETNAME_COL_SIZE);
t_dsName.setNotNull(true);
t_dsName.setIndex(true);
dbTable.addColumn(t_dsName);
}
DbColumn dbCol;
if (base == null && !def.isSecondaryTable()) {
if (createTypeDiscriminator || def.includesMultipleTypes()) {
dbCol = createSqlTypeCol(DbNames.T_TYPE_COL);
dbTable.addColumn(dbCol);
}
// if CLASS
if (!def.isStructure()) {
if (createIliTidCol || def.getOid() != null) {
addIliTidCol(dbTable, def.getOid());
}
}
// if STRUCTURE, add ref to parent
if (def.isStructure()) {
if (createGenericStructRef) {
// add parentid
DbColId dbParentId = new DbColId();
dbParentId.setName(DbNames.T_PARENT_ID_COL);
dbParentId.setNotNull(true);
dbParentId.setPrimaryKey(false);
dbTable.addColumn(dbParentId);
// add parent_type
dbCol = createSqlTypeCol(DbNames.T_PARENT_TYPE_COL);
dbTable.addColumn(dbCol);
// add parent_attr
dbCol = createSqlTypeCol(DbNames.T_PARENT_ATTR_COL);
dbTable.addColumn(dbCol);
} else {
// add reference to parent for each structAttr when generating structAttr
}
// add sequence attr
DbColId dbSeq = new DbColId();
dbSeq.setName(DbNames.T_SEQ_COL);
// dbSeq.setNotNull(true); // must be optional for cases where struct is exdended by a class
dbSeq.setPrimaryKey(false);
dbTable.addColumn(dbSeq);
}
}
// body
Iterator<ViewableTransferElement> iter = def.getAttrIterator();
while (iter.hasNext()) {
ViewableTransferElement obj = iter.next();
if (obj.obj instanceof AttributeDef) {
AttributeDef attr = (AttributeDef) obj.obj;
if (attr.getExtending() == null) {
try {
if (createItfLineTables && attr.getDomainResolvingAll() instanceof SurfaceOrAreaType) {
surfaceAttrs.add(attr);
}
if (!attr.isTransient()) {
Type proxyType = attr.getDomain();
if (proxyType != null && (proxyType instanceof ObjectType)) {
// skip implicit particles (base-viewables) of views
} else {
generateAttr(dbTable, def.getViewable(), attr);
}
}
} catch (Exception ex) {
throw new Ili2dbException(attr.getContainer().getScopedName(null) + "." + attr.getName(), ex);
}
} else {
if (attr.isDomainBoolean()) {
} else if (createEnumColAsItfCode && attr.getDomainResolvingAll() instanceof EnumerationType) {
throw new Ili2dbException("EXTENDED attributes with type enumeration not supported");
}
}
}
if (obj.obj instanceof RoleDef) {
RoleDef role = (RoleDef) obj.obj;
if (role.getExtending() == null) {
// not an embedded role and roledef not defined in a lightweight association?
if (!obj.embedded && !def.isAssocLightweight()) {
ArrayList<ViewableWrapper> targetTables = getTargetTables(role.getDestination());
for (ViewableWrapper targetTable : targetTables) {
dbColId = new DbColId();
DbTableName targetSqlTableName = targetTable.getSqlTable();
String roleSqlName = ili2sqlName.mapIliRoleDef(role, sqlName.getName(), targetSqlTableName.getName(), targetTables.size() > 1);
dbColId.setName(roleSqlName);
boolean notNull = false;
if (!sqlEnableNull) {
if (targetTables.size() > 1) {
// multiple alternative FK columns
notNull = false;
} else {
notNull = true;
}
}
dbColId.setNotNull(notNull);
dbColId.setPrimaryKey(false);
if (createFk) {
dbColId.setReferencedTable(targetSqlTableName);
}
if (createFkIdx) {
dbColId.setIndex(true);
}
String cmt = role.getDocumentation();
if (cmt != null && cmt.length() > 0) {
dbColId.setComment(cmt);
}
dbTable.addColumn(dbColId);
// handle ordered
if (role.isOrdered()) {
// add seqeunce attr
DbColId dbSeq = new DbColId();
dbSeq.setName(roleSqlName + "_" + DbNames.T_SEQ_COL);
dbSeq.setNotNull(notNull);
dbSeq.setPrimaryKey(false);
dbTable.addColumn(dbSeq);
}
}
}
// a role of an embedded association?
if (obj.embedded) {
AssociationDef roleOwner = (AssociationDef) role.getContainer();
if (roleOwner.getDerivedFrom() == null) {
// role is oppend;
ArrayList<ViewableWrapper> targetTables = getTargetTables(role.getDestination());
for (ViewableWrapper targetTable : targetTables) {
dbColId = new DbColId();
DbTableName targetSqlTableName = targetTable.getSqlTable();
String roleSqlName = ili2sqlName.mapIliRoleDef(role, sqlName.getName(), targetSqlTableName.getName(), targetTables.size() > 1);
dbColId.setName(roleSqlName);
boolean notNull = false;
if (!sqlEnableNull) {
if (targetTables.size() > 1) {
// multiple alternative FK columns
notNull = false;
} else if (role.getOppEnd().getDestination() != def.getViewable()) {
// other subtypes in of def don't have this FK
notNull = false;
} else {
if (role.getCardinality().getMinimum() == 0) {
notNull = false;
} else {
notNull = true;
}
}
}
dbColId.setNotNull(notNull);
dbColId.setPrimaryKey(false);
if (createFk) {
dbColId.setReferencedTable(targetSqlTableName);
}
if (createFkIdx) {
dbColId.setIndex(true);
}
String cmt = role.getDocumentation();
if (cmt != null && cmt.length() > 0) {
dbColId.setComment(cmt);
}
customMapping.fixupEmbeddedLink(dbTable, dbColId, roleOwner, role, targetSqlTableName, colT_ID);
dbTable.addColumn(dbColId);
// handle ordered
if (role.getOppEnd().isOrdered()) {
// add seqeunce attr
DbColId dbSeq = new DbColId();
dbSeq.setName(roleSqlName + "_" + DbNames.T_SEQ_COL);
dbSeq.setNotNull(notNull);
dbSeq.setPrimaryKey(false);
dbTable.addColumn(dbSeq);
}
}
}
}
}
}
}
if (createStdCols) {
addStdCol(dbTable);
}
if (createUnique && !def.isStructure()) {
// check if UNIQUE mappable
HashSet wrapperCols = getWrapperCols(def.getAttrv());
Viewable aclass = def.getViewable();
Iterator it = aclass.iterator();
while (it.hasNext()) {
Object cnstro = it.next();
if (cnstro instanceof UniquenessConstraint) {
UniquenessConstraint cnstr = (UniquenessConstraint) cnstro;
HashSet attrs = getUniqueAttrs(cnstr, wrapperCols);
// mappable?
if (attrs != null) {
DbIndex dbIndex = new DbIndex();
dbIndex.setPrimary(false);
dbIndex.setUnique(true);
for (Object attro : attrs) {
String attrSqlName = null;
if (attro instanceof AttributeDef) {
attrSqlName = ili2sqlName.mapIliAttributeDef((AttributeDef) attro, def.getSqlTablename(), null);
} else if (attro instanceof RoleDef) {
RoleDef role = (RoleDef) attro;
DbTableName targetSqlTableName = getSqlType(role.getDestination());
attrSqlName = ili2sqlName.mapIliRoleDef(role, def.getSqlTablename(), targetSqlTableName.getName());
} else {
throw new IllegalStateException("unexpected attr " + attro);
}
DbColumn idxCol = dbTable.getColumn(attrSqlName);
dbIndex.addAttr(idxCol);
}
dbTable.addIndex(dbIndex);
}
}
}
}
if (!def.isSecondaryTable()) {
customMapping.fixupViewable(dbTable, def.getViewable());
}
}
use of ch.interlis.ili2c.metamodel.Viewable in project ili2db by claeis.
the class ModelElementSelector method visitTopic.
private void visitTopic(HashSet<Element> visitedElements, HashSet<Model> accuScope, Topic def) {
if (visitedElements.contains(def)) {
return;
}
visitedElements.add(def);
Iterator classi = def.iterator();
while (classi.hasNext()) {
Object classo = classi.next();
if (classo instanceof Viewable) {
visitViewable(visitedElements, accuScope, (Viewable) classo);
} else if (classo instanceof Domain) {
visitDomain(visitedElements, accuScope, (Domain) classo);
}
}
// base topic
Topic base = (Topic) def.getExtending();
if (base != null) {
visitTopic(visitedElements, accuScope, base);
}
// depends on
Iterator depi = def.getDependentOn();
while (depi.hasNext()) {
Topic dep = (Topic) depi.next();
visitTopic(visitedElements, accuScope, dep);
}
// parent model
Model model = (Model) def.getContainer(Model.class);
if (!accuScope.contains(model)) {
accuScope.add(model);
}
}
Aggregations