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
commit 22732dbd1c67b025665862047f3e342517d06321 Author: Andi Huber <ahu...@apache.org> AuthorDate: Fri Apr 13 12:21:19 2018 +0200 ISIS-1742 moving deprecated MementoService to -legacy Introduces _Mementos for Internal API. --- .../applib/services/memento/MementoService.java | 3 +- .../isis/applib/services/memento/package-info.java | 0 ...aseEncodingWithSupportForLargeUrlsAbstract.java | 8 +- .../isis/applib/fixturescripts/FixtureScripts.java | 24 +++-- .../apache/isis/applib/internal/base/_Casts.java | 26 ++++- .../isis/applib/internal/memento/_Mementos.java | 85 +++++++++++++++ .../internal/memento/_Mementos_MementoDefault.java | 107 +++++++++++++++++++ .../_Casts.java => memento/package-info.java} | 27 ++--- .../services/urlencoding/UrlEncodingService.java | 17 ++- .../UrlEncodingServiceUsingBaseEncoding.java | 13 ++- .../UrlEncodingServiceWithCompressionAbstract.java | 23 +++- .../isis/applib/internal/memento/MementosTest.java | 117 +++++++++++++++++++++ .../urlencoding/UrlEncodingServiceTest.java | 48 +++++++++ ...codingServiceWithCompression_Abstract_Test.java | 35 ------ ...ObjectFacetDeclarativeInitializingAbstract.java | 77 +++++++++----- ...ableObjectFacetForXmlRootElementAnnotation.java | 4 +- .../command/CommandDtoServiceInternal.java | 1 - .../core/runtime/services/memento/Dom4jUtil.java | 0 .../services/memento/MementoServiceDefault.java | 22 ++-- .../memento/MementoServiceDefaultTest.java | 0 .../command/CommandDtoServiceInternalDefault.java | 54 +++++----- 21 files changed, 538 insertions(+), 153 deletions(-) diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/memento/MementoService.java b/core/applib-legacy/src/main/java/org/apache/isis/applib/services/memento/MementoService.java similarity index 97% rename from core/applib/src/main/java/org/apache/isis/applib/services/memento/MementoService.java rename to core/applib-legacy/src/main/java/org/apache/isis/applib/services/memento/MementoService.java index aa604cf..76de626 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/services/memento/MementoService.java +++ b/core/applib-legacy/src/main/java/org/apache/isis/applib/services/memento/MementoService.java @@ -33,7 +33,8 @@ import org.apache.isis.applib.services.jaxb.JaxbService; * registered and available for use; no configuration is required. * </p> * - * @deprecated - for view models, use JAXB annotations and the {@link JaxbService}; for action invocations and such like, use {@link InteractionContext} and {@link CommandContext}. + * @deprecated - for view models, use JAXB annotations and the {@link JaxbService}; + * for action invocations and such like, use {@link InteractionContext} and {@link CommandContext}. */ @Deprecated public interface MementoService { diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/memento/package-info.java b/core/applib-legacy/src/main/java/org/apache/isis/applib/services/memento/package-info.java similarity index 100% rename from core/applib/src/main/java/org/apache/isis/applib/services/memento/package-info.java rename to core/applib-legacy/src/main/java/org/apache/isis/applib/services/memento/package-info.java diff --git a/core/applib-legacy/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceUsingBaseEncodingWithSupportForLargeUrlsAbstract.java b/core/applib-legacy/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceUsingBaseEncodingWithSupportForLargeUrlsAbstract.java index 739ec60..e8e4aa1 100644 --- a/core/applib-legacy/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceUsingBaseEncodingWithSupportForLargeUrlsAbstract.java +++ b/core/applib-legacy/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceUsingBaseEncodingWithSupportForLargeUrlsAbstract.java @@ -31,9 +31,9 @@ public abstract class UrlEncodingServiceUsingBaseEncodingWithSupportForLargeUrls Maps.synchronizedBiMap(HashBiMap.<String, String>create(EXPECTED_SIZE)); @Override - public String encode(final String value) { + public String encodeString(final String value) { if(!canCache(value)) { - return super.encode(value); + return super.encodeString(value); } synchronized (cachedValueByKey) { @@ -47,9 +47,9 @@ public abstract class UrlEncodingServiceUsingBaseEncodingWithSupportForLargeUrls } @Override - public String decode(final String key) { + public String decodeToString(final String key) { if(key == null || !key.startsWith(KEY_PREFIX)) { - return super.decode(key); + return super.decodeToString(key); } String keySuffix = key.substring(KEY_PREFIX.length()); return cachedValueByKey.get(keySuffix); diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java index 1b8549c..4593ec9 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java +++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java @@ -28,6 +28,7 @@ import java.util.function.Predicate; import java.util.stream.Collectors; import javax.annotation.PostConstruct; +import javax.xml.bind.annotation.XmlRootElement; import org.apache.isis.applib.AbstractService; import org.apache.isis.applib.DomainObjectContainer; @@ -47,8 +48,7 @@ import org.apache.isis.applib.services.bookmark.BookmarkService; import org.apache.isis.applib.services.classdiscovery.ClassDiscoveryService; import org.apache.isis.applib.services.fixturespec.FixtureScriptsDefault; import org.apache.isis.applib.services.fixturespec.FixtureScriptsSpecification; -import org.apache.isis.applib.services.memento.MementoService; -import org.apache.isis.applib.services.memento.MementoService.Memento; +import org.apache.isis.applib.services.jaxb.JaxbService; import org.apache.isis.applib.services.registry.ServiceRegistry; import org.apache.isis.applib.services.repository.RepositoryService; import org.apache.isis.applib.services.title.TitleService; @@ -413,15 +413,21 @@ public abstract class FixtureScripts extends AbstractService { // -- memento support for FixtureScript + @XmlRootElement(name = "fixtureScript") + public static class FixtureScriptMemento { + private String path; + public String getPath() { return path; } + public void setPath(String path) { this.path = path; } + } String mementoFor(final FixtureScript fs) { - return mementoService.create() - .set("path", fs.getParentPath()) - .asString(); + final FixtureScriptMemento memento = new FixtureScriptMemento(); + memento.setPath(fs.getParentPath()); + return jaxbService.toXml(memento); } - void initOf(final String mementoStr, final FixtureScript fs) { - final Memento memento = mementoService.parse(mementoStr); - fs.setParentPath(memento.get("path", String.class)); + void initOf(final String xml, final FixtureScript fs) { + final FixtureScriptMemento memento = jaxbService.fromXml(FixtureScriptMemento.class, xml); + fs.setParentPath(memento.getPath()); } // -- helpers (package level) @@ -467,7 +473,7 @@ public abstract class FixtureScripts extends AbstractService { TitleService titleService; @javax.inject.Inject - MementoService mementoService; + JaxbService jaxbService; @javax.inject.Inject BookmarkService bookmarkService; diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/base/_Casts.java b/core/applib/src/main/java/org/apache/isis/applib/internal/base/_Casts.java index 30713a9..d201ff6 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/internal/base/_Casts.java +++ b/core/applib/src/main/java/org/apache/isis/applib/internal/base/_Casts.java @@ -19,6 +19,11 @@ package org.apache.isis.applib.internal.base; +import java.util.Objects; +import java.util.function.Supplier; + +import javax.annotation.Nullable; + /** * <h1>- internal use only -</h1> * <p> @@ -36,8 +41,27 @@ public final class _Casts { private _Casts(){} @SuppressWarnings("unchecked") - public static <T> T uncheckedCast(Object obj) { + public static <T> T uncheckedCast(@Nullable Object obj) { return (T) obj; } + + /** + * Returns the casts of {@code value} to {@code cls}, or if this fails returns the result of {@code orElse} + * @param value + * @param cls + * @param orElse + * @return + */ + public static <T> T castToOrElse(@Nullable Object value, Class<T> cls, Supplier<T> orElse) { + Objects.requireNonNull(cls); + Objects.requireNonNull(orElse); + + try { + return cls.cast(value); + } catch (Exception e) { + return orElse.get(); + } + + } } diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/memento/_Mementos.java b/core/applib/src/main/java/org/apache/isis/applib/internal/memento/_Mementos.java new file mode 100644 index 0000000..291df6f --- /dev/null +++ b/core/applib/src/main/java/org/apache/isis/applib/internal/memento/_Mementos.java @@ -0,0 +1,85 @@ +/* + * 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.applib.internal.memento; + +import java.util.Set; + +import org.apache.isis.applib.services.urlencoding.UrlEncodingService; + +/** + * <h1>- internal use only -</h1> + * <p> + * Provides framework internal memento support. + * </p> + * <p> + * <b>WARNING</b>: Do <b>NOT</b> use any of the classes provided by this package! <br/> + * These may be changed or removed without notice! + * </p> + * + * @since 2.0.0 + */ +public final class _Mementos { + + private _Mementos(){} + + // -- MEMENTO INTERFACE + + public static interface Memento { + + public Memento set(String name, Object value); + + public <T> T get(String name, Class<T> cls); + + /** + * @return To-String serialization of this Memento. + */ + public String asString(); + + public Set<String> keySet(); + } + + // -- CONSTRUCTION + + /** + * Creates an empty {@link Memento}. + * + * <p> + * Typically followed by {@link Memento#set(String, Object)} for each of the data values to + * add to the {@link Memento}, then {@link Memento#asString()} to convert to a string format. + * + */ + public static Memento create(UrlEncodingService codec) { + return new _Mementos_MementoDefault(codec); + } + + /** + * Parse string returned from {@link Memento#asString()} + * + * <p> + * Typically followed by {@link Memento#get(String, Class)} for each of the data values held + * in the {@link Memento}. + * + */ + public static Memento parse(UrlEncodingService codec, final String str) { + return _Mementos_MementoDefault.parse(codec, str); + + } + +} diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/memento/_Mementos_MementoDefault.java b/core/applib/src/main/java/org/apache/isis/applib/internal/memento/_Mementos_MementoDefault.java new file mode 100644 index 0000000..d69e5f2 --- /dev/null +++ b/core/applib/src/main/java/org/apache/isis/applib/internal/memento/_Mementos_MementoDefault.java @@ -0,0 +1,107 @@ +/* + * 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.applib.internal.memento; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +import javax.annotation.Nullable; + +import org.apache.isis.applib.internal.base._Casts; +import org.apache.isis.applib.internal.base._NullSafe; +import org.apache.isis.applib.internal.collections._Maps; +import org.apache.isis.applib.internal.collections._Sets; +import org.apache.isis.applib.internal.memento._Mementos.Memento; +import org.apache.isis.applib.services.urlencoding.UrlEncodingService; + +/** + * + * package private mixin for utility class {@link _Mementos} + * + * Memento default implementation. + * + */ +class _Mementos_MementoDefault implements _Mementos.Memento { + + private final UrlEncodingService codec; + private final Map<String, Object> valuesByKey; + + _Mementos_MementoDefault(UrlEncodingService codec) { + this(codec, _Maps.newHashMap()); + } + + private _Mementos_MementoDefault(UrlEncodingService codec, Map<String, Object> valuesByKey) { + Objects.requireNonNull(codec); + this.codec = codec; + this.valuesByKey = valuesByKey; + } + + @Override + public Memento set(String name, Object value) { + valuesByKey.put(name, value); + return this; + } + + @Override + public <T> T get(String name, Class<T> cls) { + final Object value = valuesByKey.get(name); + return _Casts.castToOrElse(value, cls, ()->null); + } + + @Override + public Set<String> keySet() { + return _Sets.unmodifiable(valuesByKey.keySet()); + } + + @Override + public String asString() { + + final ByteArrayOutputStream os = new ByteArrayOutputStream(16*1024); // 16k initial size + + try(ObjectOutputStream oos = new ObjectOutputStream(os)){ + oos.writeObject(valuesByKey); + } catch (Exception e) { + throw new IllegalArgumentException("failed to serialize memento", e); + } + + return codec.encode(os.toByteArray()); + } + + // -- PARSER + + static Memento parse(UrlEncodingService codec, @Nullable String str) { + Objects.requireNonNull(codec); + if(_NullSafe.isEmpty(str)) { + return null; + } + try(ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(codec.decode(str)))) { + final Map<String, Object> valuesByKey = _Casts.uncheckedCast(ois.readObject()); + return new _Mementos_MementoDefault(codec, valuesByKey); + } catch (Exception e) { + throw new IllegalArgumentException("failed to parse memento from serialized string", e); + } + } + +} diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/base/_Casts.java b/core/applib/src/main/java/org/apache/isis/applib/internal/memento/package-info.java similarity index 70% copy from core/applib/src/main/java/org/apache/isis/applib/internal/base/_Casts.java copy to core/applib/src/main/java/org/apache/isis/applib/internal/memento/package-info.java index 30713a9..098b24b 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/internal/base/_Casts.java +++ b/core/applib/src/main/java/org/apache/isis/applib/internal/memento/package-info.java @@ -16,28 +16,13 @@ * specific language governing permissions and limitations * under the License. */ - -package org.apache.isis.applib.internal.base; - /** - * <h1>- internal use only -</h1> - * <p> - * Casting Utilities - * </p> - * <p> - * <b>WARNING</b>: Do <b>NOT</b> use any of the classes provided by this package! <br/> + * <h1>Internal API</h1> + * Internal classes, contributing to the internal proprietary API. * These may be changed or removed without notice! + * <p> + * <b>WARNING</b>: + * Do NOT use any of the classes provided by this package! * </p> - * - * @since 2.0.0 */ -public final class _Casts { - - private _Casts(){} - - @SuppressWarnings("unchecked") - public static <T> T uncheckedCast(Object obj) { - return (T) obj; - } - -} +package org.apache.isis.applib.internal.memento; \ No newline at end of file diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingService.java b/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingService.java index 9f02e84..6754532 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingService.java +++ b/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingService.java @@ -16,14 +16,27 @@ */ package org.apache.isis.applib.services.urlencoding; +import java.nio.charset.StandardCharsets; + import org.apache.isis.applib.annotation.Programmatic; +import org.apache.isis.applib.internal.base._Strings; public interface UrlEncodingService { @Programmatic - public String encode(final String str); + public String encode(final byte[] bytes); + + @Programmatic + public byte[] decode(String str); @Programmatic - public String decode(String str); + public default String encodeString(final String str) { + return encode(_Strings.toBytes(str, StandardCharsets.UTF_8)); + } + @Programmatic + public default String decodeToString(final String str) { + return _Strings.ofBytes(decode(str), StandardCharsets.UTF_8); + } + } diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceUsingBaseEncoding.java b/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceUsingBaseEncoding.java index 82b8086..1090d0a 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceUsingBaseEncoding.java +++ b/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceUsingBaseEncoding.java @@ -20,7 +20,6 @@ import java.nio.charset.StandardCharsets; import org.apache.isis.applib.annotation.DomainService; import org.apache.isis.applib.annotation.NatureOfService; -import org.apache.isis.applib.annotation.Programmatic; import org.apache.isis.applib.internal.base._Bytes; import org.apache.isis.applib.internal.base._Strings; @@ -30,14 +29,14 @@ import org.apache.isis.applib.internal.base._Strings; ) public class UrlEncodingServiceUsingBaseEncoding implements UrlEncodingService { - @Override @Programmatic - public String encode(final String str) { - return _Strings.convert(str, _Bytes.asUrlBase64, StandardCharsets.UTF_8); + @Override + public String encode(final byte[] bytes) { + return _Strings.ofBytes(_Bytes.asUrlBase64.apply(bytes), StandardCharsets.UTF_8); } - @Override @Programmatic - public String decode(final String str) { - return _Strings.convert(str, _Bytes.ofUrlBase64, StandardCharsets.UTF_8); + @Override + public byte[] decode(final String str) { + return _Bytes.ofUrlBase64.apply(_Strings.toBytes(str, StandardCharsets.UTF_8)); } } diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceWithCompressionAbstract.java b/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceWithCompressionAbstract.java index ebbc455..cebc1fd 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceWithCompressionAbstract.java +++ b/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceWithCompressionAbstract.java @@ -14,13 +14,28 @@ import org.apache.isis.applib.internal.base._Strings; public abstract class UrlEncodingServiceWithCompressionAbstract implements UrlEncodingService { @Override - public String encode(final String str) { - return _Strings.convert(str, _Bytes.asCompressedUrlBase64, StandardCharsets.UTF_8); + public String encode(final byte[] bytes) { + return _Strings.ofBytes(_Bytes.asCompressedUrlBase64.apply(bytes), StandardCharsets.UTF_8); } @Override - public String decode(final String str) { - return _Strings.convert(str, _Bytes.ofCompressedUrlBase64, StandardCharsets.UTF_8); + public byte[] decode(final String str) { + return _Bytes.ofCompressedUrlBase64.apply(_Strings.toBytes(str, StandardCharsets.UTF_8)); } + // -- OVERRIDING DEFAULTS FOR STRING UNARY OPERATORS + +// @Override +// public String encodeString(final String str) { +// return _Strings.convert(str, _Bytes.asCompressedUrlBase64, StandardCharsets.UTF_8); +// } +// +// @Override +// public String decodeToString(final String str) { +// return _Strings.convert(str, _Bytes.ofCompressedUrlBase64, StandardCharsets.UTF_8); +// } + + // -- + + } diff --git a/core/applib/src/test/java/org/apache/isis/applib/internal/memento/MementosTest.java b/core/applib/src/test/java/org/apache/isis/applib/internal/memento/MementosTest.java new file mode 100644 index 0000000..a919c2c --- /dev/null +++ b/core/applib/src/test/java/org/apache/isis/applib/internal/memento/MementosTest.java @@ -0,0 +1,117 @@ +/* + * 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.applib.internal.memento; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.junit.Assert.assertThat; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.Date; + +import org.apache.isis.applib.internal.memento._Mementos.Memento; +import org.apache.isis.applib.services.bookmark.Bookmark; +import org.apache.isis.applib.services.urlencoding.UrlEncodingService; +import org.apache.isis.applib.services.urlencoding.UrlEncodingServiceUsingBaseEncoding; +import org.apache.isis.applib.services.urlencoding.UrlEncodingServiceWithCompressionAbstract; +import org.joda.time.LocalDate; +import org.junit.Before; +import org.junit.Test; + +public class MementosTest { + + static enum DOW { + Mon,Tue,Wed,Thu,Fri + } + + UrlEncodingServiceWithCompressionAbstract serviceWithCompression; + UrlEncodingServiceUsingBaseEncoding serviceBaseEncoding; + + @Before + public void setUp() throws Exception { + serviceWithCompression = new UrlEncodingServiceWithCompressionAbstract(){}; + serviceBaseEncoding = new UrlEncodingServiceUsingBaseEncoding(){}; + } + + @Test + public void roundtrip() { + roundtrip(serviceBaseEncoding); + } + + @Test + public void roundtrip_with_compression() { + roundtrip(serviceWithCompression); + } + + private void roundtrip(UrlEncodingService codec) { + final Memento memento = _Mementos.create(codec); + + memento.set("someString", "a string"); + memento.set("someStringWithDoubleSpaces", "a string"); + memento.set("someByte", (byte)123); + memento.set("someShort", (short)12345); + memento.set("someInt", 123456789); + memento.set("someLong", 1234567890123456789L); + memento.set("someFloat", 123.45F); + memento.set("someDouble", 1234567890.123456); + memento.set("someBooleanTrue", Boolean.TRUE); + memento.set("someBooleanFalse", Boolean.FALSE); + memento.set("someBigInteger", new BigInteger("123456789012345678901234567890")); + memento.set("someBigDecimal", new BigDecimal("123456789012345678901234567890.123456789")); + memento.set("someLocalDate", new LocalDate(2013,9,3)); + memento.set("someJavaUtilDate", new Date(300_000_000)); + + memento.set("someBookmark", new Bookmark("CUS", "12345")); + memento.set("someNullValue", null); + + memento.set("someEnum", DOW.Wed); + + final String str = memento.asString(); + + final Memento memento2 = _Mementos.parse(codec, str); + + assertThat(memento2.get("someString", String.class), is("a string")); + assertThat(memento2.get("someStringWithDoubleSpaces", String.class), is("a string")); + assertThat(memento2.get("someByte", Byte.class), is((byte)123)); + assertThat(memento2.get("someShort", Short.class), is((short)12345)); + assertThat(memento2.get("someInt", Integer.class), is(123456789)); + assertThat(memento2.get("someLong", Long.class), is(1234567890123456789L)); + assertThat(memento2.get("someFloat", Float.class), is(123.45F)); + assertThat(memento2.get("someDouble", Double.class), is(1234567890.123456)); + assertThat(memento2.get("someBooleanTrue", Boolean.class), is(Boolean.TRUE)); + assertThat(memento2.get("someBooleanFalse", Boolean.class), is(Boolean.FALSE)); + assertThat(memento2.get("someBigInteger", BigInteger.class), is(new BigInteger("123456789012345678901234567890"))); + assertThat(memento2.get("someBigDecimal", BigDecimal.class), is(new BigDecimal("123456789012345678901234567890.123456789"))); + assertThat(memento2.get("someLocalDate", LocalDate.class), is(new LocalDate(2013,9,3))); + assertThat(memento2.get("someJavaUtilDate", Date.class), is(new Date(300_000_000))); + assertThat(memento2.get("someBookmark", Bookmark.class), is(new Bookmark("CUS", "12345"))); + + // a nullValue can be grabbed as any type, will always succeed + assertThat(memento2.get("someNullValue", Integer.class), is(nullValue())); + assertThat(memento2.get("someNullValue", Bookmark.class), is(nullValue())); + assertThat(memento2.get("someNullValue", LocalDate.class), is(nullValue())); + + assertThat(memento2.get("someEnum", DOW.class), is(DOW.Wed)); + + } + + +} diff --git a/core/applib/src/test/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceTest.java b/core/applib/src/test/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceTest.java new file mode 100644 index 0000000..8ad36cc --- /dev/null +++ b/core/applib/src/test/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceTest.java @@ -0,0 +1,48 @@ +package org.apache.isis.applib.services.urlencoding; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.Matchers.greaterThan; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class UrlEncodingServiceTest { + + UrlEncodingServiceWithCompressionAbstract serviceWithCompression; + UrlEncodingServiceUsingBaseEncoding serviceBaseEncoding; + + @Before + public void setUp() throws Exception { + serviceWithCompression = new UrlEncodingServiceWithCompressionAbstract(){}; + serviceBaseEncoding = new UrlEncodingServiceUsingBaseEncoding(){}; + } + + @Test + public void roundtrip() throws Exception { + roundtrip(serviceBaseEncoding, false); + } + + @Test + public void roundtrip_with_compression() throws Exception { + roundtrip(serviceWithCompression, true); + } + + private void roundtrip(UrlEncodingService service, boolean testIsCompressing) throws Exception { + + final String original = "0-theme-entityPageContainer-entity-rows-2-rowContents-1-col-tabGroups-1-panel-tabPanel-rows-1-rowContents-1-col-fieldSets-1-memberGroup-properties-1-property-scalarTypeContainer-scalarIfRegular-associatedActionLinksBelow-additionalLinkList-additionalLinkItem-0-additionalLink"; + + final String encoded = service.encodeString(original); + final String decoded = service.decodeToString(encoded); + + Assert.assertThat(decoded, is(equalTo(original))); + + if(testIsCompressing) { + Assert.assertThat(original.length(), is(greaterThan(encoded.length()))); + } + + } + + +} \ No newline at end of file diff --git a/core/applib/src/test/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceWithCompression_Abstract_Test.java b/core/applib/src/test/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceWithCompression_Abstract_Test.java deleted file mode 100644 index 3ff0ee6..0000000 --- a/core/applib/src/test/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceWithCompression_Abstract_Test.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.apache.isis.applib.services.urlencoding; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.Matchers.greaterThan; - -public class UrlEncodingServiceWithCompression_Abstract_Test { - - UrlEncodingServiceWithCompressionAbstract service; - - @Before - public void setUp() throws Exception { - service = new UrlEncodingServiceWithCompressionAbstract(){}; -// service.base64Encoder = new UrlEncodingServiceUsingBaseEncoding(); - } - - @Test - public void roundtrip() throws Exception { - - final String original = "0-theme-entityPageContainer-entity-rows-2-rowContents-1-col-tabGroups-1-panel-tabPanel-rows-1-rowContents-1-col-fieldSets-1-memberGroup-properties-1-property-scalarTypeContainer-scalarIfRegular-associatedActionLinksBelow-additionalLinkList-additionalLinkItem-0-additionalLink"; - - final String encoded = service.encode(original); - final String decoded = service.decode(encoded); - - Assert.assertThat(decoded, is(equalTo(original))); - - Assert.assertThat(original.length(), is(greaterThan(encoded.length()))); - } - - -} \ No newline at end of file diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java index 1d3a4d2..70a4de4 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java @@ -23,9 +23,8 @@ import java.util.List; import java.util.Set; import java.util.UUID; -import org.apache.isis.applib.services.bookmark.Bookmark; -import org.apache.isis.applib.services.bookmark.BookmarkService; -import org.apache.isis.applib.services.memento.MementoService; +import org.apache.isis.applib.internal.memento._Mementos; +import org.apache.isis.applib.services.urlencoding.UrlEncodingService; import org.apache.isis.core.metamodel.adapter.ObjectAdapter; import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager; import org.apache.isis.core.metamodel.adapter.oid.Oid; @@ -37,9 +36,9 @@ import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySe import org.apache.isis.core.metamodel.services.ServicesInjector; import org.apache.isis.core.metamodel.spec.ObjectSpecId; import org.apache.isis.core.metamodel.spec.ObjectSpecification; -import org.apache.isis.core.metamodel.specloader.SpecificationLoader; import org.apache.isis.core.metamodel.spec.feature.Contributed; import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation; +import org.apache.isis.core.metamodel.specloader.SpecificationLoader; public abstract class RecreatableObjectFacetDeclarativeInitializingAbstract extends RecreatableObjectFacetAbstract { @@ -63,10 +62,15 @@ public abstract class RecreatableObjectFacetDeclarativeInitializingAbstract exte final Object viewModelPojo, final String mementoStr) { - final MementoService mementoService = servicesInjector.lookupService(MementoService.class); - final BookmarkService bookmarkService = servicesInjector.lookupService(BookmarkService.class); - - final MementoService.Memento memento = mementoService.parse(mementoStr); + final UrlEncodingService codec = servicesInjector.lookupService(UrlEncodingService.class); + + final _Mementos.Memento memento = _Mementos.parse(codec, mementoStr); + +//TODO Legacy of ... +// final MementoService mementoService = servicesInjector.lookupService(MementoService.class); +// final BookmarkService bookmarkService = servicesInjector.lookupService(BookmarkService.class); +// +// final MementoService.Memento memento = mementoService.parse(mementoStr); final Set<String> mementoKeys = memento.keySet(); @@ -84,15 +88,21 @@ public abstract class RecreatableObjectFacetDeclarativeInitializingAbstract exte final String propertyId = property.getId(); Object propertyValue = null; - + if(mementoKeys.contains(propertyId)) { - final Class<?> propertyType = property.getSpecification().getCorrespondingClass(); - propertyValue = memento.get(propertyId, propertyType); - } else if(mementoKeys.contains(propertyId + ".bookmark")) { - final Bookmark propertyValueBookmark = memento.get(propertyId + ".bookmark", Bookmark.class); - propertyValue = bookmarkService.lookup(propertyValueBookmark); + final Class<?> propertyType = property.getSpecification().getCorrespondingClass(); + propertyValue = memento.get(propertyId, propertyType); } +//TODO Legacy of ... +// if(mementoKeys.contains(propertyId)) { +// final Class<?> propertyType = property.getSpecification().getCorrespondingClass(); +// propertyValue = memento.get(propertyId, propertyType); +// } else if(mementoKeys.contains(propertyId + ".bookmark")) { +// final Bookmark propertyValueBookmark = memento.get(propertyId + ".bookmark", Bookmark.class); +// propertyValue = bookmarkService.lookup(propertyValueBookmark); +// } + if(propertyValue != null) { property.set(viewModelAdapter, adapterManager.adapterFor(propertyValue), InteractionInitiatedBy.FRAMEWORK); } @@ -101,11 +111,16 @@ public abstract class RecreatableObjectFacetDeclarativeInitializingAbstract exte @Override public String memento(Object viewModelPojo) { + + final UrlEncodingService codec = servicesInjector.lookupService(UrlEncodingService.class); + + final _Mementos.Memento memento = _Mementos.create(codec); - final MementoService mementoService = servicesInjector.lookupService(MementoService.class); - final BookmarkService bookmarkService = servicesInjector.lookupService(BookmarkService.class); - - final MementoService.Memento memento = mementoService.create(); +//TODO Legacy of ... +// final MementoService mementoService = servicesInjector.lookupService(MementoService.class); +// final BookmarkService bookmarkService = servicesInjector.lookupService(BookmarkService.class); +// +// final MementoService.Memento memento = mementoService.create(); // this is horrible, but there's a catch-22 here... // we need an adapter in order to query the state of the object via the metamodel, on the other hand @@ -115,9 +130,15 @@ public abstract class RecreatableObjectFacetDeclarativeInitializingAbstract exte boolean createdTemporaryAdapter = false; ObjectAdapter viewModelAdapter = adapterManager.getAdapterFor(viewModelPojo); if(viewModelAdapter == null) { - final ObjectSpecification objectSpecification = specificationLoader.loadSpecification(viewModelPojo.getClass()); + + final ObjectSpecification objectSpecification = + specificationLoader.loadSpecification(viewModelPojo.getClass()); + final ObjectSpecId objectSpecId = objectSpecification.getSpecId(); - viewModelAdapter = adapterManager.mapRecreatedPojo(RootOid.create(objectSpecId, UUID.randomUUID().toString()), viewModelPojo); + viewModelAdapter = + adapterManager.mapRecreatedPojo( + RootOid.create(objectSpecId, UUID.randomUUID().toString()), + viewModelPojo); createdTemporaryAdapter = true; } @@ -144,12 +165,16 @@ public abstract class RecreatableObjectFacetDeclarativeInitializingAbstract exte InteractionInitiatedBy.FRAMEWORK); if(propertyValueAdapter != null) { final Object propertyValue = propertyValueAdapter.getObject(); - if(mementoService.canSet(propertyValue)) { - memento.set(property.getId(), propertyValue); - } else { - final Bookmark propertyValueBookmark = bookmarkService.bookmarkFor(propertyValue); - memento.set(property.getId() + ".bookmark", propertyValueBookmark); - } + + memento.set(property.getId(), propertyValue); + +//TODO Legacy of ... +// if(mementoService.canSet(propertyValue)) { +// memento.set(property.getId(), propertyValue); +// } else { +// final Bookmark propertyValueBookmark = bookmarkService.bookmarkFor(propertyValue); +// memento.set(property.getId() + ".bookmark", propertyValueBookmark); +// } } } return memento.asString(); diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForXmlRootElementAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForXmlRootElementAnnotation.java index 3fa1dca..27c958e 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForXmlRootElementAnnotation.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForXmlRootElementAnnotation.java @@ -39,7 +39,7 @@ public class RecreatableObjectFacetForXmlRootElementAnnotation extends Recreatab @Override protected Object doInstantiate(final Class<?> viewModelClass, final String mementoStr) { - final String xmlStr = getUrlEncodingService().decode(mementoStr); + final String xmlStr = getUrlEncodingService().decodeToString(mementoStr); final Object viewModelPojo = getJaxbService().fromXml(viewModelClass, xmlStr); return viewModelPojo; @@ -49,7 +49,7 @@ public class RecreatableObjectFacetForXmlRootElementAnnotation extends Recreatab public String memento(final Object pojo) { final String xml = getJaxbService().toXml(pojo); - final String encoded = getUrlEncodingService().encode(xml); + final String encoded = getUrlEncodingService().encodeString(xml); return encoded; } diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/command/CommandDtoServiceInternal.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/command/CommandDtoServiceInternal.java index c1bb4a3..dbe77c2 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/command/CommandDtoServiceInternal.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/command/CommandDtoServiceInternal.java @@ -16,7 +16,6 @@ */ package org.apache.isis.core.metamodel.services.command; -import java.lang.reflect.Method; import java.util.List; import org.apache.isis.applib.annotation.Programmatic; diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/memento/Dom4jUtil.java b/core/runtime-legacy/src/main/java/org/apache/isis/core/runtime/services/memento/Dom4jUtil.java similarity index 100% rename from core/runtime/src/main/java/org/apache/isis/core/runtime/services/memento/Dom4jUtil.java rename to core/runtime-legacy/src/main/java/org/apache/isis/core/runtime/services/memento/Dom4jUtil.java diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/memento/MementoServiceDefault.java b/core/runtime-legacy/src/main/java/org/apache/isis/core/runtime/services/memento/MementoServiceDefault.java similarity index 97% rename from core/runtime/src/main/java/org/apache/isis/core/runtime/services/memento/MementoServiceDefault.java rename to core/runtime-legacy/src/main/java/org/apache/isis/core/runtime/services/memento/MementoServiceDefault.java index c3d56b2..52ecbc5 100644 --- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/memento/MementoServiceDefault.java +++ b/core/runtime-legacy/src/main/java/org/apache/isis/core/runtime/services/memento/MementoServiceDefault.java @@ -19,19 +19,18 @@ package org.apache.isis.core.runtime.services.memento; import java.util.List; import java.util.Set; -import com.google.common.base.Function; -import com.google.common.collect.Iterables; -import com.google.common.collect.Sets; - -import org.dom4j.Document; -import org.dom4j.DocumentHelper; -import org.dom4j.Element; - import org.apache.isis.applib.annotation.DomainService; import org.apache.isis.applib.annotation.NatureOfService; import org.apache.isis.applib.annotation.Programmatic; import org.apache.isis.applib.services.memento.MementoService; import org.apache.isis.applib.services.urlencoding.UrlEncodingService; +import org.dom4j.Document; +import org.dom4j.DocumentHelper; +import org.dom4j.Element; + +import com.google.common.base.Function; +import com.google.common.collect.Iterables; +import com.google.common.collect.Sets; /** * This service provides a mechanism by which a serializable memento of arbitrary state can be created. Most @@ -41,11 +40,14 @@ import org.apache.isis.applib.services.urlencoding.UrlEncodingService; * This implementation has no UI and there are no other implementations of the service API, and so it annotated * with {@link org.apache.isis.applib.annotation.DomainService}. Because this class is implemented in core, this means * that it is automatically registered and available for use; no further configuration is required. + * + * @deprecated - because {@link MementoService} is deprecated. */ @DomainService( nature = NatureOfService.DOMAIN, menuOrder = "" + Integer.MAX_VALUE ) +@Deprecated public class MementoServiceDefault implements MementoService { static class MementoDefault implements Memento { @@ -89,7 +91,7 @@ public class MementoServiceDefault implements MementoService { } protected String encode(final String xmlStr) { - return noEncoding ? xmlStr : urlEncodingService.encode(xmlStr); + return noEncoding ? xmlStr : urlEncodingService.encodeString(xmlStr); } private static final Function<Element, String> ELEMENT_NAME = new Function<Element, String>(){ @@ -149,7 +151,7 @@ public class MementoServiceDefault implements MementoService { if (noEncoding) { xmlStr = str; } else { - xmlStr = urlEncodingService.decode(str); + xmlStr = urlEncodingService.decodeToString(str); } final Document doc = Dom4jUtil.parse(xmlStr); return new MementoDefault(doc, noEncoding, urlEncodingService); diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/services/memento/MementoServiceDefaultTest.java b/core/runtime-legacy/src/test/java/org/apache/isis/core/runtime/services/memento/MementoServiceDefaultTest.java similarity index 100% rename from core/runtime/src/test/java/org/apache/isis/core/runtime/services/memento/MementoServiceDefaultTest.java rename to core/runtime-legacy/src/test/java/org/apache/isis/core/runtime/services/memento/MementoServiceDefaultTest.java diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/command/CommandDtoServiceInternalDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/command/CommandDtoServiceInternalDefault.java index dc4ec41..8fb9c88 100644 --- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/command/CommandDtoServiceInternalDefault.java +++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/command/CommandDtoServiceInternalDefault.java @@ -16,15 +16,12 @@ */ package org.apache.isis.core.runtime.services.command; -import java.lang.reflect.Method; import java.util.List; import java.util.Map; import java.util.UUID; import javax.annotation.PostConstruct; -import com.google.common.collect.Lists; - import org.apache.isis.applib.annotation.DomainService; import org.apache.isis.applib.annotation.NatureOfService; import org.apache.isis.applib.annotation.Programmatic; @@ -40,11 +37,8 @@ import org.apache.isis.core.metamodel.services.command.CommandDtoServiceInternal import org.apache.isis.core.metamodel.spec.ObjectSpecification; import org.apache.isis.core.metamodel.spec.feature.ObjectAction; import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter; -import org.apache.isis.core.metamodel.spec.feature.ObjectMember; import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation; import org.apache.isis.core.metamodel.specloader.SpecificationLoader; -import org.apache.isis.core.metamodel.specloader.specimpl.dflt.ObjectSpecificationDefault; -import org.apache.isis.core.runtime.services.memento.MementoServiceDefault; import org.apache.isis.core.runtime.system.session.IsisSessionFactory; import org.apache.isis.schema.cmd.v1.ActionDto; import org.apache.isis.schema.cmd.v1.CommandDto; @@ -63,15 +57,15 @@ import org.apache.isis.schema.utils.CommonDtoUtils; ) public class CommandDtoServiceInternalDefault implements CommandDtoServiceInternal { - private final MementoServiceDefault mementoService; - - public CommandDtoServiceInternalDefault() { - this(new MementoServiceDefault()); - } - - CommandDtoServiceInternalDefault(MementoServiceDefault mementoService) { - this.mementoService = mementoService.withNoEncoding(); - } +// private final MementoServiceDefault mementoService; +// +// public CommandDtoServiceInternalDefault() { +// this(new MementoServiceDefault()); +// } +// +// CommandDtoServiceInternalDefault(MementoServiceDefault mementoService) { +// this.mementoService = mementoService.withNoEncoding(); +// } // ////////////////////////////////////// @@ -84,23 +78,23 @@ public class CommandDtoServiceInternalDefault implements CommandDtoServiceIntern // ////////////////////////////////////// - private ObjectSpecificationDefault getJavaSpecificationOfOwningClass(final Method method) { - return getJavaSpecification(method.getDeclaringClass()); - } +// private ObjectSpecificationDefault getJavaSpecificationOfOwningClass(final Method method) { +// return getJavaSpecification(method.getDeclaringClass()); +// } - private ObjectSpecificationDefault getJavaSpecification(final Class<?> cls) { - final ObjectSpecification objectSpec = getSpecification(cls); - if (!(objectSpec instanceof ObjectSpecificationDefault)) { - throw new UnsupportedOperationException( - "Only Java is supported " - + "(specification is '" + objectSpec.getClass().getCanonicalName() + "')"); - } - return (ObjectSpecificationDefault) objectSpec; - } +// private ObjectSpecificationDefault getJavaSpecification(final Class<?> cls) { +// final ObjectSpecification objectSpec = getSpecification(cls); +// if (!(objectSpec instanceof ObjectSpecificationDefault)) { +// throw new UnsupportedOperationException( +// "Only Java is supported " +// + "(specification is '" + objectSpec.getClass().getCanonicalName() + "')"); +// } +// return (ObjectSpecificationDefault) objectSpec; +// } - private ObjectSpecification getSpecification(final Class<?> type) { - return specificationLoader.loadSpecification(type); - } +// private ObjectSpecification getSpecification(final Class<?> type) { +// return specificationLoader.loadSpecification(type); +// } // ////////////////////////////////////// -- To stop receiving notification emails like this one, please contact ahu...@apache.org.