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.