Cleanup and simplify LCA package determination

Replace method getSimpleClassName with the JDK method getSimpleName
that is available since Java 1.5.

Eliminate handling of the default package. Since we don't have any
widgets without a package name, this case doesn't need to be handled
anymore.

Change-Id: I94ea5f19f659dfe7d5b32ca18f3573ec0b3634ad
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/lifecycle/LifeCycleAdapterFactory.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/lifecycle/LifeCycleAdapterFactory.java
index bfa3021..bf4a658 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/lifecycle/LifeCycleAdapterFactory.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/lifecycle/LifeCycleAdapterFactory.java
@@ -11,6 +11,8 @@
  ******************************************************************************/
 package org.eclipse.rap.rwt.internal.lifecycle;
 
+import static org.eclipse.rap.rwt.internal.lifecycle.LifeCycleAdapterUtil.getKitPackageVariants;
+
 import java.util.HashMap;
 import java.util.Map;
 
@@ -22,21 +24,21 @@
 public final class LifeCycleAdapterFactory {
 
   private final Object widgetAdaptersLock;
-  private final Map<Class<?>, WidgetLCA> widgetAdapters;
+  private final Map<Class<?>, WidgetLCA<?>> widgetAdapters;
 
   public LifeCycleAdapterFactory() {
     widgetAdaptersLock = new Object();
     widgetAdapters = new HashMap<>();
   }
 
-  public WidgetLCA getWidgetLCA( Widget widget ) {
+  public WidgetLCA<?> getWidgetLCA( Widget widget ) {
     Class<?> clazz = widget.getClass();
     // [fappel] This code is performance critical, don't change without checking against a profiler
-    WidgetLCA result;
+    WidgetLCA<?> result;
     synchronized( widgetAdaptersLock ) {
       result = widgetAdapters.get( clazz );
       if( result == null ) {
-        WidgetLCA adapter = null;
+        WidgetLCA<?> adapter = null;
         Class<?> superClass = clazz;
         while( !Object.class.equals( superClass ) && adapter == null ) {
           adapter = loadWidgetLCA( superClass );
@@ -51,25 +53,22 @@
     return result;
   }
 
-  private static WidgetLCA loadWidgetLCA( Class<?> clazz ) {
-    WidgetLCA result = null;
-    String className = LifeCycleAdapterUtil.getSimpleClassName( clazz );
-    String[] variants = LifeCycleAdapterUtil.getKitPackageVariants( clazz );
-    for( int i = 0; result == null && i < variants.length; i++ ) {
-      StringBuilder buffer = new StringBuilder();
-      buffer.append( variants[ i ] );
-      buffer.append( "." );
-      buffer.append( className );
-      buffer.append( "LCA" );
-      String classToLoad = buffer.toString();
-      ClassLoader loader = clazz.getClassLoader();
+  private static WidgetLCA<?> loadWidgetLCA( Class<?> clazz ) {
+    String className = clazz.getSimpleName();
+    ClassLoader loader = clazz.getClassLoader();
+    for( String variant : getKitPackageVariants( clazz ) ) {
+      String classToLoad = new StringBuilder()
+        .append( variant )
+        .append( '.' )
+        .append( className )
+        .append( "LCA" ).toString();
       try {
-        result = ( WidgetLCA )ClassUtil.newInstance( loader, classToLoad );
+        return ( WidgetLCA<?> )ClassUtil.newInstance( loader, classToLoad );
       } catch( @SuppressWarnings( "unused" ) ClassInstantiationException ignore ) {
         // ignore and try to load next package name variant
       }
     }
-    return result;
+    return null;
   }
 
 }
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/lifecycle/LifeCycleAdapterUtil.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/lifecycle/LifeCycleAdapterUtil.java
index 9e36545..900f1ba 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/lifecycle/LifeCycleAdapterUtil.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/lifecycle/LifeCycleAdapterUtil.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008, 2012 Innoopract Informationssysteme GmbH and others.
+ * Copyright (c) 2008, 2015 Innoopract Informationssysteme GmbH and others.
  * 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
@@ -20,60 +20,28 @@
     // prevent instatiation
   }
 
-  /**
-   * Inserts the package path segment <code>internal</code> at every possible
-   * position in a given package name and appends class name + kit at the end.
-   */
-  public static String[] getKitPackageVariants( Class clazz ) {
-    String packageName = null;
-    Package packageObject = clazz.getPackage();
-    if( packageObject != null ) {
-      packageName = packageObject.getName();
-    }
-    String className = getSimpleClassName( clazz );
-    return getKitPackageVariants( packageName, className );
-  }
-
-  static String[] getKitPackageVariants( String packageName, String className ) {
-    String[] result;
-    if( packageName == null || "".equals( packageName ) ) {
-      StringBuilder buffer = new StringBuilder();
-      buffer.append( "internal." );
-      buffer.append( className.toLowerCase( Locale.ENGLISH ) );
-      buffer.append( "kit" );
-      result = new String[] { buffer.toString() };
-    } else {
-      String[] segments = packageName.split( "\\." );
-      result = new String[ segments.length + 1 ];
-      for( int i = 0; i < result.length; i++ ) {
-        StringBuilder buffer = new StringBuilder();
-        for( int j = 0; j < segments.length; j++ ) {
-          if( j == i ) {
-            buffer.append( "internal." );
-          }
-          buffer.append( segments[ j ] );
-          if( j < segments.length - 1 ) {
-            buffer.append( '.' );
-          }
-        }
-        if( i == segments.length ) {
-          buffer.append( ".internal" );
-        }
-        buffer.append( '.' );
-        buffer.append( className.toLowerCase( Locale.ENGLISH ) );
-        buffer.append( "kit" );
-        result[ i ] = buffer.toString();
-      }
+  public static String[] getKitPackageVariants( Class<?> clazz ) {
+    String className = clazz.getSimpleName().toLowerCase( Locale.ENGLISH );
+    String[] pkgSegments = clazz.getPackage().getName().split( "\\." );
+    String[] result = new String[ pkgSegments.length ];
+    for( int i = 0; i < result.length; i++ ) {
+      result[ i ] = createInternalPackage( pkgSegments, className, i );
     }
     return result;
   }
 
-  /**
-   * Returns the class name without package prefix for a given class.
-   */
-  public static String getSimpleClassName( Class clazz ) {
-    String className = clazz.getName();
-    int index = className.lastIndexOf( '.' );
-    return className.substring( index + 1 );
+  private static String createInternalPackage( String[] pkgSegments, String className, int index ) {
+    StringBuilder buffer = new StringBuilder();
+    for( int i = 0; i < pkgSegments.length; i++ ) {
+      buffer.append( pkgSegments[i] );
+      buffer.append( '.' );
+      if( i == index ) {
+        buffer.append( "internal." );
+      }
+    }
+    buffer.append( className );
+    buffer.append( "kit" );
+    return buffer.toString();
   }
+
 }
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/theme/ThemeAdapterManager.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/theme/ThemeAdapterManager.java
index d661acc..b32a76d 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/theme/ThemeAdapterManager.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/theme/ThemeAdapterManager.java
@@ -65,7 +65,7 @@
     if( superClass == Control.class ) {
       return new ControlThemeAdapterImpl();
     }
-    String className = LifeCycleAdapterUtil.getSimpleClassName( superClass );
+    String className = superClass.getSimpleName();
     String[] variants = LifeCycleAdapterUtil.getKitPackageVariants( superClass );
     for( String variant : variants ) {
       String classToLoad = new StringBuilder()
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/theme/ThemeManager.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/theme/ThemeManager.java
index 79e127f..d7c38b8 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/theme/ThemeManager.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/theme/ThemeManager.java
@@ -261,7 +261,7 @@
   }
 
   private void loadThemeableWidgetResources( ThemeableWidget themeWidget ) {
-    String className = LifeCycleAdapterUtil.getSimpleClassName( themeWidget.widget );
+    String className = themeWidget.widget.getSimpleName();
     String[] variants = LifeCycleAdapterUtil.getKitPackageVariants( themeWidget.widget );
     boolean found = false;
     try {
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/lifecycle/LifeCycleAdapterUtil_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/lifecycle/LifeCycleAdapterUtil_Test.java
index 9091d25..da1da35 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/lifecycle/LifeCycleAdapterUtil_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/lifecycle/LifeCycleAdapterUtil_Test.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008, 2014 Innoopract Informationssysteme GmbH and others.
+ * Copyright (c) 2008, 2015 Innoopract Informationssysteme GmbH and others.
  * 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
@@ -11,107 +11,37 @@
  ******************************************************************************/
 package org.eclipse.rap.rwt.internal.lifecycle;
 
-import static org.junit.Assert.assertEquals;
-
+import static org.junit.Assert.assertArrayEquals;
 import java.util.Locale;
 
-import org.eclipse.rap.rwt.testfixture.internal.Fixture;
 import org.eclipse.swt.widgets.Button;
-import org.junit.After;
-import org.junit.Before;
 import org.junit.Test;
 
 
 public class LifeCycleAdapterUtil_Test {
 
-  @Before
-  public void setUp() {
-    Fixture.setUp();
-    Fixture.fakeResponseWriter();
-  }
+  @Test
+  public void testGetKitPackageVariants_withPackage() {
+    String[] variants = LifeCycleAdapterUtil.getKitPackageVariants( Button.class );
 
-  @After
-  public void tearDown() {
-    Fixture.tearDown();
+    String[] expected = {
+      "org.internal.eclipse.swt.widgets.buttonkit",
+      "org.eclipse.internal.swt.widgets.buttonkit",
+      "org.eclipse.swt.internal.widgets.buttonkit",
+      "org.eclipse.swt.widgets.internal.buttonkit"
+    };
+    assertArrayEquals( expected, variants );
   }
 
   @Test
-  public void testGetKitPackageVariantsWithClass() {
-    String[] variants
-      = LifeCycleAdapterUtil.getKitPackageVariants( Button.class );
-    assertEquals( 5, variants.length );
-    String expected = "internal.org.eclipse.swt.widgets.buttonkit";
-    assertEquals( expected, variants[ 0 ] );
-    expected = "org.internal.eclipse.swt.widgets.buttonkit";
-    assertEquals( expected, variants[ 1 ] );
-    expected = "org.eclipse.internal.swt.widgets.buttonkit";
-    assertEquals( expected, variants[ 2 ] );
-    expected = "org.eclipse.swt.internal.widgets.buttonkit";
-    assertEquals( expected, variants[ 3 ] );
-    expected = "org.eclipse.swt.widgets.internal.buttonkit";
-  }
-
-  @Test
-  public void testGetKitPackageVariants() {
-    String packageName = "org.eclipse.swt.widgets";
-    String className = "Item";
-    String[] variants
-      = LifeCycleAdapterUtil.getKitPackageVariants( packageName, className );
-    assertEquals( 5, variants.length );
-    String expected = "internal.org.eclipse.swt.widgets.itemkit";
-    assertEquals( expected, variants[ 0 ] );
-    expected = "org.internal.eclipse.swt.widgets.itemkit";
-    assertEquals( expected, variants[ 1 ] );
-    expected = "org.eclipse.internal.swt.widgets.itemkit";
-    assertEquals( expected, variants[ 2 ] );
-    expected = "org.eclipse.swt.internal.widgets.itemkit";
-    assertEquals( expected, variants[ 3 ] );
-    expected = "org.eclipse.swt.widgets.internal.itemkit";
-    // default package
-    packageName = "";
-    variants
-      = LifeCycleAdapterUtil.getKitPackageVariants( packageName, className );
-    assertEquals( 1, variants.length );
-    expected = "internal.itemkit";
-    assertEquals( expected, variants[ 0 ] );
-    // default package as if called by LifeCycleAdapterFactory#loadWidgetLCA
-    packageName = null;
-    variants
-      = LifeCycleAdapterUtil.getKitPackageVariants( packageName, className );
-    assertEquals( 1, variants.length );
-    expected = "internal.itemkit";
-    assertEquals( expected, variants[ 0 ] );
-  }
-
-  @Test
-  public void testGetKitPackageVariantsWithTurkishLocale() {
+  public void testGetKitPackageVariants_withTurkishLocale() {
     Locale originalLocale = Locale.getDefault();
-    String packageName = "org.eclipse.swt.widgets";
-    String className = "Item";
     try {
       Locale.setDefault( new Locale( "tr", "TR" ) );
-      String[] variants
-        = LifeCycleAdapterUtil.getKitPackageVariants( packageName, className );
-      assertEquals( 5, variants.length );
-      String expected = "internal.org.eclipse.swt.widgets.itemkit";
-      assertEquals( expected, variants[ 0 ] );
-      expected = "org.internal.eclipse.swt.widgets.itemkit";
-      assertEquals( expected, variants[ 1 ] );
-      expected = "org.eclipse.internal.swt.widgets.itemkit";
-      assertEquals( expected, variants[ 2 ] );
-      expected = "org.eclipse.swt.internal.widgets.itemkit";
-      assertEquals( expected, variants[ 3 ] );
-      expected = "org.eclipse.swt.widgets.internal.itemkit";
+      testGetKitPackageVariants_withPackage();
     } finally {
       Locale.setDefault( originalLocale );
     }
   }
 
-  @Test
-  public void testGetSimpleClassName() {
-    String className = LifeCycleAdapterUtil.getSimpleClassName( Button.class );
-    String expected = "Button";
-    assertEquals( expected, className );
-  }
-
 }