From 2fbbe547606b709e0706184934c4db88c33def53 Mon Sep 17 00:00:00 2001 From: Angel Borroy Date: Mon, 17 Apr 2023 11:18:19 +0200 Subject: [PATCH] Refactoring to use Java backed code to invoke Native SOLR Admin Console --- .../tools/repo/search/SolrAdminConsole.java | 7 --- .../repo/search/SolrAdminNativeClient.java | 18 ++++++ .../search/solr6/SolrAdminConsoleImpl.java | 58 ------------------- .../solr6/SolrAdminNativeClientImpl.java | 57 ++++++++++++++++++ .../Search/ootbee-support-tools-context.xml | 8 +-- .../solr6/ootbee-support-tools-context.xml | 7 ++- .../solr-tracking.get.html.ftl | 38 ++++++------ .../ootbee-support-tools/solr-tracking.lib.js | 16 +++-- 8 files changed, 113 insertions(+), 96 deletions(-) delete mode 100644 repository/src/main/java/org/orderofthebee/addons/support/tools/repo/search/SolrAdminConsole.java create mode 100644 repository/src/main/java/org/orderofthebee/addons/support/tools/repo/search/SolrAdminNativeClient.java delete mode 100644 repository/src/main/java/org/orderofthebee/addons/support/tools/repo/search/solr6/SolrAdminConsoleImpl.java create mode 100644 repository/src/main/java/org/orderofthebee/addons/support/tools/repo/search/solr6/SolrAdminNativeClientImpl.java diff --git a/repository/src/main/java/org/orderofthebee/addons/support/tools/repo/search/SolrAdminConsole.java b/repository/src/main/java/org/orderofthebee/addons/support/tools/repo/search/SolrAdminConsole.java deleted file mode 100644 index ab35a89..0000000 --- a/repository/src/main/java/org/orderofthebee/addons/support/tools/repo/search/SolrAdminConsole.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.orderofthebee.addons.support.tools.repo.search; - -public interface SolrAdminConsole { - - int getCascadeTrackerPendingCount(String coreName); - -} diff --git a/repository/src/main/java/org/orderofthebee/addons/support/tools/repo/search/SolrAdminNativeClient.java b/repository/src/main/java/org/orderofthebee/addons/support/tools/repo/search/SolrAdminNativeClient.java new file mode 100644 index 0000000..8fa42b3 --- /dev/null +++ b/repository/src/main/java/org/orderofthebee/addons/support/tools/repo/search/SolrAdminNativeClient.java @@ -0,0 +1,18 @@ +package org.orderofthebee.addons.support.tools.repo.search; + +/** + * SOLR Admin HTTP Client for native SOLR services. + * This interface describes operations not covered by the Alfresco REST API for SOLR + * + * @author Angel Borroy + */ +public interface SolrAdminNativeClient { + + /** + * Get count of documents that require path indexing in SOLR. + * @param coreName name of the core: alfresco, archive + * @return Number of documents that require path indexing + */ + long getCascadeTrackerPendingCount(String coreName); + +} diff --git a/repository/src/main/java/org/orderofthebee/addons/support/tools/repo/search/solr6/SolrAdminConsoleImpl.java b/repository/src/main/java/org/orderofthebee/addons/support/tools/repo/search/solr6/SolrAdminConsoleImpl.java deleted file mode 100644 index c16924e..0000000 --- a/repository/src/main/java/org/orderofthebee/addons/support/tools/repo/search/solr6/SolrAdminConsoleImpl.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.orderofthebee.addons.support.tools.repo.search.solr6; - -import org.alfresco.httpclient.HttpClientFactory; -import org.alfresco.util.ParameterCheck; -import org.apache.commons.httpclient.HttpClient; -import org.apache.commons.httpclient.methods.GetMethod; -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; -import org.json.simple.parser.ParseException; -import org.orderofthebee.addons.support.tools.repo.search.SolrAdminConsole; - -import java.io.IOException; -import java.net.URLEncoder; - -public class SolrAdminConsoleImpl implements SolrAdminConsole { - - private HttpClientFactory solrHttpClientFactory; - - private String baseUrl; - - private HttpClient httpClient; - - public void init() { - ParameterCheck.mandatory("baseUrl", baseUrl); - httpClient = solrHttpClientFactory.getHttpClient(); - } - - @Override - public int getCascadeTrackerPendingCount(String coreName) { - - GetMethod getMethod = new GetMethod( - httpClient.getHostConfiguration().getHostURL() + "/" + baseUrl + "/" + coreName + "/select?" - + "?fl=" + URLEncoder.encode("*,[cached]") - + "&q=" + URLEncoder.encode("{!term f=int@s_@cascade}1") - + "&wt=json"); - try { - httpClient.executeMethod(getMethod); - JSONObject json = (JSONObject) new JSONParser().parse(getMethod.getResponseBodyAsString()); - JSONObject response = (JSONObject) json.get("response"); - return (int) response.get("numFound"); - - } catch (IOException e) { - throw new RuntimeException(e); - } catch (ParseException e) { - throw new RuntimeException(e); - } - - } - - public void setSolrHttpClientFactory(HttpClientFactory solrHttpClientFactory) { - this.solrHttpClientFactory = solrHttpClientFactory; - } - - public void setBaseUrl(String baseUrl) { - this.baseUrl = baseUrl; - } - -} diff --git a/repository/src/main/java/org/orderofthebee/addons/support/tools/repo/search/solr6/SolrAdminNativeClientImpl.java b/repository/src/main/java/org/orderofthebee/addons/support/tools/repo/search/solr6/SolrAdminNativeClientImpl.java new file mode 100644 index 0000000..6a71f04 --- /dev/null +++ b/repository/src/main/java/org/orderofthebee/addons/support/tools/repo/search/solr6/SolrAdminNativeClientImpl.java @@ -0,0 +1,57 @@ +package org.orderofthebee.addons.support.tools.repo.search.solr6; + +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.methods.GetMethod; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.orderofthebee.addons.support.tools.repo.search.SolrAdminNativeClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + +/** + * SOLR Admin HTTP Client for native SOLR services. + * This class provides access to requests not covered by the Alfresco REST API for SOLR + * + * @author Angel Borroy + */ +public class SolrAdminNativeClientImpl implements SolrAdminNativeClient { + + private static final Logger LOGGER = LoggerFactory.getLogger(SolrAdminNativeClientImpl.class); + + private HttpClient httpClient; + + private String baseUrl; + + /** + * {@inheritDoc} + */ + @Override + public long getCascadeTrackerPendingCount(String coreName) { + try { + GetMethod getMethod = new GetMethod( + httpClient.getHostConfiguration().getHostURL() + baseUrl + "/" + coreName + "/select" + + "?fl=" + URLEncoder.encode("*,[cached]", StandardCharsets.UTF_8.toString()) + + "&q=" + URLEncoder.encode("{!term f=int@s_@cascade}1", StandardCharsets.UTF_8.toString()) + + "&wt=json"); + httpClient.executeMethod(getMethod); + JSONObject json = (JSONObject) new JSONParser().parse(getMethod.getResponseBodyAsString()); + JSONObject response = (JSONObject) json.get("response"); + return (long) response.get("numFound"); + } catch (Exception e) { + LOGGER.error(e.getMessage(), e); + return -1; + } + } + + public void setHttpClient(HttpClient httpClient) { + this.httpClient = httpClient; + } + + public void setBaseUrl(String baseUrl) { + this.baseUrl = baseUrl; + } + +} diff --git a/repository/src/main/resources/alfresco/subsystems/Search/ootbee-support-tools-context.xml b/repository/src/main/resources/alfresco/subsystems/Search/ootbee-support-tools-context.xml index b5ca8a7..93055d1 100644 --- a/repository/src/main/resources/alfresco/subsystems/Search/ootbee-support-tools-context.xml +++ b/repository/src/main/resources/alfresco/subsystems/Search/ootbee-support-tools-context.xml @@ -4,16 +4,16 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> - + - + - solrAdminConsole + solrAdminNativeClient - org.orderofthebee.addons.support.tools.repo.search.SolrAdminConsole + org.orderofthebee.addons.support.tools.repo.search.SolrAdminNativeClient diff --git a/repository/src/main/resources/alfresco/subsystems/Search/solr6/ootbee-support-tools-context.xml b/repository/src/main/resources/alfresco/subsystems/Search/solr6/ootbee-support-tools-context.xml index b9a8246..156d62d 100644 --- a/repository/src/main/resources/alfresco/subsystems/Search/solr6/ootbee-support-tools-context.xml +++ b/repository/src/main/resources/alfresco/subsystems/Search/solr6/ootbee-support-tools-context.xml @@ -4,9 +4,10 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> - - + + + + diff --git a/repository/src/main/resources/alfresco/templates/webscripts/org/orderofthebee/support-tools/admin/ootbee-support-tools/solr-tracking.get.html.ftl b/repository/src/main/resources/alfresco/templates/webscripts/org/orderofthebee/support-tools/admin/ootbee-support-tools/solr-tracking.get.html.ftl index 98c4f07..7f31376 100644 --- a/repository/src/main/resources/alfresco/templates/webscripts/org/orderofthebee/support-tools/admin/ootbee-support-tools/solr-tracking.get.html.ftl +++ b/repository/src/main/resources/alfresco/templates/webscripts/org/orderofthebee/support-tools/admin/ootbee-support-tools/solr-tracking.get.html.ftl @@ -68,25 +68,27 @@ Copyright (C) 2005 - 2020 Alfresco Software Limited. -
- <@section label=msg("solr-tracking.section.detail.title") /> -
- <@field value="${trackingSummary[coreName]['MetadataTracker Active']?string(msg('solr-tracking.true'), msg('solr-tracking.false'))}" label=msg("solr-tracking.section.detail.metadata.title") description=msg("solr-tracking.section.detail.metadata.description")/> - <@field value="${trackingSummary[coreName]['ContentTracker Active']?string(msg('solr-tracking.true'), msg('solr-tracking.false'))}" label=msg("solr-tracking.section.detail.content.title") description=msg("solr-tracking.section.detail.content.description")/> - <@field value="${trackingSummary[coreName]['AclTracker Active']?string(msg('solr-tracking.true'), msg('solr-tracking.false'))}" label=msg("solr-tracking.section.detail.acl.title") description=msg("solr-tracking.section.detail.acl.description")/> - <@field value="${(cascadeTracker[coreName] > 0)?string(msg('solr-tracking.true'), msg('solr-tracking.false'))}" label=msg("solr-tracking.section.detail.cascade.title") description=msg("solr-tracking.section.detail.cascade.description")/> -
-
- <@field value="${trackingSummary[coreName]['Approx transactions remaining']?c}" label=msg("solr-tracking.section.detail.metadata.count.title") description=msg("solr-tracking.section.detail.metadata.count.description") /> - <#if trackingSummary[coreName]['FTS']['Node count whose content needs to be updated']?has_content> - <@field value="${trackingSummary[coreName]['FTS']['Node count whose content needs to be updated']?c}" label=msg("solr-tracking.section.detail.content.count.title") description=msg("solr-tracking.section.detail.content.count.description")/> - <#else> - <@field value="${(trackingSummary[coreName]['FTS']['Node count with FTSStatus New'] + trackingSummary[coreName]['FTS']['Node count with FTSStatus Dirty'])?c}" label=msg("solr-tracking.section.detail.content.count.title") description=msg("solr-tracking.section.detail.content.count.description")/> - - <@field value="${trackingSummary[coreName]['Approx change sets remaining']?c}" label=msg("solr-tracking.section.detail.acl.count.title") description=msg("solr-tracking.section.detail.acl.count.description") /> - <@field value="${cascadeTracker[coreName]?c}" label=msg("solr-tracking.section.detail.cascade.count.title") description=msg("solr-tracking.section.detail.cascade.count.description") /> +
+ + <@section label=msg("solr-tracking.section.detail.title") /> +
+ <@field value="${trackingSummary[coreName]['MetadataTracker Active']?string(msg('solr-tracking.true'), msg('solr-tracking.false'))}" label=msg("solr-tracking.section.detail.metadata.title") description=msg("solr-tracking.section.detail.metadata.description")/> + <@field value="${trackingSummary[coreName]['ContentTracker Active']?string(msg('solr-tracking.true'), msg('solr-tracking.false'))}" label=msg("solr-tracking.section.detail.content.title") description=msg("solr-tracking.section.detail.content.description")/> + <@field value="${trackingSummary[coreName]['AclTracker Active']?string(msg('solr-tracking.true'), msg('solr-tracking.false'))}" label=msg("solr-tracking.section.detail.acl.title") description=msg("solr-tracking.section.detail.acl.description")/> + <@field value="${(cascadeTracker[coreName] > 0)?string(msg('solr-tracking.true'), msg('solr-tracking.false'))}" label=msg("solr-tracking.section.detail.cascade.title") description=msg("solr-tracking.section.detail.cascade.description")/> +
+
+ <@field value="${trackingSummary[coreName]['Approx transactions remaining']?c}" label=msg("solr-tracking.section.detail.metadata.count.title") description=msg("solr-tracking.section.detail.metadata.count.description") /> + <#if trackingSummary[coreName]['FTS']['Node count whose content needs to be updated']?has_content> + <@field value="${trackingSummary[coreName]['FTS']['Node count whose content needs to be updated']?c}" label=msg("solr-tracking.section.detail.content.count.title") description=msg("solr-tracking.section.detail.content.count.description")/> + <#else> + <@field value="${(trackingSummary[coreName]['FTS']['Node count with FTSStatus New'] + trackingSummary[coreName]['FTS']['Node count with FTSStatus Dirty'])?c}" label=msg("solr-tracking.section.detail.content.count.title") description=msg("solr-tracking.section.detail.content.count.description")/> + + <@field value="${trackingSummary[coreName]['Approx change sets remaining']?c}" label=msg("solr-tracking.section.detail.acl.count.title") description=msg("solr-tracking.section.detail.acl.count.description") /> + <@field value="${cascadeTracker[coreName]?c}" label=msg("solr-tracking.section.detail.cascade.count.title") description=msg("solr-tracking.section.detail.cascade.count.description") /> +
+
-
diff --git a/repository/src/main/resources/alfresco/templates/webscripts/org/orderofthebee/support-tools/admin/ootbee-support-tools/solr-tracking.lib.js b/repository/src/main/resources/alfresco/templates/webscripts/org/orderofthebee/support-tools/admin/ootbee-support-tools/solr-tracking.lib.js index e33f33d..b841afd 100644 --- a/repository/src/main/resources/alfresco/templates/webscripts/org/orderofthebee/support-tools/admin/ootbee-support-tools/solr-tracking.lib.js +++ b/repository/src/main/resources/alfresco/templates/webscripts/org/orderofthebee/support-tools/admin/ootbee-support-tools/solr-tracking.lib.js @@ -57,7 +57,7 @@ function buildPropertyGetter(ctxt) /* exported loadSolrSummaryAndStatus */ function loadSolrSummaryAndStatus() { - var ctxt, propertyGetter, indexSubsystem, solrContextFactory, solrContext, solrAdminClient, args, trackingSummaryResponse, trackingSummary, trackingStatusResponse, trackingStatus, coreNames; + var ctxt, propertyGetter, indexSubsystem, solrContextFactory, solrContext, solrAdminClient, solrAdminNativeClient, args, trackingSummaryResponse, trackingSummary, trackingStatusResponse, trackingStatus, coreNames; ctxt = Packages.org.springframework.web.context.ContextLoader.getCurrentWebApplicationContext(); propertyGetter = buildPropertyGetter(ctxt); @@ -93,11 +93,15 @@ function loadSolrSummaryAndStatus() }); model.coreNames = coreNames; - var solrAdminConsole = solrContext.getBean('solrAdminConsole', Packages.org.orderofthebee.addons.support.tools.repo.search.SolrAdminConsole); - model.cascadeTracker = []; - for (var i in coreNames) { - if (i) { - model.cascadeTracker[coreNames[i]] = solrAdminConsole.getCascadeTrackerPendingCount(coreNames[i]); + if (/^solr([6])?$/.test(indexSubsystem)) + { + solrAdminNativeClient = solrContext + .getBean('solrAdminNativeClient', Packages.org.orderofthebee.addons.support.tools.repo.search.SolrAdminNativeClient); + model.cascadeTracker = []; + for (var i in coreNames) { + if (i) { + model.cascadeTracker[coreNames[i]] = solrAdminNativeClient.getCascadeTrackerPendingCount(coreNames[i]); + } } }