View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   *  Unless required by applicable law or agreed to in writing, software
12   *  distributed under the License is distributed on an "AS IS" BASIS,
13   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   *  See the License for the specific language governing permissions and
15   *  limitations under the License.
16   *
17   */
18  package org.apache.bcel.generic;
19  
20  import java.io.DataOutputStream;
21  import java.io.IOException;
22  
23  import org.apache.bcel.classfile.ConstantUtf8;
24  import org.apache.bcel.classfile.ElementValue;
25  import org.apache.bcel.classfile.ElementValuePair;
26  
27  /**
28   * @since 6.0
29   */
30  public class ElementValuePairGen
31  {
32      private int nameIdx;
33  
34      private final ElementValueGen value;
35  
36      private final ConstantPoolGen cpool;
37  
38      public ElementValuePairGen(final ElementValuePair nvp, final ConstantPoolGen cpool,
39              final boolean copyPoolEntries)
40      {
41          this.cpool = cpool;
42          // J5ASSERT:
43          // Could assert nvp.getNameString() points to the same thing as
44          // cpool.getConstant(nvp.getNameIndex())
45          // if
46          // (!nvp.getNameString().equals(((ConstantUtf8)cpool.getConstant(nvp.getNameIndex())).getBytes()))
47          // {
48          // throw new RuntimeException("envp buggered");
49          // }
50          if (copyPoolEntries)
51          {
52              nameIdx = cpool.addUtf8(nvp.getNameString());
53          }
54          else
55          {
56              nameIdx = nvp.getNameIndex();
57          }
58          value = ElementValueGen.copy(nvp.getValue(), cpool, copyPoolEntries);
59      }
60  
61      /**
62       * Retrieve an immutable version of this ElementNameValuePairGen
63       */
64      public ElementValuePair getElementNameValuePair()
65      {
66          final ElementValue immutableValue = value.getElementValue();
67          return new ElementValuePair(nameIdx, immutableValue, cpool
68                  .getConstantPool());
69      }
70  
71      protected ElementValuePairGen(final int idx, final ElementValueGen value,
72              final ConstantPoolGen cpool)
73      {
74          this.nameIdx = idx;
75          this.value = value;
76          this.cpool = cpool;
77      }
78  
79      public ElementValuePairGen(final String name, final ElementValueGen value,
80              final ConstantPoolGen cpool)
81      {
82          this.nameIdx = cpool.addUtf8(name);
83          this.value = value;
84          this.cpool = cpool;
85      }
86  
87      protected void dump(final DataOutputStream dos) throws IOException
88      {
89          dos.writeShort(nameIdx); // u2 name of the element
90          value.dump(dos);
91      }
92  
93      public int getNameIndex()
94      {
95          return nameIdx;
96      }
97  
98      public final String getNameString()
99      {
100         // ConstantString cu8 = (ConstantString)cpool.getConstant(nameIdx);
101         return ((ConstantUtf8) cpool.getConstant(nameIdx)).getBytes();
102     }
103 
104     public final ElementValueGen getValue()
105     {
106         return value;
107     }
108 
109     @Override
110     public String toString()
111     {
112         return "ElementValuePair:[" + getNameString() + "="
113                 + value.stringifyValue() + "]";
114     }
115 }