blob: 1ed50610131c8e0a3daa837371fda34f5b19651a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.compiler.env;
import org.eclipse.jdt.core.compiler.CharOperation;
import org.eclipse.jdt.internal.compiler.util.Util;
/**
* Definition of an access restriction rule used to flag forbidden references to non API code.
* A restriction can chain to further ones, the first violated restriction taking precedence.
*/
public class AccessRestriction {
private char[][] inclusionPatterns;
private char[][] exclusionPatterns;
protected String messageTemplate;
AccessRestriction furtherRestriction; // subsequent restriction
public AccessRestriction(String messageTemplate, char[][] inclusionPatterns, char[][] exclusionPatterns, AccessRestriction furtherRestriction) {
this.messageTemplate = messageTemplate;
this.inclusionPatterns = inclusionPatterns;
this.exclusionPatterns = exclusionPatterns;
this.furtherRestriction = furtherRestriction;
}
/**
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object object) {
if (this == object)
return true;
if (!(object instanceof AccessRestriction))
return false;
AccessRestriction otherRestriction = (AccessRestriction) object;
if (!this.messageTemplate.equals(otherRestriction.messageTemplate))
return false;
if (this.inclusionPatterns != otherRestriction.inclusionPatterns) {
int length = this.inclusionPatterns == null ? 0 : this.inclusionPatterns.length;
int otherLength = otherRestriction.inclusionPatterns == null ? 0 : otherRestriction.inclusionPatterns.length;
if (length != otherLength)
return false;
for (int i = 0; i < length; i++) {
if (!CharOperation.equals(this.inclusionPatterns[i], otherRestriction.inclusionPatterns[i]))
return false;
}
}
if (this.exclusionPatterns != otherRestriction.exclusionPatterns) {
int length = this.exclusionPatterns == null ? 0 : this.exclusionPatterns.length;
int otherLength = otherRestriction.exclusionPatterns == null ? 0 : otherRestriction.exclusionPatterns.length;
if (length != otherLength)
return false;
for (int i = 0; i < length; i++) {
if (!CharOperation.equals(this.exclusionPatterns[i], otherRestriction.exclusionPatterns[i]))
return false;
}
}
if (this.furtherRestriction != otherRestriction.furtherRestriction) {
if (this.furtherRestriction == null || otherRestriction.furtherRestriction == null)
return false;
if (!this.furtherRestriction.equals(otherRestriction.furtherRestriction))
return false;
}
return true;
}
/**
* Select the first restriction which is violated when accessing a given type, or null if no restriction applies.
* Type name is formed as: "java/lang/Object".
*/
public AccessRestriction getViolatedRestriction(char[] targetTypeName, char[] referringTypeName) {
// check local inclusion/exclusion rules
if (this.inclusionPatterns != null || this.exclusionPatterns != null) {
if (Util.isExcluded(targetTypeName, this.inclusionPatterns, this.exclusionPatterns, false)) {
return this;
}
}
// then check further restrictions
return this.furtherRestriction != null
? this.furtherRestriction.getViolatedRestriction(targetTypeName, referringTypeName)
: null;
}
public char[][] getExclusionPatterns() {
return this.exclusionPatterns;
}
public char[][] getInclusionPatterns() {
return this.inclusionPatterns;
}
/**
* Returns readable description for problem reporting,
* message is expected to contain room for restricted type name
* e.g. "{0} has restricted access"
*/
public String getMessageTemplate() {
return this.messageTemplate;
}
public String toString() {
StringBuffer buffer = new StringBuffer(20);
buffer
.append("AccessRestriction [includes:\"") //$NON-NLS-1$
.append(CharOperation.concatWith(this.inclusionPatterns,'/'))
.append("\"][excludes:\"") //$NON-NLS-1$
.append(CharOperation.concatWith(this.exclusionPatterns,'/'))
.append("\"][template:\"") //$NON-NLS-1$
.append(this.messageTemplate)
.append("\"]"); //$NON-NLS-1$
if (this.furtherRestriction != null) {
buffer.append('\n').append(this.furtherRestriction);
}
return buffer.toString();
}
}