private QName bindMapProperty(PropertyInfo prop, ClassInfo propType, QName propertyQName, ModelGroupBinding targetGroup)
{
QName boundQName = null;
JBossXmlMapEntry entryElement = null;
if(prop != null)
entryElement = prop.getUnderlyingAnnotation(JBossXmlMapEntry.class);
if(entryElement == null)
entryElement = propType.getUnderlyingAnnotation(JBossXmlMapEntry.class);
JBossXmlMapKeyElement keyElement = null;
if(prop != null)
keyElement = prop.getUnderlyingAnnotation(JBossXmlMapKeyElement.class);
if(keyElement == null)
keyElement = propType.getUnderlyingAnnotation(JBossXmlMapKeyElement.class);
JBossXmlMapKeyAttribute keyAttribute = null;
if(prop != null)
keyAttribute = prop.getUnderlyingAnnotation(JBossXmlMapKeyAttribute.class);
if(keyAttribute == null)
keyAttribute = propType.getUnderlyingAnnotation(JBossXmlMapKeyAttribute.class);
if(keyElement != null || keyAttribute != null)
{
// further assuming the map is bound
JBossXmlMapValueElement valueElement = null;
if(prop != null)
valueElement = prop.getUnderlyingAnnotation(JBossXmlMapValueElement.class);
if(valueElement == null)
valueElement = propType.getUnderlyingAnnotation(JBossXmlMapValueElement.class);
JBossXmlMapValueAttribute valueAttribute = null;
if(prop != null)
valueAttribute = prop.getUnderlyingAnnotation(JBossXmlMapValueAttribute.class);
if(valueAttribute == null)
valueAttribute = propType.getUnderlyingAnnotation(JBossXmlMapValueAttribute.class);
TypeInfo keyType = propType.getKeyType();
TypeInfo valueType = propType.getValueType();
// entry handler
BeanAdapterFactory entryAdapterFactory = null;
BeanInfo entryInfo = JBossXBBuilder.configuration.getBeanInfo(DefaultMapEntry.class);
entryAdapterFactory = createAdapterFactory(DefaultBeanAdapterBuilder.class, entryInfo, null);
BeanHandler entryHandler = new BeanHandler(entryInfo.getName(), entryAdapterFactory);
TypeBinding entryType = null;
TypeInfo entryTypeInfo = null;
// bind the entry element if present
if(entryElement != null && !JBossXmlConstants.DEFAULT.equals(entryElement.name()))
{
String ns = entryElement.namespace();
if(JBossXmlConstants.DEFAULT.equals(ns))
ns = defaultNamespace;
QName entryName = new QName(ns, entryElement.name());
entryType = new TypeBinding();
entryType.setSchemaBinding(schemaBinding);
entryType.setHandler(entryHandler);
entryTypeInfo = JBossXBBuilder.configuration.getTypeInfo(DefaultMapEntry.class);
ElementBinding entryElementBinding = createElementBinding(entryTypeInfo, entryType, entryName, false);
ParticleBinding entryParticle = new ParticleBinding(entryElementBinding, 0, -1, true);
targetGroup.addParticle(entryParticle);
propertyQName = entryName;
if(keyAttribute != null)
{
TypeBinding attributeType = resolveTypeBinding(keyType);
AttributeHandler attributeHandler = new PropertyHandler(entryInfo.getProperty("key"), keyType);
String attrNs = keyAttribute.namespace();
if(JBossXmlConstants.DEFAULT.equals(attrNs))
attrNs = defaultNamespace;
AttributeBinding keyBinding = new AttributeBinding(schemaBinding, new QName(attrNs, keyAttribute.name()), attributeType, attributeHandler);
keyBinding.setRequired(true);
entryType.addAttribute(keyBinding);
}
if(valueAttribute != null)
{
TypeBinding attributeType = resolveTypeBinding(valueType);
AttributeHandler attributeHandler = new PropertyHandler(entryInfo.getProperty("value"), valueType);
String valueNs = valueAttribute.namespace();
if(JBossXmlConstants.DEFAULT.equals(valueNs))
valueNs = defaultNamespace;
AttributeBinding valueBinding = new AttributeBinding(schemaBinding, new QName(valueNs, valueAttribute.name()), attributeType, attributeHandler);
valueBinding.setRequired(true);
entryType.addAttribute(valueBinding);
}
else if(valueElement == null)
{
CharactersHandler charactersHandler = new ValueHandler(entryInfo.getProperty("value"), valueType);
entryType.setSimpleType(charactersHandler);
}
}
SequenceBinding keyValueSequence = null;
if(keyElement != null)
{
keyValueSequence = new SequenceBinding(schemaBinding);
if(entryType == null)
{
keyValueSequence.setSkip(Boolean.FALSE);
keyValueSequence.setQName(propertyQName);
schemaBinding.addGroup(keyValueSequence.getQName(), keyValueSequence);
ParticleBinding keyValueParticle = new ParticleBinding(keyValueSequence, 0, -1, true);
targetGroup.addParticle(keyValueParticle);
keyValueSequence.setHandler(entryHandler);
}
else
{
ParticleBinding keyValueParticle = new ParticleBinding(keyValueSequence, 1, 1, false);
entryType.setParticle(keyValueParticle);
}
// key element
TypeBinding keyTypeBinding = resolveTypeBinding(keyType);
String keyNs = keyElement.namespace();
if(JBossXmlConstants.DEFAULT.equals(keyNs))
keyNs = defaultNamespace;
ElementBinding keyElementBinding = createElementBinding(keyType, keyTypeBinding, new QName(keyNs, keyElement.name()), false);
ParticleBinding particle = new ParticleBinding(keyElementBinding, 1, 1, false);
keyValueSequence.addParticle(particle);
PropertyHandler keyHandler = new PropertyHandler(entryInfo.getProperty("key"), keyType);
entryAdapterFactory.addProperty(keyElementBinding.getQName(), keyHandler);
}
if(valueElement != null)
{
TypeBinding valueTypeBinding = resolveTypeBinding(valueType);
String valueNs = valueElement.namespace();
if(JBossXmlConstants.DEFAULT.equals(valueNs))
valueNs = defaultNamespace;
ElementBinding valueElementBinding = createElementBinding(valueType, valueTypeBinding, new QName(valueNs, valueElement.name()), false);
ParticleBinding particle = new ParticleBinding(valueElementBinding, 1, 1, false);
keyValueSequence.addParticle(particle);
PropertyHandler valueHandler = new PropertyHandler(entryInfo.getProperty("value"), valueType);
entryAdapterFactory.addProperty(valueElementBinding.getQName(), valueHandler);
}
// TODO: need to verify correct binding before proceeding
boundQName = propertyQName;
}
else if(entryElement != null && !JBossXmlMapEntry.DEFAULT.class.equals(entryElement.type()))
{
if(!JBossXmlConstants.DEFAULT.equals(entryElement.name()))
{
String ns = entryElement.namespace();
if(JBossXmlConstants.DEFAULT.equals(ns))
ns = propertyQName.getNamespaceURI();
propertyQName = new QName(ns, entryElement.name());
}
TypeInfo entryTypeInfo = JBossXBBuilder.configuration.getTypeInfo(entryElement.type());
ElementBinding entryElementBinding = createElementBinding(entryTypeInfo, propertyQName.getLocalPart(), false);
ParticleBinding entryParticle = new ParticleBinding(entryElementBinding, 0, -1, true);
targetGroup.addParticle(entryParticle);
boundQName = propertyQName;
}