/** * Copyright (c) 2012-2016 Marsha Chechik, Alessio Di Sandro, Michalis Famelis, * Rick Salay, Naama Ben-David. * 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.z3.mavo; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import org.eclipse.acceleo.common.preference.AcceleoPreferences; import org.eclipse.acceleo.engine.event.IAcceleoTextGenerationListener; import org.eclipse.acceleo.engine.service.AbstractAcceleoGenerator; import org.eclipse.emf.common.util.BasicMonitor; import org.eclipse.emf.ecore.EObject; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import edu.toronto.cs.se.mavo.MAVOElement; import edu.toronto.cs.se.mavo.MAVORoot; import edu.toronto.cs.se.mmint.MMINTException; import edu.toronto.cs.se.mmint.mavo.library.MAVOUtils; import edu.toronto.cs.se.mmint.mid.GenericElement; import edu.toronto.cs.se.mmint.mid.MID; import edu.toronto.cs.se.mmint.mid.Model; import edu.toronto.cs.se.mmint.mid.operator.impl.OperatorImpl; import edu.toronto.cs.se.mmint.mid.utils.FileUtils; import edu.toronto.cs.se.mmint.mid.utils.MIDOperatorIOUtils; public class EcoreMAVOToSMTLIB extends OperatorImpl { private class EcoreMAVOToSMTLIBWithListeners_M2T extends EcoreMAVOToSMTLIB_M2T { public EcoreMAVOToSMTLIBWithListeners_M2T(EObject model, File targetFolder, List<? extends Object> arguments) throws IOException { super(model, targetFolder, arguments); } @Override public List<IAcceleoTextGenerationListener> getGenerationListeners() { List<IAcceleoTextGenerationListener> listeners = new ArrayList<>(); smtListener = new EcoreMAVOToSMTLIBListener(mavoModelObjs, isMayOnly); listeners.add(smtListener); return listeners; } } // input-output protected final static @NonNull String IN_MODEL = "mavo"; private static final @NonNull String PROPERTY_IN_MAYONLY = "mayOnly"; private static final @Nullable Boolean PROPERTY_IN_MAYONLY_DEFAULT = null; protected EcoreMAVOToSMTLIBListener smtListener; protected Map<String, MAVOElement> mavoModelObjs; protected Boolean isMayOnly; @Override public void readInputProperties(Properties inputProperties) throws MMINTException { super.readInputProperties(inputProperties); this.isMayOnly = MIDOperatorIOUtils.getOptionalBoolProperty(inputProperties, PROPERTY_IN_MAYONLY, PROPERTY_IN_MAYONLY_DEFAULT); } protected void init(Model mavoModel) throws Exception { AcceleoPreferences.switchForceDeactivationNotifications(true); AcceleoPreferences.switchNotifications(false); mavoModelObjs = MAVOUtils.createFormulaVars(mavoModel); if (this.isMayOnly == null) { this.isMayOnly = MAVOUtils.isMayOnly(mavoModelObjs); } } protected List<Object> createAcceleoArguments(Model mavoModel) { List<Object> m2tArgs = new ArrayList<>(); m2tArgs.add(mavoModel.getName()); m2tArgs.add(this.isMayOnly); return m2tArgs; } protected File createAcceleoFolder(Model mavoModel) { return (new File(FileUtils.prependWorkspacePathToUri(mavoModel.getUri()))).getParentFile(); } protected AbstractAcceleoGenerator createAcceleoGenerator(MAVORoot rootMavoModelObj, File folder, List<Object> m2tArgs) throws IOException { return new EcoreMAVOToSMTLIBWithListeners_M2T(rootMavoModelObj, folder, m2tArgs); } @Override public Map<String, Model> run( Map<String, Model> inputsByName, Map<String, GenericElement> genericsByName, Map<String, MID> outputMIDsByName) throws Exception { //TODO MMINT[REASONING] generalize for non-mavo too //TODO MMINT[REASONING] improve create formula vars 1) use other strings if name not present 2) check uniqueness 3) use names of src/tgt for edges // input Model mavoModel = inputsByName.get(IN_MODEL); init(mavoModel); List<Object> m2tArgs = createAcceleoArguments(mavoModel); File folder = createAcceleoFolder(mavoModel); AbstractAcceleoGenerator m2t = createAcceleoGenerator((MAVORoot) mavoModel.getEMFInstanceRoot(), folder, m2tArgs); m2t.doGenerate(new BasicMonitor()); return new HashMap<>(); } public void cleanup() { FileUtils.deleteFile(smtListener.getZ3MAVOModelParser().getSMTLIBEncodingUri(), false); } public @NonNull Z3MAVOModelParser getZ3MAVOModelParser() { return smtListener.getZ3MAVOModelParser(); } }