/** * Returns a clone of the given source foreign key. * * @param source The source foreign key * @param owningTable The table owning the source foreign key * @param targetModel The target model containing the tables that the clone shall link * @param caseSensitive Whether comparison is case sensitive (for finding the columns * in the target model) * @return The clone */ public ForeignKey clone(ForeignKey source, Table owningTable, Database targetModel, boolean caseSensitive) { ForeignKey result = new ForeignKey(); Table foreignTable = targetModel.findTable(source.getForeignTableName(), caseSensitive); result.setName(source.getName()); result.setForeignTable(foreignTable); result.setAutoIndexPresent(source.isAutoIndexPresent()); result.setOnDelete(source.getOnDelete()); result.setOnUpdate(source.getOnUpdate()); for (int refIdx = 0; refIdx < source.getReferenceCount(); refIdx++) { Reference ref = source.getReference(refIdx); result.addReference(clone(ref, owningTable, foreignTable, caseSensitive)); } return result; }
/** * Finds the foreign key in this table that is equal to the supplied foreign key. * * @param key The foreign key to search for * @param caseSensitive Whether case matters for the names * @return The found foreign key */ public ForeignKey findForeignKey(ForeignKey key, boolean caseSensitive) { for (int idx = 0; idx < getForeignKeyCount(); idx++) { ForeignKey fk = getForeignKey(idx); if ((caseSensitive && fk.equals(key)) || (!caseSensitive && fk.equalsIgnoreCase(key))) { return fk; } } return null; }
/** * {@inheritDoc} */ public String toString() { StringBuilder result = new StringBuilder(); result.append("Foreign key ["); if ((getName() != null) && (getName().length() > 0)) { result.append("name="); result.append(getName()); result.append("; "); } result.append("foreign table="); result.append(getForeignTableName()); result.append("; "); result.append(getReferenceCount()); result.append(" references]"); return result.toString(); }
/** * Returns a verbose string representation of this foreign key. * * @return The string representation */ public String toVerboseString() { StringBuilder result = new StringBuilder(); result.append("ForeignK ky ["); if ((getName() != null) && (getName().length() > 0)) { result.append("name="); result.append(getName()); result.append("; "); } result.append("foreign table="); result.append(getForeignTableName()); result.append("] references:"); for (int idx = 0; idx < getReferenceCount(); idx++) { result.append(" "); result.append(getReference(idx).toString()); } return result.toString(); } }
writeAttribute(xmlWriter, QNAME_ATTRIBUTE_FOREIGN_TABLE, foreignKey.getForeignTableName()); writeAttribute(xmlWriter, QNAME_ATTRIBUTE_NAME, foreignKey.getName()); if (foreignKey.getOnUpdate() != CascadeActionEnum.NONE) writeAttribute(xmlWriter, QNAME_ATTRIBUTE_ON_UPDATE, foreignKey.getOnUpdate().getName()); if (foreignKey.getOnDelete() != CascadeActionEnum.NONE) writeAttribute(xmlWriter, QNAME_ATTRIBUTE_ON_DELETE, foreignKey.getOnDelete().getName()); if (foreignKey.getReferenceCount() > 0) for (int idx = 0; idx < foreignKey.getReferenceCount(); idx++) writeReferenceElement(foreignKey.getReference(idx), xmlWriter);
/** * Determines whether this foreign key uses the given column as a foreign * column in a reference. * * @param column The column to check * @return <code>true</code> if a reference uses the column as a foreign * column */ public boolean hasForeignColumn(Column column) { for (int idx = 0; idx < getReferenceCount(); idx++) { if (column.equals(getReference(idx).getForeignColumn())) { return true; } } return false; }
String fkName = (fk.getName() == null ? "" : fk.getName()); String fkDesc = (fkName.length() == 0 ? "nr. " + idx : fkName); if (fk.getForeignTable() == null) Table targetTable = findTable(fk.getForeignTableName(), true); throw new ModelException("The foreignkey "+fkDesc+" in table "+tableName+" references the undefined table "+fk.getForeignTableName()); fk.setForeignTable(targetTable); if (fk.getReferenceCount() == 0) for (int refIdx = 0; refIdx < fk.getReferenceCount(); refIdx++) Reference ref = fk.getReference(refIdx); Column foreignColumn = fk.getForeignTable().findColumn(ref.getForeignColumnName(), true); throw new ModelException("The foreignkey "+fkDesc+" in table "+tableName+" references the undefined local column "+ref.getForeignColumnName()+" in table "+fk.getForeignTable().getQualifiedName());
fk = new ForeignKey(fkName); pkTable = pkSchema + '.' + pkTable; fk.setForeignTableName(pkTable); fk.setOnUpdate(onUpdateAction); fk.setOnDelete(onDeleteAction); knownFks.put(fkName, fk); fk.addReference(ref);
ForeignKey foreignKey = new ForeignKey(); foreignKey.setForeignTableName(xmlReader.getAttributeValue(idx)); foreignKey.setName(xmlReader.getAttributeValue(idx)); foreignKey.setOnUpdate(getAttributeValueAsCascadeEnum(xmlReader, idx)); foreignKey.setOnDelete(getAttributeValueAsCascadeEnum(xmlReader, idx));
/** * Builds an identity object for the specified foreign key using the foreignkey column values * of the supplied bean. * * @param owningTable The table owning the foreign key * @param fk The foreign key * @param bean The bean * @return The identity */ private Identity buildIdentityFromFK(Table owningTable, ForeignKey fk, DynaBean bean) { Identity identity = new Identity(fk.getForeignTable(), getFKName(owningTable, fk)); for (int idx = 0; idx < fk.getReferenceCount(); idx++) { Reference reference = (Reference)fk.getReference(idx); Object value = bean.get(reference.getLocalColumnName()); if (value == null) { return null; } identity.setColumnValue(reference.getForeignColumnName(), value); } return identity; }
ForeignKey fk = new ForeignKey(fkRs.getString(1)); int localTableId = fkRs.getInt(2); int remoteTableId = fkRs.getInt(4); fk.setForeignTableName(fkRs.getString(3)); for (int idx = 0; idx < 16; idx++) fk.addReference(ref);
if (curFk.getForeignTableName().equalsIgnoreCase(targetTable.getQualifiedName())) for (int idx = 0; idx < fk.getReferenceCount(); idx++) Reference curRef = fk.getReference(idx); Column sourceColumn = curRef.getLocalColumn(); Column targetColumn = curRef.getForeignColumn();
boolean mustBeUnique = !getPlatformInfo().isSystemForeignKeyIndicesAlwaysNonUnique(); for (int columnIdx = 0; columnIdx < fk.getReferenceCount(); columnIdx++) String name = fk.getReference(columnIdx).getLocalColumnName(); Column localColumn = table.findColumn(name, getPlatform().isDelimitedIdentifierModeOn()); isInternalForeignKeyIndex(metaData, table, fk, index)) fk.setAutoIndexPresent(true); table.removeIndex(indexIdx);
if (curTableIsInList != tableList.contains(curFk.getForeignTable()))
if ((_caseSensitive && curFks[fkIdx].getForeignTableName().equals(intermediateTable.getQualifiedName())) || (!_caseSensitive && curFks[fkIdx].getForeignTableName().equalsIgnoreCase(intermediateTable.getQualifiedName())))
public int compare(Object obj1, Object obj2) { String fk1Name = ((ForeignKey)obj1).getName(); String fk2Name = ((ForeignKey)obj2).getName(); if (!caseSensitive) { fk1Name = (fk1Name != null ? fk1Name.toLowerCase() : null); fk2Name = (fk2Name != null ? fk2Name.toLowerCase() : null); } return collator.compare(fk1Name, fk2Name); } });
/** * {@inheritDoc} */ protected void writeForeignKeyOnDeleteAction(Table table, ForeignKey foreignKey) throws IOException { if (foreignKey.getOnDelete() != CascadeActionEnum.NONE) { super.writeForeignKeyOnDeleteAction(table, foreignKey); } }
/** * Finds the foreign key in this table that is equal to the supplied foreign key. * * @param key The foreign key to search for * @return The found foreign key */ public ForeignKey findForeignKey(ForeignKey key) { for (int idx = 0; idx < getForeignKeyCount(); idx++) { ForeignKey fk = getForeignKey(idx); if (fk.equals(key)) { return fk; } } return null; }
/** * Reads reference elements from the XML stream reader and adds them to the given * foreign key. * * @param xmlReader The reader * @param foreignKey The foreign key */ private void readReferenceElements(XMLStreamReader xmlReader, ForeignKey foreignKey) throws XMLStreamException, IOException { int eventType = XMLStreamReader.START_ELEMENT; while (eventType != XMLStreamReader.END_ELEMENT) { eventType = xmlReader.next(); if (eventType == XMLStreamReader.START_ELEMENT) { QName elemQName = xmlReader.getName(); if (isSameAs(elemQName, QNAME_ELEMENT_REFERENCE)) { foreignKey.addReference(readReferenceElement(xmlReader)); } else { readOverElement(xmlReader); } } } }
/** * Adds a reference, ie. a mapping between a local column (in the table that owns this foreign key) * and a remote column. * * @param reference The reference to add */ public void addReference(Reference reference) { if (reference != null) { for (int idx = 0; idx < _references.size(); idx++) { Reference curRef = getReference(idx); if (curRef.getSequenceValue() > reference.getSequenceValue()) { _references.add(idx, reference); return; } } _references.add(reference); } }