Skip to content
This repository was archived by the owner on Jun 12, 2025. It is now read-only.

Commit 59fcd75

Browse files
committed
Added ability to use dependency injection in actions
Added AbstractClickAction Added ending all subprocess when the main process was set to end
1 parent f47259c commit 59fcd75

File tree

11 files changed

+106
-12
lines changed

11 files changed

+106
-12
lines changed

core/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<parent>
77
<groupId>pl.timsixth</groupId>
88
<artifactId>T-GuiApi</artifactId>
9-
<version>2.8.3</version>
9+
<version>2.9.0</version>
1010
</parent>
1111

1212
<artifactId>core</artifactId>

core/src/main/java/pl/timsixth/guilibrary/core/manager/YAMLMenuManager.java

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@
1818
import pl.timsixth.guilibrary.core.util.ItemBuilder;
1919
import pl.timsixth.guilibrary.core.util.ItemUtil;
2020

21+
import java.lang.reflect.Constructor;
22+
import java.lang.reflect.Field;
23+
import java.lang.reflect.InvocationTargetException;
24+
import java.lang.reflect.Modifier;
2125
import java.util.*;
2226
import java.util.stream.Collectors;
2327

@@ -129,8 +133,29 @@ private void setAction(ConfigurationSection slotSection, MenuItem menuItem) {
129133

130134
ClickAction clickAction;
131135
try {
132-
clickAction = action.getClass().newInstance();
133-
} catch (InstantiationException | IllegalAccessException e) {
136+
List<Field> fields = getAllFinalFields(action);
137+
138+
if (fields.isEmpty()) {
139+
clickAction = action.getClass().newInstance();
140+
} else {
141+
Class<?>[] types = fields.stream()
142+
.map(Field::getType)
143+
.toArray(Class<?>[]::new);
144+
145+
Object[] values = fields.stream().map(field -> {
146+
try {
147+
return field.get(action);
148+
} catch (IllegalAccessException e) {
149+
throw new RuntimeException(e);
150+
}
151+
})
152+
.toArray(Object[]::new);
153+
154+
clickAction = action.getClass().getConstructor(types).newInstance(values);
155+
}
156+
157+
} catch (InstantiationException | IllegalAccessException | InvocationTargetException |
158+
NoSuchMethodException e) {
134159
throw new RuntimeException(e);
135160
}
136161

@@ -140,6 +165,32 @@ private void setAction(ConfigurationSection slotSection, MenuItem menuItem) {
140165
}
141166
}
142167

168+
private List<Field> getAllFinalFields(Action action) throws IllegalAccessException {
169+
List<Field> fields = new ArrayList<>();
170+
171+
Field[] declaredFields = action.getClass().getDeclaredFields();
172+
Constructor<?>[] constructors = action.getClass().getConstructors();
173+
174+
for (Field field : declaredFields) {
175+
field.setAccessible(true);
176+
177+
if (Modifier.isFinal(field.getModifiers())) {
178+
179+
for (Constructor<?> constructor : constructors) {
180+
Class<?>[] parameterTypes = constructor.getParameterTypes();
181+
182+
for (Class<?> parameterType : parameterTypes) {
183+
if (field.getType().equals(parameterType)) {
184+
fields.add(field);
185+
}
186+
}
187+
}
188+
}
189+
}
190+
191+
return fields;
192+
}
193+
143194
/**
144195
* Sets price of {@link MenuItem}
145196
*
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package pl.timsixth.guilibrary.core.model.action;
2+
3+
import pl.timsixth.guilibrary.core.model.action.click.ClickAction;
4+
5+
public abstract class AbstractClickAction extends AbstractAction implements ClickAction {
6+
public AbstractClickAction(String name) {
7+
super(name);
8+
}
9+
}

example-plugin/pom.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<parent>
77
<groupId>pl.timsixth</groupId>
88
<artifactId>T-GuiApi</artifactId>
9-
<version>2.8.3</version>
9+
<version>2.9.0</version>
1010
</parent>
1111

1212
<artifactId>example-plugin</artifactId>
@@ -15,12 +15,12 @@
1515
<dependency>
1616
<groupId>pl.timsixth</groupId>
1717
<artifactId>core</artifactId>
18-
<version>2.8.3</version>
18+
<version>2.9.0</version>
1919
</dependency>
2020
<dependency>
2121
<groupId>pl.timsixth</groupId>
2222
<artifactId>processes</artifactId>
23-
<version>2.8.3</version>
23+
<version>2.9.0</version>
2424
</dependency>
2525
</dependencies>
2626
<build>

example-plugin/src/main/java/pl/timsixth/guilibrary/example/GuiApiPlugin.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import pl.timsixth.guilibrary.core.model.pagination.PaginatedMenu;
1313
import pl.timsixth.guilibrary.example.action.ChooseUserGroupAction;
1414
import pl.timsixth.guilibrary.example.action.OpenPaginatedMenuAction;
15+
import pl.timsixth.guilibrary.example.action.DependencyInjectionAction;
1516
import pl.timsixth.guilibrary.example.command.TestGuiCommand;
1617
import pl.timsixth.guilibrary.example.command.UserCommand;
1718
import pl.timsixth.guilibrary.example.config.ConfigFile;
@@ -53,7 +54,7 @@ public void onEnable() {
5354
guiApi.setMenuManager(menuManager);
5455

5556
guiApi.registerDefaultActions();
56-
guiApi.getActionRegistration().register(new ChooseUserGroupAction(), new OpenPaginatedMenuAction());
57+
guiApi.getActionRegistration().register(new ChooseUserGroupAction(), new OpenPaginatedMenuAction(), new DependencyInjectionAction("test123"));
5758

5859
guiApi.registerMenuListener();
5960

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package pl.timsixth.guilibrary.example.action;
2+
3+
import org.bukkit.Bukkit;
4+
import org.bukkit.event.inventory.InventoryClickEvent;
5+
import pl.timsixth.guilibrary.core.model.MenuItem;
6+
import pl.timsixth.guilibrary.core.model.action.AbstractClickAction;
7+
8+
public class DependencyInjectionAction extends AbstractClickAction {
9+
10+
private final String text;
11+
12+
public DependencyInjectionAction(String text) {
13+
super("DEPENDENCY_INJECTION");
14+
this.text = text;
15+
}
16+
17+
@Override
18+
public void handleClickEvent(InventoryClickEvent event, MenuItem menuItem) {
19+
Bukkit.getLogger().info(text);
20+
}
21+
}

example-plugin/src/main/resources/guis.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,15 @@ guis:
4848
type: 'NONE'
4949
args:
5050
- ''
51+
3:
52+
material: APPLE
53+
displayname: '&cTest dependency injection action'
54+
lore:
55+
- 'Price {PRICE}'
56+
click_action:
57+
type: 'DEPENDENCY_INJECTION'
58+
args:
59+
- ''
5160
test2:
5261
displayname: '&a&ltest2'
5362
size: 54

example-plugin/src/main/resources/plugin.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: T-GuiApi
22
main: pl.timsixth.guilibrary.example.GuiApiPlugin
3-
version: '2.8.3'
3+
version: '2.9.0'
44
author: timsixth
55
api-version: 1.13
66
commands:

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>pl.timsixth</groupId>
88
<artifactId>T-GuiApi</artifactId>
9-
<version>2.8.3</version>
9+
<version>2.9.0</version>
1010
<packaging>pom</packaging>
1111
<modules>
1212
<module>core</module>

processes/pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<parent>
77
<groupId>pl.timsixth</groupId>
88
<artifactId>T-GuiApi</artifactId>
9-
<version>2.8.3</version>
9+
<version>2.9.0</version>
1010
</parent>
1111

1212
<artifactId>processes</artifactId>
@@ -25,7 +25,7 @@
2525
<dependency>
2626
<groupId>pl.timsixth</groupId>
2727
<artifactId>core</artifactId>
28-
<version>2.8.3</version>
28+
<version>2.9.0</version>
2929
</dependency>
3030
</dependencies>
3131
<properties>

processes/src/main/java/pl/timsixth/guilibrary/processes/manager/ProcessRunner.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,13 +103,16 @@ private static List<SubGuiProcess> configureSubProcesses(List<SubGuiProcess> sub
103103
}
104104

105105
/**
106-
* Ends process for player
106+
* Ends process for player, ends all subprocesses
107107
*
108108
* @param player player to end process
109109
* @param mainGuiProcess process to end
110110
*/
111111
public static void endProcess(Player player, MainGuiProcess mainGuiProcess) {
112112
mainGuiProcess.setEnded(true);
113+
114+
mainGuiProcess.getGuiProcesses().forEach(subGuiProcess -> subGuiProcess.setEnded(true));
115+
113116
processes.remove(player.getUniqueId());
114117
}
115118

0 commit comments

Comments
 (0)