/* Licensed 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.activiti.engine.impl.bpmn.behavior;
import java.util.ArrayList;
import java.util.List;
import org.activiti.engine.impl.bpmn.data.AbstractDataAssociation;
import org.activiti.engine.impl.bpmn.data.IOSpecification;
import org.activiti.engine.impl.bpmn.data.ItemInstance;
import org.activiti.engine.impl.bpmn.webservice.MessageInstance;
import org.activiti.engine.impl.bpmn.webservice.Operation;
import org.activiti.engine.impl.pvm.delegate.ActivityExecution;
/**
* An activity behavior that allows calling Web services
*
* @author Esteban Robles Luna
* @author Falko Menge
* @author Joram Barrez
*/
public class WebServiceActivityBehavior extends AbstractBpmnActivityBehavior {
public static final String CURRENT_MESSAGE = "org.activiti.engine.impl.bpmn.CURRENT_MESSAGE";
protected Operation operation;
protected IOSpecification ioSpecification;
protected List<AbstractDataAssociation> dataInputAssociations;
protected List<AbstractDataAssociation> dataOutputAssociations;
public WebServiceActivityBehavior(Operation operation) {
this.operation = operation;
this.dataInputAssociations = new ArrayList<AbstractDataAssociation>();
this.dataOutputAssociations = new ArrayList<AbstractDataAssociation>();
}
public void addDataInputAssociation(AbstractDataAssociation dataAssociation) {
this.dataInputAssociations.add(dataAssociation);
}
public void addDataOutputAssociation(AbstractDataAssociation dataAssociation) {
this.dataOutputAssociations.add(dataAssociation);
}
/**
* {@inheritDoc}
*/
public void execute(ActivityExecution execution) throws Exception {
MessageInstance message;
if (ioSpecification != null) {
this.ioSpecification.initialize(execution);
ItemInstance inputItem = (ItemInstance) execution.getVariable(this.ioSpecification.getFirstDataInputName());
message = new MessageInstance(this.operation.getInMessage(), inputItem);
} else {
message = this.operation.getInMessage().createInstance();
}
execution.setVariable(CURRENT_MESSAGE, message);
this.fillMessage(message, execution);
MessageInstance receivedMessage = this.operation.sendMessage(message);
execution.setVariable(CURRENT_MESSAGE, receivedMessage);
if (ioSpecification != null) {
String firstDataOutputName = this.ioSpecification.getFirstDataOutputName();
if (firstDataOutputName != null) {
ItemInstance outputItem = (ItemInstance) execution.getVariable(firstDataOutputName);
outputItem.getStructureInstance().loadFrom(receivedMessage.getStructureInstance().toArray());
}
}
this.returnMessage(receivedMessage, execution);
execution.setVariable(CURRENT_MESSAGE, null);
leave(execution);
}
private void returnMessage(MessageInstance message, ActivityExecution execution) {
for (AbstractDataAssociation dataAssociation : this.dataOutputAssociations) {
dataAssociation.evaluate(execution);
}
}
private void fillMessage(MessageInstance message, ActivityExecution execution) {
for (AbstractDataAssociation dataAssociation : this.dataInputAssociations) {
dataAssociation.evaluate(execution);
}
}
public void setIoSpecification(IOSpecification ioSpecification) {
this.ioSpecification = ioSpecification;
}
}