You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2013/12/12 16:44:53 UTC

git commit: ISIS-634: drop downs honour @TypicalLength

Updated Branches:
  refs/heads/master 08d5ca7b0 -> 3364e7617


ISIS-634: drop downs honour @TypicalLength

and enums' implementation of TypicalLengthFacet inspects actual length of those enums.

In addition:
- fixed a failing couple of tests in core.


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/3364e761
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/3364e761
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/3364e761

Branch: refs/heads/master
Commit: 3364e7617bd88730245d1b5f24d2bd6ec4711cc0
Parents: 08d5ca7
Author: Dan Haywood <da...@apache.org>
Authored: Thu Dec 12 15:44:39 2013 +0000
Committer: Dan Haywood <da...@apache.org>
Committed: Thu Dec 12 15:44:39 2013 +0000

----------------------------------------------------------------------
 .gitignore                                      |   2 +
 .../viewer/wicket/model/models/ScalarModel.java |  41 +++++-
 .../components/widgets/Select2ChoiceUtil.java   |  45 ++++++
 .../entitylink/EntityLinkSelect2Panel.java      |   4 +-
 .../valuechoices/ValueChoicesSelect2Panel.java  |   9 +-
 .../viewer/wicket/ui/pages/PageAbstract.css     |  15 +-
 .../specloader/ServiceInitializer.java          |   1 -
 .../enums/EnumValueSemanticsProvider.java       |  19 ++-
 .../string/StringValueSemanticsProvider.java    |   2 +-
 .../adapter/oid/OidMarshallerTest_marshal.java  |  83 -----------
 .../adapter/oid/OidMarshallerTest_marshall.java |  83 +++++++++++
 .../json/ExampleDomainObject.layout.properties  |   2 +-
 .../session/IsisSessionFactoryDefault.java      |  14 +-
 ...onFactoryAbstractTest_init_and_shutdown.java | 140 +------------------
 .../dom/src/main/java/dom/todo/ToDoItem.java    |   8 +-
 15 files changed, 210 insertions(+), 258 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/3364e761/.gitignore
----------------------------------------------------------------------
diff --git a/.gitignore b/.gitignore
index 3cdb102..ab593ae 100644
--- a/.gitignore
+++ b/.gitignore
@@ -37,3 +37,5 @@ pom.xml.versionsBackup
 .clover/
 *.jdproj
 JArchitectOut/
+
+core/integtestsupport/fixture-data

http://git-wip-us.apache.org/repos/asf/isis/blob/3364e761/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
index c10caee..5ce7ab7 100644
--- a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
+++ b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
@@ -19,6 +19,7 @@
 
 package org.apache.isis.viewer.wicket.model.models;
 
+import java.math.BigDecimal;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
@@ -39,11 +40,13 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.mandatory.MandatoryFacet;
 import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
+import org.apache.isis.core.metamodel.facets.typicallen.TypicalLengthFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.progmodel.facets.value.bigdecimal.BigDecimalValueFacet;
+import org.apache.isis.core.progmodel.facets.value.string.StringValueSemanticsProvider;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.links.LinksProvider;
@@ -219,6 +222,14 @@ public class ScalarModel extends EntityModel implements LinksProvider {
                 final BigDecimalValueFacet facet = property.getFacet(BigDecimalValueFacet.class);
                 return facet != null? facet.getScale(): null;
             }
+            
+            @Override
+            public int getTypicalLength(ScalarModel scalarModel) {
+                final PropertyMemento propertyMemento = scalarModel.getPropertyMemento();
+                final OneToOneAssociation property = propertyMemento.getProperty();
+                final TypicalLengthFacet facet = property.getFacet(TypicalLengthFacet.class);
+                return facet != null? facet.value() : StringValueSemanticsProvider.TYPICAL_LENGTH;
+            }
 
             @Override
             public void reset(ScalarModel scalarModel) {
@@ -363,6 +374,14 @@ public class ScalarModel extends EntityModel implements LinksProvider {
                 final BigDecimalValueFacet facet = actionParameter.getFacet(BigDecimalValueFacet.class);
                 return facet != null? facet.getScale(): null;
             }
+            
+            @Override
+            public int getTypicalLength(ScalarModel scalarModel) {
+                final ActionParameterMemento parameterMemento = scalarModel.getParameterMemento();
+                final ObjectActionParameter actionParameter = parameterMemento.getActionParameter();
+                final TypicalLengthFacet facet = actionParameter.getFacet(TypicalLengthFacet.class);
+                return facet != null? facet.value() : StringValueSemanticsProvider.TYPICAL_LENGTH;
+            }
 
             @Override
             public void reset(ScalarModel scalarModel) {
@@ -418,8 +437,11 @@ public class ScalarModel extends EntityModel implements LinksProvider {
         public abstract Integer getLength(ScalarModel scalarModel);
         public abstract Integer getScale(ScalarModel scalarModel);
 
+        public abstract int getTypicalLength(ScalarModel scalarModel);
+        
         public abstract void reset(ScalarModel scalarModel);
 
+
     }
 
     private final Kind kind;
@@ -609,12 +631,26 @@ public class ScalarModel extends EntityModel implements LinksProvider {
         return kind.getAutoComplete(this, searchTerm);
     }
 
+    /**
+     * for {@link BigDecimal}s only.
+     * 
+     * @see #getScale()
+     */
+    public int getLength() {
+        return kind.getLength(this);
+    }
+
+    /**
+     * for {@link BigDecimal}s only.
+     * 
+     * @see #getLength()
+     */
     public Integer getScale() {
         return kind.getScale(this);
     }
 
-    public int getLength() {
-        return kind.getLength(this);
+    public int getTypicalLength() {
+        return kind.getTypicalLength(this);
     }
 
     /**
@@ -684,4 +720,5 @@ public class ScalarModel extends EntityModel implements LinksProvider {
         return actionArgsHint;
     }
 
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/3364e761/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/Select2ChoiceUtil.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/Select2ChoiceUtil.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/Select2ChoiceUtil.java
new file mode 100644
index 0000000..221b527
--- /dev/null
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/Select2ChoiceUtil.java
@@ -0,0 +1,45 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.isis.viewer.wicket.ui.components.widgets;
+
+import com.vaynberg.wicket.select2.Select2Choice;
+
+import org.apache.wicket.behavior.AttributeAppender;
+import org.apache.wicket.model.IModel;
+
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+
+public final class Select2ChoiceUtil  {
+    
+    private Select2ChoiceUtil(){}
+
+    // a guesstimate to convert a single character into 'em' units
+    private static final double CHAR_TO_EM_MULTIPLIER = 0.8;
+    
+    public static Select2Choice<ObjectAdapterMemento> newSelect2Choice(String id, final IModel<ObjectAdapterMemento> modelObject, ScalarModel scalarModel) {
+        Select2Choice<ObjectAdapterMemento> select2Choice = new Select2Choice<ObjectAdapterMemento>(id, modelObject);
+        int typicalLength = scalarModel.getTypicalLength(); 
+        select2Choice.add(new AttributeAppender("style", asCssStyleWidth(typicalLength)));
+        return select2Choice;
+    }
+
+    private static String asCssStyleWidth(int numChars) {
+        return "width: " + ((numChars+2) * CHAR_TO_EM_MULTIPLIER) + "em;";
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/3364e761/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
index b1b3753..3357976 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
@@ -51,6 +51,7 @@ import org.apache.isis.viewer.wicket.ui.ComponentType;
 import org.apache.isis.viewer.wicket.ui.components.actions.ActionInvokeHandler;
 import org.apache.isis.viewer.wicket.ui.components.actions.ActionParametersFormPanel;
 import org.apache.isis.viewer.wicket.ui.components.widgets.ObjectAdapterMementoProviderAbstract;
+import org.apache.isis.viewer.wicket.ui.components.widgets.Select2ChoiceUtil;
 import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.CancelHintRequired;
 import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.FormComponentPanelAbstract;
 import org.apache.isis.viewer.wicket.ui.pages.entity.EntityPage;
@@ -65,7 +66,6 @@ public class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAda
     private static final String ID_AUTO_COMPLETE = "autoComplete";
 
     private static final String ID_ENTITY_ICON_AND_TITLE = "entityIconAndTitle";
-    //private static final String ID_ENTITY_TITLE_NULL = "entityTitleNull";
 
     private static final String ID_ENTITY_CLEAR_LINK = "entityClearLink";
     
@@ -189,7 +189,7 @@ public class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAda
         final IModel<ObjectAdapterMemento> model = ScalarModelWithPending.Util.createModel(getScalarModel().asScalarModelWithPending());       
 
         if(select2Field == null) {
-            select2Field = new Select2Choice<ObjectAdapterMemento>(ID_AUTO_COMPLETE, model);
+            select2Field = Select2ChoiceUtil.newSelect2Choice(ID_AUTO_COMPLETE, model, getScalarModel());
             setProviderAndCurrAndPending(select2Field, getScalarModel().getActionArgsHint());
             if(!getScalarModel().hasChoices()) {
                 final Settings settings = select2Field.getSettings();

http://git-wip-us.apache.org/repos/asf/isis/blob/3364e761/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
index f25d58a..eabb48f 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
@@ -20,6 +20,7 @@ import java.util.Collection;
 import java.util.List;
 
 import com.google.common.base.Predicate;
+import com.google.common.base.Strings;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.Lists;
 import com.vaynberg.wicket.select2.ChoiceProvider;
@@ -27,6 +28,7 @@ import com.vaynberg.wicket.select2.Select2Choice;
 
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
+import org.apache.wicket.behavior.AttributeAppender;
 import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.FormComponentLabel;
@@ -40,12 +42,17 @@ import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.model.models.ScalarModelWithPending;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
 import org.apache.isis.viewer.wicket.ui.components.widgets.ObjectAdapterMementoProviderAbstract;
+import org.apache.isis.viewer.wicket.ui.components.widgets.Select2ChoiceUtil;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 
 public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements ScalarModelWithPending {
 
+
     private static final long serialVersionUID = 1L;
 
+    // a guesstimate to convert a single character into 'em' units
+    private static final double CHAR_TO_EM_MULTIPLIER = 0.8;
+    
     private static final String ID_SCALAR_IF_REGULAR = "scalarIfRegular";
     private static final String ID_SCALAR_IF_COMPACT = "scalarIfCompact";
 
@@ -69,7 +76,7 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Sca
         
         // same pattern as in EntityLinkSelect2Panel
         if(select2Field == null) {
-            select2Field = new Select2Choice<ObjectAdapterMemento>(ID_VALUE_ID, modelObject);
+            select2Field = Select2ChoiceUtil.newSelect2Choice(ID_VALUE_ID, modelObject, getScalarModel());
             setChoices(actionArgsHint);
             addStandardSemantics();
         } else {

http://git-wip-us.apache.org/repos/asf/isis/blob/3364e761/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.css
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.css b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.css
index e2615e0..ae7e283 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.css
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.css
@@ -622,17 +622,6 @@ div.scalarPanel {
 
 
 /********************* Select2 component styling *****************************/
-/*
-.actionPromptPage .select2-container,
-.entityPage       .select2-container {
-	width: 200px;
-TODO: removed the page class selector because the modal window doesn't honour the width setting 
-}
-*/
-.select2-container {
-	width: 200px;
-}
-
 
 
 .actionPromptPage .select2-container .select2-choice,
@@ -755,7 +744,7 @@ div.wicket-modal div.w_content,
 
 form input[type=text][disabled] {
 	border-radius:4px;
-	-moz-borer-radius:4px;
+	-moz-border-radius:4px;
 	-webkit-border-radius:4px;
 	padding:6px;
 	background-color:#F0EFEA;
@@ -765,7 +754,7 @@ form input[type=text][disabled] {
 
 form input[type=text] {
 	border-radius:4px;
-	-moz-borer-radius:4px;
+	-moz-border-radius:4px;
 	-webkit-border-radius:4px;
 	padding:6px;
 	background-color:#FFFFFF;

http://git-wip-us.apache.org/repos/asf/isis/blob/3364e761/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ServiceInitializer.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ServiceInitializer.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ServiceInitializer.java
index 281b870..59108e7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ServiceInitializer.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ServiceInitializer.java
@@ -31,7 +31,6 @@ import org.slf4j.LoggerFactory;
 import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.lang.MethodExtensions;
-import org.apache.isis.core.metamodel.services.ServicesInjectorDefault;
 
 public class ServiceInitializer {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/3364e761/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/choices/enums/EnumValueSemanticsProvider.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/choices/enums/EnumValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/choices/enums/EnumValueSemanticsProvider.java
index a10e271..280662d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/choices/enums/EnumValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/choices/enums/EnumValueSemanticsProvider.java
@@ -31,14 +31,20 @@ import org.apache.isis.core.progmodel.facets.object.value.ValueSemanticsProvider
 
 public class EnumValueSemanticsProvider<T extends Enum<T>> extends ValueSemanticsProviderAndFacetAbstract<T> implements EnumFacet {
 
-    private static final int TYPICAL_LENGTH = 8;
-
+    private static Class<? extends Facet> type() {
+        return EnumFacet.class;
+    }
+    
     private static <T> T defaultFor(final Class<T> adaptedClass) {
         return adaptedClass.getEnumConstants()[0];
     }
 
-    private static Class<? extends Facet> type() {
-        return EnumFacet.class;
+    private static <T extends Enum<T>> int typicalLengthFor(final Class<T> adaptedClass) {
+        int max = Integer.MIN_VALUE;
+        for(T e: adaptedClass.getEnumConstants()) {
+            max = Math.max(max, e.name().length());
+        }
+        return max;
     }
     
     /**
@@ -49,8 +55,9 @@ public class EnumValueSemanticsProvider<T extends Enum<T>> extends ValueSemantic
     }
 
     public EnumValueSemanticsProvider(final FacetHolder holder, final Class<T> adaptedClass, final IsisConfiguration configuration, final ValueSemanticsProviderContext context) {
-        super(type(), holder, adaptedClass, TYPICAL_LENGTH, Immutability.IMMUTABLE, EqualByContent.HONOURED, defaultFor(adaptedClass), configuration, context);
-    }
+        super(type(), holder, adaptedClass, typicalLengthFor(adaptedClass), Immutability.IMMUTABLE, EqualByContent.HONOURED, defaultFor(adaptedClass), configuration, context);
+    }
+
 
     @Override
     protected T doParse(final Object context, final String entry) {

http://git-wip-us.apache.org/repos/asf/isis/blob/3364e761/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/value/string/StringValueSemanticsProvider.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/value/string/StringValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/value/string/StringValueSemanticsProvider.java
index 361a024..97a9cee 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/value/string/StringValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/value/string/StringValueSemanticsProvider.java
@@ -35,7 +35,7 @@ public class StringValueSemanticsProvider extends ValueSemanticsProviderAndFacet
         return StringValueFacet.class;
     }
 
-    private static final int TYPICAL_LENGTH = 25;
+    public static final int TYPICAL_LENGTH = 25;
     private static final String DEFAULT_VALUE = null; // no default
 
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/3364e761/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/OidMarshallerTest_marshal.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/OidMarshallerTest_marshal.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/OidMarshallerTest_marshal.java
deleted file mode 100644
index aab5945..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/OidMarshallerTest_marshal.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.core.metamodel.adapter.oid;
-
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.junit.Assert.assertThat;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import org.apache.isis.core.metamodel.spec.ObjectSpecId;
-
-public class OidMarshallerTest_marshal {
-
-    private OidMarshaller oidMarshaller;
-    
-    @Before
-    public void setUp() throws Exception {
-        oidMarshaller = new OidMarshaller();
-    }
-    
-    @Test
-    public void rootOid() {
-        final String marshal = oidMarshaller.marshal(RootOidDefault.create(ObjectSpecId.of("CUS"),  "123"));
-        assertThat(marshal, equalTo("CUS:123"));
-    }
-
-    @Test
-    public void rootOid_transient() {
-        final String marshal = oidMarshaller.marshal(RootOidDefault.createTransient(ObjectSpecId.of("CUS"),  "123"));
-        assertThat(marshal, equalTo("!CUS:123"));
-    }
-    
-    @Test
-    public void rootOid_versionSequence() {
-        final String marshal = oidMarshaller.marshal(RootOidDefault.create(ObjectSpecId.of("CUS"),  "123", 90807L));
-        assertThat(marshal, equalTo("CUS:123^90807::"));
-    }
-
-    @Test
-    public void rootOid_versionSequenceAndUser() {
-        final String marshal = oidMarshaller.marshal(RootOidDefault.create(ObjectSpecId.of("CUS"),  "123", 90807L, "joebloggs"));
-        assertThat(marshal, equalTo("CUS:123^90807:joebloggs:"));
-    }
-
-    @Test
-    public void rootOid_versionSequenceAndUserThatHasAnAtSymbol() {
-        final ObjectSpecId objectSpecId = ObjectSpecId.of("CUS");
-        final RootOidDefault oid = RootOidDefault.create(objectSpecId,  "123", 90807L, "joebloggs@foo.bar");
-        final String marshal = oidMarshaller.marshal(oid);
-        assertThat(marshal, equalTo("CUS:123^90807:joebloggs%40foo.bar:"));
-    }
-
-    @Test
-    public void rootOid_versionSequenceAndUtc() {
-        final String marshal = oidMarshaller.marshal(RootOidDefault.create(ObjectSpecId.of("CUS"),  "123", 90807L, 3453452141L));
-        assertThat(marshal, equalTo("CUS:123^90807::3453452141"));
-    }
-
-    @Test
-    public void rootOid_versionSequenceAndUserAndUtc() {
-        final String marshal = oidMarshaller.marshal(RootOidDefault.create(ObjectSpecId.of("CUS"),  "123", 90807L, "joebloggs", 3453452141L));
-        assertThat(marshal, equalTo("CUS:123^90807:joebloggs:3453452141"));
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/3364e761/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/OidMarshallerTest_marshall.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/OidMarshallerTest_marshall.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/OidMarshallerTest_marshall.java
new file mode 100644
index 0000000..d24a035
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/OidMarshallerTest_marshall.java
@@ -0,0 +1,83 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.adapter.oid;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertThat;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
+
+public class OidMarshallerTest_marshall {
+
+    private OidMarshaller oidMarshaller;
+    
+    @Before
+    public void setUp() throws Exception {
+        oidMarshaller = new OidMarshaller();
+    }
+    
+    @Test
+    public void rootOid() {
+        final String marshal = oidMarshaller.marshal(RootOidDefault.create(ObjectSpecId.of("CUS"),  "123"));
+        assertThat(marshal, equalTo("CUS:123"));
+    }
+
+    @Test
+    public void rootOid_transient() {
+        final String marshal = oidMarshaller.marshal(RootOidDefault.createTransient(ObjectSpecId.of("CUS"),  "123"));
+        assertThat(marshal, equalTo("!CUS:123"));
+    }
+    
+    @Test
+    public void rootOid_versionSequence() {
+        final String marshal = oidMarshaller.marshal(RootOidDefault.create(ObjectSpecId.of("CUS"),  "123", 90807L));
+        assertThat(marshal, equalTo("CUS:123^90807::"));
+    }
+
+    @Test
+    public void rootOid_versionSequenceAndUser() {
+        final String marshal = oidMarshaller.marshal(RootOidDefault.create(ObjectSpecId.of("CUS"),  "123", 90807L, "joebloggs"));
+        assertThat(marshal, equalTo("CUS:123^90807:joebloggs:"));
+    }
+
+    @Test
+    public void rootOid_versionSequenceAndUserThatHasAnAtSymbol() {
+        final ObjectSpecId objectSpecId = ObjectSpecId.of("CUS");
+        final RootOidDefault oid = RootOidDefault.create(objectSpecId,  "123", 90807L, "joebloggs@foo.bar");
+        final String marshal = oidMarshaller.marshal(oid);
+        assertThat(marshal, equalTo("CUS:123^90807:joebloggs@foo.bar:"));
+    }
+
+    @Test
+    public void rootOid_versionSequenceAndUtc() {
+        final String marshal = oidMarshaller.marshal(RootOidDefault.create(ObjectSpecId.of("CUS"),  "123", 90807L, 3453452141L));
+        assertThat(marshal, equalTo("CUS:123^90807::3453452141"));
+    }
+
+    @Test
+    public void rootOid_versionSequenceAndUserAndUtc() {
+        final String marshal = oidMarshaller.marshal(RootOidDefault.create(ObjectSpecId.of("CUS"),  "123", 90807L, "joebloggs", 3453452141L));
+        assertThat(marshal, equalTo("CUS:123^90807:joebloggs:3453452141"));
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/3364e761/core/metamodel/src/test/resources/org/apache/isis/core/metamodel/layoutmetadata/json/ExampleDomainObject.layout.properties
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/resources/org/apache/isis/core/metamodel/layoutmetadata/json/ExampleDomainObject.layout.properties b/core/metamodel/src/test/resources/org/apache/isis/core/metamodel/layoutmetadata/json/ExampleDomainObject.layout.properties
index 473f6ad..917a187 100644
--- a/core/metamodel/src/test/resources/org/apache/isis/core/metamodel/layoutmetadata/json/ExampleDomainObject.layout.properties
+++ b/core/metamodel/src/test/resources/org/apache/isis/core/metamodel/layoutmetadata/json/ExampleDomainObject.layout.properties
@@ -48,7 +48,7 @@ member.complete.memberOrder.sequence=3
 member.versionSequence.memberOrder.name=Misc
 member.versionSequence.memberOrder.sequence=4
 member.versionSequence.hidden.where=ALL_TABLES
-member.versionSequence.hidden.when=ANYWHERE
+member.versionSequence.hidden.when=ALWAYS
 
 
 # Properties (Detail)

http://git-wip-us.apache.org/repos/asf/isis/blob/3364e761/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryDefault.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryDefault.java
index 8d6b321..16ede06 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryDefault.java
@@ -48,6 +48,7 @@ import org.apache.isis.core.commons.factory.InstanceUtil;
 import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.core.metamodel.services.ServiceUtil;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
+import org.apache.isis.core.metamodel.specloader.ServiceInitializer;
 import org.apache.isis.core.runtime.authentication.AuthenticationManager;
 import org.apache.isis.core.runtime.authorization.AuthorizationManager;
 import org.apache.isis.core.runtime.imageloader.TemplateImageLoader;
@@ -127,17 +128,12 @@ public class IsisSessionFactoryDefault implements IsisSessionFactory {
     }
 
     /**
-     * Validate domain services lifecycle events.
+     * Validate domain service Ids are unique, and that the {@link PostConstruct} method, if present, must either 
+     * take no arguments or take a {@link Map} object), and that the {@link PreDestroy} method, if present, must take 
+     * no arguments.
      * 
      * <p>
-     * Specifically:
-     * <ul>
-     * <li>All {@link PostConstruct} methods must either take no arguments or take a {@link Properties} object.</li>
-     * <li>All {@link PreDestroy} methods must take no arguments.</li>
-     * </ul>
-     * 
-     * <p>
-     * If this isn't the case, then we fail fast.
+     * TODO: there seems to be some duplication/overlap with {@link ServiceInitializer}.
      */
     private void validateServices(List<Object> serviceList) {
         for (Object service : serviceList) {

http://git-wip-us.apache.org/repos/asf/isis/blob/3364e761/core/runtime/src/test/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryAbstractTest_init_and_shutdown.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryAbstractTest_init_and_shutdown.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryAbstractTest_init_and_shutdown.java
index 575c2c9..3ab5b5f 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryAbstractTest_init_and_shutdown.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryAbstractTest_init_and_shutdown.java
@@ -41,6 +41,7 @@ import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.core.commons.config.IsisConfigurationDefault;
 import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
+import org.apache.isis.core.metamodel.specloader.ServiceInitializer;
 import org.apache.isis.core.runtime.authentication.AuthenticationManager;
 import org.apache.isis.core.runtime.authorization.AuthorizationManager;
 import org.apache.isis.core.runtime.imageloader.TemplateImageLoader;
@@ -52,60 +53,6 @@ import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
 
 public class IsisSessionFactoryAbstractTest_init_and_shutdown {
 
-    public static class DomainServiceWithNoPostConstructOrPreDestroy {
-    }
-
-    public static class DomainServiceWithValidPostConstructNoParams {
-        boolean called = false;
-        @PostConstruct
-        public void postConstruct() {
-            called = true;
-        }
-    }
-
-    public static class DomainServiceWithValidPostConstructPropertiesParam {
-        boolean called = false;
-        Map<String, String> props;
-        @PostConstruct
-        public void postConstruct(Map<String,String> props) {
-            this.props = props;
-            called = true;
-        }
-    }
-
-    public static class DomainServiceWithValidPostConstructSubtypeOfPropertiesParam {
-        boolean called = false;
-        Object props;
-        @PostConstruct
-        public void postConstruct(Object props) {
-            this.props = props;
-            called = true;
-        }
-    }
-
-    public static class DomainServiceWithInvalidPostConstructWrongNumberParams {
-        @PostConstruct
-        public void postConstruct(int i, Properties props) {}
-    }
-
-    public static class DomainServiceWithInvalidPostConstructWrongTypeOfParam {
-        @PostConstruct
-        public void postConstruct(int i) {}
-    }
-
-    public static class DomainServiceWithValidPreDestroyNoParams {
-        boolean called = false;
-        @PostConstruct
-        public void postConstruct() {
-            called = true;
-        }
-    }
-
-    public static class DomainServiceWithInvalidPreDestroyWrongNumberParams {
-        @PostConstruct
-        public void postConstruct(int i) {}
-    }
-
     public static class DomainServiceWithSomeId {
         public String getId() { return "someId"; }
     }
@@ -114,8 +61,6 @@ public class IsisSessionFactoryAbstractTest_init_and_shutdown {
         public String getId() { return "someId"; }
     }
 
-
-
     @Rule
     public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
 
@@ -142,8 +87,7 @@ public class IsisSessionFactoryAbstractTest_init_and_shutdown {
     private IsisConfigurationDefault configuration;
     private List<Object> serviceList;
 
-    private IsisSessionFactoryDefault isf;
-
+    private IsisSessionFactory isf;
     
     @Before
     public void setUp() throws Exception {
@@ -154,90 +98,12 @@ public class IsisSessionFactoryAbstractTest_init_and_shutdown {
         context.ignoring(mockDeploymentType, mockSpecificationLoader, mockTemplateImageLoader, mockAuthenticationManager, mockAuthorizationManager, mockUserProfileLoader, mockContainer, mockPersistenceSessionFactory, mockOidMarshaller);
     }
     
-    @Test
-    public void emptyListOfServices() {
-        isf = createIsisSessionFactory(mockContainer, serviceList);
-    }
-
-    @Test
-    public void preConstruct_DomainServiceWithNoPostConstructOrPreDestroy() {
-        serviceList.add(new DomainServiceWithNoPostConstructOrPreDestroy());
-        isf = createIsisSessionFactory(mockContainer, serviceList);
-        
-        isf.init();
-        isf.shutdown();
-    }
-
-    @Test
-    public void preConstruct_DomainServiceWithValidPostConstructNoParams() {
-        DomainServiceWithValidPostConstructNoParams domainService = new DomainServiceWithValidPostConstructNoParams();
-        serviceList.add(domainService);
-        isf = createIsisSessionFactory(mockContainer, serviceList);
-        isf.init();
-        assertThat(domainService.called,is(true));
-        isf.shutdown();
-    }
-
-    @Test
-    public void preConstruct_DomainServiceWithValidPostConstructPropertiesParam() {
-        DomainServiceWithValidPostConstructPropertiesParam domainService = new DomainServiceWithValidPostConstructPropertiesParam();
-        serviceList.add(domainService);
-        isf = createIsisSessionFactory(mockContainer, serviceList);
-        isf.init();
-        assertThat(domainService.called,is(true));
-        assertThat(domainService.props.get("foo"), is("bar"));
-        isf.shutdown();
-    }
-
-    @Test
-    public void preConstruct_DomainServiceWithValidPostConstructSubtypeOfPropertiesParam() {
-        DomainServiceWithValidPostConstructSubtypeOfPropertiesParam domainService = new DomainServiceWithValidPostConstructSubtypeOfPropertiesParam();
-        serviceList.add(domainService);
-        isf = createIsisSessionFactory(mockContainer, serviceList);
-        isf.init();
-        assertThat(domainService.called,is(true));
-        assertThat(domainService.props, is(not(nullValue())));
-        isf.shutdown();
-    }
-
-    @Test(expected=IllegalStateException.class)
-    public void preConstruct_DomainServiceWithInvalidPostConstructWrongNumberParams() {
-        serviceList.add(new DomainServiceWithInvalidPostConstructWrongNumberParams());
-        isf = createIsisSessionFactory(mockContainer, serviceList);
-    }
-
-    @Test(expected=IllegalStateException.class)
-    public void preConstruct_DomainServiceWithInvalidPostConstructWrongTypeOfParam() {
-        serviceList.add(new DomainServiceWithInvalidPostConstructWrongTypeOfParam());
-        isf = createIsisSessionFactory(mockContainer, serviceList);
-    }
-
-    @Test
-    public void preConstruct_DomainServiceWithValidPreDestroyNoParams() {
-        DomainServiceWithValidPreDestroyNoParams domainService = new DomainServiceWithValidPreDestroyNoParams();
-        serviceList.add(domainService);
-        isf = createIsisSessionFactory(mockContainer, serviceList);
-        isf.init();
-        assertThat(domainService.called,is(true));
-        isf.shutdown();
-    }
-
-    @Test(expected=IllegalStateException.class)
-    public void preConstruct_DomainServiceWithInvalidPreDestroyWrongNumberParams() {
-        serviceList.add(new DomainServiceWithInvalidPreDestroyWrongNumberParams());
-        isf = createIsisSessionFactory(mockContainer, serviceList);
-    }
 
     @Test(expected=IllegalStateException.class)
     public void validate_DomainServicesWithDuplicateIds() {
         serviceList.add(new DomainServiceWithSomeId());
         serviceList.add(new DomainServiceWithDuplicateId());
-        isf = createIsisSessionFactory(mockContainer, serviceList);
-    }
-
-
-    private IsisSessionFactoryDefault createIsisSessionFactory(DomainObjectContainer container, List<Object> serviceList) {
-        return new IsisSessionFactoryDefault(mockDeploymentType, configuration, mockSpecificationLoader, mockTemplateImageLoader, mockAuthenticationManager, mockAuthorizationManager, mockUserProfileLoader, mockPersistenceSessionFactory, container, serviceList, mockOidMarshaller) {
+        isf = new IsisSessionFactoryDefault(mockDeploymentType, configuration, mockSpecificationLoader, mockTemplateImageLoader, mockAuthenticationManager, mockAuthorizationManager, mockUserProfileLoader, mockPersistenceSessionFactory, mockContainer, serviceList, mockOidMarshaller) {
         };
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/3364e761/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
index 5c6edc8..b942bc8 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
@@ -470,7 +470,9 @@ public class ToDoItem implements Comparable<ToDoItem> /*, Locatable*/ { // GMAP3
     }
 
     @PublishedAction
-    public ToDoItem add(final ToDoItem toDoItem) {
+    public ToDoItem add(
+            @TypicalLength(20)
+            final ToDoItem toDoItem) {
         getDependencies().add(toDoItem);
         return this;
     }
@@ -498,7 +500,9 @@ public class ToDoItem implements Comparable<ToDoItem> /*, Locatable*/ { // GMAP3
         return null;
     }
 
-    public ToDoItem remove(final ToDoItem toDoItem) {
+    public ToDoItem remove(
+            @TypicalLength(20)
+            final ToDoItem toDoItem) {
         getDependencies().remove(toDoItem);
         return this;
     }