/******************************************************************************* | |
* Copyright (c) 2010-2011 Oracle. All rights reserved. | |
* This program and the accompanying materials are made available under the | |
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 | |
* which accompanies this distribution. | |
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html | |
* and the Eclipse Distribution License is available at | |
* http://www.eclipse.org/org/documents/edl-v10.php. | |
* | |
* Contributors: | |
* dclarke - initial sig compare utility (Bug 352151) | |
******************************************************************************/ | |
package eclipselink.utils.sigcompare; | |
import java.io.File; | |
import java.io.InputStream; | |
import java.util.Enumeration; | |
import java.util.HashMap; | |
import java.util.Map; | |
import java.util.zip.ZipEntry; | |
import java.util.zip.ZipFile; | |
import org.eclipse.persistence.internal.libraries.asm.AnnotationVisitor; | |
import org.eclipse.persistence.internal.libraries.asm.Attribute; | |
import org.eclipse.persistence.internal.libraries.asm.ClassReader; | |
import org.eclipse.persistence.internal.libraries.asm.ClassVisitor; | |
import org.eclipse.persistence.internal.libraries.asm.FieldVisitor; | |
import org.eclipse.persistence.internal.libraries.asm.MethodVisitor; | |
import org.eclipse.persistence.internal.libraries.asm.Opcodes; | |
public class SignatureImporter { | |
public Map<String, ClassSignature> importSignatures(File jarFile) throws Exception { | |
ZipFile zipFile = new ZipFile(jarFile); | |
SignatureClassVisitor visitor = new SignatureClassVisitor(); | |
for (Enumeration<? extends ZipEntry> zipEnum = zipFile.entries(); zipEnum.hasMoreElements();) { | |
ZipEntry entry = zipEnum.nextElement(); | |
if (entry.getName().endsWith(".class")) { | |
InputStream in = zipFile.getInputStream(entry); | |
ClassReader reader = new ClassReader(in); | |
reader.accept(visitor, ClassReader.SKIP_CODE + ClassReader.SKIP_DEBUG); | |
in.close(); | |
} | |
} | |
for (ClassSignature classSig : visitor.classes.values()) { | |
classSig.initialzeParent(visitor.classes); | |
} | |
return visitor.classes; | |
} | |
class SignatureClassVisitor implements ClassVisitor { | |
protected Map<String, ClassSignature> classes = new HashMap<String, ClassSignature>(); | |
protected ClassSignature sig = null; | |
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { | |
if ((access & Opcodes.ACC_PUBLIC) > 0) { | |
this.sig = new ClassSignature(name, superName, interfaces); | |
} // TODO: Handle inheritance | |
} | |
public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { | |
if (this.sig != null && (access & Opcodes.ACC_PUBLIC) > 0) { | |
this.sig.addField(name, desc); | |
} | |
return null; | |
} | |
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { | |
if (this.sig != null && (access & Opcodes.ACC_PUBLIC) > 0) { | |
this.sig.addMethod(name, desc); | |
} | |
return null; | |
} | |
public void visitInnerClass(String name, String outerName, String innerName, int access) { | |
} | |
public void visitOuterClass(String owner, String name, String desc) { | |
} | |
public void visitSource(String source, String debug) { | |
} | |
public AnnotationVisitor visitAnnotation(String desc, boolean visible) { | |
return null; | |
} | |
public void visitAttribute(Attribute attr) { | |
} | |
public void visitEnd() { | |
if (this.sig != null) { | |
this.classes.put(this.sig.getName(), this.sig); | |
} | |
this.sig = null; | |
} | |
} | |
} |