From 5337ecdc35643fbfae1a3091aed0f753ab800839 Mon Sep 17 00:00:00 2001 From: Ilkka Seppala Date: Mon, 13 Jul 2015 15:19:16 +0300 Subject: [PATCH] #91 Added skeleton for naked-objects example using Apache Isis SimpleApp archetype --- .gitignore | 2 +- naked-objects/.gitattributes | 51 +++ naked-objects/.gitignore | 42 ++ naked-objects/dom/log4j.properties | 41 ++ naked-objects/dom/pom.xml | 194 +++++++++ .../src/main/java/META-INF/persistence.xml | 26 ++ .../dom/app/homepage/HomePageService.java | 51 +++ .../dom/app/homepage/HomePageViewModel.java | 50 +++ .../homepage/HomePageViewModel.layout.json | 43 ++ .../dom/app/homepage/HomePageViewModel.png | Bin 0 -> 456 bytes .../dom/modules/simple/SimpleObject.java | 149 +++++++ .../modules/simple/SimpleObject.layout.json | 56 +++ .../dom/modules/simple/SimpleObject.png | Bin 0 -> 653 bytes .../dom/modules/simple/SimpleObjects.java | 107 +++++ .../dom/modules/simple/SimpleObjectTest.java | 49 +++ .../dom/modules/simple/SimpleObjectsTest.java | 104 +++++ naked-objects/fixture/pom.xml | 38 ++ .../fixture/DomainAppFixturesService.java | 76 ++++ .../modules/simple/SimpleObjectCreate.java | 71 ++++ .../modules/simple/SimpleObjectsTearDown.java | 36 ++ .../scenarios/RecreateSimpleObjects.java | 92 ++++ naked-objects/integtests/.gitignore | 1 + naked-objects/integtests/logging.properties | 111 +++++ naked-objects/integtests/pom.xml | 128 ++++++ .../bootstrap/SimpleAppSystemInitializer.java | 54 +++ .../specglue/BootstrappingGlue.java | 41 ++ .../specglue/CatalogOfFixturesGlue.java | 31 ++ .../modules/simple/SimpleObjectGlue.java | 50 +++ .../domainapp/integtests/specs/RunSpecs.java | 39 ++ .../SimpleObjectSpec_listAllAndCreate.feature | 26 ++ .../integtests/tests/SimpleAppIntegTest.java | 39 ++ .../modules/simple/SimpleObjectIntegTest.java | 121 ++++++ .../simple/SimpleObjectsIntegTest.java | 143 +++++++ naked-objects/pom.xml | 400 ++++++++++++++++++ .../webapp/ide/eclipse/launch/.gitignore | 8 + .../webapp/ide/intellij/launch/README.txt | 2 + .../intellij/launch/SimpleApp_PROTOTYPE.xml | 28 ++ .../launch/SimpleApp__enhance_only_.xml | 22 + naked-objects/webapp/lib/.gitignore | 5 + naked-objects/webapp/pom.xml | 352 +++++++++++++++ .../domainapp/webapp/SimpleApplication.java | 153 +++++++ .../src/main/jettyconsole/isis-banner.pdn | Bin 0 -> 69658 bytes .../src/main/jettyconsole/isis-banner.png | Bin 0 -> 30776 bytes .../resources/domainapp/webapp/welcome.html | 35 ++ .../src/main/webapp/WEB-INF/isis.properties | 300 +++++++++++++ .../main/webapp/WEB-INF/logging.properties | 187 ++++++++ .../main/webapp/WEB-INF/persistor.properties | 128 ++++++ .../WEB-INF/persistor_datanucleus.properties | 93 ++++ .../webapp/src/main/webapp/WEB-INF/shiro.ini | 93 ++++ .../main/webapp/WEB-INF/translations-en.po | 213 ++++++++++ .../main/webapp/WEB-INF/translations-es.po | 208 +++++++++ .../main/webapp/WEB-INF/translations-nl.po | 208 +++++++++ .../src/main/webapp/WEB-INF/translations.po | 213 ++++++++++ .../WEB-INF/viewer_restfulobjects.properties | 66 +++ .../webapp/WEB-INF/viewer_wicket.properties | 91 ++++ .../webapp/src/main/webapp/WEB-INF/web.xml | 309 ++++++++++++++ .../main/webapp/about/images/isis-logo.png | Bin 0 -> 14160 bytes .../webapp/src/main/webapp/about/index.html | 102 +++++ .../src/main/webapp/css/application.css | 19 + .../src/main/webapp/images/spinning-icon.gif | Bin 0 -> 5266 bytes .../src/main/webapp/scripts/application.js | 3 + pom.xml | 10 +- 62 files changed, 5304 insertions(+), 6 deletions(-) create mode 100644 naked-objects/.gitattributes create mode 100644 naked-objects/.gitignore create mode 100644 naked-objects/dom/log4j.properties create mode 100644 naked-objects/dom/pom.xml create mode 100644 naked-objects/dom/src/main/java/META-INF/persistence.xml create mode 100644 naked-objects/dom/src/main/java/domainapp/dom/app/homepage/HomePageService.java create mode 100644 naked-objects/dom/src/main/java/domainapp/dom/app/homepage/HomePageViewModel.java create mode 100644 naked-objects/dom/src/main/java/domainapp/dom/app/homepage/HomePageViewModel.layout.json create mode 100644 naked-objects/dom/src/main/java/domainapp/dom/app/homepage/HomePageViewModel.png create mode 100644 naked-objects/dom/src/main/java/domainapp/dom/modules/simple/SimpleObject.java create mode 100644 naked-objects/dom/src/main/java/domainapp/dom/modules/simple/SimpleObject.layout.json create mode 100644 naked-objects/dom/src/main/java/domainapp/dom/modules/simple/SimpleObject.png create mode 100644 naked-objects/dom/src/main/java/domainapp/dom/modules/simple/SimpleObjects.java create mode 100644 naked-objects/dom/src/test/java/domainapp/dom/modules/simple/SimpleObjectTest.java create mode 100644 naked-objects/dom/src/test/java/domainapp/dom/modules/simple/SimpleObjectsTest.java create mode 100644 naked-objects/fixture/pom.xml create mode 100644 naked-objects/fixture/src/main/java/domainapp/fixture/DomainAppFixturesService.java create mode 100644 naked-objects/fixture/src/main/java/domainapp/fixture/modules/simple/SimpleObjectCreate.java create mode 100644 naked-objects/fixture/src/main/java/domainapp/fixture/modules/simple/SimpleObjectsTearDown.java create mode 100644 naked-objects/fixture/src/main/java/domainapp/fixture/scenarios/RecreateSimpleObjects.java create mode 100644 naked-objects/integtests/.gitignore create mode 100644 naked-objects/integtests/logging.properties create mode 100644 naked-objects/integtests/pom.xml create mode 100644 naked-objects/integtests/src/test/java/domainapp/integtests/bootstrap/SimpleAppSystemInitializer.java create mode 100644 naked-objects/integtests/src/test/java/domainapp/integtests/specglue/BootstrappingGlue.java create mode 100644 naked-objects/integtests/src/test/java/domainapp/integtests/specglue/CatalogOfFixturesGlue.java create mode 100644 naked-objects/integtests/src/test/java/domainapp/integtests/specglue/modules/simple/SimpleObjectGlue.java create mode 100644 naked-objects/integtests/src/test/java/domainapp/integtests/specs/RunSpecs.java create mode 100644 naked-objects/integtests/src/test/java/domainapp/integtests/specs/modules/simple/SimpleObjectSpec_listAllAndCreate.feature create mode 100644 naked-objects/integtests/src/test/java/domainapp/integtests/tests/SimpleAppIntegTest.java create mode 100644 naked-objects/integtests/src/test/java/domainapp/integtests/tests/modules/simple/SimpleObjectIntegTest.java create mode 100644 naked-objects/integtests/src/test/java/domainapp/integtests/tests/modules/simple/SimpleObjectsIntegTest.java create mode 100644 naked-objects/pom.xml create mode 100644 naked-objects/webapp/ide/eclipse/launch/.gitignore create mode 100644 naked-objects/webapp/ide/intellij/launch/README.txt create mode 100644 naked-objects/webapp/ide/intellij/launch/SimpleApp_PROTOTYPE.xml create mode 100644 naked-objects/webapp/ide/intellij/launch/SimpleApp__enhance_only_.xml create mode 100644 naked-objects/webapp/lib/.gitignore create mode 100644 naked-objects/webapp/pom.xml create mode 100644 naked-objects/webapp/src/main/java/domainapp/webapp/SimpleApplication.java create mode 100644 naked-objects/webapp/src/main/jettyconsole/isis-banner.pdn create mode 100644 naked-objects/webapp/src/main/jettyconsole/isis-banner.png create mode 100644 naked-objects/webapp/src/main/resources/domainapp/webapp/welcome.html create mode 100644 naked-objects/webapp/src/main/webapp/WEB-INF/isis.properties create mode 100644 naked-objects/webapp/src/main/webapp/WEB-INF/logging.properties create mode 100644 naked-objects/webapp/src/main/webapp/WEB-INF/persistor.properties create mode 100644 naked-objects/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties create mode 100644 naked-objects/webapp/src/main/webapp/WEB-INF/shiro.ini create mode 100644 naked-objects/webapp/src/main/webapp/WEB-INF/translations-en.po create mode 100644 naked-objects/webapp/src/main/webapp/WEB-INF/translations-es.po create mode 100644 naked-objects/webapp/src/main/webapp/WEB-INF/translations-nl.po create mode 100644 naked-objects/webapp/src/main/webapp/WEB-INF/translations.po create mode 100644 naked-objects/webapp/src/main/webapp/WEB-INF/viewer_restfulobjects.properties create mode 100644 naked-objects/webapp/src/main/webapp/WEB-INF/viewer_wicket.properties create mode 100644 naked-objects/webapp/src/main/webapp/WEB-INF/web.xml create mode 100644 naked-objects/webapp/src/main/webapp/about/images/isis-logo.png create mode 100644 naked-objects/webapp/src/main/webapp/about/index.html create mode 100644 naked-objects/webapp/src/main/webapp/css/application.css create mode 100644 naked-objects/webapp/src/main/webapp/images/spinning-icon.gif create mode 100644 naked-objects/webapp/src/main/webapp/scripts/application.js diff --git a/.gitignore b/.gitignore index bd55eaca..5d2cd77e 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,4 @@ target .idea *.iml *.swp - +datanucleus.log \ No newline at end of file diff --git a/naked-objects/.gitattributes b/naked-objects/.gitattributes new file mode 100644 index 00000000..b1eafb69 --- /dev/null +++ b/naked-objects/.gitattributes @@ -0,0 +1,51 @@ +# +# +# text files are normalized (convert crlf => lf) +# binary files are not normalized (binary is a macro for -text -diff) +# +# + + +# Unless otherwise stated, assume text + +* text=auto + + +*.java text diff=java +*.html text diff=html +*.xhtml text diff=html +*.xml text +*.txt text + + +*.jar binary +*.so binary +*.dll binary + +# images +*.jpg binary +*.jpeg binary +*.png binary +*.pdn binary +*.pdn binary + + +*.cs text diff=csharp + +*.sln merge=union +*.csproj merge=union +*.vbproj merge=union +*.fsproj merge=union +*.dbproj merge=union + +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain + diff --git a/naked-objects/.gitignore b/naked-objects/.gitignore new file mode 100644 index 00000000..0558e54a --- /dev/null +++ b/naked-objects/.gitignore @@ -0,0 +1,42 @@ +*~ +*.swp +*.class +bin/ +target/ +target-ide/ +logs/ +.settings/ +.project +.classpath +.idea +*.iml + +JArchitectOut/ +*.jdproj + +neo4j_DB/ + +# log files +datanucleus.log +isis.log +i18n-po.log +hs_err_pid*.log + +# Package Files # +*.jar +*.war +*.ear + +dependency-reduced-pom.xml +pom.xml.tag +pom.xml.next +pom.xml.releaseBackup +pom.xml.versionsBackup + +.clover/ +*.jdproj +JArchitectOut/ + + +rebel.xml +/translations.pot diff --git a/naked-objects/dom/log4j.properties b/naked-objects/dom/log4j.properties new file mode 100644 index 00000000..ca165acc --- /dev/null +++ b/naked-objects/dom/log4j.properties @@ -0,0 +1,41 @@ +# 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. + +# LOG4J Configuration +# =================== + +# Basic logging goes to "datanucleus.log" +log4j.appender.A1=org.apache.log4j.FileAppender +log4j.appender.A1.File=datanucleus.log +log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout.ConversionPattern=%d{HH:mm:ss,SSS} (%t) %-5p [%c] - %m%n +#log4j.appender.A1.Threshold=INFO + +# Categories +# Each category can be set to a "level", and to direct to an appender + +# Default to DEBUG level for all DataNucleus categories +log4j.logger.DataNucleus = DEBUG, A1 + +log4j.category.com.mchange.v2.c3p0=INFO, A1 +log4j.category.com.mchange.v2.resourcepool=INFO, A1 +log4j.category.org.logicalcobwebs.proxool=INFO,A1 + + +# Hbase libs logging +log4j.category.org.apache.hadoop=INFO,A1 +log4j.category.org.apache.zookeeper=INFO,A1 \ No newline at end of file diff --git a/naked-objects/dom/pom.xml b/naked-objects/dom/pom.xml new file mode 100644 index 00000000..8d3d866c --- /dev/null +++ b/naked-objects/dom/pom.xml @@ -0,0 +1,194 @@ + + + 4.0.0 + + + com.iluwatar + naked-objects + 1.0-SNAPSHOT + + + naked-objects-dom + Simple App DOM + + + + + src/main/resources + + + src/main/java + + ** + + + **/*.java + + + + + + + + org.apache.isis.core + isis-core-applib + + + + org.apache.isis.core + isis-core-unittestsupport + test + + + + + org.objenesis + objenesis + test + + + + org.assertj + assertj-core + test + + + + + + + enhance + + true + + + 4.0.0-release + + + + + + + org.eclipse.m2e + lifecycle-mapping + 1.0.0 + + + + + + org.datanucleus + datanucleus-maven-plugin + [${datanucleus-maven-plugin.version},) + + enhance + + + + + + + + + + + + + + + org.datanucleus + datanucleus-maven-plugin + ${datanucleus-maven-plugin.version} + + false + ${basedir}/log4j.properties + true + ${basedir}/datanucleus.properties + + + + process-classes + + enhance + + + + + + + + + org.datanucleus + datanucleus-core + + + org.datanucleus + datanucleus-jodatime + + + org.datanucleus + datanucleus-api-jdo + + + + + isis-validate + + + + + + org.apache.isis.tool + isis-maven-plugin + 1.9.0-SNAPSHOT + + ../webapp/src/main/webapp/WEB-INF + + + + org.apache.isis.example.application + simpleapp-dom + 1.9.0-SNAPSHOT + + + + com.google.guava + guava + 16.0.1 + + + + + test + + validate + + + + + + + + + + diff --git a/naked-objects/dom/src/main/java/META-INF/persistence.xml b/naked-objects/dom/src/main/java/META-INF/persistence.xml new file mode 100644 index 00000000..8824aa1a --- /dev/null +++ b/naked-objects/dom/src/main/java/META-INF/persistence.xml @@ -0,0 +1,26 @@ + + + + + + + diff --git a/naked-objects/dom/src/main/java/domainapp/dom/app/homepage/HomePageService.java b/naked-objects/dom/src/main/java/domainapp/dom/app/homepage/HomePageService.java new file mode 100644 index 00000000..641c39ae --- /dev/null +++ b/naked-objects/dom/src/main/java/domainapp/dom/app/homepage/HomePageService.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 domainapp.dom.app.homepage; + +import org.apache.isis.applib.DomainObjectContainer; +import org.apache.isis.applib.annotation.Action; +import org.apache.isis.applib.annotation.DomainService; +import org.apache.isis.applib.annotation.HomePage; +import org.apache.isis.applib.annotation.NatureOfService; +import org.apache.isis.applib.annotation.SemanticsOf; + +@DomainService( + nature = NatureOfService.VIEW_CONTRIBUTIONS_ONLY // trick to suppress the actions from the top-level menu +) +public class HomePageService { + + //region > homePage (action) + + @Action( + semantics = SemanticsOf.SAFE + ) + @HomePage + public HomePageViewModel homePage() { + return container.injectServicesInto(new HomePageViewModel()); + } + + //endregion + + //region > injected services + + @javax.inject.Inject + DomainObjectContainer container; + + //endregion +} diff --git a/naked-objects/dom/src/main/java/domainapp/dom/app/homepage/HomePageViewModel.java b/naked-objects/dom/src/main/java/domainapp/dom/app/homepage/HomePageViewModel.java new file mode 100644 index 00000000..83015d05 --- /dev/null +++ b/naked-objects/dom/src/main/java/domainapp/dom/app/homepage/HomePageViewModel.java @@ -0,0 +1,50 @@ +/* + * 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 domainapp.dom.app.homepage; + +import java.util.List; + +import org.apache.isis.applib.annotation.ViewModel; + +import domainapp.dom.modules.simple.SimpleObject; +import domainapp.dom.modules.simple.SimpleObjects; + +@ViewModel +public class HomePageViewModel { + + //region > title + public String title() { + return getObjects().size() + " objects"; + } + //endregion + + //region > object (collection) + @org.apache.isis.applib.annotation.HomePage + public List getObjects() { + return simpleObjects.listAll(); + } + //endregion + + //region > injected services + + @javax.inject.Inject + SimpleObjects simpleObjects; + + //endregion +} diff --git a/naked-objects/dom/src/main/java/domainapp/dom/app/homepage/HomePageViewModel.layout.json b/naked-objects/dom/src/main/java/domainapp/dom/app/homepage/HomePageViewModel.layout.json new file mode 100644 index 00000000..34f78e0c --- /dev/null +++ b/naked-objects/dom/src/main/java/domainapp/dom/app/homepage/HomePageViewModel.layout.json @@ -0,0 +1,43 @@ +/** + * 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. + */ +{ + "columns": [ + { + "span": 0, + "memberGroups": {} + }, + { + "span": 0, + "memberGroups": {} + }, + { + "span": 0, + "memberGroups": {} + }, + { + "span": 12, + "collections": { + "objects": { + "collectionLayout": { + "render": "EAGERLY" + } + } + } + } + ], + "actions": {} +} \ No newline at end of file diff --git a/naked-objects/dom/src/main/java/domainapp/dom/app/homepage/HomePageViewModel.png b/naked-objects/dom/src/main/java/domainapp/dom/app/homepage/HomePageViewModel.png new file mode 100644 index 0000000000000000000000000000000000000000..cb03785f714e60f93499a4e9136339aab1b07a23 GIT binary patch literal 456 zcmV;(0XP1MP)Uv68@LBPf$L12Bj6Fx+;`w0%>S7_6hH-Efc;Qu4qPN4Zh@QV`Z4et z&l>{J6t{XQi0S}M@wcG9mvN#hKuTQiSVOj^AgTeB#O)QNAgTbA#I+DLw761Ee2iU$ zUEH@F070*G$UFQbqEAEAG0Sp!QKy(6(74L#*g;kt{wZwZt7(i`t zH-rGD5_dreKw)B$s%*F4@otyc=z3kswdh;`3X3gZD)EvND*-6Y^we6R8eLDWc(u7r z8_t29f;X`fn!7A@L9Wgj@RYfE8oq!^@5dnIJTZWZo;coYD@>yQ$VuCvN~N9w!L9*l zJ3ag*fQ2pg*nthe#({t1z}Os6qb0lG0l0Lup^jLkB;0k>xC8XXyp{uYe$&1%&`Rsykl*L6`8At^Ozg0000= 0 ") +}) +@javax.jdo.annotations.Unique(name="SimpleObject_name_UNQ", members = {"name"}) +@DomainObject +@DomainObjectLayout( + bookmarking = BookmarkPolicy.AS_ROOT, + cssClassFa = "fa-flag" +) +public class SimpleObject implements Comparable { + + + //region > identificatiom + public TranslatableString title() { + return TranslatableString.tr("Object: {name}", "name", getName()); + } + //endregion + + //region > name (property) + + private String name; + + @javax.jdo.annotations.Column(allowsNull="false", length = 40) + @Title(sequence="1") + @Property( + editing = Editing.DISABLED + ) + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + // endregion + + //region > updateName (action) + + public static class UpdateNameDomainEvent extends ActionDomainEvent { + public UpdateNameDomainEvent(final SimpleObject source, final Identifier identifier, final Object... arguments) { + super(source, identifier, arguments); + } + } + + @Action( + domainEvent = UpdateNameDomainEvent.class + ) + public SimpleObject updateName( + @Parameter(maxLength = 40) + @ParameterLayout(named = "New name") + final String name) { + setName(name); + return this; + } + + public String default0UpdateName() { + return getName(); + } + + public TranslatableString validateUpdateName(final String name) { + return name.contains("!")? TranslatableString.tr("Exclamation mark is not allowed"): null; + } + + //endregion + + //region > version (derived property) + public Long getVersionSequence() { + return (Long) JDOHelper.getVersion(this); + } + //endregion + + //region > compareTo + + @Override + public int compareTo(final SimpleObject other) { + return ObjectContracts.compare(this, other, "name"); + } + + //endregion + + //region > injected services + + @javax.inject.Inject + @SuppressWarnings("unused") + private DomainObjectContainer container; + + //endregion + + +} diff --git a/naked-objects/dom/src/main/java/domainapp/dom/modules/simple/SimpleObject.layout.json b/naked-objects/dom/src/main/java/domainapp/dom/modules/simple/SimpleObject.layout.json new file mode 100644 index 00000000..3d5e23f7 --- /dev/null +++ b/naked-objects/dom/src/main/java/domainapp/dom/modules/simple/SimpleObject.layout.json @@ -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. + */ +{ + "columns": [ + { + "span": 6, + "memberGroups": { + "General": { + "members": { + "name": { + "actions": { + "updateName": { + "actionLayout": { + "position": "BOTTOM" + } + } + } + }, + "versionSequence": { + "propertyLayout": { + "name": "version" + } + } + } + } + } + }, + { + "span": 0, + "memberGroups": {} + }, + { + "span": 0, + "memberGroups": {} + }, + { + "span": 6, + "collections": {} + } + ], + "actions": {} +} \ No newline at end of file diff --git a/naked-objects/dom/src/main/java/domainapp/dom/modules/simple/SimpleObject.png b/naked-objects/dom/src/main/java/domainapp/dom/modules/simple/SimpleObject.png new file mode 100644 index 0000000000000000000000000000000000000000..0bd6f575646cc5b68b3d86c59c61876f84351722 GIT binary patch literal 653 zcmV;80&@L{P)TeaDl*`3}}y6WnFwrAe! z*FQ5ik$<+yNc=5be-qtj41skKxl`Z`5xI|$7()QSH3j7}B$_Qsz(;SOAr+zoEc#DH zpVJgHs}LdJqd!psN6}h{5b)72De$X^gj8rHkVb#31b7dr&`KbU{zD1Oi%3X?J_1CH zv@0Tl+`9@$?k#%j0O<~n~zr^w+?>@8L3-7 zLx9a*227AQjp|H9N~4$2e4u+S4%l-Ffs{EBA|Z^)xiKHGU&qCiB$eQhLQ;y&l=LY8 z%pUG3i3n(E4d53J98$9sn8Eh1NMykQPP-r_L1o*ti>g67chbmhvs@cOf+DjbVgphV zF%SMMA`~g};>SvJfPx_%%jy{+k%E)+v~@cv@Z?ewtJ=dult9HtbtLjEc&-N0&3*Aq zQ~4@P{A{UqRNp9O=6^Lj;BF5aKdpH|SsPH3E!Ns@?8)Ei=G; n?H);Ya24xV-yDd5Hm&&vexQ+2Y+_lE00000NkvXXu0mjfQKuRg literal 0 HcmV?d00001 diff --git a/naked-objects/dom/src/main/java/domainapp/dom/modules/simple/SimpleObjects.java b/naked-objects/dom/src/main/java/domainapp/dom/modules/simple/SimpleObjects.java new file mode 100644 index 00000000..0634dd16 --- /dev/null +++ b/naked-objects/dom/src/main/java/domainapp/dom/modules/simple/SimpleObjects.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 domainapp.dom.modules.simple; + +import java.util.List; + +import org.apache.isis.applib.DomainObjectContainer; +import org.apache.isis.applib.Identifier; +import org.apache.isis.applib.annotation.Action; +import org.apache.isis.applib.annotation.ActionLayout; +import org.apache.isis.applib.annotation.BookmarkPolicy; +import org.apache.isis.applib.annotation.DomainService; +import org.apache.isis.applib.annotation.DomainServiceLayout; +import org.apache.isis.applib.annotation.MemberOrder; +import org.apache.isis.applib.annotation.ParameterLayout; +import org.apache.isis.applib.annotation.SemanticsOf; +import org.apache.isis.applib.query.QueryDefault; +import org.apache.isis.applib.services.eventbus.ActionDomainEvent; +import org.apache.isis.applib.services.i18n.TranslatableString; + +@DomainService(repositoryFor = SimpleObject.class) +@DomainServiceLayout(menuOrder = "10") +public class SimpleObjects { + + //region > title + public TranslatableString title() { + return TranslatableString.tr("Simple Objects"); + } + //endregion + + //region > listAll (action) + @Action( + semantics = SemanticsOf.SAFE + ) + @ActionLayout( + bookmarking = BookmarkPolicy.AS_ROOT + ) + @MemberOrder(sequence = "1") + public List listAll() { + return container.allInstances(SimpleObject.class); + } + //endregion + + //region > findByName (action) + @Action( + semantics = SemanticsOf.SAFE + ) + @ActionLayout( + bookmarking = BookmarkPolicy.AS_ROOT + ) + @MemberOrder(sequence = "2") + public List findByName( + @ParameterLayout(named="Name") + final String name + ) { + return container.allMatches( + new QueryDefault<>( + SimpleObject.class, + "findByName", + "name", name)); + } + //endregion + + //region > create (action) + public static class CreateDomainEvent extends ActionDomainEvent { + public CreateDomainEvent(final SimpleObjects source, final Identifier identifier, final Object... arguments) { + super(source, identifier, arguments); + } + } + + @Action( + domainEvent = CreateDomainEvent.class + ) + @MemberOrder(sequence = "3") + public SimpleObject create( + final @ParameterLayout(named="Name") String name) { + final SimpleObject obj = container.newTransientInstance(SimpleObject.class); + obj.setName(name); + container.persistIfNotAlready(obj); + return obj; + } + + //endregion + + //region > injected services + + @javax.inject.Inject + DomainObjectContainer container; + + //endregion +} diff --git a/naked-objects/dom/src/test/java/domainapp/dom/modules/simple/SimpleObjectTest.java b/naked-objects/dom/src/test/java/domainapp/dom/modules/simple/SimpleObjectTest.java new file mode 100644 index 00000000..e29b3f24 --- /dev/null +++ b/naked-objects/dom/src/test/java/domainapp/dom/modules/simple/SimpleObjectTest.java @@ -0,0 +1,49 @@ +/** + * 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 domainapp.dom.modules.simple; + +import org.junit.Before; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class SimpleObjectTest { + + SimpleObject simpleObject; + + @Before + public void setUp() throws Exception { + simpleObject = new SimpleObject(); + } + + public static class Name extends SimpleObjectTest { + + @Test + public void happyCase() throws Exception { + // given + String name = "Foobar"; + assertThat(simpleObject.getName()).isNull(); + + // when + simpleObject.setName(name); + + // then + assertThat(simpleObject.getName()).isEqualTo(name); + } + } + +} diff --git a/naked-objects/dom/src/test/java/domainapp/dom/modules/simple/SimpleObjectsTest.java b/naked-objects/dom/src/test/java/domainapp/dom/modules/simple/SimpleObjectsTest.java new file mode 100644 index 00000000..a41d25ad --- /dev/null +++ b/naked-objects/dom/src/test/java/domainapp/dom/modules/simple/SimpleObjectsTest.java @@ -0,0 +1,104 @@ +/** + * 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 domainapp.dom.modules.simple; + +import java.util.List; + +import com.google.common.collect.Lists; + +import org.jmock.Expectations; +import org.jmock.Sequence; +import org.jmock.auto.Mock; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; + +import org.apache.isis.applib.DomainObjectContainer; +import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2; +import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode; + +import static org.assertj.core.api.Assertions.assertThat; + +public class SimpleObjectsTest { + + @Rule + public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES); + + @Mock + DomainObjectContainer mockContainer; + + SimpleObjects simpleObjects; + + @Before + public void setUp() throws Exception { + simpleObjects = new SimpleObjects(); + simpleObjects.container = mockContainer; + } + + public static class Create extends SimpleObjectsTest { + + @Test + public void happyCase() throws Exception { + + // given + final SimpleObject simpleObject = new SimpleObject(); + + final Sequence seq = context.sequence("create"); + context.checking(new Expectations() { + { + oneOf(mockContainer).newTransientInstance(SimpleObject.class); + inSequence(seq); + will(returnValue(simpleObject)); + + oneOf(mockContainer).persistIfNotAlready(simpleObject); + inSequence(seq); + } + }); + + // when + final SimpleObject obj = simpleObjects.create("Foobar"); + + // then + assertThat(obj).isEqualTo(simpleObject); + assertThat(obj.getName()).isEqualTo("Foobar"); + } + + } + + public static class ListAll extends SimpleObjectsTest { + + @Test + public void happyCase() throws Exception { + + // given + final List all = Lists.newArrayList(); + + context.checking(new Expectations() { + { + oneOf(mockContainer).allInstances(SimpleObject.class); + will(returnValue(all)); + } + }); + + // when + final List list = simpleObjects.listAll(); + + // then + assertThat(list).isEqualTo(all); + } + } +} diff --git a/naked-objects/fixture/pom.xml b/naked-objects/fixture/pom.xml new file mode 100644 index 00000000..63ee62d1 --- /dev/null +++ b/naked-objects/fixture/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + + + com.iluwatar + naked-objects + 1.0-SNAPSHOT + + + naked-objects-fixture + Simple App Fixtures + + + + ${project.groupId} + naked-objects-dom + + + + diff --git a/naked-objects/fixture/src/main/java/domainapp/fixture/DomainAppFixturesService.java b/naked-objects/fixture/src/main/java/domainapp/fixture/DomainAppFixturesService.java new file mode 100644 index 00000000..751bad31 --- /dev/null +++ b/naked-objects/fixture/src/main/java/domainapp/fixture/DomainAppFixturesService.java @@ -0,0 +1,76 @@ +/* + * 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 domainapp.fixture; + +import java.util.List; + +import org.apache.isis.applib.annotation.Action; +import org.apache.isis.applib.annotation.ActionLayout; +import org.apache.isis.applib.annotation.DomainService; +import org.apache.isis.applib.annotation.DomainServiceLayout; +import org.apache.isis.applib.annotation.MemberOrder; +import org.apache.isis.applib.annotation.RestrictTo; +import org.apache.isis.applib.fixturescripts.FixtureResult; +import org.apache.isis.applib.fixturescripts.FixtureScript; +import org.apache.isis.applib.fixturescripts.FixtureScripts; + +import domainapp.fixture.scenarios.RecreateSimpleObjects; + +/** + * Enables fixtures to be installed from the application. + */ +@DomainService +@DomainServiceLayout( + named="Prototyping", + menuBar = DomainServiceLayout.MenuBar.SECONDARY, + menuOrder = "500" +) +public class DomainAppFixturesService extends FixtureScripts { + + public DomainAppFixturesService() { + super(DomainAppFixturesService.class.getPackage().getName(), MultipleExecutionStrategy.EXECUTE); + } + + @Override + public FixtureScript default0RunFixtureScript() { + return findFixtureScriptFor(RecreateSimpleObjects.class); + } + + @Override + public List choices0RunFixtureScript() { + return super.choices0RunFixtureScript(); + } + + + // ////////////////////////////////////// + + @Action( + restrictTo = RestrictTo.PROTOTYPING + ) + @ActionLayout( + cssClassFa="fa fa-refresh" + ) + @MemberOrder(sequence="20") + public Object recreateObjectsAndReturnFirst() { + final List run = findFixtureScriptFor(RecreateSimpleObjects.class).run(null); + return run.get(0).getObject(); + } + + +} diff --git a/naked-objects/fixture/src/main/java/domainapp/fixture/modules/simple/SimpleObjectCreate.java b/naked-objects/fixture/src/main/java/domainapp/fixture/modules/simple/SimpleObjectCreate.java new file mode 100644 index 00000000..926217d0 --- /dev/null +++ b/naked-objects/fixture/src/main/java/domainapp/fixture/modules/simple/SimpleObjectCreate.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 domainapp.fixture.modules.simple; + +import org.apache.isis.applib.fixturescripts.FixtureScript; + +import domainapp.dom.modules.simple.SimpleObject; +import domainapp.dom.modules.simple.SimpleObjects; + +public class SimpleObjectCreate extends FixtureScript { + + //region > name (input) + private String name; + /** + * Name of the object (required) + */ + public String getName() { + return name; + } + + public SimpleObjectCreate setName(final String name) { + this.name = name; + return this; + } + //endregion + + + //region > simpleObject (output) + private SimpleObject simpleObject; + + /** + * The created simple object (output). + * @return + */ + public SimpleObject getSimpleObject() { + return simpleObject; + } + //endregion + + @Override + protected void execute(final ExecutionContext ec) { + + String name = checkParam("name", ec, String.class); + + this.simpleObject = wrap(simpleObjects).create(name); + + // also make available to UI + ec.addResult(this, simpleObject); + } + + @javax.inject.Inject + private SimpleObjects simpleObjects; + +} diff --git a/naked-objects/fixture/src/main/java/domainapp/fixture/modules/simple/SimpleObjectsTearDown.java b/naked-objects/fixture/src/main/java/domainapp/fixture/modules/simple/SimpleObjectsTearDown.java new file mode 100644 index 00000000..8767b6fb --- /dev/null +++ b/naked-objects/fixture/src/main/java/domainapp/fixture/modules/simple/SimpleObjectsTearDown.java @@ -0,0 +1,36 @@ +/* + * 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 domainapp.fixture.modules.simple; + +import org.apache.isis.applib.fixturescripts.FixtureScript; +import org.apache.isis.applib.services.jdosupport.IsisJdoSupport; + +public class SimpleObjectsTearDown extends FixtureScript { + + @Override + protected void execute(ExecutionContext executionContext) { + isisJdoSupport.executeUpdate("delete from simple.\"SimpleObject\""); + } + + + @javax.inject.Inject + private IsisJdoSupport isisJdoSupport; + +} diff --git a/naked-objects/fixture/src/main/java/domainapp/fixture/scenarios/RecreateSimpleObjects.java b/naked-objects/fixture/src/main/java/domainapp/fixture/scenarios/RecreateSimpleObjects.java new file mode 100644 index 00000000..072769e2 --- /dev/null +++ b/naked-objects/fixture/src/main/java/domainapp/fixture/scenarios/RecreateSimpleObjects.java @@ -0,0 +1,92 @@ +/* + * 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 domainapp.fixture.scenarios; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import com.google.common.collect.Lists; + +import org.apache.isis.applib.fixturescripts.FixtureScript; + +import domainapp.dom.modules.simple.SimpleObject; +import domainapp.fixture.modules.simple.SimpleObjectCreate; +import domainapp.fixture.modules.simple.SimpleObjectsTearDown; + +public class RecreateSimpleObjects extends FixtureScript { + + public final List NAMES = Collections.unmodifiableList(Arrays.asList( + "Foo", "Bar", "Baz", "Frodo", "Froyo", "Fizz", "Bip", "Bop", "Bang", "Boo")); + + public RecreateSimpleObjects() { + withDiscoverability(Discoverability.DISCOVERABLE); + } + + //region > number (optional input) + private Integer number; + + /** + * The number of objects to create, up to 10; optional, defaults to 3. + */ + public Integer getNumber() { + return number; + } + + public RecreateSimpleObjects setNumber(final Integer number) { + this.number = number; + return this; + } + //endregion + + //region > simpleObjects (output) + private final List simpleObjects = Lists.newArrayList(); + + /** + * The simpleobjects created by this fixture (output). + */ + public List getSimpleObjects() { + return simpleObjects; + } + //endregion + + @Override + protected void execute(final ExecutionContext ec) { + + // defaults + final int number = defaultParam("number", ec, 3); + + // validate + if(number < 0 || number > NAMES.size()) { + throw new IllegalArgumentException(String.format("number must be in range [0,%d)", NAMES.size())); + } + + // + // execute + // + ec.executeChild(this, new SimpleObjectsTearDown()); + + for (int i = 0; i < number; i++) { + final SimpleObjectCreate fs = new SimpleObjectCreate().setName(NAMES.get(i)); + ec.executeChild(this, fs.getName(), fs); + simpleObjects.add(fs.getSimpleObject()); + } + } +} diff --git a/naked-objects/integtests/.gitignore b/naked-objects/integtests/.gitignore new file mode 100644 index 00000000..88dfbbca --- /dev/null +++ b/naked-objects/integtests/.gitignore @@ -0,0 +1 @@ +/translations.pot diff --git a/naked-objects/integtests/logging.properties b/naked-objects/integtests/logging.properties new file mode 100644 index 00000000..b5524956 --- /dev/null +++ b/naked-objects/integtests/logging.properties @@ -0,0 +1,111 @@ +# 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. + + +# +# Isis uses log4j is used to provide system logging +# +log4j.rootCategory=INFO, Console + +# The console appender +log4j.appender.Console=org.apache.log4j.ConsoleAppender +log4j.appender.Console.target=System.out +log4j.appender.Console.layout=org.apache.log4j.PatternLayout +log4j.appender.Console.layout.ConversionPattern=%d{ABSOLUTE} [%-20c{1} %-10t %-5p] %m%n + +log4j.appender.File=org.apache.log4j.RollingFileAppender +log4j.appender.File.file=isis.log +log4j.appender.File.append=false +log4j.appender.File.layout=org.apache.log4j.PatternLayout +log4j.appender.File.layout.ConversionPattern=%d [%-20c{1} %-10t %-5p] %m%n + +log4j.appender.translations-po=org.apache.log4j.FileAppender +log4j.appender.translations-po.File=./translations.pot +log4j.appender.translations-po.Append=false +log4j.appender.translations-po.layout=org.apache.log4j.PatternLayout +log4j.appender.translations-po.layout.ConversionPattern=%m%n + +! turn on the internal log4j debugging flag so we can see what it is doing +#log4j.debug=true + + +# DataNucleus +# the first two log the DML and DDL (if set to DEBUG) +log4j.logger.DataNucleus.Datastore.Native=WARN, Console +log4j.logger.DataNucleus.Datastore.Schema=DEBUG, Console +# the remainder can probably be left to WARN +log4j.logger.DataNucleus.Persistence=WARN, Console +log4j.logger.DataNucleus.Transaction=WARN, Console +log4j.logger.DataNucleus.Connection=WARN, Console +log4j.logger.DataNucleus.Query=WARN, Console +log4j.logger.DataNucleus.Cache=WARN, Console +log4j.logger.DataNucleus.MetaData=WARN, Console +log4j.logger.DataNucleus.Datastore=WARN, Console +log4j.logger.DataNucleus.Datastore.Persist=WARN, Console +log4j.logger.DataNucleus.Datastore.Retrieve=WARN, Console +log4j.logger.DataNucleus.General=WARN, Console +log4j.logger.DataNucleus.Lifecycle=WARN, Console +log4j.logger.DataNucleus.ValueGeneration=WARN, Console +log4j.logger.DataNucleus.Enhancer=WARN, Console +log4j.logger.DataNucleus.SchemaTool=ERROR, Console +log4j.logger.DataNucleus.JDO=WARN, Console +log4j.logger.DataNucleus.JPA=ERROR, Console +log4j.logger.DataNucleus.JCA=WARN, Console +log4j.logger.DataNucleus.IDE=ERROR, Console + +log4j.additivity.DataNucleus.Datastore.Native=false +log4j.additivity.DataNucleus.Datastore.Schema=false +log4j.additivity.DataNucleus.Datastore.Persistence=false +log4j.additivity.DataNucleus.Datastore.Transaction=false +log4j.additivity.DataNucleus.Datastore.Connection=false +log4j.additivity.DataNucleus.Datastore.Query=false +log4j.additivity.DataNucleus.Datastore.Cache=false +log4j.additivity.DataNucleus.Datastore.MetaData=false +log4j.additivity.DataNucleus.Datastore.Datastore=false +log4j.additivity.DataNucleus.Datastore.Datastore.Persist=false +log4j.additivity.DataNucleus.Datastore.Datastore.Retrieve=false +log4j.additivity.DataNucleus.Datastore.General=false +log4j.additivity.DataNucleus.Datastore.Lifecycle=false +log4j.additivity.DataNucleus.Datastore.ValueGeneration=false +log4j.additivity.DataNucleus.Datastore.Enhancer=false +log4j.additivity.DataNucleus.Datastore.SchemaTool=false +log4j.additivity.DataNucleus.Datastore.JDO=false +log4j.additivity.DataNucleus.Datastore.JPA=false +log4j.additivity.DataNucleus.Datastore.JCA=false +log4j.additivity.DataNucleus.Datastore.IDE=false + + + + +# if using log4jdbc-remix as JDBC driver +#log4j.logger.jdbc.sqlonly=DEBUG, sql, Console +#log4j.additivity.jdbc.sqlonly=false +#log4j.logger.jdbc.resultsettable=DEBUG, jdbc, Console +#log4j.additivity.jdbc.resultsettable=false + +#log4j.logger.jdbc.audit=WARN,jdbc, Console +#log4j.additivity.jdbc.audit=false +#log4j.logger.jdbc.resultset=WARN,jdbc +#log4j.additivity.jdbc.resultset=false +#log4j.logger.jdbc.sqltiming=WARN,sqltiming +#log4j.additivity.jdbc.sqltiming=false +#log4j.logger.jdbc.connection=FATAL,connection +#log4j.additivity.jdbc.connection=false + + +log4j.logger.org.apache.isis.core.runtime.services.i18n.po.PoWriter=INFO,translations-po +log4j.additivity.org.apache.isis.core.runtime.services.i18n.po.PotWriter=false diff --git a/naked-objects/integtests/pom.xml b/naked-objects/integtests/pom.xml new file mode 100644 index 00000000..e627a017 --- /dev/null +++ b/naked-objects/integtests/pom.xml @@ -0,0 +1,128 @@ + + + 4.0.0 + + + com.iluwatar + naked-objects + 1.0-SNAPSHOT + + + naked-objects-integtests + Simple App Integration Tests + + + + + src/test/resources + + + src/test/java + + ** + + + **/*.java + + + + + + + + + ${project.groupId} + naked-objects-fixture + + + + org.apache.isis.core + isis-core-unittestsupport + + + + org.apache.isis.core + isis-core-integtestsupport + + + org.apache.isis.core + isis-core-specsupport + + + + org.hamcrest + hamcrest-library + + + + org.apache.isis.core + isis-core-wrapper + + + org.apache.isis.core + isis-core-runtime + + + + org.assertj + assertj-core + test + + + + org.hsqldb + hsqldb + + + + + + + + + diff --git a/naked-objects/integtests/src/test/java/domainapp/integtests/bootstrap/SimpleAppSystemInitializer.java b/naked-objects/integtests/src/test/java/domainapp/integtests/bootstrap/SimpleAppSystemInitializer.java new file mode 100644 index 00000000..28e9d378 --- /dev/null +++ b/naked-objects/integtests/src/test/java/domainapp/integtests/bootstrap/SimpleAppSystemInitializer.java @@ -0,0 +1,54 @@ +/* + * 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 domainapp.integtests.bootstrap; + +import org.apache.isis.core.commons.config.IsisConfiguration; +import org.apache.isis.core.integtestsupport.IsisSystemForTest; +import org.apache.isis.objectstore.jdo.datanucleus.DataNucleusPersistenceMechanismInstaller; +import org.apache.isis.objectstore.jdo.datanucleus.IsisConfigurationForJdoIntegTests; + +public class SimpleAppSystemInitializer { + + public static void initIsft() { + IsisSystemForTest isft = IsisSystemForTest.getElseNull(); + if(isft == null) { + isft = new SimpleAppSystemBuilder().build().setUpSystem(); + IsisSystemForTest.set(isft); + } + } + + private static class SimpleAppSystemBuilder extends IsisSystemForTest.Builder { + + public SimpleAppSystemBuilder() { + withLoggingAt(org.apache.log4j.Level.INFO); + with(testConfiguration()); + with(new DataNucleusPersistenceMechanismInstaller()); + + // services annotated with @DomainService + withServicesIn( "domainapp" ); + } + + private static IsisConfiguration testConfiguration() { + final IsisConfigurationForJdoIntegTests testConfiguration = new IsisConfigurationForJdoIntegTests(); + + testConfiguration.addRegisterEntitiesPackagePrefix("domainapp.dom.modules"); + return testConfiguration; + } + } +} diff --git a/naked-objects/integtests/src/test/java/domainapp/integtests/specglue/BootstrappingGlue.java b/naked-objects/integtests/src/test/java/domainapp/integtests/specglue/BootstrappingGlue.java new file mode 100644 index 00000000..b175d474 --- /dev/null +++ b/naked-objects/integtests/src/test/java/domainapp/integtests/specglue/BootstrappingGlue.java @@ -0,0 +1,41 @@ +/** +O * 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 domainapp.integtests.specglue; + +import org.apache.isis.core.specsupport.scenarios.ScenarioExecutionScope; +import org.apache.isis.core.specsupport.specs.CukeGlueAbstract; + +import cucumber.api.java.After; +import cucumber.api.java.Before; +import domainapp.integtests.bootstrap.SimpleAppSystemInitializer; + +public class BootstrappingGlue extends CukeGlueAbstract { + + @Before(value={"@integration"}, order=100) + public void beforeScenarioIntegrationScope() { + org.apache.log4j.PropertyConfigurator.configure("logging.properties"); + SimpleAppSystemInitializer.initIsft(); + + before(ScenarioExecutionScope.INTEGRATION); + } + + @After + public void afterScenario(cucumber.api.Scenario sc) { + assertMocksSatisfied(); + after(sc); + } +} diff --git a/naked-objects/integtests/src/test/java/domainapp/integtests/specglue/CatalogOfFixturesGlue.java b/naked-objects/integtests/src/test/java/domainapp/integtests/specglue/CatalogOfFixturesGlue.java new file mode 100644 index 00000000..a2d5c898 --- /dev/null +++ b/naked-objects/integtests/src/test/java/domainapp/integtests/specglue/CatalogOfFixturesGlue.java @@ -0,0 +1,31 @@ +/** + * 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 domainapp.integtests.specglue; + +import org.apache.isis.core.specsupport.specs.CukeGlueAbstract; + +import cucumber.api.java.Before; +import domainapp.fixture.scenarios.RecreateSimpleObjects; + +public class CatalogOfFixturesGlue extends CukeGlueAbstract { + + @Before(value={"@integration", "@SimpleObjectsFixture"}, order=20000) + public void integrationFixtures() throws Throwable { + scenarioExecution().install(new RecreateSimpleObjects()); + } + +} diff --git a/naked-objects/integtests/src/test/java/domainapp/integtests/specglue/modules/simple/SimpleObjectGlue.java b/naked-objects/integtests/src/test/java/domainapp/integtests/specglue/modules/simple/SimpleObjectGlue.java new file mode 100644 index 00000000..63d96bd5 --- /dev/null +++ b/naked-objects/integtests/src/test/java/domainapp/integtests/specglue/modules/simple/SimpleObjectGlue.java @@ -0,0 +1,50 @@ +/** + * 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 domainapp.integtests.specglue.modules.simple; + +import java.util.List; +import java.util.UUID; + +import org.apache.isis.core.specsupport.specs.CukeGlueAbstract; + +import cucumber.api.java.en.Given; +import cucumber.api.java.en.When; +import domainapp.dom.modules.simple.SimpleObject; +import domainapp.dom.modules.simple.SimpleObjects; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +public class SimpleObjectGlue extends CukeGlueAbstract { + + @Given("^there are.* (\\d+) simple objects$") + public void there_are_N_simple_objects(int n) throws Throwable { + try { + final List findAll = service(SimpleObjects.class).listAll(); + assertThat(findAll.size(), is(n)); + putVar("list", "all", findAll); + + } finally { + assertMocksSatisfied(); + } + } + + @When("^I create a new simple object$") + public void I_create_a_new_simple_object() throws Throwable { + service(SimpleObjects.class).create(UUID.randomUUID().toString()); + } + +} diff --git a/naked-objects/integtests/src/test/java/domainapp/integtests/specs/RunSpecs.java b/naked-objects/integtests/src/test/java/domainapp/integtests/specs/RunSpecs.java new file mode 100644 index 00000000..910b5a82 --- /dev/null +++ b/naked-objects/integtests/src/test/java/domainapp/integtests/specs/RunSpecs.java @@ -0,0 +1,39 @@ +/** + * 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 domainapp.integtests.specs; + +import org.junit.runner.RunWith; + +import cucumber.api.CucumberOptions; +import cucumber.api.junit.Cucumber; + + +/** + * Runs scenarios in all .feature files (this package and any subpackages). + */ +@RunWith(Cucumber.class) +@CucumberOptions( + format = { + "html:target/cucumber-html-report" + ,"json:target/cucumber.json" + }, + glue={"classpath:domainapp.integtests.specglue"}, + strict = true, + tags = { "~@backlog", "~@ignore" }) +public class RunSpecs { + // intentionally empty +} diff --git a/naked-objects/integtests/src/test/java/domainapp/integtests/specs/modules/simple/SimpleObjectSpec_listAllAndCreate.feature b/naked-objects/integtests/src/test/java/domainapp/integtests/specs/modules/simple/SimpleObjectSpec_listAllAndCreate.feature new file mode 100644 index 00000000..346aa256 --- /dev/null +++ b/naked-objects/integtests/src/test/java/domainapp/integtests/specs/modules/simple/SimpleObjectSpec_listAllAndCreate.feature @@ -0,0 +1,26 @@ +# +# 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. +# +@SimpleObjectsFixture +Feature: List and Create New Simple Objects + + @integration + Scenario: Existing simple objects can be listed and new ones created + Given there are initially 3 simple objects + When I create a new simple object + Then there are 4 simple objects + + \ No newline at end of file diff --git a/naked-objects/integtests/src/test/java/domainapp/integtests/tests/SimpleAppIntegTest.java b/naked-objects/integtests/src/test/java/domainapp/integtests/tests/SimpleAppIntegTest.java new file mode 100644 index 00000000..3ceef4e6 --- /dev/null +++ b/naked-objects/integtests/src/test/java/domainapp/integtests/tests/SimpleAppIntegTest.java @@ -0,0 +1,39 @@ +/* + * 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 domainapp.integtests.tests; + +import org.junit.BeforeClass; + +import org.apache.isis.core.integtestsupport.IntegrationTestAbstract; +import org.apache.isis.core.integtestsupport.scenarios.ScenarioExecutionForIntegration; + +import domainapp.integtests.bootstrap.SimpleAppSystemInitializer; + +public abstract class SimpleAppIntegTest extends IntegrationTestAbstract { + + @BeforeClass + public static void initClass() { + org.apache.log4j.PropertyConfigurator.configure("logging.properties"); + SimpleAppSystemInitializer.initIsft(); + + // instantiating will install onto ThreadLocal + new ScenarioExecutionForIntegration(); + } + +} diff --git a/naked-objects/integtests/src/test/java/domainapp/integtests/tests/modules/simple/SimpleObjectIntegTest.java b/naked-objects/integtests/src/test/java/domainapp/integtests/tests/modules/simple/SimpleObjectIntegTest.java new file mode 100644 index 00000000..610136bb --- /dev/null +++ b/naked-objects/integtests/src/test/java/domainapp/integtests/tests/modules/simple/SimpleObjectIntegTest.java @@ -0,0 +1,121 @@ +/* + * 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 domainapp.integtests.tests.modules.simple; + +import javax.inject.Inject; + +import org.junit.Before; +import org.junit.Test; + +import org.apache.isis.applib.DomainObjectContainer; +import org.apache.isis.applib.fixturescripts.FixtureScripts; +import org.apache.isis.applib.services.wrapper.DisabledException; +import org.apache.isis.applib.services.wrapper.InvalidException; + +import domainapp.dom.modules.simple.SimpleObject; +import domainapp.fixture.scenarios.RecreateSimpleObjects; +import domainapp.integtests.tests.SimpleAppIntegTest; +import static org.assertj.core.api.Assertions.assertThat; + +public class SimpleObjectIntegTest extends SimpleAppIntegTest { + + @Inject + FixtureScripts fixtureScripts; + + RecreateSimpleObjects fs; + SimpleObject simpleObjectPojo; + SimpleObject simpleObjectWrapped; + + @Before + public void setUp() throws Exception { + // given + fs = new RecreateSimpleObjects().setNumber(1); + fixtureScripts.runFixtureScript(fs, null); + + simpleObjectPojo = fs.getSimpleObjects().get(0); + + assertThat(simpleObjectPojo).isNotNull(); + simpleObjectWrapped = wrap(simpleObjectPojo); + } + + public static class Name extends SimpleObjectIntegTest { + + @Test + public void accessible() throws Exception { + // when + final String name = simpleObjectWrapped.getName(); + // then + assertThat(name).isEqualTo(fs.NAMES.get(0)); + } + + @Test + public void cannotBeUpdatedDirectly() throws Exception { + + // expect + expectedExceptions.expect(DisabledException.class); + + // when + simpleObjectWrapped.setName("new name"); + } + } + + public static class UpdateName extends SimpleObjectIntegTest { + + @Test + public void happyCase() throws Exception { + + // when + simpleObjectWrapped.updateName("new name"); + + // then + assertThat(simpleObjectWrapped.getName()).isEqualTo("new name"); + } + + @Test + public void failsValidation() throws Exception { + + // expect + expectedExceptions.expect(InvalidException.class); + expectedExceptions.expectMessage("Exclamation mark is not allowed"); + + // when + simpleObjectWrapped.updateName("new name!"); + } + } + + + public static class Title extends SimpleObjectIntegTest { + + @Inject + DomainObjectContainer container; + + @Test + public void interpolatesName() throws Exception { + + // given + final String name = simpleObjectWrapped.getName(); + + // when + final String title = container.titleOf(simpleObjectWrapped); + + // then + assertThat(title).isEqualTo("Object: " + name); + } + } +} \ No newline at end of file diff --git a/naked-objects/integtests/src/test/java/domainapp/integtests/tests/modules/simple/SimpleObjectsIntegTest.java b/naked-objects/integtests/src/test/java/domainapp/integtests/tests/modules/simple/SimpleObjectsIntegTest.java new file mode 100644 index 00000000..fd3b0ff4 --- /dev/null +++ b/naked-objects/integtests/src/test/java/domainapp/integtests/tests/modules/simple/SimpleObjectsIntegTest.java @@ -0,0 +1,143 @@ +/* + * 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 domainapp.integtests.tests.modules.simple; + +import java.sql.SQLIntegrityConstraintViolationException; +import java.util.List; + +import javax.inject.Inject; + +import com.google.common.base.Throwables; + +import org.hamcrest.Description; +import org.hamcrest.Matcher; +import org.hamcrest.TypeSafeMatcher; +import org.junit.Test; + +import org.apache.isis.applib.fixturescripts.FixtureScript; +import org.apache.isis.applib.fixturescripts.FixtureScripts; + +import domainapp.dom.modules.simple.SimpleObject; +import domainapp.dom.modules.simple.SimpleObjects; +import domainapp.fixture.modules.simple.SimpleObjectsTearDown; +import domainapp.fixture.scenarios.RecreateSimpleObjects; +import domainapp.integtests.tests.SimpleAppIntegTest; +import static org.assertj.core.api.Assertions.assertThat; + +public class SimpleObjectsIntegTest extends SimpleAppIntegTest { + + @Inject + FixtureScripts fixtureScripts; + @Inject + SimpleObjects simpleObjects; + + public static class ListAll extends SimpleObjectsIntegTest { + + @Test + public void happyCase() throws Exception { + + // given + RecreateSimpleObjects fs = new RecreateSimpleObjects(); + fixtureScripts.runFixtureScript(fs, null); + nextTransaction(); + + // when + final List all = wrap(simpleObjects).listAll(); + + // then + assertThat(all).hasSize(fs.getSimpleObjects().size()); + + SimpleObject simpleObject = wrap(all.get(0)); + assertThat(simpleObject.getName()).isEqualTo(fs.getSimpleObjects().get(0).getName()); + } + + @Test + public void whenNone() throws Exception { + + // given + FixtureScript fs = new SimpleObjectsTearDown(); + fixtureScripts.runFixtureScript(fs, null); + nextTransaction(); + + // when + final List all = wrap(simpleObjects).listAll(); + + // then + assertThat(all).hasSize(0); + } + } + + public static class Create extends SimpleObjectsIntegTest { + + @Test + public void happyCase() throws Exception { + + // given + FixtureScript fs = new SimpleObjectsTearDown(); + fixtureScripts.runFixtureScript(fs, null); + nextTransaction(); + + // when + wrap(simpleObjects).create("Faz"); + + // then + final List all = wrap(simpleObjects).listAll(); + assertThat(all).hasSize(1); + } + + @Test + public void whenAlreadyExists() throws Exception { + + // given + FixtureScript fs = new SimpleObjectsTearDown(); + fixtureScripts.runFixtureScript(fs, null); + nextTransaction(); + wrap(simpleObjects).create("Faz"); + nextTransaction(); + + // then + expectedExceptions.expectCause(causalChainContains(SQLIntegrityConstraintViolationException.class)); + + // when + wrap(simpleObjects).create("Faz"); + nextTransaction(); + } + + private static Matcher causalChainContains(final Class cls) { + return new TypeSafeMatcher() { + @Override + protected boolean matchesSafely(Throwable item) { + final List causalChain = Throwables.getCausalChain(item); + for (Throwable throwable : causalChain) { + if(cls.isAssignableFrom(throwable.getClass())){ + return true; + } + } + return false; + } + + @Override + public void describeTo(Description description) { + description.appendText("exception with causal chain containing " + cls.getSimpleName()); + } + }; + } + } + +} \ No newline at end of file diff --git a/naked-objects/pom.xml b/naked-objects/pom.xml new file mode 100644 index 00000000..700d487e --- /dev/null +++ b/naked-objects/pom.xml @@ -0,0 +1,400 @@ + + + 4.0.0 + + java-design-patterns + com.iluwatar + 1.1.0 + + + com.iluwatar + naked-objects + 1.0-SNAPSHOT + + Simple App + + pom + + + 3.0.4 + + + + 1.9.0-SNAPSHOT + + UTF-8 + UTF-8 + 2.0.0 + + + + + apache.snapshots + Apache Snapshots + https://repository.apache.org/content/repositories/snapshots/ + + false + + + + + + Cloudbees snapshots + http://repository-estatio.forge.cloudbees.com/snapshot/ + + + + false + + + + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + 1.3.1 + + + + [3.2.1,) + + + [1.8.0,) + + + All plugin versions must be + defined! + true + true + + + + + + + validate-enforce + validate + + enforce + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.8 + 1.8 + -parameters + + + + source + compile + + + test + test-compile + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.16 + + + **/*Test.java + **/*Test$*.java + **/*Test_*.java + **/*Spec*.java + + + **/Test*.java + **/*ForTesting.java + **/*Abstract*.java + + true + true + ${project.build.directory}/surefire-reports + + + + + org.apache.maven.plugins + maven-surefire-report-plugin + 2.16 + + false + + + + test + + + + + + maven-clean-plugin + 2.5 + + + maven-resources-plugin + 2.6 + + + maven-jar-plugin + 2.4 + + + maven-install-plugin + 2.5.1 + + + maven-deploy-plugin + 2.8.1 + + + maven-site-plugin + 3.3 + + + maven-war-plugin + 2.4 + + + + org.mortbay.jetty + maven-jetty-plugin + 6.1.26 + + + + org.apache.maven.plugins + maven-shade-plugin + 2.2 + + + + org.apache.maven.plugins + maven-antrun-plugin + 1.7 + + + + run + + + + + + + org.simplericity.jettyconsole + jetty-console-maven-plugin + 1.56 + + + + + org.apache.rat + apache-rat-plugin + 0.10 + + true + true + + **/target/** + **/target-ide/** + + **/*.project + **/.classpath + **/.settings/** + **/*.launch + **/ide/eclipse/launch/** + **/ide/intellij/launch/** + src/site/resources/ide/eclipse/** + + **/rebel.xml + **/*.gitignore + **/*.log + **/*.pdn + **/*.svg + **/*.json + **/*.min.js + **/*.js + + **/translations.pot + **/translations*.po + + + + AL2 + Apache License 2.0 + + + Licensed to the Apache Software Foundation (ASF) under one + + + + JQRY + MIT + + + Dual licensed under the MIT or GPL Version 2 licenses. + + + + JMOCK + JMock + + + Copyright (c) 2000-2007, jMock.org + + + + DOCBK + DocBook 4.5 + + + Permission to copy in any form is granted for use + Permission to use, copy, modify and distribute the DocBook DTD + is hereby granted in perpetuity, provided that the above copyright + This is the catalog data file for DocBook XML V4.5. It is provided as + XML Catalog data for DocBook XML V4.5 + DocBook additional general entities V4.5 + XML EXCHANGE TABLE MODEL DECLARATION MODULE + + + + W3C + XHTML + + + Copyright (c) 1998-2002 W3C (MIT, INRIA, Keio), + + + + + + Apache License 2.0 + + + MIT + + + JMock + + + DocBook 4.5 + + + XHTML + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-surefire-report-plugin + + + + + + + + + org.apache.isis.core + isis + ${isis.version} + pom + import + + + + org.apache.isis.viewer + isis-viewer-wicket + ${isis.version} + pom + import + + + + org.assertj + assertj-core + ${assertj-core.version} + + + + + + ${project.groupId} + naked-objects-dom + 1.0-SNAPSHOT + + + ${project.groupId} + naked-objects-fixture + 1.0-SNAPSHOT + + + ${project.groupId} + naked-objects-webapp + 1.0-SNAPSHOT + + + + + + + + + m2e + + + m2e.version + + + + target-ide + + + + + + dom + fixture + integtests + webapp + + \ No newline at end of file diff --git a/naked-objects/webapp/ide/eclipse/launch/.gitignore b/naked-objects/webapp/ide/eclipse/launch/.gitignore new file mode 100644 index 00000000..3d973454 --- /dev/null +++ b/naked-objects/webapp/ide/eclipse/launch/.gitignore @@ -0,0 +1,8 @@ +/SimpleApp-PROTOTYPE-jrebel.launch +/SimpleApp-PROTOTYPE-no-fixtures.launch +/SimpleApp-PROTOTYPE-with-fixtures.launch +/SimpleApp-SERVER-no-fixtures.launch +/SimpleApp-PROTOTYPE-jrebel.launch +/SimpleApp-PROTOTYPE-no-fixtures.launch +/SimpleApp-PROTOTYPE-with-fixtures.launch +/SimpleApp-SERVER-no-fixtures.launch diff --git a/naked-objects/webapp/ide/intellij/launch/README.txt b/naked-objects/webapp/ide/intellij/launch/README.txt new file mode 100644 index 00000000..5f8e5ab8 --- /dev/null +++ b/naked-objects/webapp/ide/intellij/launch/README.txt @@ -0,0 +1,2 @@ +Copy into workspace\.idea\runConfigurations directory, and adjust file paths for Maven tasks. + diff --git a/naked-objects/webapp/ide/intellij/launch/SimpleApp_PROTOTYPE.xml b/naked-objects/webapp/ide/intellij/launch/SimpleApp_PROTOTYPE.xml new file mode 100644 index 00000000..918ea354 --- /dev/null +++ b/naked-objects/webapp/ide/intellij/launch/SimpleApp_PROTOTYPE.xml @@ -0,0 +1,28 @@ + + + + + \ No newline at end of file diff --git a/naked-objects/webapp/ide/intellij/launch/SimpleApp__enhance_only_.xml b/naked-objects/webapp/ide/intellij/launch/SimpleApp__enhance_only_.xml new file mode 100644 index 00000000..31993b50 --- /dev/null +++ b/naked-objects/webapp/ide/intellij/launch/SimpleApp__enhance_only_.xml @@ -0,0 +1,22 @@ + +s + + + \ No newline at end of file diff --git a/naked-objects/webapp/lib/.gitignore b/naked-objects/webapp/lib/.gitignore new file mode 100644 index 00000000..70eee7e4 --- /dev/null +++ b/naked-objects/webapp/lib/.gitignore @@ -0,0 +1,5 @@ +# +# explicitly ignoring Microsoft JDBC4 jar +# (cannot redistribute, licensing) +# +sqljdbc4.jar diff --git a/naked-objects/webapp/pom.xml b/naked-objects/webapp/pom.xml new file mode 100644 index 00000000..1d2aa322 --- /dev/null +++ b/naked-objects/webapp/pom.xml @@ -0,0 +1,352 @@ + + + 4.0.0 + + + com.iluwatar + naked-objects + 1.0-SNAPSHOT + + + naked-objects-webapp + Simple App Webapp + + This module runs both the Wicket viewer and the Restfulobjects viewer in a single webapp configured to run using the datanucleus object store. + + war + + + .. + + + + + + org.mortbay.jetty + maven-jetty-plugin + + + + + org.simplericity.jettyconsole + jetty-console-maven-plugin + + + + createconsole + + + ${basedir}/src/main/jettyconsole/isis-banner.png + ${project.build.directory}/${project.build.finalName}-jetty-console.jar + + package + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 1.8 + + + validate + + maven-version + + + + + + + maven-war-plugin + + simpleapp + + + false + + + ${maven.build.timestamp} + ${agent.name} + ${user.name} + Maven ${maven.version} + ${java.version} + ${os.name} + ${project.version} + + + WEB-INF/lib/isis-core-webserver*.jar, + WEB-INF/lib/javax.servlet-api-*.jar, + WEB-INF/lib/javax.websocket-api-*.jar, + WEB-INF/lib/jetty-all-*.jar + + + + + + + + + org.eclipse.m2e + lifecycle-mapping + 1.0.0 + + + + + + org.codehaus.mojo + build-helper-maven-plugin + [1.5,) + + maven-version + + + + + + + + + + + + + + + + + + + ${project.groupId} + naked-objects-dom + + + + org.datanucleus + datanucleus-enhancer + + + + + ${project.groupId} + naked-objects-fixture + + + + org.datanucleus + datanucleus-enhancer + + + + + + + org.apache.isis.viewer + isis-viewer-wicket-impl + + + org.apache.isis.core + isis-core-viewer-restfulobjects-server + + + org.apache.isis.core + isis-core-security-shiro + + + + + + org.apache.isis.core + isis-core-runtime + + + org.apache.isis.core + isis-core-wrapper + + + org.apache.isis.core + isis-core-security + + + + + + org.apache.isis.core + isis-core-webserver + runtime + true + + + + + org.apache.geronimo.specs + geronimo-servlet_3.0_spec + + + + + org.hsqldb + hsqldb + + + + + + + + + org.lazyluke + log4jdbc-remix + + + org.slf4j + slf4j-api + + + + + + + + + self-host + + + + + org.apache.maven.plugins + maven-antrun-plugin + + + + + + + + + + + + + + intellij + + + idea.version + + + + + org.apache.geronimo.specs + geronimo-servlet_3.0_spec + + compile + + + + + jrebel + + + target + dom.simple,org.apache.isis.objectstore.jdo.applib + warn + + + + + + org.apache.maven.plugins + maven-antrun-plugin + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/naked-objects/webapp/src/main/java/domainapp/webapp/SimpleApplication.java b/naked-objects/webapp/src/main/java/domainapp/webapp/SimpleApplication.java new file mode 100644 index 00000000..57d1e0ba --- /dev/null +++ b/naked-objects/webapp/src/main/java/domainapp/webapp/SimpleApplication.java @@ -0,0 +1,153 @@ +/* + * 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 domainapp.webapp; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.Charset; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import com.google.common.base.Joiner; +import com.google.common.io.Resources; +import com.google.inject.AbstractModule; +import com.google.inject.Module; +import com.google.inject.name.Names; +import com.google.inject.util.Modules; +import com.google.inject.util.Providers; + +import org.apache.wicket.Session; +import org.apache.wicket.request.IRequestParameters; +import org.apache.wicket.request.Request; +import org.apache.wicket.request.Response; +import org.apache.wicket.request.http.WebRequest; + +import org.apache.isis.viewer.wicket.viewer.IsisWicketApplication; +import org.apache.isis.viewer.wicket.viewer.integration.wicket.AuthenticatedWebSessionForIsis; + +import de.agilecoders.wicket.core.Bootstrap; +import de.agilecoders.wicket.core.settings.IBootstrapSettings; +import de.agilecoders.wicket.themes.markup.html.bootswatch.BootswatchTheme; +import de.agilecoders.wicket.themes.markup.html.bootswatch.BootswatchThemeProvider; + + +/** + * As specified in web.xml. + * + *

+ * See: + *

+ * <filter>
+ *   <filter-name>wicket</filter-name>
+ *    <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
+ *    <init-param>
+ *      <param-name>applicationClassName</param-name>
+ *      <param-value>webapp.SimpleApplication</param-value>
+ *    </init-param>
+ * </filter>
+ * 
+ * + */ +public class SimpleApplication extends IsisWicketApplication { + + private static final long serialVersionUID = 1L; + + /** + * uncomment for a (slightly hacky) way of allowing logins using query args, eg: + * + * ?user=sven&pass=pass + * + *

+ * for demos only, obvious. + */ + private final static boolean DEMO_MODE_USING_CREDENTIALS_AS_QUERYARGS = false; + + + @Override + protected void init() { + super.init(); + + IBootstrapSettings settings = Bootstrap.getSettings(); + settings.setThemeProvider(new BootswatchThemeProvider(BootswatchTheme.Flatly)); + } + + @Override + public Session newSession(final Request request, final Response response) { + if(!DEMO_MODE_USING_CREDENTIALS_AS_QUERYARGS) { + return super.newSession(request, response); + } + + // else demo mode + final AuthenticatedWebSessionForIsis s = (AuthenticatedWebSessionForIsis) super.newSession(request, response); + IRequestParameters requestParameters = request.getRequestParameters(); + final org.apache.wicket.util.string.StringValue user = requestParameters.getParameterValue("user"); + final org.apache.wicket.util.string.StringValue password = requestParameters.getParameterValue("pass"); + s.signIn(user.toString(), password.toString()); + return s; + } + + @Override + public WebRequest newWebRequest(HttpServletRequest servletRequest, String filterPath) { + if(!DEMO_MODE_USING_CREDENTIALS_AS_QUERYARGS) { + return super.newWebRequest(servletRequest, filterPath); + } + + // else demo mode + try { + String uname = servletRequest.getParameter("user"); + if (uname != null) { + servletRequest.getSession().invalidate(); + } + } catch (Exception e) { + } + WebRequest request = super.newWebRequest(servletRequest, filterPath); + return request; + } + + @Override + protected Module newIsisWicketModule() { + final Module isisDefaults = super.newIsisWicketModule(); + + final Module overrides = new AbstractModule() { + @Override + protected void configure() { + bind(String.class).annotatedWith(Names.named("applicationName")).toInstance("Simple App"); + bind(String.class).annotatedWith(Names.named("applicationCss")).toInstance("css/application.css"); + bind(String.class).annotatedWith(Names.named("applicationJs")).toInstance("scripts/application.js"); + bind(String.class).annotatedWith(Names.named("welcomeMessage")).toInstance(readLines(getClass(), "welcome.html")); + bind(String.class).annotatedWith(Names.named("aboutMessage")).toInstance("Simple App"); + bind(InputStream.class).annotatedWith(Names.named("metaInfManifest")).toProvider(Providers.of(getServletContext().getResourceAsStream("/META-INF/MANIFEST.MF"))); + } + }; + + return Modules.override(isisDefaults).with(overrides); + } + + private static String readLines(final Class contextClass, final String resourceName) { + try { + List readLines = Resources.readLines(Resources.getResource(contextClass, resourceName), Charset.defaultCharset()); + final String aboutText = Joiner.on("\n").join(readLines); + return aboutText; + } catch (IOException e) { + return "This is a simple app"; + } + } + +} diff --git a/naked-objects/webapp/src/main/jettyconsole/isis-banner.pdn b/naked-objects/webapp/src/main/jettyconsole/isis-banner.pdn new file mode 100644 index 0000000000000000000000000000000000000000..37543c93c333124664a254bbd5bb13846195959a GIT binary patch literal 69658 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%0Ac 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 z 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 literal 0 HcmV?d00001 diff --git a/naked-objects/webapp/src/main/jettyconsole/isis-banner.png b/naked-objects/webapp/src/main/jettyconsole/isis-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..cd9ecfe02a1f78352a0fb42d056430178a53ea3f GIT binary patch literal 30776 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 + +

+ Apache Isis™ is a platform to let you rapidly develop + domain-driven apps in Java. +
+
+ This app has been generated using Apache Isis' + SimpleApp archetype, + to create a purposefully minimal application that nevertheless includes fixture data, integration tests and BDD specs. +
+
+ The app itself consists of a single domain class, SimpleObject, + along with an equally simple (factory/repository) domain service, SimpleObjects. +
+
+ For more details, see the Apache Isis website. +

diff --git a/naked-objects/webapp/src/main/webapp/WEB-INF/isis.properties b/naked-objects/webapp/src/main/webapp/WEB-INF/isis.properties new file mode 100644 index 00000000..929d1775 --- /dev/null +++ b/naked-objects/webapp/src/main/webapp/WEB-INF/isis.properties @@ -0,0 +1,300 @@ +# 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. + + +################################################################################# +# +# specify system components. +# +# The values correspond to the named components in the installer-registry.properties file +# in the org.apache.isis.core:isis-core-runtime JAR (in the org.apache.isis.core.runtime package) +# +# Although all configuration could reside in isis.properties, the recommendation is +# to split out into component specific files: +# +# xxx_yyy.properties files +# +# where +# * xxx is the component type, and +# * yyy is the component name. +# +# For example, viewer_wicket.properties holds configuration information specific to the Wicket viewer. +# +################################################################################# + + +# +# configure the persistor (object store) to use +# + +# JDO/DataNucleus objectstore +isis.persistor=datanucleus + + + +# +# configure authentication mechanism to use (to logon to the system) +# + +#isis.authentication=bypass +isis.authentication=shiro + + +# +# configure authorization mechanism to use +# + +#isis.authorization=bypass +isis.authorization=shiro + + + + + +################################################################################# +# +# MetaModel +# +# The metamodel typically does not require additional configuration, although +# the system components (defined above) may refine the metamodel for their needs. +# +################################################################################# + + +# +# Additional programming model facet factories, or remove standard facet factories. +# Comma separated list of fully qualified class names. +# +#isis.reflector.facets.include= +#isis.reflector.facets.exclude= + + +# +# Metamodel validation (in addition to that automatically performed by the programming model facet factories) +# Default implementation does nothing. +# +# Use a custom implementation to enforce additional constraints specific to your app/project/company. +# +#isis.reflector.validator=org.apache.isis.core.metamodel.metamodelvalidator.dflt.MetaModelValidatorDefault + + + +# +# Whether to allow deprecated annotations/method prefixes (otherwise raise metamodel validation errors). +# If not specified, default is to allow. +# +isis.reflector.validator.allowDeprecated=false + + + +# +# Implementation to use for reading dynamic layout. Default implementation reads Xxx.layout.json files from classpath. +# +#isis.reflector.layoutMetadataReaders=org.apache.isis.core.metamodel.layoutmetadata.json.LayoutMetadataReaderFromJson + + + +# +# patterns for applying CssClassFa facet (font-awesome icons), matching on action names +# +isis.reflector.facet.cssClassFa.patterns=\ + new.*:fa-plus,\ + add.*:fa-plus-square,\ + create.*:fa-plus,\ + update.*:fa-edit,\ + change.*:fa-edit,\ + remove.*:fa-minus-square,\ + move.*:fa-exchange,\ + first.*:fa-star,\ + find.*:fa-search,\ + lookup.*:fa-search,\ + clear.*:fa-remove,\ + previous.*:fa-step-backward,\ + next.*:fa-step-forward,\ + list.*:fa-list, \ + all.*:fa-list, \ + download.*:fa-download, \ + upload.*:fa-upload, \ + execute.*:fa-bolt, \ + run.*:fa-bolt, \ + calculate.*:fa-calculator, \ + verify.*:fa-check-circle, \ + refresh.*:fa-refresh, \ + install.*:fa-wrench + + +# +# patterns for applying CssClass facet (CSS styles), matching on member names +# +isis.reflector.facet.cssClass.patterns=\ + delete.*:btn-warning + + +################################################################################# +# +# Value facet defaults +# +# (see also viewer-specific config files, eg viewer_wicket.properties) +# +################################################################################# + +# as used by @Title of a date +isis.value.format.date=dd-MM-yyyy + + + +################################################################################# +# +# Application Services and fixtures +# +################################################################################# + +# +# Specify the domain services. +# +# These are the most important configuration properties in the system, as they define +# the set of the classes for Isis to instantiate as domain service singletons. +# From these domain service instances the rest of the metamodel is discovered, while the +# end-user gains access to other domain objects by invoking the actions of the domain services. +# +isis.services-installer=configuration-and-annotation +isis.services.ServicesInstallerFromAnnotation.packagePrefix=domainapp + +# additional services/overriding default (@DomainService) implementations +isis.services = + + + +# Specify the (optional) test fixtures +# +# Fixtures are used to seed the object store with an initial set of data. For the +# in-memory object store, the fixtures are installed on every run. For other +# object stores, they are used only when the object store is first initialized. +# +isis.fixtures=domainapp.fixture.scenarios.RecreateSimpleObjects + + +# +# required by EmailServiceDefault +# +#isis.service.email.sender.address=some.valid@email.address +#isis.service.email.sender.password=the.password.for-isis.notification.email.sender.address + + + +# +# whether ExceptionRecognizers should also log any recognized exceptions +# (default false; enable for diagnostics/debugging) +# +#isis.services.exceprecog.logRecognizedExceptions=true + + +# +# disable to (automatically registered) ExceptionRecognizerCompositeForJdoObjectStore service +# almost all of this service should be registered. Since all exception recognizer implementations +# are consulted in the event of an exception, it's not sufficient to override the implementation +# (in isis.services); instead this configuration property disables this particular implementation. +# +#isis.services.ExceptionRecognizerCompositeForJdoObjectStore.disable=true + + +################################################################################ +# +# Auditing, Publishing, Command +# +################################################################################ + +# +# Whether changes to objects should be audited; if not set, defaults to "none" +# - if not set or set to "none", can explicitly enable using @DomainObject(auditing=Auditing.ENABLED) +# - if set to "all", can explicitly disable using @Object(auditing=Auditing.DISABLED) +# +#isis.services.audit.objects=all|none + +# +# Whether changes to objects should be published; if not set, defaults to "none" +# - if not set or set to "none", can explicitly enable using @DomainObject(publishing=Publishing.ENABLED) +# - if set to "all", can explicitly disable using @Object(publishing=Publishing.DISABLED) +# +#isis.services.publish.objects=all|none + +# +# Whether all (or all non-query only) actions should be published; if not set, defaults to "none" +# - if not set or set to "none", can explicitly enable using @Action(publishing=Publishing.ENABLED) +# - if set to "all", can explicitly disable using @Action(publishing=Publishing.DISABLED) +# +#isis.services.publish.actions=all|none|ignoreQueryOnly + + +# +# Whether all (or all non-query only) actions should be reified as commands; if not set, defaults to "none" +# - if not set or set to "none", can explicitly enable using @Action(command=CommandReification.ENABLED) +# - if set to "all", can explicitly disable using @Action(command=CommandReification.DISABLED) +# +#isis.services.command.actions=all|none|ignoreQueryOnly + + + + + +################################################################################ +# +# Policies +# +################################################################################# + +# +# Whether editing of object properties is allowed; if not set, defaults to "true" +# - if not set or set to "true", can explicitly disable using @DomainObject(editing=Editing.DISABLED) +# - if set to "false", can explicitly enable using @DomainObject(editing=Editing.ENABLED) +# +#isis.objects.editing=true|false + + + + + +################################################################################ +# +# i18n +# +################################################################################# + +# +# force read translations, even if running in prototype mode +# +#isis.services.translation.po.mode=read + + + + + +################################################################################ +# +# Viewer defaults +# +################################################################################# + +# +# Specify viewer defaults +# +#isis.viewers.paged.standalone=30 +#isis.viewers.paged.parented=10 + + +#isis.viewers.propertyLayout.labelPosition=LEFT +#isis.viewers.parameterLayout.labelPosition=LEFT diff --git a/naked-objects/webapp/src/main/webapp/WEB-INF/logging.properties b/naked-objects/webapp/src/main/webapp/WEB-INF/logging.properties new file mode 100644 index 00000000..62fd8ea5 --- /dev/null +++ b/naked-objects/webapp/src/main/webapp/WEB-INF/logging.properties @@ -0,0 +1,187 @@ +# 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. + + +# +# Isis uses log4j is used to provide system logging +# +log4j.rootCategory=INFO, Console +#log4j.rootCategory=DEBUG, Console + + +# The console appender +log4j.appender.Console=org.apache.log4j.ConsoleAppender +log4j.appender.Console.target=System.out +log4j.appender.Console.layout=org.apache.log4j.PatternLayout +log4j.appender.Console.layout.ConversionPattern=%d{ABSOLUTE} [%-20c{1} %-10t %-5p] %m%n + + +# The stderr appender +log4j.appender.Stderr=org.apache.log4j.ConsoleAppender +log4j.appender.Stderr.target=System.err +log4j.appender.Stderr.layout=org.apache.log4j.PatternLayout +log4j.appender.Stderr.layout.ConversionPattern=%d{ABSOLUTE} [%-20c{1} %-10t %-5p] %m%n + + +# other appenders +log4j.appender.File=org.apache.log4j.RollingFileAppender +log4j.appender.File.file=isis.log +log4j.appender.File.append=false +log4j.appender.File.layout=org.apache.log4j.PatternLayout +log4j.appender.File.layout.ConversionPattern=%d [%-20c{1} %-10t %-5p] %m%n + +log4j.appender.sql=org.apache.log4j.FileAppender +log4j.appender.sql.File=./logs/sql.log +log4j.appender.sql.Append=false +log4j.appender.sql.layout=org.apache.log4j.PatternLayout +log4j.appender.sql.layout.ConversionPattern=-----> %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n%n + +log4j.appender.sqltiming=org.apache.log4j.FileAppender +log4j.appender.sqltiming.File=./logs/sqltiming.log +log4j.appender.sqltiming.Append=false +log4j.appender.sqltiming.layout=org.apache.log4j.PatternLayout +log4j.appender.sqltiming.layout.ConversionPattern=-----> %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n%n + +log4j.appender.jdbc=org.apache.log4j.FileAppender +log4j.appender.jdbc.File=./logs/jdbc.log +log4j.appender.jdbc.Append=false +log4j.appender.jdbc.layout=org.apache.log4j.PatternLayout +log4j.appender.jdbc.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %m%n + +log4j.appender.connection=org.apache.log4j.FileAppender +log4j.appender.connection.File=./logs/connection.log +log4j.appender.connection.Append=false +log4j.appender.connection.layout=org.apache.log4j.PatternLayout +log4j.appender.connection.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %m%n + + + + +! turn on the internal log4j debugging flag so we can see what it is doing +#log4j.debug=true + + +# DataNucleus +# the first two log the DML and DDL (if set to DEBUG) +log4j.logger.DataNucleus.Datastore.Native=WARN, Console +log4j.logger.DataNucleus.Datastore.Schema=DEBUG, Console +# the remainder can probably be left to WARN +log4j.logger.DataNucleus.Persistence=WARN, Console +log4j.logger.DataNucleus.Transaction=WARN, Console +log4j.logger.DataNucleus.Connection=WARN, Console +log4j.logger.DataNucleus.Query=WARN, Console +log4j.logger.DataNucleus.Cache=WARN, Console +log4j.logger.DataNucleus.MetaData=WARN, Console +log4j.logger.DataNucleus.Datastore=WARN, Console +log4j.logger.DataNucleus.Datastore.Persist=WARN, Console +log4j.logger.DataNucleus.Datastore.Retrieve=WARN, Console +log4j.logger.DataNucleus.General=WARN, Console +log4j.logger.DataNucleus.Lifecycle=WARN, Console +log4j.logger.DataNucleus.ValueGeneration=WARN, Console +log4j.logger.DataNucleus.Enhancer=WARN, Console +log4j.logger.DataNucleus.SchemaTool=ERROR, Console +log4j.logger.DataNucleus.JDO=WARN, Console +log4j.logger.DataNucleus.JPA=ERROR, Console +log4j.logger.DataNucleus.JCA=WARN, Console +log4j.logger.DataNucleus.IDE=ERROR, Console + +log4j.additivity.DataNucleus.Datastore.Native=false +log4j.additivity.DataNucleus.Datastore.Schema=false +log4j.additivity.DataNucleus.Datastore.Persistence=false +log4j.additivity.DataNucleus.Datastore.Transaction=false +log4j.additivity.DataNucleus.Datastore.Connection=false +log4j.additivity.DataNucleus.Datastore.Query=false +log4j.additivity.DataNucleus.Datastore.Cache=false +log4j.additivity.DataNucleus.Datastore.MetaData=false +log4j.additivity.DataNucleus.Datastore.Datastore=false +log4j.additivity.DataNucleus.Datastore.Datastore.Persist=false +log4j.additivity.DataNucleus.Datastore.Datastore.Retrieve=false +log4j.additivity.DataNucleus.Datastore.General=false +log4j.additivity.DataNucleus.Datastore.Lifecycle=false +log4j.additivity.DataNucleus.Datastore.ValueGeneration=false +log4j.additivity.DataNucleus.Datastore.Enhancer=false +log4j.additivity.DataNucleus.Datastore.SchemaTool=false +log4j.additivity.DataNucleus.Datastore.JDO=false +log4j.additivity.DataNucleus.Datastore.JPA=false +log4j.additivity.DataNucleus.Datastore.JCA=false +log4j.additivity.DataNucleus.Datastore.IDE=false + + +# if using log4jdbc-remix as JDBC driver +#log4j.logger.jdbc.sqlonly=DEBUG, sql, Console +#log4j.additivity.jdbc.sqlonly=false +#log4j.logger.jdbc.resultsettable=DEBUG, jdbc, Console +#log4j.additivity.jdbc.resultsettable=false + +#log4j.logger.jdbc.audit=WARN,jdbc, Console +#log4j.additivity.jdbc.audit=false +#log4j.logger.jdbc.resultset=WARN,jdbc +#log4j.additivity.jdbc.resultset=false +#log4j.logger.jdbc.sqltiming=WARN,sqltiming +#log4j.additivity.jdbc.sqltiming=false +#log4j.logger.jdbc.connection=FATAL,connection +#log4j.additivity.jdbc.connection=false + + + +# track Isis/JDO lifecycle integration + +#log4j.logger.org.apache.isis.runtimes.dflt.objectstores.jdo.datanucleus.persistence.FrameworkSynchronizer=DEBUG, Console +#log4j.additivity.org.apache.isis.runtimes.dflt.objectstores.jdo.datanucleus.persistence.FrameworkSynchronizer=false + +#log4j.logger.org.apache.isis.objectstore.jdo.datanucleus.persistence.IsisLifecycleListener=DEBUG,Console +#log4j.additivity.org.apache.isis.objectstore.jdo.datanucleus.persistence.IsisLifecycleListener=false + + + + +# track Isis/Wicket lifecycle integration + +#log4j.logger.org.apache.isis.viewer.wicket.viewer.integration.wicket.WebRequestCycleForIsis=DEBUG, Console +#log4j.additivity.org.apache.isis.viewer.wicket.viewer.integration.wicket.WebRequestCycleForIsis=false + +#log4j.logger.org.apache.isis.viewer.wicket.viewer.integration.isis.IsisContextForWicket=INFO,Console +#log4j.additivity.org.apache.isis.viewer.wicket.viewer.integration.isis.IsisContextForWicket=false + + + + +# quieten some of the noisier classes in Isis' bootstrapping +log4j.logger.org.apache.isis.core.metamodel.specloader.specimpl.FacetedMethodsBuilder=WARN,Console +log4j.additivity.org.apache.isis.core.metamodel.specloader.specimpl.FacetedMethodsBuilder=false + +log4j.logger.org.apache.isis.core.metamodel.specloader.ServiceInitializer=WARN,Console +log4j.additivity.org.apache.isis.core.metamodel.specloader.ServiceInitializer=false + +log4j.logger.org.apache.isis.core.runtime.services.ServicesInstallerFromConfiguration=WARN,Console +log4j.additivity.org.apache.isis.core.runtime.services.ServicesInstallerFromConfiguration=false + +log4j.logger.org.apache.isis.core.commons.config.IsisConfigurationDefault=WARN,Console +log4j.additivity.org.apache.isis.core.commons.config.IsisConfigurationDefault=false + +log4j.logger.org.apache.isis.core.runtime.installers.InstallerLookupDefault=WARN,Console +log4j.additivity.org.apache.isis.core.runtime.installers.InstallerLookupDefault=false + + +# quieten Shiro +log4j.logger.org.apache.shiro.realm.AuthorizingRealm=WARN,Console +log4j.additivity.log4j.logger.org.apache.shiro.realm.AuthorizingRealm=false + + +# Application-specific logging +log4j.logger.dom.simple.SimpleObject=DEBUG, Stderr +log4j.additivity.dom.simple.SimpleObject=false \ No newline at end of file diff --git a/naked-objects/webapp/src/main/webapp/WEB-INF/persistor.properties b/naked-objects/webapp/src/main/webapp/WEB-INF/persistor.properties new file mode 100644 index 00000000..c73af73c --- /dev/null +++ b/naked-objects/webapp/src/main/webapp/WEB-INF/persistor.properties @@ -0,0 +1,128 @@ +# 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. + + + +################################################################################# +# +# Persistor +# +################################################################################# + + + +# generally speaking this should not be enabled +isis.persistor.disableConcurrencyChecking=false + + + + +################################################################################# +# +# JDBC configuration +# +################################################################################# + +# +# configuration file holding the JDO objectstore's JDBC configuration +# (this is a bit of a hack... just exploiting fact that Isis also loads this file) +# + + +# +# JDBC connection details +# (also update the pom.xml to reference the appropriate JDBC driver) +# + +# +# HSQLDB in-memory +# +isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=org.hsqldb.jdbcDriver +isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:hsqldb:mem:test +isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=sa +isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword= + +# +# HSQLDB in-memory (using log4jdbc-remix) +# +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=net.sf.log4jdbc.DriverSpy +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:log4jdbc:hsqldb:mem:test +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=sa +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword= + + + +# +# HSQLDB to file +# +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=org.hsqldb.jdbcDriver +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:hsqldb:file:/tmp/isis-simple-app/hsql-db;hsqldb.write_delay=false;shutdown=true +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=sa +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword= + +# +# HSQLDB to file (using log4jdbc-remix) +# +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=net.sf.log4jdbc.DriverSpy +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:log4jdbc:hsqldb:file:/tmp/isis-simple-app/hsql-db;hsqldb.write_delay=false;shutdown=true +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=sa +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword= + + + +# +# PostgreSQL Server +# +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=org.postgresql.Driver +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:postgresql://localhost:5432/isis +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=isis +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=isis + +# +# PostgreSQL Server (using log4jdbc-remix) +# +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=net.sf.log4jdbc.DriverSpy +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:log4jdbc:postgresql://localhost:5432/isis +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=isis +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=isis + + + +# +# MS SQL Server +# +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=com.microsoft.sqlserver.jdbc.SQLServerDriver +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:sqlserver://127.0.0.1:1433;instance=.;databaseName=simple +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=sa +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=p4ssword + +# +# MS SQL Server (using log4jdbc-remix) +# +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName=net.sf.log4jdbc.DriverSpy +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=jdbc:log4jdbc:sqlserver://127.0.0.1:1433;instance=SQLEXPRESS;databaseName=jdo +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName=jdo +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword=jdopass + + + +# +# neo4j +# (experimental; run with -P neo4j profile in webapp project) +# +#isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL=neo4j:neo4j_DB + diff --git a/naked-objects/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties b/naked-objects/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties new file mode 100644 index 00000000..675ced3b --- /dev/null +++ b/naked-objects/webapp/src/main/webapp/WEB-INF/persistor_datanucleus.properties @@ -0,0 +1,93 @@ +# 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. + +# +# configuration file for the JDO/DataNucleus objectstore +# + +# identifies @PersistenceCapable entities to be eagerly registered +# if move class to other package (eg com.mycompany.myapp.dom) then update +isis.persistor.datanucleus.RegisterEntities.packagePrefix=domainapp.dom.modules + +# +# hook to perform additional initialization when JDO class metadata is loaded +# default implementation will attempt to run 'create schema' for the specified schema. +# +#isis.persistor.datanucleus.classMetadataLoadedListener=org.apache.isis.objectstore.jdo.datanucleus.CreateSchemaFromClassMetadata + + +# whether to persist the event data as a "clob" or as a "zipped" byte[] +# default is "zipped" +#isis.persistor.datanucleus.PublishingService.serializedForm=zipped + + +##################################################################### +# +# DataNucleus' configuration +# +# The 'isis.persistor.datanucleus.impl' prefix is stripped off, +# remainder is passed through to DataNucleus +# +##################################################################### + +isis.persistor.datanucleus.impl.datanucleus.schema.autoCreateAll=true +isis.persistor.datanucleus.impl.datanucleus.schema.validateTables=true +isis.persistor.datanucleus.impl.datanucleus.schema.validateConstraints=true + + +# +# Require explicit persistence (since entities are Comparable and using ObjectContracts#compareTo). +# see http://www.datanucleus.org/products/accessplatform_3_0/jdo/transaction_types.html +# +isis.persistor.datanucleus.impl.datanucleus.persistenceByReachabilityAtCommit=false + + +# +# How column names are identified +# (http://www.datanucleus.org/products/datanucleus/jdo/orm/datastore_identifiers.html) +# +isis.persistor.datanucleus.impl.datanucleus.identifier.case=MixedCase + +# +# L2 cache +# off except if explicitly marked as cacheable +# http://www.datanucleus.org/products/datanucleus/jdo/cache.html +# +isis.persistor.datanucleus.impl.datanucleus.cache.level2.type=none +isis.persistor.datanucleus.impl.datanucleus.cache.level2.mode=ENABLE_SELECTIVE + + + +# +# uncomment to use JNDI rather than direct JDBC +# +#isis.persistor.datanucleus.impl.datanucleus.ConnectionFactoryName=java:comp/env/jdbc/quickstart + +# +# uncomment to use JTA resource +# +#isis.persistor.datanucleus.impl.datanucleus.ConnectionFactory2Name=java:comp/env/jdbc/quickstart-nontx +#isis.persistor.datanucleus.impl.javax.jdo.option.TransactionType=JTA + + + +# +# +# JDBC connection details +# ... are in persistor.properties +# +# diff --git a/naked-objects/webapp/src/main/webapp/WEB-INF/shiro.ini b/naked-objects/webapp/src/main/webapp/WEB-INF/shiro.ini new file mode 100644 index 00000000..971ae697 --- /dev/null +++ b/naked-objects/webapp/src/main/webapp/WEB-INF/shiro.ini @@ -0,0 +1,93 @@ +# +# 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. +# + +[main] + +contextFactory = org.apache.isis.security.shiro.IsisLdapContextFactory +contextFactory.url = ldap://localhost:10389 +contextFactory.authenticationMechanism = CRAM-MD5 +contextFactory.systemAuthenticationMechanism = simple +contextFactory.systemUsername = uid=admin,ou=system +contextFactory.systemPassword = secret + +ldapRealm = org.apache.isis.security.shiro.IsisLdapRealm +ldapRealm.contextFactory = $contextFactory + +ldapRealm.searchBase = ou=groups,o=mojo +ldapRealm.groupObjectClass = groupOfUniqueNames +ldapRealm.uniqueMemberAttribute = uniqueMember +ldapRealm.uniqueMemberAttributeValueTemplate = uid={0} + +# optional mapping from physical groups to logical application roles +#ldapRealm.rolesByGroup = \ +# LDN_USERS: user_role,\ +# NYK_USERS: user_role,\ +# HKG_USERS: user_role,\ +# GLOBAL_ADMIN: admin_role,\ +# DEMOS: self-install_role + +ldapRealm.permissionsByRole=\ + user_role = *:ToDoItemsJdo:*:*,\ + *:ToDoItem:*:*; \ + self-install_role = *:ToDoItemsFixturesService:install:* ; \ + admin_role = * + +# to use ldap... +# (see docs for details of how to setup users/groups in Apache Directory Studio). +#securityManager.realms = $ldapRealm + +# to use .ini file +securityManager.realms = $iniRealm + + + +# ----------------------------------------------------------------------------- +# Users and their assigned roles +# +# Each line conforms to the format defined in the +# org.apache.shiro.realm.text.TextConfigurationRealm#setUserDefinitions JavaDoc +# ----------------------------------------------------------------------------- + +[users] +# user = password, role1, role2, role3, ... + + +sven = pass, admin_role +dick = pass, user_role, self-install_role +bob = pass, user_role, self-install_role +joe = pass, user_role, self-install_role +guest = guest, user_role + + + +# ----------------------------------------------------------------------------- +# Roles with assigned permissions +# +# Each line conforms to the format defined in the +# org.apache.shiro.realm.text.TextConfigurationRealm#setRoleDefinitions JavaDoc +# ----------------------------------------------------------------------------- + +[roles] +# role = perm1, perm2, perm3, ... +# perm in format: packageName:className:memberName:r,w + +user_role = *:SimpleObjects:*:*,\ + *:SimpleObject:*:* +self-install_role = *:DomainAppFixtureService:*:* +admin_role = * diff --git a/naked-objects/webapp/src/main/webapp/WEB-INF/translations-en.po b/naked-objects/webapp/src/main/webapp/WEB-INF/translations-en.po new file mode 100644 index 00000000..47b82d11 --- /dev/null +++ b/naked-objects/webapp/src/main/webapp/WEB-INF/translations-en.po @@ -0,0 +1,213 @@ +############################################################################## +# +# .pot file +# +# Translate this file to each required language and place in WEB-INF, eg: +# +# /WEB-INF/translations-en_US.po +# /WEB-INF/translations-en.po +# /WEB-INF/translations-fr_FR.po +# /WEB-INF/translations-fr.po +# /WEB-INF/translations.po +# +# If the app uses TranslatableString (eg for internationalized validation +# messages), or if the app calls the TranslationService directly, then ensure +# that all text to be translated has been captured by running a full +# integration test suite that exercises all relevant behaviour +# +############################################################################## + +#: org.apache.isis.core.runtime.services.i18n.po.TranslationServicePoMenu#downloadTranslations(java.lang.String) +msgid ".pot file name" +msgstr ".pot file name" + + +#: org.apache.isis.core.runtime.services.i18n.po.TranslationServicePoMenu#resetTranslationCache() +msgid "Clear translation cache" +msgstr "Clear translation cache" + + +#: domainapp.dom.modules.simple.SimpleObjects#create() +msgid "Create" +msgstr "Create" + + +#: org.apache.isis.applib.fixturescripts.FixtureScript#discoverable +msgid "Discoverable" +msgstr "Discoverable" + + +#: org.apache.isis.applib.fixtures.FixtureType#DOMAIN_OBJECTS +msgid "Domain Objects" +msgstr "Domain Objects" + + +#: org.apache.isis.core.runtime.services.i18n.po.TranslationServicePoMenu#downloadTranslations() +msgid "Download Translations" +msgstr "Download Translations" + + +#: domainapp.dom.modules.simple.SimpleObject#updateName() +msgid "Exclamation mark is not allowed" +msgstr "Exclamation mark is not allowed" + + +#: domainapp.dom.modules.simple.SimpleObjects#findByName() +msgid "Find By Name" +msgstr "Find By Name" + + +#: org.apache.isis.applib.fixturescripts.FixtureResult#fixtureScriptClassName +msgid "Fixture script" +msgstr "Fixture script" + + +#: org.apache.isis.applib.fixturescripts.FixtureScript#friendlyName +msgid "Friendly Name" +msgstr "Friendly Name" + + +#: domainapp.dom.modules.simple.SimpleObject +msgid "General" +msgstr "General" + + +#: domainapp.dom.app.homepage.HomePageService#homePage() +msgid "Home Page" +msgstr "Home Page" + + +#: domainapp.dom.modules.simple.SimpleObjects#listAll() +msgid "List All" +msgstr "List All" + + +#: org.apache.isis.applib.fixturescripts.FixtureScript#localName +msgid "Local Name" +msgstr "Local Name" + + +#: org.apache.isis.applib.fixturescripts.FixtureScript#lookup() +#: org.apache.isis.applib.services.bookmark.BookmarkHolderActionContributions#lookup() +msgid "Lookup" +msgstr "Lookup" + + +#: domainapp.dom.modules.simple.SimpleObject#name +#: domainapp.dom.modules.simple.SimpleObjects#create(java.lang.String) +#: domainapp.dom.modules.simple.SimpleObjects#findByName(java.lang.String) +msgid "Name" +msgstr "Name" + + +#: domainapp.dom.modules.simple.SimpleObject#updateName(java.lang.String) +msgid "New name" +msgstr "New name" + + +#: org.apache.isis.applib.services.bookmark.BookmarkHolderAssociationContributions#object() +msgid "Object" +msgstr "Object" + + +#: domainapp.dom.modules.simple.SimpleObject#title() +msgid "Object: {name}" +msgstr "Object: {name}" + + +#: domainapp.dom.app.homepage.HomePageViewModel#objects +msgid "Objects" +msgstr "Objects" + + +#: org.apache.isis.applib.fixtures.FixtureType#OTHER +msgid "Other" +msgstr "Other" + + +#: domainapp.fixture.DomainAppFixturesService#runFixtureScript(org.apache.isis.applib.fixturescripts.FixtureScript,java.lang.String) +#: org.apache.isis.applib.fixturescripts.FixtureScripts#runFixtureScript(org.apache.isis.applib.fixturescripts.FixtureScript,java.lang.String) +msgid "Parameters" +msgstr "Parameters" + + +#: domainapp.fixture.DomainAppFixturesService +#: org.apache.isis.core.runtime.services.i18n.po.TranslationServicePoMenu +msgid "Prototyping" +msgstr "Prototyping" + + +#: domainapp.fixture.DomainAppFixturesService#recreateObjectsAndReturnFirst() +msgid "Recreate Objects And Return First" +msgstr "Recreate Objects And Return First" + + +#: org.apache.isis.applib.fixturescripts.FixtureResult#object +msgid "Result" +msgstr "Result" + + +#: org.apache.isis.applib.fixturescripts.FixtureResult#className +msgid "Result class" +msgstr "Result class" + + +#: org.apache.isis.applib.fixturescripts.FixtureResult#key +msgid "Result key" +msgstr "Result key" + + +#: domainapp.fixture.DomainAppFixturesService#runFixtureScript() +#: org.apache.isis.applib.fixturescripts.FixtureScripts#runFixtureScript() +msgid "Run Fixture Script" +msgstr "Run Fixture Script" + + +#: org.apache.isis.applib.fixturescripts.FixtureScript +msgid "Script" +msgstr "Script" + + +#: domainapp.fixture.DomainAppFixturesService#runFixtureScript(org.apache.isis.applib.fixturescripts.FixtureScript,java.lang.String) +#: org.apache.isis.applib.fixturescripts.FixtureScripts#runFixtureScript(org.apache.isis.applib.fixturescripts.FixtureScript,java.lang.String) +msgid "Script-specific parameters (if any). The format depends on the script implementation (eg key=value, CSV, JSON, XML etc)" +msgstr "Script-specific parameters (if any). The format depends on the script implementation (eg key=value, CSV, JSON, XML etc)" + + +#: domainapp.dom.modules.simple.SimpleObjects#title() +msgid "Simple Objects" +msgstr "Simple Objects" + + +#: org.apache.isis.core.runtime.services.i18n.po.TranslationServicePoMenu#switchToReadingTranslations() +msgid "Switch To Reading Translations" +msgstr "Switch To Reading Translations" + + +#: org.apache.isis.core.runtime.services.i18n.po.TranslationServicePoMenu#switchToWritingTranslations() +msgid "Switch To Writing Translations" +msgstr "Switch To Writing Translations" + + +#: org.apache.isis.applib.fixturescripts.FixtureScript#type +msgid "Type" +msgstr "Type" + + +#: domainapp.dom.modules.simple.SimpleObject#updateName() +msgid "Update Name" +msgstr "Update Name" + + +#: domainapp.dom.modules.simple.SimpleObject +msgid "name" +msgstr "" + + + + + +############################################################################## +# end of .pot file +############################################################################## + diff --git a/naked-objects/webapp/src/main/webapp/WEB-INF/translations-es.po b/naked-objects/webapp/src/main/webapp/WEB-INF/translations-es.po new file mode 100644 index 00000000..8b4c2d7b --- /dev/null +++ b/naked-objects/webapp/src/main/webapp/WEB-INF/translations-es.po @@ -0,0 +1,208 @@ +############################################################################## +# +# .pot file +# +# Translate this file to each required language and place in WEB-INF, eg: +# +# /WEB-INF/translations-en_US.po +# /WEB-INF/translations-en.po +# /WEB-INF/translations-fr_FR.po +# /WEB-INF/translations-fr.po +# /WEB-INF/translations.po +# +# If the app uses TranslatableString (eg for internationalized validation +# messages), or if the app calls the TranslationService directly, then ensure +# that all text to be translated has been captured by running a full +# integration test suite that exercises all relevant behaviour +# +############################################################################## + +#: org.apache.isis.core.runtime.services.i18n.po.TranslationServicePoMenu#downloadTranslations(java.lang.String) +msgid ".pot file name" +msgstr "fichero .pot" + + +#: org.apache.isis.core.runtime.services.i18n.po.TranslationServicePoMenu#resetTranslationCache() +msgid "Clear translation cache" +msgstr "Limpiar la caché de traducciones" + + +#: domainapp.dom.modules.simple.SimpleObjects#create() +msgid "Create" +msgstr "Crear" + + +#: org.apache.isis.applib.fixturescripts.FixtureScript#discoverable +msgid "Discoverable" +msgstr "Descubrible" + + +#: org.apache.isis.applib.fixtures.FixtureType#DOMAIN_OBJECTS +msgid "Domain Objects" +msgstr "Domain Objects" + + +#: org.apache.isis.core.runtime.services.i18n.po.TranslationServicePoMenu#downloadTranslations() +msgid "Download Translations" +msgstr "Descargar traducciones" + + +#: domainapp.dom.modules.simple.SimpleObject#updateName() +msgid "Exclamation mark is not allowed" +msgstr "No se admite el signo de exclamación" + + +#: domainapp.dom.modules.simple.SimpleObjects#findByName() +msgid "Find By Name" +msgstr "Buscar por Nombre" + + +#: org.apache.isis.applib.fixturescripts.FixtureResult#fixtureScriptClassName +msgid "Fixture script" +msgstr "Script de Instalación" + + +#: org.apache.isis.applib.fixturescripts.FixtureScript#friendlyName +msgid "Friendly Name" +msgstr "Nombre común" + + +#: domainapp.dom.app.homepage.HomePageService#homePage() +msgid "Home Page" +msgstr "Página de Inicio" + + +#: domainapp.dom.modules.simple.SimpleObjects#listAll() +msgid "List All" +msgstr "Listar Todos" + + +#: org.apache.isis.applib.fixturescripts.FixtureScript#localName +msgid "Local Name" +msgstr "Nombre Local" + + +#: org.apache.isis.applib.fixturescripts.FixtureScript#lookup() +#: org.apache.isis.applib.services.bookmark.BookmarkHolderActionContributions#lookup() +msgid "Lookup" +msgstr "Buscar" + + +#: domainapp.dom.modules.simple.SimpleObject#name +#: domainapp.dom.modules.simple.SimpleObjects#create(java.lang.String) +#: domainapp.dom.modules.simple.SimpleObjects#findByName(java.lang.String) +msgid "Name" +msgstr "Nombre" + + +#: domainapp.dom.modules.simple.SimpleObject#updateName(java.lang.String) +msgid "New name" +msgstr "Nuevo nombre" + + +#: org.apache.isis.applib.services.bookmark.BookmarkHolderAssociationContributions#object() +msgid "Object" +msgstr "Objeto" + + +#: domainapp.dom.modules.simple.SimpleObject#title() +msgid "Object: {name}" +msgstr "Objeto: {name}" + + +#: domainapp.dom.app.homepage.HomePageViewModel#objects +msgid "Objects" +msgstr "Objetos" + + +#: org.apache.isis.applib.fixtures.FixtureType#OTHER +msgid "Other" +msgstr "Other" + + +#: domainapp.fixture.DomainAppFixturesService#runFixtureScript(org.apache.isis.applib.fixturescripts.FixtureScript,java.lang.String) +#: org.apache.isis.applib.fixturescripts.FixtureScripts#runFixtureScript(org.apache.isis.applib.fixturescripts.FixtureScript,java.lang.String) +msgid "Parameters" +msgstr "Parámetros" + + +#: domainapp.fixture.DomainAppFixturesService +#: org.apache.isis.core.runtime.services.i18n.po.TranslationServicePoMenu +msgid "Prototyping" +msgstr "Prototipo" + + +#: domainapp.fixture.DomainAppFixturesService#recreateObjectsAndReturnFirst() +msgid "Recreate Objects And Return First" +msgstr "Recrear Objetos y Devolver el Primero" + + +#: org.apache.isis.applib.fixturescripts.FixtureResult#object +msgid "Result" +msgstr "Resultado" + + +#: org.apache.isis.applib.fixturescripts.FixtureResult#className +msgid "Result class" +msgstr "Clase del resultado" + + +#: org.apache.isis.applib.fixturescripts.FixtureResult#key +msgid "Result key" +msgstr "Clave del Resultado" + + +#: domainapp.fixture.DomainAppFixturesService#runFixtureScript() +#: org.apache.isis.applib.fixturescripts.FixtureScripts#runFixtureScript() +msgid "Run Fixture Script" +msgstr "Ejecutar Script de Instalación" + + +#: org.apache.isis.applib.fixturescripts.FixtureScript +msgid "Script" +msgstr "Script" + + +#: domainapp.fixture.DomainAppFixturesService#runFixtureScript(org.apache.isis.applib.fixturescripts.FixtureScript,java.lang.String) +#: org.apache.isis.applib.fixturescripts.FixtureScripts#runFixtureScript(org.apache.isis.applib.fixturescripts.FixtureScript,java.lang.String) +msgid "Script-specific parameters (if any). The format depends on the script implementation (eg key=value, CSV, JSON, XML etc)" +msgstr "Parámetros específicos del Script (si hay alguno). El formato depende de la implementación del script (por ejemplo, clave=valor, CSV, JSON, XML, etc.)" + + +#: domainapp.dom.modules.simple.SimpleObjects#title() +msgid "Simple Objects" +msgstr "Objetos básicos" + + +#: org.apache.isis.core.runtime.services.i18n.po.TranslationServicePoMenu#switchToReadingTranslations() +msgid "Switch To Reading Translations" +msgstr "Cambiar a Lectura de Traducciones" + + +#: org.apache.isis.core.runtime.services.i18n.po.TranslationServicePoMenu#switchToWritingTranslations() +msgid "Switch To Writing Translations" +msgstr "Cambiar a Escritura de Traducciones" + + +#: org.apache.isis.applib.fixturescripts.FixtureScript#type +msgid "Type" +msgstr "Tipo" + + +#: domainapp.dom.modules.simple.SimpleObject#updateName() +msgid "Update Name" +msgstr "Nombre de la Actualización" + + +#: domainapp.dom.modules.simple.SimpleObject +msgid "name" +msgstr "" + + + + + +############################################################################## +# end of .pot file +############################################################################## + diff --git a/naked-objects/webapp/src/main/webapp/WEB-INF/translations-nl.po b/naked-objects/webapp/src/main/webapp/WEB-INF/translations-nl.po new file mode 100644 index 00000000..4e35a228 --- /dev/null +++ b/naked-objects/webapp/src/main/webapp/WEB-INF/translations-nl.po @@ -0,0 +1,208 @@ +############################################################################## +# +# .pot file +# +# Translate this file to each required language and place in WEB-INF, eg: +# +# /WEB-INF/translations-en_US.po +# /WEB-INF/translations-en.po +# /WEB-INF/translations-fr_FR.po +# /WEB-INF/translations-fr.po +# /WEB-INF/translations.po +# +# If the app uses TranslatableString (eg for internationalized validation +# messages), or if the app calls the TranslationService directly, then ensure +# that all text to be translated has been captured by running a full +# integration test suite that exercises all relevant behaviour +# +############################################################################## + +#: org.apache.isis.core.runtime.services.i18n.po.TranslationServicePoMenu#downloadTranslations(java.lang.String) +msgid ".pot file name" +msgstr "" + + +#: org.apache.isis.core.runtime.services.i18n.po.TranslationServicePoMenu#resetTranslationCache() +msgid "Clear translation cache" +msgstr "" + + +#: domainapp.dom.modules.simple.SimpleObjects#create() +msgid "Create" +msgstr "Creëren" + + +#: org.apache.isis.applib.fixturescripts.FixtureScript#discoverable +msgid "Discoverable" +msgstr "Discoverable" + + +#: org.apache.isis.applib.fixtures.FixtureType#DOMAIN_OBJECTS +msgid "Domain Objects" +msgstr "Domain Objects" + + +#: org.apache.isis.core.runtime.services.i18n.po.TranslationServicePoMenu#downloadTranslations() +msgid "Download Translations" +msgstr "" + + +#: domainapp.dom.modules.simple.SimpleObject#updateName() +msgid "Exclamation mark is not allowed" +msgstr "" + + +#: domainapp.dom.modules.simple.SimpleObjects#findByName() +msgid "Find By Name" +msgstr "Zoek op Naam" + + +#: org.apache.isis.applib.fixturescripts.FixtureResult#fixtureScriptClassName +msgid "Fixture script" +msgstr "" + + +#: org.apache.isis.applib.fixturescripts.FixtureScript#friendlyName +msgid "Friendly Name" +msgstr "" + + +#: domainapp.dom.app.homepage.HomePageService#homePage() +msgid "Home Page" +msgstr "" + + +#: domainapp.dom.modules.simple.SimpleObjects#listAll() +msgid "List All" +msgstr "Lijst Alle" + + +#: org.apache.isis.applib.fixturescripts.FixtureScript#localName +msgid "Local Name" +msgstr "" + + +#: org.apache.isis.applib.fixturescripts.FixtureScript#lookup() +#: org.apache.isis.applib.services.bookmark.BookmarkHolderActionContributions#lookup() +msgid "Lookup" +msgstr "" + + +#: domainapp.dom.modules.simple.SimpleObject#name +#: domainapp.dom.modules.simple.SimpleObjects#create(java.lang.String) +#: domainapp.dom.modules.simple.SimpleObjects#findByName(java.lang.String) +msgid "Name" +msgstr "Naam" + + +#: domainapp.dom.modules.simple.SimpleObject#updateName(java.lang.String) +msgid "New name" +msgstr "Nieuwe naam" + + +#: org.apache.isis.applib.services.bookmark.BookmarkHolderAssociationContributions#object() +msgid "Object" +msgstr "" + + +#: domainapp.dom.modules.simple.SimpleObject#title() +msgid "Object: {name}" +msgstr "" + + +#: domainapp.dom.app.homepage.HomePageViewModel#objects +msgid "Objects" +msgstr "Objects" + + +#: org.apache.isis.applib.fixtures.FixtureType#OTHER +msgid "Other" +msgstr "Other" + + +#: domainapp.fixture.DomainAppFixturesService#runFixtureScript(org.apache.isis.applib.fixturescripts.FixtureScript,java.lang.String) +#: org.apache.isis.applib.fixturescripts.FixtureScripts#runFixtureScript(org.apache.isis.applib.fixturescripts.FixtureScript,java.lang.String) +msgid "Parameters" +msgstr "" + + +#: domainapp.fixture.DomainAppFixturesService +#: org.apache.isis.core.runtime.services.i18n.po.TranslationServicePoMenu +msgid "Prototyping" +msgstr "" + + +#: domainapp.fixture.DomainAppFixturesService#recreateObjectsAndReturnFirst() +msgid "Recreate Objects And Return First" +msgstr "" + + +#: org.apache.isis.applib.fixturescripts.FixtureResult#object +msgid "Result" +msgstr "" + + +#: org.apache.isis.applib.fixturescripts.FixtureResult#className +msgid "Result class" +msgstr "" + + +#: org.apache.isis.applib.fixturescripts.FixtureResult#key +msgid "Result key" +msgstr "" + + +#: domainapp.fixture.DomainAppFixturesService#runFixtureScript() +#: org.apache.isis.applib.fixturescripts.FixtureScripts#runFixtureScript() +msgid "Run Fixture Script" +msgstr "" + + +#: org.apache.isis.applib.fixturescripts.FixtureScript +msgid "Script" +msgstr "" + + +#: domainapp.fixture.DomainAppFixturesService#runFixtureScript(org.apache.isis.applib.fixturescripts.FixtureScript,java.lang.String) +#: org.apache.isis.applib.fixturescripts.FixtureScripts#runFixtureScript(org.apache.isis.applib.fixturescripts.FixtureScript,java.lang.String) +msgid "Script-specific parameters (if any). The format depends on the script implementation (eg key=value, CSV, JSON, XML etc)" +msgstr "" + + +#: domainapp.dom.modules.simple.SimpleObjects#title() +msgid "Simple Objects" +msgstr "Eenvoudige Objecten" + + +#: org.apache.isis.core.runtime.services.i18n.po.TranslationServicePoMenu#switchToReadingTranslations() +msgid "Switch To Reading Translations" +msgstr "" + + +#: org.apache.isis.core.runtime.services.i18n.po.TranslationServicePoMenu#switchToWritingTranslations() +msgid "Switch To Writing Translations" +msgstr "" + + +#: org.apache.isis.applib.fixturescripts.FixtureScript#type +msgid "Type" +msgstr "" + + +#: domainapp.dom.modules.simple.SimpleObject#updateName() +msgid "Update Name" +msgstr "Updaten Naam" + + +#: domainapp.dom.modules.simple.SimpleObject +msgid "name" +msgstr "" + + + + + +############################################################################## +# end of .pot file +############################################################################## + diff --git a/naked-objects/webapp/src/main/webapp/WEB-INF/translations.po b/naked-objects/webapp/src/main/webapp/WEB-INF/translations.po new file mode 100644 index 00000000..3644a288 --- /dev/null +++ b/naked-objects/webapp/src/main/webapp/WEB-INF/translations.po @@ -0,0 +1,213 @@ +############################################################################## +# +# .pot file +# +# Translate this file to each required language and place in WEB-INF, eg: +# +# /WEB-INF/translations-en_US.po +# /WEB-INF/translations-en.po +# /WEB-INF/translations-fr_FR.po +# /WEB-INF/translations-fr.po +# /WEB-INF/translations.po +# +# If the app uses TranslatableString (eg for internationalized validation +# messages), or if the app calls the TranslationService directly, then ensure +# that all text to be translated has been captured by running a full +# integration test suite that exercises all relevant behaviour +# +############################################################################## + +#: org.apache.isis.core.runtime.services.i18n.po.TranslationServicePoMenu#downloadTranslations(java.lang.String) +msgid ".pot file name" +msgstr "" + + +#: org.apache.isis.core.runtime.services.i18n.po.TranslationServicePoMenu#resetTranslationCache() +msgid "Clear translation cache" +msgstr "" + + +#: domainapp.dom.modules.simple.SimpleObjects#create() +msgid "Create" +msgstr "" + + +#: org.apache.isis.applib.fixturescripts.FixtureScript#discoverable +msgid "Discoverable" +msgstr "" + + +#: org.apache.isis.applib.fixtures.FixtureType#DOMAIN_OBJECTS +msgid "Domain Objects" +msgstr "" + + +#: org.apache.isis.core.runtime.services.i18n.po.TranslationServicePoMenu#downloadTranslations() +msgid "Download Translations" +msgstr "" + + +#: domainapp.dom.modules.simple.SimpleObject#updateName() +msgid "Exclamation mark is not allowed" +msgstr "" + + +#: domainapp.dom.modules.simple.SimpleObjects#findByName() +msgid "Find By Name" +msgstr "" + + +#: org.apache.isis.applib.fixturescripts.FixtureResult#fixtureScriptClassName +msgid "Fixture script" +msgstr "" + + +#: org.apache.isis.applib.fixturescripts.FixtureScript#friendlyName +msgid "Friendly Name" +msgstr "" + + +#: domainapp.dom.modules.simple.SimpleObject +msgid "General" +msgstr "Common" + + +#: domainapp.dom.app.homepage.HomePageService#homePage() +msgid "Home Page" +msgstr "" + + +#: domainapp.dom.modules.simple.SimpleObjects#listAll() +msgid "List All" +msgstr "" + + +#: org.apache.isis.applib.fixturescripts.FixtureScript#localName +msgid "Local Name" +msgstr "" + + +#: org.apache.isis.applib.fixturescripts.FixtureScript#lookup() +#: org.apache.isis.applib.services.bookmark.BookmarkHolderActionContributions#lookup() +msgid "Lookup" +msgstr "" + + +#: domainapp.dom.modules.simple.SimpleObject#name +#: domainapp.dom.modules.simple.SimpleObjects#create(java.lang.String) +#: domainapp.dom.modules.simple.SimpleObjects#findByName(java.lang.String) +msgid "Name" +msgstr "" + + +#: domainapp.dom.modules.simple.SimpleObject#updateName(java.lang.String) +msgid "New name" +msgstr "" + + +#: org.apache.isis.applib.services.bookmark.BookmarkHolderAssociationContributions#object() +msgid "Object" +msgstr "" + + +#: domainapp.dom.modules.simple.SimpleObject#title() +msgid "Object: {name}" +msgstr "" + + +#: domainapp.dom.app.homepage.HomePageViewModel#objects +msgid "Objects" +msgstr "" + + +#: org.apache.isis.applib.fixtures.FixtureType#OTHER +msgid "Other" +msgstr "" + + +#: domainapp.fixture.DomainAppFixturesService#runFixtureScript(org.apache.isis.applib.fixturescripts.FixtureScript,java.lang.String) +#: org.apache.isis.applib.fixturescripts.FixtureScripts#runFixtureScript(org.apache.isis.applib.fixturescripts.FixtureScript,java.lang.String) +msgid "Parameters" +msgstr "" + + +#: domainapp.fixture.DomainAppFixturesService +#: org.apache.isis.core.runtime.services.i18n.po.TranslationServicePoMenu +msgid "Prototyping" +msgstr "" + + +#: domainapp.fixture.DomainAppFixturesService#recreateObjectsAndReturnFirst() +msgid "Recreate Objects And Return First" +msgstr "" + + +#: org.apache.isis.applib.fixturescripts.FixtureResult#object +msgid "Result" +msgstr "" + + +#: org.apache.isis.applib.fixturescripts.FixtureResult#className +msgid "Result class" +msgstr "" + + +#: org.apache.isis.applib.fixturescripts.FixtureResult#key +msgid "Result key" +msgstr "" + + +#: domainapp.fixture.DomainAppFixturesService#runFixtureScript() +#: org.apache.isis.applib.fixturescripts.FixtureScripts#runFixtureScript() +msgid "Run Fixture Script" +msgstr "" + + +#: org.apache.isis.applib.fixturescripts.FixtureScript +msgid "Script" +msgstr "" + + +#: domainapp.fixture.DomainAppFixturesService#runFixtureScript(org.apache.isis.applib.fixturescripts.FixtureScript,java.lang.String) +#: org.apache.isis.applib.fixturescripts.FixtureScripts#runFixtureScript(org.apache.isis.applib.fixturescripts.FixtureScript,java.lang.String) +msgid "Script-specific parameters (if any). The format depends on the script implementation (eg key=value, CSV, JSON, XML etc)" +msgstr "" + + +#: domainapp.dom.modules.simple.SimpleObjects#title() +msgid "Simple Objects" +msgstr "" + + +#: org.apache.isis.core.runtime.services.i18n.po.TranslationServicePoMenu#switchToReadingTranslations() +msgid "Switch To Reading Translations" +msgstr "" + + +#: org.apache.isis.core.runtime.services.i18n.po.TranslationServicePoMenu#switchToWritingTranslations() +msgid "Switch To Writing Translations" +msgstr "" + + +#: org.apache.isis.applib.fixturescripts.FixtureScript#type +msgid "Type" +msgstr "" + + +#: domainapp.dom.modules.simple.SimpleObject#updateName() +msgid "Update Name" +msgstr "" + + +#: domainapp.dom.modules.simple.SimpleObject +msgid "name" +msgstr "" + + + + + +############################################################################## +# end of .pot file +############################################################################## + diff --git a/naked-objects/webapp/src/main/webapp/WEB-INF/viewer_restfulobjects.properties b/naked-objects/webapp/src/main/webapp/WEB-INF/viewer_restfulobjects.properties new file mode 100644 index 00000000..0a85fb68 --- /dev/null +++ b/naked-objects/webapp/src/main/webapp/WEB-INF/viewer_restfulobjects.properties @@ -0,0 +1,66 @@ +# 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. + +# +# configuration file for the Restful Objects viewer +# + +# the baseUrl for hrefs in the events generated by the RO EventSerializer +isis.viewer.restfulobjects.RestfulObjectsSpecEventSerializer.baseUrl=http://localhost:8080/restful/ + +# renders param details in the (incorrect) form that they were for GSOC2013 viewers +# isis.viewer.restfulobjects.gsoc2013.legacyParamDetails=true + +# whether to honor UI hints, in particular Render(EAGERLY). Defaults to false. +#isis.viewer.restfulobjects.honorUiHints=false + + + +############################################################################### +# Non-standard configuration settings. +# +# If enabled of the following are enabled then the viewer is deviating from the +# RO spec standard; compatibility may be compromised with RO clients. +############################################################################### + +# whether to show only object properties for object members +# (on the object representation only) +# Takes precedence over the other 'suppress' below. +#isis.viewer.restfulobjects.objectPropertyValuesOnly=true + +# whether to suppress "describedby" links. Defaults to false. +#isis.viewer.restfulobjects.suppressDescribedByLinks=true + +# whether to suppress "update" links. Defaults to false. +#isis.viewer.restfulobjects.suppressUpdateLink=true + +# whether to suppress "id" json-prop for object members. Defaults to false. +#isis.viewer.restfulobjects.suppressMemberId=true + +# whether to suppress "links" json-prop for object members +# (on the object representation only). Defaults to false. +#isis.viewer.restfulobjects.suppressMemberLinks=true + +# whether to suppress "extensions" json-prop for object members +# (on the object representation only). Defaults to false. +#isis.viewer.restfulobjects.suppressMemberExtensions=true + +# whether to suppress "disabledReason" json-prop for object members +# (on the object representation only). Defaults to false. +#isis.viewer.restfulobjects.suppressMemberDisabledReason=true + +############################################################################### diff --git a/naked-objects/webapp/src/main/webapp/WEB-INF/viewer_wicket.properties b/naked-objects/webapp/src/main/webapp/WEB-INF/viewer_wicket.properties new file mode 100644 index 00000000..ba9eaaff --- /dev/null +++ b/naked-objects/webapp/src/main/webapp/WEB-INF/viewer_wicket.properties @@ -0,0 +1,91 @@ +# 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. + +# +# configuration file for the Wicket viewer +# + +# +# The maximum length of titles to display in standalone or parented tables. +# Titles longer than this length will be truncated with trailing ellipses (...) +# +# For example, if set to 12, the title +# "Buy milk on 15-Feb-13" will be truncated to "Buy milk ..." +# +# If set to 0, then only the icon will be shown. +# +isis.viewer.wicket.maxTitleLengthInStandaloneTables=0 +isis.viewer.wicket.maxTitleLengthInParentedTables=0 + + +#isis.viewer.wicket.datePattern=dd-MM-yyyy +#isis.viewer.wicket.dateTimePattern=dd-MM-yyyy HH:mm +#isis.viewer.wicket.datePickerPattern=DD-MM-YYYY + +#isis.viewer.wicket.datePattern=dd/MM/yy +#isis.viewer.wicket.dateTimePattern=dd/MM/yy HH:mm +#isis.viewer.wicket.datePickerPattern=DD/MM/YY + + +# +# whether to strip wicket tags from markup (default is true, as they may break some CSS rules) +# +#isis.viewer.wicket.stripWicketTags=false + + +# +# whether to suppress the 'rememberMe' checkbox on the login page (default is false) +# +#isis.viewer.wicket.suppressRememberMe=false + +# +# if user attempts to access a protected URL before signing in, then as a convenience the viewer will continue +# through to that destination after successful login. If you consider this to be a security risk then this flag +# disables that behaviour (default is false). +# +#isis.viewer.wicket.clearOriginalDestination=true + + +# +# whether to show action dialogs on their own page rather than as a modal dialog (default is false) +# +#isis.viewer.wicket.disableModalDialogs=false + + +# +# the maximum number of pages to list in bookmark (default is 15) +# +#isis.viewer.wicket.bookmarkedPages.maxSize=15 + + +# +# whether to show the bootstrap theme chooser (defaults false) +# +#isis.viewer.wicket.themes.showChooser=false +isis.viewer.wicket.themes.showChooser=true + +# +# comma-separated list of themes to choose from (default is to show all themes from bootswatch.com). +# +#isis.viewer.wicket.themes.enabled=bootstrap-theme,Cosmo,Flatly,Darkly,Sandstone,United + + + +# +# whether to automatically select dependent choice when the choice it depends upon changes. +# +#isis.viewer.wicket.disableDependentChoiceAutoSelection=false \ No newline at end of file diff --git a/naked-objects/webapp/src/main/webapp/WEB-INF/web.xml b/naked-objects/webapp/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000..bb6098f0 --- /dev/null +++ b/naked-objects/webapp/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,309 @@ + + + + + Simple app + + + about/index.html + + + + + org.apache.shiro.web.env.EnvironmentLoaderListener + + + + ShiroFilter + org.apache.shiro.web.servlet.ShiroFilter + + + + ShiroFilter + /* + + + + + + + + + + + isis.viewers + wicket,restfulobjects + + + + + + + IsisLogOnExceptionFilter + org.apache.isis.core.webapp.diagnostics.IsisLogOnExceptionFilter + + + IsisLogOnExceptionFilter + /wicket/* + + + IsisLogOnExceptionFilter + /restful/* + + + + + + + ResourceCachingFilter + org.apache.isis.core.webapp.content.ResourceCachingFilter + + CacheTime + 86400 + + + + ResourceCachingFilter + *.js + + + ResourceCachingFilter + *.css + + + ResourceCachingFilter + *.png + + + ResourceCachingFilter + *.jpg + + + ResourceCachingFilter + *.gif + + + ResourceCachingFilter + *.html + + + ResourceCachingFilter + *.swf + + + + Resource + org.apache.isis.core.webapp.content.ResourceServlet + + + Resource + *.css + + + Resource + *.png + + + Resource + *.jpg + + + Resource + *.gif + + + Resource + *.js + + + Resource + *.html + + + Resource + *.swf + + + + + + + WicketFilter + org.apache.wicket.protocol.http.WicketFilter + + applicationClassName + domainapp.webapp.SimpleApplication + + + + WicketFilter + /wicket/* + + + + + configuration + + development + + + + + + + + + + org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap + + + + + javax.ws.rs.Application + org.apache.isis.viewer.restfulobjects.server.RestfulObjectsApplication + + + + resteasy.servlet.mapping.prefix + /restful/ + + + + + + IsisSessionFilterForRestfulObjects + org.apache.isis.core.webapp.IsisSessionFilter + + + authenticationSessionStrategy + org.apache.isis.viewer.restfulobjects.server.authentication.AuthenticationSessionStrategyBasicAuth + + + + whenNoSession + basicAuthChallenge + + + + + IsisSessionFilterForRestfulObjects + RestfulObjectsRestEasyDispatcher + + + + IsisTransactionFilterForRestfulObjects + org.apache.isis.viewer.restfulobjects.server.webapp.IsisTransactionFilterForRestfulObjects + + + IsisTransactionFilterForRestfulObjects + RestfulObjectsRestEasyDispatcher + + + + + RestfulObjectsRestEasyDispatcher + org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher + + + RestfulObjectsRestEasyDispatcher + /restful/* + + + + + + + + + + diff --git a/naked-objects/webapp/src/main/webapp/about/images/isis-logo.png b/naked-objects/webapp/src/main/webapp/about/images/isis-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5284fe73242502a9dbefd1f79af51ba36c773ecf GIT binary patch literal 14160 zcma)jWmFtZ(C#koECkoZ3GNbXm*5cGEf82VxC8=(#ogT{XmAPc&JrXL9D=(Aw?HoM zz32Y^zEfwU=JfP*S5;ScSIrZlt}2gnSUmjAp%j&ypIa#@X zGIxam)Xi-j-MLg{wZWeJT!LJ@JUmyf1pt6hx1tPG+spLC58anYKK1!@_4n!OiT@|R zW}jxCtn6Ce1xt0j?PwR2k32$XDifmQDict8^du-8vi(tpN0fqxnVe@md!z~Y_|#o9 z%V1b_n2~EPKrvdpcJ?GUqh+G=bU6EX81n5oB>b;*(r!R1kQ3Putr6#r9hpL00B%P< z#g`9*j6ooLf3TlQMf3j$ikBC4zWaOq{`8H9PEsH``lQJ}7!9@Vs>3+&g#xnodVEM7 z1thM|$G2zlR;DdCdSCzb-|mZP5|u(~L;Zh+#1R2Wv}=Z6w%Xe-o=#{54ZNH$!)Q^# ziMjG&I-iW(ATI>o6LsF5F&aBtdBU{qeV9Z9v`alRT1(9U5-$nMjHaljs74y7rT~R# zs<>cp-6D@+L39Ch>A?VJ^!S>t2Wc*UU%Ktx1hjZ{#e7Hk|0#HwF94r0R#W{0nI`5DbQ8L*ioeSi(6rdeL*wqEp~oV`V( zr+`Q^1+-EB*HQ7Y0B6*AhT&VKydvwO$t$vq_Df>L#hycIV{P&$|5^rd@R2p3rVpLq8t{go}@u4fkb#LN?3Y`EK+?y(3lK20= z1;hy2y_^}MaEZhDqrd|Q7WnL~W6=1|!=SODib|?M3t6EnN#+TXiJXb-9gDny1V)ML zL~l}#+jgC{mTSbx&I1RLFp}k=#6z(Wh+vONg(ZTv`nJ(=BVkt}nMTyaJsE>f`u~aZ z7ZnC6!24g&TRt;a>Vr$6UItS%Zj~P>pf4=pIHvllR%d10W3d8B9%7|?Hg+{Hicl_e zRQtb*Z~;>RwjZwT`Fsue4ZzgXhme|}aGiO&LD%&19?K3owU@VC+% zYXjm2BltenVS=N~LM#pG$?HII?Dh&uq8XQteg>b*GCr((tX|#`G+Id2q67OF2SHTn+gt6@(@JyJi zS>m&k`ckhoR1f;0z{2rtey1-Enb}OGZ%=PG{Y${4M!r2tO3{FA=hdxQYn8j`9OCKGNu?MwPyzDD!1pH!kte$?5#Hpl7CLu_(#E_%?6$ zS(aN|Ro){`o>xCTwgSPzPQR0jL{IAG8Su;!SQ*k%(BbiXkYL^L4FnPlHKDSaqvU2{ zL6ejcCkwHZla#RJV-kC^#9=Qdkd!4{y+#_oO$R7Ph5r3TpH1|O=9ZJJEzo!aFyt73 z1nC<3?mw1-x04{(OWPKn8Q_?X_$(~RzU_JYGwgRhEs+Hx1o}I#v;ZysjG#up&OG(X zPYk#o5B@rh7*j|D((kB%TCGDY(SB`Ad;qLA2p36xU|#vS;HDIPm7B==wsbCKFzNHC zSPuR6$~tSSvwO3749Y_qDF6lOPHYMq;;cG;67h8zKN^{Aj5_jMoKoLGDzCk#fouwu z@+@}a(a9|e+vZU?Um0&5ioG4Oa%eQQgewUD==~|=Do^8GC=l6$FsfUpJQ zM^zVU)v7vhq%_YYv8dI-QeCMd8pSKxz(hl?1`S?`0#66KPNt*?()8(LnCLxO4JxD+ z@d4s64$gID$>*6>g@hkVJLaG1L|3mhM3+0^#>ZL;U3r?&u1u}>l2WbQQpgI{+!a~B zp|3zD8Y3d`b6?{ElnlhOh-J>mSKI*kJTbsX<%%!k%(uUklJ=40iv+g8!=w!(qH8>P=U)r_x}2S#>x<3=JT@W)zD z;}G|`aijM%apVALu;}s=@4c_O%e~9*8Q0IIEUiAbju0^61TRP>nZmRu=+z$c{@Dh% zUt5?ip4pE#Y(psl>(ZH86I1|y#ODnB*4&7cnqjU|;P(2@6F&EwOY(K#l!9R%5WF>q zB!dCY=g`GKJ`4}x@oQeI)IZ3K2H)@NldrUY^val<-rLavq(SBnX1{Oic8?Z6oo%S-$=81{Zr)t_ z7m7^zLvs3I$MJqG@Cz~X)8Qcxt>n=4-?}X^Dzd7>x2i}Z!+FN3bWZaL=H(HIC{qf* z)fWLE{P5^&c=&Kii2g`8Y{xlRG4LvrBIGtuM)9mSg{jpd@T0?Zc=qu_t?}_wy7A#< zi}B%8i?IOoMeV*eE*5^m<(0m-o*tt9Hb#(xjt#p2Gid?zRaYQ*MgPvM1(9>A_ad`O zGRXTHGCfC}r}>p#(g$_WFCqb8GL{nX8l8A-JOpbQZCvM1%ws|5w$R#z-=ioh_&o!% z-EMssACV(#Tg8wQ3J3tH4;qnRw-o6K;;P6^+Nh=ox_z-8Hf2KzCUh}zdeYCt@o{Uu z#*(LxEyhDE&;ev{D6up)<4lYWq>GyTwbXb`jQej5VDV)r1KdpdFZlotUVDvR3Y&tk z?&=DmncIhd=#u{^2O9jJUnQSy@_8{knmsb?W2&R<(@mW{?X-KZNe(VFoi|sTrONw1 z12?h$5sh>?o3Cu3l$kmPgugaAW4#+{82B4Yy+Mc*yvZQmMV}-LQj*8P)wY<)j#2G8Rs?*CLA{ta@ zapt^hcGkQ=$vPyA%J@o0jsd6&`*s6xFxvh1*rnmnjQatyH}-~-$G&&Y_rtDbW( zQYf{)?r!7M(orcOhz9LD5^s7pwann1P#IT6cb z^WeJqsZkj_eBCPTsk3D_4K?3Zy)uN zWF3?dKPTeAOr*f`W-J8h6E;O2N`e}MhJCy6V5ksPnr{=#4ENnu+{<}#eX&Aw46q8a zb}`#TuSa$IovoBpn9@o2TRIh+u*knab=s*%@NS0@i{Rr8XSnydf6JO=0bVr`Eefs> zi+J4Q`enUIlN-4^K%0O_U`pBqMZxOn2NG}h+JxIAf8L(9L7@|7;$^+1p|NdntU#C+mNmRaM88nsOWRyZKl;XK&BdJ_Mw0he?OsKL-+ zC20nUsCMUv4>Xz*6=qC?-PBj+BQ)annIE=WE9JU{-`$XcD+KTGKa7ty{8NufQ_I+- zouqiCJq94qr+0_Ngt13KuM)<_MvX)wn)iO$c)JmOIny=$?O+6ep34Kt;>Prlb9qLv zz>U&;tNJLQ0U5q35I^Nu(u9wPd*e#>b)#>ihhuIN1dQXJK&7EVNR#wO506bUBSV(S zE>EFmB@V9s8ovML@-Vgc%q2f1^5*2}o(A^$w{_k=#a26?HoKaS4~qtuO@-Gl9kj-o zLAQEZmQ_g>#03@0qmqA3)}srp+6PCBP0Shw=xxgPkjFfv91U>>QXWdk4a3{J%B%%^ z;U`=x^2Ws>a}MSf2lQJv-agcH1TmE}PNW-}OhtOnfQxsZL*7dATR*kH7JaRN&r_C? zmLwz1dR?h?mzfk|W0+)G(-q`0po}}!SsZp0fOPYmdOwVqy_4lb()#*geWQbh=u$D< z7mIXu9uQN5ZUq8vE9-+%5+=<;ya2)HAO^e-9v0*PS8mFq%K-9&4r?TZJzP?3l)m0* zQZ%j;>AtT8@2_#Vp7*Sn+MuVyVNg@XBZ-HQ7|I`uZDP~`j=>2U5<}xuiI<#lCi|eNld;69(bUY1!NUru zWo6YvBTjUJuHn=J!UwU=2cR|~#`NKqQ9&zi7A|@Zs|K^%7r~jX*OC5CTsRDX4W;GN zrTi&p*`$L!!4!4w5QxinvV$6)4Vr31I?RGto$Z9f`}%I8lBd+9$DLCI7Jc30^yRf^ za%p!KC994j!$r6cv$nNj9c}kz8oH3|ppInRPLrCxs;(j9Dg@i1+kd^}-OAg+O2eln z=Qi4%jO;(mBd2UvS7%O+OS-IG1!YP3_I?xieM3I0#)%oE+A#0)VFWW$lbIyuD4NIL)?G6p*NEqbTA5MVY^X6SX;nd^N^j?LL=to zF&pQYXZ3daLO$p36b-L`$UEm9R#uJfGMW#`>wva!=P*?Ytnx4=nV>a6l3FSy#4Wr0 z5Zj9Y#3Ok;f<;aFqa-WgmD&_Lo*$M%fguO&L*EHR^|vY-?`7oHpzs92fL9K0dYTC< z@`XW)>_D2*>xOXWoK(7$EMfM_=$a@A$J`C{cUEoCbE)B+0K@iay!(QXePrTt zw&&iiR;njlD6^&9gKS!4f%$bo5^ zlza)(tJWjT0@m;cG68EN&wS%3`+w%hrdC?GJSpMx92{DUJY+SRLZvR9Ez$vh@#Zr` z@(n$VY6kBvf0V^lE2M~pM+(fKM*hoKm5Ul!n)CMU=Ek1P>oOe5^wHAx%@;ca3VRf0 zOK|2|^oqo(&42BuiXQ6xu~~l`mH%t*U0z2Dlp2-l(AsAn;@g`2KK04(`rr$2yC0i& zWZ;(-ATAORXUDg-nwbIM^B$8(n>Csl8~c+W2$L;MbS2!=@e`}fU!gKoaKvNh5LRG@ z8wa7f4mL{H129(gv0fI`*=HF*ieWJc#>ZuG*0ZL+VIS>o@+%!5!ixmCI9|W|3Ul>q znX%JN^WJ&I?8C_{OIN>Iqre1UF^&3&XxuqEBb9ukm3PS@iI-shiWDyxpi1~_ zQY$Vauo7t}5$~xKyZ?xB=uCTo6ROHhiD*Jz-Da9mDQEQshQBY*E{mHhlyFw^9@}H$Hr&#rrKY_W{_VE-8Ec{AMB(?OhnLv>u6x z?$h4D7ZtW_+Pg67{>a#>@vjY=4{+sv@7~vC65fQ zm0F?2b)AE2Fy#jS5yOw-#=jaHRVqkdkA5$Nc^L;svtAUbuxaY=rgG6e9*J}Nl&E1F z0RjNdg_5zSS*g0!I1JyBBXwRmbroo}@36ChbLa7nLRH`aEjMxm4HjE?d z-Bw#)Y_Lh8x4<1hcI1qO(1K3EQck>`V;rT9z9nK68iA8SB2i@iwS1$kdFWR|eUCB4 zHlG_-vvQInOTI3q*X&99%EZePvcdmYtf1b7JL0&*J2qK+`e&3>s64Q#U&Jcl&+V5p zXuH$v?a05&TP2Rk79>d~u?K-18@pfZ$yfSA&^Sq1%>IG8Q!biKLsk}+^FI<^*^oc% zz*^S2$ZpZGz|CFlOtzFP$l`2tyBa!Hr`50dKg|kk(vG?tY;aUOHy}pSe+t43niWLD z^ifxJq@sN_9fR%^0rwM_5FBCFj7Ek=NB9p;0~HcD2~b=}o0a{n^P>JZk6$bs7_1bC znBfXH?)Ad{rm4YSiwN4$zMXmF>{pW5zg_gYC6}~Zjs8NMV1n;r92j85Oud3 zKT(PlKm1r}`ZM>c-Mj2y+HQ?HBfV>mv-w!dw>HY7jExw^>gL%wmEm&BPEqQ$cd*`DZ@SeT5YMwUjm3ucP=HZlN{#WbxtA1 zFLxC(AV5Yxz0Bx$K4@?aS*w$P9pInz`tNM9R@_dO2DrI~Z%eLfI3C+c1-i4B2c8lMRBKnX5Ys1*H?>9CWb{R|4KY+k zhMMi9?}V&ri&YxL30CYueXXlI*n$w%zY;YjT!PXI{oP-;V3lREI|Ry$a{JMV2!0xq z57}h!YFX^oToanp-qpnp=(Rw*(eVLJKON8><||L*Em1L?a*_i#nFWtT)HPz!o<{RL z0}V(V_{{?xC5e05RnrEa!l(|{50K8g9-{gD(K$br^)EHYuwKGz9y&Op$(EfB-C4I_ z0Zlvee$PlR(Prz3oOoVk(;l>51hbcAOQl@V26#YJBv<0z)?oH~boS9@@Ct>l!WXKi zqQ3&WuYIlJ(IH=WI6y6R7&OlBc^?n4EiFxkell4DD2Cer0&m3GmX{>CvJ6QRb~r6y zb`sf#MqSY=(X3oEO2ld2C^)`c$m&J1sS`!8JO9^^Ah0xG!}{~Ak}C$l)qQcg_9bG9 z-kYEEPSFb`J~9aEfaZotHW^5!x2_b?YvRQ2sYZ=bOyC%T3~K-?WRQd+HB_H2a+z4g zz7D#J5u2=H=dZpiIi~^L61k&$^QHOTUwf;BZ;g5VF(Lp7vl$*O2A)+DQ6mV%(@%EZ z_0Bx}Vec|Sdc}!eaWc+b|+LAs%f;tnf{E60t^ak*czIp3o z6ZAGJ=a$NdO|QK>$9BU6V*1JZW!mLVv8QJ>8$6ILAaNsOL9`wbiz24mG+$fIxzT7- zCXX)(z(VG(KcL2GyQ+{nr3PaQTLk;qcsu`uek#;j;##&?&z&U9yfRVSdqRy@lWb?z zO8qYDsYBdSWd}Ah#Wm0+#!Z`zHxRVkg)7yU8WFTqU{OHmETSwyfC1ze%P)A0@Onc$d}o#N#Ae>+goFf?(wFpn3ywR;yz-ka?$c=#hF+8eAB1_N zRK&TeKEu?W1af@5vQX}F906>8_IVg2SEX*(Dm&GOHEdgvk(KSFA<}x-0i&jQ6)Ab5 z8VB@$V5l)~$-6hPOA>dtn~+~YH{QidR7Ak-i$u1PMp1kmCI@43LIoq$+Biv~k(tvqJgn%7Gq z7i%5H+)4^bgD1ukbHos*_BAsV^5=z57i?jBZ#`5R8_9aECZ z^Y>G?z26z{7!IceI0ecF-e-MZWBK7@TbvN48v-TWxg?R*#a=tXvTt3M+%z=|aQA-` zBlxJogz%I2$Jp)5L1E*a%sU)-oA{>XByQQYEGdHI8;;P0=$wNDb6zXLnj<2La+b6lPsIxYvfNc z3bmld(|);w3Z3XPD%yWT2`k^ zOU1sX{{%W~;f)5K2YM~eSh!N0mT#?MjRc&^!b~2?46Z&`{_y28W!8&MA_qhfwG`aQ_+M#tWsaw(vq*abdqWbi?#?gnX#T^WW>;A8|;eZwvakqx$R%1V+e z?{LlmR4(!Nzrnyt(eZ=%f!oki1G9y!3?8BI%RT3}Y?RE{WpG;&7SZt2*X`I*F3giO zWRG@9TWJT9egCdvmRCLZOrmS#e>QNIt{zj7B7OFVpM=+!N85Vqb8;HGM|3@Got>2> z8HBLiTP_bGmBszt?Mjpd&u)fxEZ`MB>Jtl_(<3KA*aA~Wzyt;ho4TB(~HKBi|MUbj#k>gs!XuyIi?vw#7n&=T#4ghk$BMpQ%& z2^!FXAMio>WAev{sEMNSyDrRaZaB|r0y#32Qp{c_EvTlOnPqK}N)@040b)Q8aJf?f#IIIe9Ca_Xjol|3floiP zMXrWvn^dT7GV;rOWx1>W0SDmK5?MoU&dEMLVTZGSt`=G(u|Rj1|M_Imnf5A0Y4SJv zT=Uv&5yF|%g@Lt7q}@JvQsrnI0Q8-9utMj)sUQpg;!r`Qu38Te?$SeB{AAG}xnrQf z+>Mpt*D$PF>7dcnvc#1CsPa$fsQ7XFRlGIvIm~Pd|2O#7NeS{QF6sc8a<2-qCYAgslx%^ z8(UvgD(xsStk100wG!9j;lOgyc}Z zLw;5M6&QI$v+;X{C$8wPD-Y4{9`^bG479WiMuDtVIO>?Xy2wE*VJ6BUTA@=8Lg_n8 zpghgO(Jtfup0a{^XoagzH--`-Uw{Q8{KX0TO1yeHpoSQD{@oNa(JEtVj)#&h>RU)=m=>)@}fy?c;@DjRqyvScUx;L+k+gom@-N62aW>@ zBVfHzvhfs=OFFVKe5$iz6LlvHyoLCD74|O!<_8=}^CF))o|QP)g?2c4+A@(#UE3P` z6gHKl4)3J;iZzD+m0$)^GD})3AbEHjOm!3@jN!@2l_i#%gc{@AsJKIxL8>P=UC3{& zW@N5-3=lb12~RNrf9b+r0$z|p_PZ{2`|1tBDDkV4zmkK-Ge-`n#ayW&JY~jE^$gKL zi58>}Lld7tL0&{QY}i&!e=%iXCptWT9{mGar0cLrQTdh)40VC7=_tl2nynOOgK8i> z72|QY?@A#Bu36qodxu#OfGWsUr}Y?F@Ao0BTpS%0AwvS3t7R5SVwRK)Za~97RViV; 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 + + + + + Apache Isis™ SimpleApp + + + + +
+ Isis Logo + +

+ This app has been generated using Apache Isis' + SimpleApp archetype, + to create a purposefully minimal application that nevertheless includes fixture data, integration tests and BDD specs. +
+
+ The app itself consists of a single domain class, SimpleObject, + along with an equally simple (factory/repository) domain service, SimpleObjects. +

+ +

To access the app:

+
    +
  • +

    + wicket/ +

    +

    + provides accesses to a generic UI for end-users, + Isis' Wicket Viewer. + As its name suggests, this viewer is built on top of Apache Wicket™. +

    +
  • +
  • +

    + + restful/ + +

    +

    + provides access to a RESTful API conformant with the + Restful Objects spec. This is part of Apache Isis Core. The + implementation technology is JBoss RestEasy. +

    +
  • +
+ +

+ The default user/password is sven/pass (as configured in the + shiro.ini file). +

+ +
+ + diff --git a/naked-objects/webapp/src/main/webapp/css/application.css b/naked-objects/webapp/src/main/webapp/css/application.css new file mode 100644 index 00000000..9f1612af --- /dev/null +++ b/naked-objects/webapp/src/main/webapp/css/application.css @@ -0,0 +1,19 @@ +/* + * 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. + */ + diff --git a/naked-objects/webapp/src/main/webapp/images/spinning-icon.gif b/naked-objects/webapp/src/main/webapp/images/spinning-icon.gif new file mode 100644 index 0000000000000000000000000000000000000000..75e3b1e5baa32a169f85a25f2031f3058b834e09 GIT binary patch literal 5266 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 - + 4.0.0 com.iluwatar @@ -66,7 +65,8 @@ private-class-data object-pool dependency-injection - + naked-objects + @@ -119,7 +119,7 @@ - + @@ -164,4 +164,4 @@ - + \ No newline at end of file