summaryrefslogtreecommitdiff
path: root/src/main/java/io/devnulllabs/openjava/mop/MetaInfo.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/io/devnulllabs/openjava/mop/MetaInfo.java')
-rw-r--r--src/main/java/io/devnulllabs/openjava/mop/MetaInfo.java172
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();
+ }
+
+}