You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by di...@apache.org on 2005/12/19 05:10:16 UTC

svn commit: r357625 - in /webservices/axis/trunk/java/src/org/apache/axis: encoding/ser/BeanDeserializer.java utils/StringUtils.java

Author: dims
Date: Sun Dec 18 20:10:11 2005
New Revision: 357625

URL: http://svn.apache.org/viewcvs?rev=357625&view=rev
Log:
Fix for http://issues.apache.org/jira/browse/AXIS-2346 (Issue with the way the localNames are created in WSDL2Java)


Modified:
    webservices/axis/trunk/java/src/org/apache/axis/encoding/ser/BeanDeserializer.java
    webservices/axis/trunk/java/src/org/apache/axis/utils/StringUtils.java

Modified: webservices/axis/trunk/java/src/org/apache/axis/encoding/ser/BeanDeserializer.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/src/org/apache/axis/encoding/ser/BeanDeserializer.java?rev=357625&r1=357624&r2=357625&view=diff
==============================================================================
--- webservices/axis/trunk/java/src/org/apache/axis/encoding/ser/BeanDeserializer.java (original)
+++ webservices/axis/trunk/java/src/org/apache/axis/encoding/ser/BeanDeserializer.java Sun Dec 18 20:10:11 2005
@@ -32,6 +32,7 @@
 import org.apache.axis.soap.SOAPConstants;
 import org.apache.axis.utils.BeanPropertyDescriptor;
 import org.apache.axis.utils.Messages;
+import org.apache.axis.utils.StringUtils;
 import org.apache.commons.logging.Log;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
@@ -209,6 +210,12 @@
         if (propDesc == null) {
             // look for a field by this name.
             propDesc = (BeanPropertyDescriptor) propertyMap.get(localName);
+            if (propDesc == null) {
+                String malformedLocalName = StringUtils.makeQNameToMatchLocalName(localName);
+                if (malformedLocalName != null) {
+                    propDesc = (BeanPropertyDescriptor) propertyMap.get(malformedLocalName);
+                }
+            }
         }
 
         // try and see if this is an xsd:any namespace="##any" element before

Modified: webservices/axis/trunk/java/src/org/apache/axis/utils/StringUtils.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/src/org/apache/axis/utils/StringUtils.java?rev=357625&r1=357624&r2=357625&view=diff
==============================================================================
--- webservices/axis/trunk/java/src/org/apache/axis/utils/StringUtils.java (original)
+++ webservices/axis/trunk/java/src/org/apache/axis/utils/StringUtils.java Sun Dec 18 20:10:11 2005
@@ -357,6 +357,222 @@
         }
     }
 
+	/**
+     * <p>This method provides a way to convert the a QName to local name. This need
+     * to be done is because Axis 1.x follow the java naming convetation for local name
+     * rather then xml naming convenation for the local name. </p>
+     *
+     * <p>A <code>null</code> input String returns <code>null</code>.</p>
+     *
+     * <pre>
+ 	 *	makeQNameToMatchLocalName("Foo.bar")  = fooBar
+	 *	makeQNameToMatchLocalName("Foo.Bar")  = fooBar
+	 *	makeQNameToMatchLocalName("FooBar")   = fooBar
+	 *	makeQNameToMatchLocalName("Foobar")   = fooBar
+	 *	makeQNameToMatchLocalName("fooBar")   = fooBar
+	 *	makeQNameToMatchLocalName("foobar")   = foobar
+	 *	makeQNameToMatchLocalName("Foo:bar")  = fooBar
+	 *	makeQNameToMatchLocalName("Foo-Bar")  = fooBar
+	 *	makeQNameToMatchLocalName("Foo-bar")  = fooBar
+	 *	makeQNameToMatchLocalName("Foo_bar")  = foo_bar
+	 *	makeQNameToMatchLocalName("Foo_Bar")  = foo_Bar
+	 * 	makeQNameToMatchLocalName("foo:bar")  = fooBar
+     * </pre>
+     *
+     * @param str  the String to parse, may be null
+     *  <code>null</code> splits on whitespace
+     * @return an array of parsed Strings, <code>null</code> if null String input
+     *
+     * <code>return null</code> if null passed. 
+     * @return String the java naming compliante name
+     */
+	public static String makeQNameToMatchLocalName(String str){
+    	
+    	if(str == null){
+    		return null;
+    	}
+    	
+    	StringBuffer sb = new StringBuffer(str);
+    	
+    	char firstChar = sb.charAt(0);
+    	
+    	if(Character.isUpperCase(firstChar)){
+    		sb.setCharAt(0,Character.toLowerCase(firstChar));    		
+    	}
+    	int iIndex = str.indexOf('.');
+    	
+    	if(iIndex == 0){
+			sb.deleteCharAt(0);
+			
+			if(sb.length() > 0){
+	    		iIndex = sb.toString().indexOf(':');
+	    		if(iIndex == 0){    			
+		    		str = makeQNameToMatchLocalName(sb.toString()); 
+		    		sb.delete(0,sb.length());
+		    		sb.append(str);    			
+	    		}    			
+	    	}
+
+			if(sb.length() > 0){
+	    		iIndex = sb.toString().indexOf('-');
+	    		if(iIndex == 0){    			
+		    		str = makeQNameToMatchLocalName(sb.toString()); 
+		    		sb.delete(0,sb.length());
+		    		sb.append(str);    			
+	    		}    			
+			}
+    	}else if(iIndex > 0){    		
+	    		str = deleteCharAndChangeNextCharToUpperCase(sb.toString(),".");
+	    		sb.delete(0,sb.length());
+	    		sb.append(str);	    		
+    	}
+    	
+    	iIndex = str.indexOf(':');
+    	if(iIndex == 0){
+			sb.deleteCharAt(0);
+    		
+			if(sb.length() > 0){
+				iIndex = sb.toString().indexOf('.');
+	    		if(iIndex == 0){    			
+		    		str = makeQNameToMatchLocalName(sb.toString());	    		
+		    		sb.delete(0,sb.length());
+		    		sb.append(str);    			
+	    		}
+			}
+    		
+			if(sb.length() > 0){
+	    		iIndex = sb.toString().indexOf('-');
+	    		if(iIndex == 0){    			
+		    		str = makeQNameToMatchLocalName(sb.toString()); 
+		    		sb.delete(0,sb.length());
+		    		sb.append(str);    				    		
+	    		}    			
+			}
+        		
+    	}else if(iIndex > 0){
+    		str = deleteCharAndChangeNextCharToUpperCase(sb.toString(),":");
+    		sb.delete(0,sb.length());
+    		sb.append(str);    		
+    	}
+    	
+    	iIndex = str.indexOf('-');
+    	if(iIndex == 0){
+			sb.deleteCharAt(0);
+
+			if(sb.length() > 0){
+				iIndex = sb.toString().indexOf('.');
+	    		if(iIndex == 0){    			
+		    		str = makeQNameToMatchLocalName(sb.toString()); 
+		    		sb.delete(0,sb.length());
+		    		sb.append(str);    			
+	    		}
+			}
+			
+			if(sb.length() > 0){
+	    		iIndex = sb.toString().indexOf(':');
+	    		if(iIndex == 0){    			
+		    		str = makeQNameToMatchLocalName(sb.toString()); 
+		    		sb.delete(0,sb.length());
+		    		sb.append(str);	    		
+	    		}    			
+			}
+    	}else if(iIndex > 0){
+    		str = deleteCharAndChangeNextCharToUpperCase(sb.toString(),"-");
+    		sb.delete(0,sb.length());
+    		sb.append(str);    		
+    	}
+    
+    	if(sb.length() > 0){
+	    	firstChar = sb.charAt(0);
+	    	
+	    	if(Character.isUpperCase(firstChar)){
+	    		sb.setCharAt(0,Character.toLowerCase(firstChar));    		
+	    	}
+    	}
+    	
+    	return StringUtils.isEmpty(sb.toString())?null:sb.toString();
+    }
+	
+     /**
+     * <p>This method provided a way to delete the given string and change the
+     * following first character to capital letter, this is provided because 
+     * Axis 1.x follow the java naming convenation rather then xml naming convention
+     * for there local name.</p>
+     *
+     *
+     * <p>A <code>null</code> input String returns <code>null</code>.</p>
+     *
+     * <pre>
+     * 	deleteCharAndChangeNextCharToUpperCase("Foo.bar") = fooBar
+     *  deleteCharAndChangeNextCharToUpperCase("Foo.Bar") = fooBar
+     *  deleteCharAndChangeNextCharToUpperCase("Foo:bar") = fooBar
+     *  deleteCharAndChangeNextCharToUpperCase("Foo-Bar") = fooBar
+     * 	deleteCharAndChangeNextCharToUpperCase("Foo-bar") = fooBar
+     * 	deleteCharAndChangeNextCharToUpperCase("Foo_bar") = foo_bar
+     * 	deleteCharAndChangeNextCharToUpperCase("Foo_Bar") = foo_Bar
+     * 	deleteCharAndChangeNextCharToUpperCase("Foo_bar") = foo_bar
+     * 	deleteCharAndChangeNextCharToUpperCase("foo:bar") = fooBar
+     * </pre>
+     *
+     * @param psWord the String to be changed
+     * <code>return null</code> if null passed. 
+     * @param psReplace the String that need to be eliminated, 
+     * <code>return null or psWord if psWord is not null</code>
+     *  if null passed.
+     * @return String the java naming compliant name
+     */
+    public static String deleteCharAndChangeNextCharToUpperCase(String psWord, String psReplace) {
+
+    	if(psWord == null){
+    		return null;
+    	}
+    	
+    	if(psReplace == null && psWord == null){
+    		return null;
+    	}
+    	
+    	if(psReplace == null && psWord != null){
+    		return psWord;
+    	}
+    	
+    	StringBuffer lsNewStr = new StringBuffer();
+        
+        int liFound = 0;
+        int liLastPointer = 0;
+        boolean skipNextChar = false;
+
+        do {
+            liFound = psWord.indexOf(psReplace, liLastPointer);
+            if (liFound < 0){
+            	if(!skipNextChar){
+            		lsNewStr.append(psWord
+            				.substring(liLastPointer, psWord.length()));            		
+            	}else{
+            		lsNewStr.append(psWord
+            				.substring(liLastPointer + 1, psWord.length()));
+            		skipNextChar = false;
+            	}
+            }
+            else {
+            	char nextChar = 0;
+            	if((liFound + psReplace.length()) < psWord.length()){
+            		nextChar = psWord.charAt(liFound + psReplace.length());            		
+            	}
+                if (liFound > liLastPointer && nextChar > 0){
+                    lsNewStr.append(psWord.substring(liLastPointer, (liFound)));
+                    if(!Character.isUpperCase(nextChar)){
+                    	lsNewStr.append(Character.toUpperCase(nextChar));
+                    }else{
+                    	lsNewStr.append(nextChar);
+                    }
+                }                
+                liLastPointer = liFound + psReplace.length();
+                skipNextChar = true;
+            }
+        } while (liFound > -1);
+
+        return lsNewStr.toString();    
+    }  
     /**
      * <p>Unescapes numeric character referencs found in the <code>String</code>.</p>
      *