Example #1
0
/**
 * OSGi Subsystem constants
 *
 * @author [email protected]
 */
public interface OSGiConstants {

  /** Service base name for all OSGi subsystem services. */
  ServiceName SERVICE_BASE_NAME = ServiceName.JBOSS.append("osgi", "as");

  /** Attachment key for the {@link BundleInfo} when an OSGi bundle deployment is detected. */
  AttachmentKey<BundleInfo> BUNDLE_INFO_KEY = AttachmentKey.create(BundleInfo.class);

  /** Attachment key for the installed {@link XBundleRevision}. */
  AttachmentKey<XBundleRevision> BUNDLE_REVISION_KEY = AttachmentKey.create(XBundleRevision.class);

  /** Attachment key for the {@link BundleManager}. */
  AttachmentKey<BundleManager> BUNDLE_MANAGER_KEY = AttachmentKey.create(BundleManager.class);

  /** Attachment key for a bundle deployment. */
  AttachmentKey<Deployment> DEPLOYMENT_KEY = AttachmentKey.create(Deployment.class);

  /** Attachment key for the {@link XEnvironment}. */
  AttachmentKey<XEnvironment> ENVIRONMENT_KEY = AttachmentKey.create(XEnvironment.class);

  /** Attachment key for {@link OSGiMetaData} */
  AttachmentKey<OSGiMetaData> OSGI_METADATA_KEY = AttachmentKey.create(OSGiMetaData.class);

  /** Attachment key for the {@link XResolver}. */
  AttachmentKey<XResolver> RESOLVER_KEY = AttachmentKey.create(XResolver.class);

  /** Attachment key for the OSGi system context. */
  AttachmentKey<BundleContext> SYSTEM_CONTEXT_KEY = AttachmentKey.create(BundleContext.class);

  /** The {@link org.jboss.osgi.repository.XRepository} service */
  ServiceName REPOSITORY_SERVICE_NAME = SERVICE_BASE_NAME.append("repository");

  /** The {@link org.jboss.as.osgi.parser.SubsystemState} service */
  ServiceName SUBSYSTEM_STATE_SERVICE_NAME = SERVICE_BASE_NAME.append("subsystemstate");
}
/**
 * Service responsible for creating and managing the life-cycle of the OSGi Framework.
 *
 * @author [email protected]
 * @author David Bosschaert
 * @since 11-Sep-2010
 */
public class FrameworkBootstrapService implements Service<Void> {

  static final ServiceName SERVICE_NAME = SERVICE_BASE_NAME.append("framework", "bootstrap");
  static final String MAPPED_OSGI_SOCKET_BINDINGS = "org.jboss.as.osgi.socket.bindings";

  private final InjectedValue<ServerEnvironment> injectedServerEnvironment =
      new InjectedValue<ServerEnvironment>();
  private final InjectedValue<SubsystemState> injectedSubsystemState =
      new InjectedValue<SubsystemState>();
  private final InitialDeploymentTracker deploymentTracker;
  private final ServiceVerificationHandler verificationHandler;
  private final List<SubsystemExtension> extensions;
  private final OSGiRuntimeResource resource;

  public static ServiceController<Void> addService(
      ServiceTarget target,
      OSGiRuntimeResource resource,
      InitialDeploymentTracker deploymentTracker,
      List<SubsystemExtension> extensions,
      ServiceVerificationHandler verificationHandler) {
    FrameworkBootstrapService service =
        new FrameworkBootstrapService(resource, deploymentTracker, extensions, verificationHandler);
    ServiceBuilder<Void> builder =
        target.addService(FrameworkBootstrapService.SERVICE_NAME, service);
    builder.addDependency(
        ServerEnvironmentService.SERVICE_NAME,
        ServerEnvironment.class,
        service.injectedServerEnvironment);
    builder.addDependency(
        OSGiConstants.SUBSYSTEM_STATE_SERVICE_NAME,
        SubsystemState.class,
        service.injectedSubsystemState);
    builder.addListener(verificationHandler);
    return builder.install();
  }

  private FrameworkBootstrapService(
      OSGiRuntimeResource resource,
      InitialDeploymentTracker deploymentTracker,
      List<SubsystemExtension> extensions,
      ServiceVerificationHandler verificationHandler) {
    this.verificationHandler = verificationHandler;
    this.deploymentTracker = deploymentTracker;
    this.extensions = extensions;
    this.resource = resource;
  }

  @Override
  public synchronized void start(StartContext context) throws StartException {
    ServiceController<?> controller = context.getController();
    LOGGER.tracef("Starting: %s in mode %s", controller.getName(), controller.getMode());
    try {
      ServiceContainer serviceContainer = context.getController().getServiceContainer();

      // Setup the OSGi {@link Framework} properties
      SubsystemState subsystemState = injectedSubsystemState.getValue();
      Map<String, Object> props = new HashMap<String, Object>(subsystemState.getProperties());
      setupIntegrationProperties(context, props);

      // Register the URLStreamHandlerFactory
      Module coreFrameworkModule =
          ((ModuleClassLoader) FrameworkBuilder.class.getClassLoader()).getModule();
      Module.registerURLStreamHandlerFactoryModule(coreFrameworkModule);
      Module.registerContentHandlerFactoryModule(coreFrameworkModule);

      ServiceTarget serviceTarget = context.getChildTarget();
      JAXPServiceProvider.addService(serviceTarget);
      ResolverService.addService(serviceTarget);
      RepositoryService.addService(serviceTarget);

      Activation activation = subsystemState.getActivationPolicy();
      Mode initialMode = (activation == Activation.EAGER ? Mode.ACTIVE : Mode.LAZY);

      // Configure the {@link Framework} builder
      FrameworkBuilder builder = FrameworkBuilderFactory.create(props, initialMode);
      builder.setServiceContainer(serviceContainer);
      builder.setServiceTarget(serviceTarget);

      builder.createFrameworkServices(serviceContainer, true);
      builder.registerIntegrationService(FrameworkPhase.CREATE, new BundleLifecycleIntegration());
      builder.registerIntegrationService(
          FrameworkPhase.CREATE, new FrameworkModuleIntegration(props));
      builder.registerIntegrationService(FrameworkPhase.CREATE, new ModuleLoaderIntegration());
      builder.registerIntegrationService(
          FrameworkPhase.CREATE, new SystemServicesIntegration(resource, extensions));
      builder.registerIntegrationService(FrameworkPhase.INIT, new BootstrapBundlesIntegration());
      builder.registerIntegrationService(
          FrameworkPhase.INIT, new PersistentBundlesIntegration(deploymentTracker));

      // Install the services to create the framework
      builder.installServices(FrameworkPhase.CREATE, serviceTarget, verificationHandler);

      if (activation == Activation.EAGER) {
        builder.installServices(FrameworkPhase.INIT, serviceTarget, verificationHandler);
        builder.installServices(FrameworkPhase.ACTIVE, serviceTarget, verificationHandler);
      }

      // Create the framework activator
      FrameworkActivator.create(builder);

    } catch (Throwable th) {
      throw MESSAGES.startFailedToCreateFrameworkServices(th);
    }
  }

  @Override
  public synchronized void stop(StopContext context) {
    ServiceController<?> controller = context.getController();
    LOGGER.tracef("Stopping: %s in mode %s", controller.getName(), controller.getMode());
  }

  @Override
  public Void getValue() throws IllegalStateException {
    return null;
  }

  private void setupIntegrationProperties(StartContext context, Map<String, Object> props) {

    // Setup the Framework's storage area.
    String storage = (String) props.get(Constants.FRAMEWORK_STORAGE);
    if (storage == null) {
      ServerEnvironment environment = injectedServerEnvironment.getValue();
      File dataDir = environment.getServerDataDir();
      storage = dataDir.getAbsolutePath() + File.separator + "osgi-store";
      props.put(Constants.FRAMEWORK_STORAGE, storage);
    }

    // Provide the ModuleLogger
    ModuleLogger moduleLogger = Module.getModuleLogger();
    if (moduleLogger != null)
      props.put(ModuleLogger.class.getName(), moduleLogger.getClass().getName());

    // Setup default system modules
    String sysmodules = (String) props.get(PROP_JBOSS_OSGI_SYSTEM_MODULES);
    if (sysmodules == null) {
      Set<String> sysModules = new LinkedHashSet<String>();
      sysModules.addAll(Arrays.asList(SystemPackagesIntegration.DEFAULT_SYSTEM_MODULES));
      sysmodules = sysModules.toString();
      sysmodules = sysmodules.substring(1, sysmodules.length() - 1);
      props.put(PROP_JBOSS_OSGI_SYSTEM_MODULES, sysmodules);
    }

    // Setup default system packages
    String syspackages =
        (String) getPropertyWithSystemFallback(props, Constants.FRAMEWORK_SYSTEMPACKAGES);
    if (syspackages == null) {
      Set<String> sysPackages = new LinkedHashSet<String>();
      sysPackages.addAll(Arrays.asList(SystemPackagesIntegration.JAVAX_API_PACKAGES));
      sysPackages.addAll(Arrays.asList(SystemPaths.DEFAULT_FRAMEWORK_PACKAGES));
      sysPackages.addAll(Arrays.asList(SystemPackagesIntegration.DEFAULT_INTEGRATION_PACKAGES));
      syspackages = sysPackages.toString();
      syspackages = syspackages.substring(1, syspackages.length() - 1);
      props.put(Constants.FRAMEWORK_SYSTEMPACKAGES, syspackages);
    }

    String extrapackages =
        (String) getPropertyWithSystemFallback(props, Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA);
    if (extrapackages != null) {
      props.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, extrapackages);
    }
  }

  // [TODO] Remove this hack when the TCK setup can configure the subsystem properly
  Object getPropertyWithSystemFallback(Map<String, Object> props, String key) {
    Object value = props.get(key);
    if (value == null) {
      value = SecurityActions.getSystemProperty(key);
    }
    return value;
  }
}