package com.revolsys.swing.map.layer.record; import java.util.HashMap; import java.util.Map.Entry; import java.util.Properties; import java.util.function.Predicate; import com.revolsys.collection.map.LinkedHashMapEx; import com.revolsys.collection.map.MapEx; import com.revolsys.io.map.MapSerializer; import com.revolsys.logging.Logs; import com.revolsys.record.Record; import com.revolsys.record.query.Condition; import com.revolsys.record.query.QueryValue; import com.revolsys.record.schema.RecordDefinition; import com.revolsys.record.schema.RecordDefinitionProxy; import com.revolsys.util.UriTemplate; public class RecordDefinitionSqlFilter implements Predicate<Record>, MapSerializer { private Condition condition; private boolean initialized; private final RecordDefinitionProxy recordDefinitionProxy; private final String query; public RecordDefinitionSqlFilter(final RecordDefinitionProxy recordDefinitionProxy, final String query) { this.recordDefinitionProxy = recordDefinitionProxy; this.query = query; } public synchronized Condition getCondition() { if (this.condition == null) { if (!this.initialized) { final RecordDefinition recordDefinition = this.recordDefinitionProxy.getRecordDefinition(); if (recordDefinition != null) { this.initialized = true; try { final Properties properties = System.getProperties(); final HashMap<String, Object> uriVariables = new HashMap<>(); for (final Entry<Object, Object> entry : properties.entrySet()) { final String key = (String)entry.getKey(); final Object value = entry.getValue(); if (value != null) { uriVariables.put(key, value); } } final String query = new UriTemplate(this.query).expandString(uriVariables); this.condition = QueryValue.parseWhere(recordDefinition, query); } catch (final Throwable e) { Logs.error(this, "Invalid query: " + this.query, e); } } } } return this.condition; } public String getQuery() { return this.query; } @Override public boolean test(final Record record) { final Condition condition = getCondition(); if (condition == null) { return false; } else { if (condition.test(record)) { return true; } else { return false; } } } @Override public MapEx toMap() { final MapEx map = new LinkedHashMapEx(); addTypeToMap(map, "sqlFilter"); map.put("query", this.query); return map; } @Override public String toString() { return this.query; } }