/*
* JBoss, Home of Professional Open Source.
* Copyright 2014, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.as.connector.services.resourceadapters.deployment;
import org.jboss.logging.BasicLogger;
import org.jboss.logging.Logger;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Formatter;
import java.util.Locale;
/**
* JBossLogPrintWriter PrintWriter for JBossLogging
*
* @author <a href="mailto:jizhang@redhat.com">Jeff Zhang</a>
*/
public final class JBossLogPrintWriter extends PrintWriter {
private final String deploymentName;
private final BasicLogger logger;
private final Logger.Level level = Logger.Level.INFO;
private StringBuilder buffer = new StringBuilder();
private Formatter formatter;
public JBossLogPrintWriter(String deploymentName, BasicLogger logger) {
super(new OutputStream() {
@Override
public void write(final int b) throws IOException {
// do nothing
}
@Override
public void write(final byte[] b) throws IOException {
// do nothing
}
@Override
public void write(final byte[] b, final int off, final int len) throws IOException {
// do nothing
}
});
this.deploymentName = deploymentName;
this.logger = logger;
}
@Override
public void write(int c) {
synchronized (lock) {
if (c == '\n') {
outputLogger();
} else {
buffer.append((char) c);
}
}
}
@Override
public void write(char[] cbuf, int off, int len) {
synchronized (lock) {
int mark = 0;
int i;
for (i = 0; i < len; i++) {
final char c = cbuf[off + i];
if (c == '\n') {
buffer.append(cbuf, mark + off, i - mark);
outputLogger();
mark = i + 1;
}
}
buffer.append(cbuf, mark + off, i - mark);
}
}
@Override
public void write(char[] buf) {
write(buf, 0, buf.length);
}
@Override
public void write(String str, int off, int len) {
synchronized (lock) {
int mark = 0;
int i;
for (i = 0; i < len; i++) {
final char c = str.charAt(off + i);
if (c == '\n') {
buffer.append(str.substring(mark + off, off + i));
outputLogger();
mark = i + 1;
}
}
buffer.append(str.substring(mark + off, off + i));
}
}
@Override
public void write(String s) {
write(s, 0, s.length());
}
private void outputLogger() {
if (buffer.length() > 0) {
logger.log(level, deploymentName + ": " + buffer.toString());
buffer.setLength(0);
}
}
@Override
public void flush() {
synchronized (lock) {
outputLogger();
}
}
@Override
public void close() {
flush();
}
@Override
public boolean checkError() {
flush();
return false;
}
@Override
protected void setError() {
}
@Override
protected void clearError() {
}
@Override
public void print(boolean b) {
write(String.valueOf(b) );
}
@Override
public void print(char c) {
write(c);
}
@Override
public void print(int i) {
write(String.valueOf(i));
}
@Override
public void print(long l) {
write(String.valueOf(l));
}
@Override
public void print(float f) {
write(String.valueOf(f));
}
@Override
public void print(double d) {
write(String.valueOf(d));
}
@Override
public void print(char[] s) {
write(s);
}
@Override
public void print(String s) {
if (s != null) {
write(s);
}
}
@Override
public void print(Object obj) {
if (obj != null) {
write(String.valueOf(obj));
}
}
private void newLine() {
outputLogger();
}
@Override
public void println() {
newLine();
}
@Override
public void println(boolean x) {
synchronized (lock) {
print(x);
println();
}
}
@Override
public void println(char x) {
synchronized (lock) {
print(x);
println();
}
}
@Override
public void println(int x) {
synchronized (lock) {
print(x);
println();
}
}
@Override
public void println(long x) {
synchronized (lock) {
print(x);
println();
}
}
@Override
public void println(float x) {
synchronized (lock) {
print(x);
println();
}
}
@Override
public void println(double x) {
synchronized (lock) {
print(x);
println();
}
}
@Override
public void println(char[] x) {
synchronized (lock) {
print(x);
println();
}
}
@Override
public void println(String x) {
synchronized (lock) {
print(x);
println();
}
}
@Override
public void println(Object x) {
String s = String.valueOf(x);
synchronized (lock) {
print(s);
println();
}
}
@Override
public JBossLogPrintWriter printf(String format, Object ... args) {
return format(format, args);
}
@Override
public JBossLogPrintWriter printf(Locale l, String format, Object ... args) {
return format(l, format, args);
}
public JBossLogPrintWriter format(String format, Object ... args) {
synchronized (lock) {
if ((formatter == null)
|| (formatter.locale() != Locale.getDefault()))
formatter = new Formatter(this);
formatter.format(Locale.getDefault(), format, args);
}
return this;
}
public JBossLogPrintWriter format(Locale l, String format, Object ... args) {
synchronized (lock) {
if ((formatter == null) || (formatter.locale() != l))
formatter = new Formatter(this, l);
formatter.format(l, format, args);
}
return this;
}
@Override
public JBossLogPrintWriter append(CharSequence csq) {
if (csq != null)
write(csq.toString());
return this;
}
@Override
public JBossLogPrintWriter append(CharSequence csq, int start, int end) {
if (csq != null)
write(csq.subSequence(start, end).toString());
return this;
}
@Override
public JBossLogPrintWriter append(char c) {
write(c);
return this;
}
}