MetaObject.java

  1. /*
  2.  *    Copyright 2009-2021 the original author or authors.
  3.  *
  4.  *    Licensed under the Apache License, Version 2.0 (the "License");
  5.  *    you may not use this file except in compliance with the License.
  6.  *    You may obtain a copy of the License at
  7.  *
  8.  *       http://www.apache.org/licenses/LICENSE-2.0
  9.  *
  10.  *    Unless required by applicable law or agreed to in writing, software
  11.  *    distributed under the License is distributed on an "AS IS" BASIS,
  12.  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13.  *    See the License for the specific language governing permissions and
  14.  *    limitations under the License.
  15.  */
  16. package org.apache.ibatis.reflection;

  17. import java.util.Collection;
  18. import java.util.List;
  19. import java.util.Map;

  20. import org.apache.ibatis.reflection.factory.ObjectFactory;
  21. import org.apache.ibatis.reflection.property.PropertyTokenizer;
  22. import org.apache.ibatis.reflection.wrapper.BeanWrapper;
  23. import org.apache.ibatis.reflection.wrapper.CollectionWrapper;
  24. import org.apache.ibatis.reflection.wrapper.MapWrapper;
  25. import org.apache.ibatis.reflection.wrapper.ObjectWrapper;
  26. import org.apache.ibatis.reflection.wrapper.ObjectWrapperFactory;

  27. /**
  28.  * @author Clinton Begin
  29.  */
  30. public class MetaObject {

  31.   private final Object originalObject;
  32.   private final ObjectWrapper objectWrapper;
  33.   private final ObjectFactory objectFactory;
  34.   private final ObjectWrapperFactory objectWrapperFactory;
  35.   private final ReflectorFactory reflectorFactory;

  36.   private MetaObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) {
  37.     this.originalObject = object;
  38.     this.objectFactory = objectFactory;
  39.     this.objectWrapperFactory = objectWrapperFactory;
  40.     this.reflectorFactory = reflectorFactory;

  41.     if (object instanceof ObjectWrapper) {
  42.       this.objectWrapper = (ObjectWrapper) object;
  43.     } else if (objectWrapperFactory.hasWrapperFor(object)) {
  44.       this.objectWrapper = objectWrapperFactory.getWrapperFor(this, object);
  45.     } else if (object instanceof Map) {
  46.       this.objectWrapper = new MapWrapper(this, (Map) object);
  47.     } else if (object instanceof Collection) {
  48.       this.objectWrapper = new CollectionWrapper(this, (Collection) object);
  49.     } else {
  50.       this.objectWrapper = new BeanWrapper(this, object);
  51.     }
  52.   }

  53.   public static MetaObject forObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) {
  54.     if (object == null) {
  55.       return SystemMetaObject.NULL_META_OBJECT;
  56.     } else {
  57.       return new MetaObject(object, objectFactory, objectWrapperFactory, reflectorFactory);
  58.     }
  59.   }

  60.   public ObjectFactory getObjectFactory() {
  61.     return objectFactory;
  62.   }

  63.   public ObjectWrapperFactory getObjectWrapperFactory() {
  64.     return objectWrapperFactory;
  65.   }

  66.   public ReflectorFactory getReflectorFactory() {
  67.     return reflectorFactory;
  68.   }

  69.   public Object getOriginalObject() {
  70.     return originalObject;
  71.   }

  72.   public String findProperty(String propName, boolean useCamelCaseMapping) {
  73.     return objectWrapper.findProperty(propName, useCamelCaseMapping);
  74.   }

  75.   public String[] getGetterNames() {
  76.     return objectWrapper.getGetterNames();
  77.   }

  78.   public String[] getSetterNames() {
  79.     return objectWrapper.getSetterNames();
  80.   }

  81.   public Class<?> getSetterType(String name) {
  82.     return objectWrapper.getSetterType(name);
  83.   }

  84.   public Class<?> getGetterType(String name) {
  85.     return objectWrapper.getGetterType(name);
  86.   }

  87.   public boolean hasSetter(String name) {
  88.     return objectWrapper.hasSetter(name);
  89.   }

  90.   public boolean hasGetter(String name) {
  91.     return objectWrapper.hasGetter(name);
  92.   }

  93.   public Object getValue(String name) {
  94.     PropertyTokenizer prop = new PropertyTokenizer(name);
  95.     if (prop.hasNext()) {
  96.       MetaObject metaValue = metaObjectForProperty(prop.getIndexedName());
  97.       if (metaValue == SystemMetaObject.NULL_META_OBJECT) {
  98.         return null;
  99.       } else {
  100.         return metaValue.getValue(prop.getChildren());
  101.       }
  102.     } else {
  103.       return objectWrapper.get(prop);
  104.     }
  105.   }

  106.   public void setValue(String name, Object value) {
  107.     PropertyTokenizer prop = new PropertyTokenizer(name);
  108.     if (prop.hasNext()) {
  109.       MetaObject metaValue = metaObjectForProperty(prop.getIndexedName());
  110.       if (metaValue == SystemMetaObject.NULL_META_OBJECT) {
  111.         if (value == null) {
  112.           // don't instantiate child path if value is null
  113.           return;
  114.         } else {
  115.           metaValue = objectWrapper.instantiatePropertyValue(name, prop, objectFactory);
  116.         }
  117.       }
  118.       metaValue.setValue(prop.getChildren(), value);
  119.     } else {
  120.       objectWrapper.set(prop, value);
  121.     }
  122.   }

  123.   public MetaObject metaObjectForProperty(String name) {
  124.     Object value = getValue(name);
  125.     return MetaObject.forObject(value, objectFactory, objectWrapperFactory, reflectorFactory);
  126.   }

  127.   public ObjectWrapper getObjectWrapper() {
  128.     return objectWrapper;
  129.   }

  130.   public boolean isCollection() {
  131.     return objectWrapper.isCollection();
  132.   }

  133.   public void add(Object element) {
  134.     objectWrapper.add(element);
  135.   }

  136.   public <E> void addAll(List<E> list) {
  137.     objectWrapper.addAll(list);
  138.   }

  139. }