# WARNING: head commit changed in the meantime

449487: New Extensibility Concept for Scout 

@Extends.pathToContainer is not used when an extension is registered

Change-Id: Ifb7339517316281d62c3856cff542b162648f8e7
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=449487
diff --git a/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/extension/ui/form/ExtendFormWithDeepLinkingTest.java b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/extension/ui/form/ExtendFormWithDeepLinkingTest.java
index df363f8..f55b02e 100644
--- a/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/extension/ui/form/ExtendFormWithDeepLinkingTest.java
+++ b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/extension/ui/form/ExtendFormWithDeepLinkingTest.java
@@ -25,11 +25,14 @@
 import org.eclipse.scout.rt.client.extension.ui.form.fixture.AbstractTemplateGroupsBox.BottomFieldsBox;
 import org.eclipse.scout.rt.client.extension.ui.form.fixture.AbstractTemplateGroupsBox.TopFieldsBox;
 import org.eclipse.scout.rt.client.extension.ui.form.fixture.ContributedTestField;
+import org.eclipse.scout.rt.client.extension.ui.form.fixture.ExtendedForm;
+import org.eclipse.scout.rt.client.extension.ui.form.fixture.ExtendedFormExtension;
 import org.eclipse.scout.rt.client.extension.ui.form.fixture.MultiTemplateUsageForm;
 import org.eclipse.scout.rt.client.extension.ui.form.fixture.MultiTemplateUsageForm.MainBox.FirstTemplateBox;
 import org.eclipse.scout.rt.client.extension.ui.form.fixture.MultiTemplateUsageForm.MainBox.FirstTemplateBox.MiddleStringField;
 import org.eclipse.scout.rt.client.extension.ui.form.fixture.MultiTemplateUsageForm.MainBox.MainBoxStringField;
 import org.eclipse.scout.rt.client.extension.ui.form.fixture.MultiTemplateUsageForm.MainBox.SecondTemplateBox;
+import org.eclipse.scout.rt.client.extension.ui.form.fixture.OrigForm;
 import org.eclipse.scout.rt.client.extension.ui.form.fixture.TemplateStringFieldExtension;
 import org.eclipse.scout.rt.client.ui.form.fields.stringfield.AbstractStringField;
 import org.eclipse.scout.rt.shared.extension.IExtensionRegistry;
@@ -268,6 +271,26 @@
     assertEquals("A", form.getSecondTemplateBox().getBottomFieldsBox().getBottomStringField().getValue());
   }
 
+  @Test
+  public void testDeepLinkingWithExtendsAnnotationOrigForm() throws Exception {
+    SERVICES.getService(IExtensionRegistry.class).register(ExtendedFormExtension.class);
+
+    OrigForm form = new OrigForm();
+    form.initForm();
+
+    assertTypes(form.getMainBox().getFields(), OrigForm.MainBox.TopBox.class, OrigForm.MainBox.BottomBox.class);
+  }
+
+  @Test
+  public void testDeepLinkingWithExtendsAnnotationExtendedForm() throws Exception {
+    SERVICES.getService(IExtensionRegistry.class).register(ExtendedFormExtension.class);
+
+    ExtendedForm form = new ExtendedForm();
+    form.initForm();
+
+    assertTypes(form.getMainBox().getFields(), ExtendedFormExtension.DetailBox.class, OrigForm.MainBox.TopBox.class, OrigForm.MainBox.BottomBox.class);
+  }
+
   protected static void assertTypes(List<?> objects, Class<?>... expectedTypes) {
     assertEquals(expectedTypes.length, CollectionUtility.size(objects));
 
diff --git a/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/extension/ui/form/fixture/ExtendedFormExtension.java b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/extension/ui/form/fixture/ExtendedFormExtension.java
new file mode 100644
index 0000000..f4f97f4
--- /dev/null
+++ b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/extension/ui/form/fixture/ExtendedFormExtension.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2015 BSI Business Systems Integration AG.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     BSI Business Systems Integration AG - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.scout.rt.client.extension.ui.form.fixture;
+
+import org.eclipse.scout.commons.annotations.Extends;
+import org.eclipse.scout.commons.annotations.Order;
+import org.eclipse.scout.rt.client.extension.ui.form.AbstractFormExtension;
+import org.eclipse.scout.rt.client.ui.form.fields.groupbox.AbstractGroupBox;
+import org.eclipse.scout.rt.client.ui.form.fields.stringfield.AbstractStringField;
+
+public class ExtendedFormExtension extends AbstractFormExtension<ExtendedForm> {
+
+  public ExtendedFormExtension(ExtendedForm ownerForm) {
+    super(ownerForm);
+  }
+
+  @Order(-10)
+  @Extends(value = ExtendedForm.MainBox.class, pathToContainer = ExtendedForm.class)
+  public class DetailBox extends AbstractGroupBox {
+
+    @Order(10)
+    public class StringField extends AbstractStringField {
+    }
+  }
+}
diff --git a/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/extension/ui/form/fixture/OrigForm.java b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/extension/ui/form/fixture/OrigForm.java
index 4af1025..7e23c27 100644
--- a/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/extension/ui/form/fixture/OrigForm.java
+++ b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/extension/ui/form/fixture/OrigForm.java
@@ -32,7 +32,7 @@
   public OrigForm() throws ProcessingException {
     super(false);
     m_operations = new ArrayList<String>();
-    initConfig();
+    callInitializer();
   }
 
   public void logOperation(Class<?> fieldClass, String operation) {
diff --git a/org.eclipse.scout.rt.shared/src/org/eclipse/scout/rt/shared/extension/ExtensionRegistry.java b/org.eclipse.scout.rt.shared/src/org/eclipse/scout/rt/shared/extension/ExtensionRegistry.java
index 9696f18..fd30f13 100644
--- a/org.eclipse.scout.rt.shared/src/org/eclipse/scout/rt/shared/extension/ExtensionRegistry.java
+++ b/org.eclipse.scout.rt.shared/src/org/eclipse/scout/rt/shared/extension/ExtensionRegistry.java
@@ -135,7 +135,16 @@
         // 2. try @Extends annotation
         Extends extendsAnnotation = getExtendsAnnotation(extensionClass);
         if (extendsAnnotation != null) {
-          ownerClassIdentifier = new ClassIdentifier(extendsAnnotation.value());
+          int pathToContainerLength = extendsAnnotation.pathToContainer().length;
+          if (pathToContainerLength > 0) {
+            Class[] segments = new Class[pathToContainerLength + 1];
+            System.arraycopy(extendsAnnotation.pathToContainer(), 0, segments, 0, pathToContainerLength);
+            segments[pathToContainerLength] = extendsAnnotation.value();
+            ownerClassIdentifier = new ClassIdentifier(segments);
+          }
+          else {
+            ownerClassIdentifier = new ClassIdentifier(extendsAnnotation.value());
+          }
         }
 
         if (ownerClassIdentifier == null) {