/** * 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; } }