/******************************************************************************* * Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Oracle - initial API and implementation from Oracle TopLink ******************************************************************************/ package org.eclipse.persistence.tools.workbench.mappingsplugin.ui.db; import java.util.Collection; import java.util.Iterator; import java.util.Vector; import javax.swing.JOptionPane; import org.eclipse.persistence.tools.workbench.framework.context.WorkbenchContext; import org.eclipse.persistence.tools.workbench.framework.resources.ResourceRepository; import org.eclipse.persistence.tools.workbench.mappingsmodel.db.MWReference; import org.eclipse.persistence.tools.workbench.mappingsmodel.db.MWTable; import org.eclipse.persistence.tools.workbench.mappingsmodel.generation.MWDescriptorGenerator; import org.eclipse.persistence.tools.workbench.mappingsmodel.generation.MWRelationshipHolder; import org.eclipse.persistence.tools.workbench.mappingsmodel.project.relational.MWRelationalProject; import org.eclipse.persistence.tools.workbench.mappingsplugin.ui.project.relational.RelationalProjectNode; import org.eclipse.persistence.tools.workbench.utility.CollectionTools; final class DescriptorGenerationCoordinator { private WorkbenchContext context; DescriptorGenerationCoordinator(WorkbenchContext context) { super(); initialize(context); } private void initialize(WorkbenchContext context) { this.context = context; } private Vector calculatePossibleRelationships(Collection tables) { Vector possibleRelationships = new Vector(); for (Iterator tableIt = tables.iterator(); tableIt.hasNext();) { for (Iterator references = ((MWTable) tableIt.next()).references(); references.hasNext();) { MWReference reference = (MWReference) references.next(); if ((!reference.isForeignKeyReference()) || (!tables.contains(reference.getTargetTable()))) continue; // add a possible relationship for both directions (the boolean indicates foreign key is in target table) possibleRelationships.add(new MWRelationshipHolder(reference, false)); possibleRelationships.add(new MWRelationshipHolder(reference, true)); } } return possibleRelationships; } private boolean checkForProjectSave(RelationalProjectNode projectNode) { if (projectNode.isDirty()) return promptToSaveProject(projectNode); else return true; } void generateClassDescriptorsForAllTables(RelationalProjectNode projectNode) { generateClassDescriptorsForTables(projectNode, CollectionTools.collection(projectNode.getProject().getDatabase().tables())); } void generateClassDescriptorsForSelectedTables(RelationalProjectNode projectNode, Collection selectedTables) { generateClassDescriptorsForTables(projectNode, selectedTables); } private void generateClassDescriptorsForTables(RelationalProjectNode projectNode, Collection tables) { generateDescriptorsForTables(projectNode, tables); } private void generateDescriptorsForTables(RelationalProjectNode projectNode, Collection tables) { if (!checkForProjectSave(projectNode)) return; DescriptorGenerationDialog descriptorDialog = new DescriptorGenerationDialog((MWRelationalProject) projectNode.getProject(), context); descriptorDialog.show(); if (descriptorDialog.wasCanceled()) { return; } Vector possibleRelationships = new Vector(); Collection relationshipsToCreate = new Vector(); boolean generateBidirectionalRelationships = false; if (!possibleRelationships.isEmpty()) { RelationshipGenerationDialog relationshipDialog = new RelationshipGenerationDialog(possibleRelationships, context); relationshipDialog.show(); if (relationshipDialog.wasCanceled()) { return; } relationshipsToCreate = relationshipDialog.getRelationshipsToCreate(); generateBidirectionalRelationships = relationshipDialog.getGenerateBidirectionalRelationships(); } MWDescriptorGenerator generator = new MWDescriptorGenerator(); generator.setProject((MWRelationalProject) projectNode.getProject()); generator.setTables(tables); generator.setPackageName(descriptorDialog.getPackageName()); generator.setGenerateMethodAccessors(descriptorDialog.getGenerateAccessors()); generator.setGenerateBidirectionalRelationships(generateBidirectionalRelationships); generator.setRelationshipsToCreate(relationshipsToCreate); generator.generateClassesAndDescriptors(); // show successful dialog String successDialogString = "generateClassesAndDescriptors"; JOptionPane.showMessageDialog( context.getCurrentWindow(), resourceRepository().getString(successDialogString + ".message"), resourceRepository().getString(successDialogString + ".title"), JOptionPane.INFORMATION_MESSAGE); } private boolean promptToSaveProject(RelationalProjectNode projectNode) { int selection = JOptionPane.showConfirmDialog( context.getCurrentWindow(), resourceRepository().getString("autoGeneratingClassAndDescriptor.message"), resourceRepository().getString("saveProject.title"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE); if (selection == JOptionPane.YES_OPTION) { if (projectNode.save(null,this.context)) { return true; } else { JOptionPane.showMessageDialog( context.getCurrentWindow(), resourceRepository().getString("saveProjectError.message"), resourceRepository().getString("unableToCreateClassesAndDescriptors.title"), JOptionPane.INFORMATION_MESSAGE); return false; } } else { return selection != JOptionPane.CANCEL_OPTION && selection != JOptionPane.CLOSED_OPTION; } } private ResourceRepository resourceRepository() { return this.context.getApplicationContext().getResourceRepository(); } }