Search in sources :

Example 26 with BundleException

use of org.osgi.framework.BundleException in project aries by apache.

the class ApplicationContextImpl method start.

public synchronized void start() throws BundleException, IllegalStateException {
    LOGGER.debug(LOG_ENTRY, "start");
    if (!(_state == ApplicationState.INSTALLED || _state == ApplicationState.RESOLVED))
        throw new IllegalStateException("Appication is in incorrect state " + _state + " expected " + ApplicationState.INSTALLED + " or " + ApplicationState.RESOLVED);
    List<Bundle> bundlesWeStarted = new ArrayList<Bundle>();
    try {
        for (Bundle b : _bundles) {
            _bundleFrameworkManager.startBundle(b);
            bundlesWeStarted.add(b);
        }
    } catch (BundleException be) {
        for (Bundle b : bundlesWeStarted) {
            try {
                _bundleFrameworkManager.stopBundle(b);
            } catch (BundleException be2) {
                // we are doing tidyup here, so we don't want to replace the bundle exception
                // that occurred during start with one from stop. We also want to try to stop
                // all the bundles we started even if some bundles wouldn't stop.
                LOGGER.debug(LOG_EXCEPTION, be2);
            }
        }
        LOGGER.debug(LOG_EXCEPTION, be);
        LOGGER.debug(LOG_EXIT, "start", new Object[] { be });
        throw be;
    }
    _state = ApplicationState.ACTIVE;
    LOGGER.debug(LOG_EXIT, "start");
}
Also used : Bundle(org.osgi.framework.Bundle) ArrayList(java.util.ArrayList) BundleException(org.osgi.framework.BundleException)

Example 27 with BundleException

use of org.osgi.framework.BundleException in project aries by apache.

the class ApplicationContextImpl method update.

public synchronized void update(final DeploymentMetadata newMetadata, final DeploymentMetadata oldMetadata) throws UpdateException {
    final boolean toStart = getApplicationState() == ApplicationState.ACTIVE;
    if (_bundleFrameworkManager.allowsUpdate(newMetadata, oldMetadata)) {
        _bundleFrameworkManager.updateBundles(newMetadata, oldMetadata, _application, new BundleFrameworkManager.BundleLocator() {

            public Map<DeploymentContent, BundleSuggestion> suggestBundle(Collection<DeploymentContent> bundles) throws BundleException {
                return findBundleSuggestions(bundles);
            }
        }, _bundles, toStart);
    } else {
        // fallback do a uninstall, followed by a reinstall
        try {
            uninstall();
            _deploymentMF = newMetadata;
            try {
                install();
                if (toStart)
                    start();
            } catch (BundleException e) {
                try {
                    uninstall();
                    _deploymentMF = oldMetadata;
                    install();
                    if (toStart)
                        start();
                    throw new UpdateException("Could not install updated application", e, true, null);
                } catch (BundleException e2) {
                    throw new UpdateException("Could not install updated application", e, false, e2);
                }
            }
        } catch (BundleException e) {
            try {
                _deploymentMF = oldMetadata;
                install();
                if (toStart)
                    start();
                throw new UpdateException("Could not install updated application", e, true, null);
            } catch (BundleException e2) {
                throw new UpdateException("Could not install updated application", e, false, e2);
            }
        }
    }
}
Also used : BundleFrameworkManager(org.apache.aries.application.management.spi.framework.BundleFrameworkManager) BundleException(org.osgi.framework.BundleException) UpdateException(org.apache.aries.application.management.UpdateException) Map(java.util.Map) DeploymentContent(org.apache.aries.application.DeploymentContent)

Example 28 with BundleException

use of org.osgi.framework.BundleException in project aries by apache.

the class RootSubsystemTest method testUninstallRootRegionBundleWithNoBundleEventHook.

@Test
public void testUninstallRootRegionBundleWithNoBundleEventHook() throws Exception {
    // Install an extraneous bundle into the root region. The bundle will
    // be recorded in the root subsystem's persistent memory.
    Bundle bundleA = bundleContext.installBundle(new File(BUNDLE_A).toURI().toURL().toString());
    try {
        Bundle core = getSubsystemCoreBundle();
        // Stop the subsystems bundle in order to unregister the bundle
        // event hook.
        core.stop();
        // Uninstall the bundle so it won't be there on restart.
        bundleA.uninstall();
        try {
            // Start the subsystems bundle and ensure the root subsystem
            // recovers from the uninstalled bundle being in persistent
            // memory.
            core.start();
        } catch (BundleException e) {
            fail("Could not start subsystems bundle after uninstalling a root region bundle with no bundle event hook registered");
        }
    } finally {
        if (Bundle.UNINSTALLED != bundleA.getState())
            bundleA.uninstall();
    }
}
Also used : Bundle(org.osgi.framework.Bundle) BundleException(org.osgi.framework.BundleException) File(java.io.File) Test(org.junit.Test)

Example 29 with BundleException

use of org.osgi.framework.BundleException in project jackrabbit-oak by apache.

the class DocumentNodeStoreService method registerNodeStore.

private void registerNodeStore() throws IOException {
    String uri = PropertiesUtil.toString(prop(PROP_URI, FWK_PROP_URI), DEFAULT_URI);
    String db = PropertiesUtil.toString(prop(PROP_DB, FWK_PROP_DB), DEFAULT_DB);
    boolean soKeepAlive = PropertiesUtil.toBoolean(prop(PROP_SO_KEEP_ALIVE, FWK_PROP_SO_KEEP_ALIVE), DEFAULT_SO_KEEP_ALIVE);
    int cacheSize = toInteger(prop(PROP_CACHE), DEFAULT_CACHE);
    int nodeCachePercentage = toInteger(prop(PROP_NODE_CACHE_PERCENTAGE), DEFAULT_NODE_CACHE_PERCENTAGE);
    int prevDocCachePercentage = toInteger(prop(PROP_PREV_DOC_CACHE_PERCENTAGE), DEFAULT_NODE_CACHE_PERCENTAGE);
    int childrenCachePercentage = toInteger(prop(PROP_CHILDREN_CACHE_PERCENTAGE), DEFAULT_CHILDREN_CACHE_PERCENTAGE);
    int diffCachePercentage = toInteger(prop(PROP_DIFF_CACHE_PERCENTAGE), DEFAULT_DIFF_CACHE_PERCENTAGE);
    int blobCacheSize = toInteger(prop(PROP_BLOB_CACHE_SIZE), DEFAULT_BLOB_CACHE_SIZE);
    String persistentCache = getPath(PROP_PERSISTENT_CACHE, DEFAULT_PERSISTENT_CACHE);
    String journalCache = getPath(PROP_JOURNAL_CACHE, DEFAULT_JOURNAL_CACHE);
    int cacheSegmentCount = toInteger(prop(PROP_CACHE_SEGMENT_COUNT), DEFAULT_CACHE_SEGMENT_COUNT);
    int cacheStackMoveDistance = toInteger(prop(PROP_CACHE_STACK_MOVE_DISTANCE), DEFAULT_CACHE_STACK_MOVE_DISTANCE);
    boolean bundlingDisabled = toBoolean(prop(PROP_BUNDLING_DISABLED), DEFAULT_BUNDLING_DISABLED);
    boolean prefetchExternalChanges = toBoolean(prop(PROP_PREFETCH_EXTERNAL_CHANGES), false);
    int updateLimit = toInteger(prop(PROP_UPDATE_LIMIT), DocumentMK.UPDATE_LIMIT);
    DocumentMK.Builder mkBuilder = new DocumentMK.Builder().setStatisticsProvider(statisticsProvider).memoryCacheSize(cacheSize * MB).memoryCacheDistribution(nodeCachePercentage, prevDocCachePercentage, childrenCachePercentage, diffCachePercentage).setCacheSegmentCount(cacheSegmentCount).setCacheStackMoveDistance(cacheStackMoveDistance).setBundlingDisabled(bundlingDisabled).setJournalPropertyHandlerFactory(journalPropertyHandlerFactory).setLeaseCheck(!ClusterNodeInfo.DEFAULT_LEASE_CHECK_DISABLED).setLeaseFailureHandler(new LeaseFailureHandler() {

        @Override
        public void handleLeaseFailure() {
            try {
                // plan A: try stopping oak-core
                log.error("handleLeaseFailure: stopping oak-core...");
                Bundle bundle = context.getBundleContext().getBundle();
                bundle.stop(Bundle.STOP_TRANSIENT);
                log.error("handleLeaseFailure: stopped oak-core.");
            // plan A worked, perfect!
            } catch (BundleException e) {
                log.error("handleLeaseFailure: exception while stopping oak-core: " + e, e);
                // plan B: stop only DocumentNodeStoreService (to stop the background threads)
                log.error("handleLeaseFailure: stopping DocumentNodeStoreService...");
                context.disableComponent(DocumentNodeStoreService.class.getName());
                log.error("handleLeaseFailure: stopped DocumentNodeStoreService");
            // plan B succeeded.
            }
        }
    }).setPrefetchExternalChanges(prefetchExternalChanges).setUpdateLimit(updateLimit);
    if (!Strings.isNullOrEmpty(persistentCache)) {
        mkBuilder.setPersistentCache(persistentCache);
    }
    if (!Strings.isNullOrEmpty(journalCache)) {
        mkBuilder.setJournalCache(journalCache);
    }
    boolean wrappingCustomBlobStore = customBlobStore && blobStore instanceof BlobStoreWrapper;
    //Set blobstore before setting the DB
    if (customBlobStore && !wrappingCustomBlobStore) {
        checkNotNull(blobStore, "Use of custom BlobStore enabled via  [%s] but blobStore reference not " + "initialized", CUSTOM_BLOB_STORE);
        mkBuilder.setBlobStore(blobStore);
    }
    if (documentStoreType == DocumentStoreType.RDB) {
        checkNotNull(dataSource, "DataStore type set [%s] but DataSource reference not initialized", PROP_DS_TYPE);
        if (!customBlobStore) {
            checkNotNull(blobDataSource, "DataStore type set [%s] but BlobDataSource reference not initialized", PROP_DS_TYPE);
            mkBuilder.setRDBConnection(dataSource, blobDataSource);
            log.info("Connected to datasources {} {}", dataSource, blobDataSource);
        } else {
            if (blobDataSource != null && blobDataSource != dataSource) {
                log.info("Ignoring blobDataSource {} as custom blob store takes precedence.", blobDataSource);
            }
            mkBuilder.setRDBConnection(dataSource);
            log.info("Connected to datasource {}", dataSource);
        }
    } else {
        MongoClientURI mongoURI = new MongoClientURI(uri);
        if (log.isInfoEnabled()) {
            // Take care around not logging the uri directly as it
            // might contain passwords
            log.info("Starting DocumentNodeStore with host={}, db={}, cache size (MB)={}, persistentCache={}, " + "journalCache={}, blobCacheSize (MB)={}, maxReplicationLagInSecs={}", mongoURI.getHosts(), db, cacheSize, persistentCache, journalCache, blobCacheSize, maxReplicationLagInSecs);
            log.info("Mongo Connection details {}", MongoConnection.toString(mongoURI.getOptions()));
        }
        mkBuilder.setMaxReplicationLag(maxReplicationLagInSecs, TimeUnit.SECONDS);
        mkBuilder.setSocketKeepAlive(soKeepAlive);
        mkBuilder.setMongoDB(uri, db, blobCacheSize);
        log.info("Connected to database '{}'", db);
    }
    if (!customBlobStore) {
        defaultBlobStore = mkBuilder.getBlobStore();
        log.info("Registering the BlobStore with ServiceRegistry");
        blobStoreReg = context.getBundleContext().registerService(BlobStore.class.getName(), defaultBlobStore, null);
    }
    //Set wrapping blob store after setting the DB
    if (wrappingCustomBlobStore) {
        ((BlobStoreWrapper) blobStore).setBlobStore(mkBuilder.getBlobStore());
        mkBuilder.setBlobStore(blobStore);
    }
    mkBuilder.setExecutor(executor);
    // attach GCMonitor
    final GCMonitorTracker gcMonitor = new GCMonitorTracker();
    gcMonitor.start(whiteboard);
    closer.register(asCloseable(gcMonitor));
    mkBuilder.setGCMonitor(gcMonitor);
    nodeStore = mkBuilder.getNodeStore();
    // ensure a clusterId is initialized 
    // and expose it as 'oak.clusterid' repository descriptor
    GenericDescriptors clusterIdDesc = new GenericDescriptors();
    clusterIdDesc.put(ClusterRepositoryInfo.OAK_CLUSTERID_REPOSITORY_DESCRIPTOR_KEY, new SimpleValueFactory().createValue(ClusterRepositoryInfo.getOrCreateId(nodeStore)), true, false);
    whiteboard.register(Descriptors.class, clusterIdDesc, Collections.emptyMap());
    // If a shared data store register the repo id in the data store
    if (SharedDataStoreUtils.isShared(blobStore)) {
        String repoId = null;
        try {
            repoId = ClusterRepositoryInfo.getOrCreateId(nodeStore);
            ((SharedDataStore) blobStore).addMetadataRecord(new ByteArrayInputStream(new byte[0]), SharedDataStoreUtils.SharedStoreRecordType.REPOSITORY.getNameFromId(repoId));
        } catch (Exception e) {
            throw new IOException("Could not register a unique repositoryId", e);
        }
        if (blobStore instanceof BlobTrackingStore) {
            final long trackSnapshotInterval = toLong(prop(PROP_BLOB_SNAPSHOT_INTERVAL), DEFAULT_BLOB_SNAPSHOT_INTERVAL);
            String root = getRepositoryHome();
            BlobTrackingStore trackingStore = (BlobTrackingStore) blobStore;
            if (trackingStore.getTracker() != null) {
                trackingStore.getTracker().close();
            }
            ((BlobTrackingStore) blobStore).addTracker(new BlobIdTracker(root, repoId, trackSnapshotInterval, (SharedDataStore) blobStore));
        }
    }
    registerJMXBeans(nodeStore, mkBuilder);
    registerLastRevRecoveryJob(nodeStore);
    registerJournalGC(nodeStore);
    if (!isNodeStoreProvider()) {
        observerTracker = new ObserverTracker(nodeStore);
        observerTracker.start(context.getBundleContext());
    }
    journalPropertyHandlerFactory.start(whiteboard);
    DocumentStore ds = nodeStore.getDocumentStore();
    // OAK-2682: time difference detection applied at startup with a default
    // max time diff of 2000 millis (2sec)
    final long maxDiff = Long.parseLong(System.getProperty("oak.documentMK.maxServerTimeDiffMillis", "2000"));
    try {
        if (maxDiff >= 0) {
            final long timeDiff = ds.determineServerTimeDifferenceMillis();
            log.info("registerNodeStore: server time difference: {}ms (max allowed: {}ms)", timeDiff, maxDiff);
            if (Math.abs(timeDiff) > maxDiff) {
                throw new AssertionError("Server clock seems off (" + timeDiff + "ms) by more than configured amount (" + maxDiff + "ms)");
            }
        }
    } catch (RuntimeException e) {
        // no checked exception
        // in case of a RuntimeException, just log but continue
        log.warn("registerNodeStore: got RuntimeException while trying to determine time difference to server: " + e, e);
    }
    String[] serviceClasses;
    if (isNodeStoreProvider()) {
        registerNodeStoreProvider(nodeStore);
        serviceClasses = new String[] { DocumentNodeStore.class.getName(), Clusterable.class.getName() };
    } else {
        serviceClasses = new String[] { NodeStore.class.getName(), DocumentNodeStore.class.getName(), Clusterable.class.getName() };
    }
    Dictionary<String, Object> props = new Hashtable<String, Object>();
    props.put(Constants.SERVICE_PID, DocumentNodeStore.class.getName());
    props.put(DESCRIPTION, getMetadata(ds));
    // OAK-2844: in order to allow DocumentDiscoveryLiteService to directly
    // require a service DocumentNodeStore (instead of having to do an 'instanceof')
    // the registration is now done for both NodeStore and DocumentNodeStore here.
    nodeStoreReg = context.getBundleContext().registerService(serviceClasses, nodeStore, props);
}
Also used : ObserverTracker(org.apache.jackrabbit.oak.spi.commit.ObserverTracker) MongoClientURI(com.mongodb.MongoClientURI) Clusterable(org.apache.jackrabbit.oak.spi.state.Clusterable) NodeStore(org.apache.jackrabbit.oak.spi.state.NodeStore) BlobTrackingStore(org.apache.jackrabbit.oak.plugins.blob.BlobTrackingStore) BundleException(org.osgi.framework.BundleException) SharedDataStore(org.apache.jackrabbit.oak.plugins.blob.SharedDataStore) GCMonitorTracker(org.apache.jackrabbit.oak.spi.gc.GCMonitorTracker) GenericDescriptors(org.apache.jackrabbit.oak.spi.descriptors.GenericDescriptors) Bundle(org.osgi.framework.Bundle) Hashtable(java.util.Hashtable) IOException(java.io.IOException) SimpleValueFactory(org.apache.jackrabbit.commons.SimpleValueFactory) BundleException(org.osgi.framework.BundleException) IOException(java.io.IOException) BlobIdTracker(org.apache.jackrabbit.oak.plugins.blob.datastore.BlobIdTracker) ByteArrayInputStream(java.io.ByteArrayInputStream) BlobStoreWrapper(org.apache.jackrabbit.oak.spi.blob.BlobStoreWrapper)

Example 30 with BundleException

use of org.osgi.framework.BundleException in project jackrabbit-oak by apache.

the class OakOSGiRepositoryFactory method getRepository.

@SuppressWarnings("unchecked")
public Repository getRepository(Map parameters) throws RepositoryException {
    if (parameters == null || !parameters.containsKey(REPOSITORY_HOME)) {
        //Required param missing so repository cannot be created
        return null;
    }
    Map config = new HashMap();
    config.putAll(parameters);
    PojoServiceRegistry registry = initializeServiceRegistry(config);
    BundleActivator activator = getApplicationActivator(config);
    try {
        activator.start(registry.getBundleContext());
    } catch (Exception e) {
        log.warn("Error occurred while starting activator {}", activator.getClass(), e);
    }
    //Future which would be used to notify when repository is ready
    // to be used
    SettableFuture<Repository> repoFuture = SettableFuture.create();
    new RunnableJobTracker(registry.getBundleContext());
    int timeoutInSecs = PropertiesUtil.toInteger(config.get(REPOSITORY_TIMEOUT_IN_SECS), DEFAULT_TIMEOUT);
    //Start the tracker for repository creation
    new RepositoryTracker(registry, activator, repoFuture, timeoutInSecs);
    // where OSGi runtime fails to start due to bugs (like cycles)
    try {
        return repoFuture.get(timeoutInSecs, TimeUnit.SECONDS);
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
        throw new RepositoryException("Repository initialization was interrupted");
    } catch (ExecutionException e) {
        throw new RepositoryException(e);
    } catch (TimeoutException e) {
        try {
            if (PropertiesUtil.toBoolean(config.get(REPOSITORY_SHUTDOWN_ON_TIMEOUT), true)) {
                shutdown(registry, timeoutInSecs);
                log.info("OSGi container shutdown after waiting for repository initialization for {} sec", timeoutInSecs);
            } else {
                log.warn("[{}] found to be false. Container is not stopped", REPOSITORY_SHUTDOWN_ON_TIMEOUT);
            }
        } catch (BundleException be) {
            log.warn("Error occurred while shutting down the service registry (due to " + "startup timeout) backing the Repository ", be);
        }
        throw new RepositoryException("Repository could not be started in " + timeoutInSecs + " seconds", e);
    }
}
Also used : HashMap(java.util.HashMap) BundleActivator(org.osgi.framework.BundleActivator) RepositoryException(javax.jcr.RepositoryException) TimeoutException(java.util.concurrent.TimeoutException) RepositoryException(javax.jcr.RepositoryException) BundleException(org.osgi.framework.BundleException) ExecutionException(java.util.concurrent.ExecutionException) PojoServiceRegistry(org.apache.felix.connect.launch.PojoServiceRegistry) Repository(javax.jcr.Repository) JackrabbitRepository(org.apache.jackrabbit.api.JackrabbitRepository) BundleException(org.osgi.framework.BundleException) ExecutionException(java.util.concurrent.ExecutionException) HashMap(java.util.HashMap) Map(java.util.Map) TimeoutException(java.util.concurrent.TimeoutException)

Aggregations

BundleException (org.osgi.framework.BundleException)99 Bundle (org.osgi.framework.Bundle)54 IOException (java.io.IOException)31 Test (org.junit.Test)19 File (java.io.File)15 ArrayList (java.util.ArrayList)13 InputStream (java.io.InputStream)10 FileInputStream (java.io.FileInputStream)9 BundleContext (org.osgi.framework.BundleContext)9 HashMap (java.util.HashMap)8 Map (java.util.Map)7 InvalidSyntaxException (org.osgi.framework.InvalidSyntaxException)7 Hashtable (java.util.Hashtable)5 Manifest (java.util.jar.Manifest)5 ServiceReference (org.osgi.framework.ServiceReference)5 Version (org.osgi.framework.Version)5 BundleStartLevel (org.osgi.framework.startlevel.BundleStartLevel)5 LowDiskException (android.taobao.atlas.runtime.LowDiskException)4 TimeoutException (java.util.concurrent.TimeoutException)4 AtomicReference (java.util.concurrent.atomic.AtomicReference)4