001 /* 002 * Copyright 2005 Stephen J. McConnell. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 013 * implied. 014 * 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 019 package net.dpml.lang; 020 021 import java.io.Writer; 022 import java.io.IOException; 023 024 /** 025 * Utility class used as a destination during generalized object encoding. 026 * 027 * @author <a href="http://www.dpml.net">Digital Product Management Laboratory</a> 028 * @version 2.0.1 029 */ 030 public final class Buffer 031 { 032 private final String m_namespace; 033 private final String m_pad; 034 private final Writer m_writer; 035 036 /** 037 * Construct a new encoding buffer. 038 * 039 * @param writer the output stream writer 040 * @param namespace the current namespace 041 * @param pad the current offset 042 * @exception NullPointerException of the writer or namespace arguments are null 043 */ 044 public Buffer( final Writer writer, final String namespace, final String pad ) 045 { 046 if( null == writer ) 047 { 048 throw new NullPointerException( "writer" ); 049 } 050 if( null == namespace ) 051 { 052 throw new NullPointerException( "namespace" ); 053 } 054 if( null == pad ) 055 { 056 m_pad = ""; 057 } 058 else 059 { 060 m_pad = pad; 061 } 062 m_namespace = namespace; 063 m_writer = writer; 064 } 065 066 public String getEnclosingNamespace() 067 { 068 return m_namespace; 069 } 070 071 public String getOffset() 072 { 073 return m_pad; 074 } 075 076 public void write( String value ) throws IOException 077 { 078 m_writer.write( value ); 079 } 080 081 public void write( int n ) throws IOException 082 { 083 m_writer.write( n ); 084 } 085 086 public void write( char[] array ) throws IOException 087 { 088 m_writer.write( array ); 089 } 090 091 public void nl( String value ) throws IOException 092 { 093 m_writer.write( "\n" + m_pad + value ); 094 } 095 096 public void nl( int n ) throws IOException 097 { 098 m_writer.write( "\n" + m_pad + n ); 099 } 100 101 public void nl( char[] array ) throws IOException 102 { 103 m_writer.write( "\n" + m_pad ); 104 m_writer.write( array ); 105 } 106 107 public Buffer indent() 108 { 109 return indent( " " ); 110 } 111 112 public Buffer indent( String indent ) 113 { 114 return new Buffer( m_writer, m_namespace, m_pad + indent ); 115 } 116 117 public boolean isNamespace( String namespace ) 118 { 119 return m_namespace.equals( namespace ); 120 } 121 122 public Buffer namespace( String namespace ) 123 { 124 if( m_namespace.equals( namespace ) ) 125 { 126 return this; 127 } 128 else 129 { 130 return new Buffer( m_writer, namespace, m_pad ); 131 } 132 } 133 }