in src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypeCodePrinter.java [1853:2218]
void printSetterImpls(SchemaProperty prop, Map<SchemaProperty, Identifier> propMap, SchemaType sType)
throws IOException {
final QName qName = prop.getName();
final String identifier = propMap.get(prop).getIdentifier();
final String setIdentifier = propMap.get(prop).getSetIdentifier();
final boolean several = prop.extendsJavaArray();
final boolean nillable = prop.hasNillable() != SchemaProperty.NEVER;
final String type = javaTypeForProperty(prop);
final String xtype = xmlTypeForProperty(prop);
final int javaType = prop.getJavaTypeCode();
final boolean isAttr = prop.isAttribute();
final String propertyName = prop.getJavaPropertyName();
Set<BeanMethod> bmList = (opt == null) ? null : opt.getCompilePartialMethod();
String safeVarName = NameUtil.nonJavaKeyword(NameUtil.lowerCamelCase(propertyName));
safeVarName = NameUtil.nonExtraKeyword(safeVarName);
boolean xmltype = (javaType == SchemaProperty.XML_OBJECT);
boolean isobj = (javaType == SchemaProperty.JAVA_OBJECT);
boolean isSubstGroup = !Objects.equals(identifier, setIdentifier);
String jtargetType = (xmlTypeForPropertyIsUnion(prop) || !xmltype) ? "org.apache.xmlbeans.SimpleValue" : xtype;
String propdesc = "\"" + qName.getLocalPart() + "\"" + (isAttr ? " attribute" : " element");
if (prop.extendsJavaSingleton()) {
if (bmList == null || bmList.contains(BeanMethod.SET)) {
// void setProp(Value v);
printJavaDoc((several ? "Sets first " : "Sets the ") + propdesc);
if (!opt.isCompileNoAnnotations()) {
emit("@Override");
}
emit("public void set" + propertyName + "(" + type + " " + safeVarName + ") {");
startBlock();
if (xmltype && !isSubstGroup && !isAttr) {
emitPre(sType, PrePostExtension.OPERATION_SET, identifier, false, several ? "0" : "-1");
emit("generatedSetterHelperImpl(" + safeVarName + ", " + setIdentifier + ", 0, " +
"org.apache.xmlbeans.impl.values.XmlObjectBase.KIND_SETTERHELPER_SINGLETON);");
emitPost(sType, PrePostExtension.OPERATION_SET, identifier, false, several ? "0" : "-1");
} else {
emitImplementationPreamble();
emitPre(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, several ? "0" : "-1");
emitGetTarget(setIdentifier, identifier, isAttr, "0", ADD_NEW_VALUE, jtargetType);
printJSetValue(javaType, safeVarName, (SchemaTypeImpl) prop.getType());
emitPost(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, several ? "0" : "-1");
emitImplementationPostamble();
}
endBlock();
}
if (!xmltype && (bmList == null || bmList.contains(BeanMethod.XSET))) {
// void xsetProp(Value v)
printJavaDoc((several ? "Sets (as xml) first " : "Sets (as xml) the ") + propdesc);
if (!opt.isCompileNoAnnotations()) {
emit("@Override");
}
emit("public void xset" + propertyName + "(" + xtype + " " + safeVarName + ") {");
startBlock();
emitImplementationPreamble();
emitPre(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, several ? "0" : "-1");
emitGetTarget(setIdentifier, identifier, isAttr, "0", ADD_NEW_VALUE, xtype);
emit("target.set(" + safeVarName + ");");
emitPost(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, several ? "0" : "-1");
emitImplementationPostamble();
endBlock();
}
if (xmltype && !several && (bmList == null || bmList.contains(BeanMethod.ADD_NEW))) {
// Value addNewProp()
printJavaDoc("Appends and returns a new empty " + propdesc);
if (!opt.isCompileNoAnnotations()) {
emit("@Override");
}
emit("public " + xtype + " addNew" + propertyName + "() {");
startBlock();
emitImplementationPreamble();
emit(xtype + " target = null;");
emitPre(sType, PrePostExtension.OPERATION_INSERT, identifier, isAttr);
emitAddTarget(identifier, isAttr, xtype);
emitPost(sType, PrePostExtension.OPERATION_INSERT, identifier, isAttr);
emit("return target;");
emitImplementationPostamble();
endBlock();
}
if (nillable && (bmList == null || bmList.contains(BeanMethod.SET_NIL))) {
printJavaDoc((several ? "Nils the first " : "Nils the ") + propdesc);
if (!opt.isCompileNoAnnotations()) {
emit("@Override");
}
emit("public void setNil" + propertyName + "() {");
startBlock();
emitImplementationPreamble();
emitPre(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, several ? "0" : "-1");
emitGetTarget(setIdentifier, identifier, isAttr, "0", ADD_NEW_VALUE, xtype);
emit("target.setNil();");
emitPost(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, several ? "0" : "-1");
emitImplementationPostamble();
endBlock();
}
}
if (prop.extendsJavaOption() && (bmList == null || bmList.contains(BeanMethod.UNSET))) {
printJavaDoc((several ? "Removes first " : "Unsets the ") + propdesc);
if (!opt.isCompileNoAnnotations()) {
emit("@Override");
}
emit("public void unset" + propertyName + "() {");
startBlock();
emitImplementationPreamble();
emitPre(sType, PrePostExtension.OPERATION_REMOVE, identifier, isAttr, several ? "0" : "-1");
if (isAttr) {
emit("get_store().remove_attribute(" + identifier + ");");
} else {
emit("get_store().remove_element(" + setIdentifier + ", 0);");
}
emitPost(sType, PrePostExtension.OPERATION_REMOVE, identifier, isAttr, several ? "0" : "-1");
emitImplementationPostamble();
endBlock();
}
if (several) {
String arrayName = propertyName + "Array";
if (bmList == null || bmList.contains(BeanMethod.SET_ARRAY)) {
if (xmltype) {
printJavaDoc("Sets array of all " + propdesc + " WARNING: This method is not atomicaly synchronized.");
if (!opt.isCompileNoAnnotations()) {
emit("@Override");
}
emit("public void set" + arrayName + "(" + type + "[] " + safeVarName + "Array) {");
startBlock();
// do not use synchronize (monitor()) { and GlobalLock inside } !!! deadlock
//emitImplementationPreamble();
emit("check_orphaned();");
emitPre(sType, PrePostExtension.OPERATION_SET, identifier, isAttr);
if (isobj) {
if (!isSubstGroup) {
emit("unionArraySetterHelper(" + safeVarName + "Array" + ", " + identifier + ");");
} else {
emit("unionArraySetterHelper(" + safeVarName + "Array" + ", " + identifier + ", " + setIdentifier + ");");
}
} else {
if (!isSubstGroup) {
emit("arraySetterHelper(" + safeVarName + "Array" + ", " + identifier + ");");
} else {
emit("arraySetterHelper(" + safeVarName + "Array" + ", " + identifier + ", " + setIdentifier + ");");
}
}
emitPost(sType, PrePostExtension.OPERATION_SET, identifier, isAttr);
//emitImplementationPostamble(); to avoid deadlock
endBlock();
} else {
printJavaDoc("Sets array of all " + propdesc);
if (!opt.isCompileNoAnnotations()) {
emit("@Override");
}
emit("public void set" + arrayName + "(" + type + "[] " + safeVarName + "Array) {");
startBlock();
emitImplementationPreamble();
emitPre(sType, PrePostExtension.OPERATION_SET, identifier, isAttr);
if (isobj) {
if (!isSubstGroup) {
emit("unionArraySetterHelper(" + safeVarName + "Array" + ", " + identifier + ");");
} else {
emit("unionArraySetterHelper(" + safeVarName + "Array" + ", " + identifier + ", " + setIdentifier + ");");
}
} else if (prop.getJavaTypeCode() == SchemaProperty.JAVA_USER) {
if (!isSubstGroup) {
emit("org.apache.xmlbeans.SimpleValue[] dests = arraySetterHelper(" + safeVarName + "Array.length" + ", " + identifier + ");");
emit("for ( int i = 0 ; i < dests.length ; i++ ) {");
emit(" " + getUserTypeStaticHandlerMethod(true, (SchemaTypeImpl) prop.getType())
+ "(" + safeVarName + "Array[i], dests[i]);");
emit("}");
} else {
emit("org.apache.xmlbeans.SimpleValue[] dests = arraySetterHelper(" + safeVarName + "Array.length" + ", " + identifier + ", " + setIdentifier + ");");
emit("for ( int i = 0 ; i < dests.length ; i++ ) {");
emit(" " + getUserTypeStaticHandlerMethod(true, (SchemaTypeImpl) prop.getType())
+ "(" + safeVarName + "Array[i], dests[i]);");
emit("}");
}
} else {
if (!isSubstGroup) {
emit("arraySetterHelper(" + safeVarName + "Array" + ", " + identifier + ");");
} else {
emit("arraySetterHelper(" + safeVarName + "Array" + ", " + identifier + ", " + setIdentifier + ");");
}
}
emitPost(sType, PrePostExtension.OPERATION_SET, identifier, isAttr);
emitImplementationPostamble();
endBlock();
}
}
if (bmList == null || bmList.contains(BeanMethod.SET_IDX)) {
printJavaDoc("Sets ith " + propdesc);
if (!opt.isCompileNoAnnotations()) {
emit("@Override");
}
emit("public void set" + arrayName + "(int i, " + type + " " + safeVarName + ") {");
startBlock();
if (xmltype && !isSubstGroup) {
emitPre(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, "i");
emit("generatedSetterHelperImpl(" + safeVarName + ", " + setIdentifier + ", i, " +
"org.apache.xmlbeans.impl.values.XmlObjectBase.KIND_SETTERHELPER_ARRAYITEM);");
emitPost(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, "i");
} else {
emitImplementationPreamble();
emitPre(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, "i");
emitGetTarget(setIdentifier, identifier, isAttr, "i", THROW_EXCEPTION, jtargetType);
printJSetValue(javaType, safeVarName, (SchemaTypeImpl) prop.getType());
emitPost(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, "i");
emitImplementationPostamble();
}
endBlock();
}
if (!xmltype && (bmList == null || bmList.contains(BeanMethod.XSET_ARRAY))) {
printJavaDoc("Sets (as xml) array of all " + propdesc);
if (!opt.isCompileNoAnnotations()) {
emit("@Override");
}
emit("public void xset" + arrayName + "(" + xtype + "[]" + safeVarName + "Array) {");
startBlock();
emitImplementationPreamble();
emitPre(sType, PrePostExtension.OPERATION_SET, identifier, isAttr);
emit("arraySetterHelper(" + safeVarName + "Array" + ", " + identifier + ");");
emitPost(sType, PrePostExtension.OPERATION_SET, identifier, isAttr);
emitImplementationPostamble();
endBlock();
}
if (!xmltype && (bmList == null || bmList.contains(BeanMethod.XSET_IDX))) {
printJavaDoc("Sets (as xml) ith " + propdesc);
if (!opt.isCompileNoAnnotations()) {
emit("@Override");
}
emit("public void xset" + arrayName + "(int i, " + xtype + " " + safeVarName + ") {");
startBlock();
emitImplementationPreamble();
emitPre(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, "i");
emitGetTarget(setIdentifier, identifier, isAttr, "i", THROW_EXCEPTION, xtype);
emit("target.set(" + safeVarName + ");");
emitPost(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, "i");
emitImplementationPostamble();
endBlock();
}
if (nillable && (bmList == null || bmList.contains(BeanMethod.SET_NIL_IDX))) {
printJavaDoc("Nils the ith " + propdesc);
if (!opt.isCompileNoAnnotations()) {
emit("@Override");
}
emit("public void setNil" + arrayName + "(int i) {");
startBlock();
emitImplementationPreamble();
emitPre(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, "i");
emitGetTarget(setIdentifier, identifier, isAttr, "i", THROW_EXCEPTION, xtype);
emit("target.setNil();");
emitPost(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, "i");
emitImplementationPostamble();
endBlock();
}
if (!xmltype && (bmList == null || bmList.contains(BeanMethod.INSERT_IDX))) {
printJavaDoc("Inserts the value as the ith " + propdesc);
if (!opt.isCompileNoAnnotations()) {
emit("@Override");
}
emit("public void insert" + propertyName + "(int i, " + type + " " + safeVarName + ") {");
startBlock();
emitImplementationPreamble();
emitPre(sType, PrePostExtension.OPERATION_INSERT, identifier, isAttr, "i");
emit(jtargetType + " target =");
indent();
if (!isSubstGroup) {
emit("(" + jtargetType + ")get_store().insert_element_user(" + identifier + ", i);");
} else // This is a subst group case
{
emit("(" + jtargetType + ")get_store().insert_element_user(" + setIdentifier + ", " +
identifier + ", i);");
}
outdent();
printJSetValue(javaType, safeVarName, (SchemaTypeImpl) prop.getType());
emitPost(sType, PrePostExtension.OPERATION_INSERT, identifier, isAttr, "i");
emitImplementationPostamble();
endBlock();
}
if (!xmltype && (bmList == null || bmList.contains(BeanMethod.ADD))) {
printJavaDoc("Appends the value as the last " + propdesc);
if (!opt.isCompileNoAnnotations()) {
emit("@Override");
}
emit("public void add" + propertyName + "(" + type + " " + safeVarName + ") {");
startBlock();
emitImplementationPreamble();
emit(jtargetType + " target = null;");
emitPre(sType, PrePostExtension.OPERATION_INSERT, identifier, isAttr);
emitAddTarget(identifier, isAttr, jtargetType);
printJSetValue(javaType, safeVarName, (SchemaTypeImpl) prop.getType());
emitPost(sType, PrePostExtension.OPERATION_INSERT, identifier, isAttr);
emitImplementationPostamble();
endBlock();
}
if (bmList == null || bmList.contains(BeanMethod.INSERT_NEW_IDX)) {
printJavaDoc("Inserts and returns a new empty value (as xml) as the ith " + propdesc);
if (!opt.isCompileNoAnnotations()) {
emit("@Override");
}
emit("public " + xtype + " insertNew" + propertyName + "(int i) {");
startBlock();
emitImplementationPreamble();
emit(xtype + " target = null;");
emitPre(sType, PrePostExtension.OPERATION_INSERT, identifier, isAttr, "i");
if (!isSubstGroup) {
emit("target = (" + xtype + ")get_store().insert_element_user(" + identifier + ", i);");
} else // This is a subst group case
{
emit("target = (" + xtype + ")get_store().insert_element_user(" +
setIdentifier + ", " + identifier + ", i);");
}
emitPost(sType, PrePostExtension.OPERATION_INSERT, identifier, isAttr, "i");
emit("return target;");
emitImplementationPostamble();
endBlock();
}
if (bmList == null || bmList.contains(BeanMethod.ADD_NEW)) {
printJavaDoc("Appends and returns a new empty value (as xml) as the last " + propdesc);
if (!opt.isCompileNoAnnotations()) {
emit("@Override");
}
emit("public " + xtype + " addNew" + propertyName + "() {");
startBlock();
emitImplementationPreamble();
emit(xtype + " target = null;");
emitPre(sType, PrePostExtension.OPERATION_INSERT, identifier, isAttr);
emitAddTarget(identifier, isAttr, xtype);
emitPost(sType, PrePostExtension.OPERATION_INSERT, identifier, isAttr);
emit("return target;");
emitImplementationPostamble();
endBlock();
}
if (bmList == null || bmList.contains(BeanMethod.REMOVE_IDX)) {
printJavaDoc("Removes the ith " + propdesc);
if (!opt.isCompileNoAnnotations()) {
emit("@Override");
}
emit("public void remove" + propertyName + "(int i) {");
startBlock();
emitImplementationPreamble();
emitPre(sType, PrePostExtension.OPERATION_REMOVE, identifier, isAttr, "i");
emit("get_store().remove_element(" + setIdentifier + ", i);");
emitPost(sType, PrePostExtension.OPERATION_REMOVE, identifier, isAttr, "i");
emitImplementationPostamble();
endBlock();
}
}
}