--- /dev/null
+/*******************************************************************************
+ * 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();
+ }
+}