You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ch...@apache.org on 2012/07/05 04:48:38 UTC

svn commit: r1357447 [4/4] - in /commons/sandbox/classscan/trunk: ./ api/ api/src/ api/src/main/ api/src/main/java/ api/src/main/java/org/ api/src/main/java/org/apache/ api/src/main/java/org/apache/commons/ api/src/main/java/org/apache/commons/classsca...

Added: commons/sandbox/classscan/trunk/bcel/src/main/java/org/apache/commons/classscan/bcel/BcelMethod.java
URL: http://svn.apache.org/viewvc/commons/sandbox/classscan/trunk/bcel/src/main/java/org/apache/commons/classscan/bcel/BcelMethod.java?rev=1357447&view=auto
==============================================================================
--- commons/sandbox/classscan/trunk/bcel/src/main/java/org/apache/commons/classscan/bcel/BcelMethod.java (added)
+++ commons/sandbox/classscan/trunk/bcel/src/main/java/org/apache/commons/classscan/bcel/BcelMethod.java Thu Jul  5 02:48:34 2012
@@ -0,0 +1,105 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.classscan.bcel;
+
+import java.util.Set;
+
+import org.apache.bcel.classfile.Method;
+import org.apache.bcel.classfile.ParameterAnnotationEntry;
+import org.apache.bcel.generic.Type;
+import org.apache.commons.classscan.model.MetaAnnotation;
+import org.apache.commons.classscan.model.MetaParameter;
+import org.apache.commons.classscan.model.MetaType;
+import org.apache.commons.classscan.spi.model.SpiMetaClassLoader;
+import org.apache.commons.classscan.spi.model.SpiMetaMethod;
+import org.apache.commons.classscan.spi.model.SpiMetaParameter;
+import org.apache.commons.classscan.util.ResolveSet;
+
+public class BcelMethod implements SpiMetaMethod {
+
+    private final String methodName;
+    private final boolean isStatic;
+    private final AnnotationMap annotations;
+    private MetaType returnType;
+    private String returnTypeDescriptor;
+    private final ResolveSet<SpiMetaParameter> paramTypes;
+
+    public BcelMethod(Method method) {
+        methodName = method.getName();
+        isStatic = method.isStatic();
+        annotations = AnnotationMap.createAnnotations(method.getAnnotationEntries());
+        returnTypeDescriptor = method.getReturnType().getSignature();
+        paramTypes = createParameters(method);
+    }
+
+	@Override
+	public boolean resolve(SpiMetaClassLoader classLoader) {
+		returnType = classLoader.resolveTypeForDescriptor(returnTypeDescriptor);
+		if(returnType==null) {
+			return false;
+		}
+		returnTypeDescriptor = null;
+		
+		return annotations.resolve(classLoader)
+				&& paramTypes.resolve(classLoader);
+	}
+
+    @Override
+    public String getName() {
+        return methodName;
+    }
+
+    @Override
+    public Set<? extends MetaAnnotation> getAnnotations() {
+        return annotations;
+    }
+
+    @Override
+    public MetaAnnotation getAnnotation(String annotationName) {
+        return annotations.getValue(annotationName);
+    }
+
+    @Override
+    public boolean isStatic() {
+        return isStatic;
+    }
+
+    @Override
+    public MetaType getType() {
+        return returnType;
+    }
+
+    @Override
+    public Set<? extends MetaParameter> getParameters() {
+        return paramTypes;
+    }
+
+    private ResolveSet<SpiMetaParameter> createParameters(Method method) {
+        final Type[] types = method.getArgumentTypes();
+        if (types.length == 0) {
+            return ResolveSet.emptyResolveSet();
+        }
+
+        final ParameterAnnotationEntry[] parameterAnnotations = method.getParameterAnnotationEntries();
+        SpiMetaParameter[] metaParameterArray = new SpiMetaParameter[types.length];
+        for (int i = 0; i < metaParameterArray.length; ++i) {
+            // there may be less annotations than parameters
+            ParameterAnnotationEntry arg = i < parameterAnnotations.length ? parameterAnnotations[i] : null;
+            metaParameterArray[i] = new BcelParameter(types[i], arg);
+        }
+
+        ResolveSet<SpiMetaParameter> parameters = new ResolveSet<SpiMetaParameter>(metaParameterArray);
+        return parameters;
+    }
+}

Added: commons/sandbox/classscan/trunk/bcel/src/main/java/org/apache/commons/classscan/bcel/BcelParameter.java
URL: http://svn.apache.org/viewvc/commons/sandbox/classscan/trunk/bcel/src/main/java/org/apache/commons/classscan/bcel/BcelParameter.java?rev=1357447&view=auto
==============================================================================
--- commons/sandbox/classscan/trunk/bcel/src/main/java/org/apache/commons/classscan/bcel/BcelParameter.java (added)
+++ commons/sandbox/classscan/trunk/bcel/src/main/java/org/apache/commons/classscan/bcel/BcelParameter.java Thu Jul  5 02:48:34 2012
@@ -0,0 +1,68 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.classscan.bcel;
+
+import java.util.Set;
+
+import org.apache.bcel.classfile.ParameterAnnotationEntry;
+import org.apache.bcel.generic.Type;
+import org.apache.commons.classscan.model.MetaAnnotation;
+import org.apache.commons.classscan.model.MetaType;
+import org.apache.commons.classscan.spi.model.SpiMetaAnnotation;
+import org.apache.commons.classscan.spi.model.SpiMetaClassLoader;
+import org.apache.commons.classscan.spi.model.SpiMetaParameter;
+import org.apache.commons.classscan.util.NameSet;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class BcelParameter implements SpiMetaParameter {
+
+    private static final Logger logger = LoggerFactory.getLogger(BcelParameter.class);
+
+    private MetaType type;
+    private String typeName;
+    private final NameSet<? extends SpiMetaAnnotation> annotations;
+
+    public BcelParameter(Type argType, ParameterAnnotationEntry annotationEntry) {
+    	typeName = argType.getSignature();
+        annotations = AnnotationMap.createAnnotations(annotationEntry != null 
+        		?annotationEntry.getAnnotationEntries() :null);
+    }
+
+	@Override
+	public boolean resolve(SpiMetaClassLoader classLoader) {
+        type = classLoader.resolveTypeForDescriptor(typeName);
+        if(type==null) {
+        	logger.info("cannot resolve "+typeName+" as a parameter type");
+        	return false;
+        }
+        typeName= null;
+		return annotations.resolve(classLoader);
+	}
+
+    @Override
+    public Set<? extends MetaAnnotation> getAnnotations() {
+        return annotations;
+    }
+
+    @Override
+    public MetaAnnotation getAnnotation(String annotationName) {
+        return annotations.getValue(annotationName);
+    }
+
+    @Override
+    public MetaType getType() {
+        return type;
+    }
+}

Added: commons/sandbox/classscan/trunk/bcel/src/main/java/org/apache/commons/classscan/bcel/BcelProperty.java
URL: http://svn.apache.org/viewvc/commons/sandbox/classscan/trunk/bcel/src/main/java/org/apache/commons/classscan/bcel/BcelProperty.java?rev=1357447&view=auto
==============================================================================
--- commons/sandbox/classscan/trunk/bcel/src/main/java/org/apache/commons/classscan/bcel/BcelProperty.java (added)
+++ commons/sandbox/classscan/trunk/bcel/src/main/java/org/apache/commons/classscan/bcel/BcelProperty.java Thu Jul  5 02:48:34 2012
@@ -0,0 +1,142 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.classscan.bcel;
+
+import org.apache.bcel.classfile.AnnotationElementValue;
+import org.apache.bcel.classfile.AnnotationEntry;
+import org.apache.bcel.classfile.ArrayElementValue;
+import org.apache.bcel.classfile.ClassElementValue;
+import org.apache.bcel.classfile.ElementValue;
+import org.apache.bcel.classfile.ElementValuePair;
+import org.apache.bcel.classfile.EnumElementValue;
+import org.apache.bcel.classfile.SimpleElementValue;
+import org.apache.commons.classscan.builtin.ClassNameHelper;
+import org.apache.commons.classscan.model.MetaClass;
+import org.apache.commons.classscan.spi.model.SpiMetaAnnotation.SpiProperty;
+import org.apache.commons.classscan.spi.model.SpiMetaClassLoader;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class BcelProperty implements SpiProperty {
+
+    private static final Logger logger = LoggerFactory.getLogger(BcelProperty.class);
+
+    private final String propertyName;
+    private Object value;
+
+    public BcelProperty(ElementValuePair evPair) {
+        propertyName = evPair.getNameString();
+        value = evPair.getValue();
+    }
+
+	@Override
+	public boolean resolve(SpiMetaClassLoader classLoader) {
+		value = createObject(classLoader, value);
+		return value!=null;
+	}
+
+    @Override
+    public String getName() {
+        return propertyName;
+    }
+
+    @Override
+    public Object getValue() {
+        return value;
+    }
+
+    private Object createObject(SpiMetaClassLoader classLoader, Object ev) {
+        if (ev instanceof SimpleElementValue) {
+            return createWrapper((SimpleElementValue) ev);
+        }
+        if (ev instanceof EnumElementValue) {
+            return createEnum(classLoader, (EnumElementValue) ev);
+        }
+        if (ev instanceof ClassElementValue) {
+            return createMetaClass(classLoader, (ClassElementValue) ev);
+        }
+        if (ev instanceof ArrayElementValue) {
+            return createArray(classLoader, (ArrayElementValue) ev);
+        }
+        if (ev instanceof AnnotationElementValue) {
+            return createAnnotation((AnnotationElementValue) ev);
+        }
+        logger.info("unknown annotation value type "+ev.getClass().getCanonicalName()+" for annotation property "+propertyName);
+        return null;
+    }
+
+    private Object createWrapper(SimpleElementValue sev) {
+        char primitiveTypeCode = (char) sev.getElementValueType();
+
+        switch (primitiveTypeCode) {
+        case 'B':
+            return sev.getValueByte();
+        case 'C':
+            return sev.getValueChar();
+        case 'D':
+            return sev.getValueDouble();
+        case 'F':
+            return sev.getValueFloat();
+        case 'I':
+            return sev.getValueInt();
+        case 'J':
+            return sev.getValueLong();
+        case 'S':
+            return sev.getValueShort();
+        case 'Z':
+            return sev.getValueBoolean();
+        case 's':
+            return sev.getValueString();
+        default:
+            return null;
+        }
+    }
+
+    private MetaClass createMetaClass(SpiMetaClassLoader classLoader, ClassElementValue ev) {
+        String internalClassName = ev.getClassString();
+        String canonicalName = ClassNameHelper.internalToCanonicalName(internalClassName);
+        return classLoader.resolveMetaClass(canonicalName);
+    }
+
+    private Object createAnnotation(AnnotationElementValue aev) {
+        AnnotationEntry ae = ((AnnotationElementValue) aev).getAnnotationEntry();
+        return new BcelAnnotation(ae);
+    }
+
+    private Object createEnum(SpiMetaClassLoader classLoader, EnumElementValue eev) {
+        String enumTypeString = ClassNameHelper.internalToCanonicalName(eev.getEnumTypeString());
+        MetaClass dmc = classLoader.resolveMetaClass(enumTypeString);
+        if(dmc==null) {
+            logger.info("unknown enum type "+enumTypeString+" for annotation property "+propertyName);
+            return null;
+        }
+        String enumInstanceName = eev.getEnumValueString();
+        return new BcelEnumProperty(dmc, enumInstanceName);
+    }
+
+    private Object[] createArray(SpiMetaClassLoader classLoader, ArrayElementValue ev) {
+        ArrayElementValue aev = (ArrayElementValue) ev;
+        ElementValue[] elementValues = aev.getElementValuesArray();
+        Object[] returnValues = new Object[elementValues.length];
+        int i = 0;
+        for (ElementValue elementValue : elementValues) {
+            Object obj = createObject(classLoader, elementValue);
+            if(obj==null) {
+            	return null;
+            }
+			returnValues[i++] = obj;
+        }
+        return returnValues;
+    }
+}

Added: commons/sandbox/classscan/trunk/bcel/src/main/java/org/apache/commons/classscan/bcel/package-info.java
URL: http://svn.apache.org/viewvc/commons/sandbox/classscan/trunk/bcel/src/main/java/org/apache/commons/classscan/bcel/package-info.java?rev=1357447&view=auto
==============================================================================
--- commons/sandbox/classscan/trunk/bcel/src/main/java/org/apache/commons/classscan/bcel/package-info.java (added)
+++ commons/sandbox/classscan/trunk/bcel/src/main/java/org/apache/commons/classscan/bcel/package-info.java Thu Jul  5 02:48:34 2012
@@ -0,0 +1,20 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/**
+ * <p>This package is an implementation of the {@link org.apache.commons.classscan} interfaces.
+ * The implementation uses the BCEL commons library to introspect class files.</p>
+ * <p><b>The non-public methods in these classes are subject to change in any release.</b></p>
+ */
+package org.apache.commons.classscan.bcel;
+

Added: commons/sandbox/classscan/trunk/bcel/src/main/resources/META-INF/services/org.apache.commons.classscan.spi.ClassDigesterFactory
URL: http://svn.apache.org/viewvc/commons/sandbox/classscan/trunk/bcel/src/main/resources/META-INF/services/org.apache.commons.classscan.spi.ClassDigesterFactory?rev=1357447&view=auto
==============================================================================
--- commons/sandbox/classscan/trunk/bcel/src/main/resources/META-INF/services/org.apache.commons.classscan.spi.ClassDigesterFactory (added)
+++ commons/sandbox/classscan/trunk/bcel/src/main/resources/META-INF/services/org.apache.commons.classscan.spi.ClassDigesterFactory Thu Jul  5 02:48:34 2012
@@ -0,0 +1,15 @@
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+org.apache.commons.classscan.bcel.BcelClassDigesterFactory

Added: commons/sandbox/classscan/trunk/bcel/src/test/java/org/apache/commons/classscan/bcel/BcelClassTest.java
URL: http://svn.apache.org/viewvc/commons/sandbox/classscan/trunk/bcel/src/test/java/org/apache/commons/classscan/bcel/BcelClassTest.java?rev=1357447&view=auto
==============================================================================
--- commons/sandbox/classscan/trunk/bcel/src/test/java/org/apache/commons/classscan/bcel/BcelClassTest.java (added)
+++ commons/sandbox/classscan/trunk/bcel/src/test/java/org/apache/commons/classscan/bcel/BcelClassTest.java Thu Jul  5 02:48:34 2012
@@ -0,0 +1,56 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.classscan.bcel;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+import org.apache.commons.classscan.MetaClassLoader;
+import org.apache.commons.classscan.MetaRegistry;
+import org.apache.commons.classscan.model.MetaClass;
+import org.junit.Before;
+import org.junit.Test;
+
+public class BcelClassTest {
+
+    MetaClassLoader classLoader;
+    MetaClass thisClass;
+    
+    @Before
+    public void loadLocation() throws URISyntaxException {
+        classLoader = MetaRegistry.DEFAULT_REGISTRY.getMetaClassLoader(getClass().getClassLoader());
+        thisClass = classLoader.findMetaClass(getClass().getCanonicalName());
+    }
+
+    @Test
+    public void testGetClassLocation() throws MalformedURLException {
+        String testClassLocation = thisClass.getClassLocation().getName();
+        assertEquals(getClass().getProtectionDomain().getCodeSource().getLocation(), new URL(testClassLocation));
+    }
+
+    @Test
+    public void testGetParent() {
+        MetaClass pmc = thisClass.getParent();
+        assertEquals(Object.class.getCanonicalName(), pmc.getName());
+    }
+
+    @Test
+    public void testGetInterfaces() {
+        assertFalse(thisClass.getInterfaces().iterator().hasNext());
+    }
+}

Added: commons/sandbox/classscan/trunk/bcel/src/test/java/org/apache/commons/classscan/bcel/PrimitiveClassTest.java
URL: http://svn.apache.org/viewvc/commons/sandbox/classscan/trunk/bcel/src/test/java/org/apache/commons/classscan/bcel/PrimitiveClassTest.java?rev=1357447&view=auto
==============================================================================
--- commons/sandbox/classscan/trunk/bcel/src/test/java/org/apache/commons/classscan/bcel/PrimitiveClassTest.java (added)
+++ commons/sandbox/classscan/trunk/bcel/src/test/java/org/apache/commons/classscan/bcel/PrimitiveClassTest.java Thu Jul  5 02:48:34 2012
@@ -0,0 +1,72 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.classscan.bcel;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.net.URISyntaxException;
+
+import org.apache.commons.classscan.MetaClassLoader;
+import org.apache.commons.classscan.MetaRegistry;
+import org.apache.commons.classscan.model.MetaClass;
+import org.junit.Before;
+import org.junit.Test;
+
+public class PrimitiveClassTest {
+
+    MetaClassLoader classLoader;
+    MetaClass byteClass;
+    
+    @Before
+    public void loadLocation() throws URISyntaxException {
+        classLoader = MetaRegistry.DEFAULT_REGISTRY.getMetaClassLoader(Byte.TYPE.getClassLoader());
+        byteClass = classLoader.findMetaClass(Byte.TYPE.getCanonicalName());
+    }
+
+    @Test
+    public void testGetClassLocation() throws URISyntaxException {
+        assertNull(byteClass.getClassLocation());
+    }
+
+    @Test
+    public void testGetCanonicalName() {
+        assertEquals(Byte.TYPE.getCanonicalName(), byteClass.getName());
+    }
+
+    @Test
+    public void testGetParent() throws URISyntaxException {
+        assertNull(byteClass.getParent());
+    }
+
+    @Test
+    public void testGetInterfaces() {
+        assertEquals(0, byteClass.getInterfaces().size());
+    }
+
+    @Test
+    public void testGetAnnotations() {
+        assertEquals(0, byteClass.getAnnotations().size());
+    }
+
+    @Test
+    public void testGetMethods() {
+        assertEquals(0, byteClass.getMethods().size());
+    }
+
+    @Test
+    public void testGetFields() {
+        assertEquals(0, byteClass.getFields().size());
+    }
+}

Added: commons/sandbox/classscan/trunk/bcel/src/test/java/org/apache/commons/classscan/builtin/DefaultMetaClassPathElementTest.java
URL: http://svn.apache.org/viewvc/commons/sandbox/classscan/trunk/bcel/src/test/java/org/apache/commons/classscan/builtin/DefaultMetaClassPathElementTest.java?rev=1357447&view=auto
==============================================================================
--- commons/sandbox/classscan/trunk/bcel/src/test/java/org/apache/commons/classscan/builtin/DefaultMetaClassPathElementTest.java (added)
+++ commons/sandbox/classscan/trunk/bcel/src/test/java/org/apache/commons/classscan/builtin/DefaultMetaClassPathElementTest.java Thu Jul  5 02:48:34 2012
@@ -0,0 +1,59 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.classscan.builtin;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.net.URISyntaxException;
+import java.util.Collection;
+
+import org.apache.commons.classscan.MetaClassLoader;
+import org.apache.commons.classscan.MetaClassPathElement;
+import org.apache.commons.classscan.MetaRegistry;
+import org.apache.commons.classscan.model.MetaClass;
+import org.junit.Before;
+import org.junit.Test;
+
+public class DefaultMetaClassPathElementTest {
+
+    MetaClassPathElement location;
+    MetaClassLoader classLoader;
+    
+    @Before
+    public void loadLocation() throws URISyntaxException {
+        classLoader = MetaRegistry.DEFAULT_REGISTRY.getMetaClassLoader(getClass().getClassLoader());
+        String thisUri = getClass().getProtectionDomain().getCodeSource().getLocation().toString();
+        location = classLoader.getClassLocation(thisUri);
+        assertEquals(thisUri, location.getName());        
+    }
+
+    @Test
+    public void testGetMetaClass() throws URISyntaxException {
+        MetaClass thisClass= location.getMetaClass(getClass().getCanonicalName());
+        assertEquals(getClass().getCanonicalName(), thisClass.getName());
+    }
+
+    @Test
+    public void testGetMetaClasses() throws URISyntaxException {
+        Collection<? extends MetaClass> classes= location.getMetaClasses();
+        
+        MetaClass thisClass= location.getMetaClass(getClass().getCanonicalName());
+        assertTrue(classes.contains(thisClass));
+        
+        MetaClass objClass = classLoader.findMetaClass(Object.class.getCanonicalName());
+        assertFalse(classes.contains(objClass));
+    }
+}

Added: commons/sandbox/classscan/trunk/bcel/src/test/java/org/apache/commons/classscan/builtin/UrlClassPathTest.java
URL: http://svn.apache.org/viewvc/commons/sandbox/classscan/trunk/bcel/src/test/java/org/apache/commons/classscan/builtin/UrlClassPathTest.java?rev=1357447&view=auto
==============================================================================
--- commons/sandbox/classscan/trunk/bcel/src/test/java/org/apache/commons/classscan/builtin/UrlClassPathTest.java (added)
+++ commons/sandbox/classscan/trunk/bcel/src/test/java/org/apache/commons/classscan/builtin/UrlClassPathTest.java Thu Jul  5 02:48:34 2012
@@ -0,0 +1,51 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.classscan.builtin;
+
+import static org.junit.Assert.assertEquals;
+
+import java.net.URISyntaxException;
+import java.util.Map;
+
+import org.apache.commons.classscan.ClassPath;
+import org.apache.commons.classscan.ClassPathElement;
+import org.apache.commons.classscan.MetaRegistry;
+import org.apache.commons.classscan.ResourceFile;
+import org.apache.commons.classscan.test.classes.FullInterface;
+import org.junit.Before;
+import org.junit.Test;
+
+public class UrlClassPathTest {
+
+    ClassPath classPath;
+
+    @Before
+    public void loadLocation() throws URISyntaxException {
+    	ClassLoader classLoader = getClass().getClassLoader();
+		classPath = MetaRegistry.DEFAULT_REGISTRY.getClassPath(classLoader);
+    }
+
+    @Test
+    public void testGetClassLocationsWithMetaFile() throws URISyntaxException {
+    	String serviceFileName = "META-INF/services/"+FullInterface.class.getCanonicalName();
+
+    	Map<ClassPathElement, ResourceFile> resources = classPath.getResources(serviceFileName);
+    	assertEquals(1, resources.size());
+    	
+    	for(Map.Entry<ClassPathElement, ResourceFile> entry : resources.entrySet()) {
+    		ResourceFile file = entry.getValue();
+    		assertEquals(serviceFileName, file.getFileName());
+    	}
+    }
+}

Added: commons/sandbox/classscan/trunk/bcel/src/test/java/org/apache/commons/classscan/builtin/UrlMetaClassLoaderTest.java
URL: http://svn.apache.org/viewvc/commons/sandbox/classscan/trunk/bcel/src/test/java/org/apache/commons/classscan/builtin/UrlMetaClassLoaderTest.java?rev=1357447&view=auto
==============================================================================
--- commons/sandbox/classscan/trunk/bcel/src/test/java/org/apache/commons/classscan/builtin/UrlMetaClassLoaderTest.java (added)
+++ commons/sandbox/classscan/trunk/bcel/src/test/java/org/apache/commons/classscan/builtin/UrlMetaClassLoaderTest.java Thu Jul  5 02:48:34 2012
@@ -0,0 +1,117 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.classscan.builtin;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.net.URISyntaxException;
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.apache.commons.classscan.MetaClassLoader;
+import org.apache.commons.classscan.MetaClassPathElement;
+import org.apache.commons.classscan.MetaRegistry;
+import org.apache.commons.classscan.model.MetaClass;
+import org.apache.commons.classscan.test.classes.FullInterface;
+import org.apache.commons.classscan.test.classes.FullyDecorated;
+import org.apache.commons.classscan.test.classes.ValidateFullyDecorated;
+import org.junit.Before;
+import org.junit.Test;
+
+public class UrlMetaClassLoaderTest {
+
+    private static final String OBJECT_CANONICAL_NAME = Object.class.getCanonicalName();
+    private static final String FULLY_DECORATED_NAME = FullyDecorated.class.getCanonicalName();
+
+    MetaClassLoader classLoader;
+    MetaClass fdClass;
+    MetaClass objClass;
+
+    @Before
+    public void loadLocation() throws URISyntaxException {
+        classLoader = MetaRegistry.DEFAULT_REGISTRY.getMetaClassLoader(getClass().getClassLoader());
+        fdClass = classLoader.findMetaClass(FULLY_DECORATED_NAME);
+        objClass = classLoader.findMetaClass(OBJECT_CANONICAL_NAME);
+    }
+
+    @Test
+    public void testGetMetaClass() {
+        new ValidateFullyDecorated(classLoader.getMetaClass(FULLY_DECORATED_NAME));        
+        assertNull(classLoader.getMetaClass(OBJECT_CANONICAL_NAME));
+    }
+
+    @Test
+    public void testFindMetaClass() {
+        assertEquals(FULLY_DECORATED_NAME, fdClass.getName());
+        assertEquals(OBJECT_CANONICAL_NAME, objClass.getName());
+    }
+
+    <T> boolean contains(Iterator<? extends T> classes, T toFind) {
+    	while(classes.hasNext()) {
+    		T mc = classes.next();
+    		if(mc.equals(toFind)) {
+    			return true;
+    		}
+    	}
+    	return false;
+    }
+    
+    @Test
+    public void testGetMetaClasses() {
+        Iterator<? extends MetaClass> classes = classLoader.getMetaClasses();
+        assertTrue(contains(classes, fdClass));
+        assertFalse(contains(classes, objClass));
+    }
+
+    @Test
+    public void testIterateGetMetaClasses() {
+        Iterator<? extends MetaClass> classes = classLoader.getMetaClasses();
+        while(classes.hasNext()) {
+        	assertNotNull(classes.next());
+        }
+    }
+
+    @Test
+    public void testGetClassLocations() throws URISyntaxException {
+        Collection<? extends MetaClassPathElement> locations = classLoader.getClassLocations();
+        MetaClassPathElement location = classLoader.getClassLocation(getClass().getProtectionDomain().getCodeSource().getLocation().toString());
+        assertTrue(locations.contains(location));
+    }
+
+    @Test
+    public void testGetParent() {
+        for (int i = 0; i < 4; ++i) {
+            MetaClassLoader pcl = classLoader.getParent();
+            if (pcl == null) {
+                // cl is now bootstrap class loader
+                assertNotNull(classLoader.getMetaClass(Integer.class.getCanonicalName()));
+                return;
+            }
+            classLoader = pcl;
+        }
+        fail("Too many nested ClassLoaders");
+    }
+
+    @Test
+    public void findAllImplementations() throws URISyntaxException {
+        Collection<? extends MetaClass> implementations= classLoader.findAllImplementors(FullInterface.class.getCanonicalName());
+        assertTrue(implementations.contains(fdClass));
+        assertFalse(implementations.contains(objClass));
+    }
+}

Added: commons/sandbox/classscan/trunk/parent/pom.xml
URL: http://svn.apache.org/viewvc/commons/sandbox/classscan/trunk/parent/pom.xml?rev=1357447&view=auto
==============================================================================
--- commons/sandbox/classscan/trunk/parent/pom.xml (added)
+++ commons/sandbox/classscan/trunk/parent/pom.xml Thu Jul  5 02:48:34 2012
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  
+  <groupId>org.apache.commons.classscan</groupId>
+  <artifactId>parent</artifactId>
+  <name>ClassScan parent</name>
+  <version>0.2-SNAPSHOT</version>
+  <packaging>pom</packaging>
+  <description>Dependency and build directives to build the ClassScan libraries</description>
+  
+  <parent>
+    <groupId>org.apache.commons</groupId>
+    <artifactId>commons-parent</artifactId>
+    <version>24</version>
+  </parent>
+  
+  <properties>
+    <maven.compile.source>1.5</maven.compile.source>
+    <maven.compile.target>1.5</maven.compile.target>
+    <commons.subproject.location>sandbox/classscan/trunk</commons.subproject.location>
+  </properties> 
+  
+  <scm>
+    <connection>scm:svn:http://svn.apache.org/repos/asf/commons/${commons.subproject.location}</connection>
+    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/commons/${commons.subproject.location}</developerConnection>
+    <url>http://svn.apache.org/viewvc/commons/${commons.subproject.location}</url>
+  </scm>
+  
+  <build>
+  
+    <plugins>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <argLine>-Xmx512m</argLine>
+        </configuration>
+      </plugin>
+
+    </plugins>  
+  
+  </build>
+  
+  <dependencies>
+    
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.3</version>
+      <scope>test</scope>
+    </dependency>
+    
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <version>1.5.10</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>ch.qos.logback</groupId>
+      <artifactId>logback-core</artifactId>
+      <version>0.9.18</version>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>ch.qos.logback</groupId>
+      <artifactId>logback-classic</artifactId>
+      <version>0.9.18</version>
+      <scope>test</scope>
+    </dependency>    
+    
+  </dependencies>
+
+  <repositories>
+    <repository>
+      <id>apache-snapshot</id>
+      <url>https://repository.apache.org/content/repositories/snapshots</url>
+      <snapshots>
+        <enabled>true</enabled>
+      </snapshots>
+    </repository>
+  </repositories>
+  
+  <distributionManagement>
+    <site>
+      <id>apache.website</id>
+      <name>Apache Commons Site</name>
+      <url>${commons.deployment.protocol}://people.apache.org/www/commons.apache.org/${commons.componentid}</url>
+    </site>
+  </distributionManagement>
+  
+</project>

Added: commons/sandbox/classscan/trunk/pom.xml
URL: http://svn.apache.org/viewvc/commons/sandbox/classscan/trunk/pom.xml?rev=1357447&view=auto
==============================================================================
--- commons/sandbox/classscan/trunk/pom.xml (added)
+++ commons/sandbox/classscan/trunk/pom.xml Thu Jul  5 02:48:34 2012
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  
+  <parent>
+    <groupId>org.apache.commons.classscan</groupId>
+    <artifactId>parent</artifactId>
+    <version>0.2-SNAPSHOT</version>
+	<relativePath>parent</relativePath>
+  </parent>
+  
+  <groupId>org.apache.commons.classscan</groupId>
+  <artifactId>classscan</artifactId>
+  <name>ClassScan Group</name>
+  <version>0.2-SNAPSHOT</version>
+  <packaging>pom</packaging>
+  <description>A collection of libraries to obtain information about class(es) without loading by the jvm</description>
+
+  <modules>
+    <module>api</module>
+    <module>bcel</module>
+  </modules>
+  
+</project>

Added: commons/sandbox/classscan/trunk/src/site/site.xml
URL: http://svn.apache.org/viewvc/commons/sandbox/classscan/trunk/src/site/site.xml?rev=1357447&view=auto
==============================================================================
--- commons/sandbox/classscan/trunk/src/site/site.xml (added)
+++ commons/sandbox/classscan/trunk/src/site/site.xml Thu Jul  5 02:48:34 2012
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<project name="Lang">
+    <bannerRight>
+        <name>Commons ClassScan</name>
+        <src>/images/logo.png</src>
+        <href>/index.html</href>
+    </bannerRight>
+
+    <body>
+        <menu name="Lang">
+            <item name="Overview"        href="/index.html"/>
+            <item name="Users guide"     href="/userguide.html"/>
+        </menu>
+
+        <menu name="Development">
+            <item name="Building"             href="/building.html"/>
+            <item name="Mailing Lists"        href="/mail-lists.html"/>
+            <item name="Javadoc (SVN latest)" href="apidocs/index.html"/>
+        </menu>
+
+    </body>
+
+</project>

Added: commons/sandbox/classscan/trunk/src/site/xdoc/building.xml
URL: http://svn.apache.org/viewvc/commons/sandbox/classscan/trunk/src/site/xdoc/building.xml?rev=1357447&view=auto
==============================================================================
--- commons/sandbox/classscan/trunk/src/site/xdoc/building.xml (added)
+++ commons/sandbox/classscan/trunk/src/site/xdoc/building.xml Thu Jul  5 02:48:34 2012
@@ -0,0 +1,46 @@
+<?xml version="1.0"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<document>
+ <properties>
+  <title>Building</title>
+  <author email="dev@commons.apache.org">Commons Documentation Team</author>
+ </properties>
+<body>
+<!-- ================================================== -->
+<section name="Overview">
+<p>
+  Commons Lang uses <a href="http://maven.apache.org">Maven</a> as a build system.
+</p>
+</section>
+<!-- ================================================== -->
+<section name="Maven Goals">
+  <p>
+    To build a jar file, change into the root directory of ClasspathInfo and run "mvn package".
+    The result will be in the "target" subdirectory.
+  </p>
+  <p>
+    To build the full website, run "mvn site".
+    The result will be in "target/site".
+  </p>
+  <p>
+    Further details can be found in the
+    <a href="http://commons.apache.org/building.html">commons build instructions</a>.
+  </p>
+</section>
+</body>
+</document>

Added: commons/sandbox/classscan/trunk/src/site/xdoc/index.xml
URL: http://svn.apache.org/viewvc/commons/sandbox/classscan/trunk/src/site/xdoc/index.xml?rev=1357447&view=auto
==============================================================================
--- commons/sandbox/classscan/trunk/src/site/xdoc/index.xml (added)
+++ commons/sandbox/classscan/trunk/src/site/xdoc/index.xml Thu Jul  5 02:48:34 2012
@@ -0,0 +1,68 @@
+<?xml version="1.0"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<document>
+ <properties>
+  <title>Commons ClasspathInfo</title>
+  <author email="dev@commons.apache.org">Commons Documentation Team</author>
+ </properties>
+<body>
+<!-- ================================================== -->
+<section name="Commons ClasspathInfo">
+
+<p>
+The standard Java runtime hides many details about classes, particularly the location of classes which can potentially be loaded, and the details of unloaded classes. 
+</p>
+
+<p>
+ClasspathInfo can provide information about all of the classes available to the runtime, whether or not the class has been loaded.
+<ul>An application may want to discover:
+<li>all of the implementers of a particular interface</li>
+<li>all of the classes with a specific annotation (or even a particular annotation value)</li>
+<li>a particular field or all of the fields of a class</li>
+<li>a particular method or all of the fields of a class</li>
+<li>Any of the above, limited by the location of the class (eg. only classes annotated with @Entity from a jar that has a META-INF/persistence.xml file</li>
+</ul>
+</p>
+</section>
+<!-- ================================================== -->
+<section name="Documentation">
+<p>
+A getting started <a href="userguide.html">user guide</a> is available
+together with various <a href="project-reports.html">project reports</a>.
+</p>
+</section>
+<!-- ================================================== -->
+<section name="Release Information">
+</section>
+<!-- ================================================== -->
+<section name="Support">
+<p>
+The <a href="mail-lists.html">commons mailing lists</a> act as the main support forum.
+The user list is suitable for most library usage queries.
+The dev list is intended for the development discussion.
+Please remember that the lists are shared between all commons components,
+so prefix your email by [meiyo].
+</p>
+<!-- p>
+Bug reports and enhancements are also welcomed via the <a href="issue-tracking.html">JIRA</a> issue tracker.
+Please read the instructions carefully.
+</p -->
+</section>
+<!-- ================================================== -->
+</body>
+</document>

Added: commons/sandbox/classscan/trunk/src/site/xdoc/userguide.xml
URL: http://svn.apache.org/viewvc/commons/sandbox/classscan/trunk/src/site/xdoc/userguide.xml?rev=1357447&view=auto
==============================================================================
--- commons/sandbox/classscan/trunk/src/site/xdoc/userguide.xml (added)
+++ commons/sandbox/classscan/trunk/src/site/xdoc/userguide.xml Thu Jul  5 02:48:34 2012
@@ -0,0 +1,64 @@
+<?xml version="1.0"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<document>
+
+ <properties>
+  <title>Commons ClasspathInfo - User guide</title>
+  <author email="dev@commons.apache.org">Commons Documentation Team</author>
+ </properties>
+
+ <body>
+
+
+  <section name="Description">
+   <p>This library provides methods to search for classes without using reflection, in fact, without even loading the classes.  This is particularly important when the class has
+   static initializers that cause behavior that cannot be undone.  Additionally, framework libraries don't always have apriori knowledge of all classes which must be managed.</p>
+  </section>
+
+   <section name="Find All Implementors of an Interface">
+<p>You can use the following code snippet to find all implementors of an interface.</p>
+   <source><![CDATA[
+        MetaClassLoader classLoader = MetaRegistry.SINGLETON.getClassLoader(getClass().getClassLoader());
+        Collection<? extends MetaClass> implementations = classLoader.findAllImplementors(FullInterface.class.getCanonicalName());
+]]></source>
+   </section>
+
+   <section name="Find All Classes in a jar with a Annotation">
+<p>You can use the following code snippets to find all classes with a particular annotation in a jar with a marker META-INF file.</p>
+   <source><![CDATA[    
+    public void findAnnotatedClassesFromJar(MetaClassLoader classLoader) {
+        for(MetaClassLocation location : classLoader.getClassLocationsWithMetaFile("persistence.xml")) {
+            findAnnotatedClassesFromLocation(location);
+        }
+    }
+
+    private void findAnnotatedClassesFromLocation(MetaClassLocation location) {
+        for(MetaClass mc : location.getMetaClasses()) {
+            MetaAnnotation ma = mc.getAnnotation("javax.persistence.Entity");
+            if(ma!=null) {
+                workOnClass(mc);
+            }
+        }
+    }
+]]></source>
+   </section>
+   
+   
+</body>
+</document>