You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2009/11/24 21:12:00 UTC

svn commit: r883846 - /openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/util/SourceCode.java

Author: ppoddar
Date: Tue Nov 24 20:12:00 2009
New Revision: 883846

URL: http://svn.apache.org/viewvc?rev=883846&view=rev
Log:
OPENJPA-1386: Improve handling of imports that can hide each other

Modified:
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/util/SourceCode.java

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/util/SourceCode.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/util/SourceCode.java?rev=883846&r1=883845&r2=883846&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/util/SourceCode.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/util/SourceCode.java Tue Nov 24 20:12:00 2009
@@ -55,10 +55,10 @@
     public static final String  DOT           = ".";
     public static final String  EQUAL         = "=";
     public static final String  QUOTE         = "\"";
-//    public static final String NEWLINE        = "\r\n";
-	private static final String[] BRACKET_BLOCK  = {"{", "}"};
-	private static final String[] BRACKET_ARGS   = {"(", ")"};
-    private static final String[] BRACKET_PARAMS = {"<", ">"};
+
+	private static final Delimiter BLOCK_DELIMITER  = new Delimiter("{}");
+	private static final Delimiter ARGS_DELIMITER   = new Delimiter("()");
+    private static final Delimiter PARAMS_DELIMITER = new Delimiter("<>");
 	
 	private List<Comment> comments;
 	private final Package pkg;
@@ -71,7 +71,7 @@
 	 * class name. 
 	 */
 	public SourceCode(String c) {
-	    ClassName name = new ClassName(c);
+	    ClassName name = getOrCreateImport(c);
 	    this.cls = new Class(c);
         this.pkg = new Package(name.getPackageName());
 	}
@@ -95,7 +95,15 @@
         return this;
     }
 
-	boolean addImport(ClassName name) {
+    /**
+     * Adds import to this source code. Adding an import may force the given class name
+     * to use its full name if it is hidden by other imports.
+     * 
+     * @param name a ClassName instance
+     * @return true if the import is added. ClassName starting with <code>java.lang.</code>
+     * is not added.
+     */
+	private boolean addImport(ClassName name) {
 		String pkgName = name.getPackageName();
 		if ("java.lang".equals(pkgName))
 			return false;
@@ -108,6 +116,27 @@
 		return imports.add(new Import(name));
 	}
 	
+	/**
+	 * Get the class name instance for the given fully-qualified class name.
+	 * If the given class name is already imported, then use the existing instance.
+	 * Otherwise, creates a new instance and adds it to list of imports. 
+	 * 
+	 * @see #addImport(ClassName)
+	 * @see ClassName
+	 * 
+	 * @param name fully-qualified name of a class
+	 * @return an existing class name instance or a new one. 
+	 */
+	ClassName getOrCreateImport(String name) {
+	    for (Import i : imports) {
+	        if (i.name.getFullName().equals(name))
+	            return i.name;
+	    }
+	    ClassName imp = new ClassName(name);
+	    addImport(imp);
+	    return imp;
+	}
+	
 	
 	public SourceCode addComment(boolean inline, String... lines) {
 	    if (lines == null)
@@ -178,23 +207,24 @@
     }
 	
     static void writeList(PrintWriter out, String header, List<?> list) { 
-        writeList(out, header, list, new String[]{BLANK, BLANK}, false);
+        writeList(out, header, list, new Delimiter(), false);
     }
 	
 	static void writeList(PrintWriter out, String header, List<?> list, 
-			String[] bracket, boolean writeEmpty) {
+			Delimiter bracket, boolean writeEmpty) {
 		if (list == null || list.isEmpty()) {
 		    if (writeEmpty)
-		        out.append(bracket[0]+bracket[1]);
+		        out.append(bracket.start)
+		           .append(bracket.end);
 			return;
 		}
 		out.append(header);
-		out.append(bracket[0]);
+		out.append(bracket.start);
 		for (int i=0; i<list.size(); i++) {
 			out.append(list.get(i).toString());
 			if (i!=list.size()-1) out.append(COMMA);
 		}
-		out.append(bracket[1]);
+		out.append(bracket.end);
 	}
 	
 	static String capitalize(String s) {
@@ -268,7 +298,7 @@
 		}
 		
 		public Element<T> addParameter(String param) {
-		    params.add(new ClassName(param));
+		    params.add(getOrCreateImport(param));
 		    return this;
 		}
 		
@@ -334,17 +364,17 @@
 	    private Set<Method> methods = new TreeSet<Method>();
 		
 		public Class(String name) {
-			super(name, new ClassName(name));
+			super(name, getOrCreateImport(name));
 			makePublic();
 		}
 		
 		public Class setSuper(String s) {
-			superCls = new ClassName(s);
+			superCls = getOrCreateImport(s);
 			return this;
 		}
 		
 		public Class addInterface(String s) {
-			interfaces.add(new ClassName(s));
+			interfaces.add(getOrCreateImport(s));
 			return this;
 		}
 		
@@ -371,7 +401,7 @@
         }
         
         public Field addField(String name, String type) {
-            return addField(name, new ClassName(type));
+            return addField(name, getOrCreateImport(type));
         }
 
         public Field addField(String f, ClassName type) {
@@ -388,7 +418,7 @@
 	    }
 
         public Method addMethod(String m, String retType) {
-            return addMethod(m, new ClassName(retType));
+            return addMethod(m, getOrCreateImport(retType));
         }
         
 	    protected Method addMethod(String m, ClassName retType) {
@@ -396,7 +426,7 @@
 	            throw new IllegalArgumentException(_loc.get(
 	                "src-invalid-method",m).toString());
 	        }
-	        Method method = new Method(this, m, retType);
+	        Method method = new Method(m, retType);
 	        if (!methods.add(method)) 
 	            throw new IllegalArgumentException(_loc.get(
 	                "src-duplicate-method", method, this).toString());
@@ -409,16 +439,16 @@
 			    out.append("abstract ");
 			out.print("class ");
 			out.print(type.simpleName);
-			writeList(out, BLANK, params, BRACKET_PARAMS, false);
+			writeList(out, BLANK, params, PARAMS_DELIMITER, false);
 			if (superCls != null)
 				out.print(" extends " + superCls + SPACE);
 			writeList(out, "implements ", interfaces);
-			out.println(SPACE + BRACKET_BLOCK[0]);
+			out.println(SPACE + BLOCK_DELIMITER.start);
 	        for (Field field:fields) 
 	            field.write(out, 1);
 	        for (Method method:methods) 
 	            method.write(out, 1);
-	        out.println(BRACKET_BLOCK[1]);
+	        out.println(BLOCK_DELIMITER.end);
 		}
 	    
 	    public String toString() {
@@ -482,7 +512,7 @@
 			if (isVolatile) out.print("volatile ");
 			if (isTransient) out.print("transient ");
 			out.print(type);
-			writeList(out, BLANK, params, BRACKET_PARAMS, false);
+			writeList(out, BLANK, params, PARAMS_DELIMITER, false);
 			out.println(SPACE + name + SEMICOLON);
 		}
 		
@@ -501,19 +531,16 @@
 	 *
 	 */
 	class Method  extends Element<Method> {
-	    private final Class owner;
 		private boolean isAbstract;
-		private List<Argument<ClassName,String>> args = 
-		    new ArrayList<Argument<ClassName,String>>();
+		private List<Argument<ClassName,String>> args = new ArrayList<Argument<ClassName,String>>();
 		private List<String> codeLines = new ArrayList<String>();
 		
-        Method(Class owner, String n, String t) {
-            this(owner, n, new ClassName(t));
+        Method(String n, String t) {
+            this(n, getOrCreateImport(t));
         }
         
-        public Method(Class owner, String name, ClassName returnType) {
+        public Method(String name, ClassName returnType) {
             super(name, returnType);
-            this.owner = owner;
             makePublic();
         }
 		
@@ -551,18 +578,18 @@
 			super.write(out, tab);
 			if (isAbstract) out.append("abstract ");
 			out.print(type + SPACE + name);
-			writeList(out, BLANK, args, BRACKET_ARGS, true);
+			writeList(out, BLANK, args, ARGS_DELIMITER, true);
 			if (isAbstract) {
 				out.println(SEMICOLON);
 				return;
 			}
-			out.println(SPACE + BRACKET_BLOCK[0]);
+			out.println(SPACE + BLOCK_DELIMITER.start);
 			for (String line : codeLines) {
 				tab(out, tab+1);
 				out.println(line);
 			}
 			tab(out, tab);
-			out.println(BRACKET_BLOCK[1]);
+			out.println(BLOCK_DELIMITER.end);
 		}
 		
 		public boolean equals(Object other) {
@@ -595,7 +622,7 @@
 		    String pkg = name.getPackageName();
 		    if (pkg.length() == 0 || pkg.equals(getPackage().name))
 		        return;
-		    out.println("import "+ name.getName() + SEMICOLON);
+		    out.println("import "+ name.getFullName() + SEMICOLON);
 		}
 		
 		public boolean equals(Object other) {
@@ -653,12 +680,12 @@
         }
         
         public Annotation addArgument(String key, String[] vs) {
-            StringBuffer tmp = new StringBuffer(BRACKET_BLOCK[0]);
+            StringBuffer tmp = new StringBuffer(BLOCK_DELIMITER.start);
             for (int i=0; i < vs.length; i++) {
                 tmp.append(quote(vs[i]));
                 tmp.append(i != vs.length-1 ? COMMA : BLANK);
             }
-            tmp.append(BRACKET_BLOCK[1]);
+            tmp.append(BLOCK_DELIMITER.end);
             return addArgument(key, tmp.toString(), false);
         }
         
@@ -670,7 +697,7 @@
 		public void write(PrintWriter out, int tab) {
 			tab(out, tab);
 			out.println("@"+name);
-			writeList(out, BLANK, args, BRACKET_ARGS, false);
+			writeList(out, BLANK, args, ARGS_DELIMITER, false);
 			out.println();
 		}
 		
@@ -732,11 +759,10 @@
 	/**
 	 * Represents fully-qualified name of a Java type.
 	 * 
-	 * Constructing a name adds it to the list of imports for the enclosing
-	 * SourceCode.
-	 *
+	 * NOTE: Do not construct directly unless necessary.
+	 * @see SourceCode#getOrCreateImport(String)
 	 */
-	class ClassName implements Comparable<ClassName> {
+	private class ClassName implements Comparable<ClassName> {
         public final String fullName;
         public final String simpleName;
         public final String pkgName;
@@ -756,13 +782,12 @@
                 throw new IllegalArgumentException(_loc.get("src-invalid-type", 
                     name).toString());
             }
-            addImport(this);
 	    }
 	    
 	    /**
 	     * Gets fully qualified name of this receiver.
 	     */
-	    public String getName() {
+	    public String getFullName() {
 	        return fullName + arrayMarker;
 	    }
 	    
@@ -834,6 +859,25 @@
 	    
 	}
 	
+	static class Delimiter {
+	    final char start;
+	    final char end;
+	    
+        public Delimiter() {
+            this((char)0, (char)0);
+        }
+
+	    public Delimiter(String pair) {
+	        this(pair.charAt(0), pair.charAt(1));
+	    }
+	    
+        public Delimiter(char start, char end) {
+            super();
+            this.start = start;
+            this.end = end;
+        }
+	}
+	
 	static {
 		reserved.add("abstract");
 		reserved.add("continue");