001: /*-------------------------------------------------------------------------
002: *
003: * Copyright (c) 2004-2005, PostgreSQL Global Development Group
004: *
005: * IDENTIFICATION
006: * $PostgreSQL: pgjdbc/org/postgresql/util/ServerErrorMessage.java,v 1.11 2007/07/27 10:15:39 jurka Exp $
007: *
008: *-------------------------------------------------------------------------
009: */
010: package org.postgresql.util;
011:
012: import java.util.Hashtable;
013: import java.io.Serializable;
014:
015: public class ServerErrorMessage implements Serializable {
016:
017: private static final Character SEVERITY = new Character('S');
018: private static final Character MESSAGE = new Character('M');
019: private static final Character DETAIL = new Character('D');
020: private static final Character HINT = new Character('H');
021: private static final Character POSITION = new Character('P');
022: private static final Character WHERE = new Character('W');
023: private static final Character FILE = new Character('F');
024: private static final Character LINE = new Character('L');
025: private static final Character ROUTINE = new Character('R');
026: private static final Character SQLSTATE = new Character('C');
027: private static final Character INTERNAL_POSITION = new Character(
028: 'p');
029: private static final Character INTERNAL_QUERY = new Character('q');
030:
031: private final Hashtable m_mesgParts = new Hashtable();
032: private final int verbosity;
033:
034: public ServerErrorMessage(String p_serverError, int verbosity) {
035: this .verbosity = verbosity;
036:
037: char[] l_chars = p_serverError.toCharArray();
038: int l_pos = 0;
039: int l_length = l_chars.length;
040: while (l_pos < l_length) {
041: char l_mesgType = l_chars[l_pos];
042: if (l_mesgType != '\0') {
043: l_pos++;
044: int l_startString = l_pos;
045: while (l_chars[l_pos] != '\0' && l_pos < l_length) {
046: l_pos++;
047: }
048: String l_mesgPart = new String(l_chars, l_startString,
049: l_pos - l_startString);
050: m_mesgParts.put(new Character(l_mesgType), l_mesgPart);
051: }
052: l_pos++;
053: }
054: }
055:
056: public String getSQLState() {
057: return (String) m_mesgParts.get(SQLSTATE);
058: }
059:
060: public String getMessage() {
061: return (String) m_mesgParts.get(MESSAGE);
062: }
063:
064: public String getSeverity() {
065: return (String) m_mesgParts.get(SEVERITY);
066: }
067:
068: public String getDetail() {
069: return (String) m_mesgParts.get(DETAIL);
070: }
071:
072: public String getHint() {
073: return (String) m_mesgParts.get(HINT);
074: }
075:
076: public int getPosition() {
077: return getIntegerPart(POSITION);
078: }
079:
080: public String getWhere() {
081: return (String) m_mesgParts.get(WHERE);
082: }
083:
084: public String getFile() {
085: return (String) m_mesgParts.get(FILE);
086: }
087:
088: public int getLine() {
089: return getIntegerPart(LINE);
090: }
091:
092: public String getRoutine() {
093: return (String) m_mesgParts.get(ROUTINE);
094: }
095:
096: public String getInternalQuery() {
097: return (String) m_mesgParts.get(INTERNAL_QUERY);
098: }
099:
100: public int getInternalPosition() {
101: return getIntegerPart(INTERNAL_POSITION);
102: }
103:
104: private int getIntegerPart(Character c) {
105: String s = (String) m_mesgParts.get(c);
106: if (s == null)
107: return 0;
108: return Integer.parseInt(s);
109: }
110:
111: public String toString() {
112: //Now construct the message from what the server sent
113: //The general format is:
114: //SEVERITY: Message \n
115: // Detail: \n
116: // Hint: \n
117: // Position: \n
118: // Where: \n
119: // Internal Query: \n
120: // Internal Position: \n
121: // Location: File:Line:Routine \n
122: // SQLState: \n
123: //
124: //Normally only the message and detail is included.
125: //If INFO level logging is enabled then detail, hint, position and where are
126: //included. If DEBUG level logging is enabled then all information
127: //is included.
128:
129: StringBuffer l_totalMessage = new StringBuffer();
130: String l_message = (String) m_mesgParts.get(SEVERITY);
131: if (l_message != null)
132: l_totalMessage.append(l_message).append(": ");
133: l_message = (String) m_mesgParts.get(MESSAGE);
134: if (l_message != null)
135: l_totalMessage.append(l_message);
136: l_message = (String) m_mesgParts.get(DETAIL);
137: if (l_message != null)
138: l_totalMessage.append("\n ").append(
139: GT.tr("Detail: {0}", l_message));
140: if (verbosity > 0) {
141: l_message = (String) m_mesgParts.get(HINT);
142: if (l_message != null)
143: l_totalMessage.append("\n ").append(
144: GT.tr("Hint: {0}", l_message));
145: l_message = (String) m_mesgParts.get(POSITION);
146: if (l_message != null)
147: l_totalMessage.append("\n ").append(
148: GT.tr("Position: {0}", l_message));
149: l_message = (String) m_mesgParts.get(WHERE);
150: if (l_message != null)
151: l_totalMessage.append("\n ").append(
152: GT.tr("Where: {0}", l_message));
153: }
154: if (verbosity > 2) {
155: String l_internalQuery = (String) m_mesgParts
156: .get(INTERNAL_QUERY);
157: if (l_internalQuery != null)
158: l_totalMessage.append("\n ").append(
159: GT.tr("Internal Query: {0}", l_internalQuery));
160: String l_internalPosition = (String) m_mesgParts
161: .get(INTERNAL_POSITION);
162: if (l_internalPosition != null)
163: l_totalMessage.append("\n ").append(
164: GT.tr("Internal Position: {0}",
165: l_internalPosition));
166:
167: String l_file = (String) m_mesgParts.get(FILE);
168: String l_line = (String) m_mesgParts.get(LINE);
169: String l_routine = (String) m_mesgParts.get(ROUTINE);
170: if (l_file != null || l_line != null || l_routine != null)
171: l_totalMessage
172: .append("\n ")
173: .append(
174: GT
175: .tr(
176: "Location: File: {0}, Routine: {1}, Line: {2}",
177: new Object[] { l_file,
178: l_routine,
179: l_line }));
180: l_message = (String) m_mesgParts.get(SQLSTATE);
181: if (l_message != null)
182: l_totalMessage.append("\n ").append(
183: GT.tr("Server SQLState: {0}", l_message));
184: }
185:
186: return l_totalMessage.toString();
187: }
188: }
|