package org.frameworkset.spi.assemble;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.frameworkset.spi.CallContext;
/**
*
* <p>Title: ProList.java</p>
* <p>Description: </p>
* <p>bboss workgroup</p>
* <p>Copyright (c) 2007</p>
* @Date 2009-9-19 下午11:01:26
* @author biaoping.yin
* @version 1.0
*/
public class ProList<V extends Pro> extends ArrayList<V>
{
private boolean isfreeze = false;
/**
* 容器组件类型,有以下三种类型:
* bean:将可以直接将组装的ProList转换为List<po对象>集合
* String:ProList转换为List<String>集合
* Pro:默认类型ProList<V extends Pro>,不做转换,除非指定editor编辑器
*/
private String componentType ;
public void freeze()
{
this.isfreeze = true;
}
private boolean isFreeze()
{
return this.isfreeze;
}
private void modify()
{
if(this.isFreeze())
throw new CannotModifyException();
}
public int getInt(int i)
{
Pro value = this.get(i);
if(value == null)
return 0;
// int value_ = Integer.parseInt(value.toString());
return value.getInt();
}
@Override
public void add(int index, V element)
{
modify() ;
super.add(index, element);
}
@Override
public boolean add(V o)
{
modify() ;
return super.add(o);
}
@Override
public boolean addAll(Collection<? extends V> c)
{
modify() ;
return super.addAll(c);
}
@Override
public boolean addAll(int index, Collection<? extends V> c)
{
modify() ;
return super.addAll(index, c);
}
@Override
public void clear()
{
modify() ;
super.clear();
}
@Override
public V remove(int index)
{
modify() ;
return super.remove(index);
}
@Override
public boolean remove(Object o)
{
modify() ;
return super.remove(o);
}
@Override
protected void removeRange(int fromIndex, int toIndex)
{
modify() ;
super.removeRange(fromIndex, toIndex);
}
@Override
public V set(int index, V element)
{
modify() ;
return super.set(index, element);
}
@Override
public boolean removeAll(Collection<?> c)
{
modify() ;
return super.removeAll(c);
}
@Override
public boolean retainAll(Collection<?> c)
{
modify() ;
return super.retainAll(c);
}
public int getInt(int i,int defaultValue)
{
Pro value = this.get(i);
if(value == null)
return defaultValue;
// int value_ = Integer.parseInt(value.toString());
return value.getInt();
}
public Pro getPro(int i)
{
return this.get(i);
}
public boolean getBoolean(int i)
{
Pro value = this.get(i);
if(value == null)
return false;
// boolean value_ = Boolean.parseBoolean(value.toString());
return value.getBoolean();
}
public boolean getBoolean(int i,boolean defaultValue)
{
Pro value = this.get(i);
if(value == null)
return defaultValue;
boolean value_ = value.getBoolean(defaultValue);
return value_;
}
public String getString(int i)
{
Pro value = this.get(i);
if(value == null)
return null;
return value.getString();
}
public String getString(int i,String defaultValue)
{
Pro value = this.get(i);
if(value == null)
return defaultValue;
return value.getString(defaultValue);
}
public ProList getList(int i,ProList defaultValue)
{
Pro value = this.get(i);
if(value == null)
return defaultValue;
return value.getList(defaultValue);
}
public ProList getList(int i)
{
Pro value = this.get(i);
if(value == null)
return null;
return value.getList();
}
public ProSet getSet(int i,ProSet defaultValue)
{
Pro value = this.get(i);
if(value == null)
return defaultValue;
return value.getSet(defaultValue);
}
public ProSet getSet(int i)
{
Pro value = this.get(i);
if(value == null)
return null;
return value.getSet();
}
public Object getObject(int i)
{
Pro value = this.get(i);
if(value == null)
return null;
return value.getObject();
}
private List componentList;
private Object lock = new Object();
private List _getList(Class maptype)
{
List componentMap = null;
if(maptype != ArrayList.class)
{
try {
if(maptype.getName().equals("java.util.Collections$SynchronizedRandomAccessList"))
{
componentMap = Collections
.synchronizedList(new ArrayList());
}
else if(maptype.getName().equals("java.util.Collections$SynchronizedList"))
{
componentMap = Collections
.synchronizedList(new ArrayList());
}
else
{
componentMap = (List)maptype.newInstance();
}
} catch (InstantiationException e) {
throw new BeanInstanceException(e);
} catch (IllegalAccessException e) {
throw new BeanInstanceException(e);
}
}
else
{
componentMap = new ArrayList(this.size());
}
return componentMap;
}
public List getComponentList(Class listtype,CallContext callcontext)
{
if(this.getComponentType() == null)
return this;
if(componentList == null)
{
synchronized(lock)
{
if(componentList == null)
{
// if(this.size() > 0)
{
if(this.componentType.equals(Pro.COMPONENT_BEAN))
{
componentList = _getList( listtype);
Context currentLoopContext = callcontext != null?callcontext.getLoopContext():null;
for(Pro pro:this)
{
try{
componentList.add(pro.getProxyBean(callcontext));
}
finally
{
if(callcontext != null)
callcontext.setLoopContext(currentLoopContext);
}
}
}
else if(this.componentType
.equalsIgnoreCase(Pro.COMPONENT_STRING_SHORTNAME) || this.componentType
.equalsIgnoreCase(Pro.COMPONENT_STRING))
{
// componentList = new ArrayList(this.size());
componentList = _getList( listtype);
for(Pro pro:this)
{
componentList.add(pro.getString());
}
}
else if(this.componentType.equalsIgnoreCase(Pro.COMPONENT_OBJECT_SHORTNAME) || this.componentType.equalsIgnoreCase(Pro.COMPONENT_OBJECT))
{
// componentList = new ArrayList(this.size());
componentList = _getList( listtype);
Context currentLoopContext = callcontext != null?callcontext.getLoopContext():null;
for(Pro pro:this)
{
try{
componentList.add(pro.getProxyBean(callcontext));
}
finally
{
if(callcontext != null)
callcontext.setLoopContext(currentLoopContext);
}
}
}
else
{
// componentList = new ArrayList(this.size());
componentList = _getList( listtype);
// for(Pro pro:this)
// {
// componentList.add(pro.getBean());
// }
Context currentLoopContext = callcontext != null?callcontext.getLoopContext():null;
for(Pro pro:this)
{
try{
componentList.add(pro.getProxyBean(callcontext));
}
finally
{
if(callcontext != null)
callcontext.setLoopContext(currentLoopContext);
}
}
}
}
// else
// {
// componentList = new ArrayList(this.size());;
// }
}
}
}
return componentList;
}
public Object getObject(int i,Object defaultValue)
{
Pro value = this.get(i);
if(value == null)
return defaultValue;
return value.getObject(defaultValue);
}
public Iterator<V> iterator() {
return super.iterator();
}
/**
* @return the componentType
*/
public String getComponentType() {
return componentType;
}
/**
* @param componentType the componentType to set
*/
public void setComponentType(String componentType) {
this.componentType = componentType;
}
}