blob: 718fbe66ea968d7d63dc7a8516329287791035a1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 SAP AG.
* 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:
* Eduard Bartsch (SAP AG) - initial API and implementation
*******************************************************************************/
package org.eclipse.core.resources.semantic.test;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import junit.framework.Assert;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourceAttributes;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.resources.semantic.ISemanticFile;
import org.eclipse.core.resources.semantic.ISemanticFolder;
import org.eclipse.core.resources.semantic.SyncDirection;
import org.eclipse.core.resources.semantic.examples.providers.SampleWebDAVContentProvider;
import org.eclipse.core.resources.semantic.examples.webdav.WebDAVUtil;
import org.eclipse.core.resources.semantic.spi.Util;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.junit.Ignore;
import org.junit.Test;
public class TestsSampleWebDAVContentProvider extends TestsContentProviderUtil {
protected static final String WEBDAV_TEST_URL = "http://localhost:2080/testWebDAV";
IWorkspace workspace = ResourcesPlugin.getWorkspace();
public TestsSampleWebDAVContentProvider() {
this(true);
}
TestsSampleWebDAVContentProvider(boolean withAutoRefresh) {
super(withAutoRefresh, "TestsSampleWebDAVContentProvider", SampleWebDAVContentProvider.class.getName());
}
TestsSampleWebDAVContentProvider(boolean withAutoRefresh, String projectName, String providerName) {
super(withAutoRefresh, projectName, providerName);
}
@Test
@Ignore
public void testAddWebDAVFolder() throws Exception {
final IFolder folder = this.testProject.getFolder("root");
final int[] counters = new int[3];
IResourceChangeListener listener = new IResourceChangeListener() {
public void resourceChanged(IResourceChangeEvent event) {
IResourceDelta delta = event.getDelta();
if (delta != null) {
IResourceDeltaVisitor visitor = new IResourceDeltaVisitor() {
public boolean visit(IResourceDelta delta1) {
switch (delta1.getKind()) {
case IResourceDelta.ADDED :
// handle added resource
counters[0]++;
break;
case IResourceDelta.REMOVED :
// handle removed resource
counters[1]++;
break;
case IResourceDelta.CHANGED :
// handle changed resource
counters[2]++;
break;
}
return true;
}
};
try {
delta.accept(visitor);
} catch (CoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
workspace.addResourceChangeListener(listener);
IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
public void run(final IProgressMonitor monitor) throws CoreException {
ISemanticFolder sFolder = (ISemanticFolder) folder.getAdapter(ISemanticFolder.class);
try {
sFolder.addFolder("test", new URI(WEBDAV_TEST_URL), options, monitor);
folder.accept(new IResourceVisitor() {
public boolean visit(IResource resource) {
if (resource instanceof IFile) {
IFile file = (IFile) resource;
try {
Util.safeClose(file.getContents());
monitor.worked(1);
} catch (CoreException e) {
// ignore
} catch (Exception e) {
Assert.assertTrue("should not fail", false);
}
}
return true;
}
});
} catch (URISyntaxException e) {
throw new CoreException(new Status(IStatus.ERROR, TestPlugin.PLUGIN_ID, e.getMessage(), e));
}
}
};
workspace.run(runnable, testProject, 0, new NullProgressMonitor());
Assert.assertTrue(folder.getFolder("test").exists());
Assert.assertTrue("Added", counters[0] > 0);
Assert.assertTrue("Deleted", counters[1] == 0);
Assert.assertTrue("Changed", counters[2] > 0);
for (int j = 0; j < counters.length; j++) {
counters[j] = 0;
}
IWorkspaceRunnable runnable2 = new IWorkspaceRunnable() {
public void run(final IProgressMonitor monitor) throws CoreException {
ISemanticFolder sFolder = (ISemanticFolder) folder.getAdapter(ISemanticFolder.class);
sFolder.synchronizeContentWithRemote(SyncDirection.INCOMING, options, monitor);
}
};
workspace.run(runnable2, testProject, 0, new NullProgressMonitor());
validateAndResetCounters(counters);
IWorkspaceRunnable runnable3 = new IWorkspaceRunnable() {
public void run(final IProgressMonitor monitor) throws CoreException {
ISemanticFolder sFolder = (ISemanticFolder) folder.getFolder("test").getAdapter(ISemanticFolder.class);
sFolder.synchronizeContentWithRemote(SyncDirection.INCOMING, options, monitor);
}
};
workspace.run(runnable3, testProject, 0, new NullProgressMonitor());
validateAndResetCounters(counters);
IWorkspaceRunnable runnable4 = new IWorkspaceRunnable() {
public void run(final IProgressMonitor monitor) throws CoreException {
ISemanticFolder sFolder = (ISemanticFolder) folder.getFolder("test").getFolder("src").getAdapter(ISemanticFolder.class);
sFolder.synchronizeContentWithRemote(SyncDirection.INCOMING, options, monitor);
}
};
workspace.run(runnable4, testProject, 0, new NullProgressMonitor());
validateAndResetCounters(counters);
workspace.removeResourceChangeListener(listener);
}
@Test
@Ignore
public void testWebDAVAsLinkedFolder() throws Exception {
final String linkedProjectName = "testWebDAVAsLinkedFolder";
final IProject project = workspace.getRoot().getProject(linkedProjectName);
if (project.exists()) {
throw new IllegalStateException("Project exists");
}
IWorkspaceRunnable myRunnable = new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
IProjectDescription description = workspace.newProjectDescription(linkedProjectName);
project.create(description, monitor);
project.open(monitor);
}
};
workspace.run(myRunnable, workspace.getRoot(), IWorkspace.AVOID_UPDATE, null);
final IFolder folder = project.getFolder("test");
IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
URI uri = null;
try {
uri = new URI("semanticfs", null, "/webdav/test", "type=folder;create=true;provider="
+ SampleWebDAVContentProvider.class.getName() + ";uri=" + WEBDAV_TEST_URL, null);
folder.createLink(uri, 0, monitor);
ISemanticFolder sFolder = (ISemanticFolder) folder.getAdapter(ISemanticFolder.class);
Assert.assertEquals(SampleWebDAVContentProvider.class.getName(), sFolder.getContentProviderID());
sFolder.synchronizeContentWithRemote(SyncDirection.INCOMING, options, monitor);
IResource[] members = folder.members();
Assert.assertTrue(members.length > 0);
IFile file = folder.getFile("test.txt");
ResourceAttributes attributes = file.getResourceAttributes();
attributes.setReadOnly(false);
file.setResourceAttributes(attributes);
file.setContents(new ByteArrayInputStream("xxx".getBytes("UTF-8")), true, false, monitor);
sFolder.synchronizeContentWithRemote(SyncDirection.OUTGOING, options, monitor);
ISemanticFile sFile = (ISemanticFile) file.getAdapter(ISemanticFile.class);
IStatus status = sFile.lockResource(options, monitor);
Assert.assertTrue(status.isOK());
status = sFile.unlockResource(options, monitor);
Assert.assertTrue(status.isOK());
try {
boolean isFolder = WebDAVUtil.checkWebDAVURL(new URI(WEBDAV_TEST_URL), monitor);
Assert.assertTrue(isFolder);
isFolder = WebDAVUtil.checkWebDAVURL(new URI(WEBDAV_TEST_URL + "/test.txt"), monitor);
Assert.assertFalse(isFolder);
} catch (IOException e) {
throw new CoreException(new Status(IStatus.ERROR, TestPlugin.PLUGIN_ID, e.getMessage(), e));
} catch (URISyntaxException e) {
throw new CoreException(new Status(IStatus.ERROR, TestPlugin.PLUGIN_ID, e.getMessage(), e));
}
try {
WebDAVUtil.checkWebDAVURL(new URI(WEBDAV_TEST_URL + "/xxx.xxx"), monitor);
Assert.assertTrue("Should have failed", false);
} catch (IOException e) {
// ignore
} catch (URISyntaxException e) {
throw new CoreException(new Status(IStatus.ERROR, TestPlugin.PLUGIN_ID, e.getMessage(), e));
}
} catch (URISyntaxException e) {
throw new CoreException(new Status(IStatus.ERROR, TestPlugin.PLUGIN_ID, e.getMessage(), e));
} catch (UnsupportedEncodingException e) {
throw new CoreException(new Status(IStatus.ERROR, TestPlugin.PLUGIN_ID, e.getMessage(), e));
} finally {
cleanupSFS(uri, monitor);
}
}
};
workspace.run(runnable, workspace.getRuleFactory().refreshRule(folder), 0, new NullProgressMonitor());
}
@Test
@Ignore
public void testWebDAVAsLinkedFile() throws Exception {
final String linkedProjectName = "testWebDAVAsLinkedFile";
final IProject project = workspace.getRoot().getProject(linkedProjectName);
if (project.exists()) {
throw new IllegalStateException("Project exists");
}
IWorkspaceRunnable myRunnable = new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
IProjectDescription description = workspace.newProjectDescription(linkedProjectName);
project.create(description, monitor);
project.open(monitor);
}
};
workspace.run(myRunnable, workspace.getRoot(), IWorkspace.AVOID_UPDATE, null);
final IFile file = project.getFile("test.txt");
IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
URI uri = null;
try {
uri = new URI("semanticfs", null, "/webdav/test.txt", "type=file;create=true;provider="
+ SampleWebDAVContentProvider.class.getName() + ";uri=" + WEBDAV_TEST_URL + "/test.txt", null);
file.createLink(uri, 0, monitor);
ISemanticFile sFile = (ISemanticFile) file.getAdapter(ISemanticFile.class);
Assert.assertEquals(SampleWebDAVContentProvider.class.getName(), sFile.getContentProviderID());
sFile.synchronizeContentWithRemote(SyncDirection.INCOMING, options, monitor);
sFile.synchronizeContentWithRemote(SyncDirection.OUTGOING, options, monitor);
} catch (URISyntaxException e) {
throw new CoreException(new Status(IStatus.ERROR, TestPlugin.PLUGIN_ID, e.getMessage(), e));
} finally {
cleanupSFS(uri, monitor);
}
}
};
workspace.run(runnable, workspace.getRuleFactory().refreshRule(file), 0, new NullProgressMonitor());
}
void cleanupSFS(URI uri, IProgressMonitor monitor) throws CoreException {
if (uri != null) {
IFileStore store = EFS.getStore(uri);
if (!store.fetchInfo(EFS.NONE, monitor).exists()) {
store.delete(options, monitor);
}
}
}
private void validateAndResetCounters(final int[] counters) {
Assert.assertTrue("Added", counters[0] == 0);
Assert.assertTrue("Deleted", counters[1] == 0);
Assert.assertTrue("Changed", counters[2] == 0);
for (int j = 0; j < counters.length; j++) {
counters[j] = 0;
}
}
}