package org.occiware.clouddesigner.occi.simulation.design.services; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.occiware.clouddesigner.occi.AttributeState; import org.occiware.clouddesigner.occi.Configuration; import org.occiware.clouddesigner.occi.Extension; import org.occiware.clouddesigner.occi.Kind; import org.occiware.clouddesigner.occi.Link; import org.occiware.clouddesigner.occi.Mixin; import org.occiware.clouddesigner.occi.Resource; import org.occiware.clouddesigner.occi.util.OcciHelper; public final class SimulationHelper { private SimulationHelper() { } public static final Set<String> attributesToOmit = new HashSet<String>(); static { attributesToOmit.add("occi.core.id"); attributesToOmit.add("occi.core.source"); attributesToOmit.add("occi.core.target"); }; public static boolean schemeExists(Configuration configuration, String scheme){ Extension extension = OcciHelper.loadExtension(scheme); ArrayList<String> schemas = new ArrayList<String>(); for(Extension ex: configuration.getUse()){ schemas.add(ex.getScheme()); } return schemas.contains(extension.getScheme()); } public static boolean isCompute(Resource resource){ String scheme = resource.getKind().getScheme(); String term = resource.getKind().getTerm(); final Extension extension = OcciHelper.loadExtension(scheme); for(Kind kind: extension.getKinds()){ if(kind.getTerm().equals(term)){ Kind d = kind.getParent(); while(d!=null && !d.getTerm().equals("compute")){ d = d.getParent(); } if(d !=null && d.getTerm().equals("compute")) return true; } } return false; } public static void copyEntity(Configuration configuration, Link source, Link target) { target.setId(source.getId()); String sourceKindIdentifier = source.getId(); org.occiware.clouddesigner.occi.Kind targetKind = searchKind(configuration, source.getKind()); if(targetKind != null) { target.setKind(targetKind); } else { System.err.println("Kind " + sourceKindIdentifier + " unknown!"); } List<org.occiware.clouddesigner.occi.Mixin> targetMixins = target.getMixins(); for(Mixin mixin : source.getMixins()) { org.occiware.clouddesigner.occi.Mixin targetMixin = searchMixin(configuration, mixin); if(targetMixin != null) { targetMixins.add(targetMixin); } else { System.err.println("Mixin unknown!"); } } } public static void copyEntity(Configuration configuration, Resource source, Resource target) { target.setId(source.getId()); org.occiware.clouddesigner.occi.Kind targetKind = searchKind(configuration, source.getKind()); if(targetKind != null) { target.setKind(targetKind); } else { System.err.println("Kind unknown!"); } List<org.occiware.clouddesigner.occi.Mixin> targetMixins = target.getMixins(); for(Mixin mixin : source.getMixins()) { org.occiware.clouddesigner.occi.Mixin targetMixin = searchMixin(configuration, mixin); if(targetMixin != null) { targetMixins.add(targetMixin); } else { System.err.println("Mixin unknown!"); } } // Create all target entity's attributes. List<org.occiware.clouddesigner.occi.AttributeState> targetAttributes = target.getAttributes(); for(AttributeState att: source.getAttributes()) { String attributeName = att.getName(); if(!attributesToOmit.contains(attributeName)) { org.occiware.clouddesigner.occi.AttributeState targetAttribute = org.occiware.clouddesigner.occi.OCCIFactory.eINSTANCE.createAttributeState(); targetAttributes.add(targetAttribute); targetAttribute.setName(att.getName()); targetAttribute.setValue(att.getValue()); } } } private static org.occiware.clouddesigner.occi.Kind searchKind(org.occiware.clouddesigner.occi.Configuration configuration, Kind kind) { org.occiware.clouddesigner.occi.Extension extension = OcciHelper.loadExtension(kind.getScheme().toString()); if(!schemeExists(configuration, kind.getScheme().toString())){ configuration.getUse().add(extension); } String term = kind.getTerm(); for(org.occiware.clouddesigner.occi.Kind k : extension.getKinds()) { if(term.equals(k.getTerm())) { return k; } } return null; } private static org.occiware.clouddesigner.occi.Mixin searchMixin(org.occiware.clouddesigner.occi.Configuration configuration, Mixin mixin) { String mixinSchemeWithoutSharp = schemeWithoutSharp(mixin.getScheme().toString()); org.occiware.clouddesigner.occi.Extension extension = null; for(org.occiware.clouddesigner.occi.Extension ext : configuration.getUse()) { if(mixinSchemeWithoutSharp.startsWith(schemeWithoutSharp(ext.getScheme()))) { extension = ext; break; } } if(extension == null) { if(!schemeExists(configuration, mixin.getScheme().toString()) ){ extension = OcciHelper.loadExtension(mixin.getScheme().toString()); configuration.getUse().add(extension); } } String term = mixin.getTerm(); for(org.occiware.clouddesigner.occi.Mixin m : extension.getMixins()) { if(term.equals(m.getTerm())) { return m; } } org.occiware.clouddesigner.occi.Mixin result = org.occiware.clouddesigner.occi.OCCIFactory.eINSTANCE.createMixin(); result.setScheme(mixin.getScheme().toString()); result.setTerm(mixin.getTerm()); extension.getMixins().add(result); return result; } private static String schemeWithoutSharp(String scheme) { return scheme.substring(0, scheme.length()-2); } }