From 70cce375cf186440ac930c41e026b1ef614202cd Mon Sep 17 00:00:00 2001 From: Montoya Edu Date: Fri, 22 May 2015 12:20:06 +0200 Subject: [PATCH] Initial support for referencing dll libraries packaged within artifacts. --- .../compiler/csharp/CSharpCompiler.java | 35 +++++++++++++++- .../plexus/compiler/csharp/JarUtil.java | 40 +++++++++++++++++++ 2 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 plexus-compilers/plexus-compiler-csharp/src/main/java/org/codehaus/plexus/compiler/csharp/JarUtil.java diff --git a/plexus-compilers/plexus-compiler-csharp/src/main/java/org/codehaus/plexus/compiler/csharp/CSharpCompiler.java b/plexus-compilers/plexus-compiler-csharp/src/main/java/org/codehaus/plexus/compiler/csharp/CSharpCompiler.java index a71ba10a..395f9e4b 100644 --- a/plexus-compilers/plexus-compiler-csharp/src/main/java/org/codehaus/plexus/compiler/csharp/CSharpCompiler.java +++ b/plexus-compilers/plexus-compiler-csharp/src/main/java/org/codehaus/plexus/compiler/csharp/CSharpCompiler.java @@ -40,6 +40,7 @@ import java.io.StringReader; import java.io.StringWriter; import java.io.Writer; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; @@ -58,6 +59,10 @@ public class CSharpCompiler extends AbstractCompiler { + private static final String JAR_SUFFIX = ".jar"; + private static final String DLL_SUFFIX = ".dll"; + private static final String NET_SUFFIX = ".net"; + private static final String ARGUMENTS_FILE_NAME = "csharp-arguments"; private static final String[] DEFAULT_INCLUDES = { "**/**" }; @@ -228,8 +233,34 @@ private String[] buildCompilerArguments( CompilerConfiguration config, String[] { continue; } - - args.add( "/reference:\"" + element + "\"" ); + + if (element.endsWith(JAR_SUFFIX)) { + try + { + File dllDir = new File(element + NET_SUFFIX); + if (!dllDir.exists()) + { + dllDir.mkdir(); + } + JarUtil.extract(dllDir, new File(element)); + for (String tmpfile : dllDir.list()) + { + if ( tmpfile.endsWith(DLL_SUFFIX) ) + { + String dll = Paths.get(dllDir.getAbsolutePath(), tmpfile).toString(); + args.add( "/reference:\"" + dll + "\"" ); + } + } + } + catch ( IOException e ) + { + throw new CompilerException( e.toString(), e ); + } + } + else + { + args.add( "/reference:\"" + element + "\"" ); + } } // ---------------------------------------------------------------------- diff --git a/plexus-compilers/plexus-compiler-csharp/src/main/java/org/codehaus/plexus/compiler/csharp/JarUtil.java b/plexus-compilers/plexus-compiler-csharp/src/main/java/org/codehaus/plexus/compiler/csharp/JarUtil.java new file mode 100644 index 00000000..695b7e00 --- /dev/null +++ b/plexus-compilers/plexus-compiler-csharp/src/main/java/org/codehaus/plexus/compiler/csharp/JarUtil.java @@ -0,0 +1,40 @@ +package org.codehaus.plexus.compiler.csharp; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Enumeration; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +public class JarUtil { + public static void extract( File destDir, File jarFile ) throws IOException + { + JarFile jar = new JarFile( jarFile ); + Enumeration enumEntries = jar.entries(); + while ( enumEntries.hasMoreElements() ) { + JarEntry file = ( JarEntry ) enumEntries.nextElement(); + File f = new File( destDir + File.separator + file.getName() ); + if ( file.isDirectory() ) + { + f.mkdir(); + continue; + } + InputStream is = jar.getInputStream( file ); + FileOutputStream fos = new FileOutputStream( f ); + try + { + while ( is.available() > 0 ) + { + fos.write( is.read() ); + } + } + finally + { + is.close(); + fos.close(); + } + } + } +}