AbstractTextFormatWriter.java
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.geometry.io.core.utils;
import java.io.Closeable;
import java.io.IOException;
import java.io.Writer;
import java.util.function.DoubleFunction;
import org.apache.commons.geometry.io.core.internal.GeometryIOUtils;
/** Base type for classes that write text-based data formats. This class
* provides a number of common configuration options and utility methods.
*/
public abstract class AbstractTextFormatWriter implements Closeable {
/** The default line separator value. */
private static final String DEFAULT_LINE_SEPARATOR = "\n";
/** Underlying writer instance. */
private final Writer writer;
/** Line separator string. */
private String lineSeparator = DEFAULT_LINE_SEPARATOR;
/** Double format function. */
private DoubleFunction<String> doubleFormat;
/** Construct a new instance that writes content to the given writer.
* @param writer writer instance
*/
protected AbstractTextFormatWriter(final Writer writer) {
this(writer, Double::toString);
}
/** Construct a new instance that writes content to the given writer and uses the
* decimal format instance for creating floating-point string representations.
* @param writer writer instance
* @param doubleFormat double format function
*/
protected AbstractTextFormatWriter(final Writer writer, final DoubleFunction<String> doubleFormat) {
this.writer = writer;
this.doubleFormat = doubleFormat;
}
/** Get the current line separator. This value defaults to {@value #DEFAULT_LINE_SEPARATOR}.
* @return the current line separator
*/
public String getLineSeparator() {
return lineSeparator;
}
/** Set the line separator.
* @param lineSeparator the line separator to use
*/
public void setLineSeparator(final String lineSeparator) {
this.lineSeparator = lineSeparator;
}
/** Get the function used to format floating point output.
* @return the double format function
*/
public DoubleFunction<String> getDoubleFormat() {
return doubleFormat;
}
/** Set the function used to format floating point output.
* @param doubleFormat double format function
*/
public void setDoubleFormat(final DoubleFunction<String> doubleFormat) {
this.doubleFormat = doubleFormat;
}
/** {@inheritDoc} */
@Override
public void close() {
GeometryIOUtils.closeUnchecked(writer);
}
/** Get the underlying writer instance.
* @return writer instance
*/
protected Writer getWriter() {
return writer;
}
/** Write a double value formatted using the configured decimal format function.
* @param d value to write
* @throws java.io.UncheckedIOException if an I/O error occurs
*/
protected void write(final double d) {
write(doubleFormat.apply(d));
}
/** Write an integer value.
* @param n value to write
* @throws java.io.UncheckedIOException if an I/O error occurs
*/
protected void write(final int n) {
write(String.valueOf(n));
}
/** Write a char value.
* @param c character to write
* @throws java.io.UncheckedIOException if an I/O error occurs
*/
protected void write(final char c) {
try {
writer.write(c);
} catch (IOException exc) {
throw GeometryIOUtils.createUnchecked(exc);
}
}
/** Write a string.
* @param str string to write
* @throws java.io.UncheckedIOException if an I/O error occurs
*/
protected void write(final String str) {
try {
writer.write(str);
} catch (IOException exc) {
throw GeometryIOUtils.createUnchecked(exc);
}
}
/** Write the configured line separator to the output.
* @throws java.io.UncheckedIOException if an I/O error occurs
*/
protected void writeNewLine() {
write(lineSeparator);
}
}