jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/XMLLimitAnalyzer.java
author joehw
Thu, 14 May 2015 09:38:53 -0700
changeset 30522 59a16afe7517
parent 25868 686eef1e7a79
child 33352 35c096b5709c
permissions -rw-r--r--
8080344: Incorrect GPL header causes RE script to miss swap to commercial header for licensee source bundle Reviewed-by: lancea
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
 *
30522
59a16afe7517 8080344: Incorrect GPL header causes RE script to miss swap to commercial header for licensee source bundle
joehw
parents: 25868
diff changeset
     4
 * Copyright (c) 2013, 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
     */
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
    96
    private final Map[] caches;
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
     */
22418
1ee8fd0184d1 8028111: XML readers share the same entity expansion counter
joehw
parents: 20973
diff changeset
   103
    public XMLLimitAnalyzer() {
20968
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   104
        values = new int[Limit.values().length];
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   105
        totalValue = new int[Limit.values().length];
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   106
        names = new String[Limit.values().length];
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   107
        caches = new Map[Limit.values().length];
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   108
    }
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
     * Add the value to the current max count for the specified property
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   112
     * To find the max value of all entities, set no limit
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   113
     *
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   114
     * @param limit the type of the property
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   115
     * @param entityName the name of the entity
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   116
     * @param value the value of the entity
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   117
     */
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   118
    public void addValue(Limit limit, String entityName, int value) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   119
        addValue(limit.ordinal(), entityName, value);
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   120
    }
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
     * Add the value to the current count by the index of the property
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   124
     * @param index the index of the property
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   125
     * @param entityName the name of the entity
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   126
     * @param value the value of the entity
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   127
     */
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   128
    public void addValue(int index, String entityName, int value) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   129
        if (index == Limit.ENTITY_EXPANSION_LIMIT.ordinal() ||
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   130
                index == Limit.MAX_OCCUR_NODE_LIMIT.ordinal() ||
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   131
                index == Limit.ELEMENT_ATTRIBUTE_LIMIT.ordinal()) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   132
            totalValue[index] += value;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   133
            return;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   134
        }
25591
8382d4909d6a 8031540: Introduce document horizon
joehw
parents: 22418
diff changeset
   135
        if (index == Limit.MAX_ELEMENT_DEPTH_LIMIT.ordinal()) {
8382d4909d6a 8031540: Introduce document horizon
joehw
parents: 22418
diff changeset
   136
            totalValue[index] = value;
8382d4909d6a 8031540: Introduce document horizon
joehw
parents: 22418
diff changeset
   137
            return;
8382d4909d6a 8031540: Introduce document horizon
joehw
parents: 22418
diff changeset
   138
        }
20968
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   139
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   140
        Map<String, Integer> cache;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   141
        if (caches[index] == null) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   142
            cache = new HashMap<String, Integer>(10);
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   143
            caches[index] = cache;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   144
        } else {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   145
            cache = caches[index];
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   146
        }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   147
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   148
        int accumulatedValue = value;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   149
        if (cache.containsKey(entityName)) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   150
            accumulatedValue += cache.get(entityName).intValue();
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   151
            cache.put(entityName, Integer.valueOf(accumulatedValue));
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   152
        } else {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   153
            cache.put(entityName, Integer.valueOf(value));
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   154
        }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   155
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   156
        if (accumulatedValue > values[index]) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   157
            values[index] = accumulatedValue;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   158
            names[index] = entityName;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   159
        }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   160
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   161
22418
1ee8fd0184d1 8028111: XML readers share the same entity expansion counter
joehw
parents: 20973
diff changeset
   162
        if (index == Limit.GENERAL_ENTITY_SIZE_LIMIT.ordinal() ||
20968
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   163
                index == Limit.PARAMETER_ENTITY_SIZE_LIMIT.ordinal()) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   164
            totalValue[Limit.TOTAL_ENTITY_SIZE_LIMIT.ordinal()] += value;
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
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   168
    /**
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   169
     * Return the value of the current max count for the specified property
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   170
     *
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   171
     * @param limit the property
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   172
     * @return the value of the property
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   173
     */
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   174
    public int getValue(Limit limit) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   175
        return values[limit.ordinal()];
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   176
    }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   177
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   178
    public int getValue(int index) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   179
        return values[index];
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   180
    }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   181
    /**
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   182
     * Return the total value accumulated so far
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   183
     *
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   184
     * @param limit the property
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   185
     * @return the accumulated value of the property
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   186
     */
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   187
    public int getTotalValue(Limit limit) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   188
        return totalValue[limit.ordinal()];
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
    public int getTotalValue(int index) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   192
        return totalValue[index];
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   193
    }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   194
    /**
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   195
     * Return the current max value (count or length) by the index of a property
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   196
     * @param index the index of a property
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   197
     * @return count of a property
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   198
     */
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   199
    public int getValueByIndex(int index) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   200
        return values[index];
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   201
    }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   202
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   203
    public void startEntity(String name) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   204
        entityStart = name;
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   205
    }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   206
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   207
    public boolean isTracking(String name) {
20973
cc1cc8eb501b 8022682: Supporting XOM
joehw
parents: 20968
diff changeset
   208
        if (entityStart == null) {
cc1cc8eb501b 8022682: Supporting XOM
joehw
parents: 20968
diff changeset
   209
            return false;
cc1cc8eb501b 8022682: Supporting XOM
joehw
parents: 20968
diff changeset
   210
        }
20968
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   211
        return entityStart.equals(name);
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   212
    }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   213
    /**
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   214
     * Stop tracking the entity
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   215
     * @param limit the limit property
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   216
     * @param name the name of an entity
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   217
     */
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   218
    public void endEntity(Limit limit, String name) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   219
        entityStart = "";
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   220
        Map<String, Integer> cache = caches[limit.ordinal()];
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   221
        if (cache != null) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   222
            cache.remove(name);
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   223
        }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   224
    }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   225
22418
1ee8fd0184d1 8028111: XML readers share the same entity expansion counter
joehw
parents: 20973
diff changeset
   226
    public void debugPrint(XMLSecurityManager securityManager) {
20968
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   227
        Formatter formatter = new Formatter();
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   228
        System.out.println(formatter.format("%30s %15s %15s %15s %30s",
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   229
                "Property","Limit","Total size","Size","Entity Name"));
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   230
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   231
        for (Limit limit : Limit.values()) {
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   232
            formatter = new Formatter();
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   233
            System.out.println(formatter.format("%30s %15d %15d %15d %30s",
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   234
                    limit.name(),
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   235
                    securityManager.getLimit(limit),
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   236
                    totalValue[limit.ordinal()],
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   237
                    values[limit.ordinal()],
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   238
                    names[limit.ordinal()]));
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   239
        }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   240
    }
dde41f8b7b96 8014530: Better digital signature processing
joehw
parents:
diff changeset
   241
}