Thanks for the patch.

The fix to the clone() is good. We'll have to investigate a bit more to understand if the clone of the composite happens before other builders. If the clone is done after the reconciliations of the composite, then the clone of the composite will have to re-link some of the pieces, for example, the promotedReference will have to be replaced by the "cloned" component reference.

Can you also attach the test case in the JIRA so that it can be used to validate the fix?

Raymond

--------------------------------------------------
From: "Julien Bigot (JIRA)" <[email protected]>
Sent: Tuesday, April 21, 2009 10:58 AM
To: <[email protected]>
Subject: [jira] Commented: (TUSCANY-2982) Problem when more than one component has the same implementation.composite and that this composite has exposed references


[ https://issues.apache.org/jira/browse/TUSCANY-2982?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12701219#action_12701219 ]

Julien Bigot commented on TUSCANY-2982:
---------------------------------------

The following two patches seems to resolve the issue, however I do not know how dirty the hack it is.

--- modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/BaseWireBuilderImpl.java.old 2008-12-02 14:02:19.000000000 +0100 +++ modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/BaseWireBuilderImpl.java 2009-04-21 19:34:23.000000000 +0200
@@ -920,15 +920,9 @@

             // Resolve the target service
             ComponentService target = wire.getTarget();
- if (target != null && target.isUnresolved()) {
- resolvedService = componentServices.get(target.getName());
- if (resolvedService != null) {
- wire.setTarget(target);
- } else {
- warning("WireTargetNotFound", composite, source.getName());
- }
- } else {
- resolvedService = wire.getTarget();
+ resolvedService = componentServices.get(target.getName());
+ if (resolvedService == null) {
+ warning("WireTargetNotFound", composite, source.getName());
             }

             // Add the target service to the list of targets of the

--- modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/CompositeReferenceImpl.java.old 2008-12-02 14:02:18.000000000 +0100 +++ modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/CompositeReferenceImpl.java 2009-04-21 19:09:44.000000000 +0200
@@ -41,7 +41,12 @@

     @Override
     public Object clone() throws CloneNotSupportedException {
- return super.clone();
+ CompositeReferenceImpl result = (CompositeReferenceImpl) super.clone();
+ result.promotedReferences = new ArrayList<ComponentReference>();
+ for (ComponentReference promotedReference: promotedReferences) {
+ result.promotedReferences.add((ComponentReference)promotedReference.clone());
+ }
+ return result;
     }

     public List<ComponentReference> getPromotedReferences() {

Problem when more than one component has the same implementation.composite and that this composite has exposed references
-------------------------------------------------------------------------------------------------------------------------

                Key: TUSCANY-2982
                URL: https://issues.apache.org/jira/browse/TUSCANY-2982
            Project: Tuscany
         Issue Type: Bug
         Components: Java SCA Assembly Model
   Affects Versions: Java-SCA-1.4
        Environment: Linux / JavaSE-1.6
           Reporter: Julien Bigot

When in a hierarchy of instantiated components, two components (even not at the same level of the hierarchy) have the same implementation.composite and that the referenced composite has a reference promoting one (or more) reference of its internal components, connecting these composite references leads to a NullPointerException.
For example:
A.componentType
 |-> reference refA
 |-> service servA
B.composite
 |-> component a: A
 |-> reference refB = a/refA
C.composite
 |-> component b: B
 |-> reference refC = b/refB
D.composite
 |-> component a: A
 |-> component b: B
 |-> component c: C
 |-> wire a/servA <-> b/refB
 |-> wire a/servA <-> c/refC
instantiation of D leads to the following hierarchy
D/
 |->a
 |->b/
     |->a
 |->c/
    |->b/
        |->a
There are two instances of B (D/b & D/c/b) and these two instances have a reference (refB) promoting a reference of an internal component (a/refA), this results in the following NullPointerException :
 java.lang.NullPointerException
at org.apache.tuscany.sca.interfacedef.impl.InterfaceContractMapperImpl.checkCompatibility(InterfaceContractMapperImpl.java:155) at org.apache.tuscany.sca.interfacedef.impl.InterfaceContractMapperImpl.isCompatible(InterfaceContractMapperImpl.java:271) at org.apache.tuscany.sca.assembly.builder.impl.BaseWireBuilderImpl.connectWires(BaseWireBuilderImpl.java:940) at org.apache.tuscany.sca.assembly.builder.impl.BaseWireBuilderImpl.wireComponentReferences(BaseWireBuilderImpl.java:112) from my initial investigations, this seems somehow related to the fact that when cloned, CompositeReferenceImpl's do not clone their promotedReferences attribute, but rather copy it. I didn't manage to get further however.

--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to