diff options
author | Stephan Merkli | 2021-05-17 13:36:40 +0000 |
---|---|---|
committer | Stephan Merkli | 2021-05-25 16:01:07 +0000 |
commit | 75820c61fed96b3e1a91b8e463bc9957a9044ba0 (patch) | |
tree | 7de647386aee1d45270ac96856957cb43925d77a | |
parent | 934da1456836c89815a9d3f72d02d1f8e7c435c2 (diff) | |
download | org.eclipse.scout.rt-75820c61fed96b3e1a91b8e463bc9957a9044ba0.tar.gz org.eclipse.scout.rt-75820c61fed96b3e1a91b8e463bc9957a9044ba0.tar.xz org.eclipse.scout.rt-75820c61fed96b3e1a91b8e463bc9957a9044ba0.zip |
Service tunnel: add support for IDoEntity
Add support for non-serializable IDoEntity in service tunnel, e.g. to be
used as return type of a interface with @TunnelToServer.
Change-Id: I4dc9f941fbfa6300815fa4323abe118f4c2bb531
Reviewed-on: https://git.eclipse.org/r/c/scout/org.eclipse.scout.rt/+/180691
Tested-by: Scout Bot <scout-bot@eclipse.org>
Reviewed-by: Andi Bur <andi.bur@gmail.com>
2 files changed, 49 insertions, 0 deletions
diff --git a/org.eclipse.scout.rt.shared/src/main/java/org/eclipse/scout/rt/shared/servicetunnel/DoEntityWrapper.java b/org.eclipse.scout.rt.shared/src/main/java/org/eclipse/scout/rt/shared/servicetunnel/DoEntityWrapper.java new file mode 100644 index 0000000000..378469eeb1 --- /dev/null +++ b/org.eclipse.scout.rt.shared/src/main/java/org/eclipse/scout/rt/shared/servicetunnel/DoEntityWrapper.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2010-2021 BSI Business Systems Integration AG. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * BSI Business Systems Integration AG - initial API and implementation + */ +package org.eclipse.scout.rt.shared.servicetunnel; + +import java.io.Serializable; + +import org.eclipse.scout.rt.dataobject.IDataObjectMapper; +import org.eclipse.scout.rt.dataobject.IDoEntity; +import org.eclipse.scout.rt.platform.util.LazyValue; + +/** + * Wrapper for {@link IDoEntity} used by service tunnel. + * <p> + * Do not use this internal class. + * + * @see ServiceTunnelObjectReplacer + */ +// Package-private because shouldn't be used except by ServiceTunnelObjectReplacer. +class DoEntityWrapper implements Serializable { + private static final long serialVersionUID = 1L; + + private static final LazyValue<IDataObjectMapper> MAPPER = new LazyValue<>(IDataObjectMapper.class); + + // Not using transient IDoEntity along with writeObject/readObject like DoEntityHolder, because the string is read exactly once after deserialization. + private final String m_doEntityJson; + + DoEntityWrapper(IDoEntity obj) { + m_doEntityJson = MAPPER.get().writeValue(obj); + } + + public IDoEntity getDoEntity() { + return MAPPER.get().readValue(m_doEntityJson, IDoEntity.class); + } +} diff --git a/org.eclipse.scout.rt.shared/src/main/java/org/eclipse/scout/rt/shared/servicetunnel/ServiceTunnelObjectReplacer.java b/org.eclipse.scout.rt.shared/src/main/java/org/eclipse/scout/rt/shared/servicetunnel/ServiceTunnelObjectReplacer.java index 79fb09da0b..53baa3bf28 100644 --- a/org.eclipse.scout.rt.shared/src/main/java/org/eclipse/scout/rt/shared/servicetunnel/ServiceTunnelObjectReplacer.java +++ b/org.eclipse.scout.rt.shared/src/main/java/org/eclipse/scout/rt/shared/servicetunnel/ServiceTunnelObjectReplacer.java @@ -14,6 +14,7 @@ import java.security.Permission; import java.security.Permissions; import java.util.Date; +import org.eclipse.scout.rt.dataobject.IDoEntity; import org.eclipse.scout.rt.platform.serialization.IObjectReplacer; import org.eclipse.scout.rt.platform.util.date.UTCDate; @@ -38,6 +39,9 @@ public class ServiceTunnelObjectReplacer implements IObjectReplacer { if (obj != null && obj.getClass() == Permissions.class) { return new LenientPermissionsWrapper((Permissions) obj); } + if (obj instanceof IDoEntity) { + return new DoEntityWrapper((IDoEntity) obj); + } return obj; } @@ -49,6 +53,9 @@ public class ServiceTunnelObjectReplacer implements IObjectReplacer { if (obj instanceof LenientPermissionsWrapper) { return ((LenientPermissionsWrapper) obj).getPermissions(); } + if (obj instanceof DoEntityWrapper) { + return ((DoEntityWrapper) obj).getDoEntity(); + } return obj; } } |