diff options
Diffstat (limited to 'sandbox/ant/sca/trunk/modules/implementation-osgi/src/main')
25 files changed, 1461 insertions, 0 deletions
diff --git a/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/DefaultOSGiImplementationFactory.java b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/DefaultOSGiImplementationFactory.java new file mode 100644 index 0000000000..545898fe5f --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/DefaultOSGiImplementationFactory.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tuscany.sca.implementation.osgi; + +import org.apache.tuscany.sca.core.FactoryExtensionPoint; +import org.apache.tuscany.sca.implementation.osgi.impl.OSGiImplementationFactoryImpl; + +/** + * + */ +public class DefaultOSGiImplementationFactory extends OSGiImplementationFactoryImpl { + + public DefaultOSGiImplementationFactory(FactoryExtensionPoint factoryExtensionPoint) { + super(factoryExtensionPoint); + } + +} diff --git a/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/DefaultServiceDescriptionsFactory.java b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/DefaultServiceDescriptionsFactory.java new file mode 100644 index 0000000000..d7296e24bb --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/DefaultServiceDescriptionsFactory.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.sca.implementation.osgi; + +import org.apache.tuscany.sca.implementation.osgi.impl.ServiceDescriptionsFactoryImpl; + +/** + * + */ +public class DefaultServiceDescriptionsFactory extends ServiceDescriptionsFactoryImpl { + + public DefaultServiceDescriptionsFactory() { + super(); + } + +} diff --git a/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/OSGiImplementation.java b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/OSGiImplementation.java new file mode 100644 index 0000000000..4551821f5a --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/OSGiImplementation.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.sca.implementation.osgi; + +import javax.xml.namespace.QName; + +import org.apache.tuscany.sca.assembly.Extensible; +import org.apache.tuscany.sca.assembly.Implementation; +import org.osgi.framework.Bundle; + +/** + * + * The model representing an OSGi implementation in an SCA assembly model. + * + * @version $Rev$ $Date$ + */ +public interface OSGiImplementation extends Implementation, Extensible { + // String SCA11_NS = "http://docs.oasis-open.org/ns/opencsa/sca/200903"; + String SCA11_TUSCANY_NS = "http://tuscany.apache.org/xmlns/sca/1.1"; + + String BUNDLE_SYMBOLICNAME = "bundleSymbolicName"; + String BUNDLE_VERSION = "bundleVersion"; + QName IMPLEMENTATION_OSGI = new QName(SCA11_TUSCANY_NS, "implementation.osgi"); + + String getBundleSymbolicName(); + + void setBundleSymbolicName(String name); + + String getBundleVersion(); + + void setBundleVersion(String version); + + Bundle getBundle(); + + void setBundle(Bundle bundle); + +} diff --git a/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/OSGiImplementationFactory.java b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/OSGiImplementationFactory.java new file mode 100644 index 0000000000..0a83624e76 --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/OSGiImplementationFactory.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tuscany.sca.implementation.osgi; + +/** + * The factory interface to create OSGiImplementation instances + */ +public interface OSGiImplementationFactory { + /** + * Create a new instance of OSGiImplementation + * @return + */ + OSGiImplementation createOSGiImplementation(); + + /** + * + * @return + */ + OSGiProperty createOSGiProperty(); +} diff --git a/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/OSGiProperty.java b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/OSGiProperty.java new file mode 100644 index 0000000000..8509e866ef --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/OSGiProperty.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tuscany.sca.implementation.osgi; + +import javax.xml.namespace.QName; + +/** + * <tuscany:osgi.property> + */ +public interface OSGiProperty { + String NAME = "name"; + QName PROPERTY_QNAME = new QName(OSGiImplementation.SCA11_TUSCANY_NS, "osgi.property"); + + String getValue(); + + void setValue(String value); + + String getName(); + + void setName(String name); +} diff --git a/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/ServiceDescription.java b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/ServiceDescription.java new file mode 100644 index 0000000000..832e26a48f --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/ServiceDescription.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.sca.implementation.osgi; + +import java.util.List; +import java.util.Map; + + +/** + * The OSGi RFC 119 description of a remote OSGi service + */ +public interface ServiceDescription { + List<String> getInterfaces(); + + Map<String, Object> getProperties(); +} diff --git a/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/ServiceDescriptions.java b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/ServiceDescriptions.java new file mode 100644 index 0000000000..36968615c0 --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/ServiceDescriptions.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tuscany.sca.implementation.osgi; + +import java.util.List; + +import javax.xml.namespace.QName; + + +/** + * OSGi RFC 119 service descriptions + */ +public interface ServiceDescriptions extends List<ServiceDescription> { + + String REMOTE_SERVICE_FOLDER = "OSGI-INF/remote-service"; + String OSGI_SD_NS = "http://www.osgi.org/xmlns/sd/v1.0.0"; + QName SERVICE_DESCRIPTIONS_QNAME = new QName(OSGI_SD_NS, "service-descriptions"); + QName SERVICE_DESCRIPTION_QNAME = new QName(OSGI_SD_NS, "service-description"); + String REMOTE_SERVICE_HEADER = "Remote-Service"; + String PROP_SERVICE_INTENTS = "service.intents"; + String PROP_REQUIRES_INTENTS = "osgi.remote.requires.intents"; + String PROP_CONFIGURATION_TYPE = "osgi.remote.configuration.type"; + String CONFIGURATION_TYPE_SCA = "sca"; + String PROP_CONFIGURATION_SCA_BINDINGS = "osgi.remote.configuration.sca.bindings"; +} diff --git a/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/ServiceDescriptionsFactory.java b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/ServiceDescriptionsFactory.java new file mode 100644 index 0000000000..0e4c51b1f9 --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/ServiceDescriptionsFactory.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tuscany.sca.implementation.osgi; + +/** + * The factory interface to create OSGi RFC 119 service descriptions + */ +public interface ServiceDescriptionsFactory { + ServiceDescriptions createServiceDescriptions(); + + ServiceDescription createServiceDescription(); +} diff --git a/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/impl/OSGiImplementationFactoryImpl.java b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/impl/OSGiImplementationFactoryImpl.java new file mode 100644 index 0000000000..80b68d1728 --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/impl/OSGiImplementationFactoryImpl.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tuscany.sca.implementation.osgi.impl; + +import org.apache.tuscany.sca.core.FactoryExtensionPoint; +import org.apache.tuscany.sca.implementation.osgi.OSGiImplementation; +import org.apache.tuscany.sca.implementation.osgi.OSGiImplementationFactory; +import org.apache.tuscany.sca.implementation.osgi.OSGiProperty; + +/** + * + */ +public class OSGiImplementationFactoryImpl implements OSGiImplementationFactory { + private final FactoryExtensionPoint factoryExtensionPoint; + + public OSGiImplementationFactoryImpl(FactoryExtensionPoint factoryExtensionPoint) { + super(); + this.factoryExtensionPoint = factoryExtensionPoint; + } + + public OSGiImplementation createOSGiImplementation() { + return new OSGiImplementationImpl(factoryExtensionPoint); + } + + public OSGiProperty createOSGiProperty() { + return new OSGiPropertyImpl(); + } + +} diff --git a/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/impl/OSGiImplementationImpl.java b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/impl/OSGiImplementationImpl.java new file mode 100644 index 0000000000..d9641def69 --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/impl/OSGiImplementationImpl.java @@ -0,0 +1,160 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.sca.implementation.osgi.impl; + +import java.util.Hashtable; +import java.util.List; + +import org.apache.tuscany.sca.assembly.ComponentProperty; +import org.apache.tuscany.sca.assembly.impl.ImplementationImpl; +import org.apache.tuscany.sca.core.FactoryExtensionPoint; +import org.apache.tuscany.sca.implementation.osgi.OSGiImplementation; +import org.osgi.framework.Bundle; + +/** + * OSGi implementation + * All attributes from <implementation.osgi> have getters in this class + * This class implements OSGiImplementationInterface which is associated with OSGiImplementationProvider. + * + * @version $Rev$ $Date$ + */ +public class OSGiImplementationImpl extends ImplementationImpl implements OSGiImplementation { + + private String bundleSymbolicName; + private String bundleVersion; + private Bundle osgiBundle; + + private Hashtable<String, List<ComponentProperty>> referenceProperties; + private Hashtable<String, List<ComponentProperty>> serviceProperties; + + private Hashtable<String, List<ComponentProperty>> referenceCallbackProperties; + private Hashtable<String, List<ComponentProperty>> serviceCallbackProperties; + + private FactoryExtensionPoint modelFactories; + + + protected OSGiImplementationImpl(FactoryExtensionPoint modelFactories) { + this.modelFactories = modelFactories; + } + + public OSGiImplementationImpl(FactoryExtensionPoint modelFactories, + String bundleSymbolicName, + String bundleVersion, + Hashtable<String, List<ComponentProperty>> refProperties, + Hashtable<String, List<ComponentProperty>> serviceProperties) { + + super(); + this.bundleSymbolicName = bundleSymbolicName; + this.bundleVersion = bundleVersion; + this.referenceProperties = refProperties; + this.serviceProperties = serviceProperties; + this.modelFactories = modelFactories; + } + + public void setCallbackProperties(Hashtable<String, List<ComponentProperty>> refCallbackProperties, + Hashtable<String, List<ComponentProperty>> serviceCallbackProperties) { + + this.referenceCallbackProperties = refCallbackProperties; + this.serviceCallbackProperties = serviceCallbackProperties; + + } + + public String getBundleSymbolicName() { + return bundleSymbolicName; + } + + public String getBundleVersion() { + return bundleVersion; + } + + public FactoryExtensionPoint getModelFactories() { + return modelFactories; + } + + public List<ComponentProperty> getReferenceProperties(String referenceName) { + return referenceProperties.get(referenceName); + } + + public List<ComponentProperty> getServiceProperties(String serviceName) { + return serviceProperties.get(serviceName); + } + + public List<ComponentProperty> getReferenceCallbackProperties(String referenceName) { + return referenceCallbackProperties.get(referenceName); + } + + public List<ComponentProperty> getServiceCallbackProperties(String serviceName) { + return serviceCallbackProperties.get(serviceName); + } + + /** + * Since OSGi implementation annotations may not be processed until much later, leave it to + * the OSGi invoker to decide whether pass-by-reference is allowed. + * @return + */ + public boolean isAllowsPassByReference() { + return true; + } + + public Bundle getBundle() { + return osgiBundle; + } + + public void setBundle(Bundle osgiBundle) { + this.osgiBundle = osgiBundle; + } + + private boolean areEqual(Object obj1, Object obj2) { + if (obj1 == obj2) + return true; + if (obj1 == null || obj2 == null) + return false; + return obj1.equals(obj2); + } + + @Override + public boolean equals(Object obj) { + + if (!(obj instanceof OSGiImplementationImpl)) + return super.equals(obj); + OSGiImplementationImpl impl = (OSGiImplementationImpl)obj; + if (!areEqual(bundleSymbolicName, impl.bundleSymbolicName)) + return false; + if (!areEqual(bundleVersion, impl.bundleVersion)) + return false; + if (!areEqual(serviceProperties, impl.serviceProperties)) + return false; + if (!areEqual(serviceCallbackProperties, impl.serviceCallbackProperties)) + return false; + if (!areEqual(referenceProperties, impl.referenceProperties)) + return false; + if (!areEqual(referenceCallbackProperties, impl.referenceCallbackProperties)) + return false; + return super.equals(obj); + } + + public void setBundleSymbolicName(String bundleSymbolicName) { + this.bundleSymbolicName = bundleSymbolicName; + } + + public void setBundleVersion(String bundleVersion) { + this.bundleVersion = bundleVersion; + } + +} diff --git a/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/impl/OSGiPropertyImpl.java b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/impl/OSGiPropertyImpl.java new file mode 100644 index 0000000000..a3944c66c0 --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/impl/OSGiPropertyImpl.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tuscany.sca.implementation.osgi.impl; + +import org.apache.tuscany.sca.implementation.osgi.OSGiProperty; + +/** + * Implementation of OSGiProperty + */ +public class OSGiPropertyImpl implements OSGiProperty { + protected OSGiPropertyImpl() { + super(); + } + + private String name; + private String value; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + +} diff --git a/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/impl/ServiceDescriptionImpl.java b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/impl/ServiceDescriptionImpl.java new file mode 100644 index 0000000000..eeacdb9702 --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/impl/ServiceDescriptionImpl.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tuscany.sca.implementation.osgi.impl; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.tuscany.sca.implementation.osgi.ServiceDescription; + +/** + * The OSGi RFC 119 description of a remote OSGi service + */ +public class ServiceDescriptionImpl implements ServiceDescription { + protected ServiceDescriptionImpl() { + super(); + } + + private List<String> interfaces = new ArrayList<String>(); + private Map<String, Object> properties = new HashMap<String, Object>(); + + public List<String> getInterfaces() { + return interfaces; + } + + public Map<String, Object> getProperties() { + return properties; + } + + public String toString() { + return "service-description: interfaces=" + interfaces + "properties=" + properties; + } +}
\ No newline at end of file diff --git a/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/impl/ServiceDescriptionsFactoryImpl.java b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/impl/ServiceDescriptionsFactoryImpl.java new file mode 100644 index 0000000000..8cd3867610 --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/impl/ServiceDescriptionsFactoryImpl.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tuscany.sca.implementation.osgi.impl; + +import org.apache.tuscany.sca.implementation.osgi.ServiceDescription; +import org.apache.tuscany.sca.implementation.osgi.ServiceDescriptions; +import org.apache.tuscany.sca.implementation.osgi.ServiceDescriptionsFactory; + +/** + * The factory implementation + */ +public class ServiceDescriptionsFactoryImpl implements ServiceDescriptionsFactory { + + protected ServiceDescriptionsFactoryImpl() { + super(); + } + + public ServiceDescription createServiceDescription() { + return new ServiceDescriptionImpl(); + } + + public ServiceDescriptions createServiceDescriptions() { + return new ServiceDescriptionsImpl(); + } + +} diff --git a/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/impl/ServiceDescriptionsImpl.java b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/impl/ServiceDescriptionsImpl.java new file mode 100644 index 0000000000..c249c053a4 --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/impl/ServiceDescriptionsImpl.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tuscany.sca.implementation.osgi.impl; + +import java.util.ArrayList; + +import org.apache.tuscany.sca.implementation.osgi.ServiceDescription; +import org.apache.tuscany.sca.implementation.osgi.ServiceDescriptions; + +/** + * + */ +public class ServiceDescriptionsImpl extends ArrayList<ServiceDescription> implements ServiceDescriptions { + private static final long serialVersionUID = 6205649013621747968L; + + protected ServiceDescriptionsImpl() { + super(); + } +} diff --git a/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/xml/OSGiImplementationActivator.java b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/xml/OSGiImplementationActivator.java new file mode 100644 index 0000000000..ce7b1dc920 --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/xml/OSGiImplementationActivator.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tuscany.sca.implementation.osgi.xml; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; + +/** + * Bundle activator to receive the BundleContext + */ +public class OSGiImplementationActivator implements BundleActivator { + private static BundleContext bundleContext; + + public void start(BundleContext context) throws Exception { + bundleContext = context; + } + + public void stop(BundleContext context) throws Exception { + bundleContext = null; + } + + static BundleContext getBundleContext() { + return bundleContext; + } + + static void setBundleContext(BundleContext bundleContext) { + OSGiImplementationActivator.bundleContext = bundleContext; + } + +} diff --git a/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/xml/OSGiImplementationProcessor.java b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/xml/OSGiImplementationProcessor.java new file mode 100644 index 0000000000..0a0efd1ec1 --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/xml/OSGiImplementationProcessor.java @@ -0,0 +1,234 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.sca.implementation.osgi.xml; + +import static javax.xml.stream.XMLStreamConstants.END_ELEMENT; +import static javax.xml.stream.XMLStreamConstants.START_ELEMENT; +import static org.apache.tuscany.sca.implementation.osgi.OSGiImplementation.BUNDLE_SYMBOLICNAME; +import static org.apache.tuscany.sca.implementation.osgi.OSGiImplementation.BUNDLE_VERSION; +import static org.apache.tuscany.sca.implementation.osgi.OSGiImplementation.IMPLEMENTATION_OSGI; + +import java.util.List; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.XMLStreamWriter; + +import org.apache.tuscany.sca.assembly.AssemblyFactory; +import org.apache.tuscany.sca.assembly.ComponentType; +import org.apache.tuscany.sca.assembly.Property; +import org.apache.tuscany.sca.assembly.Reference; +import org.apache.tuscany.sca.assembly.Service; +import org.apache.tuscany.sca.contribution.processor.ContributionReadException; +import org.apache.tuscany.sca.contribution.processor.ContributionResolveException; +import org.apache.tuscany.sca.contribution.processor.ContributionWriteException; +import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor; +import org.apache.tuscany.sca.contribution.resolver.ClassReference; +import org.apache.tuscany.sca.contribution.resolver.ModelResolver; +import org.apache.tuscany.sca.core.FactoryExtensionPoint; +import org.apache.tuscany.sca.implementation.osgi.OSGiImplementation; +import org.apache.tuscany.sca.implementation.osgi.OSGiImplementationFactory; +import org.apache.tuscany.sca.interfacedef.Interface; +import org.apache.tuscany.sca.interfacedef.java.JavaInterface; +import org.apache.tuscany.sca.monitor.Monitor; +import org.apache.tuscany.sca.monitor.Problem; +import org.apache.tuscany.sca.monitor.Problem.Severity; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.Constants; +import org.osgi.framework.Version; + +/** + * + * Process an <implementation.osgi/> element in a component definition. An instance of + * OSGiImplementation is created. + * Also associates the component type file with the implementation. + * + * @version $Rev$ $Date$ + */ +public class OSGiImplementationProcessor implements StAXArtifactProcessor<OSGiImplementation> { + private AssemblyFactory assemblyFactory; + // private FactoryExtensionPoint modelFactories; + private OSGiImplementationFactory osgiImplementationFactory; + private Monitor monitor; + + public OSGiImplementationProcessor(FactoryExtensionPoint modelFactories, Monitor monitor) { + this.monitor = monitor; + // this.modelFactories = modelFactories; + this.assemblyFactory = modelFactories.getFactory(AssemblyFactory.class); + this.osgiImplementationFactory = modelFactories.getFactory(OSGiImplementationFactory.class); + } + + /** + * Report a error. + * + * @param problems + * @param message + * @param model + */ + private void error(String message, Object model, Object... messageParameters) { + if (monitor != null) { + Problem problem = + monitor.createProblem(this.getClass().getName(), + "impl-osgi-validation-messages", + Severity.ERROR, + model, + message, + (Object[])messageParameters); + monitor.problem(problem); + } + } + + public QName getArtifactType() { + return IMPLEMENTATION_OSGI; + } + + public Class<OSGiImplementation> getModelType() { + return OSGiImplementation.class; + } + + public OSGiImplementation read(XMLStreamReader reader) throws ContributionReadException, XMLStreamException { + assert IMPLEMENTATION_OSGI.equals(reader.getName()); + + String bundleSymbolicName = reader.getAttributeValue(null, BUNDLE_SYMBOLICNAME); + String bundleVersion = reader.getAttributeValue(null, BUNDLE_VERSION); + + OSGiImplementation implementation = osgiImplementationFactory.createOSGiImplementation(); + implementation.setBundleSymbolicName(bundleSymbolicName); + implementation.setBundleVersion(bundleVersion); + + implementation.setUnresolved(true); + + // Skip to the end of <implementation.osgi> + while (reader.hasNext()) { + int next = reader.next(); + switch (next) { + case START_ELEMENT: + break; + case END_ELEMENT: + if (IMPLEMENTATION_OSGI.equals(reader.getName())) { + return implementation; + } + break; + } + } + return implementation; + } + + public void resolve(OSGiImplementation impl, ModelResolver resolver) throws ContributionResolveException { + + if (impl == null || !impl.isUnresolved()) + return; + + impl.setUnresolved(false); + + BundleContext bundleContext = OSGiImplementationActivator.getBundleContext(); + Bundle bundle = null; + for (Bundle b : bundleContext.getBundles()) { + String sn = b.getSymbolicName(); + String ver = (String)b.getHeaders().get(Constants.BUNDLE_VERSION); + if (!impl.getBundleSymbolicName().equals(sn)) { + continue; + } + Version v1 = Version.parseVersion(ver); + Version v2 = Version.parseVersion(impl.getBundleVersion()); + if (v1.equals(v2)) { + bundle = b; + break; + } + } + if (bundle != null) { + impl.setBundle(bundle); + } else { + error("CouldNotLocateOSGiBundle", impl, impl.getBundleSymbolicName()); + //throw new ContributionResolveException("Could not locate OSGi bundle " + + //impl.getBundleSymbolicName()); + return; + } + + ComponentType componentType = assemblyFactory.createComponentType(); + componentType.setURI("OSGI-INF/sca/bundle.componentType"); + componentType.setUnresolved(true); + componentType = resolver.resolveModel(ComponentType.class, componentType); + if (componentType.isUnresolved()) { + error("MissingComponentTypeFile", impl, componentType.getURI()); + //throw new ContributionResolveException("missing .componentType side file " + ctURI); + return; + } + + List<Service> services = componentType.getServices(); + for (Service service : services) { + Interface interfaze = service.getInterfaceContract().getInterface(); + if (interfaze instanceof JavaInterface) { + JavaInterface javaInterface = (JavaInterface)interfaze; + if (javaInterface.getJavaClass() == null) { + javaInterface.setJavaClass(getJavaClass(resolver, javaInterface.getName())); + } + if (service.getInterfaceContract().getCallbackInterface() instanceof JavaInterface) { + JavaInterface callbackInterface = + (JavaInterface)service.getInterfaceContract().getCallbackInterface(); + if (callbackInterface.getJavaClass() == null) { + callbackInterface.setJavaClass(getJavaClass(resolver, callbackInterface.getName())); + } + } + + impl.getServices().add(service); + } + } + + List<Reference> references = componentType.getReferences(); + for (Reference reference : references) { + Interface interfaze = reference.getInterfaceContract().getInterface(); + if (interfaze instanceof JavaInterface) { + JavaInterface javaInterface = (JavaInterface)interfaze; + if (javaInterface.getJavaClass() == null) { + javaInterface.setJavaClass(getJavaClass(resolver, javaInterface.getName())); + } + impl.getReferences().add(reference); + } else + impl.getReferences().add(reference); + } + + List<Property> properties = componentType.getProperties(); + for (Property property : properties) { + impl.getProperties().add(property); + } + impl.setConstrainingType(componentType.getConstrainingType()); + + } + + private Class<?> getJavaClass(ModelResolver resolver, String className) { + ClassReference ref = new ClassReference(className); + ref = resolver.resolveModel(ClassReference.class, ref); + return ref.getJavaClass(); + } + + public void write(OSGiImplementation model, XMLStreamWriter writer) throws ContributionWriteException, + XMLStreamException { + String ns = IMPLEMENTATION_OSGI.getNamespaceURI(); + writer.writeStartElement(ns, IMPLEMENTATION_OSGI.getLocalPart()); + writer.writeAttribute(BUNDLE_SYMBOLICNAME, model.getBundleSymbolicName()); + if (model.getBundleVersion() != null) { + writer.writeAttribute(BUNDLE_VERSION, model.getBundleVersion()); + } + writer.writeEndElement(); + } + +} diff --git a/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/xml/OSGiPropertyProcessor.java b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/xml/OSGiPropertyProcessor.java new file mode 100644 index 0000000000..5a8f5c4694 --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/xml/OSGiPropertyProcessor.java @@ -0,0 +1,105 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tuscany.sca.implementation.osgi.xml; + +import static javax.xml.stream.XMLStreamConstants.END_ELEMENT; +import static javax.xml.stream.XMLStreamConstants.START_ELEMENT; +import static org.apache.tuscany.sca.implementation.osgi.OSGiProperty.NAME; +import static org.apache.tuscany.sca.implementation.osgi.OSGiProperty.PROPERTY_QNAME; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.XMLStreamWriter; + +import org.apache.tuscany.sca.contribution.processor.ContributionResolveException; +import org.apache.tuscany.sca.contribution.processor.ContributionWriteException; +import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor; +import org.apache.tuscany.sca.contribution.resolver.ModelResolver; +import org.apache.tuscany.sca.core.FactoryExtensionPoint; +import org.apache.tuscany.sca.implementation.osgi.OSGiImplementationFactory; +import org.apache.tuscany.sca.implementation.osgi.OSGiProperty; +import org.apache.tuscany.sca.monitor.Monitor; + +/** + * A processor for <tuscany:osgi.property> + */ +public class OSGiPropertyProcessor implements StAXArtifactProcessor<OSGiProperty> { + private OSGiImplementationFactory factory; + private Monitor monitor; + + public OSGiPropertyProcessor(FactoryExtensionPoint modelFactories, Monitor monitor) { + this.monitor = monitor; + this.factory = modelFactories.getFactory(OSGiImplementationFactory.class); + } + + public OSGiProperty read(XMLStreamReader reader) throws XMLStreamException { + int event = reader.getEventType(); + OSGiProperty prop = null; + while (true) { + switch (event) { + case START_ELEMENT: + QName name = reader.getName(); + if (PROPERTY_QNAME.equals(name)) { + prop = factory.createOSGiProperty(); + prop.setName(reader.getAttributeValue(null, NAME)); + // After the following call, the reader will be positioned at END_ELEMENT + String text = reader.getElementText(); + if (text != null) { + text = text.trim(); + } + prop.setValue(text); + return prop; + } + break; + case END_ELEMENT: + name = reader.getName(); + if (PROPERTY_QNAME.equals(name)) { + return prop; + } + break; + } + if (reader.hasNext()) { + event = reader.next(); + } else { + return prop; + } + } + } + + public QName getArtifactType() { + return PROPERTY_QNAME; + } + + public void write(OSGiProperty model, XMLStreamWriter writer) throws ContributionWriteException, XMLStreamException { + writer.writeStartElement(PROPERTY_QNAME.getNamespaceURI(), PROPERTY_QNAME.getLocalPart()); + writer.writeAttribute(NAME, model.getName()); + writer.writeCharacters(model.getValue()); + writer.writeEndElement(); + } + + public Class<OSGiProperty> getModelType() { + return OSGiProperty.class; + } + + public void resolve(OSGiProperty model, ModelResolver resolver) throws ContributionResolveException { + // TODO: To be implemented + } +} diff --git a/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/xml/ServiceDescriptionsDocumentProcessor.java b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/xml/ServiceDescriptionsDocumentProcessor.java new file mode 100644 index 0000000000..d2d433d6c2 --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/xml/ServiceDescriptionsDocumentProcessor.java @@ -0,0 +1,99 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tuscany.sca.implementation.osgi.xml; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.net.URL; +import java.net.URLConnection; + +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.apache.tuscany.sca.contribution.processor.ContributionReadException; +import org.apache.tuscany.sca.contribution.processor.ContributionResolveException; +import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor; +import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor; +import org.apache.tuscany.sca.contribution.processor.ValidatingXMLInputFactory; +import org.apache.tuscany.sca.contribution.resolver.ModelResolver; +import org.apache.tuscany.sca.core.FactoryExtensionPoint; +import org.apache.tuscany.sca.implementation.osgi.ServiceDescriptions; +import org.apache.tuscany.sca.monitor.Monitor; + +/** + * The service descriptions document processor + */ +public class ServiceDescriptionsDocumentProcessor implements URLArtifactProcessor<ServiceDescriptions> { + private XMLInputFactory inputFactory; + private StAXArtifactProcessor extensionProcessor; + + public ServiceDescriptionsDocumentProcessor(FactoryExtensionPoint modelFactories, + StAXArtifactProcessor staxProcessor, + Monitor monitor) { + super(); + this.extensionProcessor = extensionProcessor; + this.inputFactory = modelFactories.getFactory(ValidatingXMLInputFactory.class); + } + + public String getArtifactType() { + return "/OSGI-INF/remote-service/*.xml"; + } + + public ServiceDescriptions read(URL contributionURL, URI artifactURI, URL artifactURL) + throws ContributionReadException { + InputStream is = null; + try { + URLConnection connection = artifactURL.openConnection(); + connection.setUseCaches(false); + is = connection.getInputStream(); + } catch (IOException e) { + ContributionReadException ce = new ContributionReadException(e); + throw ce; + } + try { + XMLStreamReader reader = inputFactory.createXMLStreamReader(is); + Object result = extensionProcessor.read(reader); + return (ServiceDescriptions)result; + } catch (XMLStreamException e) { + ContributionReadException ce = new ContributionReadException(e); + throw ce; + } finally { + try { + if (is != null) { + is.close(); + is = null; + } + } catch (IOException ioe) { + //ignore + } + } + + } + + public Class<ServiceDescriptions> getModelType() { + return ServiceDescriptions.class; + } + + public void resolve(ServiceDescriptions model, ModelResolver resolver) throws ContributionResolveException { + } + +} diff --git a/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/xml/ServiceDescriptionsProcessor.java b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/xml/ServiceDescriptionsProcessor.java new file mode 100644 index 0000000000..bef07d159d --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/xml/ServiceDescriptionsProcessor.java @@ -0,0 +1,153 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tuscany.sca.implementation.osgi.xml; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.XMLStreamWriter; + +import org.apache.tuscany.sca.contribution.processor.ContributionResolveException; +import org.apache.tuscany.sca.contribution.processor.ContributionWriteException; +import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor; +import org.apache.tuscany.sca.contribution.resolver.ModelResolver; +import org.apache.tuscany.sca.core.FactoryExtensionPoint; +import org.apache.tuscany.sca.implementation.osgi.ServiceDescription; +import org.apache.tuscany.sca.implementation.osgi.ServiceDescriptions; +import org.apache.tuscany.sca.implementation.osgi.ServiceDescriptionsFactory; +import org.apache.tuscany.sca.monitor.Monitor; + +/* +<?xml version="1.0" encoding="UTF-8"?> +<service-descriptions xmlns="http://www.osgi.org/xmlns/sd/v1.0.0"> + <service-description> + <provide interface="com.iona.soa.pojo.hello.HelloService"/> + <property name="service.intents">SOAP HTTP</property> + <property name="osgi.remote.configuration.type">pojo</property> + <property name="osgi.remote.configuration.pojo.address"> + http://localhost:9000/hello + </property> + </service-description> + <service-description> + <provide interface="com.iona.soa.pojo.hello.GreeterService"/> + <property name="service.intents">SOAP HTTP</property> + <property name="osgi.remote.configuration.type">pojo</property> + <property name="osgi.remote.configuration.pojo.address"> + http://localhost:9005/greeter + </property> + </service-description> +</service-descriptions> +*/ +public class ServiceDescriptionsProcessor implements StAXArtifactProcessor<ServiceDescriptions> { + private ServiceDescriptionsFactory factory; + private Monitor monitor; + + public ServiceDescriptionsProcessor(FactoryExtensionPoint modelFactories, Monitor monitor) { + this.monitor = monitor; + this.factory = modelFactories.getFactory(ServiceDescriptionsFactory.class); + } + + public ServiceDescriptions read(XMLStreamReader reader) throws XMLStreamException { + int event = reader.getEventType(); + ServiceDescriptions sds = factory.createServiceDescriptions(); + ServiceDescription sd = null; + while (true) { + switch (event) { + case XMLStreamConstants.START_ELEMENT: + QName name = reader.getName(); + if (ServiceDescriptions.SERVICE_DESCRIPTION_QNAME.equals(name)) { + sd = factory.createServiceDescription(); + sds.add(sd); + } else if ("provide".equals(name.getLocalPart())) { + String interfaceName = reader.getAttributeValue(null, "interface"); + if (interfaceName != null) { + sd.getInterfaces().add(interfaceName); + } + } else if ("property".equals(name.getLocalPart())) { + String propName = reader.getAttributeValue(null, "name"); + String propValue = reader.getAttributeValue(null, "value"); + String propType = reader.getAttributeValue(null, "type"); + if (propType == null) { + propType = "String"; + } + if (propValue == null) { + propValue = reader.getElementText(); + } + if (propValue != null) { + propValue = propValue.trim(); + } + Object prop = propValue; + if ("Integer".equals(propType)) { + prop = Integer.valueOf(propValue); + } else if ("Long".equals(propType)) { + prop = Long.valueOf(propValue); + } else if ("Float".equals(propType)) { + prop = Float.valueOf(propValue); + } else if ("Double".equals(propType)) { + prop = Double.valueOf(propValue); + } else if ("Short".equals(propType)) { + prop = Short.valueOf(propValue); + } else if ("Character".equals(propType)) { + prop = propValue.charAt(0); + } else if ("Byte".equals(propType)) { + prop = Byte.valueOf(propValue); + } else if ("Boolean".equals(propType)) { + prop = Boolean.valueOf(propValue); + } + sd.getProperties().put(propName, prop); + } + break; + case XMLStreamConstants.END_ELEMENT: + name = reader.getName(); + if (ServiceDescriptions.SERVICE_DESCRIPTION_QNAME.equals(name)) { + // Reset the sd + sd = null; + } + if (ServiceDescriptions.SERVICE_DESCRIPTIONS_QNAME.equals(name)) { + return sds; + } + break; + } + if (reader.hasNext()) { + event = reader.next(); + } else { + return sds; + } + } + } + + public QName getArtifactType() { + return ServiceDescriptions.SERVICE_DESCRIPTIONS_QNAME; + } + + public void write(ServiceDescriptions model, XMLStreamWriter writer) throws ContributionWriteException, + XMLStreamException { + // TODO: To be implemented + } + + public Class<ServiceDescriptions> getModelType() { + return ServiceDescriptions.class; + } + + public void resolve(ServiceDescriptions model, ModelResolver resolver) throws ContributionResolveException { + // TODO: To be implemented + } +} diff --git a/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/resources/META-INF/definitions.xml b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/resources/META-INF/definitions.xml new file mode 100644 index 0000000000..f531c2c4ed --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/resources/META-INF/definitions.xml @@ -0,0 +1,37 @@ +<?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. +--> +<sca:definitions xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200903" + targetNamespace="http://www.osgi.org/xmlns/sca/intents/v1.0.0"> + + <intent name="passByReference" constrains="sca:implementation" + intentType="implementation"> + <description> + An OSGi intent to pass data by reference + </description> + </intent> + + <intent name="passByValue" constrains="sca:implementation" + intentType="implementation"> + <description> + An OSGi intent to pass data by value + </description> + </intent> + +</sca:definitions>
\ No newline at end of file diff --git a/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor new file mode 100644 index 0000000000..c9ee094d9b --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor @@ -0,0 +1,21 @@ +# 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. + +# Implementation class for the artifact processor extension +org.apache.tuscany.sca.implementation.osgi.xml.OSGiImplementationProcessor;qname=http://tuscany.apache.org/xmlns/sca/1.1#implementation.osgi,model=org.apache.tuscany.sca.implementation.osgi.OSGiImplementation +org.apache.tuscany.sca.implementation.osgi.xml.ServiceDescriptionsProcessor;qname=http://www.osgi.org/xmlns/sd/v1.0.0#service-descriptions;model=org.apache.tuscany.sca.implementation.osgi.ServiceDescriptions +org.apache.tuscany.sca.implementation.osgi.xml.OSGiPropertyProcessor;qname=http://tuscany.apache.org/xmlns/sca/1.1#osgi.property,model=org.apache.tuscany.sca.implementation.osgi.OSGiProperty diff --git a/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor new file mode 100644 index 0000000000..974dd4588d --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor @@ -0,0 +1,19 @@ +# 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. + +# Implementation class for the artifact processor extension +org.apache.tuscany.sca.implementation.osgi.xml.ServiceDescriptionsDocumentProcessor;type=/OSGI-INF/remote-service/remote-services.xml,model=org.apache.tuscany.sca.implementation.osgi.ServiceDescriptions diff --git a/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/resources/META-INF/services/org.apache.tuscany.sca.implementation.osgi.OSGiImplementationFactory b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/resources/META-INF/services/org.apache.tuscany.sca.implementation.osgi.OSGiImplementationFactory new file mode 100644 index 0000000000..6ec156ae81 --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/resources/META-INF/services/org.apache.tuscany.sca.implementation.osgi.OSGiImplementationFactory @@ -0,0 +1,18 @@ +# 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.
+
+org.apache.tuscany.sca.implementation.osgi.DefaultOSGiImplementationFactory
diff --git a/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/resources/META-INF/services/org.apache.tuscany.sca.implementation.osgi.ServiceDescriptionsFactory b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/resources/META-INF/services/org.apache.tuscany.sca.implementation.osgi.ServiceDescriptionsFactory new file mode 100644 index 0000000000..0d01b7d6a5 --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/resources/META-INF/services/org.apache.tuscany.sca.implementation.osgi.ServiceDescriptionsFactory @@ -0,0 +1,17 @@ +# 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.
+org.apache.tuscany.sca.implementation.osgi.DefaultServiceDescriptionsFactory
diff --git a/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/resources/impl-osgi-validation-messages.properties b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/resources/impl-osgi-validation-messages.properties new file mode 100644 index 0000000000..2503be0b13 --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-osgi/src/main/resources/impl-osgi-validation-messages.properties @@ -0,0 +1,25 @@ +# +# +# 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. +# +# +ContributionReadException = ContributionReadException occured due to: +ContributionResolveException = ContributionResolveException occured due to: +PropertyShouldSpecifySR = Properties in implementation.osgi should specify service or reference +CouldNotLocateOSGiBundle = Could not locate OSGi bundle: {0} +MissingComponentTypeFile = Missing .componentType side file: {0}
\ No newline at end of file |