/** * Copyright (c) 2012-2016 Marsha Chechik, Alessio Di Sandro, Michalis Famelis, * Rick Salay. * 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: * Alessio Di Sandro - Implementation. */ package edu.toronto.cs.se.modelepedia.kleisli.library; import edu.toronto.cs.se.mmint.MMINTException; import edu.toronto.cs.se.mmint.extensions.ExtensionPointType; import edu.toronto.cs.se.mmint.MIDHeavyTypeFactory; import edu.toronto.cs.se.mmint.mid.ExtendibleElementConstraint; import edu.toronto.cs.se.mmint.mid.MIDFactory; import edu.toronto.cs.se.mmint.mid.MIDLevel; import edu.toronto.cs.se.mmint.mid.Model; import edu.toronto.cs.se.mmint.mid.ModelOrigin; import edu.toronto.cs.se.mmint.mid.relationship.ModelEndpointReference; import edu.toronto.cs.se.mmint.mid.relationship.ModelRel; import edu.toronto.cs.se.modelepedia.kleisli.KleisliFactory; import edu.toronto.cs.se.modelepedia.kleisli.KleisliModel; import edu.toronto.cs.se.modelepedia.kleisli.KleisliModelEndpoint; import edu.toronto.cs.se.modelepedia.kleisli.KleisliModelRel; /** * The factory to create/modify/remove Kleisli "heavy" types, i.e. Kleisli types * from extensions. * * @author Alessio Di Sandro * */ public class KleisliMIDHeavyTypeFactory extends MIDHeavyTypeFactory { /** * Creates a Kleisli copy of a "heavy" model type to be used as the extended * target of a Kleisli model type endpoint. * * @param origModelType * The model type to be copied * @return The created Kleisli model type. */ private KleisliModel kleisliCopyHeavyModelType(KleisliModelEndpoint containerModelTypeEndpoint) { KleisliModel kModelType = KleisliFactory.eINSTANCE.createKleisliModel(); Model origModelType = containerModelTypeEndpoint.getTarget(); kModelType.setUri(origModelType.getUri()); kModelType.setName(origModelType.getName()); kModelType.setLevel(MIDLevel.TYPES); kModelType.setSupertype(origModelType.getSupertype()); kModelType.setDynamic(false); kModelType.setAbstract(origModelType.isAbstract()); ExtendibleElementConstraint origConstraint = origModelType.getConstraint(); if (origConstraint != null) { ExtendibleElementConstraint kConstraint = MIDFactory.eINSTANCE.createExtendibleElementConstraint(); kConstraint.setLanguage(origConstraint.getLanguage()); kConstraint.setImplementation(origConstraint.getImplementation()); kModelType.setConstraint(kConstraint); } kModelType.setOrigin(ModelOrigin.IMPORTED); kModelType.setFileExtension(origModelType.getFileExtension()); containerModelTypeEndpoint.setExtendedTarget(kModelType); return kModelType; } /** * Kleisli version. {@inheritDoc} */ @Override public ModelRel createHeavyModelRelType(ExtensionPointType extensionType, boolean isBinary) throws MMINTException { KleisliModelRel newModelRelType = (isBinary) ? KleisliFactory.eINSTANCE.createBinaryKleisliModelRel() : KleisliFactory.eINSTANCE.createKleisliModelRel(); super.addHeavyModelRelType(newModelRelType, extensionType.getUri(), extensionType.getSupertypeUri(), extensionType.getName(), extensionType.isAbstract()); return newModelRelType; } /** * Kleisli version. {@inheritDoc} */ @Override public ModelEndpointReference createHeavyModelTypeEndpointAndModelTypeEndpointReference(ExtensionPointType extensionType, Model targetModelType, boolean isBinarySrc, ModelRel containerModelRelType) throws MMINTException { KleisliModelEndpoint newModelTypeEndpoint = KleisliFactory.eINSTANCE.createKleisliModelEndpoint(); ModelEndpointReference newModelTypeEndpointRef = super.addHeavyModelTypeEndpointAndModelTypeEndpointReference(newModelTypeEndpoint, extensionType.getUri(), extensionType.getSupertypeUri(), extensionType.getName(), targetModelType, isBinarySrc, containerModelRelType); kleisliCopyHeavyModelType(newModelTypeEndpoint); return newModelTypeEndpointRef; } }