You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by cw...@apache.org on 2020/06/10 13:15:05 UTC

[uima-async-scaleout] 21/34: UIMA-5501

This is an automated email from the ASF dual-hosted git repository.

cwiklik pushed a commit to branch uima-as-3
in repository https://gitbox.apache.org/repos/asf/uima-async-scaleout.git

commit fdfa8ecf0138cd20a61fb29db5c57bfec9938bbc
Author: cwiklik <cwiklik>
AuthorDate: Thu Oct 18 14:17:11 2018 +0000

    UIMA-5501
---
 uimaj-as-connectors/.classpath                     |  36 ++
 uimaj-as-connectors/.project                       |  23 +
 .../.settings/org.eclipse.core.resources.prefs     |   6 +
 .../.settings/org.eclipse.jdt.core.prefs           |   5 +
 .../.settings/org.eclipse.m2e.core.prefs           |   4 +
 uimaj-as-connectors/pom.xml                        |  25 +
 .../connectors/direct/DirectUimaAsConnector.java   |  26 +
 .../as/connectors/direct/DirectUimaAsConsumer.java | 205 +++++++
 .../as/connectors/direct/DirectUimaAsEndpoint.java | 251 ++++++++
 .../as/connectors/direct/DirectUimaAsProducer.java |  48 ++
 .../mockup/MockUpAnalysisEngineController.java     | 659 +++++++++++++++++++++
 .../as/connectors/mockup/TestMessageProcessor.java |  28 +
 .../connectors/direct/DirectUimaAsConnector.class  | Bin 0 -> 1276 bytes
 .../direct/DirectUimaAsConsumer$1$1.class          | Bin 0 -> 2023 bytes
 .../connectors/direct/DirectUimaAsConsumer$1.class | Bin 0 -> 3352 bytes
 ...rectUimaAsConsumer$DirectListenerCallback.class | Bin 0 -> 1358 bytes
 .../connectors/direct/DirectUimaAsConsumer.class   | Bin 0 -> 8575 bytes
 ...int$MockupService$ServiceMessageProcessor.class | Bin 0 -> 2619 bytes
 .../DirectUimaAsEndpoint$MockupService.class       | Bin 0 -> 3518 bytes
 .../connectors/direct/DirectUimaAsEndpoint.class   | Bin 0 -> 8402 bytes
 .../connectors/direct/DirectUimaAsProducer.class   | Bin 0 -> 1534 bytes
 .../mockup/MockUpAnalysisEngineController.class    | Bin 0 -> 16652 bytes
 .../connectors/mockup/TestMessageProcessor.class   | Bin 0 -> 1378 bytes
 23 files changed, 1316 insertions(+)

diff --git a/uimaj-as-connectors/.classpath b/uimaj-as-connectors/.classpath
new file mode 100644
index 0000000..e43402f
--- /dev/null
+++ b/uimaj-as-connectors/.classpath
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="target/classes" path="src/main/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/uimaj-as-connectors/.project b/uimaj-as-connectors/.project
new file mode 100644
index 0000000..ff69063
--- /dev/null
+++ b/uimaj-as-connectors/.project
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>uimaj-as-connectors</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+</projectDescription>
diff --git a/uimaj-as-connectors/.settings/org.eclipse.core.resources.prefs b/uimaj-as-connectors/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..29abf99
--- /dev/null
+++ b/uimaj-as-connectors/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,6 @@
+eclipse.preferences.version=1
+encoding//src/main/java=UTF-8
+encoding//src/main/resources=UTF-8
+encoding//src/test/java=UTF-8
+encoding//src/test/resources=UTF-8
+encoding/<project>=UTF-8
diff --git a/uimaj-as-connectors/.settings/org.eclipse.jdt.core.prefs b/uimaj-as-connectors/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..ec4300d
--- /dev/null
+++ b/uimaj-as-connectors/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,5 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.7
diff --git a/uimaj-as-connectors/.settings/org.eclipse.m2e.core.prefs b/uimaj-as-connectors/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/uimaj-as-connectors/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/uimaj-as-connectors/pom.xml b/uimaj-as-connectors/pom.xml
new file mode 100644
index 0000000..da30e8c
--- /dev/null
+++ b/uimaj-as-connectors/pom.xml
@@ -0,0 +1,25 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  	<parent>
+		<groupId>org.apache.uima</groupId>
+		<artifactId>uima-as-parent</artifactId>
+		<version>2.10.3-SNAPSHOT</version>
+		<relativePath>../uima-as-parent/pom.xml</relativePath>
+	</parent>
+
+  <artifactId>uimaj-as-connectors</artifactId>
+  
+  
+  	<dependencies>
+		<dependency>
+			<groupId>org.apache.uima</groupId>
+			<artifactId>uimaj-as-core</artifactId>
+			<version>${project.version}</version>
+			<scope>compile</scope>
+		</dependency>
+ 
+		
+	</dependencies>
+
+
+</project>
\ No newline at end of file
diff --git a/uimaj-as-connectors/src/main/java/org/apache/uima/as/connectors/direct/DirectUimaAsConnector.java b/uimaj-as-connectors/src/main/java/org/apache/uima/as/connectors/direct/DirectUimaAsConnector.java
new file mode 100644
index 0000000..6955a68
--- /dev/null
+++ b/uimaj-as-connectors/src/main/java/org/apache/uima/as/connectors/direct/DirectUimaAsConnector.java
@@ -0,0 +1,26 @@
+package org.apache.uima.as.connectors.direct;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.uima.aae.definition.connectors.UimaAsConnector;
+import org.apache.uima.aae.definition.connectors.UimaAsEndpoint;
+
+public class DirectUimaAsConnector implements UimaAsConnector {
+
+	private final Map<String, UimaAsEndpoint> endpoints = 
+			new HashMap<>();
+	
+
+	@Override
+	public UimaAsEndpoint createEndpoint(String uri, Map<String, Object> params) throws Exception {
+		UimaAsEndpoint endpoint = new DirectUimaAsEndpoint();
+		endpoints.putIfAbsent(uri, endpoint);
+		return endpoint;
+	}
+
+	public static void main(String[] args) {
+
+	}
+
+}
diff --git a/uimaj-as-connectors/src/main/java/org/apache/uima/as/connectors/direct/DirectUimaAsConsumer.java b/uimaj-as-connectors/src/main/java/org/apache/uima/as/connectors/direct/DirectUimaAsConsumer.java
new file mode 100644
index 0000000..a52b1b1
--- /dev/null
+++ b/uimaj-as-connectors/src/main/java/org/apache/uima/as/connectors/direct/DirectUimaAsConsumer.java
@@ -0,0 +1,205 @@
+package org.apache.uima.as.connectors.direct;
+
+import java.util.Objects;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.uima.aae.UimaAsThreadFactory;
+import org.apache.uima.aae.controller.AnalysisEngineController;
+import org.apache.uima.aae.controller.PrimitiveAnalysisEngineController;
+import org.apache.uima.aae.definition.connectors.AbstractUimaAsConsumer;
+import org.apache.uima.aae.definition.connectors.ListenerCallback;
+import org.apache.uima.aae.definition.connectors.UimaAsConsumer;
+import org.apache.uima.aae.message.AsynchAEMessage;
+import org.apache.uima.aae.message.MessageContext;
+import org.apache.uima.aae.message.MessageProcessor;
+import org.apache.uima.aae.spi.transport.vm.UimaVmQueue;
+import org.apache.uima.as.client.DirectMessage;
+import org.apache.uima.as.client.DirectMessageContext;
+
+public class DirectUimaAsConsumer extends AbstractUimaAsConsumer {
+
+	private BlockingQueue<DirectMessage> inQueue= new LinkedBlockingQueue<>();;
+	private MessageProcessor processor;
+	private boolean started = false;
+	private ExecutorService executor;
+	private final ConsumerType consumerType;
+	private int consumerThreadCount = 1;
+	private boolean doStop = false;
+	private final CountDownLatch latchToCountNumberOfInitedThreads;
+	private final CountDownLatch latchToCountNumberOfTerminatedThreads;
+	private AnalysisEngineController controller;
+	private final String name;
+    public DirectUimaAsConsumer(String name, BlockingQueue<DirectMessage> inQueue, ConsumerType type, int consumerThreadCount) {
+		this(name, type,consumerThreadCount);
+		this.inQueue = inQueue;
+	}
+
+	public DirectUimaAsConsumer(String name,String targetUri, ConsumerType type, int consumerThreadCount) {
+		this(name, type,consumerThreadCount);
+		
+	}
+
+	private DirectUimaAsConsumer( String name, ConsumerType type, int consumerThreadCount) {
+		this.name = name;
+		this.consumerType = type;
+		this.consumerThreadCount = consumerThreadCount;
+		latchToCountNumberOfInitedThreads = new CountDownLatch(consumerThreadCount);
+		latchToCountNumberOfTerminatedThreads = new CountDownLatch(consumerThreadCount);
+	}
+	
+	public ConsumerType getType() {
+		return consumerType;
+	}
+	
+	protected void setMessageProcessor(MessageProcessor processor) {
+		this.processor = processor;
+	}
+	
+	public void initialize() throws Exception {
+		
+	}
+
+	/**
+	 * This method is called on a producer thread
+	 * 
+	 */
+	@Override
+	public void consume(DirectMessage message) throws Exception {
+		inQueue.add(message);
+	}
+	
+	private void initializeUimaPipeline() throws Exception {
+//		workQueue = new UimaVmQueue();
+		if ( controller.isPrimitive() ) {
+			ThreadGroup threadGroup = new ThreadGroup("VmThreadGroup" + 1 + "_" + controller.getComponentName());
+			executor = new ThreadPoolExecutor(consumerThreadCount, consumerThreadCount, Long.MAX_VALUE, TimeUnit.DAYS, new UimaVmQueue());
+			UimaAsThreadFactory tf = null;
+			
+			DirectListenerCallback callback = new DirectListenerCallback(this);
+			
+			tf = new UimaAsThreadFactory().
+					withCallback(callback).
+					withThreadGroup(threadGroup).
+					withPrimitiveController((PrimitiveAnalysisEngineController)processor.getController()).
+					withTerminatedThreadsLatch(latchToCountNumberOfTerminatedThreads).
+					withInitedThreadsLatch(latchToCountNumberOfInitedThreads);
+			tf.setDaemon(true);
+			((ThreadPoolExecutor)executor).setThreadFactory(tf);
+			((ThreadPoolExecutor)executor).prestartAllCoreThreads();
+			latchToCountNumberOfInitedThreads.await();
+			if ( callback.failedInitialization() ) {
+				throw callback.getException();
+			}
+			System.out.println("Executor Started - All Process Threads Initialized");
+		} else {
+			 executor = Executors.newFixedThreadPool(consumerThreadCount);
+		}
+	}
+	public void initialize(AnalysisEngineController controller) throws Exception {
+		this.controller = controller;
+		// Consumer handling ProcessCAS must first initialize each
+		// UIMA pipeline.
+		if (ConsumerType.ProcessCAS.equals(consumerType)) {
+			if ( Objects.isNull(controller)) {
+				 executor = Executors.newFixedThreadPool(consumerThreadCount);
+			} else {
+				initializeUimaPipeline();
+			}
+
+		} else {
+			 executor = Executors.newFixedThreadPool(consumerThreadCount);
+		}
+	}
+	
+	private boolean stopConsumingMessages(DirectMessage message ) throws Exception{
+		return (message.getMessageIntProperty(AsynchAEMessage.Command) == AsynchAEMessage.PoisonPill);
+		
+	}
+	public void stop() {
+		doStop = true;
+	}
+	public synchronized void start() {
+		if ( started ) {
+			return;
+		}
+		System.out.println(">>> "+name+" DirectConsumer.start() - Consumer Type:"+getType());
+		new Thread() {
+			@Override
+			public void run() {
+				started = true;
+
+				
+				while( !doStop ) {
+					try {
+						
+						final DirectMessage message = inQueue.take(); //blocks if empty
+						System.out.println(">>> "+name+" DirectConsumer.run() - Consumer Type:"+getType()+" Got new message");
+						
+			            if ( stopConsumingMessages(message)) {  // special type of msg indicating end of processing
+						    System.out.println(">>> "+name+" Got END message - Stopping Queue Consumer");
+			            	doStop = true;
+						} else {
+							executor.submit(new Runnable() {
+						        public void run() {
+						        	
+						            try {
+						            	//System.out.println(">>> "+controller.getComponentName()+" Got new message - processing on thread "+Thread.currentThread().getName()+" channel:"+getType());
+										//ic.onMessage(message);
+						            	
+						    			// every message is wrapped in the MessageContext
+						    			MessageContext messageContext = 
+						    					new DirectMessageContext(message, "", controller.getComponentName());
+
+										processor.process(messageContext);
+						            } catch( Exception e) {
+						            	e.printStackTrace();
+						            }
+						          }
+						        });
+						}
+
+					} catch( InterruptedException e) {
+						Thread.currentThread().interrupt();
+						
+						//System.out.println(getType()+ " Listener Thread Interrupted - Stop Listening");
+						doStop = true;
+				    } catch (Exception e) {
+						e.printStackTrace();
+						doStop = true;
+					} 
+				}
+			}
+		}.start();
+	}
+	public static void main(String[] args) {
+		// TODO Auto-generated method stub
+
+	}
+	public class DirectListenerCallback implements ListenerCallback {
+		private UimaAsConsumer dl;
+		private boolean initializationFailed = false;
+		private Exception exception;
+		
+		public DirectListenerCallback(UimaAsConsumer l) {
+			this.dl = l;
+		}
+		
+		public void onInitializationError(Exception e) {
+			initializationFailed = true;
+			exception = e;
+		}
+		public boolean failedInitialization() {
+			return initializationFailed;
+		}
+		public Exception getException() {
+			return exception;
+		}
+	}
+
+}
diff --git a/uimaj-as-connectors/src/main/java/org/apache/uima/as/connectors/direct/DirectUimaAsEndpoint.java b/uimaj-as-connectors/src/main/java/org/apache/uima/as/connectors/direct/DirectUimaAsEndpoint.java
new file mode 100644
index 0000000..012c89a
--- /dev/null
+++ b/uimaj-as-connectors/src/main/java/org/apache/uima/as/connectors/direct/DirectUimaAsEndpoint.java
@@ -0,0 +1,251 @@
+package org.apache.uima.as.connectors.direct;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CountDownLatch;
+
+import org.apache.uima.UimaContext;
+import org.apache.uima.aae.AsynchAECasManager;
+import org.apache.uima.aae.InProcessCache;
+import org.apache.uima.aae.InputChannel;
+import org.apache.uima.aae.OutputChannel;
+import org.apache.uima.aae.UimaEEAdminContext;
+import org.apache.uima.aae.controller.AnalysisEngineController;
+import org.apache.uima.aae.controller.BaseAnalysisEngineController.ENDPOINT_TYPE;
+import org.apache.uima.aae.controller.BaseAnalysisEngineController.ServiceState;
+import org.apache.uima.aae.controller.ControllerCallbackListener;
+import org.apache.uima.aae.controller.ControllerLatch;
+import org.apache.uima.aae.controller.Endpoint;
+import org.apache.uima.aae.controller.EventSubscriber;
+import org.apache.uima.aae.controller.LocalCache;
+import org.apache.uima.aae.definition.connectors.UimaAsConsumer;
+import org.apache.uima.aae.definition.connectors.UimaAsEndpoint;
+import org.apache.uima.aae.definition.connectors.UimaAsProducer;
+import org.apache.uima.aae.error.AsynchAEException;
+import org.apache.uima.aae.error.ErrorContext;
+import org.apache.uima.aae.error.ErrorHandlerChain;
+import org.apache.uima.aae.jmx.JmxManagement;
+import org.apache.uima.aae.jmx.ServiceErrors;
+import org.apache.uima.aae.jmx.ServiceInfo;
+import org.apache.uima.aae.jmx.ServicePerformance;
+import org.apache.uima.aae.message.AsynchAEMessage;
+import org.apache.uima.aae.message.MessageContext;
+import org.apache.uima.aae.message.MessageProcessor;
+import org.apache.uima.aae.message.UimaAsOrigin;
+import org.apache.uima.aae.monitor.Monitor;
+import org.apache.uima.aae.definition.connectors.UimaAsConsumer.ConsumerType;
+import org.apache.uima.aae.service.command.UimaAsMessageProcessor;
+import org.apache.uima.aae.spi.transport.UimaMessageListener;
+import org.apache.uima.as.client.DirectInputChannel;
+import org.apache.uima.as.client.DirectMessage;
+import org.apache.uima.as.client.DirectMessageContext;
+import org.apache.uima.as.client.Listener;
+import org.apache.uima.as.connectors.mockup.MockUpAnalysisEngineController;
+import org.apache.uima.as.connectors.mockup.TestMessageProcessor;
+import org.apache.uima.cas.CAS;
+import org.apache.uima.resource.ResourceSpecifier;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+public class DirectUimaAsEndpoint implements UimaAsEndpoint {
+
+	private Map<String,UimaAsConsumer> consumers = new ConcurrentHashMap<>();
+	private Map<String,UimaAsProducer> producers = new ConcurrentHashMap<>();
+	private final MessageProcessor processor;
+	private final String name;
+	
+	public DirectUimaAsEndpoint(MessageProcessor processor, String name) {
+		this.processor = processor;
+		this.name = name;
+	}
+	public MessageContext createMessage(int command, int messageType, Endpoint endpoint) {
+		DirectMessage message = 
+				new DirectMessage().
+				withCommand(command).
+				withMessageType(messageType).
+				withOrigin(processor.getController().getOrigin());
+		
+		MessageContext messageContext = 
+				new DirectMessageContext(message,name,name);
+		
+		message.withCommand(command).
+			withMessageType(messageType);
+		
+		if ( command == AsynchAEMessage.GetMeta && messageType == AsynchAEMessage.Response ) {
+			message.withMetadata(null);
+//			message.withMetadata(processor.getController().getResourceSpecifier().);
+		}
+		
+			
+		return messageContext;
+	}
+	public void dispatch(MessageContext messageContext) throws Exception {
+		UimaAsProducer producer;
+		if ( !producers.containsKey(messageContext.getEndpoint().getDelegateKey())) {
+			producer = 
+					createProducer((UimaAsConsumer)messageContext.getEndpoint().getDestination(), messageContext.getEndpoint().getDelegateKey());
+		} else {
+			producer = producers.get(messageContext.getEndpoint().getDelegateKey());
+		}
+		producer.dispatch((DirectMessage)messageContext.getRawMessage());
+	}
+	
+	public UimaAsProducer createProducer(UimaAsConsumer consumer, String delegateKey) throws Exception {
+		
+		UimaAsProducer producer = new DirectUimaAsProducer(consumer);
+		producers.put(delegateKey,producer);
+		return producer;
+	}
+	
+	public UimaAsProducer createProducer(String targetUri) throws Exception {
+		
+		UimaAsProducer producer = new DirectUimaAsProducer(targetUri);
+		producers.put(targetUri, producer);
+		return producer;
+	}
+
+	public UimaAsConsumer createConsumer(String targetUri, ConsumerType type, int consumerThreadCount) throws Exception {
+		
+		DirectUimaAsConsumer consumer = new DirectUimaAsConsumer(name, targetUri, type, consumerThreadCount);
+		consumer.setMessageProcessor(processor);
+		consumers.put(targetUri+type.name(), consumer);
+		return consumer;
+	}
+	
+	public UimaAsConsumer getConsumer(String targetUri, ConsumerType type) {
+		return consumers.get(targetUri+type.name());
+	}
+
+	@Override
+	public void start() throws Exception {
+		for(Entry<String, UimaAsConsumer> entry : consumers.entrySet()) {
+			entry.getValue().initialize(processor.getController());
+			entry.getValue().start();
+		}
+		for(Entry<String, UimaAsProducer> entry : producers.entrySet()) {
+			entry.getValue().start();
+		}
+
+	}
+	@Override
+	public void stop() throws Exception {
+		for(Entry<String, UimaAsConsumer> entry : consumers.entrySet()) {
+			entry.getValue().stop();
+		}
+		for(Entry<String, UimaAsProducer> entry : producers.entrySet()) {
+			entry.getValue().stop();
+		}
+		
+	}
+
+	public static void main(String[] args) {
+		try {
+			MessageProcessor dummyProcessor = 
+					new TestMessageProcessor(null);
+					//new TestMessageProcessor(new MockUpAnalysisEngineController("MockupClient", 4));
+
+//			MessageProcessor processor = 
+	//				new UimaAsMessageProcessor(null);
+			//TestMessageProcessor processor = new TestMessageProcessor(null);
+			
+			DirectUimaAsEndpoint endpoint = 
+					new DirectUimaAsEndpoint(dummyProcessor, "Client");
+
+			MockupService service = 
+					endpoint.new MockupService();
+			
+			service.initialize();
+			service.start();
+			
+			endpoint.createConsumer("direct:", ConsumerType.GetMeta, 1);
+			endpoint.createConsumer("direct:", ConsumerType.ProcessCAS, 4);
+			endpoint.createConsumer("direct:", ConsumerType.Cpc, 1);
+			
+			UimaAsProducer producer = 
+					endpoint.createProducer( "direct:serviceA");
+		
+			endpoint.start();
+			
+			DirectMessage getMetaRequestMessage = 
+					new DirectMessage().
+					    withCommand(AsynchAEMessage.GetMeta).
+					    withMessageType(AsynchAEMessage.Request).
+					    withOrigin(new UimaAsOrigin("Client")).
+					    withReplyDestination(endpoint.getConsumer("direct:", ConsumerType.GetMeta)).
+					    withPayload(AsynchAEMessage.None);
+			UimaAsConsumer target = 
+					service.getEndpoint().getConsumer("direct:", ConsumerType.GetMeta);
+			
+			producer.dispatch(getMetaRequestMessage, target);
+			
+		} catch( Exception e) {
+			e.printStackTrace();
+		}
+
+	}
+
+	
+	private class MockupService {
+		UimaAsEndpoint endpoint;
+		UimaAsProducer producer;
+		
+		public void initialize() throws Exception {
+			
+			MockUpAnalysisEngineController controller =
+					new MockUpAnalysisEngineController("MockupService",4);
+			MessageProcessor dummyProcessor = 
+					new TestMessageProcessor(controller);
+			
+			endpoint = new DirectUimaAsEndpoint(dummyProcessor, "Service");
+			UimaAsConsumer getMetaReplyConsumer = endpoint.createConsumer("direct:", ConsumerType.GetMeta, 1);
+			UimaAsConsumer processCasReplyConsumer = endpoint.createConsumer("direct:", ConsumerType.ProcessCAS, 4);
+			UimaAsConsumer cpcReplyConsumer = endpoint.createConsumer("direct:", ConsumerType.Cpc, 1);
+			
+			producer = endpoint.createProducer( "direct:serviceA");
+			controller.addEndpoint(new UimaAsOrigin("Service"), endpoint);
+		}
+		public void process(MessageContext mc) throws Exception {
+			
+		}
+		public void start() throws Exception {
+			endpoint.start();
+		}
+		public void stop() throws Exception {
+			endpoint.stop();
+		}
+		public UimaAsEndpoint getEndpoint() {
+			return endpoint;
+		}
+		
+		
+		private class ServiceMessageProcessor implements MessageProcessor {
+			MockupService service;
+			public ServiceMessageProcessor(MockupService service) {
+				this.service = service;
+			}
+			@Override
+			public void process(MessageContext message) throws Exception {
+				DirectMessage request = 
+						(DirectMessage)message.getRawMessage();
+				DirectMessage getMetaReply = 
+						new DirectMessage().
+						    withCommand(AsynchAEMessage.GetMeta).
+						    withMessageType(AsynchAEMessage.Response).
+						    withOrigin(message.getEndpoint().getMessageOrigin()).
+						    withReplyDestination(request.getReplyDestination()).
+						    withPayload(AsynchAEMessage.Metadata);
+				MessageContext reply = new DirectMessageContext(getMetaReply, "", "");
+				service.getEndpoint().dispatch(reply);
+				
+			}
+			@Override
+			public AnalysisEngineController getController() {
+				// TODO Auto-generated method stub
+				return null;
+			}
+			
+		}
+	}
+
+}
diff --git a/uimaj-as-connectors/src/main/java/org/apache/uima/as/connectors/direct/DirectUimaAsProducer.java b/uimaj-as-connectors/src/main/java/org/apache/uima/as/connectors/direct/DirectUimaAsProducer.java
new file mode 100644
index 0000000..be7c9e3
--- /dev/null
+++ b/uimaj-as-connectors/src/main/java/org/apache/uima/as/connectors/direct/DirectUimaAsProducer.java
@@ -0,0 +1,48 @@
+package org.apache.uima.as.connectors.direct;
+
+
+import org.apache.uima.aae.definition.connectors.UimaAsConsumer;
+import org.apache.uima.aae.definition.connectors.UimaAsProducer;
+import org.apache.uima.aae.message.MessageContext;
+import org.apache.uima.aae.message.UimaAsMessage;
+import org.apache.uima.as.client.DirectMessage;
+
+public class DirectUimaAsProducer implements UimaAsProducer{
+
+	private UimaAsConsumer consumer;
+	
+	public DirectUimaAsProducer(String targetUri) {
+		
+	}
+	public DirectUimaAsProducer(UimaAsConsumer consumer) {
+		this.consumer = consumer;
+	}
+
+	@Override
+	public void start() throws Exception {
+		// TODO Auto-generated method stub
+		
+	}
+	@Override
+	public void stop() throws Exception {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void dispatch(DirectMessage message) throws Exception {
+
+		consumer.consume(message);
+		
+	}
+	@Override
+	public void dispatch(DirectMessage message, UimaAsConsumer target) throws Exception {
+		// hand over message to the target consumer
+		target.consume(message);
+		
+	}
+	public static void main(String[] args) {
+		// TODO Auto-generated method stub
+
+	}
+}
diff --git a/uimaj-as-connectors/src/main/java/org/apache/uima/as/connectors/mockup/MockUpAnalysisEngineController.java b/uimaj-as-connectors/src/main/java/org/apache/uima/as/connectors/mockup/MockUpAnalysisEngineController.java
new file mode 100644
index 0000000..c8fa5e5
--- /dev/null
+++ b/uimaj-as-connectors/src/main/java/org/apache/uima/as/connectors/mockup/MockUpAnalysisEngineController.java
@@ -0,0 +1,659 @@
+package org.apache.uima.as.connectors.mockup;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.BrokenBarrierException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.CyclicBarrier;
+
+import org.apache.uima.UimaContext;
+import org.apache.uima.aae.AsynchAECasManager;
+import org.apache.uima.aae.InProcessCache;
+import org.apache.uima.aae.InputChannel;
+import org.apache.uima.aae.OutputChannel;
+import org.apache.uima.aae.UimaEEAdminContext;
+import org.apache.uima.aae.controller.AnalysisEngineController;
+import org.apache.uima.aae.controller.AnalysisEngineInstancePool;
+import org.apache.uima.aae.controller.ControllerCallbackListener;
+import org.apache.uima.aae.controller.ControllerLatch;
+import org.apache.uima.aae.controller.Endpoint;
+import org.apache.uima.aae.controller.EventSubscriber;
+import org.apache.uima.aae.controller.LocalCache;
+import org.apache.uima.aae.controller.PrimitiveAnalysisEngineController;
+import org.apache.uima.aae.definition.connectors.UimaAsEndpoint;
+import org.apache.uima.aae.controller.BaseAnalysisEngineController.ENDPOINT_TYPE;
+import org.apache.uima.aae.controller.BaseAnalysisEngineController.ServiceState;
+import org.apache.uima.aae.error.AsynchAEException;
+import org.apache.uima.aae.error.ErrorContext;
+import org.apache.uima.aae.error.ErrorHandlerChain;
+import org.apache.uima.aae.jmx.JmxManagement;
+import org.apache.uima.aae.jmx.PrimitiveServiceInfo;
+import org.apache.uima.aae.jmx.ServiceErrors;
+import org.apache.uima.aae.jmx.ServiceInfo;
+import org.apache.uima.aae.jmx.ServicePerformance;
+import org.apache.uima.aae.message.AsynchAEMessage;
+import org.apache.uima.aae.message.MessageContext;
+import org.apache.uima.aae.message.Origin;
+import org.apache.uima.aae.message.UimaAsOrigin;
+import org.apache.uima.aae.monitor.Monitor;
+import org.apache.uima.aae.spi.transport.UimaMessageListener;
+import org.apache.uima.as.client.DirectInputChannel;
+import org.apache.uima.as.client.Listener;
+import org.apache.uima.cas.CAS;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.apache.uima.resource.ResourceSpecifier;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+public class MockUpAnalysisEngineController implements PrimitiveAnalysisEngineController {
+
+	private String name="N/A";
+	private ThreadLocal<Long> threadLocalValue = new ThreadLocal<>();
+	private volatile ControllerLatch latch = new ControllerLatch(this);
+	private CyclicBarrier barrier;
+	private Map<Origin, UimaAsEndpoint> endpoints = 
+			new HashMap<>();
+	private final Origin serviceOrigin;
+	
+	public MockUpAnalysisEngineController(String name, int scaleout) {
+		this.name = name;
+		serviceOrigin = new UimaAsOrigin(name);
+		barrier = new CyclicBarrier(scaleout);
+	}
+	public Origin getOrigin() {
+		return serviceOrigin;
+	}
+	public void addEndpoint(Origin origin, UimaAsEndpoint endpoint) {
+		endpoints.put(origin, endpoint);
+	}
+	@Override
+	public void terminate() {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void addControllerCallbackListener(ControllerCallbackListener aListener) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void removeControllerCallbackListener(ControllerCallbackListener aListener) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void sendMetadata(Endpoint anEndpoint) throws AsynchAEException {
+		UimaAsEndpoint endpoint = 
+				endpoints.get(anEndpoint.getMessageOrigin());//anEndpoint.getDelegateKey());
+		MessageContext message = endpoint.createMessage(AsynchAEMessage.GetMeta,AsynchAEMessage.Response,anEndpoint);
+		try {
+			endpoint.dispatch(message);
+		} catch( Exception e) {
+			throw new AsynchAEException(e);
+		}
+
+	}
+
+	@Override
+	public ControllerLatch getControllerLatch() {
+		return latch;
+	}
+
+	@Override
+	public void setInputChannel(InputChannel anInputChannel) throws Exception {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void setDirectInputChannel(DirectInputChannel anInputChannel) throws Exception {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void setJmsInputChannel(InputChannel anInputChannel) throws Exception {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public InputChannel getInputChannel(ENDPOINT_TYPE et) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public InputChannel getInputChannel() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void addInputChannel(InputChannel anInputChannel) throws Exception {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public String getServiceEndpointName() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void setServiceId(String name) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public String getServiceId() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void handleDelegateLifeCycleEvent(String anEndpoint, int aDelegateCount) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void takeAction(String anAction, String anEndpointName, ErrorContext anErrorContext) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void setThreadFactory(ThreadPoolTaskExecutor factory) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public List<Listener> getAllListeners() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void saveReplyTime(long snapshot, String aKey) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public long getReplyTime() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	@Override
+	public Map getStats() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public UimaContext getChildUimaContext(String aDelegateEndpointName) throws Exception {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void dropCAS(String aCasReferenceId, boolean dropCacheEntry) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void dropCAS(CAS aCAS) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public InProcessCache getInProcessCache() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public boolean isPrimitive() {
+		// TODO Auto-generated method stub
+		return true;
+	}
+
+	@Override
+	public Monitor getMonitor() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public String getName() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public String getComponentName() {
+		return name;
+	}
+
+	@Override
+	public void collectionProcessComplete(Endpoint anEndpoint) throws AsynchAEException {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public boolean isTopLevelComponent() {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	@Override
+	public void initialize() throws AsynchAEException {
+		System.out.println(".....Thread["+Thread.currentThread().getId()+"] "+ getComponentName()+" - Initializing AE");
+	}
+
+	@Override
+	public void process(CAS aCas, String aCasId) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void process(CAS aCAS, String anInputCasReferenceId, String aNewCasReferenceId,
+			String newCASProducedBy) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void process(CAS aCAS, String aCasReferenceId, Endpoint anEndpoint) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void saveTime(long anArrivalTime, String aCasReferenceId, String anEndpointName) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public long getTime(String aCasReferenceId, String anEndpointName) {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	@Override
+	public ErrorHandlerChain getErrorHandlerChain() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void addOutputChannel(OutputChannel anOutputChannel) throws Exception {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public OutputChannel getOutputChannel(Endpoint anEndpoint) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public OutputChannel getOutputChannel(ENDPOINT_TYPE et) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void setCasManager(AsynchAECasManager aCasManager) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public AsynchAECasManager getCasManagerWrapper() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void stop() {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public boolean isStopped() {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	@Override
+	public void setStopped() {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void dropStats(String aCasReferenceId, String anEndpointName) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void setUimaEEAdminContext(UimaEEAdminContext anAdminContext) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public UimaEEAdminContext getUimaEEAdminContext() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public String getJMXDomain() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public int getIndex() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	@Override
+	public String getJmxContext() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public ServicePerformance getServicePerformance() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public PrimitiveServiceInfo getServiceInfo() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void addServiceInfo(ServiceInfo aServiceInfo) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public ServiceErrors getServiceErrors() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void setDeployDescriptor(String aDeployDescriptor) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void cacheClientEndpoint(Endpoint anEndpoint) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public Endpoint getClientEndpoint() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public EventSubscriber getEventListener() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public JmxManagement getManagementInterface() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void notifyListenersWithInitializationStatus(Exception e) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public ServicePerformance getCasStatistics(String aCasReferenceId) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public boolean isCasMultiplier() {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	@Override
+	public void releaseNextCas(String aCasReferenceId) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public long getIdleTime() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	@Override
+	public void beginProcess(int msgType) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void endProcess(int msgType) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public long getIdleTimeBetweenProcessCalls(int msgType) {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	@Override
+	public long getCpuTime() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	@Override
+	public long getAnalysisTime() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	@Override
+	public void incrementSerializationTime(long cpuTime) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void incrementDeserializationTime(long cpuTime) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void onInitialize() {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public UimaMessageListener getUimaMessageListener(String aDelegateKey) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public LocalCache getLocalCache() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void registerVmQueueWithJMX(Object o, String aName) throws Exception {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public AnalysisEngineController getParentController() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void addAbortedCasReferenceId(String aCasReferenceId) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public boolean isAwaitingCacheCallbackNotification() {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	@Override
+	public void quiesceAndStop() {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void forceTimeoutOnPendingCases(String key) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void changeState(ServiceState state) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public ServiceState getState() {
+		// TODO Auto-generated method stub
+		return ServiceState.INITIALIZING;
+	}
+
+	@Override
+	public Map<String, String> getDeadClientMap() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public String getKey() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void dumpState(StringBuffer buffer, String lbl1) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public String getPID() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void warmUp(String warmUpDataPath, CountDownLatch warmUpLatch) throws Exception {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public UimaContext getUimaContext() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void addUimaObject(String objectName) throws Exception {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void setErrorHandlerChain(ErrorHandlerChain ehc) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public ResourceSpecifier getResourceSpecifier() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+	@Override
+	public void setAnalysisEngineInstancePool(AnalysisEngineInstancePool aPool) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public int getAEInstanceCount() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+	@Override
+	public void initializeAnalysisEngine() throws ResourceInitializationException {
+		threadLocalValue.set(Thread.currentThread().getId());
+		try {
+			barrier.await();
+		} catch( InterruptedException | BrokenBarrierException e) {
+			
+		}
+		getControllerLatch().release();
+		
+	}
+	@Override
+	public boolean threadAssignedToAE() {
+		return Objects.nonNull(threadLocalValue.get());
+	}
+	
+}
\ No newline at end of file
diff --git a/uimaj-as-connectors/src/main/java/org/apache/uima/as/connectors/mockup/TestMessageProcessor.java b/uimaj-as-connectors/src/main/java/org/apache/uima/as/connectors/mockup/TestMessageProcessor.java
new file mode 100644
index 0000000..e700b00
--- /dev/null
+++ b/uimaj-as-connectors/src/main/java/org/apache/uima/as/connectors/mockup/TestMessageProcessor.java
@@ -0,0 +1,28 @@
+package org.apache.uima.as.connectors.mockup;
+
+import org.apache.uima.aae.controller.AnalysisEngineController;
+import org.apache.uima.aae.message.MessageContext;
+import org.apache.uima.aae.message.MessageProcessor;
+import org.apache.uima.aae.service.command.CommandFactory;
+import org.apache.uima.aae.service.command.UimaAsCommand;
+
+public class TestMessageProcessor implements MessageProcessor {
+	AnalysisEngineController controller;
+	
+	public TestMessageProcessor(AnalysisEngineController ctlr) {
+		this.controller = ctlr;
+	}
+	@Override
+	public void process(MessageContext message) throws Exception {
+		UimaAsCommand command = 
+				CommandFactory.newCommand(message, controller);
+		command.execute();
+	}
+
+	@Override
+	public AnalysisEngineController getController() {
+		// TODO Auto-generated method stub
+		return controller;
+	}
+	
+}
\ No newline at end of file
diff --git a/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/direct/DirectUimaAsConnector.class b/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/direct/DirectUimaAsConnector.class
new file mode 100644
index 0000000..e0b179d
Binary files /dev/null and b/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/direct/DirectUimaAsConnector.class differ
diff --git a/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/direct/DirectUimaAsConsumer$1$1.class b/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/direct/DirectUimaAsConsumer$1$1.class
new file mode 100644
index 0000000..cad42cc
Binary files /dev/null and b/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/direct/DirectUimaAsConsumer$1$1.class differ
diff --git a/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/direct/DirectUimaAsConsumer$1.class b/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/direct/DirectUimaAsConsumer$1.class
new file mode 100644
index 0000000..61330b1
Binary files /dev/null and b/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/direct/DirectUimaAsConsumer$1.class differ
diff --git a/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/direct/DirectUimaAsConsumer$DirectListenerCallback.class b/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/direct/DirectUimaAsConsumer$DirectListenerCallback.class
new file mode 100644
index 0000000..77468d9
Binary files /dev/null and b/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/direct/DirectUimaAsConsumer$DirectListenerCallback.class differ
diff --git a/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/direct/DirectUimaAsConsumer.class b/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/direct/DirectUimaAsConsumer.class
new file mode 100644
index 0000000..1c96817
Binary files /dev/null and b/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/direct/DirectUimaAsConsumer.class differ
diff --git a/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/direct/DirectUimaAsEndpoint$MockupService$ServiceMessageProcessor.class b/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/direct/DirectUimaAsEndpoint$MockupService$ServiceMessageProcessor.class
new file mode 100644
index 0000000..3c89bb3
Binary files /dev/null and b/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/direct/DirectUimaAsEndpoint$MockupService$ServiceMessageProcessor.class differ
diff --git a/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/direct/DirectUimaAsEndpoint$MockupService.class b/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/direct/DirectUimaAsEndpoint$MockupService.class
new file mode 100644
index 0000000..60cb1e6
Binary files /dev/null and b/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/direct/DirectUimaAsEndpoint$MockupService.class differ
diff --git a/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/direct/DirectUimaAsEndpoint.class b/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/direct/DirectUimaAsEndpoint.class
new file mode 100644
index 0000000..3754d56
Binary files /dev/null and b/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/direct/DirectUimaAsEndpoint.class differ
diff --git a/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/direct/DirectUimaAsProducer.class b/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/direct/DirectUimaAsProducer.class
new file mode 100644
index 0000000..158bd7c
Binary files /dev/null and b/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/direct/DirectUimaAsProducer.class differ
diff --git a/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/mockup/MockUpAnalysisEngineController.class b/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/mockup/MockUpAnalysisEngineController.class
new file mode 100644
index 0000000..4ca6681
Binary files /dev/null and b/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/mockup/MockUpAnalysisEngineController.class differ
diff --git a/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/mockup/TestMessageProcessor.class b/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/mockup/TestMessageProcessor.class
new file mode 100644
index 0000000..93bd910
Binary files /dev/null and b/uimaj-as-connectors/target/classes/org/apache/uima/as/connectors/mockup/TestMessageProcessor.class differ