blob: 05b2b3e458b9a77e225ba8733ae894c88a0909ee [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.ode.bpel.compiler;
import org.apache.ode.bpel.compiler.api.CompilationException;
import org.apache.ode.bpel.compiler.bom.Activity;
import org.apache.ode.bpel.compiler.bom.Correlation;
import org.apache.ode.bpel.o.OActivity;
import org.apache.ode.bpel.o.OPickReceive;
import org.apache.ode.bpel.o.OProcess;
import org.apache.ode.bpel.o.OScope;
import org.apache.ode.utils.msg.MessageBundle;
import javax.xml.namespace.QName;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
/**
* Base class for the {@link PickGenerator} and {@link ReceiveGenerator}
* classes. Provides common functionality related to generating
* {@link org.apache.ode.bpel.o.OPickReceive.OnMessage} objects.
*/
abstract class PickReceiveGenerator extends DefaultActivityGenerator {
protected static final CommonCompilationMessages __cmsgsGeneral = MessageBundle
.getMessages(CommonCompilationMessages.class);
protected static final PickGeneratorMessages __cmsgs = MessageBundle.getMessages(PickGeneratorMessages.class);
public OActivity newInstance(Activity src) {
return new OPickReceive(_context.getOProcess(), _context.getCurrent());
}
/**
* Compile an On-Message or Receive block.
*
* @param varname
* name of variable to receive into
* @param plink
* partner link to receive on
* @param operation
* name of operation
* @param portType
* optional portType
* @param createInstance
* is this a start activity
* @param correlations
* the correlations used
* @return
*/
protected OPickReceive.OnMessage compileOnMessage(String varname, String plink, String operation,
String messageExchangeId, QName portType, boolean createInstance, Collection<Correlation> correlations, String route) {
OPickReceive.OnMessage onMessage = new OPickReceive.OnMessage(_context.getOProcess());
onMessage.partnerLink = _context.resolvePartnerLink(plink);
onMessage.operation = _context.resolveMyRoleOperation(onMessage.partnerLink, operation);
if (onMessage.operation.getInput() != null && onMessage.operation.getInput().getMessage() != null)
onMessage.variable = _context.resolveMessageVariable(varname, onMessage.operation.getInput().getMessage()
.getQName());
onMessage.messageExchangeId = messageExchangeId;
onMessage.route = route;
if (portType != null && !portType.equals(onMessage.partnerLink.myRolePortType.getQName()))
throw new CompilationException(__cmsgsGeneral.errPortTypeMismatch(portType,
onMessage.partnerLink.myRolePortType.getQName()));
if (createInstance)
onMessage.partnerLink.addCreateInstanceOperation(onMessage.operation);
Set<String> csetNames = new HashSet<String>(); // prevents duplicate cset in on one set of correlations
for (Correlation correlation : correlations) {
if( csetNames.contains(correlation.getCorrelationSet() ) ) {
throw new CompilationException(__cmsgsGeneral.errDuplicateUseCorrelationSet(correlation
.getCorrelationSet()));
}
OScope.CorrelationSet cset = _context.resolveCorrelationSet(correlation.getCorrelationSet());
switch (correlation.getInitiate()) {
case UNSET:
case NO:
if (createInstance)
throw new CompilationException(__cmsgsGeneral.errUseOfUninitializedCorrelationSet(correlation
.getCorrelationSet()));
onMessage.matchCorrelations.add(cset);
onMessage.partnerLink.addCorrelationSetForOperation(onMessage.operation, cset, false);
break;
case YES:
onMessage.initCorrelations.add(cset);
break;
case JOIN:
cset.hasJoinUseCases = true;
onMessage.joinCorrelations.add(cset);
onMessage.partnerLink.addCorrelationSetForOperation(onMessage.operation, cset, true);
break;
default:
throw new AssertionError("Unexpected value for correlation set enumeration!");
}
for (OProcess.OProperty property : cset.properties) {
// Force resolution of alias, to make sure that we have one for
// this variable-property pair.
_context.resolvePropertyAlias(onMessage.variable, property.name);
}
csetNames.add(correlation.getCorrelationSet());
}
if (!onMessage.partnerLink.hasMyRole()) {
throw new CompilationException(__cmsgsGeneral.errNoMyRoleOnReceivePartnerLink(onMessage.partnerLink
.getName()));
}
return onMessage;
}
}