You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ki...@apache.org on 2021/05/30 21:37:30 UTC

svn commit: r1890329 [1/3] - in /xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema: SchemaTypePool.java SchemaTypeSystemImpl.java XsbReader.java

Author: kiwiwings
Date: Sun May 30 21:37:29 2021
New Revision: 1890329

URL: http://svn.apache.org/viewvc?rev=1890329&view=rev
Log:
reduce complexity: extract XsbReader and TypePool from SchemaTypeSystemImpl

Added:
    xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypePool.java
    xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/XsbReader.java
Modified:
    xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypeSystemImpl.java

Added: xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypePool.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypePool.java?rev=1890329&view=auto
==============================================================================
--- xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypePool.java (added)
+++ xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypePool.java Sun May 30 21:37:29 2021
@@ -0,0 +1,271 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.xmlbeans.impl.schema;
+
+import org.apache.xmlbeans.*;
+import org.apache.xmlbeans.impl.common.NameUtil;
+
+import javax.xml.namespace.QName;
+import java.util.LinkedHashMap;
+import java.util.Locale;
+import java.util.Map;
+
+import static org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl.*;
+
+class SchemaTypePool {
+    private final SchemaTypeSystemImpl typeSystem;
+    private final Map<String, SchemaComponent.Ref> _handlesToRefs = new LinkedHashMap<>();
+    // populated on write
+    private final Map<SchemaComponent, String> _componentsToHandles = new LinkedHashMap<>();
+    private boolean _started;
+
+
+    /**
+     * Constructs an empty HandlePool to be populated.
+     */
+    SchemaTypePool(SchemaTypeSystemImpl typeSystem) {
+        this.typeSystem = typeSystem;
+    }
+
+    private String addUniqueHandle(SchemaComponent obj, String base) {
+        // we lowercase handles because of case-insensitive Windows filenames!!!
+        base = base.toLowerCase(Locale.ROOT);
+        String handle = base;
+        for (int index = 2; _handlesToRefs.containsKey(handle); index++) {
+            handle = base + index;
+        }
+        _handlesToRefs.put(handle, obj.getComponentRef());
+        _componentsToHandles.put(obj, handle);
+        return handle;
+    }
+
+    String handleForComponent(SchemaComponent comp) {
+        if (comp == null) {
+            return null;
+        }
+        if (comp.getTypeSystem() != typeSystem) {
+            throw new IllegalArgumentException("Cannot supply handles for types from another type system");
+        }
+        if (comp instanceof SchemaType) {
+            return handleForType((SchemaType) comp);
+        }
+        if (comp instanceof SchemaGlobalElement) {
+            return handleForElement((SchemaGlobalElement) comp);
+        }
+        if (comp instanceof SchemaGlobalAttribute) {
+            return handleForAttribute((SchemaGlobalAttribute) comp);
+        }
+        if (comp instanceof SchemaModelGroup) {
+            return handleForModelGroup((SchemaModelGroup) comp);
+        }
+        if (comp instanceof SchemaAttributeGroup) {
+            return handleForAttributeGroup((SchemaAttributeGroup) comp);
+        }
+        if (comp instanceof SchemaIdentityConstraint) {
+            return handleForIdentityConstraint((SchemaIdentityConstraint) comp);
+        }
+        throw new IllegalStateException("Component type cannot have a handle");
+    }
+
+    String handleForElement(SchemaGlobalElement element) {
+        if (element == null) {
+            return null;
+        }
+        if (element.getTypeSystem() != typeSystem) {
+            throw new IllegalArgumentException("Cannot supply handles for types from another type system");
+        }
+        String handle = _componentsToHandles.get(element);
+        if (handle == null) {
+            handle = addUniqueHandle(element, NameUtil.upperCamelCase(element.getName().getLocalPart()) + "Element");
+        }
+        return handle;
+    }
+
+    String handleForAttribute(SchemaGlobalAttribute attribute) {
+        if (attribute == null) {
+            return null;
+        }
+        if (attribute.getTypeSystem() != typeSystem) {
+            throw new IllegalArgumentException("Cannot supply handles for types from another type system");
+        }
+        String handle = _componentsToHandles.get(attribute);
+        if (handle == null) {
+            handle = addUniqueHandle(attribute, NameUtil.upperCamelCase(attribute.getName().getLocalPart()) + "Attribute");
+        }
+        return handle;
+    }
+
+    String handleForModelGroup(SchemaModelGroup group) {
+        if (group == null) {
+            return null;
+        }
+        if (group.getTypeSystem() != typeSystem) {
+            throw new IllegalArgumentException("Cannot supply handles for types from another type system");
+        }
+        String handle = _componentsToHandles.get(group);
+        if (handle == null) {
+            handle = addUniqueHandle(group, NameUtil.upperCamelCase(group.getName().getLocalPart()) + "ModelGroup");
+        }
+        return handle;
+    }
+
+    String handleForAttributeGroup(SchemaAttributeGroup group) {
+        if (group == null) {
+            return null;
+        }
+        if (group.getTypeSystem() != typeSystem) {
+            throw new IllegalArgumentException("Cannot supply handles for types from another type system");
+        }
+        String handle = _componentsToHandles.get(group);
+        if (handle == null) {
+            handle = addUniqueHandle(group, NameUtil.upperCamelCase(group.getName().getLocalPart()) + "AttributeGroup");
+        }
+        return handle;
+    }
+
+    String handleForIdentityConstraint(SchemaIdentityConstraint idc) {
+        if (idc == null) {
+            return null;
+        }
+        if (idc.getTypeSystem() != typeSystem) {
+            throw new IllegalArgumentException("Cannot supply handles for types from another type system");
+        }
+        String handle = _componentsToHandles.get(idc);
+        if (handle == null) {
+            handle = addUniqueHandle(idc, NameUtil.upperCamelCase(idc.getName().getLocalPart()) + "IdentityConstraint");
+        }
+        return handle;
+    }
+
+    String handleForType(SchemaType type) {
+        if (type == null) {
+            return null;
+        }
+        if (type.getTypeSystem() != typeSystem) {
+            throw new IllegalArgumentException("Cannot supply handles for types from another type system");
+        }
+        String handle = _componentsToHandles.get(type);
+        if (handle == null) {
+            QName name = type.getName();
+            String suffix = "";
+            if (name == null) {
+                if (type.isDocumentType()) {
+                    name = type.getDocumentElementName();
+                    suffix = "Doc";
+                } else if (type.isAttributeType()) {
+                    name = type.getAttributeTypeAttributeName();
+                    suffix = "AttrType";
+                } else if (type.getContainerField() != null) {
+                    name = type.getContainerField().getName();
+                    suffix = type.getContainerField().isAttribute() ? "Attr" : "Elem";
+                }
+            }
+
+            String baseName;
+            String uniq = Integer.toHexString(type.toString().hashCode() | 0x80000000).substring(4).toUpperCase(Locale.ROOT);
+            if (name == null) {
+                baseName = "Anon" + uniq + "Type";
+            } else {
+                baseName = NameUtil.upperCamelCase(name.getLocalPart()) + uniq + suffix + "Type";
+            }
+
+            handle = addUniqueHandle(type, baseName);
+        }
+
+        return handle;
+    }
+
+    SchemaComponent.Ref refForHandle(String handle) {
+        if (handle == null) {
+            return null;
+        }
+
+        return _handlesToRefs.get(handle);
+    }
+
+    void startWriteMode() {
+        _started = true;
+        _componentsToHandles.clear();
+        for (String handle : _handlesToRefs.keySet()) {
+            SchemaComponent comp = _handlesToRefs.get(handle).getComponent();
+            _componentsToHandles.put(comp, handle);
+        }
+    }
+
+    void writeHandlePool(XsbReader reader) {
+        reader.writeShort(_componentsToHandles.size());
+        _componentsToHandles.forEach((comp, handle) -> {
+            reader.writeString(handle);
+            reader.writeShort(fileTypeFromComponentType(comp.getComponentType()));
+        });
+    }
+
+    int fileTypeFromComponentType(int componentType) {
+        switch (componentType) {
+            case SchemaComponent.TYPE:
+                return SchemaTypeSystemImpl.FILETYPE_SCHEMATYPE;
+            case SchemaComponent.ELEMENT:
+                return SchemaTypeSystemImpl.FILETYPE_SCHEMAELEMENT;
+            case SchemaComponent.ATTRIBUTE:
+                return SchemaTypeSystemImpl.FILETYPE_SCHEMAATTRIBUTE;
+            case SchemaComponent.MODEL_GROUP:
+                return SchemaTypeSystemImpl.FILETYPE_SCHEMAMODELGROUP;
+            case SchemaComponent.ATTRIBUTE_GROUP:
+                return SchemaTypeSystemImpl.FILETYPE_SCHEMAATTRIBUTEGROUP;
+            case SchemaComponent.IDENTITY_CONSTRAINT:
+                return SchemaTypeSystemImpl.FILETYPE_SCHEMAIDENTITYCONSTRAINT;
+            default:
+                throw new IllegalStateException("Unexpected component type");
+        }
+    }
+
+    void readHandlePool(XsbReader reader) {
+        if (_handlesToRefs.size() != 0 || _started) {
+            throw new IllegalStateException("Nonempty handle set before read");
+        }
+
+        int size = reader.readShort();
+        for (int i = 0; i < size; i++) {
+            String handle = reader.readString();
+            int code = reader.readShort();
+            SchemaComponent.Ref result;
+            switch (code) {
+                case FILETYPE_SCHEMATYPE:
+                    result = new SchemaType.Ref(typeSystem, handle);
+                    break;
+                case FILETYPE_SCHEMAELEMENT:
+                    result = new SchemaGlobalElement.Ref(typeSystem, handle);
+                    break;
+                case FILETYPE_SCHEMAATTRIBUTE:
+                    result = new SchemaGlobalAttribute.Ref(typeSystem, handle);
+                    break;
+                case FILETYPE_SCHEMAMODELGROUP:
+                    result = new SchemaModelGroup.Ref(typeSystem, handle);
+                    break;
+                case FILETYPE_SCHEMAATTRIBUTEGROUP:
+                    result = new SchemaAttributeGroup.Ref(typeSystem, handle);
+                    break;
+                case FILETYPE_SCHEMAIDENTITYCONSTRAINT:
+                    result = new SchemaIdentityConstraint.Ref(typeSystem, handle);
+                    break;
+                default:
+                    throw new SchemaTypeLoaderException("Schema index has an unrecognized entry of type " + code, typeSystem.getName(), handle, SchemaTypeLoaderException.UNRECOGNIZED_INDEX_ENTRY);
+            }
+            _handlesToRefs.put(handle, result);
+        }
+    }
+}
+



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org