package org.n3r.eql.dbfieldcryptor.parser; import com.google.common.base.Optional; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.n3r.eql.DbDialect; import java.util.Set; @Slf4j public class ParserCache { final Set<String> secureFieldsConfig; final LoadingCache<DbIdSql, Optional<SensitiveFieldsParser>> cache; public ParserCache(Set<String> secureFieldsConfig) { this.secureFieldsConfig = secureFieldsConfig; cache = CacheBuilder.newBuilder().build( new CacheLoader<DbIdSql, Optional<SensitiveFieldsParser>>() { @Override public Optional<SensitiveFieldsParser> load(DbIdSql dbIdSql) { return Optional.fromNullable(getParser(dbIdSql)); } }); } private SensitiveFieldsParser getParser(DbIdSql dbIdSql) { String databaseId = dbIdSql.getDatabaseId(); String sql = dbIdSql.getSql(); SensitiveFieldsParser parser; try { parser = getSensitiveFieldsParser(databaseId, sql); if (parser == null) return null; if (parser.haveNonSecureFields()) return null; return parser; } catch (Exception ex) { log.warn("parse sql [{}] failed {}", sql, ex.getMessage()); } return null; } private SensitiveFieldsParser getSensitiveFieldsParser(String dbId, String sql) { if ("oracle".equals(dbId)) return OracleSensitiveFieldsParser.parseSql(sql, secureFieldsConfig); if ("mysql".equals(dbId)) return MySqlSensitiveFieldsParser.parseSql(sql, secureFieldsConfig); return null; } public SensitiveFieldsParser getParser(DbDialect dbDialect, String sql) { return cache.getUnchecked(new DbIdSql(dbDialect.getDatabaseId(), sql)).orNull(); } @Getter @AllArgsConstructor @EqualsAndHashCode static class DbIdSql { final String databaseId; final String sql; } }