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

org.unlaxer.tinyexpression.instances.FileBaseTinyExpressionInstancesCache Maven / Gradle / Ivy

There is a newer version: 1.4.6
Show newest version
package org.unlaxer.tinyexpression.instances;

import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.unlaxer.tinyexpression.Calculator;
import org.unlaxer.tinyexpression.loader.FormulaInfoAdditionalFields;
import org.unlaxer.tinyexpression.loader.FormulaInfoBlocksParser;
import org.unlaxer.tinyexpression.loader.model.FormulaInfo;
import org.unlaxer.tinyexpression.loader.model.FormulaInfoList;
import org.unlaxer.util.Try;

/**
 * 指定されたroot pathからtenantID毎にDirectoryを掘って中にformulaInfo.txtというfileを置いて
 * instanceを生成管理するTinyExpressionInstancesCacheの実装です
 *
 */
public class FileBaseTinyExpressionInstancesCache implements TinyExpressionInstancesCache{

  public static final String FILENAME = "formulaInfo.txt";
  static FormulaInfoBlocksParser formulaInfoBlocksParser = new FormulaInfoBlocksParser();

  Path rootFolder;
  FormulaInfoAdditionalFields formulaInfoAdditionalFields;
  Map> calculatorsByTenantId = new ConcurrentHashMap<>();


  public FileBaseTinyExpressionInstancesCache(Path rootFolder ,
      FormulaInfoAdditionalFields formulaInfoAdditionalFields) {
    super();
    this.rootFolder = rootFolder;
    this.formulaInfoAdditionalFields = formulaInfoAdditionalFields;
  }

  @Override
  public boolean clearCache(TenantID tenantID) {
    calculatorsByTenantId.remove(tenantID);
    return true;
  }


  @Override
  public List cache(TenantID tenantID, Comparator comparator, ClassLoader classLoader) {
    List cache =
        calculatorsByTenantId.computeIfAbsent(tenantID,
            tenantId->{
              Path resolve = rootFolder.resolve(tenantId.asString()).resolve(FILENAME);
              try(InputStream inputStream = Files.newInputStream(resolve);){
                Try parse =
                    FormulaInfoList.parse(inputStream, formulaInfoAdditionalFields, classLoader);

                parse.throwIfMatch();
                List list = parse.right().get().get().stream()
                  .map(FormulaInfo::calculator)
                  .sorted(comparator)
                  .toList();
                return list;
              } catch (IOException e) {
                throw new UncheckedIOException(e);
              }
            }
        );
    return cache;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy