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