Skip to content

Commit

Permalink
The concurrency issues could not be resolved by using the Index page …
Browse files Browse the repository at this point in the history
…directly. There seems to be a synchronization method for all persistent properties added to the bytecode of the Tapestry classes. Next try: A data service handling this with custom synchronization.
  • Loading branch information
khituras committed Aug 28, 2020
1 parent 0b3f589 commit cf7f6de
Show file tree
Hide file tree
Showing 10 changed files with 119 additions and 124 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,11 @@ public class BarChartWidget extends GepiWidget {
@Property
private JSONArray eventsJSON;

void setupRender() {
super.setupRender();
}


void onDrawChart() {
try {
javaScriptSupport.require("gepi/charts/barchart").with(
gChartMnger.getTargetArgCount(persistEsResult.get().getEventList() ) );
gChartMnger.getTargetArgCount(getEsResult().get().getEventList() ) );
} catch (InterruptedException | ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,6 @@ public class CircleWidget extends GepiWidget {
private String elementId;


void setupRender() {
super.setupRender();
}

void afterRender() {
javaScriptSupport.require("gepi/charts/circlechart").with(elementId);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,60 +1,53 @@
package de.julielab.gepi.webapp.components;

import java.util.concurrent.CompletableFuture;

import de.julielab.gepi.core.retrieval.data.AggregatedEventsRetrievalResult;
import de.julielab.gepi.core.retrieval.data.EventRetrievalResult;
import de.julielab.gepi.webapp.pages.Index;
import org.apache.tapestry5.BindingConstants;
import org.apache.tapestry5.annotations.InjectComponent;
import org.apache.tapestry5.annotations.InjectPage;
import org.apache.tapestry5.annotations.Parameter;
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.slf4j.Logger;

import de.julielab.gepi.core.retrieval.data.EventRetrievalResult;
import java.util.concurrent.CompletableFuture;

public class GepiWidget {

@Parameter(defaultPrefix = BindingConstants.LITERAL, name = "class")
@Property
private String classes;

/**
* For loading state display
*/
@Parameter
@Property
private CompletableFuture<EventRetrievalResult> esResult;

/**
* For loading state display
*/
@Parameter
@Property
private CompletableFuture<AggregatedEventsRetrievalResult> neo4jResult;

/**
* For loading state display
*/
@Property
@Persist
protected CompletableFuture<EventRetrievalResult> persistEsResult;

/**
* For loading state display
*/
@Property
@Persist
protected CompletableFuture<AggregatedEventsRetrievalResult> persistNeo4jResult;

@InjectComponent
private GepiWidgetLayout gepiWidgetLayout;

void setupRender() {
persistEsResult = esResult;
persistNeo4jResult = neo4jResult;
}

public boolean isLargeView() {
final GepiWidgetLayout.ViewMode mode = gepiWidgetLayout.viewMode();
return mode == GepiWidgetLayout.ViewMode.LARGE || mode == GepiWidgetLayout.ViewMode.FULLSCREEN;
}
@Inject
private Logger log;

@Parameter(defaultPrefix = BindingConstants.LITERAL, name = "class")
@Property
private String classes;

@InjectComponent
private GepiWidgetLayout gepiWidgetLayout;

@InjectPage
private Index index;

public CompletableFuture<EventRetrievalResult> getEsResult() {
try {
log.debug("Trying to access index for ES result.");
return index.getEsResult();
} finally {
log.debug("Retrieved ES result.");
}
}

public CompletableFuture<AggregatedEventsRetrievalResult> getNeo4jResult() {
try {
log.debug("Trying to access index for Neo4j result.");
return index.getNeo4jResult();
} finally {
log.debug("Retrieved Neo4j result.");
}
}

public boolean isLargeView() {
final GepiWidgetLayout.ViewMode mode = gepiWidgetLayout.viewMode();
return mode == GepiWidgetLayout.ViewMode.LARGE || mode == GepiWidgetLayout.ViewMode.FULLSCREEN;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,7 @@
@Import(stylesheet = {"context:css-components/gepiwidgetlayout.css"})
@SupportsInformalParameters
final public class GepiWidgetLayout {
@Parameter
@Property
protected CompletableFuture<EventRetrievalResult> esResult;

@Parameter
@Property
protected CompletableFuture<AggregatedEventsRetrievalResult> neo4jResult;


@Inject
private Logger log;

Expand Down Expand Up @@ -86,20 +79,15 @@ final public class GepiWidgetLayout {
private ComponentResources resources;
@Environmental
private JavaScriptSupport javaScriptSupport;
@Persist
private CompletableFuture<EventRetrievalResult> persistEsResult;
@Persist
private CompletableFuture<AggregatedEventsRetrievalResult> persistNeo4jResult;

@Persist
@Property
private String viewMode;
@InjectPage
private Index index;

void setupRender() {
persistEsResult = esResult;
persistNeo4jResult = neo4jResult;
if (esResult == null)
if (getEsResult() == null)
viewMode = null;
if (viewMode == null)
viewMode = ViewMode.OVERVIEW.name().toLowerCase();
Expand All @@ -113,6 +101,14 @@ void afterRender() {
}
}

public CompletableFuture<EventRetrievalResult> getEsResult() {
return index.getEsResult();
}

public CompletableFuture<AggregatedEventsRetrievalResult> getNeo4jResult() {
return index.getNeo4jResult();
}

/**
* To be used by concrete Widget classes.
*
Expand Down Expand Up @@ -143,28 +139,28 @@ public boolean isRenderBody() {
}

public boolean isResultLoading() {
if (neo4jResult != null && !neo4jResult.isDone()) {
if (getEsResult() != null && !getEsResult().isDone()) {
return true;
}
return persistEsResult != null && !persistEsResult.isDone();
return getEsResult() != null && !getEsResult().isDone();
}

public boolean isResultAvailable() {
if (neo4jResult != null && neo4jResult.isDone())
if (getEsResult() != null && getNeo4jResult().isDone())
return true;
return persistEsResult != null && persistEsResult.isDone();
return getEsResult() != null && getEsResult().isDone();
}

void onRefreshContent() throws InterruptedException, ExecutionException {
// If there is data from Neo4j, use that.
if (persistEsResult != null && persistNeo4jResult == null) {
if (getEsResult() != null && getNeo4jResult() == null) {
log.debug("Waiting for ElasticSearch to return its results.");
persistEsResult.get();
getEsResult().get();
log.debug("ES result finished.");
}
else if (persistNeo4jResult != null) {
else if (getNeo4jResult() != null) {
log.debug("Waiting for Neo4j to return its results.");
persistNeo4jResult.get();
getNeo4jResult().get();
}
ajaxResponseRenderer.addRender(widgetZone);
}
Expand Down Expand Up @@ -215,7 +211,7 @@ public boolean isLarge() {
*/
@Log
StreamResponse onActionFromDownload() {
if (!persistEsResult.isDone()) {
if (!getEsResult().isDone()) {
//TODO: how to handle case when download button is clicked, but the request is not yet fully done

}
Expand All @@ -234,7 +230,7 @@ StreamResponse onActionFromDownload() {
public void prepareResponse(Response response) {
EventRetrievalResult eResult = null;
try {
eResult = persistEsResult.get();
eResult = getEsResult().get();
} catch (InterruptedException | ExecutionException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,7 @@ public class PieChartWidget extends GepiWidget {
private JSONArray eventsJSON;


void setupRender() {
super.setupRender();
}



void onDrawChart() {

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,6 @@ public class SankeyWidget extends GepiWidget {
@InjectComponent("gepiwidgetlayout")
private GepiWidgetLayout component;

void setupRender() {
super.setupRender();
}

void afterRender() {
if (commonPartners) {
javaScriptSupport.require("gepi/charts/sankeychart").with(elementId, "commonPartnersHarmonicMean", component.getWidgetSettings());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,11 @@ public class SankeyWidgetCommonPartners extends GepiWidget {
@Property
private JSONArray eventsJSON;

void setupRender() {
super.setupRender();
}


void onDrawChart() {
try {
javaScriptSupport.require("gepi/charts/sankeychart").with( "sankeychartcommonpartners",
gChartMnger.getPairsWithCommonTarget(persistEsResult.get().getEventList()) );
gChartMnger.getPairsWithCommonTarget(getEsResult().get().getEventList()) );
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ public class TableResultWidget extends GepiWidget {
private BeanModel<BeanModelEvent> tableModel;

void setupRender() {
super.setupRender();
tableModel = beanModelSource.createDisplayModel(BeanModelEvent.class, messages);
tableModel.include(
"firstArgumentPreferredName",
Expand Down Expand Up @@ -74,15 +73,15 @@ void setupRender() {
void onUpdateTableData() {
try {
log.debug("Waiting for table data.");
beanEvents = persistEsResult.get().getEventList().stream()
beanEvents = getEsResult().get().getEventList().stream()
.map(e -> new BeanModelEvent(e))
.collect(Collectors.toList());
log.debug("Table data was loaded.");

} catch (InterruptedException | ExecutionException e) {
log.error("Exception occurred when trying to access ES event results.", e);
} catch (NullPointerException e) {
log.error("NPE occurred when trying to access ES event results. The persistentEsResult is: {}", persistEsResult);
log.error("NPE occurred when trying to access ES event results. The persistentEsResult is: {}", getEsResult());
throw e;
}
}
Expand Down
Loading

0 comments on commit cf7f6de

Please sign in to comment.