/******************************************************************************* * Copyright (c) 2012 Lars Kroll. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html * * Contributors: * Lars Kroll - initial API and implementation ******************************************************************************/ package se.sics.kompics.ide; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import se.sics.kompics.ide.model.ast.ASTChannel; import se.sics.kompics.ide.model.ast.ASTComponent; import se.sics.kompics.ide.model.ast.ASTComponentDefinition; import se.sics.kompics.ide.model.ast.ASTEvent; import se.sics.kompics.ide.model.ast.ASTHandler; import se.sics.kompics.ide.model.ast.ASTModelObject; import se.sics.kompics.ide.model.ast.ASTPort; import se.sics.kompics.ide.model.ast.ASTPortType; import se.sics.kompics.ide.views.ModelContentProvider; import se.sics.kompics.ide.views.ModelView; import se.sics.kompics.model.kompicsComponents.Event; import se.sics.kompics.model.kompicsComponents.KompicsComponentsFactory; import se.sics.kompics.model.kompicsComponents.PortType; public final class Model { // Elements from Kompics Core public static final ASTPortType controlPort; public static final ASTEvent fault; public static final ASTEvent start; public static final ASTEvent stop; public static final ASTEvent init; private se.sics.kompics.model.kompicsComponents.Model model; private static KompicsComponentsFactory factory = KompicsComponentsFactory.eINSTANCE; static { PortType pt = factory.createPortType(); pt.setType("se.sics.kompics.ControlPort"); controlPort = new ASTPortType("PortType:se.sics.kompics.ControlPort", pt, null); Event f = factory.createEvent(); f.setType("se.sics.kompics.Fault"); controlPort.addToModel(f, ASTModelObject.PROVIDED_PORT); fault = new ASTEvent("Event:se.sics.kompics.Fault", f, null); controlPort.addChild(fault); Event sta = factory.createEvent(); sta.setType("se.sics.kompics.Start"); controlPort.addToModel(sta, ASTModelObject.REQUIRED_PORT); start = new ASTEvent("Event:se.sics.kompics.Start", sta, null); controlPort.addChild(start); Event sto = factory.createEvent(); sto.setType("se.sics.kompics.Stop"); controlPort.addToModel(sto, ASTModelObject.REQUIRED_PORT); stop = new ASTEvent("Event:se.sics.kompics.Stop", sto, null); controlPort.addChild(stop); Event in = factory.createEvent(); in.setType("se.sics.kompics.Init"); controlPort.addToModel(in, ASTModelObject.REQUIRED_PORT); init = new ASTEvent("Event:se.sics.kompics.Init", in, null); controlPort.addChild(init); } // Instance (eager Singleton) public static final Model eINSTANCE = new Model(); // Maps model object ids to their instances private Map<String, ASTModelObject> objects = new HashMap<String, ASTModelObject>(); // Map qualified type names to instances private Map<String, ASTComponentDefinition> components = new HashMap<String, ASTComponentDefinition>(); private Map<String, ASTEvent> events = new HashMap<String, ASTEvent>(); private Map<String, ASTPortType> ports = new HashMap<String, ASTPortType>(); // No point in mapping here again private List<ASTHandler> handlers = new ArrayList<ASTHandler>(); private List<ASTChannel> channels = new ArrayList<ASTChannel>(); private List<ASTPort> portInstances = new ArrayList<ASTPort>(); private List<ASTComponent> componentInstances = new ArrayList<ASTComponent>(); // View related private ModelContentProvider view; private ModelView modelView; private Model() { this.model = factory.createModel(); } public static List<ASTModelObject> getObjects() { return new ArrayList<ASTModelObject>(eINSTANCE.objects.values()); } public static ASTModelObject getObject(String key) { return eINSTANCE.objects.get(key); } public static List<ASTComponentDefinition> getComponents() { return new LinkedList<ASTComponentDefinition>(eINSTANCE.components.values()); } public static ASTComponentDefinition getComponent(String key) { return eINSTANCE.components.get(key); } public static List<ASTComponent> getComponentInstances() { return eINSTANCE.componentInstances; } public static List<ASTEvent> getEvents() { return new LinkedList<ASTEvent>(eINSTANCE.events.values()); } public static ASTEvent getEvent(String key) { return eINSTANCE.events.get(key); } public static List<ASTPortType> getPorts() { return new LinkedList<ASTPortType>(eINSTANCE.ports.values()); } public static ASTPortType getPort(String key) { return eINSTANCE.ports.get(key); } public static List<ASTPort> getPortInstances() { return eINSTANCE.portInstances; } public static List<ASTHandler> getHandlers() { return eINSTANCE.handlers; } public static List<ASTChannel> getChannels() { return eINSTANCE.channels; } public static ASTModelObject add(ASTModelObject obj) { ASTModelObject existing = eINSTANCE.objects.get(obj.getId()); if (existing == null) { eINSTANCE.objects.put(obj.getId(), obj); existing = obj; } else { if (existing.getNode() == null) { existing.setNode(obj.getNode()); } } if (obj.getEObject() == null) { Activator.log("Added ASTMO: " + obj.getClassifierID()); } try { if (eINSTANCE.view != null) { eINSTANCE.view.refresh(); } } catch (NullPointerException ex) { // just ignore...it will be initialized at a later point } return existing; } public static ASTComponentDefinition add(ASTComponentDefinition comp) { ASTComponentDefinition existing = (ASTComponentDefinition) add((ASTModelObject) comp); eINSTANCE.components.put(existing.getModel().getType(), existing); if (existing.equals(comp)) { eINSTANCE.model.getComponents().add(comp.getModel()); } return existing; } public static ASTComponent add(ASTComponent comp) { ASTComponent existing = (ASTComponent) add((ASTModelObject) comp); if (existing.equals(comp)) { eINSTANCE.componentInstances.add(existing); } return existing; } public static ASTPort add(ASTPort port) { ASTPort existing = (ASTPort) add((ASTModelObject) port); if (existing.equals(port)) { eINSTANCE.portInstances.add(existing); } return existing; } public static ASTPortType add(ASTPortType port) { ASTPortType existing = (ASTPortType) add((ASTModelObject) port); eINSTANCE.ports.put(existing.getModel().getType(), existing); if (existing.equals(port)) { eINSTANCE.model.getPortTypes().add(port.getModel()); } return existing; } public static ASTChannel add(ASTChannel ch) { ASTChannel existing = (ASTChannel) add((ASTModelObject) ch); if (existing.equals(ch)) { eINSTANCE.channels.add(existing); eINSTANCE.model.getChannels().add(ch.getModel()); } return existing; // // // for (ASTChannel astch : eINSTANCE.channels) { // if (astch.getNode().equals(ch.getNode())) { // return; // } // } // String pos = " at position " + ch.getNode().getStartPosition(); // pos += " with length " + ch.getNode().getLength(); // Activator.log("Adding channel: " + // ch.getModel().getPortType().getType() + pos); // eINSTANCE.objects.add(ch); // eINSTANCE.channels.add(ch); } public static ASTEvent add(ASTEvent event) { ASTEvent existing = (ASTEvent) add((ASTModelObject) event); eINSTANCE.events.put(existing.getModel().getType(), existing); if (existing.equals(event)) { eINSTANCE.model.getEvents().add(event.getModel()); } return existing; } public static ASTHandler add(ASTHandler handler) { ASTHandler existing = (ASTHandler) add((ASTModelObject) handler); if (existing.equals(handler)) { eINSTANCE.handlers.add(existing); } return existing; // for (ASTHandler asth : eINSTANCE.handlers) { // if (asth.getBinding().isEqualTo(handler.getBinding())) { // return; // } // } // eINSTANCE.objects.add(handler); // eINSTANCE.handlers.add(handler); } public static void clearAll() { eINSTANCE.objects.clear(); eINSTANCE.components.clear(); eINSTANCE.channels.clear(); eINSTANCE.events.clear(); eINSTANCE.handlers.clear(); eINSTANCE.ports.clear(); eINSTANCE.componentInstances.clear(); eINSTANCE.portInstances.clear(); eINSTANCE.model = factory.createModel(); Model.add(fault); Model.add(start); Model.add(stop); Model.add(init); Model.add(controlPort); } public void setContentProvider(ModelContentProvider modelContentProvider) { view = modelContentProvider; } public void unsetContentProvider() { view = null; } public void setViewPart(ModelView modelView) { this.modelView = modelView; } public ModelView getViewPart() { return this.modelView; } public void unsetViewPart() { this.modelView = null; } }