/*
* Copyright (c) 2006, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* 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.wso2.carbon.mediator.bam;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.databridge.commons.Attribute;
import org.wso2.carbon.databridge.commons.AttributeType;
import org.wso2.carbon.databridge.commons.StreamDefinition;
import org.wso2.carbon.databridge.commons.exception.MalformedStreamDefinitionException;
import org.wso2.carbon.mediator.bam.config.BamMediatorException;
import org.wso2.carbon.mediator.bam.config.stream.Property;
import org.wso2.carbon.mediator.bam.config.stream.StreamConfiguration;
import org.wso2.carbon.mediator.bam.config.stream.StreamEntry;
import org.wso2.carbon.mediator.bam.util.BamMediatorConstants;
import java.util.ArrayList;
import java.util.List;
/**
* Builds the Stream Definition at the stream initialization
*/
public class StreamDefinitionBuilder {
private StreamConfiguration streamConfiguration = null;
private static Log log = LogFactory.getLog(StreamDefinitionBuilder.class);
public StreamDefinition buildStreamDefinition(StreamConfiguration streamConfiguration) throws BamMediatorException {
this.streamConfiguration = streamConfiguration;
StreamDefinition streamDef;
try {
if (streamConfiguration != null){
streamDef = new StreamDefinition(this.streamConfiguration.getName(), this.streamConfiguration.getVersion());
streamDef.setNickName(this.streamConfiguration.getNickname());
streamDef.setDescription(this.streamConfiguration.getDescription());
streamDef.setCorrelationData(this.getCorrelationDataList());
streamDef.setMetaData(this.getMetaDataList());
streamDef.setPayloadData(this.getPayloadDataList());
return streamDef;
} else {
String errorMsg = "Stream Definition is null.";
log.error(errorMsg);
throw new BamMediatorException(errorMsg, new Exception());
}
} catch (MalformedStreamDefinitionException e) {
String errorMsg = "Malformed Stream Definition. " + e.getMessage();
log.error(errorMsg, e);
throw new BamMediatorException(errorMsg, e);
} catch (Exception e) {
String errorMsg = "Error occurred while creating the Stream Definition. " + e.getMessage();
log.error(errorMsg, e);
throw new BamMediatorException(errorMsg, e);
}
}
private List<Attribute> getCorrelationDataList() throws BamMediatorException {
try{
List<Attribute> correlationDataAttributeList = new ArrayList<Attribute>();
correlationDataAttributeList.add(new Attribute(BamMediatorConstants.MSG_STR_ACTIVITY_ID, AttributeType.STRING));
return correlationDataAttributeList;
} catch (Exception e) {
String errorMsg = "Error occurred while getting the Correlation Data list. " + e.getMessage();
log.error(errorMsg, e);
throw new BamMediatorException(errorMsg, e);
}
}
private List<Attribute> getMetaDataList() throws BamMediatorException{
List<Attribute> metaDataAttributeList = new ArrayList<Attribute>();
try{
metaDataAttributeList.add(new Attribute(BamMediatorConstants.TENANT_ID, AttributeType.INT));
metaDataAttributeList.add(new Attribute(BamMediatorConstants.HTTP_METHOD, AttributeType.STRING));
metaDataAttributeList.add(new Attribute(BamMediatorConstants.CHARACTER_SET_ENCODING, AttributeType.STRING));
metaDataAttributeList.add(new Attribute(BamMediatorConstants.REMOTE_ADDRESS, AttributeType.STRING));
metaDataAttributeList.add(new Attribute(BamMediatorConstants.TRANSPORT_IN_URL, AttributeType.STRING));
metaDataAttributeList.add(new Attribute(BamMediatorConstants.MESSAGE_TYPE, AttributeType.STRING));
metaDataAttributeList.add(new Attribute(BamMediatorConstants.REMOTE_HOST, AttributeType.STRING));
metaDataAttributeList.add(new Attribute(BamMediatorConstants.SERVICE_PREFIX, AttributeType.STRING));
metaDataAttributeList.add(new Attribute(BamMediatorConstants.HOST, AttributeType.STRING));
return metaDataAttributeList;
} catch (Exception e) {
String errorMsg = "Error occurred while getting the Meta Data list. " + e.getMessage();
log.error(errorMsg, e);
throw new BamMediatorException(errorMsg, e);
}
}
private List<Attribute> getPayloadDataList() throws BamMediatorException {
List<Attribute> payLoadDataAttributeList = new ArrayList<Attribute>();
try{
this.addConstantPayloadToPayloadDataList(payLoadDataAttributeList);
this.addPropertyPayloadToPayloadDataList(payLoadDataAttributeList);
this.addEntityPayloadToPayloadDataList(payLoadDataAttributeList);
return payLoadDataAttributeList;
} catch (Exception e) {
String errorMsg = "Error occurred while getting the Payload Data list. " + e.getMessage();
log.error(errorMsg, e);
throw new BamMediatorException(errorMsg, e);
}
}
private void addConstantPayloadToPayloadDataList(List<Attribute> attributes) throws BamMediatorException {
try{
attributes.add(new Attribute(BamMediatorConstants.MSG_DIRECTION, AttributeType.STRING));
attributes.add(new Attribute(BamMediatorConstants.OPERATION_NAME, AttributeType.STRING));
attributes.add(new Attribute(BamMediatorConstants.MSG_ID, AttributeType.STRING));
attributes.add(new Attribute(BamMediatorConstants.REQUEST_RECEIVED_TIME, AttributeType.LONG));
} catch (Exception e) {
String errorMsg = "Error occurred while adding the Constant Fields to Payload Data list. " + e.getMessage();
log.error(errorMsg, e);
throw new BamMediatorException(errorMsg, e);
}
}
private void addPropertyPayloadToPayloadDataList(List<Attribute> attributes) throws BamMediatorException {
try{
List<Property> properties = this.streamConfiguration.getProperties();
if (properties != null) {
for (Property property : properties) {
if(property.getKey() != null && property.getType() != null){
attributes.add(new Attribute(property.getKey(), this.resolveTypes(property.getType())));
}
}
}
} catch (NullPointerException e) {
String errorMsg = "Undefined key or type in Stream Property. " + e.getMessage();
log.error(errorMsg, e);
throw new BamMediatorException(errorMsg, e);
} catch (Exception e) {
String errorMsg = "Error occurred while adding the Property Fields to Payload Data list. " + e.getMessage();
log.error(errorMsg, e);
throw new BamMediatorException(errorMsg, e);
}
}
private void addEntityPayloadToPayloadDataList(List<Attribute> attributes) throws BamMediatorException {
try{
String entryName = "";
List<StreamEntry> streamEntries = this.streamConfiguration.getEntries();
if (streamEntries != null) {
for (StreamEntry streamEntry : streamEntries) {
if(streamEntry.getName() != null && streamEntry.getType() != null){
if("SOAPBody".equals(streamEntry.getName())){
entryName = "soap_body";
} else if("SOAPHeader".equals(streamEntry.getName())){
entryName = "soap_header";
}
attributes.add(new Attribute(entryName, this.resolveTypes(streamEntry.getType())));
}
}
}
} catch (NullPointerException e) {
String errorMsg = "Undefined key or type in Stream Entry. " + e.getMessage();
log.error(errorMsg, e);
throw new BamMediatorException(errorMsg, e);
} catch (Exception e) {
String errorMsg = "Error occurred while adding the Entity Fields to Payload Data list. " + e.getMessage();
log.error(errorMsg, e);
throw new BamMediatorException(errorMsg, e);
}
}
private AttributeType resolveTypes(String propertyType) throws BamMediatorException {
try{
if ("STRING".equals(propertyType)){
return AttributeType.STRING;
} else if ("INTEGER".equals(propertyType)) {
return AttributeType.INT;
} else if ("FLOAT".equals(propertyType)) {
return AttributeType.FLOAT;
} else if ("DOUBLE".equals(propertyType)) {
return AttributeType.DOUBLE;
} else if ("BOOLEAN".equals(propertyType)) {
return AttributeType.BOOL;
} else if ("LONG".equals(propertyType)) {
return AttributeType.LONG;
} else {
return AttributeType.STRING;
}
} catch (Exception e) {
String errorMsg = "Error occurred while resolving types for Payload Data list. " + e.getMessage();
log.error(errorMsg, e);
throw new BamMediatorException(errorMsg, e);
}
}
}