Skip to content

Commit 0e7357e

Browse files
committed
feat: display plugin component and table and allow filtering
1 parent 87a4881 commit 0e7357e

8 files changed

Lines changed: 132 additions & 49 deletions

File tree

owlplug-client/src/main/java/com/owlplug/core/controllers/OptionsController.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -179,12 +179,14 @@ public void initialize() {
179179
}
180180
try {
181181
long timeout = Long.parseLong(newValue);
182-
if (timeout >= 0) {
182+
if (timeout >= 0 && timeout <= 3600) {
183183
this.getPreferences().putLong(ApplicationDefaults.NATIVE_LOADER_TIMEOUT_KEY, timeout);
184184
nativeHostService.setScannerTimeout(timeout);
185+
} else {
186+
loaderTimeoutTextField.setText(oldValue);
185187
}
186188
} catch (NumberFormatException ignored) {
187-
// ignore invalid input
189+
// Ignore in case of invalid values (empty string)
188190
}
189191
});
190192

@@ -314,7 +316,7 @@ public void refreshView() {
314316
NativePluginLoader pluginLoader = nativeHostService.getCurrentPluginLoader();
315317
pluginNativeComboBox.getSelectionModel().select(pluginLoader);
316318

317-
long timeout = this.getPreferences().getLong(ApplicationDefaults.NATIVE_LOADER_TIMEOUT_KEY, 30L);
319+
long timeout = this.getPreferences().getLong(ApplicationDefaults.NATIVE_LOADER_TIMEOUT_KEY, 10L);
318320
loaderTimeoutTextField.setText(String.valueOf(timeout));
319321
updateScannerTimeoutFieldState();
320322

owlplug-client/src/main/java/com/owlplug/plugin/controllers/PluginInfoController.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,8 @@ public void refresh() {
206206
String scanError = plugin.getFootprint().getLastScanStatus();
207207
lastScanErrorLabel.setText(scanError != null ? scanError : "");
208208
lastScanErrorLabel.setVisible(scanError != null);
209+
} else {
210+
lastScanErrorLabel.setVisible(false);
209211
}
210212

211213
setPluginImage();

owlplug-client/src/main/java/com/owlplug/plugin/controllers/PluginTableController.java

Lines changed: 51 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.owlplug.core.utils.FileUtils;
2424
import com.owlplug.core.utils.PlatformUtils;
2525
import com.owlplug.plugin.controllers.dialogs.DisablePluginDialogController;
26+
import com.owlplug.plugin.model.IPlugin;
2627
import com.owlplug.plugin.model.Plugin;
2728
import com.owlplug.plugin.model.PluginFormat;
2829
import com.owlplug.plugin.model.PluginState;
@@ -63,9 +64,9 @@ public class PluginTableController extends BaseController {
6364
private PluginService pluginService;
6465

6566
private final SimpleStringProperty search = new SimpleStringProperty();
66-
private final TableView<Plugin> tableView;
67+
private final TableView<IPlugin> tableView;
6768

68-
private final ObservableList<Plugin> pluginList;
69+
private final ObservableList<IPlugin> pluginList;
6970

7071

7172
public PluginTableController() {
@@ -75,7 +76,7 @@ public PluginTableController() {
7576
createColumns();
7677

7778
tableView.setRowFactory(tv -> {
78-
TableRow<Plugin> row = new TableRow<>();
79+
TableRow<IPlugin> row = new TableRow<>();
7980
row.itemProperty().addListener((obs, oldItem, newItem) -> {
8081
if (newItem != null) {
8182
row.setContextMenu(createPluginContextMenu(newItem));
@@ -88,7 +89,7 @@ public PluginTableController() {
8889
pluginList = FXCollections.observableArrayList();
8990
// Wraps an ObservableList and filters its content using the provided Predicate.
9091
// All changes in the ObservableList are propagated immediately to the FilteredList.
91-
FilteredList<Plugin> filteredPluginList = new FilteredList<>(pluginList);
92+
FilteredList<IPlugin> filteredPluginList = new FilteredList<>(pluginList);
9293

9394
filteredPluginList.predicateProperty().bind(Bindings.createObjectBinding(() -> {
9495
if (search.getValue() == null || search.getValue().isEmpty()) {
@@ -99,17 +100,17 @@ public PluginTableController() {
99100
search.getValue().toLowerCase()));
100101
}, search));
101102

102-
SortedList<Plugin> sortedPluginList = new SortedList<>(filteredPluginList);
103+
SortedList<IPlugin> sortedPluginList = new SortedList<>(filteredPluginList);
103104
tableView.setItems(sortedPluginList);
104105
sortedPluginList.comparatorProperty().bind(tableView.comparatorProperty());
105106

106107
}
107108

108109
private void createColumns() {
109-
TableColumn<Plugin, String> nameColumn = new TableColumn<>("Name");
110+
TableColumn<IPlugin, String> nameColumn = new TableColumn<>("Name");
110111
nameColumn.setCellValueFactory(cellData -> new SimpleStringProperty(cellData.getValue().getName()));
111-
TableColumn<Plugin, PluginFormat> formatColumn = new TableColumn<>("Format");
112-
formatColumn.setCellValueFactory(cellData -> new SimpleObjectProperty<>(cellData.getValue().getFormat()));
112+
TableColumn<IPlugin, PluginFormat> formatColumn = new TableColumn<>("Format");
113+
formatColumn.setCellValueFactory(cellData -> new SimpleObjectProperty<>(cellData.getValue().asPlugin().getFormat()));
113114
formatColumn.setCellFactory(e -> new TableCell<>() {
114115
@Override
115116
public void updateItem(PluginFormat item, boolean empty) {
@@ -123,17 +124,17 @@ public void updateItem(PluginFormat item, boolean empty) {
123124
}
124125
}
125126
});
126-
TableColumn<Plugin, String> manufacturerColumn = new TableColumn<>("Manufacturer");
127+
TableColumn<IPlugin, String> manufacturerColumn = new TableColumn<>("Manufacturer");
127128
manufacturerColumn.setCellValueFactory(cellData ->
128129
new SimpleStringProperty(cellData.getValue().getManufacturerName()));
129-
TableColumn<Plugin, String> versionColumn = new TableColumn<>("Version");
130+
TableColumn<IPlugin, String> versionColumn = new TableColumn<>("Version");
130131
versionColumn.setCellValueFactory(cellData -> new SimpleStringProperty(cellData.getValue().getVersion()));
131-
TableColumn<Plugin, String> categoryColumn = new TableColumn<>("Category");
132+
TableColumn<IPlugin, String> categoryColumn = new TableColumn<>("Category");
132133
categoryColumn.setCellValueFactory(cellData -> new SimpleStringProperty(cellData.getValue().getCategory()));
133134
// Directory Column
134-
TableColumn<Plugin, String> directoryColumn = new TableColumn<>("Directory");
135+
TableColumn<IPlugin, String> directoryColumn = new TableColumn<>("Directory");
135136
directoryColumn.setCellValueFactory(cellData -> new SimpleStringProperty(
136-
FileUtils.getParentDirectoryName(cellData.getValue().getPath())));
137+
FileUtils.getParentDirectoryName(cellData.getValue().asPlugin().getPath())));
137138
directoryColumn.setCellFactory(e -> new TableCell<>() {
138139
@Override
139140
public void updateItem(String item, boolean empty) {
@@ -148,9 +149,9 @@ public void updateItem(String item, boolean empty) {
148149
}
149150
});
150151
// Scan Directory Column
151-
TableColumn<Plugin, String> scanDirectoryColumn = new TableColumn<>("Scan Dir.");
152+
TableColumn<IPlugin, String> scanDirectoryColumn = new TableColumn<>("Scan Dir.");
152153
scanDirectoryColumn.setCellValueFactory(cellData -> new SimpleStringProperty(
153-
FileUtils.getFilename(cellData.getValue().getScanDirectoryPath())));
154+
FileUtils.getFilename(cellData.getValue().asPlugin().getScanDirectoryPath())));
154155
scanDirectoryColumn.setCellFactory(e -> new TableCell<>() {
155156
@Override
156157
public void updateItem(String item, boolean empty) {
@@ -165,9 +166,9 @@ public void updateItem(String item, boolean empty) {
165166
}
166167
});
167168
// Plugin State Column
168-
TableColumn<Plugin, PluginState> stateColumn = new TableColumn<>("State");
169+
TableColumn<IPlugin, PluginState> stateColumn = new TableColumn<>("State");
169170
stateColumn.setCellValueFactory(cellData -> new SimpleObjectProperty<>(
170-
pluginService.getPluginState(cellData.getValue())));
171+
pluginService.getPluginState(cellData.getValue().asPlugin())));
171172
stateColumn.setCellFactory(e -> new TableCell<>() {
172173
@Override
173174
public void updateItem(PluginState item, boolean empty) {
@@ -188,10 +189,16 @@ public void updateItem(PluginState item, boolean empty) {
188189

189190
public void setPlugins(Iterable<Plugin> plugins) {
190191
pluginList.clear();
191-
plugins.forEach(pluginList::add);
192+
plugins.forEach(p -> {
193+
pluginList.add(p);
194+
if (p.getComponents().size() > 1) {
195+
pluginList.addAll(p.getComponents());
196+
}
197+
});
198+
192199
}
193200

194-
public TableView<Plugin> getTableView() {
201+
public TableView<IPlugin> getTableView() {
195202
return tableView;
196203
}
197204

@@ -201,7 +208,8 @@ public void setNodeManaged(boolean isManaged) {
201208
}
202209

203210
public void selectPluginById(long id) {
204-
for (Plugin plugin : pluginList) {
211+
for (IPlugin p : pluginList) {
212+
Plugin plugin = p.asPlugin(); // Get plugin or component parent
205213
if (plugin.getId().equals(id)) {
206214
tableView.getSelectionModel().select(plugin);
207215
break;
@@ -217,37 +225,39 @@ public void refresh() {
217225
tableView.refresh();
218226
}
219227

220-
private ContextMenu createPluginContextMenu(Plugin plugin) {
228+
private ContextMenu createPluginContextMenu(IPlugin plugin) {
221229

222230
ContextMenu menu = new ContextMenu();
223231
MenuItem openDirItem = new MenuItem("Reveal in File Explorer");
224232
openDirItem.setOnAction(e -> {
225-
File pluginFile = new File(plugin.getPath());
233+
File pluginFile = new File(plugin.asPlugin().getPath());
226234
PlatformUtils.openFromDesktop(pluginFile.getParentFile());
227235
});
228236

229237
menu.getItems().addAll(openDirItem, new SeparatorMenuItem());
230238

231-
if (plugin.isDisabled()) {
232-
MenuItem enableItem = new MenuItem("Enable plugin");
233-
enableItem.setOnAction(e -> {
234-
Async.run(() -> pluginService.enablePlugin(plugin));
235-
});
236-
menu.getItems().add(enableItem);
237-
} else {
238-
MenuItem disableItem = new MenuItem("Disable plugin");
239-
disableItem.setOnAction(e -> {
240-
if (this.getPreferences().getBoolean(ApplicationDefaults.SHOW_DIALOG_DISABLE_PLUGIN_KEY, true)) {
241-
this.disableController.setPlugin(plugin);
242-
this.disableController.show();
243-
} else {
244-
this.disableController.disablePluginWithoutPrompt(plugin);
245-
}
246-
});
247-
menu.getItems().add(disableItem);
248-
}
239+
if (plugin instanceof Plugin p) {
240+
if (p.isDisabled()) {
241+
MenuItem enableItem = new MenuItem("Enable plugin");
242+
enableItem.setOnAction(e -> {
243+
Async.run(() -> pluginService.enablePlugin(p));
244+
});
245+
menu.getItems().add(enableItem);
246+
} else {
247+
MenuItem disableItem = new MenuItem("Disable plugin");
248+
disableItem.setOnAction(e -> {
249+
if (this.getPreferences().getBoolean(ApplicationDefaults.SHOW_DIALOG_DISABLE_PLUGIN_KEY, true)) {
250+
this.disableController.setPlugin(p);
251+
this.disableController.show();
252+
} else {
253+
this.disableController.disablePluginWithoutPrompt(p);
254+
}
255+
});
256+
menu.getItems().add(disableItem);
257+
}
249258

250-
menu.getItems().add(new SeparatorMenuItem());
259+
menu.getItems().add(new SeparatorMenuItem());
260+
}
251261

252262
MenuItem infoDisplayItem = new MenuItem("Toggle info display");
253263
menu.getItems().add(infoDisplayItem);

owlplug-client/src/main/java/com/owlplug/plugin/controllers/PluginTreeViewController.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.owlplug.core.controllers.BaseController;
2222
import com.owlplug.core.ui.FilterableTreeItem;
2323
import com.owlplug.plugin.model.IDirectory;
24+
import com.owlplug.plugin.model.IPlugin;
2425
import com.owlplug.plugin.model.Plugin;
2526
import com.owlplug.plugin.model.PluginComponent;
2627
import com.owlplug.plugin.model.PluginDirectory;
@@ -73,7 +74,7 @@ public PluginTreeViewController() {
7374
return null;
7475
}
7576
return (item) -> {
76-
if (item instanceof Plugin plugin) {
77+
if (item instanceof IPlugin plugin) {
7778
return plugin.getName().toLowerCase().contains(search.getValue().toLowerCase())
7879
|| (plugin.getCategory() != null && plugin.getCategory().toLowerCase().contains(
7980
search.getValue().toLowerCase()));
@@ -89,7 +90,7 @@ public PluginTreeViewController() {
8990
return null;
9091
}
9192
return (item) -> {
92-
if (item instanceof Plugin plugin) {
93+
if (item instanceof IPlugin plugin) {
9394
return plugin.getName().toLowerCase().contains(search.getValue().toLowerCase())
9495
|| (plugin.getCategory() != null && plugin.getCategory().toLowerCase().contains(search.getValue().toLowerCase()));
9596
} else {
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/* OwlPlug
2+
* Copyright (C) 2021 Arthur <dropsnorz@gmail.com>
3+
*
4+
* This file is part of OwlPlug.
5+
*
6+
* OwlPlug is free software: you can redistribute it and/or modify
7+
* it under the terms of the GNU General Public License version 3
8+
* as published by the Free Software Foundation.
9+
*
10+
* OwlPlug is distributed in the hope that it will be useful,
11+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
* GNU General Public License for more details.
14+
*
15+
* You should have received a copy of the GNU General Public License
16+
* along with OwlPlug. If not, see <https://www.gnu.org/licenses/>.
17+
*/
18+
19+
20+
package com.owlplug.plugin.model;
21+
22+
public interface IPlugin {
23+
24+
/**
25+
* Retrieve the associated Plugin object from this Plugin object.
26+
* In case of Component, it returns the parent plugin.
27+
* In case of Plugin, it should return itself.
28+
* @return plugin
29+
*/
30+
Plugin asPlugin();
31+
32+
/**
33+
* Get object identifier.
34+
* The identifier is not guaranteed to be unique across Plugin and Component.
35+
* @return id
36+
*/
37+
Long getId();
38+
39+
String getName();
40+
41+
String getDescriptiveName();
42+
43+
String getVersion();
44+
45+
String getUid();
46+
47+
String getCategory();
48+
49+
String getManufacturerName();
50+
51+
String getIdentifier();
52+
53+
String getBundleId();
54+
55+
PluginType getType();
56+
57+
}

owlplug-client/src/main/java/com/owlplug/plugin/model/Plugin.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
@Inheritance
4343
@Table(indexes = { @Index(name = "IDX_PLUGIN_ID", columnList = "id"),
4444
@Index(name = "IDX_PLUGIN_NAME", columnList = "name") })
45-
public class Plugin {
45+
public class Plugin implements IPlugin {
4646

4747
@Id
4848
@GeneratedValue(strategy = GenerationType.AUTO)
@@ -238,4 +238,9 @@ public Set<PluginComponent> getComponents() {
238238
public void setComponents(Set<PluginComponent> components) {
239239
this.components = components;
240240
}
241+
242+
@Override
243+
public Plugin asPlugin() {
244+
return this;
245+
}
241246
}

owlplug-client/src/main/java/com/owlplug/plugin/model/PluginComponent.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
package com.owlplug.plugin.model;
2020

2121
import com.fasterxml.jackson.annotation.JsonIgnore;
22+
import jakarta.persistence.Column;
2223
import jakarta.persistence.Entity;
2324
import jakarta.persistence.EnumType;
2425
import jakarta.persistence.Enumerated;
@@ -31,7 +32,7 @@
3132

3233
@Entity
3334
@Table(indexes = { @Index(name = "IDX_PLUGIN_COMPONENT_ID", columnList = "id") })
34-
public class PluginComponent {
35+
public class PluginComponent implements IPlugin {
3536

3637
@Id
3738
@GeneratedValue(strategy = GenerationType.AUTO)
@@ -48,6 +49,7 @@ public class PluginComponent {
4849
@Enumerated(EnumType.STRING)
4950
protected PluginType type;
5051

52+
5153
@ManyToOne
5254
@JsonIgnore
5355
private Plugin plugin;
@@ -140,4 +142,8 @@ public void setPlugin(Plugin plugin) {
140142
this.plugin = plugin;
141143
}
142144

145+
@Override
146+
public Plugin asPlugin() {
147+
return this.plugin;
148+
}
143149
}

owlplug-host/src/main/java/com/owlplug/host/loaders/EmbeddedScannerPluginLoader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ public List<NativePlugin> loadPlugin(String path) throws NativeLoaderException {
130130
log.debug("Response received from scanner");
131131
log.debug(result.getOutput());
132132

133-
if (result.getExitValue() >= 0) {
133+
if (result.getExitValue() == 0) {
134134
log.debug("Extracting XML from content received by the scanner");
135135
return createPluginsFromCommandOutput(result.getOutput());
136136
} else {

0 commit comments

Comments
 (0)