You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ws.apache.org by "Ping Liu (JIRA)" <ji...@apache.org> on 2011/02/26 00:12:22 UTC

[jira] Commented: (WODEN-186) Various problems calling toString() on uninitialized *Impl classes

    [ https://issues.apache.org/jira/browse/WODEN-186?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12999628#comment-12999628 ] 

Ping Liu commented on WODEN-186:
--------------------------------

I was able to reproduce the error cases for both ServiceElement and EndpointElement when calling toString().

After a comprehensive investigation, it was found that all element implementations except DescriptionElement (under package org.apache.woden.wsdl20.xml) have the same issue.  Here is the list of the elements that have such issue.

	BindingElement
	BindingFaultElement
	BindingFaultReferenceElement
	BindingMessageReferenceElement
	BindingOperationElement
	EndpointElement
	InterfaceElement
	InterfaceFaultReferenceElement
	InterfaceMessageReferenceElement
	InterfaceOperationElement
	ServiceElement

There are also two component implementations (under package org.apache.woden.wsdl20) carrying the same issue.  The two component are:

	ElementDeclaration
	TypeDefinition

The error track can be found in the attached file (TestToStringForComponentAndElement.txt).

The issue is derived from getFragmentIdentifier() where toString() gets the actual content. The issue is eventually boiled down to three categories:

	1. lacking its own name (NCName)
	2. lacking its parent's name or even its entire parent
	3. in the case of compents (ElementDeclaration and TypeDefinition), missing URI (fSystem)

The issue is due to "too early call" when the components and elements have not been fully established yet at the calling time.

I think one possible fix could be like this:

	1. inside getFragmentIdentifier() in elements/components such as EndpointElement, add condition checks for name, parent, etc.  Upon failing condition, throw the exception with meaningful error description;
	2. then capture the exception in toString() implementation class:
	   - for elements: WSDLComponentImpl (the super class);
	   - for components: ElementDeclaration (for ElementDeclaration), TypeDefinition (for TypeDefinition) as toString() and getFragmentIdentifier() reside together (no class hierarchy)
	3. wrap the exception in a friendly warning message as the return of toString().

> Various problems calling toString() on uninitialized *Impl classes
> ------------------------------------------------------------------
>
>                 Key: WODEN-186
>                 URL: https://issues.apache.org/jira/browse/WODEN-186
>             Project: Woden
>          Issue Type: Bug
>          Components: Parser
>    Affects Versions: M8
>            Reporter: Jeremy Hughes
>             Fix For: 1.0
>
>         Attachments: TestToStringForComponentAndElement.txt
>
>
> I'm using the Element API to construct a Description from the ground up, with some problems in calling toString() on uninitialized *Impl objects.
>         WSDLFactory factory = WSDLFactory.newInstance();
>         DescriptionElement descElem1 = factory.newDescription();
>         ServiceElement svcElem1 = descElem1.addServiceElement();
>         assertNotNull(svcElem1.toString());
> gives:
> java.lang.IllegalArgumentException
> 	at org.apache.woden.wsdl20.fragids.ServicePart.<init>(ServicePart.java:40)
> 	at org.apache.woden.internal.wsdl20.ServiceImpl.getFragmentIdentifier(ServiceImpl.java:227)
> 	at org.apache.woden.internal.wsdl20.WSDLComponentImpl.toString(WSDLComponentImpl.java:108)
> ServicePart ctor actually throws a new IllegalArgumentException if passed a null so that's WAD. However, ServiceImpl.toString() should be friendlier.
> Then there is a problem with ElementImpl.toString():
>         WSDLFactory factory = WSDLFactory.newInstance();
>         DescriptionElement descElem1 = factory.newDescription();
>         ServiceElement svcElem1 = descElem1.addServiceElement();
>         EndpointElement endPtElem1 = svcElem1.addEndpointElement();
>         assertNotNull(endPtElem1.toString());
> gives:
> java.lang.NullPointerException
> 	at org.apache.woden.internal.wsdl20.EndpointImpl.getFragmentIdentifier(EndpointImpl.java:140)
> 	at org.apache.woden.internal.wsdl20.WSDLComponentImpl.toString(WSDLComponentImpl.java:108)

-- 
This message is automatically generated by JIRA.
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ws.apache.org
For additional commands, e-mail: dev-help@ws.apache.org