/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License. 
 *
 */
package org.apache.bcel.generic;

import java.io.DataOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.bcel.classfile.ArrayElementValue;
import org.apache.bcel.classfile.ElementValue;

public class ArrayElementValueGen extends ElementValueGen
{
	// J5TODO: Should we make this an array or a list? A list would be easier to
	// modify ...
	private List /* ElementValueGen */evalues;

	public ArrayElementValueGen(ConstantPoolGen cp)
	{
		super(ARRAY, cp);
		evalues = new ArrayList();
	}

	public ArrayElementValueGen(int type, ElementValue[] datums,
			ConstantPoolGen cpool)
	{
		super(type, cpool);
		if (type != ARRAY)
			throw new RuntimeException(
					"Only element values of type array can be built with this ctor - type specified: " + type);
		this.evalues = new ArrayList();
		for (int i = 0; i < datums.length; i++)
		{
			evalues.add(datums[i]);
		}
	}

	/**
	 * Return immutable variant of this ArrayElementValueGen
	 */
	public ElementValue getElementValue()
	{
		ElementValue[] immutableData = new ElementValue[evalues.size()];
		int i = 0;
		for (Iterator iter = evalues.iterator(); iter.hasNext();)
		{
			ElementValueGen element = (ElementValueGen) iter.next();
			immutableData[i++] = element.getElementValue();
		}
		return new ArrayElementValue(type, immutableData, cpGen
				.getConstantPool());
	}

	/**
	 * @param value
	 * @param cpool
	 */
	public ArrayElementValueGen(ArrayElementValue value, ConstantPoolGen cpool,
			boolean copyPoolEntries)
	{
		super(ARRAY, cpool);
		evalues = new ArrayList();
		ElementValue[] in = value.getElementValuesArray();
		for (int i = 0; i < in.length; i++)
		{
			evalues.add(ElementValueGen.copy(in[i], cpool, copyPoolEntries));
		}
	}

	public void dump(DataOutputStream dos) throws IOException
	{
		dos.writeByte(type); // u1 type of value (ARRAY == '[')
		dos.writeShort(evalues.size());
		for (Iterator iter = evalues.iterator(); iter.hasNext();)
		{
			ElementValueGen element = (ElementValueGen) iter.next();
			element.dump(dos);
		}
	}

	public String stringifyValue()
	{
		StringBuffer sb = new StringBuffer();
		sb.append("[");
		for (Iterator iter = evalues.iterator(); iter.hasNext();)
		{
			ElementValueGen element = (ElementValueGen) iter.next();
			sb.append(element.stringifyValue());
			if (iter.hasNext())
				sb.append(",");
		}
		sb.append("]");
		return sb.toString();
	}

	public List getElementValues()
	{
		return evalues;
	}

	public int getElementValuesSize()
	{
		return evalues.size();
	}

	public void addElement(ElementValueGen gen)
	{
		evalues.add(gen);
	}
}

@@ -974,24 +974,25 @@
 .util.List;%0A
+%0A
 import org.a
@@ -1249,12 +1249,9 @@
 List
- /* 
+%3C
 Elem
@@ -1261,19 +1261,18 @@
 ValueGen
+%3E
  
-*/
 evalues;
@@ -1366,24 +1366,41 @@
 ew ArrayList
+%3CElementValueGen%3E
 ();%0A%09%7D%0A%0A%09pub
@@ -1683,24 +1683,41 @@
 ew ArrayList
+%3CElementValueGen%3E
 ();%0A%09%09for (i
@@ -1773,17 +1773,52 @@
 add(
-datums%5Bi%5D
+ElementValueGen.copy(datums%5Bi%5D, cpool, true)
 );%0A%09
@@ -2021,32 +2021,49 @@
 %0A%09%09for (Iterator
+%3CElementValueGen%3E
  iter = evalues.
@@ -2123,34 +2123,16 @@
 lement =
- (ElementValueGen)
  iter.ne
@@ -2479,16 +2479,33 @@
 rrayList
+%3CElementValueGen%3E
 ();%0A%09%09El
@@ -2833,32 +2833,49 @@
 %0A%09%09for (Iterator
+%3CElementValueGen%3E
  iter = evalues.
@@ -2935,34 +2935,16 @@
 lement =
- (ElementValueGen)
  iter.ne
@@ -3087,16 +3087,33 @@
 Iterator
+%3CElementValueGen%3E
  iter = 
@@ -3185,26 +3185,8 @@
 nt =
- (ElementValueGen)
  ite
@@ -3340,16 +3340,33 @@
 lic List
+%3CElementValueGen%3E
  getElem

fix bad collection element type (ElementValueGen vs ElementValue) exposed by adding generics