From 5f621eaa7849b3595b58f79d2e63406161c4138f Mon Sep 17 00:00:00 2001 From: igarashi <igarashi.kouki@gmail.com> Date: Wed, 14 Aug 2019 17:39:29 +0900 Subject: [PATCH] #2203 update PluginHelper add installArtifact(), deleteInstalledArtifact() --- .../codelibs/fess/helper/PluginHelper.java | 61 ++++++++++++++++--- 1 file changed, 51 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/codelibs/fess/helper/PluginHelper.java b/src/main/java/org/codelibs/fess/helper/PluginHelper.java index 1edacec44..e5c299063 100644 --- a/src/main/java/org/codelibs/fess/helper/PluginHelper.java +++ b/src/main/java/org/codelibs/fess/helper/PluginHelper.java @@ -19,12 +19,16 @@ import static org.codelibs.core.stream.StreamUtil.split; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.io.StringReader; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.codelibs.core.io.CopyUtil; import org.codelibs.curl.Curl; import org.codelibs.curl.CurlResponse; import org.codelibs.fess.util.ComponentUtil; @@ -37,7 +41,9 @@ import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; -// TODO: refactoring +import javax.servlet.ServletContext; + +// TODO: refactoring, exception handling, improving codes public class PluginHelper { private static final Logger logger = LoggerFactory.getLogger(PluginHelper.class); @@ -58,13 +64,13 @@ public class PluginHelper { protected List<Artifact> processRepository(final ArtifactType artifactType, final String url) { final List<Artifact> list = new ArrayList<>(); - final String repoContent = getRepositoryContent(url); + final String repoContent = getRepositoryContentAsString(url); final Matcher matcher = Pattern.compile("href=\"[^\"]*(" + artifactType.getId() + "[a-zA-Z0-9\\-]+)/?\"").matcher(repoContent); while (matcher.find()) { final String name = matcher.group(1); final String pluginUrl = url + (url.endsWith("/") ? name + "/" : "/" + name + "/"); - final String mavenMetadata = getRepositoryContent(pluginUrl + "maven-metadata.xml"); - try (StringReader reader = new StringReader(mavenMetadata)) { + final String mavenMetadata = getRepositoryContentAsString(pluginUrl + "maven-metadata.xml"); + try (final StringReader reader = new StringReader(mavenMetadata)) { final DOMParser parser = new DOMParser(); parser.parse(new InputSource(reader)); final Document document = parser.getDocument(); @@ -74,13 +80,13 @@ public class PluginHelper { list.add(new Artifact(name, version, pluginUrl + version + "/" + name + "-" + version + ".jar")); } } catch (final Exception e) { - logger.warn("Failed to parse " + pluginUrl + "metadata.xml.", e); + logger.warn("Failed to parse " + pluginUrl + "maven-metadata.xml.", e); } } return list; } - protected String getRepositoryContent(final String url) { + protected String getRepositoryContentAsString(final String url) { try (final CurlResponse response = Curl.get(url).execute()) { return response.getContentAsString(); } catch (final IOException e) { @@ -88,6 +94,14 @@ public class PluginHelper { } } + protected InputStream getRepositoryContentAsStream(final String url) { + try (final CurlResponse response = Curl.get(url).execute()) { + return response.getContentAsStream(); + } catch (final IOException e) { + throw new IORuntimeException(e); + } + } + public Artifact[] getInstalledArtifacts(final ArtifactType artifactType) { final File[] jarFiles = ResourceUtil.getJarFiles(artifactType.getId()); final List<Artifact> list = new ArrayList<>(jarFiles.length); @@ -105,12 +119,39 @@ public class PluginHelper { return new Artifact(artifactName, artifactVersion, null); } - public void installArtifact(Artifact artifact) { - // TODO + public boolean installArtifact(Artifact artifact) { + try (final InputStream in = getRepositoryContentAsStream(artifact.getUrl())) { + final String fileName = artifact.getName() + "-" + artifact.getVersion() + ".jar"; + final File file = Paths.get(getLibPath().toString(), fileName).toFile(); + if (!file.exists()) { + file.createNewFile(); + CopyUtil.copy(in, file); + } else { + final File tempFile = File.createTempFile(fileName, "bk"); + CopyUtil.copy(file, tempFile); + CopyUtil.copy(in, file); + tempFile.delete(); + } + return file.exists(); + } catch (final Exception e) { + logger.warn("Failed to install the artifact " + artifact.getName(), e); + return false; + } + } + + public boolean deleteInstalledArtifact(Artifact artifact) { + final String fileName = artifact.getName() + "-" + artifact.getVersion() + ".jar"; + final File file = Paths.get(getLibPath().toString(), fileName).toFile(); + if (file != null && file.exists() && file.delete()) { + return true; + } else { + logger.warn("Failed to delete the artifact " + file.getAbsolutePath()); + return false; + } } - public void deleteInstalledArtifact(Artifact artifact) { - // TODO + protected Path getLibPath() { + return Paths.get(ComponentUtil.getComponent(ServletContext.class).getRealPath("/WEB-INF/lib/")); } public static class Artifact { -- GitLab