/*
* Copyright (c) 2006 Stiftung Deutsches Elektronen-Synchroton,
* Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY.
*
* THIS SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "../AS IS" BASIS.
* WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSE AND
* NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
* FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE
* IN ANY RESPECT, THE USER ASSUMES THE COST OF ANY NECESSARY SERVICING, REPAIR OR
* CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE.
* NO USE OF ANY SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
* DESY HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
* OR MODIFICATIONS.
* THE FULL LICENSE SPECIFYING FOR THE SOFTWARE THE REDISTRIBUTION, MODIFICATION,
* USAGE AND OTHER RIGHTS AND OBLIGATIONS IS INCLUDED WITH THE DISTRIBUTION OF THIS
* PROJECT IN THE FILE LICENSE.HTML. IF THE LICENSE IS NOT INCLUDED YOU MAY FIND A COPY
* AT HTTP://WWW.DESY.DE/LEGAL/LICENSE.HTM
*/
package org.csstudio.sds;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Path;
import org.osgi.framework.Bundle;
/**
* This services provides some basic workspace operations.
*
* @author Alexander Will
* @version $Revision$
*
*/
public final class ResourceService {
/**
* The shared instance.
*/
private static ResourceService _instance;
/**
* List that holds all listeners that will be informed about resource
* changes.
*/
private ArrayList<IResourceChangeListener> _targetResourceChangeListeners;
/**
* The change listener that is used to centrally collect workspace changes.
*/
private IResourceChangeListener _resourceChangeListener;
/**
* Return the shared instance.
*
* @return The shared instance.
*/
public static ResourceService getInstance() {
if (_instance == null) {
_instance = new ResourceService();
}
return _instance;
}
/**
* Private constructor due to singleton pattern.
*/
private ResourceService() {
_targetResourceChangeListeners = new ArrayList<IResourceChangeListener>();
_resourceChangeListener = new CssResourceChangeListener();
}
/**
* Create a workspace project with the given name (if it does not exist
* already).
*
* @param projectName
* The name of the project.
* @return a handle to the given project.
*/
public IProject createWorkspaceProject(final String projectName) {
IProject result = ResourcesPlugin.getWorkspace().getRoot().getProject(
projectName);
if (!result.exists()) {
try {
result.create(null);
result.open(null);
} catch (CoreException e) {
}
}
return result;
}
/**
* Copy the resourcces from the given folder in the given bundle into the
* given workspace project.
*
* @param targetProject
* workspace project to copy the resources to.
* @param sourceBundle
* source bundle.
* @param sourceFolderName
* source folder in the source bundle.
*/
public void copyResources(final IProject targetProject,
final Bundle sourceBundle, final String sourceFolderName) {
Enumeration<URL> fileEntries = sourceBundle.findEntries(sourceFolderName,
"*.*", false); //$NON-NLS-1$
while (fileEntries.hasMoreElements()) {
URL url = fileEntries.nextElement();
String filePath = url.getFile();
String fileName = filePath
.substring(filePath.indexOf(sourceFolderName + "/") + sourceFolderName.length() + 1); //$NON-NLS-1$
IFile file = targetProject.getFile(fileName);
if (!file.exists()) {
try {
file.create(FileLocator.openStream(sourceBundle, new Path(
filePath), false), true, null);
} catch (Exception e) {
}
}
}
}
/**
* Add a resource change listener.
*
* @param listener
* the resource change listener to add.
*/
public void addResourceChangeListener(final IResourceChangeListener listener) {
if (!_targetResourceChangeListeners.contains(listener)) {
_targetResourceChangeListeners.add(listener);
if (_targetResourceChangeListeners.size() == 1) {
ResourcesPlugin.getWorkspace().addResourceChangeListener(
_resourceChangeListener);
}
}
}
/**
* Remove a resource change listener.
*
* @param listener
* the resource change listener to remove.
*/
public void removeResourceChangeListener(
final IResourceChangeListener listener) {
if (_targetResourceChangeListeners.contains(listener)) {
_targetResourceChangeListeners.remove(listener);
if (_targetResourceChangeListeners.size() == 0) {
ResourcesPlugin.getWorkspace().removeResourceChangeListener(
_resourceChangeListener);
}
}
}
/**
* Central resource change listener that forwards workspace changes to the
* registered listeners.
*
* @author Alexander Will
* @version $Revision$
*/
private class CssResourceChangeListener implements IResourceChangeListener {
@Override
public void resourceChanged(IResourceChangeEvent event) {
for (IResourceChangeListener listener : _targetResourceChangeListeners) {
listener.resourceChanged(event);
}
}
}
}