diff --git a/src/main/java/run/halo/app/theme/finders/PluginFinder.java b/src/main/java/run/halo/app/theme/finders/PluginFinder.java new file mode 100644 index 000000000..67339bb64 --- /dev/null +++ b/src/main/java/run/halo/app/theme/finders/PluginFinder.java @@ -0,0 +1,12 @@ +package run.halo.app.theme.finders; + +/** + * A finder for {@link run.halo.app.core.extension.Plugin}. + * + * @author guqing + * @since 2.0.0 + */ +public interface PluginFinder { + + boolean available(String pluginName); +} diff --git a/src/main/java/run/halo/app/theme/finders/impl/PluginFinderImpl.java b/src/main/java/run/halo/app/theme/finders/impl/PluginFinderImpl.java new file mode 100644 index 000000000..f275683a5 --- /dev/null +++ b/src/main/java/run/halo/app/theme/finders/impl/PluginFinderImpl.java @@ -0,0 +1,33 @@ +package run.halo.app.theme.finders.impl; + +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.pf4j.PluginState; +import org.pf4j.PluginWrapper; +import run.halo.app.plugin.HaloPluginManager; +import run.halo.app.theme.finders.Finder; +import run.halo.app.theme.finders.PluginFinder; + +/** + * Plugin finder implementation. + * + * @author guqing + * @since 2.0.0 + */ +@Finder("pluginFinder") +@AllArgsConstructor +public class PluginFinderImpl implements PluginFinder { + private final HaloPluginManager haloPluginManager; + + @Override + public boolean available(String pluginName) { + if (StringUtils.isBlank(pluginName)) { + return false; + } + PluginWrapper pluginWrapper = haloPluginManager.getPlugin(pluginName); + if (pluginWrapper == null) { + return false; + } + return PluginState.STARTED.equals(pluginWrapper.getPluginState()); + } +} diff --git a/src/test/java/run/halo/app/theme/finders/impl/PluginFinderImplTest.java b/src/test/java/run/halo/app/theme/finders/impl/PluginFinderImplTest.java new file mode 100644 index 000000000..aba947ef2 --- /dev/null +++ b/src/test/java/run/halo/app/theme/finders/impl/PluginFinderImplTest.java @@ -0,0 +1,50 @@ +package run.halo.app.theme.finders.impl; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; +import org.pf4j.PluginState; +import org.pf4j.PluginWrapper; +import run.halo.app.plugin.HaloPluginManager; + +/** + * Tests for {@link PluginFinderImpl}. + * + * @author guqing + * @since 2.0.0 + */ +@ExtendWith(MockitoExtension.class) +class PluginFinderImplTest { + @Mock + private HaloPluginManager haloPluginManager; + + @InjectMocks + private PluginFinderImpl pluginFinder; + + @Test + void available() { + assertThat(pluginFinder.available(null)).isFalse(); + + boolean available = pluginFinder.available("fake-plugin"); + assertThat(available).isFalse(); + + PluginWrapper mockPluginWrapper = Mockito.mock(PluginWrapper.class); + when(haloPluginManager.getPlugin(eq("fake-plugin"))) + .thenReturn(mockPluginWrapper); + + when(mockPluginWrapper.getPluginState()).thenReturn(PluginState.RESOLVED); + available = pluginFinder.available("fake-plugin"); + assertThat(available).isFalse(); + + when(mockPluginWrapper.getPluginState()).thenReturn(PluginState.STARTED); + available = pluginFinder.available("fake-plugin"); + assertThat(available).isTrue(); + } +} \ No newline at end of file