Newer
Older
/*
* _____________________________________________________________________________
*
* INAF - OATS National Institute for Astrophysics - Astronomical Observatory of
* Trieste INAF - IA2 Italian Center for Astronomical Archives
* _____________________________________________________________________________
*
* Copyright (C) 2016 Istituto Nazionale di Astrofisica
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License Version 3 as published by the
* Free Software Foundation.
*
* 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, write to the Free Software Foundation, Inc., 51
* Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
Sonia Zorba
committed
package it.inaf.ia2.tsm.webapp;
import it.inaf.ia2.tsm.ChildEntity;
import it.inaf.ia2.tsm.Column;
Sonia Zorba
committed
import it.inaf.ia2.tsm.webapp.env.CustomPartialResponseWriter;
import it.inaf.ia2.tsm.EntitiesContainer;
import it.inaf.ia2.tsm.Key;
import it.inaf.ia2.tsm.KeyColumn;
import it.inaf.ia2.tsm.Schema;
import it.inaf.ia2.tsm.Status;
import it.inaf.ia2.tsm.Table;
import it.inaf.ia2.tsm.TapSchema;
import it.inaf.ia2.tsm.TapSchemaEntity;
import it.inaf.ia2.tsm.UpdateOperations;
import java.io.Serializable;
Sonia Zorba
committed
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
Sonia Zorba
committed
import org.apache.deltaspike.core.api.scope.WindowScoped;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
* @author Sonia Zorba {@literal <zorba at oats.inaf.it>}
*/
@Named("tapSchemaEditing")
Sonia Zorba
committed
@WindowScoped
public class TapSchemaEditingBean implements Serializable {
Sonia Zorba
committed
private static final long serialVersionUID = -6251004452688984277L;
Sonia Zorba
committed
private static final Logger LOG = LoggerFactory.getLogger(TapSchemaEditingBean.class);
private TapSchemaLoader tapSchemaLoader;
private TapSchema tapSchema;
private Schema selectedSchema;
private Table selectedTable;
private Column selectedColumn;
private UpdateOperations updateOperations;
private EntitiesContainer currentAddingContainer;
Sonia Zorba
committed
private List<AddableItem> currentAddables;
Sonia Zorba
committed
@Inject
private SearchUCDDialog searchUCDDialog;
public Schema getSelectedSchema() {
return selectedSchema;
}
public Table getSelectedTable() {
return selectedTable;
}
public Column getSelectedColumn() {
return selectedColumn;
}
public VOUnitValidator getVoUnitValidator() {
return voUnitValidator;
}
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
public void setSelectedSchema(Schema selectedSchema) {
this.selectedSchema = selectedSchema;
if (selectedSchema == null) {
setSelectedTable(null);
} else {
List<Table> tables = selectedSchema.getAddedOrRemovedChildren();
if (tables.isEmpty()) {
setSelectedTable(null);
} else {
setSelectedTable(tables.get(0));
}
}
}
public void setSelectedTable(Table selectedTable) {
this.selectedTable = selectedTable;
if (selectedTable == null) {
setSelectedColumn(null);
} else {
List<Column> columns = selectedTable.getAddedOrRemovedChildren();
if (columns.isEmpty()) {
setSelectedColumn(null);
} else {
setSelectedColumn(columns.get(0));
}
}
}
public void setSelectedColumn(Column selectedColumn) {
this.selectedColumn = selectedColumn;
}
public UpdateOperations getUpdateOperations() {
return updateOperations;
}
public String getUpdatedValues(TapSchemaEntity entity) {
StringBuilder sb = new StringBuilder();
boolean first = true;
for (String key : entity.getPropertiesKeys()) {
if (entity.isChanged(key)) {
if (!first) {
sb.append(", ");
}
sb.append(key);
first = false;
}
}
return sb.toString();
}
Sonia Zorba
committed
public static class AddableItem implements Serializable {
Sonia Zorba
committed
private static final long serialVersionUID = 2732253307571391962L;
private final String name;
Sonia Zorba
committed
private boolean selected;
Sonia Zorba
committed
AddableItem(String name) {
this.name = name;
}
Sonia Zorba
committed
public String getName() {
return name;
}
Sonia Zorba
committed
public boolean isSelected() {
return selected;
}
Sonia Zorba
committed
public void setSelected(boolean selected) {
this.selected = selected;
}
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
public boolean toRemove(ChildEntity child) {
return child.getStatus() == Status.REMOVED_NOT_PERSISTED || child.getStatus() == Status.TO_REMOVE;
}
public String getForeignKeyString(Column column) throws SQLException {
Key foreignKey = column.getForeignKey();
if (foreignKey == null) {
return null;
}
if (foreignKey.isVisible()) {
String columnName = column.getName();
StringBuilder sb = new StringBuilder();
sb.append(foreignKey.getFromTableCompleteName());
sb.append(".");
sb.append(columnName);
sb.append(" -> ");
for (KeyColumn keyColumn : foreignKey.getKeyColumns()) {
if (keyColumn.getFromColumn().equals(columnName)) {
sb.append(foreignKey.getTargetTableCompleteName());
sb.append(keyColumn.getTargetColumn());
break;
}
}
return sb.toString();
}
return null;
}
public TapSchema getTapSchema() {
return tapSchema;
}
private void setupSelected() {
selectedSchema = null;
selectedTable = null;
selectedColumn = null;
List<Schema> schemas = tapSchema.getAddedOrRemovedChildren();
if (!schemas.isEmpty()) {
selectedSchema = schemas.get(0);
List<Table> tables = selectedSchema.getAddedOrRemovedChildren();
if (!tables.isEmpty()) {
selectedTable = tables.get(0);
if (!columns.isEmpty()) {
selectedColumn = columns.get(0);
}
}
}
selectedColumnChanged();
}
private void selectedColumnChanged() {
if (selectedColumn == null) {
voUnitValidator = new VOUnitValidator(null);
} else {
voUnitValidator = new VOUnitValidator(selectedColumn.getValue("unit", String.class));
}
public void setTapSchema(TapSchema tapSchema) {
this.tapSchema = tapSchema;
setupSelected();
}
public void update() throws SQLException {
tapSchema.save();
setupSelected();
public SearchUCDDialog getSearchUCDDialog() {
return searchUCDDialog;
}
return "credentialsEditing.xhtml?faces-redirect=true";
public void undoRemove(ChildEntity entity) throws SQLException {
// re-add what was removed
entity.getParent().addChild(entity.getName());
Sonia Zorba
committed
}
public EntitiesContainer getCurrentAddingContainer() {
Sonia Zorba
committed
return currentAddingContainer;
}
public void openAddablesModal(EntitiesContainer<?> currentAddingContainer) {
Sonia Zorba
committed
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;
}
Sonia Zorba
committed
currentAddables.add(new AddableItem(name));
}
}
Sonia Zorba
committed
public void checkAllEntities(boolean value) {
for (AddableItem item : currentAddables) {
item.setSelected(value);
}
}
Sonia Zorba
committed
public void addSelected() throws SQLException {
TapSchemaEntity lastAddedEntity = null;
Sonia Zorba
committed
for (AddableItem item : currentAddables) {
if (item.isSelected()) {
lastAddedEntity = currentAddingContainer.addChild(item.getName());
}
}
if (lastAddedEntity != null) {
if (lastAddedEntity instanceof Schema) {
setSelectedSchema((Schema) lastAddedEntity);
} else if (lastAddedEntity instanceof Table) {
setSelectedTable((Table) lastAddedEntity);
} else if (lastAddedEntity instanceof Column) {
setSelectedColumn((Column) lastAddedEntity);
Sonia Zorba
committed
}
}
}
Sonia Zorba
committed
public List<AddableItem> getCurrentAddables() {
return currentAddables;
}
Sonia Zorba
committed
public void saveUCD() {
if (!FacesContext.getCurrentInstance().isValidationFailed()) {
if (searchUCDDialog.isManualInsertion()) {
selectedColumn.setValue("ucd", searchUCDDialog.getUCDManualText());
selectedColumn.setValue("ucd", searchUCDDialog.getSelectedUCD());
}
// New UCD is set and we can notify the client to close the UCD Search modal dialog.
CustomPartialResponseWriter.getCurrentInstance().addCustomJSUpdate(String.valueOf(true));
Sonia Zorba
committed
}
public void displayUpdateOperations() {
updateOperations = new UpdateOperations(tapSchema);
Sonia Zorba
committed
}
Sonia Zorba
committed
public void openUCDDialog() throws Exception {
searchUCDDialog.setDefault();
String description = selectedColumn.getValue("description", String.class);
if (description != null && !description.isEmpty()) {
Sonia Zorba
committed
searchUCDDialog.setDescription(description);
searchUCDDialog.search();
Sonia Zorba
committed
}
}
public void textInputChanged(TapSchemaEntity entity, String key) {
final boolean isChanged = entity.isChanged(key);
if (key.equals("unit")) {
voUnitValidator = new VOUnitValidator(entity.getValue(key, String.class));
}
CustomPartialResponseWriter.getCurrentInstance().addCustomJSUpdate(String.valueOf(isChanged));
Sonia Zorba
committed
}
Sonia Zorba
committed
public void removeColumn(String name) {
selectedTable.removeChild(name);
Sonia Zorba
committed
if (selectedColumn != null) {
for (Column column : selectedTable.getAddedOrRemovedChildren()) {
if (column.getName().equals(selectedColumn.getName())) {
Sonia Zorba
committed
break;
}
}
}
}
public void undoRemoveColumn() throws SQLException {
this.undoRemove(selectedColumn);
for (Column column : selectedTable.getAddedOrRemovedChildren()) {
if (column.getName().equals(selectedColumn.getName())) {
break;
}
}
public void reload() {
if (tapSchema.exists()) {
tapSchemaLoader.edit();
} else {
}
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
/**
* In TAP_SCHEMA 1.0 std column has an integer data type and use 1 for true
* and 0 for false, but we want to edit it using a JSF booleanCheckbox, so
* we need this workaround pairs of getter and setter.
*/
public Boolean getStd() {
Column column = getSelectedColumn();
if (column != null && column.getProperty("std") != null) {
return column.getValue("std", Integer.class) == 1;
}
return null;
}
public void setStd(Boolean value) {
Column column = getSelectedColumn();
if (column != null) {
column.setValue("std", value ? 1 : 0);
}
}
/**
* Same of getStd().
*/
public Boolean getPrincipal() {
Column column = getSelectedColumn();
if (column != null && column.getProperty("principal") != null) {
return column.getValue("principal", Integer.class) == 1;
}
return null;
}
public void setPrincipal(Boolean value) {
Column column = getSelectedColumn();
if (column != null) {
column.setValue("principal", value ? 1 : 0);
}
}