1 /*
   2  * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package com.sun.corba.se.impl.orbutil ;
  27 
  28 import java.util.Arrays ;
  29 
  30 public abstract class ObjectWriter {
  31     public static ObjectWriter make( boolean isIndenting,
  32         int initialLevel, int increment )
  33     {
  34         if (isIndenting)
  35             return new IndentingObjectWriter( initialLevel, increment ) ;
  36         else
  37             return new SimpleObjectWriter() ;
  38     }
  39 
  40     public abstract void startObject( Object obj ) ;
  41 
  42     public abstract void startElement() ;
  43 
  44     public abstract void endElement() ;
  45 
  46     public abstract void endObject( String str ) ;
  47 
  48     public abstract void endObject() ;
  49 
  50     public String toString() { return result.toString() ; }
  51 
  52     public void append( boolean arg ) { result.append( arg ) ; }
  53 
  54     public void append( char arg ) { result.append( arg ) ; }
  55 
  56     public void append( short arg ) { result.append( arg ) ; }
  57 
  58     public void append( int arg ) { result.append( arg ) ; }
  59 
  60     public void append( long arg ) { result.append( arg ) ; }
  61 
  62     public void append( float arg ) { result.append( arg ) ; }
  63 
  64     public void append( double arg ) { result.append( arg ) ; }
  65 
  66     public void append( String arg ) { result.append( arg ) ; }
  67 
  68 //=================================================================================================
  69 // Implementation
  70 //=================================================================================================
  71 
  72     protected StringBuffer result ;
  73 
  74     protected ObjectWriter()
  75     {
  76         result = new StringBuffer() ;
  77     }
  78 
  79     protected void appendObjectHeader( Object obj )
  80     {
  81         result.append( obj.getClass().getName() ) ;
  82         result.append( "<" ) ;
  83         result.append( System.identityHashCode( obj ) ) ;
  84         result.append( ">" ) ;
  85         Class compClass = obj.getClass().getComponentType() ;
  86 
  87         if (compClass != null) {
  88             result.append( "[" ) ;
  89             if (compClass == boolean.class) {
  90                 boolean[] arr = (boolean[])obj ;
  91                 result.append( arr.length ) ;
  92                 result.append( "]" ) ;
  93             } else if (compClass == byte.class) {
  94                 byte[] arr = (byte[])obj ;
  95                 result.append( arr.length ) ;
  96                 result.append( "]" ) ;
  97             } else if (compClass == short.class) {
  98                 short[] arr = (short[])obj ;
  99                 result.append( arr.length ) ;
 100                 result.append( "]" ) ;
 101             } else if (compClass == int.class) {
 102                 int[] arr = (int[])obj ;
 103                 result.append( arr.length ) ;
 104                 result.append( "]" ) ;
 105             } else if (compClass == long.class) {
 106                 long[] arr = (long[])obj ;
 107                 result.append( arr.length ) ;
 108                 result.append( "]" ) ;
 109             } else if (compClass == char.class) {
 110                 char[] arr = (char[])obj ;
 111                 result.append( arr.length ) ;
 112                 result.append( "]" ) ;
 113             } else if (compClass == float.class) {
 114                 float[] arr = (float[])obj ;
 115                 result.append( arr.length ) ;
 116                 result.append( "]" ) ;
 117             } else if (compClass == double.class) {
 118                 double[] arr = (double[])obj ;
 119                 result.append( arr.length ) ;
 120                 result.append( "]" ) ;
 121             } else { // array of object
 122                 java.lang.Object[] arr = (java.lang.Object[])obj ;
 123                 result.append( arr.length ) ;
 124                 result.append( "]" ) ;
 125             }
 126         }
 127 
 128         result.append( "(" ) ;
 129     }
 130 
 131     /** Expected patterns:
 132     * startObject endObject( str )
 133     *   header( elem )\n
 134     * startObject ( startElement append* endElement ) * endObject
 135     *   header(\n
 136     *       append*\n *
 137     *   )\n
 138     */
 139     private static class IndentingObjectWriter extends ObjectWriter {
 140         private int level ;
 141         private int increment ;
 142 
 143         public IndentingObjectWriter( int initialLevel, int increment )
 144         {
 145             this.level = initialLevel ;
 146             this.increment = increment ;
 147             startLine() ;
 148         }
 149 
 150         private void startLine()
 151         {
 152             char[] fill = new char[ level * increment ] ;
 153             Arrays.fill( fill, ' ' ) ;
 154             result.append( fill ) ;
 155         }
 156 
 157         public void startObject( java.lang.Object obj )
 158         {
 159             appendObjectHeader( obj ) ;
 160             level++ ;
 161         }
 162 
 163         public void startElement()
 164         {
 165             result.append( "\n" ) ;
 166             startLine() ;
 167         }
 168 
 169         public void endElement()
 170         {
 171         }
 172 
 173         public void endObject( String str )
 174         {
 175             level-- ;
 176             result.append( str ) ;
 177             result.append( ")" ) ;
 178         }
 179 
 180         public void endObject( )
 181         {
 182             level-- ;
 183             result.append( "\n" ) ;
 184             startLine() ;
 185             result.append( ")" ) ;
 186         }
 187     }
 188 
 189     private static class SimpleObjectWriter extends ObjectWriter {
 190         public void startObject( java.lang.Object obj )
 191         {
 192             appendObjectHeader( obj ) ;
 193             result.append( " " ) ;
 194         }
 195 
 196         public void startElement()
 197         {
 198             result.append( " " ) ;
 199         }
 200 
 201         public void endObject( String str )
 202         {
 203             result.append( str ) ;
 204             result.append( ")" ) ;
 205         }
 206 
 207         public void endElement()
 208         {
 209         }
 210 
 211         public void endObject()
 212         {
 213             result.append( ")" ) ;
 214         }
 215     }
 216 }