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 2022/03/03 15:18:17 UTC

[isis] branch master updated: ISIS-2877: typesafe ScalarPanelWithFormFieldAbstract

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 be03f3f  ISIS-2877: typesafe ScalarPanelWithFormFieldAbstract
be03f3f is described below

commit be03f3f37d258f285cc45512182a0521f4a058ad
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Mar 3 16:18:08 2022 +0100

    ISIS-2877: typesafe ScalarPanelWithFormFieldAbstract
---
 .../scalars/ScalarPanelTextFieldAbstract.java      | 20 ++++++------
 .../scalars/ScalarPanelTextFieldNumeric.java       |  6 ++--
 .../ScalarPanelTextFieldWithTemporalPicker.java    |  2 +-
 .../scalars/ScalarPanelWithFormFieldAbstract.java  | 16 +++++++---
 .../blobclob/IsisBlobOrClobPanelAbstract.java      | 36 ++++------------------
 .../components/scalars/blobclob/IsisBlobPanel.java |  2 +-
 .../components/scalars/blobclob/IsisClobPanel.java |  5 +--
 .../scalars/passwd/IsisPasswordPanel.java          |  2 +-
 .../components/scalars/primitive/BooleanPanel.java |  4 +--
 9 files changed, 37 insertions(+), 56 deletions(-)

diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
index 87e1648..4d8cd2d 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
@@ -62,13 +62,11 @@ import lombok.val;
  * This implementation is for panels that use a textfield/text area.
  */
 public abstract class ScalarPanelTextFieldAbstract<T extends Serializable>
-extends ScalarPanelWithFormFieldAbstract
+extends ScalarPanelWithFormFieldAbstract<T>
 implements TextFieldValueModel.ScalarModelProvider {
 
     private static final long serialVersionUID = 1L;
 
-    protected final Class<T> cls;
-
     private AbstractTextComponent<T> formField;
 
     @Getter(value = AccessLevel.PROTECTED)
@@ -77,17 +75,16 @@ implements TextFieldValueModel.ScalarModelProvider {
     protected ScalarPanelTextFieldAbstract(
             final String id,
             final ScalarModel scalarModel,
-            final Class<T> cls) {
-        this(id, scalarModel, cls, TextFieldVariant.SINGLE_LINE);
+            final Class<T> type) {
+        this(id, scalarModel, type, TextFieldVariant.SINGLE_LINE);
     }
 
     protected ScalarPanelTextFieldAbstract(
             final String id,
             final ScalarModel scalarModel,
-            final Class<T> cls,
+            final Class<T> type,
             final TextFieldVariant textFieldVariant) {
-        super(id, scalarModel);
-        this.cls = cls;
+        super(id, scalarModel, type);
         this.textFieldVariant = textFieldVariant;
     }
 
@@ -113,11 +110,12 @@ implements TextFieldValueModel.ScalarModelProvider {
      * TextField, with converter.
      */
     protected AbstractTextComponent<T> createTextField(final String id) {
+        val converter = getConverter(scalarModel());
         return getTextFieldVariant().isSingleLine()
                 ? Wkt.textFieldWithConverter(
-                        id, newTextFieldValueModel(), cls, getConverter(getModel()))
+                        id, newTextFieldValueModel(), type, converter)
                 : setRowsAndMaxLengthAttributesOn(Wkt.textAreaWithConverter(
-                        id, newTextFieldValueModel(), cls, getConverter(getModel())));
+                        id, newTextFieldValueModel(), type, converter));
     }
 
     protected final TextFieldValueModel<T> newTextFieldValueModel() {
@@ -208,7 +206,7 @@ implements TextFieldValueModel.ScalarModelProvider {
 
         if(maxLength != null) {
             formComponent.add(new AttributeModifier("maxlength", Model.of("" + maxLength)));
-            if(cls.equals(String.class)) {
+            if(type.equals(String.class)) {
                 formComponent.add(StringValidator.maximumLength(maxLength));
             }
         }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldNumeric.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldNumeric.java
index 1158102..53147c3 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldNumeric.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldNumeric.java
@@ -38,15 +38,15 @@ extends ScalarPanelTextFieldWithValueSemantics<T> {
     public ScalarPanelTextFieldNumeric(
             final String id,
             final ScalarModel scalarModel,
-            final Class<T> cls) {
-        super(id, scalarModel, cls);
+            final Class<T> type) {
+        super(id, scalarModel, type);
     }
 
     @Override
     protected final Component createComponentForCompact() {
         val label = Wkt.labelAddWithConverter(
                 getCompactFragment(CompactType.SPAN),
-                ID_SCALAR_IF_COMPACT, newTextFieldValueModel(), cls, getConverter(scalarModel()));
+                ID_SCALAR_IF_COMPACT, newTextFieldValueModel(), type, getConverter(scalarModel()));
         label.setEnabled(false);
         return label;
     }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldWithTemporalPicker.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldWithTemporalPicker.java
index 83d29ab..166c5e1 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldWithTemporalPicker.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldWithTemporalPicker.java
@@ -48,7 +48,7 @@ extends ScalarPanelTextFieldWithValueSemantics<T>  {
     @Override
     protected final TextField<T> createTextField(final String id) {
         return new TextFieldWithDateTimePicker<T>(
-                super.getCommonContext(), id, newTextFieldValueModel(), cls, getConverter(scalarModel()));
+                super.getCommonContext(), id, newTextFieldValueModel(), type, getConverter(scalarModel()));
     }
 
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelWithFormFieldAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelWithFormFieldAbstract.java
index 2cf2cc7..36e3ca8 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelWithFormFieldAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelWithFormFieldAbstract.java
@@ -41,13 +41,19 @@ import org.apache.isis.viewer.wicket.ui.util.Wkt;
 
 import lombok.val;
 
-public abstract class ScalarPanelWithFormFieldAbstract
+public abstract class ScalarPanelWithFormFieldAbstract<T>
 extends ScalarPanelAbstract {
 
     private static final long serialVersionUID = 1L;
 
-    protected ScalarPanelWithFormFieldAbstract(final String id, final ScalarModel scalarModel) {
+    protected final Class<T> type;
+
+    protected ScalarPanelWithFormFieldAbstract(
+            final String id,
+            final ScalarModel scalarModel,
+            final Class<T> type) {
         super(id, scalarModel);
+        this.type = type;
     }
 
     @Override
@@ -57,14 +63,14 @@ extends ScalarPanelAbstract {
 
     // -- FORM COMPONENT
 
-    private FormComponent<?> formComponent;
+    private FormComponent<T> formComponent;
     @Nullable
-    protected final FormComponent<?> getFormComponent() { return formComponent; }
+    protected final FormComponent<T> getFormComponent() { return formComponent; }
 
     /**
      * Builds the component to render the form field.
      */
-    protected abstract FormComponent<?> createFormComponent(ScalarModel scalarModel);
+    protected abstract FormComponent<T> createFormComponent(ScalarModel scalarModel);
 
     // -- REGULAR
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/blobclob/IsisBlobOrClobPanelAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/blobclob/IsisBlobOrClobPanelAbstract.java
index f12adad..18eae98 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/blobclob/IsisBlobOrClobPanelAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/blobclob/IsisBlobOrClobPanelAbstract.java
@@ -51,7 +51,7 @@ import lombok.val;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.form.fileinput.BootstrapFileInputField;
 
 public abstract class IsisBlobOrClobPanelAbstract<T extends NamedWithMimeType>
-extends ScalarPanelWithFormFieldAbstract {
+extends ScalarPanelWithFormFieldAbstract<T> {
 
     private static final long serialVersionUID = 1L;
 
@@ -73,34 +73,10 @@ extends ScalarPanelWithFormFieldAbstract {
         EDITABLE, NOT_EDITABLE
     }
 
-//    @Override
-//    protected FormGroup createComponentForRegular() {
-//
-//        val friendlyNameModel = LambdaModel.of(()->getModel().getFriendlyName());
-//
-//        fileUploadField = createFileUploadField(ID_SCALAR_VALUE);
-//        fileUploadField.setLabel(friendlyNameModel);
-//
-//        final FormGroup scalarIfRegularFormGroup = new FormGroup(ID_SCALAR_IF_REGULAR, fileUploadField);
-//        scalarIfRegularFormGroup.add(fileUploadField);
-//
-//        Wkt.labelAdd(scalarIfRegularFormGroup, ID_SCALAR_NAME, friendlyNameModel);
-//
-//        wicketImage = asWicketImage(ID_IMAGE);
-//        if(wicketImage != null) {
-//            scalarIfRegularFormGroup.addOrReplace(wicketImage);
-//        } else {
-//            Components.permanentlyHide(scalarIfRegularFormGroup, ID_IMAGE);
-//        }
-//
-//        updateFileNameLabel(ID_FILE_NAME, scalarIfRegularFormGroup);
-//        updateDownloadLink(ID_SCALAR_IF_REGULAR_DOWNLOAD, scalarIfRegularFormGroup);
-//
-//        return scalarIfRegularFormGroup;
-//    }
-
+    // generic type mismatch; no issue as long as we don't use conversion
+    @SuppressWarnings({ "unchecked", "rawtypes" })
     @Override
-    protected FormComponent<?> createFormComponent(final ScalarModel scalarModel) {
+    protected FormComponent createFormComponent(final ScalarModel scalarModel) {
         fileUploadField = createFileUploadField(ID_SCALAR_VALUE);
         return fileUploadField;
     }
@@ -235,8 +211,8 @@ extends ScalarPanelWithFormFieldAbstract {
         return Optional.ofNullable((T)pojo);
     }
 
-    public IsisBlobOrClobPanelAbstract(final String id, final ScalarModel scalarModel) {
-        super(id, scalarModel);
+    protected IsisBlobOrClobPanelAbstract(final String id, final ScalarModel scalarModel, final Class<T> type) {
+        super(id, scalarModel, type);
     }
 
     private void updateRegularFormComponents(
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/blobclob/IsisBlobPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/blobclob/IsisBlobPanel.java
index 43a5062..9f27f73 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/blobclob/IsisBlobPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/blobclob/IsisBlobPanel.java
@@ -36,7 +36,7 @@ public class IsisBlobPanel extends IsisBlobOrClobPanelAbstract<Blob> {
     private static final long serialVersionUID = 1L;
 
     public IsisBlobPanel(final String id, final ScalarModel model) {
-        super(id, model);
+        super(id, model, Blob.class);
     }
 
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/blobclob/IsisClobPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/blobclob/IsisClobPanel.java
index 833fabe..f6c5aca 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/blobclob/IsisClobPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/blobclob/IsisClobPanel.java
@@ -34,7 +34,8 @@ import org.apache.isis.viewer.wicket.model.models.ScalarModel;
  * Panel for rendering scalars of type {@link Clob Isis' applib.Clob}.
  *
  * <p>
- *    TODO: for now, this only handles CLOBs encoded as UTF-8.  One option might be to 'guess' the character encoding, eg akin to cpdetector?
+ *    TODO: for now, this only handles CLOBs encoded as UTF-8.
+ *    One option might be to 'guess' the character encoding, eg akin to cpdetector?
  * </p>
  */
 public class IsisClobPanel extends IsisBlobOrClobPanelAbstract<Clob> {
@@ -44,7 +45,7 @@ public class IsisClobPanel extends IsisBlobOrClobPanelAbstract<Clob> {
     private static final Charset CHARSET = StandardCharsets.UTF_8;
 
     public IsisClobPanel(final String id, final ScalarModel model) {
-        super(id, model);
+        super(id, model, Clob.class);
     }
 
     @Override
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/passwd/IsisPasswordPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/passwd/IsisPasswordPanel.java
index 07aae58..33ba480 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/passwd/IsisPasswordPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/passwd/IsisPasswordPanel.java
@@ -40,7 +40,7 @@ extends ScalarPanelTextFieldWithValueSemantics<Password> {
     @Override
     protected AbstractTextComponent<Password> createTextField(final String id) {
         return Wkt.passwordFieldWithConverter(
-                id, newTextFieldValueModel(), cls, getConverter(getModel()));
+                id, newTextFieldValueModel(), type, getConverter(getModel()));
     }
 
 }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java
index 8911319..df8cf3e 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java
@@ -43,14 +43,14 @@ import de.agilecoders.wicket.extensions.markup.html.bootstrap.form.checkboxx.Che
  * Panel for rendering scalars of type {@link Boolean} or <tt>boolean</tt>.
  */
 public class BooleanPanel
-extends ScalarPanelWithFormFieldAbstract {
+extends ScalarPanelWithFormFieldAbstract<Boolean> {
 
     private static final long serialVersionUID = 1L;
 
     private CheckBoxX checkBox;
 
     public BooleanPanel(final String id, final ScalarModel scalarModel) {
-        super(id, scalarModel);
+        super(id, scalarModel, Boolean.class);
     }
 
     @Override