Author: jgrassel
Date: Fri Jun 28 16:55:28 2013
New Revision: 1497841
URL: http://svn.apache.org/r1497841
Log:
OPENJPA-2025: Add Compatibility option to AnnotationProcessor6 tool so that the
default generated class can be processed cleanly by the default runtime
processor
Modified:
openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java
Modified:
openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java
URL:
http://svn.apache.org/viewvc/openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java?rev=1497841&r1=1497840&r2=1497841&view=diff
==============================================================================
---
openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java
(original)
+++
openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java
Fri Jun 28 16:55:28 2013
@@ -25,6 +25,7 @@ import java.io.PrintWriter;
import java.net.URL;
import java.util.Arrays;
import java.util.Date;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -45,6 +46,7 @@ import javax.persistence.metamodel.Stati
import javax.tools.Diagnostic;
import javax.tools.JavaFileObject;
+import org.apache.commons.lang.StringUtils;
import org.apache.openjpa.lib.util.Localizer;
import org.apache.openjpa.meta.MetaDataFactory;
import org.apache.openjpa.persistence.PersistenceMetaDataFactory;
@@ -98,7 +100,8 @@ import org.apache.openjpa.persistence.ut
"openjpa.source",
"openjpa.naming",
"openjpa.header",
- "openjpa.metamodel"
+ "openjpa.metamodel",
+ "openjpa.Compatibility"
})
@SupportedSourceVersion(RELEASE_6)
@@ -109,8 +112,11 @@ public class AnnotationProcessor6 extend
private CompileTimeLogger logger;
private String header;
private boolean active;
+ private Map<String, String> compatibilityMap = new HashMap<String,
String>();
private static Localizer _loc =
Localizer.forPackage(AnnotationProcessor6.class);
+ private boolean compat_useListAttributeForArrays = true;
+
/**
* Category of members as per JPA 2.0 type system.
*
@@ -191,11 +197,17 @@ public class AnnotationProcessor6 extend
if (!active)
return;
processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE,
_loc.get("mmg-tool-banner").toString());
- logger = new CompileTimeLogger(processingEnv,
getOptionValue("openjpa.log"));
+ logger = new CompileTimeLogger(processingEnv,
getOptionValue("openjpa.log"));
setSourceVersion();
setNamingPolicy();
setHeader();
handler = new SourceAnnotationHandler(processingEnv, logger);
+
+ // Process Compatibility Options
+ compatibilityMap =
processCompatibilityOptions(getOptionValue("openjpa.Compatibility"));
+ if (compatibilityMap.keySet().contains("UseListAttributeForArrays")) {
+ compat_useListAttributeForArrays =
Boolean.parseBoolean(compatibilityMap.get("UseListAttributeForArrays"));
+ }
}
/**
@@ -243,7 +255,10 @@ public class AnnotationProcessor6 extend
Set<? extends Element> members = handler.getPersistentMembers(e);
for (Element m : members) {
- boolean isPersistentCollection =
m.getAnnotation(PersistentCollection.class) != null;
+ boolean isPersistentCollection =
+ (compat_useListAttributeForArrays == true)
+ ? true
+ : m.getAnnotation(PersistentCollection.class) !=
null;
TypeMirror decl = handler.getDeclaredType(m);
String fieldName = handler.getPersistentMemberName(m);
@@ -382,4 +397,87 @@ public class AnnotationProcessor6 extend
}
return null;
}
+
+ private static Map<String, String> processCompatibilityOptions(String
compatArgs) {
+ HashMap<String, String> compatOptionsMap = new HashMap<String,
String>();
+
+ if (StringUtils.isEmpty(compatArgs)) {
+ return compatOptionsMap;
+ }
+
+ int start = 0, pos = 0, limit = compatArgs.length();
+ Integer subConfigBoundaryDepth = null;
+ char[] optionsCharArr = compatArgs.toCharArray();
+
+ for (pos = 0; pos < limit; pos++) {
+ // Special processing needed for augmented parameters bounded in
() markers
+ if (optionsCharArr[pos] == '(') {
+ if (subConfigBoundaryDepth == null) {
+ subConfigBoundaryDepth = new Integer(1);
+ } else {
+ subConfigBoundaryDepth = new
Integer(subConfigBoundaryDepth.intValue() + 1);
+ continue;
+ }
+ }
+
+ if (optionsCharArr[pos] == ')') {
+ if (subConfigBoundaryDepth != null) {
+ int level = subConfigBoundaryDepth.intValue() - 1;
+
+ if (level == 0) {
+ subConfigBoundaryDepth = null;
+ } else {
+ subConfigBoundaryDepth = new Integer(level);
+ }
+ }
+
+ continue;
+ }
+
+ // ',' symbols not in augmented parameter boundaries are
compatiblity option terminator tokens.
+ if (optionsCharArr[pos] == ',' && subConfigBoundaryDepth == null) {
+ if (pos == start) {
+ // Ignore empty option entries
+ start = pos + 1;
+ continue;
+ }
+
+ String compatOptionEntry = compatArgs.substring(start, pos);
+ start = pos + 1;
+
+ int nameValueMarkerIndex = compatOptionEntry.indexOf('=');
+ if (nameValueMarkerIndex == -1 || (nameValueMarkerIndex+1) ==
limit) {
+ String name = (compatOptionEntry.endsWith("=")
+ ? compatOptionEntry.substring(0,
compatOptionEntry.length() - 1)
+ : compatOptionEntry);
+ compatOptionsMap.put(name, "true");
+ } else {
+ String name = compatOptionEntry.substring(0,
nameValueMarkerIndex);
+ String value =
compatOptionEntry.substring(nameValueMarkerIndex + 1);
+ compatOptionsMap.put(name, value);
+ }
+ }
+ }
+
+ // Ran to the end of the string, process the remainder of the text
+ if (start < limit) {
+ String compatOptionEntry = compatArgs.substring(start, pos);
+ start = pos + 1;
+
+ int nameValueMarkerIndex = subConfigBoundaryDepth == null ?
compatOptionEntry.indexOf('=') : -1;
+ if (nameValueMarkerIndex == -1 || (nameValueMarkerIndex+1) ==
limit) {
+ String name = (compatOptionEntry.endsWith("=")
+ ? compatOptionEntry.substring(0,
compatOptionEntry.length() - 1)
+ : compatOptionEntry);
+ compatOptionsMap.put(name.trim(), "true");
+ } else {
+ String name = compatOptionEntry.substring(0,
nameValueMarkerIndex);
+ String value =
compatOptionEntry.substring(nameValueMarkerIndex + 1);
+ compatOptionsMap.put(name.trim(), (value == null) ? "" :
value.trim());
+ }
+ }
+
+
+ return compatOptionsMap;
+ }
}