1 /*******************************************************************************
2  * Copyright (c) 2008, 2017 IBM Corporation and others.
3  *
4  * 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  *     IBM Corporation - initial API and implementation
13  *******************************************************************************/
14 package org.eclipse.pde.api.tools.internal.builder;
15 
16 import java.util.Set;
17 
18 import org.eclipse.core.runtime.CoreException;
19 import org.eclipse.pde.api.tools.internal.provisional.ApiPlugin;
20 import org.eclipse.pde.api.tools.internal.provisional.IApiAnnotations;
21 import org.eclipse.pde.api.tools.internal.provisional.RestrictionModifiers;
22 import org.eclipse.pde.api.tools.internal.provisional.builder.IReference;
23 import org.eclipse.pde.api.tools.internal.provisional.model.IApiMember;
24 import org.eclipse.pde.api.tools.internal.provisional.problems.IApiProblem;
25 import org.eclipse.pde.api.tools.internal.provisional.problems.IApiProblemTypes;
26 
27 /**
28  * Detects leaked implemented interfaces.
29  *
30  * @since 1.1
31  */
32 public class LeakImplementsProblemDetector extends AbstractTypeLeakDetector {
33 
34 	/**
35 	 * @param nonApiPackageNames
36 	 */
LeakImplementsProblemDetector(Set<String> nonApiPackageNames)37 	public LeakImplementsProblemDetector(Set<String> nonApiPackageNames) {
38 		super(nonApiPackageNames);
39 	}
40 
41 	@Override
getReferenceKinds()42 	public int getReferenceKinds() {
43 		return IReference.REF_IMPLEMENTS;
44 	}
45 
46 	@Override
getSeverityKey()47 	protected String getSeverityKey() {
48 		return IApiProblemTypes.LEAK_IMPLEMENT;
49 	}
50 
51 	@Override
getProblemFlags(IReference reference)52 	protected int getProblemFlags(IReference reference) {
53 		return IApiProblem.LEAK_IMPLEMENTS;
54 	}
55 
56 	@Override
isProblem(IReference reference)57 	public boolean isProblem(IReference reference) {
58 		boolean isProb = super.isProblem(reference);
59 		// check if no implement interface is implemented and thereby leaking api
60 		// types from noimplement interface
61 		if (isProb == false) {
62 			IApiMember member = reference.getResolvedReference();
63 			IApiMember sourceMember = reference.getMember();
64 			try {
65 				IApiAnnotations annotations = member.getApiComponent().getApiDescription().resolveAnnotations(member.getHandle());
66 				if (annotations != null) {
67 					if (RestrictionModifiers.isImplementRestriction(annotations.getRestrictions())) {
68 						IApiAnnotations annotationsSource = member.getApiComponent().getApiDescription().resolveAnnotations(sourceMember.getHandle());
69 						if (annotationsSource != null && !RestrictionModifiers.isImplementRestriction(annotationsSource.getRestrictions())) {
70 							isProb= true;
71 						}
72 					}
73 				}
74 			}
75 			catch (CoreException e) {
76 				ApiPlugin.log(e);
77 			}
78 		}
79 		return isProb;
80 	}
81 }
82