blob: 10dd650eaae19eb9e9af14efcda09f76c7c7ceff [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2013 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
* Alex Paperno - bugs 404647
********************************************************************************/
package org.eclipse.m2m.internal.qvt.oml.stdlib;
import java.util.List;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.m2m.internal.qvt.oml.ast.env.QvtOperationalEvaluationEnv;
import org.eclipse.m2m.internal.qvt.oml.evaluator.ModuleInstance;
import org.eclipse.m2m.qvt.oml.util.MutableList;
import org.eclipse.ocl.types.OCLStandardLibrary;
import org.eclipse.ocl.util.CollectionUtil;
import org.eclipse.ocl.util.TypeUtil;
public class ListOperations extends AbstractContextualOperations {
public static final String ADD_NAME = "add"; //$NON-NLS-1$
public static final String APPEND_SYNONYM = "append"; //$NON-NLS-1$
public static final String PREPEND_NAME = "prepend"; //$NON-NLS-1$
public static final String INSERT_AT_NAME = "insertAt"; //$NON-NLS-1$
public static final String JOINFIELDS_NAME = "joinfields"; //$NON-NLS-1$
public static final String AS_SET_NAME = "asSet"; //$NON-NLS-1$
public static final String AS_ORDERED_SET_NAME = "asOrderedSet"; //$NON-NLS-1$
public static final String AS_SEQUENCE_NAME = "asSequence"; //$NON-NLS-1$
public static final String AS_BAG_NAME = "asBag"; //$NON-NLS-1$
public static final String FLATTEN_NAME = "flatten"; //$NON-NLS-1$
static CallHandler ADD = new CallHandlerMutator() {
@SuppressWarnings("unchecked")
public Object invoke(ModuleInstance module, Object source, Object[] args, QvtOperationalEvaluationEnv evalEnv) {
List<Object> list = (List<Object>) source;
final Object element = args[0];
if(element != CallHandlerAdapter.getInvalidResult(evalEnv)) {
list.add(element);
}
return null;
}
};
static CallHandler PREPEND = new CallHandlerMutator() {
@SuppressWarnings("unchecked")
public Object invoke(ModuleInstance module, Object source, Object[] args, QvtOperationalEvaluationEnv evalEnv) {
List<Object> list = (List<Object>) source;
final Object element = args[0];
if(element != CallHandlerAdapter.getInvalidResult(evalEnv)) {
list.add(0, element);
}
return null;
}
};
static CallHandler INSERT_AT = new CallHandlerMutator() {
@SuppressWarnings("unchecked")
public Object invoke(ModuleInstance module, Object source, Object[] args, QvtOperationalEvaluationEnv evalEnv) {
MutableList<Object> list = (MutableList<Object>) source;
final Object element = args[0];
if(element != CallHandlerAdapter.getInvalidResult(evalEnv)) {
Integer at = (Integer)args[1];
list.insertAt(element, at);
}
return null;
}
};
static CallHandler JOINFIELDS = new CallHandler() {
@SuppressWarnings("unchecked")
public Object invoke(ModuleInstance module, Object source, Object[] args, QvtOperationalEvaluationEnv evalEnv) {
MutableList<Object> list = (MutableList<Object>) source;
String sep = (String) args[0];
String begin = (String) args[1];
String end = (String) args[2];
return list.joinfields(sep, begin, end);
}
};
static CallHandler AS_SET = new CallHandler() {
@SuppressWarnings("unchecked")
public Object invoke(ModuleInstance module, Object source, Object[] args, QvtOperationalEvaluationEnv evalEnv) {
MutableList<Object> list = (MutableList<Object>) source;
return CollectionUtil.createNewSet(list);
}
};
static CallHandler AS_ORDERED_SET = new CallHandler() {
@SuppressWarnings("unchecked")
public Object invoke(ModuleInstance module, Object source, Object[] args, QvtOperationalEvaluationEnv evalEnv) {
MutableList<Object> list = (MutableList<Object>) source;
return CollectionUtil.createNewOrderedSet(list);
}
};
static CallHandler AS_SEQUENCE = new CallHandler() {
@SuppressWarnings("unchecked")
public Object invoke(ModuleInstance module, Object source, Object[] args, QvtOperationalEvaluationEnv evalEnv) {
MutableList<Object> list = (MutableList<Object>) source;
return CollectionUtil.createNewSequence(list);
}
};
static CallHandler AS_BAG = new CallHandler() {
@SuppressWarnings("unchecked")
public Object invoke(ModuleInstance module, Object source, Object[] args, QvtOperationalEvaluationEnv evalEnv) {
MutableList<Object> list = (MutableList<Object>) source;
return CollectionUtil.createNewBag(list);
}
};
static CallHandler FLATTEN = new CallHandler() {
@SuppressWarnings("unchecked")
public Object invoke(ModuleInstance module, Object source, Object[] args, QvtOperationalEvaluationEnv evalEnv) {
MutableList<Object> list = (MutableList<Object>) source;
return CollectionUtil.flatten(list);
}
};
public ListOperations(AbstractQVTStdlib library) {
super(library, library.getList());
}
@Override
protected OperationProvider[] getOperations() {
OCLStandardLibrary<EClassifier> oclStdlib = getStdlib().getEnvironment().getOCLStandardLibrary();
return new OperationProvider[] {
new OperationProvider(ADD, ADD_NAME, new String[] { "object"}, oclStdlib.getOclVoid(), oclStdlib.getT()), //$NON-NLS-1$
new OperationProvider(ADD, APPEND_SYNONYM, new String[] { "object"}, oclStdlib.getOclVoid(), oclStdlib.getT()), //$NON-NLS-1$
new OperationProvider(PREPEND, PREPEND_NAME, new String[] { "object"}, oclStdlib.getOclVoid(), oclStdlib.getT()), //$NON-NLS-1$
new OperationProvider(INSERT_AT, INSERT_AT_NAME, new String[] { "object", "pos"}, oclStdlib.getOclVoid(), //$NON-NLS-1$ //$NON-NLS-2$
oclStdlib.getT(), oclStdlib.getInteger()),
new OperationProvider(JOINFIELDS, JOINFIELDS_NAME, new String[] { "sep", "begin", "end" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
oclStdlib.getString(), oclStdlib.getString(), oclStdlib.getString(), oclStdlib.getString()),
new OperationProvider(AS_SET, AS_SET_NAME, new String[] {}, oclStdlib.getSet()),
new OperationProvider(AS_ORDERED_SET, AS_ORDERED_SET_NAME, new String[] {}, oclStdlib.getOrderedSet()),
new OperationProvider(AS_SEQUENCE, AS_SEQUENCE_NAME, new String[] {}, oclStdlib.getSequence()),
new OperationProvider(AS_BAG, AS_BAG_NAME, new String[] {}, oclStdlib.getBag()),
new OperationProvider(FLATTEN, FLATTEN_NAME, new String[] {},
TypeUtil.resolveSequenceType(getStdlib().getEnvironment(), oclStdlib.getT2())),
};
}
}