/**
* 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.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.camel.CamelContext;
import org.apache.camel.Component;
import org.apache.camel.EndpointConfiguration;
import org.apache.camel.TypeConverter;
import org.apache.camel.util.UnsafeUriCharactersEncoder;
/**
* Fallback implementation of {@link EndpointConfiguration} used by {@link Component}s
* that did not yet define a configuration type.
*/
@Deprecated
public final class MappedEndpointConfiguration extends DefaultEndpointConfiguration {
// TODO: need 2 sets to differentiate between user keys and fixed keys
private Map<String, Object> params = new LinkedHashMap<String, Object>();
MappedEndpointConfiguration(CamelContext camelContext) {
super(camelContext);
}
MappedEndpointConfiguration(CamelContext camelContext, String uri) {
super(camelContext);
setURI(uri);
}
@SuppressWarnings("unchecked")
public <T> T getParameter(String name) {
return (T) params.get(name);
}
@Override
public <T> void setParameter(String name, T value) {
params.put(name, value);
}
@Override
public boolean equals(Object other) {
if (other == null || !(other instanceof MappedEndpointConfiguration)) {
return false;
}
// if all parameters including scheme are the same, the component and uri must be the same too
return this == other || (this.getClass() == other.getClass() && params.equals(((MappedEndpointConfiguration)other).params));
}
@Override
public int hashCode() {
return params.hashCode();
}
@Override
protected void parseURI() {
ConfigurationHelper.populateFromURI(getCamelContext(), this, new ConfigurationHelper.ParameterSetter() {
@Override
public <T> void set(CamelContext camelContext, EndpointConfiguration config, String name, T value) {
if (name != null && value != null) {
params.put(name, value);
}
}
});
}
@Override
public String toUriString(UriFormat format) {
Set<Map.Entry<String, Object>> entries = params.entrySet();
List<String> queryParams = new ArrayList<String>();
String scheme = null;
String schemeSpecificPart = null;
String authority = null;
String path = null;
String fragment = null;
TypeConverter converter = getCamelContext().getTypeConverter();
// Separate URI values from query parameters
for (Map.Entry<String, Object> entry : entries) {
String key = entry.getKey();
Object value = entry.getValue();
if (key.equals(EndpointConfiguration.URI_SCHEME)) {
scheme = converter.convertTo(String.class, value);
} else if (key.equals(EndpointConfiguration.URI_SCHEME_SPECIFIC_PART)) {
schemeSpecificPart = converter.convertTo(String.class, value);
} else if (key.equals(EndpointConfiguration.URI_AUTHORITY)) {
authority = converter.convertTo(String.class, value);
} else if (key.equals(EndpointConfiguration.URI_USER_INFO)) {
// ignore, part of authority
} else if (key.equals(EndpointConfiguration.URI_HOST)) {
// ignore, part of authority
} else if (key.equals(EndpointConfiguration.URI_PORT)) {
// ignore, part of authority
} else if (key.equals(EndpointConfiguration.URI_PATH)) {
path = converter.convertTo(String.class, value);
} else if (key.equals(EndpointConfiguration.URI_QUERY)) {
// ignore, but this should not be the case, may be a good idea to log...
} else if (key.equals(EndpointConfiguration.URI_FRAGMENT)) {
fragment = converter.convertTo(String.class, value);
} else {
// convert to "param=value" format here, order will be preserved
if (value instanceof List) {
for (Object item : (List<?>)value) {
queryParams.add(key + "=" + UnsafeUriCharactersEncoder.encode(item.toString()));
}
} else {
queryParams.add(key + "=" + UnsafeUriCharactersEncoder.encode(value.toString()));
}
}
}
queryParams.sort(null);
String q = "";
for (String entry : queryParams) {
q += q.length() == 0 ? "" : "&";
q += entry;
}
StringBuilder u = new StringBuilder(64);
if (scheme != null) {
u.append(scheme); // SHOULD NOT be null
u.append(":");
}
if (authority != null) {
u.append("//");
u.append(authority);
u.append(path);
if (q.length() > 0) {
u.append("?");
u.append(q);
}
if (fragment != null) {
u.append("#");
u.append(fragment);
}
} else {
// add leading // if not provided
if (!schemeSpecificPart.startsWith("//")) {
u.append("//");
}
u.append(schemeSpecificPart);
}
return u.toString();
}
}