001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 *  Unless required by applicable law or agreed to in writing, software
012 *  distributed under the License is distributed on an "AS IS" BASIS,
013 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 *  See the License for the specific language governing permissions and
015 *  limitations under the License.
016 */
017package org.apache.bcel.generic;
018
019import java.io.DataOutputStream;
020import java.io.IOException;
021
022import org.apache.bcel.classfile.ConstantUtf8;
023import org.apache.bcel.classfile.ElementValue;
024import org.apache.bcel.classfile.ElementValuePair;
025
026/**
027 * @since 6.0
028 */
029public class ElementValuePairGen {
030    private final int nameIdx;
031
032    private final ElementValueGen value;
033
034    private final ConstantPoolGen constantPoolGen;
035
036    public ElementValuePairGen(final ElementValuePair nvp, final ConstantPoolGen cpool, final boolean copyPoolEntries) {
037        this.constantPoolGen = cpool;
038        // J5ASSERT:
039        // Could assert nvp.getNameString() points to the same thing as
040        // constantPoolGen.getConstant(nvp.getNameIndex())
041        // if
042        // (!nvp.getNameString().equals(((ConstantUtf8) constantPoolGen.getConstant(nvp.getNameIndex())).getBytes()))
043        // {
044        // throw new IllegalArgumentException("envp buggered");
045        // }
046        if (copyPoolEntries) {
047            nameIdx = cpool.addUtf8(nvp.getNameString());
048        } else {
049            nameIdx = nvp.getNameIndex();
050        }
051        value = ElementValueGen.copy(nvp.getValue(), cpool, copyPoolEntries);
052    }
053
054    protected ElementValuePairGen(final int idx, final ElementValueGen value, final ConstantPoolGen cpool) {
055        this.nameIdx = idx;
056        this.value = value;
057        this.constantPoolGen = cpool;
058    }
059
060    public ElementValuePairGen(final String name, final ElementValueGen value, final ConstantPoolGen cpool) {
061        this.nameIdx = cpool.addUtf8(name);
062        this.value = value;
063        this.constantPoolGen = cpool;
064    }
065
066    protected void dump(final DataOutputStream dos) throws IOException {
067        dos.writeShort(nameIdx); // u2 name of the element
068        value.dump(dos);
069    }
070
071    /**
072     * Retrieve an immutable version of this ElementNameValuePairGen
073     */
074    public ElementValuePair getElementNameValuePair() {
075        final ElementValue immutableValue = value.getElementValue();
076        return new ElementValuePair(nameIdx, immutableValue, constantPoolGen.getConstantPool());
077    }
078
079    public int getNameIndex() {
080        return nameIdx;
081    }
082
083    public final String getNameString() {
084        // ConstantString cu8 = (ConstantString) constantPoolGen.getConstant(nameIdx);
085        return ((ConstantUtf8) constantPoolGen.getConstant(nameIdx)).getBytes();
086    }
087
088    public final ElementValueGen getValue() {
089        return value;
090    }
091
092    @Override
093    public String toString() {
094        return "ElementValuePair:[" + getNameString() + "=" + value.stringifyValue() + "]";
095    }
096}