Fix for Bug 404305 - DBWS DDLParser: args from different package results extra procedure type being generated ()
diff --git a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/metadata/PLSQLCursorType.java b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/metadata/PLSQLCursorType.java
index d4bc4da..ac8d862 100644
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/metadata/PLSQLCursorType.java
+++ b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/metadata/PLSQLCursorType.java
@@ -19,6 +19,7 @@
 

     static final String REF_CURSOR = "REF CURSOR";

     protected String cursorName;

+    protected PLSQLPackageType parentType;

 

     public PLSQLCursorType(String cursorName) {

 		super(null);

@@ -41,7 +42,15 @@
 		return enclosedType == null;

 	}

 

-	public boolean isResolved() {

+    public PLSQLPackageType getParentType() {

+        return parentType;

+    }

+    

+    public void setParentType(PLSQLPackageType parentType) {

+        this.parentType = parentType;

+    }

+    

+    public boolean isResolved() {

         // if the dataType is unresolved, then this PLSQLCursor is a weakly-typed REF CURSOR

 		if (enclosedType == null) {

 			return false;

diff --git a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.java b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.java
index 5f9aa44..feeaa56 100644
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.java
+++ b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.java
@@ -2954,6 +2954,7 @@
     jj_consume_token(K_REF);

     jj_consume_token(R_CURSOR);

         cursorType = new PLSQLCursorType(cursorTypeName);

+        cursorType.setParentType(packageType);

         packageType.addCursor(cursorType);

         localTypes.put(cursorTypeName, cursorType);

     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {

@@ -3763,13 +3764,13 @@
     return false;

   }

 

-  private boolean jj_3R_20() {

-    if (jj_scan_token(K_NATURAL)) return true;

+  private boolean jj_3_13() {

+    if (jj_scan_token(K_OUT)) return true;

     return false;

   }

 

-  private boolean jj_3_13() {

-    if (jj_scan_token(K_OUT)) return true;

+  private boolean jj_3R_20() {

+    if (jj_scan_token(K_NATURAL)) return true;

     return false;

   }

 

@@ -3924,14 +3925,14 @@
     return false;

   }

 

-  private boolean jj_3R_72() {

-    if (jj_scan_token(O_OPENPAREN)) return true;

-    if (jj_scan_token(S_NUMBER)) return true;

+  private boolean jj_3R_85() {

+    if (jj_scan_token(S_QUOTED_IDENTIFIER)) return true;

     return false;

   }

 

-  private boolean jj_3R_85() {

-    if (jj_scan_token(S_QUOTED_IDENTIFIER)) return true;

+  private boolean jj_3R_72() {

+    if (jj_scan_token(O_OPENPAREN)) return true;

+    if (jj_scan_token(S_NUMBER)) return true;

     return false;

   }

 

@@ -3989,11 +3990,6 @@
     return false;

   }

 

-  private boolean jj_3R_47() {

-    if (jj_scan_token(K_ROWID)) return true;

-    return false;

-  }

-

   private boolean jj_3_14() {

     if (jj_scan_token(R_IN)) return true;

     Token xsp;

@@ -4002,6 +3998,11 @@
     return false;

   }

 

+  private boolean jj_3R_47() {

+    if (jj_scan_token(K_ROWID)) return true;

+    return false;

+  }

+

   private boolean jj_3R_46() {

     if (jj_scan_token(K_BFILE)) return true;

     return false;

@@ -4027,6 +4028,16 @@
     return false;

   }

 

+  private boolean jj_3R_15() {

+    Token xsp;

+    xsp = jj_scanpos;

+    if (jj_3_14()) {

+    jj_scanpos = xsp;

+    if (jj_3R_63()) return true;

+    }

+    return false;

+  }

+

   private boolean jj_3R_60() {

     Token xsp;

     xsp = jj_scanpos;

@@ -4040,16 +4051,6 @@
     return false;

   }

 

-  private boolean jj_3R_15() {

-    Token xsp;

-    xsp = jj_scanpos;

-    if (jj_3_14()) {

-    jj_scanpos = xsp;

-    if (jj_3R_63()) return true;

-    }

-    return false;

-  }

-

   private boolean jj_3_5() {

     if (jj_scan_token(R_EXCEPTION)) return true;

     return false;

@@ -4306,14 +4307,14 @@
     return false;

   }

 

-  private boolean jj_3R_65() {

-    if (jj_scan_token(O_OPENPAREN)) return true;

-    if (jj_scan_token(S_NUMBER)) return true;

+  private boolean jj_3_11() {

+    if (jj_3R_15()) return true;

     return false;

   }

 

-  private boolean jj_3_11() {

-    if (jj_3R_15()) return true;

+  private boolean jj_3R_65() {

+    if (jj_scan_token(O_OPENPAREN)) return true;

+    if (jj_scan_token(S_NUMBER)) return true;

     return false;

   }

 

@@ -4626,14 +4627,14 @@
     return false;

   }

 

-  private boolean jj_3R_79() {

-    if (jj_scan_token(O_OPENPAREN)) return true;

-    if (jj_scan_token(S_NUMBER)) return true;

+  private boolean jj_3R_6() {

+    if (jj_scan_token(K_CONSTRUCTOR)) return true;

     return false;

   }

 

-  private boolean jj_3R_6() {

-    if (jj_scan_token(K_CONSTRUCTOR)) return true;

+  private boolean jj_3R_79() {

+    if (jj_scan_token(O_OPENPAREN)) return true;

+    if (jj_scan_token(S_NUMBER)) return true;

     return false;

   }

 

diff --git a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.jj b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.jj
index 32ccede..623f483 100644
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.jj
+++ b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.jj
Binary files differ
diff --git a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.jjt b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.jjt
index 0af6b09..5fa378d 100644
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.jjt
+++ b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/parser/DDLParser.jjt
Binary files differ
diff --git a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/util/DatabaseTypeBuilder.java b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/util/DatabaseTypeBuilder.java
index 94b6381..8938904 100644
--- a/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/util/DatabaseTypeBuilder.java
+++ b/oracleddlparser/src/main/java/org/eclipse/persistence/tools/oracleddl/util/DatabaseTypeBuilder.java
@@ -23,6 +23,7 @@
 import java.sql.SQLException;

 import java.util.ArrayList;

 import java.util.Collections;

+import java.util.HashMap;

 import java.util.Iterator;

 import java.util.List;

 import java.util.Map;

@@ -206,21 +207,25 @@
                 TreeSet<String> distinctDDLs = new TreeSet<String>();

                 distinctDDLs.addAll(ddls);

                 packageTypes = new ArrayList<PLSQLPackageType>();

+                Map<PLSQLPackageType, DDLParser> parserMap = new HashMap<PLSQLPackageType, DDLParser>();

                 for (String ddl : distinctDDLs) {

                     DDLParser parser = newDDLParser(ddl, copyOfSchemaPatterns);

                     PLSQLPackageType packageType = parser.parsePLSQLPackage();

                     if (packageType != null) {

                         packageTypes.add(packageType);

-                        if (resolveTypes) {

-                            UnresolvedTypesVisitor unresolvedTypesVisitor = new UnresolvedTypesVisitor();

-                            unresolvedTypesVisitor.visit(packageType);

-                            if (!unresolvedTypesVisitor.getUnresolvedTypes().isEmpty()) {

-                                resolvedTypes(conn, packageType.getSchema(), parser, 

-                                        unresolvedTypesVisitor.getUnresolvedTypes(), packageType, packageTypes);

-                            }

-                        }

+                        parserMap.put(packageType, parser);

                     }

                 }

+                if (!parserMap.isEmpty() && resolveTypes) {

+                	for (PLSQLPackageType packageType : parserMap.keySet()) {

+                		DDLParser parser = parserMap.get(packageType);

+	                    UnresolvedTypesVisitor unresolvedTypesVisitor = new UnresolvedTypesVisitor();

+	                    unresolvedTypesVisitor.visit(packageType);

+	                    if (!unresolvedTypesVisitor.getUnresolvedTypes().isEmpty()) {

+	                        resolvedTypes(conn, packageType.getSchema(), parser, unresolvedTypesVisitor.getUnresolvedTypes(), packageType, packageTypes);

+	                    }

+                	}

+                }

             }

         }

         return packageTypes;

@@ -515,7 +520,6 @@
      */

     protected void resolvedTypes(Connection conn, String schemaPattern, DDLParser parser,

         List<UnresolvedType> unresolvedTypes, DatabaseType databaseType, List<PLSQLPackageType> processedPackages) throws ParseException {

-        

         // need to process non '%' named items 1st such that we can resolve the '%' ones later

         List<String> percentNameList = new ArrayList<String>();

         List<String> nonPercentNameList = new ArrayList<String>();

@@ -658,6 +662,7 @@
                                 for (PLSQLPackageType pkg : processedPackages) {

                                     if (pkg.getPackageName().equals(typeName1)) {

                                         plsqlPkg = pkg;

+                                        break;

                                     }

                                 }

                             }