diff options
Diffstat (limited to 'sandbox/old/contrib/persistence/datasource/src')
24 files changed, 1531 insertions, 0 deletions
diff --git a/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/AmbiguousPropertyException.java b/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/AmbiguousPropertyException.java new file mode 100644 index 0000000000..40bebc58b6 --- /dev/null +++ b/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/AmbiguousPropertyException.java @@ -0,0 +1,40 @@ +/* + * 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.persistence.datasource; + +import org.apache.tuscany.spi.loader.LoaderException; + +/** + * Raised when a property cannot be unambiguously inferred using JavaBean introspection rules, e.g. when a method is + * overloaded. + * + * @version $Rev$ $Date$ + */ +public class AmbiguousPropertyException extends LoaderException { + public AmbiguousPropertyException() { + } + + public AmbiguousPropertyException(String message) { + super(message); + } + + public AmbiguousPropertyException(String message, String identifier) { + super(message, identifier); + } +} diff --git a/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DSComponentTypeLoader.java b/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DSComponentTypeLoader.java new file mode 100644 index 0000000000..326c526adf --- /dev/null +++ b/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DSComponentTypeLoader.java @@ -0,0 +1,111 @@ +/* + * 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.persistence.datasource; + +import java.lang.reflect.Method; +import java.lang.reflect.Type; +import java.net.URI; +import javax.sql.DataSource; + +import org.osoa.sca.annotations.Reference; + +import org.apache.tuscany.spi.databinding.extension.SimpleTypeMapperExtension; +import org.apache.tuscany.spi.deployer.DeploymentContext; +import org.apache.tuscany.spi.extension.ComponentTypeLoaderExtension; +import org.apache.tuscany.spi.model.TypeInfo; +import org.apache.tuscany.spi.idl.java.JavaServiceContract; +import org.apache.tuscany.spi.implementation.java.JavaMappedProperty; +import org.apache.tuscany.spi.loader.LoaderException; +import org.apache.tuscany.spi.loader.LoaderRegistry; +import org.apache.tuscany.spi.model.ComponentType; +import org.apache.tuscany.spi.model.Property; +import org.apache.tuscany.spi.model.ReferenceDefinition; +import org.apache.tuscany.spi.model.Scope; +import org.apache.tuscany.spi.model.ServiceDefinition; + +/** + * Loads the component type for a DataSource component. Component type information is currently static, although this + * could be changed in the future to allow for configuration parameter checking for specific providers. + * + * @version $Rev$ $Date$ + */ +public class DSComponentTypeLoader extends ComponentTypeLoaderExtension<DataSourceImplementation> { + private SimpleTypeMapperExtension extension = new SimpleTypeMapperExtension(); + + public DSComponentTypeLoader(@Reference LoaderRegistry loaderRegistry) { + super(loaderRegistry); + } + + protected Class<DataSourceImplementation> getImplementationClass() { + return DataSourceImplementation.class; + } + + public void load(DataSourceImplementation implementation, DeploymentContext ctx) + throws LoaderException { + ComponentType<ServiceDefinition, ReferenceDefinition, Property<?>> componentType = + new ComponentType<ServiceDefinition, ReferenceDefinition, Property<?>>(); + componentType.setImplementationScope(Scope.COMPOSITE); + JavaServiceContract serviceContract = new JavaServiceContract(DataSource.class); + ServiceDefinition service = new ServiceDefinition(URI.create("#DataSource"), serviceContract, false); + componentType.add(service); + componentType.setInitLevel(1); + Class<?> provider; + try { + provider = implementation.getClassLoader().loadClass(implementation.getProviderName()); + } catch (ClassNotFoundException e) { + throw new LoaderException(e); + } + introspectProperties(componentType, provider); + implementation.setComponentType(componentType); + } + + /** + * Creates properties by introspecting the provider class an d including all JavaBean setters that take a simple + * type parameter + * + * @param componentType + * @param provider + * @throws AmbiguousPropertyException + */ + @SuppressWarnings("unchecked") + private void introspectProperties(ComponentType<ServiceDefinition, ReferenceDefinition, Property<?>> componentType, + Class<?> provider) throws AmbiguousPropertyException { + + Method[] methods = provider.getMethods(); + for (Method method : methods) { + String name = method.getName(); + if (method.getParameterTypes().length == 1 && name.startsWith("set")) { + String propName = Character.toLowerCase(name.charAt(3)) + name.substring(4); + Class<Type> type = (Class<Type>) method.getParameterTypes()[0]; + TypeInfo info = extension.getXMLType(type); + if (info != null) { + // only include methods as properties that take simple type parameters + if (componentType.getProperties().containsKey(propName)) { + throw new AmbiguousPropertyException(propName); + } + JavaMappedProperty<Type> property = + new JavaMappedProperty<Type>(propName, info.getQName(), type); + property.setMember(method); + componentType.add(property); + } + } + } + } + +} diff --git a/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DataSourceBuilder.java b/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DataSourceBuilder.java new file mode 100644 index 0000000000..50f87d07f5 --- /dev/null +++ b/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DataSourceBuilder.java @@ -0,0 +1,74 @@ +/* + * 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.persistence.datasource; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + +import org.apache.tuscany.spi.ObjectFactory; +import org.apache.tuscany.spi.builder.BuilderConfigException; +import org.apache.tuscany.spi.component.Component; +import org.apache.tuscany.spi.deployer.DeploymentContext; +import org.apache.tuscany.spi.extension.ComponentBuilderExtension; +import org.apache.tuscany.spi.implementation.java.JavaMappedProperty; +import org.apache.tuscany.spi.model.ComponentDefinition; +import org.apache.tuscany.spi.model.ComponentType; +import org.apache.tuscany.spi.model.PropertyValue; + +/** + * Builds a {@link DataSourceComponent} from its model representation + * + * @version $Rev$ $Date$ + */ +public class DataSourceBuilder extends ComponentBuilderExtension<DataSourceImplementation> { + protected Class<DataSourceImplementation> getImplementationType() { + return DataSourceImplementation.class; + } + + public Component build(ComponentDefinition<DataSourceImplementation> definition, + DeploymentContext deploymentContext) throws BuilderConfigException { + try { + DataSourceImplementation implementation = definition.getImplementation(); + ClassLoader classLoader = implementation.getClassLoader(); + Class<?> beanClass = classLoader.loadClass(implementation.getProviderName()); + List<Injector> injectors = new ArrayList<Injector>(); + // handle properties + ComponentType type = definition.getImplementation().getComponentType(); + for (PropertyValue<?> property : definition.getPropertyValues().values()) { + ObjectFactory<?> factory = property.getValueFactory(); + if (factory != null) { + String name = property.getName(); + JavaMappedProperty mappedProperty = (JavaMappedProperty) type.getProperties().get(name); + if (mappedProperty == null) { + throw new MissingPropertyException(name); + } + Injector injector = new Injector((Method) mappedProperty.getMember(), factory); + injectors.add(injector); + } + } + ProviderObjectFactory providerFactory = new ProviderObjectFactory(beanClass, injectors); + int initLevel = implementation.getComponentType().getInitLevel(); + return new DataSourceComponent(definition.getUri(), providerFactory, initLevel); + } catch (ClassNotFoundException e) { + throw new BuilderConfigException(e); + } + } + +} diff --git a/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DataSourceCloseException.java b/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DataSourceCloseException.java new file mode 100644 index 0000000000..3398c47913 --- /dev/null +++ b/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DataSourceCloseException.java @@ -0,0 +1,31 @@ +/* + * 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.persistence.datasource; + +import org.apache.tuscany.spi.component.TargetDestructionException; + +/** + * @version $Rev$ $Date$ + */ +public class DataSourceCloseException extends TargetDestructionException { + + public DataSourceCloseException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DataSourceComponent.java b/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DataSourceComponent.java new file mode 100644 index 0000000000..c73fce31ef --- /dev/null +++ b/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DataSourceComponent.java @@ -0,0 +1,111 @@ +/* + * 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.persistence.datasource; + +import java.net.URI; +import java.util.List; + +import org.apache.tuscany.spi.ObjectCreationException; +import org.apache.tuscany.spi.component.InstanceWrapper; +import org.apache.tuscany.spi.component.TargetDestructionException; +import org.apache.tuscany.spi.component.TargetInvokerCreationException; +import org.apache.tuscany.spi.component.TargetResolutionException; +import org.apache.tuscany.spi.extension.AtomicComponentExtension; +import org.apache.tuscany.spi.model.Operation; +import org.apache.tuscany.spi.model.physical.PhysicalOperationDefinition; +import org.apache.tuscany.spi.wire.TargetInvoker; +import org.apache.tuscany.spi.wire.Wire; + +/** + * A system component that creates <code>DataSource</code> instances. The component uses a {@link ProviderObjectFactory} + * to instantiate the actual <code>DataSource</code> + * + * @version $Rev$ $Date$ + */ +public class DataSourceComponent extends AtomicComponentExtension { + private ProviderObjectFactory instanceFactory; + + /** + * Creates a <code>DataSourceComponent</code> + * + * @param uri the uri of the component + * @param instanceFactory the provider factory + * @param initLevel the initialization level + */ + public DataSourceComponent(URI uri, + ProviderObjectFactory instanceFactory, + int initLevel) { + + super(uri, null, null, initLevel, -1, -1); + this.instanceFactory = instanceFactory; + } + + public InstanceWrapper<?> createInstanceWrapper() throws ObjectCreationException { + return null; + } + + public Object createInstance() throws ObjectCreationException { + return instanceFactory.getInstance(); + } + + public Object getTargetInstance() throws TargetResolutionException { + return null; + } + + + public Object getAssociatedTargetInstance() throws TargetResolutionException { + return null; + } + + public void destroy(Object instance) throws TargetDestructionException { + if (instance instanceof DataSourceProvider) { + try { + ((DataSourceProvider) instance).close(); + } catch (ProviderException e) { + throw new DataSourceCloseException("Error closing data source provider", e); + } + } + } + + public List<Wire> getWires(String name) { + return null; + } + + public void attachCallbackWire(Wire wire) { + + } + + public void attachWire(Wire wire) { + + } + + public void attachWires(List<Wire> wires) { + + } + + public TargetInvoker createTargetInvoker(String targetName, Operation operation) + throws TargetInvokerCreationException { + return null; + } + + public TargetInvoker createTargetInvoker(String targetName, PhysicalOperationDefinition operation) + throws TargetInvokerCreationException { + return null; + } +} diff --git a/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DataSourceImplementation.java b/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DataSourceImplementation.java new file mode 100644 index 0000000000..d0e3413ca8 --- /dev/null +++ b/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DataSourceImplementation.java @@ -0,0 +1,60 @@ +/* + * 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.persistence.datasource; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.tuscany.spi.model.ComponentType; +import org.apache.tuscany.spi.model.Implementation; + +/** + * Represents a DataSource component implementation + * + * @version $Rev$ $Date$ + */ +public class DataSourceImplementation extends Implementation<ComponentType> { + private String providerName; + private ClassLoader classLoader; + private Map<String, String> configurationParams = new HashMap<String, String>(); + + public String getProviderName() { + return providerName; + } + + public void setProviderName(String providerName) { + this.providerName = providerName; + } + + public ClassLoader getClassLoader() { + return classLoader; + } + + public void setClassLoader(ClassLoader classLoader) { + this.classLoader = classLoader; + } + + public Map<String, String> getConfigurationParams() { + return configurationParams; + } + + public void addConfigurationParam(String name, String val) { + this.configurationParams.put(name, val); + } +} diff --git a/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DataSourceImplementationLoader.java b/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DataSourceImplementationLoader.java new file mode 100644 index 0000000000..4401b0f087 --- /dev/null +++ b/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DataSourceImplementationLoader.java @@ -0,0 +1,86 @@ +/* + * 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.persistence.datasource; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.osoa.sca.annotations.Reference; + +import org.apache.tuscany.spi.deployer.DeploymentContext; +import org.apache.tuscany.spi.extension.LoaderExtension; +import org.apache.tuscany.spi.loader.LoaderException; +import org.apache.tuscany.spi.loader.LoaderRegistry; +import org.apache.tuscany.spi.loader.LoaderUtil; +import org.apache.tuscany.spi.model.ModelObject; + +/** + * Loads a DataSource component type from an assembly. This component implementation type provides a + * <code>DataSource</code> system service in the runtime. The actual DataSource provider is pluggable, for example, + * Commons DBCP could be used. DataSource components are configured as follows: + * <pre> + * <p/> + * <component name="MyDataSource"> + * <system:implementation.ds provider="org.foo.FooProvider"/> + * <property name="driverClassName">com.mysql.jdbc.Driver</property> + * <property name="url">jdbc:mysql://localhost:3306/mydb</property> + * <property name="login">foo</property> + * <property name="password">bar</property> + * </component> + * <p/> + * </pre> + * In the above example, <code>org.foo.FooProvider</code> is responsible for bootstrapping the actual DataSource + * implementation. It may implement <code>javax.sql.DataSource</code> directly or the {@link DataSourceProvider} + * interface and must have a public no-args constructor. Configuration parameters are simple types specified as + * properties. Configuration parameters, i.e. properties, will vary are introspected from the provider class. A + * component type containing thse properties is dynamically generated and consists of all JavaBean setter methods that + * take a single simple type parameter. + * + * @version $Rev$ $Date$ + */ +public class DataSourceImplementationLoader extends LoaderExtension { + private static final QName DATASOURCE = + new QName("http://tuscany.apache.org/xmlns/system/1.0-SNAPSHOT", "implementation.ds"); + private static final String PROVIDER = "provider"; + + public DataSourceImplementationLoader(@Reference LoaderRegistry registry) { + super(registry); + } + + public QName getXMLType() { + return DATASOURCE; + } + + public ModelObject load( + ModelObject object, + XMLStreamReader reader, + DeploymentContext deploymentContext) throws XMLStreamException, LoaderException { + String driverName = reader.getAttributeValue(null, PROVIDER); + if (driverName == null) { + throw new LoaderException("No provider specified for DataSource"); + } + + DataSourceImplementation implementation = new DataSourceImplementation(); + implementation.setProviderName(driverName); + implementation.setClassLoader(deploymentContext.getClassLoader()); + LoaderUtil.skipToEndElement(reader); + return implementation; + } +} diff --git a/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DataSourceProvider.java b/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DataSourceProvider.java new file mode 100644 index 0000000000..d29089be6d --- /dev/null +++ b/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DataSourceProvider.java @@ -0,0 +1,52 @@ +/* + * 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.persistence.datasource; + +import javax.sql.DataSource; + +/** + * DataSource providers may optionally implement this interface to receive callback notifications + * + * @version $Rev$ $Date$ + */ +public interface DataSourceProvider { + + /** + * Signals to the provider to initialize after all parameters have been set + * + * @throws ProviderException if an exception occurs during initialization + */ + void init() throws ProviderException; + + /** + * Signals to the provider to close any open resources and prepare for shutdown + * + * @throws ProviderException if an exception occurs during shutdown + */ + void close() throws ProviderException; + + /** + * Returns a new <code>DataSource</code> instance that will be bound into a composite system service tree. Called + * after initialize. + * + * @throws ProviderException if an error occurs creating a new instance + */ + DataSource getDataSource() throws ProviderException; + +} diff --git a/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/Injector.java b/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/Injector.java new file mode 100644 index 0000000000..82903afe93 --- /dev/null +++ b/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/Injector.java @@ -0,0 +1,45 @@ +/* + * 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.persistence.datasource; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import org.apache.tuscany.spi.ObjectFactory; + +/** + * Injects a value on a method + * + * @version $Rev$ $Date$ + */ +public class Injector { + private final Method method; + private final ObjectFactory<?> objectFactory; + + public Injector(Method method, ObjectFactory<?> objectFactory) { + this.method = method; + this.method.setAccessible(true); + this.objectFactory = objectFactory; + } + + public void inject(Object instance) throws IllegalAccessException, InvocationTargetException { + method.invoke(instance, objectFactory.getInstance()); + } + +} diff --git a/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/MissingPropertyException.java b/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/MissingPropertyException.java new file mode 100644 index 0000000000..ac5a8a0b55 --- /dev/null +++ b/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/MissingPropertyException.java @@ -0,0 +1,44 @@ +/* + * 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.persistence.datasource; + +import org.apache.tuscany.spi.builder.BuilderConfigException; + +/** + * Raised when a property value is specified in an assembly configuration and no corresponding property was found in the + * component type + * + * @version $Rev$ $Date$ + */ +public class MissingPropertyException extends BuilderConfigException { + public MissingPropertyException() { + } + + public MissingPropertyException(String message) { + super(message); + } + + public MissingPropertyException(String message, Throwable cause) { + super(message, cause); + } + + public MissingPropertyException(Throwable cause) { + super(cause); + } +} diff --git a/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/ProviderException.java b/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/ProviderException.java new file mode 100644 index 0000000000..8ffc24eaab --- /dev/null +++ b/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/ProviderException.java @@ -0,0 +1,33 @@ +/* + * 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.persistence.datasource; + +import org.apache.tuscany.api.TuscanyException; + +/** + * Denotes an error during a provider callback + * + * @version $Rev$ $Date$ + */ +public class ProviderException extends TuscanyException { + + public ProviderException(String message, String identifier) { + super(message, identifier); + } +} diff --git a/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/ProviderObjectFactory.java b/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/ProviderObjectFactory.java new file mode 100644 index 0000000000..9422a96cdd --- /dev/null +++ b/sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/ProviderObjectFactory.java @@ -0,0 +1,73 @@ +/* + * 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.persistence.datasource; + +import java.lang.reflect.InvocationTargetException; +import java.util.List; +import javax.sql.DataSource; + +import org.apache.tuscany.spi.ObjectCreationException; +import org.apache.tuscany.spi.ObjectFactory; + +/** + * Responsible for instantiating a DataSource provider class and initializing the actual <code>DataSource</code> . It + * must have a no-args constructor and may optionally implement {@link DataSourceProvider}. If it does not implement + * <code>DataSourceProvider</code>, then the provider class must implement the <code>DataSource<code> interface. A + * collection of {@link Injector}s is used to inject the provider instance with configuration parameters. + * + * @version $Rev$ $Date$ + */ +public class ProviderObjectFactory implements ObjectFactory<DataSource> { + private Class<?> providerClass; + private List<Injector> injectors; + + public ProviderObjectFactory(Class<?> providerClass, List<Injector> injectors) { + assert providerClass != null; + assert injectors != null; + this.providerClass = providerClass; + this.injectors = injectors; + } + + public DataSource getInstance() throws ObjectCreationException { + try { + Object instance = providerClass.newInstance(); + for (Injector injector : injectors) { + injector.inject(instance); + } + if (instance instanceof DataSourceProvider) { + DataSourceProvider dataSourceProvider = (DataSourceProvider) instance; + try { + dataSourceProvider.init(); + return dataSourceProvider.getDataSource(); + } catch (ProviderException e) { + throw new ObjectCreationException(e); + } + } else { + return (DataSource) instance; + } + } catch (InstantiationException e) { + throw new ObjectCreationException(e); + } catch (IllegalAccessException e) { + throw new ObjectCreationException(e); + } catch (InvocationTargetException e) { + throw new ObjectCreationException(e); + } + } + +} diff --git a/sandbox/old/contrib/persistence/datasource/src/main/resources/META-INF/sca/dataSource.scdl b/sandbox/old/contrib/persistence/datasource/src/main/resources/META-INF/sca/dataSource.scdl new file mode 100644 index 0000000000..df0375b2dc --- /dev/null +++ b/sandbox/old/contrib/persistence/datasource/src/main/resources/META-INF/sca/dataSource.scdl @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * 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. +--> +<!-- + Configuration for DataSource support. + + $Rev: 440909 $ $Date: 2006-09-06 17:07:19 -0700 (Wed, 06 Sep 2006) $ +--> +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + xmlns:system="http://tuscany.apache.org/xmlns/system/1.0-SNAPSHOT" + name="org.apache.tuscany.persistence.datasource" + autowire="true"> + + <component name="datasource.dataSourceBuilder"> + <system:implementation.system class="org.apache.tuscany.persistence.datasource.DataSourceBuilder"/> + </component> + <component name="datasource.dsComponentTypeLoader"> + <system:implementation.system class="org.apache.tuscany.persistence.datasource.DSComponentTypeLoader"/> + </component> + <component name="datasource.datasourceLoader"> + <system:implementation.system class="org.apache.tuscany.persistence.datasource.DataSourceImplementationLoader"/> + </component> +</composite> diff --git a/sandbox/old/contrib/persistence/datasource/src/test/java/org/apache/tuscany/persistence/datasource/DSComponentTypeLoaderTestCase.java b/sandbox/old/contrib/persistence/datasource/src/test/java/org/apache/tuscany/persistence/datasource/DSComponentTypeLoaderTestCase.java new file mode 100644 index 0000000000..87c12db9bf --- /dev/null +++ b/sandbox/old/contrib/persistence/datasource/src/test/java/org/apache/tuscany/persistence/datasource/DSComponentTypeLoaderTestCase.java @@ -0,0 +1,88 @@ +package org.apache.tuscany.persistence.datasource; + +import javax.sql.DataSource; + +import org.apache.tuscany.spi.implementation.java.JavaMappedProperty; +import org.apache.tuscany.spi.model.ComponentType; + +import junit.framework.TestCase; + +/** + * @version $Rev$ $Date$ + */ +public class DSComponentTypeLoaderTestCase extends TestCase { + + public void testIntrospection() throws Exception { + DSComponentTypeLoader loader = new DSComponentTypeLoader(null); + DataSourceImplementation implementation = new DataSourceImplementation(); + implementation.setProviderName(Foo.class.getName()); + implementation.setClassLoader(getClass().getClassLoader()); + loader.load(implementation, null); + ComponentType<?, ?, ?> type = implementation.getComponentType(); + assertEquals(2, type.getProperties().size()); + assertNull(type.getProperties().get("object")); + Object bar = type.getProperties().get("bar"); + assertEquals(String.class, ((JavaMappedProperty) bar).getJavaType()); + Object baz = type.getProperties().get("baz"); + assertEquals(Integer.TYPE, ((JavaMappedProperty) baz).getJavaType()); + assertEquals(1, type.getServices().size()); + assertEquals(DataSource.class, type.getServices().get("DataSource").getServiceContract().getInterfaceClass()); + } + + + public void testOverloadedMethod() throws Exception { + DSComponentTypeLoader loader = new DSComponentTypeLoader(null); + DataSourceImplementation implementation = new DataSourceImplementation(); + implementation.setProviderName(BadFoo.class.getName()); + implementation.setClassLoader(getClass().getClassLoader()); + try { + loader.load(implementation, null); + fail(); + } catch (AmbiguousPropertyException e) { + // expected + } + } + + public class Foo { + + private String bar; + + private int baz; + + private Foo object; + + public String getBar() { + return bar; + } + + public void setBar(String bar) { + this.bar = bar; + } + + public int getBaz() { + return baz; + } + + public void setBaz(int baz) { + this.baz = baz; + } + + public Foo getObject() { + return object; + } + + public void setObject(Foo object) { + this.object = object; + } + } + + public class BadFoo { + + public void setBar(String bar) { + } + + public void setBar(Object bar) { + } + } + +} diff --git a/sandbox/old/contrib/persistence/datasource/src/test/java/org/apache/tuscany/persistence/datasource/DataSourceBuilderTestCase.java b/sandbox/old/contrib/persistence/datasource/src/test/java/org/apache/tuscany/persistence/datasource/DataSourceBuilderTestCase.java new file mode 100644 index 0000000000..c7daaa6e4d --- /dev/null +++ b/sandbox/old/contrib/persistence/datasource/src/test/java/org/apache/tuscany/persistence/datasource/DataSourceBuilderTestCase.java @@ -0,0 +1,91 @@ +/* + * 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.persistence.datasource; + +import java.net.URI; +import javax.sql.DataSource; + +import org.apache.tuscany.spi.component.ScopeContainer; +import org.apache.tuscany.spi.deployer.DeploymentContext; +import org.apache.tuscany.spi.idl.java.JavaServiceContract; +import org.apache.tuscany.spi.model.ComponentDefinition; +import org.apache.tuscany.spi.model.ComponentType; +import org.apache.tuscany.spi.model.Property; +import org.apache.tuscany.spi.model.ReferenceDefinition; +import org.apache.tuscany.spi.model.ServiceDefinition; + +import junit.framework.TestCase; +import org.easymock.EasyMock; + +/** + * @version $Rev$ $Date$ + */ +public class DataSourceBuilderTestCase extends TestCase { + + public void testBuild() throws Exception { + ScopeContainer scope = EasyMock.createMock(ScopeContainer.class); + EasyMock.replay(scope); + DeploymentContext ctx = EasyMock.createMock(DeploymentContext.class); + EasyMock.replay(ctx); + + DataSourceImplementation implementation = new DataSourceImplementation(); + ComponentType<ServiceDefinition, ReferenceDefinition, Property<?>> componentType = + new ComponentType<ServiceDefinition, ReferenceDefinition, Property<?>>(); + JavaServiceContract serviceContract = new JavaServiceContract(DataSource.class); + ServiceDefinition service = new ServiceDefinition(URI.create("DataSource"), serviceContract, false); + componentType.add(service); + componentType.setInitLevel(1); + implementation.setComponentType(componentType); + implementation.setProviderName(MockProvider.class.getName()); + implementation.setClassLoader(getClass().getClassLoader()); + + ComponentDefinition<DataSourceImplementation> def = + new ComponentDefinition<DataSourceImplementation>(URI.create("MyDS"), implementation); + + DataSourceBuilder builder = new DataSourceBuilder(); + + DataSourceComponent component = (DataSourceComponent) builder.build(def, ctx); + assertEquals(URI.create("MyDS"), component.getUri()); + + DataSource ds = (DataSource) component.createInstance(); + assertNotNull(ds); + EasyMock.verify(ctx); + EasyMock.verify(scope); + } + + private static class MockProvider implements DataSourceProvider { + + public MockProvider() { + } + + public void init() throws ProviderException { + + } + + public void close() throws ProviderException { + + } + + public DataSource getDataSource() throws ProviderException { + return EasyMock.createNiceMock(DataSource.class); + } + } + + +} diff --git a/sandbox/old/contrib/persistence/datasource/src/test/java/org/apache/tuscany/persistence/datasource/DataSourceComponentTestCase.java b/sandbox/old/contrib/persistence/datasource/src/test/java/org/apache/tuscany/persistence/datasource/DataSourceComponentTestCase.java new file mode 100644 index 0000000000..e95c1c4123 --- /dev/null +++ b/sandbox/old/contrib/persistence/datasource/src/test/java/org/apache/tuscany/persistence/datasource/DataSourceComponentTestCase.java @@ -0,0 +1,41 @@ +/* + * 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.persistence.datasource; + +import java.net.URI; + +import junit.framework.TestCase; +import org.easymock.EasyMock; + +/** + * @version $Rev$ $Date$ + */ +public class DataSourceComponentTestCase extends TestCase { + + public void testDestroy() throws Exception { + DataSourceProvider provider = EasyMock.createMock(DataSourceProvider.class); + provider.close(); + EasyMock.replay(provider); + DataSourceComponent component = new DataSourceComponent(URI.create("ds"), null, 0); + component.destroy(provider); + EasyMock.verify(provider); + } + + +} diff --git a/sandbox/old/contrib/persistence/datasource/src/test/java/org/apache/tuscany/persistence/datasource/DataSourceImplementationLoaderTestCase.java b/sandbox/old/contrib/persistence/datasource/src/test/java/org/apache/tuscany/persistence/datasource/DataSourceImplementationLoaderTestCase.java new file mode 100644 index 0000000000..49c83bacc7 --- /dev/null +++ b/sandbox/old/contrib/persistence/datasource/src/test/java/org/apache/tuscany/persistence/datasource/DataSourceImplementationLoaderTestCase.java @@ -0,0 +1,70 @@ +/* + * 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.persistence.datasource; + +import static javax.xml.stream.XMLStreamConstants.END_ELEMENT; +import javax.xml.stream.XMLStreamReader; + +import org.apache.tuscany.spi.deployer.DeploymentContext; +import org.apache.tuscany.spi.loader.LoaderException; +import org.apache.tuscany.spi.loader.LoaderRegistry; + +import junit.framework.TestCase; +import org.easymock.EasyMock; + +/** + * @version $Rev$ $Date$ + */ +public class DataSourceImplementationLoaderTestCase extends TestCase { + + public void testLoadingNoParameters() throws Exception { + LoaderRegistry registry = EasyMock.createNiceMock(LoaderRegistry.class); + EasyMock.replay(registry); + DataSourceImplementationLoader loader = new DataSourceImplementationLoader(registry); + XMLStreamReader reader = EasyMock.createMock(XMLStreamReader.class); + EasyMock.expect(reader.getAttributeValue(null, "provider")).andReturn("org.foo.MyDriver"); + EasyMock.expect(reader.next()).andReturn(END_ELEMENT); + EasyMock.replay(reader); + DeploymentContext ctx = EasyMock.createMock(DeploymentContext.class); + EasyMock.expect(ctx.getClassLoader()).andReturn(getClass().getClassLoader()); + EasyMock.replay(ctx); + DataSourceImplementation implementation = (DataSourceImplementation) loader.load(null, reader, ctx); + assertEquals("org.foo.MyDriver", implementation.getProviderName()); + assertEquals(getClass().getClassLoader(), implementation.getClassLoader()); + EasyMock.verify(reader); + EasyMock.verify(ctx); + } + + public void testNoDriverName() throws Exception { + LoaderRegistry registry = EasyMock.createNiceMock(LoaderRegistry.class); + EasyMock.replay(registry); + DataSourceImplementationLoader loader = new DataSourceImplementationLoader(registry); + XMLStreamReader reader = EasyMock.createMock(XMLStreamReader.class); + EasyMock.expect(reader.getAttributeValue(null, "provider")).andReturn(null); + EasyMock.replay(reader); + try { + loader.load(null, reader, null); + fail(); + } catch (LoaderException e) { + // expected + } + EasyMock.verify(reader); + } + +} diff --git a/sandbox/old/contrib/persistence/datasource/src/test/java/org/apache/tuscany/persistence/datasource/InjectorTestCase.java b/sandbox/old/contrib/persistence/datasource/src/test/java/org/apache/tuscany/persistence/datasource/InjectorTestCase.java new file mode 100644 index 0000000000..8d5a6f06a4 --- /dev/null +++ b/sandbox/old/contrib/persistence/datasource/src/test/java/org/apache/tuscany/persistence/datasource/InjectorTestCase.java @@ -0,0 +1,53 @@ +/* + * 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.persistence.datasource; + +import java.lang.reflect.Method; + +import org.apache.tuscany.spi.ObjectFactory; + +import junit.framework.TestCase; +import org.easymock.EasyMock; + +/** + * @version $Rev$ $Date$ + */ +public class InjectorTestCase extends TestCase { + + @SuppressWarnings("unchecked") + public void testInject() throws Exception { + Method m = Foo.class.getMethod("setVal", String.class); + ObjectFactory factory = EasyMock.createMock(ObjectFactory.class); + EasyMock.expect(factory.getInstance()).andReturn("foo"); + EasyMock.replay(factory); + Injector injector = new Injector(m, factory); + Foo foo = new Foo(); + injector.inject(foo); + assertEquals("foo", foo.val); + EasyMock.verify(factory); + } + + private class Foo { + private String val; + + public void setVal(String val) { + this.val = val; + } + } +} diff --git a/sandbox/old/contrib/persistence/datasource/src/test/java/org/apache/tuscany/persistence/datasource/ProviderObjectFactoryTestCase.java b/sandbox/old/contrib/persistence/datasource/src/test/java/org/apache/tuscany/persistence/datasource/ProviderObjectFactoryTestCase.java new file mode 100644 index 0000000000..d335dcc4d1 --- /dev/null +++ b/sandbox/old/contrib/persistence/datasource/src/test/java/org/apache/tuscany/persistence/datasource/ProviderObjectFactoryTestCase.java @@ -0,0 +1,150 @@ +/* + * 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.persistence.datasource; + +import java.io.PrintWriter; +import java.lang.reflect.Method; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import javax.sql.DataSource; + +import org.apache.tuscany.spi.ObjectCreationException; +import org.apache.tuscany.spi.ObjectFactory; + +import junit.framework.TestCase; +import org.easymock.EasyMock; + +/** + * @version $Rev$ $Date$ + */ +public class ProviderObjectFactoryTestCase extends TestCase { + + public void testInstantiation() throws Exception { + List<Injector> injectors = new ArrayList<Injector>(); + Method m = Provider.class.getMethod("setVal", Integer.TYPE); + injectors.add(new Injector(m, new MockFactory(1))); + ProviderObjectFactory factory = new ProviderObjectFactory(Provider.class, injectors); + DataSource ds = factory.getInstance(); + Provider provider = (Provider) ds; + assertEquals(1, provider.getVal()); + } + + public void testInitInstantiation() throws Exception { + List<Injector> injectors = new ArrayList<Injector>(); + Method m = DSProvider.class.getMethod("setVal", Integer.TYPE); + injectors.add(new Injector(m, new MockFactory(1))); + ProviderObjectFactory factory = new ProviderObjectFactory(DSProvider.class, injectors); + assertNotNull(factory.getInstance()); + + } + + public static class Provider implements DataSource { + private int val; + + public Provider() { + } + + public int getVal() { + return val; + } + + public void setVal(int val) { + this.val = val; + } + + public Connection getConnection() throws SQLException { + return null; + } + + public Connection getConnection(String username, String password) throws SQLException { + return null; + } + + public PrintWriter getLogWriter() throws SQLException { + return null; + } + + public void setLogWriter(PrintWriter out) throws SQLException { + + } + + public void setLoginTimeout(int seconds) throws SQLException { + + } + + public int getLoginTimeout() throws SQLException { + return 0; + } + } + + public static class DSProvider implements DataSourceProvider { + private int val; + private boolean initialized; + + public DSProvider() { + } + + public int getVal() { + return val; + } + + public void setVal(int val) { + this.val = val; + } + + public boolean isInitialized() { + return initialized; + } + + public void init() { + if (val != 1) { + fail(); + } + initialized = true; + } + + + public void close() { + + } + + public DataSource getDataSource() throws ProviderException { + if (!initialized) { + fail(); + } + return EasyMock.createNiceMock(DataSource.class); + } + } + + private class MockFactory implements ObjectFactory<Integer> { + private Integer instance; + + public MockFactory(Integer instance) { + this.instance = instance; + } + + public Integer getInstance() throws ObjectCreationException { + return instance; + } + } + + +} diff --git a/sandbox/old/contrib/persistence/datasource/src/test/java/org/apache/tuscany/persistence/datasource/integration/DHCPBootstrapTestCase.java b/sandbox/old/contrib/persistence/datasource/src/test/java/org/apache/tuscany/persistence/datasource/integration/DHCPBootstrapTestCase.java new file mode 100644 index 0000000000..a94ab25f3b --- /dev/null +++ b/sandbox/old/contrib/persistence/datasource/src/test/java/org/apache/tuscany/persistence/datasource/integration/DHCPBootstrapTestCase.java @@ -0,0 +1,50 @@ +/* + * 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.persistence.datasource.integration; + +import java.net.URL; +import java.sql.Connection; +import javax.sql.DataSource; + +import org.apache.tuscany.spi.component.AtomicComponent; + +import junit.framework.TestCase; + +/** + * Verifies bootstrapping of a datasource implementation using Commons DBCP and HSQLDB + * + * @version $Rev$ $Date$ + */ +public class DHCPBootstrapTestCase extends TestCase { + + public void testBasicConnection() throws Exception { +// DataSource ds = (DataSource) ((AtomicComponent) component.getSystemChild("TestDS")).getTargetInstance(); +// assertNotNull(ds); +// Connection conn = ds.getConnection(); +// conn.createStatement().execute("CREATE TABLE foo (bar char(20));"); + } + + protected void setUp() throws Exception { +// URL url = getClass().getResource("/META-INF/sca/dataSource.scdl"); +// addExtension("DataSourceExtension", url); +// setApplicationSCDL(getClass().getResource("/META-INF/sca/dbcp.scdl")); +// super.setUp(); + } + +} diff --git a/sandbox/old/contrib/persistence/datasource/src/test/java/org/apache/tuscany/persistence/datasource/integration/ProviderBootstrapTestCase.java b/sandbox/old/contrib/persistence/datasource/src/test/java/org/apache/tuscany/persistence/datasource/integration/ProviderBootstrapTestCase.java new file mode 100644 index 0000000000..23dab05e65 --- /dev/null +++ b/sandbox/old/contrib/persistence/datasource/src/test/java/org/apache/tuscany/persistence/datasource/integration/ProviderBootstrapTestCase.java @@ -0,0 +1,50 @@ +/* + * 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.persistence.datasource.integration; + +import java.net.URL; +import javax.sql.DataSource; + +import org.apache.tuscany.spi.component.AtomicComponent; + +import org.apache.tuscany.persistence.datasource.integration.mock.Provider; +import junit.framework.TestCase; + +/** + * Verifies bootstrapping of a datasource implementation as a system service in an application composite using a mock + * Provider + * + * @version $Rev$ $Date$ + */ +public class ProviderBootstrapTestCase extends TestCase { + + public void testBoot() throws Exception { +// DataSource ds = (DataSource) ((AtomicComponent)component.getSystemChild("TestDS")).getTargetInstance(); +// assertNotNull(ds); +// assertEquals("value", ((Provider) ds).getTest()); + } + + protected void setUp() throws Exception { +// URL url = getClass().getResource("/META-INF/sca/dataSource.scdl"); +// addExtension("DataSourceExtension", url); +// setApplicationSCDL(getClass().getResource("/META-INF/sca/provider.scdl")); + super.setUp(); + } + +} diff --git a/sandbox/old/contrib/persistence/datasource/src/test/java/org/apache/tuscany/persistence/datasource/integration/mock/Provider.java b/sandbox/old/contrib/persistence/datasource/src/test/java/org/apache/tuscany/persistence/datasource/integration/mock/Provider.java new file mode 100644 index 0000000000..558b73e700 --- /dev/null +++ b/sandbox/old/contrib/persistence/datasource/src/test/java/org/apache/tuscany/persistence/datasource/integration/mock/Provider.java @@ -0,0 +1,79 @@ +/* + * 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.persistence.datasource.integration.mock; + +import java.sql.Connection; +import java.sql.SQLException; +import java.io.PrintWriter; +import javax.sql.DataSource; + +import org.apache.tuscany.persistence.datasource.DataSourceProvider; +import org.apache.tuscany.persistence.datasource.ProviderException; + +/** + * @version $Rev$ $Date$ + */ +public class Provider implements DataSourceProvider, DataSource { + + private String test; + + public void setTest(String test) { + this.test = test; + } + + public String getTest() { + return test; + } + + public void init() throws ProviderException { + + } + + public void close() throws ProviderException { + + } + + public DataSource getDataSource() throws ProviderException { + return this; + } + + public Connection getConnection() throws SQLException { + return null; + } + + public Connection getConnection(String username, String password) throws SQLException { + return null; + } + + public PrintWriter getLogWriter() throws SQLException { + return null; + } + + public void setLogWriter(PrintWriter out) throws SQLException { + + } + + public void setLoginTimeout(int seconds) throws SQLException { + + } + + public int getLoginTimeout() throws SQLException { + return 0; + } +} diff --git a/sandbox/old/contrib/persistence/datasource/src/test/resources/META-INF/sca/dbcp.scdl b/sandbox/old/contrib/persistence/datasource/src/test/resources/META-INF/sca/dbcp.scdl new file mode 100644 index 0000000000..6cdc7102fa --- /dev/null +++ b/sandbox/old/contrib/persistence/datasource/src/test/resources/META-INF/sca/dbcp.scdl @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * 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. +--> +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + xmlns:system="http://tuscany.apache.org/xmlns/system/1.0-SNAPSHOT" + name="bootTest"> + + <component name="TestDS"> + <system:implementation.ds provider="org.apache.commons.dbcp.BasicDataSource"/> + <property name="driverClassName">org.hsqldb.jdbcDriver</property> + <property name="url">jdbc:hsqldb:mem:testdb</property> + </component> + +</composite> diff --git a/sandbox/old/contrib/persistence/datasource/src/test/resources/META-INF/sca/provider.scdl b/sandbox/old/contrib/persistence/datasource/src/test/resources/META-INF/sca/provider.scdl new file mode 100644 index 0000000000..0dc4c866b1 --- /dev/null +++ b/sandbox/old/contrib/persistence/datasource/src/test/resources/META-INF/sca/provider.scdl @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * 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. +--> +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + xmlns:system="http://tuscany.apache.org/xmlns/system/1.0-SNAPSHOT" + name="bootTest"> + + <component name="TestDS"> + <system:implementation.ds provider="org.apache.tuscany.persistence.datasource.integration.mock.Provider"/> + <property name="test">value</property> + <property name="loginTimeout">1</property> + </component> + +</composite> |