diff options
Diffstat (limited to 'examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/pessimistic/PessimisticFilesystemProvider.java')
-rw-r--r-- | examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/pessimistic/PessimisticFilesystemProvider.java | 710 |
1 files changed, 0 insertions, 710 deletions
diff --git a/examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/pessimistic/PessimisticFilesystemProvider.java b/examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/pessimistic/PessimisticFilesystemProvider.java deleted file mode 100644 index 57b9463ab..000000000 --- a/examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/pessimistic/PessimisticFilesystemProvider.java +++ /dev/null @@ -1,710 +0,0 @@ -/* - * Copyright (c) 2002 IBM Corp. All rights reserved. - * This file is made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - */ -package org.eclipse.team.examples.pessimistic; - -import java.io.*; -import java.util.*; -import org.eclipse.core.resources.*; -import org.eclipse.core.runtime.*; -import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.team.core.RepositoryProvider; - -/** - * The <code>PessimisticFilesystemProvider</code> is a repository provider. - * - * The provider manages a file named ".pessimistic" in each container it - * controls. This is where it stores metadata on which files it controls - * in that container. This file is considered to be controlled by the - * provider and may be deleted. - * - * The provider provides very simple checkin/checkout facilities by marking - * files read-only to check them in and read-write to check them out. It - * also supports ignoring derived files. - */ -public class PessimisticFilesystemProvider extends RepositoryProvider { - /** - * The name of the file used to store metadata on which - * files are controlled by this provider. - */ - private static final String CONTROL_FILE_NAME= ".pessimistic"; - /** - * The file modification validator for this provider. - */ - private IFileModificationValidator validator; - /** - * The cache of resources that are currently controlled. - * The cache is a map of parent resource -> set of controlled children. - */ - private Map fControlledResources; - - /** - * Creates a new provider, required for team repository extension. - */ - public PessimisticFilesystemProvider() { - validator = new PessimisticModificationValidator(this); - fControlledResources= new HashMap(1); - } - - /** - * Adds the resources to the control of this provider. - */ - public void addToControl(final IResource[] resources, IProgressMonitor monitor) { - if (PessimisticFilesystemProviderPlugin.getInstance().isDebugging()) { - System.out.println("Add to control:"); - if (resources != null) { - for (int i= 0; i < resources.length; i++) { - System.out.println("\t" + resources[i]); - } - } else { - System.out.println("null resources"); - } - } - if (resources == null || resources.length == 0) { - return; - } - final Set toAdd= new HashSet(resources.length); - IWorkspaceRunnable runnable= new IWorkspaceRunnable() { - public void run(IProgressMonitor monitor) throws CoreException { - for (int i = 0; i < resources.length; i++) { - IResource resource= resources[i]; - if (!isControlled(resource)) { - toAdd.add(resource); - } - } - Map byParent= sortByParent(toAdd); - - monitor.beginTask("Adding to control", 1000); - for (Iterator i= byParent.keySet().iterator(); i.hasNext();) { - IContainer parent= (IContainer) i.next(); - Set controlledResources= (Set)fControlledResources.get(parent); - if (controlledResources == null) { - controlledResources= new HashSet(1); - fControlledResources.put(parent, controlledResources); - } - controlledResources.addAll((Set)byParent.get(parent)); - writeControlFile(parent, monitor); - } - monitor.done(); - } - }; - run(runnable, monitor); - fireStateChanged(toAdd, false); - } - - /** - * Removes the resources from the control of this provider. - */ - public void removeFromControl(final IResource[] resources, IProgressMonitor monitor) { - if (PessimisticFilesystemProviderPlugin.getInstance().isDebugging()) { - System.out.println("Remove from control:"); - if (resources != null) { - for (int i= 0; i < resources.length; i++) { - System.out.println("\t" + resources[i]); - } - } else { - System.out.println("null resources"); - } - } - if (resources == null || resources.length == 0) { - return; - } - final Set toRemove= new HashSet(resources.length); - IWorkspaceRunnable runnable= new IWorkspaceRunnable() { - public void run(IProgressMonitor monitor) throws CoreException { - for (int i = 0; i < resources.length; i++) { - IResource resource= resources[i]; - if (isControlled(resource)) { - toRemove.add(resource); - } - } - Map byParent= sortByParent(toRemove); - - Set keys= byParent.keySet(); - monitor.beginTask("Removing from control", 1000); - for (Iterator i= byParent.keySet().iterator(); i.hasNext();) { - IContainer parent= (IContainer) i.next(); - Set controlledResources= (Set)fControlledResources.get(parent); - if (controlledResources == null) { - deleteControlFile(parent, monitor); - } else { - Set toRemove= (Set)byParent.get(parent); - controlledResources.removeAll(toRemove); - if (controlledResources.isEmpty()) { - fControlledResources.remove(parent); - deleteControlFile(parent, monitor); - } else { - writeControlFile(parent, monitor); - } - for (Iterator j= controlledResources.iterator(); j.hasNext();) { - IResource resource= (IResource) j.next(); - if (!resource.exists()) { - j.remove(); - } - } - } - } - monitor.done(); - } - }; - run(runnable, monitor); - fireStateChanged(toRemove, false); - } - - /* - * Returns a map of IContainer -> Set of IResource. - */ - private Map sortByParent(Set resources) { - Map byParent= new HashMap(1); - for (Iterator i = resources.iterator(); i.hasNext();) { - IResource resource= (IResource) i.next(); - IContainer parent= resource.getParent(); - Set set= (Set)byParent.get(parent); - if (set == null) { - set= new HashSet(1); - byParent.put(parent, set); - } - set.add(resource); - } - return byParent; - } - - /* - * Deletes the control file for the given container. - */ - private void deleteControlFile(final IContainer container, IProgressMonitor monitor) { - IWorkspaceRunnable runnable= new IWorkspaceRunnable() { - public void run(IProgressMonitor monitor) throws CoreException { - IFile controlFile= getControlFile(container, monitor); - monitor.beginTask("Deleting control file " + controlFile, 1); - if (controlFile.exists()) { - controlFile.delete(true, false, monitor); - } - monitor.done(); - } - }; - run(runnable, monitor); - } - - /* - * Answers the control file for the given container. If the control - * file exists, but is a directory, it will be deleted! - */ - private IFile getControlFile(IContainer container, IProgressMonitor monitor) throws CoreException { - IResource child= container.findMember(CONTROL_FILE_NAME); - if (child != null) { - if (child.getType() == IResource.FILE) { - return (IFile)child; - } else { - child.delete(true, monitor); - } - } - IFile controlFile= container.getFile(new Path(CONTROL_FILE_NAME)); - monitor.beginTask("Creating control file " + controlFile, 2); - controlFile.create(new ByteArrayInputStream(new byte[0]), true, monitor); - controlFile.setDerived(true); - controlFile.setTeamPrivateMember(true); - monitor.done(); - return controlFile; - } - - /* - * Reads the contents of a control file, answering the set of - * resources that was specified in the file. - */ - private Set readControlFile(IFile controlFile) { - Set controlledResources= new HashSet(1); - if (controlFile.exists()) { - InputStream in= null; - try { - try { - in= ((IFile)controlFile).getContents(true); - } catch (CoreException e) { - PessimisticFilesystemProviderPlugin.getInstance().logError(e, "Could not open stream on control file: " + controlFile); - } - DataInputStream dIn= new DataInputStream(in); - int count= 0; - try { - count= dIn.readInt(); - } catch (IOException e) { - // could be empty - } - if (count > 0) { - try { - for(int i= 0; i < count; i++) { - String name= dIn.readUTF(); - IResource resource= getProject().findMember(new Path(name)); - if (resource != null) { - controlledResources.add(resource); - } - } - } catch (IOException e) { - // corrupt control file - try { - controlFile.delete(true, null); - } catch (CoreException ce) { - PessimisticFilesystemProviderPlugin.getInstance().logError(ce, "Could not delete corrupt control file: " + controlFile); - } - } - } - } finally { - if (in != null) { - try { - in.close(); - } catch (IOException e) { - PessimisticFilesystemProviderPlugin.getInstance().logError(e, "Problems closing input stream on control file: " + controlFile); - } - } - } - } - return controlledResources; - } - - /* - * Writes the currently controled resources to the control file for the container. - */ - private void writeControlFile(IContainer container, IProgressMonitor monitor) throws CoreException { - IFile controlFile= getControlFile(container, monitor); - Set controlledResources= (Set)fControlledResources.get(container); - InputStream contents= generateControlFileContents(controlledResources); - monitor.beginTask("Writing control file " + controlFile, 1000); - if (contents == null) { - controlFile.delete(true, false, monitor); - } else { - controlFile.setContents(contents, true, false, monitor); - } - monitor.done(); - } - - /* - * Generates an InputStream on a byte array which specifies - * the resources given in controlledResources. - */ - private InputStream generateControlFileContents(Set controlledResources) { - if (controlledResources == null || controlledResources.isEmpty()) { - return null; - } - ByteArrayOutputStream byteOut= new ByteArrayOutputStream(); - DataOutputStream out= new DataOutputStream(byteOut); - try { - out.writeInt(controlledResources.size()); - for (Iterator i= controlledResources.iterator(); i.hasNext();) { - IResource resource= (IResource) i.next(); - out.writeUTF(resource.getProjectRelativePath().toString()); - } - out.flush(); - } catch (IOException e) { - PessimisticFilesystemProviderPlugin.getInstance().logError(e, "Unexpected problems during content generation"); - } - return new ByteArrayInputStream(byteOut.toByteArray()); - } - - /* - * @see IProjectNature#setProject(IProject) - */ - public void setProject(IProject project) { - if (PessimisticFilesystemProviderPlugin.getInstance().isDebugging()) { - System.out.println("Set project to " + project); - } - super.setProject(project); - configureProject(); - } - - /* - * @see IRepositoryProvider#getID() - */ - public String getID() { - return PessimisticFilesystemProviderPlugin.NATURE_ID; - } - - /* - * @see IRepositoryProvider#getFileModificationValidator() - */ - public IFileModificationValidator getFileModificationValidator() { - return validator; - } - - /* - * @see IRepositoryProvider#deconfigure() - */ - public void deconfigure() { - if (PessimisticFilesystemProviderPlugin.getInstance().isDebugging()) { - System.out.println("Deconfigure " + getProject()); - } - - fControlledResources.clear(); - fireStateChanged(getSubtreeMembers(getProject()), true); - } - - /* - * @see IRepositoryProvider#configure() - */ - public void configureProject() { - if (PessimisticFilesystemProviderPlugin.getInstance().isDebugging()) { - System.out.println("Configure " + getProject()); - } - - readControlFiles(); - fireStateChanged(getSubtreeMembers(getProject()), true); - } - - /* - * Reads the control files located in the project - */ - private void readControlFiles() { - IProject project= getProject(); - Set set= new HashSet(1); - set.add(project); - fControlledResources.put(project.getParent(), set); - try { - getProject().accept(new IResourceVisitor() { - public boolean visit(IResource resource) throws CoreException { - if (resource.getType() == IResource.FILE) { - if (CONTROL_FILE_NAME.equals(resource.getName())) { - Set controlledResources= readControlFile((IFile)resource); - fControlledResources.put(resource.getParent(), controlledResources); - } - return false; - } - return true; - } - }); - } catch (CoreException e) { - PessimisticFilesystemProviderPlugin.getInstance().logError(e, "Problems traversing resource tree"); - } - } - - /** - * Checks the resources in by marking them read-only. - */ - public void checkin(final IResource[] resources, IProgressMonitor monitor) { - if (PessimisticFilesystemProviderPlugin.getInstance().isDebugging()) { - System.out.println("Check in:"); - if (resources != null) { - for (int i= 0; i < resources.length; i++) { - System.out.println("\t" + resources[i]); - } - } else { - System.out.println("null resources"); - } - } - if (resources == null || resources.length == 0) { - return; - } - final Set modified= new HashSet(1); - IWorkspaceRunnable runnable= new IWorkspaceRunnable() { - public void run(IProgressMonitor monitor) throws CoreException { - monitor.beginTask("Checking in resources", 1000); - for(int i= 0; i < resources.length; i++) { - IResource resource= resources[i]; - if (isControlled(resource)) { - if (resource.exists()) { - resource.setReadOnly(true); - modified.add(resource); - } - } - } - monitor.done(); - } - }; - run(runnable, monitor); - fireStateChanged(modified, false); - } - - /** - * Unchecks the resources out. In this provider this operation is - * equivalent to checkin. - * - * @see PessimisticFilesystemProvider#checkin(IResource[], IProgressMonitor) - */ - public void uncheckout(final IResource[] resources, IProgressMonitor monitor) { - if (PessimisticFilesystemProviderPlugin.getInstance().isDebugging()) { - System.out.println("Uncheckout:"); - if (resources != null) { - for (int i= 0; i < resources.length; i++) { - System.out.println("\t" + resources[i]); - } - } else { - System.out.println("null resources"); - } - } - if (resources == null || resources.length == 0) { - return; - } - final Set modified= new HashSet(1); - IWorkspaceRunnable runnable= new IWorkspaceRunnable() { - public void run(IProgressMonitor monitor) throws CoreException { - monitor.beginTask("Unchecking in resources", 1000); - for(int i= 0; i < resources.length; i++) { - IResource resource= resources[i]; - if (isControlled(resource)) { - if (resource.exists()) { - resource.setReadOnly(true); - modified.add(resource); - } - } - } - monitor.done(); - } - }; - run(runnable, monitor); - fireStateChanged(modified, false); - } - - /** - * Checks the resources out by marking the resources read-write. - */ - public void checkout(final IResource[] resources, IProgressMonitor monitor) { - if (PessimisticFilesystemProviderPlugin.getInstance().isDebugging()) { - System.out.println("Check out:"); - if (resources != null) { - for (int i= 0; i < resources.length; i++) { - System.out.println("\t" + resources[i]); - } - } else { - System.out.println("null resources"); - } - } - if (resources == null || resources.length == 0) { - return; - } - final Set modified= new HashSet(1); - IWorkspaceRunnable runnable= new IWorkspaceRunnable() { - public void run(IProgressMonitor monitor) throws CoreException { - monitor.beginTask("Checking out resources", 1000); - for(int i= 0; i < resources.length; i++) { - IResource resource= resources[i]; - if (isControlled(resource)) { - if(resource.exists()) { - resource.setReadOnly(false); - modified.add(resource); - } - } - } - monitor.done(); - } - }; - run(runnable, monitor); - fireStateChanged(modified, false); - } - - /** - * Answers <code>true</code> if and only if the resource is - * not <code>null</code>, controlled, not ignored, and checked out. - * Otherwise this method answers <code>false</code>. - */ - public boolean isCheckedout(IResource resource) { - if (PessimisticFilesystemProviderPlugin.getInstance().isDebugging()) { - System.out.println("Is checked out: " + resource); - } - if (resource == null) { - return false; - } - if (!isControlled(resource)) { - return false; - } - if (isIgnored(resource)) { - return false; - } - return !resource.isReadOnly(); - } - - /** - * Answers <code>true</code> if the resource is not <code>null</code>, - * and is controlled, <code>false</code> otherwise. - */ - public boolean isControlled(IResource resource) { - if (PessimisticFilesystemProviderPlugin.getInstance().isDebugging()) { - System.out.println("Is controlled: " + resource); - } - if (resource == null) { - return false; - } - IProject project= getProject(); - if (!project.equals(resource.getProject())) { - return false; - } - Set controlled= (Set)fControlledResources.get(resource.getParent()); - if (controlled == null) { - return false; - } - return controlled.contains(resource); - } - - /** - * Answers <code>true</code> if the resource is ignored. - * Resources are ignored if they are derived. - * Will return <code>false</code> when a resource is derived, but - * has explicitly been added to the control of this provider. - */ - public boolean isIgnored (IResource resource) { - if (PessimisticFilesystemProviderPlugin.getInstance().isDebugging()) { - System.out.println("Is ignored: " + resource); - } - if (resource.isDerived()) { - if (isControlled(resource)) { - return false; - } - return true; - } - return false; - } - - /** - * Answers <code>true</code> if the preference to change the content - * of the file has been set to <code>true</code>, <code>false</code> - * otherwise. - */ - public boolean hasContentChanged(IResource resource) { - if (PessimisticFilesystemProviderPlugin.getInstance().isDebugging()) { - System.out.println("Has content change: " + resource); - } - - IPreferenceStore preferences= PessimisticFilesystemProviderPlugin.getInstance().getPreferenceStore(); - boolean change= preferences.getBoolean(IPessimisticFilesystemConstants.PREF_TOUCH_DURING_VALIDATE_EDIT); - if (change) { - try { - if(resource.getType() == IResource.FILE) { - try { - appendText((IFile)resource, getRandomSnippet(), false); - } catch (IOException e1) { - } - } else { - resource.touch(null); - } - } catch (CoreException e) { - PessimisticFilesystemProviderPlugin.getInstance().logError(e, "Problems touching resource: " + resource); - } - } - return change; - } - - public void appendText(IFile file, String text, boolean prepend) throws CoreException, IOException { - String contents = getFileContents(file); - StringBuffer buffer = new StringBuffer(); - if (prepend) { - buffer.append(text); - } - buffer.append(contents); - if (!prepend) { - buffer.append(System.getProperty("line.separator") + text); - } - file.setContents(new ByteArrayInputStream(buffer.toString().getBytes()), false, false, null); - } - - public static String getFileContents(IFile file) throws IOException, CoreException { - StringBuffer buf = new StringBuffer(); - Reader reader = new InputStreamReader(new BufferedInputStream(file.getContents())); - try { - int c; - while ((c = reader.read()) != -1) buf.append((char)c); - } finally { - reader.close(); - } - return buf.toString(); - } - - public static String getRandomSnippet() { - switch ((int) Math.round(Math.random() * 10)) { - case 0 : - return "este e' o meu conteudo (portuguese)"; - case 1 : - return "Dann brauchen wir aber auch einen deutschen Satz!"; - case 2 : - return "I'll be back"; - case 3 : - return "don't worry, be happy"; - case 4 : - return "there is no imagination for more sentences"; - case 5 : - return "customize yours"; - case 6 : - return "foo"; - case 7 : - return "bar"; - case 8 : - return "foobar"; - case 9 : - return "case 9"; - default : - return "these are my contents"; - } - } - - /* - * Notifies listeners that the state of the resources has changed. - * - * @param resources A collection of resources whose state has changed. - * @param queueAfterWorkspaceOperation If <code>true</code>, indicates that the - * notification should occur after the current workspace runnable - * has completed. - */ - private void fireStateChanged(final Collection resources, boolean queueAfterWorkspaceOperation) { - if (resources == null || resources.isEmpty()) { - return; - } - - if (queueAfterWorkspaceOperation) { - Thread t= new Thread(new Runnable() { - public void run() { - try { - ResourcesPlugin.getWorkspace().run( - new IWorkspaceRunnable() { - public void run(IProgressMonitor monitor) throws CoreException { - } - }, - null); - } catch (CoreException e) { - PessimisticFilesystemProviderPlugin.getInstance().logError(e, "Problem during empty runnable"); - } - fireStateChanged(resources, false); - } - }); - t.start(); - } else { - PessimisticFilesystemProviderPlugin.getInstance().fireResourcesChanged( - (IResource[])resources.toArray(new IResource[resources.size()])); - } - } - - /* - * Answers a collection of all of the resources contained below - * the given resource and the resource itself. - */ - private Collection getSubtreeMembers(IResource resource) { - final Set resources= new HashSet(1); - IResourceVisitor visitor= new IResourceVisitor() { - public boolean visit(IResource resource) throws CoreException { - switch (resource.getType()) { - case IResource.PROJECT: - case IResource.FOLDER: - case IResource.FILE: - resources.add(resource); - return true; - } - return true; - } - }; - try { - resource.accept(visitor); - } catch (CoreException e) { - PessimisticFilesystemProviderPlugin.getInstance().logError(e, "Problem during resource visiting"); - } - return resources; - } - - /* - * Runs a workspace operation reporting errors to the PessimisticFilesystemProviderPlugin. - */ - private void run(IWorkspaceRunnable runnable, IProgressMonitor monitor) { - try { - ResourcesPlugin.getWorkspace().run(runnable, monitor); - } catch (CoreException e) { - PessimisticFilesystemProviderPlugin.getInstance().logError(e, "Problems during workspace operation."); - } - } -} - |