diff options
Diffstat (limited to 'src/main/java/io/devnulllabs/openjava/mop/MetaInfo.java')
-rw-r--r-- | src/main/java/io/devnulllabs/openjava/mop/MetaInfo.java | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/src/main/java/io/devnulllabs/openjava/mop/MetaInfo.java b/src/main/java/io/devnulllabs/openjava/mop/MetaInfo.java new file mode 100644 index 0000000..863b400 --- /dev/null +++ b/src/main/java/io/devnulllabs/openjava/mop/MetaInfo.java @@ -0,0 +1,172 @@ +/* + * MetaInfo.java + * + * comments here. + * + * @author Michiaki Tatsubori + * @version %VERSION% %DATE% + * @see java.lang.Object + * + * COPYRIGHT 1999 by Michiaki Tatsubori, ALL RIGHTS RESERVED. + */ +package io.devnulllabs.openjava.mop; + + +import java.io.IOException; +import java.io.PrintWriter; +import java.io.Writer; +import java.lang.reflect.Field; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.StringTokenizer; + + +/** + * The class <code>MetaInfo</code> + * <p> + * For example + * <pre> + * </pre> + * <p> + * + * @author Michiaki Tatsubori + * @version 1.0 + * @since $Id: MetaInfo.java,v 1.2 2003/02/19 02:55:01 tatsubori Exp $ + * @see java.lang.Object + */ +public final class MetaInfo +{ + + public static final String METACLASS_KEY = "instantiates"; + public static final String DEFAULT_METACLASS = "openjava.mop.OJClass"; + public static final String SUFFIX = "OJMI"; + public static final String FIELD_NAME = "dict"; + + private Hashtable table = new Hashtable(); + private String packname; + private String simpleclassname; + + public MetaInfo( String metaclassname, String classname ) { + table.put( METACLASS_KEY, metaclassname ); + this.simpleclassname = Environment.toSimpleName( classname ); + this.packname = Environment.toPackageName( classname ); + } + + public MetaInfo(String classname) { + this(defaultMetaclass(classname), classname); + } + + static String defaultMetaclass(String classname) { + Class mc = OJSystem.getMetabind(classname); + if (mc != null) return mc.getName(); + return DEFAULT_METACLASS; + } + + private String qualifiedClassName() { + if (packname == null || packname.equals( "" )) return simpleclassname; + return packname + "." + simpleclassname; + } + + public MetaInfo( Class clazz ) { + this( clazz.getName() ); + String minfoname = clazz.getName() + SUFFIX; + try { + Class minfo = Class.forName( minfoname ); + Field f = minfo.getField( FIELD_NAME ); + String[][] dict = (String[][]) f.get( null ); + for (int i = 0; i < dict.length; ++i) { + table.put( dict[i][0], dict[i][1] ); + } + } catch ( ClassNotFoundException e ) { + table.put(METACLASS_KEY, defaultMetaclass(clazz.getName())); + } catch ( Exception e ) { + System.err.println( "meta information class " + minfoname + + " has an illegal structure. : " + e ); + table.put(METACLASS_KEY, defaultMetaclass(clazz.getName())); + } + } + + public void write( Writer destout ) throws IOException { + PrintWriter out = new PrintWriter( destout ); + out.println( "/*this file is generated by OpenJava system.*/" ); + out.println( makePack() ); + out.println( "public final class " + simpleclassname + SUFFIX ); + out.println( "{" ); + out.println( "public static final String[][] " + FIELD_NAME + "={" ); + + Enumeration key_i = keys(); + Enumeration value_i = elements(); + if (key_i.hasMoreElements()) { + out.print( " " ); + printSet( out, key_i.nextElement(), value_i.nextElement() ); + } + while (key_i.hasMoreElements()) { + out.print( "," ); + printSet( out, key_i.nextElement(), value_i.nextElement() ); + } + + out.println( "};" ); + out.println( "}" ); + + out.flush(); + } + + private String makePack() { + if (packname == null || packname.equals( "" )) return ""; + return "package " + packname + ";"; + } + + private void printSet( PrintWriter out, Object keyobj, Object valueobj ) { + String key = (String) keyobj, value = (String) valueobj; + out.print( "{\"" ); + out.print( toFlattenString( key ) ); + out.print( "\",\"" ); + out.print( toFlattenString( value ) ); + out.println( "\"}" ); + } + + public String put( String key, String value ) { + return (String) table.put( key, value ); + } + + public String get( String key ) { + return (String) table.get( key ); + } + + public Enumeration keys() { + return table.keys(); + } + + public Enumeration elements() { + return table.elements(); + } + + public static String toFlattenString( String src_str ) { + StringBuffer result = null; + + /* cancel double quotes and back slashs */ + StringTokenizer canceller + = new StringTokenizer( src_str, "\\\"", true ); + result = new StringBuffer(); + + while (canceller.hasMoreTokens()) { + String buf = canceller.nextToken(); + if(buf.equals( "\\" ) || buf.equals( "\"" )){ + result.append( "\\" ); + } + result.append( buf ); + } + + /* remove new line chars */ + StringTokenizer lnremover + = new StringTokenizer( result.toString(), "\n\r", false ); + result = new StringBuffer(); + + while (lnremover.hasMoreTokens()) { + result.append( " " + lnremover.nextToken() ); + } + + return result.toString().trim(); + } + +} |