/*******************************************************************************
* Copyright (c) 2006 CEA List.
* 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:
* CEA List - initial API and implementation
*******************************************************************************/
package org.eclipse.papyrus.uml.extensionpoints.metamodel;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.papyrus.uml.extensionpoints.Activator;
import org.eclipse.papyrus.uml.extensionpoints.standard.ExtensionLabelProvider;
import org.eclipse.papyrus.uml.extensionpoints.utils.Util;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.dialogs.ElementListSelectionDialog;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.Package;
import org.eclipse.uml2.uml.PackageImport;
import org.eclipse.uml2.uml.UMLFactory;
/**
*
*/
public class RegisteredMetamodelSelectionDialog extends ElementListSelectionDialog {
/**
*
*/
private EList importedMetamodels;
/**
*
*/
private List<String> importedMetamodelsNames;
/**
*
*/
private RegisteredMetamodel[] regMetamodels;
/**
*
*/
private Package currentModel;
/**
*
*
* @param umlModel
* @param parent
*/
public RegisteredMetamodelSelectionDialog(Composite parent, Package umlModel) {
super(parent.getShell(), new ExtensionLabelProvider());
currentModel = umlModel;
importedMetamodels = umlModel.getPackageImports();
importedMetamodelsNames = getImportedMetamodelsNames(importedMetamodels);
// Retrieve registered Libraries
regMetamodels = RegisteredMetamodel.getRegisteredMetamodels();
// remove already applied Libraries from the list
regMetamodels = removeAlreadyImportedFromSelection();
this.setTitle("Import Metamodel from Papyrus repository :");
this.setElements(regMetamodels);
}
/**
*
*/
public void run() {
this.open();
this.treatSelection();
}
/**
*
*
* @param appliedLibraries
*
* @return
*/
private List<String> getImportedMetamodelsNames(EList importedMetamodels) {
List<String> Metamodels = new ArrayList<String>();
Iterator importedIt = importedMetamodels.iterator();
while(importedIt.hasNext()) {
org.eclipse.uml2.uml.PackageImport currentImport = (org.eclipse.uml2.uml.PackageImport)importedIt.next();
String currentName = currentImport.getImportedPackage().getName();
Metamodels.add(currentName);
}
return Metamodels;
}
/**
*
*
* @return
*/
private RegisteredMetamodel[] removeAlreadyImportedFromSelection() {
List<RegisteredMetamodel> Metamodels = new ArrayList<RegisteredMetamodel>();
for(int i = 0; i < regMetamodels.length; i++) {
String currentName = regMetamodels[i].name;
if(!importedMetamodelsNames.contains(currentName)) {
Metamodels.add(regMetamodels[i]);
}
}
RegisteredMetamodel[] cleanedList;
cleanedList = Metamodels.toArray(new RegisteredMetamodel[Metamodels.size()]);
return cleanedList;
}
/**
*
*/
private void treatSelection() {
// User selection
Object[] selection = this.getResult();
if(selection == null) { // Cancel was selected
return;
}
for(int i = 0; i < selection.length; i++) {
RegisteredMetamodel currentLibrary = (RegisteredMetamodel)(selection[i]);
URI modelUri = currentLibrary.uri;
addModelImportFromURI(currentModel, modelUri);
}
}
protected boolean addModelImportFromURI(Package currentModel, URI modelUri) {
Resource modelResource = Util.getResourceSet(currentModel).getResource(modelUri, true);
if(modelResource.getContents().size() <= 0) {
Activator.log("The selected uri (" + modelUri.toString() + ") does not contain any model library !");
return false;
}
// Try to reach model
Element root = (Element)modelResource.getContents().get(0);
if(root instanceof Package) {
// Import model library
Package modelToImport = (Package)(modelResource.getContents().get(0));
// create import package
PackageImport modelImport = UMLFactory.eINSTANCE.createPackageImport();
modelImport.setImportedPackage(modelToImport);
return currentModel.getPackageImports().add(modelImport);
}
Activator.log("The selected uri (" + modelUri.toString() + ") does not contain any model library !");
return false;
}
}