|
Lines 11-22
Link Here
|
| 11 |
******************************************************************************/ |
11 |
******************************************************************************/ |
| 12 |
package org.eclipse.rwt.internal.lifecycle; |
12 |
package org.eclipse.rwt.internal.lifecycle; |
| 13 |
|
13 |
|
| 14 |
import java.util.HashMap; |
14 |
import org.eclipse.rwt.internal.util.*; |
| 15 |
import java.util.Map; |
15 |
import org.eclipse.rwt.internal.util.SharedInstanceBuffer.IInstanceCreator; |
| 16 |
|
|
|
| 17 |
import org.eclipse.rwt.AdapterFactory; |
| 18 |
import org.eclipse.rwt.internal.util.ClassInstantiationException; |
| 19 |
import org.eclipse.rwt.internal.util.ClassUtil; |
| 20 |
import org.eclipse.rwt.lifecycle.ILifeCycleAdapter; |
16 |
import org.eclipse.rwt.lifecycle.ILifeCycleAdapter; |
| 21 |
import org.eclipse.rwt.lifecycle.IWidgetLifeCycleAdapter; |
17 |
import org.eclipse.rwt.lifecycle.IWidgetLifeCycleAdapter; |
| 22 |
import org.eclipse.swt.internal.widgets.displaykit.DisplayLCAFacade; |
18 |
import org.eclipse.swt.internal.widgets.displaykit.DisplayLCAFacade; |
|
Lines 24-106
Link Here
|
| 24 |
import org.eclipse.swt.widgets.Widget; |
20 |
import org.eclipse.swt.widgets.Widget; |
| 25 |
|
21 |
|
| 26 |
|
22 |
|
| 27 |
public final class LifeCycleAdapterFactory implements AdapterFactory { |
23 |
public final class LifeCycleAdapterFactory { |
| 28 |
|
24 |
|
| 29 |
private static final Class[] ADAPTER_LIST = new Class[] { |
25 |
private final IDisplayLifeCycleAdapter displayAdapter; |
| 30 |
ILifeCycleAdapter.class |
|
|
| 31 |
}; |
| 32 |
|
| 33 |
private final Object displayAdapterLock; |
| 34 |
private final Object widgetAdaptersLock; |
| 35 |
// Holds the single display life cycle adapter. MUST be created lazily because its constructor |
| 36 |
// needs a resource manager to be in place |
| 37 |
private IDisplayLifeCycleAdapter displayAdapter; |
| 38 |
// Maps widget classes to their respective life cycle adapters |
26 |
// Maps widget classes to their respective life cycle adapters |
| 39 |
// Key: Class<Widget>, value: IWidgetLifeCycleAdapter |
27 |
// Key: Class<Widget>, value: IWidgetLifeCycleAdapter |
| 40 |
private final Map widgetAdapters; |
28 |
private final SharedInstanceBuffer widgetAdapters; |
| 41 |
|
29 |
|
| 42 |
|
|
|
| 43 |
public LifeCycleAdapterFactory() { |
30 |
public LifeCycleAdapterFactory() { |
| 44 |
displayAdapterLock = new Object(); |
31 |
widgetAdapters = new SharedInstanceBuffer(); |
| 45 |
widgetAdaptersLock = new Object(); |
32 |
displayAdapter = DisplayLCAFacade.getDisplayLCA(); |
| 46 |
widgetAdapters = new HashMap(); |
|
|
| 47 |
} |
33 |
} |
| 48 |
|
34 |
|
| 49 |
public Object getAdapter( Object adaptable, Class adapter ) { |
35 |
public Object getAdapter( Object adaptable, Class adapter ) { |
| 50 |
Object result = null; |
36 |
Object result = null; |
| 51 |
if( isDisplayLCA( adaptable, adapter ) ) { |
37 |
if( isDisplayLCA( adaptable, adapter ) ) { |
| 52 |
result = getDisplayLCA(); |
38 |
result = displayAdapter; |
| 53 |
} else if( isWidgetLCA( adaptable, adapter ) ) { |
39 |
} else if( isWidgetLCA( adaptable, adapter ) ) { |
| 54 |
result = getWidgetLCA( adaptable.getClass() ); |
40 |
result = getWidgetLCA( adaptable.getClass() ); |
| 55 |
} |
41 |
} |
| 56 |
return result; |
42 |
return result; |
| 57 |
} |
43 |
} |
| 58 |
|
44 |
|
| 59 |
public Class[] getAdapterList() { |
|
|
| 60 |
return ADAPTER_LIST; |
| 61 |
} |
| 62 |
|
| 63 |
/////////////////////////////////////////////////////////// |
| 64 |
// Helping methods to obtain life cycle adapter for display |
| 65 |
|
| 66 |
private static boolean isDisplayLCA( Object adaptable, Class adapter ) { |
45 |
private static boolean isDisplayLCA( Object adaptable, Class adapter ) { |
| 67 |
return adaptable instanceof Display && adapter == ILifeCycleAdapter.class; |
46 |
return adaptable instanceof Display && adapter == ILifeCycleAdapter.class; |
| 68 |
} |
47 |
} |
| 69 |
|
48 |
|
| 70 |
private synchronized ILifeCycleAdapter getDisplayLCA() { |
|
|
| 71 |
synchronized( displayAdapterLock ) { |
| 72 |
if( displayAdapter == null ) { |
| 73 |
displayAdapter = DisplayLCAFacade.getDisplayLCA(); |
| 74 |
} |
| 75 |
return displayAdapter; |
| 76 |
} |
| 77 |
} |
| 78 |
|
| 79 |
//////////////////////////////////////////////////////////// |
| 80 |
// Helping methods to obtain life cycle adapters for widgets |
| 81 |
|
| 82 |
private static boolean isWidgetLCA( Object adaptable, Class adapter ) { |
49 |
private static boolean isWidgetLCA( Object adaptable, Class adapter ) { |
| 83 |
return adaptable instanceof Widget && adapter == ILifeCycleAdapter.class; |
50 |
return adaptable instanceof Widget && adapter == ILifeCycleAdapter.class; |
| 84 |
} |
51 |
} |
| 85 |
|
52 |
|
| 86 |
private synchronized ILifeCycleAdapter getWidgetLCA( Class clazz ) { |
53 |
private ILifeCycleAdapter getWidgetLCA( final Class clazz ) { |
| 87 |
// [fappel] This code is performance critical, don't change without checking against a profiler |
54 |
// [fappel] This code is performance critical, don't change without checking against a profiler |
| 88 |
ILifeCycleAdapter result; |
55 |
IInstanceCreator instanceCreator = new IInstanceCreator() { |
| 89 |
synchronized( widgetAdaptersLock ) { |
56 |
public Object createInstance() { |
| 90 |
result = ( ILifeCycleAdapter )widgetAdapters.get( clazz ); |
57 |
return findWidgetLCA( clazz ); |
| 91 |
if( result == null ) { |
|
|
| 92 |
ILifeCycleAdapter adapter = null; |
| 93 |
Class superClass = clazz; |
| 94 |
while( !Object.class.equals( superClass ) && adapter == null ) { |
| 95 |
adapter = loadWidgetLCA( superClass ); |
| 96 |
if( adapter == null ) { |
| 97 |
superClass = superClass.getSuperclass(); |
| 98 |
} |
| 99 |
} |
| 100 |
widgetAdapters.put( clazz, adapter ); |
| 101 |
result = adapter; |
| 102 |
} |
58 |
} |
| 103 |
} |
59 |
}; |
|
|
60 |
ILifeCycleAdapter result = ( ILifeCycleAdapter )widgetAdapters.get( clazz, instanceCreator ); |
| 104 |
if( result == null ) { |
61 |
if( result == null ) { |
| 105 |
String msg = "Failed to obtain life cycle adapter for: " + clazz.getName(); |
62 |
String msg = "Failed to obtain life cycle adapter for: " + clazz.getName(); |
| 106 |
throw new LifeCycleAdapterException( msg ); |
63 |
throw new LifeCycleAdapterException( msg ); |
|
Lines 108-113
Link Here
|
| 108 |
return result; |
65 |
return result; |
| 109 |
} |
66 |
} |
| 110 |
|
67 |
|
|
|
68 |
private static IWidgetLifeCycleAdapter findWidgetLCA( Class clazz ) { |
| 69 |
Class superClass = clazz; |
| 70 |
IWidgetLifeCycleAdapter result = null; |
| 71 |
while( !Object.class.equals( superClass ) && result == null ) { |
| 72 |
result = loadWidgetLCA( superClass ); |
| 73 |
if( result == null ) { |
| 74 |
superClass = superClass.getSuperclass(); |
| 75 |
} |
| 76 |
} |
| 77 |
return result; |
| 78 |
} |
| 79 |
|
| 111 |
private static IWidgetLifeCycleAdapter loadWidgetLCA( Class clazz ) { |
80 |
private static IWidgetLifeCycleAdapter loadWidgetLCA( Class clazz ) { |
| 112 |
IWidgetLifeCycleAdapter result = null; |
81 |
IWidgetLifeCycleAdapter result = null; |
| 113 |
String className = LifeCycleAdapterUtil.getSimpleClassName( clazz ); |
82 |
String className = LifeCycleAdapterUtil.getSimpleClassName( clazz ); |