Author: davidillsley
Date: Thu Oct 11 05:10:11 2007
New Revision: 583791

URL: http://svn.apache.org/viewvc?rev=583791&view=rev
Log:
Perf improvements using boolean[] with flags rather than
arrayList.contains()

Modified:
    
webservices/axis2/trunk/java/modules/addressing/src/org/apache/axis2/handlers/addressing/AddressingFinalInHandler.java
    
webservices/axis2/trunk/java/modules/addressing/src/org/apache/axis2/handlers/addressing/AddressingInHandler.java
    
webservices/axis2/trunk/java/modules/addressing/src/org/apache/axis2/handlers/addressing/AddressingSubmissionInHandler.java

Modified: 
webservices/axis2/trunk/java/modules/addressing/src/org/apache/axis2/handlers/addressing/AddressingFinalInHandler.java
URL: 
http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/addressing/src/org/apache/axis2/handlers/addressing/AddressingFinalInHandler.java?rev=583791&r1=583790&r2=583791&view=diff
==============================================================================
--- 
webservices/axis2/trunk/java/modules/addressing/src/org/apache/axis2/handlers/addressing/AddressingFinalInHandler.java
 (original)
+++ 
webservices/axis2/trunk/java/modules/addressing/src/org/apache/axis2/handlers/addressing/AddressingFinalInHandler.java
 Thu Oct 11 05:10:11 2007
@@ -65,46 +65,36 @@
     }
 
     /** @see AddressingValidationHandler#checkMessageIDHeader */
-    protected void checkForMandatoryHeaders(ArrayList alreadyFoundAddrHeader,
+    protected void checkForMandatoryHeaders(boolean[] alreadyFoundAddrHeader,
                                             MessageContext messageContext) 
throws AxisFault {
         //Unable to validate the wsa:MessageID header here as we do not yet 
know which MEP
         //is in effect.
 
-        if (!alreadyFoundAddrHeader.contains(WSA_ACTION)) {
+        if (!alreadyFoundAddrHeader[ACTION_FLAG]) {
             AddressingFaultsHelper
                     .triggerMessageAddressingRequiredFault(messageContext, 
WSA_ACTION);
         }
     }
 
-    protected void setDefaults(ArrayList alreadyFoundAddrHeader, 
MessageContext messageContext) {
+    protected void setDefaults(boolean[] alreadyFoundAddrHeader, 
MessageContext messageContext) {
         //According to the WS-Addressing spec, we should default the wsa:To 
header to the
         //anonymous URI. Doing that, however, might prevent a different value 
from being
         //used instead, such as the transport URL. Therefore, we only apply 
the default
         //on the inbound response side of a synchronous request-response 
exchange.
-        if (!alreadyFoundAddrHeader.contains(WSA_TO) && 
!messageContext.isServerSide()) {
-            Options messageContextOptions = messageContext.getOptions();
+        if (!alreadyFoundAddrHeader[TO_FLAG] && 
!messageContext.isServerSide()) {
             if (log.isTraceEnabled()) {
                 log.trace(messageContext.getLogIDString() +
                         " setDefaults: Setting WS-Addressing default value for 
the To property.");
             }
-            messageContextOptions.setTo(new 
EndpointReference(Final.WSA_ANONYMOUS_URL));
+            messageContext.setTo(new 
EndpointReference(Final.WSA_ANONYMOUS_URL));
         }
 
-        if (!alreadyFoundAddrHeader.contains(WSA_REPLY_TO)) {
-            Options messageContextOptions = messageContext.getOptions();
-            EndpointReference epr = messageContextOptions.getReplyTo();
-
-            if (epr == null) {
-                epr = new EndpointReference("");
-                messageContextOptions.setReplyTo(epr);
-            }
-
+        if (!alreadyFoundAddrHeader[REPLYTO_FLAG]) {
+               messageContext.setReplyTo(new 
EndpointReference(Final.WSA_ANONYMOUS_URL));
             if (log.isTraceEnabled()) {
                 log.trace(messageContext.getLogIDString() +
                         " setDefaults: Setting WS-Addressing default value for 
the ReplyTo property.");
             }
-
-            epr.setAddress(Final.WSA_ANONYMOUS_URL);
         }
     }
 }

Modified: 
webservices/axis2/trunk/java/modules/addressing/src/org/apache/axis2/handlers/addressing/AddressingInHandler.java
URL: 
http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/addressing/src/org/apache/axis2/handlers/addressing/AddressingInHandler.java?rev=583791&r1=583790&r2=583791&view=diff
==============================================================================
--- 
webservices/axis2/trunk/java/modules/addressing/src/org/apache/axis2/handlers/addressing/AddressingInHandler.java
 (original)
+++ 
webservices/axis2/trunk/java/modules/addressing/src/org/apache/axis2/handlers/addressing/AddressingInHandler.java
 Thu Oct 11 05:10:11 2007
@@ -121,85 +121,100 @@
 
         return InvocationResponse.CONTINUE;
     }
-
+    
+    protected static final int TO_FLAG = 1, FROM_FLAG = 2, REPLYTO_FLAG = 3,
+       FAULTO_FLAG = 4, MESSAGEID_FLAG = 6, ACTION_FLAG = 0;
     protected Options extractAddressingInformation(SOAPHeader header, 
MessageContext messageContext,
                                                    ArrayList 
addressingHeaders, String namespace)
             throws AxisFault {
 
         Options messageContextOptions = messageContext.getOptions();
+      
+        ArrayList duplicateHeaderNames = new ArrayList(1); // Normally will 
not be used for more than 1 header
 
-        ArrayList checkedHeaderNames = new ArrayList(7); // Up to 7 header 
names to be recorded
-        ArrayList duplicateHeaderNames =
-                new ArrayList(1); // Normally will not be used for more than 1 
header
-
-        // Per the SOAP Binding spec "headers with an incorrect cardinality 
MUST NOT be used" So
-        // these variables are used to keep track of invalid cardinality 
headers so they are not
-        // deserialised.
-        boolean ignoreTo = false, ignoreFrom = false, ignoreReplyTo = false, 
ignoreFaultTo =
-                false, ignoreMessageID = false, ignoreAction = false;
-
+        ArrayList relatesToHeaders = null;
+        SOAPHeaderBlock actionBlock = null, toBlock = null, messageIDBlock = 
null, replyToBlock = null, faultToBlock = null, fromBlock = null;
+        
+        // Per the SOAP Binding spec "headers with an incorrect cardinality 
MUST NOT be used" So these variables
+        // are used to keep track of invalid cardinality headers so they are 
not deserialised.
+        boolean[] ignoreHeaders = new boolean[7];
+        boolean[] checkedHeaderNames = new boolean[7];
+        
         // First pass just check for duplicates
-        Iterator addressingHeadersIt = addressingHeaders.iterator();
-        while (addressingHeadersIt.hasNext()) {
-            SOAPHeaderBlock soapHeaderBlock = 
(SOAPHeaderBlock)addressingHeadersIt.next();
-            // TODO - Don't do role processing here!
-            if 
(!SOAP12Constants.SOAP_ROLE_NONE.equals(soapHeaderBlock.getRole())) {
-               String localName = soapHeaderBlock.getLocalName();
-               if (WSA_ACTION.equals(localName)) {
-                    ignoreAction = checkDuplicateHeaders(WSA_ACTION, 
checkedHeaderNames,
-                                                         duplicateHeaderNames);
-                } else if (WSA_TO.equals(localName)) {
-                    ignoreTo =
-                            checkDuplicateHeaders(WSA_TO, checkedHeaderNames, 
duplicateHeaderNames);
-                } else if (WSA_MESSAGE_ID.equals(localName)) {
-                    ignoreMessageID = checkDuplicateHeaders(WSA_MESSAGE_ID, 
checkedHeaderNames,
-                                                            
duplicateHeaderNames);
-                } else if (WSA_REPLY_TO.equals(localName)) {
-                    ignoreReplyTo = checkDuplicateHeaders(WSA_REPLY_TO, 
checkedHeaderNames,
-                                                          
duplicateHeaderNames);
-                } else if (WSA_FAULT_TO.equals(localName)) {
-                    ignoreFaultTo = checkDuplicateHeaders(WSA_FAULT_TO, 
checkedHeaderNames,
-                                                          
duplicateHeaderNames);
-                } else if (WSA_FROM.equals(localName)) {
-                    ignoreFrom = checkDuplicateHeaders(WSA_FROM, 
checkedHeaderNames,
-                                                       duplicateHeaderNames);
-                }
-            }
-        }
-
-        // Now extract information
-        Iterator addressingHeadersIt2 = addressingHeaders.iterator();
-        while (addressingHeadersIt2.hasNext()) {
-            SOAPHeaderBlock soapHeaderBlock = 
(SOAPHeaderBlock)addressingHeadersIt2.next();
-            if 
(!SOAP12Constants.SOAP_ROLE_NONE.equals(soapHeaderBlock.getRole())) {
-               String localName = soapHeaderBlock.getLocalName();
-                if (WSA_ACTION.equals(localName) && !ignoreAction) {
-                    extractActionInformation(soapHeaderBlock, messageContext);
-                } else if (WSA_TO.equals(localName) && !ignoreTo) {
-                    extractToEPRInformation(soapHeaderBlock, 
messageContextOptions, header,
-                                            namespace);
-                } else
-                if (WSA_MESSAGE_ID.equals(localName) && !ignoreMessageID) {
-                    extractMessageIDInformation(soapHeaderBlock, 
messageContext);
-                } else if (WSA_REPLY_TO.equals(localName) && !ignoreReplyTo) {
-                    extractReplyToEPRInformation(soapHeaderBlock, namespace, 
messageContext);
-                } else if (WSA_FAULT_TO.equals(localName) && !ignoreFaultTo) {
-                    extractFaultToEPRInformation(soapHeaderBlock, namespace, 
messageContext);
-                } else if (WSA_RELATES_TO.equals(localName)) {
-                    extractRelatesToInformation(soapHeaderBlock, 
messageContextOptions);
-                } else if (WSA_FROM.equals(localName) && !ignoreFrom) {
-                    extractFromEPRInformation(soapHeaderBlock, namespace, 
messageContext);
-                }
-            }
+        for(int i=0;i<addressingHeaders.size();i++){
+               SOAPHeaderBlock soapHeaderBlock = (SOAPHeaderBlock) 
addressingHeaders.get(i);
+               if (messageContext.isSOAP11() || 
!SOAP12Constants.SOAP_ROLE_NONE.equals(soapHeaderBlock.getRole())) {
+                       String localName = soapHeaderBlock.getLocalName();
+                       if (WSA_ACTION.equals(localName)) {
+                               actionBlock = soapHeaderBlock;
+                               checkDuplicateHeaders(WSA_ACTION, ACTION_FLAG,
+                                               checkedHeaderNames, 
ignoreHeaders,
+                                               duplicateHeaderNames);
+                       } else if (WSA_TO.equals(localName)) {
+                               toBlock = soapHeaderBlock;
+                               checkDuplicateHeaders(WSA_TO, TO_FLAG, 
checkedHeaderNames, ignoreHeaders, duplicateHeaderNames);
+                       } else if (WSA_MESSAGE_ID.equals(localName)) {
+                               messageIDBlock = soapHeaderBlock;
+                               checkDuplicateHeaders(WSA_MESSAGE_ID, 
MESSAGEID_FLAG, 
+                                               checkedHeaderNames, 
ignoreHeaders,
+                                               duplicateHeaderNames);
+                       } else if (WSA_REPLY_TO.equals(localName)) {
+                               replyToBlock = soapHeaderBlock;
+                               checkDuplicateHeaders(WSA_REPLY_TO, 
REPLYTO_FLAG,
+                                               checkedHeaderNames, 
ignoreHeaders,
+                                               duplicateHeaderNames);
+                       } else if (WSA_FAULT_TO.equals(localName)) {
+                               faultToBlock = soapHeaderBlock;
+                               checkDuplicateHeaders(WSA_FAULT_TO,FAULTO_FLAG,
+                                               checkedHeaderNames, 
ignoreHeaders,
+                                               duplicateHeaderNames);
+                       } else if (WSA_FROM.equals(localName)) {
+                               fromBlock = soapHeaderBlock;
+                               checkDuplicateHeaders(WSA_FROM,FROM_FLAG,
+                                               checkedHeaderNames, 
ignoreHeaders,
+                                               duplicateHeaderNames);
+                       } else if(WSA_RELATES_TO.equals(localName)){
+                               if(relatesToHeaders == null){
+                                       relatesToHeaders = new ArrayList(1);
+                               }
+                               relatesToHeaders.add(soapHeaderBlock);
+                       }
+               }
         }
 
+        if (actionBlock!=null && !ignoreHeaders[ACTION_FLAG]) {
+            extractActionInformation(actionBlock, messageContext);
+        }
+        if (toBlock != null &&!ignoreHeaders[TO_FLAG]) {
+            extractToEPRInformation(toBlock,
+                                    messageContextOptions,
+                                    header,
+                                    namespace);
+        } 
+        if (messageIDBlock!=null && !ignoreHeaders[MESSAGEID_FLAG]) {
+            extractMessageIDInformation(messageIDBlock, messageContext);
+        } 
+        if (relatesToHeaders!=null) {
+               for(int i=0;i<relatesToHeaders.size();i++){
+                       
extractRelatesToInformation((SOAPHeaderBlock)relatesToHeaders.get(i), 
messageContextOptions);
+               }
+        } 
+        if (replyToBlock!=null && !ignoreHeaders[REPLYTO_FLAG]) {
+            extractReplyToEPRInformation(replyToBlock, namespace, 
messageContext);
+        }
+        if (faultToBlock!=null && !ignoreHeaders[FAULTO_FLAG]) {
+            extractFaultToEPRInformation(faultToBlock, namespace, 
messageContext);
+        }
+        if (fromBlock!=null && !ignoreHeaders[FROM_FLAG]) {
+            extractFromEPRInformation(fromBlock, namespace, messageContext);
+        }
+        
         // Now that all the valid wsa headers have been read, throw an 
exception if there was an invalid cardinality
         // This means that if for example there are multiple MessageIDs and a 
FaultTo, the FaultTo will be respected.
         if (!duplicateHeaderNames.isEmpty()) {
             // Simply choose the first problem header we came across as we can 
only fault for one of them.
             
AddressingFaultsHelper.triggerInvalidCardinalityFault(messageContext,
-                                                                  
(String)duplicateHeaderNames
-                                                                          
.get(0));
+                                                                  (String) 
duplicateHeaderNames.get(0));
         }
 
         // check for the presence of madatory addressing headers
@@ -211,31 +226,31 @@
         return messageContextOptions;
     }
 
-    protected abstract void checkForMandatoryHeaders(ArrayList 
alreadyFoundAddrHeader,
-                                                     MessageContext 
messageContext)
-            throws AxisFault;
-
-    protected abstract void setDefaults(ArrayList alreadyFoundAddrHeader,
-                                        MessageContext messageContext) throws 
AxisFault;
-
-    private boolean checkDuplicateHeaders(String addressingHeaderName, 
ArrayList checkedHeaderNames,
-                                          ArrayList duplicateHeaderNames) 
{//throws AxisFault {
-        // If the header name has been seen before then we should return true 
and add it to the list
-        // of duplicate header names. Otherwise it is the first time we've 
seen the header so add it
-        // to the checked liat and return false.
-        boolean shouldIgnore = 
checkedHeaderNames.contains(addressingHeaderName);
-        if (shouldIgnore) {
-            duplicateHeaderNames.add(addressingHeaderName);
-        } else {
-            checkedHeaderNames.add(addressingHeaderName);
-        }
-
-        if (log.isTraceEnabled()) {
-            log.trace("checkDuplicateHeaders: addressingHeaderName=" + 
addressingHeaderName +
-                    " isDuplicate=" + shouldIgnore);
-        }
-
-        return shouldIgnore;
+    protected abstract void checkForMandatoryHeaders(boolean[] 
alreadyFoundAddrHeader,
+               MessageContext messageContext)
+    throws AxisFault;
+
+    protected abstract void setDefaults(boolean[] alreadyFoundAddrHeader,
+               MessageContext messageContext) throws AxisFault;
+
+
+    private void checkDuplicateHeaders(String addressingHeaderName, int 
headerFlag,
+               boolean[] checkedHeaderNames, boolean[] ignoreHeaders,
+               ArrayList duplicateHeaderNames) {//throws AxisFault {
+       // If the header name has been seen before then we should return true 
and add it to the list
+       // of duplicate header names. Otherwise it is the first time we've seen 
the header so add it
+       // to the checked liat and return false. 
+       ignoreHeaders[headerFlag] = checkedHeaderNames[headerFlag];
+       if (ignoreHeaders[headerFlag]) {
+               duplicateHeaderNames.add(addressingHeaderName);
+       } else {
+               checkedHeaderNames[headerFlag] = true;
+       }
+
+       if (LoggingControl.debugLoggingAllowed && log.isTraceEnabled()) {
+               log.trace("checkDuplicateHeaders: addressingHeaderName=" + 
addressingHeaderName
+                               + " isDuplicate=" + ignoreHeaders[headerFlag]);
+       }
     }
 
     protected abstract void extractToEprReferenceParameters(EndpointReference 
toEPR,

Modified: 
webservices/axis2/trunk/java/modules/addressing/src/org/apache/axis2/handlers/addressing/AddressingSubmissionInHandler.java
URL: 
http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/addressing/src/org/apache/axis2/handlers/addressing/AddressingSubmissionInHandler.java?rev=583791&r1=583790&r2=583791&view=diff
==============================================================================
--- 
webservices/axis2/trunk/java/modules/addressing/src/org/apache/axis2/handlers/addressing/AddressingSubmissionInHandler.java
 (original)
+++ 
webservices/axis2/trunk/java/modules/addressing/src/org/apache/axis2/handlers/addressing/AddressingSubmissionInHandler.java
 Thu Oct 11 05:10:11 2007
@@ -48,46 +48,37 @@
         // TODO : Chinthaka
     }
 
-    protected void checkForMandatoryHeaders(ArrayList alreadyFoundAddrHeader,
+    protected void checkForMandatoryHeaders(boolean[] alreadyFoundAddrHeader,
                                             MessageContext messageContext) 
throws AxisFault {
-        if (!alreadyFoundAddrHeader.contains(WSA_TO)) {
+        if (!alreadyFoundAddrHeader[TO_FLAG]) {
             
AddressingFaultsHelper.triggerMessageAddressingRequiredFault(messageContext, 
WSA_TO);
         }
 
-        if (!alreadyFoundAddrHeader.contains(WSA_ACTION)) {
+        if (!alreadyFoundAddrHeader[ACTION_FLAG]) {
             AddressingFaultsHelper
                     .triggerMessageAddressingRequiredFault(messageContext, 
WSA_ACTION);
         }
 
-        if (alreadyFoundAddrHeader.contains(WSA_REPLY_TO) ||
-                alreadyFoundAddrHeader.contains(WSA_FAULT_TO)) {
+        if (alreadyFoundAddrHeader[REPLYTO_FLAG] ||
+                alreadyFoundAddrHeader[FAULTO_FLAG]) {
 
-            if (!alreadyFoundAddrHeader.contains(WSA_MESSAGE_ID)) {
+            if (!alreadyFoundAddrHeader[MESSAGEID_FLAG]) {
                 AddressingFaultsHelper
                         .triggerMessageAddressingRequiredFault(messageContext, 
WSA_MESSAGE_ID);
             }
         }
     }
 
-    protected void setDefaults(ArrayList alreadyFoundAddrHeader, 
MessageContext messageContext) {
+    protected void setDefaults(boolean[] alreadyFoundAddrHeader, 
MessageContext messageContext) {
         //The none URI is not defined in the 2004/08 spec, but it is used here 
anyway
         //as a flag to indicate the correct semantics to apply, i.e. in the 
2004/08 spec
         //the absence of a ReplyTo header indicates that a response is NOT 
required.
-        if (!alreadyFoundAddrHeader.contains(WSA_REPLY_TO)) {
-            Options messageContextOptions = messageContext.getOptions();
-            EndpointReference epr = messageContextOptions.getReplyTo();
-
-            if (epr == null) {
-                epr = new EndpointReference("");
-                messageContextOptions.setReplyTo(epr);
-            }
-
+        if (!alreadyFoundAddrHeader[REPLYTO_FLAG]) {
+               messageContext.setReplyTo(new 
EndpointReference(Final.WSA_NONE_URI));
             if (log.isTraceEnabled()) {
                 log.trace(
                         "setDefaults: Setting WS-Addressing default value for 
the ReplyTo property.");
             }
-
-            epr.setAddress(Final.WSA_NONE_URI);
         }
     }
 }



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

Reply via email to