![JAR search and dependency download from the Maven repository](/logo.png)
com.googlecode.paradox.metadata.schema.DirectorySchema Maven / Gradle / Ivy
/*
* Copyright (c) 2009 Leonardo Alves da Costa
*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
* later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details. You should have received a copy of the GNU General Public License along with this
* program. If not, see .
*/
package com.googlecode.paradox.metadata.schema;
import com.googlecode.paradox.ConnectionInfo;
import com.googlecode.paradox.data.TableData;
import com.googlecode.paradox.data.ValidationField;
import com.googlecode.paradox.data.filefilters.TableFilter;
import com.googlecode.paradox.metadata.ForeignKey;
import com.googlecode.paradox.metadata.Schema;
import com.googlecode.paradox.metadata.Table;
import com.googlecode.paradox.metadata.View;
import com.googlecode.paradox.metadata.paradox.ParadoxReferentialIntegrity;
import com.googlecode.paradox.metadata.paradox.ParadoxTable;
import com.googlecode.paradox.metadata.paradox.ParadoxValidation;
import com.googlecode.paradox.utils.Utils;
import java.io.File;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* A directory schema.
*
* @since 1.6.0
*/
public class DirectorySchema implements Schema {
/**
* The schema directory file.
*/
private final File schemaFile;
private static final List TABLE_CACHE = new ArrayList<>();
/**
* Create a directory schema.
*
* @param schemaFile the schema directory file.
*/
public DirectorySchema(final File schemaFile) {
this.schemaFile = schemaFile;
}
@Override
public List list(final ConnectionInfo connectionInfo, final String tablePattern) throws SQLException {
final List ret = new ArrayList<>();
ret.addAll(TableData.listTables(this, tablePattern, connectionInfo));
ret.addAll(View.listViews(schemaFile, tablePattern, connectionInfo));
updateCache(connectionInfo);
updateReferences(connectionInfo, ret);
return ret;
}
private void updateReferences(ConnectionInfo connectionInfo, final List tables) {
for (ParadoxTable table : tables.stream().filter(ParadoxTable.class::isInstance).map(t -> (ParadoxTable) t).collect(Collectors.toList())) {
ParadoxValidation validation = table.getValidation();
List foreignKeys = new ArrayList<>();
// FIXME review this mess
if (validation != null) {
for (ValidationField validationField : validation.getFields()) {
// Dependent table
Arrays.stream(table.getFields()).filter(f -> Objects.equals(f.getName(), validationField.getName())).findFirst().ifPresent(field -> {
if (validationField.getReferencedTableName() != null) {
String destinationTableName = Utils.removeSuffix(validationField.getReferencedTableName(), "DB");
Table referencedTable = TABLE_CACHE.stream().filter(t -> t.getName().equalsIgnoreCase(destinationTableName)).findFirst().orElse(null);
if (referencedTable == null) {
List newTables = TableData.listTables(this, destinationTableName, connectionInfo);
TABLE_CACHE.addAll(newTables);
referencedTable = newTables.stream().findFirst().orElse(null);
}
validationField.setReferencedTable((ParadoxTable) referencedTable);
foreignKeys.add(new ForeignKey(field, validationField));
}
});
}
if (validation.getReferentialIntegrity() != null) {
for (ParadoxReferentialIntegrity fk : validation.getReferentialIntegrity()) {
String destinationTableName = Utils.removeSuffix(fk.getDestinationTableName(), "DB");
Table referencedTable = TABLE_CACHE.stream().filter(t -> t.getName().equalsIgnoreCase(destinationTableName)).findFirst().orElse(null);
if (referencedTable == null) {
List newTables = TableData.listTables(this, destinationTableName, connectionInfo);
TABLE_CACHE.addAll(newTables);
referencedTable = newTables.stream().findFirst().orElse(null);
}
fk.setDestinationTable((ParadoxTable) referencedTable);
foreignKeys.add(new ForeignKey(table, fk));
}
}
}
table.setForeignKeys(foreignKeys.toArray(new ForeignKey[0]));
}
}
@Override
public String catalogName() {
return schemaFile.getParentFile().getName();
}
@Override
public String name() {
return schemaFile.getName();
}
@Override
public Table findTable(final ConnectionInfo connectionInfo, final String tableName) {
final List tables = new ArrayList<>();
tables.addAll(TableData.listTables(this, null, connectionInfo));
tables.addAll(View.search(connectionInfo, name(), schemaFile));
Table ret = tables.stream().filter(table -> tableName.equalsIgnoreCase(table.getName())).findFirst().orElse(null);
updateCache(connectionInfo);
updateReferences(connectionInfo, tables);
return ret;
}
public File getSchemaFile() {
return schemaFile;
}
private void updateCache(ConnectionInfo connectionInfo) {
final File[] files = schemaFile.listFiles(new TableFilter(connectionInfo.getLocale(), null));
if (files != null) {
final List fileList = Arrays.stream(files).map(file -> Utils.removeSuffix(file.getName(), "DB")).collect(Collectors.toList());
TABLE_CACHE.removeIf(t -> !fileList.contains(t.getName()));
} else {
TABLE_CACHE.clear();
}
}
public Table getFromCache(File file) {
String tableName = Utils.removeSuffix(file.getName(), "DB");
Table cachedTable = TABLE_CACHE.stream().filter(table -> table.getName().equals(tableName)).findFirst().orElse(null);
if (cachedTable != null && ((ParadoxTable) cachedTable).getTimestamp() >= file.lastModified()) {
return cachedTable;
}
return null;
}
public void addCache(ParadoxTable table, long lastModified) {
table.setTimestamp(lastModified);
TABLE_CACHE.removeIf(t -> t.getName().equals(table.getName()));
TABLE_CACHE.add(table);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy