if (e2Type.isSimpleType()) {
e1.setType(e2Type);
}
else {
ComplexType cType = new ComplexType(_schema);
Group group = new Group();
group.setOrder(_defaultGroupOrder);
cType.addGroup(group);
e1.setType(cType);
e1Type = cType;
}
}
else if (e2Type == null) {
if (e1Type.isSimpleType()) {
e2.setType(e1Type);
}
else {
ComplexType cType = new ComplexType(_schema);
Group group = new Group();
group.setOrder(_defaultGroupOrder);
cType.addGroup(group);
e2.setType(cType);
e2Type = cType;
}
}
//-- both simple types
if (e1Type.isSimpleType() && e2Type.isSimpleType()) {
if (!e1Type.getName().equals(e2Type.getName())) {
String typeName = _nsPrefix + ':' +
DatatypeHandler.whichType(e1Type.getName(),
e2Type.getName());
e1.setType(null);
e1.setTypeReference(typeName);
}
return;
}
//-- e1 is simple, e2 is complex
else if (e1Type.isSimpleType()) {
ComplexType cType = new ComplexType(_schema);
e1.setType(cType);
Group group = new Group();
group.setOrder(_defaultGroupOrder);
cType.addGroup(group);
cType.setContentType(ContentType.mixed);
e1Type = cType;
//-- do not return here...we need to now treat as both
//-- were complex
}
//-- e2 is simple, e1 is complex
else if (e2Type.isSimpleType()) {
ComplexType cType = new ComplexType(_schema);
e2.setType(cType);
Group group = new Group();
group.setOrder(_defaultGroupOrder);
cType.addGroup(group);
cType.setContentType(ContentType.mixed);
e2Type = cType;
//-- do not return here...we need to now treat as both
//-- were complex
}
//-- both complex types
ComplexType cType1 = (ComplexType)e1Type;
ComplexType cType2 = (ComplexType)e2Type;
//-- loop through all element/attribute declarations
//-- of e2 and add them to e1 if they do not already exist
//-- and mark them as optional
Group e1Group = (Group) cType1.getParticle(0);
if (e1Group == null) {
e1Group = new Group();
e1Group.setOrder(_defaultGroupOrder);
cType1.addGroup(e1Group);
}
Group e2Group = (Group) cType2.getParticle(0);
if (e2Group == null) {
e2Group = new Group();
e2Group.setOrder(_defaultGroupOrder);
cType2.addGroup(e2Group);
}
Enumeration enumeration = e2Group.enumerate();
while (enumeration.hasMoreElements()) {
Particle particle = (Particle)enumeration.nextElement();
if (particle.getStructureType() == Structure.ELEMENT) {
ElementDecl element = (ElementDecl)particle;
ElementDecl main = e1Group.getElementDecl(element.getName());
if (main == null) {
e1Group.addElementDecl(element);
element.setMinOccurs(0);
}
else {
merge(main, element);
}
}
}
//-- add all attributes from type2
enumeration = cType2.getAttributeDecls();
while (enumeration.hasMoreElements()) {
//-- check for attribute with same name
AttributeDecl attNew = (AttributeDecl)enumeration.nextElement();
String attName = attNew.getName();
AttributeDecl attPrev = cType1.getAttributeDecl(attName);
if (attPrev == null) {
attNew.setUse(AttributeDecl.USE_OPTIONAL);
cType1.addAttributeDecl(attNew);
}
else {
String type1 = attPrev.getSimpleType().getName();
String type2 = attNew.getSimpleType().getName();
if (!type1.equals(type2)) {
String typeName = _nsPrefix + ':' +
DatatypeHandler.whichType(type1, type2);
attPrev.setSimpleTypeReference(typeName); }
}
}
//-- loop through all element/attribute declarations
//-- of e1 and if they do not exist in e2, simply
//-- mark them as optional
enumeration = e1Group.enumerate();
while (enumeration.hasMoreElements()) {
Particle particle = (Particle)enumeration.nextElement();
if (particle.getStructureType() == Structure.ELEMENT) {
ElementDecl element = (ElementDecl)particle;
if (e2Group.getElementDecl(element.getName()) == null) {
element.setMinOccurs(0);
}
}
}