package org.hibernate.tool;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.StringReader;
import java.security.CodeSource;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.junit.Assert;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import junit.framework.TestCase;
public class VersionTest extends TestCase {
public void testVersion() throws Exception {
Assert.assertEquals(
org.hibernate.tool.Version.VERSION,
extractVersion(getPomXml()));
}
private String getPomXml() throws Exception {
CodeSource codeSource =
org.hibernate.tool.Version.class.getProtectionDomain().getCodeSource();
String path = codeSource.getLocation().getPath();
String result = null;
if (path.endsWith(".jar")) {
JarFile jarFile = new JarFile(new File(path));
JarEntry jarEntry = jarFile
.getJarEntry(
"META-INF/maven/org.hibernate/hibernate-tools/pom.xml");
InputStream stream = jarFile.getInputStream(jarEntry);
result = readFromInputStream(stream);
jarFile.close();
} else {
path = path.substring(0, path.indexOf("target/classes/")) + "pom.xml";
InputStream stream = new FileInputStream(path);
result = readFromInputStream(stream);
stream.close();
}
return result;
}
private String readFromInputStream(InputStream stream) throws Exception {
StringBuffer buffer = new StringBuffer();
int b = -1;
while ((b = stream.read()) != -1) {
buffer.append((char)b);
}
return buffer.toString();
}
private String extractVersion(String pomXml) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new InputSource(new StringReader(pomXml)));
Element root = document.getDocumentElement();
NodeList nodes = root.getChildNodes();
Node versionNode = null;
Node parentNode = null;
for (int i = 0; i < nodes.getLength(); i++) {
Node node = nodes.item(i);
if (parentNode == null && "parent".equals(node.getNodeName())) {
parentNode = node;
}
if ("version".equals(node.getNodeName())) {
versionNode = node;
break;
}
}
if (versionNode == null) {
nodes = parentNode.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++) {
Node node = nodes.item(i);
if ("version".equals(node.getNodeName())) {
versionNode = node;
break;
}
}
}
return versionNode.getTextContent();
}
}