Skip to content

Update View and Cluster drop downs to show most recently accessed entries #226

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
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 @@ -40,7 +40,10 @@
import org.sourcelab.kafka.webview.ui.manager.plugin.PluginFactory;
import org.sourcelab.kafka.webview.ui.manager.plugin.UploadManager;
import org.sourcelab.kafka.webview.ui.manager.sasl.SaslUtility;
import org.sourcelab.kafka.webview.ui.manager.ui.recentasset.RecentAssetManager;
import org.sourcelab.kafka.webview.ui.plugin.filter.RecordFilter;
import org.sourcelab.kafka.webview.ui.repository.ClusterRepository;
import org.sourcelab.kafka.webview.ui.repository.ViewRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
Expand Down Expand Up @@ -213,4 +216,9 @@ public SaslUtility getSaslUtility(final SecretManager secretManager) {
public SensitiveConfigScrubber getSensitiveConfigScrubber(final SaslUtility saslUtility) {
return new SensitiveConfigScrubber(saslUtility);
}

@Bean
public RecentAssetManager recentAssetManager(final ClusterRepository clusterRepository, final ViewRepository viewRepository) {
return new RecentAssetManager(clusterRepository, viewRepository);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@
package org.sourcelab.kafka.webview.ui.controller;

import org.sourcelab.kafka.webview.ui.configuration.AppProperties;
import org.sourcelab.kafka.webview.ui.manager.ui.recentasset.RecentAsset;
import org.sourcelab.kafka.webview.ui.manager.ui.recentasset.RecentAssetManager;
import org.sourcelab.kafka.webview.ui.manager.ui.recentasset.RecentAssetStorage;
import org.sourcelab.kafka.webview.ui.manager.ui.recentasset.RecentAssetType;
import org.sourcelab.kafka.webview.ui.manager.user.CustomUserDetails;
import org.sourcelab.kafka.webview.ui.model.Cluster;
import org.sourcelab.kafka.webview.ui.model.View;
Expand All @@ -39,7 +43,10 @@
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Collection;
import java.util.List;

/**
* Base Controller w/ common code.
Expand All @@ -55,6 +62,9 @@ public abstract class BaseController {
@Autowired
private AppProperties appProperties;

@Autowired
private RecentAssetManager recentAssetManager;

/**
* Determine if the current user is logged in or not.
* @return True if so, false if not.
Expand Down Expand Up @@ -99,15 +109,25 @@ protected String getLoggedInUserSessionId() {
* This gets executed for all requests.
*/
@ModelAttribute
public void addAttributes(Model model) {
public void addAttributes(final Model model, final HttpServletRequest request, final HttpServletResponse response) {
// But only if logged in
if (!isLoggedIn()) {
return;
}

// TODO put a limit on these
final Iterable<Cluster> clusters = clusterRepository.findAllByOrderByNameAsc();
final Iterable<View> views = viewRepository.findAllByOrderByNameAsc();
// TODO
// If we have less than 11 Clusters
// Just list them ordered by name desc.
// Otherwise show 10 most recent clusters accessed.
// Same for views

final RecentAssetStorage storage = getMostRecentAssetStorage(request, response);
final List<RecentAsset> clusters = recentAssetManager.getRecentAssets(RecentAssetType.CLUSTER, storage.getMostRecentAssetIds(RecentAssetType.CLUSTER));
final List<RecentAsset> views = recentAssetManager.getRecentAssets(RecentAssetType.VIEW, storage.getMostRecentAssetIds(RecentAssetType.VIEW));

// TODO removethese
// final Iterable<Cluster> clusters = clusterRepository.findAllByOrderByNameAsc();
// final Iterable<View> views = viewRepository.findAllByOrderByNameAsc();

model.addAttribute("MenuClusters", clusters);
model.addAttribute("MenuViews", views);
Expand Down Expand Up @@ -137,4 +157,14 @@ protected boolean hasRole(final String role) {
}
return false;
}

/**
* New instance of RecentAssetManager.
* @param request The current request.
* @param response The current response.
* @return RecentAssetManager instance.
*/
protected RecentAssetStorage getMostRecentAssetStorage(final HttpServletRequest request, final HttpServletResponse response) {
return new RecentAssetStorage(request, response);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
Expand Down Expand Up @@ -636,7 +638,7 @@ private WebKafkaConsumer setup(final View view, final Collection<FilterDefinitio
*/
@Override
@ModelAttribute
public void addAttributes(final Model model) {
public void addAttributes(final Model model, final HttpServletRequest request, final HttpServletResponse response) {
// Do nothing.
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import org.sourcelab.kafka.webview.ui.controller.BaseController;
import org.sourcelab.kafka.webview.ui.manager.ui.BreadCrumbManager;
import org.sourcelab.kafka.webview.ui.manager.ui.FlashMessage;
import org.sourcelab.kafka.webview.ui.manager.ui.recentasset.RecentAssetType;
import org.sourcelab.kafka.webview.ui.manager.ui.datatable.Datatable;
import org.sourcelab.kafka.webview.ui.manager.ui.datatable.DatatableColumn;
import org.sourcelab.kafka.webview.ui.manager.ui.datatable.LinkTemplate;
Expand All @@ -44,6 +45,8 @@
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
Expand Down Expand Up @@ -140,13 +143,16 @@ public String datatable(
}

/**
* GET Displays edit cluster form.
* GET Displays read cluster page.
*/
@RequestMapping(path = "/{clusterId}", method = RequestMethod.GET)
public String readCluster(
@PathVariable final Long clusterId,
final Model model,
final RedirectAttributes redirectAttributes) {
final RedirectAttributes redirectAttributes,
final HttpServletRequest request,
final HttpServletResponse response
) {

// Retrieve by id
final Cluster cluster = retrieveCluster(clusterId, redirectAttributes);
Expand All @@ -155,6 +161,10 @@ public String readCluster(
return "redirect:/";
}

// Add most recently used asset
getMostRecentAssetStorage(request, response)
.addMostRecentAssetId(RecentAssetType.CLUSTER, cluster.getId());

// Set view attribute
model.addAttribute("cluster", cluster);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import org.sourcelab.kafka.webview.ui.controller.BaseController;
import org.sourcelab.kafka.webview.ui.manager.ui.BreadCrumbManager;
import org.sourcelab.kafka.webview.ui.manager.ui.FlashMessage;
import org.sourcelab.kafka.webview.ui.manager.ui.recentasset.RecentAssetType;
import org.sourcelab.kafka.webview.ui.manager.ui.datatable.Datatable;
import org.sourcelab.kafka.webview.ui.manager.ui.datatable.DatatableColumn;
import org.sourcelab.kafka.webview.ui.manager.ui.datatable.DatatableFilter;
Expand All @@ -45,6 +46,8 @@
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
Expand Down Expand Up @@ -179,7 +182,10 @@ public String datatable(
public String view(
@PathVariable final Long id,
final RedirectAttributes redirectAttributes,
final Model model) {
final Model model,
final HttpServletRequest request,
final HttpServletResponse response
) {

// Retrieve the view
final Optional<View> viewOptional = viewRepository.findById(id);
Expand All @@ -192,6 +198,10 @@ public String view(
}
final View view = viewOptional.get();

// Add most recently used asset
getMostRecentAssetStorage(request, response)
.addMostRecentAssetId(RecentAssetType.VIEW, view.getId());

// Setup breadcrumbs
new BreadCrumbManager(model)
.addCrumb("View", "/view")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package org.sourcelab.kafka.webview.ui.manager.ui.recentasset;


public class RecentAsset {
private final String name;
private final long id;
private final String url;

public RecentAsset(final String name, final long id, final String url) {
this.name = name;
this.id = id;
this.url = url;
}

public String getName() {
return name;
}

public long getId() {
return id;
}

public String getUrl() {
return url;
}

@Override
public String toString() {
return "RecentAsset{"
+ "name='" + name + '\''
+ ", id=" + id
+ ", url='" + url + '\''
+ '}';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package org.sourcelab.kafka.webview.ui.manager.ui.recentasset;

import org.sourcelab.kafka.webview.ui.repository.ClusterRepository;
import org.sourcelab.kafka.webview.ui.repository.ViewRepository;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

/**
*
*/
public class RecentAssetManager {
private final ClusterRepository clusterRepository;
private final ViewRepository viewRepository;

@Autowired
public RecentAssetManager(final ClusterRepository clusterRepository, final ViewRepository viewRepository) {
this.clusterRepository = Objects.requireNonNull(clusterRepository);
this.viewRepository = Objects.requireNonNull(viewRepository);
}

public List<RecentAsset> getRecentAssets(final RecentAssetType type, final List<Long> ids) {
if (ids.isEmpty()) {
return Collections.emptyList();
}

switch (type) {
case CLUSTER:
return retrieveClusters(ids);
case VIEW:
return retrieveViews(ids);
default:
return Collections.emptyList();
}
}

private List<RecentAsset> retrieveViews(final List<Long> ids) {
final List<RecentAsset> recentAssets = new ArrayList<>();

for (final long id : ids) {
viewRepository.findById(id).ifPresent((view) -> {
recentAssets.add(new RecentAsset(
view.getName(),
view.getId(),
"/view/read/" + view.getId()
));
});
}
return Collections.unmodifiableList(recentAssets);
}

private List<RecentAsset> retrieveClusters(final List<Long> ids) {
final List<RecentAsset> recentAssets = new ArrayList<>();

for (final long id : ids) {
clusterRepository.findById(id).ifPresent((cluster) -> {
recentAssets.add(new RecentAsset(
cluster.getName(),
cluster.getId(),
"/cluster/read/" + cluster.getId()
));
});
}
return Collections.unmodifiableList(recentAssets);
}


}
Loading