diff --git a/src/main/java/org/gcube/portlets/user/databasesmanager/client/GWTdbManagerService.java b/src/main/java/org/gcube/portlets/user/databasesmanager/client/GWTdbManagerService.java index 6369457..df534b5 100644 --- a/src/main/java/org/gcube/portlets/user/databasesmanager/client/GWTdbManagerService.java +++ b/src/main/java/org/gcube/portlets/user/databasesmanager/client/GWTdbManagerService.java @@ -37,5 +37,8 @@ public interface GWTdbManagerService extends RemoteService { List parseCVSString(List result, List attrNames) throws Exception; + + LinkedHashMap getTableDetails(LinkedHashMap dataInput) throws Exception; + } diff --git a/src/main/java/org/gcube/portlets/user/databasesmanager/client/GWTdbManagerServiceAsync.java b/src/main/java/org/gcube/portlets/user/databasesmanager/client/GWTdbManagerServiceAsync.java index f4a7483..59a58ae 100644 --- a/src/main/java/org/gcube/portlets/user/databasesmanager/client/GWTdbManagerServiceAsync.java +++ b/src/main/java/org/gcube/portlets/user/databasesmanager/client/GWTdbManagerServiceAsync.java @@ -36,4 +36,7 @@ public interface GWTdbManagerServiceAsync { void sample(LinkedHashMap dataInput, AsyncCallback> callback); + void getTableDetails(LinkedHashMap dataInput, + AsyncCallback> callback); + } diff --git a/src/main/java/org/gcube/portlets/user/databasesmanager/client/datamodel/FileModel.java b/src/main/java/org/gcube/portlets/user/databasesmanager/client/datamodel/FileModel.java index ccc77a7..a7313f9 100644 --- a/src/main/java/org/gcube/portlets/user/databasesmanager/client/datamodel/FileModel.java +++ b/src/main/java/org/gcube/portlets/user/databasesmanager/client/datamodel/FileModel.java @@ -20,6 +20,8 @@ public class FileModel extends BaseModelData implements Serializable { private List DBInfo = null; private boolean isDBInfoDisplayed = false; + private List TableDetails = null; + private boolean isTableDetailsDisplayed = false; public FileModel() { setId(); @@ -108,6 +110,14 @@ public class FileModel extends BaseModelData implements Serializable { public List getDBInfo() { return DBInfo; } + + public void setTableDetails(List data) { + TableDetails = data; + } + + public List getTableDetails() { + return TableDetails; + } public void setIsDBInfoDisplayed(boolean value) { isDBInfoDisplayed = value; @@ -116,6 +126,14 @@ public class FileModel extends BaseModelData implements Serializable { public boolean isDBInfoDisplayed() { return isDBInfoDisplayed; } + + public void setTableDetailsDisplayed(boolean value) { + isTableDetailsDisplayed = value; + } + + public boolean isTableDetailsDisplayed() { + return isTableDetailsDisplayed; + } @Override public boolean equals(Object obj) { diff --git a/src/main/java/org/gcube/portlets/user/databasesmanager/client/events/ShowCreateTableEvent.java b/src/main/java/org/gcube/portlets/user/databasesmanager/client/events/ShowCreateTableEvent.java new file mode 100644 index 0000000..a9282be --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/databasesmanager/client/events/ShowCreateTableEvent.java @@ -0,0 +1,31 @@ +package org.gcube.portlets.user.databasesmanager.client.events; + +import org.gcube.portlets.user.databasesmanager.client.events.interfaces.ShowCreateTableEventHandler; + +import com.google.gwt.event.shared.GwtEvent; + +public class ShowCreateTableEvent extends GwtEvent { + + public static Type TYPE = new Type(); + + @Override + protected void dispatch(ShowCreateTableEventHandler handler) { + // TODO Auto-generated method stub + + handler.onShowCreateTable(this); + + } + + @Override + public Type getAssociatedType() { + // TODO Auto-generated method stub + return TYPE; + } + + public EventsTypeEnum getKey() { + + // TODO Auto-generated method stub + return EventsTypeEnum.SHOW_CREATE_TABLE_EVENT; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/databasesmanager/client/events/interfaces/ShowCreateTableEventHandler.java b/src/main/java/org/gcube/portlets/user/databasesmanager/client/events/interfaces/ShowCreateTableEventHandler.java new file mode 100644 index 0000000..cae7eee --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/databasesmanager/client/events/interfaces/ShowCreateTableEventHandler.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.user.databasesmanager.client.events.interfaces; + + +import org.gcube.portlets.user.databasesmanager.client.events.ShowCreateTableEvent; + +import com.google.gwt.event.shared.EventHandler; + +public interface ShowCreateTableEventHandler extends EventHandler{ + public void onShowCreateTable(ShowCreateTableEvent showCreateTableEvent); + +} diff --git a/src/main/java/org/gcube/portlets/user/databasesmanager/client/panels/GxtBorderLayoutPanel.java b/src/main/java/org/gcube/portlets/user/databasesmanager/client/panels/GxtBorderLayoutPanel.java index 5ea9e08..3a0d05b 100644 --- a/src/main/java/org/gcube/portlets/user/databasesmanager/client/panels/GxtBorderLayoutPanel.java +++ b/src/main/java/org/gcube/portlets/user/databasesmanager/client/panels/GxtBorderLayoutPanel.java @@ -3,6 +3,7 @@ package org.gcube.portlets.user.databasesmanager.client.panels; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; @@ -13,9 +14,11 @@ import org.gcube.portlets.user.databasesmanager.client.datamodel.Row; import org.gcube.portlets.user.databasesmanager.client.datamodel.SubmitQueryData; import org.gcube.portlets.user.databasesmanager.client.events.SamplingEvent; import org.gcube.portlets.user.databasesmanager.client.events.SelectedItemEvent; +import org.gcube.portlets.user.databasesmanager.client.events.ShowCreateTableEvent; import org.gcube.portlets.user.databasesmanager.client.events.SubmitQueryEvent; import org.gcube.portlets.user.databasesmanager.client.events.interfaces.SamplingEventHandler; import org.gcube.portlets.user.databasesmanager.client.events.interfaces.SelectedItemEventHandler; +import org.gcube.portlets.user.databasesmanager.client.events.interfaces.ShowCreateTableEventHandler; import org.gcube.portlets.user.databasesmanager.client.events.interfaces.SubmitQueryEventHandler; import org.gcube.portlets.user.databasesmanager.client.toolbar.GxtToolbarFunctionality; import org.gcube.portlets.user.databasesmanager.client.utils.ConstantsPortlet; @@ -40,8 +43,11 @@ import com.extjs.gxt.ui.client.widget.ContentPanel; import com.extjs.gxt.ui.client.widget.Dialog; import com.extjs.gxt.ui.client.widget.LayoutContainer; import com.extjs.gxt.ui.client.widget.MessageBox; +import com.extjs.gxt.ui.client.widget.form.TextField; +import com.extjs.gxt.ui.client.widget.grid.CellEditor; import com.extjs.gxt.ui.client.widget.grid.ColumnConfig; import com.extjs.gxt.ui.client.widget.grid.ColumnModel; +import com.extjs.gxt.ui.client.widget.grid.EditorGrid; import com.extjs.gxt.ui.client.widget.grid.Grid; import com.extjs.gxt.ui.client.widget.layout.BorderLayout; import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData; @@ -99,8 +105,6 @@ public class GxtBorderLayoutPanel extends ContentPanel { } private void initLayout() { - - north.setLayout(new FitLayout()); north.setTopComponent(toolbar.getToolBar()); @@ -160,7 +164,7 @@ public class GxtBorderLayoutPanel extends ContentPanel { centerBottom = new ContentPanel(); centerBottom.setLayout(new FitLayout()); centerBottom.setHeading("Information Details"); - centerBottom.setScrollMode(Scroll.AUTO); + centerBottom.setScrollMode(Scroll.NONE); BorderLayoutData centerUpperData = new BorderLayoutData( LayoutRegion.NORTH, 250, 100, 250); @@ -310,20 +314,29 @@ public class GxtBorderLayoutPanel extends ContentPanel { }); eventBus.addHandler(SamplingEvent.TYPE, new SamplingEventHandler() { - - @Override public void onSampling(SamplingEvent samplingEvent) { // TODO Auto-generated method stub sample(); - - } }); + eventBus.addHandler(ShowCreateTableEvent.TYPE, + new ShowCreateTableEventHandler() { + + @Override + public void onShowCreateTable( + ShowCreateTableEvent showCreateTableEvent) { + // TODO Auto-generated method stub + + getTableDetails(); + + } + }); + } private void submitQuery() { @@ -507,7 +520,7 @@ public class GxtBorderLayoutPanel extends ContentPanel { } private void sample() { - + this.mask("Loading", "x-mask-loading"); // System.out.println("Start RPC - submitQuery"); @@ -571,7 +584,7 @@ public class GxtBorderLayoutPanel extends ContentPanel { @Override public void onFailure(Throwable caught) { -// Window.alert(caught.getMessage()); + // Window.alert(caught.getMessage()); // System.out.println("FAILURE"); rootLogger.log(Level.SEVERE, "FAILURE RPC sample"); @@ -584,8 +597,6 @@ public class GxtBorderLayoutPanel extends ContentPanel { public void onSuccess(List result) { rootLogger.log(Level.SEVERE, "SUCCESS RPC sample"); - - rows = new ArrayList(); @@ -610,8 +621,8 @@ public class GxtBorderLayoutPanel extends ContentPanel { // start the parsing of the submit result in order to obtain a table private void parseResult(List result) { - - if (this.isMasked()){ + + if (this.isMasked()) { this.unmask(); } @@ -631,8 +642,6 @@ public class GxtBorderLayoutPanel extends ContentPanel { @Override public void onSuccess(List rows) { - - // System.out.println("Success StartParse"); @@ -646,67 +655,64 @@ public class GxtBorderLayoutPanel extends ContentPanel { form.unmask(); form.hide(); - - - } - - -// else { + } - if (rows != null) { + // else { - // Dialog form = toolbar.getDialogForm(); - // - // if (form.isMasked()) - // form.unmask(); - // - // form.hide(); + if (rows != null) { - // Display the submit query result as a table - Dialog submitResult = new Dialog(); - submitResult.setLayout(new FitLayout()); - submitResult.setHeading("Result"); + // Dialog form = toolbar.getDialogForm(); + // + // if (form.isMasked()) + // form.unmask(); + // + // form.hide(); - submitResult.setResizable(false); - // submitResult.setHeading("Submit Query"); - // submitResult.setWidth(290); - // submitResult.setHeight(250); + // Display the submit query result as a table + Dialog submitResult = new Dialog(); + submitResult.setLayout(new FitLayout()); + submitResult.setHeading("Result"); - submitResult.setModal(true); - submitResult.setBlinkModal(true); + submitResult.setResizable(false); + // submitResult.setHeading("Submit Query"); + // submitResult.setWidth(290); + // submitResult.setHeight(250); - // submitResult.setBodyStyle("padding:9px;"); - submitResult.setSize(600, 400); - // submitResult.setScrollMode(Scroll.AUTO); - submitResult.setScrollMode(Scroll.NONE); - submitResult.setHideOnButtonClick(true); + submitResult.setModal(true); + submitResult.setBlinkModal(true); - submitResult.setMaximizable(true); - // submitResult.addText("Result Table"); + // submitResult.setBodyStyle("padding:9px;"); + submitResult.setSize(600, 400); + // submitResult.setScrollMode(Scroll.AUTO); + submitResult.setScrollMode(Scroll.NONE); + submitResult.setHideOnButtonClick(true); - ListStore store = new ListStore(); - store.add(rows); + submitResult.setMaximizable(true); + // submitResult.addText("Result Table"); - Grid grid; + ListStore store = new ListStore(); + store.add(rows); - grid = new Grid(store, createColumnModel()); + Grid grid; - // grid.setAutoExpandColumn("value"); - grid.setBorders(true); + grid = new Grid(store, createColumnModel()); - // grid.setAutoWidth(true); + // grid.setAutoExpandColumn("value"); + grid.setBorders(true); - RowData data = new RowData(.5, 1); - data.setMargins(new Margins(6)); + // grid.setAutoWidth(true); - submitResult.add(grid, data); + RowData data = new RowData(.5, 1); + data.setMargins(new Margins(6)); - submitResult.show(); + submitResult.add(grid, data); + + submitResult.show(); + + } + // } - } -// } - } }); @@ -776,6 +782,7 @@ public class GxtBorderLayoutPanel extends ContentPanel { column.setHeader("Index"); column.setWidth(100); column.setSortable(false); + configs.add(column); @@ -831,13 +838,20 @@ public class GxtBorderLayoutPanel extends ContentPanel { } private ColumnModel createColumnModelForDBInfo(List result) { + List configs = new ArrayList(); ColumnConfig column = new ColumnConfig(); column.setId("index"); column.setHeader("Property"); column.setWidth(100); - column.setSortable(false); +// column1.setSortable(false); + + TextField textProperty = new TextField(); +// text.setAllowBlank(false); + column.setEditor(new CellEditor(textProperty)); + + configs.add(column); @@ -845,8 +859,12 @@ public class GxtBorderLayoutPanel extends ContentPanel { column.setId("value"); column.setHeader("Value"); column.setWidth(600); - - column.setSortable(false); + +// column2.setSortable(false); + + TextField textValue = new TextField(); +// text.setAllowBlank(false); + column.setEditor(new CellEditor(textValue)); configs.add(column); @@ -873,22 +891,226 @@ public class GxtBorderLayoutPanel extends ContentPanel { ListStore store = new ListStore(); store.add(dataDB); - Grid grid = new Grid(store, - createColumnModelForDBInfo(dataDB)); +// Grid grid = new Grid(store, +// createColumnModelForDBInfo(dataDB)); + + EditorGrid grid = new EditorGrid(store, + createColumnModelForDBInfo(dataDB)); // grid.setAutoExpandColumn("name"); grid.setBorders(true); // grid.setAutoWidth(true); - RowData data = new RowData(.5, 1); - data.setMargins(new Margins(6)); +// RowData data = new RowData(.5, 1); +// data.setMargins(new Margins(6)); centerUpper.removeAll(); - centerUpper.add(grid, data); +// centerUpper.add(grid, data); + + centerUpper.add(grid); centerUpper.layout(true); } + private void getTableDetails() { + + this.mask("Loading", "x-mask-loading"); + + // System.out.println("Start RPC - submitQuery"); + + rootLogger.log(Level.SEVERE, "Start RPC - getTableDetails"); + + // get the selected table + + List data = treePanel.getTreePanel().getSelectionModel() + .getSelectedItems(); + + // the selected item is a table + final FileModel selectedTable = data.get(0); + + rootLogger.log(Level.INFO, "the selected table is: " + selectedTable); + + // recover data inputs + + LinkedHashMap dataInput = new LinkedHashMap(); + + // check if the table has an associated schema + FileModel schema; + FileModel database; + FileModel resource; + + if (treePanel.getTreeStore().getParent(selectedTable).isSchema()) { + schema = treePanel.getTreeStore().getParent(selectedTable); + database = treePanel.getTreeStore().getParent(schema); + resource = treePanel.getTreeStore().getParent(database); + + dataInput.put("ResourceName", resource.getName()); + dataInput.put("DatabaseName", database.getName()); + dataInput.put("SchemaName", schema.getName()); + dataInput.put("TableName", selectedTable.getName()); + + rootLogger.log(Level.INFO, "ResourceName: " + resource.getName()); + rootLogger.log(Level.INFO, "DatabaseName: " + database.getName()); + rootLogger.log(Level.INFO, "SchemaName: " + schema.getName()); + rootLogger + .log(Level.INFO, "SchemaName: " + selectedTable.getName()); + + } else { + // the table has not a schema + database = treePanel.getTreeStore().getParent(selectedTable); + resource = treePanel.getTreeStore().getParent(database); + + dataInput.put("ResourceName", resource.getName()); + dataInput.put("DatabaseName", database.getName()); + dataInput.put("SchemaName", ""); + dataInput.put("TableName", selectedTable.getName()); + + rootLogger.log(Level.INFO, "ResourceName: " + resource.getName()); + rootLogger.log(Level.INFO, "DatabaseName: " + database.getName()); + rootLogger.log(Level.INFO, "SchemaName: " + ""); + rootLogger + .log(Level.INFO, "SchemaName: " + selectedTable.getName()); + } + + // call remote service + RPCservice.getTableDetails(dataInput, + new AsyncCallback>() { + + @Override + public void onFailure(Throwable caught) { + // TODO Auto-generated method stub + + rootLogger.log(Level.SEVERE, + "FAILURE RPC getTableDetails"); + + MessageBox.alert("Error ", + "
Message:" + caught.getMessage(), null); + + } + + @Override + public void onSuccess( + LinkedHashMap result) { + // TODO Auto-generated method stub + + rootLogger.log(Level.SEVERE, + "SUCCESS RPC getTableDetails"); + + // details are recovered about the selected table + + if (result.size() != 0) { + + // recover keys from the result + + Set keys = result.keySet(); + + Object[] array = keys.toArray(); + + // System.out.println("array size: " + + // array.length); + + // recover details + + List TableDetails = new ArrayList(); + + for (int i = 0; i < result.size(); i++) { + + if (array[i].toString().contains("CreateTable")) { + + // recover the showCreateTable statement + + Result row = new Result("CreateTable", + result.get(array[i].toString()) + .getName()); + + TableDetails.add(row); + + } + + if (array[i].toString() + .contains("Column Names")) { + + // recover the column names + + Result row = new Result("Column Names", + result.get(array[i].toString()) + .getName()); + + TableDetails.add(row); + + } + + if (array[i].toString().contains("NumberRows")) { + + // recover the column names + + Result row = new Result("NumberRows", + result.get(array[i].toString()) + .getName()); + + TableDetails.add(row); + + } + + } + + selectedTable.setTableDetails(TableDetails); + + displayTableDetails(selectedTable); + + } + + } + }); + + } + + private void displayTableDetails(FileModel table) { + + rootLogger.log(Level.INFO, "displaying table details"); + + + + + List tableDetails = table.getTableDetails(); + + // System.out.println("GxtBorderLayout->size info: " + dataDB.size()); + + rootLogger.log(Level.INFO, "details size: " + tableDetails.size()); + + ListStore store = new ListStore(); + + store.add(tableDetails); + +// Grid grid = new Grid(store, +// createColumnModelForDBInfo(tableDetails)); + + EditorGrid grid = new EditorGrid(store, + createColumnModelForDBInfo(tableDetails)); + +// grid.setAutoExpandColumn("name"); + grid.setBorders(true); + + + // grid.setAutoWidth(true); + +// RowData data = new RowData(.5, .1); +// data.setMargins(new Margins(6)); + + centerBottom.removeAll(); + +// centerBottom.add(grid, data); + + centerBottom.add(grid); + centerBottom.layout(true); + + if (this.isMasked()) { + this.unmask(); + } + + + } + } diff --git a/src/main/java/org/gcube/portlets/user/databasesmanager/client/panels/GxtTreePanel.java b/src/main/java/org/gcube/portlets/user/databasesmanager/client/panels/GxtTreePanel.java index 58488cb..8f36aef 100644 --- a/src/main/java/org/gcube/portlets/user/databasesmanager/client/panels/GxtTreePanel.java +++ b/src/main/java/org/gcube/portlets/user/databasesmanager/client/panels/GxtTreePanel.java @@ -670,7 +670,7 @@ public class GxtTreePanel extends LayoutContainer { dataInput.put("DatabaseName", database.getName()); dataInput.put("SchemaName", element.getName()); - System.out.println("schema name: " + element.getName()); +// System.out.println("schema name: " + element.getName()); rootLogger.log(Level.INFO, "ResourceName: " + resource.getName()); rootLogger.log(Level.INFO, "DatabaseName: " + database.getName()); diff --git a/src/main/java/org/gcube/portlets/user/databasesmanager/client/toolbar/GxtToolbarFunctionality.java b/src/main/java/org/gcube/portlets/user/databasesmanager/client/toolbar/GxtToolbarFunctionality.java index 7c3038e..bb8ca11 100644 --- a/src/main/java/org/gcube/portlets/user/databasesmanager/client/toolbar/GxtToolbarFunctionality.java +++ b/src/main/java/org/gcube/portlets/user/databasesmanager/client/toolbar/GxtToolbarFunctionality.java @@ -6,6 +6,7 @@ import java.util.logging.Logger; import org.gcube.portlets.user.databasesmanager.client.GWTdbManagerServiceAsync; import org.gcube.portlets.user.databasesmanager.client.datamodel.SubmitQueryData; import org.gcube.portlets.user.databasesmanager.client.events.SamplingEvent; +import org.gcube.portlets.user.databasesmanager.client.events.ShowCreateTableEvent; import org.gcube.portlets.user.databasesmanager.client.events.SubmitQueryEvent; import org.gcube.portlets.user.databasesmanager.client.form.GxtFormSubmitQuery; import org.gcube.portlets.user.databasesmanager.client.utils.ConstantsPortlet; @@ -333,6 +334,21 @@ public class GxtToolbarFunctionality { } }); + + btnShowCreateTable.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + // TODO Auto-generated method stub + + + + //fire event + + eventBus.fireEvent(new ShowCreateTableEvent()); + + } + }); } public void disableButtonOnToolbar(int infoTreeDepthSelectedItem, diff --git a/src/main/java/org/gcube/portlets/user/databasesmanager/server/GWTdbManagerServiceImpl.java b/src/main/java/org/gcube/portlets/user/databasesmanager/server/GWTdbManagerServiceImpl.java index b15ac23..c2c119c 100644 --- a/src/main/java/org/gcube/portlets/user/databasesmanager/server/GWTdbManagerServiceImpl.java +++ b/src/main/java/org/gcube/portlets/user/databasesmanager/server/GWTdbManagerServiceImpl.java @@ -576,6 +576,98 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements return output; } + + @Override + public LinkedHashMap getTableDetails( + LinkedHashMap dataInput) throws Exception { + // TODO Auto-generated method stub + + List inputParameters = new ArrayList(); + + LinkedHashMap outputParameters = new LinkedHashMap(); + + // get list of algorithms + + List algorithms = new ArrayList(); + + algorithms = getDatabaseManagerAlgorithms(); + + // get algorithmId + + String algorithmId = null; + + for (int i = 0; i < algorithms.size(); i++) { + + if (algorithms.get(i).equals("GETTABLEDETAILS")) { + + algorithmId = algorithms.get(i); + + // System.out.println("algorithmId: " + algorithmId); + + rootLogger.log(Level.SEVERE, "algorithmId: " + algorithmId); + + } + + } + + // get input parameters of the algorithm + + rootLogger.log(Level.SEVERE, "getting input parameters"); + + inputParameters = getParameters(algorithmId); + + for (int i = 0; i < inputParameters.size(); i++) { + + // System.out.println(inputParameters.get(i).getName()); + + rootLogger.log(Level.INFO, inputParameters.get(i).getName()); + + } + + inputParameters.get(0).setValue(dataInput.get("ResourceName")); + inputParameters.get(1).setValue(dataInput.get("DatabaseName")); + inputParameters.get(2).setValue(dataInput.get("SchemaName")); + inputParameters.get(3).setValue(dataInput.get("TableName")); + + // System.out.println("size outputMap pre computation: " + // + outputMap.size()); + + String computationId = startComputation(algorithmId, inputParameters); + + // retrieve data + + // System.out.println("output data retrieved"); + + // System.out.println("size outputMap: " + outputMap.size()); + + rootLogger.log(Level.SEVERE, "output data retrieved"); + rootLogger.log(Level.SEVERE, "output data size: " + outputMap.size()); + + + for (int i = 0; i < outputMap.size(); i++) { + + // outputParameters.add(outputKey.get(String.valueOf(i)) + " " + // + outputMap.get(String.valueOf(i))); + + FileModel obj = new FileModel(outputMap.get(String.valueOf(i))); + + // obj.setIsLoaded(true); + + // outputParameters.add(obj); + + // System.out.println("value: " + outputMap.get(String.valueOf(i))); + + // System.out.println("key: " + outputKey.get(String.valueOf(i))); + + outputParameters.put(outputKey.get(String.valueOf(i)), obj); + + } + + + + return outputParameters; + + } public List parseCVSString(List result, List attrNames) throws Exception {