Repository: isis Updated Branches: refs/heads/master d84c66090 -> d68ab6282
ISIS-1042: trying to figure out how to honour title() Turns out not that easy to do, because need round-tripping in order to parse the value Project: http://git-wip-us.apache.org/repos/asf/isis/repo Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/e8ceb012 Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/e8ceb012 Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/e8ceb012 Branch: refs/heads/master Commit: e8ceb012b361b82e042aba7929c106f85d0e1863 Parents: d84c660 Author: Dan Haywood <d...@haywood-associates.co.uk> Authored: Thu Feb 19 18:30:33 2015 +0000 Committer: Dan Haywood <d...@haywood-associates.co.uk> Committed: Fri Feb 20 09:25:33 2015 +0000 ---------------------------------------------------------------------- .../enums/EnumValueSemanticsProvider.java | 48 +++++++++++++- .../ValueSemanticsProviderAndFacetAbstract.java | 6 +- .../scalars/IsisConverterLocator.java | 12 +++- .../scalars/jdkmath/BigIntegerConverter.java | 68 ++++++++++++++++++++ .../jdkmath/JavaMathBigIntegerPanel.java | 1 - .../jdkmath/JavaMathBigIntegerPanelFactory.java | 53 --------------- 6 files changed, 129 insertions(+), 59 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/isis/blob/e8ceb012/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java index 7bae5ad..a7c3cd0 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java @@ -19,18 +19,25 @@ package org.apache.isis.core.metamodel.facets.object.choices.enums; +import java.lang.reflect.Method; import org.apache.isis.applib.adapters.EncoderDecoder; import org.apache.isis.applib.adapters.Parser; import org.apache.isis.applib.profiles.Localization; +import org.apache.isis.applib.services.i18n.TranslatableString; +import org.apache.isis.applib.services.i18n.TranslationService; import org.apache.isis.core.commons.config.IsisConfiguration; +import org.apache.isis.core.commons.lang.MethodExtensions; import org.apache.isis.core.metamodel.facetapi.Facet; import org.apache.isis.core.metamodel.facetapi.FacetHolder; +import org.apache.isis.core.metamodel.facets.MethodFinderUtils; import org.apache.isis.core.metamodel.facets.object.parseable.TextEntryParseException; import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueSemanticsProviderAndFacetAbstract; import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueSemanticsProviderContext; +import org.apache.isis.core.metamodel.methodutils.MethodScope; public class EnumValueSemanticsProvider<T extends Enum<T>> extends ValueSemanticsProviderAndFacetAbstract<T> implements EnumFacet { + private static Class<? extends Facet> type() { return EnumFacet.class; } @@ -48,7 +55,12 @@ public class EnumValueSemanticsProvider<T extends Enum<T>> extends ValueSemantic } return max; } - + + + private static final String TITLE = "title"; + + private final Method titleMethod; + /** * Required because {@link Parser} and {@link EncoderDecoder}. */ @@ -64,12 +76,25 @@ public class EnumValueSemanticsProvider<T extends Enum<T>> extends ValueSemantic EqualByContent.HONOURED, defaultFor(adaptedClass), configuration, context); + + titleMethod = MethodFinderUtils.findMethod( + getAdaptedClass(), MethodScope.OBJECT, + TITLE, + new Class<?>[]{String.class, TranslatableString.class}, + null); + } @Override protected T doParse(final Object context, final String entry) { final T[] enumConstants = getAdaptedClass().getEnumConstants(); for (final T enumConstant : enumConstants) { + if (doEncode(enumConstant).equals(entry)) { + return enumConstant; + } + } + // fallback + for (final T enumConstant : enumConstants) { if (enumConstant.toString().equals(entry)) { return enumConstant; } @@ -87,8 +112,29 @@ public class EnumValueSemanticsProvider<T extends Enum<T>> extends ValueSemantic return doParse(null, data); } + @Override protected String titleString(final Object object, final Localization localization) { + if (titleMethod != null) { + final TranslationService translationService = getDependencyInjector().lookupService(TranslationService.class); + // sadness: same as in TranslationFactory + final String translationContext = titleMethod.getDeclaringClass().getName() + "#" + titleMethod.getName() + "()"; + + try { + final Object returnValue = MethodExtensions.invoke(titleMethod, object); + if(returnValue instanceof String) { + return (String) returnValue; + } + if(returnValue instanceof TranslatableString) { + final TranslatableString ts = (TranslatableString) returnValue; + return ts.translate(translationService, translationContext); + } + return null; + } catch (final RuntimeException ex) { + // fall through + } + } + return object.toString(); } http://git-wip-us.apache.org/repos/asf/isis/blob/e8ceb012/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueSemanticsProviderAndFacetAbstract.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueSemanticsProviderAndFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueSemanticsProviderAndFacetAbstract.java index 818eeb9..4099eb6 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueSemanticsProviderAndFacetAbstract.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueSemanticsProviderAndFacetAbstract.java @@ -23,7 +23,11 @@ import java.text.DecimalFormat; import java.text.Format; import java.text.NumberFormat; import java.util.Locale; -import org.apache.isis.applib.adapters.*; +import org.apache.isis.applib.adapters.DefaultsProvider; +import org.apache.isis.applib.adapters.EncoderDecoder; +import org.apache.isis.applib.adapters.Parser; +import org.apache.isis.applib.adapters.Parser2; +import org.apache.isis.applib.adapters.ValueSemanticsProvider; import org.apache.isis.applib.clock.Clock; import org.apache.isis.applib.profiles.Localization; import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider; http://git-wip-us.apache.org/repos/asf/isis/blob/e8ceb012/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/IsisConverterLocator.java ---------------------------------------------------------------------- diff --git a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/IsisConverterLocator.java b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/IsisConverterLocator.java index aeb4c91..e06a542 100644 --- a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/IsisConverterLocator.java +++ b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/IsisConverterLocator.java @@ -14,7 +14,7 @@ import org.apache.isis.viewer.wicket.ui.components.scalars.jdkdates.DateConverte import org.apache.isis.viewer.wicket.ui.components.scalars.jdkdates.DateConverterForJavaSqlTimestamp; import org.apache.isis.viewer.wicket.ui.components.scalars.jdkdates.DateConverterForJavaUtilDate; import org.apache.isis.viewer.wicket.ui.components.scalars.jdkmath.BigDecimalConverterWithScale; -import org.apache.isis.viewer.wicket.ui.components.scalars.jdkmath.JavaMathBigIntegerPanelFactory; +import org.apache.isis.viewer.wicket.ui.components.scalars.jdkmath.BigIntegerConverter; import org.apache.isis.viewer.wicket.ui.components.scalars.jodatime.DateConverterForJodaDateTime; import org.apache.isis.viewer.wicket.ui.components.scalars.jodatime.DateConverterForJodaLocalDate; import org.apache.isis.viewer.wicket.ui.components.scalars.jodatime.DateConverterForJodaLocalDateTime; @@ -40,9 +40,15 @@ public class IsisConverterLocator { return null; } + // explicitly exclude enums; this will force the titleString + // to be used from Isis' EnumValueSemanticsProvider + final Class<?> correspondingClass = objectSpecification.getCorrespondingClass(); + if(Enum.class.isAssignableFrom(correspondingClass)) { + return null; + } + final RenderedAdjustedFacet renderedAdjustedFacet = objectSpecification.getFacet(RenderedAdjustedFacet.class); final int adjustBy = renderedAdjustedFacet != null ? renderedAdjustedFacet.value() : 0; - final Class<?> correspondingClass = objectSpecification.getCorrespondingClass(); IConverter converter = null; if (java.util.Date.class == correspondingClass) { @@ -62,7 +68,7 @@ public class IsisConverterLocator { } else if (java.sql.Timestamp.class == correspondingClass) { converter = new DateConverterForJavaSqlTimestamp(wicketViewerSettings, adjustBy); } else if (java.math.BigInteger.class == correspondingClass) { - converter = JavaMathBigIntegerPanelFactory.BigIntegerConverter.INSTANCE; + converter = BigIntegerConverter.INSTANCE; } else if (java.math.BigDecimal.class == correspondingClass) { final BigDecimalValueFacet facet = objectSpecification.getFacet(BigDecimalValueFacet.class); Integer scale = null; http://git-wip-us.apache.org/repos/asf/isis/blob/e8ceb012/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigIntegerConverter.java ---------------------------------------------------------------------- diff --git a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigIntegerConverter.java b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigIntegerConverter.java new file mode 100644 index 0000000..3f581b4 --- /dev/null +++ b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigIntegerConverter.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.isis.viewer.wicket.ui.components.scalars.jdkmath; + +import java.math.BigInteger; +import java.util.Locale; +import org.apache.wicket.util.convert.ConversionException; +import org.apache.wicket.util.convert.IConverter; +import org.apache.wicket.util.convert.converter.AbstractIntegerConverter; +import org.apache.wicket.util.string.Strings; + +public final class BigIntegerConverter extends AbstractIntegerConverter<BigInteger> { + private static final long serialVersionUID = 1L; + + /** + * The singleton instance for a big integer converter + * (cf the Wicket subclasses) + */ + public static final IConverter<BigInteger> INSTANCE = new BigIntegerConverter(); + + @Override + public BigInteger convertToObject(String value, Locale locale) throws ConversionException { + if (Strings.isEmpty(value)) + { + return null; + } + + final Number number = parse(value, -Double.MAX_VALUE, Double.MAX_VALUE, locale); + + if (number instanceof BigInteger) + { + return (BigInteger)number; + } + else if (number instanceof Long) + { + return BigInteger.valueOf(number.longValue()); + } + else if (number instanceof Integer) + { + return BigInteger.valueOf(number.intValue()); + } + else + { + return new BigInteger(value); + } + } + + @Override + protected Class<BigInteger> getTargetType() { + return BigInteger.class; + } +} http://git-wip-us.apache.org/repos/asf/isis/blob/e8ceb012/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigIntegerPanel.java ---------------------------------------------------------------------- diff --git a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigIntegerPanel.java b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigIntegerPanel.java index a696fe4..d68038d 100644 --- a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigIntegerPanel.java +++ b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigIntegerPanel.java @@ -30,7 +30,6 @@ 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; import org.apache.isis.viewer.wicket.ui.components.scalars.TextFieldValueModel; -import org.apache.isis.viewer.wicket.ui.components.scalars.jdkmath.JavaMathBigIntegerPanelFactory.BigIntegerConverter; /** * Panel for rendering scalars of type {@link BigInteger}. http://git-wip-us.apache.org/repos/asf/isis/blob/e8ceb012/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigIntegerPanelFactory.java ---------------------------------------------------------------------- diff --git a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigIntegerPanelFactory.java b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigIntegerPanelFactory.java index bd10c2b..b822200 100644 --- a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigIntegerPanelFactory.java +++ b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigIntegerPanelFactory.java @@ -19,18 +19,7 @@ package org.apache.isis.viewer.wicket.ui.components.scalars.jdkmath; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.util.Locale; - import org.apache.wicket.Component; -import org.apache.wicket.util.convert.ConversionException; -import org.apache.wicket.util.convert.IConverter; -import org.apache.wicket.util.convert.converter.AbstractIntegerConverter; -import org.apache.wicket.util.convert.converter.BigDecimalConverter; -import org.apache.wicket.util.convert.converter.IntegerConverter; -import org.apache.wicket.util.string.Strings; - import org.apache.isis.viewer.wicket.model.models.ScalarModel; import org.apache.isis.viewer.wicket.ui.ComponentFactory; import org.apache.isis.viewer.wicket.ui.components.scalars.ComponentFactoryScalarAbstract; @@ -40,48 +29,6 @@ import org.apache.isis.viewer.wicket.ui.components.scalars.ComponentFactoryScala */ public class JavaMathBigIntegerPanelFactory extends ComponentFactoryScalarAbstract { - public static final class BigIntegerConverter extends AbstractIntegerConverter<BigInteger> { - private static final long serialVersionUID = 1L; - - /** - * The singleton instance for a big integer converter - * (cf the Wicket subclasses) - */ - public static final IConverter<BigInteger> INSTANCE = new BigIntegerConverter(); - - @Override - public BigInteger convertToObject(String value, Locale locale) throws ConversionException { - if (Strings.isEmpty(value)) - { - return null; - } - - final Number number = parse(value, -Double.MAX_VALUE, Double.MAX_VALUE, locale); - - if (number instanceof BigInteger) - { - return (BigInteger)number; - } - else if (number instanceof Long) - { - return BigInteger.valueOf(number.longValue()); - } - else if (number instanceof Integer) - { - return BigInteger.valueOf(number.intValue()); - } - else - { - return new BigInteger(value); - } - } - - @Override - protected Class<BigInteger> getTargetType() { - return BigInteger.class; - } - } - private static final long serialVersionUID = 1L; public JavaMathBigIntegerPanelFactory() {