/*
* Copyright 2008 biaoping.yin
*
* Licensed 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.frameworkset.spi.assemble;
import java.io.Serializable;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.frameworkset.spi.CallContext;
import com.frameworkset.util.ValueObjectUtil;
/**
* <p>
* Title: ProArray.java
* </p>
* <p>
* Description: 主要是用于ioc的数组注入功能
* </p>
* <p>
* bboss workgroup
* </p>
* <p>
* Copyright (c) 2007
* </p>
*
* @Date 2011-4-11 下午01:30:37
* @author biaoping.yin
* @version 1.0
*/
public class ProArray implements Serializable{
private static final Logger log = Logger.getLogger(ProArray.class);
private boolean isfreeze = false;
/**
* 容器组件类型,有以下三种类型: bean:将可以直接将组装的bean数组 String:ProArray转换为String[]数组
* Pro:默认类型Pro,不做转换,除非指定editor编辑器
*/
private String componentType;
Pro[] pros;
List<Pro> pros_temp;
public Pro addPro(Pro pro) {
if (pros_temp == null)
pros_temp = new ArrayList<Pro>();
pros_temp.add(pro);
return pro;
}
public void freeze() {
this.isfreeze = true;
if (pros_temp != null) {
pros = new Pro[this.pros_temp.size()];
for (int i = 0; i < pros_temp.size(); i++) {
pros[i] = this.pros_temp.get(i);
}
pros_temp = null;
}
}
private boolean isFreeze() {
return this.isfreeze;
}
private void modify() {
if (this.isFreeze())
throw new CannotModifyException();
}
/**
* @return the componentType
*/
public String getComponentType() {
return componentType;
}
/**
* @param componentType
* the componentType to set
*/
public void setComponentType(String componentType) {
this.componentType = componentType;
}
public Object getObject(int i, Object defaultValue) {
Pro value = pros[i];
if (value == null)
return defaultValue;
return value.getObject(defaultValue);
}
public int getInt(int i, int defaultValue) {
Pro value = pros[i];
if (value == null)
return defaultValue;
// int value_ = Integer.parseInt(value.toString());
return value.getInt();
}
public Pro getPro(int i) {
return pros[i];
}
public boolean getBoolean(int i) {
Pro value = pros[i];
if (value == null)
return false;
// boolean value_ = Boolean.parseBoolean(value.toString());
return value.getBoolean();
}
public boolean getBoolean(int i, boolean defaultValue) {
Pro value = pros[i];
if (value == null)
return defaultValue;
boolean value_ = value.getBoolean(defaultValue);
return value_;
}
public String getString(int i) {
Pro value = pros[i];
if (value == null)
return null;
return value.getString();
}
public String getString(int i, String defaultValue) {
Pro value = pros[i];
if (value == null)
return defaultValue;
return value.getString(defaultValue);
}
public ProList getList(int i, ProList defaultValue) {
Pro value = pros[i];
if (value == null)
return defaultValue;
return value.getList(defaultValue);
}
public ProList getList(int i) {
Pro value = pros[i];
if (value == null)
return null;
return value.getList();
}
public ProSet getSet(int i, ProSet defaultValue) {
Pro value = pros[i];
if (value == null)
return defaultValue;
return value.getSet(defaultValue);
}
public ProSet getSet(int i) {
Pro value = pros[i];
if (value == null)
return null;
return value.getSet();
}
/**
* @return the pros
*/
public Pro[] getPros() {
return pros;
}
/**
* @param pros
* the pros to set
*/
public void setPros(Pro[] pros) {
modify();
this.pros = pros;
}
private Object componentArray;
public int size() {
return this.pros != null ? this.pros.length : 0;
}
private Object lock = new Object();
public Object getComponentArray(CallContext callcontext) {
if (this.getComponentType() == null)
return this;
if (componentArray == null) {
synchronized (lock) {
if (componentArray == null) {
// if (this.size() > 0)
{
if (this.componentType.equalsIgnoreCase(Pro.COMPONENT_BEAN)) {
Class enumType = this.pros[0].getBeanClass();
// componentArray = new ArrayList(this.size());
componentArray = Array.newInstance(enumType, this
.size());
int i = 0;
if(pros != null)
{
Context currentLoopContext = callcontext != null?callcontext.getLoopContext():null;
for (Pro v : this.pros) {
try{
Array.set(componentArray, i, v.getBean(callcontext,true));
}
finally
{
if(callcontext != null)
callcontext.setLoopContext(currentLoopContext);
}
i++;
}
}
} else if (this.componentType
.equalsIgnoreCase(Pro.COMPONENT_STRING_SHORTNAME) || this.componentType
.equalsIgnoreCase(Pro.COMPONENT_STRING)) {
// componentArray = new ArrayList(this.size());
componentArray = Array.newInstance(String.class,
this.size());
int i = 0;
if(pros != null)
{
for (Pro v : this.pros) {
Array.set(componentArray, i, v.getString());
i++;
}
}
}
else if (this.componentType.equalsIgnoreCase(Pro.COMPONENT_OBJECT_SHORTNAME) || this.componentType.equalsIgnoreCase(Pro.COMPONENT_OBJECT)) {
// componentArray = new ArrayList(this.size());
componentArray = Array.newInstance(Object.class, this
.size());
int i = 0;
if(pros != null)
{
Context currentLoopContext = callcontext != null?callcontext.getLoopContext():null;
for (Pro v : this.pros) {
try{
Array.set(componentArray, i, v.getBean(callcontext,true));
}
finally
{
if(callcontext != null)
callcontext.setLoopContext(currentLoopContext);
}
i++;
}
}
}
else if (this.componentType.equalsIgnoreCase(Pro.COMPONENT_CLASS) ) {
// componentArray = new ArrayList(this.size());
componentArray = Array.newInstance(Class.class, this
.size());
int i = 0;
if(pros != null)
{
Context currentLoopContext = callcontext != null?callcontext.getLoopContext():null;
for (Pro v : this.pros) {
try{
Object value = v.getBean(callcontext,true);
Array.set(componentArray, i, ValueObjectUtil.typeCast(value, Class.class));
}
finally
{
if(callcontext != null)
callcontext.setLoopContext(currentLoopContext);
}
i++;
}
}
}
else {
try {
componentArray = Array.newInstance(ValueObjectUtil.getClass(componentType), this
.size());
int i = 0;
if(pros != null)
{
Context currentLoopContext = callcontext != null?callcontext.getLoopContext():null;
for (Pro v : this.pros) {
try{
Array.set(componentArray, i, v.getBean(callcontext,true));
}
finally
{
if(callcontext != null)
callcontext.setLoopContext(currentLoopContext);
}
i++;
}
}
} catch (NegativeArraySizeException e) {
log.error(e.getMessage(),e);
componentArray = this;
} catch (ClassNotFoundException e) {
log.error(e.getMessage(),e);
componentArray = this;
}
catch (Exception e) {
log.error(e.getMessage(),e);
componentArray = this;
}
}
}
// else {
// componentArray = this;
// }
}
}
}
return componentArray;
}
}