blob: 1a961c364c998af9ae8fa8a6eed6e42c0cd21247 [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.camel.impl;
import java.util.Collections;
import java.util.SortedMap;
import org.apache.camel.CamelContext;
import org.apache.camel.Component;
import org.apache.camel.Endpoint;
import org.apache.camel.InvalidPropertyException;
import org.apache.camel.RuntimeCamelException;
import org.apache.camel.util.IntrospectionSupport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Implements {@link org.apache.camel.EndpointConfiguration} for Endpoint implementations
* which are annotated with {@link org.apache.camel.spi.UriEndpoint}
* to use the {@link org.apache.camel.spi.UriParam} and {@link org.apache.camel.spi.UriParams} annotations
* to denote its parameters which can be specified via URI query parameters.
*/
public class UriComponentConfiguration extends ComponentConfigurationSupport {
private static final Logger LOG = LoggerFactory.getLogger(UriComponentConfiguration.class);
private final Class<? extends Endpoint> endpointClass;
private final SortedMap<String, ParameterConfiguration> parameterConfigurationMap;
private boolean strictOnParameterNames = true;
public UriComponentConfiguration(Component component, Class<? extends Endpoint> endpointClass,
SortedMap<String, ParameterConfiguration> parameterConfigurationMap) {
super(component);
this.endpointClass = endpointClass;
this.parameterConfigurationMap = Collections.unmodifiableSortedMap(parameterConfigurationMap);
}
public UriComponentConfiguration(Component component, Class<? extends Endpoint> endpointClass) {
this(component, endpointClass, UriEndpointComponent.createParameterConfigurationMap(endpointClass));
}
public UriComponentConfiguration(UriEndpointComponent component) {
this(component, component.getEndpointClass(), component.getParameterConfigurationMap());
}
@Override
public Object getEndpointParameter(Endpoint endpoint, String name) throws RuntimeCamelException {
ParameterConfiguration config = getParameterConfiguration(name);
// lets try get the property regardless of if this maps to a valid property name
// then if the introspection fails we will get a valid error otherwise
// lets raise a warning afterwards that we should update the metadata on the endpoint class
Object answer = null;
try {
answer = IntrospectionSupport.getProperty(endpoint, name);
} catch (Exception e) {
throw new RuntimeCamelException(
"Failed to get property '" + name + "' on " + endpoint + " due " + e.getMessage(), e);
}
if (config == null) {
unknownPropertyName(name);
}
return answer;
}
@Override
public void setEndpointParameter(Endpoint endpoint, String name, Object value) throws RuntimeCamelException {
ParameterConfiguration config = getParameterConfiguration(name);
// lets try set the property regardless of if this maps to a valid property name
// then if the injection fails we will get a valid error otherwise
// lets raise a warning afterwards that we should update the metadata on the endpoint class
try {
IntrospectionSupport.setProperty(endpoint, name, value);
} catch (Exception e) {
throw new RuntimeCamelException("Failed to set property '" + name + "' on " + endpoint + " to value "
+ value + " due " + e.getMessage(), e);
}
if (config == null) {
unknownPropertyName(name);
}
}
public CamelContext getCamelContext() {
return component.getCamelContext();
}
public Class<? extends Endpoint> getEndpointClass() {
return endpointClass;
}
public boolean isStrictOnParameterNames() {
return strictOnParameterNames;
}
/**
* Strict mode is enabled by default but if disabled then invalid parameter names
* will not result in exceptions but we will just log warnings about their use
*
* @param strictOnParameterNames whether to throw exceptions if invalid
* parameter names are used or not
*/
public void setStrictOnParameterNames(boolean strictOnParameterNames) {
this.strictOnParameterNames = strictOnParameterNames;
}
@Override
public SortedMap<String, ParameterConfiguration> getParameterConfigurationMap() {
return parameterConfigurationMap;
}
@Override
protected void validatePropertyName(String name) {
ParameterConfiguration parameterConfiguration = getParameterConfiguration(name);
if (parameterConfiguration == null) {
unknownPropertyName(name);
}
}
@Override
protected Object validatePropertyValue(String name, Object value) {
ParameterConfiguration parameterConfiguration = getParameterConfiguration(name);
if (parameterConfiguration == null) {
unknownPropertyName(name);
return value;
} else {
Class<?> parameterType = parameterConfiguration.getParameterType();
return getCamelContext().getTypeConverter().convertTo(parameterType, value);
}
}
protected void unknownPropertyName(String name) {
if (isStrictOnParameterNames()) {
throw new InvalidPropertyException(this, name, endpointClass);
} else {
LOG.warn("Using parameter " + name + " on endpoint " + getEndpointClass().getName()
+ " which does not have a @UriParam annotation! "
+ "Please add the @UriParam annotation to the " + name + " field");
}
}
}