[UIMA-6214] Method signature class in ExternalResourceFactory

* Merge branch '3.0.x' of https://github.com/mjunsilo/uima-uimafit into UIMA-6214-Method-signature-clash-in-ExternalResourceFactory
* This merge brings in the unit test provided by Mario Juric with the original bug report

# Conflicts:
#	uimafit-core/src/test/java/org/apache/uima/fit/factory/ExternalResourceFactoryTest.java
diff --git a/uimafit-core/src/test/java/org/apache/uima/fit/factory/ExternalResourceFactoryTest.java b/uimafit-core/src/test/java/org/apache/uima/fit/factory/ExternalResourceFactoryTest.java
index 7c03ca3..6bc7b2f 100644
--- a/uimafit-core/src/test/java/org/apache/uima/fit/factory/ExternalResourceFactoryTest.java
+++ b/uimafit-core/src/test/java/org/apache/uima/fit/factory/ExternalResourceFactoryTest.java
@@ -26,6 +26,9 @@
 import static org.apache.uima.fit.factory.ExternalResourceFactory.bindResourceOnceWithoutNested;
 import static org.apache.uima.fit.factory.ExternalResourceFactory.createNamedResourceDescription;
 import static org.apache.uima.fit.factory.ExternalResourceFactory.createResourceDescription;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.createSharedResourceDescription;
+import static org.apache.uima.fit.factory.JCasFactory.createJCas;
+import static org.apache.uima.fit.pipeline.SimplePipeline.runPipeline;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -59,6 +62,8 @@
 import org.apache.uima.fit.factory.locator.JndiResourceLocator;
 import org.apache.uima.fit.internal.ResourceManagerFactory;
 import org.apache.uima.fit.pipeline.SimplePipeline;
+import org.apache.uima.fit.type.AnalyzedText;
+import org.apache.uima.fit.util.JCasUtil;
 import org.apache.uima.fit.util.SimpleNamedResourceManager;
 import org.apache.uima.jcas.JCas;
 import org.apache.uima.resource.DataResource;
@@ -350,7 +355,61 @@
     ae.process(ae.newJCas());
     ae.collectionProcessComplete();
   }
-  
+
+  @Test
+  public void testNestedAggregateBinding() throws Exception {
+    ExternalResourceDescription resourceDescription = createSharedResourceDescription("",
+            DummyResource.class);
+
+    AggregateBuilder builder = new AggregateBuilder();
+    builder.add(createEngineDescription(ResourceDependent.class));
+    AnalysisEngineDescription aggregateDescription = builder.createAggregateDescription();
+
+    bindResource(aggregateDescription, DummyResource.RESOURCE_KEY, resourceDescription);
+
+    JCas jCas = createJCas();
+    jCas.setDocumentText("Hello");
+
+    runPipeline(jCas, aggregateDescription);
+    int count = 0;
+    for (AnalyzedText annotation : JCasUtil.select(jCas, AnalyzedText.class)) {
+      assertEquals("World", annotation.getText());
+      count++;
+    }
+
+    assertEquals(1, count);
+  }
+
+  public static class DummyResource implements SharedResourceObject {
+
+    public static final String RESOURCE_KEY = "DummyResource";
+
+    public DummyResource() {
+    }
+
+    @Override
+    public void load(DataResource aData) throws ResourceInitializationException {
+      // Nothing to do
+    }
+
+    public String getText() {
+      return "World";
+    }
+  }
+
+  public static class ResourceDependent extends JCasAnnotator_ImplBase {
+
+      @ExternalResource(key = DummyResource.RESOURCE_KEY)
+      private DummyResource dummyResource;
+
+      @Override
+      public void process(JCas aJCas) throws AnalysisEngineProcessException {
+        // Just marking up that the AE was executed as expected, so that it can be verified.
+        AnalyzedText annotation = new AnalyzedText(aJCas, 0, aJCas.getDocumentText().length());
+        annotation.setText(dummyResource.getText());
+        annotation.addToIndexes();
+      }
+  }
   
   private static void bindResources(AnalysisEngineDescription desc) throws Exception {
     bindResource(desc, ResourceWithAssert.class);