/*
 * Copyright 2002-2009 the original author or authors.
 *
 * 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.springframework.core.type.classreading;

import java.io.IOException;
import java.io.InputStream;

import org.springframework.asm.ClassReader;
import org.springframework.core.io.Resource;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.ClassMetadata;

/**
 * {@link MetadataReader} implementation based on an ASM
 * {@link org.springframework.asm.ClassReader}.
 *
 * <p>Package-visible in order to allow for repackaging the ASM library
 * without effect on users of the <code>core.type</code> package.
 *
 * @author Juergen Hoeller
 * @author Costin Leau
 * @since 2.5
 */
final class SimpleMetadataReader implements MetadataReader {

	private final Resource resource;
	private final ClassMetadata classMetadata;
	private final AnnotationMetadata annotationMetadata;

	SimpleMetadataReader(Resource resource, ClassLoader classLoader) throws IOException {
		InputStream is = resource.getInputStream();
		ClassReader classReader = null;
		try {
			classReader = new ClassReader(is);
		} finally {
			is.close();
		}

		AnnotationMetadataReadingVisitor visitor = new AnnotationMetadataReadingVisitor(classLoader);
		classReader.accept(visitor, true);
		
		this.annotationMetadata = visitor;
		// (since AnnotationMetadataReader extends ClassMetadataReadingVisitor)
		this.classMetadata = visitor;
		this.resource = resource;
	}

	public Resource getResource() {
		return this.resource;
	}

	public ClassMetadata getClassMetadata() {
		return this.classMetadata;
	}

	public AnnotationMetadata getAnnotationMetadata() {
		return this.annotationMetadata;
	}
}
@@ -20,10 +20,10 @@
 2-20
-09
+12
  the
@@ -668,16 +668,52 @@
 ading;%0A%0A
+import java.io.BufferedInputStream;%0A
 import j
@@ -1377,16 +1377,17 @@
 source;%0A
+%0A
 %09private
@@ -1422,16 +1422,17 @@
 tadata;%0A
+%0A
 %09private
@@ -1478,16 +1478,17 @@
 adata;%0A%0A
+%0A
 %09SimpleM
@@ -1585,16 +1585,40 @@
 am is = 
+new BufferedInputStream(
 resource
@@ -1634,16 +1634,17 @@
 Stream()
+)
 ;%0A%09%09Clas
@@ -1720,17 +1720,19 @@
 is);%0A%09%09%7D
- 
+%0A%09%09
 finally 
@@ -1890,11 +1890,9 @@
 e);%0A
-%09%09
 %0A
+
 %09%09th
@@ -2289,9 +2289,11 @@
 ata;%0A%09%7D%0A
-%7D
+%0A%7D%0A

Use BufferedInputStream in SimpleMetaDataReader to double performance