/*******************************************************************************
* $URL: https://source.sakaiproject.org/svn/metaobj/trunk/metaobj-api/api/src/java/org/sakaiproject/metaobj/shared/model/ElementListBeanWrapper.java $
* $Id: ElementListBeanWrapper.java 105079 2012-02-24 23:08:11Z ottenhoff@longsight.com $
* **********************************************************************************
*
* Copyright (c) 2004, 2005, 2006, 2007, 2008 The Sakai Foundation
*
* Licensed under the Educational Community 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.opensource.org/licenses/ECL-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.sakaiproject.metaobj.shared.model;
import org.sakaiproject.metaobj.utils.mvc.intf.FieldValueWrapper;
import org.sakaiproject.metaobj.utils.TypedMap;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import java.util.*;
import java.beans.PropertyDescriptor;
import java.beans.IntrospectionException;
/**
* Created by IntelliJ IDEA.
* User: johnellis
* Date: Jan 15, 2007
* Time: 10:46:04 AM
* To change this template use File | Settings | File Templates.
*/
public class ElementListBeanWrapper extends HashMap implements TypedMap {
private ElementListBean list;
private FieldValueWrapper wrapper;
private List wrapperList;
private HashMap<Object, PropertyDescriptor> descriptors =
new HashMap<Object, PropertyDescriptor>();
public ElementListBeanWrapper(ElementListBean list, FieldValueWrapper wrapper) {
this.list = list;
this.wrapper = wrapper;
this.wrapperList = new ArrayList();
}
public Object get(Object key) {
return super.get(key);
}
public Object put(Object key, Object newValue) {
List values = new ArrayList();
if (newValue instanceof String[]) {
values = Arrays.asList((String[])newValue);
}
else if (newValue != null) {
values = new ArrayList();
values.add(newValue);
}
processValues(key, values);
return super.put(key, newValue);
}
protected void processValues(Object key, List values) {
boolean createWrappers = false;
if (wrapperList.size() != values.size()) {
wrapperList.clear();
createWrappers = true;
}
for (int i=0;i<values.size();i++) {
BeanWrapper wrapper;
if (createWrappers) {
wrapper = new BeanWrapperImpl(getWrapper().clone());
wrapperList.add(wrapper);
}
else {
wrapper = (BeanWrapper) wrapperList.get(i);
}
setValue(wrapper, key, values.get(i));
}
}
protected void setValue(BeanWrapper wrapper, Object key, Object value) {
wrapper.setPropertyValue((String) key, value);
}
public void validate(List errors) {
getList().clear();
for (Iterator<BeanWrapper> i=wrapperList.iterator();i.hasNext();) {
FieldValueWrapper fieldWrapper = (FieldValueWrapper) i.next().getWrappedInstance();
if (fieldWrapper.getValue() != null) {
ElementBean bean = getList().createBlank();
fieldWrapper.validate(bean.getCurrentSchema().getName(), errors, bean.getCurrentSchema().getLabel());
bean.getBaseElement().addContent(
bean.getCurrentSchema().getSchemaNormalizedValue(fieldWrapper.getValue()));
getList().add(bean);
}
}
}
protected PropertyDescriptor getPropertyDescriptor(Object key) {
PropertyDescriptor descriptor = descriptors.get(key);
if (descriptor == null) {
try {
descriptor = new PropertyDescriptor((String)key, getWrapper().getClass());
descriptors.put(key, descriptor);
} catch (IntrospectionException e) {
throw new RuntimeException(e);
}
}
return descriptor;
}
public ElementListBean getList() {
return list;
}
public void setList(ElementListBean list) {
this.list = list;
}
public FieldValueWrapper getWrapper() {
return wrapper;
}
public void setWrapper(FieldValueWrapper wrapper) {
this.wrapper = wrapper;
}
public Class getType(String key) {
return getPropertyDescriptor(key).getPropertyType();
}
}