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; } + }
