Commit 493f1f81 authored by Brian Long's avatar Brian Long
Browse files

added reconcile/reindex/retry/fix/purge services

parent 0ed41a39
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -83,7 +83,7 @@
		<dependency>
			<groupId>com.inteligr8.alfresco</groupId>
			<artifactId>cxf-jaxrs-platform-module</artifactId>
			<version>1.3.1-acs-v23.3</version>
			<version>1.3.2-acs-v23.3</version>
			<type>amp</type>
		</dependency>

+1 −1
Original line number Diff line number Diff line
@@ -91,7 +91,7 @@ public abstract class AbstractUnregisterNodeWebScript<T extends NodeParameterSet
					if (status == null) {
						this.logger.warn("Registered host/core status could not be retrieved: {}:{}/solr/{}", nodeHostname, nodePort, core);
					} else {
						CoreMetadata coreMetadata = status.getStatus().getCores().get(core);
						CoreMetadata coreMetadata = status.getCores().getByCore(core);
						if (coreMetadata == null || coreMetadata.getName() == null) {
							this.logger.warn("Registered core does not actually exist on the node host; could be a DNS issue: {}:{}/solr/{}", nodeHostname, nodePort, core);
						} else {
+7 −2
Original line number Diff line number Diff line
@@ -36,15 +36,20 @@
		<dependency>
			<groupId>com.inteligr8.alfresco</groupId>
			<artifactId>asie-api</artifactId>
			<version>1.0-SNAPSHOT-asie2</version>
			<version>1.1-SNAPSHOT-asie2</version>
		</dependency>
		<dependency>
			<groupId>com.inteligr8</groupId>
			<artifactId>common-rest-client</artifactId>
			<version>3.0.1-cxf</version>
			<version>3.0.3-cxf</version>
		</dependency>
		
		<!-- Needed by this module, but provided by ACS -->
		<dependency>
			<groupId>org.alfresco</groupId>
			<artifactId>alfresco-data-model</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.alfresco</groupId>
			<artifactId>alfresco-repository</artifactId>
+119 −0
Original line number Diff line number Diff line
package com.inteligr8.alfresco.asie.rest;

import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import org.alfresco.model.ContentModel;
import org.alfresco.service.cmr.repository.InvalidNodeRefException;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.StoreRef;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.extensions.webscripts.WebScriptException;
import org.springframework.extensions.webscripts.WebScriptRequest;
import org.springframework.extensions.webscripts.WebScriptResponse;
import org.springframework.http.HttpStatus;

import com.inteligr8.alfresco.asie.model.ShardInstance;
import com.inteligr8.alfresco.asie.spi.ActionCallback;

public abstract class AbstractAcsNodeActionWebScript extends AbstractAsieWebScript {

	private final Logger logger = LoggerFactory.getLogger(this.getClass());
	
	@Autowired
	private NodeService nodeService;
	
	@Override
	public void executeAuthorized(WebScriptRequest request, WebScriptResponse response) throws IOException {
		String nodeId = request.getServiceMatch().getTemplateVars().get("nodeId");
		NodeRef nodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, nodeId);
		long nodeDbId = this.findNodeDbId(nodeRef);
		this.logger.trace("Found node database ID: {}: {}", nodeId, nodeDbId);

		try {
			Map<String, Object> responseMap = new HashMap<>();
			responseMap.put("nodeDbId", nodeDbId);
			
			ActionCallback callback = new ActionCallback() {
				
				@Override
				public void success(ShardInstance instance) {
					@SuppressWarnings("unchecked")
					List<String> instances = (List<String>) responseMap.get("success");
					if (instances == null)
						responseMap.put("success", instances = new LinkedList<>());
					instances.add(instance.getSpec());
				}
				
				@Override
				public void scheduled(ShardInstance instance) {
					@SuppressWarnings("unchecked")
					List<String> instances = (List<String>) responseMap.get("scheduled");
					if (instances == null)
						responseMap.put("scheduled", instances = new LinkedList<>());
					instances.add(instance.getSpec());
				}
				
				@Override
				public void error(ShardInstance instance, String message) {
					@SuppressWarnings("unchecked")
					Map<String, Object> instances = (Map<String, Object>) responseMap.get("error");
					if (instances == null)
						responseMap.put("error", instances = new HashMap<>());
					instances.put(instance.getSpec(), Collections.singletonMap("message", message));
				}
				
				@Override
				public void unknownResult(ShardInstance instance) {
					@SuppressWarnings("unchecked")
					List<String> instances = (List<String>) responseMap.get("unknown");
					if (instances == null)
						responseMap.put("unknown", instances = new LinkedList<>());
					instances.add(instance.getSpec());
				}
			};
			
			this.executeAction(nodeDbId, callback, 10L, TimeUnit.SECONDS, 30L, TimeUnit.SECONDS);
			
			if (responseMap.containsKey("error")) {
				response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
			} else if (responseMap.containsKey("scheduled")) {
				response.setStatus(HttpStatus.ACCEPTED.value());
			} else {
				response.setStatus(HttpStatus.OK.value());
			}

			response.setContentType("application/json");
			this.getObjectMapper().writeValue(response.getWriter(), responseMap);
		} catch (UnsupportedOperationException uoe) {
			throw new WebScriptException(HttpStatus.NOT_IMPLEMENTED.value(), uoe.getMessage(), uoe);
		} catch (InterruptedException ie) {
			throw new WebScriptException(HttpStatus.SERVICE_UNAVAILABLE.value(), "The execution was interrupted", ie);
		} catch (TimeoutException te) {
			throw new WebScriptException(HttpStatus.INTERNAL_SERVER_ERROR.value(), "The execution may continue, but timed-out waiting", te);
		}
    }
	
	protected abstract void executeAction(
			long nodeDbId, ActionCallback callback,
			long fullQueueTimeout, TimeUnit fullQueueUnit,
			long execTimeout, TimeUnit execUnit) throws TimeoutException, InterruptedException;
	
	private long findNodeDbId(NodeRef nodeRef) {
		try {
			return (Long) this.nodeService.getProperty(nodeRef, ContentModel.PROP_NODE_DBID);
		} catch (InvalidNodeRefException inre) {
			throw new WebScriptException(HttpStatus.NOT_FOUND.value(), "The node does not exist");
		}
	}
    
}
+102 −0
Original line number Diff line number Diff line
package com.inteligr8.alfresco.asie.rest;

import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import org.alfresco.model.ContentModel;
import org.alfresco.service.cmr.repository.InvalidNodeRefException;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.StoreRef;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.extensions.webscripts.WebScriptException;
import org.springframework.extensions.webscripts.WebScriptRequest;
import org.springframework.extensions.webscripts.WebScriptResponse;
import org.springframework.http.HttpStatus;

import com.inteligr8.alfresco.asie.model.ShardInstance;
import com.inteligr8.alfresco.asie.spi.ActionCallback;

public abstract class AbstractActionWebScript extends AbstractAsieWebScript {

	private final Logger logger = LoggerFactory.getLogger(this.getClass());
	
	@Override
	public void executeAuthorized(WebScriptRequest request, WebScriptResponse response) throws IOException {
		try {
			Map<String, Object> responseMap = new HashMap<>();
			
			ActionCallback callback = new ActionCallback() {
				
				@Override
				public void success(ShardInstance instance) {
					@SuppressWarnings("unchecked")
					List<String> instances = (List<String>) responseMap.get("success");
					if (instances == null)
						responseMap.put("success", instances = new LinkedList<>());
					instances.add(instance.getSpec());
				}
				
				@Override
				public void scheduled(ShardInstance instance) {
					@SuppressWarnings("unchecked")
					List<String> instances = (List<String>) responseMap.get("scheduled");
					if (instances == null)
						responseMap.put("scheduled", instances = new LinkedList<>());
					instances.add(instance.getSpec());
				}
				
				@Override
				public void error(ShardInstance instance, String message) {
					@SuppressWarnings("unchecked")
					Map<String, Object> instances = (Map<String, Object>) responseMap.get("error");
					if (instances == null)
						responseMap.put("error", instances = new HashMap<>());
					instances.put(instance.getSpec(), Collections.singletonMap("message", message));
				}
				
				@Override
				public void unknownResult(ShardInstance instance) {
					@SuppressWarnings("unchecked")
					List<String> instances = (List<String>) responseMap.get("unknown");
					if (instances == null)
						responseMap.put("unknown", instances = new LinkedList<>());
					instances.add(instance.getSpec());
				}
			};
			
			this.executeAction(callback, 10L, TimeUnit.SECONDS, 30L, TimeUnit.SECONDS);
			
			if (responseMap.containsKey("error")) {
				response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
			} else if (responseMap.containsKey("scheduled")) {
				response.setStatus(HttpStatus.ACCEPTED.value());
			} else {
				response.setStatus(HttpStatus.OK.value());
			}

			response.setContentType("application/json");
			this.getObjectMapper().writeValue(response.getWriter(), responseMap);
		} catch (UnsupportedOperationException uoe) {
			throw new WebScriptException(HttpStatus.NOT_IMPLEMENTED.value(), uoe.getMessage(), uoe);
		} catch (InterruptedException ie) {
			throw new WebScriptException(HttpStatus.SERVICE_UNAVAILABLE.value(), "The execution was interrupted", ie);
		} catch (TimeoutException te) {
			throw new WebScriptException(HttpStatus.INTERNAL_SERVER_ERROR.value(), "The execution may continue, but timed-out waiting", te);
		}
    }
	
	protected abstract void executeAction(
			ActionCallback callback,
			long fullQueueTimeout, TimeUnit fullQueueUnit,
			long execTimeout, TimeUnit execUnit) throws TimeoutException, InterruptedException;
    
}
Loading