EMMA Coverage Report (generated Thu Nov 26 15:54:18 CST 2009)
[all classes][org.eclipse.pde.api.tools.internal.builder]

COVERAGE SUMMARY FOR SOURCE FILE [ReferenceResolver.java]

nameclass, %method, %block, %line, %
ReferenceResolver.java100% (1/1)67%  (4/6)76%  (205/268)89%  (63/71)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class ReferenceResolver100% (1/1)67%  (4/6)76%  (205/268)89%  (63/71)
ReferenceResolver (): void 0%   (0/1)0%   (0/3)0%   (0/1)
setDebug (boolean): void 0%   (0/1)0%   (0/9)0%   (0/2)
resolveReferences (List, IProgressMonitor): void 100% (1/1)67%  (101/151)89%  (33/37)
resolveReferenceSets (Map, IProgressMonitor): void 100% (1/1)98%  (47/48)94%  (15/16)
<static initializer> 100% (1/1)100% (3/3)100% (2/2)
createSignatureKey (IReference): String 100% (1/1)100% (54/54)100% (13/13)

1/*******************************************************************************
2 * Copyright (c) 2009 IBM Corporation 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 *     IBM Corporation - initial API and implementation
10 *******************************************************************************/
11package org.eclipse.pde.api.tools.internal.builder;
12 
13import java.util.ArrayList;
14import java.util.HashMap;
15import java.util.Iterator;
16import java.util.List;
17import java.util.Map;
18 
19import org.eclipse.core.runtime.CoreException;
20import org.eclipse.core.runtime.IProgressMonitor;
21import org.eclipse.pde.api.tools.internal.provisional.builder.IReference;
22import org.eclipse.pde.api.tools.internal.provisional.model.IApiMember;
23import org.eclipse.pde.api.tools.internal.util.Util;
24 
25/**
26 * Utility class used to resolve {@link IReference}s
27 * 
28 * @since 1.0.0
29 * @noinstantiate This class is not intended to be instantiated by clients.
30 */
31public final class ReferenceResolver {
32 
33        /**
34         * Constant used for controlling tracing in the search engine
35         */
36        private static boolean DEBUG = Util.DEBUG;
37        
38        /**
39         * Constructor
40         * Private constructor, no instantiate
41         */
42        private ReferenceResolver() {}
43        
44        /**
45         * Method used for initializing tracing
46         */
47        public static void setDebug(boolean debugValue) {
48                DEBUG = debugValue || Util.DEBUG;
49        }
50        
51        /**
52         * Resolves retained references.
53         * 
54         * @param references list of {@link IReference} to resolve
55         * @param progress monitor
56         * @throws CoreException if something goes wrong
57         */
58        public static void resolveReferences(List/*<IReference>*/ references, IProgressMonitor monitor) throws CoreException {
59                // sort references by target type for 'shared' resolution
60                int refcount = references.size();
61                Map sigtoref = new HashMap(refcount);
62                
63                List refs = null;
64                IReference ref = null;
65                String key = null;
66                List methodDecls = new ArrayList(refcount);
67                long start = System.currentTimeMillis();
68                Iterator iterator = references.iterator();
69                while (iterator.hasNext()) {
70                        ref = (IReference) iterator.next();
71                        if (ref.getReferenceKind() == IReference.REF_OVERRIDE) {
72                                methodDecls.add(ref);
73                        } else {
74                                key = createSignatureKey(ref);
75                                refs = (List) sigtoref.get(key);
76                                if(refs == null) {
77                                        refs = new ArrayList(20);
78                                        sigtoref.put(key, refs);
79                                }
80                                refs.add(ref);
81                        }
82                }
83                if (monitor.isCanceled()) {
84                        return;
85                }
86                long end = System.currentTimeMillis();
87                if (DEBUG) {
88                        System.out.println("Reference resolver: split into " + methodDecls.size() + " method overrides and " + sigtoref.size() + " unique references (" + (end - start) + "ms)");   //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ //$NON-NLS-4$
89                }
90                // resolve references
91                start = System.currentTimeMillis();
92                resolveReferenceSets(sigtoref, monitor);
93                end = System.currentTimeMillis();
94                if (DEBUG) {
95                        System.out.println("Reference resolver: resolved unique references in " + (end - start) + "ms");  //$NON-NLS-1$//$NON-NLS-2$
96                }
97                // resolve method overrides
98                start = System.currentTimeMillis();
99                iterator = methodDecls.iterator();
100                while (iterator.hasNext()) {
101                        Reference reference = (Reference) iterator.next();
102                        reference.resolve();
103                }
104                end = System.currentTimeMillis();
105                if (DEBUG) {
106                        System.out.println("Reference resolver: resolved method overrides in " + (end - start) + "ms");  //$NON-NLS-1$//$NON-NLS-2$
107                }
108        }
109        
110        /**
111         * Resolves the collect sets of references.
112         * @param map the mapping of keys to sets of {@link IReference}s
113         * @throws CoreException if something bad happens
114         */
115        private static void resolveReferenceSets(Map map, IProgressMonitor monitor) throws CoreException {
116                Iterator iterator = map.values().iterator();
117                List refs = null;
118                IReference ref= null;
119                while (iterator.hasNext()) {
120                        if (monitor.isCanceled()) {
121                                return;
122                        }
123                        refs = (List) iterator.next();
124                        ref = (IReference) refs.get(0);
125                        ((Reference)ref).resolve();
126                        IApiMember resolved = ref.getResolvedReference();
127                        if (resolved != null) {
128                                Iterator iterator2 = refs.iterator();
129                                while (iterator2.hasNext()) {
130                                        Reference ref2 = (Reference) iterator2.next();
131                                        ref2.setResolution(resolved);
132                                }
133                        }
134                }
135        }
136        
137        /**
138         * Creates a unique string key for a given reference.
139         * The key is of the form "component X references type/member"
140         * <pre>
141         * [component_id]#[type_name](#[member_name]#[member_signature])
142         * </pre>
143         * @param reference reference
144         * @return a string key for the given reference.
145         */
146        private static String createSignatureKey(IReference reference) throws CoreException {
147                StringBuffer buffer = new StringBuffer();
148                buffer.append(reference.getMember().getApiComponent().getId());
149                buffer.append("#"); //$NON-NLS-1$
150                buffer.append(reference.getReferencedTypeName());
151                switch (reference.getReferenceType()) {
152                case IReference.T_FIELD_REFERENCE:
153                        buffer.append("#"); //$NON-NLS-1$
154                        buffer.append(reference.getReferencedMemberName());
155                        break;
156                case IReference.T_METHOD_REFERENCE:
157                        buffer.append("#"); //$NON-NLS-1$
158                        buffer.append(reference.getReferencedMemberName());
159                        buffer.append("#"); //$NON-NLS-1$
160                        buffer.append(reference.getReferencedSignature());
161                        break;
162                }
163                return buffer.toString();
164        }        
165}

[all classes][org.eclipse.pde.api.tools.internal.builder]
EMMA 2.0.5312 EclEmma Fix 1 (C) Vladimir Roubtsov