/*******************************************************************************
* Copyright (C) 2016 Obeo.
*
* 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
*******************************************************************************/
package org.eclipse.egit.ui.view.synchronize;
import static org.eclipse.egit.ui.view.synchronize.MockLogicalModelProvider.MOCK_LOGICAL_FILE_EXTENSION;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IStorage;
import org.eclipse.core.resources.mapping.RemoteResourceMappingContext;
import org.eclipse.core.resources.mapping.ResourceMapping;
import org.eclipse.core.resources.mapping.ResourceMappingContext;
import org.eclipse.core.resources.mapping.ResourceTraversal;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubMonitor;
/**
* This resource mapping requires a remote context to get the logical model. It
* will parse the content of its file which is supposed to be a list of files in
* the same folder and aggregate all these files in its logical model. It does
* that for every side, remote and base included.
*/
public class MockLogicalResourceMapping extends ResourceMapping {
private final IFile file;
private final String providerId;
public MockLogicalResourceMapping(IFile file, String providerId) {
this.file = file;
this.providerId = providerId;
}
@Override
public Object getModelObject() {
return file;
}
@Override
public String getModelProviderId() {
return providerId;
}
@Override
public ResourceTraversal[] getTraversals(ResourceMappingContext context,
IProgressMonitor monitor) throws CoreException {
SubMonitor sm = SubMonitor.convert(monitor, 3);
Set<IFile> result = new LinkedHashSet<IFile>();
result.add(file);
try {
List<IFile> dependencies = getDependencies(file, file.getParent());
result.addAll(dependencies);
sm.worked(1);
if (context instanceof RemoteResourceMappingContext) {
RemoteResourceMappingContext rmc = (RemoteResourceMappingContext) context;
IStorage baseContents = rmc.fetchBaseContents(file,
sm.newChild(1));
if (baseContents != null) {
result.addAll(
getDependencies(baseContents, file.getParent()));
}
IStorage remoteContents = rmc.fetchRemoteContents(file,
sm.newChild(1));
if (remoteContents != null) {
result.addAll(
getDependencies(remoteContents, file.getParent()));
}
}
} catch (IOException e) {
throw new CoreException(
new Status(IStatus.ERROR, "org.eclipse.egit.ui.test",
"Exception while computing logical model", e));
}
final IResource[] resourceArray = result
.toArray(new IResource[result.size()]);
return new ResourceTraversal[] { new ResourceTraversal(resourceArray,
IResource.DEPTH_ONE, IResource.NONE), };
}
private List<IFile> getDependencies(IStorage storage, IContainer c)
throws CoreException, IOException {
List<IFile> result = new ArrayList<>();
try (InputStream contents = storage.getContents();) {
BufferedReader r = new BufferedReader(
new InputStreamReader(contents, Charset.forName("UTF-8")));
try {
while (true) {
String line = r.readLine();
IFile dep = c.getFile(new Path(line));
result.add(dep);
}
} catch (Exception e) {
// over
}
}
return result;
}
protected void addLogicalModelFiles(IResource[] resources,
Set<IFile> sampleSiblings) {
if (resources == null) {
return;
}
for (IResource res : resources) {
if (res instanceof IFile && MOCK_LOGICAL_FILE_EXTENSION
.equals(res.getFileExtension())) {
sampleSiblings.add((IFile) res);
}
}
}
@Override
public IProject[] getProjects() {
return new IProject[] { file.getProject(), };
}
}