diff options
author | Szymon Ptaszkiewicz | 2015-04-08 15:16:35 +0000 |
---|---|---|
committer | Szymon Ptaszkiewicz | 2015-04-08 15:16:35 +0000 |
commit | d5ecf18441b571691f7d9b6f22e4019e29962742 (patch) | |
tree | 062a054858f3f3313ac3c4956e90d3c48a7413bd /bundles/org.eclipse.equinox.app/src | |
parent | b18d30db803b95daa7ce45c1bba40a29bb94c338 (diff) | |
download | rt.equinox.bundles-d5ecf18441b571691f7d9b6f22e4019e29962742.tar.gz rt.equinox.bundles-d5ecf18441b571691f7d9b6f22e4019e29962742.tar.xz rt.equinox.bundles-d5ecf18441b571691f7d9b6f22e4019e29962742.zip |
Bug 464172 - Reduce the number of warnings for org.osgi.* classes by using the "Ignore optional compile problems" option
For the org.eclipse.equinox.app project.
Change-Id: I14cd677ea631e81066dc77ab134016aada79ee80
Signed-off-by: Szymon Ptaszkiewicz <szymon.ptaszkiewicz@pl.ibm.com>
Diffstat (limited to 'bundles/org.eclipse.equinox.app/src')
5 files changed, 0 insertions, 1470 deletions
diff --git a/bundles/org.eclipse.equinox.app/src/org/osgi/service/application/ApplicationAdminPermission.java b/bundles/org.eclipse.equinox.app/src/org/osgi/service/application/ApplicationAdminPermission.java deleted file mode 100644 index 8c7941578..000000000 --- a/bundles/org.eclipse.equinox.app/src/org/osgi/service/application/ApplicationAdminPermission.java +++ /dev/null @@ -1,352 +0,0 @@ -/* - * Copyright (c) OSGi Alliance (2004, 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.application; - -import java.security.Permission; -import java.util.Hashtable; -import java.util.StringTokenizer; -import java.util.Vector; - -import org.osgi.framework.Filter; -import org.osgi.framework.FrameworkUtil; -import org.osgi.framework.InvalidSyntaxException; - -/** - * This class implements permissions for manipulating applications and their - * instances. - * <P> - * ApplicationAdminPermission can be targeted to applications that matches the - * specified filter. - * <P> - * ApplicationAdminPermission may be granted for different actions: - * {@code lifecycle}, {@code schedule} and {@code lock}. The - * permission {@code schedule} implies the permission - * {@code lifecycle}. - * - * @version $Id$ - */ -public class ApplicationAdminPermission extends Permission { - private static final long serialVersionUID = 1L; - - /** - * Allows the lifecycle management of the target applications. - */ - public static final String LIFECYCLE_ACTION = "lifecycle"; - - /** - * Allows scheduling of the target applications. The permission to - * schedule an application implies that the scheduler can also - * manage the lifecycle of that application i.e. {@code schedule} - * implies {@code lifecycle} - */ - public static final String SCHEDULE_ACTION = "schedule"; - - /** - * Allows setting/unsetting the locking state of the target applications. - */ - public static final String LOCK_ACTION = "lock"; - - private ApplicationDescriptor applicationDescriptor; - - /** - * Constructs an ApplicationAdminPermission. The {@code filter} - * specifies the target application. The {@code filter} is an - * LDAP-style filter, the recognized properties are {@code signer} - * and {@code pid}. The pattern specified in the {@code signer} - * is matched with the Distinguished Name chain used to sign the application. - * Wildcards in a DN are not matched according to the filter string rules, - * but according to the rules defined for a DN chain. The attribute - * {@code pid} is matched with the PID of the application according to - * the filter string rules. - * <p> - * If the {@code filter} is {@code null} then it matches - * {@code "*"}. If - * {@code actions} is {@code "*"} then it identifies all the - * possible actions. - * - * @param filter - * filter to identify application. The value {@code null} - * is equivalent to {@code "*"} and it indicates "all application". - * @param actions - * comma-separated list of the desired actions granted on the - * applications or "*" means all the actions. It must not be - * {@code null}. The order of the actions in the list is - * not significant. - * @throws InvalidSyntaxException - * is thrown if the specified {@code filter} is not syntactically - * correct. - * - * @exception NullPointerException - * is thrown if the actions parameter is {@code null} - * - * @see ApplicationDescriptor - * @see org.osgi.framework.AdminPermission - */ - public ApplicationAdminPermission(String filter, String actions) throws InvalidSyntaxException { - super(filter == null ? "*" : filter); - - if( filter == null ) - filter = "*"; - - if( actions == null ) - throw new NullPointerException( "Action string cannot be null!" ); - - this.applicationDescriptor = null; - this.filter = (filter == null ? "*" : filter); - this.actions = actions; - - if( !filter.equals( "*" ) && !filter.equals( "<<SELF>>" ) ) - FrameworkUtil.createFilter( this.filter ); // check if the filter is valid - init(); - } - - /** - * This contructor should be used when creating {@code ApplicationAdminPermission} - * instance for {@code checkPermission} call. - * @param application the tareget of the operation, it must not be {@code null} - * @param actions the required operation. it must not be {@code null} - * @throws NullPointerException if any of the arguments is null. - */ - public ApplicationAdminPermission(ApplicationDescriptor application, String actions) { - super(application.getApplicationId()); - - if( application == null || actions == null ) - throw new NullPointerException( "ApplicationDescriptor and action string cannot be null!" ); - - this.filter = application.getApplicationId(); - this.applicationDescriptor = application; - this.actions = actions; - - init(); - } - - /** - * This method can be used in the {@link java.security.ProtectionDomain} - * implementation in the {@code implies} method to insert the - * application ID of the current application into the permission being - * checked. This enables the evaluation of the - * {@code <<SELF>>} pseudo targets. - * @param applicationId the ID of the current application. - * @return the permission updated with the ID of the current application - */ - public ApplicationAdminPermission setCurrentApplicationId(String applicationId) { - ApplicationAdminPermission newPerm = null; - - if( this.applicationDescriptor == null ) { - try { - newPerm = new ApplicationAdminPermission( this.filter, this.actions ); - }catch( InvalidSyntaxException e ) { - throw new RuntimeException(e); /* this can never happen */ - } - } - else - newPerm = new ApplicationAdminPermission( this.applicationDescriptor, this.actions ); - - newPerm.applicationID = applicationId; - - return newPerm; - } - - /** - * Checks if the specified {@code permission} is implied by this permission. - * The method returns true under the following conditions: - * <UL> - * <LI> This permission was created by specifying a filter (see {@link #ApplicationAdminPermission(String, String)}) - * <LI> The implied {@code otherPermission} was created for a particular {@link ApplicationDescriptor} - * (see {@link #ApplicationAdminPermission(ApplicationDescriptor, String)}) - * <LI> The {@code filter} of this permission mathes the {@code ApplicationDescriptor} specified - * in the {@code otherPermission}. If the filter in this permission is the - * {@code <<SELF>>} pseudo target, then the currentApplicationId set in the - * {@code otherPermission} is compared to the application Id of the target - * {@code ApplicationDescriptor}. - * <LI> The list of permitted actions in this permission contains all actions required in the - * {@code otherPermission} - * </UL> - * Otherwise the method returns false. - * @param otherPermission the implied permission - * @return true if this permission implies the {@code otherPermission}, false otherwise. - */ - public boolean implies(Permission otherPermission) { - if( otherPermission == null ) - return false; - - if(!(otherPermission instanceof ApplicationAdminPermission)) - return false; - - ApplicationAdminPermission other = (ApplicationAdminPermission) otherPermission; - - if( !filter.equals("*") ) { - if( other.applicationDescriptor == null ) - return false; - - if( filter.equals( "<<SELF>>") ) { - if( other.applicationID == null ) - return false; /* it cannot be, this might be a bug */ - - if( !other.applicationID.equals( other.applicationDescriptor.getApplicationId() ) ) - return false; - } - else { - Hashtable props = new Hashtable(); - props.put( "pid", other.applicationDescriptor.getApplicationId() ); - props.put( "signer", new SignerWrapper( other.applicationDescriptor ) ); - - Filter flt = getFilter(); - if( flt == null ) - return false; - - if( !flt.match( props ) ) - return false; - } - } - - if( !actionsVector.containsAll( other.actionsVector ) ) - return false; - - return true; - } - - public boolean equals(Object with) { - if( with == null || !(with instanceof ApplicationAdminPermission) ) - return false; - - ApplicationAdminPermission other = (ApplicationAdminPermission)with; - - // Compare actions: - if( other.actionsVector.size() != actionsVector.size() ) - return false; - - for( int i=0; i != actionsVector.size(); i++ ) - if( !other.actionsVector.contains( actionsVector.get( i ) ) ) - return false; - - - return equal(this.filter, other.filter ) && equal(this.applicationDescriptor, other.applicationDescriptor) - && equal(this.applicationID, other.applicationID); - } - - /** - * Compares parameters for equality. If both object are null, they are considered - * equal. - * @param a object to compare - * @param b other object to compare - * @return true if both objects are equal or both are null - */ - private static boolean equal(Object a, Object b) { - // This equation is true if both references are null or both point - // to the same object. In both cases they are considered as equal. - if( a == b ) { - return true; - } - - return a.equals(b); - } - - public int hashCode() { - int hc = 0; - for( int i=0; i != actionsVector.size(); i++ ) - hc ^= ((String)actionsVector.get( i )).hashCode(); - hc ^= (null == this.filter )? 0 : this.filter.hashCode(); - hc ^= (null == this.applicationDescriptor) ? 0 : this.applicationDescriptor.hashCode(); - hc ^= (null == this.applicationID) ? 0 : this.applicationID.hashCode(); - return hc; - } - - /** - * Returns the actions of this permission. - * @return the actions specified when this permission was created - */ - public String getActions() { - return actions; - } - - private String applicationID; - - private static final Vector ACTIONS = new Vector(); - private Vector actionsVector; - private final String filter; - private final String actions; - private Filter appliedFilter = null; - - static { - ACTIONS.add(LIFECYCLE_ACTION); - ACTIONS.add(SCHEDULE_ACTION); - ACTIONS.add(LOCK_ACTION); - } - - private static Vector actionsVector(String actions) { - Vector v = new Vector(); - StringTokenizer t = new StringTokenizer(actions.toUpperCase(), ","); - while (t.hasMoreTokens()) { - String action = t.nextToken().trim(); - v.add(action.toLowerCase()); - } - - if( v.contains( SCHEDULE_ACTION ) && !v.contains( LIFECYCLE_ACTION ) ) - v.add( LIFECYCLE_ACTION ); - - return v; - } - - - private static class SignerWrapper extends Object { - private String pattern; - private ApplicationDescriptor appDesc; - - /** - * @param pattern - */ - public SignerWrapper(String pattern) { - this.pattern = pattern; - } - - SignerWrapper(ApplicationDescriptor appDesc) { - this.appDesc = appDesc; - } - - public boolean equals(Object o) { - if (!(o instanceof SignerWrapper)) - return false; - SignerWrapper other = (SignerWrapper) o; - ApplicationDescriptor matchAppDesc = (ApplicationDescriptor) (appDesc != null ? appDesc : other.appDesc); - String matchPattern = appDesc != null ? other.pattern : pattern; - return matchAppDesc.matchDNChain(matchPattern); - } - } - - private void init() { - actionsVector = actionsVector( actions ); - - if ( actions.equals("*") ) - actionsVector = actionsVector( LIFECYCLE_ACTION + "," + SCHEDULE_ACTION + "," + LOCK_ACTION ); - else if (!ACTIONS.containsAll(actionsVector)) - throw new IllegalArgumentException("Illegal action!"); - - applicationID = null; - } - - private Filter getFilter() { - if (appliedFilter == null) { - try { - appliedFilter = FrameworkUtil.createFilter(filter); - } catch (InvalidSyntaxException e) { - //we will return null - } - } - return appliedFilter; - } -} diff --git a/bundles/org.eclipse.equinox.app/src/org/osgi/service/application/ApplicationDescriptor.java b/bundles/org.eclipse.equinox.app/src/org/osgi/service/application/ApplicationDescriptor.java deleted file mode 100644 index 601037a95..000000000 --- a/bundles/org.eclipse.equinox.app/src/org/osgi/service/application/ApplicationDescriptor.java +++ /dev/null @@ -1,554 +0,0 @@ -/* - * Copyright (c) OSGi Alliance (2004, 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.application; - -import java.lang.reflect.Array; -import java.util.*; -import java.util.Map.Entry; -import org.eclipse.equinox.internal.app.AppPersistence; -import org.osgi.framework.Constants; -import org.osgi.framework.InvalidSyntaxException; - -/** - * An OSGi service that represents an installed application and stores - * information about it. The application descriptor can be used for instance - * creation. - * - * @version $Revision: 1.13 $ - */ - -public abstract class ApplicationDescriptor { - /* - * NOTE: An implementor may also choose to replace this class in - * their distribution with a class that directly interfaces with the - * org.osgi.service.application implementation. This replacement class MUST NOT alter the - * public/protected signature of this class. - */ - - /** - * The property key for the localized name of the application. - */ - public static final String APPLICATION_NAME = "application.name"; - - /** - * The property key for the localized icon of the application. - */ - public static final String APPLICATION_ICON = "application.icon"; - - /** - * The property key for the unique identifier (PID) of the application. - */ - public static final String APPLICATION_PID = Constants.SERVICE_PID; - - /** - * The property key for the version of the application. - */ - public static final String APPLICATION_VERSION = "application.version"; - - /** - * The property key for the name of the application vendor. - */ - public static final String APPLICATION_VENDOR = Constants.SERVICE_VENDOR; - - /** - * The property key for the visibility property of the application. - */ - public static final String APPLICATION_VISIBLE = "application.visible"; - - /** - * The property key for the launchable property of the application. - */ - public static final String APPLICATION_LAUNCHABLE = "application.launchable"; - - /** - * The property key for the locked property of the application. - */ - public static final String APPLICATION_LOCKED = "application.locked"; - - /** - * The property key for the localized description of the application. - */ - public static final String APPLICATION_DESCRIPTION = "application.description"; - - /** - * The property key for the localized documentation of the application. - */ - public static final String APPLICATION_DOCUMENTATION = "application.documentation"; - - /** - * The property key for the localized copyright notice of the application. - */ - public static final String APPLICATION_COPYRIGHT = "application.copyright"; - - /** - * The property key for the localized license of the application. - */ - public static final String APPLICATION_LICENSE = "application.license"; - - /** - * The property key for the application container of the application. - */ - public static final String APPLICATION_CONTAINER = "application.container"; - - /** - * The property key for the location of the application. - */ - public static final String APPLICATION_LOCATION = "application.location"; - - private final String pid; - - private final boolean[] locked = {false}; - - /** - * Constructs the {@code ApplicationDescriptor}. - * - * @param applicationId - * The identifier of the application. Its value is also available - * as the {@code service.pid} service property of this - * {@code ApplicationDescriptor} service. This parameter must not - * be {@code null}. - * @throws NullPointerException if the specified {@code applicationId} is null. - */ - protected ApplicationDescriptor(String applicationId) { - if (null == applicationId) { - throw new NullPointerException("Application ID must not be null!"); - } - - this.pid = applicationId; - locked[0] = isPersistentlyLocked(); - } - - /** - * Returns the identifier of the represented application. - * - * @return the identifier of the represented application - */ - public final String getApplicationId() { - return pid; - } - - /** - * This method verifies whether the specified {@code pattern} - * matches the Distinguished Names of any of the certificate chains - * used to authenticate this application. - * <P> - * The {@code pattern} must adhere to the - * syntax defined in {@link org.osgi.service.application.ApplicationAdminPermission} - * for signer attributes. - * <p> - * This method is used by {@link ApplicationAdminPermission#implies(java.security.Permission)} method - * to match target {@code ApplicationDescriptor} and filter. - * - * @param pattern a pattern for a chain of Distinguished Names. It must not be null. - * @return {@code true} if the specified pattern matches at least - * one of the certificate chains used to authenticate this application - * @throws NullPointerException if the specified {@code pattern} is null. - * @throws IllegalStateException if the application descriptor was - * unregistered - */ - public abstract boolean matchDNChain(String pattern); - - /** - * Returns the properties of the application descriptor as key-value pairs. - * The return value contains the locale aware and unaware properties as - * well. The returned {@code Map} will include the service - * properties of this {@code ApplicationDescriptor} as well. - * <p> - * This method will call the {@code getPropertiesSpecific} method - * to enable the container implementation to insert application model and/or - * container implementation specific properties. - * <P> - * The returned {@link java.util.Map} will contain the standard OSGi service - * properties as well - * (e.g. service.id, service.vendor etc.) and specialized application - * descriptors may offer further service properties. The returned Map contains - * a snapshot of the properties. It will not reflect further changes in the - * property values nor will the update of the Map change the corresponding - * service property. - * - * @param locale - * the locale string, it may be null, the value null means the - * default locale. If the provided locale is the empty String - * ({@code ""})then raw (non-localized) values are returned. - * - * @return copy of the service properties of this application descriptor service, - * according to the specified locale. If locale is null then the - * default locale's properties will be returned. (Since service - * properties are always exist it cannot return null.) - * - * @throws IllegalStateException - * if the application descriptor is unregistered - */ - public final Map getProperties(String locale) { - Map props = getPropertiesSpecific(locale); - Boolean containerLocked = (Boolean) props.remove(APPLICATION_LOCKED); - synchronized (locked) { - if (containerLocked != null && containerLocked.booleanValue() != locked[0]) { - if (locked[0]) - lockSpecific(); - else - unlockSpecific(); - } - } - /* replace the container's lock with the application model's lock, that's the correct */ - props.put(APPLICATION_LOCKED, new Boolean(locked[0])); - return props; - } - - /** - * Container implementations can provide application model specific - * and/or container implementation specific properties via this - * method. - * - * Localizable properties must be returned localized if the provided - * {@code locale} argument is not the empty String. The value - * {@code null} indicates to use the default locale, for other - * values the specified locale should be used. - * - * The returned {@link java.util.Map} must contain the standard OSGi service - * properties as well - * (e.g. service.id, service.vendor etc.) and specialized application - * descriptors may offer further service properties. - * The returned {@code Map} - * contains a snapshot of the properties. It will not reflect further changes in the - * property values nor will the update of the Map change the corresponding - * service property. - - * @param locale the locale to be used for localizing the properties. - * If {@code null} the default locale should be used. If it is - * the empty String ({@code ""}) then raw (non-localized) values - * should be returned. - * - * @return the application model specific and/or container implementation - * specific properties of this application descriptor. - * - * @throws IllegalStateException - * if the application descriptor is unregistered - */ - protected abstract Map getPropertiesSpecific(String locale); - - /** - * Launches a new instance of an application. The {@code args} parameter - * specifies the startup parameters for the instance to be launched, it may - * be null. - * <p> - * The following steps are made: - * <UL> - * <LI>Check for the appropriate permission. - * <LI>Check the locking state of the application. If locked then throw an - * {@link ApplicationException} with the reason code - * {@link ApplicationException#APPLICATION_LOCKED}. - * <LI>Calls the {@code launchSpecific()} method to create and start an - * application instance. - * <LI>Returns the {@code ApplicationHandle} returned by the - * launchSpecific() - * </UL> - * The caller has to have ApplicationAdminPermission(applicationPID, - * "launch") in order to be able to perform this operation. - * <P> - * The {@code Map} argument of the launch method contains startup arguments - * for the application. The keys used in the Map must be non-null, non-empty - * {@code String} objects. They can be standard or application specific. - * OSGi defines the {@code org.osgi.triggeringevent} key to be used to pass - * the triggering event to a scheduled application, however in the future it - * is possible that other well-known keys will be defined. To avoid unwanted - * clashes of keys, the following rules should be applied: - * <ul> - * <li>The keys starting with the dash (-) character are application - * specific, no well-known meaning should be associated with them.</li> - * <li>Well-known keys should follow the reverse domain name based naming. - * In particular, the keys standardized in OSGi should start with - * {@code org.osgi.}.</li> - * </ul> - * <P> - * The method is synchronous, it return only when the application instance - * was successfully started or the attempt to start it failed. - * <P> - * This method never returns {@code null}. If launching an application - * fails, the appropriate exception is thrown. - * - * @param arguments Arguments for the newly launched application, may be - * null - * - * @return the registered ApplicationHandle, which represents the newly - * launched application instance. Never returns {@code null}. - * - * @throws SecurityException if the caller doesn't have "lifecycle" - * ApplicationAdminPermission for the application. - * @throws ApplicationException if starting the application failed - * @throws IllegalStateException if the application descriptor is - * unregistered - * @throws IllegalArgumentException if the specified {@code Map} contains - * invalid keys (null objects, empty {@code String} or a key that is - * not {@code String}) - */ - public final ApplicationHandle launch(Map arguments) throws ApplicationException { - SecurityManager sm = System.getSecurityManager(); - if (sm != null) - sm.checkPermission(new ApplicationAdminPermission(this, ApplicationAdminPermission.LIFECYCLE_ACTION)); - synchronized (locked) { - if (locked[0]) - throw new ApplicationException(ApplicationException.APPLICATION_LOCKED, "Application is locked, can't launch!"); - } - if (!isLaunchableSpecific()) - throw new ApplicationException(ApplicationException.APPLICATION_NOT_LAUNCHABLE, "Cannot launch the application!"); - checkArgs(arguments, false); - try { - return launchSpecific(arguments); - } catch (IllegalStateException ise) { - throw ise; - } catch (SecurityException se) { - throw se; - } catch (ApplicationException ae) { - throw ae; - } catch (Exception t) { - throw new ApplicationException(ApplicationException.APPLICATION_INTERNAL_ERROR, t); - } - } - - /** - * Called by launch() to create and start a new instance in an application - * model specific way. It also creates and registeres the application handle - * to represent the newly created and started instance and registeres it. - * The method is synchronous, it return only when the application instance was - * successfully started or the attempt to start it failed. - * <P> - * This method must not return {@code null}. If launching the application - * failed, and exception must be thrown. - * - * @param arguments - * the startup parameters of the new application instance, may be - * null - * - * @return the registered application model - * specific application handle for the newly created and started - * instance. - * - * @throws IllegalStateException - * if the application descriptor is unregistered - * @throws Exception - * if any problem occurs. - */ - protected abstract ApplicationHandle launchSpecific(Map arguments) throws Exception; - - /** - * This method is called by launch() to verify that according to the - * container, the application is launchable. - * - * @return true, if the application is launchable according to the - * container, false otherwise. - * - * @throws IllegalStateException - * if the application descriptor is unregistered - */ - protected abstract boolean isLaunchableSpecific(); - - /** - * Schedules the application at a specified event. Schedule information - * should not get lost even if the framework or the device restarts so it - * should be stored in a persistent storage. The method registers a - * {@link ScheduledApplication} service in Service Registry, representing - * the created schedule. - * <p> - * The {@code Map} argument of the method contains startup arguments for the - * application. The keys used in the Map must be non-null, non-empty - * {@code String} objects. The argument values must be of primitive types, - * wrapper classes of primitive types, {@code String} or arrays or - * collections of these. - * <p> - * The created schedules have a unique identifier within the scope of this - * {@code ApplicationDescriptor}. This identifier can be specified in the - * {@code scheduleId} argument. If this argument is {@code null}, the - * identifier is automatically generated. - * - * @param scheduleId the identifier of the created schedule. It can be - * {@code null}, in this case the identifier is automatically - * generated. - * @param arguments the startup arguments for the scheduled application, may - * be null - * @param topic specifies the topic of the triggering event, it may contain - * a trailing asterisk as wildcard, the empty string is treated as - * "*", must not be null - * @param eventFilter specifies and LDAP filter to filter on the properties - * of the triggering event, may be null - * @param recurring if the recurring parameter is false then the application - * will be launched only once, when the event firstly occurs. If the - * parameter is true then scheduling will take place for every event - * occurrence; i.e. it is a recurring schedule - * - * @return the registered scheduled application service - * - * @throws NullPointerException if the topic is {@code null} - * @throws InvalidSyntaxException if the specified {@code eventFilter} is - * not syntactically correct - * @throws ApplicationException if the schedule couldn't be created. The - * possible error codes are - * <ul> - * <li> - * {@link ApplicationException#APPLICATION_DUPLICATE_SCHEDULE_ID} if - * the specified {@code scheduleId} is already used for this - * {@code ApplicationDescriptor} <li> - * {@link ApplicationException#APPLICATION_SCHEDULING_FAILED} if the - * scheduling failed due to some internal reason (e.g. persistent - * storage error). <li> - * {@link ApplicationException#APPLICATION_INVALID_STARTUP_ARGUMENT} - * if the specified startup argument doesn't satisfy the type or - * value constraints of startup arguments. - * </ul> - * @throws SecurityException if the caller doesn't have "schedule" - * ApplicationAdminPermission for the application. - * @throws IllegalStateException if the application descriptor is - * unregistered - * @throws IllegalArgumentException if the specified {@code Map} contains - * invalid keys (null objects, empty {@code String} or a key that is - * not {@code String}) - */ - public final ScheduledApplication schedule(String scheduleId, Map arguments, String topic, String eventFilter, boolean recurring) throws InvalidSyntaxException, ApplicationException { - SecurityManager sm = System.getSecurityManager(); - if (sm != null) - sm.checkPermission(new ApplicationAdminPermission(this, ApplicationAdminPermission.SCHEDULE_ACTION)); - arguments = checkArgs(arguments, true); - isLaunchableSpecific(); // checks if the ApplicationDescriptor was already unregistered - return AppPersistence.addScheduledApp(this, scheduleId, arguments, topic, eventFilter, recurring); - } - - /** - * Sets the lock state of the application. If an application is locked then - * launching a new instance is not possible. It does not affect the already - * launched instances. - * - * @throws SecurityException - * if the caller doesn't have "lock" ApplicationAdminPermission - * for the application. - * @throws IllegalStateException - * if the application descriptor is unregistered - */ - public final void lock() { - SecurityManager sm = System.getSecurityManager(); - if (sm != null) - sm.checkPermission(new ApplicationAdminPermission(this, ApplicationAdminPermission.LOCK_ACTION)); - synchronized (locked) { - if (locked[0]) - return; - locked[0] = true; - lockSpecific(); - saveLock(true); - } - } - - /** - * This method is used to notify the container implementation that the - * corresponding application has been locked and it should update the - * {@code application.locked} service property accordingly. - * @throws IllegalStateException - * if the application descriptor is unregistered - */ - protected abstract void lockSpecific(); - - /** - * Unsets the lock state of the application. - * - * @throws SecurityException - * if the caller doesn't have "lock" ApplicationAdminPermission - * for the application. - * @throws IllegalStateException - * if the application descriptor is unregistered - */ - public final void unlock() { - SecurityManager sm = System.getSecurityManager(); - if (sm != null) - sm.checkPermission(new ApplicationAdminPermission(this, ApplicationAdminPermission.LOCK_ACTION)); - synchronized (locked) { - if (!locked[0]) - return; - locked[0] = false; - unlockSpecific(); - saveLock(false); - } - } - - /** - * This method is used to notify the container implementation that the - * corresponding application has been unlocked and it should update the - * {@code application.locked} service property accordingly. - - * @throws IllegalStateException - * if the application descriptor is unregistered - */ - protected abstract void unlockSpecific(); - - private void saveLock(boolean locked) { - AppPersistence.saveLock(this, locked); - } - - private boolean isPersistentlyLocked() { - return AppPersistence.isLocked(this); - } - - private static final Collection scalars = Arrays.asList(new Class[] {String.class, Integer.class, Long.class, Float.class, Double.class, Byte.class, Short.class, Character.class, Boolean.class}); - private static final Collection scalarsArrays = Arrays.asList(new Class[] {String[].class, Integer[].class, Long[].class, Float[].class, Double[].class, Byte[].class, Short[].class, Character[].class, Boolean[].class}); - private static final Collection primitiveArrays = Arrays.asList(new Class[] {long[].class, int[].class, short[].class, char[].class, byte[].class, double[].class, float[].class, boolean[].class}); - - private static Map checkArgs(Map arguments, boolean validateValues) throws ApplicationException { - if (arguments == null) - return arguments; - Map copy = validateValues ? new HashMap() : null; - for (Iterator entries = arguments.entrySet().iterator(); entries.hasNext();) { - Map.Entry entry = (Entry) entries.next(); - if (!(entry.getKey() instanceof String)) - throw new IllegalArgumentException("Invalid key type: " + entry.getKey() == null ? "<null>" : entry.getKey().getClass().getName()); - if ("".equals(entry.getKey())) //$NON-NLS-1$ - throw new IllegalArgumentException("Empty string is an invalid key"); - if (validateValues) - validateValue(entry, copy); - } - return validateValues ? copy : arguments; - } - - private static void validateValue(Map.Entry entry, Map copy) throws ApplicationException { - Class clazz = entry.getValue().getClass(); - - // Is it in the set of scalar types - if (scalars.contains(clazz)) { - copy.put(entry.getKey(), entry.getValue()); - return; - } - - // Is it an array of primitives or scalars - if (scalarsArrays.contains(clazz) || primitiveArrays.contains(clazz)) { - int arrayLength = Array.getLength(entry.getValue()); - Object copyOfArray = Array.newInstance(entry.getValue().getClass().getComponentType(), arrayLength); - System.arraycopy(entry.getValue(), 0, copyOfArray, 0, arrayLength); - copy.put(entry.getKey(), copyOfArray); - return; - } - - // Is it a Collection of scalars - if (entry.getValue() instanceof Collection) { - Collection valueCollection = (Collection) entry.getValue(); - for (Iterator it = valueCollection.iterator(); it.hasNext();) { - Class containedClazz = it.next().getClass(); - if (!scalars.contains(containedClazz)) { - throw new ApplicationException(ApplicationException.APPLICATION_INVALID_STARTUP_ARGUMENT, "The value for key \"" + entry.getKey() + "\" is a collection that contains an invalid value of type \"" + containedClazz.getName() + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - } - copy.put(entry.getKey(), new ArrayList((Collection) entry.getValue())); - return; - } - throw new ApplicationException(ApplicationException.APPLICATION_INVALID_STARTUP_ARGUMENT, "The value for key \"" + entry.getKey() + "\" is an invalid type \"" + clazz.getName() + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } -}
\ No newline at end of file diff --git a/bundles/org.eclipse.equinox.app/src/org/osgi/service/application/ApplicationException.java b/bundles/org.eclipse.equinox.app/src/org/osgi/service/application/ApplicationException.java deleted file mode 100644 index be377d8ec..000000000 --- a/bundles/org.eclipse.equinox.app/src/org/osgi/service/application/ApplicationException.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * 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.application; - -/** - * This exception is used to indicate problems related to application lifecycle - * management. - * - * {@code ApplicationException} object is created by the Application Admin - * to denote an exception condition in the lifecycle of an application. - * {@code ApplicationException}s should not be created by developers. <br/> - * {@code ApplicationException}s are associated with an error code. This - * code describes the type of problem reported in this exception. The possible - * codes are: - * <ul> - * <li> {@link #APPLICATION_LOCKED} - The application couldn't be launched - * because it is locked.</li> - * <li> {@link #APPLICATION_NOT_LAUNCHABLE} - The application is not in - * launchable state.</li> - * <li> {@link #APPLICATION_INTERNAL_ERROR} - An exception was thrown by the - * application or its container during launch.</li> - * <li> {@link #APPLICATION_SCHEDULING_FAILED} - The scheduling of an application - * failed. - * <li> {@link #APPLICATION_DUPLICATE_SCHEDULE_ID} - The application scheduling - * failed because the specified identifier is already in use. - * <li> {@link #APPLICATION_EXITVALUE_NOT_AVAILABLE} - The exit value is not - * available for an application instance because the instance has not - * terminated. - * <li> {@link #APPLICATION_INVALID_STARTUP_ARGUMENT} - One of the specified - * startup arguments is invalid, for example its type is not permitted. - * </ul> - * - * @version $Id$ - */ -public class ApplicationException extends Exception { - private static final long serialVersionUID = -7173190453622508207L; - private final int errorCode; - - /** - * The application couldn't be launched because it is locked. - */ - public static final int APPLICATION_LOCKED = 0x01; - - /** - * The application is not in launchable state, it's - * {@link ApplicationDescriptor#APPLICATION_LAUNCHABLE} - * attribute is false. - */ - public static final int APPLICATION_NOT_LAUNCHABLE = 0x02; - - /** - * An exception was thrown by the application or the corresponding container - * during launch. The exception is available from {@code getCause()}. - */ - public static final int APPLICATION_INTERNAL_ERROR = 0x03; - - /** - * The application schedule could not be created due to some internal error - * (for example, the schedule information couldn't be saved due to some - * storage error). - */ - public static final int APPLICATION_SCHEDULING_FAILED = 0x04; - - /** - * The application scheduling failed because the specified identifier - * is already in use. - */ - public static final int APPLICATION_DUPLICATE_SCHEDULE_ID = 0x05; - - /** - * The exit value is not available for an application instance because the - * instance has not terminated. - * - * @since 1.1 - */ - public static final int APPLICATION_EXITVALUE_NOT_AVAILABLE = 0x06; - - /** - * One of the specified startup arguments is invalid, for example its - * type is not permitted. - * - * @since 1.1 - */ - public static final int APPLICATION_INVALID_STARTUP_ARGUMENT = 0x07; - - /** - * Creates an {@code ApplicationException} with the specified error code. - * @param errorCode The code of the error - */ - public ApplicationException(int errorCode) { - super(); - this.errorCode = errorCode; - } - - /** - * Creates a {@code ApplicationException} that wraps another exception. - * - * @param errorCode The code of the error - * @param cause The cause of this exception. - */ - public ApplicationException(int errorCode, Throwable cause) { - super(cause); - this.errorCode = errorCode; - } - - /** - * Creates an {@code ApplicationException} with the specified error code. - * @param errorCode The code of the error - * @param message The associated message - */ - public ApplicationException(int errorCode, String message) { - super(message); - this.errorCode = errorCode; - } - - /** - * Creates a {@code ApplicationException} that wraps another exception. - * - * @param errorCode The code of the error - * @param message The associated message. - * @param cause The cause of this exception. - */ - public ApplicationException(int errorCode, String message, Throwable cause) { - super(message, cause); - this.errorCode = errorCode; - } - - /** - * Returns the cause of this exception or {@code null} if no cause was - * set. - * - * @return The cause of this exception or {@code null} if no cause was - * set. - */ - public Throwable getCause() { - return super.getCause(); - } - - /** - * Returns the error code associated with this exception. - * - * @return The error code of this exception. - */ - public int getErrorCode() { - return errorCode; - } -} diff --git a/bundles/org.eclipse.equinox.app/src/org/osgi/service/application/ApplicationHandle.java b/bundles/org.eclipse.equinox.app/src/org/osgi/service/application/ApplicationHandle.java deleted file mode 100644 index 1ea1f698e..000000000 --- a/bundles/org.eclipse.equinox.app/src/org/osgi/service/application/ApplicationHandle.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Copyright (c) OSGi Alliance (2004, 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.application; - -import org.osgi.framework.Constants; - -/** - * ApplicationHandle is an OSGi service interface which represents an instance - * of an application. It provides the functionality to query and manipulate the - * lifecycle state of the represented application instance. It defines constants - * for the lifecycle states. - * - * @version $Revision: 1.6 $ - */ -public abstract class ApplicationHandle { - /* - * NOTE: An implementor may also choose to replace this class in - * their distribution with a class that directly interfaces with the - * org.osgi.service.application implementation. This replacement class MUST NOT alter the - * public/protected signature of this class. - */ - - /** - * The property key for the unique identifier (PID) of the application - * instance. - */ - public static final String APPLICATION_PID = Constants.SERVICE_PID; - - /** - * The property key for the pid of the corresponding application descriptor. - */ - public final static String APPLICATION_DESCRIPTOR = "application.descriptor"; - - /** - * The property key for the state of this application instance. - */ - public final static String APPLICATION_STATE = "application.state"; - - /** - * The property key for the supports exit value property of this application - * instance. - * - * @since 1.1 - */ - public final static String APPLICATION_SUPPORTS_EXITVALUE = "application.supports.exitvalue"; - - /** - * The application instance is running. This is the initial state of a newly - * created application instance. - */ - public final static String RUNNING = "RUNNING"; - - /** - * The application instance is being stopped. This is the state of the - * application instance during the execution of the {@code destroy()} - * method. - */ - public final static String STOPPING = "STOPPING"; - - private final String instanceId; - - private final ApplicationDescriptor descriptor; - - /** - * Application instance identifier is specified by the container when the - * instance is created. The instance identifier must remain static for the - * lifetime of the instance, it must remain the same even across framework - * restarts for the same application instance. This value must be the same - * as the {@code service.pid} service property of this application - * handle. - * <p> - * The instance identifier should follow the following scheme: - * <<i>application descriptor PID</i>>.<<i>index</i>> - * where <<i>application descriptor PID</i>> is the PID of the - * corresponding {@code ApplicationDescriptor} and <<i>index</i>> - * is a unique integer index assigned by the application container. - * Even after destroying the application index the same index value should not - * be reused in a reasonably long timeframe. - * - * @param instanceId the instance identifier of the represented application - * instance. It must not be null. - * - * @param descriptor the {@code ApplicationDescriptor} of the represented - * application instance. It must not be null. - * - * @throws NullPointerException if any of the arguments is null. - */ - protected ApplicationHandle(String instanceId, ApplicationDescriptor descriptor) { - if ((null == instanceId) || (null == descriptor)) { - throw new NullPointerException("Parameters must not be null!"); - } - - this.instanceId = instanceId; - this.descriptor = descriptor; - } - - /** - * Retrieves the {@code ApplicationDescriptor} to which this - * {@code ApplicationHandle} belongs. - * - * @return The corresponding {@code ApplicationDescriptor} - */ - public final ApplicationDescriptor getApplicationDescriptor() { - return descriptor; - } - - /** - * Get the state of the application instance. - * - * @return the state of the application. - * - * @throws IllegalStateException - * if the application handle is unregistered - */ - public abstract String getState(); - - /** - * Returns the exit value for the application instance. The timeout - * specifies how the method behaves when the application has not yet - * terminated. A negative, zero or positive value may be used. - * <ul> - * <li> negative - The method does not wait for termination. If the - * application has not terminated then an {@code ApplicationException} - * is thrown.</li> - * - * <li> zero - The method waits until the application terminates.</li> - * - * <li> positive - The method waits until the application terminates or the - * timeout expires. If the timeout expires and the application has not - * terminated then an {@code ApplicationException} is thrown.</li> - * </ul> - * <p> - * The default implementation throws an - * {@code UnsupportedOperationException}. The application model should - * override this method if exit values are supported. - * </p> - * - * @param timeout The maximum time in milliseconds to wait for the - * application to timeout. - * @return The exit value for the application instance. The value is - * application specific. - * @throws UnsupportedOperationException If the application model does not - * support exit values. - * @throws InterruptedException If the thread is interrupted while waiting - * for the timeout. - * @throws ApplicationException If the application has not terminated. The - * error code will be - * {@link ApplicationException#APPLICATION_EXITVALUE_NOT_AVAILABLE}. - * - * @since 1.1 - */ - public Object getExitValue(long timeout) throws ApplicationException, InterruptedException { - throw new UnsupportedOperationException(); - } - - /** - * Returns the unique identifier of this instance. This value is also - * available as a service property of this application handle's service.pid. - * - * @return the unique identifier of the instance - */ - public final String getInstanceId() { - return instanceId; - } - - /** - * The application instance's lifecycle state can be influenced by this - * method. It lets the application instance perform operations to stop - * the application safely, e.g. saving its state to a permanent storage. - * <p> - * The method must check if the lifecycle transition is valid; a STOPPING - * application cannot be stopped. If it is invalid then the method must - * exit. Otherwise the lifecycle state of the application instance must be - * set to STOPPING. Then the destroySpecific() method must be called to - * perform any application model specific steps for safe stopping of the - * represented application instance. - * <p> - * At the end the {@code ApplicationHandle} must be unregistered. - * This method should free all the resources related to this - * {@code ApplicationHandle}. - * <p> - * When this method is completed the application instance has already made - * its operations for safe stopping, the ApplicationHandle has been - * unregistered and its related resources has been freed. Further calls on - * this application should not be made because they may have unexpected - * results. - * - * @throws SecurityException - * if the caller doesn't have "lifecycle" - * {@code ApplicationAdminPermission} for the corresponding application. - * - * @throws IllegalStateException - * if the application handle is unregistered - */ - public final void destroy() { - if (STOPPING.equals(getState())) - return; - SecurityManager sm = System.getSecurityManager(); - if (sm != null) - sm.checkPermission(new ApplicationAdminPermission(getApplicationDescriptor(), ApplicationAdminPermission.LIFECYCLE_ACTION)); - destroySpecific(); - } - - /** - * Called by the destroy() method to perform application model specific - * steps to stop and destroy an application instance safely. - * - * @throws IllegalStateException - * if the application handle is unregistered - */ - protected abstract void destroySpecific(); - -} diff --git a/bundles/org.eclipse.equinox.app/src/org/osgi/service/application/ScheduledApplication.java b/bundles/org.eclipse.equinox.app/src/org/osgi/service/application/ScheduledApplication.java deleted file mode 100644 index f3385ad4c..000000000 --- a/bundles/org.eclipse.equinox.app/src/org/osgi/service/application/ScheduledApplication.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright (c) OSGi Alliance (2004, 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.application; - -import java.util.Map; - -/** - * It is allowed to schedule an application based on a specific event. - * ScheduledApplication service keeps the schedule information. When the - * specified event is fired a new instance must be launched. Note that launching - * operation may fail because e.g. the application is locked. - * <p> - * Each {@code ScheduledApplication} instance has an identifier which is - * unique within the scope of the application being scheduled. - * <p> - * {@code ScheduledApplication} instances are registered as services. The - * {@link #APPLICATION_PID} service property contains the PID of the application - * being scheduled, the {@link #SCHEDULE_ID} service property contains the - * schedule identifier. - * - * @version $Id$ - */ -public interface ScheduledApplication { - - /** - * The property key for the identifier of the application being scheduled. - */ - public static final String APPLICATION_PID = ApplicationDescriptor.APPLICATION_PID; - - /** - * The property key for the schedule identifier. The identifier is unique - * within the scope of the application being scheduled. - */ - public static final String SCHEDULE_ID = "schedule.id"; - - /** - * The key for the startup argument used to pass the event object that - * triggered the schedule to launch the application instance. - * The event is passed in a {@link java.security.GuardedObject} - * protected by the corresponding - * {@link org.osgi.service.event.TopicPermission}. - */ - public static final String TRIGGERING_EVENT = "org.osgi.triggeringevent"; - - /** - * The topic name for the virtual timer topic. Time based schedules - * should be created using this topic. - */ - public static final String TIMER_TOPIC = "org/osgi/application/timer"; - - /** - * The name of the <i>year</i> attribute of a virtual timer event. The value is - * defined by {@link java.util.Calendar#YEAR}. - */ - public static final String YEAR = "year"; - - /** - * The name of the <i>month</i> attribute of a virtual timer event. The value is - * defined by {@link java.util.Calendar#MONTH}. - */ - public static final String MONTH = "month"; - - /** - * The name of the <i>day of month</i> attribute of a virtual timer event. The value is - * defined by {@link java.util.Calendar#DAY_OF_MONTH}. - */ - public static final String DAY_OF_MONTH = "day_of_month"; - - /** - * The name of the <i>day of week</i> attribute of a virtual timer event. The value is - * defined by {@link java.util.Calendar#DAY_OF_WEEK}. - */ - public static final String DAY_OF_WEEK = "day_of_week"; - - /** - * The name of the <i>hour of day</i> attribute of a virtual timer event. The value is - * defined by {@link java.util.Calendar#HOUR_OF_DAY}. - */ - public static final String HOUR_OF_DAY = "hour_of_day"; - - /** - * The name of the <i>minute</i> attribute of a virtual timer event. The value is - * defined by {@link java.util.Calendar#MINUTE}. - */ - public static final String MINUTE = "minute"; - - - /** - * Returns the identifier of this schedule. The identifier is unique within - * the scope of the application that the schedule is related to. - * @return the identifier of this schedule - * - */ - public String getScheduleId(); - - /** - * Queries the topic of the triggering event. The topic may contain a - * trailing asterisk as wildcard. - * - * @return the topic of the triggering event - * - * @throws IllegalStateException - * if the scheduled application service is unregistered - */ - public String getTopic(); - - /** - * Queries the event filter for the triggering event. - * - * @return the event filter for triggering event - * - * @throws IllegalStateException - * if the scheduled application service is unregistered - */ - public String getEventFilter(); - - /** - * Queries if the schedule is recurring. - * - * @return true if the schedule is recurring, otherwise returns false - * - * @throws IllegalStateException - * if the scheduled application service is unregistered - */ - public boolean isRecurring(); - - /** - * Retrieves the ApplicationDescriptor which represents the application and - * necessary for launching. - * - * @return the application descriptor that - * represents the scheduled application - * - * @throws IllegalStateException - * if the scheduled application service is unregistered - */ - public ApplicationDescriptor getApplicationDescriptor(); - - /** - * Queries the startup arguments specified when the application was - * scheduled. The method returns a copy of the arguments, it is not possible - * to modify the arguments after scheduling. - * - * @return the startup arguments of the scheduled application. It may be - * null if null argument was specified. - * - * @throws IllegalStateException - * if the scheduled application service is unregistered - */ - public Map getArguments(); - - /** - * Cancels this schedule of the application. - * - * @throws SecurityException - * if the caller doesn't have "schedule" - * ApplicationAdminPermission for the scheduled application. - * @throws IllegalStateException - * if the scheduled application service is unregistered - */ - public void remove(); -} |