| /******************************************************************************* |
| * Copyright (c) 2012, 2017 IBM Corporation and others. All rights reserved. |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v1.0 which accompanies this distribution, |
| * and is available at http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| ******************************************************************************/ |
| package org.eclipse.osgi.compatibility.state; |
| |
| import java.util.*; |
| import org.eclipse.osgi.container.*; |
| import org.eclipse.osgi.internal.framework.BundleContextImpl; |
| import org.eclipse.osgi.internal.framework.EquinoxContainer; |
| import org.eclipse.osgi.internal.module.ResolverImpl; |
| import org.eclipse.osgi.internal.resolver.StateHelperImpl; |
| import org.eclipse.osgi.internal.resolver.StateObjectFactoryImpl; |
| import org.eclipse.osgi.service.resolver.*; |
| import org.osgi.framework.*; |
| |
| public class PlatformAdminImpl implements PlatformAdmin { |
| private final StateObjectFactory factory = new StateObjectFactoryImpl(); |
| private final Object monitor = new Object(); |
| private EquinoxContainer equinoxContainer; |
| private BundleContext bc; |
| private State systemState; |
| private PlatformBundleListener synchronizer; |
| private ServiceRegistration<PlatformAdmin> reg; |
| |
| void start(BundleContext context) { |
| synchronized (this.monitor) { |
| equinoxContainer = ((BundleContextImpl) context).getContainer(); |
| this.bc = context; |
| } |
| this.reg = context.registerService(PlatformAdmin.class, this, null); |
| } |
| |
| void stop(BundleContext context) { |
| synchronized (this.monitor) { |
| if (synchronizer != null) { |
| context.removeBundleListener(synchronizer); |
| context.removeFrameworkListener(synchronizer); |
| } |
| synchronizer = null; |
| systemState = null; |
| } |
| this.reg.unregister(); |
| } |
| |
| @Override |
| public State getState() { |
| return getState(true); |
| } |
| |
| @Override |
| public State getState(boolean mutable) { |
| if (mutable) { |
| return factory.createState(getSystemState()); |
| } |
| return new ReadOnlyState(this); |
| } |
| |
| State getSystemState() { |
| synchronized (this.monitor) { |
| if (systemState == null) { |
| systemState = createSystemState(); |
| } |
| return systemState; |
| } |
| } |
| |
| long getTimeStamp() { |
| synchronized (this.monitor) { |
| return equinoxContainer.getStorage().getModuleDatabase().getRevisionsTimestamp(); |
| } |
| } |
| |
| private State createSystemState() { |
| State state = factory.createState(true); |
| StateConverter converter = new StateConverter(state); |
| ModuleDatabase database = equinoxContainer.getStorage().getModuleDatabase(); |
| database.readLock(); |
| try { |
| ModuleContainer container = equinoxContainer.getStorage().getModuleContainer(); |
| List<Module> modules = equinoxContainer.getStorage().getModuleContainer().getModules(); |
| for (Module module : modules) { |
| ModuleRevision current = module.getCurrentRevision(); |
| BundleDescription description = converter.createDescription(current); |
| state.addBundle(description); |
| } |
| state.setPlatformProperties(asDictionary(equinoxContainer.getConfiguration().getInitialConfig())); |
| synchronizer = new PlatformBundleListener(state, converter, database, container); |
| state.setResolverHookFactory(synchronizer); |
| bc.addBundleListener(synchronizer); |
| bc.addFrameworkListener(synchronizer); |
| state.resolve(); |
| state.setTimeStamp(database.getRevisionsTimestamp()); |
| } finally { |
| database.readUnlock(); |
| } |
| return state; |
| } |
| |
| private Dictionary<String, Object> asDictionary(Map<String, ?> map) { |
| return new Hashtable<>(map); |
| } |
| |
| @Override |
| public StateHelper getStateHelper() { |
| return StateHelperImpl.getInstance(); |
| } |
| |
| /** |
| * @throws BundleException |
| */ |
| @Override |
| public void commit(State state) throws BundleException { |
| throw new UnsupportedOperationException(); |
| } |
| |
| @Deprecated |
| @Override |
| public Resolver getResolver() { |
| return createResolver(); |
| } |
| |
| @Override |
| public Resolver createResolver() { |
| return new ResolverImpl(false); |
| } |
| |
| @Override |
| public StateObjectFactory getFactory() { |
| return factory; |
| } |
| |
| @Override |
| public void addDisabledInfo(DisabledInfo disabledInfo) { |
| throw new UnsupportedOperationException(); |
| } |
| |
| @Override |
| public void removeDisabledInfo(DisabledInfo disabledInfo) { |
| throw new UnsupportedOperationException(); |
| } |
| |
| } |