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 532606b..001e356 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 @@ -16,7 +16,6 @@ import org.gcube.portlets.user.databasesmanager.client.datamodel.SubmitQueryData import org.gcube.portlets.user.databasesmanager.client.datamodel.SubmitQueryResultWithFileFromServlet; import org.gcube.portlets.user.databasesmanager.client.events.LoadTablesEvent; import org.gcube.portlets.user.databasesmanager.client.events.RandomSamplingEvent; -import org.gcube.portlets.user.databasesmanager.client.events.RefreshDataEvent; 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.SelectedTableEvent; @@ -25,7 +24,6 @@ import org.gcube.portlets.user.databasesmanager.client.events.SmartSamplingEvent import org.gcube.portlets.user.databasesmanager.client.events.SubmitQueryEvent; import org.gcube.portlets.user.databasesmanager.client.events.interfaces.LoadTablesEventHandler; import org.gcube.portlets.user.databasesmanager.client.events.interfaces.RandomSamplingEventHandler; -import org.gcube.portlets.user.databasesmanager.client.events.interfaces.RefreshDataEventHandler; 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; @@ -326,15 +324,13 @@ public class GxtBorderLayoutPanel extends ContentPanel { getTableDetails(table); } }); - - eventBus.addHandler(RefreshDataEvent.TYPE, - new RefreshDataEventHandler() { - - @Override - public void onRefreshData(RefreshDataEvent refreshDataEvent) { - - } - }); + +// eventBus.addHandler(RefreshDataEvent.TYPE, +// new RefreshDataEventHandler() { +// @Override +// public void onRefreshData(RefreshDataEvent refreshDataEvent) { +// } +// }); } // method to load the tables list @@ -1368,7 +1364,7 @@ public class GxtBorderLayoutPanel extends ContentPanel { } }); - + } // method that performs the smart sample 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 11dd51b..9d09c7e 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 @@ -343,19 +343,21 @@ public class GxtTreePanel extends LayoutContainer { public void onFailure(Throwable caught) { // Window.alert(caught.getMessage()); rootLogger.log(Level.SEVERE, "FAILURE RPC getResource"); - - if(caught instanceof SessionExpiredException){ + + if (caught instanceof SessionExpiredException) { rootLogger.log(Level.INFO, "Session expired"); CheckSession.showLogoutDialog(); return; - } - + } + MessageBox.alert("Error ", "
Message:" + caught.getMessage(), null); if (tree.isMasked()) { tree.unmask(); } + // in order to enable the refresh cache button + // eventBus.fireEvent(new LoadingTreeFinishedEvent()); } @Override @@ -372,6 +374,8 @@ public class GxtTreePanel extends LayoutContainer { if (tree.isMasked()) tree.unmask(); + // in order to enable the refresh cache button + // eventBus.fireEvent(new LoadingTreeFinishedEvent()); } }); // rootLogger.log(Level.SEVERE, "End RPC - getResource"); @@ -389,13 +393,13 @@ public class GxtTreePanel extends LayoutContainer { public void onFailure(Throwable caught) { // Window.alert(caught.getMessage()); rootLogger.log(Level.SEVERE, "FAILURE RPC getDBInfo"); - - if(caught instanceof SessionExpiredException){ + + if (caught instanceof SessionExpiredException) { rootLogger.log(Level.INFO, "Session expired"); CheckSession.showLogoutDialog(); return; - } - + } + MessageBox.alert("Error ", "
Message:" + caught.getMessage(), null); @@ -514,7 +518,7 @@ public class GxtTreePanel extends LayoutContainer { treePanel.setExpanded(child, false); } if (DatabaseType - .equals(ConstantsPortlet.POSTGRES)){ + .equals(ConstantsPortlet.POSTGRES)) { child.setDatabaseType(ConstantsPortlet.POSTGRES); } children.add(child); @@ -560,13 +564,13 @@ public class GxtTreePanel extends LayoutContainer { public void onFailure(Throwable caught) { // Window.alert(caught.getMessage()); rootLogger.log(Level.SEVERE, "FAILURE RPC getDBSchema"); - - if(caught instanceof SessionExpiredException){ + + if (caught instanceof SessionExpiredException) { rootLogger.log(Level.INFO, "Session expired"); CheckSession.showLogoutDialog(); return; - } - + } + MessageBox.alert("Error ", "
Message:" + caught.getMessage(), null); @@ -729,34 +733,46 @@ public class GxtTreePanel extends LayoutContainer { } else if (Depth == 3) { // database elementType = "database"; String database = selectedItem.getName(); - //get the database type -// String dbType = selectedItem.getDatabaseType(); + // get the database type + // String dbType = selectedItem.getDatabaseType(); FileModel parent = store.getParent(selectedItem); String resource = parent.getName(); - - if (selectedItem.getDatabaseType()!=null && (selectedItem.getDatabaseType().equals(ConstantsPortlet.POSTGRES))){ //refresh schema list and query executed - inputData.put("ResourceName", resource); - inputData.put("DatabaseName", database); + + if (selectedItem.getDatabaseType() != null + && (selectedItem.getDatabaseType() + .equals(ConstantsPortlet.POSTGRES))) { // refresh + // schema + // list and + // query + // executed + inputData.put("ResourceName", resource); + inputData.put("DatabaseName", database); } - if (selectedItem.getDatabaseType()!=null && (selectedItem.getDatabaseType().equals(ConstantsPortlet.MYSQL))){ //refresh tables list, query executed and samplings - inputData.put("ResourceName", resource); - inputData.put("DatabaseName", database); - inputData.put("SchemaName", ""); + if (selectedItem.getDatabaseType() != null + && (selectedItem.getDatabaseType() + .equals(ConstantsPortlet.MYSQL))) { // refresh + // tables list, + // query + // executed and + // samplings + inputData.put("ResourceName", resource); + inputData.put("DatabaseName", database); + inputData.put("SchemaName", ""); } - - - } else if (Depth == 4) { // Schema. Refresh tables list, query executed and samplings + + } else if (Depth == 4) { // Schema. Refresh tables list, query executed + // and samplings elementType = "schema"; String schema = selectedItem.getName(); FileModel db = store.getParent(selectedItem); String database = db.getName(); FileModel rs = store.getParent(db); String resource = rs.getName(); - + inputData.put("ResourceName", resource); inputData.put("DatabaseName", database); inputData.put("SchemaName", schema); - + } final String elemType = elementType; @@ -767,18 +783,22 @@ public class GxtTreePanel extends LayoutContainer { public void onFailure(Throwable caught) { rootLogger.log(Level.SEVERE, "FAILURE refreshDataTree"); - if(caught instanceof SessionExpiredException){ + if (caught instanceof SessionExpiredException) { rootLogger.log(Level.INFO, "Session expired"); CheckSession.showLogoutDialog(); return; - } - + } + MessageBox.alert("Error ", "
Message:" + caught.getMessage(), null); if (tree.isMasked()) { tree.unmask(); } + + // fire an event in order to activate the refresh cache + // button + // eventBus.fireEvent(new RefreshDataFinishedEvent()); } @Override @@ -788,7 +808,7 @@ public class GxtTreePanel extends LayoutContainer { if (result != null) { // remove children - + removeChildren(selectedItem); tree.layout(true); @@ -978,6 +998,9 @@ public class GxtTreePanel extends LayoutContainer { if (tree.isMasked()) { tree.unmask(); } + // fire an event in order to activate the refresh cache + // button + // eventBus.fireEvent(new RefreshDataFinishedEvent()); } }); } 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 03e26c8..3d9a078 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 @@ -74,6 +74,8 @@ public class GxtToolbarFunctionality { // proposed query displayed in the submit query form private String queryForSubmitOperation = "select * from %1$s limit 10"; private boolean isTableSelected = false; + // variable to control the deactivate/activate of the refresh data button + private boolean treeLoaded = false; // Constructor // public GxtToolbarFunctionality(HandlerManager eBus) { @@ -166,7 +168,8 @@ public class GxtToolbarFunctionality { btnSimpleSample.disable(); btnSmartSample.disable(); btnRandomSample.disable(); - btnRefresCachedData.disable(); + // btnRefresCachedData.disable(); + btnRefresCachedData.enable(); } private void addHandler() { @@ -209,6 +212,31 @@ public class GxtToolbarFunctionality { } }); + + // eventBus.addHandler(RefreshDataFinishedEvent.TYPE, + // new RefreshDataFinishedEventHandler() { + // + // @Override + // public void onRefreshDataFinished( + // RefreshDataFinishedEvent refreshDataFinishedEvent) { + // // in order to activate the button + // if (!btnRefresCachedData.isEnabled()) { + // btnRefresCachedData.enable(); + // } + // } + // }); + + // eventBus.addHandler(LoadingTreeFinishedEvent.TYPE, + // new LoadingTreeFinishedEventHandler() { + // @Override + // public void onLoadingTreeFinished( + // LoadingTreeFinishedEvent loadingTreeEvent) { + // treeLoaded = true; + // if (!btnRefresCachedData.isEnabled()) { + // btnRefresCachedData.enable(); + // } + // } + // }); } private void addSelectionListenersOnToolBar() { @@ -418,10 +446,11 @@ public class GxtToolbarFunctionality { public void componentSelected(ButtonEvent ce) { rootLogger.log(Level.INFO, "REFRESH BUTTON"); + // deactivate the button + // btnRefresCachedData.disable(); // fire event eventBus.fireEvent(new RefreshDataEvent()); } - }); } @@ -436,7 +465,11 @@ public class GxtToolbarFunctionality { switch (infoTreeDepthSelectedItem) { case 1: - btnRefresCachedData.enable(); + // if (treeLoaded == true) { + // btnRefresCachedData.enable(); + // } else { + // btnRefresCachedData.disable(); + // } btnTablesList.disable(); btnSubmitQuery.disable(); // btnGetInfo.disable(); diff --git a/src/main/java/org/gcube/portlets/user/databasesmanager/client/utils/ConstantsPortlet.java b/src/main/java/org/gcube/portlets/user/databasesmanager/client/utils/ConstantsPortlet.java index 614c4c7..d479560 100644 --- a/src/main/java/org/gcube/portlets/user/databasesmanager/client/utils/ConstantsPortlet.java +++ b/src/main/java/org/gcube/portlets/user/databasesmanager/client/utils/ConstantsPortlet.java @@ -35,7 +35,7 @@ public class ConstantsPortlet { public static final String ALGID_SMARTSAMPLEONTABLE="SMARTSAMPLEONTABLE"; public static final String ALGID_RANDOMSAMPLEONTABLE="RANDOMSAMPLEONTABLE"; - - - + //elements type + public static final String RESOURCESLIST="RESOURCESLIST"; + public static final String RESOURCE="RESOURCE"; } 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 3e555f9..971351f 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 @@ -6,6 +6,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentLinkedQueue; import java.io.BufferedWriter; import java.io.File; import java.io.IOException; @@ -25,6 +26,8 @@ import net.sf.ehcache.config.CacheConfiguration; import net.sf.ehcache.config.MemoryUnit; import net.sf.ehcache.store.MemoryStoreEvictionPolicy; +import opennlp.tools.parser.Cons; + import org.apache.regexp.RE; import org.apache.xpath.operations.Bool; import org.gcube.application.framework.core.session.ASLSession; @@ -63,12 +66,16 @@ import org.gcube.portlets.user.databasesmanager.client.datamodel.SamplingResultW import org.gcube.portlets.user.databasesmanager.client.datamodel.Row; import org.gcube.portlets.user.databasesmanager.client.datamodel.SubmitQueryResultWithFileFromServlet; import org.gcube.portlets.user.databasesmanager.client.utils.ConstantsPortlet; +import org.gcube.portlets.user.databasesmanager.server.util.DataExchangedThroughQueue; import org.gcube.portlets.user.databasesmanager.server.util.SessionUtil; import org.gcube.portlets.user.databasesmanager.shared.SessionExpiredException; import org.gcube.portlets.user.databasesmanager.shared.StatisticalManagerException; +import org.hibernate.engine.JoinSequence.Join; + import com.extjs.gxt.ui.client.data.BasePagingLoadResult; import com.extjs.gxt.ui.client.data.PagingLoadConfig; import com.extjs.gxt.ui.client.data.PagingLoadResult; +import com.google.gwt.dom.client.Element; import com.google.gwt.user.server.rpc.RemoteServiceServlet; import com.thoughtworks.xstream.XStream; import org.apache.log4j.Logger; @@ -88,6 +95,9 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements // variables to check thread execution private static HashMap threadsStarted = new HashMap(); private static boolean endThread = false; + private static boolean threadExecutionFinished = false; + private static ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue(); + private static ThreadDataLoader dataLoader; public GWTdbManagerServiceImpl() throws Exception { } @@ -150,6 +160,10 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements logger.info("dbmanager-> Folder computationResult created in : " + this.getServletContext().getRealPath("")); } + + // create the thread DataLoader + dataLoader = new ThreadDataLoader(); + logger.info("dbmanager-> Thread Dataloader created"); } catch (Exception e) { logger.error("dbmanager-> ", e); @@ -191,7 +205,7 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements super.destroy(); // set endThread variable - setEndThreadvariable(); + setEndThreadvariable(true); try { @@ -291,14 +305,16 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements // get scope String scope = session.getScope(); - // check if the thread is alreday started + // check if the thread is already started Boolean value = getThreadStarted(scope); if ((value == null) || (value.booleanValue() == false)) { - ThreadLoaderData loader = new ThreadLoaderData(scope); - Thread t = new Thread(loader); + DataExchangedThroughQueue dataqueue = new DataExchangedThroughQueue( + scope); + queue.offer(dataqueue); + Thread t = new Thread(dataLoader); t.start(); - logger.info("dbmanager-> Thread created in order to load all data"); + logger.info("dbmanager-> Thread DataLoader started in order to load data tree"); } // initialize variables with application startup @@ -2050,7 +2066,9 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements private synchronized net.sf.ehcache.Element getDataFromCache(String key) { net.sf.ehcache.Element data = null; if (DBCache != null) { + data = DBCache.get(key); + } return data; } @@ -2077,9 +2095,10 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements GeneralOutputFromServlet result = null; - // build key if (inputData != null && inputData.size() != 0) { - // System.out.println("server-> input size not null"); + + DataExchangedThroughQueue dataQueue = null; + String key = ""; String keyUsedForQueryRefresh = ""; String keyUsedForSamplingsRefresh = ""; @@ -2087,13 +2106,17 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements String keyUsedForRandomSamplingRefresh = ""; if (!ElementType.equals("")) { - // System.out.println("server-> element type not null"); + // build key switch (ElementType) { case "listResources": key = scope + inputData.get("listResources"); + dataQueue = new DataExchangedThroughQueue(scope); break; case "resource": key = scope + inputData.get("ResourceName"); + dataQueue = new DataExchangedThroughQueue(scope, + "resource", inputData.get("ResourceName"), + null, null, null); break; case "database": if (element.getDatabaseType().equals( @@ -2107,6 +2130,18 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements + ConstantsPortlet.ALGID_SUBMITQUERY + key; refreshSubmittedQueryInCache(keyUsedForQueryRefresh); + // loader = new ThreadLoaderData(scope, "database", + // inputData.get("ResourceName"), + // inputData.get("DatabaseName"), null, + // element.getDatabaseType()); + // loader = new ThreadLoaderData(scope, "database", + // inputData, ConstantsPortlet.POSTGRES); + + dataQueue = new DataExchangedThroughQueue(scope, + "database", inputData.get("ResourceName"), + inputData.get("DatabaseName"), null, + element.getDatabaseType()); + key = scope + key; } if (element.getDatabaseType().equals( ConstantsPortlet.MYSQL)) { // refresh table @@ -2130,6 +2165,21 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements refreshSamplingsInCache(keyUsedForSamplingsRefresh, keyUsedForSmartSamplingRefresh); + + // loader = new ThreadLoaderData(scope, "database", + // inputData, ConstantsPortlet.MYSQL); + + // loader = new ThreadLoaderData(scope, "database", + // inputData.get("ResourceName"), + // inputData.get("DatabaseName"), + // inputData.get("SchemaName"), + // element.getDatabaseType()); + + dataQueue = new DataExchangedThroughQueue(scope, + "database", inputData.get("ResourceName"), + inputData.get("DatabaseName"), + inputData.get("SchemaName"), + element.getDatabaseType()); } break; @@ -2156,22 +2206,33 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements refreshSamplingsInCache(keyUsedForSamplingsRefresh, keyUsedForSmartSamplingRefresh); + // loader = new ThreadLoaderData(scope, "schema", + // inputData, ConstantsPortlet.POSTGRES); + + dataQueue = new DataExchangedThroughQueue(scope, + "schema", inputData.get("ResourceName"), + inputData.get("DatabaseName"), + inputData.get("SchemaName"), + element.getDatabaseType()); break; } } - // System.out.println("server->KEY: " + key); + // TODO ***DATA NULL IN CACHE MANAGEMENT + logger.trace("Check if data of the node is present in cache with key: : " + key); net.sf.ehcache.Element dataFromCache = getDataFromCache(key); if (dataFromCache != null) { - // System.out.println("server-> data in cache with key: " + - // key); - refreshCache(key); - // System.out.println("server-> data removed from cache with key: " - // + key); + logger.trace("data of the node is in cache"); + logger.info("dbmanager-> Starting the data removing process in cache from the node"); + + // refresh data in cache. Remove data related to the subtree + // with the selected element as root + refreshDataInCache(element, ElementType, scope, key, null); + + // recover the refresh data of the item selected if (!ElementType.equals("")) { - // System.out.println("server-> element type not null"); switch (ElementType) { case "listResources": List output1 = getResource(); @@ -2187,30 +2248,45 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements if (element.getDatabaseType() != null && (element.getDatabaseType() .equals(ConstantsPortlet.POSTGRES))) { // refresh - // schema - // list + // schema list List output3 = getDBSchema(inputData); result = new GeneralOutputFromServlet(output3); } if (element.getDatabaseType() != null && element.getDatabaseType().equals( ConstantsPortlet.MYSQL)) { // refresh - // table - // list + // table list getTables(inputData, ConstantsPortlet.DATABASE); - } break; - case "schema": getTables(inputData, ConstantsPortlet.SCHEMA); break; } } + + // check if the thread execution is terminated. If yes, a + // new + // thread is started otherwise no because the thread in + // running + // state will also serve this request received in the queue. + // The thread will run in backgroung to load the data + // related to + // the subtree with the item selected as root. + if (isThreadExecutionFinished()) { + logger.info("dbmanager-> Starting the launch of the Thread DataLoader execution"); + queue.offer(dataQueue); + Thread t = new Thread(dataLoader); + t.start(); + } else { + logger.info("dbmanager-> The Thread DataLoader is already running"); + queue.offer(dataQueue); + } } } return result; + } catch (Exception e) { logger.error("dbmanager-> ", e); if (!(e instanceof StatisticalManagerException)) { @@ -2222,9 +2298,158 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements } } + public void refreshDataInCache(FileModel element, String ElementType, + String scope, String key, String DBType) { + logger.info("dbmanager-> Refresh Data Request of element " + + ElementType + " in Cache with KEY: " + key); + + try { + // get data from cache + net.sf.ehcache.Element dataFromCache = getDataFromCache(key); + + Object value = null; + if (dataFromCache != null) { + logger.info("dbmanager-> Data is in cache"); + + value = dataFromCache.getObjectValue(); + if (value != null) { + if (!ElementType.equals("")) { + switch (ElementType) { + case "listResources": + // refresh resources + List resources = (List) value; + // refresh cache + refreshCache(key); + logger.trace("element: " + ElementType + + " with key: " + key + " removed in cache"); + // apply the refresh on children + for (int i = 0; i < resources.size(); i++) { + key = scope + resources.get(i).getName(); + refreshDataInCache(element, "resource", null, + key, null); + } + break; + case "resource": + // refresh databases + LinkedHashMap DBdata = (LinkedHashMap) value; + // refresh cache + refreshCache(key); + logger.trace("element " + ElementType + + " with key: " + key + " removed in cache"); + // apply the refresh on children + HashMap DBlist = new HashMap(); + + if (DBdata != null) { + Set keys = DBdata.keySet(); + Object[] array = keys.toArray(); + + int numIterations = (DBdata.size()) / 5; + int i = 0; + int j = 0; + for (i = 0; i < numIterations; i++) { + String DBName = ""; + + for (j = (i * 5); j < (i + 1) * 5; j++) { + + if (array[j].toString().contains( + "Database Name")) { + DBName = DBdata.get( + array[j].toString()) + .getName(); + } + + if (array[j].toString().contains( + "Driver Name")) { + String driver = DBdata.get( + array[j].toString()) + .getName(); + + if (driver.toUpperCase().contains( + ConstantsPortlet.POSTGRES)) { + + DBlist.put( + DBName, + ConstantsPortlet.POSTGRES); + } + + if (driver.toUpperCase().contains( + ConstantsPortlet.MYSQL)) { + DBlist.put(DBName, + ConstantsPortlet.MYSQL); + } + } + } + } + } + + Set keys = DBlist.keySet(); + Object[] array = keys.toArray(); + + for (int i = 0; i < array.length; i++) { + String databaseType = DBlist.get(array[i] + .toString()); + // if (databaseType + // .equals(ConstantsPortlet.POSTGRES)) { + String newkey = key + array[i].toString(); + refreshDataInCache(element, "database", null, + newkey, databaseType); + // } + } + + break; + case "database": + if (DBType == null) { + DBType = element.getDatabaseType(); + } + // refresh schema (db postgres) or tables (db mysql) + List schemaList = (List) value; + + refreshCache(key); // refresh schema + logger.trace("element " + ElementType + + " with key: " + key + " removed in cache"); + if (DBType.equals(ConstantsPortlet.POSTGRES)) { + // SCHEMA + for (int i = 0; i < schemaList.size(); i++) { + String newkey = key + + schemaList.get(i).getName(); + refreshDataInCache(element, "schema", null, + newkey, null); + } + } + + if (DBType.equals(ConstantsPortlet.MYSQL)) { + // refresh tables + key = key + ""; + refreshCache(key); // refresh tables + logger.trace("element " + ElementType + + " with key: " + key + + " removed in cache"); + } + + break; + case "schema": + // refresh tables (db postgres) + refreshCache(key); + logger.trace("element " + ElementType + + " with key: " + key + " removed in cache"); + break; + } + } + } + } else { + logger.info("dbmanager-> Data not in cache"); + } + } catch (Exception e) { + logger.error("dbmanager-> ", e); + } + + } + private synchronized void refreshCache(String key) throws Exception { // try { + // System.out.println("SIZE CACHE PRE REMOVING: " + DBCache.getSize()); DBCache.remove(key); + // System.out.println("SIZE CACHE POST REMOVING: " + DBCache.getSize()); // } catch (Exception e) { // TODO: handle exception // logger.error("dbmanager-> ", e); @@ -2237,6 +2462,9 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements private synchronized void refreshSubmittedQueryInCache(String key) throws Exception { + logger.info("dbmanager-> refreshing submitted queries in cache with key:" + + key); + List keysInCache = DBCache.getKeys(); int listSize = keysInCache.size(); List keysToBeRemoved = new ArrayList<>(); @@ -2258,6 +2486,11 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements String keyUsedForSamplingsRefresh, String keyUsedForSmartSamplingRefresh) throws Exception { + logger.info("dbmanager-> refreshing samplings and smart sampling in cache with keys: " + + keyUsedForSamplingsRefresh + + " " + + keyUsedForSmartSamplingRefresh); + List keysInCache = DBCache.getKeys(); int listSize = keysInCache.size(); List keysToBeRemoved = new ArrayList<>(); @@ -2339,8 +2572,8 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements return queryParsed; } - private synchronized void setEndThreadvariable() { - endThread = true; + private synchronized void setEndThreadvariable(boolean value) { + endThread = value; logger.info("dbmanager-> Variable EndThread set in order to stop the thread execution"); } @@ -2349,6 +2582,14 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements return endThread; } + private synchronized void setThreadExecutionFinished(boolean value) { + threadExecutionFinished = value; + } + + private synchronized boolean isThreadExecutionFinished() { + return threadExecutionFinished; + } + private List recoverResources(String scope) throws Exception { try { @@ -2373,6 +2614,7 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements // String key = inputParameters.get(0).getDefaultValue(); String key = scope + "listResources"; net.sf.ehcache.Element dataFromCache = getDataFromCache(key); + logger.trace("element added in cache with key: " + key); Object value = null; if (dataFromCache != null) { @@ -2454,6 +2696,7 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements // check if data exist considering as key the input parameters String key = scope + inputParameters.get(0).getValue(); net.sf.ehcache.Element dataFromCache = getDataFromCache(key); + logger.trace("element added in cache with key: " + key); Object value = null; if (dataFromCache != null) { @@ -2564,8 +2807,8 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements // check if data exist considering as key the input parameters String key = scope + inputParameters.get(0).getValue() + inputParameters.get(1).getValue(); - net.sf.ehcache.Element dataFromCache = getDataFromCache(key); + logger.trace("element put in cache with key: " + key); Object value = null; if (dataFromCache != null) { @@ -2687,8 +2930,8 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements String key = scope + inputParameters.get(0).getValue() + inputParameters.get(1).getValue() + inputParameters.get(2).getValue(); - net.sf.ehcache.Element dataFromCache = getDataFromCache(key); + logger.trace("element put in cache with key: " + key); Object value = null; if (dataFromCache != null) { @@ -2761,38 +3004,94 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements } // thread that loads data on the resources - private class ThreadLoaderData implements Runnable { - private String scope; + private class ThreadDataLoader implements Runnable { - public ThreadLoaderData(String s) { - scope = s; + public ThreadDataLoader() { } @Override public void run() { + logger.info("dbmanager-> Thread DataLoader running"); try { - // add an element related to the thread - updateThreadsStarted(scope, true); + setThreadExecutionFinished(false); - if (!getEndThreadvariable()) { - List resources = recoverResources(scope); + while (!queue.isEmpty()) { - int i = 0; - while ((!getEndThreadvariable()) && (i < resources.size())) { - getDatabase(resources.get(i).getName()); - i++; - // logger.info("dbmanager-> ***thread inside the root while"); + logger.info("dbmanager-> Queue to exchange data with the thread not empty"); + + // recover data from queue + DataExchangedThroughQueue node = queue.poll(); + if (node != null) { + String scope = node.getScope(); + // add an element related to the thread in the hashmap + updateThreadsStarted(scope, true); + boolean loadTree = node.treeToBeLoaded(); + + // System.out.println("value loadTree: " + loadTree); + if (loadTree == false) { // load the subtree with the + // node as root + if (!getEndThreadvariable()) { + String elementType = node.elementType(); + String resource = node.resource(); + + logger.info("dbmanager-> Starting the node refreshing process"); + + switch (elementType) { + case "resource": + getDatabase(scope, resource); + break; + case "database": + String DBType = node.DBType(); + String database = node.database(); + if (DBType + .equals(ConstantsPortlet.POSTGRES)) { + getSchema(scope, resource, database); + } + if (DBType.equals(ConstantsPortlet.MYSQL)) { + String schema = node.schema(); + getTables(scope, resource, database, + schema, + ConstantsPortlet.DATABASE); + } + break; + case "schema": + String db = node.database(); + String schema = node.schema(); + getTables(scope, resource, db, schema, + ConstantsPortlet.SCHEMA); + break; + } + } + + } else { // load the tree + logger.info("dbmanager-> Starting the tree loading"); + + if (!getEndThreadvariable()) { + List resources = recoverResources(scope); + + int i = 0; + while ((!getEndThreadvariable()) + && (i < resources.size())) { + getDatabase(scope, resources.get(i) + .getName()); + i++; + // logger.info("dbmanager-> ***thread inside the while checking the EndThread variable"); + } + // logger.info("dbmanager-> ***thread outside the while checking the EndThread variable"); + } + } } - // logger.info("dbmanager-> ***thread outside the root while"); } - // logger.info("dbmanager-> ***Thread execution terminated"); + // thread terminates its execution + setThreadExecutionFinished(true); + logger.info("dbmanager-> Thread DataLoader execution terminated"); } catch (Exception e) { logger.error("dbmanager-> ", e); } } - private void getDatabase(String resourceName) { + private void getDatabase(String scope, String resourceName) { try { @@ -2825,30 +3124,13 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements ConstantsPortlet.POSTGRES)) { // get schema List schemaList = getSchema( - resourceName, DBName); - // recover tables - if (schemaList != null) { - int z = 0; - while ((!getEndThreadvariable()) - && (z < schemaList.size())) { - // for (int i = 0; i < - // schemaList.size(); i++) { - String schemaName = schemaList.get( - z).getName(); - // System.out.println("SchemaName: " - // + schemaName); - getTables(resourceName, DBName, - schemaName, - ConstantsPortlet.SCHEMA); - z++; - } - } + scope, resourceName, DBName); } if (driver.toUpperCase().contains( ConstantsPortlet.MYSQL)) { // get tables - getTables(resourceName, DBName, "", + getTables(scope, resourceName, DBName, "", ConstantsPortlet.DATABASE); } } @@ -2861,7 +3143,7 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements } } - public List getSchema(String resourceName, + private List getSchema(String scope, String resourceName, String databaseName) { List schemaList = null; @@ -2872,14 +3154,29 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements dataInputForSchema.put("DatabaseName", databaseName); schemaList = recoverSchema(scope, dataInputForSchema); + + // recover tables + if (schemaList != null) { + int z = 0; + while ((!getEndThreadvariable()) && (z < schemaList.size())) { + // for (int i = 0; i < + // schemaList.size(); i++) { + String schemaName = schemaList.get(z).getName(); + getTables(scope, resourceName, databaseName, + schemaName, ConstantsPortlet.SCHEMA); + z++; + } + } + } catch (Exception e) { logger.error("dbmanager-> ", e); } return schemaList; } - public void getTables(String resourceName, String databaseName, - String schemaName, String elementType) { + private void getTables(String scope, String resourceName, + String databaseName, String schemaName, String elementType) { + try { LinkedHashMap dataInputForTables = new LinkedHashMap(); dataInputForTables.put("ResourceName", resourceName); diff --git a/src/main/java/org/gcube/portlets/user/databasesmanager/server/util/DataExchangedThroughQueue.java b/src/main/java/org/gcube/portlets/user/databasesmanager/server/util/DataExchangedThroughQueue.java new file mode 100644 index 0000000..f9541ed --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/databasesmanager/server/util/DataExchangedThroughQueue.java @@ -0,0 +1,58 @@ +package org.gcube.portlets.user.databasesmanager.server.util; + +public class DataExchangedThroughQueue { + + private String scope; + private boolean loadTree = false; + // private LinkedHashMap Data; + private String elementType; + private String resource; + private String database; + private String schema; + private String DBType; + + public DataExchangedThroughQueue(String scopeValue) { + scope = scopeValue; + loadTree = true; + } + + public DataExchangedThroughQueue(String scopeValue, String elemType, + String resourceName, String databaseName, String schemaName, + String databaseType) { + scope = scopeValue; + loadTree = false; + elementType = elemType; + resource = resourceName; + database = databaseName; + schema = schemaName; + DBType = databaseType; + } + + public String getScope() { + return scope; + } + + public boolean treeToBeLoaded() { + return loadTree; + } + + public String elementType() { + return elementType; + } + + public String resource() { + return resource; + } + + public String database() { + return database; + } + + public String schema() { + return schema; + } + + public String DBType() { + return DBType; + } +}