Adding Complex Content Restriction Support to ADB
-------------------------------------------------
Key: AXIS2-906
URL: http://issues.apache.org/jira/browse/AXIS2-906
Project: Apache Axis 2.0 (Axis2)
Issue Type: Improvement
Reporter: Maryam Moazeni
Priority: Minor
Regarding the implementation of complex content restriction:
These are the changes of code in the JavaBeanWriter. Changes in SchemaCompiler
and BeanWriterMetaInfoHandler are not shown.
1) Missing Elements
2) Missing Attributes *
3) Changes in Type
3) Changes in Occurance
are supporte sofar.
* Attributes still needs more work.
------------------------------------------------------------------------------------------------------------------------------------------------------------
/* JavaBeanWriter.java */
private void addPropertyEntries(BeanWriterMetaInfoHolder metainf, Document
model, Element rootElt, ArrayList propertyNames,
Map typeMap,
boolean isInherited) throws
SchemaCompilationException {
// go in the loop and add the part elements
QName[] qName;
ArrayList missingQNames = new ArrayList();
ArrayList qNames = new ArrayList();
BeanWriterMetaInfoHolder parentMetaInf = metainf.getParent();
if (metainf.isOrdered()) {
qName = metainf.getOrderedQNameArray();
} else {
qName= metainf.getQNameArray();
}
for (int i = 0; i < qName.length; i++) {
qNames.add(qName[i]);
}
//adding missing QNames to the end, including elements & attributes.
if (metainf.isRestriction()) {
addMissingQNames(metainf, qNames);
}
QName name;
for (int i = 0; i < qNames.size(); i++) {
name = (QName) qNames.get(i);
Element property = XSLTUtils.addChildElement(model, "property",
rootElt);
String xmlName = name.getLocalPart();
XSLTUtils.addAttribute(model, "name", xmlName, property);
XSLTUtils.addAttribute(model, "nsuri", name.getNamespaceURI(),
property);
String javaName = makeUniqueJavaClassName(propertyNames, xmlName);
XSLTUtils.addAttribute(model, "javaname", javaName, property);
String javaClassNameForElement = metainf.getClassNameForQName(name);
if (javaClassNameForElement == null) {
throw new
SchemaCompilationException(SchemaCompilerMessages.getMessage("schema.typeMissing"));
}
if (metainf.isRestriction() && typeChanged(name, metainf)) {
XSLTUtils.addAttribute(model, "typeChanged", "yes", property);
XSLTUtils.addAttribute(model, "rewrite", "yes", property);
}
XSLTUtils.addAttribute(model, "type", javaClassNameForElement,
property);
if (PrimitiveTypeFinder.isPrimitive(javaClassNameForElement)) {
XSLTUtils.addAttribute(model, "primitive", "yes", property);
}
//add an attribute that says the type is default
if (isDefault(javaClassNameForElement)) {
XSLTUtils.addAttribute(model, "default", "yes", property);
}
if (typeMap.containsKey(metainf.getSchemaQNameForQName(name))) {
XSLTUtils.addAttribute(model, "ours", "yes", property);
}
if (metainf.getAttributeStatusForQName(name)) {
XSLTUtils.addAttribute(model, "attribute", "yes", property);
}
if (metainf.isNillable(name)) {
XSLTUtils.addAttribute(model, "nillable", "yes", property);
}
String shortTypeName;
if (metainf.getSchemaQNameForQName(name) != null) {
//see whether the QName is a basetype
if
(baseTypeMap.containsKey(metainf.getSchemaQNameForQName(name))){
shortTypeName=
metainf.getSchemaQNameForQName(name).getLocalPart();
}else{
shortTypeName = getShortTypeName(javaClassNameForElement);
}
}else{
shortTypeName = getShortTypeName(javaClassNameForElement);
}
XSLTUtils.addAttribute(model, "shorttypename", shortTypeName,
property);
if (missingQNames.contains(name) && metainf.isRestriction()) {
XSLTUtils.addAttribute(model, "restricted", "yes", property);
}
if (isInherited){
XSLTUtils.addAttribute(model, "inherited", "yes", property);
}
if (metainf.getAnyStatusForQName(name)) {
XSLTUtils.addAttribute(model, "any", "yes", property);
}
if (metainf.getBinaryStatusForQName(name)) {
XSLTUtils.addAttribute(model, "binary", "yes", property);
}
//put the min occurs count irrespective of whether it's an array or
not
long minOccurs = metainf.getMinOccurs(name);
XSLTUtils.addAttribute(model, "minOccurs", minOccurs + "",
property);
//in the case the original element is an array but the derived one
is not.
if ((parentMetaInf.getArrayStatusForQName(name) &&
!metainf.getArrayStatusForQName(name)) && metainf.isRestriction()) {
XSLTUtils.addAttribute(model, "rewrite", "yes", property);
XSLTUtils.addAttribute(model, "occuranceChanged", "yes",
property);
}
else if ((minOccursChanged(name, metainf) || maxOccursChanged(name,
metainf)) && metainf.isRestriction()) {
XSLTUtils.addAttribute(model, "restricted", "yes", property);
XSLTUtils.addAttribute(model, "occuranceChanged", "yes",
property);
}
if (metainf.getArrayStatusForQName(name)) {
XSLTUtils.addAttribute(model, "array", "yes", property);
XSLTUtils.addAttribute(
model,
"arrayBaseType",
javaClassNameForElement.substring(0,
javaClassNameForElement.indexOf("[")),
property);
long maxOccurs = metainf.getMaxOccurs(name);
if (maxOccurs == Long.MAX_VALUE) {
XSLTUtils.addAttribute(model, "unbound", "yes", property);
} else {
XSLTUtils.addAttribute(model, "maxOccurs", maxOccurs + "",
property);
}
}
}
}
// added method
private void addMissingQNames(BeanWriterMetaInfoHolder metainf, ArrayList
qName) {
QName[] qNames;
QName[] pQNames;
ArrayList missingQNames = new ArrayList();
BeanWriterMetaInfoHolder parentMetaInf = metainf.getParent();
if (metainf.isOrdered()) {
qNames = metainf.getOrderedQNameArray();
} else {
qNames = metainf.getQNameArray();
}
if (parentMetaInf.isOrdered()) {
pQNames = parentMetaInf.getOrderedQNameArray();
} else {
pQNames = parentMetaInf.getQNameArray();
}
for (int i=0; i < pQNames.length; i++) {
if (qNameNotFound(pQNames[i], metainf)) {
missingQNames.add(pQNames[i]);
}
if (i < qNames.length) {
//keeping the order of restricted type.
qName.add(qNames[i]);
}
}
//adding missing QNames to the end of list.
if (!missingQNames.isEmpty()) {
for (int i=0; i < missingQNames.size(); i++) {
qName.add(missingQNames.get(i));
}
}
}
// added method
private boolean qNameNotFound(QName qname, BeanWriterMetaInfoHolder
metainf) {
boolean found = false;
QName[] qNames;
if (metainf.isOrdered()) {
qNames = metainf.getOrderedQNameArray();
} else {
qNames = metainf.getQNameArray();
}
for (int j = 0; j < qNames.length; j++) {
if (qname.getLocalPart().equals(qNames[j].getLocalPart())) {
found = true;
}
}
return !found;
}
// added method
private boolean typeChanged(QName qname, BeanWriterMetaInfoHolder metainf) {
boolean typeChanged = false;
QName[] pQNames;
BeanWriterMetaInfoHolder parentMetainf = metainf.getParent();
if (parentMetainf.isOrdered()) {
pQNames = parentMetainf.getOrderedQNameArray();
} else {
pQNames = parentMetainf.getQNameArray();
}
for (int j = 0; j < pQNames.length; j++) {
if (qname.getLocalPart().equals(pQNames[j].getLocalPart())) {
String javaClassForParentElement =
parentMetainf.getClassNameForQName(pQNames[j]);
String javaClassForElement =
metainf.getClassNameForQName(qname);
if
(!javaClassForParentElement.equals(javaClassForElement)) {
typeChanged = true;
}
}
}
return typeChanged;
}
// added method
private boolean minOccursChanged(QName qname, BeanWriterMetaInfoHolder
metainf) throws SchemaCompilationException {
boolean minChanged = false;
QName[] pQNames;
BeanWriterMetaInfoHolder parentMetainf = metainf.getParent();
if (parentMetainf.isOrdered()) {
pQNames = parentMetainf.getOrderedQNameArray();
} else {
pQNames = parentMetainf.getQNameArray();
}
for (int j = 0; j < pQNames.length; j++) {
if (qname.getLocalPart().equals(pQNames[j].getLocalPart())) {
if (metainf.getMinOccurs(qname) >
parentMetainf.getMinOccurs(pQNames[j])) {
minChanged = true;
}
else if(metainf.getMinOccurs(qname) <
parentMetainf.getMinOccurs(pQNames[j])) {
throw new
SchemaCompilationException(SchemaCompilerMessages.getMessage("minOccurs
Wrong!"));
}
}
}
return minChanged;
}
// added method
private boolean maxOccursChanged(QName qname, BeanWriterMetaInfoHolder
metainf) throws SchemaCompilationException {
boolean maxChanged = false;
QName[] pQNames;
BeanWriterMetaInfoHolder parentMetainf = metainf.getParent();
if (parentMetainf.isOrdered()) {
pQNames = parentMetainf.getOrderedQNameArray();
} else {
pQNames = parentMetainf.getQNameArray();
}
for (int j = 0; j < pQNames.length; j++) {
if (qname.getLocalPart().equals(pQNames[j].getLocalPart())) {
if (metainf.getMaxOccurs(qname) >
parentMetainf.getMaxOccurs(pQNames[j])) {
maxChanged = true;
}
else if(metainf.getMaxOccurs(qname) <
parentMetainf.getMaxOccurs(pQNames[j])) {
throw new
SchemaCompilationException(SchemaCompilerMessages.getMessage("maxOccurs
Wrong!"));
}
}
}
return maxChanged;
}
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]