[jboss-cvs] JBossAS SVN: r93356 - in projects/spring-int/trunk: aop and 7 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Thu Sep 10 07:29:21 EDT 2009
Author: alesj
Date: 2009-09-10 07:29:21 -0400 (Thu, 10 Sep 2009)
New Revision: 93356
Added:
projects/spring-int/trunk/aop/
projects/spring-int/trunk/aop/pom.xml
projects/spring-int/trunk/aop/src/
projects/spring-int/trunk/aop/src/main/
projects/spring-int/trunk/aop/src/main/java/
projects/spring-int/trunk/aop/src/main/java/org/
projects/spring-int/trunk/aop/src/main/java/org/jboss/
projects/spring-int/trunk/aop/src/main/java/org/jboss/spring/
projects/spring-int/trunk/aop/src/main/java/org/jboss/spring/aop/
projects/spring-int/trunk/aop/src/main/java/org/jboss/spring/aop/AspectManagerFactory.java
projects/spring-int/trunk/aop/src/main/java/org/jboss/spring/aop/JBossAopProxy.java
projects/spring-int/trunk/aop/src/main/java/org/jboss/spring/aop/JBossAopProxyFactory.java
projects/spring-int/trunk/aop/src/test/
Modified:
projects/spring-int/trunk/pom.xml
Log:
Adding new AOP integration, updating libs.
Added: projects/spring-int/trunk/aop/pom.xml
===================================================================
--- projects/spring-int/trunk/aop/pom.xml (rev 0)
+++ projects/spring-int/trunk/aop/pom.xml 2009-09-10 11:29:21 UTC (rev 93356)
@@ -0,0 +1,93 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.jboss.spring-int</groupId>
+ <artifactId>jboss-spring-int-parent</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.jboss.spring-int</groupId>
+ <artifactId>jboss-spring-int-aop</artifactId>
+ <packaging>jar</packaging>
+ <name>JBoss Spring Integration - AOP</name>
+ <url>http://www.jboss.org/jbossmc</url>
+ <description>JBoss Spring Integration - AOP</description>
+
+ <dependencies>
+ <!-- Compile (global dependencies) -->
+ <dependency>
+ <groupId>org.jboss.aop</groupId>
+ <artifactId>jboss-aop</artifactId>
+ <exclusions>
+ <exclusion>
+ <groupId>ant</groupId>
+ <artifactId>ant</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>apache-xerces</groupId>
+ <artifactId>xml-apis</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>javassist</groupId>
+ <artifactId>javassist</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.jboss</groupId>
+ <artifactId>jboss-common-core</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.jboss.logging</groupId>
+ <artifactId>jboss-logging-spi</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.jboss.logging</groupId>
+ <artifactId>jboss-logging-log4j</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.jboss</groupId>
+ <artifactId>jboss-mdr</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.jboss.kernel</groupId>
+ <artifactId>jboss-container</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.jboss.kernel</groupId>
+ <artifactId>jboss-dependency</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss</groupId>
+ <artifactId>jboss-common-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss</groupId>
+ <artifactId>jboss-mdr</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.logging</groupId>
+ <artifactId>jboss-logging-spi</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-aop</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-beans</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-context</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ </dependency>
+ </dependencies>
+
+</project>
\ No newline at end of file
Added: projects/spring-int/trunk/aop/src/main/java/org/jboss/spring/aop/AspectManagerFactory.java
===================================================================
--- projects/spring-int/trunk/aop/src/main/java/org/jboss/spring/aop/AspectManagerFactory.java (rev 0)
+++ projects/spring-int/trunk/aop/src/main/java/org/jboss/spring/aop/AspectManagerFactory.java 2009-09-10 11:29:21 UTC (rev 93356)
@@ -0,0 +1,100 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file 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.spring.aop;
+
+import org.jboss.aop.AspectManager;
+import org.jboss.aop.Domain;
+import org.jboss.metadata.plugins.scope.ApplicationScope;
+import org.jboss.metadata.plugins.scope.DeploymentScope;
+import org.jboss.metadata.spi.MetaData;
+import org.jboss.metadata.spi.stack.MetaDataStack;
+import org.jboss.util.JBossStringBuilder;
+
+/**
+ * JBoss AOP aspect factory.
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @author <a href="mailto:ales.justin at jboss.org">Ales Justin</a>
+ */
+public class AspectManagerFactory
+{
+ public static AspectManager getAspectManager()
+ {
+ return getAspectManager(MetaDataStack.peek());
+ }
+
+ public static AspectManager getAspectManager(MetaData md)
+ {
+ AspectManager manager = AspectManager.instance();
+ if (md != null)
+ {
+ AspectManager metaDataManager = md.getMetaData(AspectManager.class);
+
+ if (metaDataManager != null)
+ {
+ return metaDataManager;
+ }
+
+ ApplicationScope app = md.getMetaData(ApplicationScope.class);
+ DeploymentScope dep = md.getMetaData(DeploymentScope.class);
+ if (app != null && dep != null)
+ {
+ JBossStringBuilder fqn = new JBossStringBuilder("/");
+ AspectManager sub = null;
+ if (app != null)
+ {
+ String name="APPLICATION=" + app.value();
+ fqn.append(name);
+ fqn.append("/");
+ sub = manager.findManagerByName(fqn.toString());
+ if (sub == null)
+ {
+ sub = createNewDomain(manager, name);
+ }
+ }
+
+ if (dep != null)
+ {
+ String name="DEPLOYMENT=" + dep.value();
+ fqn.append(name);
+ fqn.append("/");
+ AspectManager parent = sub;
+ sub = manager.findManagerByName(fqn.toString());
+ if (sub == null)
+ {
+ sub = createNewDomain(parent, name);
+ }
+ }
+ return sub;
+ }
+ }
+ return manager;
+ }
+
+ private static AspectManager createNewDomain(AspectManager parent, String name)
+ {
+ Domain domain = new Domain(parent, name, true);
+ domain.setInheritsBindings(true);
+ domain.setInheritsDeclarations(true);
+ return domain;
+ }
+}
Added: projects/spring-int/trunk/aop/src/main/java/org/jboss/spring/aop/JBossAopProxy.java
===================================================================
--- projects/spring-int/trunk/aop/src/main/java/org/jboss/spring/aop/JBossAopProxy.java (rev 0)
+++ projects/spring-int/trunk/aop/src/main/java/org/jboss/spring/aop/JBossAopProxy.java 2009-09-10 11:29:21 UTC (rev 93356)
@@ -0,0 +1,360 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file 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.spring.aop;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Constructor;
+import java.util.ArrayList;
+import java.util.List;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+import org.jboss.aop.Advisor;
+import org.jboss.aop.AspectManager;
+import org.jboss.aop.advice.Interceptor;
+import org.jboss.aop.joinpoint.ConstructorInvocation;
+import org.jboss.aop.proxy.container.AOPProxyFactory;
+import org.jboss.aop.proxy.container.AOPProxyFactoryParameters;
+import org.jboss.aop.proxy.container.ContainerCache;
+import org.jboss.aop.proxy.container.GeneratedAOPProxyFactory;
+import org.jboss.joinpoint.plugins.Config;
+import org.jboss.metadata.spi.MetaData;
+import org.jboss.metadata.spi.scope.CommonLevels;
+import org.jboss.metadata.spi.scope.CommonLevelsUtil;
+import org.jboss.metadata.spi.scope.ScopeLevel;
+import org.jboss.metadata.spi.signature.DeclaredMethodSignature;
+import org.jboss.metadata.spi.stack.MetaDataStack;
+import org.jboss.reflect.spi.ClassInfo;
+import org.jboss.reflect.spi.ConstructorInfo;
+import org.jboss.reflect.spi.MethodInfo;
+import org.jboss.reflect.spi.TypeInfo;
+import org.jboss.config.spi.Configuration;
+import org.jboss.config.plugins.property.PropertyConfiguration;
+import org.springframework.aop.TargetSource;
+import org.springframework.aop.framework.AdvisedSupport;
+import org.springframework.aop.framework.AopProxy;
+
+/**
+ * JBoss based AOP proxy.
+ *
+ * @author <a href="mailto:ales.justin at jboss.org">Ales Justin</a>
+ */
+public class JBossAopProxy implements AopProxy
+{
+ /** The configuration */
+ private static Configuration configuration;
+ private static final List<ScopeLevel> levels;
+
+ static
+ {
+ // get Configuration instance
+ configuration = AccessController.doPrivileged(new PrivilegedAction<Configuration>()
+ {
+ public Configuration run()
+ {
+ return new PropertyConfiguration();
+ }
+ });
+
+ // get all sub INSTANCE levels
+ levels = new ArrayList<ScopeLevel>(CommonLevelsUtil.getSubLevels(CommonLevels.INSTANCE));
+ // remove class joinpoint, we're only interested in instance/joinpoint_override
+ levels.remove(CommonLevels.JOINPOINT);
+ }
+
+ private AdvisedSupport config;
+ private AOPProxyFactory proxyFactory = new GeneratedAOPProxyFactory();
+ private ConstructorInfo constructorInfo;
+
+ public JBossAopProxy(AdvisedSupport config)
+ {
+ if (config == null)
+ throw new IllegalArgumentException("Null config");
+
+ this.config = config;
+ }
+
+ public Object getProxy()
+ {
+ return getProxy(null);
+ }
+
+ public Object getProxy(ClassLoader classLoader)
+ {
+ Class<?> clazz = config.getTargetClass();
+ if (clazz == null)
+ throw new IllegalArgumentException("Null target class");
+
+ try
+ {
+ ClassInfo classInfo = configuration.getClassInfo(clazz);
+ constructorInfo = Config.findConstructorInfo(classInfo, new String[]{}); // TODO - arguments
+
+ MetaData metaData = MetaDataStack.peek();
+ boolean hasInstanceMetaData = rootHasSubInstanceMetaData(metaData);
+ AspectManager manager = AspectManagerFactory.getAspectManager(metaData);
+ ContainerCache cache = ContainerCache.initialise(manager, clazz, metaData, hasInstanceMetaData);
+ AOPProxyFactoryParameters params = new AOPProxyFactoryParameters();
+
+ Object target = null;
+ TargetSource ts = config.getTargetSource();
+ if (ts != null)
+ target = ts.getTarget();
+
+ if (target == null)
+ target = createTarget(cache, params);
+
+ params.setProxiedClass(target.getClass());
+ params.setMetaData(metaData);
+ params.setTarget(target);
+ params.setContainerCache(cache);
+ params.setMetaDataHasInstanceLevelData(hasInstanceMetaData);
+
+ return proxyFactory.createAdvisedProxy(params);
+ }
+ catch (Throwable t)
+ {
+ throw new RuntimeException(t);
+ }
+ }
+
+ /**
+ * Check for metadata at INSTANCE level and below.
+ *
+ * @param metaData the metadata
+ * @return true if there is some metadata that needs to be considered
+ */
+ private boolean rootHasSubInstanceMetaData(MetaData metaData)
+ {
+ if (metaData == null)
+ {
+ return false;
+ }
+
+ if (checkForMetaDataAtSubInstanceLevel(metaData))
+ {
+ return true;
+ }
+
+ //Check for method annotations
+ return rootHasMethodWithSubInstanceMetaData(metaData);
+ }
+
+ /**
+ * Check for metadata at INSTANCE level and below for methods.
+ *
+ * @param metaData the metadata
+ * @return true if there is some metadata that needs to be considered
+ */
+ private boolean rootHasMethodWithSubInstanceMetaData(MetaData metaData)
+ {
+ //Check for method annotations
+ ClassInfo info = constructorInfo.getDeclaringClass();
+ while (info != null)
+ {
+ MethodInfo[] methods = info.getDeclaredMethods();
+ if (methods != null)
+ {
+ for (MethodInfo mi : methods)
+ {
+ if (methodHasSubInstanceMetaData(metaData, mi))
+ {
+ return true;
+ }
+ }
+ }
+ info = info.getSuperclass();
+ }
+
+ return false;
+ }
+
+ /**
+ * Check for metadata at INSTANCE level and below for methods.
+ *
+ * @param metaData the metadata
+ * @param mi the method to check
+ * @return true if there is some metadata that needs to be considered
+ */
+ private boolean methodHasSubInstanceMetaData(MetaData metaData, MethodInfo mi)
+ {
+ DeclaredMethodSignature sig = new DeclaredMethodSignature(mi);
+ MetaData methodMD = metaData.getComponentMetaData(sig);
+ return checkForMetaDataAtSubInstanceLevel(methodMD);
+ }
+
+ /**
+ * Check for metadata at INSTANCE level and below.
+ *
+ * @param metaData the metadata
+ * @return true if there is some metadata that needs to be considered
+ */
+ private boolean checkForMetaDataAtSubInstanceLevel(MetaData metaData)
+ {
+ if (metaData != null)
+ {
+ for (ScopeLevel level : levels)
+ {
+ if (hasMetaDataAtLevel(metaData, level))
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Check for metadata at level param.
+ *
+ * @param metaData the metadata
+ * @param level the scope level
+ * @return true if there is some metadata that needs to be considered
+ */
+ protected boolean hasMetaDataAtLevel(MetaData metaData, ScopeLevel level)
+ {
+ MetaData levelMetaData = metaData.getScopeMetaData(level);
+ if (levelMetaData != null && levelMetaData.isEmpty() == false)
+ {
+ Object[] allMetaData = levelMetaData.getMetaData();
+ Annotation[] annotations = levelMetaData.getAnnotations();
+ // all meta data is not null, since level metadata is not empty
+ int allSize = allMetaData.length;
+ int annotationsSize = annotations != null ? annotations.length : 0;
+
+ // do we have something else than annotations
+ if (allSize > annotationsSize)
+ {
+ return true;
+ }
+ else if (annotationsSize > 0)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Create the target.
+ *
+ * @param cache the cache
+ * @param params the parameters
+ * @return target instance
+ * @throws Throwable for any error
+ */
+ private Object createTarget(ContainerCache cache, AOPProxyFactoryParameters params) throws Throwable
+ {
+ Advisor advisor = cache.getAdvisor();
+ if (advisor != null)
+ {
+ org.jboss.aop.ConstructorInfo aopinfo = findAopConstructorInfo(advisor);
+
+ Interceptor[] interceptors = (aopinfo != null) ? aopinfo.getInterceptors() : null;
+
+ if (interceptors != null)
+ {
+ ConstructorInvocation inv = new ConstructorInvocation(aopinfo, aopinfo.getInterceptors());
+ inv.setArguments(getArguments());
+ return inv.invokeNext();
+ }
+
+ if (constructorInfo.getParameterTypes().length > 0)
+ {
+ Constructor<?> constructor = null;
+ if (aopinfo == null)
+ {
+ //Fall back to using the class;
+ Class<?> clazz = advisor.getClazz();
+ Constructor<?>[] ctors = clazz.getConstructors();
+ for (Constructor<?> ctor : ctors)
+ {
+ if (matchConstructor(ctor))
+ {
+ constructor = ctor;
+ break;
+ }
+ }
+ }
+ else
+ {
+ constructor = aopinfo.getConstructor();
+ }
+ params.setCtor(constructor.getParameterTypes(), getArguments());
+ }
+ }
+
+ return constructorInfo.newInstance(getArguments());
+ }
+
+ /**
+ * Find constructor info.
+ *
+ * @param advisor the advisor
+ * @return matched constructor or null if no match
+ */
+ private org.jboss.aop.ConstructorInfo findAopConstructorInfo(Advisor advisor)
+ {
+ org.jboss.aop.ConstructorInfo[] infos = advisor.getConstructorInfos();
+ for (int i = 0 ; i < infos.length ; i++)
+ {
+ if (matchConstructor(infos[i].getConstructor()))
+ {
+ return infos[i];
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Match constructor.
+ *
+ * @param ctor the constructor
+ * @return true if we have a match
+ */
+ private boolean matchConstructor(Constructor<?> ctor)
+ {
+ TypeInfo[] params = constructorInfo.getParameterTypes();
+ Class<?>[] ctorParams = ctor.getParameterTypes();
+ if (params.length == ctorParams.length)
+ {
+ boolean match = true;
+ for (int p = 0 ; p < params.length ; p++)
+ {
+ if (!params[p].getName().equals(ctorParams[p].getName()))
+ {
+ match = false;
+ break;
+ }
+ }
+
+ if (match)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ protected Object[] getArguments()
+ {
+ return new Object[]{}; // TODO - proper arguments
+ }
+}
\ No newline at end of file
Added: projects/spring-int/trunk/aop/src/main/java/org/jboss/spring/aop/JBossAopProxyFactory.java
===================================================================
--- projects/spring-int/trunk/aop/src/main/java/org/jboss/spring/aop/JBossAopProxyFactory.java (rev 0)
+++ projects/spring-int/trunk/aop/src/main/java/org/jboss/spring/aop/JBossAopProxyFactory.java 2009-09-10 11:29:21 UTC (rev 93356)
@@ -0,0 +1,40 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file 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.spring.aop;
+
+import org.springframework.aop.framework.AopProxyFactory;
+import org.springframework.aop.framework.AopProxy;
+import org.springframework.aop.framework.AdvisedSupport;
+import org.springframework.aop.framework.AopConfigException;
+
+/**
+ * JBoss based AOP proxy factory.
+ *
+ * @author <a href="mailto:ales.justin at jboss.org">Ales Justin</a>
+ */
+public class JBossAopProxyFactory implements AopProxyFactory
+{
+ public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException
+ {
+ return new JBossAopProxy(config);
+ }
+}
Modified: projects/spring-int/trunk/pom.xml
===================================================================
--- projects/spring-int/trunk/pom.xml 2009-09-10 11:27:05 UTC (rev 93355)
+++ projects/spring-int/trunk/pom.xml 2009-09-10 11:29:21 UTC (rev 93356)
@@ -19,6 +19,7 @@
</scm>
<modules>
+ <module>aop</module>
<module>cluster</module>
<module>deployers</module>
<module>facade</module>
@@ -28,13 +29,13 @@
</modules>
<properties>
- <version.jboss.vfs>2.1.1.GA</version.jboss.vfs>
- <version.jboss.man>2.1.0.CR8</version.jboss.man>
+ <version.jboss.vfs>2.1.2.GA</version.jboss.vfs>
+ <version.jboss.man>2.1.0.GA</version.jboss.man>
<version.jboss.mdr>2.0.1.GA</version.jboss.mdr>
- <version.jboss.microcontainer>2.0.5.GA</version.jboss.microcontainer>
- <version.jboss.classloader>2.0.5.GA</version.jboss.classloader>
- <version.jboss.deployers>2.0.6.GA</version.jboss.deployers>
- <version.jboss.common.core>2.2.13.GA</version.jboss.common.core>
+ <version.jboss.microcontainer>2.0.8.GA</version.jboss.microcontainer>
+ <version.jboss.classloader>2.0.6.SP1</version.jboss.classloader>
+ <version.jboss.deployers>2.0.8.GA</version.jboss.deployers>
+ <version.jboss.common.core>2.2.14.GA</version.jboss.common.core>
<version.jboss.common.logging.spi>2.0.5.GA</version.jboss.common.logging.spi>
<version.jboss.common.logging.log4j>2.0.5.GA</version.jboss.common.logging.log4j>
<version.jbossxb>2.0.1.GA</version.jbossxb>
More information about the jboss-cvs-commits
mailing list