You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2014/05/09 18:40:33 UTC
[2/3] git commit: ISIS-776: initial implementation
ISIS-776: initial implementation
Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/98758f7c
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/98758f7c
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/98758f7c
Branch: refs/heads/master
Commit: 98758f7c65479a56c685a3b494ca20257ec82d5e
Parents: 31acb0f
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Fri May 9 15:26:07 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Fri May 9 15:29:49 2014 +0100
----------------------------------------------------------------------
.../components/widgets/cssmenu/CssMenuPanel.css | 2 +-
.../viewer/wicket/ui/pages/PageAbstract.css | 2 +-
.../isis/applib/DomainObjectContainer.java | 6 +
.../fixturescripts/CompositeFixtureScript.java | 90 +++++++++
.../applib/fixturescripts/FixtureResult.java | 68 +++++++
.../fixturescripts/FixtureResultList.java | 72 +++++++
.../applib/fixturescripts/FixtureScript.java | 196 +++++++++++++++++++
.../applib/fixturescripts/FixtureScripts.java | 167 ++++++++++++++++
.../fixturescripts/SimpleFixtureScript.java | 56 ++++++
.../metamodel/adapter/DomainObjectServices.java | 2 +
.../noruntime/RuntimeContextNoRuntime.java | 5 +
.../container/DomainObjectContainerDefault.java | 11 ++
.../internal/RuntimeContextFromSession.java | 5 +
.../prototyping/ToDoItemResetForUser.java | 64 ++++++
.../prototyping/ToDoItemsCreateForUser.java | 96 +++++++++
.../prototyping/ToDoItemsDeleteForUser.java | 51 +++++
.../prototyping/ToDoItemsFixturesService.java | 14 +-
17 files changed, 902 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/isis/blob/98758f7c/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuPanel.css
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuPanel.css b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuPanel.css
index 74df67a..89991d0 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuPanel.css
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuPanel.css
@@ -318,7 +318,7 @@
}
.entityActions a.prototype span {
- color: #CCCC00;
+ color: #DBDB4D;
font-style: italic;
}
.entityActions a.prototype {
http://git-wip-us.apache.org/repos/asf/isis/blob/98758f7c/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.css
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.css b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.css
index dc580e7..a6557f6 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.css
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.css
@@ -286,7 +286,7 @@ colors
}
#applicationActions .cssMenuPanel .menuh a.prototype span {
- color: #CCCC00;
+ color: #DBDB4D;
font-style: italic;
}
http://git-wip-us.apache.org/repos/asf/isis/blob/98758f7c/core/applib/src/main/java/org/apache/isis/applib/DomainObjectContainer.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/DomainObjectContainer.java b/core/applib/src/main/java/org/apache/isis/applib/DomainObjectContainer.java
index edabe32..170e86d 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/DomainObjectContainer.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/DomainObjectContainer.java
@@ -210,6 +210,12 @@ public interface DomainObjectContainer {
<T> T newInstance(final Class<T> ofType, final Object object);
// ////////////////////////////////////////////////////////////////
+ // injectServicesInto
+ // ////////////////////////////////////////////////////////////////
+
+ <T> T injectServicesInto(final T domainObject);
+
+ // ////////////////////////////////////////////////////////////////
// isValid, validate
// ////////////////////////////////////////////////////////////////
http://git-wip-us.apache.org/repos/asf/isis/blob/98758f7c/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/CompositeFixtureScript.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/CompositeFixtureScript.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/CompositeFixtureScript.java
new file mode 100644
index 0000000..aec034a
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/CompositeFixtureScript.java
@@ -0,0 +1,90 @@
+/*
+ * 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.fixturescripts;
+
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
+import org.apache.isis.applib.annotation.Named;
+
+@Named("Composite Script")
+public abstract class CompositeFixtureScript extends FixtureScript {
+
+ private static Discoverability defaultDiscoverability() {
+ return Discoverability.DISCOVERABLE;
+ }
+
+ public CompositeFixtureScript(final String localName) {
+ this(localName, localName, defaultDiscoverability());
+ }
+ public CompositeFixtureScript(String friendlyName, final String localName) {
+ this(friendlyName, localName, defaultDiscoverability());
+ }
+ public CompositeFixtureScript(final FixtureScript parent, String friendlyName, final String localName) {
+ this(parent, friendlyName, localName, defaultDiscoverability());
+ }
+
+ public CompositeFixtureScript(final String localName, Discoverability discoverability) {
+ super(localName, localName, discoverability);
+ }
+ public CompositeFixtureScript(String friendlyName, final String localName, Discoverability discoverability) {
+ super(friendlyName, localName, discoverability);
+ }
+ public CompositeFixtureScript(final FixtureScript parent, String friendlyName, final String localName, Discoverability discoverability) {
+ super(parent, friendlyName, localName, discoverability);
+ }
+
+ // //////////////////////////////////////
+
+ private final List<FixtureScript> children = Lists.newArrayList();
+ /**
+ * Adds a child {@link FixtureScript fixture script} (simply using its default name).
+ */
+ protected final void add(FixtureScript fixtureScript) {
+ add(null, fixtureScript);
+ }
+ /**
+ * Adds a child {@link FixtureScript fixture script}, overriding its default name with one more
+ * meaningful in the context of this fixture.
+ */
+ protected final void add(String localNameOverride, FixtureScript fixtureScript) {
+ fixtureScript.setParentPath(pathWith(""));
+ if(localNameOverride != null) {
+ fixtureScript.setLocalName(localNameOverride);
+ }
+ getContainer().injectServicesInto(fixtureScript);
+ children.add(fixtureScript);
+ }
+
+ // //////////////////////////////////////
+
+ /**
+ * Mandatory hook method.
+ */
+ protected abstract void addChildren();
+
+ protected void doRun(FixtureResultList fixtureResults) {
+ addChildren();
+ for (final FixtureScript child : children) {
+ child.doRun(fixtureResults);
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/98758f7c/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureResult.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureResult.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureResult.java
new file mode 100644
index 0000000..095327f
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureResult.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.applib.fixturescripts;
+
+import org.apache.isis.applib.AbstractViewModel;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.Title;
+
+public class FixtureResult extends AbstractViewModel {
+
+ @Override
+ public String viewModelMemento() {
+ return fixtureScripts.mementoFor(this);
+ }
+
+ @Override
+ public void viewModelInit(String memento) {
+ fixtureScripts.initOf(memento, this);
+ }
+
+ // //////////////////////////////////////
+
+ private String key;
+
+ @Title(sequence="1", append=": ")
+ @MemberOrder(sequence="1")
+ public String getKey() {
+ return key;
+ }
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ // //////////////////////////////////////
+
+ private Object object;
+
+ @Title(sequence="2")
+ @MemberOrder(sequence="1")
+ public Object getObject() {
+ return object;
+ }
+ public void setObject(Object object) {
+ this.object = object;
+ }
+
+ // //////////////////////////////////////
+
+ @javax.inject.Inject
+ FixtureScripts fixtureScripts;
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/98758f7c/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureResultList.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureResultList.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureResultList.java
new file mode 100644
index 0000000..7527675
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureResultList.java
@@ -0,0 +1,72 @@
+/*
+ * 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.fixturescripts;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+/**
+ * Collecting parameter.
+ */
+public class FixtureResultList {
+
+ private final FixtureScripts fixtureScripts;
+
+ FixtureResultList(FixtureScripts fixtureScripts) {
+ this.fixtureScripts = fixtureScripts;
+ }
+
+ // //////////////////////////////////////
+
+
+ private final List<FixtureResult> list = Lists.newArrayList();
+
+ public <T> T add(final FixtureScript script, final T object) {
+ return add(script, nextItemFor(script), object);
+ }
+
+ public <T> T add(final FixtureScript script, final String key, final T object) {
+ final FixtureResult fr = fixtureScripts.newFixtureResult(script, key, object);
+ list.add(fr);
+ return object;
+ }
+
+ public List<FixtureResult> getResults() {
+ return list;
+ }
+
+ // //////////////////////////////////////
+
+ private final Map<FixtureScript, AtomicInteger> itemNumberByScript = Maps.newHashMap();
+
+ String nextItemFor(final FixtureScript script) {
+ AtomicInteger atomicInteger = itemNumberByScript.get(script);
+ if(atomicInteger == null) {
+ atomicInteger = new AtomicInteger();
+ itemNumberByScript.put(script, atomicInteger);
+ }
+ return "item-"+atomicInteger.incrementAndGet();
+ }
+
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/98758f7c/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java
new file mode 100644
index 0000000..53262e0
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java
@@ -0,0 +1,196 @@
+/*
+ * 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.fixturescripts;
+
+import java.util.List;
+
+import org.apache.isis.applib.AbstractViewModel;
+import org.apache.isis.applib.annotation.Hidden;
+import org.apache.isis.applib.annotation.Named;
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.annotation.Title;
+
+@Named("Script")
+public abstract class FixtureScript extends AbstractViewModel {
+
+ protected static final String PATH_SEPARATOR = "/";
+
+ // //////////////////////////////////////
+
+ /**
+ * Whether this fixture script should be automatically discoverable or not.
+ */
+ public enum Discoverability {
+ /**
+ * the fixture script is discoverable and so will be listed by the
+ * {@link FixtureScripts#runFixtureScript(FixtureScript) run fixture script} action
+ */
+ DISCOVERABLE,
+ /**
+ * The fixture script is non-discoverable and so will <i>not</i> be listed by the
+ * {@link FixtureScripts#runFixtureScript(FixtureScript) run fixture script} action
+ */
+ NON_DISCOVERABLE
+ }
+
+ // //////////////////////////////////////
+
+ public FixtureScript(
+ final String friendlyName,
+ final String localName,
+ final Discoverability discoverability) {
+ this(null, friendlyName, localName, discoverability);
+ }
+ public FixtureScript(
+ final FixtureScript parent,
+ final String friendlyName,
+ final String localName,
+ final Discoverability discoverability) {
+ this.localName = ensureNotNull("localName", localName);
+ this.friendlyName = ensureNotNull("friendlyName", friendlyName);
+ this.parentPath = parentPathOf(parent);
+ this.discoverability = discoverability;
+ }
+
+ private static String parentPathOf(FixtureScript parent) {
+ return parent != null? parent.getParentPath() + PATH_SEPARATOR : "";
+ }
+
+ // for subclasses
+ protected static String ensureNotNull(String name, String val) {
+ if(val == null) {
+ throw new IllegalArgumentException(name + " cannot be null");
+ }
+ return val;
+ }
+
+ // //////////////////////////////////////
+
+ @Override
+ public String viewModelMemento() {
+ return fixtureScripts.mementoFor(this);
+ }
+
+ @Override
+ public void viewModelInit(String mementoStr) {
+ fixtureScripts.initOf(mementoStr, this);
+ }
+
+ // //////////////////////////////////////
+
+ @Hidden
+ public String getQualifiedName() {
+ return getParentPath() + getLocalName();
+ }
+
+ // //////////////////////////////////////
+
+ private String friendlyName;
+
+ @Title
+ @Hidden
+ public String getFriendlyName() {
+ return friendlyName;
+ }
+ public void setFriendlyName(String friendlyName) {
+ this.friendlyName = friendlyName;
+ }
+
+ // //////////////////////////////////////
+
+ private String localName;
+ /**
+ * Will always be populated, initially by the default name, but can be
+ * {@link #setLocalName(String) overridden} if {@link CompositeFixtureScript#add(String, FixtureScript) reused} within a {@link CompositeFixtureScript composite fixture script}.
+ */
+ @Hidden
+ public String getLocalName() {
+ return localName;
+ }
+ public void setLocalName(String localName) {
+ this.localName = localName;
+ }
+
+ // //////////////////////////////////////
+
+ private String parentPath;
+
+ /**
+ * Path of the parent of this script (if any), with trailing period.
+ */
+ @Hidden
+ public String getParentPath() {
+ return parentPath;
+ }
+ public void setParentPath(String parentPath) {
+ this.parentPath = parentPath;
+ }
+
+ // //////////////////////////////////////
+
+ private Discoverability discoverability;
+
+ /**
+ * Whether this fixture script is {@link Discoverability discoverable} (in other words
+ * whether it will be listed to be run in the {@link FixtureScripts#runFixtureScript(FixtureScript) run fixture script} action.
+ *
+ * <p>
+ * By default {@link CompositeFixtureScript}s are {@link Discoverability#DISCOVERABLE discoverable}, while
+ * {@link SimpleFixtureScript}s are {@link Discoverability#NON_DISCOVERABLE not}. This can be overridden in the
+ * constructor, however.
+ */
+ @Hidden
+ public boolean isDiscoverable() {
+ return discoverability == Discoverability.DISCOVERABLE;
+ }
+ public void setDiscoverability(Discoverability discoverability) {
+ this.discoverability = discoverability;
+ }
+
+ // //////////////////////////////////////
+
+ @Programmatic
+ public final List<FixtureResult> run() {
+ FixtureResultList fixtureResults = new FixtureResultList(fixtureScripts);
+ doRun(fixtureResults);
+ return fixtureResults.getResults();
+ }
+
+ @Programmatic
+ protected abstract void doRun(FixtureResultList fixtureResults);
+
+ // //////////////////////////////////////
+
+ @Programmatic
+ String pathWith(String subkey) {
+ return (getQualifiedName() != null? getQualifiedName() + PATH_SEPARATOR: "") + subkey;
+ }
+
+ // //////////////////////////////////////
+
+
+
+ // //////////////////////////////////////
+
+ @javax.inject.Inject
+ protected FixtureScripts fixtureScripts;
+
+
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/98758f7c/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..d8f6b0a
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
@@ -0,0 +1,167 @@
+/*
+ * 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.fixturescripts;
+
+import java.lang.reflect.Constructor;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Set;
+
+import javax.annotation.PostConstruct;
+
+import com.google.common.collect.Lists;
+
+import org.reflections.Reflections;
+import org.reflections.scanners.SubTypesScanner;
+import org.reflections.util.ClasspathHelper;
+
+import org.apache.isis.applib.AbstractService;
+import org.apache.isis.applib.DomainObjectContainer;
+import org.apache.isis.applib.annotation.Prototype;
+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.services.memento.MementoService.Memento;
+import org.apache.isis.applib.util.ObjectContracts;
+
+public abstract class FixtureScripts extends AbstractService {
+
+ private final String packagePrefix;
+
+ /**
+ * @param packagePrefix - to search for fixture script implementations, eg "com.mycompany"
+ */
+ public FixtureScripts(String packagePrefix) {
+ this.packagePrefix = packagePrefix;
+ }
+
+ // //////////////////////////////////////
+
+ private final List<FixtureScript> fixtureScriptList = Lists.newArrayList();
+
+ @PostConstruct
+ public void init() {
+ findAndInstantiateFixtureScripts(fixtureScriptList);
+ }
+
+ private void findAndInstantiateFixtureScripts(List<FixtureScript> fixtureScriptList) {
+ final Set<Class<? extends FixtureScript>> classes = findFixtureScriptClasses();
+ for (final Class<? extends FixtureScript> fixtureScriptCls : classes) {
+ final String packageName = fixtureScriptCls.getPackage().getName();
+ if(!packageName.startsWith(packagePrefix)) {
+ continue;
+ }
+ final FixtureScript fs = newFixtureScript(fixtureScriptCls);
+ if(fs != null) {
+ fixtureScriptList.add(fs);
+ }
+ }
+ Collections.sort(fixtureScriptList, new Comparator<FixtureScript>() {
+ @Override
+ public int compare(FixtureScript o1, FixtureScript o2) {
+ return ObjectContracts.compare(o1, o2, "friendlyName,qualifiedName");
+ }
+ });
+ }
+
+ private static Set<Class<? extends FixtureScript>> findFixtureScriptClasses() {
+ final Reflections reflections = new Reflections(
+ ClasspathHelper.forClassLoader(Thread.currentThread().getContextClassLoader()),
+ ClasspathHelper.forClass(Object.class),
+ new SubTypesScanner(false));
+ return reflections.getSubTypesOf(FixtureScript.class);
+ }
+
+ private FixtureScript newFixtureScript(Class<? extends FixtureScript> fixtureScriptCls) {
+ try {
+ final Constructor<? extends FixtureScript> constructor = fixtureScriptCls.getConstructor();
+ final FixtureScript template = constructor.newInstance();
+ if(!template.isDiscoverable()) {
+ return null;
+ }
+ return container.newViewModelInstance(fixtureScriptCls, mementoFor(template));
+ } catch(Exception ex) {
+ // ignore if does not have a no-arg constructor or cannot be instantiated
+ return null;
+ }
+ }
+
+ // //////////////////////////////////////
+
+ @Prototype
+ public List<FixtureResult> runFixtureScript(final FixtureScript fixtureScript) {
+ return fixtureScript.run();
+ }
+ public List<FixtureScript> choices0RunFixtureScript() {
+ return fixtureScriptList;
+ }
+ public String disableRunFixtureScript(final FixtureScript fixtureScript) {
+ return fixtureScriptList.isEmpty()? "No fixture scripts found under package '" + packagePrefix + "'": null;
+ }
+
+ // //////////////////////////////////////
+
+ String mementoFor(FixtureScript fs) {
+ return mementoService.create()
+ .set("path", fs.getParentPath())
+ .asString();
+ }
+ void initOf(String mementoStr, FixtureScript fs) {
+ Memento memento = mementoService.parse(mementoStr);
+ fs.setParentPath(memento.get("path", String.class));
+ }
+
+ // //////////////////////////////////////
+
+ String mementoFor(FixtureResult fr) {
+ return mementoService.create()
+ .set("key", fr.getKey())
+ .set("object", bookmarkService.bookmarkFor(fr.getObject()))
+ .asString();
+ }
+ void initOf(String mementoStr, FixtureResult fr) {
+ Memento memento = mementoService.parse(mementoStr);
+ fr.setKey(memento.get("key", String.class));
+ fr.setObject(bookmarkService.lookup(memento.get("object", Bookmark.class)));
+ }
+
+ FixtureResult newFixtureResult(FixtureScript script, String subkey, Object object) {
+ String mementoFor = mementoFor(script, subkey, object);
+ return container.newViewModelInstance(FixtureResult.class, mementoFor);
+ }
+
+ private String mementoFor(FixtureScript script, String subkey, Object object) {
+ final FixtureResult template = new FixtureResult();
+ template.setKey(script.pathWith(subkey));
+ template.setObject(object);
+ return mementoFor(template);
+ }
+
+ // //////////////////////////////////////
+
+ @javax.inject.Inject
+ private MementoService mementoService;
+
+ @javax.inject.Inject
+ private BookmarkService bookmarkService;
+
+ @javax.inject.Inject
+ private DomainObjectContainer container;
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/98758f7c/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/SimpleFixtureScript.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/SimpleFixtureScript.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/SimpleFixtureScript.java
new file mode 100644
index 0000000..a9f4079
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/SimpleFixtureScript.java
@@ -0,0 +1,56 @@
+/*
+ * 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.fixturescripts;
+
+import org.apache.isis.applib.annotation.Named;
+import org.apache.isis.applib.annotation.Programmatic;
+
+@Named("Simple Script")
+public abstract class SimpleFixtureScript extends FixtureScript {
+
+ private static Discoverability defaultDiscoverability() {
+ return Discoverability.NON_DISCOVERABLE;
+ }
+
+ public SimpleFixtureScript(String localName) {
+ this(localName, defaultDiscoverability());
+ }
+ public SimpleFixtureScript(String friendlyName, String localName) {
+ this(friendlyName, localName, defaultDiscoverability());
+ }
+ public SimpleFixtureScript(FixtureScript parent, String friendlyName, String localName) {
+ this(parent, friendlyName, localName, defaultDiscoverability());
+ }
+
+ public SimpleFixtureScript(String localName, Discoverability discoverability) {
+ this(localName, localName, discoverability);
+ }
+ public SimpleFixtureScript(String friendlyName, String localName, Discoverability discoverability) {
+ super(friendlyName, localName, discoverability);
+ }
+ public SimpleFixtureScript(FixtureScript parent, String friendlyName, String localName, Discoverability discoverability) {
+ super(parent, friendlyName, localName, discoverability);
+ }
+
+ // //////////////////////////////////////
+
+ @Programmatic
+ protected abstract void doRun(FixtureResultList fixtureResults);
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/98758f7c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/DomainObjectServices.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/DomainObjectServices.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/DomainObjectServices.java
index a365b05..f559c4c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/DomainObjectServices.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/DomainObjectServices.java
@@ -56,6 +56,8 @@ public interface DomainObjectServices extends Injectable {
*/
ObjectAdapter createAggregatedInstance(ObjectSpecification spec, ObjectAdapter parent);
+ void injectServicesInto(Object domainObject);
+
// ///////////////////////////////////////////
// retrieve
// ///////////////////////////////////////////
http://git-wip-us.apache.org/repos/asf/isis/blob/98758f7c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/noruntime/RuntimeContextNoRuntime.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/noruntime/RuntimeContextNoRuntime.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/noruntime/RuntimeContextNoRuntime.java
index 2f1da7c..f9dfa76 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/noruntime/RuntimeContextNoRuntime.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/noruntime/RuntimeContextNoRuntime.java
@@ -257,6 +257,11 @@ public class RuntimeContextNoRuntime extends RuntimeContextAbstract {
throw new UnsupportedOperationException("Not supported by this implementation of RuntimeContext");
}
+ @Override
+ public void injectServicesInto(Object domainObject) {
+ throw new UnsupportedOperationException("Not supported by this implementation of RuntimeContext");
+ }
+
};
localizationProvider = new LocalizationProviderAbstract() {
http://git-wip-us.apache.org/repos/asf/isis/blob/98758f7c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/container/DomainObjectContainerDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/container/DomainObjectContainerDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/container/DomainObjectContainerDefault.java
index 8204559..59973a0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/container/DomainObjectContainerDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/container/DomainObjectContainerDefault.java
@@ -201,6 +201,17 @@ public class DomainObjectContainerDefault implements DomainObjectContainer, Que
remove(object);
}
+
+ // //////////////////////////////////////////////////////////////////
+ // injectServicesInto
+ // //////////////////////////////////////////////////////////////////
+
+ @Override
+ public <T> T injectServicesInto(T domainObject) {
+ getDomainObjectServices().injectServicesInto(domainObject);
+ return domainObject;
+ }
+
// //////////////////////////////////////////////////////////////////
// resolve, objectChanged
// //////////////////////////////////////////////////////////////////
http://git-wip-us.apache.org/repos/asf/isis/blob/98758f7c/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/internal/RuntimeContextFromSession.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/internal/RuntimeContextFromSession.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/internal/RuntimeContextFromSession.java
index 02fa73e..09437cc 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/internal/RuntimeContextFromSession.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/internal/RuntimeContextFromSession.java
@@ -264,6 +264,11 @@ public class RuntimeContextFromSession extends RuntimeContextAbstract {
return RuntimeContextFromSession.this.getPropertyNames();
}
+ @Override
+ public void injectServicesInto(Object domainObject) {
+ getPersistenceSession().getServicesInjector().injectServicesInto(domainObject);
+ }
+
};
this.querySubmitter = new QuerySubmitterAbstract() {
http://git-wip-us.apache.org/repos/asf/isis/blob/98758f7c/example/application/quickstart_wicket_restful_jdo/webapp/src/main/java/webapp/prototyping/ToDoItemResetForUser.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/webapp/src/main/java/webapp/prototyping/ToDoItemResetForUser.java b/example/application/quickstart_wicket_restful_jdo/webapp/src/main/java/webapp/prototyping/ToDoItemResetForUser.java
new file mode 100644
index 0000000..2586c17
--- /dev/null
+++ b/example/application/quickstart_wicket_restful_jdo/webapp/src/main/java/webapp/prototyping/ToDoItemResetForUser.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 webapp.prototyping;
+
+import org.apache.isis.applib.fixturescripts.CompositeFixtureScript;
+
+public abstract class ToDoItemResetForUser extends CompositeFixtureScript {
+
+ // //////////////////////////////////////
+ // Subclasses
+ // //////////////////////////////////////
+
+ public static final class ToDoItemResetForDick extends ToDoItemResetForUser {
+ public ToDoItemResetForDick() {
+ super("dick");
+ }
+ }
+
+ public static final class ToDoItemResetForJoe extends ToDoItemResetForUser {
+ public ToDoItemResetForJoe() {
+ super("joe");
+ }
+ }
+
+ public static final class ToDoItemResetForSven extends ToDoItemResetForUser {
+ public ToDoItemResetForSven() {
+ super("sven");
+ }
+ }
+
+ // //////////////////////////////////////
+ // Constructor
+ // //////////////////////////////////////
+
+ private String user;
+
+ public ToDoItemResetForUser(String user) {
+ super("Reset ToDoItems for '" + user + "'", user);
+ this.user = user;
+ }
+
+ @Override
+ protected void addChildren() {
+ add("delete", new ToDoItemsDeleteForUser(user));
+ add("create", new ToDoItemsCreateForUser(user));
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/98758f7c/example/application/quickstart_wicket_restful_jdo/webapp/src/main/java/webapp/prototyping/ToDoItemsCreateForUser.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/webapp/src/main/java/webapp/prototyping/ToDoItemsCreateForUser.java b/example/application/quickstart_wicket_restful_jdo/webapp/src/main/java/webapp/prototyping/ToDoItemsCreateForUser.java
new file mode 100644
index 0000000..b70e5b0
--- /dev/null
+++ b/example/application/quickstart_wicket_restful_jdo/webapp/src/main/java/webapp/prototyping/ToDoItemsCreateForUser.java
@@ -0,0 +1,96 @@
+/*
+ * 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 webapp.prototyping;
+
+import java.math.BigDecimal;
+
+import dom.todo.ToDoItem;
+import dom.todo.ToDoItem.Category;
+import dom.todo.ToDoItem.Subcategory;
+import dom.todo.ToDoItems;
+
+import org.joda.time.LocalDate;
+
+import org.apache.isis.applib.clock.Clock;
+import org.apache.isis.applib.fixturescripts.FixtureResultList;
+import org.apache.isis.applib.fixturescripts.SimpleFixtureScript;
+
+public class ToDoItemsCreateForUser extends SimpleFixtureScript {
+
+ // //////////////////////////////////////
+ // Constructor
+ // //////////////////////////////////////
+
+ private final String user;
+
+ public ToDoItemsCreateForUser(String user) {
+ super("Create ToDoItems for '" + user + "'", user);
+ this.user = user;
+ }
+
+ @Override
+ protected void doRun(final FixtureResultList resultList) {
+ installFor(user, resultList);
+ getContainer().flush();
+ }
+
+ private void installFor(final String user, final FixtureResultList resultList) {
+
+ createToDoItemForUser("Buy milk", Category.Domestic, Subcategory.Shopping, user, daysFromToday(0), new BigDecimal("0.75"), resultList);
+ createToDoItemForUser("Buy bread", Category.Domestic, Subcategory.Shopping, user, daysFromToday(0), new BigDecimal("1.75"), resultList);
+ createToDoItemForUser("Buy stamps", Category.Domestic, Subcategory.Shopping, user, daysFromToday(0), new BigDecimal("10.00"), resultList).setComplete(true);
+ createToDoItemForUser("Pick up laundry", Category.Domestic, Subcategory.Chores, user, daysFromToday(6), new BigDecimal("7.50"), resultList);
+ createToDoItemForUser("Mow lawn", Category.Domestic, Subcategory.Garden, user, daysFromToday(6), null, resultList);
+ createToDoItemForUser("Vacuum house", Category.Domestic, Subcategory.Housework, user, daysFromToday(3), null, resultList);
+ createToDoItemForUser("Sharpen knives", Category.Domestic, Subcategory.Chores, user, daysFromToday(14), null, resultList);
+
+ createToDoItemForUser("Write to penpal", Category.Other, Subcategory.Other, user, null, null, resultList);
+
+ createToDoItemForUser("Write blog post", Category.Professional, Subcategory.Marketing, user, daysFromToday(7), null, resultList).setComplete(true);
+ createToDoItemForUser("Organize brown bag", Category.Professional, Subcategory.Consulting, user, daysFromToday(14), null, resultList);
+ createToDoItemForUser("Submit conference session", Category.Professional, Subcategory.Education, user, daysFromToday(21), null, resultList);
+ createToDoItemForUser("Stage Isis release", Category.Professional, Subcategory.OpenSource, user, null, null, resultList);
+
+ getContainer().flush();
+ }
+
+ // //////////////////////////////////////
+
+ private ToDoItem createToDoItemForUser(
+ final String description,
+ final Category category, Subcategory subcategory,
+ final String user,
+ final LocalDate dueBy, final BigDecimal cost, FixtureResultList resultList) {
+ ToDoItem newToDo = toDoItems.newToDo(description, category, subcategory, user, dueBy, cost);
+ return resultList.add(this, newToDo);
+ }
+
+ private static LocalDate daysFromToday(final int i) {
+ final LocalDate date = new LocalDate(Clock.getTimeAsDateTime());
+ return date.plusDays(i);
+ }
+
+
+ // //////////////////////////////////////
+ // Injected services
+ // //////////////////////////////////////
+
+ @javax.inject.Inject
+ private ToDoItems toDoItems;
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/98758f7c/example/application/quickstart_wicket_restful_jdo/webapp/src/main/java/webapp/prototyping/ToDoItemsDeleteForUser.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/webapp/src/main/java/webapp/prototyping/ToDoItemsDeleteForUser.java b/example/application/quickstart_wicket_restful_jdo/webapp/src/main/java/webapp/prototyping/ToDoItemsDeleteForUser.java
new file mode 100644
index 0000000..81f0b65
--- /dev/null
+++ b/example/application/quickstart_wicket_restful_jdo/webapp/src/main/java/webapp/prototyping/ToDoItemsDeleteForUser.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 webapp.prototyping;
+
+import org.apache.isis.applib.fixturescripts.FixtureResultList;
+import org.apache.isis.applib.fixturescripts.SimpleFixtureScript;
+import org.apache.isis.objectstore.jdo.applib.service.support.IsisJdoSupport;
+
+public class ToDoItemsDeleteForUser extends SimpleFixtureScript {
+
+ // //////////////////////////////////////
+ // Constructor
+ // //////////////////////////////////////
+
+ private final String user;
+
+ public ToDoItemsDeleteForUser(String user) {
+ super("Delete ToDoItems for '" + user + "'", user);
+ this.user = user;
+ }
+
+ @Override
+ protected void doRun(final FixtureResultList resultList) {
+ isisJdoSupport.executeUpdate("delete from \"ToDoItem\" where \"ownedBy\" = '" + user + "'");
+ getContainer().flush();
+ }
+
+ // //////////////////////////////////////
+ // Injected services
+ // //////////////////////////////////////
+
+ @javax.inject.Inject
+ private IsisJdoSupport isisJdoSupport;
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/98758f7c/example/application/quickstart_wicket_restful_jdo/webapp/src/main/java/webapp/prototyping/ToDoItemsFixturesService.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/webapp/src/main/java/webapp/prototyping/ToDoItemsFixturesService.java b/example/application/quickstart_wicket_restful_jdo/webapp/src/main/java/webapp/prototyping/ToDoItemsFixturesService.java
index 1417ff4..2eebaab 100644
--- a/example/application/quickstart_wicket_restful_jdo/webapp/src/main/java/webapp/prototyping/ToDoItemsFixturesService.java
+++ b/example/application/quickstart_wicket_restful_jdo/webapp/src/main/java/webapp/prototyping/ToDoItemsFixturesService.java
@@ -26,17 +26,23 @@ import dom.todo.ToDoItem;
import dom.todo.ToDoItems;
import fixture.todo.ToDoItemsFixture;
-import org.apache.isis.applib.AbstractService;
+import org.apache.isis.applib.annotation.Hidden;
import org.apache.isis.applib.annotation.Named;
import org.apache.isis.applib.annotation.Prototype;
+import org.apache.isis.applib.fixturescripts.FixtureScripts;
import org.apache.isis.core.runtime.fixtures.FixturesInstallerDelegate;
/**
* Enables fixtures to be installed from the application.
*/
@Named("Prototyping") // has the effect of defining a "Prototyping" menu item
-public class ToDoItemsFixturesService extends AbstractService {
+public class ToDoItemsFixturesService extends FixtureScripts {
+ public ToDoItemsFixturesService() {
+ super("webapp.prototyping");
+ }
+
+ @Hidden
@Prototype
public String installFixtures() {
installFixturesFor(null); // ie current user
@@ -45,6 +51,7 @@ public class ToDoItemsFixturesService extends AbstractService {
// //////////////////////////////////////
+ @Hidden
@Prototype
public String installFixturesForUser(@Named("User") String user) {
installFixturesFor(user);
@@ -59,6 +66,7 @@ public class ToDoItemsFixturesService extends AbstractService {
// //////////////////////////////////////
+ @Hidden
@Prototype
public ToDoItem installFixturesAndReturnFirst() {
installFixtures();
@@ -75,7 +83,7 @@ public class ToDoItemsFixturesService extends AbstractService {
}
// //////////////////////////////////////
-
+
private ToDoItems toDoItems;
public void injectToDoItems(ToDoItems toDoItems) {
this.toDoItems = toDoItems;