From 5e2bad955c09f6bebc57573e3e82a0e22b002d6d Mon Sep 17 00:00:00 2001 From: Sonia Zorba <zorba@oats.inaf.it> Date: Mon, 24 Jul 2017 16:06:56 +0200 Subject: [PATCH] Changes and improvements in credentials insertion page --- .../main/java/it/inaf/ia2/tsm/TapSchema.java | 3 - .../inaf/ia2/tsm/datalayer/Credentials.java | 14 +- .../it/inaf/ia2/tsm/model/PropertyModel.java | 2 + .../inaf/ia2/tsm/model/TapSchemaModels.java | 12 + .../java/it/inaf/ia2/tsm/model/Tasman.java | 3 - .../ia2/tsm/webapp/ConfigurationManager.java | 13 +- .../tsm/webapp/CredentialsDialogResource.java | 48 ---- .../ia2/tsm/webapp/CredentialsEditing.java | 160 ++++++++--- .../ia2/tsm/webapp/env/ApplicationConfig.java | 1 - .../it/inaf/ia2/tsm/webapp/env/UIModal.java | 71 +++++ .../webapp/xmlconfig/JoinedCredentials.java | 7 + .../xmlconfig/SeparatedCredentials.java | 9 + .../tsm/webapp/xmlconfig/TapCredentials.java | 10 + .../src/main/webapp/credentialsEditing.xhtml | 251 ++++++++++-------- .../main/webapp/resources/js/credentials.js | 31 ++- 15 files changed, 416 insertions(+), 219 deletions(-) delete mode 100644 TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/CredentialsDialogResource.java create mode 100644 TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/env/UIModal.java 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 d8752db..f3d6ade 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 @@ -266,9 +266,6 @@ public class TapSchema implements EntitiesContainer<Schema>, Serializable { if (!keyFound) { boolean setKeyToRemove = true; - if (Tasman.ALLOWS_FICTITIOUS_KEYS) { - // TODO - } if (setKeyToRemove) { String[] fromColumns = new String[kcPropsById.size()]; String[] targetColumns = new String[kcPropsById.size()]; diff --git a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/Credentials.java b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/Credentials.java index dfc0272..35695c9 100644 --- a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/Credentials.java +++ b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/datalayer/Credentials.java @@ -39,14 +39,14 @@ public class Credentials implements Serializable { private static final long serialVersionUID = 1153912575502196261L; private static final Logger LOG = LoggerFactory.getLogger(Credentials.class); + private DatabaseType databaseType; + private String hostname; private int port; private String username; private String password; private String database; - private DatabaseType databaseType; - public Credentials() { this(DatabaseType.MYSQL); } @@ -56,6 +56,16 @@ public class Credentials implements Serializable { this.setDefaults(); } + // Copy constructor + public Credentials(Credentials credentials) { + this(credentials.getDatabaseType()); + this.hostname = credentials.getHostname(); + this.port = credentials.getPort(); + this.username = credentials.getUsername(); + this.password = credentials.getPassword(); + this.database = credentials.getDatabase(); + } + /** * The name of the server that hosts the RDBMS. */ diff --git a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/model/PropertyModel.java b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/model/PropertyModel.java index 77f4ab5..393b337 100644 --- a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/model/PropertyModel.java +++ b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/model/PropertyModel.java @@ -65,6 +65,8 @@ public class PropertyModel implements Serializable { defaultValue = Long.parseLong(strDefVal); } else if (type == Float.class) { defaultValue = Float.parseFloat(strDefVal); + } else if (type == Boolean.class) { + defaultValue = Boolean.parseBoolean(strDefVal); } else { throw new UnsupportedOperationException("Default value for type " + type.getCanonicalName() + " not supported yet."); } diff --git a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/model/TapSchemaModels.java b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/model/TapSchemaModels.java index 1721f61..3f4f817 100644 --- a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/model/TapSchemaModels.java +++ b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/model/TapSchemaModels.java @@ -24,8 +24,10 @@ package it.inaf.ia2.tsm.model; import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Map; import javax.xml.bind.JAXB; @@ -102,4 +104,14 @@ public class TapSchemaModels { public static TableModel getTableModel(String tableName, String version) { return getTapSchemaModel(version).getTables().get(tableName); } + + public static List<String> getAvailableVersions() { + List<String> versions = new ArrayList<>(); + Iterator<TapSchemaModel> ite = getIterator(); + while (ite.hasNext()) { + TapSchemaModel tapSchemaModel = ite.next(); + versions.add(tapSchemaModel.getVersion()); + } + return versions; + } } diff --git a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/model/Tasman.java b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/model/Tasman.java index 11fc66e..fa1c8f8 100644 --- a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/model/Tasman.java +++ b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/model/Tasman.java @@ -34,7 +34,6 @@ import java.util.Properties; public class Tasman { public static final String[] XML_MODEL_FILES; - public static final boolean ALLOWS_FICTITIOUS_KEYS; static { try (InputStream in = Tasman.class.getClassLoader().getResourceAsStream("core.properties")) { @@ -46,8 +45,6 @@ public class Tasman { String suffix = models[i]; XML_MODEL_FILES[i] = "tap_schema" + File.separator + "tap_schema-" + suffix + ".xml"; } - - ALLOWS_FICTITIOUS_KEYS = Boolean.parseBoolean(props.getProperty("allow_fictitious_keys")); } catch (IOException e) { throw new ExceptionInInitializerError(e); } diff --git a/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/ConfigurationManager.java b/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/ConfigurationManager.java index 75d560e..8a11d97 100644 --- a/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/ConfigurationManager.java +++ b/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/ConfigurationManager.java @@ -233,18 +233,11 @@ public class ConfigurationManager { * @return true if the credentials has been deleted from the list, false * otherwise. */ - public synchronized boolean deleteCredentials(String username, TapCredentials credentials) { + public synchronized boolean deleteCredentials(String username, int credentialsIndex) { for (UserConfiguration user : usersConfig.getUsers()) { if (user.getUsername().equals(username)) { - Iterator<TapCredentials> ite = user.getCredentialsInfo().iterator(); - while (ite.hasNext()) { - TapCredentials tapCredentials = ite.next(); - if (tapCredentials.equals(credentials)) { - ite.remove(); - updateUsersConfigurationFile(); - return true; - } - } + user.getCredentialsInfo().remove(credentialsIndex); + return true; } } return false; diff --git a/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/CredentialsDialogResource.java b/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/CredentialsDialogResource.java deleted file mode 100644 index 7916bb3..0000000 --- a/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/CredentialsDialogResource.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * _____________________________________________________________________________ - * - * INAF - OATS National Institute for Astrophysics - Astronomical Observatory of - * Trieste INAF - IA2 Italian Center for Astronomical Archives - * _____________________________________________________________________________ - * - * Copyright (C) 2017 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. - */ -package it.inaf.ia2.tsm.webapp; - -import javax.ws.rs.Path; -import javax.enterprise.context.RequestScoped; -import javax.inject.Inject; -import javax.ws.rs.POST; -import javax.ws.rs.QueryParam; - -/** - * REST Web Service for setting opening dialog status using JavaScript. This is - * necessary to conditionally disable JSF validation when dialog is closed. - * - * @author Sonia Zorba {@literal <zorba at oats.inaf.it>} - */ -@Path("credentialsDialog") -@RequestScoped -public class CredentialsDialogResource { - - @Inject - CredentialsEditing credentialsEditing; - - @POST - public void setOpened(@QueryParam("opened") boolean opened) { - credentialsEditing.setCredentialsDialogOpened(opened); - } -} 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 f2d9ad9..5bb68a6 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 @@ -25,6 +25,10 @@ package it.inaf.ia2.tsm.webapp; import it.inaf.ia2.tsm.webapp.xmlconfig.SeparatedCredentials; import it.inaf.ia2.tsm.datalayer.Credentials; import it.inaf.ia2.tsm.datalayer.DBWrapper; +import it.inaf.ia2.tsm.model.TapSchemaModels; +import it.inaf.ia2.tsm.webapp.env.UIModal; +import it.inaf.ia2.tsm.webapp.xmlconfig.JoinedCredentials; +import it.inaf.ia2.tsm.webapp.xmlconfig.TapCredentials; import java.io.IOException; import java.io.Serializable; import java.sql.SQLException; @@ -58,54 +62,87 @@ public class CredentialsEditing implements Serializable { @Inject private SchemaSelectionBean schemaSelectionBean; + private Integer credentialsInEditing; + private Integer credentialsToRemove; + + private UIModal.StatusObserver credentialsDialogStatusObserver; private boolean credentialsDialogOpened; + private List<String> tapSchemaVersions; + + private boolean separateCredentials; private Credentials sourceCredentials; private Credentials tapSchemaCredentials; - private boolean separateCredentials; - private int currentEditingRow; + private String tapSchemaName; + private String tapSchemaVersion; + private boolean hasObscore; - public void test() { - String x = ""; - } - @PostConstruct public void init() { - sourceCredentials = new Credentials(); - tapSchemaCredentials = new Credentials(); + this.credentialsDialogStatusObserver = new UIModal.StatusObserver() { + @Override + public void statusChanged(boolean isOpen) { + credentialsDialogOpened = isOpen; + } + }; + this.tapSchemaVersions = TapSchemaModels.getAvailableVersions(); } - public List getSavedCredentials() { + public List<TapCredentials> getSavedCredentials() { return user.getUserConfiguration().getCredentialsInfo(); } - public void editCredentials(Credentials credentials, int index) { - this.sourceCredentials = credentials; - separateCredentials = false; - currentEditingRow = index; - } + public void editCredentials(int index) { + credentialsInEditing = index; + TapCredentials credentials = getSavedCredentials().get(index); + + if (credentials instanceof JoinedCredentials) { - public void editSeparateCredentials(SeparatedCredentials sc, int index) { - this.sourceCredentials = sc.getSourceCredentials(); - this.tapSchemaCredentials = sc.getTapSchemaCredentials(); - currentEditingRow = index; - separateCredentials = true; + JoinedCredentials joinedCredentials = (JoinedCredentials) credentials; + separateCredentials = false; + sourceCredentials = new Credentials(joinedCredentials.getCredentials()); + // in case the user wants to split credentials + tapSchemaCredentials = new Credentials(); + + } else if (credentials instanceof SeparatedCredentials) { + + SeparatedCredentials separatedCredentials = (SeparatedCredentials) credentials; + separateCredentials = true; + sourceCredentials = new Credentials(separatedCredentials.getSourceCredentials()); + tapSchemaCredentials = new Credentials(separatedCredentials.getTapSchemaCredentials()); + } + + tapSchemaName = credentials.getTapSchemaName(); + tapSchemaVersion = credentials.getTapSchemaVersion(); + hasObscore = credentials.isHasObscore(); } public void addNewCredentials() { separateCredentials = false; - this.sourceCredentials = new Credentials(); - this.tapSchemaCredentials = new Credentials(); - currentEditingRow = getSavedCredentials().size(); + sourceCredentials = new Credentials(); + tapSchemaCredentials = new Credentials(); + tapSchemaName = ""; + tapSchemaVersion = ""; + hasObscore = false; } - public String loginWithSingleCredentials(Credentials credentials) { - LOG.debug("Login with single credentials"); - return loginWithDBWrapper(new DBWrapper(credentials)); +// public void editCredentials(Credentials credentials, int index) { +// this.sourceCredentials = credentials; +// separateCredentials = false; +// currentEditingRow = index; +// } +// +// public void editSeparateCredentials(SeparatedCredentials sc, int index) { +// this.sourceCredentials = sc.getSourceCredentials(); +// this.tapSchemaCredentials = sc.getTapSchemaCredentials(); +// currentEditingRow = index; +// separateCredentials = true; +// } + public String loginWithJoinedCredentials(JoinedCredentials credentials) { + return loginWithDBWrapper(new DBWrapper(credentials.getCredentials())); } public String loginWithSeparatedCredentials(Credentials sourceCredentials, Credentials tapSchemaCredentials) { - LOG.debug("Login with separated credentials"); return loginWithDBWrapper(new DBWrapper(sourceCredentials, tapSchemaCredentials)); } @@ -144,6 +181,18 @@ public class CredentialsEditing implements Serializable { // config.updateUsersConfigurationFile(); } + public UIModal.StatusObserver getCredentialsDialogStatus() { + return credentialsDialogStatusObserver; + } + + public List<String> getTapSchemaVersions() { + return tapSchemaVersions; + } + + public void setTapSchemaVersions(List<String> tapSchemaVersions) { + this.tapSchemaVersions = tapSchemaVersions; + } + public boolean isSeparateCredentials() { return separateCredentials; } @@ -152,6 +201,41 @@ public class CredentialsEditing implements Serializable { this.separateCredentials = separateCredentials; } +// public void separateCredentialsChanged() { +// if (separateCredentials) { +// Credentials credentials = getJoinedCredentialsInEditing().getCredentials(); +// SeparatedCredentials separatedCredentials = new SeparatedCredentials(); +// separatedCredentials.setSourceCredentials(credentials); +// credentialsInEditing = separatedCredentials; +// } else { +// Credentials credentials = getSeparatedCredentialsInEditing().getSourceCredentials(); +// JoinedCredentials joinedCredentials = new JoinedCredentials(); +// joinedCredentials.setCredentials(credentials); +// credentialsInEditing = joinedCredentials; +// } +// } +// +// public JoinedCredentials getJoinedCredentialsInEditing() { +// if (credentialsInEditing instanceof JoinedCredentials) { +// return (JoinedCredentials) credentialsInEditing; +// } +// return null; +// } +// +// public SeparatedCredentials getSeparatedCredentialsInEditing() { +// if (credentialsInEditing instanceof SeparatedCredentials) { +// return (SeparatedCredentials) credentialsInEditing; +// } +// return null; +// } + public boolean isCredentialsDialogOpened() { + return credentialsDialogOpened; + } + + public void setCredentialsDialogOpened(boolean credentialsDialogOpened) { + this.credentialsDialogOpened = credentialsDialogOpened; + } + public Credentials getSourceCredentials() { return sourceCredentials; } @@ -168,11 +252,27 @@ public class CredentialsEditing implements Serializable { this.tapSchemaCredentials = tapSchemaCredentials; } - public boolean isCredentialsDialogOpened() { - return credentialsDialogOpened; + public String getTapSchemaName() { + return tapSchemaName; } - public void setCredentialsDialogOpened(boolean credentialsDialogOpened) { - this.credentialsDialogOpened = credentialsDialogOpened; + public void setTapSchemaName(String tapSchemaName) { + this.tapSchemaName = tapSchemaName; + } + + public String getTapSchemaVersion() { + return tapSchemaVersion; + } + + public void setTapSchemaVersion(String tapSchemaVersion) { + this.tapSchemaVersion = tapSchemaVersion; + } + + public boolean isHasObscore() { + return hasObscore; + } + + public void setHasObscore(boolean hasObscore) { + this.hasObscore = hasObscore; } } diff --git a/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/env/ApplicationConfig.java b/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/env/ApplicationConfig.java index c3259e8..49143d6 100644 --- a/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/env/ApplicationConfig.java +++ b/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/env/ApplicationConfig.java @@ -45,7 +45,6 @@ public class ApplicationConfig extends Application { * out calling this method in getClasses(). */ private void addRestResourceClasses(Set<Class<?>> resources) { - resources.add(it.inaf.ia2.tsm.webapp.CredentialsDialogResource.class); resources.add(it.inaf.ia2.tsm.webapp.TapSchemaLoaderResource.class); resources.add(it.inaf.ia2.tsm.webapp.env.KeepAliveResource.class); } diff --git a/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/env/UIModal.java b/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/env/UIModal.java new file mode 100644 index 0000000..5444db3 --- /dev/null +++ b/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/env/UIModal.java @@ -0,0 +1,71 @@ +/* + * _____________________________________________________________________________ + * + * INAF - OATS National Institute for Astrophysics - Astronomical Observatory of + * Trieste INAF - IA2 Italian Center for Astronomical Archives + * _____________________________________________________________________________ + * + * Copyright (C) 2017 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. + */ +package it.inaf.ia2.tsm.webapp.env; + +import java.io.IOException; +import javax.faces.component.FacesComponent; +import javax.faces.component.UIComponentBase; +import javax.faces.context.FacesContext; +import javax.faces.context.ResponseWriter; + +/** + * + * @author Sonia Zorba {@literal <zorba at oats.inaf.it>} + */ +@FacesComponent(tagName = "modal", namespace = "http://ia2.inaf.it/component", createTag = true) +public class UIModal extends UIComponentBase { + + public static abstract class StatusObserver { + + public abstract void statusChanged(boolean isOpen); + } + + @Override + public void decode(FacesContext context) { + + if (getAttributes().containsKey("status-observer")) { + StatusObserver status = (StatusObserver) getAttributes().get("status-observer"); + boolean open = Boolean.parseBoolean((String) getAttributes().get("open")); + status.statusChanged(open); + } + } + + @Override + public String getFamily() { + return "modal"; + } + + @Override + public void encodeBegin(FacesContext context) throws IOException { + ResponseWriter writer = context.getResponseWriter(); + writer.write("<div class=\"modal fade\" tabindex=\"-1\" role=\"dialog\" id=\""); + writer.write(getClientId()); + writer.write("\">"); + } + + @Override + public void encodeEnd(FacesContext context) throws IOException { + ResponseWriter writer = context.getResponseWriter(); + writer.write("</div>"); + } +} diff --git a/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/xmlconfig/JoinedCredentials.java b/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/xmlconfig/JoinedCredentials.java index 731c1bd..818bcac 100644 --- a/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/xmlconfig/JoinedCredentials.java +++ b/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/xmlconfig/JoinedCredentials.java @@ -36,12 +36,19 @@ public class JoinedCredentials extends TapCredentials { private Credentials credentials; public JoinedCredentials() { + credentials = new Credentials(); } public JoinedCredentials(Credentials credentials) { this.credentials = credentials; } + // Copy constructor + public JoinedCredentials(JoinedCredentials joinedCredentials) { + super(joinedCredentials); + this.credentials = new Credentials(joinedCredentials.getCredentials()); + } + public Credentials getCredentials() { return credentials; } diff --git a/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/xmlconfig/SeparatedCredentials.java b/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/xmlconfig/SeparatedCredentials.java index 4024a60..a8ecbbe 100644 --- a/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/xmlconfig/SeparatedCredentials.java +++ b/TASMAN-webapp/src/main/java/it/inaf/ia2/tsm/webapp/xmlconfig/SeparatedCredentials.java @@ -38,6 +38,8 @@ public class SeparatedCredentials extends TapCredentials { private Credentials tapSchemaCredentials; public SeparatedCredentials() { + this.sourceCredentials = new Credentials(); + this.tapSchemaCredentials = new Credentials(); } public SeparatedCredentials(Credentials sourceCredentials, Credentials tapSchemaCredentials) { @@ -45,6 +47,13 @@ public class SeparatedCredentials extends TapCredentials { this.tapSchemaCredentials = tapSchemaCredentials; } + // Copy constructor + public SeparatedCredentials(SeparatedCredentials separatedCredentials) { + super(separatedCredentials); + this.sourceCredentials = new Credentials(separatedCredentials.getSourceCredentials()); + this.tapSchemaCredentials = new Credentials(separatedCredentials.getTapSchemaCredentials()); + } + @XmlElement(name = "source-credentials") public Credentials getSourceCredentials() { return sourceCredentials; 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 f4c8c1a..2924a81 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,16 @@ public abstract class TapCredentials implements Serializable { private String tapSchemaVersion; private boolean hasObscore; + public TapCredentials() { + } + + // Copy constructor + public TapCredentials(TapCredentials tapCredentials) { + this.tapSchemaName = tapCredentials.getTapSchemaName(); + this.tapSchemaVersion = tapCredentials.getTapSchemaVersion(); + this.hasObscore = tapCredentials.isHasObscore(); + } + @XmlElement(name = "tap_schema_name") public String getTapSchemaName() { return tapSchemaName; diff --git a/TASMAN-webapp/src/main/webapp/credentialsEditing.xhtml b/TASMAN-webapp/src/main/webapp/credentialsEditing.xhtml index 77a80cc..fe29f2c 100644 --- a/TASMAN-webapp/src/main/webapp/credentialsEditing.xhtml +++ b/TASMAN-webapp/src/main/webapp/credentialsEditing.xhtml @@ -4,7 +4,8 @@ xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" - xmlns:tsm_components="http://xmlns.jcp.org/jsf/composite/tsm_components"> + xmlns:tsm_components="http://xmlns.jcp.org/jsf/composite/tsm_components" + xmlns:ia2="http://ia2.inaf.it/component"> <ui:define name="title">TASMAN - Credentials insertion page</ui:define> <ui:define name="scripts"> <h:outputScript library="js" name="credentials.js"></h:outputScript> @@ -41,7 +42,7 @@ (${c.databaseType eq 'MYSQL' ? 'MySQL' : 'Postgres'}) ${c.hostname}:${c.port} ${c.username} </div> <div class="col-xs-2 text-right"> - <h:commandLink action="#{credentialsInsertion.loginWithSingleCredentials(c)}" title="Login" immediate="true"> + <h:commandLink action="#{credentialsInsertion.loginWithJoinedCredentials(c)}" title="Login" immediate="true"> <span class="glyphicon glyphicon-log-in"></span> </h:commandLink> </div> @@ -83,7 +84,7 @@ </div> </h:panelGroup> - <div class="modal fade" tabindex="-1" role="dialog" id="credentials-modal"> + <ia2:modal id="credentials-modal" visibility-status="#{credentialsInsertion.credentialsDialogStatus}"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> @@ -92,127 +93,151 @@ </div> <h:panelGroup id="credentials-modal-body" layout="block" class="modal-body"> - <div class="panel panel-primary"> - <h:panelGroup id="source_credentials_title" layout="block" class="panel-heading#{credentialsInsertion.separateCredentials ? '' : ' hide'}"> - <h3 class="panel-title">Source credentials</h3> - </h:panelGroup> - <div class="panel-body"> - <h:panelGroup layout="block" class="form-horizontal" id="source_credentials"> - <div class="form-group"> - <h:outputLabel for="source_dbtype" class="col-sm-2 control-label">Database type</h:outputLabel> - <div class="col-sm-10"> - <h:selectOneMenu id="source_dbtype" value="#{credentialsInsertion.sourceCredentials.databaseType}" class="form-control"> - <f:selectItem itemValue="MYSQL" itemLabel="MySQL" /> - <f:selectItem itemValue="POSTGRES" itemLabel="Postgres" /> - <f:ajax execute="@this" render=":main:source_credentials" listener="#{credentialsInsertion.sourceCredentials.setDefaults()}" /> - </h:selectOneMenu> - </div> - </div> - <div class="form-group"> - <h:outputLabel for="source_hostname" class="col-sm-2 control-label">Hostname</h:outputLabel> - <div class="col-sm-10"> - <h:inputText id="source_hostname" value="#{credentialsInsertion.sourceCredentials.hostname}" class="form-control" required="#{credentialsInsertion.credentialsDialogOpened}" requiredMessage="Hostname is required"/> - <h:message for="source_hostname" class="text-danger" /> - </div> - </div> - <div class="form-group"> - <h:outputLabel for="source_port" class="col-sm-2 control-label">Port</h:outputLabel> - <div class="col-sm-10"> - <h:inputText id="source_port" value="#{credentialsInsertion.sourceCredentials.port}" class="form-control" required="#{credentialsInsertion.credentialsDialogOpened}" requiredMessage="Port is required"/> - <h:message for="source_port" class="text-danger" /> - </div> + <h:panelGroup class="row" layout="block" id="credentials_panels_wrapper"> + <div class="#{credentialsInsertion.separateCredentials ? 'col-xs-6':'col-xs-12'}"> + <div class="panel panel-primary"> + <div class="panel-heading#{credentialsInsertion.separateCredentials ? '' : ' hide'}"> + <h3 class="panel-title">Source credentials</h3> </div> - <div class="form-group"> - <h:outputLabel for="source_username" class="col-sm-2 control-label">Username</h:outputLabel> - <div class="col-sm-10"> - <h:inputText id="source_username" value="#{credentialsInsertion.sourceCredentials.username}" required="#{credentialsInsertion.credentialsDialogOpened}" class="form-control" requiredMessage="Username is required"/> - <h:message for="source_username" class="text-danger" /> - </div> + <div class="panel-body"> + <h:panelGroup layout="block" class="form-horizontal" id="source_credentials"> + <div class="form-group"> + <h:outputLabel for="source_dbtype" class="#{credentialsInsertion.separateCredentials ? 'col-xs-4': 'col-xs-3'} control-label">Database type</h:outputLabel> + <div class="#{credentialsInsertion.separateCredentials ? 'col-xs-8': 'col-xs-9'}"> + <h:selectOneMenu id="source_dbtype" value="#{credentialsInsertion.sourceCredentials.databaseType}" class="form-control"> + <f:selectItem itemValue="MYSQL" itemLabel="MySQL" /> + <f:selectItem itemValue="POSTGRES" itemLabel="Postgres" /> + <f:ajax execute="@this" render=":main:source_credentials" listener="#{credentialsInsertion.sourceCredentials.setDefaults()}" /> + </h:selectOneMenu> + </div> + </div> + <div class="form-group"> + <h:outputLabel for="source_hostname" class="#{credentialsInsertion.separateCredentials ? 'col-xs-4': 'col-xs-3'} control-label">Hostname</h:outputLabel> + <div class="#{credentialsInsertion.separateCredentials ? 'col-xs-8': 'col-xs-9'}"> + <h:inputText id="source_hostname" value="#{credentialsInsertion.sourceCredentials.hostname}" class="form-control" required="#{credentialsInsertion.credentialsDialogOpened}" requiredMessage="Hostname is required"/> + <h:message for="source_hostname" class="text-danger" /> + </div> + </div> + <div class="form-group"> + <h:outputLabel for="source_port" class="#{credentialsInsertion.separateCredentials ? 'col-xs-4': 'col-xs-3'} control-label">Port</h:outputLabel> + <div class="#{credentialsInsertion.separateCredentials ? 'col-xs-8': 'col-xs-9'}"> + <h:inputText id="source_port" value="#{credentialsInsertion.sourceCredentials.port}" class="form-control" required="#{credentialsInsertion.credentialsDialogOpened}" requiredMessage="Port is required"/> + <h:message for="source_port" class="text-danger" /> + </div> + </div> + <div class="form-group"> + <h:outputLabel for="source_username" class="#{credentialsInsertion.separateCredentials ? 'col-xs-4': 'col-xs-3'} control-label">Username</h:outputLabel> + <div class="#{credentialsInsertion.separateCredentials ? 'col-xs-8': 'col-xs-9'}"> + <h:inputText id="source_username" value="#{credentialsInsertion.sourceCredentials.username}" required="#{credentialsInsertion.credentialsDialogOpened}" class="form-control" requiredMessage="Username is required"/> + <h:message for="source_username" class="text-danger" /> + </div> + </div> + <div class="form-group"> + <h:outputLabel for="source_password" class="#{credentialsInsertion.separateCredentials ? 'col-xs-4': 'col-xs-3'} control-label">Password</h:outputLabel> + <div class="#{credentialsInsertion.separateCredentials ? 'col-xs-8': 'col-xs-9'}"> + <h:inputSecret id="source_password" value="#{credentialsInsertion.sourceCredentials.password}" class="form-control" redisplay="true" /> + <h:message for="source_password" class="text-danger" /> + </div> + </div> + <h:panelGroup class="form-group" layout="block" rendered="#{credentialsInsertion.sourceCredentials.databaseType eq 'POSTGRES'}"> + <h:outputLabel for="source_database" class="#{credentialsInsertion.separateCredentials ? 'col-xs-4': 'col-xs-3'} control-label">Database</h:outputLabel> + <div class="#{credentialsInsertion.separateCredentials ? 'col-xs-8': 'col-xs-9'}"> + <h:inputText id="source_database" value="#{credentialsInsertion.sourceCredentials.database}" class="form-control" /> + <h:message for="source_database" class="text-danger" /> + </div> + </h:panelGroup> + </h:panelGroup> </div> - <div class="form-group"> - <h:outputLabel for="source_password" class="col-sm-2 control-label">Password</h:outputLabel> - <div class="col-sm-10"> - <h:inputSecret id="source_password" value="#{credentialsInsertion.sourceCredentials.password}" class="form-control" redisplay="true" /> - <h:message for="source_password" class="text-danger" /> - </div> - </div> - <h:panelGroup class="form-group" layout="block" rendered="#{credentialsInsertion.sourceCredentials.databaseType eq 'POSTGRES'}"> - <h:outputLabel for="source_database" class="col-sm-2 control-label">Database</h:outputLabel> - <div class="col-sm-10"> - <h:inputText id="source_database" value="#{credentialsInsertion.sourceCredentials.database}" class="form-control" /> - <h:message for="source_database" class="text-danger" /> - </div> - </h:panelGroup> - </h:panelGroup> + </div> </div> - </div> - - <div> - <label> - <h:selectBooleanCheckbox value="#{credentialsInsertion.separateCredentials}"> - <f:ajax render="tap_schema_credentials source_credentials_title" execute="@this" /> - </h:selectBooleanCheckbox> - Separate credentials - </label> - </div> - - <h:panelGroup id="tap_schema_credentials"> - <h:panelGroup layout="block" class="panel panel-primary" rendered="#{credentialsInsertion.separateCredentials}"> - <h:panelGroup layout="block" class="panel-heading" rendered="#{credentialsInsertion.separateCredentials}"> - <h3 class="panel-title">TAP_SCHEMA credentials</h3> - </h:panelGroup> - <div class="panel-body"> - <div class="form-horizontal"> - <div class="form-group"> - <h:outputLabel for="tap_schema_dbtype" class="col-sm-2 control-label">Database type</h:outputLabel> - <div class="col-sm-10"> - <h:selectOneMenu id="tap_schema_dbtype" value="#{credentialsInsertion.tapSchemaCredentials.databaseType}" class="form-control"> - <f:selectItem itemValue="MYSQL" itemLabel="MySQL" /> - <f:selectItem itemValue="POSTGRES" itemLabel="Postgres" /> - <f:ajax execute="@this" render=":main:tap_schema_credentials" listener="#{credentialsInsertion.tapSchemaCredentials.setDefaults()}" /> - </h:selectOneMenu> + <div class="#{credentialsInsertion.separateCredentials ? 'col-xs-6':'col-xs-12'}"> + <h:panelGroup layout="block" class="panel panel-primary" rendered="#{credentialsInsertion.separateCredentials}"> + <h:panelGroup layout="block" class="panel-heading" rendered="#{credentialsInsertion.separateCredentials}"> + <h3 class="panel-title">TAP_SCHEMA credentials</h3> + </h:panelGroup> + <div class="panel-body"> + <div class="form-horizontal"> + <div class="form-group"> + <h:outputLabel for="tap_schema_dbtype" class="#{credentialsInsertion.separateCredentials ? 'col-xs-4': 'col-xs-3'} control-label">Database type</h:outputLabel> + <div class="#{credentialsInsertion.separateCredentials ? 'col-xs-8': 'col-xs-9'}"> + <h:selectOneMenu id="tap_schema_dbtype" value="#{credentialsInsertion.tapSchemaCredentials.databaseType}" class="form-control"> + <f:selectItem itemValue="MYSQL" itemLabel="MySQL" /> + <f:selectItem itemValue="POSTGRES" itemLabel="Postgres" /> + <f:ajax execute="@this" render=":main:credentials_panels_wrapper" listener="#{credentialsInsertion.tapSchemaCredentials.setDefaults()}" /> + </h:selectOneMenu> + </div> </div> - </div> - <div class="form-group"> - <h:outputLabel for="tap_schema_hostname" class="col-sm-2 control-label">Hostname</h:outputLabel> - <div class="col-sm-10"> - <h:inputText id="tap_schema_hostname" value="#{credentialsInsertion.tapSchemaCredentials.hostname}" required="#{credentialsInsertion.credentialsDialogOpened}" class="form-control" requiredMessage="Hostname is required"/> - <h:message for="tap_schema_hostname" class="text-danger" /> + <div class="form-group"> + <h:outputLabel for="tap_schema_hostname" class="#{credentialsInsertion.separateCredentials ? 'col-xs-4': 'col-xs-3'} control-label">Hostname</h:outputLabel> + <div class="#{credentialsInsertion.separateCredentials ? 'col-xs-8': 'col-xs-9'}"> + <h:inputText id="tap_schema_hostname" value="#{credentialsInsertion.tapSchemaCredentials.hostname}" required="#{credentialsInsertion.credentialsDialogOpened}" class="form-control" requiredMessage="Hostname is required"/> + <h:message for="tap_schema_hostname" class="text-danger" /> + </div> </div> - </div> - <div class="form-group"> - <h:outputLabel for="tap_schema_port" class="col-sm-2 control-label">Port</h:outputLabel> - <div class="col-sm-10"> - <h:inputText id="tap_schema_port" value="#{credentialsInsertion.tapSchemaCredentials.port}" required="#{credentialsInsertion.credentialsDialogOpened}" class="form-control" requiredMessage="Port is required"/> - <h:message for="tap_schema_port" class="text-danger" /> + <div class="form-group"> + <h:outputLabel for="tap_schema_port" class="#{credentialsInsertion.separateCredentials ? 'col-xs-4': 'col-xs-3'} control-label">Port</h:outputLabel> + <div class="#{credentialsInsertion.separateCredentials ? 'col-xs-8': 'col-xs-9'}"> + <h:inputText id="tap_schema_port" value="#{credentialsInsertion.tapSchemaCredentials.port}" required="#{credentialsInsertion.credentialsDialogOpened}" class="form-control" requiredMessage="Port is required"/> + <h:message for="tap_schema_port" class="text-danger" /> + </div> </div> - </div> - <div class="form-group"> - <h:outputLabel for="tap_schema_username" class="col-sm-2 control-label">Username</h:outputLabel> - <div class="col-sm-10"> - <h:inputText id="tap_schema_username" value="#{credentialsInsertion.tapSchemaCredentials.username}" required="#{credentialsInsertion.credentialsDialogOpened}" class="form-control" requiredMessage="Username is required"/> - <h:message for="tap_schema_username" class="text-danger" /> + <div class="form-group"> + <h:outputLabel for="tap_schema_username" class="#{credentialsInsertion.separateCredentials ? 'col-xs-4': 'col-xs-3'} control-label">Username</h:outputLabel> + <div class="#{credentialsInsertion.separateCredentials ? 'col-xs-8': 'col-xs-9'}"> + <h:inputText id="tap_schema_username" value="#{credentialsInsertion.tapSchemaCredentials.username}" required="#{credentialsInsertion.credentialsDialogOpened}" class="form-control" requiredMessage="Username is required"/> + <h:message for="tap_schema_username" class="text-danger" /> + </div> </div> - </div> - <div class="form-group"> - <h:outputLabel for="tap_schema_password" class="col-sm-2 control-label">Password</h:outputLabel> - <div class="col-sm-10"> - <h:inputSecret id="tap_schema_password" value="#{credentialsInsertion.tapSchemaCredentials.password}" class="form-control" redisplay="true" /> - <h:message for="tap_schema_password" class="text-danger" /> + <div class="form-group"> + <h:outputLabel for="tap_schema_password" class="#{credentialsInsertion.separateCredentials ? 'col-xs-4': 'col-xs-3'} control-label">Password</h:outputLabel> + <div class="#{credentialsInsertion.separateCredentials ? 'col-xs-8': 'col-xs-9'}"> + <h:inputSecret id="tap_schema_password" value="#{credentialsInsertion.tapSchemaCredentials.password}" class="form-control" redisplay="true" /> + <h:message for="tap_schema_password" class="text-danger" /> + </div> </div> + <h:panelGroup class="form-group" layout="block" rendered="#{credentialsInsertion.tapSchemaCredentials.databaseType eq 'POSTGRES'}"> + <h:outputLabel for="tap_schema_database" class="#{credentialsInsertion.separateCredentials ? 'col-xs-4': 'col-xs-3'} control-label">Database</h:outputLabel> + <div class="#{credentialsInsertion.separateCredentials ? 'col-xs-8': 'col-xs-9'}"> + <h:inputText id="tap_schema_database" value="#{credentialsInsertion.tapSchemaCredentials.database}" class="form-control" /> + <h:message for="tap_schema_database" class="text-danger" /> + </div> + </h:panelGroup> </div> - <h:panelGroup class="form-group" layout="block" rendered="#{credentialsInsertion.tapSchemaCredentials.databaseType eq 'POSTGRES'}"> - <h:outputLabel for="tap_schema_database" class="col-sm-2 control-label">Database</h:outputLabel> - <div class="col-sm-10"> - <h:inputText id="tap_schema_database" value="#{credentialsInsertion.tapSchemaCredentials.database}" class="form-control" /> - <h:message for="tap_schema_database" class="text-danger" /> - </div> - </h:panelGroup> </div> - </div> - </h:panelGroup> + </h:panelGroup> + </div> </h:panelGroup> + <div class="form-horizontal"> + <div class="form-group"> + <label class="col-xs-6 col-xs-offset-4"> + <h:selectBooleanCheckbox value="#{credentialsInsertion.separateCredentials}" id="separate-credentials"> + <f:ajax render="credentials_panels_wrapper" execute="@this" onevent="credentials.separateCredentialsChanged" /> + </h:selectBooleanCheckbox> + Separate credentials + </label> + </div> + <div class="form-group"> + <h:outputLabel for="tap_schema_name" class="control-label col-xs-4">TAP_SCHEMA name</h:outputLabel> + <div class="col-xs-6"> + <h:inputText value="#{credentialsInsertion.tapSchemaName}" class="form-control" /> + </div> + </div> + <div class="form-group"> + <h:outputLabel for="tap_schema_name" class="control-label col-xs-4">TAP_SCHEMA version</h:outputLabel> + <div class="col-xs-6"> + <h:selectOneMenu value="#{credentialsInsertion.tapSchemaVersion}" class="form-control"> + <f:selectItems value="#{credentialsInsertion.tapSchemaVersions}" var="version" itemLabel="#{version}" itemDescription="#{version}" /> + </h:selectOneMenu> + </div> + </div> + <div class="form-group"> + <label class="col-xs-6 col-xs-offset-4"> + <h:selectBooleanCheckbox value="#{credentialsInsertion.hasObscore}" id="has-obscore" /> + Has obscore + </label> + </div> + </div> </h:panelGroup> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> @@ -223,7 +248,7 @@ </div> </div> </div> - </div> + </ia2:modal> <tsm_components:ucd_editor id="ucd-editor" /> </div> diff --git a/TASMAN-webapp/src/main/webapp/resources/js/credentials.js b/TASMAN-webapp/src/main/webapp/resources/js/credentials.js index 068ce33..5fb483c 100644 --- a/TASMAN-webapp/src/main/webapp/resources/js/credentials.js +++ b/TASMAN-webapp/src/main/webapp/resources/js/credentials.js @@ -1,29 +1,42 @@ (function () { + function checkSeparateCredentials() { + var separateCredentials = $('#main\\:separate-credentials').is(':checked'); + $('#main\\:credentials-modal .modal-dialog').toggleClass('modal-lg', separateCredentials); + } + window.credentials = { editClicked: function (event) { if (event.status === 'success') { - $('#credentials-modal').modal('show'); + $('#main\\:credentials-modal').modal('show'); } }, credentialsSaved: function (event) { if (event.status === 'success') { - if ($('#credentials-modal .text-danger').length === 0) { - $('#credentials-modal').modal('hide'); + if ($('#main\\:credentials-modal .text-danger').length === 0) { + $('#main\\:credentials-modal').modal('hide'); } } + }, + separateCredentialsChanged: function (event) { + if (event.status === 'success') { + checkSeparateCredentials(); + } } }; $(document).ready(function () { - $('body').on('shown.bs.modal', '#credentials-modal', function ( ) { - $.post(TSM.getRestPath("credentialsDialog?opened=true")); - }); - $('body').on('hidden.bs.modal', '#credentials-modal', function ( ) { - $.post(TSM.getRestPath("credentialsDialog?opened=false")); + $('body').on('show.bs.modal', '#main\\:credentials-modal', function ( ) { + checkSeparateCredentials(); }); +// $('body').on('shown.bs.modal', '#main\\:credentials-modal', function ( ) { +// $.post(TSM.getRestPath("credentialsDialog?opened=true")); +// }); +// $('body').on('hidden.bs.modal', '#main\\:credentials-modal', function ( ) { +// $.post(TSM.getRestPath("credentialsDialog?opened=false")); +// }); - $('body').on('keyup', '#credentials-modal input', function (event) { + $('body').on('keyup', '#main\\:credentials-modal input', function (event) { if (event.keyCode === 13) { $('#main\\:save-credentials').click(); event.preventDefault(); -- GitLab