DBFormatter.java revision 8af80418ba1ec431c8027fa9668e5678658d3611
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Copyright (c) 2006 Sun Microsystems Inc. All Rights Reserved
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * The contents of this file are subject to the terms
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * of the Common Development and Distribution License
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * (the License). You may not use this file except in
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * compliance with the License.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * You can obtain a copy of the License at
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * https://opensso.dev.java.net/public/CDDLv1.0.html or
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * opensso/legal/CDDLv1.0.txt
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * See the License for the specific language governing
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * permission and limitations under the License.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * When distributing Covered Code, include this CDDL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Header Notice in each file and include the License file
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * at opensso/legal/CDDLv1.0.txt.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * If applicable, add the following below the CDDL Header,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * with the fields enclosed by brackets [] replaced by
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * your own identifying information:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * "Portions Copyrighted [year] [name of copyright owner]"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * $Id: DBFormatter.java,v 1.11 2009/08/19 21:12:50 ww203982 Exp $
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/*
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Portions Copyrighted [2011] [ForgeRock AS]
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterpackage com.sun.identity.log.handlers;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.Map;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.Set;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.StringTokenizer;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.logging.Formatter;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.logging.Handler;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.log.LogConstants;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.log.LogManager;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.log.LogManagerUtil;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.log.spi.Debug;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.log.spi.ITimestampGenerator;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * This Formatter provides support for formatting LogRecords that will help
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Database Logging.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <p>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Typically this Formatter will be associated with a DBHandler(a handler meant
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * to handle Database logging). <tt> DBFormatter </TT> takes a LogRecord and
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * converts it to a Formatted string which DBHandler can understand.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterpublic class DBFormatter extends Formatter {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private LogManager lmanager = LogManagerUtil.getLogManager();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private ITimestampGenerator secureTimestampGenerator;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private String dateTimeFormat = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private boolean isMySQL = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Creates <code>DBFormatter</code> object
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public DBFormatter() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String timestampGeneratorClass =
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster lmanager.getProperty(LogConstants.SECURE_TIMESTAMP_GENERATOR);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Class clz = Class.forName(timestampGeneratorClass);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster secureTimestampGenerator = (ITimestampGenerator)clz.newInstance();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (ClassNotFoundException cnfe) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Debug.error("DBFormatter: TimeStamp Generator Class " +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "not found", cnfe);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (InstantiationException ie) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Debug.error("DBFormatter: Timestamp Generator Could not " +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "be Instantiated", ie);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (IllegalAccessException iae) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Debug.error("DBFormatter: Timestamp Generator Could not " +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "be Instantiated", iae);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String driver = lmanager.getProperty(LogConstants.DB_DRIVER);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((driver == null) || (driver.length() == 0)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Debug.error("DBFormatter:DB driver not provided; assume not MySQL");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if(driver.toLowerCase().indexOf("oracle") != -1) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster isMySQL = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster dateTimeFormat =
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster lmanager.getProperty(LogConstants.ORA_DBDATETIME_FORMAT);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if (driver.toLowerCase().indexOf("mysql") != -1) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster isMySQL = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster dateTimeFormat =
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster lmanager.getProperty(LogConstants.MYSQL_DBDATETIME_FORMAT);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster isMySQL = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster dateTimeFormat =
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster lmanager.getProperty(LogConstants.ORA_DBDATETIME_FORMAT);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Debug.error("DBFormatter:assuming driver: '" + driver +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "' is Oracle-compatible.");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns the set of all fields converted into a COMMA seperated
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * string. A typical sql query for logging a record looks like this. <p>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * insert into table "amSSO_access" (time, data, loginid, domain, level,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * ipAddress, hostname) values('10:10:10', '10th June, 2002',
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * ..., ..., ...)<p>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * The getHead method returns back the set of all fields converted into a
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * COMMA seperated string. It is the duty of the formatter to fetch the all
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * field set from the LogManager and convert into a COMMA seperated string.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * By doing this the handler can be kept independent of the all field and
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * selected field set.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param h The target handler (can be null)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return the set of all fields converted into a COMMA seperated string.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster @Override
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public String getHead(Handler h) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String retString = lmanager.getProperty(LogConstants.ALL_FIELDS);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (Debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Debug.message("DBFormatter: Returned String from getHead is "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + retString);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return retString;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns a null string whenever called.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param h The target handler (can be null)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return a null string whenever called.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster @Override
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public String getTail(Handler h) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return "";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Format the given LogRecord and return back a formatted String.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <p>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * The formatted String has the values of the fields which are selected and
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * NULL if any field is not selected. All fields are enclosed in single-
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * quotes.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <p>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * A typical formatted string can be given as follows:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * '10:10:10', '10th June, 2002', 'NULL', 'NULL',
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * 'Session Created Successfull', 'INFO', 'NULL', 'NULL'
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <p>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * This formatted string will be enclosed within braces by Handler to
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * construct the query string.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param logRecord the log record to be formatted.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return formatted string.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public String format(java.util.logging.LogRecord logRecord) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map logInfoTable = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((LogManagerUtil.isAMLoggingMode()) &&
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster (logRecord instanceof com.sun.identity.log.ILogRecord)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster logInfoTable = ((com.sun.identity.log.ILogRecord) logRecord)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster .getLogInfoMap();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuilder sbuffer = new StringBuilder();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String strTime;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if(secureTimestampGenerator != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster strTime = secureTimestampGenerator.getTimestamp();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster strTime ="";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /*
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * currently assuming that the date/time comes back in
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * the "yyyy-mm-dd hh:mn:ss" format (24hr). if it changes
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * then there'll need to be a change to the dbdate-format
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * attribute.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String toDate = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (!isMySQL) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster toDate = "TO_DATE('";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster toDate = "STR_TO_DATE('";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sbuffer.append(toDate);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sbuffer.append(strTime);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sbuffer.append("', '");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sbuffer.append(dateTimeFormat);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sbuffer.append("'), ");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /* Need to check for single-quote in the DATA field to be written
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * to the db
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String tstr = formatMessage(logRecord);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((tstr == null) || (tstr.length() <= 0)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster tstr = LogConstants.NOTAVAIL;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if (tstr.length() > 0 ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String str1 = tstr;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (tstr.indexOf("'") != -1) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster str1 = checkEscapes(tstr, "'", "''");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String str2 = str1;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Oracle doesn't have a problem with backslash
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (isMySQL) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (str1.indexOf("\\") != -1) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster str2 = checkEscapes(str1, "\\", "\\\\");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster tstr = str2;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sbuffer.append("'").append(tstr).append("', ");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (Debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Debug.message("DBFormatter:thisfield3 = #" + sbuffer.toString()
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "#");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String[] allFields = lmanager.getAllFields();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set selectedFields = lmanager.getSelectedFieldSet();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int len = 0;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (allFields != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster len = allFields.length;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (int i = 2; i < len - 1; i ++) { // first 2 fields are compulsory
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((logInfoTable != null) &&
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster (selectedFields != null) &&
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster (selectedFields.contains(allFields[i]))) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // if there are any single-quotes in the data, they have to be
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // made double-single-quotes, so it'll pass through sql
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String tempstr = (String)logInfoTable.get(allFields[i]);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((tempstr != null) &&
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster (tempstr.length() > 0) &&
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster (tempstr.indexOf("'") != -1)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringTokenizer tmps = new StringTokenizer(tempstr, "'");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuilder thisfield = new StringBuilder();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (Debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Debug.message("DBFormatter:found single-quote in: "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + tempstr);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // funky case of "'" at the beginning
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (tempstr.indexOf("'") == 0) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster thisfield.append("''");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (tmps.hasMoreTokens()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster thisfield.append(tmps.nextToken());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (tmps.hasMoreTokens()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster thisfield.append(tmps.nextToken());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while (tmps.hasMoreTokens()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster thisfield.append("''").append(tmps.nextToken());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // if string ends in "'"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (tempstr.indexOf("'", tempstr.length()-1) != -1) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster thisfield.append("''");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster tempstr = thisfield.toString();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (tempstr == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster tempstr = LogConstants.NOTAVAIL;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sbuffer.append("'").append(tempstr).append("', ");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sbuffer.append("'").append(LogConstants.NOTAVAIL).append(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "'").append(", ");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (Debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Debug.message("DBFormatter:format1: sbuffer = "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + sbuffer.toString());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((selectedFields != null) && (logInfoTable != null) &&
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster (selectedFields.contains(allFields[len-1]))) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String tmpstr = (String)logInfoTable.get(allFields[len-1]);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (tmpstr == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster tmpstr = LogConstants.NOTAVAIL;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sbuffer.append("'").append(tmpstr).append("'");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sbuffer.append("'").append(LogConstants.NOTAVAIL).append("'");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (Debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Debug.message("DBFormatter:format2: sbuffer = "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + sbuffer.toString());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return sbuffer.toString();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private String checkEscapes(String theString, String charToEscape,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String doubledChar)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringTokenizer tmps = new StringTokenizer(theString, charToEscape);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuilder thisfield = new StringBuilder();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (Debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Debug.message("DBFormatter:looking for " + charToEscape +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster " in data: " + theString);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /*
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Weird cases of char at beginning or end of the data
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (theString.indexOf(charToEscape) == 0) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster thisfield.append(doubledChar);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (tmps.hasMoreTokens()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster thisfield.append(tmps.nextToken());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (Debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Debug.message("DBFormatter:thisfield1 = #" +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster thisfield.toString() + "#");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (tmps.hasMoreTokens()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster thisfield.append(tmps.nextToken());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while (tmps.hasMoreTokens()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster thisfield.append(doubledChar).append(tmps.nextToken());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (Debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Debug.message("DBFormatter:thisfield2 = #" +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster thisfield.toString() + "#");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /*
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * See if it ends in "'"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (theString.indexOf(charToEscape, theString.length()-1) != -1) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster thisfield.append(doubledChar);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (thisfield.toString());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster}