/**
* 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.util.component;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.impl.ScheduledPollConsumer;
import org.apache.camel.util.ObjectHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Abstract base class for API Component Consumers.
*/
public abstract class AbstractApiConsumer<E extends Enum<E> & ApiName, T>
extends ScheduledPollConsumer implements PropertyNamesInterceptor, PropertiesInterceptor, ResultInterceptor {
// logger
protected final Logger log = LoggerFactory.getLogger(getClass());
// API Endpoint
protected final AbstractApiEndpoint<E, T> endpoint;
// API method to invoke
protected final ApiMethod method;
// split Array or Collection API method results into multiple Exchanges
private boolean splitResult = true;
public AbstractApiConsumer(AbstractApiEndpoint<E, T> endpoint, Processor processor) {
super(endpoint, processor);
this.endpoint = endpoint;
this.method = ApiConsumerHelper.findMethod(endpoint, this);
}
@Override
public boolean isGreedy() {
// make this consumer not greedy to avoid making too many calls
return false;
}
@Override
protected int poll() throws Exception {
// invoke the consumer method
final Map<String, Object> args = new HashMap<>();
args.putAll(endpoint.getEndpointProperties());
// let the endpoint and the Consumer intercept properties
endpoint.interceptProperties(args);
interceptProperties(args);
try {
Object result = doInvokeMethod(args);
return ApiConsumerHelper.getResultsProcessed(this, result, isSplitResult());
} catch (Throwable t) {
throw ObjectHelper.wrapRuntimeCamelException(t);
}
}
@Override
public void interceptPropertyNames(Set<String> propertyNames) {
// do nothing by default
}
@Override
public void interceptProperties(Map<String, Object> properties) {
// do nothing by default
}
/**
* Invoke the API method.
* This method can be overridden, for example to synchronize API calls for thread-unsafe proxies.
* Derived class MUST call super.doInvokeMethod() to invoke the API method.
* @param args method arguments from endpoint parameters.
* @return method invocation result.
*/
protected Object doInvokeMethod(Map<String, Object> args) {
return ApiMethodHelper.invokeMethod(endpoint.getApiProxy(method, args), method, args);
}
@Override
public Object splitResult(Object result) {
return result;
}
@Override
public void interceptResult(Object result, Exchange resultExchange) {
// do nothing by default
}
public final boolean isSplitResult() {
return splitResult;
}
public final void setSplitResult(boolean splitResult) {
this.splitResult = splitResult;
}
}