/*******************************************************************************
* 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.api.promises.client.Promise;
import org.eclipse.che.ide.resource.Path;
/**
* Represents a file on the client side.
* Note, that virtual file instances are created by request, so in this case there can be several instances of virtual file that
* corresponds to the same file.
*
* Virtual file may has link to related {@code ProjectConfig}.
*
* @author Evgen Vidolob
* @author Vlad Zhukovskyi
*/
public interface VirtualFile {
/**
* Returns path for the virtual file. Path may in various representation based on implementation.
* Usually it something like physical file or folder path, e.g. `/path/to/som/file`.
* Path should always be non-null or non-empty.
*
* @return non-null unique path.
* @since 4.4.0
*/
Path getLocation();
/**
* Returns name for the virtual file.
* Name should always be non-null but it may be empty.
*
* @return non-null name.
*/
String getName();
/**
* Returns display name for the virtual file.
* Display name usually uses to display file name in editor tab or other places.
* Value should not be a {@code null}.
*
* @return non-null display name.
*/
String getDisplayName();
/**
* Returns {@code true} in case if virtual file doesn't have ability to be updated.
*
* @return {@code true} if file is read only, otherwise false.
*/
boolean isReadOnly();
/**
* Returns url string where file content may be fetched. Some file type can't represent their content as string.
* So virtual file provide url where it content. For example if this virtual file represent image,
* image viewer may use this URL as src for {@link com.google.gwt.user.client.ui.Image}.
*
* @return url or null if content url doesn't exists.
*/
String getContentUrl();
/**
* Get content of the file. Promise object should not be a null value.
* If implementation doesn't have ability to load string content of the current file,
* then preferable to throw {@code UnsupportedOperationException} in promise.
*
* @return {@code Promise} with string representation of file content.
*/
Promise<String> getContent();
/**
* Update content of the file. Some implementations may not support updating their content,
* so in this case preferable to throw {@code UnsupportedOperationException} in promise.
*
* @param content
* new content of the file
* @return {@code Promise} with success operation if content has been updated.
*/
Promise<Void> updateContent(String content);
}