MetaObject.java

  1. /*
  2.  *    Copyright 2009-2024 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.  *       https://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,
  37.       ReflectorFactory reflectorFactory) {
  38.     this.originalObject = object;
  39.     this.objectFactory = objectFactory;
  40.     this.objectWrapperFactory = objectWrapperFactory;
  41.     this.reflectorFactory = reflectorFactory;

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

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

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

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

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

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

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

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

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

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

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

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

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

  94.   public Object getValue(String name) {
  95.     PropertyTokenizer prop = new PropertyTokenizer(name);
  96.     return objectWrapper.get(prop);
  97.   }

  98.   public void setValue(String name, Object value) {
  99.     objectWrapper.set(new PropertyTokenizer(name), value);
  100.   }

  101.   public MetaObject metaObjectForProperty(String name) {
  102.     Object value = getValue(name);
  103.     return MetaObject.forObject(value, objectFactory, objectWrapperFactory, reflectorFactory);
  104.   }

  105.   public ObjectWrapper getObjectWrapper() {
  106.     return objectWrapper;
  107.   }

  108.   public boolean isCollection() {
  109.     return objectWrapper.isCollection();
  110.   }

  111.   public void add(Object element) {
  112.     objectWrapper.add(element);
  113.   }

  114.   public <E> void addAll(List<E> list) {
  115.     objectWrapper.addAll(list);
  116.   }

  117. }