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