Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import java.text.DateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
Expand All @@ -32,8 +33,6 @@
import org.tepi.filtertable.paged.PagedTableChangeEvent;
import org.vaadin.dialogs.ConfirmDialog;

import ru.xpoft.vaadin.VaadinView;

import com.github.wolfie.refresher.Refresher;
import com.vaadin.data.Property;
import com.vaadin.data.util.IndexedContainer;
Expand All @@ -42,9 +41,15 @@
import com.vaadin.server.Page;
import com.vaadin.server.Resource;
import com.vaadin.server.ThemeResource;
import com.vaadin.ui.*;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.CustomTable;
import com.vaadin.ui.Embedded;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Notification;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window.CloseEvent;
import com.vaadin.ui.Window.CloseListener;

Expand All @@ -68,6 +73,7 @@
import cz.cuni.mff.xrg.odcs.frontend.i18n.Messages;
import cz.cuni.mff.xrg.odcs.frontend.navigation.Address;
import cz.cuni.mff.xrg.odcs.frontend.navigation.ParametersHandler;
import ru.xpoft.vaadin.VaadinView;

/**
* GUI for Scheduler page which opens from the main menu. Contains table with
Expand Down Expand Up @@ -147,6 +153,17 @@ public class Scheduler extends ViewComponent implements PostLogoutCleaner, Prese

private boolean isMainLayoutInitialized = false;

/**
* Pipeline cache for light pipelines loading
*/
private Map<Long, Schedule> scheduleCache = new HashMap<>();

private static final int CACHE_MAX_SIZE = 100;

private static final int CACHE_TIMEOUT = 300000;

private Date lightCacheLastReload = new Date();

/**
* The constructor should first build the main layout, set the composition
* root and then do any custom initialization.
Expand All @@ -170,25 +187,45 @@ public void enter(ViewChangeEvent event) {
}
setCompositionRoot(mainLayout);

refreshManager = ((AppEntry) UI.getCurrent()).getRefreshManager();
refreshManager.addListener(RefreshManager.SCHEDULER, new Refresher.RefreshListener() {
addRefreshListener();

setParameters(ParametersHandler.getConfiguration(event.getParameters()));
}

@Override
public Object enter() {
if (!isMainLayoutInitialized) {
buildMainLayout();
isMainLayoutInitialized = true;
}
setCompositionRoot(mainLayout);

addRefreshListener();

return this;
}

private void addRefreshListener() {
this.refreshManager = ((AppEntry) UI.getCurrent()).getRefreshManager();
this.refreshManager.addListener(RefreshManager.SCHEDULER, new Refresher.RefreshListener() {
private long lastRefreshFinished = 0;

@Override
public void refresh(Refresher source) {
if (new Date().getTime() - lastRefreshFinished > RefreshManager.MIN_REFRESH_INTERVAL) {
boolean hasModifiedExecutions = pipelineFacade.hasModifiedExecutions(lastLoad);
if (hasModifiedExecutions) {
LOG.debug("Modified executions found, refreshing ...");
lastLoad = new Date();
refreshData();
LOG.debug("Scheduler refreshed.");
}
LOG.debug("Scheduler refreshed.");

lastRefreshFinished = new Date().getTime();
}
}
});
refreshManager.triggerRefresh();
setParameters(ParametersHandler.getConfiguration(event.getParameters()));
this.refreshManager.triggerRefresh();
}

/**
Expand Down Expand Up @@ -460,15 +497,17 @@ private static String getScheduledByDisplayName(Schedule schedule) {
/**
* Calls for refresh table {@link #schedulerTable}.
*/
@SuppressWarnings("deprecation")
private void refreshData() {
List<Schedule> schedules = this.scheduleFacade.getAllSchedules();
reloadScheduleCache(schedules);
int page = schedulerTable.getCurrentPage();
tableData = getTableData(scheduleFacade.getAllSchedules());
tableData = getTableData(schedules);
schedulerTable.setContainerDataSource(tableData);
schedulerTable.setCurrentPage(page);
schedulerTable.setVisibleColumns((Object[]) visibleCols);
schedulerTable.setFilterFieldVisible("commands", false);
schedulerTable.setFilterFieldVisible("duration", false);

}

/**
Expand All @@ -486,13 +525,14 @@ private void showSchedulePipeline(Long id, Long pipelineId) {
@Override
public void windowClose(CloseEvent e) {
refreshData();
addRefreshListener();
}
});
}

Schedule schedule = null;
if (id != null) {
schedule = scheduleFacade.getSchedule(id);
schedule = getSchedule(id);
}
schedulePipeline.setSelectedSchedule(schedule);
schedulePipeline.enableComboPipeline();
Expand Down Expand Up @@ -520,7 +560,7 @@ class actionColumnGenerator implements CustomTable.ColumnGenerator {
@Override
public Object generateCell(final CustomTable source, final Object itemId, Object columnId) {
final Long schId = Long.parseLong(tableData.getContainerProperty(itemId, "schid").getValue().toString());
Schedule schedule = scheduleFacade.getSchedule(schId);
Schedule schedule = getSchedule(schId);
Property propStatus = source.getItem(itemId).getItemProperty("status");

HorizontalLayout layout = new HorizontalLayout();
Expand Down Expand Up @@ -589,22 +629,22 @@ public void buttonClick(ClickEvent event) {
deleteButton.addClickListener(new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
scheduleDel = scheduleFacade.getSchedule(schId);
scheduleDel = getSchedule(schId);

//open confirmation dialog
ConfirmDialog.show(UI.getCurrent(), Messages.getString("Scheduler.delete.scheduling"),
Messages.getString("Scheduler.delete.scheduling.description", scheduleDel.getPipeline().getName().toString()), Messages.getString("Scheduler.delete.scheduling.deleteButton"), Messages.getString("Scheduler.delete.scheduling.calcelButton"),
new ConfirmDialog.Listener() {
private static final long serialVersionUID = 1L;

@Override
public void onClose(ConfirmDialog cd) {
if (cd.isConfirmed()) {
scheduleFacade.delete(scheduleDel);
refreshData();
}
}
});
private static final long serialVersionUID = 1L;

@Override
public void onClose(ConfirmDialog cd) {
if (cd.isConfirmed()) {
scheduleFacade.delete(scheduleDel);
refreshData();
}
}
});
}
});
if (canDelete(schedule)) {
Expand All @@ -616,9 +656,9 @@ public void onClose(ConfirmDialog cd) {
}

private void setScheduleEnabled(Long schId, boolean enabled) {
Schedule schedule = scheduleFacade.getSchedule(schId);
Schedule schedule = getSchedule(schId);
schedule.setEnabled(enabled);
scheduleFacade.save(schedule);
this.scheduleFacade.save(schedule);
}

boolean canDelete(Schedule schedule) {
Expand Down Expand Up @@ -663,36 +703,6 @@ private void changeURI(Long scheduleId) {
((AppEntry) UI.getCurrent()).setUriFragment(handler.getUriFragment(), false);
}

@Override
public Object enter() {
if (!isMainLayoutInitialized) {
buildMainLayout();
isMainLayoutInitialized = true;
}
setCompositionRoot(mainLayout);

refreshManager = ((AppEntry) UI.getCurrent()).getRefreshManager();
refreshManager.addListener(RefreshManager.SCHEDULER, new Refresher.RefreshListener() {
private long lastRefreshFinished = 0;

@Override
public void refresh(Refresher source) {
if (new Date().getTime() - lastRefreshFinished > RefreshManager.MIN_REFRESH_INTERVAL) {
boolean hasModifiedExecutions = pipelineFacade.hasModifiedExecutions(lastLoad);
if (hasModifiedExecutions) {
lastLoad = new Date();
refreshData();
}
LOG.debug("Scheduler refreshed.");
lastRefreshFinished = new Date().getTime();
}
}
});
refreshManager.triggerRefresh();

return this;
}

@Override
public void setParameters(Object configuration) {
if (configuration != null && Map.class.isAssignableFrom(configuration.getClass())) {
Expand Down Expand Up @@ -767,7 +777,7 @@ public void showDebugEventHandler(long scheduleId) {
if (!schedulerTable.getItemIds().contains((new Long(scheduleId)).intValue())) {
return;
}
Schedule schedule = scheduleFacade.getSchedule(scheduleId);
Schedule schedule = getSchedule(scheduleId);
if (schedule == null) {
Notification.show(Messages.getString("Scheduler.0", scheduleId), Notification.Type.ERROR_MESSAGE);
return;
Expand All @@ -782,4 +792,45 @@ public void pageChangedHandler(Integer newPageNumber) {
((AppEntry) UI.getCurrent()).setUriFragment(handler.getUriFragment(), false);
}

/**
* Get cached schedule or retrieve from database
*
* @param scheduleId
* @return copy of schedule
*/
private Schedule getSchedule(long scheduleId) {
if (this.scheduleCache.size() >= CACHE_MAX_SIZE) {
LOG.debug("Light pipeline cache size exceeded, reloading ...");
reloadScheduleCache();
}

if (this.lightCacheLastReload.before(new Date(new Date().getTime() - CACHE_TIMEOUT))) {
LOG.debug("Light pipeline cache timeout, reloading ...");
reloadScheduleCache();
}

Schedule schedule = null;
if (this.scheduleCache.containsKey(scheduleId)) {
schedule = this.scheduleCache.get(scheduleId);
} else {
schedule = this.scheduleFacade.getSchedule(scheduleId);
this.scheduleCache.put(scheduleId, schedule);
}

return schedule;
}

private void reloadScheduleCache() {
this.scheduleCache.clear();
this.lightCacheLastReload = new Date();
}

private void reloadScheduleCache(List<Schedule> schedules) {
this.scheduleCache.clear();
for (Schedule schedule : schedules) {
scheduleCache.put(schedule.getId(), schedule);
}
this.lightCacheLastReload = new Date();
}

}
Loading