Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright (c) OSGi Alliance (2005, 2010). All Rights Reserved.
   * 
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 
 package org.osgi.service.event;
 
 import java.util.List;
 import java.util.Map;

A bundle's authority to publish or subscribe to event on a topic.

A topic is a slash-separated string that defines a topic.

For example:

 org / osgi / service / foo / FooEvent / ACTION
 

TopicPermission has two actions: publish and subscribe.

Version:
$Id: c5e3452781547a63cb4984d3c7e9f166b6abbd42 $
ThreadSafe:
 
 public final class TopicPermission extends Permission {
 	static final long			serialVersionUID	= -5855563886961618300L;
The action string publish.
 
 	public final static String	PUBLISH"publish";
The action string subscribe.
 
 	public final static String	SUBSCRIBE"subscribe";
 	private final static int	ACTION_PUBLISH		= 0x00000001;
 	private final static int	ACTION_SUBSCRIBE	= 0x00000002;
 	private final static int	ACTION_ALL
 	private final static int	ACTION_NONE			= 0;
The actions mask.
 
 	private transient int		action_mask;

prefix if the name is wildcarded.
 
 	private transient volatile String	prefix;

The actions in canonical form.

Serial:
 
 	private volatile String		actionsnull;

Defines the authority to publich and/or subscribe to a topic within the EventAdmin service.

The name is specified as a slash-separated string. Wildcards may be used. For example:

    org/osgi/service/fooFooEvent/ACTION
    com/isv/*
    *
 

A bundle that needs to publish events on a topic must have the appropriate TopicPermission for that topic; similarly, a bundle that needs to subscribe to events on a topic must have the appropriate TopicPermssion for that topic.

Parameters:
name Topic name.
actions publish,subscribe (canonical order).
	public TopicPermission(String nameString actions) {
		this(nameparseActions(actions));
	}

Package private constructor used by TopicPermissionCollection.

Parameters:
name class name
mask action mask
	TopicPermission(String nameint mask) {
		super(name);
	}

Called by constructors and when deserialized.

Parameters:
name topic name
mask action mask
	private synchronized void setTransients(final int mask) {
		final String name = getName();
		if ((name == null) || name.length() == 0) {
			throw new IllegalArgumentException("invalid name");
		}
		if ((mask == ) || ((mask & ) != mask)) {
			throw new IllegalArgumentException("invalid action string");
		}
		 = mask;
		if (name.equals("*")) {
			 = "";
		}
		else {
			if (name.endsWith("/*")) {
				 = name.substring(0, name.length() - 1);
			}
			else {
				 = null;
			}
		}
	}

Returns the current action mask.

Used by the TopicPermissionCollection class.

Returns:
Current action mask.
	synchronized int getActionsMask() {
		return ;
	}

Parse action string into action mask.

Parameters:
actions Action string.
Returns:
action mask.
	private static int parseActions(final String actions) {
		boolean seencomma = false;
		int mask = ;
		if (actions == null) {
			return mask;
		}
		char[] a = actions.toCharArray();
		int i = a.length - 1;
		if (i < 0)
			return mask;
		while (i != -1) {
			char c;
			// skip whitespace
			while ((i != -1)
					&& ((c = a[i]) == ' ' || c == '\r' || c == '\n'
							|| c == '\f' || c == '\t'))
				i--;
			// check for the known strings
			int matchlen;
			if (i >= 8 && (a[i - 8] == 's' || a[i - 8] == 'S')
					&& (a[i - 7] == 'u' || a[i - 7] == 'U')
					&& (a[i - 6] == 'b' || a[i - 6] == 'B')
					&& (a[i - 5] == 's' || a[i - 5] == 'S')
					&& (a[i - 4] == 'c' || a[i - 4] == 'C')
					&& (a[i - 3] == 'r' || a[i - 3] == 'R')
					&& (a[i - 2] == 'i' || a[i - 2] == 'I')
					&& (a[i - 1] == 'b' || a[i - 1] == 'B')
					&& (a[i] == 'e' || a[i] == 'E')) {
				matchlen = 9;
			}
			else
				if (i >= 6 && (a[i - 6] == 'p' || a[i - 6] == 'P')
						&& (a[i - 5] == 'u' || a[i - 5] == 'U')
						&& (a[i - 4] == 'b' || a[i - 4] == 'B')
						&& (a[i - 3] == 'l' || a[i - 3] == 'L')
						&& (a[i - 2] == 'i' || a[i - 2] == 'I')
						&& (a[i - 1] == 's' || a[i - 1] == 'S')
						&& (a[i] == 'h' || a[i] == 'H')) {
					matchlen = 7;
					mask |= ;
				}
				else {
					// parse error
					throw new IllegalArgumentException("invalid permission: "
actions);
				}
			// make sure we didn't just match the tail of a word
			// like "ackbarfpublish". Also, skip to the comma.
			seencomma = false;
			while (i >= matchlen && !seencomma) {
				switch (a[i - matchlen]) {
					case ',' :
						seencomma = true;
						/* FALLTHROUGH */
					case ' ' :
					case '\r' :
					case '\n' :
					case '\f' :
					case '\t' :
						break;
					default :
								"invalid permission: " + actions);
				}
				i--;
			}
			// point i at the location of the comma minus one (or -1).
			i -= matchlen;
		}
		if (seencomma) {
			throw new IllegalArgumentException("invalid permission: " + actions);
		}
		return mask;
	}

Determines if the specified permission is implied by this object.

This method checks that the topic name of the target is implied by the topic name of this object. The list of TopicPermission actions must either match or allow for the list of the target object to imply the target TopicPermission action.

    x/y/*,"publish" -> x/y/z,"publish" is true
    *,"subscribe" -> x/y,"subscribe"   is true
    *,"publish" -> x/y,"subscribe"     is false
    x/y,"publish" -> x/y/z,"publish"   is false
 

Parameters:
p The target permission to interrogate.
Returns:
true if the specified TopicPermission action is implied by this object; false otherwise.
	public boolean implies(Permission p) {
		if (p instanceof TopicPermission) {
			TopicPermission requested = (TopicPermissionp;
			int requestedMask = requested.getActionsMask();
			if ((getActionsMask() & requestedMask) == requestedMask) {
				String requestedName = requested.getName();
				String pre = ;
				if (pre != null) {
					return requestedName.startsWith(pre);
				}
				return requestedName.equals(getName());
			}
		}
		return false;
	}

Returns the canonical string representation of the TopicPermission actions.

Always returns present TopicPermission actions in the following order: publish,subscribe.

Returns:
Canonical string representation of the TopicPermission actions.
	public String getActions() {
		String result = ;
		if (result == null) {
			StringBuffer sb = new StringBuffer();
			boolean comma = false;
			int mask = getActionsMask();
			if ((mask & ) == ) {
				comma = true;
			}
			if ((mask & ) == ) {
				if (comma)
					sb.append(',');
			}
			 = result = sb.toString();
		}
		return result;
	}

Returns a new PermissionCollection object suitable for storing TopicPermission objects.

Returns:
A new PermissionCollection object.
	}

Determines the equality of two TopicPermission objects. This method checks that specified TopicPermission has the same topic name and actions as this TopicPermission object.

Parameters:
obj The object to test for equality with this TopicPermission object.
Returns:
true if obj is a TopicPermission, and has the same topic name and actions as this TopicPermission object; false otherwise.
	public boolean equals(Object obj) {
		if (obj == this) {
			return true;
		}
		if (!(obj instanceof TopicPermission)) {
			return false;
		}
		return (getActionsMask() == tp.getActionsMask())
				&& getName().equals(tp.getName());
	}

Returns the hash code value for this object.

Returns:
A hash code value for this object.
	public int hashCode() {
		int h = 31 * 17 + getName().hashCode();
		h = 31 * h + getActions().hashCode();
		return h;
	}

WriteObject is called to save the state of this permission object to a stream. The actions are serialized, and the superclass takes care of the name.
	private synchronized void writeObject(java.io.ObjectOutputStream s)
			throws IOException {
		// Write out the actions. The superclass takes care of the name
		// call getActions to make sure actions field is initialized
		if ( == null)
	}

readObject is called to restore the state of this permission from a stream.
	private synchronized void readObject(java.io.ObjectInputStream s)
		// Read in the action, then initialize the rest
	}
	static final long		serialVersionUID	= -614647783533924048L;
Table of permissions.

GuardedBy:
this
	private transient Map<StringTopicPermission>	permissions;
Boolean saying if "*" is in the collection.

Serial:
GuardedBy:
this
	private boolean			all_allowed;

Create an empty TopicPermissions object.
		 = false;
	}

Adds a permission to the TopicPermission objects. The key for the hash is the name.

Parameters:
permission The TopicPermission object to add.
Throws:
java.lang.IllegalArgumentException If the permission is not a TopicPermission instance.
java.lang.SecurityException If this TopicPermissionCollection object has been marked read-only.
	public void add(final Permission permission) {
		if (!(permission instanceof TopicPermission)) {
			throw new IllegalArgumentException("invalid permission: "
permission);
		}
		if (isReadOnly()) {
			throw new SecurityException("attempt to add a Permission to a "
"readonly PermissionCollection");
		}
		final TopicPermission tp = (TopicPermissionpermission;
		final String name = tp.getName();
		final int newMask = tp.getActionsMask();
		synchronized (this) {
			final TopicPermission existing = 
					.get(name);
			if (existing != null) {
				final int oldMask = existing.getActionsMask();
				if (oldMask != newMask) {
					.put(namenew TopicPermission(nameoldMask
newMask));
				}
			}
			else {
				.put(nametp);
			}
			if (!) {
				if (name.equals("*"))
					 = true;
			}
		}
	}

Determines if the specified permissions implies the permissions expressed in permission.

Parameters:
permission The Permission object to compare with this TopicPermission object.
Returns:
true if permission is a proper subset of a permission in the set; false otherwise.
	public boolean implies(final Permission permission) {
		if (!(permission instanceof TopicPermission)) {
			return false;
		}
		final TopicPermission requested = (TopicPermissionpermission;
		String name = requested.getName();
		final int desired = requested.getActionsMask();
		int effective = 0;
		// short circuit if the "*" Permission was added
		synchronized (this) {
			if () {
				x = .get("*");
				if (x != null) {
					effective |= x.getActionsMask();
					if ((effective & desired) == desired) {
						return true;
					}
				}
			}
			x = .get(name);
		}
		// strategy:
		// Check for full match first. Then work our way up the
		// name looking for matches on a/b/*
		if (x != null) {
			// we have a direct hit!
			effective |= x.getActionsMask();
			if ((effective & desired) == desired) {
				return true;
			}
		}
		// work our way up the tree...
		int last;
		int offset = name.length() - 1;
		while ((last = name.lastIndexOf("/"offset)) != -1) {
			name = name.substring(0, last + 1) + "*";
			synchronized (this) {
				x = .get(name);
			}
			if (x != null) {
				effective |= x.getActionsMask();
				if ((effective & desired) == desired) {
					return true;
				}
			}
			offset = last - 1;
		}
		// we don't have to check for "*" as it was already checked
		// at the top (all_allowed), so we just return false
		return false;
	}

Returns an enumeration of all TopicPermission objects in the container.

Returns:
Enumeration of all TopicPermission objects.
	public synchronized Enumeration<Permissionelements() {
		return Collections.enumeration(all);
	}
	/* serialization logic */
	private static final ObjectStreamField[]	serialPersistentFields	= {
			new ObjectStreamField("permissions"Hashtable.class),
			new ObjectStreamField("all_allowed".)			};
	private synchronized void writeObject(ObjectOutputStream out)
			throws IOException {
		pfields.put("permissions"hashtable);
		pfields.put("all_allowed");
	}
	private synchronized void readObject(java.io.ObjectInputStream in)
				.get("permissions"null);
		 = new HashMap<StringTopicPermission>(hashtable);
		 = gfields.get("all_allowed"false);
	}
New to GrepCode? Check out our FAQ X