[jboss-svn-commits] JBL Code SVN: r25123 - in labs/jbossesb/workspace/dbevenius/imports/product/rosetta: tests/src/org/jboss/internal/soa/esb/util and 2 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Thu Feb 5 12:29:21 EST 2009
Author: beve
Date: 2009-02-05 12:29:20 -0500 (Thu, 05 Feb 2009)
New Revision: 25123
Added:
labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/internal/soa/esb/util/custom-type.xsd
labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/internal/soa/esb/util/request.xsd
labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/internal/soa/esb/util/sample-request.xml
labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/soa/esb/listeners/config/JBoss4ESBDeployerUnitTest.java
labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/soa/esb/listeners/config/schemasDir.esb
labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/soa/esb/listeners/config/schemasDir/
labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/soa/esb/listeners/config/schemasDir/mock.xsd
labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/soa/esb/listeners/config/schemasDir/request.xsd
Modified:
labs/jbossesb/workspace/dbevenius/imports/product/rosetta/src/org/jboss/soa/esb/listeners/config/JBoss4ESBDeployer.java
labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/internal/soa/esb/util/XMLHelperUnitTest.java
Log:
Code for adding support for schema imports.
Modified: labs/jbossesb/workspace/dbevenius/imports/product/rosetta/src/org/jboss/soa/esb/listeners/config/JBoss4ESBDeployer.java
===================================================================
--- labs/jbossesb/workspace/dbevenius/imports/product/rosetta/src/org/jboss/soa/esb/listeners/config/JBoss4ESBDeployer.java 2009-02-05 17:01:02 UTC (rev 25122)
+++ labs/jbossesb/workspace/dbevenius/imports/product/rosetta/src/org/jboss/soa/esb/listeners/config/JBoss4ESBDeployer.java 2009-02-05 17:29:20 UTC (rev 25123)
@@ -24,12 +24,17 @@
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
+import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
+import java.io.InputStreamReader;
import java.io.StringReader;
import java.io.StringWriter;
import java.net.URL;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@@ -37,7 +42,11 @@
import java.util.Map;
import java.util.Properties;
import java.util.Set;
+import java.util.Map.Entry;
import java.util.zip.ZipEntry;
+import java.util.zip.ZipException;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
import javax.management.MalformedObjectNameException;
@@ -48,6 +57,7 @@
import org.jboss.deployment.SubDeployer;
import org.jboss.deployment.SubDeployerSupport;
import org.jboss.internal.soa.esb.publish.ContractReferencePublisher;
+import org.jboss.internal.soa.esb.util.StreamUtils;
import org.jboss.internal.soa.esb.util.XMLHelper;
import org.jboss.internal.soa.esb.webservice.AddressingHandler;
import org.jboss.internal.soa.esb.webservice.ESBContractGenerator;
@@ -66,6 +76,7 @@
import org.jboss.soa.esb.listeners.config.model.ModelAdapter;
import org.jboss.soa.esb.listeners.config.model.ModelParser;
import org.jboss.soa.esb.util.ClassUtil;
+import org.jboss.soa.esb.util.FileUtil;
import org.jboss.system.ServiceControllerMBean;
import org.jboss.system.server.ServerConfig;
import org.jboss.system.server.ServerConfigLocator;
@@ -149,8 +160,8 @@
}
return false;
}
-
- /**
+
+ /**
* Returns true if this deployer can deploy the given DeploymentInfo.
*
* @return True if this deployer can deploy the given DeploymentInfo.
@@ -293,7 +304,7 @@
try
{
Thread.currentThread().setContextClassLoader(di.localCl) ;
- warFile = createWebserviceWars(di.shortName, model, deploymentName, publishers) ;
+ warFile = createWebserviceWars(di, model, deploymentName, publishers) ;
}
finally
{
@@ -461,10 +472,11 @@
}
}
- private File createWebserviceWars(final String esbName, final ModelAdapter model, final String deploymentName,
+ private File createWebserviceWars(final DeploymentInfo di, final ModelAdapter model, final String deploymentName,
final List<ContractReferencePublisher> publishers)
throws DeploymentException
{
+ final String esbName = di.shortName;
final List<WebserviceInfo> endpointServices = model.getWebserviceServices() ;
if (endpointServices != null)
{
@@ -484,11 +496,22 @@
for(WebserviceInfo webserviceInfo: endpointServices)
{
+ final Service service = webserviceInfo.getService() ;
+
+ // Copy any additional schemas to the wsdl directory to support imports.
+ final File esbArchive = new File(di.watch.getFile());
+ final Map<String, String> schemasMap = JBoss4ESBDeployer.getSchemas(esbArchive);
+ final String wsdlDir = "WEB-INF/wsdl/" + service.getCategory().replace('/', '_') + "/";
+ for (Entry<String, String> schemaEntry : schemasMap.entrySet())
+ {
+ log.debug("Adding schema " + wsdlDir + schemaEntry.getKey());
+ addFile(zos, wsdlDir + schemaEntry.getKey(), schemaEntry.getValue()) ;
+ }
+
final ESBServiceEndpointInfo serviceInfo = new ESBServiceEndpointInfo(webserviceInfo) ;
final String wsdl = ESBContractGenerator.generateWSDL(webserviceInfo, serviceInfo) ;
addFile(zos, serviceInfo.getWSDLFileName(), wsdl) ;
- final Service service = webserviceInfo.getService() ;
final String handlers = getHandlers(serviceInfo) ;
final boolean includeHandlers = (handlers != null) ;
if (includeHandlers)
@@ -550,10 +573,14 @@
webXml.append("</web-app>") ;
addFile(zos, "WEB-INF/web.xml", webXml.toString()) ;
- zos.close() ;
final File warFile = getESBWarFile(deploymentName, esbName, true) ;
+
+
+ zos.close() ;
+
+
final FileOutputStream fos = new FileOutputStream(warFile) ;
fos.write(baos.toByteArray()) ;
fos.close() ;
@@ -709,4 +736,113 @@
}
return result ;
}
+
+ static Map<String, String> getSchemas(final File file) throws DeploymentException
+ {
+ if (file == null)
+ {
+ return Collections.emptyMap();
+ }
+
+ if (file.isDirectory())
+ {
+ return getSchemasFromDirectory(file);
+ }
+ else
+ {
+ return getSchemasFromArchive(file);
+ }
+ }
+
+ static Map<String, String> getSchemasFromDirectory(final File directory) throws DeploymentException
+ {
+ if (directory != null)
+ {
+ if (directory.isDirectory())
+ {
+ final File[] schemas = directory.listFiles(new FilenameFilter() {
+ public boolean accept(File dir, String name)
+ {
+ return isXsd(name);
+ }
+ });
+ if (schemas.length > 0)
+ {
+ final Map<String, String> schemasMap = new HashMap<String, String>();
+ for (File file : schemas)
+ {
+ try
+ {
+ schemasMap.put(file.getName(), FileUtil.readTextFile(file));
+ }
+ catch (final IOException e)
+ {
+ throw new DeploymentException("IOException while trying to read xsd '" + file.getName() + "'", e);
+ }
+ }
+ return schemasMap;
+ }
+ }
+ }
+
+ return Collections.emptyMap();
+ }
+
+ private static boolean isXsd(final String fileName)
+ {
+ return fileName.endsWith(".xsd") && !fileName.equals("request.xsd") && !fileName.equals("response.xsd") && !fileName.equals("fault.xsd");
+ }
+
+ static Map<String, String> getSchemasFromArchive(final File archive) throws DeploymentException
+ {
+ if (archive == null || !archive.isFile() || !archive.getName().endsWith(".esb"))
+ {
+ return Collections.emptyMap();
+ }
+
+ final HashMap<String, String> schemas = new HashMap<String, String>();
+ final ZipFile zip = getZipFile(archive);
+
+ final Enumeration<? extends ZipEntry> entries = zip.entries();
+ while (entries.hasMoreElements())
+ {
+ ZipEntry entry = entries.nextElement();
+
+ final String fileName = entry.getName();
+ if (isXsd(fileName))
+ {
+ InputStream in = null;
+ try
+ {
+ in = zip.getInputStream(entry);
+ schemas.put(fileName, StreamUtils.readStreamString(in, "UTF-8"));
+ }
+ catch (final IOException e)
+ {
+ throw new DeploymentException("IOException while trying to read from file '" + fileName + "' from archive '" + archive + "'", e);
+ }
+ finally
+ {
+ try { in.close(); } catch (IOException ignore) { log.error("Error while trying to close in stream for file '" + fileName + "'", ignore); }
+ }
+ }
+ }
+ return schemas;
+ }
+
+ private static ZipFile getZipFile(final File archive) throws DeploymentException
+ {
+ try
+ {
+ return new ZipFile(archive);
+ }
+ catch (ZipException e)
+ {
+ throw new DeploymentException(e.getMessage(), e);
+ }
+ catch (IOException e)
+ {
+ throw new DeploymentException(e.getMessage(), e);
+ }
+ }
}
Modified: labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/internal/soa/esb/util/XMLHelperUnitTest.java
===================================================================
--- labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/internal/soa/esb/util/XMLHelperUnitTest.java 2009-02-05 17:01:02 UTC (rev 25122)
+++ labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/internal/soa/esb/util/XMLHelperUnitTest.java 2009-02-05 17:29:20 UTC (rev 25123)
@@ -21,15 +21,27 @@
package org.jboss.internal.soa.esb.util;
import java.io.InputStream;
+import java.io.Reader;
+import java.io.StringReader;
import java.io.StringWriter;
+import java.io.UnsupportedEncodingException;
import java.util.Properties;
+import javax.xml.XMLConstants;
import javax.xml.stream.XMLStreamReader;
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.validation.Schema;
+import javax.xml.validation.SchemaFactory;
+import junit.framework.TestCase;
+
+import org.jboss.soa.esb.ConfigurationException;
import org.jboss.soa.esb.testutils.StringUtils;
+import org.jboss.soa.esb.util.ClassUtil;
+import org.w3c.dom.ls.LSInput;
+import org.w3c.dom.ls.LSResourceResolver;
+import org.xml.sax.SAXException;
-import junit.framework.TestCase;
-
/**
* Tests associated with the XML helper class.
*
@@ -64,4 +76,127 @@
final boolean match = StringUtils.compareXMLContent(expectedContents, contents) ;
assertTrue("System property replacement", match) ;
}
+
+ /*
+ public void testValidateSchemaWithImport() throws ConfigurationException, UnsupportedEncodingException
+ {
+ Schema schema = createSchema("request.xsd", XMLConstants.W3C_XML_SCHEMA_NS_URI);
+ String xml = StreamUtils.readStreamString(getClass().getResourceAsStream("sample-request.xsd"), "UTF-8");
+
+ boolean validate = XMLHelper.validate(schema, xml);
+ assertTrue(validate);
+ }
+ */
+
+ private Schema createSchema(final String xsd, final String schemaLanguage) throws ConfigurationException
+ {
+ final SchemaFactory schemafactory = SchemaFactory.newInstance(schemaLanguage);
+ try
+ {
+ schemafactory.setResourceResolver(new Resolver());
+ StreamSource xsd2 = new StreamSource(ClassUtil.getResourceAsStream("custom-type.xsd", getClass()));
+ StreamSource xsd1 = new StreamSource(ClassUtil.getResourceAsStream(xsd, getClass()));
+
+ return schemafactory.newSchema(new StreamSource[] {xsd2, xsd1});
+ }
+ catch (final SAXException e)
+ {
+ throw new ConfigurationException("Could not create a validator for schema '" + xsd + "'", e);
+ }
+ }
+
+ private class Resolver implements LSResourceResolver
+ {
+ public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, String baseURI)
+ {
+ System.out.println("type : " + type + " namepaceURI : " + namespaceURI + " publicId : " + publicId + " systemId " + systemId + ", baseURI " + baseURI);
+ return new LSInput() {
+
+ public String getBaseURI()
+ {
+ return null;
+ }
+
+ public InputStream getByteStream()
+ {
+ return null;
+ }
+
+ public boolean getCertifiedText()
+ {
+ return false;
+ }
+
+ public Reader getCharacterStream()
+ {
+ try
+ {
+ StringReader stringReader = new StringReader(StreamUtils.readStreamString(getClass().getResourceAsStream("custom-type.xsd"), "UTF-8"));
+ System.out.println(stringReader);
+ return stringReader;
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public String getEncoding()
+ {
+ return null;
+ }
+
+ public String getPublicId()
+ {
+ return null;
+ }
+
+ public String getStringData()
+ {
+ return null;
+ }
+
+ public String getSystemId()
+ {
+ return null;
+ }
+
+ public void setBaseURI(String baseURI)
+ {
+ }
+
+ public void setByteStream(InputStream byteStream)
+ {
+ }
+
+ public void setCertifiedText(boolean certifiedText)
+ {
+ }
+
+ public void setCharacterStream(Reader characterStream)
+ {
+ }
+
+ public void setEncoding(String encoding)
+ {
+ }
+
+ public void setPublicId(String publicId)
+ {
+ }
+
+ public void setStringData(String stringData)
+ {
+ }
+
+ public void setSystemId(String systemId)
+ {
+ }
+
+ };
+ }
+
+ }
+
}
Added: labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/internal/soa/esb/util/custom-type.xsd
===================================================================
--- labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/internal/soa/esb/util/custom-type.xsd (rev 0)
+++ labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/internal/soa/esb/util/custom-type.xsd 2009-02-05 17:29:20 UTC (rev 25123)
@@ -0,0 +1,8 @@
+<xs:schema version="1.0" targetNamespace="http://www.jboss.org/custom" xmlns:c="http://www.jboss.org/custom" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+ <xs:element name="customType" type="c:type"/>
+ <xs:complexType name="type">
+ <xs:sequence>
+ <xs:element name="type" type="xs:string" minOccurs="1"/>
+ </xs:sequence>
+ </xs:complexType>
+</xs:schema>
Added: labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/internal/soa/esb/util/request.xsd
===================================================================
--- labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/internal/soa/esb/util/request.xsd (rev 0)
+++ labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/internal/soa/esb/util/request.xsd 2009-02-05 17:29:20 UTC (rev 25123)
@@ -0,0 +1,14 @@
+<xs:schema version="1.0" targetNamespace="http://www.jboss.org/sayHi" xmlns:x1="http://www.jboss.org/sayHi"
+xmlns:c="http://www.jboss.org/custom"
+xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+
+ <xs:import namespace="http://www.jboss.org/custom" schemaLocation="custom-type.xsd"/>
+
+ <xs:element name="sayHi" type="x1:sayHi"/>
+ <xs:complexType name="sayHi">
+ <xs:sequence>
+ <xs:element name="arg0" type="xs:string" minOccurs="1"/>
+ <xs:element name="customType" type="c:customType" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+</xs:schema>
Added: labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/internal/soa/esb/util/sample-request.xml
===================================================================
--- labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/internal/soa/esb/util/sample-request.xml (rev 0)
+++ labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/internal/soa/esb/util/sample-request.xml 2009-02-05 17:29:20 UTC (rev 25123)
@@ -0,0 +1,14 @@
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:say="http://www.jboss.org/sayHi"
+ xmlns:c="http://www.jboss.org/custom">
+ <soap:Body>
+ <say:sayHi>
+ <say:arg0>HelloWorld</say:arg0>
+ <c:customType>
+ <c:type>Dummy string</c:type>
+ </c:customType>
+ </say:sayHi>"
+ </soap:Body>
+</soap:Envelope>
Added: labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/soa/esb/listeners/config/JBoss4ESBDeployerUnitTest.java
===================================================================
--- labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/soa/esb/listeners/config/JBoss4ESBDeployerUnitTest.java (rev 0)
+++ labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/soa/esb/listeners/config/JBoss4ESBDeployerUnitTest.java 2009-02-05 17:29:20 UTC (rev 25123)
@@ -0,0 +1,78 @@
+/*
+ * JBoss, Home of Professional Open Source Copyright 2009, Red Hat Middleware
+ * LLC, and individual contributors by the @authors tag. See the copyright.txt
+ * in the distribution for a full listing of individual contributors.
+ *
+ * This 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; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This software 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 software; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the FSF
+ * site: http://www.fsf.org.
+ */
+package org.jboss.soa.esb.listeners.config;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.net.URL;
+import java.util.Map;
+
+import junit.framework.JUnit4TestAdapter;
+
+import org.jboss.deployment.DeploymentException;
+import org.junit.Test;
+
+/**
+ *
+ * @author <a href="mailto:dbevenius at jboss.com">Daniel Bevenius</a>
+ *
+ */
+public class JBoss4ESBDeployerUnitTest
+{
+ @Test
+ public void getSchemasFromFileShouldReturnEmptyMap() throws DeploymentException
+ {
+ File file = new File(getClass().getResource("schemasDir/mock.xsd").getFile());
+ Map<String, String> schemas = JBoss4ESBDeployer.getSchemasFromDirectory(file);
+ assertTrue(schemas.isEmpty());
+ }
+
+ @Test
+ public void getSchemas() throws DeploymentException
+ {
+ File directory = new File(getClass().getResource("schemasDir").getFile());
+ Map<String, String> schemas = JBoss4ESBDeployer.getSchemasFromDirectory(directory);
+ assertTrue(schemas.containsKey("mock.xsd"));
+ }
+
+ @Test
+ public void getSchemasFromArchive() throws DeploymentException
+ {
+ URL resource = getClass().getResource("schemasDir.esb");
+ File archive = new File(resource.getFile());
+ Map<String, String> schemas = JBoss4ESBDeployer.getSchemasFromArchive(archive);
+ assertTrue(schemas.containsKey("mock.xsd"));
+ }
+
+ @Test
+ public void getSchemasFromArchiveNullArchive() throws DeploymentException
+ {
+ Map<String, String> schemas = JBoss4ESBDeployer.getSchemasFromArchive(null);
+ assertTrue(schemas.isEmpty());
+ }
+
+ public static junit.framework.Test suite()
+ {
+ return new JUnit4TestAdapter(JBoss4ESBDeployerUnitTest.class);
+ }
+
+}
Added: labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/soa/esb/listeners/config/schemasDir/mock.xsd
===================================================================
--- labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/soa/esb/listeners/config/schemasDir/mock.xsd (rev 0)
+++ labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/soa/esb/listeners/config/schemasDir/mock.xsd 2009-02-05 17:29:20 UTC (rev 25123)
@@ -0,0 +1,9 @@
+<xs:schema version="1.0" targetNamespace="http://www.jboss.org/custom" xmlns:x1="http://www.jboss.org/custome" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+ <xs:element name="customType" type="x1:type"/>
+ <xs:complexType name="type">
+ <xs:sequence>
+ <xs:element name="customType" type="xs:string" minOccurs="1"/>
+ </xs:sequence>
+ </xs:complexType>
+</xs:schema>
+
Added: labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/soa/esb/listeners/config/schemasDir/request.xsd
===================================================================
--- labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/soa/esb/listeners/config/schemasDir/request.xsd (rev 0)
+++ labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/soa/esb/listeners/config/schemasDir/request.xsd 2009-02-05 17:29:20 UTC (rev 25123)
@@ -0,0 +1,9 @@
+<xs:schema version="1.0" targetNamespace="http://www.jboss.org/custom" xmlns:x1="http://www.jboss.org/custome" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+ <xs:element name="customType" type="x1:type"/>
+ <xs:complexType name="type">
+ <xs:sequence>
+ <xs:element name="customType" type="xs:string" minOccurs="1"/>
+ </xs:sequence>
+ </xs:complexType>
+</xs:schema>
+
Added: labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/soa/esb/listeners/config/schemasDir.esb
===================================================================
(Binary files differ)
Property changes on: labs/jbossesb/workspace/dbevenius/imports/product/rosetta/tests/src/org/jboss/soa/esb/listeners/config/schemasDir.esb
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
More information about the jboss-svn-commits
mailing list