Skip to content

Commit

Permalink
fix #2205 move fess-ds to plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
marevol committed Aug 15, 2019
1 parent 5f621ea commit dd40684
Show file tree
Hide file tree
Showing 10 changed files with 175 additions and 64 deletions.
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -6,6 +6,7 @@
/src/main/webapp/WEB-INF/classes/
/src/main/webapp/WEB-INF/lib/
/src/main/webapp/WEB-INF/site/
/src/main/webapp/WEB-INF/plugin/
/src/main/webapp/WEB-INF/env/crawler/lib/
/src/main/webapp/WEB-INF/env/suggest/lib/
/src/main/webapp/WEB-INF/env/thumbnail/lib/
Expand Down
28 changes: 15 additions & 13 deletions deps.xml
Expand Up @@ -16,6 +16,8 @@
<mkdir dir="${target.dir}" />
<delete dir="${webinf.dir}/lib" />
<mkdir dir="${webinf.dir}/lib" />
<delete dir="${webinf.dir}/plugin" />
<mkdir dir="${webinf.dir}/plugin" />
<delete dir="${crawler.dir}/lib" />
<mkdir dir="${crawler.dir}/lib" />
<delete dir="${suggest.dir}/lib" />
Expand All @@ -42,87 +44,87 @@
<cutdirsmapper dirs="2" />
</unzip>
<!-- fess-ds-atlassian -->
<antcall target="install.lib.jar">
<antcall target="install.plugin.jar">
<param name="repo.url" value="${maven.release.repo.url}" />
<param name="jar.groupId" value="org/codelibs/fess" />
<param name="jar.artifactId" value="fess-ds-atlassian" />
<param name="jar.version" value="13.2.0" />
<param name="file.version" value="13.2.0" />
</antcall>
<!-- fess-ds-box -->
<antcall target="install.lib.jar">
<antcall target="install.plugin.jar">
<param name="repo.url" value="${maven.release.repo.url}" />
<param name="jar.groupId" value="org/codelibs/fess" />
<param name="jar.artifactId" value="fess-ds-box" />
<param name="jar.version" value="13.2.0" />
<param name="file.version" value="13.2.0" />
</antcall>
<!-- fess-ds-csv -->
<antcall target="install.lib.jar">
<antcall target="install.plugin.jar">
<param name="repo.url" value="${maven.release.repo.url}" />
<param name="jar.groupId" value="org/codelibs/fess" />
<param name="jar.artifactId" value="fess-ds-csv" />
<param name="jar.version" value="13.2.0" />
<param name="file.version" value="13.2.0" />
</antcall>
<!-- fess-ds-db -->
<antcall target="install.lib.jar">
<antcall target="install.plugin.jar">
<param name="repo.url" value="${maven.release.repo.url}" />
<param name="jar.groupId" value="org/codelibs/fess" />
<param name="jar.artifactId" value="fess-ds-db" />
<param name="jar.version" value="13.2.0" />
<param name="file.version" value="13.2.0" />
</antcall>
<!-- fess-ds-dropbox -->
<antcall target="install.lib.jar">
<antcall target="install.plugin.jar">
<param name="repo.url" value="${maven.release.repo.url}" />
<param name="jar.groupId" value="org/codelibs/fess" />
<param name="jar.artifactId" value="fess-ds-dropbox" />
<param name="jar.version" value="13.2.0" />
<param name="file.version" value="13.2.0" />
</antcall>
<!-- fess-ds-elasticsearch -->
<antcall target="install.lib.jar">
<antcall target="install.plugin.jar">
<param name="repo.url" value="${maven.release.repo.url}" />
<param name="jar.groupId" value="org/codelibs/fess" />
<param name="jar.artifactId" value="fess-ds-elasticsearch" />
<param name="jar.version" value="13.2.0" />
<param name="file.version" value="13.2.0" />
</antcall>
<!-- fess-ds-gitbucket -->
<antcall target="install.lib.jar">
<antcall target="install.plugin.jar">
<param name="repo.url" value="${maven.release.repo.url}" />
<param name="jar.groupId" value="org/codelibs/fess" />
<param name="jar.artifactId" value="fess-ds-gitbucket" />
<param name="jar.version" value="13.2.0" />
<param name="file.version" value="13.2.0" />
</antcall>
<!-- fess-ds-gsuite -->
<antcall target="install.lib.jar">
<antcall target="install.plugin.jar">
<param name="repo.url" value="${maven.release.repo.url}" />
<param name="jar.groupId" value="org/codelibs/fess" />
<param name="jar.artifactId" value="fess-ds-gsuite" />
<param name="jar.version" value="13.2.0" />
<param name="file.version" value="13.2.0" />
</antcall>
<!-- fess-ds-json -->
<antcall target="install.lib.jar">
<antcall target="install.plugin.jar">
<param name="repo.url" value="${maven.release.repo.url}" />
<param name="jar.groupId" value="org/codelibs/fess" />
<param name="jar.artifactId" value="fess-ds-json" />
<param name="jar.version" value="13.2.0" />
<param name="file.version" value="13.2.0" />
</antcall>
<!-- fess-ds-office365 -->
<antcall target="install.lib.jar">
<antcall target="install.plugin.jar">
<param name="repo.url" value="${maven.release.repo.url}" />
<param name="jar.groupId" value="org/codelibs/fess" />
<param name="jar.artifactId" value="fess-ds-office365" />
<param name="jar.version" value="13.2.0" />
<param name="file.version" value="13.2.0" />
</antcall>
<!-- fess-ds-slack -->
<antcall target="install.lib.jar">
<antcall target="install.plugin.jar">
<param name="repo.url" value="${maven.release.repo.url}" />
<param name="jar.groupId" value="org/codelibs/fess" />
<param name="jar.artifactId" value="fess-ds-slack" />
Expand All @@ -143,11 +145,11 @@
todir="${thumbnail.dir}/lib"/>
</target>

<target name="install.lib.jar">
<target name="install.plugin.jar">
<get dest="${target.dir}">
<url url="${repo.url}/${jar.groupId}/${jar.artifactId}/${jar.version}/${jar.artifactId}-${file.version}.jar" />
</get>
<copy file="${target.dir}/${jar.artifactId}-${file.version}.jar"
todir="${webinf.dir}/lib"/>
todir="${webinf.dir}/plugin"/>
</target>
</project>
Expand Up @@ -323,9 +323,9 @@ protected void registerRolesAndLabels(final RenderData data) {
}

protected void registerHandlerNames(final RenderData data) {
final List<String> dataStoreNameList = dataStoreFactory.getDataStoreNameList();
final String[] dataStoreNames = dataStoreFactory.getDataStoreNames();
final List<Map<String, String>> itemList = new ArrayList<>();
for (final String name : dataStoreNameList) {
for (final String name : dataStoreNames) {
final Map<String, String> map = new HashMap<>();
map.put(Constants.ITEM_LABEL, name);
map.put(Constants.ITEM_VALUE, name);
Expand Down
81 changes: 71 additions & 10 deletions src/main/java/org/codelibs/fess/ds/DataStoreFactory.java
Expand Up @@ -15,41 +15,102 @@
*/
package org.codelibs.fess.ds;

import java.util.ArrayList;
import java.util.Collections;
import java.io.File;
import java.io.InputStream;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.codelibs.core.lang.StringUtil;
import org.codelibs.fess.helper.PluginHelper;
import org.codelibs.fess.util.ResourceUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class DataStoreFactory {
private static final Logger logger = LoggerFactory.getLogger(DataStoreFactory.class);

protected Map<String, DataStore> dataStoreMap = new LinkedHashMap<>();

protected String[] dataStoreNames = StringUtil.EMPTY_STRINGS;

protected long lastLoadedTime = 0;

public void add(final String name, final DataStore dataStore) {
if (name == null || dataStore == null) {
throw new IllegalArgumentException("name or dataStore is null.");
}
if (logger.isDebugEnabled()) {
logger.debug("Loaded " + name);
}
dataStoreMap.put(name, dataStore);
dataStoreMap.put(name.toLowerCase(Locale.ROOT), dataStore);
dataStoreMap.put(dataStore.getClass().getSimpleName().toLowerCase(Locale.ROOT), dataStore);
}

public DataStore getDataStore(final String name) {
return dataStoreMap.get(name);
if (name == null) {
return null;
}
return dataStoreMap.get(name.toLowerCase(Locale.ROOT));
}

public List<String> getDataStoreNameList() {
final Set<String> nameSet = dataStoreMap.keySet();
final List<String> nameList = new ArrayList<>();
nameList.addAll(nameSet);
Collections.sort(nameList);
return nameList;
public String[] getDataStoreNames() {
if (System.currentTimeMillis() - lastLoadedTime > 60000L) {
final List<String> nameList = loadDataStoreNameList();
dataStoreNames = nameList.toArray(n -> new String[nameList.size()]);
}
return dataStoreNames;
}

protected List<String> loadDataStoreNameList() {
final Set<String> nameSet = new HashSet<>();
final File[] jarFiles = ResourceUtil.getPluginJarFiles(PluginHelper.ArtifactType.DATA_STORE.getId());
for (final File jarFile : jarFiles) {
try (FileSystem fs = FileSystems.newFileSystem(jarFile.toPath(), ClassLoader.getSystemClassLoader())) {
final Path xmlPath = fs.getPath("fess_ds++.xml");
try (InputStream is = Files.newInputStream(xmlPath)) {
final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
final DocumentBuilder builder = factory.newDocumentBuilder();

final Document doc = builder.parse(is);
final NodeList nodeList = doc.getElementsByTagName("component");
for (int i = 0; i < nodeList.getLength(); i++) {
final Node node = nodeList.item(i);
final NamedNodeMap attributes = node.getAttributes();
if (attributes != null) {
final Node classAttr = attributes.getNamedItem("class");
if (classAttr != null) {
final String value = classAttr.getNodeValue();
if (StringUtil.isNotBlank(value)) {
final String[] values = value.split("\\.");
nameSet.add(values[values.length - 1]);
}
}
}
}
}
} catch (final Exception e) {
logger.warn("Failed to load " + jarFile.getAbsolutePath(), e);
}
}
return nameSet.stream().sorted().collect(Collectors.toList());
}

}
30 changes: 30 additions & 0 deletions src/main/java/org/codelibs/fess/exception/PluginException.java
@@ -0,0 +1,30 @@
/*
* Copyright 2012-2019 CodeLibs Project and the Others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
package org.codelibs.fess.exception;

public class PluginException extends FessSystemException {

private static final long serialVersionUID = 1L;

public PluginException(String message, Throwable cause) {
super(message, cause);
}

public PluginException(String message) {
super(message);
}

}

0 comments on commit dd40684

Please sign in to comment.