diff --git a/src/main/java/org/codelibs/fess/ds/callback/IndexUpdateCallbackImpl.java b/src/main/java/org/codelibs/fess/ds/callback/IndexUpdateCallbackImpl.java index 73cc1ace56ccc459814eec8ee525920e1d9c2557..c85c6e03330d469c80a0fe8ab0f44d0771ae56ac 100644 --- a/src/main/java/org/codelibs/fess/ds/callback/IndexUpdateCallbackImpl.java +++ b/src/main/java/org/codelibs/fess/ds/callback/IndexUpdateCallbackImpl.java @@ -15,11 +15,14 @@ */ package org.codelibs.fess.ds.callback; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import java.util.concurrent.atomic.AtomicLong; import javax.annotation.PostConstruct; +import org.codelibs.core.stream.StreamUtil; import org.codelibs.fess.es.client.FessEsClient; import org.codelibs.fess.exception.DataStoreException; import org.codelibs.fess.helper.CrawlingInfoHelper; @@ -82,6 +85,15 @@ public class IndexUpdateCallbackImpl implements IndexUpdateCallback { addFavoriteCountField(dataMap, url, fessConfig.getIndexFieldFavoriteCount()); } + final Set<String> matchedLabelSet = ComponentUtil.getLabelTypeHelper().getMatchedLabelValueSet(url); + if (!matchedLabelSet.isEmpty()) { + final Set<String> newLabelSet = new HashSet<>(); + final String[] oldLabels = DocumentUtil.getValue(dataMap, fessConfig.getIndexFieldLabel(), String[].class); + StreamUtil.stream(oldLabels).of(stream -> stream.forEach(newLabelSet::add)); + matchedLabelSet.stream().forEach(newLabelSet::add); + dataMap.put(fessConfig.getIndexFieldLabel(), newLabelSet.toArray(new String[newLabelSet.size()])); + } + if (!dataMap.containsKey(fessConfig.getIndexFieldDocId())) { final SystemHelper systemHelper = ComponentUtil.getSystemHelper(); dataMap.put(fessConfig.getIndexFieldDocId(), systemHelper.generateDocId(dataMap)); diff --git a/src/main/java/org/codelibs/fess/util/DocumentUtil.java b/src/main/java/org/codelibs/fess/util/DocumentUtil.java index 93047d578e163992da0e86103118e091490d67d7..2a9c25fb98ccbc082f900ef271d517965f98104d 100644 --- a/src/main/java/org/codelibs/fess/util/DocumentUtil.java +++ b/src/main/java/org/codelibs/fess/util/DocumentUtil.java @@ -17,6 +17,7 @@ package org.codelibs.fess.util; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; +import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; @@ -53,6 +54,8 @@ public final class DocumentUtil { if (value instanceof List) { if (clazz.isAssignableFrom(List.class)) { return (T) value; + } else if (clazz.isAssignableFrom(String[].class)) { + return (T) ((List<?>) value).stream().filter(s -> s != null).map(s -> s.toString()).toArray(n -> new String[n]); } if (((List<?>) value).isEmpty()) { @@ -60,6 +63,22 @@ public final class DocumentUtil { } return convertObj(((List<?>) value).get(0), clazz); + } else if (value instanceof String[]) { + if (clazz.isAssignableFrom(String[].class)) { + return (T) value; + } else if (clazz.isAssignableFrom(List.class)) { + final List<String> list = new ArrayList<>(); + for (final String s : (String[]) value) { + list.add(s); + } + return (T) list; + } + + if (((String[]) value).length == 0) { + return null; + } + + return convertObj(((String[]) value)[0], clazz); } return convertObj(value, clazz); diff --git a/src/test/java/org/codelibs/fess/util/DocumentUtilTest.java b/src/test/java/org/codelibs/fess/util/DocumentUtilTest.java index a6cdf489288238ca5b3c9244e3879a6ee2b86930..93d163ab47bd76dee5f226ce3955ae50358e93d1 100644 --- a/src/test/java/org/codelibs/fess/util/DocumentUtilTest.java +++ b/src/test/java/org/codelibs/fess/util/DocumentUtilTest.java @@ -15,13 +15,17 @@ */ package org.codelibs.fess.util; +import static org.junit.Assert.assertArrayEquals; + import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.codelibs.fess.unit.UnitFessTestCase; +import org.junit.jupiter.api.Assertions; public class DocumentUtilTest extends UnitFessTestCase { @@ -39,6 +43,20 @@ public class DocumentUtilTest extends UnitFessTestCase { assertNull(DocumentUtil.getValue(doc, "key2", String.class)); } + public void test_strings() { + Map<String, Object> doc = new HashMap<>(); + doc.put("key1", new String[] { "aaa", "bbb" }); + assertArrayEquals(new String[] { "aaa", "bbb" }, DocumentUtil.getValue(doc, "key1", String[].class)); + assertEquals(Arrays.asList("aaa", "bbb"), (List<String>) DocumentUtil.getValue(doc, "key1", List.class)); + } + + public void test_list() { + Map<String, Object> doc = new HashMap<>(); + doc.put("key1", Arrays.asList("aaa", "bbb")); + assertArrayEquals(new String[] { "aaa", "bbb" }, DocumentUtil.getValue(doc, "key1", String[].class)); + assertEquals(Arrays.asList("aaa", "bbb"), (List<String>) DocumentUtil.getValue(doc, "key1", List.class)); + } + public void test_integer() { Map<String, Object> doc = new HashMap<>();