1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.bcel.classfile;
21
22 import java.io.DataInput;
23 import java.io.DataOutputStream;
24 import java.io.IOException;
25 import java.util.Arrays;
26
27 import org.apache.bcel.Const;
28 import org.apache.bcel.util.Args;
29 import org.apache.commons.lang3.ArrayUtils;
30
31
32
33
34
35
36
37 public final class ModulePackages extends Attribute {
38
39 private int[] packageIndexTable;
40
41
42
43
44
45
46
47
48
49
50 ModulePackages(final int nameIndex, final int length, final DataInput input, final ConstantPool constantPool) throws IOException {
51 this(nameIndex, length, (int[]) null, constantPool);
52 final int packageCount = input.readUnsignedShort();
53 packageIndexTable = new int[packageCount];
54 for (int i = 0; i < packageCount; i++) {
55 packageIndexTable[i] = input.readUnsignedShort();
56 }
57 }
58
59
60
61
62
63
64
65 public ModulePackages(final int nameIndex, final int length, final int[] packageIndexTable, final ConstantPool constantPool) {
66 super(Const.ATTR_MODULE_PACKAGES, nameIndex, length, constantPool);
67 this.packageIndexTable = ArrayUtils.nullToEmpty(packageIndexTable);
68 Args.requireU2(this.packageIndexTable.length, "packageIndexTable.length");
69 }
70
71
72
73
74
75
76
77 public ModulePackages(final ModulePackages c) {
78 this(c.getNameIndex(), c.getLength(), c.getPackageIndexTable(), c.getConstantPool());
79 }
80
81
82
83
84
85
86
87 @Override
88 public void accept(final Visitor v) {
89 v.visitModulePackages(this);
90 }
91
92
93
94
95 @Override
96 public Attribute copy(final ConstantPool constantPool) {
97 final ModulePackages c = (ModulePackages) clone();
98 if (packageIndexTable != null) {
99 c.packageIndexTable = packageIndexTable.clone();
100 }
101 c.setConstantPool(constantPool);
102 return c;
103 }
104
105
106
107
108
109
110
111 @Override
112 public void dump(final DataOutputStream file) throws IOException {
113 super.dump(file);
114 file.writeShort(packageIndexTable.length);
115 for (final int index : packageIndexTable) {
116 file.writeShort(index);
117 }
118 }
119
120
121
122
123 public int getNumberOfPackages() {
124 return packageIndexTable == null ? 0 : packageIndexTable.length;
125 }
126
127
128
129
130 public int[] getPackageIndexTable() {
131 return packageIndexTable;
132 }
133
134
135
136
137 public String[] getPackageNames() {
138 final String[] names = new String[packageIndexTable.length];
139 Arrays.setAll(names, i -> Utility.pathToPackage(super.getConstantPool().getConstantString(packageIndexTable[i], Const.CONSTANT_Package)));
140 return names;
141 }
142
143
144
145
146 public void setPackageIndexTable(final int[] packageIndexTable) {
147 this.packageIndexTable = ArrayUtils.nullToEmpty(packageIndexTable);
148 }
149
150
151
152
153 @Override
154 public String toString() {
155 final StringBuilder buf = new StringBuilder();
156 buf.append("ModulePackages(");
157 buf.append(packageIndexTable.length);
158 buf.append("):\n");
159 for (final int index : packageIndexTable) {
160 final String packageName = super.getConstantPool().getConstantString(index, Const.CONSTANT_Package);
161 buf.append(" ").append(Utility.compactClassName(packageName, false)).append("\n");
162 }
163 return buf.substring(0, buf.length() - 1);
164 }
165 }