All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.leancloud.Transformer Maven / Gradle / Ivy

package cn.leancloud;

import cn.leancloud.annotation.LCClassName;
import cn.leancloud.utils.LogUtil;
import cn.leancloud.utils.StringUtil;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;

public class Transformer {
  private static LCLogger logger = LogUtil.getLogger(Transformer.class);

  private static Pattern classnamePattern = Pattern.compile("^[a-zA-Z_][a-zA-Z_0-9]*$");
  private static final Map> subClassesMAP =
          new HashMap>();
  private static final Map, String> subClassesReverseMAP =
          new HashMap, String>();

  static Class getSubClass(String className) {
    return subClassesMAP.get(className);
  }

  public static String getSubClassName(Class clazz) {
    if (LCUser.class.isAssignableFrom(clazz)) {
      return LCUser.CLASS_NAME;
    } else if (LCRole.class.isAssignableFrom(clazz)) {
      return LCRole.CLASS_NAME;
    } else if (LCStatus.class.isAssignableFrom(clazz)) {
      return LCStatus.CLASS_NAME;
    } else if (LCFile.class.isAssignableFrom(clazz)) {
      return LCFile.CLASS_NAME;
    } else if (LCFriendship.class.isAssignableFrom(clazz)) {
      return LCFriendship.CLASS_NAME;
    } else if (LCBlockRelation.class.isAssignableFrom(clazz)) {
      return LCBlockRelation.CLASS_NAME;
    } else if (LCFriendshipRequest.class.isAssignableFrom(clazz)) {
      return LCFriendshipRequest.CLASS_NAME;
    } else {
      return subClassesReverseMAP.get(clazz);
    }
  }

  public static  void registerClass(Class clazz) {
    LCClassName LCClassName = clazz.getAnnotation(LCClassName.class);
    if (LCClassName == null) {
      throw new IllegalArgumentException("The class is not annotated by @AVClassName");
    }
    String className = LCClassName.value();
    checkClassName(className);
    subClassesMAP.put(className, clazz);
    subClassesReverseMAP.put(clazz, className);
  }

  public static  T transform(LCObject rawObj, String className) {
    if (null == rawObj) {
      return null;
    }
    LCObject result = objectFromClassName(className);
    result.resetByRawData(rawObj);
    return (T) result;
  }

  public static  T transform(LCObject rawObj, Class clazz) {
    if (null == rawObj) {
      return null;
    }
    LCObject result = null;
    if (subClassesReverseMAP.containsKey(clazz)) {
      try {
        result = clazz.newInstance();
      } catch (Exception ex) {
        logger.w("newInstance failed. cause: " + ex.getMessage());
        result = new LCObject(clazz.getSimpleName());
      }
    } else if (LCUser.class.isAssignableFrom(clazz)) {
      result = new LCUser();
    } else if (LCRole.class.isAssignableFrom(clazz)) {
      result = new LCRole();
    } else if (LCStatus.class.isAssignableFrom(clazz)) {
      result = new LCStatus();
    } else if (LCFile.class.isAssignableFrom(clazz)) {
      result = new LCFile();
    } else if (LCFriendshipRequest.class.isAssignableFrom(clazz)) {
      result = new LCFriendshipRequest();
    } else if (LCFriendship.class.isAssignableFrom(clazz)) {
      result = new LCFriendship();
    } else if (LCBlockRelation.class.isAssignableFrom(clazz)) {
      result = new LCBlockRelation();
    } else {
      result = new LCObject(clazz.getSimpleName());
    }
    result.resetByRawData(rawObj);
    return (T)result;
  }

  public static void checkClassName(String className) {
    if (StringUtil.isEmpty(className))
      throw new IllegalArgumentException("Blank class name");
    if (!classnamePattern.matcher(className).matches())
      throw new IllegalArgumentException("Invalid class name");
  }

  public static LCObject objectFromClassName(String className) {
    LCObject result = null;
    if (LCUser.CLASS_NAME.equals(className)) {
      result = new LCUser();
    } else if (LCStatus.CLASS_NAME.equals(className)) {
      result = new LCStatus();
    } else if (LCRole.CLASS_NAME.equals(className)) {
      result = new LCRole();
    } else if (LCFile.CLASS_NAME.equals(className)) {
      result = new LCFile();
    } else if (LCInstallation.CLASS_NAME.equals(className)) {
      result = new LCInstallation();
    } else if (LCFriendshipRequest.CLASS_NAME.equals(className)) {
      result = new LCFriendshipRequest();
    } else if (LCFriendship.CLASS_NAME.equals(className)) {
      result = new LCFriendship();
    } else if (LCBlockRelation.CLASS_NAME.equals(className)) {
      result = new LCBlockRelation();
    } else if (subClassesMAP.containsKey(className)) {
      try {
        result = subClassesMAP.get(className).newInstance();
      } catch (Exception ex) {
        logger.w("failed to create subClass: " + className, ex);
        result = new LCObject(className);
      }
    } else {
      result = new LCObject(className);
    }
    return result;
  }

  private Transformer() {
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy