blob: 149836e0906af496eab1550078fa52644875a1fd [file] [log] [blame]
/**
* Copyright (c) 2009-2010 Thales Corporate Services S.A.S.
* 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:
* Thales Corporate Services S.A.S - initial API and implementation
*/
package org.eclipse.egf.model.fcore.helper;
import java.util.Collection;
import java.util.Iterator;
import org.eclipse.egf.model.fcore.ContractMode;
import org.eclipse.egf.model.fcore.InvocationContract;
import org.eclipse.egf.model.fcore.OrchestrationParameter;
import org.eclipse.emf.common.util.UniqueEList;
/**
* @author Xavier Maysonnave
*
*/
public class OrchestrationParameterHelper {
private OrchestrationParameterHelper() {
// Prevent Instantiation
}
public static Collection<InvocationContract> getAvailableInvocationContracts(OrchestrationParameter orchestrationParameter) {
Collection<InvocationContract> result = new UniqueEList<InvocationContract>();
if (orchestrationParameter.getType() == null) {
return result;
}
// Retrieve all the InvocationContracts based on their types and mode
result.addAll(orchestrationParameter.getOrchestration().getInvocationContracts(orchestrationParameter.getType()));
if (result.isEmpty()) {
return result;
}
// Filter
for (Iterator<InvocationContract> it = result.iterator(); it.hasNext();) {
InvocationContract invocationContract = it.next();
if (invocationContract.getInvokedMode() == ContractMode.OUT) {
// Only In or In_Out mode are assignable to an OrchestrationParameter
// They have an In semantic in this area
it.remove();
} else {
if (invocationContract.getFactoryComponentContract() != null) {
if (invocationContract.getInvokedMode() == ContractMode.IN) {
// Filter InvocationContract with In mode already assigned to a FactoryComponentContract
it.remove();
} else if (invocationContract.getFactoryComponentContract().getMode() != ContractMode.OUT) {
// Filter InvocationContract with In_Out mode already assigned to an In or In_Out FactoryComponentContract
it.remove();
}
}
if (invocationContract.getSourceInvocationContract() != null) {
if (invocationContract.getInvokedMode() == ContractMode.IN) {
// Filter InvocationContract with In mode already assigned to a SourceInvocationContract
it.remove();
}
}
}
}
// Filter InvocationContract already assigned to an OrchestrationParameter
for (OrchestrationParameter innerOrchestrationParameter : orchestrationParameter.getOrchestrationParameterContainer().getOrchestrationParameters()) {
if (orchestrationParameter == innerOrchestrationParameter) {
continue;
}
for (InvocationContract invocationContract : innerOrchestrationParameter.getInvocationContracts()) {
result.remove(invocationContract);
}
}
return result;
}
}