/****************************************************************************** * Copyright (c) 2016 Oracle * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Konstantin Komissarchik - initial implementation and ongoing maintenance ******************************************************************************/ package org.eclipse.sapphire.samples.sqlschema; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.sapphire.ui.def.DefinitionLoader; import org.eclipse.sapphire.ui.diagram.DiagramConnectionPart; import org.eclipse.sapphire.ui.diagram.StandardConnectionService; import org.eclipse.sapphire.ui.diagram.editor.DiagramNodePart; import org.eclipse.sapphire.ui.forms.swt.SapphireWizard; import org.eclipse.swt.widgets.Display; /** * @author <a href="mailto:konstantin.komissarchik@oracle.com">Konstantin Komissarchik</a> */ public final class SqlSchemaConnectionService extends StandardConnectionService { @Override public DiagramConnectionPart connect( final DiagramNodePart node1, final DiagramNodePart node2, final String connectionType ) { final DiagramConnectionPart fkConnectionPart = super.connect( node1, node2, connectionType ); final ForeignKey fk = (ForeignKey) fkConnectionPart.getLocalModelElement(); final Table referencedTable = fk.getReferencedTable().target(); if( referencedTable != null ) { for( final Column column : referencedTable.getColumns() ) { if( column.isPartOfPrimaryKey().content() ) { fk.getColumnAssociations().insert().setReferencedColumn( column.getName().content() ); } } } if( ! fk.getColumnAssociations().isEmpty() ) { // Make an intelligent guess on local columns by looking for a prefix naming pattern. final Table table = (Table) fk.parent().element(); final List<String> prefixes = new ArrayList<String>(); final String firstReferencedColumnName = fk.getColumnAssociations().get( 0 ).getReferencedColumn().content(); for( final Column column : table.getColumns() ) { final String localColumnName = column.getName().content(); if( localColumnName != null && localColumnName.endsWith( firstReferencedColumnName ) ) { prefixes.add( localColumnName.substring( 0, localColumnName.length() - firstReferencedColumnName.length() ) ); } } for( final String prefix : prefixes ) { boolean match = true; for( final ForeignKey.ColumnAssociation association : fk.getColumnAssociations() ) { final Column candidateLocalColumn = find( table.getColumns(), prefix + association.getReferencedColumn().content() ); if( candidateLocalColumn == null || ! equal( candidateLocalColumn.getType().content(), association.getReferencedColumn().target().getType().content() ) ) { match = false; break; } } if( match ) { for( final ForeignKey.ColumnAssociation association : fk.getColumnAssociations() ) { association.setLocalColumn( prefix + association.getReferencedColumn().content() ); } break; } } } final SapphireWizard<ForeignKey> wizard = new SapphireWizard<ForeignKey>( fk, DefinitionLoader.sdef( SqlSchemaEditor.class ).wizard( "DefineForeignKeyWizard" ) ) { @Override public boolean performCancel() { fkConnectionPart.remove(); return true; } }; final WizardDialog dialog = new WizardDialog( Display.getDefault().getActiveShell(), wizard ); dialog.open(); return ( fk.disposed() ? null : fkConnectionPart ); } private static Column find( final List<Column> columns, final String name ) { for( final Column column : columns ) { final String n = column.getName().content(); if( n != null && n.equals( name ) ) { return column; } } return null; } public static final boolean equal( final Object a, final Object b ) { if( a == b ) { return true; } else if( a != null && b != null ) { return a.equals( b ); } return false; } }