/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* 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:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.api.resources;
import com.google.common.annotations.Beta;
import org.eclipse.che.ide.resource.Path;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* Delta which describes changes which has made outside system resource management.
* For example some refactoring mechanisms may includes from many preparing steps and after applying refactoring resource
* management should know what exactly happened with resources in the third-party components.
* <p/>
* When third-party component performs any changes in the resources, resource management should be informed about external
* changes by creating instances of current delta and calling {@link Container#synchronize(ResourceDelta...)}.
* <p/>
* Given resource paths should be absolute.
* <p/>
* Example of usage:
* <pre>
* ResourceDelta deltaUpdate = new ExternalResourceDelta(Path.valueOf("/some/path_1"), ResourceDelta.UPDATED);
* ResourceDelta deltaRemove = new ExternalResourceDelta(Path.valueOf("/some/path_2"), ResourceDelta.REMOVED);
* ResourceDelta deltaAdd = new ExternalResourceDelta(Path.valueOf("/some/path_3"), ResourceDelta.ADDED);
* ResourceDelta deltaMove = new ExternalResourceDelta(Path.valueOf("/some/path_3"), Path.valueOf("/some/path_2"),
* ResourceDelta.ADDED | ResourceDelta.MOVED_FROM | ResourceDelta.MOVED_FROM);
*
* Workspace workspace = ... ;
* workspace.synchronize(deltaUpdate, deltaRemove, deltaAdd, deltaMove).then(new Operation<ResourceDelta[]>() {
* public void apply(ResourceDelta[] appliedDeltas) throws OperationException {
* //do something after deltas have been resolved
* }
* });
* </pre>
*
* @author Vlad Zhukovskiy
* @see ResourceDelta
* @see Container#synchronize(ResourceDelta...)
* @since 4.4.0
*/
@Beta
public class ExternalResourceDelta implements ResourceDelta {
private Path newPath;
private Path oldPath;
protected static int KIND_MASK = 0xF;
protected int status;
public ExternalResourceDelta(Path path, int status) {
this(path, null, status);
}
public ExternalResourceDelta(Path newPath, Path oldPath, int status) {
this.newPath = checkNotNull(newPath);
this.oldPath = oldPath;
this.status = status;
}
/** {@inheritDoc} */
@Override
public int getKind() {
return status & KIND_MASK;
}
/** {@inheritDoc} */
@Override
public int getFlags() {
return status & ~KIND_MASK;
}
/** {@inheritDoc} */
@Override
public Path getFromPath() {
return oldPath;
}
/** {@inheritDoc} */
@Override
public Path getToPath() {
return newPath;
}
/** {@inheritDoc} */
@Override
public Resource getResource() {
return null;
}
/** {@inheritDoc} */
@Override
public String toString() {
return "ExternalResourceDelta{" +
"newPath=" + newPath +
", oldPath=" + oldPath +
", status=" + status +
'}';
}
}