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

cn.dreampie.orm.ActiveRecordPlugin Maven / Gradle / Ivy

There is a newer version: 1.3.0.RELEASE
Show newest version
package cn.dreampie.orm;

import cn.dreampie.common.Plugin;
import cn.dreampie.common.util.json.Jsoner;
import cn.dreampie.common.util.json.ModelDeserializer;
import cn.dreampie.common.util.json.ModelSerializer;
import cn.dreampie.common.util.scan.ClassScaner;
import cn.dreampie.log.Logger;
import cn.dreampie.orm.provider.DataSourceProvider;

import java.lang.reflect.Modifier;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

/**
 * ActiveRecord plugin.
 */
public class ActiveRecordPlugin implements Plugin {
  private static final Logger logger = Logger.getLogger(ActiveRecordPlugin.class);

  private Set> excludeClasses = new HashSet>();
  private Set> includeClasses = new HashSet>();
  private Set includeClassPackages = new HashSet();
  private Set excludeClassPackages = new HashSet();

  private DataSourceProvider dataSourceProvider;

  public ActiveRecordPlugin(DataSourceProvider dataSourceProvider) {
    this.dataSourceProvider = dataSourceProvider;
  }

  public ActiveRecordPlugin addExcludeClasses(Class... classes) {
    Collections.addAll(excludeClasses, classes);
    return this;
  }

  public ActiveRecordPlugin addExcludeClasses(Set> classes) {
    if (classes != null) {
      excludeClasses.addAll(classes);
    }
    return this;
  }

  /**
   * exclude scan packages  eg. cn.dreampie.resource
   *
   * @param packages packages
   * @return
   */
  public ActiveRecordPlugin addExcludePackages(String... packages) {
    Collections.addAll(excludeClassPackages, packages);
    return this;
  }

  public ActiveRecordPlugin addIncludeClasses(Class... classes) {
    Collections.addAll(includeClasses, classes);
    return this;
  }

  public ActiveRecordPlugin addIncludeClasses(Set> classes) {
    if (classes != null) {
      includeClasses.addAll(classes);
    }
    return this;
  }

  /**
   * scan packages  eg. cn.dreampie.resource
   *
   * @param packages packages
   * @return
   */
  public ActiveRecordPlugin addIncludePackages(String... packages) {
    Collections.addAll(includeClassPackages, packages);
    return this;
  }

  public boolean start() {
    if (includeClassPackages.size() > 0) {
      if (includeClasses.size() <= 0) {
        includeClasses = ClassScaner.of(Model.class).includePackages(includeClassPackages).scan();
      } else {
        includeClasses.addAll(ClassScaner.of(Model.class).includePackages(includeClassPackages).scan());
      }
    }

    DataSourceMeta dsm = new DataSourceMeta(dataSourceProvider);
    if (includeClasses.size() > 0) {
      Set tableMetas = new HashSet();
      TableMeta tableMeta = null;
      boolean isExclude = false;
      for (Class modelClass : includeClasses) {
        if (excludeClasses.contains(modelClass) || Modifier.isAbstract(modelClass.getModifiers())) {
          continue;
        }
        isExclude = false;
        if (excludeClassPackages.size() > 0) {
          for (String excludepath : excludeClassPackages) {
            if (modelClass.getName().startsWith(excludepath)) {
              logger.debug("Exclude model:" + modelClass.getName());
              isExclude = true;
              break;
            }
          }
        }
        if (isExclude) {
          continue;
        }
        //add modelMeta
        tableMeta = new TableMeta(dataSourceProvider.getDsName(), modelClass);
        tableMetas.add(tableMeta);
        logger.info("Models.add(" + tableMeta.getTableName() + ", " + modelClass.getName() + ")");

        //json  config
        Jsoner.addConfig(modelClass, ModelSerializer.instance(), ModelDeserializer.instance());
      }
      //model 元数据
      TableMetaBuilder.buildTableMeta(tableMetas, dsm);
    } else {
      logger.warn("Could not load any model for   " + dsm.getDsName() + ".");
    }
    //Record 解析支持
    Jsoner.addConfig(Record.class, ModelSerializer.instance(), ModelDeserializer.instance());
    //数据源  元数据
    Metadata.addDataSourceMeta(dsm);
    return true;
  }

  public boolean stop() {
    Metadata.close();
    return true;
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy