src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/XMLLimitAnalyzer.java
author joehw
Wed, 18 Oct 2017 13:25:49 -0700
changeset 47359 e1a6c0168741
parent 47216 71c04702a3d5
child 49269 26c24703e547
permissions -rw-r--r--
8181150: Fix lint warnings in JAXP repo: rawtypes and unchecked Reviewed-by: lancea, rriggs, mullan
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
20968
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
     1
/*
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
     2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
     3
 *
47359
e1a6c0168741 8181150: Fix lint warnings in JAXP repo: rawtypes and unchecked
joehw
parents: 47216
diff changeset
     4
 * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved.
20968
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
     5
 *
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
     6
 * The contents of this file are subject to the terms of either the GNU
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
     7
 * General Public License Version 2 only ("GPL") or the Common Development
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
     8
 * and Distribution License("CDDL") (collectively, the "License").  You
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
     9
 * may not use this file except in compliance with the License.  You can
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    10
 * obtain a copy of the License at
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    11
 * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    12
 * or packager/legal/LICENSE.txt.  See the License for the specific
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    13
 * language governing permissions and limitations under the License.
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    14
 *
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    15
 * When distributing the software, include this License Header Notice in each
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    16
 * file and include the License file at packager/legal/LICENSE.txt.
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    17
 *
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    18
 * GPL Classpath Exception:
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    19
 * Oracle designates this particular file as subject to the "Classpath"
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    20
 * exception as provided by Oracle in the GPL Version 2 section of the License
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    21
 * file that accompanied this code.
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    22
 *
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    23
 * Modifications:
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    24
 * If applicable, add the following below the License Header, with the fields
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    25
 * enclosed by brackets [] replaced by your own identifying information:
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    26
 * "Portions Copyright [year] [name of copyright owner]"
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    27
 *
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    28
 * Contributor(s):
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    29
 * If you wish your version of this file to be governed by only the CDDL or
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    30
 * only the GPL Version 2, indicate your decision by adding "[Contributor]
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    31
 * elects to include this software in this distribution under the [CDDL or GPL
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    32
 * Version 2] license."  If you don't indicate a single choice of license, a
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    33
 * recipient has the option to distribute your version of this file under
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    34
 * either the CDDL, the GPL Version 2 or to extend the choice of license to
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    35
 * its licensees as provided above.  However, if you add GPL Version 2 code
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    36
 * and therefore, elected the GPL Version 2 license, then the option applies
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    37
 * only if the new code is made subject to such option by the copyright
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    38
 * holder.
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    39
 */
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    40
package com.sun.org.apache.xerces.internal.utils;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    41
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    42
import com.sun.org.apache.xerces.internal.impl.Constants;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    43
import com.sun.org.apache.xerces.internal.utils.XMLSecurityManager.Limit;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    44
import java.util.Formatter;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    45
import java.util.HashMap;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    46
import java.util.Map;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    47
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    48
/**
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    49
 * A helper for analyzing entity expansion limits
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    50
 *
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    51
 * @author Joe Wang Oracle Corp.
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    52
 *
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    53
 */
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    54
public final class XMLLimitAnalyzer {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    55
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    56
    /**
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    57
     * Map old property names with the new ones
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    58
     */
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    59
    public static enum NameMap {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    60
        ENTITY_EXPANSION_LIMIT(Constants.SP_ENTITY_EXPANSION_LIMIT, Constants.ENTITY_EXPANSION_LIMIT),
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    61
        MAX_OCCUR_NODE_LIMIT(Constants.SP_MAX_OCCUR_LIMIT, Constants.MAX_OCCUR_LIMIT),
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    62
        ELEMENT_ATTRIBUTE_LIMIT(Constants.SP_ELEMENT_ATTRIBUTE_LIMIT, Constants.ELEMENT_ATTRIBUTE_LIMIT);
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    63
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    64
        final String newName;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    65
        final String oldName;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    66
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    67
        NameMap(String newName, String oldName) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    68
            this.newName = newName;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    69
            this.oldName = oldName;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    70
        }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    71
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    72
        String getOldName(String newName) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    73
            if (newName.equals(this.newName)) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    74
                return oldName;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    75
            }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    76
            return null;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    77
        }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    78
    }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    79
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    80
    /**
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    81
     * Max value accumulated for each property
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    82
     */
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    83
    private final int[] values;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    84
    /**
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    85
     * Names of the entities corresponding to their max values
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    86
     */
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    87
    private final String[] names;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    88
    /**
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    89
     * Total value of accumulated entities
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    90
     */
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    91
    private final int[] totalValue;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    92
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    93
    /**
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    94
     * Maintain values of the top 10 elements in the process of parsing
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    95
     */
47359
e1a6c0168741 8181150: Fix lint warnings in JAXP repo: rawtypes and unchecked
joehw
parents: 47216
diff changeset
    96
    private final Map<String, Integer>[] caches;
20968
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    97
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    98
    private String entityStart, entityEnd;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    99
    /**
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   100
     * Default constructor. Establishes default values for known security
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   101
     * vulnerabilities.
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   102
     */
47359
e1a6c0168741 8181150: Fix lint warnings in JAXP repo: rawtypes and unchecked
joehw
parents: 47216
diff changeset
   103
    @SuppressWarnings({"rawtypes", "unchecked"})
22418
1ee8fd0184d1 8028111: XML readers share the same entity expansion counter
joehw
parents: 20973
diff changeset
   104
    public XMLLimitAnalyzer() {
20968
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   105
        values = new int[Limit.values().length];
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   106
        totalValue = new int[Limit.values().length];
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   107
        names = new String[Limit.values().length];
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   108
        caches = new Map[Limit.values().length];
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   109
    }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   110
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   111
    /**
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   112
     * Add the value to the current max count for the specified property
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   113
     * To find the max value of all entities, set no limit
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   114
     *
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   115
     * @param limit the type of the property
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   116
     * @param entityName the name of the entity
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   117
     * @param value the value of the entity
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   118
     */
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   119
    public void addValue(Limit limit, String entityName, int value) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   120
        addValue(limit.ordinal(), entityName, value);
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   121
    }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   122
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   123
    /**
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   124
     * Add the value to the current count by the index of the property
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   125
     * @param index the index of the property
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   126
     * @param entityName the name of the entity
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   127
     * @param value the value of the entity
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   128
     */
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   129
    public void addValue(int index, String entityName, int value) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   130
        if (index == Limit.ENTITY_EXPANSION_LIMIT.ordinal() ||
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   131
                index == Limit.MAX_OCCUR_NODE_LIMIT.ordinal() ||
33352
35c096b5709c 8086733: Improve namespace handling
joehw
parents: 30522
diff changeset
   132
                index == Limit.ELEMENT_ATTRIBUTE_LIMIT.ordinal() ||
39799
2847de5336f2 8149962: Better delineation of XML processing
joehw
parents: 33352
diff changeset
   133
                index == Limit.TOTAL_ENTITY_SIZE_LIMIT.ordinal() ||
2847de5336f2 8149962: Better delineation of XML processing
joehw
parents: 33352
diff changeset
   134
                index == Limit.ENTITY_REPLACEMENT_LIMIT.ordinal()
33352
35c096b5709c 8086733: Improve namespace handling
joehw
parents: 30522
diff changeset
   135
                ) {
20968
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   136
            totalValue[index] += value;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   137
            return;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   138
        }
33352
35c096b5709c 8086733: Improve namespace handling
joehw
parents: 30522
diff changeset
   139
        if (index == Limit.MAX_ELEMENT_DEPTH_LIMIT.ordinal() ||
35c096b5709c 8086733: Improve namespace handling
joehw
parents: 30522
diff changeset
   140
                index == Limit.MAX_NAME_LIMIT.ordinal()) {
39799
2847de5336f2 8149962: Better delineation of XML processing
joehw
parents: 33352
diff changeset
   141
            values[index] = value;
25591
8382d4909d6a 8031540: Introduce document horizon
joehw
parents: 22418
diff changeset
   142
            totalValue[index] = value;
8382d4909d6a 8031540: Introduce document horizon
joehw
parents: 22418
diff changeset
   143
            return;
8382d4909d6a 8031540: Introduce document horizon
joehw
parents: 22418
diff changeset
   144
        }
20968
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   145
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   146
        Map<String, Integer> cache;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   147
        if (caches[index] == null) {
33352
35c096b5709c 8086733: Improve namespace handling
joehw
parents: 30522
diff changeset
   148
            cache = new HashMap<>(10);
20968
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   149
            caches[index] = cache;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   150
        } else {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   151
            cache = caches[index];
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   152
        }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   153
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   154
        int accumulatedValue = value;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   155
        if (cache.containsKey(entityName)) {
33352
35c096b5709c 8086733: Improve namespace handling
joehw
parents: 30522
diff changeset
   156
            accumulatedValue += cache.get(entityName);
35c096b5709c 8086733: Improve namespace handling
joehw
parents: 30522
diff changeset
   157
            cache.put(entityName, accumulatedValue);
20968
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   158
        } else {
33352
35c096b5709c 8086733: Improve namespace handling
joehw
parents: 30522
diff changeset
   159
            cache.put(entityName, value);
20968
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   160
        }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   161
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   162
        if (accumulatedValue > values[index]) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   163
            values[index] = accumulatedValue;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   164
            names[index] = entityName;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   165
        }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   166
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   167
22418
1ee8fd0184d1 8028111: XML readers share the same entity expansion counter
joehw
parents: 20973
diff changeset
   168
        if (index == Limit.GENERAL_ENTITY_SIZE_LIMIT.ordinal() ||
20968
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   169
                index == Limit.PARAMETER_ENTITY_SIZE_LIMIT.ordinal()) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   170
            totalValue[Limit.TOTAL_ENTITY_SIZE_LIMIT.ordinal()] += value;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   171
        }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   172
    }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   173
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   174
    /**
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   175
     * Return the value of the current max count for the specified property
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   176
     *
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   177
     * @param limit the property
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   178
     * @return the value of the property
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   179
     */
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   180
    public int getValue(Limit limit) {
39799
2847de5336f2 8149962: Better delineation of XML processing
joehw
parents: 33352
diff changeset
   181
        return getValue(limit.ordinal());
20968
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   182
    }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   183
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   184
    public int getValue(int index) {
39799
2847de5336f2 8149962: Better delineation of XML processing
joehw
parents: 33352
diff changeset
   185
        if (index == Limit.ENTITY_REPLACEMENT_LIMIT.ordinal()) {
2847de5336f2 8149962: Better delineation of XML processing
joehw
parents: 33352
diff changeset
   186
            return totalValue[index];
2847de5336f2 8149962: Better delineation of XML processing
joehw
parents: 33352
diff changeset
   187
        }
20968
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   188
        return values[index];
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   189
    }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   190
    /**
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   191
     * Return the total value accumulated so far
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   192
     *
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   193
     * @param limit the property
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   194
     * @return the accumulated value of the property
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   195
     */
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   196
    public int getTotalValue(Limit limit) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   197
        return totalValue[limit.ordinal()];
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   198
    }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   199
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   200
    public int getTotalValue(int index) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   201
        return totalValue[index];
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   202
    }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   203
    /**
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   204
     * Return the current max value (count or length) by the index of a property
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   205
     * @param index the index of a property
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   206
     * @return count of a property
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   207
     */
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   208
    public int getValueByIndex(int index) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   209
        return values[index];
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   210
    }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   211
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   212
    public void startEntity(String name) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   213
        entityStart = name;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   214
    }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   215
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   216
    public boolean isTracking(String name) {
20973
cc1cc8eb501b 8022682: Supporting XOM
joehw
parents: 20968
diff changeset
   217
        if (entityStart == null) {
cc1cc8eb501b 8022682: Supporting XOM
joehw
parents: 20968
diff changeset
   218
            return false;
cc1cc8eb501b 8022682: Supporting XOM
joehw
parents: 20968
diff changeset
   219
        }
20968
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   220
        return entityStart.equals(name);
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   221
    }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   222
    /**
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   223
     * Stop tracking the entity
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   224
     * @param limit the limit property
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   225
     * @param name the name of an entity
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   226
     */
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   227
    public void endEntity(Limit limit, String name) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   228
        entityStart = "";
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   229
        Map<String, Integer> cache = caches[limit.ordinal()];
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   230
        if (cache != null) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   231
            cache.remove(name);
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   232
        }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   233
    }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   234
33352
35c096b5709c 8086733: Improve namespace handling
joehw
parents: 30522
diff changeset
   235
    /**
35c096b5709c 8086733: Improve namespace handling
joehw
parents: 30522
diff changeset
   236
     * Resets the current value of the specified limit.
35c096b5709c 8086733: Improve namespace handling
joehw
parents: 30522
diff changeset
   237
     * @param limit The limit to be reset.
35c096b5709c 8086733: Improve namespace handling
joehw
parents: 30522
diff changeset
   238
     */
35c096b5709c 8086733: Improve namespace handling
joehw
parents: 30522
diff changeset
   239
    public void reset(Limit limit) {
35c096b5709c 8086733: Improve namespace handling
joehw
parents: 30522
diff changeset
   240
        if (limit.ordinal() == Limit.TOTAL_ENTITY_SIZE_LIMIT.ordinal()) {
35c096b5709c 8086733: Improve namespace handling
joehw
parents: 30522
diff changeset
   241
            totalValue[limit.ordinal()] = 0;
39799
2847de5336f2 8149962: Better delineation of XML processing
joehw
parents: 33352
diff changeset
   242
        } else if (limit.ordinal() == Limit.GENERAL_ENTITY_SIZE_LIMIT.ordinal()) {
2847de5336f2 8149962: Better delineation of XML processing
joehw
parents: 33352
diff changeset
   243
            names[limit.ordinal()] = null;
2847de5336f2 8149962: Better delineation of XML processing
joehw
parents: 33352
diff changeset
   244
            values[limit.ordinal()] = 0;
2847de5336f2 8149962: Better delineation of XML processing
joehw
parents: 33352
diff changeset
   245
            caches[limit.ordinal()] = null;
2847de5336f2 8149962: Better delineation of XML processing
joehw
parents: 33352
diff changeset
   246
            totalValue[limit.ordinal()] = 0;
33352
35c096b5709c 8086733: Improve namespace handling
joehw
parents: 30522
diff changeset
   247
        }
35c096b5709c 8086733: Improve namespace handling
joehw
parents: 30522
diff changeset
   248
    }
35c096b5709c 8086733: Improve namespace handling
joehw
parents: 30522
diff changeset
   249
22418
1ee8fd0184d1 8028111: XML readers share the same entity expansion counter
joehw
parents: 20973
diff changeset
   250
    public void debugPrint(XMLSecurityManager securityManager) {
20968
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   251
        Formatter formatter = new Formatter();
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   252
        System.out.println(formatter.format("%30s %15s %15s %15s %30s",
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   253
                "Property","Limit","Total size","Size","Entity Name"));
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   254
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   255
        for (Limit limit : Limit.values()) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   256
            formatter = new Formatter();
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   257
            System.out.println(formatter.format("%30s %15d %15d %15d %30s",
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   258
                    limit.name(),
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   259
                    securityManager.getLimit(limit),
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   260
                    totalValue[limit.ordinal()],
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   261
                    values[limit.ordinal()],
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   262
                    names[limit.ordinal()]));
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   263
        }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   264
    }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   265
}