[ 
https://issues.apache.org/jira/browse/WSCOMMONS-236?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Rich Scheuerle resolved WSCOMMONS-236.
--------------------------------------

    Resolution: Fixed

This work has already been completed.

> Introduce a CopyUtils class that makes copies of OM trees
> ---------------------------------------------------------
>
>                 Key: WSCOMMONS-236
>                 URL: https://issues.apache.org/jira/browse/WSCOMMONS-236
>             Project: WS-Commons
>          Issue Type: Improvement
>          Components: AXIOM
>            Reporter: Rich Scheuerle
>            Assignee: Rich Scheuerle
>         Attachments: sandesha_patch.txt
>
>
> Problem Summary:
>    Some consumers of Axiom need to make copies of the OM tree.
>    Providing a CopyUtils utility in Axiom would allow them to delegate this 
> work to Axiom.
>    It would also allow the Axiom project to more tightly control this 
> critical function.
> Goals of CopyUtils
>    1) The Source tree should be minimally affected by the copy.  For example, 
> copying an OM SOAPEnvelope
>       should not cause unnecessary expansion of descendent OMDataSource 
> elements.
>    2) Retain class identity for nodes in the tree.  For example, a SOAPFault 
> object in the source tree
>       will cause a SOAPFault object to be created in the target tree.
>    3) Handle all of the nuances.  For example, SOAPHeaderBlocks have 
> processed flags.  The state of these
>       flags should be copied to the target tree.
>    4) If Axiom controls the CopyUtils code, then Axiom is in a better 
> position to fix the utility as Axiom is 
>       improved/upgraded.
> Example Usage:
>    An example is the Sandesha project.  Here is the code in SandeshaUtils 
> that makes a copy of a tree
>    be writing and reparsing the data. 
>    public static MessageContext cloneMessageContext (MessageContext oldMsg) 
> throws AxisFault {
>               MessageContext newMsg = new MessageContext ();
>               newMsg.setOptions(new Options (oldMsg.getOptions()));
>               
>               
>               //TODO hd to use following hack since a 'clone' method was not 
> available for SOAPEnvelopes.
>               //Do it the correct way when that becomes available.
>               OMElement newElement = oldMsg.getEnvelope().cloneOMElement();
>               String elementString = newElement.toString();
>               
>               try {
>                       ByteArrayInputStream stream = new ByteArrayInputStream(
>                                       elementString.getBytes("UTF8"));
>                       StAXSOAPModelBuilder builder = new StAXSOAPModelBuilder(
>                                       
> XMLInputFactory.newInstance().createXMLStreamReader(stream),
>                                       null);
>                       SOAPEnvelope envelope = builder.getSOAPEnvelope();
>                       newMsg.setEnvelope(envelope);
>               } catch (XMLStreamException e) {
>                       throw AxisFault.makeFault(e);
>               } catch (UnsupportedEncodingException e) {
>                       throw AxisFault.makeFault(e);
>               }
>               
>               
> newMsg.setConfigurationContext(oldMsg.getConfigurationContext());
>               newMsg.setAxisService(oldMsg.getAxisService());
>               newMsg.setTransportOut(oldMsg.getTransportOut());
>               newMsg.setTransportIn(oldMsg.getTransportIn());
>               
>               return newMsg;
>               
>       }
>   This code will be changed to:
>         /**
>          * Clone the MessageContext
>          * @param oldMsg
>          * @return
>          * @throws AxisFault
>          */
>         public static MessageContext cloneMessageContext (MessageContext 
> oldMsg) throws AxisFault {
>               MessageContext newMsg = new MessageContext ();
>               newMsg.setOptions(new Options (oldMsg.getOptions()));
>               
>                 // Create a copy of the envelope
>                 SOAPEnvelope oldEnvelope = oldMsg.getEnvelope();
>                 if (oldEnvelope != null) {
>                     SOAPEnvelope newEnvelope = 
> CopyUtils.copy(oldMsg.getEnvelope());
>                     newMsg.setEnvelope(newEnvelope);
>                 }
>                 
>               
> newMsg.setConfigurationContext(oldMsg.getConfigurationContext());
>               newMsg.setAxisService(oldMsg.getAxisService());
>               newMsg.setTransportOut(oldMsg.getTransportOut());
>               newMsg.setTransportIn(oldMsg.getTransportIn());
>               
>               return newMsg;
>               
>       }
> Full Disclosure:
>    I understand that Axiom provides a clone() method on its interfaces.  
> Currently the implementation of clone() is 
>    inadequate and/or broken.  For example, invoking clone() on a 
> SOAP11BodyImpl will return a OMElement (not a SOAP11BodyImpl).
>    Using a separate static utility to control the copying of a tree is an 
> easy and effective way to fix the existing clone() 
>    inadequacies.  If the clone() methods are fixed, then it will be easy to 
> incorporate those changes into the CopyUtils code.
>    In addition, an external copy utility allows us to provide more 
> sophisticated copy support (e.g. copyAndFlatten).

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


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to