Bu aralar bir Corba projesinde çalışıyorum. Corba teknolojisinde interface tanımlama dili olarak IDL kullanılıyor. Eğer bir Corba servisine erişimi sağlamak için size bir IDL verildi ise, bu IDL´i kullanarak client sınıflarını oluşturabilirsiniz. Bu işlem için aşağidaki sınıfı oluşturdum.
Bu implementasyon Sun JDK bünyesinde bulunan com.sun.tools.corba.se.idl.toJavaPortable.Compile ve IBM JDK bünyesinde bulunan com.ibm.idl.toJavaPortable.Compile sınıflarını kullanarak client sınıflarını oluşturuyor. Bu iki sınıf JDK lib dizini altındaki tools.jar içinde yer alıyor. Sınıfın bulunabilmesi için -Djava.home=
/** * * @author F520947 Oezcan Acar * */ public interface IdlToJavaGeneratorService { void generate( String workingDir, String idlFile, String outputDirectroy ); }
import java.io.File;
import java.io.PrintStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;
import org.codehaus.plexus.util.StringOutputStream;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.csg.cs.testing.common.CommonConstants;
import com.csg.cs.testing.generator.GeneratorException;
import com.csg.cs.testing.project.ProjectDirectoryUtils;
import com.csg.cs.testing.service.logger.ILogger;
/**
*
* @author F520947 Oezcan Acar
*
*/
@Component
final class DefaultIdlToJavaGeneratorServiceImpl implements IdlToJavaGeneratorService
{
@Autowired
private ILogger logger;
@Autowired
private IIdlParserService parser;
@Override
public void generate( final String inputDirectory, final String idlFile, final String outputDirectory)
{
File idl = new File( ProjectDirectoryUtils.getWorkingDirRoot() + “/” + idlFile );
List< String > includes = parser.getIdlIncludes( idl );
List
args.add( “-emitAll” );
args.add( “-fclient” );
args.add( “-pkgPrefix” );
String interfaceName = parser.getRealInterface( idl );
args.add( interfaceName );
args.add( CommonConstants.SERVICE_PACKAGE );
for (String include : includes)
{
args.add( “-pkgPrefix” );
args.add( include );
args.add( CommonConstants.SERVICE_PACKAGE );
}
List< String > baseInterfaces = parser.getBaseInterfaces( idl );
for (String base : baseInterfaces)
{
args.add( “-pkgPrefix” );
args.add( base );
args.add( CommonConstants.SERVICE_PACKAGE );
}
args.add( “-pkgPrefix” );
args.add( “CS_Inquiry_0_0” );
args.add( CommonConstants.SERVICE_PACKAGE );
args.add( “-pkgPrefix” );
args.add( “CS_Inquiry_0_0Operations” );
args.add( CommonConstants.SERVICE_PACKAGE );
args.add( “-i” );
args.add( inputDirectory );
args.add( “-td” );
args.add( outputDirectory );
args.add( idlFile );
Class> compilerClass = getCompilerClass();
invokeCompiler( compilerClass, args );
}
private Class> getCompilerClass()
{
ClassLoader cl = this.getClass().getClassLoader();
Class> idljCompiler;
try
{
idljCompiler = Class.forName(getIDLCompilerClass());
}
catch (ClassNotFoundException e)
{
try
{
File javaHome = new File(System.getProperty(“java.home”));
logger.log(“java.home=” + javaHome);
logger.log(“tools.har=” + javaHome+”/lib/tools.jar”);
File toolsJar = new File(javaHome, “/lib/tools.jar”);
URL toolsJarUrl = toolsJar.toURL();
URLClassLoader urlLoader = new URLClassLoader(new URL[]
{ toolsJarUrl }, cl);
// Unfortunately the idlj compiler reads messages using the
// system class path.
// Therefore this really nasty hack is required.
System.setProperty(“java.class.path”,System.getProperty(“java.class.path”)+ System.getProperty(“path.separator”)+ toolsJar.getAbsolutePath());
if (System.getProperty(“java.vm.name”).indexOf(“HotSpot”) != -1)
{
urlLoader.loadClass(“com.sun.tools.corba.se.idl.som.cff.FileLocator”);
}
idljCompiler = urlLoader.loadClass(getIDLCompilerClass());
}
catch (Exception notUsed)
{
throw new GeneratorException(notUsed);
}
}
return idljCompiler;
}
private String getIDLCompilerClass()
{
String vendor = System.getProperty( “java.vm.vendor” );
if ( vendor.indexOf( “IBM” ) != -1 )
{
return “com.ibm.idl.toJavaPortable.Compile”;
}
return “com.sun.tools.corba.se.idl.toJavaPortable.Compile”;
}
private void invokeCompiler( final Class> compilerClass, final List
{
logger.log(“Current dir : ” + System.getProperty(“user.dir”));
Method compilerMainMethod;
String arguments[];
args.add(0, “-verbose”);
arguments = (String[]) args.toArray(new String[args.size()]);
String command = compilerClass.getName();
for (int i = 0; i < arguments.length; i++)
{
command += " " + arguments[i];
}
logger.log(command);
try
{
compilerMainMethod = compilerClass.getMethod("main", new Class[] { String[].class });
}
catch (NoSuchMethodException e1)
{
throw new GeneratorException("Error: Compiler had no main method");
}
int exitCode = 0;
// Backup std channels
PrintStream stdErr = System.err;
PrintStream stdOut = System.out;
// Local channels
StringOutputStream err = new StringOutputStream();
StringOutputStream out = new StringOutputStream();
System.setErr(new PrintStream(err));
System.setOut(new PrintStream(out));
try
{
Object retVal = (Object) compilerMainMethod.invoke(compilerClass,new Object[]{ arguments });
if (retVal != null &amp;amp;&amp;amp; retVal instanceof Integer)
exitCode = ((Integer) retVal).intValue();
}
catch (InvocationTargetException e)
{
throw new GeneratorException(e);
}
catch (Throwable e)
{
e.printStackTrace();
throw new GeneratorException("IDL compilation failed");
}
finally
{
if (!"".equals(out.toString())) logger.log(out.toString());
if (!"".equals(err.toString())) logger.log(err.toString());
// Restore std channels
System.setErr(stdErr);
System.setOut(stdOut);
}
}
}
[/sourcecode]
EOF ( End Of Fun )
Özcan Acar
Püf Noktası kategorisinden son yazılar
- Subclipse Şifresi - April 28th, 2011
- Maven2 ve OutOfMemory - October 26th, 2010
- Java Compiler Versiyonu - May 26th, 2010
- Covariant Return Types - February 6th, 2010
- DBUnit JUnit Entegrasyonu - January 15th, 2010
- HSQLDB ve JUnit Entegrasyonu - January 15th, 2010
- JPA Anotasyonları ve Dinamik Tablo İsmi - November 25th, 2009
- Apache ile Tomcat Arasında Reverse Proxy Oluşturma - November 22nd, 2009
- UML'i Sevmeyenler İçin - November 17th, 2009
- Embedded Jetty - October 6th, 2009
Alihan
09 Mayıs 2011Bu koda bi Builder pattern yakisirdi ! :(