Skip to content

Commit

Permalink
UI changed according to backend
Browse files Browse the repository at this point in the history
  • Loading branch information
hmarkc committed Aug 30, 2021
1 parent 40bceb1 commit e2b9875
Show file tree
Hide file tree
Showing 71 changed files with 650 additions and 9,307 deletions.
142 changes: 23 additions & 119 deletions src/main/java/org/jenkinsci/plugins/lucene/search/Field.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,6 @@
package org.jenkinsci.plugins.lucene.search;

import hudson.model.Result;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.Cause;
import hudson.model.Job;
import hudson.model.Run;
import hudson.scm.ChangeLogSet;
import hudson.tasks.Publisher;
import hudson.model.*;

import java.io.IOException;
import java.util.Arrays;
Expand All @@ -16,16 +9,10 @@
import java.util.Map;

import org.apache.commons.io.output.ByteArrayOutputStream;
import org.jenkinsci.plugins.lucene.search.artifact.ArtifactIndexer;

public enum Field {
ID("id", DefaultSearchable.FALSE, Numeric.TRUE, Persist.TRUE) {
@Override
public String getValue(Run<?, ?> build) {
return build.getId();
}
},
PROJECT_NAME("projectname", Persist.TRUE) {

PROJECT_NAME("j", Persist.TRUE) {
public String getValue(final Run<?, ?> build) {
StringBuilder builder = new StringBuilder();
if (!build.getParent().getParent().getDisplayName().equalsIgnoreCase("jenkins")) {
Expand All @@ -36,36 +23,34 @@ public String getValue(final Run<?, ?> build) {
}
},

PROJECT_DISPLAY_NAME("projectdisplayname", Persist.TRUE) {
BUILD_NUMBER("n", DefaultSearchable.FALSE, Numeric.TRUE, Persist.TRUE) {
@Override
public String getValue(Run<?, ?> build) {
StringBuilder builder = new StringBuilder();
if (!build.getParent().getParent().getDisplayName().equalsIgnoreCase("jenkins")) {
builder.append(build.getParent().getParent().getDisplayName()).append("/");
}
builder.append(build.getParent().getDisplayName());
return builder.toString();
}
},

BUILD_NUMBER("buildnumber", DefaultSearchable.FALSE, Numeric.TRUE, Persist.TRUE) {
@Override
public Integer getValue(Run<?, ?> build) {
return build.getNumber();
return String.valueOf(build.getNumber());
}
},

RESULT("result", Persist.TRUE) {
BUILD_DISPLAY_NAME("d", Persist.TRUE) {
@Override
public Result getValue(Run<?, ?> build) {
return build.getResult();
public String getValue(Run<?, ?> build) {
return build.getDisplayName();
}
},

DURATION("duration", DefaultSearchable.FALSE) {
BUILD_PARAMETER("p", Persist.TRUE) {
@Override
public Long getValue(Run<?, ?> build) {
return build.getDuration();
public String getValue(Run<?, ?> build) {
ParametersAction parametersAction = build.getAction(ParametersAction.class);
if (parametersAction != null) {
List<ParameterValue> parameters = parametersAction.getParameters();
StringBuilder builder = new StringBuilder();
for (ParameterValue value : parameters) {
builder.append(value.getValue()).append(" ");
}
return builder.toString();
} else {
return null;
}
}
},

Expand All @@ -75,99 +60,18 @@ public Long getValue(Run<?, ?> build) {
return build.getStartTimeInMillis();
}
},
BUILT_ON("builton") {
@Override
public String getValue(Run<?, ?> build) {
if (build.getExecutor() != null) {
return build.getExecutor().getDisplayName();
} else {
return "null";
}
}
},
START_CAUSE("startcause") {
@Override
public String getValue(Run<?, ?> build) {
StringBuilder shortDescriptions = new StringBuilder();
for (Cause cause : build.getCauses()) {
shortDescriptions.append(" ").append(cause.getShortDescription());
}
return shortDescriptions.toString();
}
},
BALL_COLOR("color", DefaultSearchable.FALSE, Persist.TRUE) {
@Override
public String getValue(Run<?, ?> build) {
return build.getIconColor().name();
}
},

CONSOLE("console", Persist.TRUE) {
CONSOLE("c", Persist.TRUE) {
@Override
public String getValue(Run<?, ?> build) {
try {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
build.getLogText().writeLogTo(0, byteArrayOutputStream);
return byteArrayOutputStream.toString();
} catch (IOException e) {
// Probably won't happen, but don't silently swallow exceptions at least
throw new RuntimeException(e.getMessage(), e);
return null;
}
}
},

CHANGE_LOG("changelog", Persist.TRUE) {
@Override
public Object getValue(Run<?, ?> run) {
StringBuilder sb = new StringBuilder();
if (run instanceof AbstractBuild) {
//To add support for workflow this function needs to take a Run instead of AbstractBuild.
// However I can't find the equivalent functions using the abstract form so will use instance of until I find a more permanent fix

AbstractBuild<?, ?> build = (AbstractBuild<?, ?>) run;

ChangeLogSet<? extends ChangeLogSet.Entry> changeSet = build.getChangeSet();

if (changeSet != null) {
for (ChangeLogSet.Entry entry : build.getChangeSet()) {
sb.append("author:").append(entry.getAuthor()).append('\n');
sb.append("commitid:").append(entry.getCommitId()).append('\n');
sb.append("message:").append(entry.getMsg()).append('\n');
for (String path : entry.getAffectedPaths()) {
sb.append(path).append('\n');
}
}
}
}
return sb.toString();
}
},

ARTIFACTS("artifacts", Persist.TRUE) {
@Override
public Object getValue(Run<?, ?> build) {
Job<?, ?> p = build.getParent();
//To add support for workflow this function needs to take a Run instead of AbstractBuild.
// However I can't find the equivalent functions using the abstract form so will use instance of until I find a more permanent fix

if (p instanceof AbstractProject && build instanceof AbstractBuild<?, ?>) {
AbstractProject<?, ?> proj = (AbstractProject<?, ?>) p;
for (Publisher publisher : proj.getPublishersList()) {
if (publisher instanceof ArtifactIndexer) {
ArtifactIndexer ai = (ArtifactIndexer) publisher;
return ai.getIndexableData((AbstractBuild<?, ?>) build);
}
}

}
return "";
}
},

URL("url", Persist.TRUE, DefaultSearchable.FALSE) {
@Override public Object getValue(Run<?, ?> build) {
return build.getParent().getParent().getUrl() + build.getParent().getSearchUrl() + build.getSearchUrl();
}
};

private static Map<String, Field> index;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package org.jenkinsci.plugins.lucene.search;

import javax.inject.Inject;

import hudson.Extension;
import hudson.model.Item;
import hudson.model.listeners.ItemListener;
import org.apache.log4j.Logger;
import org.jenkinsci.plugins.lucene.search.databackend.SearchBackendManager;

import java.io.IOException;

@Extension
public class FreeTextItemListener extends ItemListener {

Logger logger = Logger.getLogger(FreeTextItemListener.class);

@Inject
SearchBackendManager searchBackendManager;

@Override
public void onDeleted(Item item) {
try {
searchBackendManager.deleteJob(item.getName());
} catch (IOException e) {
logger.error("When deleting the job index: ", e);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,14 @@
import javax.annotation.Nonnull;
import javax.inject.Inject;

import org.apache.log4j.Logger;
import org.jenkinsci.plugins.lucene.search.databackend.SearchBackendManager;

@Extension
public class FreeTextRunListener extends RunListener<Run<?, ?>> {

Logger logger = Logger.getLogger(FreeTextRunListener.class);

@Inject
SearchBackendManager searchBackendManager;

Expand All @@ -23,12 +26,16 @@ public void onCompleted(final Run<?, ?> build, @Nonnull final TaskListener liste
try {
searchBackendManager.storeBuild(build);
} catch (IOException e) {
throw new RuntimeException(e);
logger.error("When saving the finished build index: ", e);
}
}

@Override
public void onDeleted(final Run<?, ?> build) {
searchBackendManager.removeBuild(build);
try {
searchBackendManager.removeBuild(build);
} catch (IOException e) {
logger.error("When removing the deleted build index: ", e);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package org.jenkinsci.plugins.lucene.search;

import hudson.Extension;
import hudson.XmlFile;
import hudson.model.FreeStyleProject;
import hudson.model.Run;
import hudson.model.Saveable;
import hudson.model.listeners.SaveableListener;
import org.apache.log4j.Logger;
import org.jenkinsci.plugins.lucene.search.databackend.SearchBackendManager;
import org.jenkinsci.plugins.lucene.search.management.LuceneManager;

import javax.inject.Inject;
import java.io.IOException;
import java.util.List;


@Extension
public class FreeTextSaveableListener extends SaveableListener {

Logger logger = Logger.getLogger(FreeTextSaveableListener.class);

@Inject
SearchBackendManager searchBackendManager;

@Override
public void onChange(Saveable o, XmlFile file) {
if (o instanceof Run) {
Run run = (Run) o;
try {
searchBackendManager.removeBuild(run);
searchBackendManager.storeBuild(run);
} catch (IOException e) {
logger.error("update index failed: ", e);
}
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,11 @@
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.bind.JavaScriptMethod;

import javax.servlet.ServletException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;

Expand All @@ -21,14 +20,23 @@ public class FreeTextSearch extends Search {

private final SearchBackendManager manager;

private List<FreeTextSearchItem> hits = Collections.emptyList();
private final Map<Integer, List<FreeTextSearchItem>> pageMap;

private int curr_page;

private int max_page;

private String query;

public FreeTextSearch(final SearchBackendManager manager) {
this.manager = manager;
curr_page = 0;
max_page = Integer.MAX_VALUE;
pageMap = new HashMap<>();
}

public List<FreeTextSearchItem> getHits() {
return hits;
public int getPageNum() {
return curr_page;
}

private List<FreeTextSearchItem> normalSearch(StaplerRequest req, String query) {
Expand All @@ -54,16 +62,39 @@ private List<FreeTextSearchItem> normalSearch(StaplerRequest req, String query)
return searchResults;
}

public List<FreeTextSearchItem> getPage() {
List<FreeTextSearchItem> page = pageMap.get(curr_page);
if (page == null) {
page = new ArrayList<>(manager.getHits(query, true));
if (page.isEmpty()) {
max_page = curr_page;
}
pageMap.put(curr_page, page);
}
return page;
}

public boolean isEmptyResult() {
return hits.isEmpty();
return getPage().isEmpty();
}

@JavaScriptMethod
public boolean isFirstPage() {
return curr_page <= 1;
}

@JavaScriptMethod
public boolean isLastPage() {
return curr_page >= max_page;
}

@Override
public void doIndex(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
String query = req.getParameter("q");
query = req.getParameter("q");
if (query != null) {
hits = normalSearch(req, query);
hits.addAll(manager.getHits(query, true));
List<FreeTextSearchItem> hits = normalSearch(req, query);
hits.addAll(manager.getHits(query, false));
pageMap.put(1, hits);
}
req.getView(this, "search-results.jelly").forward(req, rsp);
}
Expand All @@ -75,7 +106,15 @@ public SearchResult getSuggestions(final StaplerRequest req, @QueryParameter fin
return suggestedItems;
}

public List<SearchFieldDefinition> getSearchHelp() throws IOException {
return manager.getSearchFieldDefinitions();
@JavaScriptMethod
public List<FreeTextSearchItem> prev() {
curr_page = Math.max(curr_page - 1, 1);
return getPage();
}

@JavaScriptMethod
public List<FreeTextSearchItem> next() {
curr_page = Math.min(curr_page + 1, max_page);
return getPage();
}
}

0 comments on commit e2b9875

Please sign in to comment.