Updated Branches:
  refs/heads/master 5860833e5 -> e5e5a7286

ISIS-396: BigDecimal honour @Column(scale=...) if JDO/Wicket


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

Branch: refs/heads/master
Commit: fd5d5083b016b892060861655fb1e29fe6172851
Parents: 5860833
Author: Dan Haywood <[email protected]>
Authored: Mon May 6 16:25:18 2013 +0100
Committer: Dan Haywood <[email protected]>
Committed: Mon May 6 16:25:18 2013 +0100

----------------------------------------------------------------------
 .../DataNucleusPersistenceMechanismInstaller.java  |    3 +
 ...DerivedFromJdoColumnAnnotationFacetFactory.java |   64 ++++++++
 .../BigDecimalFacetDerivedFromJdoColumn.java       |   51 ++++++
 .../prop/column/BigDecimalFacetFallback.java       |   49 ++++++
 ...vedFromJdoColumnAnnotationFacetFactoryTest.java |  119 +++++++++++++++
 .../column/SimpleObjectWithColumnAnnotations.java  |   98 ++++++++++++
 .../viewer/wicket/model/models/ScalarModel.java    |   44 ++++++
 .../scalars/ScalarPanelTextFieldAbstract.java      |    6 +-
 .../scalars/ScalarPanelTextFieldNumeric.java       |    1 -
 .../scalars/jdkmath/JavaMathBigDecimalPanel.java   |   68 ++++++++
 .../value/bigdecimal/BigDecimalValueFacet.java     |    4 +
 .../BigDecimalValueSemanticsProvider.java          |   16 ++-
 12 files changed, 520 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/fd5d5083/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
----------------------------------------------------------------------
diff --git 
a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
 
b/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
index 6f1a9aa..fcaacd8 100644
--- 
a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
+++ 
b/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
@@ -50,6 +50,7 @@ import 
org.apache.isis.objectstore.jdo.metamodel.facets.object.discriminator.Jdo
 import 
org.apache.isis.objectstore.jdo.metamodel.facets.object.embeddedonly.JdoEmbeddedOnlyAnnotationFacetFactory;
 import 
org.apache.isis.objectstore.jdo.metamodel.facets.object.persistencecapable.JdoPersistenceCapableAnnotationFacetFactory;
 import 
org.apache.isis.objectstore.jdo.metamodel.facets.object.query.JdoQueryAnnotationFacetFactory;
+import 
org.apache.isis.objectstore.jdo.metamodel.facets.prop.column.BigDecimalDerivedFromJdoColumnAnnotationFacetFactory;
 import 
org.apache.isis.objectstore.jdo.metamodel.facets.prop.primarykey.JdoPrimaryKeyAnnotationFacetFactory;
 import 
org.apache.isis.objectstore.jdo.metamodel.specloader.validator.JdoMetaModelValidator;
 
@@ -194,6 +195,8 @@ public class DataNucleusPersistenceMechanismInstaller 
extends PersistenceMechani
         
         programmingModel.addFactory(JdoQueryAnnotationFacetFactory.class);
         
+        
programmingModel.addFactory(BigDecimalDerivedFromJdoColumnAnnotationFacetFactory.class);
+        
         
programmingModel.addFactory(AuditableAnnotationInJdoApplibFacetFactory.class);
         
programmingModel.addFactory(AuditableMarkerInterfaceInJdoApplibFacetFactory.class);
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/fd5d5083/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactory.java
----------------------------------------------------------------------
diff --git 
a/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactory.java
 
b/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactory.java
new file mode 100644
index 0000000..d425366
--- /dev/null
+++ 
b/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactory.java
@@ -0,0 +1,64 @@
+/*
+ *  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.objectstore.jdo.metamodel.facets.prop.column;
+
+import java.math.BigDecimal;
+
+import javax.jdo.annotations.Column;
+
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.Annotations;
+import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+import org.apache.isis.core.metamodel.facets.FacetedMethod;
+import 
org.apache.isis.core.progmodel.facets.value.bigdecimal.BigDecimalValueFacet;
+
+
+public class BigDecimalDerivedFromJdoColumnAnnotationFacetFactory extends 
FacetFactoryAbstract {
+
+    private static final int DEFAULT_LENGTH = 
BigDecimalFacetFallback.DEFAULT_LENGTH;
+    private static final int DEFAULT_SCALE = 
BigDecimalFacetFallback.DEFAULT_SCALE;
+
+    public BigDecimalDerivedFromJdoColumnAnnotationFacetFactory() {
+        super(FeatureType.PROPERTIES_ONLY);
+    }
+
+    @Override
+    public void process(final ProcessMethodContext processMethodContext) {
+        if(BigDecimal.class != 
processMethodContext.getMethod().getReturnType()) {
+            return;
+        }
+        
+        final BigDecimalValueFacet facet;
+        final FacetedMethod holder = processMethodContext.getFacetHolder();
+        
+        final Column annotation = 
Annotations.getAnnotation(processMethodContext.getMethod(), Column.class);
+        if (annotation == null) {
+            facet = new BigDecimalFacetFallback(holder);
+        } else {
+            facet = new BigDecimalFacetDerivedFromJdoColumn(holder, 
valueElseDefault(annotation.length(), DEFAULT_LENGTH), 
valueElseDefault(annotation.scale(), DEFAULT_SCALE));
+        }
+        FacetUtil.addFacet(facet);
+    }
+
+    Integer valueElseDefault(final int value, final int defaultValue) {
+        return value != -1? value: defaultValue;
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/fd5d5083/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalFacetDerivedFromJdoColumn.java
----------------------------------------------------------------------
diff --git 
a/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalFacetDerivedFromJdoColumn.java
 
b/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalFacetDerivedFromJdoColumn.java
new file mode 100644
index 0000000..9884ce3
--- /dev/null
+++ 
b/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalFacetDerivedFromJdoColumn.java
@@ -0,0 +1,51 @@
+/*
+ *  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.objectstore.jdo.metamodel.facets.prop.column;
+
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import 
org.apache.isis.core.progmodel.facets.value.bigdecimal.BigDecimalValueFacet;
+
+
+public class BigDecimalFacetDerivedFromJdoColumn extends FacetAbstract 
implements BigDecimalValueFacet {
+
+    private final Integer length;
+    private final Integer scale;
+
+    public static Class<? extends Facet> type() {
+        return BigDecimalValueFacet.class;
+    }
+
+    public BigDecimalFacetDerivedFromJdoColumn(final FacetHolder holder, final 
Integer length, final Integer scale) {
+        super(BigDecimalFacetDerivedFromJdoColumn.type(), holder, 
Derivation.NOT_DERIVED);
+        this.length = length;
+        this.scale = scale;
+    }
+
+    @Override
+    public Integer getLength() {
+        return length;
+    }
+
+    @Override
+    public Integer getScale() {
+        return scale;
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/fd5d5083/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalFacetFallback.java
----------------------------------------------------------------------
diff --git 
a/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalFacetFallback.java
 
b/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalFacetFallback.java
new file mode 100644
index 0000000..f978730
--- /dev/null
+++ 
b/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalFacetFallback.java
@@ -0,0 +1,49 @@
+/*
+ *  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.objectstore.jdo.metamodel.facets.prop.column;
+
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import 
org.apache.isis.core.progmodel.facets.value.bigdecimal.BigDecimalValueFacet;
+
+
+public class BigDecimalFacetFallback extends FacetAbstract implements 
BigDecimalValueFacet {
+
+    static final int DEFAULT_LENGTH = 18;
+    static final int DEFAULT_SCALE = 2;
+
+    public static Class<? extends Facet> type() {
+        return BigDecimalValueFacet.class;
+    }
+
+    public BigDecimalFacetFallback(final FacetHolder holder) {
+        super(BigDecimalFacetFallback.type(), holder, Derivation.NOT_DERIVED);
+    }
+
+    @Override
+    public Integer getLength() {
+        return DEFAULT_LENGTH;
+    }
+
+    @Override
+    public Integer getScale() {
+        return DEFAULT_SCALE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/fd5d5083/component/objectstore/jdo/jdo-metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git 
a/component/objectstore/jdo/jdo-metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactoryTest.java
 
b/component/objectstore/jdo/jdo-metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactoryTest.java
new file mode 100644
index 0000000..0d6f363
--- /dev/null
+++ 
b/component/objectstore/jdo/jdo-metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactoryTest.java
@@ -0,0 +1,119 @@
+/*
+ *  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.objectstore.jdo.metamodel.facets.prop.column;
+
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.Assert.assertThat;
+
+import java.lang.reflect.Method;
+import java.util.List;
+
+import javax.jdo.annotations.PrimaryKey;
+
+import org.junit.Assert;
+
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.FacetFactory;
+import org.apache.isis.core.metamodel.facets.mandatory.MandatoryFacet;
+import org.apache.isis.core.progmodel.facets.AbstractFacetFactoryTest;
+import org.apache.isis.core.progmodel.facets.members.disabled.DisabledFacet;
+import 
org.apache.isis.core.progmodel.facets.value.bigdecimal.BigDecimalValueFacet;
+
+public class BigDecimalDerivedFromJdoColumnAnnotationFacetFactoryTest extends 
AbstractFacetFactoryTest {
+
+    private BigDecimalDerivedFromJdoColumnAnnotationFacetFactory facetFactory;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        facetFactory = new 
BigDecimalDerivedFromJdoColumnAnnotationFacetFactory();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        facetFactory = null;
+        super.tearDown();
+    }
+
+    public void testFeatureTypes() {
+        final List<FeatureType> featureTypes = facetFactory.getFeatureTypes();
+        assertFalse(contains(featureTypes, FeatureType.OBJECT));
+        assertTrue(contains(featureTypes, FeatureType.PROPERTY));
+        assertFalse(contains(featureTypes, FeatureType.COLLECTION));
+        assertFalse(contains(featureTypes, FeatureType.ACTION));
+        assertFalse(contains(featureTypes, FeatureType.ACTION_PARAMETER));
+    }
+
+    public void testAnnotationPickedUpOnProperty() throws Exception {
+        final Class<?> cls = SimpleObjectWithColumnAnnotations.class;
+        final Method method = 
cls.getMethod("getBigDecimalPropertyWithColumnAnnotation");
+        facetFactory.process(new FacetFactory.ProcessMethodContext(cls, 
method, methodRemover, facetedMethod));
+
+        final BigDecimalValueFacet facet = 
facetedMethod.getFacet(BigDecimalValueFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof BigDecimalFacetDerivedFromJdoColumn);
+        assertThat(facet.getLength(), is(12));
+        assertThat(facet.getScale(), is(3));
+    }
+
+    public void testAnnotationDefaultsLengthIfMissing() throws Exception {
+        final Class<?> cls = SimpleObjectWithColumnAnnotations.class;
+        final Method method = 
cls.getMethod("getBigDecimalPropertyWithColumnAnnotationMissingLength");
+        facetFactory.process(new FacetFactory.ProcessMethodContext(cls, 
method, methodRemover, facetedMethod));
+
+        final BigDecimalValueFacet facet = 
facetedMethod.getFacet(BigDecimalValueFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof BigDecimalFacetDerivedFromJdoColumn);
+        assertThat(facet.getLength(), is(18));
+    }
+
+    public void testAnnotationDefaultsScaleIfMissing() throws Exception {
+        final Class<?> cls = SimpleObjectWithColumnAnnotations.class;
+        final Method method = 
cls.getMethod("getBigDecimalPropertyWithColumnAnnotationMissingScale");
+        facetFactory.process(new FacetFactory.ProcessMethodContext(cls, 
method, methodRemover, facetedMethod));
+        
+        final BigDecimalValueFacet facet = 
facetedMethod.getFacet(BigDecimalValueFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof BigDecimalFacetDerivedFromJdoColumn);
+        assertThat(facet.getScale(), is(2));
+    }
+    
+    public void testNoFacetIfPropertyTypeIsNotBigDecimal() throws Exception {
+        
+        final Class<?> cls = SimpleObjectWithColumnAnnotations.class;
+        final Method method = 
cls.getMethod("getStringPropertyWithColumnAnnotation");
+        facetFactory.process(new FacetFactory.ProcessMethodContext(cls, 
method, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(BigDecimalValueFacet.class);
+        assertNull(facet);
+    }
+
+    public void testFallbackFacetIfPropertyIsNotAnnotated() throws Exception {
+        
+        final Class<?> cls = SimpleObjectWithColumnAnnotations.class;
+        final Method method = 
cls.getMethod("getBigDecimalPropertyWithoutColumnAnnotation");
+        facetFactory.process(new FacetFactory.ProcessMethodContext(cls, 
method, methodRemover, facetedMethod));
+        
+        final Facet facet = facetedMethod.getFacet(BigDecimalValueFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof BigDecimalFacetFallback);
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/fd5d5083/component/objectstore/jdo/jdo-metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/SimpleObjectWithColumnAnnotations.java
----------------------------------------------------------------------
diff --git 
a/component/objectstore/jdo/jdo-metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/SimpleObjectWithColumnAnnotations.java
 
b/component/objectstore/jdo/jdo-metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/SimpleObjectWithColumnAnnotations.java
new file mode 100644
index 0000000..7949f38
--- /dev/null
+++ 
b/component/objectstore/jdo/jdo-metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/SimpleObjectWithColumnAnnotations.java
@@ -0,0 +1,98 @@
+/*
+ *  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.objectstore.jdo.metamodel.facets.prop.column;
+
+import java.math.BigDecimal;
+
+import javax.jdo.annotations.Column;
+
+import org.apache.isis.applib.annotation.MemberOrder;
+
+
+public class SimpleObjectWithColumnAnnotations {
+
+    // {{ BigDecimalPropertyWithColumnAnnotation (property)
+    private BigDecimal bigDecimalPropertyWithColumnAnnotation;
+
+    @Column(length=12,scale=3)
+    public BigDecimal getBigDecimalPropertyWithColumnAnnotation() {
+        return bigDecimalPropertyWithColumnAnnotation;
+    }
+
+    public void setBigDecimalPropertyWithColumnAnnotation(final BigDecimal 
val) {
+        this.bigDecimalPropertyWithColumnAnnotation = val;
+    }
+    // }}
+
+    // {{ BigDecimalPropertyWithColumnAnnotation (property)
+    private BigDecimal bigDecimalPropertyWithColumnAnnotationMissingLength;
+
+    @Column(scale=3)
+    public BigDecimal getBigDecimalPropertyWithColumnAnnotationMissingLength() 
{
+        return bigDecimalPropertyWithColumnAnnotationMissingLength;
+    }
+
+    public void setBigDecimalPropertyWithColumnAnnotationMissingLength(final 
BigDecimal val) {
+        this.bigDecimalPropertyWithColumnAnnotationMissingLength = val;
+    }
+    // }}
+
+    // {{ BigDecimalPropertyWithColumnAnnotationMissingScale (property)
+    private BigDecimal bigDecimalPropertyWithColumnAnnotationMissingScale;
+
+    @Column(length=12)
+    public BigDecimal getBigDecimalPropertyWithColumnAnnotationMissingScale() {
+        return bigDecimalPropertyWithColumnAnnotationMissingScale;
+    }
+
+    public void setBigDecimalPropertyWithColumnAnnotationMissingScale(final 
BigDecimal val) {
+        this.bigDecimalPropertyWithColumnAnnotationMissingScale = val;
+    }
+    // }}
+
+    // {{ StringPropertyWithColumnAnnotation (property)
+    private String stringPropertyWithColumnAnnotation;
+
+    @Column(length=12, scale=3)
+    public String getStringPropertyWithColumnAnnotation() {
+        return stringPropertyWithColumnAnnotation;
+    }
+
+    public void setStringPropertyWithColumnAnnotation(final String 
stringPropertyWithColumnAnnotation) {
+        this.stringPropertyWithColumnAnnotation = 
stringPropertyWithColumnAnnotation;
+    }
+    // }}
+
+    // {{ BigDecimalPropertyWithoutColumnAnnotation (property)
+    private BigDecimal bigDecimalPropertyWithoutColumnAnnotation;
+
+    public BigDecimal getBigDecimalPropertyWithoutColumnAnnotation() {
+        return bigDecimalPropertyWithoutColumnAnnotation;
+    }
+
+    public void setBigDecimalPropertyWithoutColumnAnnotation(final BigDecimal 
bigDecimalPropertyWithoutColumnAnnotation) {
+        this.bigDecimalPropertyWithoutColumnAnnotation = 
bigDecimalPropertyWithoutColumnAnnotation;
+    }
+    // }}
+
+
+
+
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/fd5d5083/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 fda2799..8491aea 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
@@ -41,6 +41,7 @@ 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.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
@@ -171,6 +172,22 @@ public class ScalarModel extends EntityModel {
                 final OneToOneAssociation property = 
propertyMemento.getProperty();
                 return property.getDescription();
             }
+
+            @Override
+            public Integer getLength(ScalarModel scalarModel) {
+                final PropertyMemento propertyMemento = 
scalarModel.getPropertyMemento();
+                final OneToOneAssociation property = 
propertyMemento.getProperty();
+                final BigDecimalValueFacet facet = 
property.getFacet(BigDecimalValueFacet.class);
+                return facet != null? facet.getLength(): null;
+            }
+            
+            @Override
+            public Integer getScale(ScalarModel scalarModel) {
+                final PropertyMemento propertyMemento = 
scalarModel.getPropertyMemento();
+                final OneToOneAssociation property = 
propertyMemento.getProperty();
+                final BigDecimalValueFacet facet = 
property.getFacet(BigDecimalValueFacet.class);
+                return facet != null? facet.getScale(): null;
+            }
         },
         PARAMETER {
             @Override
@@ -267,6 +284,22 @@ public class ScalarModel extends EntityModel {
                 final ObjectActionParameter actionParameter = 
parameterMemento.getActionParameter();
                 return actionParameter.getDescription();
             }
+
+            @Override
+            public Integer getLength(ScalarModel scalarModel) {
+                final ActionParameterMemento parameterMemento = 
scalarModel.getParameterMemento();
+                final ObjectActionParameter actionParameter = 
parameterMemento.getActionParameter();
+                final BigDecimalValueFacet facet = 
actionParameter.getFacet(BigDecimalValueFacet.class);
+                return facet != null? facet.getLength(): null;
+            }
+            
+            @Override
+            public Integer getScale(ScalarModel scalarModel) {
+                final ActionParameterMemento parameterMemento = 
scalarModel.getParameterMemento();
+                final ObjectActionParameter actionParameter = 
parameterMemento.getActionParameter();
+                final BigDecimalValueFacet facet = 
actionParameter.getFacet(BigDecimalValueFacet.class);
+                return facet != null? facet.getScale(): null;
+            }
         };
 
         private static List<ObjectAdapter> choicesAsList(final ObjectAdapter[] 
choices) {
@@ -307,6 +340,9 @@ public class ScalarModel extends EntityModel {
         public abstract String getDescribedAs(ScalarModel scalarModel);
 
         public abstract boolean hasChoices(ScalarModel scalarModel);
+
+        public abstract Integer getLength(ScalarModel scalarModel);
+        public abstract Integer getScale(ScalarModel scalarModel);
     }
 
     private final Kind kind;
@@ -486,4 +522,12 @@ public class ScalarModel extends EntityModel {
         return kind.hasChoices(this);
     }
 
+    public Integer getScale() {
+        return kind.getScale(this);
+    }
+
+    public int getLength() {
+        return kind.getLength(this);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/fd5d5083/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
----------------------------------------------------------------------
diff --git 
a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
 
b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
index d6b3932..eb8c79e 100644
--- 
a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
+++ 
b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
@@ -72,7 +72,11 @@ public abstract class ScalarPanelTextFieldAbstract<T extends 
Serializable> exten
     }
 
     protected TextField<T> createTextField(final String id) {
-        return new TextField<T>(id, new TextFieldValueModel<T>(this), cls);
+        return new TextField<T>(id, newTextFieldValueModel(), cls);
+    }
+
+    protected TextFieldValueModel<T> newTextFieldValueModel() {
+        return new TextFieldValueModel<T>(this);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/fd5d5083/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldNumeric.java
----------------------------------------------------------------------
diff --git 
a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldNumeric.java
 
b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldNumeric.java
index a5535d4..9ce5f9e 100644
--- 
a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldNumeric.java
+++ 
b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldNumeric.java
@@ -23,7 +23,6 @@ import java.io.Serializable;
 
 import org.apache.wicket.Component;
 import org.apache.wicket.markup.html.form.AbstractTextComponent;
-import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.model.IModel;
 
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;

http://git-wip-us.apache.org/repos/asf/isis/blob/fd5d5083/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigDecimalPanel.java
----------------------------------------------------------------------
diff --git 
a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigDecimalPanel.java
 
b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigDecimalPanel.java
index 96e9779..2380da2 100644
--- 
a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigDecimalPanel.java
+++ 
b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigDecimalPanel.java
@@ -20,6 +20,15 @@
 package org.apache.isis.viewer.wicket.ui.components.scalars.jdkmath;
 
 import java.math.BigDecimal;
+import java.math.MathContext;
+import java.math.RoundingMode;
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+import java.text.ParseException;
+import java.util.Locale;
+
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.util.convert.IConverter;
 
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import 
org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldNumeric;
@@ -34,5 +43,64 @@ public class JavaMathBigDecimalPanel extends 
ScalarPanelTextFieldNumeric<BigDeci
     public JavaMathBigDecimalPanel(final String id, final ScalarModel 
scalarModel) {
         super(id, scalarModel, BigDecimal.class);
     }
+ 
+    @Override
+    protected void addSemantics() {
+        super.addSemantics();
+    }
+    
+    protected TextField<BigDecimal> createTextField(final String id) {
+        
+        final ScalarModel model = getModel();
+        
+        final TextField<BigDecimal> textField = new TextField<BigDecimal>(id, 
newTextFieldValueModel(), cls) {
+
+            private static final long serialVersionUID = 1L;
+
+            @SuppressWarnings("unchecked")
+            @Override
+            public <C> IConverter<C> getConverter(Class<C> type) {
+
+                Integer scale = model.getScale();
+                final MathContext mathContext = new MathContext(scale+1, 
RoundingMode.HALF_UP);
+                
+//                final NumberFormat numberFormat = NumberFormat.getInstance();
+//                numberFormat.setMinimumFractionDigits(scale);
+//                numberFormat.setMaximumFractionDigits(scale);
+//                numberFormat.setMaximumIntegerDigits(model.getLength());
+
+                if(type == BigDecimal.class) {
+                    return (IConverter<C>) new IConverter<BigDecimal>() {
+
+                        private static final long serialVersionUID = 1L;
+
+                        @Override
+                        public BigDecimal convertToObject(String value, Locale 
locale) {
+                            try {
+                                return new BigDecimal(value, mathContext);
+//                                final Number parsed = 
numberFormat.parse(value);
+//                                return (BigDecimal) parsed;
+                            } catch (Exception e) {
+                                return null;
+                            }
+                        }
+
+                        @Override
+                        public String convertToString(BigDecimal value, Locale 
locale) {
+                            //return numberFormat.format(value);
+                            return value.toPlainString();
+                        }}; 
+                } else {
+                    return super.getConverter(type);
+                }
+            }
+        };
+        
+        
+        return textField;
+    }
+    
+    
+
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/fd5d5083/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/value/bigdecimal/BigDecimalValueFacet.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/value/bigdecimal/BigDecimalValueFacet.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/value/bigdecimal/BigDecimalValueFacet.java
index 1d8fa10..710d4c1 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/value/bigdecimal/BigDecimalValueFacet.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/value/bigdecimal/BigDecimalValueFacet.java
@@ -23,4 +23,8 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 
 public interface BigDecimalValueFacet extends Facet {
 
+    Integer getLength();
+    
+    Integer getScale();
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/fd5d5083/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/value/bigdecimal/BigDecimalValueSemanticsProvider.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/value/bigdecimal/BigDecimalValueSemanticsProvider.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/value/bigdecimal/BigDecimalValueSemanticsProvider.java
index 1cd3f63..12372f4 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/value/bigdecimal/BigDecimalValueSemanticsProvider.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/value/bigdecimal/BigDecimalValueSemanticsProvider.java
@@ -60,13 +60,26 @@ public class BigDecimalValueSemanticsProvider extends 
ValueSemanticsProviderAndF
     }
 
     public void setLocale(final Locale l) {
-        // TODO Auto-generated method stub
 
     }
 
     // //////////////////////////////////////////////////////////////////
     // Parser
     // //////////////////////////////////////////////////////////////////
+    
+    @Override
+    public Integer getLength() {
+        return 18;
+    }
+
+    @Override
+    public Integer getScale() {
+        return 2;
+    }
+
+    // //////////////////////////////////////////////////////////////////
+    // Parser
+    // //////////////////////////////////////////////////////////////////
 
     @Override
     protected BigDecimal doParse(final Object context, final String entry) {
@@ -120,4 +133,5 @@ public class BigDecimalValueSemanticsProvider extends 
ValueSemanticsProviderAndF
         return "BigDecimalValueSemanticsProvider: " + format;
     }
 
+
 }

Reply via email to