Yes it is strange because using java code in order to register SCA node was
working. The source code of ContributionProcessor is
// Create contribution model
Contribution contribution =
contributionFactory.createContribution();
contribution.setURI(contributionURI.toString());
contribution.setLocation(contributionURL.toString());
ModelResolver modelResolver = new
ExtensibleModelResolver(contribution, modelResolvers, modelFactories);
contribution.setModelResolver(modelResolver);
contribution.setUnresolved(true);
// Create a contribution scanner
ContributionScanner scanner =
scanners.getContributionScanner(contributionURL.getProtocol());
if (scanner == null) {
if ("file".equals(contributionURL.getProtocol()) && new
File(contributionURL.getFile()).isDirectory()) {
scanner = new DirectoryContributionScanner();
} else {
scanner = new JarContributionScanner();
}
}
* // Scan the contribution and list the artifacts contai**ned in it*
List<Artifact> artifacts = contribution.getArtifacts();
boolean contributionMetadata = false;
List<String> artifactURIs = scanner.getArtifacts(contributionURL);
for (String artifactURI: artifactURIs) {
*URL artifactURL = scanner.getArtifactURL(contributionURL,
artifactURI); --> This returns null*
// Add the deployed artifact model to the contribution
Artifact artifact = this.contributionFactory.createArtifact();
artifact.setURI(artifactURI);
* artifact.setLocation(artifactURL.toString()); --> This is the
line 131*
artifacts.add(artifact);
modelResolver.addModel(artifact);
artifactURL is null because of java.lang.NullPointerException is thrown in
the line 131. I guess it is looking for something about "contribution" and
it can not recover some file correctly. I am sure there is something about
contribution when I was using the java code that I don´t have when I don´t
use this code.
I remember you the java code I used
* *
**try {
//Registrado el servicio SensorNetworkManagement en el dominio SCA
NodeFactory factory = NodeFactory.newInstance();
String url =
ContributionLocationHelper.getContributionLocation(getClass());
Contribution contrib = new Contribution("c1", url);
node = factory.createNode("OSGI-INF/sca/bundle.composite",
contrib);
node.start();
} catch (Throwable e) {
e.printStackTrace();
}
2009/6/17 Raymond Feng <[email protected]>
> Please see my comments inline.
>
> *From:* Santiago Miguel Aranda Rojas <[email protected]>
> *Sent:* Wednesday, June 17, 2009 3:02 AM
> *To:* [email protected] ; [email protected]
> *Subject:* Re: Fwd: Problem with "implementation.osgi" reference
>
> Ok.
> I have checked and I don´t need to write code in order to register SCA
> node.
>
> Tuscany is trying to register the node with both options
> * With "SCA-Composite: true" in the manifest.mf
>
> <rfeng>The value should be a path to the composite file within the
> bundle</rfeng>
>
> * Without SCA-Composite header but with a OSGI-INF/sca directory.
>
> The second option has a problem using Eclipse. I have seen the source code
> of NodeManager.java and "isSCABundle"
> method. bundle.findEntries("OSGI-INF/sca", "*", false) is not working
> correctly in Eclipse because tries to find these files in /OSGI-INF/sca but
> they are really in /src/main/resources/OSGI-INF/sca. When I pack the bundle
> into a jar I have the right structure. But it is not important. I have
> copied this structure into the root of my Eclipse project.
>
> <rfeng>Good catch.</rfeng>
>
>
> I have a new error with both options. Tuscany recognizes the bundle as SCA
> bundle but
>
> 17-jun-2009 11:41:01
> org.apache.tuscany.sca.node.osgi.impl.NodeFactoryImpl configureNode
> INFO: Loading contribution: bundleentry://33/
> *Could not load resource
> META-INF/maven/es.amivital.calculatorservice2/CalculatorService3/pom.properties
> *
>
> <rfeng>This is really strange.</rfeng>
>
> 17-jun-2009 11:41:01 org.apache.tuscany.sca.node.osgi.impl.NodeManager
> bundleStarted
> GRAVE: java.lang.NullPointerException
> org.oasisopen.sca.ServiceRuntimeException: java.lang.NullPointerException
> at
> org.apache.tuscany.sca.node.osgi.impl.NodeFactoryImpl$NodeImpl.<init>(NodeFactoryImpl.java:579)
> at
> org.apache.tuscany.sca.node.osgi.impl.NodeFactoryImpl$NodeImpl.<init>(NodeFactoryImpl.java:562)
> at
> org.apache.tuscany.sca.node.osgi.impl.NodeFactoryImpl.createNode(NodeFactoryImpl.java:506)
> at
> org.apache.tuscany.sca.node.osgi.impl.NodeManager.bundleStarted(NodeManager.java:96)
> at
> org.apache.tuscany.sca.node.osgi.impl.NodeManager.bundleChanged(NodeManager.java:119)
> at
> org.eclipse.osgi.framework.internal.core.BundleContextImpl.dispatchEvent(BundleContextImpl.java:1210)
> at
> org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:195)
> at
> org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:141)
> at
> org.eclipse.osgi.framework.internal.core.Framework.publishBundleEventPrivileged(Framework.java:1558)
> at
> org.eclipse.osgi.framework.internal.core.Framework.publishBundleEvent(Framework.java:1509)
> at
> org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:355)
> at
> org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:350)
> at
> org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java:1118)
> at
> org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:634)
> at
> org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:508)
> at
> org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:282)
> at
> org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:468)
> at
> org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:195)
> at
> org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:297)
> Caused by: java.lang.NullPointerException
> at
> org.apache.tuscany.sca.workspace.processor.impl.ContributionContentProcessor.read(ContributionContentProcessor.java:131)
>
> <rfeng>This line doesn't match the latest code in
> ContributionContentProcessor.java. Can you post the lines around?</rfeng>
>
> at
> org.apache.tuscany.sca.workspace.processor.impl.ContributionContentProcessor.read(ContributionContentProcessor.java:1)
> at
> org.apache.tuscany.sca.contribution.processor.DefaultURLArtifactProcessorExtensionPoint$LazyURLArtifactProcessor.read(DefaultURLArtifactProcessorExtensionPoint.java:337)
> at
> org.apache.tuscany.sca.node.osgi.impl.NodeFactoryImpl.configureNode(NodeFactoryImpl.java:369)
> at
> org.apache.tuscany.sca.node.osgi.impl.NodeFactoryImpl.access$2(NodeFactoryImpl.java:351)
> at
> org.apache.tuscany.sca.node.osgi.impl.NodeFactoryImpl$NodeImpl.<init>(NodeFactoryImpl.java:574)
> ... 18 more
>
> When I was using code in order to register the node it was working Ok. I
> think I need something more. What is sca-contribution.xml. Do I need this
> file? Where should it be ? I don´t know why "Could not load resource
> META-INF/maven/es.amivital.calculatorservice2/CalculatorService3/pom.properties"
> if
> this file it is from maven and it is not from Tuscany
>
>
> Thank you very much for your help
>
> ------------------------------------------------------------------------------------------------------------
>
>
>
>
>
>
> 2009/6/16 Raymond Feng <[email protected]>
>
>> You don't have to write the code to start the Node. The node-impl-osgi
>> bundle is watching the SCA enabled OSGi bundles and it will start the Node
>> when the bundle is started.
>>
>> Thanks,
>> Raymond
>>
>> From: Santiago Miguel Aranda Rojas
>> Sent: Tuesday, June 16, 2009 1:44 AM
>> To: [email protected]
>> Subject: Re: Fwd: Problem with "implementation.osgi" reference
>>
>>
>>
>> Sorry I forgot one question.
>>
>>
>> I am using this code in order to register CalculatorService as SCA
>> service.
>>
>>
>> try {
>>
>> //Registrado el servicio SensorNetworkManagement en el dominio SCA
>> NodeFactory factory = NodeFactory.newInstance();
>> String url =
>> ContributionLocationHelper.getContributionLocation(getClass());
>> Contribution contrib = new Contribution("c1", url);
>> node = factory.createNode("OSGI-INF/sca/bundle.composite",
>> contrib);
>> node.start();
>> } catch (Throwable e) {
>> e.printStackTrace();
>> }
>>
>>
>> Is it neccesary this??? Can I put composite and component type in
>> "OSGI-INF/sca" directory only? I mean have I to write this code? Does
>> Tuscany read these files automatically?
>>
>>
>>
>>
>> Does TestService need this code too?
>>
>>
>>
>>
>> Thank you very much.
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> 2009/6/16 <[email protected]>
>>
>>
>> So, I have to attach two files (componentType and composite) to my two
>> different bundles (TestService and Calculator) and model it as
>> "implementation.osgi". I have TestService in a bundle I will add these two
>> file and I will design as "implementation.osgi" .
>>
>> But Calculator Service (this is in other bundle) has three components and
>> they are all "implementation.java" and it is working OK. How can I put a
>> reference to TestService?? Do I need change "implementation.osgi" in
>> CalculatorComponent instead "implementation.java"? and is it neccesary for
>> AddServiceComponent and SubstractService??
>>
>> I will try a example I will copy my files in the email.
>>
>> Thank you very much
>>
>> Un saludo.
>> Santiago Miguel Aranda Rojas
>> Telvent Interactiva
>> Extension: 35999
>> Telefono: 955637418
>>
>>
>>
>> "Raymond Feng" <[email protected]>
>>
>> "Raymond Feng"
>> 15/06/2009 18:36
>> Para: <[email protected]>, <[email protected]>
>> cc:
>> Asunto: Re: Fwd: Problem with "implementation.osgi" reference
>>
>>
>>
>>
>>
>> To access an OSGi service from the SCA component, you will have to provide
>> SCA configurations for the OSGi bundle so that it becomes an SCA component
>> using implementation.osgi and the OSGi service becomes an SCA service so
>> that the Calculator component can wire to that TestService.
>>
>> There are two SCA files you to provide to model the OSGi bundle as an SCA
>> component.
>> * bundle.componentType to describe what OSGi services or references are
>> used
>> in the bundle (We potentially have better approach to introspect the OSGi
>> bundle to build this up)
>> * bundle.composite to configure the component, for example, setting the
>> bindings.
>>
>> These files can be in a separate OSGi bundle than the one that owns the
>> services/references.
>>
>> Thanks,
>> Raymond
>>
>> From: Santiago Miguel Aranda Rojas
>> Sent: Monday, June 15, 2009 4:01 AM
>> To: [email protected]
>> Subject: Fwd: Problem with "implementation.osgi" reference
>>
>>
>>
>>
>>
>>
>> Hi
>>
>>
>> I can not understand this sample because there are many new concepts for
>> me.
>> For example "bundle.componentType". There is not too much information
>> about
>> that . I think I need something more simple. I have attached a picture
>> with
>> my idea.
>>
>>
>> ** When my SCA service was working I had a main component
>> "implementacion.java" with two references to another two components
>> (implementation.java). The main component could be invoked as Web Service.
>>
>>
>> ** Now, I want another reference to a Service (TestService in the picture)
>> that was registered by another different bundle. But this is a OSGi
>> bundle,
>> without SCA information, Composite file nor ComponentType file. I mean it
>> is
>> a bundle that is registering a service in the OSGi registry. I need have a
>> instance wired to this OSGi service in the class of the main Component in
>> order to invoke their methods.
>>
>>
>> TestService testService;
>>
>>
>> //I need testService is not null in order to invoke their methods.
>> testService.sayHello();
>>
>>
>>
>>
>> I hope you can understand my problem. You can ask me if you want.
>>
>>
>> Thank you very mucha
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> 2009/6/10 Raymond Feng <[email protected]>
>>
>> Please see:
>>
>>
>> https://svn.apache.org/repos/asf/tuscany/java/sca/samples/dosgi-calculator/
>>
>> https://svn.apache.org/repos/asf/tuscany/java/sca/samples/dosgi-calculator-operations/
>>
>>
>> http://cwiki.apache.org/confluence/display/TUSCANYWIKI/OSGi+RFC+119+Implementation
>>
>> Thanks,
>> Raymond
>>
>>
>> From: Santiago Miguel Aranda Rojas
>> Sent: Wednesday, June 10, 2009 12:07 AM
>> To: [email protected]
>> Subject: Re: Problem with "implementation.osgi" reference
>>
>>
>> Yes, you are right. I was doing some different tests and I copied you a
>> wrong composite. I wanted to see if the change of @target made an error in
>> tuscany. But Tuscany doesn4t recognize this error because I think it
>> supposes that will be a "remote Component". I can see this in the tuscany
>> trace
>>
>>
>> ADVERTENCIA: Component reference target not found, it might be a remote
>> service running elsewhere in the SCA Domain: Composite =
>> {
>> http://eclipse.org/SensorNetworkManagement/src/main/resources/SensorNetworkManagement}SensorNetworkManagement<http://eclipse.org/SensorNetworkManagement/src/main/resources/SensorNetworkManagement%7DSensorNetworkManagement>
>> Service = PruebaComponent
>>
>>
>>
>> But it is Ok, because the component I want if an Osgi Service registered
>> in
>> the Osgi registry.
>> I have fixed the error in @target and it is not working yet.
>>
>>
>> Do you know any example when an <implementation.osgi> component is used?
>>
>>
>>
>>
>> I have tried to change "xmlns" tag, but it doesn4t work.
>>
>>
>> <sca:component name="PruebaComponent">
>> <sca:implementation.osgi
>> xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200903"
>> bundleSymbolicName="RegistroService"
>> bundleVersion="1.0.0">
>> <sca:properties service="prueba.PruebaImpl">
>> </sca:properties>
>> </sca:implementation.osgi>
>> </sca:component>
>>
>>
>> Thank you very much.
>>
>>
>>
>> 2009/6/10 Raymond Feng <[email protected]>
>>
>> The @target is pointing to a wrong componentName/serviceName. It should be
>> "Prueba" instead of "PruebaComponent" as the component name is "Prueba".
>>
>>
>> From: Santiago Miguel Aranda Rojas
>> Sent: Tuesday, June 09, 2009 1:28 PM
>> To: [email protected]
>> Subject: Re: Problem with "implementation.osgi" reference
>>
>>
>> Tuscany 2.02M. The last version I think. April 2009
>> ----- Original Message ----- From: Raymond Feng
>> To: [email protected]
>> Sent: Tuesday, June 09, 2009 7:12 PM
>> Subject: Re: Problem with "implementation.osgi" reference
>>
>>
>> Are you using Tuscany/SCA 2.x or 1.x?
>>
>>
>> From: [email protected]
>> Sent: Tuesday, June 09, 2009 9:15 AM
>> To: [email protected]
>> Subject: Problem with "implementation.osgi" reference
>>
>>
>>
>> Hello
>>
>> I want to use an osgi service as a SCA component. But I can not access to
>> their methods from other Component. I mean I have created a wired
>> instance
>> to the Osgi Service ($Proxy25). It is not "null" but I can not invoke to
>> one
>> method because an error is happening
>>
>> --->Unable to create SCA binding invoker for local target
>> SensorNetworkManagementComponent reference prueba (bindingURI=null
>> operation=sayHello)
>>
>> This is my composite file. I want to have to two components. The first had
>> a
>> reference to the second and it is normal "implementation.java". The second
>> is the SCA component that is representing to the Osgi Service that I want
>> to
>> recover. This Osgi Service was registered in the Osgi registry by
>> Activator
>> class in "RegistroService" bundle.
>>
>> <sca:component name="SensorNetworkManagementComponent">
>> <sca:implementation.java
>>
>> class="es.amivital.sensornetworkmanagement.sca.SensorNetworkManagementServiceImpl"/>
>> <sca:service name="SensorNetworkManagementService">
>> <sca:binding.ws
>> uri="http://localhost:8085/SensorNetworkManagementComponent"/>
>> </sca:service>
>> <sca:reference name="prueba" target="PruebaComponent"/>
>> </sca:component>
>>
>>
>> <sca:component name="Prueba">
>> <sca:implementation.osgi
>> xmlns="http://tuscany.apache.org/xmlns/sca/1.0"
>> bundleSymbolicName="RegistroService"
>> bundleVersion="1.0.0">
>> <sca:properties service="prueba.PruebaImpl">
>> </sca:properties>
>> </sca:implementation.osgi>
>> </sca:component>
>>
>> ***The Java code--> The first component.
>>
>> public class SensorNetworkManagementServiceImpl implements
>> SensorNetworkManagementService {
>> private Prueba prueba;
>> public Prueba getPrueba() {
>> return prueba;
>> }
>> @Reference
>> public void setPrueba(Prueba prueba) {
>> this.prueba = prueba;
>> }
>> }
>>
>> **Java code --> The second component. It is another bundle that is
>> registering one simple Osgi Service. The interface was
>>
>> public interface Prueba {
>> public abstract String sayHello();
>>
>> }
>>
>>
>>
>>
>>
>> This instance (prueba) is not null when an outside client invoke to the
>> first component. But if I invoke to one method of this interface, for
>> example "prueba.sayHello" I obtained the previous error.
>>
>> I have read something about anottations like @AllowsPassByReference or
>> @Scope, but I don4t know if they are neccesary .
>>
>
>