diff options
Diffstat (limited to 'sandbox/slaws/modules/domain-rework/src/main/java/org/apache/tuscany/sca/binding/DefaultBindingURICalculatorExtensionPoint.java')
-rw-r--r-- | sandbox/slaws/modules/domain-rework/src/main/java/org/apache/tuscany/sca/binding/DefaultBindingURICalculatorExtensionPoint.java | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/sandbox/slaws/modules/domain-rework/src/main/java/org/apache/tuscany/sca/binding/DefaultBindingURICalculatorExtensionPoint.java b/sandbox/slaws/modules/domain-rework/src/main/java/org/apache/tuscany/sca/binding/DefaultBindingURICalculatorExtensionPoint.java new file mode 100644 index 0000000000..ae8b33a006 --- /dev/null +++ b/sandbox/slaws/modules/domain-rework/src/main/java/org/apache/tuscany/sca/binding/DefaultBindingURICalculatorExtensionPoint.java @@ -0,0 +1,124 @@ +/* + * 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.tuscany.sca.binding; + +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.tuscany.sca.assembly.Binding; +import org.apache.tuscany.sca.contribution.service.ContributionException; +import org.apache.tuscany.sca.contribution.service.ContributionReadException; +import org.apache.tuscany.sca.contribution.util.ServiceDeclaration; +import org.apache.tuscany.sca.contribution.util.ServiceDiscovery; + +/** + * Default implementation of a binding URI calculator extension point. + * + * @version $Rev$ $Date$ + */ +public class DefaultBindingURICalculatorExtensionPoint implements BindingURICalculatorExtensionPoint { + + private Map<String, BindingURICalculator> bindingURICalculators = new HashMap<String, BindingURICalculator>(); + private boolean loaded; + + public DefaultBindingURICalculatorExtensionPoint() { + } + + public void addBindingURICalculator(BindingURICalculator bindingURICalculator) { + bindingURICalculators.put(bindingURICalculator.getBindingType(), bindingURICalculator); + } + + public void removeBindingURICalculator(BindingURICalculator bindingURICalculator) { + bindingURICalculators.remove(bindingURICalculator.getBindingType()); + } + + public BindingURICalculator getBindingURICalculator(Binding binding) { + loadbindingURICalculators(); + return bindingURICalculators.get(binding.getClass().getName()); + } + + private void loadbindingURICalculators() { + if (loaded) + return; + + // Get the bindingURICalculator service declarations + Set<ServiceDeclaration> bindingURICalculatorDeclarations; + try { + bindingURICalculatorDeclarations = ServiceDiscovery.getInstance().getServiceDeclarations(BindingURICalculator.class); + } catch (IOException e) { + throw new IllegalStateException(e); + } + + for (ServiceDeclaration bindingURICalculatorDeclaration: bindingURICalculatorDeclarations) { + Map<String, String> attributes = bindingURICalculatorDeclaration.getAttributes(); + + // Load a URL artifact bindingURICalculator + String bindingType = attributes.get("binding"); + + // Create a bindingURICalculator wrapper and register it + BindingURICalculator bindingURICalculator = new LazyBindingURICalculator(bindingType, bindingURICalculatorDeclaration); + addBindingURICalculator(bindingURICalculator); + } + + loaded = true; + } + + /** + * A facade for contribution bindingURICalculators. + */ + private static class LazyBindingURICalculator implements BindingURICalculator { + + private ServiceDeclaration bindingURICalculatorDeclaration; + private String bindingType; + private BindingURICalculator bindingURICalculator; + + private LazyBindingURICalculator(String contributionType, ServiceDeclaration bindingURICalculatorDeclaration) { + this.bindingURICalculatorDeclaration = bindingURICalculatorDeclaration; + this.bindingType = contributionType; + } + + public String getBindingType() { + return bindingType; + } + + public String getProtocol(Binding binding) { + return getbindingURICalculator().getProtocol(binding); + } + + private BindingURICalculator getbindingURICalculator() { + if (bindingURICalculator == null) { + try { + Class<BindingURICalculator> bindingURICalculatorClass = (Class<BindingURICalculator>)bindingURICalculatorDeclaration.loadClass(); + Constructor<BindingURICalculator> constructor = bindingURICalculatorClass.getConstructor(); + bindingURICalculator = constructor.newInstance(); + } catch (Exception e) { + throw new IllegalStateException(e); + } + } + return bindingURICalculator; + } + } +} |