    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;
    021import java.util.ArrayList;
    022import java.util.List;
    023
    024import org.apache.bcel.classfile.ArrayElementValue;
    025import org.apache.bcel.classfile.ElementValue;
    026
    027/**
    028 * @since 6.0
    029 */
    030public class ArrayElementValueGen extends ElementValueGen {
    031    // J5TODO: Should we make this an array or a list? A list would be easier to
    032    // modify ...
    033    private final List<ElementValueGen> evalues;
    034
    035    /**
    036     * @param value
    037     * @param cpool
    038     */
    039    public ArrayElementValueGen(final ArrayElementValue value, final ConstantPoolGen cpool, final boolean copyPoolEntries) {
    040        super(ARRAY, cpool);
    041        evalues = new ArrayList<>();
    042        final ElementValue[] in = value.getElementValuesArray();
    043        for (final ElementValue element : in) {
    044            evalues.add(ElementValueGen.copy(element, cpool, copyPoolEntries));
    045        }
    046    }
    047
    048    public ArrayElementValueGen(final ConstantPoolGen cp) {
    049        super(ARRAY, cp);
    050        evalues = new ArrayList<>();
    051    }
    052
    053    public ArrayElementValueGen(final int type, final ElementValue[] datums, final ConstantPoolGen cpool) {
    054        super(type, cpool);
    055        if (type != ARRAY) {
    056            throw new IllegalArgumentException("Only element values of type array can be built with this ctor - type specified: " + type);
    057        }
    058        this.evalues = new ArrayList<>();
    059        for (final ElementValue datum : datums) {
    060            evalues.add(ElementValueGen.copy(datum, cpool, true));
    061        }
    062    }
    063
    064    public void addElement(final ElementValueGen gen) {
    065        evalues.add(gen);
    066    }
    067
    068    @Override
    069    public void dump(final DataOutputStream dos) throws IOException {
    070        dos.writeByte(super.getElementValueType()); // u1 type of value (ARRAY == '[')
    071        dos.writeShort(evalues.size());
    072        for (final ElementValueGen element : evalues) {
    073            element.dump(dos);
    074        }
    075    }
    076
    077    /**
    078     * Return immutable variant of this ArrayElementValueGen
    079     */
    080    @Override
    081    public ElementValue getElementValue() {
    082        final ElementValue[] immutableData = new ElementValue[evalues.size()];
    083        int i = 0;
    084        for (final ElementValueGen element : evalues) {
    085            immutableData[i++] = element.getElementValue();
    086        }
    087        return new ArrayElementValue(super.getElementValueType(), immutableData, getConstantPool().getConstantPool());
    088    }
    089
    090    public List<ElementValueGen> getElementValues() {
    091        return evalues;
    092    }
    093
    094    public int getElementValuesSize() {
    095        return evalues.size();
    096    }
    097
    098    @Override
    099    public String stringifyValue() {
    100        final StringBuilder sb = new StringBuilder();
    101        sb.append("[");
    102        String comma = "";
    103        for (final ElementValueGen element : evalues) {
    104            sb.append(comma);
    105            comma = ",";
    106            sb.append(element.stringifyValue());
    107        }
    108        sb.append("]");
    109        return sb.toString();
    110    }
    111}