blob: 43f0f8d32506476824c41bed6826d7dfb94f267f [file] [log] [blame]
/*
* 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.
*/
/*
* $Id$
*/
package org.apache.xalan.lib.sql;
import java.sql.SQLException;
import java.sql.SQLWarning;
import org.apache.xml.dtm.DTM;
import org.apache.xml.dtm.DTMManager;
/**
*
* A base class that will convert an exception into an XML stream
* that can be returned in place of the standard result. The XML
* format returned is a follows.
*
* <ext-error>
* <message> The Message for a generic error </message>
* <sql-error>
* <message> SQL Message from the Exception thrown </message>
* <code> SQL Error Code </stack>
* </sql-error>
* <ext-error>
*
*/
/**
* The SQL Document is the main controlling class the executesa SQL Query
*/
public class SQLErrorDocument extends DTMDocument
{
/**
*/
private static final String S_EXT_ERROR = "ext-error";
/**
*/
private static final String S_SQL_ERROR = "sql-error";
/**
*/
private static final String S_MESSAGE = "message";
/**
*/
private static final String S_CODE = "code";
/**
*/
private static final String S_STATE = "state";
/**
*/
private static final String S_SQL_WARNING = "sql-warning";
/**
*/
private int m_ErrorExt_TypeID = DTM.NULL;
/**
*/
private int m_Message_TypeID = DTM.NULL;
/**
*/
private int m_Code_TypeID = DTM.NULL;
/**
*/
private int m_State_TypeID = DTM.NULL;
/**
*/
private int m_SQLWarning_TypeID = DTM.NULL;
/**
*/
private int m_SQLError_TypeID = DTM.NULL;
/**
*/
private int m_rootID = DTM.NULL;
/**
*/
private int m_extErrorID = DTM.NULL;
/**
*/
private int m_MainMessageID = DTM.NULL;
/**
* Build up an SQLErrorDocument that includes the basic error information
* along with the Extended SQL Error information.
* @param mgr
* @param ident
* @param error
*/
public SQLErrorDocument( DTMManager mgr, int ident, SQLException error )
{
super(mgr, ident);
createExpandedNameTable();
buildBasicStructure(error);
int sqlError = addElement(2, m_SQLError_TypeID, m_extErrorID, m_MainMessageID);
int element = DTM.NULL;
element = addElementWithData(
new Integer(error.getErrorCode()), 3,
m_Code_TypeID, sqlError, element);
element = addElementWithData(
error.getLocalizedMessage(), 3,
m_Message_TypeID, sqlError, element);
// this.dumpDTM();
}
/**
* Build up an Error Exception with just the Standard Error Information
* @param mgr
* @param ident
* @param error
*/
public SQLErrorDocument( DTMManager mgr, int ident, Exception error )
{
super(mgr, ident);
createExpandedNameTable();
buildBasicStructure(error);
}
/**
* Build up an Error Exception with just the Standard Error Information
* @param mgr
* @param ident
* @param error
*/
public SQLErrorDocument(DTMManager mgr, int ident, Exception error, SQLWarning warning, boolean full)
{
super(mgr, ident);
createExpandedNameTable();
buildBasicStructure(error);
SQLException se = null;
int prev = m_MainMessageID;
boolean inWarnings = false;
if ( error != null && error instanceof SQLException )
se = (SQLException)error;
else if ( full && warning != null )
{
se = warning;
inWarnings = true;
}
while ( se != null )
{
int sqlError = addElement(2, inWarnings ? m_SQLWarning_TypeID : m_SQLError_TypeID, m_extErrorID, prev);
prev = sqlError;
int element = DTM.NULL;
element = addElementWithData(
new Integer(se.getErrorCode()), 3,
m_Code_TypeID, sqlError, element);
element = addElementWithData(
se.getLocalizedMessage(), 3,
m_Message_TypeID, sqlError, element);
if ( full )
{
String state = se.getSQLState();
if ( state != null && state.length() > 0 )
element = addElementWithData(
state, 3,
m_State_TypeID, sqlError, element);
if ( inWarnings )
se = ((SQLWarning)se).getNextWarning();
else
se = se.getNextException();
}
else
se = null;
}
}
/**
* Build up the basic structure that is common for each error.
* @param e
* @return
*/
private void buildBasicStructure( Exception e )
{
m_rootID = addElement(0, m_Document_TypeID, DTM.NULL, DTM.NULL);
m_extErrorID = addElement(1, m_ErrorExt_TypeID, m_rootID, DTM.NULL);
m_MainMessageID = addElementWithData
(e != null ? e.getLocalizedMessage() : "SQLWarning", 2, m_Message_TypeID, m_extErrorID, DTM.NULL);
}
/**
* Populate the Expanded Name Table with the Node that we will use.
* Keep a reference of each of the types for access speed.
* @return
*/
protected void createExpandedNameTable( )
{
super.createExpandedNameTable();
m_ErrorExt_TypeID =
m_expandedNameTable.getExpandedTypeID(S_NAMESPACE, S_EXT_ERROR, DTM.ELEMENT_NODE);
m_SQLError_TypeID =
m_expandedNameTable.getExpandedTypeID(S_NAMESPACE, S_SQL_ERROR, DTM.ELEMENT_NODE);
m_Message_TypeID =
m_expandedNameTable.getExpandedTypeID(S_NAMESPACE, S_MESSAGE, DTM.ELEMENT_NODE);
m_Code_TypeID =
m_expandedNameTable.getExpandedTypeID(S_NAMESPACE, S_CODE, DTM.ELEMENT_NODE);
m_State_TypeID =
m_expandedNameTable.getExpandedTypeID(S_NAMESPACE, S_STATE, DTM.ELEMENT_NODE);
m_SQLWarning_TypeID =
m_expandedNameTable.getExpandedTypeID(S_NAMESPACE, S_SQL_WARNING, DTM.ELEMENT_NODE);
}
}