Skip to content

Package: Labelizer$PoolImpl$EntryImpl

Labelizer$PoolImpl$EntryImpl

nameinstructionbranchcomplexitylinemethod
Labelizer.PoolImpl.EntryImpl(Labelizer.PoolImpl, Labelizer, int, ReferenceQueue)
M: 0 C: 7
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
dispose()
M: 0 C: 10
100%
M: 1 C: 1
50%
M: 1 C: 1
50%
M: 0 C: 4
100%
M: 0 C: 1
100%
initialize()
M: 0 C: 7
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%

Coverage

1: /*******************************************************************************
2: * Copyright (c) 2019 Christian W. Damus and others.
3: *
4: * All rights reserved. This program and the accompanying materials
5: * are made available under the terms of the Eclipse Public License 2.0
6: * which accompanies this distribution, and is available at
7: * https://www.eclipse.org/legal/epl-2.0/
8: *
9: * SPDX-License-Identifier: EPL-2.0
10: *
11: * Contributors:
12: * Christian W. Damus - initial API and implementation
13: ******************************************************************************/
14: package org.eclipse.emf.ecp.common.spi;
15:
16: import java.lang.ref.ReferenceQueue;
17: import java.util.Arrays;
18: import java.util.Collection;
19:
20: import org.eclipse.emf.common.notify.AdapterFactory;
21: import org.eclipse.emf.common.util.Pool;
22: import org.eclipse.emf.ecore.EObject;
23: import org.eclipse.emf.ecore.EPackage;
24: import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
25: import org.eclipse.emf.edit.provider.IDisposable;
26: import org.eclipse.emf.edit.provider.IItemLabelProvider;
27: import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
28:
29: /**
30: * API for obtaining user-friendly labels for {@link EObject}s, intended especially for
31: * {@link Object#toString() debug strings} of objects that encapsulate {@link EObject}s
32: * but that could be appropriate in other end-user (such as UI) scenarios.
33: *
34: * @since 1.20
35: */
36: public final class Labelizer {
37:
38:         private static final Pool<Labelizer> POOL = new PoolImpl();
39:
40:         private final EPackage ePackage;
41:         private AdapterFactory adapterFactory;
42:
43:         /**
44:          * Initializes me with the package that I support.
45:          */
46:         private Labelizer(EPackage ePackage) {
47:                 super();
48:
49:                 this.ePackage = ePackage;
50:         }
51:
52:         /**
53:          * Initialize my adapter factory.
54:          *
55:          * @return something to dispose when I am no longer needed
56:          */
57:         IDisposable initialize() {
58:                 final Collection<?> types = Arrays.asList(ePackage, IItemLabelProvider.class);
59:                 final ComposedAdapterFactory.Descriptor desc = ComposedAdapterFactory.Descriptor.Registry.INSTANCE
60:                         .getDescriptor(types);
61:                 if (desc != null) {
62:                         adapterFactory = desc.createAdapterFactory();
63:                 }
64:
65:                 if (adapterFactory == null) {
66:                         adapterFactory = new ReflectiveItemProviderAdapterFactory();
67:                 }
68:
69:                 return adapterFactory instanceof IDisposable
70:                         ? (IDisposable) adapterFactory
71:                         : Labelizer::pass;
72:         }
73:
74:         private static void pass() {
75:                 // Nothing to do
76:         }
77:
78:         /**
79:          * Get a labelizer for the given {@code object}.
80:          *
81:          * @param object the objectfor which to get a labelizer
82:          * @return the labelizer
83:          */
84:         public static Labelizer get(EObject object) {
85:                 return get(object.eClass().getEPackage());
86:         }
87:
88:         /**
89:          * Get a labelizer for the given {@code ePackage}.
90:          *
91:          * @param ePackage the package for which to get a labelizer
92:          * @return the labelizer
93:          */
94:         public static Labelizer get(EPackage ePackage) {
95:                 final Labelizer result = new Labelizer(ePackage);
96:                 return POOL.intern(result);
97:         }
98:
99:         /**
100:          * Obtain a friendly label for the given {@code object}. Where possible,
101:          * this will be based on the label provided by the model's EMF.Edit providers.
102:          *
103:          * @param object an object
104:          * @return a best-effort friendly readable label for it
105:          */
106:         public String getLabel(EObject object) {
107:                 String result = null;
108:
109:                 final IItemLabelProvider labels = (IItemLabelProvider) adapterFactory.adapt(object, IItemLabelProvider.class);
110:                 if (labels != null) {
111:                         result = labels.getText(object);
112:                 }
113:
114:                 if (result == null) {
115:                         result = String.valueOf(object);
116:                 }
117:
118:                 return result;
119:         }
120:
121:         @Override
122:         public int hashCode() {
123:                 return ePackage.hashCode();
124:         }
125:
126:         @Override
127:         public boolean equals(Object obj) {
128:                 return obj instanceof Labelizer && ((Labelizer) obj).ePackage.equals(ePackage);
129:         }
130:
131:         //
132:         // Nested types
133:         //
134:
135:         /**
136:          * Interning labelizer pool implementation.
137:          */
138:         @SuppressWarnings("serial")
139:         private static final class PoolImpl extends Pool<Labelizer> {
140:
141:                 PoolImpl() {
142:                         super(8, null, null); // Default object access units and reference queue
143:                 }
144:
145:                 @Override
146:                 protected void putEntry(int index, Entry<Labelizer> entry) {
147:                         // initialize the labelizer now
148:                         ((EntryImpl) entry).initialize();
149:
150:                         super.putEntry(index, entry);
151:                 }
152:
153:                 @Override
154:                 protected boolean removeEntry(int index, Entry<Labelizer> entry) {
155:                         // dispose the labelizer
156:                         ((EntryImpl) entry).dispose();
157:
158:                         return super.removeEntry(index, entry);
159:                 }
160:
161:                 @Override
162:                 protected Entry<Labelizer> newExternalEntry(Labelizer object, int hashCode) {
163:                         return new EntryImpl(this, object, hashCode, externalQueue);
164:                 }
165:
166:                 //
167:                 // Nested types
168:                 //
169:
170:                 /**
171:                  * Custom pool entry that tracks the encapsulation of the disposing of the
172:                  * labelizer.
173:                  */
174:                 private static final class EntryImpl extends PoolEntry<Labelizer> {
175:                         private IDisposable disposer;
176:
177:                         EntryImpl(PoolImpl pool, Labelizer labelizer, int hashCode, ReferenceQueue<Object> externalQueue) {
178:                                 super(pool, labelizer, hashCode, externalQueue);
179:                         }
180:
181:                         void initialize() {
182:                                 disposer = get().initialize();
183:                         }
184:
185:                         void dispose() {
186:•                                if (disposer != null) {
187:                                         disposer.dispose();
188:                                         disposer = null;
189:                                 }
190:                         }
191:
192:                 }
193:
194:         }
195:
196: }