From 894886d6093194d73ace9d1b6811449b9fb330b3 Mon Sep 17 00:00:00 2001 From: Sonia Zorba <zorba@oats.inaf.it> Date: Mon, 22 Jan 2018 14:39:00 +0100 Subject: [PATCH] Supported renaming of ivoa schema name, fixed various bugs --- .../src/main/java/it/inaf/ia2/tsm/Column.java | 1 + .../src/main/java/it/inaf/ia2/tsm/Schema.java | 7 +- .../src/main/java/it/inaf/ia2/tsm/Table.java | 2 +- .../main/java/it/inaf/ia2/tsm/TapSchema.java | 206 ++++++++++-------- .../java/it/inaf/ia2/tsm/TapSchemaLoader.java | 6 +- .../it/inaf/ia2/tsm/TapSchemaSettings.java | 15 +- .../it/inaf/ia2/tsm/UpdateOperations.java | 9 +- .../java/it/inaf/ia2/tsm/datalayer/ADQL.java | 6 +- .../it/inaf/ia2/tsm/datalayer/DBBroker.java | 2 +- .../ia2/tsm/datalayer/DBBrokerTemplate.java | 24 +- .../tsm/datalayer/mysql/MySQLDBBroker.java | 10 +- .../tsm/datalayer/pgsql/PostgresDBBroker.java | 19 +- .../it/inaf/ia2/tsm/model/SchemaModels.java | 2 - .../schema_definition/tap_schema-1-IA2.xml | 2 +- .../schema_definition/tap_schema-1.xml | 2 +- .../schema_definition/tap_schema-1_1-IA2.xml | 2 +- .../schema_definition/tap_schema-1_1.xml | 2 +- .../test/java/it/inaf/ia2/tsm/TestAll.java | 9 +- .../src/main/resources/app.properties | 2 +- .../ia2/tsm/webapp/CredentialsEditing.java | 20 +- .../ia2/tsm/webapp/TapSchemaEditingBean.java | 17 +- .../inaf/ia2/tsm/webapp/TapSchemaLoader.java | 3 +- .../tsm/webapp/xmlconfig/TapCredentials.java | 12 + .../src/main/webapp/credentialsEditing.xhtml | 29 ++- .../src/main/webapp/resources/js/common.js | 4 +- .../src/main/webapp/tapSchemaEditing.xhtml | 3 + install.sh | 2 +- 27 files changed, 264 insertions(+), 154 deletions(-) diff --git a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/Column.java b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/Column.java index 1f9b5eb..a85d678 100644 --- a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/Column.java +++ b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/Column.java @@ -33,6 +33,7 @@ public class Column extends ChildEntity<Table> { public final static String TABLE_NAME_KEY = "table_name"; public final static String COLUMN_NAME_KEY = "column_name"; + public final static String DESCRIPTION_KEY = "description"; public final static String DATATYPE_KEY = "datatype"; public final static String SIZE_KEY = "size"; public final static String ARRAYSIZE_KEY = "arraysize"; diff --git a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/Schema.java b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/Schema.java index 855e157..e168d97 100644 --- a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/Schema.java +++ b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/Schema.java @@ -60,7 +60,7 @@ public class Schema extends ChildEntity<TapSchema> implements EntitiesContainer< DBBroker broker = tapSchema.getDBBroker(name); tables = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - tablesTypes = broker.getAllTableTypes(name); + tablesTypes = broker.getAllTableTypes(getRealSchemaName()); for (String tableName : broker.getAllTablesNames(getRealSchemaName())) { tables.put(tableName, null); @@ -70,10 +70,13 @@ public class Schema extends ChildEntity<TapSchema> implements EntitiesContainer< setStatus(Status.LOADED); } - public String getRealSchemaName() { + public final String getRealSchemaName() { if (tapSchema.getDBName() != null && this.getName().equals(tapSchema.getName())) { return tapSchema.getDBName(); } + if (tapSchema.getIvoaSchemaDBName() != null && this.getName().equals(tapSchema.getIvoaSchemaName())) { + return tapSchema.getIvoaSchemaDBName(); + } return getName(); } diff --git a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/Table.java b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/Table.java index 207bd74..1ecb213 100644 --- a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/Table.java +++ b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/Table.java @@ -65,7 +65,7 @@ public class Table extends ChildEntity<Schema> implements EntitiesContainer<Colu if (tapSchema.getName().equals(parentSchema.getName())) { return tapSchema.getTapSchemaModel().getTable(simpleName); } - if (tapSchema.isHasObscore() && parentSchema.getName().equals("ivoa") + if (tapSchema.isHasObscore() && parentSchema.getName().equals(TapSchema.STANDARD_IVOA_SCHEMA_NAME) && simpleName.equals("obscore")) { return tapSchema.getIvoaSchemaModel().getTable(simpleName); } diff --git a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/TapSchema.java b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/TapSchema.java index 9783cd8..61de723 100644 --- a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/TapSchema.java +++ b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/TapSchema.java @@ -46,8 +46,9 @@ import org.slf4j.LoggerFactory; * @author Sonia Zorba {@literal <zorba at oats.inaf.it>} */ public class TapSchema implements EntitiesContainer<Schema>, Serializable { - - public static final String STANDARD_NAME = "TAP_SCHEMA"; + + public static final String STANDARD_TAP_SCHEMA_NAME = "TAP_SCHEMA"; + public static final String STANDARD_IVOA_SCHEMA_NAME = "ivoa"; // Mandatory tables constants public static final String TABLES_TABLE = "tables"; @@ -55,84 +56,95 @@ public class TapSchema implements EntitiesContainer<Schema>, Serializable { public static final String COLUMNS_TABLE = "columns"; public static final String KEYS_TABLE = "keys"; public static final String KEY_COLUMNS_TABLE = "key_columns"; - + public static final String DESCRIPTION_KEY = "description"; - + private static final long serialVersionUID = 1678083091602571256L; - + private static final Logger LOG = LoggerFactory.getLogger(TapSchema.class); - + private final Map<String, Schema> schemas; private final Set<Key> allKeys; - + private boolean loading; private DBWrapper dbWrapper; private String dbName; private String name; + private String ivoaSchemaDBName; + private String ivoaSchemaName; private boolean exists; private TapSchemaSettings settings; private DataTypeMode dataTypeMode; - + private transient DBBroker sourceDBBroker; private transient DBBroker tapSchemaDBBroker; - + private ConsistencyChecks consistencyChecks; - + public final DBBroker getSourceDBBroker() { if (sourceDBBroker == null) { sourceDBBroker = DBBrokerFactory.getDBBroker(dbWrapper.getSourceDataSourceWrapper(), dataTypeMode); } return sourceDBBroker; } - + public final DBBroker getTapSchemaDBBroker() { if (tapSchemaDBBroker == null) { tapSchemaDBBroker = DBBrokerFactory.getDBBroker(dbWrapper.getTapSchemaDataSourceWrapper(), dataTypeMode); } return tapSchemaDBBroker; } - + private TapSchema() { // for serialization schemas = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); allKeys = new HashSet<>(); - //consistencyChecks = new ConsistencyChecks(); } - + public TapSchema(DBWrapper dbWrapper, TapSchemaSettings settings, boolean exists) throws SQLException { this(); - + this.dbWrapper = dbWrapper; this.exists = exists; this.settings = settings; // Don't change the instructions order! loadDBName(); loadName(); - + dataTypeMode = getTapSchemaModel().getDataTypeMode(); - + load(); } - + private void loadDBName() { // Detect if the TAP_SCHEMA version supports dbmodel SchemaModel tapSchemaModel = SchemaModels.getTapSchemaModel(settings.getTapSchemaVersion()); boolean hasDBName = tapSchemaModel.getTable(SCHEMAS_TABLE).get("dbname") != null; - if (hasDBName && !STANDARD_NAME.equals(settings.getTapSchemaName())) { - dbName = settings.getTapSchemaName(); + if (hasDBName) { + if (!STANDARD_TAP_SCHEMA_NAME.equals(settings.getTapSchemaName())) { + dbName = settings.getTapSchemaName(); + } + if (!STANDARD_IVOA_SCHEMA_NAME.equals(settings.getIvoaSchemaName())) { + ivoaSchemaDBName = settings.getIvoaSchemaName(); + } } } - + private void loadName() { if (dbName != null) { - name = STANDARD_NAME; + name = STANDARD_TAP_SCHEMA_NAME; } else { name = settings.getTapSchemaName(); } + if (ivoaSchemaDBName != null) { + ivoaSchemaName = STANDARD_IVOA_SCHEMA_NAME; + } else { + ivoaSchemaName = settings.getIvoaSchemaName(); + } } - + public final void load() throws SQLException { - + loading = true; // Initializing schemas map schemas.clear(); @@ -140,16 +152,19 @@ public class TapSchema implements EntitiesContainer<Schema>, Serializable { schemas.put(schemaName, null); } schemas.put(getName(), null); // the TAP_SCHEMA contains itself - + if (settings.isHasObscore() && ivoaSchemaDBName != null) { + schemas.put(getIvoaSchemaName(), null); + } + if (exists) { consistencyChecks = TapSchemaLoader.loadExistingTapSchema((this)); } - + loading = false; - + checkKeys(); } - + public DBBroker getDBBroker(String schemaName) { if (schemaName.equals(getName())) { return getTapSchemaDBBroker(); @@ -171,16 +186,16 @@ public class TapSchema implements EntitiesContainer<Schema>, Serializable { public String getVersion() { return settings.getTapSchemaVersion(); } - + public DataTypeMode getDataTypeMode() { return dataTypeMode; } - + private void loadSchemaKeysMetadata(String schemaName) throws SQLException { allKeys.addAll(getDBBroker(schemaName) .getKeys(this, schemaName, getRealSchemaName(schemaName))); } - + public Set<Key> getAllKeys() { return allKeys; } @@ -191,15 +206,15 @@ public class TapSchema implements EntitiesContainer<Schema>, Serializable { @Override public final Schema addChild(String schemaName) throws SQLException { LOG.debug("Adding schema {}", schemaName); - + Schema schema; - + if (!schemas.containsKey(schemaName)) { schema = null; } else { - + schema = schemas.get(schemaName); - + if (schema == null) { schema = new Schema(this, schemaName); schema.setStatus(Status.ADDED_NOT_PERSISTED); @@ -217,10 +232,10 @@ public class TapSchema implements EntitiesContainer<Schema>, Serializable { throw new IllegalArgumentException("Cannot add the schema " + schemaName + ". Invalid status. Schema status is " + schema.getStatus()); } } - + checkKeys(); } - + return schema; } @@ -230,22 +245,22 @@ public class TapSchema implements EntitiesContainer<Schema>, Serializable { @Override public void removeChild(String schemaName) { LOG.debug("Removing schema {}", schemaName); - + if (!schemas.containsKey(schemaName)) { throw new IllegalArgumentException("The database doesn't contains a schema named " + schemaName); } - + Schema schema = schemas.get(schemaName); if (schema == null || schema.getStatus() == Status.LOADED) { throw new IllegalArgumentException("Cannot remove the schema " + schemaName + ". It has never been added."); } - + if (schema.getStatus() == Status.ADDED_NOT_PERSISTED) { schema.setStatus(Status.REMOVED_NOT_PERSISTED); } else if (schema.getStatus() == Status.ADDED_PERSISTED) { schema.setStatus(Status.TO_REMOVE); } - + checkKeys(); } @@ -272,7 +287,7 @@ public class TapSchema implements EntitiesContainer<Schema>, Serializable { public List<String> getAddableChildrenNames() { return TSMUtil.getAddableChildrenNames(schemas); } - + @Override public boolean isAddable(String childName) { return schemas.containsKey(childName); @@ -305,14 +320,14 @@ public class TapSchema implements EntitiesContainer<Schema>, Serializable { } schemas.put(schemaName, null); } - + public SchemaModel getIvoaSchemaModel() { if (settings.isHasObscore()) { return SchemaModels.getIvoaSchemaModel(settings.getObscoreVersion()); } return null; } - + public void addEntireSchema(String schemaName) throws SQLException { Schema schema = addChild(schemaName); for (String tableName : schema.getAddableChildrenNames()) { @@ -327,9 +342,9 @@ public class TapSchema implements EntitiesContainer<Schema>, Serializable { * Save or update the TAP_SCHEMA changes into the database. */ public void save() throws SQLException { - + DBBroker broker = getTapSchemaDBBroker(); - + if (!exists) { SchemaModel tapSchemaModel = getTapSchemaModel(); broker.createTapSchemaStructure(getRealName(), tapSchemaModel); @@ -337,26 +352,26 @@ public class TapSchema implements EntitiesContainer<Schema>, Serializable { // Adding TAP_SCHEMA into TAP_SCHEMA addEntireSchema(getName()); fillColumnProperties(tapSchemaModel, getName()); - + if (settings.isHasObscore()) { createAndAddIvoaSchema(); } } - + fillKeyIds(); - + broker.save(this); exists = true; // Clean inconsistency consistencyChecks = null; } - + public void createAndAddIvoaSchema() throws SQLException { SchemaModel ivoaSchemaModel = getIvoaSchemaModel(); // ivoa schema has to be created into source database - getSourceDBBroker().createIvoaSchemaStructure(ivoaSchemaModel); + getSourceDBBroker().createIvoaSchemaStructure(ivoaSchemaModel, getRealSchemaName(ivoaSchemaModel.getName())); // Initializing ivoa schema slot in schemata maps schemas.put(ivoaSchemaModel.getName(), null); @@ -383,20 +398,20 @@ public class TapSchema implements EntitiesContainer<Schema>, Serializable { } return maxKeyId; } - + private void fillKeyIds() { - + List<Key> newKeys = new ArrayList<>(); for (Key key : allKeys) { - if (key.isVisible()) { + if (key.isVisible() && key.getId() == null) { newKeys.add(key); } } - + int maxKeyId = getMaxKeyId(); for (Key newKey : newKeys) { maxKeyId++; - newKey.setId(maxKeyId + ""); + newKey.setId(String.valueOf(maxKeyId)); } } @@ -407,12 +422,12 @@ public class TapSchema implements EntitiesContainer<Schema>, Serializable { */ public final void checkKeys() { if (!loading) { - + for (Key key : allKeys) { // Check if key should be exposed in TAP_SCHEMA boolean keyVisible = true; - + for (KeyColumn keyColumn : key.getKeyColumns()) { String schemaName = keyColumn.getParent().getFromSchemaName(); String tableName = keyColumn.getParent().getFromTableSimpleName(); @@ -421,7 +436,7 @@ public class TapSchema implements EntitiesContainer<Schema>, Serializable { keyVisible = false; break; } - + schemaName = keyColumn.getParent().getTargetSchemaName(); tableName = keyColumn.getParent().getTargetTableSimpleName(); columnName = keyColumn.getTargetColumn(); @@ -442,11 +457,11 @@ public class TapSchema implements EntitiesContainer<Schema>, Serializable { */ @Override public String toString() { - + StringBuilder sb = new StringBuilder("\n"); - + sb.append(String.format(">> TAP_SCHEMA %s <<\n", getName())); - + for (Schema schema : getChildren()) { sb.append("--"); sb.append(schema.getName()); @@ -459,9 +474,9 @@ public class TapSchema implements EntitiesContainer<Schema>, Serializable { sb.append(table.getName()); sb.append(String.format(" [%s]", table.getStatus())); sb.append("\n"); - + String padder = i < tables.size() - 1 ? " | " : " "; - + for (Column column : table.getChildren()) { sb.append(padder); sb.append("|--"); @@ -469,20 +484,20 @@ public class TapSchema implements EntitiesContainer<Schema>, Serializable { sb.append(String.format(" [%s]", column.getStatus())); sb.append("\n"); } - + sb.append("\n"); } } - + sb.append("** Keys **\n"); for (Key key : getVisibileKeys()) { sb.append(key); sb.append("\n"); } - + return sb.toString(); } - + public boolean isSchemaVisible(String schemaName) { Schema schema = schemas.get(schemaName); if (schema == null) { @@ -491,40 +506,40 @@ public class TapSchema implements EntitiesContainer<Schema>, Serializable { return schema.getStatus() == Status.ADDED_PERSISTED || schema.getStatus() == Status.ADDED_NOT_PERSISTED; } - + public boolean isTableVisible(String schemaName, String tableName) { if (!isSchemaVisible(schemaName)) { return false; } - + Table table = schemas.get(schemaName).getChild(tableName); if (table == null) { return false; } - + if (table.getStatus() == Status.ADDED_PERSISTED || table.getStatus() == Status.ADDED_NOT_PERSISTED) { return isSchemaVisible(schemaName); } - + return false; } - + public boolean isColumnVisible(String schemaName, String tableName, String columnName) { if (!isTableVisible(schemaName, tableName)) { return false; } - + Column column = schemas.get(schemaName).getChild(tableName).getChild(columnName); if (column == null) { return false; } - + if (column.getStatus() == Status.ADDED_PERSISTED || column.getStatus() == Status.ADDED_NOT_PERSISTED) { return isTableVisible(schemaName, tableName); } - + return false; } @@ -534,30 +549,30 @@ public class TapSchema implements EntitiesContainer<Schema>, Serializable { public boolean exists() { return exists; } - + public ConsistencyChecks getConsistencyChecks() { return consistencyChecks; } - + public final SchemaModel getTapSchemaModel() { return SchemaModels.getTapSchemaModel(getVersion()); } - + public final TableModel getTableModel(String tableName) { return getTapSchemaModel().getTable(tableName); } - + public Map<String, Object> getSchemaMetadata(String schemaName) { Map<String, Object> metadata = new HashMap<>(); metadata.put(Schema.SCHEMA_NAME_KEY, schemaName); String dbNameMetadata = null; - if (dbName != null && schemaName.equals(STANDARD_NAME)) { + if (dbName != null && schemaName.equals(STANDARD_TAP_SCHEMA_NAME)) { dbNameMetadata = dbName; } metadata.put(Schema.DBNAME, dbNameMetadata); return metadata; } - + public List<Key> getVisibileKeys() { List<Key> visibleKeys = new ArrayList<>(); for (Key key : allKeys) { @@ -567,14 +582,14 @@ public class TapSchema implements EntitiesContainer<Schema>, Serializable { } return visibleKeys; } - + private Integer getIntAsBool(Boolean value) { if (value == null) { return null; } return value ? 1 : 0; } - + public boolean isHasObscore() { return settings.isHasObscore(); } @@ -587,7 +602,7 @@ public class TapSchema implements EntitiesContainer<Schema>, Serializable { // check only on std, but valid also for principal (it depends on TS version) boolean useIntegerAsBool = getTapSchemaModel().getTable(COLUMNS_TABLE).get(Column.STD_KEY).getJavaType() == Integer.class; - + Schema schema = getChild(schemaName); schema.setValue(DESCRIPTION_KEY, schemaModel.getDescription()); for (TableModel tableModel : schemaModel.getTables()) { @@ -603,7 +618,7 @@ public class TapSchema implements EntitiesContainer<Schema>, Serializable { column.setValue(Column.UCD_KEY, columnModel.getUcd()); column.setValue(Column.UNIT_KEY, columnModel.getUnit()); column.setValue(Column.UTYPE_KEY, columnModel.getUtype()); - + Object compatibleStd = useIntegerAsBool ? getIntAsBool(columnModel.isStandard()) : columnModel.isStandard(); Object compatiblePrincipal = useIntegerAsBool ? getIntAsBool(columnModel.isPrincipal()) : columnModel.isPrincipal(); column.setValue(Column.STD_KEY, compatibleStd); @@ -611,7 +626,7 @@ public class TapSchema implements EntitiesContainer<Schema>, Serializable { } } } - + public void fillColumnsProperties(SchemaModel schemaModel) { fillColumnProperties(schemaModel, schemaModel.getName()); } @@ -625,15 +640,26 @@ public class TapSchema implements EntitiesContainer<Schema>, Serializable { public String getDBName() { return dbName; } - + + public String getIvoaSchemaDBName() { + return ivoaSchemaDBName; + } + + public String getIvoaSchemaName() { + return ivoaSchemaName; + } + public String getRealName() { return getRealSchemaName(getName()); } - + public String getRealSchemaName(String schemaName) { - if (dbName != null && STANDARD_NAME.equals(schemaName)) { + if (dbName != null && STANDARD_TAP_SCHEMA_NAME.equals(schemaName)) { return dbName; } + if (ivoaSchemaDBName != null && STANDARD_IVOA_SCHEMA_NAME.equals(schemaName)) { + return ivoaSchemaDBName; + } return schemaName; } } diff --git a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/TapSchemaLoader.java b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/TapSchemaLoader.java index f7ccfd3..bf09a08 100644 --- a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/TapSchemaLoader.java +++ b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/TapSchemaLoader.java @@ -78,9 +78,9 @@ public class TapSchemaLoader { private void checkObscore() { if (tapSchema.isHasObscore()) { - String ivoaSchemaName = tapSchema.getIvoaSchemaModel().getName(); + String ivoaSchemaName = tapSchema.getIvoaSchemaName(); if (tapSchema.getChild(ivoaSchemaName) == null) { - if (tapSchema.isAddable(ivoaSchemaName)) { + if (tapSchema.isAddable(tapSchema.getRealSchemaName(ivoaSchemaName))) { consistencyChecks.setObscoreToAdd(true); } else { consistencyChecks.setMissingObscore(true); @@ -94,7 +94,7 @@ public class TapSchemaLoader { private void checkModel(SchemaModel schemaModel) { String schemaName = schemaModel.getName(); - if ("tap_schema".equals(schemaName)) { + if (TapSchema.STANDARD_TAP_SCHEMA_NAME.equals(schemaName)) { schemaName = tapSchema.getName(); } diff --git a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/TapSchemaSettings.java b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/TapSchemaSettings.java index fd85ec5..386a991 100644 --- a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/TapSchemaSettings.java +++ b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/TapSchemaSettings.java @@ -22,7 +22,6 @@ */ package it.inaf.ia2.tsm; -import it.inaf.ia2.tsm.datalayer.DataTypeMode; import java.io.Serializable; /** @@ -37,6 +36,12 @@ public class TapSchemaSettings implements Serializable { private String tapSchemaName; private boolean hasObscore; private String obscoreVersion; + private String ivoaSchemaName; + + public TapSchemaSettings() { + tapSchemaName = TapSchema.STANDARD_TAP_SCHEMA_NAME; + ivoaSchemaName = TapSchema.STANDARD_IVOA_SCHEMA_NAME; + } public String getTapSchemaVersion() { return tapSchemaVersion; @@ -69,4 +74,12 @@ public class TapSchemaSettings implements Serializable { public void setObscoreVersion(String obscoreVersion) { this.obscoreVersion = obscoreVersion; } + + public String getIvoaSchemaName() { + return ivoaSchemaName; + } + + public void setIvoaSchemaName(String ivoaSchemaName) { + this.ivoaSchemaName = ivoaSchemaName; + } } diff --git a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/UpdateOperations.java b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/UpdateOperations.java index 235a079..68fc839 100644 --- a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/UpdateOperations.java +++ b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/UpdateOperations.java @@ -115,8 +115,13 @@ public class UpdateOperations { // children tables can have the following status: // ADDED_NOT_PERSISTED, REMOVED_NOT_PERSISTED, LOADED - if (table.getStatus() == Status.ADDED_NOT_PERSISTED) { - manageAddedNotPersistedTable(table); + switch (table.getStatus()) { + case ADDED_NOT_PERSISTED: + manageAddedNotPersistedTable(table); + break; + case REMOVED_NOT_PERSISTED: + tablesToClean.add(table); + break; } } diff --git a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/ADQL.java b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/ADQL.java index 49001db..38392e3 100644 --- a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/ADQL.java +++ b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/ADQL.java @@ -28,7 +28,7 @@ package it.inaf.ia2.tsm.datalayer; * @author Sonia Zorba {@literal <zorba at oats.inaf.it>} */ public enum ADQL { - + VARCHAR, CHAR, BOOLEAN, @@ -52,8 +52,8 @@ public enum ADQL { // removing size from datatype. return dataType.toUpperCase().replaceAll("\\(.+\\)", ""); } - + public static boolean isVariable(ADQL adql) { - return adql.equals(VARCHAR) || adql.equals(VARBINARY); + return adql.equals(VARCHAR) || adql.equals(VARBINARY) || adql.equals(CLOB) || adql.equals(BLOB); } } diff --git a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/DBBroker.java b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/DBBroker.java index 222854e..1c723f3 100644 --- a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/DBBroker.java +++ b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/DBBroker.java @@ -70,7 +70,7 @@ public interface DBBroker { void createTapSchemaStructure(String tapSchemaName, SchemaModel tapSchemaModel) throws SQLException; - void createIvoaSchemaStructure(SchemaModel ivoaSchemaModel) throws SQLException; + void createIvoaSchemaStructure(SchemaModel ivoaSchemaModel, String realIvoaSchemaName) throws SQLException; void save(TapSchema tapSchema) throws SQLException; diff --git a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/DBBrokerTemplate.java b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/DBBrokerTemplate.java index 65b1e8c..311e0d9 100644 --- a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/DBBrokerTemplate.java +++ b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/DBBrokerTemplate.java @@ -182,11 +182,11 @@ public abstract class DBBrokerTemplate implements DBBroker { } @Override - public void createIvoaSchemaStructure(SchemaModel ivoaSchemaModel) throws SQLException { + public void createIvoaSchemaStructure(SchemaModel ivoaSchemaModel, String realIvoaSchemaName) throws SQLException { try (Connection conn = dataSource.getConnection()) { - execute(getCreateDatabaseQuery(ivoaSchemaModel.getName()), conn); + execute(getCreateDatabaseQuery(realIvoaSchemaName), conn); for (TableModel tableModel : ivoaSchemaModel.getTables()) { - createTable(ivoaSchemaModel.getName(), tableModel, conn); + createTable(realIvoaSchemaName, tableModel, conn); } } } @@ -1057,4 +1057,22 @@ public abstract class DBBrokerTemplate implements DBBroker { } return keySchemaName; } + + protected String getArraysize(ADQL adqlType, Integer size) { + String arraySize = null; + + if (size != null) { + arraySize = String.valueOf(size); + } + if (adqlType != null && ADQL.isVariable(adqlType)) { + // variable length columns must have a "*" symbol on arraysize + if (arraySize == null) { + arraySize = "*"; + } else { + arraySize += "*"; + } + } + + return arraySize; + } } diff --git a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/mysql/MySQLDBBroker.java b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/mysql/MySQLDBBroker.java index ab1d5af..2cc1204 100644 --- a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/mysql/MySQLDBBroker.java +++ b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/mysql/MySQLDBBroker.java @@ -132,15 +132,7 @@ public class MySQLDBBroker extends DBBrokerTemplate { cm.put(Column.DATATYPE_KEY, datatype); cm.put(Column.SIZE_KEY, size); - String arraySize = "*"; - if (size != null) { - arraySize = String.valueOf(size); - // variable length columns must have a "*" symbol on arraysize - if (adqlType != null && ADQL.isVariable(adqlType)) { - arraySize += "*"; - } - } - cm.put(Column.ARRAYSIZE_KEY, arraySize); + cm.put(Column.ARRAYSIZE_KEY, getArraysize(adqlType, size)); allColumnsMetadata.put(columnName, cm); } diff --git a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/pgsql/PostgresDBBroker.java b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/pgsql/PostgresDBBroker.java index 59008de..e4237e1 100644 --- a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/pgsql/PostgresDBBroker.java +++ b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/pgsql/PostgresDBBroker.java @@ -214,11 +214,16 @@ public class PostgresDBBroker extends DBBrokerTemplate { StringBuilder querySb = new StringBuilder(); + String tableNameOid = "('\"' || t.schemaname || '\".\"' || t.tablename || '\"')::regclass::oid"; + querySb.append("SELECT c.column_name, c.data_type, pg_catalog.format_type(a.atttypid, a.atttypmod), r.contype AS column_type, c.character_maximum_length, c.numeric_precision, a.attndims AS arraydim\n"); querySb.append("FROM information_schema.columns c\n"); querySb.append("JOIN pg_catalog.pg_tables t ON c.table_schema = t.schemaname AND c.table_name = t.tablename\n"); - querySb.append("LEFT JOIN pg_catalog.pg_constraint r ON c.ordinal_position = ANY(r.conkey) AND r.conrelid = (t.schemaname || '.' || t.tablename)::regclass::oid\n"); - querySb.append("LEFT JOIN pg_catalog.pg_attribute a ON a.attrelid = (t.schemaname || '.' || t.tablename)::regclass::oid and a.attname = c.column_name\n"); + querySb.append("LEFT JOIN pg_catalog.pg_constraint r ON c.ordinal_position = ANY(r.conkey) AND r.conrelid = "); + querySb.append(tableNameOid); + querySb.append("\nLEFT JOIN pg_catalog.pg_attribute a ON a.attrelid = "); + querySb.append(tableNameOid); + querySb.append(" and a.attname = c.column_name\n"); querySb.append("WHERE t.schemaname = '"); querySb.append(schemaName); querySb.append("' AND t.tablename = '"); @@ -283,15 +288,11 @@ public class PostgresDBBroker extends DBBrokerTemplate { cm.put(Column.DATATYPE_KEY, datatype); cm.put(Column.SIZE_KEY, size); - String arraySize = "*"; + String arraySize; if (isArray) { arraySize = formatArraySize(arraydimension); - } else if (size != null) { - arraySize = String.valueOf(size); - // variable length columns must have a "*" symbol on arraysize - if (adqlType != null && ADQL.isVariable(adqlType)) { - arraySize += "*"; - } + } else { + arraySize = getArraysize(adqlType, size); } cm.put(Column.ARRAYSIZE_KEY, arraySize); diff --git a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/model/SchemaModels.java b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/model/SchemaModels.java index 29bdcb4..6a6fcf3 100644 --- a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/model/SchemaModels.java +++ b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/model/SchemaModels.java @@ -37,8 +37,6 @@ import java.util.Properties; public class SchemaModels { private static final String SCHEMA_DEFINITION_FOLDER = "schema_definition"; - private static final String TAP_SCHEMA_NAME = "tap_schema"; - private static final String IVOA_SCHEMA_NAME = "ivoa"; // Map keys are version numbers private static final Map<String, SchemaModel> TAP_SCHEMA_MODELS; diff --git a/TASMAN-core/src/main/resources/schema_definition/tap_schema-1-IA2.xml b/TASMAN-core/src/main/resources/schema_definition/tap_schema-1-IA2.xml index 1d53e01..0ba5fe9 100644 --- a/TASMAN-core/src/main/resources/schema_definition/tap_schema-1-IA2.xml +++ b/TASMAN-core/src/main/resources/schema_definition/tap_schema-1-IA2.xml @@ -21,7 +21,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. --> -<schema name="tap_schema" version="1.0-IA2" extends="1.0"> +<schema name="TAP_SCHEMA" version="1.0-IA2" extends="1.0"> <table name="schemas"> <column name="schemaID"> <type>BIGINT</type> diff --git a/TASMAN-core/src/main/resources/schema_definition/tap_schema-1.xml b/TASMAN-core/src/main/resources/schema_definition/tap_schema-1.xml index 85d28d9..288ae36 100644 --- a/TASMAN-core/src/main/resources/schema_definition/tap_schema-1.xml +++ b/TASMAN-core/src/main/resources/schema_definition/tap_schema-1.xml @@ -21,7 +21,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. --> -<schema name="tap_schema" version="1.0" description="a special schema to describe a TAP tableset" datatype="ADQL"> +<schema name="TAP_SCHEMA" version="1.0" description="a special schema to describe a TAP tableset" datatype="ADQL"> <table name="schemas" description="description of schemas in this tableset"> <column name="schema_name"> <type>VARCHAR</type> diff --git a/TASMAN-core/src/main/resources/schema_definition/tap_schema-1_1-IA2.xml b/TASMAN-core/src/main/resources/schema_definition/tap_schema-1_1-IA2.xml index 346fff7..1cfde66 100644 --- a/TASMAN-core/src/main/resources/schema_definition/tap_schema-1_1-IA2.xml +++ b/TASMAN-core/src/main/resources/schema_definition/tap_schema-1_1-IA2.xml @@ -21,7 +21,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. --> -<schema name="tap_schema" version="1.1-IA2" extends="1.1" datatype="VOTable"> +<schema name="TAP_SCHEMA" version="1.1-IA2" extends="1.1" datatype="VOTable"> <table name="schemas"> <column name="schemaID"> <type>BIGINT</type> diff --git a/TASMAN-core/src/main/resources/schema_definition/tap_schema-1_1.xml b/TASMAN-core/src/main/resources/schema_definition/tap_schema-1_1.xml index ca0050a..c3470b5 100644 --- a/TASMAN-core/src/main/resources/schema_definition/tap_schema-1_1.xml +++ b/TASMAN-core/src/main/resources/schema_definition/tap_schema-1_1.xml @@ -21,7 +21,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. --> -<schema name="tap_schema" version="1.1" extends="1.0" datatype="VOTable"> +<schema name="TAP_SCHEMA" version="1.1" extends="1.0" datatype="VOTable"> <table name="tables"> <column name="table_index"> <type>INTEGER</type> diff --git a/TASMAN-core/src/test/java/it/inaf/ia2/tsm/TestAll.java b/TASMAN-core/src/test/java/it/inaf/ia2/tsm/TestAll.java index a4bad2d..d68c4e6 100644 --- a/TASMAN-core/src/test/java/it/inaf/ia2/tsm/TestAll.java +++ b/TASMAN-core/src/test/java/it/inaf/ia2/tsm/TestAll.java @@ -94,6 +94,7 @@ public class TestAll { settings.setTapSchemaName("test_tap_schema"); settings.setTapSchemaVersion("1.1-IA2"); settings.setHasObscore(true); + settings.setIvoaSchemaName("test_ivoa"); settings.setObscoreVersion("1.1"); // Mix! @@ -166,11 +167,11 @@ public class TestAll { switch (dbType) { case MYSQL: stat.executeUpdate("DROP DATABASE IF EXISTS test_tap_schema"); - stat.executeUpdate("DROP DATABASE IF EXISTS ivoa"); + stat.executeUpdate("DROP DATABASE IF EXISTS test_ivoa"); break; case POSTGRES: stat.executeUpdate("DROP SCHEMA IF EXISTS test_tap_schema CASCADE"); - stat.executeUpdate("DROP SCHEMA IF EXISTS ivoa CASCADE"); + stat.executeUpdate("DROP SCHEMA IF EXISTS test_ivoa CASCADE"); break; default: throw new UnsupportedOperationException("Database type " + dbType + " not supported"); @@ -460,9 +461,9 @@ public class TestAll { assertFalse(operations.getHasOperations()); // Checking size and arraysize detection - Schema tapSchemaSchema = tapSchema.getChild(TapSchema.STANDARD_NAME); + Schema tapSchemaSchema = tapSchema.getChild(TapSchema.STANDARD_TAP_SCHEMA_NAME); assertEquals(tapSchema.getDBName(), tapSchemaSchema.getValue(Schema.DBNAME)); - assertEquals(TapSchema.STANDARD_NAME, tapSchemaSchema.getName()); + assertEquals(TapSchema.STANDARD_TAP_SCHEMA_NAME, tapSchemaSchema.getName()); Table columnsTable = tapSchemaSchema.getChild("columns"); diff --git a/TASMAN-embedded/src/main/resources/app.properties b/TASMAN-embedded/src/main/resources/app.properties index 7eebcf0..086a164 100644 --- a/TASMAN-embedded/src/main/resources/app.properties +++ b/TASMAN-embedded/src/main/resources/app.properties @@ -1,2 +1,2 @@ -warFilePath=/home/sonia/git/TASMAN/TASMAN-webapp/target/tasman-webapp-1.3.0.war +warFilePath=/home/sonia/git/TASMAN/TASMAN-webapp/target/tasman-webapp-1.3.2.war defaultPort=8080 \ No newline at end of file diff --git a/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/CredentialsEditing.java b/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/CredentialsEditing.java index 48e1b0f..1b9520f 100644 --- a/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/CredentialsEditing.java +++ b/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/CredentialsEditing.java @@ -22,6 +22,7 @@ */ package it.inaf.ia2.tsm.webapp; +import it.inaf.ia2.tsm.TapSchema; import it.inaf.ia2.tsm.webapp.xmlconfig.SeparatedCredentials; import it.inaf.ia2.tsm.datalayer.Credentials; import it.inaf.ia2.tsm.model.SchemaModels; @@ -75,6 +76,7 @@ public class CredentialsEditing implements Serializable { private String tapSchemaVersion; private boolean hasObscore; private String obscoreVersion; + private String ivoaSchemaName; @PostConstruct public void init() { @@ -110,6 +112,7 @@ public class CredentialsEditing implements Serializable { tapSchemaVersion = credentials.getTapSchemaVersion(); hasObscore = credentials.isHasObscore(); obscoreVersion = credentials.getObscoreVersion(); + ivoaSchemaName = credentials.getIvoaSchemaName(); } public void addNewCredentialsInEditing() { @@ -117,10 +120,11 @@ public class CredentialsEditing implements Serializable { separateCredentials = false; sourceCredentials = new Credentials(); tapSchemaCredentials = new Credentials(); - tapSchemaName = ""; + tapSchemaName = TapSchema.STANDARD_TAP_SCHEMA_NAME; tapSchemaVersion = ""; hasObscore = false; obscoreVersion = ""; + ivoaSchemaName = TapSchema.STANDARD_IVOA_SCHEMA_NAME; } public void loadTapSchema(TapCredentials tapCredentials) throws SQLException { @@ -168,6 +172,11 @@ public class CredentialsEditing implements Serializable { & validateNotNull(ctx, tapSchemaCredentials.getHostname(), "main:tap_schema_username", "Username is required"); } + if (hasObscore) { + validationOk = validationOk + & validateNotNull(ctx, ivoaSchemaName, "main:ivoa_schema_name", "IVOA schema name is required"); + } + if (!validationOk) { return; } @@ -183,6 +192,7 @@ public class CredentialsEditing implements Serializable { editedCredentials.setTapSchemaVersion(tapSchemaVersion); editedCredentials.setHasObscore(hasObscore); editedCredentials.setObscoreVersion(obscoreVersion); + editedCredentials.setIvoaSchemaName(ivoaSchemaName); if (credentialsInEditing == null) { // New credentials @@ -264,4 +274,12 @@ public class CredentialsEditing implements Serializable { public void setObscoreVersion(String obscoreVersion) { this.obscoreVersion = obscoreVersion; } + + public String getIvoaSchemaName() { + return ivoaSchemaName; + } + + public void setIvoaSchemaName(String ivoaSchemaName) { + this.ivoaSchemaName = ivoaSchemaName; + } } diff --git a/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/TapSchemaEditingBean.java b/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/TapSchemaEditingBean.java index 851ac0c..26e4c36 100644 --- a/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/TapSchemaEditingBean.java +++ b/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/TapSchemaEditingBean.java @@ -277,10 +277,17 @@ public class TapSchemaEditingBean implements Serializable { this.currentAddingContainer = currentAddingContainer; this.currentAddables = new ArrayList<>(); for (String name : currentAddingContainer.getAddableChildrenNames()) { - if (currentAddingContainer instanceof TapSchema && !tapSchema.exists() && name.equals(tapSchema.getName())) { - // we can't add the TAP_SCHEMA into itself when it doesn't - // created yet. - continue; + if (currentAddingContainer instanceof TapSchema) { + if (name.equals(tapSchema.getRealSchemaName(tapSchema.getName())) + && tapSchema.getChild(tapSchema.getName()) != null) { + // we can manually add the TAP_SCHEMA schema into itself only if it has been accidentally removed + // Note: adding of TAP_SCHEMA schema should be fully managed by TASMAN during the consistency checking phase. + continue; + } + if (name.equals(tapSchema.getRealSchemaName(tapSchema.getIvoaSchemaName()))) { + // Ivoa schema adding/removal is fully managed by TASMAN + continue; + } } currentAddables.add(new AddableItem(name)); } @@ -313,7 +320,7 @@ public class TapSchemaEditingBean implements Serializable { for (AddableItem item : currentAddables) { if (item.isSelected()) { lastAddedEntity = currentAddingContainer.addChild(item.getName()); - if (lastAddedEntity != null && canAddChildren) { + if (lastAddedEntity != null && canAddChildren && addAlsoAllChildren) { addAllChildren(lastAddedEntity); } } diff --git a/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/TapSchemaLoader.java b/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/TapSchemaLoader.java index 9461743..1f8ecb0 100644 --- a/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/TapSchemaLoader.java +++ b/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/TapSchemaLoader.java @@ -91,7 +91,7 @@ public class TapSchemaLoader implements Serializable { tapSchemaExists = true; } // Check for ivoa schema existence only if the user wants obscore - if (tapCredentials.isHasObscore() && schemaName.equals("ivoa")) { + if (tapCredentials.isHasObscore() && schemaName.equals(tapCredentials.getIvoaSchemaName())) { ivoaSchemaExists = true; } if (tapSchemaExists && ivoaSchemaExists) { @@ -114,6 +114,7 @@ public class TapSchemaLoader implements Serializable { settings.setTapSchemaVersion(tapCredentials.getTapSchemaVersion()); settings.setHasObscore(tapCredentials.isHasObscore()); settings.setObscoreVersion(tapCredentials.getObscoreVersion()); + settings.setIvoaSchemaName(tapCredentials.getIvoaSchemaName()); return settings; } diff --git a/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/xmlconfig/TapCredentials.java b/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/xmlconfig/TapCredentials.java index d615b0a..4bb35db 100644 --- a/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/xmlconfig/TapCredentials.java +++ b/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/xmlconfig/TapCredentials.java @@ -37,6 +37,7 @@ public abstract class TapCredentials implements Serializable { private String tapSchemaVersion; private boolean hasObscore; private String obscoreVersion; + private String ivoaSchemaName; public TapCredentials() { } @@ -46,6 +47,8 @@ public abstract class TapCredentials implements Serializable { this.tapSchemaName = tapCredentials.getTapSchemaName(); this.tapSchemaVersion = tapCredentials.getTapSchemaVersion(); this.hasObscore = tapCredentials.isHasObscore(); + this.obscoreVersion = tapCredentials.getObscoreVersion(); + this.ivoaSchemaName = tapCredentials.getIvoaSchemaName(); } @XmlElement(name = "tap_schema_name") @@ -83,4 +86,13 @@ public abstract class TapCredentials implements Serializable { public void setObscoreVersion(String obscoreVersion) { this.obscoreVersion = obscoreVersion; } + + @XmlElement(name = "ivoa_schema_name") + public String getIvoaSchemaName() { + return ivoaSchemaName; + } + + public void setIvoaSchemaName(String ivoaSchemaName) { + this.ivoaSchemaName = ivoaSchemaName; + } } diff --git a/TASMAN-webapp/src/main/webapp/credentialsEditing.xhtml b/TASMAN-webapp/src/main/webapp/credentialsEditing.xhtml index f20e2ae..66d62de 100644 --- a/TASMAN-webapp/src/main/webapp/credentialsEditing.xhtml +++ b/TASMAN-webapp/src/main/webapp/credentialsEditing.xhtml @@ -39,6 +39,7 @@ <th>Version</th> <th>Obscore</th> <th>Obscore version</th> + <th>IVOA schema name</th> <th>Login</th> </tr> </thead> @@ -69,6 +70,7 @@ <td>#{c.tapSchemaVersion}</td> <td><span class="glyphicon glyphicon-#{c.hasObscore ? 'ok':'remove'}"></span></td> <td><h:panelGroup rendered="#{c.hasObscore}">#{c.obscoreVersion}</h:panelGroup></td> + <td><h:panelGroup rendered="#{c.hasObscore}">#{c.ivoaSchemaName}</h:panelGroup></td> <td> <h:commandLink action="#{credentialsInsertion.loadTapSchema(c)}" title="Login" immediate="true"> <span class="glyphicon glyphicon-log-in"></span> @@ -88,7 +90,7 @@ <h:commandLink class="btn btn-success" action="#{credentialsInsertion.addNewCredentialsInEditing()}"> <span class="glyphicon glyphicon-plus"></span> Add new database credentials - <f:ajax execute="@this" render="credentials-modal-body" onevent="credentials.editClicked" /> + <f:ajax execute="@this" render=":main:credentials-modal-body" onevent="credentials.editClicked" /> </h:commandLink> </div> </h:panelGroup> @@ -244,18 +246,27 @@ <div class="form-group"> <label class="col-xs-6 col-xs-offset-4"> <h:selectBooleanCheckbox value="#{credentialsInsertion.hasObscore}" id="has-obscore"> - <f:ajax execute="@form" render=":main:credentials-modal-body" /> + <f:ajax execute="@this" render="obscore_settings" /> </h:selectBooleanCheckbox> Has obscore </label> </div> - <h:panelGroup class="form-group" rendered="#{credentialsInsertion.hasObscore}" layout="block"> - <h:outputLabel for="obscore_version" class="control-label col-xs-4">ObsCore version</h:outputLabel> - <div class="col-xs-6"> - <h:selectOneMenu value="#{credentialsInsertion.obscoreVersion}" class="form-control"> - <f:selectItems value="#{credentialsInsertion.obscoreVersions}" var="version" itemLabel="#{version}" itemDescription="#{version}" id="obscore_version" /> - </h:selectOneMenu> - </div> + <h:panelGroup id="obscore_settings"> + <h:panelGroup class="form-group" rendered="#{credentialsInsertion.hasObscore}" layout="block"> + <h:outputLabel for="obscore_version" class="control-label col-xs-4">ObsCore version</h:outputLabel> + <div class="col-xs-6"> + <h:selectOneMenu value="#{credentialsInsertion.obscoreVersion}" class="form-control" id="obscore_version"> + <f:selectItems value="#{credentialsInsertion.obscoreVersions}" var="version" itemLabel="#{version}" itemDescription="#{version}" /> + </h:selectOneMenu> + </div> + </h:panelGroup> + <h:panelGroup class="form-group" rendered="#{credentialsInsertion.hasObscore}" layout="block"> + <h:outputLabel for="ivoa_schema_name" class="control-label col-xs-4">IVOA schema name</h:outputLabel> + <div class="col-xs-6"> + <h:inputText value="#{credentialsInsertion.ivoaSchemaName}" id="ivoa_schema_name" class="form-control" /> + <h:message for="ivoa_schema_name" class="text-danger" /> + </div> + </h:panelGroup> </h:panelGroup> </div> </h:panelGroup> diff --git a/TASMAN-webapp/src/main/webapp/resources/js/common.js b/TASMAN-webapp/src/main/webapp/resources/js/common.js index bedc21e..c566706 100644 --- a/TASMAN-webapp/src/main/webapp/resources/js/common.js +++ b/TASMAN-webapp/src/main/webapp/resources/js/common.js @@ -78,8 +78,8 @@ $('.modal').modal('hide'); $('#errorModal .errorName').text(error.errorName); - $('#errorModal .errorMessage').text(error.errorMessage); - if (error.errorName.indexOf('ViewExpiredException') !== -1) { + $('#errorModal .errorMessage').text(error.errorMessage || error.description); + if (error.errorName && error.errorName.indexOf('ViewExpiredException') !== -1) { // If view has expired reload the page to display error message location.reload(); } else { diff --git a/TASMAN-webapp/src/main/webapp/tapSchemaEditing.xhtml b/TASMAN-webapp/src/main/webapp/tapSchemaEditing.xhtml index f075831..688077c 100644 --- a/TASMAN-webapp/src/main/webapp/tapSchemaEditing.xhtml +++ b/TASMAN-webapp/src/main/webapp/tapSchemaEditing.xhtml @@ -83,6 +83,9 @@ <h:panelGroup rendered="#{schema.name eq tapSchemaEditing.tapSchema.name and tapSchemaEditing.tapSchema.DBName ne null}"> <small>(#{tapSchemaEditing.tapSchema.DBName})</small> </h:panelGroup> + <h:panelGroup rendered="#{schema.name eq tapSchemaEditing.tapSchema.ivoaSchemaName and tapSchemaEditing.tapSchema.ivoaSchemaDBName ne null}"> + <small>(#{tapSchemaEditing.tapSchema.ivoaSchemaDBName})</small> + </h:panelGroup> <f:ajax execute="@form" render="@form" /> <h:commandButton class="remove-btn" rendered="#{!tapSchemaEditing.toRemove(schema) and tapSchemaEditing.isSchemaRemovable(schema)}" action="#{tapSchemaEditing.tapSchema.removeChild(schema.name)}" value="×" onclick="TSM.stopPropagation(event)"> <f:ajax execute="@form" render="@form" /> diff --git a/install.sh b/install.sh index 8e54c85..4135e2d 100755 --- a/install.sh +++ b/install.sh @@ -104,7 +104,7 @@ cd - 1> /dev/null # Creating executable tasman_bin="$install_dir""tasman" echo "#!/bin/bash" > $tasman_bin -echo "java -jar $install_dir""tasman-embedded.jar" >> $tasman_bin +echo "java -jar $install_dir""tasman-embedded.jar \$1" >> $tasman_bin chmod +x $tasman_bin # Creating executable symbolic link -- GitLab