summaryrefslogtreecommitdiff
path: root/src/main/java/io/devnulllabs/openjava/mop/MetaInfo.java
blob: 863b400d598fb5cb8252a888e5d2187a2b9ae5f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
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();
    }

}