/* The contents of this file are subject to the terms
* of the Common Development and Distribution License
* (the License). You may not use this file except in
* compliance with the License.
*
* You can obtain a copy of the License at
* http://www.sun.com/cddl/cddl.html or
* install_dir/legal/LICENSE
* See the License for the specific language governing
* permission and limitations under the License.
*
* When distributing Covered Code, include this CDDL
* Header Notice in each file and include the License file
* at install_dir/legal/LICENSE.
* If applicable, add the following below the CDDL Header,
* with the fields enclosed by brackets [] replaced by
* your own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
*
* $Id$
*
* Copyright 2005-2009 Sun Microsystems Inc. All Rights Reserved
*/
package com.sun.faban.harness.logging;
import com.sun.faban.harness.common.Config;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
/**
* Protocol handler for log requests.
* @author Ramesh Ramachandran
*/
public class LogHandler implements ProtocolHandler {
private FlexBuffer xBuffer;
private byte[] writeBuffer;
/**
* Sets the config object.
* @param config The singleton config object
*/
public void setConfig(LogConfig config) {
xBuffer = new FlexBuffer(config.readBufferSize);
}
/**
* Sets the selection key for subsequent invocations.
* @param key The nio selection key
*/
public void setKey(SelectionKey key) {
}
/**
* Analyzes the buffer and return read active status.
* @param buffer The buffer to look at
* @param count The number of new bytes in the buffer
* @return True if still active, false if done processing
*/
public boolean doProcessRequest(ByteBuffer buffer, int count){
if (count > 0) {
// Buffer has been written to. Prepare the buffer for reading.
buffer.flip();
// Get the data from the direct buffer.
xBuffer.appendDirect(buffer, count);
/*
PrintWriter debug = null;
try {
debug = new PrintWriter(new FileWriter(Config.TMP_DIR +
"debug.log", true));
} catch (IOException e) {
}
*/
if (!(xBuffer.endsWith("</record>\n")
|| xBuffer.endsWith("</log>\n"))) { // Log record not closed
//debug.println(xBuffer.toString() + " {end of partial read}");
return true;
}
try {
/*
debug.println(xBuffer.toString() + " {end of read}");
debug.flush();
debug.close();
*/
// Copy out the whole record in one piece
int writeSize = xBuffer.size();
if (writeBuffer == null || writeBuffer.length < writeSize)
writeBuffer = new byte[(int) (writeSize * 1.25)];
xBuffer.getBytes(0, writeBuffer, 0, writeSize);
//Open the log file and dump the record/s
String logFile = System.getProperty("faban.log.file");
if(logFile == null)
logFile = Config.TMP_DIR + "log.xml";
FileOutputStream logStream = new FileOutputStream(logFile, true);
logStream.write(writeBuffer, 0, writeSize);
logStream.flush();
logStream.close();
} catch(IOException e) {
// if (debug != null)
// e.printStackTrace(debug);
}
xBuffer.clear();
}
// Return false as we don't care which instance of Handler writes the
// rest of the log record.
return false;
}
/**
* Creates and writes the response to the channel. Returns write
* active status. This method should return true if and only if
* the non-blocking channel cannot take all the response to
* be written.
* @return True if still active, false if done processing
* @exception java.io.IOException Cannot write response to channel
*/
public boolean doProcessResponse() throws IOException {
return false;
}
/**
* Continues writing the response to the channel. This method
* is only called if the initial write did not manage to write
* everything to the non-blocking channel.
* @return True if still active, false if done processing
* @exception java.io.IOException Cannot write response to channel
*/
public boolean doContinueResponse() throws IOException {
return false;
}
/**
* Tests the handler whether it needs to further process this request.
* @return True if the handler still needs to proceed, false if it is done
*/
public boolean requestPending() {
return false;
}
}