From 83c5908ffc5c9deacdede805a12ff403997b87a9 Mon Sep 17 00:00:00 2001 From: Vladyslav Zhukovskyi Date: Wed, 11 Jan 2017 14:54:27 +0200 Subject: [PATCH] Add utility methods to cast resource to its particular type (#3653) --- .../che/ide/api/resources/Resource.java | 66 +++++++++++++++++++ .../che/ide/resources/impl/ResourceImpl.java | 24 +++++++ 2 files changed, 90 insertions(+) diff --git a/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/resources/Resource.java b/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/resources/Resource.java index f25082537b5..46f27d905db 100644 --- a/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/resources/Resource.java +++ b/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/resources/Resource.java @@ -95,6 +95,28 @@ public interface Resource extends Comparable { */ boolean isFile(); + /** + * Casts current resource to the {@link File} if the last one's represents a file. + *

+ * Example of usage: + *

+     *    public void doSome() {
+     *        Resource resource = ...;
+     *        if (resource.isFile()) {
+     *            File file = resource.asFile();
+     *        }
+     *    }
+     * 
+ * + * @return instance of {@link File} + * @throws IllegalStateException + * in case if current resource is not a file + * @see Resource#getResourceType() + * @see Resource#FILE + * @since 5.1.0 + */ + File asFile(); + /** * Returns {@code true} if current represents a folder. * @@ -105,6 +127,28 @@ public interface Resource extends Comparable { */ boolean isFolder(); + /** + * Casts current resource to the {@link Folder} if the last one's represents a folder. + *

+ * Example of usage: + *

+     *    public void doSome() {
+     *        Resource resource = ...;
+     *        if (resource.isFolder()) {
+     *            Folder folder = resource.asFolder();
+     *        }
+     *    }
+     * 
+ * + * @return instance of {@link Folder} + * @throws IllegalStateException + * in case if current resource is not a folder + * @see Resource#getResourceType() + * @see Resource#FOLDER + * @since 5.1.0 + */ + Folder asFolder(); + /** * Returns {@code true} if current represents a project. * @@ -115,6 +159,28 @@ public interface Resource extends Comparable { */ boolean isProject(); + /** + * Casts current resource to the {@link Project} if the last one's represents a project. + *

+ * Example of usage: + *

+     *    public void doSome() {
+     *        Resource resource = ...;
+     *        if (resource.isProject()) {
+     *            Project project = resource.asProject();
+     *        }
+     *    }
+     * 
+ * + * @return instance of {@link Project} + * @throws IllegalStateException + * in case if current resource is not a project + * @see Resource#getResourceType() + * @see Resource#PROJECT + * @since 5.1.0 + */ + Project asProject(); + /** * Copies resource to given {@code destination} path. Copy operation performs asynchronously and result of current * operation will be provided in {@code Promise} result. Destination path should have write access. diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/resources/impl/ResourceImpl.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/resources/impl/ResourceImpl.java index 814ff3687a7..a8b44042b94 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/resources/impl/ResourceImpl.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/resources/impl/ResourceImpl.java @@ -17,6 +17,8 @@ import org.eclipse.che.api.promises.client.Promise; 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.marker.Marker; @@ -27,6 +29,7 @@ import static com.google.common.base.Optional.of; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkState; import static com.google.common.base.Strings.isNullOrEmpty; import static java.lang.System.arraycopy; import static java.util.Arrays.copyOf; @@ -60,18 +63,39 @@ public boolean isFile() { return getResourceType() == FILE; } + @Override + public File asFile() { + checkState(isFile(), "Current resource is not a file"); + + return (File)this; + } + /** {@inheritDoc} */ @Override public boolean isFolder() { return getResourceType() == FOLDER; } + @Override + public Folder asFolder() { + checkState(isFolder(), "Current resource is not a folder"); + + return (Folder)this; + } + /** {@inheritDoc} */ @Override public boolean isProject() { return getResourceType() == PROJECT; } + @Override + public Project asProject() { + checkState(isProject(), "Current resource is not a project"); + + return (Project)this; + } + /** {@inheritDoc} */ @Override public Promise copy(Path destination) {