You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xmlbeans.apache.org by pc...@apache.org on 2004/05/11 00:54:03 UTC
cvs commit: xml-xmlbeans/v2/jam/test build.xml
pcal 2004/05/10 15:54:02
Modified: v2/jam/src/org/apache/xmlbeans/impl/jam/internal
JamClassLoaderImpl.java JamServiceImpl.java
v2/jam/src/org/apache/xmlbeans/impl/jam/internal/elements
ClassImpl.java
v2/jam/src/org/apache/xmlbeans/impl/jam/internal/reflect
ReflectClassBuilder.java
v2/jam/src/org/apache/xmlbeans/impl/jam/provider
JamClassBuilder.java
v2/jam/src/org/apache/xmlbeans/impl/jam/xml
JamXmlReader.java
v2/jam/test build.xml
Log:
catch/swallow for jdk bug in Class.getFields()
add lazy population to ClassImpl
Revision Changes Path
1.12 +20 -22 xml-xmlbeans/v2/jam/src/org/apache/xmlbeans/impl/jam/internal/JamClassLoaderImpl.java
Index: JamClassLoaderImpl.java
===================================================================
RCS file: /home/cvs/xml-xmlbeans/v2/jam/src/org/apache/xmlbeans/impl/jam/internal/JamClassLoaderImpl.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- JamClassLoaderImpl.java 12 Apr 2004 22:01:27 -0000 1.11
+++ JamClassLoaderImpl.java 10 May 2004 22:54:02 -0000 1.12
@@ -91,28 +91,7 @@
return out;
}
cachePut(out);
- ((ClassImpl)out).setState(ClassImpl.POPULATING);
- mBuilder.populate(out);
- if (mInitializer == null) {
- ((ClassImpl)out).setState(ClassImpl.LOADED);
- } else {
- ((ClassImpl)out).setState(ClassImpl.INITIALIZING);
- // see comments below about this. we need to document this more openly,
- // since it affects people writing initializers.
- if (mAlreadyInitializing) {
- // we already are running initializers, so we have to do it later
- mInitializeStack.push(out);
- } else {
- out.accept(mInitializer);
- ((ClassImpl)out).setState(ClassImpl.LOADED);
- while(!mInitializeStack.isEmpty()) {
- ClassImpl initme = (ClassImpl)mInitializeStack.pop();
- initme.accept(mInitializer);
- ((ClassImpl)out).setState(ClassImpl.LOADED);
- }
- mAlreadyInitializing = false;
- }
- }
+ ((ClassImpl)out).setState(ClassImpl.UNPOPULATED);
return out;
}
@@ -159,6 +138,25 @@
// ========================================================================
// Public methods?
+
+ //should only be called by ClassImpl
+ public void initialize(ClassImpl out) {
+ if (mInitializer != null) {
+ // see comments below about this. we need to document this more openly,
+ // since it affects people writing initializers.
+ if (mAlreadyInitializing) {
+ // we already are running initializers, so we have to do this one later
+ mInitializeStack.push(out);
+ } else {
+ out.accept(mInitializer);
+ while(!mInitializeStack.isEmpty()) {
+ ClassImpl initme = (ClassImpl)mInitializeStack.pop();
+ initme.accept(mInitializer);
+ }
+ mAlreadyInitializing = false;
+ }
+ }
+ }
/**
* Returns an unmodifiable collection containing the JClasses which
1.5 +1 -12 xml-xmlbeans/v2/jam/src/org/apache/xmlbeans/impl/jam/internal/JamServiceImpl.java
Index: JamServiceImpl.java
===================================================================
RCS file: /home/cvs/xml-xmlbeans/v2/jam/src/org/apache/xmlbeans/impl/jam/internal/JamServiceImpl.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- JamServiceImpl.java 26 Mar 2004 00:15:39 -0000 1.4
+++ JamServiceImpl.java 10 May 2004 22:54:02 -0000 1.5
@@ -70,18 +70,7 @@
}
// ========================================================================
- // Public methods - somexday we need to clean up the way this is exposed.
- // at the moment, we just cast down to this elements class to get at
- // these methods
-
- public MClass addNewClass(String packageName,
- String className,
- String[] importSpecs)
- {
- ClassImpl out = new ClassImpl(packageName,className,mContext,importSpecs);
- ((JamClassLoaderImpl)getClassLoader()).addToCache(out);//FIXME yuck, please sort this out
- return out;
- }
+ // Hackish methods
// this is a back door for jamxmlutils, which can't know the class names
// until after it's parsed the xml file (which can't be done without
1.13 +111 -15 xml-xmlbeans/v2/jam/src/org/apache/xmlbeans/impl/jam/internal/elements/ClassImpl.java
Index: ClassImpl.java
===================================================================
RCS file: /home/cvs/xml-xmlbeans/v2/jam/src/org/apache/xmlbeans/impl/jam/internal/elements/ClassImpl.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- ClassImpl.java 15 Apr 2004 01:50:06 -0000 1.12
+++ ClassImpl.java 10 May 2004 22:54:02 -0000 1.13
@@ -16,6 +16,7 @@
package org.apache.xmlbeans.impl.jam.internal.elements;
import org.apache.xmlbeans.impl.jam.*;
+import org.apache.xmlbeans.impl.jam.provider.JamClassBuilder;
import org.apache.xmlbeans.impl.jam.visitor.MVisitor;
import org.apache.xmlbeans.impl.jam.visitor.JVisitor;
import org.apache.xmlbeans.impl.jam.mutable.*;
@@ -23,6 +24,7 @@
import org.apache.xmlbeans.impl.jam.internal.classrefs.JClassRefContext;
import org.apache.xmlbeans.impl.jam.internal.classrefs.QualifiedJClassRef;
import org.apache.xmlbeans.impl.jam.internal.classrefs.UnqualifiedJClassRef;
+import org.apache.xmlbeans.impl.jam.internal.JamClassLoaderImpl;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
@@ -40,12 +42,11 @@
// ========================================================================
// Constants
- public static final int NEW = 0;
- public static final int BUILDING = 1;
- public static final int POPULATING = 2;
- public static final int INITIALIZING = 3;
- public static final int LOADED = 4;
- //public static final int UNRESOLVED = 4;
+ public static final int NEW = 1;
+ public static final int UNPOPULATED = 2;
+ public static final int POPULATING = 3;
+ public static final int INITIALIZING = 4;
+ public static final int LOADED = 5;
// ========================================================================
// Variables
@@ -69,6 +70,8 @@
private String[] mImports = null;
+ private JamClassBuilder mPopulator;
+
// FIXME implement this - we should only create one UnqualifiedJClassRef
// for each unqualified name so as to avoid resolving them over and over.
//private Map mName2Uqref = null;
@@ -79,11 +82,13 @@
public ClassImpl(String packageName,
String simpleName,
ElementContext ctx,
- String[] importSpecs) {
+ String[] importSpecs,
+ JamClassBuilder populator) {
super(ctx);
super.setSimpleName(simpleName);
mPackageName = packageName.trim();
mImports = importSpecs;
+ mPopulator = populator;
}
// ========================================================================
@@ -94,6 +99,7 @@
}
public JClass getSuperclass() {
+ ensurePopulated();
if (mSuperClassRef == null) {
return null;
} else {
@@ -102,6 +108,7 @@
}
public JClass[] getInterfaces() {
+ ensurePopulated();
if (mInterfaceRefs == null || mInterfaceRefs.size() == 0) {
return new JClass[0];
} else {
@@ -114,6 +121,7 @@
}
public JField[] getFields() {
+ ensurePopulated();
List list = new ArrayList();
addFieldsRecursively(this, list);
JField[] out = new JField[list.size()];
@@ -122,10 +130,12 @@
}
public JField[] getDeclaredFields() {
+ ensurePopulated();
return getMutableFields();
}
public JMethod[] getMethods() {
+ ensurePopulated();
List list = new ArrayList();
addMethodsRecursively(this, list);
JMethod[] out = new JMethod[list.size()];
@@ -134,6 +144,7 @@
}
public JProperty[] getProperties() {
+ ensurePopulated();
if (mProperties == null) return new JProperty[0];
JProperty[] out = new JProperty[mProperties.size()];
mProperties.toArray(out);
@@ -141,21 +152,42 @@
}
public JProperty[] getDeclaredProperties() {
+ ensurePopulated();
if (mDeclaredProperties == null) return new JProperty[0];
JProperty[] out = new JProperty[mDeclaredProperties.size()];
mDeclaredProperties.toArray(out);
return out;
}
- public JMethod[] getDeclaredMethods() { return getMutableMethods(); }
+ public JMethod[] getDeclaredMethods() {
+ ensurePopulated();
+ return getMutableMethods();
+ }
- public JConstructor[] getConstructors() { return getMutableConstructors(); }
+ public JConstructor[] getConstructors() {
+ ensurePopulated();
+ return getMutableConstructors();
+ }
+
+ public boolean isInterface() {
+ ensurePopulated();
+ return mIsInterface;
+ }
- public boolean isInterface() { return mIsInterface; }
+ public boolean isAnnotationType() {
+ ensurePopulated();
+ return mIsAnnotationType;
+ }
- public boolean isAnnotationType() { return mIsAnnotationType; }
+ public boolean isEnumType() {
+ ensurePopulated();
+ return mIsEnum;
+ }
- public boolean isEnumType() { return mIsEnum; }
+ public int getModifiers() {
+ ensurePopulated();
+ return super.getModifiers();
+ }
public boolean isFinal() { return Modifier.isFinal(getModifiers()); }
@@ -164,6 +196,7 @@
public boolean isAbstract() { return Modifier.isAbstract(getModifiers()); }
public boolean isAssignableFrom(JClass arg) {
+ ensurePopulated();
if (isPrimitiveType() || arg.isPrimitiveType()) {
return getQualifiedName().equals(arg.getQualifiedName());
}
@@ -171,6 +204,7 @@
}
public JClass[] getClasses() {
+ ensurePopulated();
return new JClass[0];//FIXME
}
@@ -183,10 +217,12 @@
}
public JPackage[] getImportedPackages() {
+ ensurePopulated();
return new JPackage[0];//FIXME
}
public JClass[] getImportedClasses() {
+ ensurePopulated();
// if (true) throw new IllegalStateException();
String[] imports = getImportSpecs();
if (imports == null) return new JClass[0];
@@ -222,8 +258,58 @@
public int getArrayDimensions() { return 0; }
// ========================================================================
+ // AnnotatedElementImpl implementation - just to add ensureLoaded()
+
+ public JAnnotation[] getAnnotations() {
+ ensurePopulated();
+ return super.getAnnotations();
+ }
+
+ public JAnnotation getAnnotation(Class proxyClass) {
+ ensurePopulated();
+ return super.getAnnotation(proxyClass);
+ }
+
+ public JAnnotation getAnnotation(String named) {
+ ensurePopulated();
+ return super.getAnnotation(named);
+ }
+
+ public JAnnotationValue getAnnotationValue(String valueId) {
+ ensurePopulated();
+ return super.getAnnotationValue(valueId);
+ }
+
+
+ public Object getAnnotationProxy(Class proxyClass) {
+ ensurePopulated();
+ return super.getAnnotationProxy(proxyClass);
+ }
+
+ public JComment getComment() {
+ ensurePopulated();
+ return super.getComment();
+ }
+
+ public JAnnotation[] getAllJavadocTags() {
+ ensurePopulated();
+ return super.getAllJavadocTags();
+ }
+
+ // ========================================================================
+ // Element implementation - just to add ensureLoaded()
+
+ public JSourcePosition getSourcePosition() {
+ ensurePopulated();
+ return super.getSourcePosition();
+ }
+
+
+ // ========================================================================
// MClass implementation
+ //FIXME should add assertiong here that state is not LOADED
+
public void setSuperclass(String qualifiedClassName) {
if (qualifiedClassName == null) {
mSuperClassRef = null;
@@ -397,6 +483,7 @@
}
public String[] getImportSpecs() {
+ ensurePopulated();
if (mImports == null) return new String[0];
return mImports;
}
@@ -406,9 +493,7 @@
public void setState(int state) { mState = state; }
-
-
-
+ public void setPopulator(JamClassBuilder builder) { mPopulator = builder; }
// ========================================================================
// Public static utility methods
@@ -487,6 +572,17 @@
}
clazz = clazz.getSuperclass();
if (clazz != null) addMethodsRecursively(clazz, out);
+ }
+
+ private void ensurePopulated() {
+ if (mState == UNPOPULATED) {
+ if (mPopulator == null) throw new IllegalStateException("null populator");
+ setState(POPULATING);
+ mPopulator.populate(this);
+ setState(INITIALIZING);
+ ((JamClassLoaderImpl)getClassLoader()).initialize(this);
+ setState(ClassImpl.LOADED);
+ }
}
}
1.10 +9 -2 xml-xmlbeans/v2/jam/src/org/apache/xmlbeans/impl/jam/internal/reflect/ReflectClassBuilder.java
Index: ReflectClassBuilder.java
===================================================================
RCS file: /home/cvs/xml-xmlbeans/v2/jam/src/org/apache/xmlbeans/impl/jam/internal/reflect/ReflectClassBuilder.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- ReflectClassBuilder.java 7 Apr 2004 04:18:09 -0000 1.9
+++ ReflectClassBuilder.java 10 May 2004 22:54:02 -0000 1.10
@@ -125,8 +125,15 @@
Class[] ints = src.getInterfaces();
for(int i=0; i<ints.length; i++) dest.addInterface(ints[i].getName());
// add the fields
- Field[] fields = src.getFields();
- for(int i=0; i<fields.length; i++) populate(dest.addNewField(),fields[i]);
+ Field[] fields = null;
+ try {
+ fields = src.getFields();
+ } catch(Exception ignore) {
+ //FIXME there seems to be some JDK bugs here, workaround for now 180996
+ }
+ if (fields != null) {
+ for(int i=0; i<fields.length; i++) populate(dest.addNewField(),fields[i]);
+ }
// add the methods
Method[] methods = src.getDeclaredMethods();
for(int i=0; i<methods.length; i++) populate(dest.addNewMethod(),methods[i]);
1.8 +17 -9 xml-xmlbeans/v2/jam/src/org/apache/xmlbeans/impl/jam/provider/JamClassBuilder.java
Index: JamClassBuilder.java
===================================================================
RCS file: /home/cvs/xml-xmlbeans/v2/jam/src/org/apache/xmlbeans/impl/jam/provider/JamClassBuilder.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- JamClassBuilder.java 2 Apr 2004 02:41:07 -0000 1.7
+++ JamClassBuilder.java 10 May 2004 22:54:02 -0000 1.8
@@ -50,8 +50,7 @@
/**
* <p>When a JamClassBuilder decides that it is going to be able
* to respond to a build() request, it must call this method to get an
- * initial instance of MClass. It should then initialize the MClass
- * as appropriate and then return it.</p>
+ * initial instance of MClass to return.</p>
*
* @param packageName qualified name of the package that contains the
* class to create
@@ -69,8 +68,7 @@
if (packageName == null) throw new IllegalArgumentException("null pkg");
if (className == null) throw new IllegalArgumentException("null class");
className = className.replace('.','$');
- ClassImpl out = new ClassImpl(packageName,className,mContext,importSpecs);
- out.setState(ClassImpl.BUILDING);
+ ClassImpl out = new ClassImpl(packageName,className,mContext,importSpecs,this);
return out;
}
@@ -85,12 +83,14 @@
/**
* <p>This is called by JAM when it attempts to load a class. If the
* builder has access to an artifact (typically a java source or classfile)
- * that represents the given type, it should call createClass() to get
- * a new instance of MClass, populate that instance, and then return it.
- * It should not perform any caching - if an MClass is going to be returned,
- * it should be a new instance.</p>
+ * that represents the given type, it should call createClassToBuild() to get
+ * a new instance of MClass and then return it. It should not populate
+ * the class in any way (e.g. add methods and fields to it) - this must
+ * be done later when the JamClassLoader calls populate(). Nor should
+ * any caching be performed - if an MClass is going to be returned,
+ * it should be a new instance returned by createClassToBuild()</p>
*
- * <p>If not artififact is available, the builder should just return null,
+ * <p>If no artififact is available, the builder should just return null,
* signalling that other JamClassBuilders should attempt to build the
* class.</p>
*
@@ -100,5 +100,13 @@
*/
public abstract MClass build(String packageName, String className);
+ /**
+ * <p>Called by JAM to 'fill out' an instance of a given MClass with
+ * things like methods and fields. The implementing builder is responsible
+ * for inspecting the source artificat (typically a source or class file)
+ * to call the appropriate createX methods on the given MClass.</p>
+ *
+ * @param c
+ */
public abstract void populate(MClass c);
}
1.4 +2 -0 xml-xmlbeans/v2/jam/src/org/apache/xmlbeans/impl/jam/xml/JamXmlReader.java
Index: JamXmlReader.java
===================================================================
RCS file: /home/cvs/xml-xmlbeans/v2/jam/src/org/apache/xmlbeans/impl/jam/xml/JamXmlReader.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- JamXmlReader.java 3 Apr 2004 01:21:29 -0000 1.3
+++ JamXmlReader.java 10 May 2004 22:54:02 -0000 1.4
@@ -16,6 +16,7 @@
import org.apache.xmlbeans.impl.jam.internal.CachedClassBuilder;
import org.apache.xmlbeans.impl.jam.internal.elements.ElementContext;
+import org.apache.xmlbeans.impl.jam.internal.elements.ClassImpl;
import org.apache.xmlbeans.impl.jam.mutable.MClass;
import org.apache.xmlbeans.impl.jam.mutable.MField;
import org.apache.xmlbeans.impl.jam.mutable.MInvokable;
@@ -117,6 +118,7 @@
while(METHOD.equals(getElementName())) readMethod(clazz);
readAnnotatedElement(clazz);
assertEnd(CLASS);
+ ((ClassImpl)clazz).setState(ClassImpl.LOADED);
nextElement();
}
1.11 +8 -0 xml-xmlbeans/v2/jam/test/build.xml
Index: build.xml
===================================================================
RCS file: /home/cvs/xml-xmlbeans/v2/jam/test/build.xml,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- build.xml 3 Apr 2004 01:21:29 -0000 1.10
+++ build.xml 10 May 2004 22:54:02 -0000 1.11
@@ -1,3 +1,9 @@
+<!-- NOTE: if you get errors about not being able to load the junit
+ task, try copying ../external/lib/junit.jar into your ant/lib
+ directory. This seems to be an ant or JDK 1.5 bug, not sure which.
+-->
+
+
<project name='jam.tests' basedir='.' default='clean_all_test'>
<!-- Build file to build and run JAM tests -->
@@ -13,6 +19,7 @@
<property name='jsr173ri_jar' value='../../build/lib/jsr173_ri.jar'/>
<property name='tidy_jar' value='../external/lib/tidy.jar'/>
+
<path id='classpath' >
<!-- use build/classes instead of xbean.jar for develpment convenience -->
@@ -27,6 +34,7 @@
<pathelement location='${jsr173ri_jar}' />
</path>
+
<property name='classpath-value' refid='classpath'/>
---------------------------------------------------------------------
To unsubscribe, e-mail: xmlbeans-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xmlbeans-cvs-help@xml.apache.org