package org.apache.maven.plugin.compiler.module; | |
/* | |
* 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. | |
*/ | |
import java.io.File; | |
import java.io.FileInputStream; | |
import java.io.FileNotFoundException; | |
import java.io.IOException; | |
import java.io.InputStream; | |
import java.util.jar.JarEntry; | |
import java.util.jar.JarFile; | |
import org.codehaus.plexus.component.annotations.Component; | |
import org.objectweb.asm.ClassReader; | |
import org.objectweb.asm.ClassVisitor; | |
import org.objectweb.asm.ModuleVisitor; | |
import org.objectweb.asm.Opcodes; | |
/** | |
* Extract information from module with ASM | |
* | |
* @author Robert Scholte | |
* @since 3.6 | |
*/ | |
@Component( role = ModuleInfoParser.class, hint = "asm" ) | |
public class AsmModuleInfoParser | |
implements ModuleInfoParser | |
{ | |
@Override | |
public Type getType() | |
{ | |
return Type.CLASS; | |
} | |
@Override | |
public JavaModuleDescriptor getModuleDescriptor( File modulePath ) | |
throws IOException | |
{ | |
final JavaModuleDescriptorWrapper wrapper = new JavaModuleDescriptorWrapper(); | |
InputStream in = getModuleInfoClass( modulePath ); | |
if ( in != null ) | |
{ | |
ClassReader reader = new ClassReader( in ); | |
reader.accept( new ClassVisitor( Opcodes.ASM6 ) | |
{ | |
@Override | |
public ModuleVisitor visitModule( String name, int arg1, String arg2 ) | |
{ | |
wrapper.builder = JavaModuleDescriptor.newModule( name ); | |
return new ModuleVisitor( Opcodes.ASM6 ) | |
{ | |
@Override | |
public void visitRequire( String module, int access, String version ) | |
{ | |
wrapper.builder.requires( module ); | |
} | |
}; | |
} | |
}, 0 ); | |
in.close(); | |
} | |
else | |
{ | |
wrapper.builder = JavaModuleDescriptor.newAutomaticModule( null ); | |
} | |
return wrapper.builder.build(); | |
} | |
private InputStream getModuleInfoClass( File modulePath ) | |
throws FileNotFoundException, IOException | |
{ | |
InputStream in; | |
if ( modulePath.isDirectory() ) | |
{ | |
in = new FileInputStream( new File( modulePath, "module-info.class" ) ); | |
} | |
else | |
{ | |
// | |
JarFile jarFile = new JarFile( modulePath ); | |
JarEntry moduleInfo = jarFile.getJarEntry( "/module-info.class" ); | |
if ( moduleInfo != null ) | |
{ | |
in = jarFile.getInputStream( moduleInfo ); | |
} | |
else | |
{ | |
in = null; | |
} | |
} | |
return in; | |
} | |
private static class JavaModuleDescriptorWrapper | |
{ | |
private JavaModuleDescriptor.Builder builder; | |
} | |
} |