001/* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017package org.apache.juneau.csv; 018 019import java.io.*; 020 021import org.apache.juneau.*; 022import org.apache.juneau.serializer.*; 023 024/** 025 * Specialized writer for serializing CSV. 026 * 027 * <h5 class='section'>Notes:</h5><ul> 028 * <li class='note'> 029 * This class is not intended for external use. 030 * </ul> 031 */ 032@SuppressWarnings("resource") 033public class CsvWriter extends SerializerWriter { 034 035 /** 036 * Constructor. 037 * 038 * @param out The writer being wrapped. 039 * @param useWhitespace If <jk>true</jk>, tabs and spaces will be used in output. 040 * @param maxIndent The maximum indentation level. 041 * @param quoteChar The quote character to use (i.e. <js>'\''</js> or <js>'"'</js>) 042 * @param trimStrings If <jk>true</jk>, strings will be trimmed before being serialized. 043 * @param uriResolver The URI resolver for resolving URIs to absolute or root-relative form. 044 */ 045 protected CsvWriter(Writer out, boolean useWhitespace, int maxIndent, char quoteChar, boolean trimStrings, UriResolver uriResolver) { 046 super(out, useWhitespace, maxIndent, trimStrings, quoteChar, uriResolver); 047 } 048 049 @Override /* Overridden from SerializerWriter */ 050 public CsvWriter append(char c) { 051 super.append(c); 052 return this; 053 } 054 055 @Override /* Overridden from SerializerWriter */ 056 public CsvWriter append(char[] value) { 057 super.append(value); 058 return this; 059 } 060 061 @Override /* Overridden from SerializerWriter */ 062 public CsvWriter append(int indent, char c) { 063 super.append(indent, c); 064 return this; 065 } 066 067 @Override /* Overridden from SerializerWriter */ 068 public CsvWriter append(int indent, String text) { 069 super.append(indent, text); 070 return this; 071 } 072 073 @Override /* Overridden from SerializerWriter */ 074 public CsvWriter append(Object text) { 075 super.append(text); 076 return this; 077 } 078 079 @Override /* Overridden from SerializerWriter */ 080 public CsvWriter append(String text) { 081 super.append(text); 082 return this; 083 } 084 085 @Override /* Overridden from SerializerWriter */ 086 public CsvWriter appendIf(boolean b, char c) { 087 super.appendIf(b, c); 088 return this; 089 } 090 091 @Override /* Overridden from SerializerWriter */ 092 public CsvWriter appendIf(boolean b, String text) { 093 super.appendIf(b, text); 094 return this; 095 } 096 097 @Override /* Overridden from SerializerWriter */ 098 public CsvWriter appendln(int indent, String text) { 099 super.appendln(indent, text); 100 return this; 101 } 102 103 @Override /* Overridden from SerializerWriter */ 104 public CsvWriter appendln(String text) { 105 super.appendln(text); 106 return this; 107 } 108 109 @Override /* Overridden from SerializerWriter */ 110 public CsvWriter appendUri(Object value) { 111 super.appendUri(value); 112 return this; 113 } 114 115 @Override /* Overridden from SerializerWriter */ 116 public CsvWriter cr(int depth) { 117 super.cr(depth); 118 return this; 119 } 120 121 @Override /* Overridden from SerializerWriter */ 122 public CsvWriter cre(int depth) { 123 super.cre(depth); 124 return this; 125 } 126 127 @Override /* Overridden from SerializerWriter */ 128 public CsvWriter i(int indent) { 129 super.i(indent); 130 return this; 131 } 132 133 @Override /* Overridden from SerializerWriter */ 134 public CsvWriter ie(int indent) { 135 super.ie(indent); 136 return this; 137 } 138 139 @Override /* Overridden from SerializerWriter */ 140 public CsvWriter nl(int indent) { 141 super.nl(indent); 142 return this; 143 } 144 145 @Override /* Overridden from SerializerWriter */ 146 public CsvWriter nlIf(boolean flag, int indent) { 147 super.nlIf(flag, indent); 148 return this; 149 } 150 151 @Override /* Overridden from SerializerWriter */ 152 public CsvWriter q() { 153 super.q(); 154 return this; 155 } 156 157 @Override /* Overridden from SerializerWriter */ 158 public CsvWriter s() { 159 super.s(); 160 return this; 161 } 162 163 @Override /* Overridden from SerializerWriter */ 164 public CsvWriter sIf(boolean flag) { 165 super.sIf(flag); 166 return this; 167 } 168 169 @Override /* Overridden from SerializerWriter */ 170 public CsvWriter w(char value) { 171 super.w(value); 172 return this; 173 } 174 175 @Override /* Overridden from SerializerWriter */ 176 public CsvWriter w(String value) { 177 super.w(value); 178 return this; 179 } 180 181 /** 182 * Writes an entry to the writer. 183 * 184 * @param value The value to write. 185 */ 186 public void writeEntry(Object value) { 187 if (value == null) 188 w("null"); 189 else { 190 var s = value.toString(); 191 var mustQuote = false; 192 for (var i = 0; i < s.length() && ! mustQuote; i++) { 193 var c = s.charAt(i); 194 if (Character.isWhitespace(c) || c == ',') 195 mustQuote = true; 196 } 197 if (mustQuote) 198 w('"').w(s).w('"'); 199 else 200 w(s); 201 } 202 } 203}