diff --git a/pom.xml b/pom.xml
index 27047faa4..c305c9aeb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,4 +39,13 @@
search-services
insight-engine
+
+
+
+ findbugs
+ annotations
+ 1.0.0
+ provided
+
+
diff --git a/search-services/alfresco-search/src/main/java/org/alfresco/solr/AlfrescoCoreAdminHandler.java b/search-services/alfresco-search/src/main/java/org/alfresco/solr/AlfrescoCoreAdminHandler.java
index 559ec6855..9255db2a0 100644
--- a/search-services/alfresco-search/src/main/java/org/alfresco/solr/AlfrescoCoreAdminHandler.java
+++ b/search-services/alfresco-search/src/main/java/org/alfresco/solr/AlfrescoCoreAdminHandler.java
@@ -951,10 +951,10 @@ public class AlfrescoCoreAdminHandler extends CoreAdminHandler
{
if (maxNodeId >= midpoint)
{
- if(density >= 1)
+ if(density >= 1 || density == 0)
{
- //This is fully dense shard. I'm not sure if it's possible to have more nodes on the shards
- //then the offset, but if it does happen don't expand.
+ //This is fully dense shard or an empty shard.
+ // If it does happen, no expand is required.
bestGuess=0;
}
else
diff --git a/search-services/alfresco-search/src/main/java/org/alfresco/solr/AlfrescoSolrDataModel.java b/search-services/alfresco-search/src/main/java/org/alfresco/solr/AlfrescoSolrDataModel.java
index f5a556a6e..c28d7ae8b 100644
--- a/search-services/alfresco-search/src/main/java/org/alfresco/solr/AlfrescoSolrDataModel.java
+++ b/search-services/alfresco-search/src/main/java/org/alfresco/solr/AlfrescoSolrDataModel.java
@@ -1195,8 +1195,7 @@ public class AlfrescoSolrDataModel implements QueryConstants
public void removeModel(QName modelQName)
{
- // FIXME: this has no effect. The method should be changed (SEARCH-1482)
- modelErrors.remove(modelQName);
+ modelErrors.remove(getM2Model(modelQName).getName());
dictionaryDAO.removeModel(modelQName);
}
diff --git a/search-services/alfresco-search/src/main/java/org/alfresco/solr/SolrInformationServer.java b/search-services/alfresco-search/src/main/java/org/alfresco/solr/SolrInformationServer.java
index c4287b22a..d4d81df1f 100644
--- a/search-services/alfresco-search/src/main/java/org/alfresco/solr/SolrInformationServer.java
+++ b/search-services/alfresco-search/src/main/java/org/alfresco/solr/SolrInformationServer.java
@@ -957,9 +957,10 @@ public class SolrInformationServer implements InformationServer
SolrIndexSearcher solrIndexSearcher = refCounted.get();
coreSummary.add("Searcher", solrIndexSearcher.getStatistics());
Map infoRegistry = core.getInfoRegistry();
- for (String key : infoRegistry.keySet())
+ for (Entry infos : infoRegistry.entrySet())
{
- SolrInfoMBean infoMBean = infoRegistry.get(key);
+ SolrInfoMBean infoMBean = infos.getValue();
+ String key = infos.getKey();
if (key.equals("/alfresco"))
{
// TODO Do we really need to fixStats in solr4?
@@ -2117,12 +2118,13 @@ public class SolrInformationServer implements InformationServer
static void addPropertiesToDoc(Map properties, boolean isContentIndexedForNode,
SolrInputDocument newDoc, SolrInputDocument cachedDoc, boolean transformContentFlag)
{
- for (QName propertyQName : properties.keySet())
+ for (Entry property : properties.entrySet())
{
+ QName propertyQName = property.getKey();
newDoc.addField(FIELD_PROPERTIES, propertyQName.toString());
newDoc.addField(FIELD_PROPERTIES, propertyQName.getPrefixString());
- PropertyValue value = properties.get(propertyQName);
+ PropertyValue value = property.getValue();
if(value != null)
{
if (value instanceof StringPropertyValue)
@@ -3412,10 +3414,15 @@ public class SolrInformationServer implements InformationServer
SolrQueryRequest request, UpdateRequestProcessor processor, LinkedHashSet stack)
throws AuthenticationException, IOException, JSONException
{
- if ((skipDescendantDocsForSpecificTypes && typesForSkippingDescendantDocs.contains(parentNodeMetaData.getType())) ||
- (skipDescendantDocsForSpecificAspects && shouldBeIgnoredByAnyAspect(parentNodeMetaData.getAspects())))
+
+ // skipDescendantDocsForSpecificAspects is initialised on a synchronised method, so access must be also synchronised
+ synchronized (this)
{
- return;
+ if ((skipDescendantDocsForSpecificTypes && typesForSkippingDescendantDocs.contains(parentNodeMetaData.getType())) ||
+ (skipDescendantDocsForSpecificAspects && shouldBeIgnoredByAnyAspect(parentNodeMetaData.getAspects())))
+ {
+ return;
+ }
}
Set childIds = new HashSet<>();
diff --git a/search-services/alfresco-search/src/main/java/org/alfresco/solr/component/AsyncBuildSuggestComponent.java b/search-services/alfresco-search/src/main/java/org/alfresco/solr/component/AsyncBuildSuggestComponent.java
index efcb7d38d..184a2f161 100644
--- a/search-services/alfresco-search/src/main/java/org/alfresco/solr/component/AsyncBuildSuggestComponent.java
+++ b/search-services/alfresco-search/src/main/java/org/alfresco/solr/component/AsyncBuildSuggestComponent.java
@@ -41,6 +41,7 @@ import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentHashMap;
@@ -471,11 +472,7 @@ public class AsyncBuildSuggestComponent extends SearchComponent implements SolrC
@Override
public long ramBytesUsed() {
- long sizeInBytes = 0;
- for (String key : suggesters.keySet()) {
- sizeInBytes += suggesters.get(key).get(ASYNC_CACHE_KEY).ramBytesUsed();
- }
- return sizeInBytes;
+ return suggesters.values().stream().mapToLong(value -> value.get(ASYNC_CACHE_KEY).ramBytesUsed()).sum();
}
private Set getSuggesters(SolrParams params) {
diff --git a/search-services/alfresco-search/src/main/java/org/alfresco/solr/component/RewriteFacetParametersComponent.java b/search-services/alfresco-search/src/main/java/org/alfresco/solr/component/RewriteFacetParametersComponent.java
index f52fe77f0..33de8a9fb 100644
--- a/search-services/alfresco-search/src/main/java/org/alfresco/solr/component/RewriteFacetParametersComponent.java
+++ b/search-services/alfresco-search/src/main/java/org/alfresco/solr/component/RewriteFacetParametersComponent.java
@@ -91,7 +91,7 @@ public class RewriteFacetParametersComponent extends SearchComponent
String rows = params.get("rows");
if(rows != null && !rows.isEmpty())
{
- Integer row = new Integer(rows);
+ Integer row = Integer.valueOf(rows);
// Avoid +1 in SOLR code which produces null:java.lang.NegativeArraySizeException at at org.apache.lucene.util.PriorityQueue.(PriorityQueue.java:56)
if(row > 1000000)
{
diff --git a/search-services/alfresco-search/src/main/java/org/alfresco/solr/component/TempFileWarningLogger.java b/search-services/alfresco-search/src/main/java/org/alfresco/solr/component/TempFileWarningLogger.java
index b2b8d07f3..357e167a2 100644
--- a/search-services/alfresco-search/src/main/java/org/alfresco/solr/component/TempFileWarningLogger.java
+++ b/search-services/alfresco-search/src/main/java/org/alfresco/solr/component/TempFileWarningLogger.java
@@ -19,6 +19,7 @@
package org.alfresco.solr.component;
import java.io.IOException;
+
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -26,6 +27,8 @@ import java.nio.file.Path;
import org.slf4j.Logger;
import org.springframework.util.StringUtils;
+import edu.umd.cs.findbugs.annotations.SuppressWarnings;
+
/**
* Temp files may take up a lot of space, warn administrators
* of their existence, giving them the chance to manage them.
@@ -46,6 +49,8 @@ public class TempFileWarningLogger
glob = prefix + ".{"+ StringUtils.arrayToCommaDelimitedString(extensions) + "}";
}
+ // Avoid FindBugs false positive (https://github.com/spotbugs/spotbugs/issues/756)
+ @SuppressWarnings("RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE")
public boolean checkFiles()
{
if (log.isDebugEnabled())
@@ -72,6 +77,8 @@ public class TempFileWarningLogger
}
}
+ // Avoid FindBugs false positive (https://github.com/spotbugs/spotbugs/issues/756)
+ @SuppressWarnings("RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE")
public void removeFiles()
{
try(DirectoryStream stream = Files.newDirectoryStream(dir, glob))
diff --git a/search-services/alfresco-search/src/main/java/org/alfresco/solr/query/AbstractSolrCachingScorer.java b/search-services/alfresco-search/src/main/java/org/alfresco/solr/query/AbstractSolrCachingScorer.java
index b008175f4..6102afd1b 100644
--- a/search-services/alfresco-search/src/main/java/org/alfresco/solr/query/AbstractSolrCachingScorer.java
+++ b/search-services/alfresco-search/src/main/java/org/alfresco/solr/query/AbstractSolrCachingScorer.java
@@ -19,6 +19,7 @@
package org.alfresco.solr.query;
import java.io.IOException;
+import java.util.stream.LongStream;
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.search.DocIdSetIterator;
@@ -43,12 +44,7 @@ public abstract class AbstractSolrCachingScorer extends Scorer
private LongCache(){}
- static final Long cache[] = new Long[CACHE_SIZE];
-
- static {
- for(int i = 0; i < cache.length; i++)
- cache[i] = new Long(i);
- }
+ static final long cache[] = LongStream.range(0, CACHE_SIZE).toArray();
}
protected static Long getLong(long l) {
diff --git a/search-services/alfresco-search/src/main/java/org/alfresco/solr/query/MimetypeGroupingCollector.java b/search-services/alfresco-search/src/main/java/org/alfresco/solr/query/MimetypeGroupingCollector.java
index 863d79a83..7253121fb 100644
--- a/search-services/alfresco-search/src/main/java/org/alfresco/solr/query/MimetypeGroupingCollector.java
+++ b/search-services/alfresco-search/src/main/java/org/alfresco/solr/query/MimetypeGroupingCollector.java
@@ -20,6 +20,7 @@ package org.alfresco.solr.query;
import java.io.IOException;
import java.util.HashMap;
+import java.util.Map.Entry;
import org.alfresco.solr.AlfrescoSolrDataModel;
import org.alfresco.solr.AlfrescoSolrDataModel.FieldUse;
@@ -111,10 +112,9 @@ public class MimetypeGroupingCollector extends DelegatingCollector
rb.rsp.add("analytics", analytics);
NamedList