/******************************************************************************* * Copyright (c) 2010 Philipp Kursawe. * 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: * Philipp Kursawe (phil.kursawe@gmail.com) - initial API and implementation ******************************************************************************/ package copyto.ui.internal.services; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.preferences.ConfigurationScope; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.IPreferencesService; import org.eclipse.core.runtime.preferences.IScopeContext; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.commands.ICommandService; import org.osgi.service.prefs.BackingStoreException; import org.osgi.service.prefs.Preferences; import osgiutils.services.ServiceRunnable; import osgiutils.services.SimpleServiceRunnable; import osgiutils.services.Services; import copyto.core.TargetFactoryDescriptor; import copyto.core.TargetFactories; import copyto.core.Target; import copyto.core.TargetDescriptor; import copyto.core.TargetService; import copyto.core.TargetServiceListener; import copyto.ui.internal.commands.CopyToHandler; /** * @author <a href="mailto:phil.kursawe@gmail.com">Philipp Kursawe</a> * */ public class TargetServiceImpl implements TargetService { private static final String FACTORY = "factory"; //$NON-NLS-1$ private static final String QUALIFIER = "copyto.core/targets"; //$NON-NLS-1$ private class TargetDescriptorImpl implements TargetDescriptor { private final String id; private final TargetFactoryDescriptor factoryDesc; private final Preferences itemNode; private TargetDescriptorImpl(String id, TargetFactoryDescriptor desc, Preferences itemNode) { this.id = id; this.factoryDesc = desc; this.itemNode = itemNode; } public String getId() { return id; } public Target createTarget() { Target target = factoryDesc.getFactory().createTarget(); target.load(itemNode); return target; } public String getLabel() { return itemNode.get("label", "<undefined>"); } } /** * */ public TargetServiceImpl() { // This will trigger PreferenceInitializers to run /*final ScopedPreferenceStore preferenceStore = new ScopedPreferenceStore( new ConfigurationScope(), QUALIFIER); preferenceStore.getBoolean("test"); //$NON-NLS-1$*/ } public OutputStream exportToStream(String id) { final ConfigurationScope configurationScope = new ConfigurationScope(); final IEclipsePreferences preferences = configurationScope .getNode(QUALIFIER + "/id"); if (preferences != null) { return Services.run(IPreferencesService.class, new ServiceRunnable<IPreferencesService, OutputStream>() { public OutputStream run(IPreferencesService service) { OutputStream output = new ByteArrayOutputStream(); try { service.exportPreferences(preferences, output, null); return output; } catch (CoreException e) { } return null; } }); } return null; } public void importFromStream(final InputStream is) { Services.run(IPreferencesService.class, new SimpleServiceRunnable<IPreferencesService>() { public void runWithService(IPreferencesService service) { try { service.importPreferences(is); } catch (CoreException e) { } } }); } public TargetDescriptor find(final String id) { final ConfigurationScope configurationScope = new ConfigurationScope(); final IEclipsePreferences preferences = configurationScope .getNode(QUALIFIER); try { if (preferences.nodeExists(id)) { Preferences itemNode = preferences.node(id); final String protocolId = itemNode.get(FACTORY, null); if (protocolId != null) { final TargetFactoryDescriptor desc = Services .run( TargetFactories.class, new ServiceRunnable<TargetFactories, TargetFactoryDescriptor>() { public TargetFactoryDescriptor run( TargetFactories service) { return service.find(protocolId); } }); if (desc != null) { return new TargetDescriptorImpl(id, desc, itemNode); } } } } catch (final Exception e) { } return null; } public TargetDescriptor getLastSelected() { final IEclipsePreferences preferences = new ConfigurationScope() .getNode(QUALIFIER); final String id = preferences.get("lastId", null); //$NON-NLS-1$ if (id != null) { return find(id); } return null; } public void setLastSelected(final String id) { final IEclipsePreferences preferences = new ConfigurationScope() .getNode(QUALIFIER); if (id == null) { preferences.remove("lastId"); //$NON-NLS-1$ } else { preferences.put("lastId", id); //$NON-NLS-1$ } try { preferences.flush(); } catch (final BackingStoreException e) { } final ICommandService cs = (ICommandService) PlatformUI.getWorkbench() .getService(ICommandService.class); cs.refreshElements(CopyToHandler.COMMAND_ID, null); } // TODO:: Add EH and iterate until at least one can be returned. public TargetDescriptor findFirst() { final ConfigurationScope configurationScope = new ConfigurationScope(); final IEclipsePreferences preferences = configurationScope .getNode(QUALIFIER); try { final String[] names = preferences.childrenNames(); if (names.length > 0) { return find(names[0]); } } catch (final BackingStoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } public int count() { final IEclipsePreferences preferences = new ConfigurationScope() .getNode(QUALIFIER); try { return preferences.childrenNames().length; } catch (final BackingStoreException e) { } return 0; } public List<TargetDescriptor> findAll() { final ConfigurationScope configurationScope = new ConfigurationScope(); final IEclipsePreferences preferences = configurationScope .getNode(QUALIFIER); final List<TargetDescriptor> items = new ArrayList<TargetDescriptor>(); try { for (final String name : preferences.childrenNames()) { final Preferences itemNode = preferences.node(name); final String factoryId = itemNode.get(FACTORY, null); if (factoryId != null) { final TargetFactoryDescriptor desc = Services .run( TargetFactories.class, new ServiceRunnable<TargetFactories, TargetFactoryDescriptor>() { public TargetFactoryDescriptor run( TargetFactories service) { return service.find(factoryId); } }); if (desc != null) { TargetDescriptor target = new TargetDescriptorImpl( name, desc, itemNode); items.add(target); } } } } catch (final BackingStoreException e) { } return items; } public void save(final Collection<Target> items) { final IScopeContext instanceScope = new ConfigurationScope(); Preferences node = instanceScope.getNode(QUALIFIER); try { node.removeNode(); node = instanceScope.getNode(QUALIFIER); for (final Target item : items) { Preferences itemNode = node.node(item.getId()); itemNode.put(FACTORY, item.getFactory().getId()); item.save(itemNode); } node.flush(); } catch (final BackingStoreException e) { } notifyListeners(items); } private void notifyListeners(final Collection<Target> items) { Services.runAll(TargetServiceListener.class, new SimpleServiceRunnable<TargetServiceListener>() { @Override protected void runWithService(TargetServiceListener listener) { listener.targetsChanged(items); } }); } }