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 2021/09/16 11:02:58 UTC

[isis] branch master updated: ISIS-2871: Spring managed value semantics for Password

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

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new 3b21673  ISIS-2871: Spring managed value semantics for Password
3b21673 is described below

commit 3b216734ac7b25d19921d48429a4fb35e0a5b133
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Sep 16 13:02:48 2021 +0200

    ISIS-2871: Spring managed value semantics for Password
---
 .../org/apache/isis/applib/value/Password.java     |  11 +--
 .../core/metamodel/IsisModuleCoreMetamodel.java    |   6 +-
 .../facets/value/password/PasswordValueFacet.java  |  32 -------
 ...ordValueFacetUsingSemanticsProviderFactory.java |  47 ---------
 .../value/password/PasswordValueSemantics.java     |  83 ++++++++++++++++
 .../password/PasswordValueSemanticsProvider.java   | 105 ---------------------
 .../dflt/ProgrammingModelFacetsJava11.java         |   4 -
 .../facets/param/name/ParameterNameFacetTest.java  |   2 +-
 .../value/PasswordValueSemanticsProviderTest.java  |  14 +--
 .../java/demoapp/dom/types/isis/IsisTypesMenu.java |   2 +-
 .../passwords/persistence/IsisPasswordEntity.java  |  34 +++++++
 .../passwords/samples/IsisPasswordsSamples.java    |   5 +-
 .../types/isis/passwords/vm/IsisPasswordVm.java    |   3 +-
 .../scalars/ScalarPanelTextFieldAbstract.html      |   2 -
 14 files changed, 135 insertions(+), 215 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/value/Password.java b/api/applib/src/main/java/org/apache/isis/applib/value/Password.java
index 06edf91..f9f2fd7 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/value/Password.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/value/Password.java
@@ -40,8 +40,6 @@ public class Password implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    private static final String STARS = "********************";
-
     private final String password;
 
     public static Password of(final String password) {
@@ -64,14 +62,11 @@ public class Password implements Serializable {
 
     @Override
     public String toString() {
-        if (password == null) {
-            return "";
-        }
-        return STARS;
+        return "*";
     }
 
-
-    public static class JaxbToStringAdapter extends javax.xml.bind.annotation.adapters.XmlAdapter<String, Password> {
+    public static class JaxbToStringAdapter
+    extends javax.xml.bind.annotation.adapters.XmlAdapter<String, Password> {
         @Override
         public Password unmarshal(final String str) throws Exception {
             return str != null
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java
index 33fd1e9..9f58ce4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java
@@ -33,7 +33,7 @@ import org.apache.isis.core.metamodel.facets.value.booleans.BooleanValueSemantic
 import org.apache.isis.core.metamodel.facets.value.clobs.ClobValueSemantics;
 import org.apache.isis.core.metamodel.facets.value.localrespath.LocalResourcePathValueSemantics;
 import org.apache.isis.core.metamodel.facets.value.markup.MarkupValueSemantics;
-import org.apache.isis.core.metamodel.facets.value.password.PasswordValueSemanticsProvider;
+import org.apache.isis.core.metamodel.facets.value.password.PasswordValueSemantics;
 import org.apache.isis.core.metamodel.facets.value.treenode.TreeNodeValueSemantics;
 import org.apache.isis.core.metamodel.facets.value.url.URLValueSemantics;
 import org.apache.isis.core.metamodel.facets.value.uuid.UUIDValueSemantics;
@@ -91,6 +91,7 @@ import org.apache.isis.core.security.IsisModuleCoreSecurity;
         // Value Semantics (built-in defaults)
         BooleanValueSemantics.class,
         BigDecimalValueSemantics.class,
+        PasswordValueSemantics.class,
         BlobValueSemantics.class,
         ClobValueSemantics.class,
         MarkupValueSemantics.class,
@@ -98,9 +99,6 @@ import org.apache.isis.core.security.IsisModuleCoreSecurity;
         LocalResourcePathValueSemantics.class,
         UUIDValueSemantics.class,
         TreeNodeValueSemantics.class,
-        //TODO convert to non-facets ...
-        PasswordValueSemanticsProvider.class,
-
 
         // @Service's
         ObjectManagerDefault.class,
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/password/PasswordValueFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/password/PasswordValueFacet.java
deleted file mode 100644
index ee4d5ef..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/password/PasswordValueFacet.java
+++ /dev/null
@@ -1,32 +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.facets.value.password;
-
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-
-public interface PasswordValueFacet extends Facet {
-
-    boolean checkPassword(ManagedObject object, String password);
-
-    String getEditText(ManagedObject object);
-
-    ManagedObject createValue(String value);
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/password/PasswordValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/password/PasswordValueFacetUsingSemanticsProviderFactory.java
deleted file mode 100644
index c166448..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/password/PasswordValueFacetUsingSemanticsProviderFactory.java
+++ /dev/null
@@ -1,47 +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.facets.value.password;
-
-import javax.inject.Inject;
-
-import org.apache.isis.applib.value.Password;
-import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueFacetUsingSemanticsProviderFactory;
-
-public class PasswordValueFacetUsingSemanticsProviderFactory
-extends ValueFacetUsingSemanticsProviderFactory<Password> {
-
-    @Inject
-    public PasswordValueFacetUsingSemanticsProviderFactory(final MetaModelContext mmc) {
-        super(mmc);
-    }
-
-    @Override
-    public void process(final ProcessClassContext processClassContext) {
-        final Class<?> type = processClassContext.getCls();
-        final FacetHolder holder = processClassContext.getFacetHolder();
-
-        if (type != org.apache.isis.applib.value.Password.class) {
-            return;
-        }
-        addValueFacet(new PasswordValueSemanticsProvider(holder));
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/password/PasswordValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/password/PasswordValueSemantics.java
new file mode 100644
index 0000000..20deead
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/password/PasswordValueSemantics.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.facets.value.password;
+
+import org.springframework.stereotype.Component;
+
+import org.apache.isis.applib.adapters.AbstractValueSemanticsProvider;
+import org.apache.isis.applib.adapters.EncoderDecoder;
+import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.Renderer;
+import org.apache.isis.applib.value.Password;
+import org.apache.isis.commons.internal.base._Strings;
+
+@Component
+public class PasswordValueSemantics
+extends AbstractValueSemanticsProvider<Password>
+implements
+    EncoderDecoder<Password>,
+    Parser<Password>,
+    Renderer<Password> {
+
+    // -- ENCODER DECODER
+
+    @Override
+    public String toEncodedString(final Password value) {
+        if(value==null) {
+            return null;
+        }
+        return value.getPassword();
+    }
+
+    @Override
+    public Password fromEncodedString(final String data) {
+        if(data==null) {
+            return null;
+        }
+        return new Password(data);
+    }
+
+    // -- RENDERER
+
+    @Override
+    public String presentationValue(final Context context, final Password value) {
+        return render(value, v->"*");
+    }
+
+    // -- PARSER
+
+    @Override
+    public String parseableTextRepresentation(final Context context, final Password value) {
+        return render(value, v->"*");
+    }
+
+    @Override
+    public Password parseTextRepresentation(final Context context, final String text) {
+        if(_Strings.isEmpty(text)) {
+            return null;
+        }
+        return new Password(text);
+    }
+
+    @Override
+    public int typicalLength() {
+        return 12;
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/password/PasswordValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/password/PasswordValueSemanticsProvider.java
deleted file mode 100644
index 52ae32c..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/password/PasswordValueSemanticsProvider.java
+++ /dev/null
@@ -1,105 +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.facets.value.password;
-
-import org.springframework.stereotype.Component;
-
-import org.apache.isis.applib.adapters.ValueSemanticsProvider;
-import org.apache.isis.applib.value.Password;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueSemanticsProviderAndFacetAbstract;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-
-@Component
-public class PasswordValueSemanticsProvider
-extends ValueSemanticsProviderAndFacetAbstract<Password>
-implements PasswordValueFacet {
-
-    private static final Class<? extends Facet> type() {
-        return PasswordValueFacet.class;
-    }
-
-    private static final Password DEFAULT_VALUE = null; // no default
-    private static final int TYPICAL_LENGTH = 12;
-
-    public PasswordValueSemanticsProvider() {
-        this(null);
-    }
-
-    public PasswordValueSemanticsProvider(final FacetHolder holder) {
-        super(type(), holder, Password.class, TYPICAL_LENGTH, -1, Immutability.IMMUTABLE, EqualByContent.HONOURED, DEFAULT_VALUE);
-    }
-
-    // //////////////////////////////////////////////////////////////////
-    // Parser
-    // //////////////////////////////////////////////////////////////////
-
-    @Override
-    protected Password doParse(final ValueSemanticsProvider.Context context, final String text) {
-        return new Password(text);
-    }
-
-    @Override
-    public String titleString(final Object object) {
-        return object == null ? "" : password(object).toString();
-    }
-
-    // //////////////////////////////////////////////////////////////////
-    // EncoderDecoder
-    // //////////////////////////////////////////////////////////////////
-
-    @Override
-    public String toEncodedString(final Password object) {
-        return password(object).getPassword();
-    }
-
-    @Override
-    public Password fromEncodedString(final String data) {
-        return new Password(data);
-    }
-
-    // //////////////////////////////////////////////////////////////////
-    // PasswordValueFacet
-    // //////////////////////////////////////////////////////////////////
-
-    @Override
-    public boolean checkPassword(final ManagedObject object, final String password) {
-        return password(object.getPojo()).checkPassword(password);
-    }
-
-    @Override
-    public String getEditText(final ManagedObject object) {
-        return object == null ? "" : password(object).getPassword();
-    }
-
-    @Override
-    public ManagedObject createValue(final String password) {
-        return getObjectManager().adapt(new Password(password));
-    }
-
-    private Password password(final Object object) {
-        if (object instanceof ManagedObject) {
-            return (Password) ((ManagedObject) object).getPojo();
-        } else {
-            return (Password) object;
-        }
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java
index ffca799..ffb93ed 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java
@@ -103,7 +103,6 @@ import org.apache.isis.core.metamodel.facets.value.integer.IntPrimitiveValueFace
 import org.apache.isis.core.metamodel.facets.value.integer.IntWrapperValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.longs.LongPrimitiveValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.longs.LongWrapperValueFacetUsingSemanticsProviderFactory;
-import org.apache.isis.core.metamodel.facets.value.password.PasswordValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.shortint.ShortPrimitiveValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.shortint.ShortWrapperValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.string.StringValueFacetUsingSemanticsProviderFactory;
@@ -291,9 +290,6 @@ extends ProgrammingModelAbstract {
 
         addFactory(FacetProcessingOrder.G1_VALUE_TYPES, new JavaAwtImageValueFacetUsingSemanticsProviderFactory(mmc));
 
-        // applib values
-        addFactory(FacetProcessingOrder.G1_VALUE_TYPES, new PasswordValueFacetUsingSemanticsProviderFactory(mmc));
-
         // jodatime values
         addFactory(FacetProcessingOrder.G1_VALUE_TYPES, new JodaLocalDateValueFacetUsingSemanticsProviderFactory(mmc));
         addFactory(FacetProcessingOrder.G1_VALUE_TYPES, new JodaLocalDateTimeValueFacetUsingSemanticsProviderFactory(mmc));
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java
index d9f9e1b..1b4fbe6 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java
@@ -67,7 +67,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
     @Test
     public void verifyProgrammingModelNumberOfFactories() {
-        assertEquals(97, programmingModel.streamFactories().count());
+        assertEquals(96, programmingModel.streamFactories().count());
     }
 
     @Test //verify we have the javac -parameter flag set when compiling this class
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/PasswordValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/PasswordValueSemanticsProviderTest.java
index 38ee74b..459d596 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/PasswordValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/PasswordValueSemanticsProviderTest.java
@@ -24,21 +24,17 @@ import org.junit.Test;
 import static org.junit.Assert.assertEquals;
 
 import org.apache.isis.applib.value.Password;
-import org.apache.isis.core.metamodel._testing.MetaModelContext_forTesting;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FacetHolderAbstract;
-import org.apache.isis.core.metamodel.facets.value.password.PasswordValueSemanticsProvider;
+import org.apache.isis.core.metamodel.facets.value.password.PasswordValueSemantics;
 
-public class PasswordValueSemanticsProviderTest extends ValueSemanticsProviderAbstractTestCase {
+public class PasswordValueSemanticsProviderTest
+extends ValueSemanticsProviderAbstractTestCase {
 
-    private PasswordValueSemanticsProvider adapter;
+    private PasswordValueSemantics adapter;
     private Password password;
-    private FacetHolder holder;
 
     @Before
     public void setUpObjects() throws Exception {
-        holder = FacetHolderAbstract.forTesting(MetaModelContext_forTesting.buildDefault());
-        setValue(adapter = new PasswordValueSemanticsProvider(holder));
+        setSemanitcs(adapter = new PasswordValueSemantics());
         password = new Password("secret");
     }
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/IsisTypesMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/IsisTypesMenu.java
index 1bc4474..0d05e07 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/IsisTypesMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/IsisTypesMenu.java
@@ -67,7 +67,7 @@ public class IsisTypesMenu {
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(cssClassFa="fa-clock")
+    @ActionLayout(cssClassFa="fa-key")
     public IsisPasswords passwords(){
         return new IsisPasswords();
     }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/persistence/IsisPasswordEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/persistence/IsisPasswordEntity.java
index 06d7786..22763f4 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/persistence/IsisPasswordEntity.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/persistence/IsisPasswordEntity.java
@@ -18,7 +18,14 @@
  */
 package demoapp.dom.types.isis.passwords.persistence;
 
+import javax.inject.Inject;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.ActionLayout.Position;
 import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.PromptStyle;
+import org.apache.isis.applib.services.message.MessageService;
 import org.apache.isis.applib.value.Password;
 
 import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
@@ -39,4 +46,31 @@ implements
         return getReadOnlyProperty();
     }
 
+    // -- PASSWORD CHECKER DEMO
+
+    @Inject private transient MessageService messageService;
+
+    @Action
+    @ActionLayout(associateWith = "readWriteProperty"
+        , position = Position.PANEL
+        , cssClass = "bg-warning")
+    public IsisPasswordEntity showPassword() {
+        messageService.informUser(String
+                .format("password: '%s'", getReadWriteProperty().getPassword()));
+        return this;
+    }
+
+    @Action
+    @ActionLayout(associateWith = "readWriteProperty"
+        , position = Position.PANEL
+        , promptStyle = PromptStyle.DIALOG_MODAL)
+    public IsisPasswordEntity checkPassword(final Password confirm) {
+        if(getReadWriteProperty().checkPassword(confirm.getPassword())) {
+            messageService.informUser("passwords did match");
+        } else {
+            messageService.warnUser("passwords did not match");
+        }
+        return this;
+    }
+
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/samples/IsisPasswordsSamples.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/samples/IsisPasswordsSamples.java
index a4f9457..c19ced0 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/samples/IsisPasswordsSamples.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/samples/IsisPasswordsSamples.java
@@ -18,6 +18,7 @@
  */
 package demoapp.dom.types.isis.passwords.samples;
 
+import java.util.Random;
 import java.util.stream.Stream;
 
 import org.springframework.stereotype.Service;
@@ -31,7 +32,9 @@ public class IsisPasswordsSamples implements Samples<Password> {
 
     @Override
     public Stream<Password> stream() {
-        return Stream.of();
+        return new Random().ints(5)
+                .mapToObj(Integer::toHexString)
+                .map(Password::of);
     }
 
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/vm/IsisPasswordVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/vm/IsisPasswordVm.java
index f142f98..3647a08 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/vm/IsisPasswordVm.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/vm/IsisPasswordVm.java
@@ -52,7 +52,8 @@ public class IsisPasswordVm
         implements HasAsciiDocDescription, IsisPasswordHolder2 {
 
 //end::class[]
-    public IsisPasswordVm(Password initialValue) {
+
+    public IsisPasswordVm(final Password initialValue) {
         this.readOnlyProperty = initialValue;
         this.readWriteProperty = initialValue;
     }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.html b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.html
index 544a65f..09c8187 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.html
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.html
@@ -40,7 +40,6 @@
                         <span class="scalarValueInput">
                             <span class="editing">
 
-								<!-- ISIS-2831 "##" -->
                                 <a href="##"
                                    name="scalarValueInlinePromptLink"
                                    class="scalarValueInlinePromptLink"
@@ -50,7 +49,6 @@
 
                                 <wicket:container wicket:id="scalarValueContainer"/>
 
-								<!-- ISIS-2831 "##" -->
                                 <a href="##"
                                    class="edit fa fa-edit"
                                    wicket:id="editProperty"></a>