You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2018/01/23 10:57:47 UTC

[isis] 10/10: ISIS-1841 refactoring switch statements

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch ISIS-1846_internal_utils
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 8e8b5f1a8e4780b467ab31a7d909f89e499244a9
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Jan 23 11:37:42 2018 +0100

    ISIS-1841 refactoring switch statements
    
    such that unmatched cases always throw an exception (internal error)
---
 .../isis/applib/fixturescripts/FixtureScript.java  |  3 +-
 .../isis/applib/fixturescripts/FixtureScripts.java |  3 ++
 .../applib/internal/exceptions/_Exceptions.java    | 36 +++++++++++++++++++---
 .../layout/menubars/bootstrap3/BS3MenuBars.java    |  5 +++
 .../isis/applib/services/bookmark/Bookmark.java    |  5 +--
 .../isis/applib/services/dto/DtoMappingHelper.java |  6 ++--
 .../services/eventbus/AbstractDomainEvent.java     | 26 ++++++++++++++--
 .../apache/isis/schema/utils/CommonDtoUtils.java   | 11 ++-----
 .../isis/core/metamodel/adapter/oid/Oid.java       |  9 ++++--
 .../AuditableFacetForDomainObjectAnnotation.java   |  5 ++-
 10 files changed, 87 insertions(+), 22 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java
index 955cb50..7167a07 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java
@@ -37,6 +37,7 @@ import org.apache.isis.applib.fixtures.FixtureType;
 import org.apache.isis.applib.fixtures.InstallableFixture;
 import org.apache.isis.applib.internal.base._Casts;
 import org.apache.isis.applib.internal.base._Strings;
+import org.apache.isis.applib.internal.exceptions._Exceptions;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.applib.services.repository.RepositoryService;
@@ -642,7 +643,7 @@ public abstract class FixtureScript
                 return childFixtureScript;
 
             default:
-                throw new IllegalArgumentException("Execution strategy: '" + executionStrategy + "' not recognized");
+            	throw _Exceptions.unmatchedCase("Execution strategy: '%s' not recognized", executionStrategy);
             }
         }
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
index a3dde31..2a6d52c 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
@@ -42,6 +42,7 @@ import org.apache.isis.applib.annotation.Parameter;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.RestrictTo;
+import org.apache.isis.applib.internal.exceptions._Exceptions;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.applib.services.classdiscovery.ClassDiscoveryService;
 import org.apache.isis.applib.services.fixturespec.FixtureScriptsDefault;
@@ -461,6 +462,8 @@ public abstract class FixtureScripts extends AbstractService {
                     break;
                 case IGNORE:
                     return null;
+                default:
+                	throw _Exceptions.unmatchedCase(getNonPersistedObjectsStrategy());
             }
         }
         final FixtureResult fixtureResult = new FixtureResult();
diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/exceptions/_Exceptions.java b/core/applib/src/main/java/org/apache/isis/applib/internal/exceptions/_Exceptions.java
index b47a88d..c28e5f4 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/internal/exceptions/_Exceptions.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/internal/exceptions/_Exceptions.java
@@ -19,8 +19,11 @@
 
 package org.apache.isis.applib.internal.exceptions;
 
+import java.util.Objects;
 import java.util.stream.Stream;
 
+import javax.annotation.Nullable;
+
 import org.apache.isis.applib.internal.base._NullSafe;
 
 /**
@@ -37,19 +40,44 @@ public final class _Exceptions {
 
 	private _Exceptions(){}
 	
-	public static final RuntimeException unmatchedCase(Object _case) {
-		return new RuntimeException("internal error: unmatched case in switch statement: "+_case);
+	// -- FRAMEWORK INTERNAL ERRORS 
+	
+	/**
+	 * Most likely to be used in switch statements to handle the default case.  
+	 * @param _case the unmatched case to be reported
+	 * @return
+	 */
+	public static final IllegalArgumentException unmatchedCase(@Nullable Object _case) {
+		return new IllegalArgumentException("internal error: unmatched case in switch statement: "+_case);
+	}
+	
+	/**
+	 * Most likely to be used in switch statements to handle the default case.
+	 * @param format like in {@link java.lang.String#format(String, Object...)}
+	 * @param _case the unmatched case to be reported
+	 * @return
+	 */
+	public static final IllegalArgumentException unmatchedCase(String format, @Nullable Object _case) {
+		Objects.requireNonNull(format);
+		return new IllegalArgumentException(String.format(format, _case));
 	}
 	
 	public static final RuntimeException unexpectedCodeReach() {
 		return new RuntimeException("internal error: code was reached, that is expected unreachable");
 	}	
 	
-	public static final Stream<String> streamStacktraceLines(Throwable e, int maxLines) {
-		return _NullSafe.stream(e.getStackTrace())
+	// -- STACKTRACE UTILITITIES
+	
+	public static final Stream<String> streamStacktraceLines(@Nullable Throwable ex, int maxLines) {
+		if(ex==null) {
+			return Stream.empty();
+		}
+		return _NullSafe.stream(ex.getStackTrace())
 				.map(StackTraceElement::toString)
 				.limit(maxLines);
 	}
 
 	
+
+	
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/menubars/bootstrap3/BS3MenuBars.java b/core/applib/src/main/java/org/apache/isis/applib/layout/menubars/bootstrap3/BS3MenuBars.java
index 8529b0b..e4d5064 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/menubars/bootstrap3/BS3MenuBars.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/menubars/bootstrap3/BS3MenuBars.java
@@ -25,6 +25,7 @@ import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 
 import org.apache.isis.applib.annotation.DomainServiceLayout;
+import org.apache.isis.applib.internal.exceptions._Exceptions;
 import org.apache.isis.applib.layout.component.ServiceActionLayoutData;
 import org.apache.isis.applib.layout.menubars.MenuBars;
 
@@ -88,6 +89,10 @@ public class BS3MenuBars extends org.apache.isis.applib.layout.menubars.MenuBars
             return getSecondary();
         case TERTIARY:
             return getTertiary();
+		case NOT_SPECIFIED:
+			break;
+		default:
+			throw _Exceptions.unmatchedCase(menuBar);
         }
         return null;
     }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/bookmark/Bookmark.java b/core/applib/src/main/java/org/apache/isis/applib/services/bookmark/Bookmark.java
index a1f97e7..0afa0b8 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/bookmark/Bookmark.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/bookmark/Bookmark.java
@@ -24,6 +24,7 @@ import java.util.Iterator;
 import com.google.common.base.Splitter;
 
 import org.apache.isis.applib.annotation.Value;
+import org.apache.isis.applib.internal.exceptions._Exceptions;
 import org.apache.isis.schema.common.v1.BookmarkObjectState;
 import org.apache.isis.schema.common.v1.OidDto;
 
@@ -108,6 +109,7 @@ public class Bookmark implements Serializable {
 
         public static ObjectState from(final BookmarkObjectState objectState) {
             if(objectState == null) {
+                // persistent is assumed if not specified
                 return ObjectState.PERSISTENT;
             }
             switch (objectState) {
@@ -118,8 +120,7 @@ public class Bookmark implements Serializable {
             case PERSISTENT:
                 return ObjectState.PERSISTENT;
             default:
-                // persistent is assumed if not specified
-                return ObjectState.PERSISTENT;
+            	throw _Exceptions.unmatchedCase(objectState);
             }
         }
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/dto/DtoMappingHelper.java b/core/applib/src/main/java/org/apache/isis/applib/services/dto/DtoMappingHelper.java
index 21c5d74..9a97c6c 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/dto/DtoMappingHelper.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/dto/DtoMappingHelper.java
@@ -21,6 +21,7 @@ import javax.inject.Inject;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.internal.exceptions._Exceptions;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.schema.common.v1.BookmarkObjectState;
@@ -56,9 +57,10 @@ public class DtoMappingHelper {
             return BookmarkObjectState.TRANSIENT;
         case VIEW_MODEL:
             return BookmarkObjectState.VIEW_MODEL;
+        default:
+        	throw _Exceptions.unmatchedCase("objectState '%s' not recognized", bookmark.getObjectState());	
         }
-        throw new IllegalArgumentException(
-                String.format("objectState '%s' not recognized", bookmark.getObjectState()));
+        
     }
 
     @Inject
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/AbstractDomainEvent.java b/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/AbstractDomainEvent.java
index e5728cd..ccb1331 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/AbstractDomainEvent.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/AbstractDomainEvent.java
@@ -20,12 +20,15 @@ package org.apache.isis.applib.services.eventbus;
 
 import java.util.EventObject;
 import java.util.Map;
-import com.google.common.collect.Maps;
+
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.internal.exceptions._Exceptions;
 import org.apache.isis.applib.services.i18n.TranslatableString;
 import org.apache.isis.applib.util.ObjectContracts;
 
+import com.google.common.collect.Maps;
+
 public abstract class AbstractDomainEvent<S> extends java.util.EventObject {
 
     private static final long serialVersionUID = 1L;
@@ -244,11 +247,20 @@ public abstract class AbstractDomainEvent<S> extends java.util.EventObject {
     public void veto(final String reason, final Object... args) {
         switch (getEventPhase()) {
             case HIDE:
-                hide();
+                hide(); 
+                //TODO [ahuber] REVIEW missing break or intended?
             case DISABLE:
                 disable(String.format(reason, args));
+                //TODO [ahuber] REVIEW missing break or intended?
             case VALIDATE:
                 invalidate(String.format(reason, args));
+                break;
+                
+            case EXECUTED:
+            case EXECUTING:
+            	break;
+            default:
+            	throw _Exceptions.unmatchedCase(getEventPhase());
         }
     }
     /**
@@ -268,10 +280,20 @@ public abstract class AbstractDomainEvent<S> extends java.util.EventObject {
         switch (getEventPhase()) {
             case HIDE:
                 hide();
+                //TODO [ahuber] missing break or intended?
             case DISABLE:
                 disable(translatableReason);
+                //TODO [ahuber] REVIEW missing break or intended?
             case VALIDATE:
                 invalidate(translatableReason);
+                break;
+                
+            case EXECUTED:
+            case EXECUTING:
+            	break;
+            default:
+            	throw _Exceptions.unmatchedCase(getEventPhase());
+
         }
     }
     //endregion
diff --git a/core/applib/src/main/java/org/apache/isis/schema/utils/CommonDtoUtils.java b/core/applib/src/main/java/org/apache/isis/schema/utils/CommonDtoUtils.java
index 4291d82..44626b0 100644
--- a/core/applib/src/main/java/org/apache/isis/schema/utils/CommonDtoUtils.java
+++ b/core/applib/src/main/java/org/apache/isis/schema/utils/CommonDtoUtils.java
@@ -31,6 +31,7 @@ import org.joda.time.LocalDate;
 import org.joda.time.LocalDateTime;
 import org.joda.time.LocalTime;
 import org.apache.isis.applib.internal.base._Casts;
+import org.apache.isis.applib.internal.exceptions._Exceptions;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.schema.cmd.v1.ParamDto;
@@ -250,10 +251,7 @@ public final class CommonDtoUtils {
             return null;
         }
         default:
-            // should never happen; all cases are listed above
-            throw new IllegalArgumentException(String.format(
-                    "newValueDto(): do not recognize valueType %s (likely a framework error)",
-                    valueType));
+        	throw _Exceptions.unmatchedCase(valueType);
         }
     }
 
@@ -329,10 +327,7 @@ public final class CommonDtoUtils {
         case VOID:
             return null;
         default:
-            // should never happen; all cases are listed above
-            throw new IllegalArgumentException(String.format(
-                    "getValueDto(...): do not recognize valueType %s (likely a framework error)",
-                    valueType));
+        	throw _Exceptions.unmatchedCase(valueType);
         }
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java
index 0d6f59f..5e000cb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java
@@ -20,6 +20,7 @@
 package org.apache.isis.core.metamodel.adapter.oid;
 
 import org.apache.isis.applib.annotation.Value;
+import org.apache.isis.applib.internal.exceptions._Exceptions;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.core.commons.encoding.Encodable;
 import org.apache.isis.core.metamodel.adapter.version.Version;
@@ -94,8 +95,10 @@ public interface Oid extends Encodable {
                     return VIEWMODEL;
                 case TRANSIENT:
                     return TRANSIENT;
-                default:
+                case PERSISTENT:
                     return PERSISTENT;
+                default:
+                	throw _Exceptions.unmatchedCase(objectState);
             }
         }
         public Bookmark.ObjectState asBookmarkObjectState() {
@@ -104,8 +107,10 @@ public interface Oid extends Encodable {
                     return Bookmark.ObjectState.VIEW_MODEL;
                 case TRANSIENT:
                     return Bookmark.ObjectState.TRANSIENT;
-                default:
+                case PERSISTENT:
                     return Bookmark.ObjectState.PERSISTENT;
+                default:
+                	throw _Exceptions.unmatchedCase(this);
             }
         }
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/auditing/AuditableFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/auditing/AuditableFacetForDomainObjectAnnotation.java
index 378b7a1..3b0319b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/auditing/AuditableFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/auditing/AuditableFacetForDomainObjectAnnotation.java
@@ -23,6 +23,7 @@ import java.util.List;
 
 import org.apache.isis.applib.annotation.Auditing;
 import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.internal.exceptions._Exceptions;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.audit.AuditableFacet;
@@ -47,8 +48,10 @@ public class AuditableFacetForDomainObjectAnnotation extends AuditableFacetAbstr
                     case ENABLED:
                         return new AuditableFacetForDomainObjectAnnotation(Enablement.ENABLED, holder);
                     case AS_CONFIGURED:
-                    default:
+                    case NOT_SPECIFIED:
                         return new AuditableFacetForDomainObjectAnnotationAsConfigured(holder);
+                    default:
+                    	throw _Exceptions.unmatchedCase(domainObject.auditing());
                     }
                 })
                 .orElse(new AuditableFacetFromConfiguration(holder));

-- 
To stop receiving notification emails like this one, please contact
ahuber@apache.org.