001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 package org.apache.hadoop.record.compiler; 019 020 import java.util.ArrayList; 021 022 import org.apache.hadoop.classification.InterfaceAudience; 023 import org.apache.hadoop.classification.InterfaceStability; 024 025 /** 026 * A wrapper around StringBuffer that automatically does indentation 027 * 028 * @deprecated Replaced by <a href="https://hadoop.apache.org/avro/">Avro</a>. 029 */ 030 @Deprecated 031 @InterfaceAudience.Public 032 @InterfaceStability.Stable 033 public class CodeBuffer { 034 035 static private ArrayList<Character> startMarkers = new ArrayList<Character>(); 036 static private ArrayList<Character> endMarkers = new ArrayList<Character>(); 037 038 static { 039 addMarkers('{', '}'); 040 addMarkers('(', ')'); 041 } 042 043 static void addMarkers(char ch1, char ch2) { 044 startMarkers.add(ch1); 045 endMarkers.add(ch2); 046 } 047 048 private int level = 0; 049 private int numSpaces = 2; 050 private boolean firstChar = true; 051 private StringBuffer sb; 052 053 /** Creates a new instance of CodeBuffer */ 054 CodeBuffer() { 055 this(2, ""); 056 } 057 058 CodeBuffer(String s) { 059 this(2, s); 060 } 061 062 CodeBuffer(int numSpaces, String s) { 063 sb = new StringBuffer(); 064 this.numSpaces = numSpaces; 065 this.append(s); 066 } 067 068 void append(String s) { 069 int length = s.length(); 070 for (int idx = 0; idx < length; idx++) { 071 char ch = s.charAt(idx); 072 append(ch); 073 } 074 } 075 076 void append(char ch) { 077 if (endMarkers.contains(ch)) { 078 level--; 079 } 080 if (firstChar) { 081 for (int idx = 0; idx < level; idx++) { 082 for (int num = 0; num < numSpaces; num++) { 083 rawAppend(' '); 084 } 085 } 086 } 087 rawAppend(ch); 088 firstChar = false; 089 if (startMarkers.contains(ch)) { 090 level++; 091 } 092 if (ch == '\n') { 093 firstChar = true; 094 } 095 } 096 097 private void rawAppend(char ch) { 098 sb.append(ch); 099 } 100 101 @Override 102 public String toString() { 103 return sb.toString(); 104 } 105 }