blob: 25ecf1b67da2a47a22453259740c4d3e9b83a2fe [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.component.service;
import java.util.HashMap;
import java.util.Map;
import org.apache.camel.CamelContext;
import org.apache.camel.Endpoint;
import org.apache.camel.cloud.ServiceDefinition;
import org.apache.camel.cloud.ServiceRegistry;
import org.apache.camel.impl.cloud.ServiceRegistryHelper;
import org.apache.camel.impl.cloud.ServiceRegistrySelectors;
import org.apache.camel.spi.Metadata;
import org.apache.camel.spi.annotations.Component;
import org.apache.camel.support.DefaultComponent;
import org.apache.camel.util.ObjectHelper;
import org.apache.camel.util.StringHelper;
import org.apache.camel.util.URISupport;
@Component("service")
public class ServiceComponent extends DefaultComponent {
@Metadata(label = "advanced")
private ServiceRegistry service;
@Metadata(label = "advanced")
private ServiceRegistry.Selector serviceSelector;
public ServiceComponent() {
this(null);
}
public ServiceComponent(CamelContext context) {
super(context);
this.serviceSelector = ServiceRegistrySelectors.DEFAULT_SELECTOR;
}
@Override
protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
final String serviceName = StringHelper.before(remaining, ":");
final String delegateUri = StringHelper.after(remaining, ":");
ObjectHelper.notNull(serviceName, "Service Name");
ObjectHelper.notNull(delegateUri, "Delegate URI");
// Lookup the service registry, this may be a static selected service
// or dynamically selected one through a ServiceRegistry.Selector
final ServiceRegistry service = getServiceRegistry();
// Compute service definition from parameters, this is used as default
// definition
final Map<String, String> params = new HashMap<>();
for (Map.Entry<String, Object> entry: parameters.entrySet()) {
if (!entry.getKey().startsWith(ServiceDefinition.SERVICE_META_PREFIX)) {
continue;
}
final String key = entry.getKey();
final String val = getCamelContext().getTypeConverter().convertTo(String.class, entry.getValue());
params.put(key, val);
}
// add service name, this is always set from an uri path param
params.put(ServiceDefinition.SERVICE_META_NAME, serviceName);
// remove all the service related options so the underlying component
// does not fail because of unknown parameters
parameters.keySet().removeAll(params.keySet());
return new ServiceEndpoint(
uri,
this,
service,
params,
URISupport.appendParametersToURI(delegateUri, parameters)
);
}
public ServiceRegistry getService() {
return service;
}
/**
* Inject the service to use.
*/
public void setService(ServiceRegistry service) {
this.service = service;
}
public ServiceRegistry.Selector getServiceSelector() {
return serviceSelector;
}
/**
*
* Inject the service selector used to lookup the {@link ServiceRegistry} to use.
*/
public void setServiceSelector(ServiceRegistry.Selector serviceSelector) {
this.serviceSelector = serviceSelector;
}
// *****************
// Helpers
// *****************
private ServiceRegistry getServiceRegistry() {
if (service == null) {
return ServiceRegistryHelper.lookupService(getCamelContext(), serviceSelector).orElseThrow(
() -> new IllegalStateException("No cluster service found")
);
}
return service;
}
}