You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2021/05/19 17:35:59 UTC

[isis] branch master updated: ISIS-2620: Demo: prepare the String Value for a JPA variant

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


The following commit(s) were added to refs/heads/master by this push:
     new 3219006  ISIS-2620: Demo: prepare the String Value for a JPA variant
3219006 is described below

commit 32190069496aa84637cb8aed2f534caa906d3de6
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed May 19 19:34:20 2021 +0200

    ISIS-2620: Demo: prepare the String Value for a JPA variant
    
    that is, make value holder repository generic
    
    also unify seeding for JPA/JDO
---
 .../demoapp/dom/_infra/values/ValueHolder.java     |  7 +++
 .../dom/_infra/values/ValueHolderRepository.java   | 71 ++++++++++++++++++++++
 .../types/javalang/strings/JavaLangStrings.java    | 12 ++--
 .../javalang/strings/jdo/JavaLangStringJdo.java    |  8 +--
 .../strings/jdo/JavaLangStringJdoEntities.java     | 23 +++----
 .../strings/jdo/JavaLangStringJdoSeedService.java  | 57 -----------------
 .../JavaLangStringEntity.java}                     | 41 +++++--------
 .../strings/persistence/JavaLangStringSeeding.java | 33 ++++++++++
 8 files changed, 144 insertions(+), 108 deletions(-)

diff --git a/examples/demo/domain/src/main/java/demoapp/dom/_infra/values/ValueHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/_infra/values/ValueHolder.java
new file mode 100644
index 0000000..f9937a9
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/_infra/values/ValueHolder.java
@@ -0,0 +1,7 @@
+package demoapp.dom._infra.values;
+
+public interface ValueHolder<T> {
+
+    T getReadOnlyProperty();
+
+}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/_infra/values/ValueHolderRepository.java b/examples/demo/domain/src/main/java/demoapp/dom/_infra/values/ValueHolderRepository.java
new file mode 100644
index 0000000..5aeab8c
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/_infra/values/ValueHolderRepository.java
@@ -0,0 +1,71 @@
+/*
+ *  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 demoapp.dom._infra.values;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.function.Consumer;
+
+import javax.inject.Inject;
+
+import org.apache.isis.applib.services.repository.RepositoryService;
+
+import lombok.AccessLevel;
+import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
+
+import demoapp.dom.types.Samples;
+
+@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
+public abstract class ValueHolderRepository<T, E extends ValueHolder<T>> {
+
+    @Inject protected RepositoryService repositoryService;
+
+    private final Class<E> entityType;
+
+    // -- REPOSITORY BASICS
+
+    public Optional<E> find(final T readOnlyProperty) {
+        return repositoryService
+                .firstMatch(
+                        entityType,
+                        x -> Objects.equals(x.getReadOnlyProperty(), readOnlyProperty));
+    }
+
+    public List<E> all() {
+        return repositoryService.allInstances(entityType);
+    }
+
+    protected abstract E newDetachedEntity(T value);
+
+    // -- SEEDING SUPPORT
+
+    @Inject protected Samples<T> samples;
+
+    public void seedSamples(
+            final @NonNull Consumer<E> onSamplePersisted) {
+
+        samples.stream()
+                .map(this::newDetachedEntity)
+                .peek(repositoryService::persist)
+                .forEach(onSamplePersisted);
+    }
+
+}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/JavaLangStrings.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/JavaLangStrings.java
index dab5bad..1ae479a 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/JavaLangStrings.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/JavaLangStrings.java
@@ -36,19 +36,17 @@ import org.apache.isis.applib.annotation.Nature;
 import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
-import lombok.extern.log4j.Log4j2;
-
 import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
+import demoapp.dom._infra.values.ValueHolderRepository;
 import demoapp.dom.types.Samples;
-import demoapp.dom.types.javalang.strings.jdo.JavaLangStringJdo;
-import demoapp.dom.types.javalang.strings.jdo.JavaLangStringJdoEntities;
+import demoapp.dom.types.javalang.strings.persistence.JavaLangStringEntity;
 import demoapp.dom.types.javalang.strings.vm.JavaLangStringVm;
 
 @XmlRootElement(name = "Demo")
 @XmlType
 @XmlAccessorType(XmlAccessType.FIELD)
 @DomainObject(nature=Nature.VIEW_MODEL, objectType = "demo.JavaLangStrings", editing=Editing.ENABLED)
-@Log4j2
+//@Log4j2
 public class JavaLangStrings implements HasAsciiDocDescription {
 
     public String title() {
@@ -65,13 +63,13 @@ public class JavaLangStrings implements HasAsciiDocDescription {
     }
 
     @Collection
-    public List<JavaLangStringJdo> getEntities() {
+    public List<? extends JavaLangStringEntity> getEntities() {
         return entities.all();
     }
 
     @Inject
     @XmlTransient
-    JavaLangStringJdoEntities entities;
+    ValueHolderRepository<String, ? extends JavaLangStringEntity> entities;
 
     @Inject
     @XmlTransient
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jdo/JavaLangStringJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jdo/JavaLangStringJdo.java
index 916c254..8824cb4 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jdo/JavaLangStringJdo.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jdo/JavaLangStringJdo.java
@@ -31,19 +31,19 @@ import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Title;
 
-import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
-import demoapp.dom.types.javalang.strings.holder.JavaLangStringHolder2;
 import lombok.Getter;
 import lombok.Setter;
 
+import demoapp.dom.types.javalang.strings.persistence.JavaLangStringEntity;
+
 //tag::class[]
 @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo")
 @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id")
 @DomainObject(
-        objectType = "demo.JavaLangStringJdo"
+        objectType = "demo.JavaLangStringEntity"
 )
 public class JavaLangStringJdo                                                  // <.>
-        implements HasAsciiDocDescription, JavaLangStringHolder2 {
+        extends JavaLangStringEntity {
 
 //end::class[]
     public JavaLangStringJdo(String initialValue) {
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jdo/JavaLangStringJdoEntities.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jdo/JavaLangStringJdoEntities.java
index 3961268..3fcf616 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jdo/JavaLangStringJdoEntities.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jdo/JavaLangStringJdoEntities.java
@@ -18,28 +18,21 @@
  */
 package demoapp.dom.types.javalang.strings.jdo;
 
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-
-import javax.inject.Inject;
-
 import org.springframework.stereotype.Service;
 
-import org.apache.isis.applib.services.repository.RepositoryService;
+import demoapp.dom._infra.values.ValueHolderRepository;
 
 @Service
-public class JavaLangStringJdoEntities {
+public class JavaLangStringJdoEntities
+extends ValueHolderRepository<String, JavaLangStringJdo> {
 
-    public Optional<JavaLangStringJdo> find(final String readOnlyProperty) {
-        return repositoryService.firstMatch(JavaLangStringJdo.class, x -> Objects.equals(x.getReadOnlyProperty(), readOnlyProperty));
+    protected JavaLangStringJdoEntities() {
+        super(JavaLangStringJdo.class);
     }
 
-    public List<JavaLangStringJdo> all() {
-        return repositoryService.allInstances(JavaLangStringJdo.class);
+    @Override
+    protected JavaLangStringJdo newDetachedEntity(String value) {
+        return new JavaLangStringJdo(value);
     }
 
-    @Inject
-    RepositoryService repositoryService;
-
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jdo/JavaLangStringJdoSeedService.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jdo/JavaLangStringJdoSeedService.java
deleted file mode 100644
index 3adbec6..0000000
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jdo/JavaLangStringJdoSeedService.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  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 demoapp.dom.types.javalang.strings.jdo;
-
-import javax.inject.Inject;
-
-import org.springframework.stereotype.Service;
-
-import org.apache.isis.applib.services.repository.RepositoryService;
-import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript;
-
-import demoapp.dom._infra.seed.SeedServiceAbstract;
-import demoapp.dom.types.Samples;
-
-@Service
-public class JavaLangStringJdoSeedService extends SeedServiceAbstract {
-
-    public JavaLangStringJdoSeedService() {
-        super(JavaLangStringJdoEntityFixture::new);
-    }
-
-    static class JavaLangStringJdoEntityFixture extends FixtureScript {
-
-        @Override
-        protected void execute(ExecutionContext executionContext) {
-            samples.stream()
-                    .map(JavaLangStringJdo::new)
-                    .forEach(domainObject -> {
-                        repositoryService.persist(domainObject);
-                        executionContext.addResult(this, domainObject);
-                    });
-
-        }
-
-        @Inject
-        RepositoryService repositoryService;
-
-        @Inject
-        Samples<String> samples;
-    }
-}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jdo/JavaLangStringJdoEntities.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/persistence/JavaLangStringEntity.java
similarity index 53%
copy from examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jdo/JavaLangStringJdoEntities.java
copy to examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/persistence/JavaLangStringEntity.java
index 3961268..eda96b7 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jdo/JavaLangStringJdoEntities.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/persistence/JavaLangStringEntity.java
@@ -16,30 +16,21 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom.types.javalang.strings.jdo;
-
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-
-import javax.inject.Inject;
-
-import org.springframework.stereotype.Service;
-
-import org.apache.isis.applib.services.repository.RepositoryService;
-
-@Service
-public class JavaLangStringJdoEntities {
-
-    public Optional<JavaLangStringJdo> find(final String readOnlyProperty) {
-        return repositoryService.firstMatch(JavaLangStringJdo.class, x -> Objects.equals(x.getReadOnlyProperty(), readOnlyProperty));
-    }
-
-    public List<JavaLangStringJdo> all() {
-        return repositoryService.allInstances(JavaLangStringJdo.class);
-    }
-
-    @Inject
-    RepositoryService repositoryService;
+package demoapp.dom.types.javalang.strings.persistence;
+
+import org.apache.isis.applib.annotation.DomainObject;
+
+import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
+import demoapp.dom._infra.values.ValueHolder;
+import demoapp.dom.types.javalang.strings.holder.JavaLangStringHolder2;
+
+@DomainObject(
+        objectType = "demo.JavaLangStringEntity" // shared permissions with concrete sub class
+)
+public abstract class JavaLangStringEntity
+implements
+    HasAsciiDocDescription,
+    JavaLangStringHolder2,
+    ValueHolder<String> {
 
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/persistence/JavaLangStringSeeding.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/persistence/JavaLangStringSeeding.java
new file mode 100644
index 0000000..6cca90e
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/persistence/JavaLangStringSeeding.java
@@ -0,0 +1,33 @@
+package demoapp.dom.types.javalang.strings.persistence;
+
+import javax.inject.Inject;
+
+import org.springframework.stereotype.Service;
+
+import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript;
+
+import demoapp.dom._infra.seed.SeedServiceAbstract;
+import demoapp.dom._infra.values.ValueHolderRepository;
+
+@Service
+public class JavaLangStringSeeding
+extends SeedServiceAbstract {
+
+    protected JavaLangStringSeeding() {
+        super(JavaLangStringEntityFixture::new);
+    }
+
+    static class JavaLangStringEntityFixture extends FixtureScript {
+
+        @Override
+        protected void execute(final ExecutionContext executionContext) {
+            entities.seedSamples(domainObject->
+                executionContext.addResult(this, domainObject));
+        }
+
+        @Inject
+        ValueHolderRepository<String, ? extends JavaLangStringEntity> entities;
+
+    }
+
+}