| /* |
| * Copyright 2004-2005 the original author or authors. |
| * |
| * 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.codehaus.groovy.grails.metaclass; |
| |
| import groovy.lang.MissingPropertyException; |
| |
| import java.util.Iterator; |
| import java.util.Map; |
| |
| import ognl.Ognl; |
| import ognl.OgnlException; |
| |
| import org.apache.commons.collections.BeanMap; |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| import org.codehaus.groovy.grails.commons.metaclass.AbstractDynamicProperty; |
| |
| /** |
| * A dynamic property that uses a Map of OGNL expressions to sets properties on the target object |
| * |
| * @author Graeme Rocher |
| * @since Oct 24, 2005 |
| */ |
| public class SetPropertiesDynamicProperty extends AbstractDynamicProperty { |
| |
| private static final Log LOG = LogFactory.getLog( SetPropertiesDynamicProperty.class ); |
| |
| private static final String PROPERTY_NAME = "properties"; |
| |
| |
| public SetPropertiesDynamicProperty() { |
| super(PROPERTY_NAME); |
| } |
| |
| /** |
| * @return A org.apache.commons.collections.BeanMap instance |
| */ |
| public Object get(Object object) { |
| return new BeanMap(object); |
| } |
| |
| /** |
| * Sets the property on the specified object with the specified value. The |
| * value is expected to be a Map containing OGNL expressions for the keys |
| * and objects for the values. |
| * |
| * @param object The target object |
| * @param newValue The value to set |
| */ |
| public void set(Object object, Object newValue) { |
| if(newValue == null) |
| return; |
| |
| if(newValue instanceof Map) { |
| |
| Map propertyMap = (Map)newValue; |
| |
| for (Iterator i = propertyMap.keySet().iterator(); i.hasNext();) { |
| String propertyName = (String) i.next(); |
| Object propertyValue = propertyMap.get(propertyName); |
| // if null skip |
| if(propertyValue == null) |
| continue; |
| |
| if(LOG.isDebugEnabled()) |
| LOG.debug("Attempting to set property '"+propertyName+"' to value '"+propertyValue+"' on instance '"+object+"'"); |
| |
| try { |
| Ognl.setValue(propertyName,object,propertyValue); |
| } catch (OgnlException e) { |
| if(LOG.isDebugEnabled()) |
| LOG.debug("OGNL error attempt to set '"+propertyName+"' to value '"+propertyValue+"' for object '"+object+"':" + e.getMessage(),e); |
| } |
| } |
| |
| } |
| else { |
| throw new MissingPropertyException(PROPERTY_NAME,object.getClass()); |
| } |
| } |
| |
| } |