Author: giger
Date: Thu Apr 12 16:26:15 2012
New Revision: 1325355

URL: http://svn.apache.org/viewvc?rev=1325355&view=rev
Log:
split method in smaller ones. fixes a commented todo.

Modified:
    
webservices/wss4j/branches/swssf/streaming-xml-security/src/main/java/org/swssf/xmlsec/impl/processor/input/AbstractDecryptInputProcessor.java

Modified: 
webservices/wss4j/branches/swssf/streaming-xml-security/src/main/java/org/swssf/xmlsec/impl/processor/input/AbstractDecryptInputProcessor.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/branches/swssf/streaming-xml-security/src/main/java/org/swssf/xmlsec/impl/processor/input/AbstractDecryptInputProcessor.java?rev=1325355&r1=1325354&r2=1325355&view=diff
==============================================================================
--- 
webservices/wss4j/branches/swssf/streaming-xml-security/src/main/java/org/swssf/xmlsec/impl/processor/input/AbstractDecryptInputProcessor.java
 (original)
+++ 
webservices/wss4j/branches/swssf/streaming-xml-security/src/main/java/org/swssf/xmlsec/impl/processor/input/AbstractDecryptInputProcessor.java
 Thu Apr 12 16:26:15 2012
@@ -114,17 +114,10 @@ public abstract class AbstractDecryptInp
         return processEvent(inputProcessorChain, false);
     }
 
-    //todo split this methods in smaller ones...
     private XMLEvent processEvent(InputProcessorChain inputProcessorChain, 
boolean isSecurityHeaderEvent) throws XMLStreamException, XMLSecurityException {
 
         if (!tmpXmlEventList.isEmpty()) {
-            XMLEvent xmlEvent = tmpXmlEventList.pollLast();
-            if (xmlEvent.isStartElement()) {
-                
inputProcessorChain.getDocumentContext().addPathElement(xmlEvent.asStartElement().getName());
-            } else if (xmlEvent.isEndElement()) {
-                inputProcessorChain.getDocumentContext().removePathElement();
-            }
-            return xmlEvent;
+            return getLastBufferedXMLEvent(inputProcessorChain);
         }
 
         XMLEvent xmlEvent = isSecurityHeaderEvent ? 
inputProcessorChain.processHeaderEvent() : inputProcessorChain.processEvent();
@@ -137,23 +130,8 @@ public abstract class AbstractDecryptInp
             //buffer the events until the EncryptedData Element appears and 
discard it if we found the reference inside it
             //otherwise replay it
             if 
(startElement.getName().equals(XMLSecurityConstants.TAG_wsse11_EncryptedHeader))
 {
-
-                InputProcessorChain subInputProcessorChain = 
inputProcessorChain.createSubChain(this);
-                do {
-                    tmpXmlEventList.push(xmlEvent);
-
-                    subInputProcessorChain.reset();
-                    if (isSecurityHeaderEvent) {
-                        xmlEvent = subInputProcessorChain.processHeaderEvent();
-                    } else {
-                        xmlEvent = subInputProcessorChain.processEvent();
-                    }
-                }
-                while (!(xmlEvent.isStartElement() && 
xmlEvent.asStartElement().getName().equals(XMLSecurityConstants.TAG_xenc_EncryptedData)));
-
-                tmpXmlEventList.push(xmlEvent);
+                xmlEvent = readAndBufferEncryptedHeader(inputProcessorChain, 
isSecurityHeaderEvent, xmlEvent);
                 startElement = xmlEvent.asStartElement();
-
                 encryptedHeader = true;
             }
 
@@ -172,110 +150,34 @@ public abstract class AbstractDecryptInp
                 }
 
                 XMLEventNS xmlEventNS = (XMLEventNS) xmlEvent;
-                List<ComparableNamespace>[] comparableNamespaceList;
-                List<ComparableAttribute>[] comparableAttributeList;
-
-                if (encryptedHeader) {
-                    tmpXmlEventList.clear();
-                    
//inputProcessorChain.getDocumentContext().removePathElement();
-
-                    comparableNamespaceList = 
Arrays.copyOfRange(xmlEventNS.getNamespaceList(), 2, 
xmlEventNS.getNamespaceList().length);
-                    comparableAttributeList = 
Arrays.copyOfRange(xmlEventNS.getAttributeList(), 2, 
xmlEventNS.getNamespaceList().length);
-                } else {
-                    comparableNamespaceList = 
Arrays.copyOfRange(xmlEventNS.getNamespaceList(), 1, 
xmlEventNS.getNamespaceList().length);
-                    comparableAttributeList = 
Arrays.copyOfRange(xmlEventNS.getAttributeList(), 1, 
xmlEventNS.getNamespaceList().length);
-                }
-
+                List<ComparableNamespace>[] comparableNamespaceList = 
getNamespacesInScope(xmlEvent, encryptedHeader);
+                List<ComparableAttribute>[] comparableAttributeList = 
getAttributesInScope(xmlEvent, encryptedHeader);
+                tmpXmlEventList.clear();
                 processedReferences.add(referenceType);
 
                 //the following logic reads the encryptedData structure and 
doesn't pass them further
                 //through the chain
                 InputProcessorChain subInputProcessorChain = 
inputProcessorChain.createSubChain(this);
 
-                Deque<XMLEvent> xmlEvents = new LinkedList<XMLEvent>();
-                xmlEvents.push(xmlEvent);
-                XMLEvent encryptedDataXMLEvent;
-                int count = 0;
-                do {
-                    subInputProcessorChain.reset();
-                    if (isSecurityHeaderEvent) {
-                        encryptedDataXMLEvent = 
subInputProcessorChain.processHeaderEvent();
-                    } else {
-                        encryptedDataXMLEvent = 
subInputProcessorChain.processEvent();
-                    }
-
-                    xmlEvents.push(encryptedDataXMLEvent);
-                    if (++count >= 50) {
-                        throw new 
XMLSecurityException(XMLSecurityException.ErrorCode.INVALID_SECURITY);
-                    }
-                }
-                while (!(encryptedDataXMLEvent.isStartElement()
-                        && 
encryptedDataXMLEvent.asStartElement().getName().equals(XMLSecurityConstants.TAG_xenc_CipherValue)));
-
-                
xmlEvents.push(XMLSecurityConstants.XMLEVENTFACTORY.createEndElement(XMLSecurityConstants.TAG_xenc_CipherValue,
 null));
-                
xmlEvents.push(XMLSecurityConstants.XMLEVENTFACTORY.createEndElement(XMLSecurityConstants.TAG_xenc_CipherData,
 null));
-                
xmlEvents.push(XMLSecurityConstants.XMLEVENTFACTORY.createEndElement(XMLSecurityConstants.TAG_xenc_EncryptedData,
 null));
-
-                EncryptedDataType encryptedDataType;
-
-                try {
-                    Unmarshaller unmarshaller = 
XMLSecurityConstants.getJaxbContext().createUnmarshaller();
-                    JAXBElement<EncryptedDataType> 
encryptedDataTypeJAXBElement =
-                            (JAXBElement<EncryptedDataType>) 
unmarshaller.unmarshal(new XMLSecurityEventReader(xmlEvents, 0));
-                    encryptedDataType = 
encryptedDataTypeJAXBElement.getValue();
-
-                } catch (JAXBException e) {
-                    throw new 
XMLSecurityException(XMLSecurityException.ErrorCode.INVALID_SECURITY, e);
-                }
-
-                KeyInfoType keyInfoType;
-                if (this.keyInfoType != null) {
-                    keyInfoType = this.keyInfoType;
-                } else {
-                    keyInfoType = encryptedDataType.getKeyInfo();
-                }
-
-                final String algorithmURI = 
encryptedDataType.getEncryptionMethod().getAlgorithm();
-
-                //retrieve the securityToken which must be used for decryption
-                SecurityToken securityToken = 
SecurityTokenFactory.getInstance().getSecurityToken(
-                        keyInfoType, 
getSecurityProperties().getDecryptionCrypto(),
-                        getSecurityProperties().getCallbackHandler(), 
inputProcessorChain.getSecurityContext());
+                EncryptedDataType encryptedDataType = 
parseEncryptedDataStructure(isSecurityHeaderEvent, xmlEvent, 
subInputProcessorChain);
 
+                SecurityToken securityToken = 
getSecurityToken(inputProcessorChain, encryptedDataType);
                 handleSecurityToken(securityToken, 
inputProcessorChain.getSecurityContext(), encryptedDataType);
+
                 //only fire here ContentEncryptedElementEvents
                 //the other ones will be fired later, because we don't know 
the encrypted element name yet
                 if 
(SecurePart.Modifier.Content.getModifier().equals(encryptedDataType.getType())) 
{
                     handleEncryptedContent(inputProcessorChain, 
parentStartXMLEvent, xmlEvent, securityToken);
                 }
 
-                Cipher symCipher = null;
-                try {
-                    AlgorithmType symEncAlgo = 
JCEAlgorithmMapper.getAlgorithmMapping(algorithmURI);
-                    symCipher = Cipher.getInstance(symEncAlgo.getJCEName(), 
symEncAlgo.getJCEProvider());
-                    //we have to defer the initialization of the cipher until 
we can extract the IV...
-                } catch (NoSuchAlgorithmException e) {
-                    throw new XMLSecurityException(
-                            
XMLSecurityException.ErrorCode.UNSUPPORTED_ALGORITHM, "unsupportedKeyTransp",
-                            e, "No such algorithm: " + algorithmURI
-                    );
-                } catch (NoSuchPaddingException e) {
-                    throw new XMLSecurityException(
-                            
XMLSecurityException.ErrorCode.UNSUPPORTED_ALGORITHM, "unsupportedKeyTransp",
-                            e, "No such padding: " + algorithmURI
-                    );
-                } catch (NoSuchProviderException e) {
-                    throw new 
XMLSecurityException(XMLSecurityException.ErrorCode.FAILURE, "noSecProvider", 
e);
-                }
+                final String algorithmURI = 
encryptedDataType.getEncryptionMethod().getAlgorithm();
+                Cipher symCipher = getCipher(algorithmURI);
 
                 //create a new Thread for streaming decryption
                 DecryptionThread decryptionThread = new 
DecryptionThread(subInputProcessorChain, isSecurityHeaderEvent, xmlEventNS);
                 
decryptionThread.setSecretKey(securityToken.getSecretKey(algorithmURI, 
XMLSecurityConstants.Enc));
                 decryptionThread.setSymmetricCipher(symCipher);
 
-                Thread receiverThread = new Thread(decryptionThread);
-                receiverThread.setName("decrypting thread");
-
                 AbstractDecryptedEventReaderInputProcessor 
decryptedEventReaderInputProcessor = newDecryptedEventReaderInputProccessor(
                         encryptedHeader, comparableNamespaceList, 
comparableAttributeList, encryptedDataType, securityToken, 
inputProcessorChain.getSecurityContext()
                 );
@@ -285,14 +187,16 @@ public abstract class AbstractDecryptInp
 
                 
inputProcessorChain.getDocumentContext().setIsInEncryptedContent(inputProcessorChain.getProcessors().indexOf(decryptedEventReaderInputProcessor),
 decryptedEventReaderInputProcessor);
 
+                Thread thread = new Thread(decryptionThread);
+                thread.setName("decrypting thread");
                 //when an exception in the decryption thread occurs, we want 
to forward them:
-                
receiverThread.setUncaughtExceptionHandler(decryptedEventReaderInputProcessor);
+                
thread.setUncaughtExceptionHandler(decryptedEventReaderInputProcessor);
 
                 //we have to start the thread before we call 
decryptionThread.getPipedInputStream().
                 //Otherwise we will end in a deadlock, because the StAX reader 
expects already data.
                 //@See some lines below:
                 logger.debug("Starting decryption thread");
-                receiverThread.start();
+                thread.start();
 
                 inputProcessorChain.getDocumentContext().removePathElement();
 
@@ -303,11 +207,7 @@ public abstract class AbstractDecryptInp
                                 "UTF-8");
 
                 //forward to wrapper element
-                XMLEvent tmpXmlEvent;
-                do {
-                    tmpXmlEvent = xmlEventReader.nextEvent();
-                }
-                while (!(tmpXmlEvent.isStartElement() && 
tmpXmlEvent.asStartElement().getName().equals(wrapperElementName)));
+                forwardToWrapperElement(xmlEventReader);
 
                 
decryptedEventReaderInputProcessor.setXmlEventReader(xmlEventReader);
 
@@ -325,6 +225,135 @@ public abstract class AbstractDecryptInp
         return xmlEvent;
     }
 
+    private void forwardToWrapperElement(XMLEventReader xmlEventReader) throws 
XMLStreamException {
+        XMLEvent tmpXmlEvent;
+        do {
+            tmpXmlEvent = xmlEventReader.nextEvent();
+        }
+        while (!(tmpXmlEvent.isStartElement() && 
tmpXmlEvent.asStartElement().getName().equals(wrapperElementName)));
+    }
+
+    private Cipher getCipher(String algorithmURI) throws XMLSecurityException {
+        Cipher symCipher;
+        try {
+            AlgorithmType symEncAlgo = 
JCEAlgorithmMapper.getAlgorithmMapping(algorithmURI);
+            symCipher = Cipher.getInstance(symEncAlgo.getJCEName(), 
symEncAlgo.getJCEProvider());
+            //we have to defer the initialization of the cipher until we can 
extract the IV...
+        } catch (NoSuchAlgorithmException e) {
+            throw new XMLSecurityException(
+                    XMLSecurityException.ErrorCode.UNSUPPORTED_ALGORITHM, 
"unsupportedKeyTransp",
+                    e, "No such algorithm: " + algorithmURI
+            );
+        } catch (NoSuchPaddingException e) {
+            throw new XMLSecurityException(
+                    XMLSecurityException.ErrorCode.UNSUPPORTED_ALGORITHM, 
"unsupportedKeyTransp",
+                    e, "No such padding: " + algorithmURI
+            );
+        } catch (NoSuchProviderException e) {
+            throw new 
XMLSecurityException(XMLSecurityException.ErrorCode.FAILURE, "noSecProvider", 
e);
+        }
+        return symCipher;
+    }
+
+    private SecurityToken getSecurityToken(InputProcessorChain 
inputProcessorChain, EncryptedDataType encryptedDataType) throws 
XMLSecurityException {
+        KeyInfoType keyInfoType;
+        if (this.keyInfoType != null) {
+            keyInfoType = this.keyInfoType;
+        } else {
+            keyInfoType = encryptedDataType.getKeyInfo();
+        }
+
+        //retrieve the securityToken which must be used for decryption
+        return SecurityTokenFactory.getInstance().getSecurityToken(
+                keyInfoType, getSecurityProperties().getDecryptionCrypto(),
+                getSecurityProperties().getCallbackHandler(), 
inputProcessorChain.getSecurityContext());
+    }
+
+    private EncryptedDataType parseEncryptedDataStructure(boolean 
isSecurityHeaderEvent, XMLEvent xmlEvent, InputProcessorChain 
subInputProcessorChain) throws XMLStreamException, XMLSecurityException {
+        Deque<XMLEvent> xmlEvents = new LinkedList<XMLEvent>();
+        xmlEvents.push(xmlEvent);
+        XMLEvent encryptedDataXMLEvent;
+        int count = 0;
+        do {
+            subInputProcessorChain.reset();
+            if (isSecurityHeaderEvent) {
+                encryptedDataXMLEvent = 
subInputProcessorChain.processHeaderEvent();
+            } else {
+                encryptedDataXMLEvent = subInputProcessorChain.processEvent();
+            }
+
+            xmlEvents.push(encryptedDataXMLEvent);
+            if (++count >= 50) {
+                throw new 
XMLSecurityException(XMLSecurityException.ErrorCode.INVALID_SECURITY);
+            }
+        }
+        while (!(encryptedDataXMLEvent.isStartElement()
+                && 
encryptedDataXMLEvent.asStartElement().getName().equals(XMLSecurityConstants.TAG_xenc_CipherValue)));
+
+        
xmlEvents.push(XMLSecurityConstants.XMLEVENTFACTORY.createEndElement(XMLSecurityConstants.TAG_xenc_CipherValue,
 null));
+        
xmlEvents.push(XMLSecurityConstants.XMLEVENTFACTORY.createEndElement(XMLSecurityConstants.TAG_xenc_CipherData,
 null));
+        
xmlEvents.push(XMLSecurityConstants.XMLEVENTFACTORY.createEndElement(XMLSecurityConstants.TAG_xenc_EncryptedData,
 null));
+
+        EncryptedDataType encryptedDataType;
+
+        try {
+            Unmarshaller unmarshaller = 
XMLSecurityConstants.getJaxbUnmarshaller(getSecurityProperties().isDisableSchemaValidation());
+            JAXBElement<EncryptedDataType> encryptedDataTypeJAXBElement =
+                    (JAXBElement<EncryptedDataType>) 
unmarshaller.unmarshal(new XMLSecurityEventReader(xmlEvents, 0));
+            encryptedDataType = encryptedDataTypeJAXBElement.getValue();
+
+        } catch (JAXBException e) {
+            throw new 
XMLSecurityException(XMLSecurityException.ErrorCode.INVALID_SECURITY, e);
+        }
+        return encryptedDataType;
+    }
+
+    private XMLEvent getLastBufferedXMLEvent(InputProcessorChain 
inputProcessorChain) {
+        XMLEvent xmlEvent = tmpXmlEventList.pollLast();
+        if (xmlEvent.isStartElement()) {
+            
inputProcessorChain.getDocumentContext().addPathElement(xmlEvent.asStartElement().getName());
+        } else if (xmlEvent.isEndElement()) {
+            inputProcessorChain.getDocumentContext().removePathElement();
+        }
+        return xmlEvent;
+    }
+
+    private XMLEvent readAndBufferEncryptedHeader(InputProcessorChain 
inputProcessorChain, boolean isSecurityHeaderEvent, XMLEvent xmlEvent) throws 
XMLStreamException, XMLSecurityException {
+        InputProcessorChain subInputProcessorChain = 
inputProcessorChain.createSubChain(this);
+        do {
+            tmpXmlEventList.push(xmlEvent);
+
+            subInputProcessorChain.reset();
+            if (isSecurityHeaderEvent) {
+                xmlEvent = subInputProcessorChain.processHeaderEvent();
+            } else {
+                xmlEvent = subInputProcessorChain.processEvent();
+            }
+        }
+        while (!(xmlEvent.isStartElement() && 
xmlEvent.asStartElement().getName().equals(XMLSecurityConstants.TAG_xenc_EncryptedData)));
+
+        tmpXmlEventList.push(xmlEvent);
+        return xmlEvent;
+    }
+
+    private List<ComparableNamespace>[] getNamespacesInScope(XMLEvent 
xmlEvent, boolean encryptedHeader) {
+        XMLEventNS xmlEventNS = (XMLEventNS)xmlEvent;
+        if (encryptedHeader) {
+            return Arrays.copyOfRange(xmlEventNS.getNamespaceList(), 2, 
xmlEventNS.getNamespaceList().length);
+        } else {
+            return Arrays.copyOfRange(xmlEventNS.getNamespaceList(), 1, 
xmlEventNS.getNamespaceList().length);
+        }
+    }
+
+    private List<ComparableAttribute>[] getAttributesInScope(XMLEvent 
xmlEvent, boolean encryptedHeader) {
+        XMLEventNS xmlEventNS = (XMLEventNS)xmlEvent;
+        if (encryptedHeader) {
+            return Arrays.copyOfRange(xmlEventNS.getAttributeList(), 2, 
xmlEventNS.getNamespaceList().length);
+        } else {
+            return Arrays.copyOfRange(xmlEventNS.getAttributeList(), 1, 
xmlEventNS.getNamespaceList().length);
+        }
+    }
+
     protected abstract AbstractDecryptedEventReaderInputProcessor 
newDecryptedEventReaderInputProccessor(
             boolean encryptedHeader, List<ComparableNamespace>[] 
comparableNamespaceList,
             List<ComparableAttribute>[] comparableAttributeList, 
EncryptedDataType currentEncryptedDataType,
@@ -394,16 +423,16 @@ public abstract class AbstractDecryptInp
             super(securityProperties);
             getAfterProcessors().add(abstractDecryptInputProcessor);
             this.encryptionModifier = encryptionModifier;
-            rootElementProcessed = encryptionModifier != 
SecurePart.Modifier.Element;
+            this.rootElementProcessed = encryptionModifier != 
SecurePart.Modifier.Element;
             this.encryptedHeader = encryptedHeader;
             this.securityToken = securityToken;
             for (int i = 0; i < namespaceList.length; i++) {
                 List<ComparableNamespace> namespaces = namespaceList[i];
-                nsStack.push(namespaces);
+                this.nsStack.push(namespaces);
             }
             for (int i = 0; i < attributeList.length; i++) {
                 List<ComparableAttribute> attributes = attributeList[i];
-                attrStack.push(attributes);
+                this.attrStack.push(attributes);
             }
         }
 
@@ -534,9 +563,9 @@ public abstract class AbstractDecryptInp
 
             //prepare the piped streams and connect them:
             //5 * 8192 seems to be a fine value
-            pipedInputStream = new PipedInputStream(40960);
+            this.pipedInputStream = new PipedInputStream(40960);
             try {
-                pipedOutputStream = new PipedOutputStream(pipedInputStream);
+                this.pipedOutputStream = new 
PipedOutputStream(pipedInputStream);
             } catch (IOException e) {
                 throw new XMLStreamException(e);
             }
@@ -567,38 +596,7 @@ public abstract class AbstractDecryptInp
                         )
                 );
 
-                tempBufferedWriter.write('<');
-                tempBufferedWriter.write(wrapperElementName.getPrefix());
-                tempBufferedWriter.write(':');
-                tempBufferedWriter.write(wrapperElementName.getLocalPart());
-                tempBufferedWriter.write(' ');
-                tempBufferedWriter.write("xmlns:");
-                tempBufferedWriter.write(wrapperElementName.getPrefix());
-                tempBufferedWriter.write("=\"");
-                tempBufferedWriter.write(wrapperElementName.getNamespaceURI());
-                tempBufferedWriter.write('\"');
-
-                //apply all namespaces from current scope to get a valid 
documentfragment:
-                List<ComparableNamespace> comparableNamespacesToApply = new 
LinkedList<ComparableNamespace>();
-                List<ComparableNamespace>[] comparableNamespaceList = 
startXMLElement.getNamespaceList();
-                for (int i = 0; i < comparableNamespaceList.length; i++) {
-                    List<ComparableNamespace> comparableNamespaces = 
comparableNamespaceList[i];
-                    Iterator<ComparableNamespace> comparableNamespaceIterator 
= comparableNamespaces.iterator();
-                    while (comparableNamespaceIterator.hasNext()) {
-                        ComparableNamespace comparableNamespace = 
comparableNamespaceIterator.next();
-                        if 
(!comparableNamespacesToApply.contains(comparableNamespace)) {
-                            
comparableNamespacesToApply.add(comparableNamespace);
-                        }
-                    }
-                }
-                Iterator<ComparableNamespace> comparableNamespaceIterator = 
comparableNamespacesToApply.iterator();
-                while (comparableNamespaceIterator.hasNext()) {
-                    ComparableNamespace comparableNamespace = 
comparableNamespaceIterator.next();
-                    tempBufferedWriter.write(' ');
-                    tempBufferedWriter.write(comparableNamespace.toString());
-                }
-
-                tempBufferedWriter.write('>');
+                writeWrapperStartElement(tempBufferedWriter);
                 //calling flush after every piece to prevent data salad...
                 tempBufferedWriter.flush();
 
@@ -657,14 +655,7 @@ public abstract class AbstractDecryptInp
 
                 //close to get Cipher.doFinal() called
                 decryptOutputStream.close();
-
-                //close the dummy wrapper element:
-                tempBufferedWriter.write("</");
-                tempBufferedWriter.write(wrapperElementName.getPrefix());
-                tempBufferedWriter.write(':');
-                tempBufferedWriter.write(wrapperElementName.getLocalPart());
-                tempBufferedWriter.write('>');
-                //real close of the stream
+                writeWrapperEndElement(tempBufferedWriter);
                 tempBufferedWriter.close();
 
                 logger.debug("Decryption thread finished");
@@ -674,6 +665,51 @@ public abstract class AbstractDecryptInp
             }
         }
 
+        private void writeWrapperStartElement(BufferedWriter 
tempBufferedWriter) throws IOException {
+            tempBufferedWriter.write('<');
+            tempBufferedWriter.write(wrapperElementName.getPrefix());
+            tempBufferedWriter.write(':');
+            tempBufferedWriter.write(wrapperElementName.getLocalPart());
+            tempBufferedWriter.write(' ');
+            tempBufferedWriter.write("xmlns:");
+            tempBufferedWriter.write(wrapperElementName.getPrefix());
+            tempBufferedWriter.write("=\"");
+            tempBufferedWriter.write(wrapperElementName.getNamespaceURI());
+            tempBufferedWriter.write('\"');
+
+            //apply all namespaces from current scope to get a valid 
documentfragment:
+            List<ComparableNamespace> comparableNamespacesToApply = new 
LinkedList<ComparableNamespace>();
+            List<ComparableNamespace>[] comparableNamespaceList = 
startXMLElement.getNamespaceList();
+            for (int i = 0; i < comparableNamespaceList.length; i++) {
+                List<ComparableNamespace> comparableNamespaces = 
comparableNamespaceList[i];
+                Iterator<ComparableNamespace> comparableNamespaceIterator = 
comparableNamespaces.iterator();
+                while (comparableNamespaceIterator.hasNext()) {
+                    ComparableNamespace comparableNamespace = 
comparableNamespaceIterator.next();
+                    if 
(!comparableNamespacesToApply.contains(comparableNamespace)) {
+                        comparableNamespacesToApply.add(comparableNamespace);
+                    }
+                }
+            }
+            Iterator<ComparableNamespace> comparableNamespaceIterator = 
comparableNamespacesToApply.iterator();
+            while (comparableNamespaceIterator.hasNext()) {
+                ComparableNamespace comparableNamespace = 
comparableNamespaceIterator.next();
+                tempBufferedWriter.write(' ');
+                tempBufferedWriter.write(comparableNamespace.toString());
+            }
+
+            tempBufferedWriter.write('>');
+        }
+
+        private void writeWrapperEndElement(BufferedWriter tempBufferedWriter) 
throws IOException {
+            //close the dummy wrapper element:
+            tempBufferedWriter.write("</");
+            tempBufferedWriter.write(wrapperElementName.getPrefix());
+            tempBufferedWriter.write(':');
+            tempBufferedWriter.write(wrapperElementName.getLocalPart());
+            tempBufferedWriter.write('>');
+            //real close of the stream
+        }
+
         protected Cipher getSymmetricCipher() {
             return symmetricCipher;
         }


Reply via email to