Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
View | Details | Raw Unified | Return to bug 345933
Collapse All | Expand All

(-)src/org/eclipse/rwt/internal/util/SharedInstanceBuffer.java (+48 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2011 EclipseSource and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *    EclipseSource - initial API and implementation
10
 ******************************************************************************/
11
package org.eclipse.rwt.internal.util;
12
13
import java.util.*;
14
15
16
17
public class SharedInstanceBuffer {
18
  
19
  public interface IInstanceCreator {
20
    Object createInstance();
21
  }
22
23
  private final Object lock;
24
  private final Map store;
25
  
26
  public SharedInstanceBuffer() {
27
    lock = new Object();
28
    store = new HashMap();
29
  }
30
  
31
  public Object get( Object key, IInstanceCreator instanceCreator ) {
32
    ParamCheck.notNull( instanceCreator, "valueCreator" );
33
    synchronized( lock ) {
34
      Object result = store.get( key );
35
      if( result == null ) {
36
        result = instanceCreator.createInstance();
37
        store.put( key, result );
38
      }
39
      return result;
40
    }
41
  }
42
  
43
  public Object remove( Object key ) {
44
    synchronized( lock ) {
45
      return store.remove( key );
46
    }
47
  }
48
}
(-)src/org/eclipse/swt/internal/graphics/ResourceFactory.java (-13 / +9 lines)
Lines 15-32 Link Here
15
import java.util.HashMap;
15
import java.util.HashMap;
16
import java.util.Map;
16
import java.util.Map;
17
17
18
import org.eclipse.rwt.internal.util.ClassUtil;
18
import org.eclipse.rwt.internal.util.*;
19
import org.eclipse.rwt.internal.util.SharedInstanceBuffer.IInstanceCreator;
19
import org.eclipse.swt.graphics.*;
20
import org.eclipse.swt.graphics.*;
20
21
21
22
22
public class ResourceFactory {
23
public class ResourceFactory {
23
  
24
  
24
  private final Map colors;
25
  private final SharedInstanceBuffer colors;
25
  private final Map fonts;
26
  private final Map fonts;
26
  private final Map cursors;
27
  private final Map cursors;
27
  
28
  
28
  public ResourceFactory() {
29
  public ResourceFactory() {
29
    colors = new HashMap();
30
    colors = new SharedInstanceBuffer();
30
    fonts = new HashMap();
31
    fonts = new HashMap();
31
    cursors = new HashMap();
32
    cursors = new HashMap();
32
  }
33
  }
Lines 36-53 Link Here
36
    return getColor( colorNr );
37
    return getColor( colorNr );
37
  }
38
  }
38
39
39
  private Color getColor( int value ) {
40
  private Color getColor( final int value ) {
40
    Color result;
41
    Integer key = new Integer( value );
41
    Integer key = new Integer( value );
42
    synchronized( colors ) {
42
    return ( Color )colors.get( key, new IInstanceCreator() {
43
      if( colors.containsKey( key ) ) {
43
      public Object createInstance() {
44
        result = ( Color )colors.get( key );
44
        return createColorInstance( value );
45
      } else {
46
        result = createColorInstance( value );
47
        colors.put( key, result );
48
      }
45
      }
49
    }
46
    } );
50
    return result;
51
  }
47
  }
52
48
53
  public Font getFont( FontData fontData ) {
49
  public Font getFont( FontData fontData ) {
(-)src/org/eclipse/rwt/internal/util/SharedInstanceBuffer_Test.java (+124 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2011 EclipseSource and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *    EclipseSource - initial API and implementation
10
 ******************************************************************************/
11
package org.eclipse.rwt.internal.util;
12
13
import junit.framework.TestCase;
14
15
import org.eclipse.rwt.internal.util.SharedInstanceBuffer.IInstanceCreator;
16
17
18
public class SharedInstanceBuffer_Test extends TestCase {
19
  
20
  private static class TestValueCreator implements IInstanceCreator {
21
    
22
    private final Object value;
23
24
    TestValueCreator( Object value ) {
25
      this.value = value;
26
    }
27
    
28
    public Object createInstance() {
29
      return value;
30
    }
31
  }
32
33
  private SharedInstanceBuffer keyValueStore;
34
35
  public void testGet() {
36
    Object key = new Object();
37
    final Object value = new Object();
38
    
39
    Object returnedValue = keyValueStore.get( key, new IInstanceCreator() {
40
      public Object createInstance() {
41
        return value;
42
      }
43
    } );
44
    
45
    assertSame( returnedValue, value );
46
  }
47
  
48
  public void testGetWithExistingKey() {
49
    final boolean[] createValueWasInvoked = { false };
50
    Object key = new Object();
51
    final Object value = new Object();
52
    keyValueStore.get( key, new TestValueCreator( value ) );
53
54
    Object returnedValue = keyValueStore.get( key, new IInstanceCreator() {
55
      public Object createInstance() {
56
        createValueWasInvoked[ 0 ] = true;
57
        return null;
58
      }
59
    } );
60
    
61
    assertSame( returnedValue, value );
62
    assertFalse( createValueWasInvoked[ 0 ] );
63
  }
64
  
65
  public void testGetWithNullKey() {
66
    IInstanceCreator valueCreator = new TestValueCreator( null );
67
    try {
68
      keyValueStore.get( null, valueCreator );
69
    } catch( NullPointerException expected ) {
70
    }
71
  }
72
  
73
  public void testGetWithNullValueCreator() {
74
    try {
75
      keyValueStore.get( new Object(), null );
76
    } catch( NullPointerException expected ) {
77
    }
78
  }
79
  
80
  public void testRemoveNonExistingKey() {
81
    Object removedValue = keyValueStore.remove( new Object() );
82
    
83
    assertNull( removedValue );
84
  }
85
  
86
  public void testRemoveExistingKey() {
87
    Object key = new Object();
88
    Object value = new Object();
89
    keyValueStore.get( key, new TestValueCreator( value ) );
90
91
    Object removed = keyValueStore.remove( key );
92
    
93
    assertSame( value, removed );
94
  }
95
  
96
  public void testRemoveWithNullKey() {
97
    try {
98
      keyValueStore.remove( null );
99
    } catch( NullPointerException expected ) {
100
    }
101
  }
102
  
103
  public void testGetAfterRemove() {
104
    final boolean[] createValueWasInvoked = { false };
105
    Object key = new Object();
106
    final Object value = new Object();
107
    keyValueStore.get( key, new TestValueCreator( value ) );
108
    keyValueStore.remove( key );
109
    
110
    Object returnedValue = keyValueStore.get( key, new IInstanceCreator() {
111
      public Object createInstance() {
112
        createValueWasInvoked[ 0 ] = true;
113
        return value;
114
      }
115
    } );
116
  
117
    assertSame( returnedValue, value );
118
    assertTrue( createValueWasInvoked[ 0 ] );
119
  }
120
121
  protected void setUp() throws Exception {
122
    keyValueStore = new SharedInstanceBuffer();
123
  }
124
}

Return to bug 345933