Skip to content

Commit

Permalink
FORGE-2734: Add Result.getEntity
Browse files Browse the repository at this point in the history
  • Loading branch information
gastaldi committed Mar 2, 2017
1 parent 630ffc8 commit 8652948
Show file tree
Hide file tree
Showing 4 changed files with 200 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
package org.jboss.forge.addon.ui.result;

import java.util.List;
import java.util.Optional;

import org.jboss.forge.furnace.util.Assert;

Expand All @@ -17,11 +18,13 @@
abstract class CompositeResultImpl implements CompositeResult
{
private final List<Result> results;
private final Object entity;

public CompositeResultImpl(List<Result> results)
CompositeResultImpl(List<Result> results, Object entity)
{
Assert.notNull(results, "Result list cannot be null");
this.results = results;
this.entity = entity;
}

@Override
Expand All @@ -30,14 +33,20 @@ public List<Result> getResults()
return results;
}

@Override
public Optional<Object> getEntity()
{
return Optional.ofNullable(entity);
}

@Override
public String getMessage()
{
throw new UnsupportedOperationException(
"getMessage() should not be called in a CompositeResult. Call getResults() instead.");
}

public static CompositeResult from(List<Result> results)
public static CompositeResult from(List<Result> results, Object entity)
{
boolean failed = false;
Throwable throwable = null;
Expand All @@ -52,17 +61,22 @@ public static CompositeResult from(List<Result> results)
}

if (failed)
return new CompositeResultFailed(results, throwable);
return new CompositeResultSuccess(results);
return new CompositeResultFailed(results, throwable, entity);
return new CompositeResultSuccess(results, entity);
}

public static CompositeResult from(List<Result> results)
{
return from(results, null);
}

private static class CompositeResultFailed extends CompositeResultImpl implements Result, Failed
{
private final Throwable exception;

public CompositeResultFailed(List<Result> results, Throwable e)
public CompositeResultFailed(List<Result> results, Throwable e, Object entity)
{
super(results);
super(results, entity);
this.exception = e;
}

Expand All @@ -75,9 +89,9 @@ public Throwable getException()

private static class CompositeResultSuccess extends CompositeResultImpl implements Result
{
public CompositeResultSuccess(List<Result> results)
public CompositeResultSuccess(List<Result> results, Object entity)
{
super(results);
super(results, entity);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
*/
package org.jboss.forge.addon.ui.result;

import java.util.Optional;

import org.jboss.forge.addon.ui.command.UICommand;

/**
Expand All @@ -18,5 +20,10 @@ public interface Result
/**
* Get the output message from the executed {@link UICommand}.
*/
public String getMessage();
String getMessage();

/**
* Any Java type instance for a response entity that is supported by the runtime can be passed.
*/
Optional<Object> getEntity();
}
84 changes: 58 additions & 26 deletions ui/api/src/main/java/org/jboss/forge/addon/ui/result/Results.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@
*/
package org.jboss.forge.addon.ui.result;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import org.jboss.forge.addon.ui.command.UICommand;
import org.jboss.forge.addon.ui.result.navigation.NavigationResultBuilder;
import org.jboss.forge.furnace.util.Lists;

/**
* Utilities for creating {@link Result} instances.
Expand All @@ -35,30 +36,46 @@ public static final Result success(String message)
return new SuccessfulResult(message);
}

/**
* Create a successful {@link Result} with a message and an optional entity.
*/
public static final Result success(String message, Object entity)
{
return new SuccessfulResult(message, entity);
}

/**
* Create a failed {@link Result}.
*/
public static final Result fail()
public static final Failed fail()
{
return fail(null);
}

/**
* Create a failed {@link Result} with a message.
*/
public static final Result fail(String message)
public static final Failed fail(String message)
{
return new FailedResult(message);
}

/**
* Create a failed {@link Result} with a message and {@link Throwable} root cause.
*/
public static final Result fail(String message, Throwable e)
public static final Failed fail(String message, Throwable e)
{
return new FailedResult(message, e);
}

/**
* Create a failed {@link Result} with a message and {@link Throwable} root cause.
*/
public static final Failed fail(String message, Throwable e, Object entity)
{
return new FailedResult(message, e, entity);
}

/**
* Create a {@link NavigationResult} using the given {@link UICommand} type as the target.
*/
Expand Down Expand Up @@ -120,39 +137,31 @@ public static NavigationResultBuilder navigationBuilder()
*/
public static CompositeResult aggregate(Iterable<Result> results)
{
List<Result> resultList = toList(results);
List<Result> resultList = Lists.toList(results);
return CompositeResultImpl.from(resultList);
}

// TODO: Move to an utils method
private static <T> List<T> toList(Iterable<T> iterable)
public static CompositeResult aggregate(Iterable<Result> results, Object entity)
{
if (iterable == null)
{
return null;
}
else if (iterable instanceof List)
{
return (List<T>) iterable;
}
else
{
List<T> list = new ArrayList<>();
for (T obj : iterable)
{
list.add(obj);
}
return list;
}
List<Result> resultList = Lists.toList(results);
return CompositeResultImpl.from(resultList, entity);
}

private static class SuccessfulResult implements Result
{
private final String message;
private final Object entity;

SuccessfulResult(String message)
{
this.message = message;
this.entity = null;
}

SuccessfulResult(String message, Object entity)
{
this.message = message;
this.entity = entity;
}

@Override
Expand All @@ -161,6 +170,12 @@ public String getMessage()
return message;
}

@Override
public Optional<Object> getEntity()
{
return Optional.ofNullable(entity);
}

@Override
public String toString()
{
Expand All @@ -171,17 +186,28 @@ public String toString()
private static class FailedResult implements Result, Failed
{
private final String message;
private Throwable e;
private final Object entity;
private final Throwable e;

FailedResult(String message)
{
this.message = message;
this.e = null;
this.entity = null;
}

public FailedResult(String message, Throwable e)
FailedResult(String message, Throwable e)
{
this.message = message;
this.e = e;
this.entity = null;
}

FailedResult(String message, Throwable e, Object entity)
{
this.message = message;
this.e = e;
this.entity = entity;
}

@Override
Expand All @@ -196,6 +222,12 @@ public Throwable getException()
return e;
}

@Override
public Optional<Object> getEntity()
{
return Optional.ofNullable(entity);
}

@Override
public String toString()
{
Expand Down
112 changes: 112 additions & 0 deletions ui/api/src/test/java/org/jboss/forge/addon/ui/result/ResultsTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
/*
* Copyright 2017 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.addon.ui.result;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertThat;

import org.junit.Test;

/**
*
* @author <a href="mailto:ggastald@redhat.com">George Gastaldi</a>
*/
public class ResultsTest
{

/**
* Test method for {@link org.jboss.forge.addon.ui.result.Results#success()}.
*/
@Test
public void testSuccess()
{
Result success = Results.success();
assertThat(success.getMessage(), nullValue());
assertThat(success.getEntity().isPresent(), is(false));
}

/**
* Test method for {@link org.jboss.forge.addon.ui.result.Results#success(java.lang.String)}.
*/
@Test
public void testSuccessString()
{
Result success = Results.success("Foo");
assertThat(success.getMessage(), equalTo("Foo"));
assertThat(success.getEntity().isPresent(), is(false));
}

/**
* Test method for {@link org.jboss.forge.addon.ui.result.Results#success(java.lang.String, java.lang.Object)}.
*/
@Test
public void testSuccessStringEntity()
{
Object anything = new Object();
Result success = Results.success("Foo", anything);
assertThat(success.getMessage(), equalTo("Foo"));
assertThat(success.getEntity().isPresent(), is(true));
assertSame(anything, success.getEntity().get());
}

/**
* Test method for {@link org.jboss.forge.addon.ui.result.Results#fail()}.
*/
@Test
public void testFail()
{
Failed failed = Results.fail();
assertThat(failed.getMessage(), nullValue());
assertThat(failed.getException(), nullValue());
assertThat(failed.getEntity().isPresent(), is(false));
}

/**
* Test method for {@link org.jboss.forge.addon.ui.result.Results#fail(java.lang.String)}.
*/
@Test
public void testFailString()
{
Failed failed = Results.fail("Foo");
assertThat(failed.getMessage(), equalTo("Foo"));
assertThat(failed.getException(), nullValue());
assertThat(failed.getEntity().isPresent(), is(false));
}

/**
* Test method for {@link org.jboss.forge.addon.ui.result.Results#fail(java.lang.String, java.lang.Throwable)}.
*/
@Test
public void testFailStringThrowable()
{
NullPointerException e = new NullPointerException();
Failed failed = Results.fail("Foo", e);
assertThat(failed.getMessage(), equalTo("Foo"));
assertSame(e, failed.getException());
assertThat(failed.getEntity().isPresent(), is(false));
}

/**
* Test method for
* {@link org.jboss.forge.addon.ui.result.Results#fail(java.lang.String, java.lang.Throwable, java.lang.Object)}.
*/
@Test
public void testFailStringThrowableObject()
{
Object anything = new Object();
NullPointerException e = new NullPointerException();
Failed failed = Results.fail("Foo", e, anything);
assertThat(failed.getMessage(), equalTo("Foo"));
assertSame(e, failed.getException());
assertThat(failed.getEntity().isPresent(), is(true));
assertSame(anything, failed.getEntity().get());
}
}

0 comments on commit 8652948

Please sign in to comment.