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 }