001 /* 002 * CDDL HEADER START 003 * 004 * The contents of this file are subject to the terms of the 005 * Common Development and Distribution License, Version 1.0 only 006 * (the "License"). You may not use this file except in compliance 007 * with the License. 008 * 009 * You can obtain a copy of the license at 010 * trunk/opends/resource/legal-notices/OpenDS.LICENSE 011 * or https://OpenDS.dev.java.net/OpenDS.LICENSE. 012 * See the License for the specific language governing permissions 013 * and limitations under the License. 014 * 015 * When distributing Covered Code, include this CDDL HEADER in each 016 * file and include the License file at 017 * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, 018 * add the following below this CDDL HEADER, with the fields enclosed 019 * by brackets "[]" replaced with your own identifying information: 020 * Portions Copyright [yyyy] [name of copyright owner] 021 * 022 * CDDL HEADER END 023 * 024 * 025 * Copyright 2008 Sun Microsystems, Inc. 026 */ 027 package org.opends.server.util.table; 028 029 030 031 import java.io.BufferedWriter; 032 import java.io.OutputStream; 033 import java.io.OutputStreamWriter; 034 import java.io.PrintWriter; 035 import java.io.Writer; 036 037 038 039 /** 040 * An interface for creating a tab-separated formatted table. 041 * <p> 042 * This table printer will replace any tab, line-feeds, or carriage 043 * return control characters encountered in a cell with a single 044 * space. 045 */ 046 public final class TabSeparatedTablePrinter extends TablePrinter { 047 048 /** 049 * Table serializer implementation. 050 */ 051 private final class Serializer extends TableSerializer { 052 053 // The current column being output. 054 private int column = 0; 055 056 // Counts the number of separators that should be output the next 057 // time a non-empty cell is displayed. The tab separators are 058 // not displayed immediately so that we can avoid displaying 059 // unnecessary trailing separators. 060 private int requiredSeparators = 0; 061 062 063 064 // Private constructor. 065 private Serializer() { 066 // No implementation required. 067 } 068 069 070 071 /** 072 * {@inheritDoc} 073 */ 074 @Override 075 public void addCell(String s) { 076 // Avoid printing tab separators for trailing empty cells. 077 if (s.length() == 0) { 078 requiredSeparators++; 079 } else { 080 for (int i = 0; i < requiredSeparators; i++) { 081 writer.print('\t'); 082 } 083 requiredSeparators = 1; 084 } 085 086 // Replace all new-lines and tabs with a single space. 087 writer.print(s.replaceAll("[\\t\\n\\r]", " ")); 088 column++; 089 } 090 091 092 093 /** 094 * {@inheritDoc} 095 */ 096 @Override 097 public void addHeading(String s) { 098 if (displayHeadings) { 099 addCell(s); 100 } 101 } 102 103 104 105 /** 106 * {@inheritDoc} 107 */ 108 @Override 109 public void endHeader() { 110 if (displayHeadings) { 111 writer.println(); 112 } 113 } 114 115 116 117 /** 118 * {@inheritDoc} 119 */ 120 @Override 121 public void endRow() { 122 writer.println(); 123 } 124 125 126 127 /** 128 * {@inheritDoc} 129 */ 130 @Override 131 public void endTable() { 132 writer.flush(); 133 } 134 135 136 137 /** 138 * {@inheritDoc} 139 */ 140 @Override 141 public void startHeader() { 142 column = 0; 143 requiredSeparators = 0; 144 } 145 146 147 148 /** 149 * {@inheritDoc} 150 */ 151 @Override 152 public void startRow() { 153 column = 0; 154 requiredSeparators = 0; 155 } 156 } 157 158 // Indicates whether or not the headings should be output. 159 private boolean displayHeadings = false; 160 161 // The output destination. 162 private PrintWriter writer = null; 163 164 165 166 /** 167 * Creates a new tab separated table printer for the specified 168 * output stream. Headings will not be displayed by default. 169 * 170 * @param stream 171 * The stream to output tables to. 172 */ 173 public TabSeparatedTablePrinter(OutputStream stream) { 174 this(new BufferedWriter(new OutputStreamWriter(stream))); 175 } 176 177 178 179 /** 180 * Creates a new tab separated table printer for the specified 181 * writer. Headings will not be displayed by default. 182 * 183 * @param writer 184 * The writer to output tables to. 185 */ 186 public TabSeparatedTablePrinter(Writer writer) { 187 this.writer = new PrintWriter(writer); 188 } 189 190 191 192 /** 193 * Specify whether or not table headings should be displayed. 194 * 195 * @param displayHeadings 196 * <code>true</code> if table headings should be 197 * displayed. 198 */ 199 public void setDisplayHeadings(boolean displayHeadings) { 200 this.displayHeadings = displayHeadings; 201 } 202 203 204 205 /** 206 * {@inheritDoc} 207 */ 208 @Override 209 protected TableSerializer getSerializer() { 210 return new Serializer(); 211 } 212 213 }