From ba174ebb3eaeeeacd054ed1da8bc45a4facad966 Mon Sep 17 00:00:00 2001
From: Laurent SCHOELENS <61973605+laurentschoelens@users.noreply.github.com>
Date: Mon, 18 Sep 2023 00:54:00 +0200
Subject: [PATCH] SCD auto-ack plugin customizations
---
.../internalizer/SCDBasedBindingSet.java | 10 +-
.../AcknowledgePluginCustomizationBinder.java | 206 ++++++++++++++++++
2 files changed, 211 insertions(+), 5 deletions(-)
create mode 100644 jaxb-ri/xjc/src/main/java/com/sun/tools/xjc/reader/xmlschema/AcknowledgePluginCustomizationBinder.java
diff --git a/jaxb-ri/xjc/src/main/java/com/sun/tools/xjc/reader/internalizer/SCDBasedBindingSet.java b/jaxb-ri/xjc/src/main/java/com/sun/tools/xjc/reader/internalizer/SCDBasedBindingSet.java
index 6548b0724..2e6401d3b 100644
--- a/jaxb-ri/xjc/src/main/java/com/sun/tools/xjc/reader/internalizer/SCDBasedBindingSet.java
+++ b/jaxb-ri/xjc/src/main/java/com/sun/tools/xjc/reader/internalizer/SCDBasedBindingSet.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2023 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Distribution License v. 1.0, which is available at
@@ -15,6 +15,9 @@
import java.util.Iterator;
import java.util.List;
+import com.sun.tools.xjc.reader.Ring;
+import com.sun.tools.xjc.reader.xmlschema.AcknowledgePluginCustomizationBinder;
+import com.sun.xml.xsom.*;
import jakarta.xml.bind.JAXBException;
import jakarta.xml.bind.Unmarshaller;
import jakarta.xml.bind.UnmarshallerHandler;
@@ -27,10 +30,6 @@
import com.sun.tools.xjc.reader.xmlschema.bindinfo.BindInfo;
import com.sun.tools.xjc.util.ForkContentHandler;
import com.sun.tools.xjc.util.DOMUtils;
-import com.sun.xml.xsom.SCD;
-import com.sun.xml.xsom.XSAnnotation;
-import com.sun.xml.xsom.XSComponent;
-import com.sun.xml.xsom.XSSchemaSet;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
@@ -162,6 +161,7 @@ private void apply(Collection extends XSComponent> contextNode) {
ann.setAnnotation(bi);
}
bi.addDecl(decl);
+ target.visit(Ring.get(AcknowledgePluginCustomizationBinder.class));
} catch (SAXException e) {
// the error should have already been reported.
} catch (JAXBException e) {
diff --git a/jaxb-ri/xjc/src/main/java/com/sun/tools/xjc/reader/xmlschema/AcknowledgePluginCustomizationBinder.java b/jaxb-ri/xjc/src/main/java/com/sun/tools/xjc/reader/xmlschema/AcknowledgePluginCustomizationBinder.java
new file mode 100644
index 000000000..0e7df0ef7
--- /dev/null
+++ b/jaxb-ri/xjc/src/main/java/com/sun/tools/xjc/reader/xmlschema/AcknowledgePluginCustomizationBinder.java
@@ -0,0 +1,206 @@
+/*
+ * Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Distribution License v. 1.0, which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+package com.sun.tools.xjc.reader.xmlschema;
+
+import com.sun.tools.xjc.reader.xmlschema.bindinfo.BIDeclaration;
+import com.sun.tools.xjc.reader.xmlschema.bindinfo.BIXPluginCustomization;
+import com.sun.tools.xjc.reader.xmlschema.bindinfo.BindInfo;
+import com.sun.xml.xsom.*;
+import com.sun.xml.xsom.visitor.XSSimpleTypeVisitor;
+import com.sun.xml.xsom.visitor.XSVisitor;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+
+/**
+ * Mark as acknowledge every BIXPluginCustomization
+ * seen in XSComponent and sub-tree.
+ */
+public class AcknowledgePluginCustomizationBinder extends BindingComponent implements XSVisitor, XSSimpleTypeVisitor {
+
+ private final Set visitedComponents = new HashSet<>();
+
+ /**
+ * Acknowledge plugin customizations on this component
+ * and returns true if this is the first time this
+ * component is visited.
+ */
+ private boolean acknowledge( XSComponent c ) {
+ if (!visitedComponents.add(c)) {
+ return false; // already processed
+ }
+
+ XSAnnotation ann = c.getAnnotation(false);
+ if (ann != null && ann.getAnnotation() instanceof BindInfo) {
+ for (BIDeclaration decl : ((BindInfo) ann.getAnnotation()).getDecls()) {
+ if (decl instanceof BIXPluginCustomization) {
+ decl.markAsAcknowledged();
+ }
+ }
+ }
+
+ return true;
+ }
+
+ @Override
+ public void annotation(XSAnnotation ann) {
+ }
+
+ @Override
+ public void attGroupDecl(XSAttGroupDecl decl) {
+ if (acknowledge(decl)) {
+ attContainer(decl);
+ }
+ }
+
+ @Override
+ public void attributeDecl(XSAttributeDecl decl) {
+ if (acknowledge(decl)) {
+ decl.getType().visit((XSSimpleTypeVisitor) this);
+ }
+ }
+
+ @Override
+ public void attributeUse(XSAttributeUse use) {
+ if (acknowledge(use)) {
+ use.getDecl().visit(this);
+ }
+ }
+
+ @Override
+ public void complexType(XSComplexType type) {
+ if (acknowledge(type)) {
+ // don't need to acknowledge the base type -- it must be global, thus
+ // it is covered already
+ type.getContentType().visit(this);
+ attContainer(type);
+ }
+ }
+
+ private void attContainer( XSAttContainer cont ) {
+ for (Iterator extends XSAttGroupDecl> itr = cont.iterateAttGroups(); itr.hasNext(); ) {
+ itr.next().visit(this);
+ }
+
+ for (Iterator extends XSAttributeUse> itr = cont.iterateDeclaredAttributeUses(); itr.hasNext(); ) {
+ itr.next().visit(this);
+ }
+
+ XSWildcard wc = cont.getAttributeWildcard();
+ if (wc!=null) {
+ wc.visit(this);
+ }
+ }
+
+ @Override
+ public void schema(XSSchema schema) {
+ acknowledge(schema);
+ }
+
+ @Override
+ public void facet(XSFacet facet) {
+ acknowledge(facet);
+ }
+
+ @Override
+ public void notation(XSNotation notation) {
+ acknowledge(notation);
+ }
+
+ @Override
+ public void wildcard(XSWildcard wc) {
+ acknowledge(wc);
+ }
+
+ @Override
+ public void modelGroupDecl(XSModelGroupDecl decl) {
+ if (acknowledge(decl)) {
+ decl.getModelGroup().visit(this);
+ }
+ }
+
+ @Override
+ public void modelGroup(XSModelGroup group) {
+ if (acknowledge(group)) {
+ for ( int i=0; i