PdfNameTree.java

1
/*
2
 * Copyright 2004 by Paulo Soares.
3
 *
4
 * The contents of this file are subject to the Mozilla Public License Version 1.1
5
 * (the "License"); you may not use this file except in compliance with the License.
6
 * You may obtain a copy of the License at http://www.mozilla.org/MPL/
7
 *
8
 * Software distributed under the License is distributed on an "AS IS" basis,
9
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
10
 * for the specific language governing rights and limitations under the License.
11
 *
12
 * The Original Code is 'iText, a free JAVA-PDF library'.
13
 *
14
 * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
15
 * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
16
 * All Rights Reserved.
17
 * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
18
 * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
19
 *
20
 * Contributor(s): all the names of the contributors are added in the source code
21
 * where applicable.
22
 *
23
 * Alternatively, the contents of this file may be used under the terms of the
24
 * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
25
 * provisions of LGPL are applicable instead of those above.  If you wish to
26
 * allow use of your version of this file only under the terms of the LGPL
27
 * License and not to allow others to use your version of this file under
28
 * the MPL, indicate your decision by deleting the provisions above and
29
 * replace them with the notice and other provisions required by the LGPL.
30
 * If you do not delete the provisions above, a recipient may use your version
31
 * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
32
 *
33
 * This library is free software; you can redistribute it and/or modify it
34
 * under the terms of the MPL as stated above or under the terms of the GNU
35
 * Library General Public License as published by the Free Software Foundation;
36
 * either version 2 of the License, or any later version.
37
 *
38
 * This library is distributed in the hope that it will be useful, but WITHOUT
39
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
40
 * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
41
 * details.
42
 *
43
 * If you didn't download this code from the following link, you should check if
44
 * you aren't using an obsolete version:
45
 * http://www.lowagie.com/iText/
46
 */
47
package com.lowagie.text.pdf;
48
49
import java.io.IOException;
50
import java.util.Arrays;
51
import java.util.HashMap;
52
53
/**
54
 * Creates a name tree.
55
 *
56
 * @author Paulo Soares (psoares@consiste.pt)
57
 */
58
public class PdfNameTree {
59
60
  private static final int leafSize = 64;
61
62
  /**
63
   * Writes a name tree to a PdfWriter.
64
   *
65
   * @param items the item of the name tree. The key is a <CODE>String</CODE> and the value is a <CODE>PdfObject</CODE>. Note that although
66
   * the keys are strings only the lower byte is used and no check is made for chars with the same lower byte and different upper byte. This
67
   * will generate a wrong tree name.
68
   * @param writer the writer
69
   * @return the dictionary with the name tree. This dictionary is the one generally pointed to by the key /Dests, for example
70
   * @throws IOException on error
71
   */
72
  public static PdfDictionary writeTree(HashMap items, PdfWriter writer) throws IOException {
73 1 1. writeTree : negated conditional → NO_COVERAGE
    if (items.isEmpty()) {
74 1 1. writeTree : mutated return of Object value for com/lowagie/text/pdf/PdfNameTree::writeTree to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE
      return null;
75
    }
76
    String[] names = new String[items.size()];
77
    names = (String[]) items.keySet().toArray(names);
78 1 1. writeTree : removed call to java/util/Arrays::sort → NO_COVERAGE
    Arrays.sort(names);
79 2 1. writeTree : changed conditional boundary → NO_COVERAGE
2. writeTree : negated conditional → NO_COVERAGE
    if (names.length <= leafSize) {
80
      PdfDictionary dic = new PdfDictionary();
81
      PdfArray ar = new PdfArray();
82
      for (String name : names) {
83
        ar.add(new PdfString(name, null));
84
        ar.add((PdfObject) items.get(name));
85
      }
86 1 1. writeTree : removed call to com/lowagie/text/pdf/PdfDictionary::put → NO_COVERAGE
      dic.put(PdfName.NAMES, ar);
87 1 1. writeTree : mutated return of Object value for com/lowagie/text/pdf/PdfNameTree::writeTree to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE
      return dic;
88
    }
89
    int skip = leafSize;
90 3 1. writeTree : Replaced integer addition with subtraction → NO_COVERAGE
2. writeTree : Replaced integer subtraction with addition → NO_COVERAGE
3. writeTree : Replaced integer division with multiplication → NO_COVERAGE
    PdfIndirectReference[] kids = new PdfIndirectReference[(names.length + leafSize - 1) / leafSize];
91 3 1. writeTree : changed conditional boundary → NO_COVERAGE
2. writeTree : Changed increment from 1 to -1 → NO_COVERAGE
3. writeTree : negated conditional → NO_COVERAGE
    for (int k = 0; k < kids.length; ++k) {
92 1 1. writeTree : Replaced integer multiplication with division → NO_COVERAGE
      int offset = k * leafSize;
93 1 1. writeTree : Replaced integer addition with subtraction → NO_COVERAGE
      int end = Math.min(offset + leafSize, names.length);
94
      PdfDictionary dic = new PdfDictionary();
95
      PdfArray arr = new PdfArray();
96
      arr.add(new PdfString(names[offset], null));
97 1 1. writeTree : Replaced integer subtraction with addition → NO_COVERAGE
      arr.add(new PdfString(names[end - 1], null));
98 1 1. writeTree : removed call to com/lowagie/text/pdf/PdfDictionary::put → NO_COVERAGE
      dic.put(PdfName.LIMITS, arr);
99
      arr = new PdfArray();
100 3 1. writeTree : changed conditional boundary → NO_COVERAGE
2. writeTree : Changed increment from 1 to -1 → NO_COVERAGE
3. writeTree : negated conditional → NO_COVERAGE
      for (; offset < end; ++offset) {
101
        arr.add(new PdfString(names[offset], null));
102
        arr.add((PdfObject) items.get(names[offset]));
103
      }
104 1 1. writeTree : removed call to com/lowagie/text/pdf/PdfDictionary::put → NO_COVERAGE
      dic.put(PdfName.NAMES, arr);
105
      kids[k] = writer.addToBody(dic).getIndirectReference();
106
    }
107
    int top = kids.length;
108
    while (true) {
109 2 1. writeTree : changed conditional boundary → NO_COVERAGE
2. writeTree : negated conditional → NO_COVERAGE
      if (top <= leafSize) {
110
        PdfArray arr = new PdfArray();
111 2 1. writeTree : changed conditional boundary → NO_COVERAGE
2. writeTree : negated conditional → NO_COVERAGE
        for (int k = 0; k < top; ++k) {
112
          arr.add(kids[k]);
113
        }
114
        PdfDictionary dic = new PdfDictionary();
115 1 1. writeTree : removed call to com/lowagie/text/pdf/PdfDictionary::put → NO_COVERAGE
        dic.put(PdfName.KIDS, arr);
116 1 1. writeTree : mutated return of Object value for com/lowagie/text/pdf/PdfNameTree::writeTree to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE
        return dic;
117
      }
118 1 1. writeTree : Replaced integer multiplication with division → NO_COVERAGE
      skip *= leafSize;
119 3 1. writeTree : Replaced integer addition with subtraction → NO_COVERAGE
2. writeTree : Replaced integer subtraction with addition → NO_COVERAGE
3. writeTree : Replaced integer division with multiplication → NO_COVERAGE
      int tt = (names.length + skip - 1) / skip;
120 2 1. writeTree : changed conditional boundary → NO_COVERAGE
2. writeTree : negated conditional → NO_COVERAGE
      for (int k = 0; k < tt; ++k) {
121 1 1. writeTree : Replaced integer multiplication with division → NO_COVERAGE
        int offset = k * leafSize;
122 1 1. writeTree : Replaced integer addition with subtraction → NO_COVERAGE
        int end = Math.min(offset + leafSize, top);
123
        PdfDictionary dic = new PdfDictionary();
124
        PdfArray arr = new PdfArray();
125 1 1. writeTree : Replaced integer multiplication with division → NO_COVERAGE
        arr.add(new PdfString(names[k * skip], null));
126 3 1. writeTree : Replaced integer addition with subtraction → NO_COVERAGE
2. writeTree : Replaced integer multiplication with division → NO_COVERAGE
3. writeTree : Replaced integer subtraction with addition → NO_COVERAGE
        arr.add(new PdfString(names[Math.min((k + 1) * skip, names.length) - 1], null));
127 1 1. writeTree : removed call to com/lowagie/text/pdf/PdfDictionary::put → NO_COVERAGE
        dic.put(PdfName.LIMITS, arr);
128
        arr = new PdfArray();
129 3 1. writeTree : changed conditional boundary → NO_COVERAGE
2. writeTree : Changed increment from 1 to -1 → NO_COVERAGE
3. writeTree : negated conditional → NO_COVERAGE
        for (; offset < end; ++offset) {
130
          arr.add(kids[offset]);
131
        }
132 1 1. writeTree : removed call to com/lowagie/text/pdf/PdfDictionary::put → NO_COVERAGE
        dic.put(PdfName.KIDS, arr);
133
        kids[k] = writer.addToBody(dic).getIndirectReference();
134
      }
135
      top = tt;
136
    }
137
  }
138
139
  private static void iterateItems(PdfDictionary dic, HashMap<String, PdfObject> items) {
140
    PdfArray nn = (PdfArray) PdfReader.getPdfObjectRelease(dic.get(PdfName.NAMES));
141 1 1. iterateItems : negated conditional → NO_COVERAGE
    if (nn != null) {
142 2 1. iterateItems : changed conditional boundary → NO_COVERAGE
2. iterateItems : negated conditional → NO_COVERAGE
      for (int k = 0; k < nn.size(); ++k) {
143 1 1. iterateItems : Changed increment from 1 to -1 → NO_COVERAGE
        PdfString s = (PdfString) PdfReader.getPdfObjectRelease(nn.getPdfObject(k++));
144
        items.put(PdfEncodings.convertToString(s.getBytes(), null), nn.getPdfObject(k));
145
      }
146 1 1. iterateItems : negated conditional → NO_COVERAGE
    } else if ((nn = (PdfArray) PdfReader.getPdfObjectRelease(dic.get(PdfName.KIDS))) != null) {
147 2 1. iterateItems : changed conditional boundary → NO_COVERAGE
2. iterateItems : negated conditional → NO_COVERAGE
      for (int k = 0; k < nn.size(); ++k) {
148
        PdfDictionary kid = (PdfDictionary) PdfReader.getPdfObjectRelease(nn.getPdfObject(k));
149 1 1. iterateItems : removed call to com/lowagie/text/pdf/PdfNameTree::iterateItems → NO_COVERAGE
        iterateItems(kid, items);
150
      }
151
    }
152
  }
153
154
  public static HashMap<String, PdfObject> readTree(PdfDictionary dic) {
155
    HashMap<String, PdfObject> items = new HashMap<>();
156 1 1. readTree : negated conditional → NO_COVERAGE
    if (dic != null) {
157 1 1. readTree : removed call to com/lowagie/text/pdf/PdfNameTree::iterateItems → NO_COVERAGE
      iterateItems(dic, items);
158
    }
159 1 1. readTree : mutated return of Object value for com/lowagie/text/pdf/PdfNameTree::readTree to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE
    return items;
160
  }
161
}

Mutations

73

1.1
Location : writeTree
Killed by : none
negated conditional → NO_COVERAGE

74

1.1
Location : writeTree
Killed by : none
mutated return of Object value for com/lowagie/text/pdf/PdfNameTree::writeTree to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE

78

1.1
Location : writeTree
Killed by : none
removed call to java/util/Arrays::sort → NO_COVERAGE

79

1.1
Location : writeTree
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : writeTree
Killed by : none
negated conditional → NO_COVERAGE

86

1.1
Location : writeTree
Killed by : none
removed call to com/lowagie/text/pdf/PdfDictionary::put → NO_COVERAGE

87

1.1
Location : writeTree
Killed by : none
mutated return of Object value for com/lowagie/text/pdf/PdfNameTree::writeTree to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE

90

1.1
Location : writeTree
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

2.2
Location : writeTree
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

3.3
Location : writeTree
Killed by : none
Replaced integer division with multiplication → NO_COVERAGE

91

1.1
Location : writeTree
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : writeTree
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

3.3
Location : writeTree
Killed by : none
negated conditional → NO_COVERAGE

92

1.1
Location : writeTree
Killed by : none
Replaced integer multiplication with division → NO_COVERAGE

93

1.1
Location : writeTree
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

97

1.1
Location : writeTree
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

98

1.1
Location : writeTree
Killed by : none
removed call to com/lowagie/text/pdf/PdfDictionary::put → NO_COVERAGE

100

1.1
Location : writeTree
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : writeTree
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

3.3
Location : writeTree
Killed by : none
negated conditional → NO_COVERAGE

104

1.1
Location : writeTree
Killed by : none
removed call to com/lowagie/text/pdf/PdfDictionary::put → NO_COVERAGE

109

1.1
Location : writeTree
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : writeTree
Killed by : none
negated conditional → NO_COVERAGE

111

1.1
Location : writeTree
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : writeTree
Killed by : none
negated conditional → NO_COVERAGE

115

1.1
Location : writeTree
Killed by : none
removed call to com/lowagie/text/pdf/PdfDictionary::put → NO_COVERAGE

116

1.1
Location : writeTree
Killed by : none
mutated return of Object value for com/lowagie/text/pdf/PdfNameTree::writeTree to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE

118

1.1
Location : writeTree
Killed by : none
Replaced integer multiplication with division → NO_COVERAGE

119

1.1
Location : writeTree
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

2.2
Location : writeTree
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

3.3
Location : writeTree
Killed by : none
Replaced integer division with multiplication → NO_COVERAGE

120

1.1
Location : writeTree
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : writeTree
Killed by : none
negated conditional → NO_COVERAGE

121

1.1
Location : writeTree
Killed by : none
Replaced integer multiplication with division → NO_COVERAGE

122

1.1
Location : writeTree
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

125

1.1
Location : writeTree
Killed by : none
Replaced integer multiplication with division → NO_COVERAGE

126

1.1
Location : writeTree
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

2.2
Location : writeTree
Killed by : none
Replaced integer multiplication with division → NO_COVERAGE

3.3
Location : writeTree
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

127

1.1
Location : writeTree
Killed by : none
removed call to com/lowagie/text/pdf/PdfDictionary::put → NO_COVERAGE

129

1.1
Location : writeTree
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : writeTree
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

3.3
Location : writeTree
Killed by : none
negated conditional → NO_COVERAGE

132

1.1
Location : writeTree
Killed by : none
removed call to com/lowagie/text/pdf/PdfDictionary::put → NO_COVERAGE

141

1.1
Location : iterateItems
Killed by : none
negated conditional → NO_COVERAGE

142

1.1
Location : iterateItems
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : iterateItems
Killed by : none
negated conditional → NO_COVERAGE

143

1.1
Location : iterateItems
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

146

1.1
Location : iterateItems
Killed by : none
negated conditional → NO_COVERAGE

147

1.1
Location : iterateItems
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : iterateItems
Killed by : none
negated conditional → NO_COVERAGE

149

1.1
Location : iterateItems
Killed by : none
removed call to com/lowagie/text/pdf/PdfNameTree::iterateItems → NO_COVERAGE

156

1.1
Location : readTree
Killed by : none
negated conditional → NO_COVERAGE

157

1.1
Location : readTree
Killed by : none
removed call to com/lowagie/text/pdf/PdfNameTree::iterateItems → NO_COVERAGE

159

1.1
Location : readTree
Killed by : none
mutated return of Object value for com/lowagie/text/pdf/PdfNameTree::readTree to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE

Active mutators

Tests examined


Report generated by PIT 1.4.2