From bdd0a41aed7edf21ec2a65cfa17a86af2ef8c48a Mon Sep 17 00:00:00 2001 From: dims Date: Tue, 17 Jun 2008 00:23:01 +0000 Subject: Move Tuscany from Incubator to top level. git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@668359 13f79535-47bb-0310-9956-ffa450edef68 --- .../datasource/AmbiguousPropertyException.java | 40 ++++++++ .../datasource/DSComponentTypeLoader.java | 111 +++++++++++++++++++++ .../persistence/datasource/DataSourceBuilder.java | 74 ++++++++++++++ .../datasource/DataSourceCloseException.java | 31 ++++++ .../datasource/DataSourceComponent.java | 111 +++++++++++++++++++++ .../datasource/DataSourceImplementation.java | 60 +++++++++++ .../datasource/DataSourceImplementationLoader.java | 86 ++++++++++++++++ .../persistence/datasource/DataSourceProvider.java | 52 ++++++++++ .../tuscany/persistence/datasource/Injector.java | 45 +++++++++ .../datasource/MissingPropertyException.java | 44 ++++++++ .../persistence/datasource/ProviderException.java | 33 ++++++ .../datasource/ProviderObjectFactory.java | 73 ++++++++++++++ 12 files changed, 760 insertions(+) create mode 100644 sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/AmbiguousPropertyException.java create mode 100644 sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DSComponentTypeLoader.java create mode 100644 sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DataSourceBuilder.java create mode 100644 sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DataSourceCloseException.java create mode 100644 sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DataSourceComponent.java create mode 100644 sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DataSourceImplementation.java create mode 100644 sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DataSourceImplementationLoader.java create mode 100644 sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/DataSourceProvider.java create mode 100644 sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/Injector.java create mode 100644 sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/MissingPropertyException.java create mode 100644 sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/ProviderException.java create mode 100644 sandbox/old/contrib/persistence/datasource/src/main/java/org/apache/tuscany/persistence/datasource/ProviderObjectFactory.java (limited to 'sandbox/old/contrib/persistence/datasource/src/main/java') 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 { + private SimpleTypeMapperExtension extension = new SimpleTypeMapperExtension(); + + public DSComponentTypeLoader(@Reference LoaderRegistry loaderRegistry) { + super(loaderRegistry); + } + + protected Class getImplementationClass() { + return DataSourceImplementation.class; + } + + public void load(DataSourceImplementation implementation, DeploymentContext ctx) + throws LoaderException { + ComponentType> componentType = + new ComponentType>(); + 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> 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 = (Class) 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 property = + new JavaMappedProperty(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 { + protected Class getImplementationType() { + return DataSourceImplementation.class; + } + + public Component build(ComponentDefinition definition, + DeploymentContext deploymentContext) throws BuilderConfigException { + try { + DataSourceImplementation implementation = definition.getImplementation(); + ClassLoader classLoader = implementation.getClassLoader(); + Class beanClass = classLoader.loadClass(implementation.getProviderName()); + List injectors = new ArrayList(); + // 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 DataSource instances. The component uses a {@link ProviderObjectFactory} + * to instantiate the actual DataSource + * + * @version $Rev$ $Date$ + */ +public class DataSourceComponent extends AtomicComponentExtension { + private ProviderObjectFactory instanceFactory; + + /** + * Creates a DataSourceComponent + * + * @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 getWires(String name) { + return null; + } + + public void attachCallbackWire(Wire wire) { + + } + + public void attachWire(Wire wire) { + + } + + public void attachWires(List 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 { + private String providerName; + private ClassLoader classLoader; + private Map configurationParams = new HashMap(); + + 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 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 + * DataSource system service in the runtime. The actual DataSource provider is pluggable, for example, + * Commons DBCP could be used. DataSource components are configured as follows: + *
+ * 

+ * + * + * com.mysql.jdbc.Driver + * jdbc:mysql://localhost:3306/mydb + * foo + * bar + * + *

+ *

+ * In the above example, org.foo.FooProvider is responsible for bootstrapping the actual DataSource + * implementation. It may implement javax.sql.DataSource 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 DataSource 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 DataSource . It + * must have a no-args constructor and may optionally implement {@link DataSourceProvider}. If it does not implement + * DataSourceProvider, then the provider class must implement the DataSource 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 { + private Class providerClass; + private List injectors; + + public ProviderObjectFactory(Class providerClass, List 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); + } + } + +} -- cgit v1.2.3