| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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.apache.aries.subsystem.scope; |
| |
| import java.util.Collection; |
| import java.util.List; |
| import java.util.Map; |
| |
| import org.osgi.framework.Bundle; |
| import org.osgi.framework.BundleException; |
| |
| /** |
| * A scope update represents a snapshot of a scope and its children. |
| * The get methods return modifiable collections or maps that represent the |
| * bundles contained in the scope, the sharing policies, the |
| * children scopes, and optionally what bundles to install. |
| * The collections and maps may be modified with changes that will be |
| * committed when the commit method is called. |
| */ |
| public interface ScopeUpdate { |
| /** |
| * Returns the name of the scope represented by this scope update. |
| * @return the name of the scope. |
| * @see Scope#getName() |
| */ |
| String getName(); |
| |
| /** |
| * Returns the collection of bundles contained in this scope. |
| * Bundles may be added or removed from this collection. |
| * <p> |
| * Adding a bundle to the collection will add the bundle |
| * to this scope when commit is called. A bundle |
| * must belong to one and only one scope at a time. |
| * If a bundle is contained in multiple scopes |
| * when commit is called then the commit will fail |
| * with an exception. |
| * <p> |
| * Removing a bundle from the collection will remove the |
| * bundle from this scope when commit is called. |
| * If a bundle is removed from this collection and is |
| * not added to the collection of another scope then the |
| * bundle will be uninstalled when commit is called. |
| * @return the collection of bundles contained in this scope. |
| */ |
| Collection<Bundle> getBundles(); |
| |
| /** |
| * Returns a map containing the sharing policies for this scope. |
| * The key is the name space of the policy and the value is the |
| * list of policies with the same name space. |
| * <p> |
| * Policies may be removed or added to the lists. If adding a |
| * policy then the policy must have the same name space as the |
| * other policies in the list. A new name space list may also be |
| * added to the map. The same rules apply to lists being |
| * added, each policy in an added list must have the same |
| * name space name space key being added. |
| * <p> |
| * The map will be check for validity on commit. If invalid then |
| * the commit will fail with an exception. |
| * @param type the type of policy to return. Must be |
| * of type {@link SharePolicy#TYPE_EXPORT EXPORT} or |
| * {@link SharePolicy#TYPE_IMPORT IMPORT}. Any other type |
| * results in an exception. |
| * @return a map containing the sharing policies of this scope. |
| * @throws IllegalArgumentException if the type is not |
| * {@link SharePolicy#TYPE_EXPORT EXPORT} or |
| * {@link SharePolicy#TYPE_IMPORT IMPORT}. |
| */ |
| Map<String, List<SharePolicy>> getSharePolicies(String type); |
| |
| /** |
| * Returns the collection of children scopes. |
| * The children scope updates can be used to update |
| * children scopes when the root scope is committed. |
| * <p> |
| * Note that only the root scope update (the one |
| * returned by {@link ScopeAdmin#createUpdate() createUpdate} |
| * may be used to commit changes. |
| * <p> |
| * Scope updates may be added or removed from this collection. |
| * Adding a scope to the collection will add the scope |
| * to the list of children of this scope when commit is called. |
| * A scope must be a child to one and only one scope at a time |
| * except the scope with id zero, this scope has no parent. |
| * If a scope is a child of multiple scopes |
| * when commit is called then the commit will fail |
| * with an exception. |
| * <p> |
| * Removing a scope from the list will remove the |
| * scope as a child of this scope when commit is called. |
| * If a scope is removed from this list and is |
| * not added to the children of another scope then the |
| * scope will be uninstalled when commit is called. |
| * This will result in all bundles and children scopes |
| * of the removed scope to be uninstalled. |
| * @return the collection of children scopes. |
| */ |
| Collection<ScopeUpdate> getChildren(); |
| |
| /** |
| * Returns the list of install infos for bundles |
| * that will be installed into this scope when |
| * commit is called. Initially this list is empty |
| * @return the list of install infos. |
| */ |
| List<InstallInfo> getBundlesToInstall(); |
| |
| /** |
| * Creates a new child scope update for this scope. To |
| * add the returned child scope to this scope the child |
| * scope must be added to the collection |
| * of children returned by {@link ScopeUpdate#getChildren() |
| * getChildren} before calling {@link #commit() commit} on |
| * this scope update. |
| * @param name the name to assign the new child scope. |
| * @return a scope update for a child scope. |
| */ |
| ScopeUpdate newChild(String name); |
| |
| /** |
| * Creates a new child scope update for this scope. To |
| * add the returned child scope to this scope the child |
| * scope must be added to the collection |
| * of children returned by {@link ScopeUpdate#getChildren() |
| * getChildren} before calling {@link #commit() commit} on |
| * this scope update. |
| * @param name the name to assign the new child scope. |
| * @return a scope update for a child scope. |
| */ |
| ScopeUpdate newChild(String name, String location); |
| |
| /** |
| * Commit this update. If no changes have been made to the scopes |
| * since this update was created, then this method will |
| * update the scopes for the system. This method may only be |
| * successfully called once on this object. |
| * <p> |
| * The following steps will be done to commit this scope: |
| * <ul> |
| * <li> If this update was not one returned by {@link |
| * ScopeAdmin#newScopeUpdate()} then an {@link |
| * UnsupportedOperationException} is thrown.</li> |
| * <li> If this update is not valid then an |
| * {@link IllegalStateException} is thrown. |
| * //TODO need to fill in the details of illegal state |
| * </li> |
| * <li> All currently unresolved bundles are disabled from |
| * resolving until the end of the commit operation. |
| * </li> |
| * <li> Any bundle installs or uninstalls are performed. |
| * Any bundles installed will be disabled from resolving |
| * until the end of the commit operation. If a |
| * {@link BundleException} is thrown during a bundle install |
| * or uninstall then the commit operation is terminated and |
| * the exception is propagated to the caller. Any bundle operations |
| * that may have succeeded are left in place and not rolled back. |
| * </li> |
| * <li> Scope uninstallation is performed. If a scope is uninstalled |
| * then all of its bundles are uninstalled and all of its children |
| * scopes are uninstalled. If a {@link BundleException} is thrown |
| * during a bundle uninstall operation then the commit operation |
| * is terminated and the exception is propagated to the caller. |
| * </li> |
| * <li> Scope installation is performed. If a {@link BundleException} |
| * is thrown during a bundle install operation then the commit |
| * operation is terminated and the exception is propagated to the |
| * caller. Any bundle operations that may have succeeded are left |
| * in place and not rolled back. |
| * </li> |
| * <li> This scope's sharing policy is updated. |
| * </li> |
| * <li> Bundles enabled for resolution. Not this must happen |
| * even on exception. |
| * </li> |
| * </ul> |
| * <p> |
| * This method returns <code>false</code> if the commit did not occur |
| * because another scope commit has been performed since the |
| * creation of this update. |
| * |
| * @return <code>true</code> if the commit was successful. |
| * <code>false</code> if the commit did not occur because another |
| * update has been committed since the creation of this update. |
| * @throws SecurityException If the caller does not have the necessary |
| * permission to perform the update. For example, if the |
| * update involves installing or uninstalling bundles. |
| * @throws IllegalStateException If this update's state is |
| * not valid or inconsistent. For example, this update tries to |
| * place a bundle in multiple scopes. |
| * @throws UnsupportedOperationException If this update was not one |
| * returned by {@link ScopeAdmin#newScopeUpdate()}. |
| * @throws BundleException if a bundle lifecycle operation failed. |
| */ |
| boolean commit() throws BundleException; |
| |
| /** |
| * Returns the scope it is updating |
| * @return the scope it is updating |
| */ |
| public Scope getScope(); |
| } |