package asemedashboardview.views.actions;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import SAG.Actor;
import SAG.Goal;
import SAG.SAGPackage;
import SAG.SAGmodel;
import SUC.Role;
import SUC.SUCFactory;
import SUC.SUCPackage;
import SUC.SUCmodel;
import SUC.UseCase;
import asemedashboardview.views.ASEMEAction;
import asemedashboardview.views.ASEMEFacade;
import asemedashboardview.views.ASEMEState;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
public class TransformSAG2SUCModelAction implements ASEMEAction {
private ASEMEFacade context;
@Override
public void init(ASEMEFacade context) {
this.context = context;
}
@Override
public boolean isEnabled() {
ASEMEState state = context.getState();
if(state.getSAG()==null) {
return false;
}
return true;
}
@Override
public void run() {
ASEMEState state = context.getState();
URI sag = state.getSAG();
URI suc = state.getSUC();
if (suc == null) {
suc = sag.trimFileExtension().appendFileExtension("suc"); //$NON-NLS-1$
state.setSUC(suc);
}
ResourceSet resourceSet = new ResourceSetImpl();
// Register the appropriate resource factory to handle all file
// extensions.
//
resourceSet
.getResourceFactoryRegistry()
.getExtensionToFactoryMap()
.put(Resource.Factory.Registry.DEFAULT_EXTENSION,
new XMIResourceFactoryImpl());
// Register the package to ensure it is available during loading.
//
resourceSet.getPackageRegistry().put(SUCPackage.eNS_URI, SUCPackage.eINSTANCE);
resourceSet.getPackageRegistry().put(SAGPackage.eNS_URI, SAGPackage.eINSTANCE);
// load SUC model
Resource resource = resourceSet.getResource(state.getSAG(), true);
SAGmodel sagModel = (SAGmodel) resource.getContents().get(0);
// Create a new SUC model instance
Resource newResource = resourceSet.createResource(state.getSUC());
SUCmodel sucModel = SUCFactory.eINSTANCE.createSUCmodel();
newResource.getContents().add(sucModel);
// transformation code:
HashMap<String, Role> roles = new HashMap<String, Role>();
int xmiID=1;
for (Iterator<Actor> iterator = sagModel.getActors().iterator(); iterator.hasNext();) {
Actor tmpActor = iterator.next();
Role tmpRole = SUCFactory.eINSTANCE.createRole();
tmpRole.setName(tmpActor.getName());
newResource.getContents().add(tmpRole);
ASEMEXmlHelper.setXmlId(tmpRole, new String("role"+xmiID));
xmiID++;
sucModel.getRoles().add(tmpRole);
roles.put(tmpRole.getName(), tmpRole);
//newResource.getContents().add(tmpRole);
}
xmiID=1;
for (Iterator<Goal> iterator = sagModel.getGoals().iterator(); iterator.hasNext();) {
Goal tmpGoal = iterator.next();
UseCase tmpUsecase = SUCFactory.eINSTANCE.createUseCase();
tmpUsecase.setName(tmpGoal.getName());
newResource.getContents().add(tmpUsecase);
ASEMEXmlHelper.setXmlId(tmpUsecase, new String("usecase"+xmiID));
xmiID++;
sucModel.getUsecases().add(tmpUsecase);
tmpUsecase.getParticipant().add(roles.get(tmpGoal.getDepender().getName()));
for (Iterator<Actor> iterator2 = tmpGoal.getDependee().iterator(); iterator2
.hasNext();) {
tmpUsecase.getParticipant().add(roles.get(iterator2.next().getName()));
}
tmpUsecase.setSpecified_by(tmpGoal.getRequirements());
}
// save the SUC model
try {
Map<String, Object> options = new HashMap<String, Object>();
options.put( XMLResource.OPTION_ENCODING, "UTF8" );
options.put( XMLResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE);
options.put( XMLResource.OPTION_SCHEMA_LOCATION_IMPLEMENTATION , Boolean.TRUE);
newResource.save(options);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}