/*******************************************************************************
* 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.resources.impl;
import com.google.common.annotations.Beta;
import com.google.common.base.Optional;
import org.eclipse.che.api.core.model.project.ProjectConfig;
import org.eclipse.che.api.project.shared.dto.SourceEstimation;
import org.eclipse.che.api.promises.client.Function;
import org.eclipse.che.api.promises.client.FunctionException;
import org.eclipse.che.api.promises.client.Promise;
import org.eclipse.che.api.promises.client.PromiseProvider;
import org.eclipse.che.ide.api.resources.Container;
import org.eclipse.che.ide.api.resources.File;
import org.eclipse.che.ide.api.resources.Folder;
import org.eclipse.che.ide.api.resources.Project;
import org.eclipse.che.ide.api.resources.Resource;
import org.eclipse.che.ide.api.resources.ResourceDelta;
import org.eclipse.che.ide.resource.Path;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
/**
* Default implementation of the {@code Container}.
*
* @author Vlad Zhukovskyi
* @see ResourceImpl
* @see Container
* @since 4.4.0
*/
@Beta
abstract class ContainerImpl extends ResourceImpl implements Container {
protected PromiseProvider promiseProvider;
protected ContainerImpl(Path path, ResourceManager resourceManager, PromiseProvider promiseProvider) {
super(path, resourceManager);
this.promiseProvider = checkNotNull(promiseProvider);
}
/** {@inheritDoc} */
@Override
public Promise<Optional<File>> getFile(final Path relativePath) {
return resourceManager.getFile(getLocation().append(relativePath));
}
/** {@inheritDoc} */
@Override
public Promise<Optional<File>> getFile(String relativePath) {
return resourceManager.getFile(getLocation().append(relativePath));
}
/** {@inheritDoc} */
@Override
public Promise<Optional<Container>> getContainer(Path relativePath) {
return resourceManager.getContainer(getLocation().append(relativePath));
}
/** {@inheritDoc} */
@Override
public Promise<Optional<Container>> getContainer(String relativePath) {
return resourceManager.getContainer(getLocation().append(relativePath));
}
/** {@inheritDoc} */
@Override
public Promise<Resource[]> getChildren(final boolean forceUpdate) {
return resourceManager.childrenOf(this, forceUpdate).thenPromise(new Function<Resource[], Promise<Resource[]>>() {
/** {@inheritDoc} */
@Override
public Promise<Resource[]> apply(Resource[] children) throws FunctionException {
if (children.length == 0 && !forceUpdate) {
return getChildren(true);
}
return promiseProvider.resolve(children);
}
});
}
/** {@inheritDoc} */
@Override
public Promise<Resource[]> getChildren() {
return getChildren(false);
}
/** {@inheritDoc} */
@Override
public Project.ProjectRequest importProject() {
return new Project.ProjectRequest() {
private ProjectConfig config;
/** {@inheritDoc} */
@Override
public Request<Project, ProjectConfig> withBody(ProjectConfig object) {
this.config = object;
return this;
}
/** {@inheritDoc} */
@Override
public ProjectConfig getBody() {
return config;
}
/** {@inheritDoc} */
@Override
public Promise<Project> send() {
return resourceManager.importProject(this);
}
};
}
/** {@inheritDoc} */
@Override
public Project.ProjectRequest newProject() {
return new Project.ProjectRequest() {
private ProjectConfig config;
/** {@inheritDoc} */
@Override
public Request<Project, ProjectConfig> withBody(ProjectConfig object) {
this.config = object;
return this;
}
/** {@inheritDoc} */
@Override
public ProjectConfig getBody() {
return config;
}
/** {@inheritDoc} */
@Override
public Promise<Project> send() {
return resourceManager.createProject(this);
}
};
}
/** {@inheritDoc} */
@Override
public Promise<Folder> newFolder(String name) {
return resourceManager.createFolder(this, name);
}
/** {@inheritDoc} */
@Override
public Promise<File> newFile(String name, String content) {
return resourceManager.createFile(this, name, content);
}
/** {@inheritDoc} */
@Override
public Promise<Resource[]> synchronize() {
return resourceManager.synchronize(this);
}
/** {@inheritDoc} */
@Override
public Promise<ResourceDelta[]> synchronize(ResourceDelta...deltas) {
checkState(getLocation().isRoot(), "External deltas should be applied on the workspace root");
return resourceManager.synchronize(deltas);
}
/** {@inheritDoc} */
@Override
public Promise<Resource[]> search(String fileMask, String contentMask) {
return resourceManager.search(this, fileMask, contentMask);
}
/** {@inheritDoc} */
@Override
public Promise<Resource[]> getTree(int depth) {
return resourceManager.getRemoteResources(this, depth, true);
}
@Override
public Promise<SourceEstimation> estimate(String projectType) {
return resourceManager.estimate(this, projectType);
}
}