/******************************************************************************* * Copyright (c) 2008, 2009 Borland Software Corporation and others. * * 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: * Borland Software Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.m2m.internal.qvt.oml.evaluator; import java.util.HashMap; import java.util.Map; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.m2m.internal.qvt.oml.ast.env.ModelParameterExtent; import org.eclipse.m2m.internal.qvt.oml.ast.parser.IntermediateClassFactory; import org.eclipse.m2m.internal.qvt.oml.evaluator.TransformationInstance.InternalTransformation; import org.eclipse.m2m.internal.qvt.oml.expressions.ModelParameter; import org.eclipse.m2m.internal.qvt.oml.expressions.ModelType; import org.eclipse.m2m.internal.qvt.oml.expressions.OperationalTransformation; import org.eclipse.m2m.internal.qvt.oml.stdlib.CallHandler; class TransformationInstanceImpl extends ModuleInstanceImpl implements TransformationInstance, InternalTransformation { private final Map<ModelParameter, ModelInstance> fModelParams; private ModelInstance fIntermediateData; private CallHandler fTransHandler; TransformationInstanceImpl(OperationalTransformation type) { super(type); fModelParams = new HashMap<ModelParameter, ModelInstance>(3); initIntermediateExtentIfRequired(); } public void setModel(ModelParameter parameter, ModelInstance extent) { if(parameter == null || extent == null) { throw new IllegalArgumentException(); } fModelParams.put(parameter, extent); } public ModelInstance getIntermediateExtent() { return fIntermediateData; } public OperationalTransformation getTransformation() { return (OperationalTransformation) eClass(); } public ModelInstance getModel(ModelParameter modelParam) { return fModelParams.get(modelParam); } @Override public <T> T getAdapter(Class<T> adapterType) { if(InternalTransformation.class == adapterType || TransformationInstance.class == adapterType || ModuleInstance.class == adapterType) { return adapterType.cast(this); } return super.getAdapter(adapterType); } public CallHandler getTransformationHandler() { return fTransHandler; } public void setTransformationHandler(CallHandler handler) { fTransHandler = handler; } @Override public void dispose() { super.dispose(); } @Override public String toString() { OperationalTransformation transformation = getTransformation(); StringBuilder buf = new StringBuilder(); buf.append("transformation ").append(transformation.getName()).append("("); //$NON-NLS-1$ //$NON-NLS-2$ int pos = 0; for (ModelParameter modelParameter : transformation.getModelParameter()) { if(pos++ > 0) { buf.append(',').append(' '); } buf.append(modelParameter.getKind()).append(' ') .append(modelParameter.getName()) .append(" : "); //$NON-NLS-1$ EClassifier type = modelParameter.getEType(); if(type != null) { buf.append(type.getName()); } } buf.append(") @").append(Integer.toHexString(System.identityHashCode(this))); //$NON-NLS-1$ return buf.toString(); } private void initIntermediateExtentIfRequired() { for (EClassifier ownedType : getTransformation().getEClassifiers()) { if(ownedType instanceof ModelType) { ModelType modelType = (ModelType) ownedType; if(IntermediateClassFactory.isIntermediateModelType(modelType)) { fIntermediateData = new ModelInstanceImpl(modelType, new ModelParameterExtent()); return; } } } } }