Skip to content

Commit

Permalink
Merge pull request #6112 from chrisrueger/improve-unresolved-requirem…
Browse files Browse the repository at this point in the history
…ents

Add search bar to Unresolved requirements in ResolutionFailedPanel
  • Loading branch information
chrisrueger committed May 7, 2024
2 parents d45e35c + e83718a commit df00b2a
Show file tree
Hide file tree
Showing 2 changed files with 105 additions and 5 deletions.
Expand Up @@ -9,6 +9,7 @@
import org.bndtools.core.resolve.ResolutionResult;
import org.bndtools.core.ui.icons.Icons;
import org.bndtools.core.ui.resource.RequirementWithResourceLabelProvider;
import org.bndtools.utils.swt.FilterPanelPart;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
Expand All @@ -35,6 +36,7 @@
import org.osgi.service.resolver.ResolutionException;

import biz.aQute.resolve.ResolveProcess;
import bndtools.Plugin;
import bndtools.model.obr.SorterComparatorAdapter;

public class ResolutionFailurePanel {
Expand All @@ -50,7 +52,13 @@ public class ResolutionFailurePanel {
private Section sectProcessingErrors;
private Section sectUnresolved;

private UnresolvedRequirementsContentProvider unresolvedRequirementsContentProvider;
private final FilterPanelPart unresolvedFilterPart = new FilterPanelPart(Plugin.getDefault()
.getScheduler());
private static final String SEARCHSTRING_HINT = "Enter search string to filter unresolved requirements (Space to separate terms; '*' for partial matches)";

private static final boolean failureTreeMode = true;
private RequirementWithResourceLabelProvider requirementWithResourceLabelProvider;

public void createControl(final Composite parent) {
FormToolkit toolkit = new FormToolkit(parent.getDisplay());
Expand Down Expand Up @@ -85,10 +93,18 @@ public void createControl(final Composite parent) {
gd.heightHint = 300;
sectUnresolved.setLayoutData(gd);


unresolvedViewer = new TreeViewer(treeUnresolved);
unresolvedViewer.setContentProvider(new UnresolvedRequirementsContentProvider());
unresolvedViewer.setLabelProvider(new RequirementWithResourceLabelProvider());

requirementWithResourceLabelProvider = new RequirementWithResourceLabelProvider();
unresolvedViewer.setLabelProvider(requirementWithResourceLabelProvider);
unresolvedRequirementsContentProvider = new UnresolvedRequirementsContentProvider(
requirementWithResourceLabelProvider);
unresolvedViewer.setContentProvider(unresolvedRequirementsContentProvider);
setFailureViewMode();

addSearchbarForUnresolved();

}

public Control getControl() {
Expand Down Expand Up @@ -301,4 +317,15 @@ private void appendLabels(Object unresolvedTreeElem, ITreeContentProvider conten

void dispose() {}

private void addSearchbarForUnresolved() {
Control reqsFilterPanel = unresolvedFilterPart.createControl(composite, 5, 5);
unresolvedFilterPart.setHint(SEARCHSTRING_HINT);
unresolvedFilterPart.addPropertyChangeListener(event -> {
String filter = (String) event.getNewValue();

unresolvedRequirementsContentProvider.setFilter(filter);
unresolvedViewer.refresh();
});
}

}
@@ -1,23 +1,58 @@
package org.bndtools.core.resolve.ui;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import org.bndtools.core.ui.resource.RequirementWithResourceLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.osgi.resource.Requirement;

import aQute.libg.glob.Glob;

public class UnresolvedRequirementsContentProvider implements ITreeContentProvider {

private String wildcardFilter = null;
private RequirementWithResourceLabelProvider labelProvider;

public UnresolvedRequirementsContentProvider(RequirementWithResourceLabelProvider labelProvider) {
this.labelProvider = labelProvider;
}

@Override
public Object[] getElements(Object inputElement) {

List<Object[]> arrays = new LinkedList<>();

if (inputElement instanceof Object[])
return (Object[]) inputElement;
arrays.add((Object[]) inputElement);

if (inputElement instanceof Collection<?>) {
Collection<?> coll = (Collection<?>) inputElement;
return coll.toArray();
arrays.add(coll.toArray());
}

return null;
return filter(flatten(arrays));
}

private Object[] flatten(List<Object[]> arrays) {
// Iterate over once to count the lengths
int length = 0;
for (Object[] array : arrays) {
length += array.length;
}
Object[] result = new Object[length];

// Iterate again to flatten out the arrays
int position = 0;
for (Object[] array : arrays) {
System.arraycopy(array, 0, result, position, array.length);
position += array.length;
}
return result;
}

@Override
Expand Down Expand Up @@ -50,4 +85,42 @@ public boolean hasChildren(Object element) {
return false;
}

private Object[] filter(Object[] array) {
List<Object> filteredResults = new ArrayList<>();
if (wildcardFilter == null || wildcardFilter.equals("*") || wildcardFilter.equals("")) {
return array;
} else {
String[] split = wildcardFilter.split("\\s+");
Glob globs[] = new Glob[split.length];
for (int i = 0; i < split.length; i++) {
globs[i] = new Glob(split[i].toLowerCase());
}

Arrays.stream(array)
.forEach(obj -> {

if (obj instanceof Requirement rw) {

for (Glob g : globs) {
if (g.matcher(labelProvider.getLabel(rw)
.toString()
.toLowerCase())
.find()) {
filteredResults.add(obj);
return;
}
}
}

});

}

return filteredResults.toArray();
}

public void setFilter(String filter) {
this.wildcardFilter = filter;
}

}

0 comments on commit df00b2a

Please sign in to comment.