/*
* Created on 21-June-2006
* Copyright (C) 2006 by Andrea Vacondio.
*
*
* This library is provided under dual licenses.
* You may choose the terms of the Lesser General Public License version 2.1 or the General Public License version 2
* License at your discretion.
*
*
* This library 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;
* version 2.1 of the License.
*
* This library 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 library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*
*
* This program is free software; you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation;
* either version 2 of the License.
*
* This program 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 General Public License for more details.
* You should have received a copy of the GNU General Public License along with this program;
* if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.pdfsam.emp4j.messages.sources;
import java.io.File;
import java.net.URL;
import org.dom4j.Document;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.pdfsam.emp4j.messages.interfaces.AbstractMessagesSource;
import org.w3c.dom.DOMException;
/**
* Implementation of the MessageSourceInterface. It gets exception messages from an xml source
* @author Andrea Vacondio
*/
public class XmlMessagesSource extends AbstractMessagesSource {
private static final long serialVersionUID = -5549563695772599153L;
private transient Document document;
public XmlMessagesSource(Node node) throws Exception {
super(node);
Node arg1 = node.selectSingleNode("xmlsource/@filename");
if (arg1 != null) {
document = getDocument(arg1.getText());
} else {
throw new DOMException(DOMException.NOT_FOUND_ERR, "Error reading configuration node, node is null.");
}
}
/**
* This method tries to get the Document containing the exception messages. First it tries using
* <code>filename</code> as a path to file. Second it tries to use it as Resource name or a SystemResource name.
* @param filename
* @return the Document object
* @throws Exception
*/
private Document getDocument(String filename) throws Exception {
Document retVal;
SAXReader reader = new SAXReader();
File resourceFile = new File(filename);
if (resourceFile.exists()) {
retVal = reader.read(resourceFile);
} else {
ClassLoader cl = XmlMessagesSource.class.getClassLoader();
URL resourceUrl = null;
if (cl != null) {
resourceUrl = cl.getResource(filename);
} else {
resourceUrl = ClassLoader.getSystemResource(filename);
}
if (resourceUrl != null) {
retVal = reader.read(resourceUrl);
} else {
throw new NullPointerException("Cannot locate XmlMessageSource data file.");
}
}
return retVal;
}
public String getLocalizedExceptionMessage(Object exceptionTypeKey, int exceptionErrorCode) throws Exception {
return getExceptionMessage(exceptionTypeKey, exceptionErrorCode);
}
public String getExceptionMessage(Object exceptionTypeKey, int exceptionErrorCode) throws Exception {
StringBuffer sb = new StringBuffer();
sb.append(getTypeDescription(exceptionTypeKey.toString()));
sb.append(padString(Integer.toString(exceptionErrorCode), 3, '0', true));
sb.append(" - ");
Node node = document.selectSingleNode("/exception-types/type[@key=\"" + exceptionTypeKey.toString() + "\"]/exception[@errorcode=\""
+ exceptionErrorCode + "\"]/@message");
if (node != null) {
sb.append(node.getText());
}
return sb.toString();
}
/**
* @param exceptionTypeKey
* the given exception type key
* @return the associated description
* @throws Exception
*/
private String getTypeDescription(String exceptionTypeKey) throws Exception {
String retVal = "UNK";
Node node = document.selectSingleNode("/exception-types/type[@key=\"" + exceptionTypeKey + "\"]/@description");
if (node != null) {
retVal = node.getText();
}
return retVal;
}
/**
* Given a string s, length n it fills with char c till length n
* @param s
* input String
* @param n
* output string length
* @param c
* char
* @param paddingLeft
* if <code>true</code> chars are added to the left.
*/
private String padString(String s, int n, char c, boolean paddingLeft) {
StringBuffer str = new StringBuffer(s);
int strLength = str.length();
if (n > 0 && n > strLength) {
for (int i = 0; i <= n; i++) {
if (paddingLeft) {
if (i < n - strLength) {
str.insert(0, c);
}
} else {
if (i > strLength) {
str.append(c);
}
}
}
}
return str.toString();
}
}