/**
* 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.camel.component.salesforce.internal.processor;
import java.util.Map;
import org.apache.camel.AsyncCallback;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.NoTypeConversionAvailableException;
import org.apache.camel.component.salesforce.SalesforceComponent;
import org.apache.camel.component.salesforce.SalesforceEndpoint;
import org.apache.camel.component.salesforce.SalesforceHttpClient;
import org.apache.camel.component.salesforce.api.SalesforceException;
import org.apache.camel.component.salesforce.internal.OperationName;
import org.apache.camel.component.salesforce.internal.SalesforceSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public abstract class AbstractSalesforceProcessor implements SalesforceProcessor {
protected static final boolean NOT_OPTIONAL = false;
protected static final boolean IS_OPTIONAL = true;
protected static final boolean USE_BODY = true;
protected static final boolean IGNORE_BODY = false;
protected final Logger log = LoggerFactory.getLogger(this.getClass());
protected final SalesforceEndpoint endpoint;
protected final Map<String, Object> endpointConfigMap;
protected final OperationName operationName;
protected final SalesforceSession session;
protected final SalesforceHttpClient httpClient;
public AbstractSalesforceProcessor(SalesforceEndpoint endpoint) {
this.endpoint = endpoint;
this.operationName = endpoint.getOperationName();
this.endpointConfigMap = endpoint.getConfiguration().toValueMap();
final SalesforceComponent component = endpoint.getComponent();
this.session = component.getSession();
this.httpClient = endpoint.getConfiguration().getHttpClient();
}
@Override
public abstract boolean process(Exchange exchange, AsyncCallback callback);
/**
* Gets String value for a parameter from header, endpoint config, or exchange body (optional).
*
* @param exchange exchange to inspect
* @param convertInBody converts In body to String value if true
* @param propName name of property
* @param optional if {@code true} returns null, otherwise throws RestException
* @return value of property, or {@code null} for optional parameters if not found.
* @throws org.apache.camel.component.salesforce.api.SalesforceException
* if the property can't be found or on conversion errors.
*/
protected final String getParameter(String propName, Exchange exchange, boolean convertInBody, boolean optional) throws SalesforceException {
return getParameter(propName, exchange, convertInBody, optional, String.class);
}
/**
* Gets value for a parameter from header, endpoint config, or exchange body (optional).
*
* @param exchange exchange to inspect
* @param convertInBody converts In body to parameterClass value if true
* @param propName name of property
* @param optional if {@code true} returns null, otherwise throws RestException
* @param parameterClass parameter type
* @return value of property, or {@code null} for optional parameters if not found.
* @throws org.apache.camel.component.salesforce.api.SalesforceException
* if the property can't be found or on conversion errors.
*/
protected final <T> T getParameter(String propName, Exchange exchange, boolean convertInBody, boolean optional,
Class<T> parameterClass) throws SalesforceException {
final Message in = exchange.getIn();
T propValue = in.getHeader(propName, parameterClass);
if (propValue == null) {
// check if type conversion failed
if (in.getHeader(propName) != null) {
throw new IllegalArgumentException("Header " + propName
+ " could not be converted to type " + parameterClass.getName());
}
final Object value = endpointConfigMap.get(propName);
if (value == null || parameterClass.isInstance(value)) {
propValue = parameterClass.cast(value);
} else {
try {
propValue = exchange.getContext().getTypeConverter().mandatoryConvertTo(parameterClass, value);
} catch (NoTypeConversionAvailableException e) {
throw new SalesforceException(e);
}
}
}
propValue = (propValue == null && convertInBody) ? in.getBody(parameterClass) : propValue;
// error if property was not set
if (propValue == null && !optional) {
String msg = "Missing property " + propName
+ (convertInBody ? ", message body could not be converted to type " + parameterClass.getName() : "");
throw new SalesforceException(msg, null);
}
return propValue;
}
}