/*
* Copyright (c) 2012 Eike Stepper (Berlin, Germany) 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:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.emf.cdo.transfer.spi.workspace;
import org.eclipse.emf.cdo.transfer.CDOTransferElement;
import org.eclipse.emf.cdo.transfer.CDOTransferSystem;
import org.eclipse.emf.cdo.transfer.CDOTransferType;
import org.eclipse.net4j.util.WrappedException;
import org.eclipse.net4j.util.io.IORuntimeException;
import org.eclipse.emf.common.util.URI;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import java.io.InputStream;
/**
* An Eclipse {@link IWorkspace workspace}-based implementation of a {@link CDOTransferSystem transfer system}.
*
* @author Eike Stepper
* @since 4.2
*/
public class WorkspaceTransferSystem extends CDOTransferSystem
{
public static final WorkspaceTransferSystem INSTANCE = new WorkspaceTransferSystem();
public static final String TYPE = "workspace";
private static final IWorkspaceRoot ROOT = ResourcesPlugin.getWorkspace().getRoot();
public WorkspaceTransferSystem()
{
super(false);
}
@Override
public String getType()
{
return TYPE;
}
public String getDefaultEncoding()
{
try
{
return ROOT.getDefaultCharset();
}
catch (CoreException ex)
{
throw WrappedException.wrap(ex);
}
}
protected String getEncoding(IFile file)
{
try
{
return file.getCharset();
}
catch (CoreException ex)
{
throw WrappedException.wrap(ex);
}
}
@Override
public CDOTransferType getDefaultTransferType(CDOTransferElement element)
{
if (element instanceof Element)
{
Element node = (Element)element;
if (node.isDirectory())
{
return CDOTransferType.FOLDER;
}
IFile file = (IFile)node.getNativeObject();
// TODO Team is optional, handle its absence.
int type = org.eclipse.team.core.Team.getFileContentManager().getType(file);
switch (type)
{
case org.eclipse.team.core.Team.BINARY:
return CDOTransferType.BINARY;
case org.eclipse.team.core.Team.TEXT:
String encoding = getEncoding(file);
return CDOTransferType.text(encoding);
}
}
return super.getDefaultTransferType(element);
}
@Override
public URI getURI(IPath path)
{
return URI.createPlatformResourceURI(path.toString(), true);
}
@Override
public CDOTransferElement getElement(IPath path)
{
IResource resource = ROOT.findMember(path);
if (resource != null && resource.exists())
{
return new Element(this, resource);
}
return null;
}
@Override
public CDOTransferElement getElement(URI uri)
{
if (uri.isPlatformResource())
{
IPath path = new Path(uri.path()).removeFirstSegments(1).makeAbsolute();
return getElement(path);
}
return null;
}
@Override
public void createFolder(IPath path)
{
try
{
IFolder folder = ROOT.getFolder(path);
folder.create(true, true, null);
}
catch (CoreException ex)
{
throw new IORuntimeException(ex);
}
}
@Override
public void createBinary(IPath path, InputStream source, IProgressMonitor monitor)
{
try
{
IFile file = ROOT.getFile(path);
file.create(source, true, monitor);
}
catch (CoreException ex)
{
throw new IORuntimeException(ex);
}
}
@Override
public void createText(IPath path, InputStream source, String encoding, IProgressMonitor monitor)
{
try
{
IFile file = ROOT.getFile(path);
file.create(source, true, monitor);
file.setCharset(encoding, null);
}
catch (CoreException ex)
{
throw new IORuntimeException(ex);
}
}
@Override
public String toString()
{
return "Workspace";
}
/**
* @author Eike Stepper
*/
private static class Element extends CDOTransferElement
{
private IResource resource;
public Element(CDOTransferSystem system, IResource resource)
{
super(system);
this.resource = resource;
}
@Override
public Object getNativeObject()
{
return resource;
}
@Override
public IPath getPath()
{
return resource.getFullPath();
}
@Override
public boolean isDirectory()
{
return resource instanceof IContainer;
}
@Override
protected CDOTransferElement[] doGetChildren()
{
try
{
IResource[] children = ((IContainer)resource).members();
CDOTransferElement[] result = new Element[children.length];
for (int i = 0; i < children.length; i++)
{
IResource child = children[i];
result[i] = new Element(getSystem(), child);
}
return result;
}
catch (CoreException ex)
{
throw new IORuntimeException(ex);
}
}
@Override
protected InputStream doOpenInputStream()
{
try
{
return ((IFile)resource).getContents();
}
catch (CoreException ex)
{
throw new IORuntimeException(ex);
}
}
// @Override
// protected OutputStream doOpenOutputStream()
// {
// return new ByteArrayOutputStream()
// {
// @Override
// public void close() throws IOException
// {
// if (resource.exists())
// {
// try
// {
// ((IFile)resource).setContents(new ByteArrayInputStream(toByteArray()), true, true, null);
// }
// catch (CoreException ex)
// {
// throw new IOException(ex);
// }
// }
// }
// };
// }
}
}