/* * DBeaver - Universal Database Manager * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org) * * Licensed 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.jkiss.dbeaver.model.impl.jdbc.struct; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.meta.Property; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.struct.*; import org.jkiss.dbeaver.model.struct.rdb.DBSForeignKeyModifyRule; import org.jkiss.dbeaver.model.struct.rdb.DBSTableForeignKey; import org.jkiss.dbeaver.model.meta.IPropertyValueListProvider; import java.util.List; /** * JDBCTableForeignKey */ public abstract class JDBCTableForeignKey< TABLE extends JDBCTable, PRIMARY_KEY extends JDBCTableConstraint<TABLE>> extends JDBCTableConstraint<TABLE> implements DBSTableForeignKey { @Nullable protected PRIMARY_KEY referencedKey; protected DBSForeignKeyModifyRule deleteRule; protected DBSForeignKeyModifyRule updateRule; public JDBCTableForeignKey( @NotNull TABLE table, @NotNull String name, @Nullable String description, @Nullable PRIMARY_KEY referencedKey, DBSForeignKeyModifyRule deleteRule, DBSForeignKeyModifyRule updateRule, boolean persisted) { super(table, name, description, DBSEntityConstraintType.FOREIGN_KEY, persisted); this.referencedKey = referencedKey; this.deleteRule = deleteRule; this.updateRule = updateRule; } public JDBCTableForeignKey( @NotNull DBRProgressMonitor monitor, @NotNull TABLE table, @NotNull DBSEntityAssociation source, boolean persisted) throws DBException { super(table, source, persisted); DBSEntityConstraint srcRefConstraint = source.getReferencedConstraint(); if (srcRefConstraint != null) { DBSEntity refEntity = srcRefConstraint.getParentObject(); if (refEntity != null) { if (srcRefConstraint instanceof JDBCTableConstraint && refEntity.getParentObject() == table.getParentObject()) { // Referenced object in the same schema as we are - let's just use it this.referencedKey = (PRIMARY_KEY) srcRefConstraint; } else { // Try to find table with the same name as referenced constraint owner DBSObject refTable = table.getContainer().getChild(monitor, refEntity.getName()); if (refTable instanceof DBSEntity) { List<DBSEntityAttribute> refAttrs = DBUtils.getEntityAttributes(monitor, referencedKey); this.referencedKey = (PRIMARY_KEY) DBUtils.findEntityConstraint(monitor, (DBSEntity) refTable, refAttrs); } } } } if (source instanceof DBSTableForeignKey) { this.deleteRule = ((DBSTableForeignKey)source).getDeleteRule(); this.updateRule = ((DBSTableForeignKey)source).getUpdateRule(); } else { this.deleteRule = DBSForeignKeyModifyRule.NO_ACTION; this.updateRule = DBSForeignKeyModifyRule.NO_ACTION; } } @Nullable @Property(viewable = true, order = 3) public TABLE getReferencedTable() { return referencedKey == null ? null : referencedKey.getTable(); } @Nullable @Override @Property(id = "reference", viewable = true, order = 4) public PRIMARY_KEY getReferencedConstraint() { return referencedKey; } @NotNull @Override @Property(viewable = true, editable = true, listProvider = ConstraintModifyRuleListProvider.class, order = 5) public DBSForeignKeyModifyRule getDeleteRule() { return deleteRule; } public void setDeleteRule(DBSForeignKeyModifyRule deleteRule) { this.deleteRule = deleteRule; } @NotNull @Override @Property(viewable = true, editable = true, listProvider = ConstraintModifyRuleListProvider.class, order = 6) public DBSForeignKeyModifyRule getUpdateRule() { return updateRule; } public void setUpdateRule(DBSForeignKeyModifyRule updateRule) { this.updateRule = updateRule; } @Override public TABLE getAssociatedEntity() { return getReferencedTable(); } public static class ConstraintModifyRuleListProvider implements IPropertyValueListProvider<JDBCTableForeignKey> { @Override public boolean allowCustomValue() { return false; } @Override public Object[] getPossibleValues(JDBCTableForeignKey foreignKey) { return new DBSForeignKeyModifyRule[] { DBSForeignKeyModifyRule.NO_ACTION, DBSForeignKeyModifyRule.CASCADE, DBSForeignKeyModifyRule.RESTRICT, DBSForeignKeyModifyRule.SET_NULL, DBSForeignKeyModifyRule.SET_DEFAULT }; } } }