/* * ProActive Parallel Suite(TM): * The Open Source library for parallel and distributed * Workflows & Scheduling, Orchestration, Cloud Automation * and Big Data Analysis on Enterprise Grids & Clouds. * * Copyright (c) 2007 - 2017 ActiveEon * Contact: contact@activeeon.com * * This library is free software: you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation: version 3 of * the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * If needed, contact us to obtain a release under GPL Version 2 or 3 * or a different license than the AGPL. */ package org.ow2.proactive.utils; import java.io.IOException; import java.io.PrintStream; import java.io.Writer; /** * BoundedStringWriter that keeps a limited amount (maxLength) of chars into * a sliding (elements are added and removed from the head) buffer and always prints them to an output sink. * It ensures the size is never greater than the maximum size given in the constructor. * Closing a <tt>BoundedStringWriter</tt> has no effect. The methods in this class * can be called after the stream has been closed without generating an * <tt>IOException</tt>. * * @author The ProActive Team * @since ProActive Scheduling 3.2 */ public class BoundedStringWriter extends Writer { private final PrintStream outputSink; private final StringBuilder content; private final int maxSize; /** * Create a new bounded string writer using the default maximum size. */ public BoundedStringWriter(PrintStream outputSink, final int maxSize) { this.outputSink = outputSink; this.maxSize = maxSize; this.content = new StringBuilder(); } /** {@inheritDoc} */ @Override public void write(char[] c, int off, int len) { int nextLen = this.content.length() + len; if (nextLen <= this.maxSize) { this.content.append(c, off, len); } else { // nextLen > this.maxSize if (len <= this.maxSize) { this.content.delete(0, nextLen - this.maxSize); this.content.append(c, off, len); } else { this.content.delete(0, this.maxSize); this.content.append(c, len - this.maxSize, this.maxSize); } } outputSink.print(new String(c, off, len)); } /** * Return the string builder itself. * * @return StringBuilder holding the current buffer value. */ public StringBuilder getBuilder() { return this.content; } /** {@inheritDoc} */ @Override public String toString() { return this.content.toString(); } /** * Closing a <tt>BoundedStringWriter</tt> has no effect. The methods in this * class can be called after the stream has been closed without generating * an <tt>IOException</tt>. */ @Override public void close() throws IOException { } /** * Flush the stream. */ @Override public void flush() throws IOException { } }