blob: a5d4adb1bb7a69b2b723e6de6d5072798d2f680e [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.tuscany.sca.implementation.spring;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;
import org.apache.tuscany.sca.assembly.Component;
import org.apache.tuscany.sca.assembly.ComponentType;
import org.apache.tuscany.sca.assembly.Extensible;
import org.apache.tuscany.sca.assembly.Implementation;
import org.apache.tuscany.sca.assembly.Property;
import org.apache.tuscany.sca.assembly.Reference;
import org.apache.tuscany.sca.assembly.Service;
import org.apache.tuscany.sca.assembly.impl.ImplementationImpl;
import org.apache.tuscany.sca.interfacedef.InterfaceContract;
/**
* Represents a Spring implementation.
*
* @version $Rev$ $Date$
*/
public class SpringImplementation extends ImplementationImpl implements Implementation, Extensible {
public final static QName TYPE = new QName(SCA11_NS, "implementation.spring");
// The location attribute which points to the Spring application-context XML file
private String location;
// The application-context file as a Spring Resource
private List<URL> resource;
private ComponentType componentType;
// Mapping of Services to Beans
private Map<String, SpringBeanElement> serviceMap;
// Mapping of property names to Java class
private Map<String, Class<?>> propertyMap;
// List of unresolved bean property references
private Map<String, Reference> unresolvedBeanRef;
private ClassLoader classLoader;
public SpringImplementation() {
super(TYPE);
this.location = null;
this.resource = null;
setUnresolved(true);
serviceMap = new HashMap<String, SpringBeanElement>();
propertyMap = new HashMap<String, Class<?>>();
unresolvedBeanRef = new HashMap<String, Reference>();
} // end method SpringImplementation
/* Returns the location attribute for this Spring implementation */
public String getLocation() {
return location;
}
/**
* Sets the location attribute for this Spring implementation
* location - a URI to the Spring application-context file
*/
public void setLocation(String location) {
this.location = location;
return;
}
public void setResource(List<URL> resource) {
this.resource = resource;
}
public List<URL> getResource() {
return resource;
}
/*
* Returns the componentType for this Spring implementation
*/
public ComponentType getComponentType() {
return componentType;
}
/*
* Sets the componentType for this Spring implementation
*/
public void setComponentType(ComponentType componentType) {
this.componentType = componentType;
}
@Override
public List<Service> getServices() {
return componentType.getServices();
}
@Override
public List<Reference> getReferences() {
return componentType.getReferences();
}
@Override
public List<Property> getProperties() {
return componentType.getProperties();
}
/**
* Returns the Spring Bean which implements a particular service
* @param service the service
* @return the bean which implements the service, as a SpringBeanElement
*/
public SpringBeanElement getBeanFromService(Service service) {
SpringBeanElement theBean = serviceMap.get(service.getName());
return theBean;
}
/**
* Sets the mapping from a service to the Spring Bean that implements the service
* @param service the service
* @param theBean a SpringBeanElement for the Bean implementing the service
*/
public void setBeanForService(Service service, SpringBeanElement theBean) {
serviceMap.put(service.getName(), theBean);
}
/**
* Add a mapping from a SCA property name to a Java class for the property
* @param propertyName
* @param propertyClass
*/
public void setPropertyClass(String propertyName, Class<?> propertyClass) {
if (propertyName == null || propertyClass == null)
return;
propertyMap.put(propertyName, propertyClass);
return;
} // end method setPropertyClass
/**
* Gets the Java Class for an SCA property
* @param propertyName - the property name
* @return - a Class object for the type of the property
*/
public Class<?> getPropertyClass(String propertyName) {
return propertyMap.get(propertyName);
} // end method getPropertyClass
public void setUnresolvedBeanRef(String refName, Reference reference) {
if (refName == null || reference == null)
return;
unresolvedBeanRef.put(refName, reference);
return;
} // end method setUnresolvedBeanRef
public Reference getUnresolvedBeanRef(String refName) {
return unresolvedBeanRef.get(refName);
} // end method getUnresolvedBeanRef
/**
* Use preProcess to validate and map the references and properties dynamically
*/
public void build(Component component) {
for (Reference reference : component.getReferences()) {
if (unresolvedBeanRef.containsKey(reference.getName())) {
Reference ref = unresolvedBeanRef.get(reference.getName());
componentType.getReferences().add(createReference(reference, ref.getInterfaceContract()));
unresolvedBeanRef.remove(reference.getName());
}
}
for (Property property : component.getProperties()) {
if (unresolvedBeanRef.containsKey(property.getName())) {
componentType.getProperties().add(createProperty(property));
this.setPropertyClass(property.getName(), property.getClass());
unresolvedBeanRef.remove(property.getName());
}
}
}
protected Reference createReference(Reference reference, InterfaceContract interfaze) {
Reference newReference;
try {
newReference = (Reference)reference.clone();
if (newReference.getInterfaceContract() == null)
newReference.setInterfaceContract(interfaze);
} catch (CloneNotSupportedException e) {
throw new AssertionError(e); // should not ever happen
}
return newReference;
}
protected Property createProperty(Property property) {
Property newProperty;
try {
newProperty = (Property)property.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError(e); // should not ever happen
}
return newProperty;
}
public ClassLoader getClassLoader() {
return classLoader;
}
public void setClassLoader(ClassLoader classLoader) {
this.classLoader = classLoader;
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((location == null) ? 0 : location.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!super.equals(obj)) {
return false;
}
if (!(obj instanceof SpringImplementation)) {
return false;
}
SpringImplementation other = (SpringImplementation)obj;
if (location == null) {
if (other.location != null) {
return false;
}
} else if (!location.equals(other.location)) {
return false;
}
return true;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("SpringImplementation [location=").append(location).append(", resource=").append(resource)
.append("]");
return builder.toString();
}
}