import eclipse 3.1 M4 compiler
[org.ibex.tool.git] / src / org / eclipse / jdt / internal / compiler / env / AccessRestriction.java
diff --git a/src/org/eclipse/jdt/internal/compiler/env/AccessRestriction.java b/src/org/eclipse/jdt/internal/compiler/env/AccessRestriction.java
new file mode 100644 (file)
index 0000000..1ed5061
--- /dev/null
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * 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();
+       }
+}