[jboss-identity-commits] JBoss Identity SVN: r221 - in idm/trunk: identity-impl/src/main/java/org/jboss/identity/idm/impl/configuration/metadata and 4 other directories.
jboss-identity-commits at lists.jboss.org
jboss-identity-commits at lists.jboss.org
Fri Jan 16 08:49:44 EST 2009
Author: bdaw
Date: 2009-01-16 08:49:44 -0500 (Fri, 16 Jan 2009)
New Revision: 221
Modified:
idm/trunk/identity-impl/src/main/java/org/jboss/identity/idm/impl/configuration/jaxb2/JAXB2IdentityConfiguration.java
idm/trunk/identity-impl/src/main/java/org/jboss/identity/idm/impl/configuration/metadata/IdentityRepositoryConfigurationMetaDataImpl.java
idm/trunk/identity-impl/src/main/java/org/jboss/identity/idm/impl/repository/AbstractIdentityStoreRepository.java
idm/trunk/identity-impl/src/test/java/org/jboss/identity/idm/impl/configuration/ConfigurationTestCase.java
idm/trunk/identity-impl/src/test/resources/organization-test-config.xml
idm/trunk/identity-impl/src/test/resources/store-test-config.xml
idm/trunk/identity-impl/src/test/resources/test-config.xml
idm/trunk/identity-spi/src/main/java/org/jboss/identity/idm/spi/configuration/metadata/IdentityRepositoryConfigurationMetaData.java
Log:
checking if config is consistent
Modified: idm/trunk/identity-impl/src/main/java/org/jboss/identity/idm/impl/configuration/jaxb2/JAXB2IdentityConfiguration.java
===================================================================
--- idm/trunk/identity-impl/src/main/java/org/jboss/identity/idm/impl/configuration/jaxb2/JAXB2IdentityConfiguration.java 2009-01-16 04:49:18 UTC (rev 220)
+++ idm/trunk/identity-impl/src/main/java/org/jboss/identity/idm/impl/configuration/jaxb2/JAXB2IdentityConfiguration.java 2009-01-16 13:49:44 UTC (rev 221)
@@ -36,6 +36,7 @@
import org.jboss.identity.idm.spi.configuration.metadata.IdentityConfigurationMetaData;
import org.jboss.identity.idm.spi.configuration.metadata.RelationshipMetaData;
import org.jboss.identity.idm.spi.configuration.metadata.IdentityObjectAttributeMetaData;
+import org.jboss.identity.idm.spi.configuration.metadata.IdentityObjectTypeMetaData;
import org.jboss.identity.idm.spi.exception.IdentityConfigurationException;
import org.jboss.identity.idm.impl.api.attribute.IdentityObjectAttributeMetaDataImpl;
import org.jboss.identity.idm.impl.configuration.jaxb2.generated.JbossIdentityType;
@@ -59,6 +60,8 @@
import java.util.Map;
import java.util.HashMap;
import java.util.LinkedList;
+import java.util.Set;
+import java.util.HashSet;
/**
* @author <a href="mailto:boleslaw.dawidowicz at redhat.com">Boleslaw Dawidowicz</a>
@@ -68,8 +71,16 @@
{
//TODO: check if configuration is consistent. Part of constraints should be checked by schema. Test cases needed :)
+ static Set<String> attributeTypes = new HashSet<String>();
+ static
+ {
+ attributeTypes.add("text");
+ attributeTypes.add("binary");
+ }
+
+
public static IdentityConfigurationMetaData createConfigurationMetaData(File xmlConfig) throws IdentityConfigurationException
{
@@ -126,6 +137,8 @@
configurationMD.getRealms().add(createRealmConfigurationMetaData(realmType));
}
}
+
+ checkDataConsistency(configurationMD);
return configurationMD;
@@ -344,4 +357,299 @@
return options;
}
+ public static void checkDataConsistency(IdentityConfigurationMetaData configurationMD) throws IdentityConfigurationException
+ {
+
+ // IdentityStore
+
+ if (configurationMD.getRepositories() == null || configurationMD.getIdentityStores().size() == 0)
+ {
+ throw new IdentityConfigurationException("No identity-store configured");
+ }
+
+ // Helper structure to keep track of all IdentityObjectType mappings in stores
+ Map<String, Set<String>> storeObjectTypeNameMappings = new HashMap<String, Set<String>>();
+
+ for (IdentityStoreConfigurationMetaData storeMD : configurationMD.getIdentityStores())
+ {
+
+ // id
+ if (storeMD.getId() == null || storeMD.getId().length() == 0)
+ {
+ throw new IdentityConfigurationException("identity-store name required");
+ }
+
+ // Helper structure containing all configured identity object type names
+
+ Set<String> storeObjectTypeNames = new HashSet<String>();
+ if (storeMD.getSupportedIdentityTypes() != null)
+ {
+ for (IdentityObjectTypeMetaData typeMD : storeMD.getSupportedIdentityTypes())
+ {
+ storeObjectTypeNames.add(typeMD.getName());
+ }
+ }
+
+ storeObjectTypeNameMappings.put(storeMD.getId(), storeObjectTypeNames);
+
+ // className
+ if (storeMD.getClassName() == null || storeMD.getClassName().length() == 0)
+ {
+ throw new IdentityConfigurationException("identity-store \"" + storeMD.getId() + "\" class name required");
+ }
+
+ // supported relationship types are not required but we gather the names to check consistency in other parts
+
+ Set<String> supportedRelTypes = new HashSet<String>();
+ if (storeMD.getSupportedRelationshipTypes() != null)
+ {
+ supportedRelTypes = new HashSet<String>(storeMD.getSupportedRelationshipTypes());
+ }
+
+ // all configured identity object types
+ if (storeMD.getSupportedIdentityTypes() == null || storeMD.getSupportedIdentityTypes().size() == 0)
+ {
+ throw new IdentityConfigurationException("identity-store \"" + storeMD.getId() + "\" doesn't have any supported " +
+ "identity-object-types configured");
+ }
+
+ // check each configured types
+ for (IdentityObjectTypeMetaData typeMD : storeMD.getSupportedIdentityTypes())
+ {
+ // Name
+ if (typeMD.getName() == null || typeMD.getName().length() == 0)
+ {
+ throw new IdentityConfigurationException("identity-store \"" + storeMD.getId() + "\" identity-object-type name" +
+ "is not specified");
+ }
+
+ // Attributes
+
+ if (typeMD.getAttributes() != null)
+ {
+ for (IdentityObjectAttributeMetaData attrMD : typeMD.getAttributes())
+ {
+ // Name
+ if (attrMD.getName() == null || attrMD.getName().length() == 0)
+ {
+ throw new IdentityConfigurationException("Attribute name not specified in identity-store \"" + storeMD.getId() + "\"");
+ }
+
+ if (attrMD.getType() == null || attrMD.getType().length() == 0)
+ {
+ throw new IdentityConfigurationException("Attribute type not specified for attribute \"" + attrMD.getName()
+ + "\" in identity-store \"" + storeMD.getId() + "\"");
+ }
+
+ if (!attributeTypes.contains(attrMD.getType()))
+ {
+ throw new IdentityConfigurationException("Unsupported attribute type in attribute \"" + attrMD.getName()
+ + "\" in identity-store \"" + storeMD.getId() + "\"");
+ }
+
+ }
+ }
+
+ // Relationships
+
+ if (typeMD.getRelationships() != null)
+ {
+ for (RelationshipMetaData relMD : typeMD.getRelationships())
+ {
+ if (relMD.getIdentityObjectTypeRef() == null)
+ {
+ throw new IdentityConfigurationException("identity-object-type-ref not specified" +
+ "in identity-object-type \"" + typeMD.getName()
+ + "\" in identity-store \"" + storeMD.getId() + "\"");
+ }
+
+ if (!storeObjectTypeNames.contains(relMD.getIdentityObjectTypeRef()))
+ {
+ throw new IdentityConfigurationException("identity-object-type-ref contains " +
+ "not configured name \"" + relMD.getIdentityObjectTypeRef() + "\" in " +
+ "identity-object-type \"" + typeMD.getName()
+ + "\" in identity-store \"" + storeMD.getId() + "\"");
+ }
+
+ if (relMD.getRelationshipTypeRef() == null)
+ {
+ throw new IdentityConfigurationException("relationship-type-ref not specified" +
+ "in identity-object-type \"" + typeMD.getName()
+ + "\" in identity-store \"" + storeMD.getId() + "\"");
+ }
+
+ if (!supportedRelTypes.contains(relMD.getRelationshipTypeRef()))
+ {
+ throw new IdentityConfigurationException("relationship-type-ref name is not supported" +
+ "by identity-store. Relationship name \"" + relMD.getRelationshipTypeRef() + "\" in " +
+ "identity-object-type \"" + typeMD.getName()
+ + "\" in identity-store \"" + storeMD.getId() + "\"");
+ }
+ }
+ }
+ }
+ }
+
+ // Helper structures
+
+ Set<String> configuredRepoNames = new HashSet<String>();
+
+ Map<String, Set<String>> repoObjectTypeNamesMappings = new HashMap<String, Set<String>>();
+
+ // IdentityStoreRepository
+
+ if (configurationMD.getRepositories() == null || configurationMD.getRepositories().size() == 0)
+ {
+ throw new IdentityConfigurationException("No IdentityRepository configured");
+ }
+
+ for (IdentityRepositoryConfigurationMetaData repoMD : configurationMD.getRepositories())
+ {
+ Set<String> repoObjectNames = new HashSet<String>();
+
+ // id
+ if (repoMD.getId() == null || repoMD.getId().length() == 0)
+ {
+ throw new IdentityConfigurationException("repository name is required");
+ }
+
+ configuredRepoNames.add(repoMD.getId());
+
+ // className
+ if (repoMD.getClassName() == null || repoMD.getClassName().length() == 0)
+ {
+ throw new IdentityConfigurationException("repository \"" + repoMD.getId() + "\" class name required");
+ }
+
+ // defaultAttributeStore
+ if (repoMD.getDefaultAttributeStoreId() == null || repoMD.getDefaultAttributeStoreId().length() == 0)
+ {
+ throw new IdentityConfigurationException("default-attribute-store in repository \"" + repoMD.getId() + "\" is required");
+ }
+
+ if (!storeObjectTypeNameMappings.containsKey(repoMD.getDefaultAttributeStoreId()))
+ {
+ throw new IdentityConfigurationException("default-attribute-store \"" + repoMD.getDefaultAttributeStoreId() +
+ "in repository \"" + repoMD.getId() + "\" is not present in configuration");
+ }
+
+ // defaultIdentityStore
+ if (repoMD.getDefaultAttributeStoreId() == null || repoMD.getDefaultAttributeStoreId().length() == 0)
+ {
+ throw new IdentityConfigurationException("default-identity-store in repository \"" + repoMD.getId() + "\" is required");
+ }
+
+ if (!storeObjectTypeNameMappings.containsKey(repoMD.getDefaultIdentityStoreId()))
+ {
+ throw new IdentityConfigurationException("default-identity-store \"" + repoMD.getDefaultIdentityStoreId() +
+ "in repository \"" + repoMD.getId() + "\" is not present in configuration");
+ }
+
+
+
+// if (repoMD.getIdentityStoreToIdentityObjectTypeMappings() == null ||
+// repoMD.getIdentityStoreToIdentityObjectTypeMappings().size() == 0)
+// {
+// throw new IdentityConfigurationException("No identity-store-mappings defined in repository \"" + repoMD.getId() + "\"");
+// }
+
+ // If there are no repo mappings then add all mappings from the default store
+ if (repoMD.getIdentityStoreToIdentityObjectTypeMappings().size() == 0)
+ {
+ Set<String> names = storeObjectTypeNameMappings.get(repoMD.getDefaultIdentityStoreId());
+ repoObjectTypeNamesMappings.put(repoMD.getId(), names);
+ }
+
+ for (IdentityStoreMappingMetaData mappingsMD : repoMD.getIdentityStoreToIdentityObjectTypeMappings())
+ {
+ if (mappingsMD.getIdentityStoreId() == null ||
+ mappingsMD.getIdentityStoreId().length() == 0)
+ {
+ throw new IdentityConfigurationException("No identity-store-mappings defined in repository \"" + repoMD.getId() + "\"");
+ }
+
+ if (!storeObjectTypeNameMappings.containsKey(mappingsMD.getIdentityStoreId()))
+ {
+ throw new IdentityConfigurationException("Store with id from identity-store-id \"" + mappingsMD.getIdentityStoreId() +
+ "in identity-store-mapping in repository \"" + repoMD.getId() + "\" is not present in configuration");
+ }
+
+ if (mappingsMD.getIdentityObjectTypeMappings() == null ||
+ mappingsMD.getIdentityObjectTypeMappings().size() == 0)
+ {
+ throw new IdentityConfigurationException("identity-store-mapping with \"" + mappingsMD.getIdentityStoreId() +
+ "in repository \"" + repoMD.getId() + "\" doesn't have any identity-object-types listed");
+ }
+
+ for (String identityTypeName : mappingsMD.getIdentityObjectTypeMappings())
+ {
+ Set<String> validNames = storeObjectTypeNameMappings.get(mappingsMD.getIdentityStoreId());
+
+ if (!validNames.contains(identityTypeName))
+ {
+ throw new IdentityConfigurationException("identity-object-type \"" + identityTypeName + "\" specified in " +
+ "identity-store-mapping in repository \"" + repoMD.getId() + "\" is not configured in specified " +
+ "identity-store");
+ }
+
+ repoObjectNames.add(identityTypeName);
+ }
+ }
+
+ repoObjectTypeNamesMappings.put(repoMD.getId(), repoObjectNames);
+ }
+
+
+ // Realms
+
+ if (configurationMD.getRealms() == null || configurationMD.getRealms().size() == 0)
+ {
+ throw new IdentityConfigurationException("No realm configured");
+ }
+
+ for (RealmConfigurationMetaData realmMD : configurationMD.getRealms())
+ {
+ if (realmMD.getId() == null || realmMD.getId().length() == 0)
+ {
+ throw new IdentityConfigurationException("realm id is missing");
+ }
+
+ if (realmMD.getIdentityRepositoryIdRef() == null || realmMD.getIdentityRepositoryIdRef().length() == 0)
+ {
+ throw new IdentityConfigurationException("repository-id-ref in realm \"" + realmMD.getId() + "\" is missing");
+ }
+
+ if (!configuredRepoNames.contains(realmMD.getIdentityRepositoryIdRef()))
+ {
+ throw new IdentityConfigurationException("repository-id-ref \"" + realmMD.getIdentityRepositoryIdRef() +
+ "\" in realm \"" + realmMD.getId() + "\" doesn't reference configured repository");
+ }
+
+ if (realmMD.getIdentityMapping() == null || realmMD.getIdentityMapping().length() == 0)
+ {
+ throw new IdentityConfigurationException("identity-mapping in realm \"" + realmMD.getId() + "\" is missing");
+ }
+
+ // Group type mappings are not required
+ if (realmMD.getGroupTypeMappings() != null )
+ {
+ Set<String> validNames = repoObjectTypeNamesMappings.get(realmMD.getIdentityRepositoryIdRef());
+
+ for (String typeName : realmMD.getGroupTypeMappings().values())
+ {
+ if (!validNames.contains(typeName))
+ {
+ throw new IdentityConfigurationException("identity-object-type-name in realm \"" + realmMD.getId() + "\" " +
+ "doesn't reference identity-object-type configured in repository \"" + realmMD.getIdentityRepositoryIdRef() +
+ "\"");
+
+ }
+ }
+ }
+ }
+
+
+
+ }
+
}
Modified: idm/trunk/identity-impl/src/main/java/org/jboss/identity/idm/impl/configuration/metadata/IdentityRepositoryConfigurationMetaDataImpl.java
===================================================================
--- idm/trunk/identity-impl/src/main/java/org/jboss/identity/idm/impl/configuration/metadata/IdentityRepositoryConfigurationMetaDataImpl.java 2009-01-16 04:49:18 UTC (rev 220)
+++ idm/trunk/identity-impl/src/main/java/org/jboss/identity/idm/impl/configuration/metadata/IdentityRepositoryConfigurationMetaDataImpl.java 2009-01-16 13:49:44 UTC (rev 221)
@@ -94,7 +94,7 @@
this.defaultIdentityStoreId = defaultIdentityStoreId;
}
- public String getDefaultAttributeStroeId()
+ public String getDefaultAttributeStoreId()
{
return defaultAttributeStroeId;
}
Modified: idm/trunk/identity-impl/src/main/java/org/jboss/identity/idm/impl/repository/AbstractIdentityStoreRepository.java
===================================================================
--- idm/trunk/identity-impl/src/main/java/org/jboss/identity/idm/impl/repository/AbstractIdentityStoreRepository.java 2009-01-16 04:49:18 UTC (rev 220)
+++ idm/trunk/identity-impl/src/main/java/org/jboss/identity/idm/impl/repository/AbstractIdentityStoreRepository.java 2009-01-16 13:49:44 UTC (rev 221)
@@ -59,7 +59,7 @@
Map<String, AttributeStore> bootstrappedAttributeStores) throws IdentityException
{
- String asId = configurationMD.getDefaultAttributeStroeId();
+ String asId = configurationMD.getDefaultAttributeStoreId();
String isId = configurationMD.getDefaultIdentityStoreId();
if (asId != null && bootstrappedAttributeStores.keySet().contains(asId))
Modified: idm/trunk/identity-impl/src/test/java/org/jboss/identity/idm/impl/configuration/ConfigurationTestCase.java
===================================================================
--- idm/trunk/identity-impl/src/test/java/org/jboss/identity/idm/impl/configuration/ConfigurationTestCase.java 2009-01-16 04:49:18 UTC (rev 220)
+++ idm/trunk/identity-impl/src/test/java/org/jboss/identity/idm/impl/configuration/ConfigurationTestCase.java 2009-01-16 13:49:44 UTC (rev 221)
@@ -41,11 +41,11 @@
public void testSimple() throws Exception
{
- IdentityConfigurationMetaData config = JAXB2IdentityConfiguration.createConfigurationMetaData(new File("src/test/resources/test-config.xml"));
+ IdentityConfigurationMetaData config = JAXB2IdentityConfiguration.createConfigurationMetaData(new File("src/test/resources/store-test-config.xml"));
assertNotNull(config);
- assertEquals("Hibernate Identity Store", config.getIdentityStores().get(0).getId() );
+ assertEquals("HibernateTestStore", config.getIdentityStores().get(0).getId() );
}
Modified: idm/trunk/identity-impl/src/test/resources/organization-test-config.xml
===================================================================
--- idm/trunk/identity-impl/src/test/resources/organization-test-config.xml 2009-01-16 04:49:18 UTC (rev 220)
+++ idm/trunk/identity-impl/src/test/resources/organization-test-config.xml 2009-01-16 13:49:44 UTC (rev 221)
@@ -182,9 +182,9 @@
<name>picture</name>
<mapping>user.picture</mapping>
<type>binary</type>
- <isRequired/>
- <isMultivalued/>
- <isReadOnly/>
+ <isRequired>false</isRequired>
+ <isMultivalued>false</isMultivalued>
+ <isReadOnly>false</isReadOnly>
</attribute>
</attributes>
<options/>
@@ -432,25 +432,25 @@
<name>phone</name>
<mapping>telephoneNumber</mapping>
<type>text</type>
- <isRequired/>
- <isMultivalued/>
- <isReadOnly/>
+ <isRequired>false</isRequired>
+ <isMultivalued>false</isMultivalued>
+ <isReadOnly>false</isReadOnly>
</attribute>
<attribute>
<name>description</name>
<mapping>description</mapping>
<type>text</type>
- <isRequired/>
- <isMultivalued/>
- <isReadOnly/>
+ <isRequired>false</isRequired>
+ <isMultivalued>false</isMultivalued>
+ <isReadOnly>false</isReadOnly>
</attribute>
<attribute>
<name>carLicense</name>
<mapping>carLicense</mapping>
<type>text</type>
- <isRequired/>
- <isMultivalued/>
- <isReadOnly/>
+ <isRequired>false</isRequired>
+ <isMultivalued>false</isMultivalued>
+ <isReadOnly>false</isReadOnly>
</attribute>
</attributes>
<options>
Modified: idm/trunk/identity-impl/src/test/resources/store-test-config.xml
===================================================================
--- idm/trunk/identity-impl/src/test/resources/store-test-config.xml 2009-01-16 04:49:18 UTC (rev 220)
+++ idm/trunk/identity-impl/src/test/resources/store-test-config.xml 2009-01-16 13:49:44 UTC (rev 221)
@@ -18,13 +18,13 @@
<external-config/>
<default-identity-store-id>HibernateTestStore</default-identity-store-id>
<default-attribute-store-id>HibernateTestStore</default-attribute-store-id>
- <identity-store-mappings>
- <identity-store-mapping>
- <identity-store-id>HibernateTestStore</identity-store-id>
- <identity-object-types/>
- <options/>
- </identity-store-mapping>
- </identity-store-mappings>
+ <!--<identity-store-mappings>-->
+ <!--<identity-store-mapping>-->
+ <!--<identity-store-id>HibernateTestStore</identity-store-id>-->
+ <!--<identity-object-types/>-->
+ <!--<options/>-->
+ <!--</identity-store-mapping>-->
+ <!--</identity-store-mappings>-->
</repository>
</repositories>
<stores>
@@ -50,6 +50,13 @@
<options/>
</identity-object-type>
<identity-object-type>
+ <name>GROUP</name>
+ <relationships/>
+ <credentials/>
+ <attributes/>
+ <options/>
+ </identity-object-type>
+ <identity-object-type>
<name>ORGANIZATION</name>
<relationships>
<relationship>
Modified: idm/trunk/identity-impl/src/test/resources/test-config.xml
===================================================================
--- idm/trunk/identity-impl/src/test/resources/test-config.xml 2009-01-16 04:49:18 UTC (rev 220)
+++ idm/trunk/identity-impl/src/test/resources/test-config.xml 2009-01-16 13:49:44 UTC (rev 221)
@@ -4,22 +4,11 @@
xsi:schemaLocation="urn:jboss:identity:idm:config:v1_0_alpha identity-config.xsd">
<realms>
<realm>
- <id></id>
- <repository-id-ref></repository-id-ref>
- <realm-configuration>
- <!--Use direct type mappper when not specified-->
- <!--<identity-type-mappings>-->
- <!--<identity-mapping>JBOSS_IDENTITY_IDENTITY</identity-mapping>-->
- <!--<group-type-mapping>-->
- <!--<group-type-name>ORGANIZATION</group-type-name>-->
- <!--<identity-object-type-name>JBOSS_IDENTITY_GROUP_ORGANIZATION</identity-object-type-name>-->
- <!--</group-type-mapping>-->
- <!--<group-type-mapping>-->
- <!--<group-type-name>ORGANIZATION_UNIT</group-type-name>-->
- <!--<identity-object-type-name>JBOSS_IDENTITY_GROUP_ORGANIZATION_UNIT</identity-object-type-name>-->
- <!--</group-type-mapping>-->
- <!--</identity-type-mappings>-->
- </realm-configuration>
+ <id>Sample Ralm</id>
+ <repository-id-ref>Fallback Repository - ACME</repository-id-ref>
+ <identity-type-mappings>
+ <identity-mapping>IDENTITY</identity-mapping>
+ </identity-type-mappings>
</realm>
</realms>
<repositories>
@@ -49,19 +38,6 @@
<options/>
</identity-store-mapping>
</identity-store-mappings>
- <!--<option-groups>-->
- <!--<option-group>-->
- <!--<name></name>-->
- <!--<options>-->
- <!--<option>-->
- <!--<name></name>-->
- <!--<values>-->
- <!--<value></value>-->
- <!--</values>-->
- <!--</option>-->
- <!--</options>-->
- <!--</option-group>-->
- <!--</option-groups>-->
</repository>
</repositories>
<stores>
@@ -112,6 +88,7 @@
<attributes>
<attribute>
<name>user.name.given</name>
+ <type>text</type>
<mapping/>
<isRequired>false</isRequired>
<isMultivalued>true</isMultivalued>
Modified: idm/trunk/identity-spi/src/main/java/org/jboss/identity/idm/spi/configuration/metadata/IdentityRepositoryConfigurationMetaData.java
===================================================================
--- idm/trunk/identity-spi/src/main/java/org/jboss/identity/idm/spi/configuration/metadata/IdentityRepositoryConfigurationMetaData.java 2009-01-16 04:49:18 UTC (rev 220)
+++ idm/trunk/identity-spi/src/main/java/org/jboss/identity/idm/spi/configuration/metadata/IdentityRepositoryConfigurationMetaData.java 2009-01-16 13:49:44 UTC (rev 221)
@@ -56,7 +56,7 @@
/**
* @return id of the default AttributeStore
*/
- String getDefaultAttributeStroeId();
+ String getDefaultAttributeStoreId();
/**
* @return configuration meta data of IdentityStore mappings
More information about the jboss-identity-commits
mailing list