123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- /*=============================================================================
- Library: CTK
- Copyright (c) 2010 German Cancer Research Center,
- Division of Medical and Biological Informatics
- 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.
- =============================================================================*/
- #ifndef CTKCONFIGURATIONADMIN_H
- #define CTKCONFIGURATIONADMIN_H
- #include "ctkConfiguration.h"
- /**
- * \ingroup ConfigAdmin
- * Service for administering configuration data.
- *
- * <p>
- * The main purpose of this interface is to store plugin configuration data
- * persistently. This information is represented in <code>ctkConfiguration</code>
- * objects. The actual configuration data is a <code>Dictionary</code> of
- * properties inside a <code>ctkConfiguration</code> object.
- *
- * <p>
- * There are two principally different ways to manage configurations. First
- * there is the concept of a Managed Service, where configuration data is
- * uniquely associated with an object registered with the service registry.
- *
- * <p>
- * Next, there is the concept of a factory where the Configuration Admin service
- * will maintain 0 or more <code>ctkConfiguration</code> objects for a Managed
- * Service Factory that is registered with the Framework.
- *
- * <p>
- * The first concept is intended for configuration data about "things/services"
- * whose existence is defined externally, e.g. a specific printer. Factories are
- * intended for "things/services" that can be created any number of times, e.g.
- * a configuration for a DHCP server for different networks.
- *
- * <p>
- * Plugins that require configuration should register a Managed Service or a
- * Managed Service Factory in the service registry. A registration property
- * named <code>service.pid</code> (persistent identifier or PID) must be used to
- * identify this Managed Service or Managed Service Factory to the Configuration
- * Admin service.
- *
- * <p>
- * When the ConfigurationAdmin detects the registration of a Managed Service, it
- * checks its persistent storage for a configuration object whose
- * <code>service.pid</code> property matches the PID service property (
- * <code>service.pid</code>) of the Managed Service. If found, it calls
- * {@link ctkManagedService#updated} method with the new properties. The
- * implementation of a Configuration Admin service must run these call-backs
- * asynchronously to allow proper synchronization.
- *
- * <p>
- * When the Configuration Admin service detects a Managed Service Factory
- * registration, it checks its storage for configuration objects whose
- * <code>service.factoryPid</code> property matches the PID service property of
- * the Managed Service Factory. For each such <code>ctkConfiguration</code>
- * objects, it calls the <code>ctkManagedServiceFactory#updated</code> method
- * asynchronously with the new properties. The calls to the <code>updated</code>
- * method of a <code>ctkManagedServiceFactory</code> must be executed sequentially
- * and not overlap in time.
- *
- * <p>
- * In general, plugins having permission to use the Configuration Admin service
- * can only access and modify their own configuration information. Accessing or
- * modifying the configuration of another bundle requires
- * <code>ctkConfigurationPermission[*,CONFIGURE]</code>.
- *
- * <p>
- * <code>ctkConfiguration</code> objects can be <i>bound </i> to a specified plugin
- * location. In this case, if a matching Managed Service or Managed Service
- * Factory is registered by a plugin with a different location, then the
- * Configuration Admin service must not do the normal callback, and it should
- * log an error. In the case where a <code>ctkConfiguration</code> object is not
- * bound, its location field is <code>null</code>, the Configuration Admin
- * service will bind it to the location of the plugin that registers the first
- * Managed Service or Managed Service Factory that has a corresponding PID
- * property. When a <code>ctkConfiguration</code> object is bound to a plugin
- * location in this manner, the Configuration Admin service must detect if the
- * plugin corresponding to the location is uninstalled. If this occurs, the
- * <code>ctkConfiguration</code> object is unbound, that is its location field is
- * set back to <code>null</code>.
- *
- * <p>
- * The method descriptions of this class refer to a concept of "the calling
- * plugin". This is a loose way of referring to the plugin which obtained the
- * Configuration Admin service from the service registry. Implementations of
- * <code>ctkConfigurationAdmin</code> must use a
- * {@link ctkServiceFactory} to support this concept.
- *
- */
- struct CTK_PLUGINFW_EXPORT ctkConfigurationAdmin
- {
- /**
- * Configuration property naming the Factory PID in the configuration
- * dictionary. The property's value is of type <code>QString</code>.
- */
- static const QString SERVICE_FACTORYPID; // = "service.factoryPid";
- /**
- * Configuration property naming the location of the plugin that is
- * associated with a a <code>ctkConfiguration</code> object. This property can
- * be searched for but must not appear in the configuration dictionary for
- * security reason. The property's value is of type <code>QString</code>.
- */
- static const QString SERVICE_PLUGINLOCATION; // = "service.pluginLocation";
- /**
- * Create a new factory <code>ctkConfiguration</code> object with a new PID.
- *
- * The properties of the new <code>ctkConfiguration</code> object are
- * <code>null</code> until the first time that its
- * {@link ctkConfiguration#update(const ctkDictionary&)} method is called.
- *
- * <p>
- * It is not required that the <code>factoryPid</code> maps to a
- * registered Managed Service Factory.
- * <p>
- * The <code>ctkConfiguration</code> object is bound to the location of the
- * calling plugin.
- *
- * @param factoryPid PID of factory (not <code>null</code>).
- * @return A new <code>ctkConfiguration</code> object.
- * @throws ctkIOException if access to persistent storage fails.
- * @throws ctkSecurityException if caller does not have
- * <code>ctkConfigurationPermission[*,CONFIGURE]</code> and
- * <code>factoryPid</code> is bound to another plugin.
- */
- virtual ctkConfigurationPtr createFactoryConfiguration(const QString& factoryPid) = 0;
- /**
- * Create a new factory <code>ctkConfiguration</code> object with a new PID.
- *
- * The properties of the new <code>ctkConfiguration</code> object are
- * <code>null</code> until the first time that its
- * {@link ctkConfiguration#update(Dictionary)} method is called.
- *
- * <p>
- * It is not required that the <code>factoryPid</code> maps to a
- * registered Managed Service Factory.
- *
- * <p>
- * The <code>ctkConfiguration</code> is bound to the location specified. If
- * this location is <code>null</code> it will be bound to the location of
- * the first plugin that registers a Managed Service Factory with a
- * corresponding PID.
- *
- * @param factoryPid PID of factory (not <code>null</code>).
- * @param location A plugin location string, or <code>null</code>.
- * @return a new <code>ctkConfiguration</code> object.
- * @throws ctkIOException if access to persistent storage fails.
- * @throws ctkSecurityException if caller does not have <code>ctkConfigurationPermission[*,CONFIGURE]</code>.
- */
- virtual ctkConfigurationPtr createFactoryConfiguration(const QString& factoryPid, const QString& location) = 0;
- /**
- * Get an existing <code>ctkConfiguration</code> object from the persistent
- * store, or create a new <code>ctkConfiguration</code> object.
- *
- * <p>
- * If a <code>ctkConfiguration</code> with this PID already exists in
- * Configuration Admin service return it. The location parameter is ignored
- * in this case.
- *
- * <p>
- * Else, return a new <code>ctkConfiguration</code> object. This new object
- * is bound to the location and the properties are set to <code>null</code>.
- * If the location parameter is <code>null</code>, it will be set when a
- * Managed Service with the corresponding PID is registered for the first
- * time.
- *
- * @param pid Persistent identifier.
- * @param location The plugin location string, or <code>null</code>.
- * @return An existing or new <code>ctkConfiguration</code> object.
- * @throws ctkIOException if access to persistent storage fails.
- * @throws ctkSecurityException if the caller does not have <code>ctkConfigurationPermission[*,CONFIGURE]</code>.
- */
- virtual ctkConfigurationPtr getConfiguration(const QString& pid, const QString& location) = 0;
- /**
- * Get an existing or new <code>ctkConfiguration</code> object from the
- * persistent store.
- *
- * If the <code>ctkConfiguration</code> object for this PID does not exist,
- * create a new <code>ctkConfiguration</code> object for that PID, where
- * properties are <code>null</code>. Bind its location to the calling
- * plugin's location.
- *
- * <p>
- * Otherwise, if the location of the existing <code>ctkConfiguration</code> object
- * is <code>null</code>, set it to the calling plugin's location.
- *
- * @param pid persistent identifier.
- * @return an existing or new <code>ctkConfiguration</code> matching the PID.
- * @throws ctkIOException if access to persistent storage fails.
- * @throws ctkSecurityException if the <code>ctkConfiguration</code> object is
- * bound to a location different from that of the calling plugin and it
- * has no <code>ctkConfigurationPermission[*,CONFIGURE]</code>.
- */
- virtual ctkConfigurationPtr getConfiguration(const QString& pid) = 0;
- /**
- * List the current <code>ctkConfiguration</code> objects which match the
- * filter.
- *
- * <p>
- * Only <code>ctkConfiguration</code> objects with non- <code>null</code>
- * properties are considered current. That is,
- * <code>ctkConfiguration#getProperties()</code> is guaranteed not to return
- * an empty list for each of the returned <code>ctkConfiguration</code>
- * objects.
- *
- * <p>
- * Normally only <code>ctkConfiguration</code> objects that are bound to the
- * location of the calling plugin are returned, or all if the caller has
- * <code>ctkConfigurationPermission[*,CONFIGURE]</code>.
- *
- * <p>
- * The syntax of the filter string is as defined in the
- * {@link ctkLDAPSearchFilter} class. The filter can test any
- * configuration properties including the following:
- * <ul>
- * <li><code>service.pid</code>-<code>QString</code>- the PID under which
- * this is registered</li>
- * <li><code>service.factoryPid</code>-<code>QString</code>- the factory if
- * applicable</li>
- * <li><code>service.pluginLocation</code>-<code>QString</code>- the plugin
- * location</li>
- * </ul>
- * The filter can also be empty, meaning that all
- * <code>ctkConfiguration</code> objects should be returned.
- *
- * @param filter A filter string, or an empty string to retrieve all
- * <code>ctkConfiguration</code> objects.
- * @return All matching <code>ctkConfiguration</code> objects, or
- * an empty list if there aren't any.
- * @throws ctkIOException if access to persistent storage fails
- * @throws std::invalid_argument if the filter string is invalid
- */
- virtual QList<ctkConfigurationPtr> listConfigurations(const QString& filter = QString()) = 0;
- };
- Q_DECLARE_INTERFACE(ctkConfigurationAdmin, "org.commontk.service.cm.ConfigurationAdmin")
- #endif // CTKCONFIGURATIONADMIN_H
|