You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2019/11/24 08:53:16 UTC
[isis] branch ISIS-2186 created (now 53146aa)
This is an automated email from the ASF dual-hosted git repository.
danhaywood pushed a change to branch ISIS-2186
in repository https://gitbox.apache.org/repos/asf/isis.git.
at 53146aa ISIS-2186: adds fakedata/dom, fixes compile issues
This branch includes the following new commits:
new 5ba581f ISIS-2186: copies in base, excel and fakedata
new ca1ca74 ISIS-2186: excel module now compiles, at least (not yet tested at all).
new 0145c35 ISIS-2186: base module unit tests now pass
new 71cb412 ISIS-2186: removes unused dependencies from base/pom.xml
new 53146aa ISIS-2186: adds fakedata/dom, fixes compile issues
The 5 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
[isis] 04/05: ISIS-2186: removes unused dependencies from
base/pom.xml
Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
danhaywood pushed a commit to branch ISIS-2186
in repository https://gitbox.apache.org/repos/asf/isis.git
commit 71cb4124c5ead446ba806f538dc87f63a3102ba6
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Sun Nov 24 08:50:54 2019 +0000
ISIS-2186: removes unused dependencies from base/pom.xml
---
extensions/lib/base/impl/pom.xml | 60 ----------------------------------------
1 file changed, 60 deletions(-)
diff --git a/extensions/lib/base/impl/pom.xml b/extensions/lib/base/impl/pom.xml
index 64e8056..74a3581 100644
--- a/extensions/lib/base/impl/pom.xml
+++ b/extensions/lib/base/impl/pom.xml
@@ -64,66 +64,6 @@
<scope>test</scope>
</dependency>
- <!--
- <dependency>
- <groupId>org.isisaddons.module.fakedata</groupId>
- <artifactId>isis-module-fakedata-dom</artifactId>
- <scope>test</scope>
- </dependency>
-
- <dependency>
- <groupId>org.apache.isis.core</groupId>
- <artifactId>isis-metamodel</artifactId>
- <scope>test</scope>
- </dependency>
-
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <scope>test</scope>
- </dependency>
-
-
- <dependency>
- <groupId>org.assertj</groupId>
- <artifactId>assertj-core</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>com.danhaywood.java</groupId>
- <artifactId>danhaywood-java-assertjext</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.jmock</groupId>
- <artifactId>jmock</artifactId>
- <scope>test</scope>
- </dependency>
-
- <dependency>
- <groupId>org.jmock</groupId>
- <artifactId>jmock-junit4</artifactId>
- <scope>test</scope>
- <exclusions>
- <exclusion>
- <groupId>junit</groupId>
- <artifactId>junit-dep</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
-
- <dependency>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- <scope>test</scope>
- </dependency>
-
- <dependency>
- <groupId>org.picocontainer</groupId>
- <artifactId>picocontainer</artifactId>
- <scope>test</scope>
- </dependency>
- -->
</dependencies>
[isis] 01/05: ISIS-2186: copies in base, excel and fakedata
Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
danhaywood pushed a commit to branch ISIS-2186
in repository https://gitbox.apache.org/repos/asf/isis.git
commit 5ba581f024d742638c07f0b8d9684fccc752aff6
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Thu Nov 21 15:44:58 2019 +0000
ISIS-2186: copies in base, excel and fakedata
* ported base/impl (but not tests)
* partly ported excel/impl - but incomplete, not yet touched fixtures and integtests
* not yet started fakedata
Haven't changed any of the packages either
---
core/pom.xml | 16 +
extensions/lib/base/impl/pom.xml | 125 +
.../java/org/incode/module/base/dom/Chained.java | 38 +
.../main/java/org/incode/module/base/dom/Dflt.java | 20 +
.../base/dom/IncodeApplicationException.java | 25 +
.../java/org/incode/module/base/dom/PowerType.java | 13 +
.../java/org/incode/module/base/dom/Titled.java | 7 +
.../org/incode/module/base/dom/TitledEnum.java | 11 +
.../module/base/dom/types/DescriptionType.java | 16 +
.../org/incode/module/base/dom/types/FqcnType.java | 15 +
.../incode/module/base/dom/types/MoneyType.java | 15 +
.../org/incode/module/base/dom/types/NameType.java | 15 +
.../incode/module/base/dom/types/NotesType.java | 15 +
.../base/dom/types/ObjectIdentifierType.java | 15 +
.../module/base/dom/types/PercentageType.java | 15 +
.../module/base/dom/types/ProperNameType.java | 15 +
.../module/base/dom/types/ReferenceType.java | 18 +
.../incode/module/base/dom/types/TitleType.java | 15 +
.../module/base/dom/types/UrlTemplateType.java | 15 +
.../incode/module/base/dom/types/UserNameType.java | 15 +
.../org/incode/module/base/dom/types/XxxType.java | 13 +
.../incode/module/base/dom/utils/ClassUtils.java | 21 +
.../module/base/dom/utils/JodaPeriodUtils.java | 69 +
.../incode/module/base/dom/utils/MathUtils.java | 61 +
.../incode/module/base/dom/utils/MessageUtils.java | 24 +
.../incode/module/base/dom/utils/StringUtils.java | 66 +
.../incode/module/base/dom/utils/TitleBuilder.java | 95 +
.../base/dom/valuetypes/AbstractInterval.java | 247 +
.../base/dom/valuetypes/LocalDateInterval.java | 130 +
.../module/base/dom/with/WithCodeComparable.java | 7 +
.../module/base/dom/with/WithCodeGetter.java | 31 +
.../module/base/dom/with/WithCodeUnique.java | 5 +
.../base/dom/with/WithDescriptionComparable.java | 8 +
.../base/dom/with/WithDescriptionGetter.java | 32 +
.../base/dom/with/WithDescriptionUnique.java | 5 +
.../incode/module/base/dom/with/WithInterval.java | 133 +
.../base/dom/with/WithIntervalContiguous.java | 268 +
.../module/base/dom/with/WithIntervalMutable.java | 70 +
.../module/base/dom/with/WithNameComparable.java | 8 +
.../module/base/dom/with/WithNameGetter.java | 32 +
.../module/base/dom/with/WithNameUnique.java | 5 +
.../base/dom/with/WithReferenceComparable.java | 8 +
.../module/base/dom/with/WithReferenceGetter.java | 33 +
.../module/base/dom/with/WithReferenceUnique.java | 5 +
.../incode/module/base/dom/with/WithSequence.java | 9 +
.../incode/module/base/dom/with/WithStartDate.java | 13 +
.../module/base/dom/with/WithTitleComparable.java | 7 +
.../module/base/dom/with/WithTitleGetter.java | 32 +
.../module/base/dom/with/WithTitleUnique.java | 5 +
.../java/org/incode/module/base/integtests/VT.java | 134 +
.../module/base/services/BaseServicesModule.java | 4 +
.../base/services/calendar/CalendarService.java | 67 +
.../org/incode/module/base/IsisMatchers.java | 336 +
.../base/dom/IncodeApplicationExceptionTest.java | 17 +
.../base/dom/testing/PrivateConstructorTester.java | 18 +
.../TitledEnumContractTestAbstract_title.java | 33 +
.../base/dom/titled/TitledEnumContractTester.java | 33 +
.../module/base/dom/utils/ClassUtilsTest.java | 55 +
.../module/base/dom/utils/JodaPeriodUtilsTest.java | 51 +
.../module/base/dom/utils/MathUtilsTest.java | 60 +
.../module/base/dom/utils/MessageUtils_Test.java | 59 +
.../module/base/dom/utils/StringUtilsTest.java | 135 +
.../module/base/dom/utils/TitleBuilderTest.java | 32 +
.../base/dom/valuetypes/LocalDateIntervalTest.java | 222 +
...arableByCodeContractTestAbstract_compareTo.java | 49 +
.../dom/with/ComparableByCodeContractTester.java | 59 +
...yDescriptionContractTestAbstract_compareTo.java | 49 +
.../ComparableByDescriptionContractTester.java | 63 +
...arableByNameContractTestAbstract_compareTo.java | 49 +
.../dom/with/ComparableByNameContractTester.java | 64 +
...eByReferenceContractTestAbstract_compareTo.java | 49 +
.../with/ComparableByReferenceContractTester.java | 64 +
...rableByTitleContractTestAbstract_compareTo.java | 49 +
.../dom/with/ComparableByTitleContractTester.java | 64 +
.../dom/with/InstantiatorForComparableByCode.java | 24 +
.../InstantiatorForComparableByDescription.java | 25 +
.../dom/with/InstantiatorForComparableByName.java | 24 +
.../with/InstantiatorForComparableByReference.java | 25 +
.../dom/with/InstantiatorForWithStartDate.java | 26 +
...lperClassesContractTest_privateConstructor.java | 21 +
.../WithFieldUniqueContractTestAllAbstract.java | 81 +
...valMutableContractTestAbstract_changeDates.java | 66 +
.../CalendarServiceTest_beginningOfMonth.java | 63 +
.../CalendarServiceTest_beginningOfQuarter.java | 75 +
.../TitledEnumContractTestAbstract_title.java | 18 +
.../dom/titled/TitledEnumContractTester.java | 20 +
...arableByCodeContractTestAbstract_compareTo.java | 26 +
.../dom/with/ComparableByCodeContractTester.java | 16 +
...yDescriptionContractTestAbstract_compareTo.java | 26 +
.../ComparableByDescriptionContractTester.java | 17 +
...arableByNameContractTestAbstract_compareTo.java | 26 +
.../dom/with/ComparableByNameContractTester.java | 17 +
...eByReferenceContractTestAbstract_compareTo.java | 26 +
.../with/ComparableByReferenceContractTester.java | 17 +
...rableByTitleContractTestAbstract_compareTo.java | 26 +
.../dom/with/ComparableByTitleContractTester.java | 17 +
.../dom/with/InstantiatorForComparableByCode.java | 16 +
.../InstantiatorForComparableByDescription.java | 17 +
.../dom/with/InstantiatorForComparableByName.java | 16 +
.../with/InstantiatorForComparableByReference.java | 17 +
.../dom/with/InstantiatorForWithStartDate.java | 16 +
.../WithFieldUniqueContractTestAllAbstract.java | 18 +
...valMutableContractTestAbstract_changeDates.java | 13 +
extensions/lib/excel/fixture/.gitignore | 5 +
.../excel/fixture/logging-dn-enhance.properties | 24 +
extensions/lib/excel/fixture/pom.xml | 246 +
.../fixture/src/main/java/META-INF/persistence.xml | 8 +
.../module/excel/fixture/ExcelFixturesModule.java | 29 +
.../contributions/ExcelDemoToDoItem_export.java | 52 +
.../contributions/ExcelDemoToDoItem_export2.java | 65 +
.../BulkUpdateLineItemForDemoToDoItem.java | 267 +
.../BulkUpdateLineItemForDemoToDoItem.layout.xml | 28 +
.../BulkUpdateManagerForDemoToDoItem.java | 195 +
.../BulkUpdateManagerForDemoToDoItem.layout.xml | 38 +
.../bulkupdate/BulkUpdateMenuForDemoToDoItem.java | 142 +
.../pivot/ExcelPivotByCategoryAndSubcategory.java | 45 +
.../ExcelPivotByCategoryAndSubcategoryMenu.java | 72 +
.../demotodoitem/DemoToDoItemRowHandler.java | 84 +
.../demotodoitem/DemoToDoItemRowHandler2.java | 62 +
.../ExcelUploadRowHandler4ToDoItem.java | 66 +
.../ExcelUploadServiceForDemoToDoItem.java | 47 +
.../DemoFixture_extending_ExcelFixture2.java | 48 +
.../DemoToDoItem_create_usingExcelFixture.java | 73 +
.../DemoToDoItem_recreate_usingExcelFixture.java | 30 +
.../demomodule/fixturescripts/MoreToDoItems.xlsx | Bin 0 -> 10530 bytes
.../demomodule/fixturescripts/ToDoItems.xlsx | Bin 0 -> 10465 bytes
.../fixture/demoapp/todomodule/dom/Category.java | 27 +
.../todomodule/dom/DependenciesComparator.java | 20 +
.../todomodule/dom/ExcelDemoToDoItem-done.png | Bin 0 -> 1794 bytes
.../todomodule/dom/ExcelDemoToDoItem-todo.png | Bin 0 -> 1257 bytes
.../demoapp/todomodule/dom/ExcelDemoToDoItem.java | 457 +
.../todomodule/dom/ExcelDemoToDoItem.layout.xml | 74 +
.../demoapp/todomodule/dom/ExcelDemoToDoItem.png | Bin 0 -> 1285 bytes
.../todomodule/dom/ExcelDemoToDoItemMenu.java | 215 +
.../demoapp/todomodule/dom/Subcategory.java | 32 +
.../ExcelDemoToDoItem_recreate5_for.java | 99 +
.../ExcelDemoToDoItem_recreate5_forSven.java | 10 +
.../fixturescripts/ExcelDemoToDoItem_tearDown.java | 14 +
.../ExcelDemoToDoItem_tearDown2.java | 39 +
extensions/lib/excel/impl/pom.xml | 79 +
.../org/isisaddons/module/excel/ExcelModule.java | 4 +
.../module/excel/dom/AggregationType.java | 6 +
.../isisaddons/module/excel/dom/ExcelFixture.java | 220 +
.../isisaddons/module/excel/dom/ExcelFixture2.java | 173 +
.../module/excel/dom/ExcelFixtureRowHandler.java | 12 +
.../excel/dom/ExcelFixtureWorkbookHandler.java | 12 +
.../module/excel/dom/ExcelMetaDataEnabled.java | 10 +
.../isisaddons/module/excel/dom/ExcelService.java | 232 +
.../module/excel/dom/FixtureAwareRowHandler.java | 11 +
.../org/isisaddons/module/excel/dom/HyperLink.java | 9 +
.../isisaddons/module/excel/dom/PivotColumn.java | 9 +
.../module/excel/dom/PivotDecoration.java | 9 +
.../org/isisaddons/module/excel/dom/PivotRow.java | 8 +
.../isisaddons/module/excel/dom/PivotValue.java | 10 +
.../isisaddons/module/excel/dom/RowHandler.java | 7 +
.../module/excel/dom/WorksheetContent.java | 24 +
.../isisaddons/module/excel/dom/WorksheetSpec.java | 124 +
.../module/excel/dom/util/AnnotationList.java | 26 +
.../module/excel/dom/util/AnnotationTriplet.java | 32 +
.../module/excel/dom/util/CellMarshaller.java | 471 +
.../module/excel/dom/util/ExcelConverter.java | 604 ++
.../excel/dom/util/ExcelFileBlobConverter.java | 62 +
.../module/excel/dom/util/ExcelServiceImpl.java | 237 +
.../org/isisaddons/module/excel/dom/util/Mode.java | 15 +
.../module/excel/dom/util/PivotUtils.java | 144 +
.../module/excel/dom/util/SheetPivoter.java | 601 ++
.../module/excel/dom/util/AnnotationListTest.java | 34 +
.../excel/dom/util/AnnotationTripletTest.java | 48 +
.../module/excel/dom/util/PivotUtilsTest.java | 286 +
.../module/excel/dom/util/SheetPivoterTest.java | 524 ++
.../excel/integtests/logging-integtest.properties | 93 +
extensions/lib/excel/integtests/pom.xml | 131 +
.../integtests/ExcelModuleBootstrapIntegTest.java | 45 +
.../integtests/ExcelModuleIntegTestAbstract.java | 16 +
.../integtests/ExcelModuleIntegTestModule.java | 27 +
.../ExcelModuleDemoMetaDataEnabled_IntegTest.java | 67 +
...uleDemoToDoItemBulkUpdateManager_IntegTest.java | 113 +
.../ExcelModuleDemoUploadService_IntegTest.java | 64 +
.../tests/ToDoItemsWithMultipleSheets.xlsx | Bin 0 -> 12368 bytes
.../excel/integtests/tests/toDoItems-expected.xlsx | Bin 0 -> 10558 bytes
.../excel/integtests/tests/toDoItems-updated.xlsx | Bin 0 -> 11291 bytes
.../lib/excel/integtests/toDoItems-actual.xlsx | Bin 0 -> 5283 bytes
extensions/lib/excel/integtests/translations.pot | 881 ++
extensions/lib/fakedata/fixture/.gitignore | 5 +
.../fakedata/fixture/logging-dn-enhance.properties | 24 +
extensions/lib/fakedata/fixture/pom.xml | 246 +
.../fixture/src/main/java/META-INF/persistence.xml | 8 +
.../fakedata/fixture/FakeDataFixturesModule.java | 17 +
.../fixture/demoapp/demomodule/dom/EnumOf3.java | 7 +
.../demomodule/dom/FakeDataDemoObjectWithAll.java | 745 ++
.../dom/FakeDataDemoObjectWithAll.layout.json | 440 +
.../demomodule/dom/FakeDataDemoObjectWithAll.png | Bin 0 -> 557 bytes
.../dom/FakeDataDemoObjectWithAllMenu.java | 63 +
.../FakeDataDemoObjectWithAll_create3.java | 44 +
.../FakeDataDemoObjectWithAll_tearDown.java | 14 +
...eDataDemoObjectWithAll_create_withFakeData.java | 78 +
...eDataDemoObjectWithAll_update_withFakeData.java | 195 +
extensions/lib/fakedata/impl/pom.xml | 155 +
.../isisaddons/module/fakedata/FakeDataModule.java | 46 +
.../fakedata/dom/AbstractRandomValueGenerator.java | 11 +
.../isisaddons/module/fakedata/dom/Addresses.java | 82 +
.../module/fakedata/dom/BigDecimals.java | 27 +
.../module/fakedata/dom/BigIntegers.java | 17 +
.../org/isisaddons/module/fakedata/dom/Books.java | 23 +
.../isisaddons/module/fakedata/dom/Booleans.java | 36 +
.../org/isisaddons/module/fakedata/dom/Bytes.java | 25 +
.../org/isisaddons/module/fakedata/dom/Chars.java | 39 +
.../module/fakedata/dom/Collections.java | 274 +
.../org/isisaddons/module/fakedata/dom/Comms.java | 32 +
.../module/fakedata/dom/CreditCards.java | 25 +
.../isisaddons/module/fakedata/dom/Doubles.java | 22 +
.../org/isisaddons/module/fakedata/dom/Enums.java | 16 +
.../module/fakedata/dom/FakeDataService.java | 301 +
.../org/isisaddons/module/fakedata/dom/Floats.java | 16 +
.../isisaddons/module/fakedata/dom/Integers.java | 26 +
.../isisaddons/module/fakedata/dom/IsisBlobs.java | 90 +
.../isisaddons/module/fakedata/dom/IsisClobs.java | 119 +
.../isisaddons/module/fakedata/dom/IsisMoneys.java | 17 +
.../module/fakedata/dom/IsisPasswords.java | 16 +
.../module/fakedata/dom/JavaSqlDates.java | 24 +
.../module/fakedata/dom/JavaSqlTimestamps.java | 18 +
.../module/fakedata/dom/JavaUtilDates.java | 17 +
.../module/fakedata/dom/JodaDateTimes.java | 36 +
.../module/fakedata/dom/JodaLocalDates.java | 36 +
.../module/fakedata/dom/JodaPeriods.java | 42 +
.../org/isisaddons/module/fakedata/dom/Longs.java | 16 +
.../org/isisaddons/module/fakedata/dom/Lorem.java | 49 +
.../org/isisaddons/module/fakedata/dom/Names.java | 37 +
.../org/isisaddons/module/fakedata/dom/Shorts.java | 25 +
.../isisaddons/module/fakedata/dom/Strings.java | 33 +
.../org/isisaddons/module/fakedata/dom/Urls.java | 24 +
.../org/isisaddons/module/fakedata/dom/Uuids.java | 16 +
.../dom/blobs/Pawson-Naked-Objects-thesis.pdf | Bin 0 -> 2082131 bytes
.../module/fakedata/dom/blobs/image01-150x150.jpg | Bin 0 -> 20782 bytes
.../fakedata/dom/blobs/image01-2048x1536.jpg | Bin 0 -> 1246458 bytes
.../module/fakedata/dom/blobs/image01-240x180.jpg | Bin 0 -> 30553 bytes
.../fakedata/dom/blobs/image01-4000x3000.jpg | Bin 0 -> 2913548 bytes
.../module/fakedata/dom/blobs/image01-640x480.jpg | Bin 0 -> 138058 bytes
.../module/fakedata/dom/blobs/image02-150x150.jpg | Bin 0 -> 23175 bytes
.../fakedata/dom/blobs/image02-2048x1536.jpg | Bin 0 -> 1107780 bytes
.../module/fakedata/dom/blobs/image02-240x180.jpg | Bin 0 -> 33479 bytes
.../fakedata/dom/blobs/image02-4000x3000.jpg | Bin 0 -> 2628272 bytes
.../module/fakedata/dom/blobs/image02-640x480.jpg | Bin 0 -> 95819 bytes
.../fakedata/dom/blobs/rick-mugridge-paper.pdf | Bin 0 -> 292979 bytes
.../module/fakedata/dom/clobs/RTF-Spec-1.7.rtf | 1 +
.../module/fakedata/dom/clobs/a_and_c.xml | 8923 +++++++++++++++++++
.../module/fakedata/dom/clobs/all_well.xml | 7023 +++++++++++++++
.../module/fakedata/dom/clobs/as_you.xml | 6263 ++++++++++++++
.../module/fakedata/dom/clobs/com_err.xml | 4445 ++++++++++
.../module/fakedata/dom/clobs/config.rtf | 1031 +++
.../module/fakedata/dom/clobs/coriolan.xml | 8709 +++++++++++++++++++
.../module/fakedata/dom/clobs/cymbelin.xml | 7651 +++++++++++++++++
.../isisaddons/module/fakedata/dom/clobs/dream.xml | 4478 ++++++++++
.../isisaddons/module/fakedata/dom/clobs/dsssl.dtd | 134 +
.../isisaddons/module/fakedata/dom/clobs/fot.dtd | 507 ++
.../module/fakedata/dom/clobs/hamlet.xml | 9057 ++++++++++++++++++++
.../module/fakedata/dom/clobs/hen_iv_1.xml | 6514 ++++++++++++++
.../module/fakedata/dom/clobs/hen_iv_2.xml | 7275 ++++++++++++++++
.../isisaddons/module/fakedata/dom/clobs/hen_v.xml | 6605 ++++++++++++++
.../module/fakedata/dom/clobs/hen_vi_1.xml | 5865 +++++++++++++
.../module/fakedata/dom/clobs/hen_vi_2.xml | 6822 +++++++++++++++
.../module/fakedata/dom/clobs/hen_vi_3.xml | 6722 +++++++++++++++
.../module/fakedata/dom/clobs/hen_viii.xml | 6490 ++++++++++++++
.../module/fakedata/dom/clobs/j_caesar.xml | 6196 +++++++++++++
.../isisaddons/module/fakedata/dom/clobs/john.xml | 5131 +++++++++++
.../isisaddons/module/fakedata/dom/clobs/lear.xml | 8293 ++++++++++++++++++
.../isisaddons/module/fakedata/dom/clobs/lll.xml | 7243 ++++++++++++++++
.../module/fakedata/dom/clobs/m_for_m.xml | 6771 +++++++++++++++
.../module/fakedata/dom/clobs/m_wives.xml | 7161 ++++++++++++++++
.../module/fakedata/dom/clobs/macbeth.xml | 5427 ++++++++++++
.../module/fakedata/dom/clobs/merchant.xml | 5537 ++++++++++++
.../module/fakedata/dom/clobs/much_ado.xml | 6792 +++++++++++++++
.../module/fakedata/dom/clobs/othello.xml | 8683 +++++++++++++++++++
.../module/fakedata/dom/clobs/pericles.xml | 5421 ++++++++++++
.../isisaddons/module/fakedata/dom/clobs/play.dtd | 27 +
.../module/fakedata/dom/clobs/r_and_j.xml | 6930 +++++++++++++++
.../module/fakedata/dom/clobs/rich_ii.xml | 5362 ++++++++++++
.../module/fakedata/dom/clobs/rich_iii.xml | 8578 ++++++++++++++++++
.../module/fakedata/dom/clobs/sample.rtf | 68 +
.../module/fakedata/dom/clobs/shaksper.htm | 167 +
.../module/fakedata/dom/clobs/style-sheet.dtd | 41 +
.../module/fakedata/dom/clobs/t_night.xml | 6526 ++++++++++++++
.../module/fakedata/dom/clobs/taming.xml | 6592 ++++++++++++++
.../module/fakedata/dom/clobs/tempest.xml | 5148 +++++++++++
.../module/fakedata/dom/clobs/testrtf.rtf | 318 +
.../isisaddons/module/fakedata/dom/clobs/timon.xml | 6083 +++++++++++++
.../isisaddons/module/fakedata/dom/clobs/titus.xml | 5224 +++++++++++
.../module/fakedata/dom/clobs/troilus.xml | 8542 ++++++++++++++++++
.../module/fakedata/dom/clobs/two_gent.xml | 5946 +++++++++++++
.../org/isisaddons/module/fakedata/dom/clobs/vs | 12 +
.../org/isisaddons/module/fakedata/dom/clobs/vx | 13 +
.../module/fakedata/dom/clobs/win_tale.xml | 6633 ++++++++++++++
.../isisaddons/module/fakedata/dom/clobs/xml.dcl | 188 +
.../isisaddons/module/fakedata/dom/clobs/xml.soc | 1 +
.../module/fakedata/dom/FakeDataServiceTest.java | 347 +
.../integtests/logging-integtest.properties | 93 +
extensions/lib/fakedata/integtests/pom.xml | 131 +
.../FakeDataModuleBootstrapIntegTest.java | 45 +
.../FakeDataModuleIntegTestAbstract.java | 16 +
.../integtests/FakeDataModuleIntegTestModule.java | 25 +
.../tests/FakeDataDemoObjects_IntegTest.java | 911 ++
.../lib/fakedata/integtests/toDoItems-actual.xlsx | Bin 0 -> 5283 bytes
.../lib/fakedata/integtests/translations.pot | 993 +++
extensions/pom.xml | 3 +
304 files changed, 268391 insertions(+)
diff --git a/core/pom.xml b/core/pom.xml
index bbf3d45..29d9696 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -91,6 +91,7 @@
<commons-email.version>1.4</commons-email.version>
<commons-httpclient.version>3.1</commons-httpclient.version>
<commons-io.version>2.6</commons-io.version>
+ <commons-lang3.version>3.9</commons-lang3.version>
<commons-logging.version>1.2</commons-logging.version>
<cxf-rt-rs-client.version>3.3.4</cxf-rt-rs-client.version>
@@ -157,6 +158,7 @@
<quartz-scheduler.version>2.2.1</quartz-scheduler.version>
<resteasy4-jaxrs.version>4.0.0.Beta5</resteasy4-jaxrs.version> <!-- Isis Resteasy Plugin 4 (for JEE 8 JAX-RS API 2.1) -->
+ <reflections.version>0.9.11</reflections.version>
<select2.version>4.0.10</select2.version>
<shiro.version>1.4.1</shiro.version>
@@ -999,6 +1001,7 @@
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
+
<dependency>
<!-- required because resteasy-jaxrs declares as a test dependency whereas
httpclient4 needs it as a compile dependency -->
@@ -1213,6 +1216,12 @@
</dependency>
<dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-lang3</artifactId>
+ <version>${commons-lang3.version}</version>
+ </dependency>
+
+ <dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-client</artifactId>
<version>${cxf-rt-rs-client.version}</version>
@@ -1465,6 +1474,13 @@
</dependency>
<dependency>
+ <groupId>org.reflections</groupId>
+ <artifactId>reflections</artifactId>
+ <version>${reflections.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j-api.version}</version>
diff --git a/extensions/lib/base/impl/pom.xml b/extensions/lib/base/impl/pom.xml
new file mode 100644
index 0000000..09f8a77
--- /dev/null
+++ b/extensions/lib/base/impl/pom.xml
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.isis.extensions</groupId>
+ <artifactId>isis-extensions</artifactId>
+ <version>2.0.0-M3-SNAPSHOT</version>
+ <relativePath>../../../pom.xml</relativePath>
+ </parent>
+
+ <groupId>org.incode.module.base</groupId>
+ <artifactId>incode-module-base-dom</artifactId>
+
+ <packaging>jar</packaging>
+
+ <name>Incode Platform Lib Base Impl</name>
+ <description>
+ A module providing Base utilities for domain modules
+ </description>
+
+ <properties>
+ <jar-plugin.automaticModuleName>org.incode.platform.lib.base</jar-plugin.automaticModuleName>
+ <git-plugin.propertiesDir>org/incode/platform/lib/base</git-plugin.propertiesDir>
+ </properties>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-applib</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-lang3</artifactId>
+ </dependency>
+
+ <!-- test -->
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-unittestsupport</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.reflections</groupId>
+ <artifactId>reflections</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-metamodel</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <!--
+ <dependency>
+ <groupId>org.isisaddons.module.fakedata</groupId>
+ <artifactId>isis-module-fakedata-dom</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-metamodel</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+
+ <dependency>
+ <groupId>org.assertj</groupId>
+ <artifactId>assertj-core</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.danhaywood.java</groupId>
+ <artifactId>danhaywood-java-assertjext</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.jmock</groupId>
+ <artifactId>jmock</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jmock</groupId>
+ <artifactId>jmock-junit4</artifactId>
+ <scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>junit</groupId>
+ <artifactId>junit-dep</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.picocontainer</groupId>
+ <artifactId>picocontainer</artifactId>
+ <scope>test</scope>
+ </dependency>
+ -->
+ </dependencies>
+
+
+</project>
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/Chained.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/Chained.java
new file mode 100644
index 0000000..c26c183
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/Chained.java
@@ -0,0 +1,38 @@
+package org.incode.module.base.dom;
+
+import org.apache.isis.applib.annotation.Editing;
+
+import org.apache.isis.applib.annotation.Optionality;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.Where;
+
+import org.incode.module.base.dom.with.WithInterval;
+import org.incode.module.base.dom.with.WithIntervalContiguous;
+
+public interface Chained<T extends Chained<T>> {
+
+
+ /**
+ * The object (usually an {@link WithInterval}, but not necessarily) that precedes this one, if any (not
+ * necessarily contiguously)..
+ *
+ * <p>
+ * Implementations where successive intervals are contiguous should instead implement
+ * {@link WithIntervalContiguous}.
+ */
+ @Property(editing = Editing.DISABLED, hidden=Where.ALL_TABLES, optionality = Optionality.OPTIONAL)
+ public T getPrevious();
+
+ /**
+ * The object (usually an {@link WithInterval}, but not necessarily) that succeeds this one, if any (not
+ * necessarily contiguously).
+ *
+ * <p>
+ * Implementations where successive intervals are contiguous should instead implement
+ * {@link WithIntervalContiguous}.
+ */
+ @Property(editing = Editing.DISABLED, hidden=Where.ALL_TABLES, optionality = Optionality.OPTIONAL)
+ public T getNext();
+
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/Dflt.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/Dflt.java
new file mode 100644
index 0000000..a84ccb8
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/Dflt.java
@@ -0,0 +1,20 @@
+package org.incode.module.base.dom;
+
+import java.util.Collection;
+
+import org.apache.isis.applib.annotation.Programmatic;
+
+public class Dflt {
+
+ private Dflt(){}
+
+ @Programmatic
+ public static <T> T of(final Collection<T> choices) {
+ switch(choices.size()) {
+ case 0: return null;
+ case 1: return choices.iterator().next();
+ default: return null;
+ }
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/IncodeApplicationException.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/IncodeApplicationException.java
new file mode 100644
index 0000000..89ce00a
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/IncodeApplicationException.java
@@ -0,0 +1,25 @@
+package org.incode.module.base.dom;
+
+import org.apache.isis.applib.ApplicationException;
+
+/**
+ * An unexpected application exception; will render as a stack trace to the end-user.
+ */
+public class IncodeApplicationException extends ApplicationException {
+
+ private static final long serialVersionUID = 1L;
+
+ public IncodeApplicationException(final String msg, final Throwable cause) {
+ super(msg, cause);
+ }
+
+ public IncodeApplicationException(final String msg) {
+ super(msg);
+ }
+
+ public IncodeApplicationException(final Throwable cause) {
+ super(cause);
+ }
+
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/PowerType.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/PowerType.java
new file mode 100644
index 0000000..7000921
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/PowerType.java
@@ -0,0 +1,13 @@
+package org.incode.module.base.dom;
+
+import org.apache.isis.applib.services.factory.FactoryService;
+
+/**
+ * For <tt>enum</tt>s that act as powertypes, in other words acting as a factory
+ * for subtypes of some inheritance hierarchy.
+ */
+public interface PowerType<T> {
+
+ T create(FactoryService factoryService);
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/Titled.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/Titled.java
new file mode 100644
index 0000000..0565f02
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/Titled.java
@@ -0,0 +1,7 @@
+package org.incode.module.base.dom;
+
+public interface Titled {
+
+ String title();
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/TitledEnum.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/TitledEnum.java
new file mode 100644
index 0000000..4cf0666
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/TitledEnum.java
@@ -0,0 +1,11 @@
+package org.incode.module.base.dom;
+
+import org.incode.module.base.dom.utils.StringUtils;
+
+/**
+ * An enum that implements {@link Titled} and moreover its {@link #title()}
+ * is derived according to the {@link StringUtils#enumTitle(String)} algorithm.
+ */
+public interface TitledEnum extends Titled {
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/DescriptionType.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/DescriptionType.java
new file mode 100644
index 0000000..f1fc374
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/DescriptionType.java
@@ -0,0 +1,16 @@
+package org.incode.module.base.dom.types;
+
+public class DescriptionType {
+
+ private DescriptionType() {}
+
+ public static class Meta {
+
+ public final static int MAX_LEN = 254;
+ public static final int MULTI_LINE = 5;
+
+ private Meta() {}
+
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/FqcnType.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/FqcnType.java
new file mode 100644
index 0000000..ffddb14
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/FqcnType.java
@@ -0,0 +1,15 @@
+package org.incode.module.base.dom.types;
+
+public class FqcnType {
+
+ private FqcnType() {}
+
+ public static class Meta {
+
+ public final static int MAX_LEN = 254;
+
+ private Meta() {}
+
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/MoneyType.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/MoneyType.java
new file mode 100644
index 0000000..7a41329
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/MoneyType.java
@@ -0,0 +1,15 @@
+package org.incode.module.base.dom.types;
+
+public class MoneyType {
+
+ private MoneyType() {}
+
+ public static class Meta {
+
+ public final static int SCALE = 2;
+
+ private Meta() {}
+
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/NameType.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/NameType.java
new file mode 100644
index 0000000..fbd17e3
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/NameType.java
@@ -0,0 +1,15 @@
+package org.incode.module.base.dom.types;
+
+public class NameType {
+
+ private NameType() {}
+
+ public static class Meta {
+
+ public final static int MAX_LEN = 50;
+
+ private Meta() {}
+
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/NotesType.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/NotesType.java
new file mode 100644
index 0000000..77810b5
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/NotesType.java
@@ -0,0 +1,15 @@
+package org.incode.module.base.dom.types;
+
+public class NotesType {
+
+ private NotesType() {}
+
+ public static class Meta {
+
+ public final static int MAX_LEN = 4000;
+
+ private Meta() {}
+
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/ObjectIdentifierType.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/ObjectIdentifierType.java
new file mode 100644
index 0000000..5708a99
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/ObjectIdentifierType.java
@@ -0,0 +1,15 @@
+package org.incode.module.base.dom.types;
+
+public class ObjectIdentifierType {
+
+ private ObjectIdentifierType() {}
+
+ public static class Meta {
+
+ public static final int MAX_LEN = 20;
+
+ private Meta() {}
+
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/PercentageType.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/PercentageType.java
new file mode 100644
index 0000000..ceb0edc
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/PercentageType.java
@@ -0,0 +1,15 @@
+package org.incode.module.base.dom.types;
+
+public class PercentageType {
+
+ private PercentageType() {}
+
+ public static class Meta {
+
+ public final static int SCALE = 2;
+
+ private Meta() {}
+
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/ProperNameType.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/ProperNameType.java
new file mode 100644
index 0000000..17a98bb
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/ProperNameType.java
@@ -0,0 +1,15 @@
+package org.incode.module.base.dom.types;
+
+public class ProperNameType {
+
+ private ProperNameType() {}
+
+ public static class Meta {
+
+ public final static int MAX_LEN = 50;
+
+ private Meta() {}
+
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/ReferenceType.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/ReferenceType.java
new file mode 100644
index 0000000..bdb4c65
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/ReferenceType.java
@@ -0,0 +1,18 @@
+package org.incode.module.base.dom.types;
+
+public class ReferenceType {
+
+ private ReferenceType() {}
+
+ public static class Meta {
+
+ public final static int MAX_LEN = 24;
+
+ public static final String REGEX = "[ -/_A-Z0-9]+";
+ public static final String REGEX_DESCRIPTION = "Only capital letters, numbers and 3 symbols being: \"_\" , \"-\" and \"/\" are allowed";
+
+ private Meta() {}
+
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/TitleType.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/TitleType.java
new file mode 100644
index 0000000..7f05f3b
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/TitleType.java
@@ -0,0 +1,15 @@
+package org.incode.module.base.dom.types;
+
+public class TitleType {
+
+ private TitleType() {}
+
+ public static class Meta {
+
+ public final static int MAX_LEN = 50;
+
+ private Meta() {}
+
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/UrlTemplateType.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/UrlTemplateType.java
new file mode 100644
index 0000000..0add54f
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/UrlTemplateType.java
@@ -0,0 +1,15 @@
+package org.incode.module.base.dom.types;
+
+public class UrlTemplateType {
+
+ private UrlTemplateType() {}
+
+ public static class Meta {
+
+ public static final int MAX_LEN = 254;
+
+ private Meta() {}
+
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/UserNameType.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/UserNameType.java
new file mode 100644
index 0000000..e87e7d1
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/UserNameType.java
@@ -0,0 +1,15 @@
+package org.incode.module.base.dom.types;
+
+public class UserNameType {
+
+ private UserNameType() {}
+
+ public static class Meta {
+
+ public static final int MAX_LEN = 50;
+
+ private Meta() {}
+
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/XxxType.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/XxxType.java
new file mode 100644
index 0000000..ec4e3c4
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/types/XxxType.java
@@ -0,0 +1,13 @@
+package org.incode.module.base.dom.types;
+
+public class XxxType {
+
+ private XxxType() {}
+
+ public static class Meta {
+
+ private Meta() {}
+
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/utils/ClassUtils.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/utils/ClassUtils.java
new file mode 100644
index 0000000..92a5d61
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/utils/ClassUtils.java
@@ -0,0 +1,21 @@
+package org.incode.module.base.dom.utils;
+
+public final class ClassUtils {
+
+ private ClassUtils(){}
+
+ @SuppressWarnings("unchecked")
+ public static <T> Class<? extends T> load(final String clsName, final Class<T> cls) {
+ Class<?> clsx;
+ try {
+ clsx = Thread.currentThread().getContextClassLoader().loadClass(clsName);
+ } catch (ClassNotFoundException e) {
+ throw new IllegalArgumentException("Class '" + clsName + "' not found");
+ }
+ if (!cls.isAssignableFrom(clsx)) {
+ throw new IllegalArgumentException("Class '" + clsName + "' not a subclass of " + cls.getName());
+ }
+ return (Class<? extends T>) clsx;
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/utils/JodaPeriodUtils.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/utils/JodaPeriodUtils.java
new file mode 100644
index 0000000..c6fa168
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/utils/JodaPeriodUtils.java
@@ -0,0 +1,69 @@
+package org.incode.module.base.dom.utils;
+
+import org.joda.time.Period;
+import org.joda.time.format.PeriodFormatter;
+import org.joda.time.format.PeriodFormatterBuilder;
+
+/**
+ * Utilities for manipulating parsing JODA {@link Period}s.
+ */
+public final class JodaPeriodUtils {
+
+ private JodaPeriodUtils() {
+ }
+
+ public static Period asPeriod(final String inputStr) {
+ if (inputStr == null) {
+ return null;
+ }
+ final String inputStrNormalized = inputStr.replaceAll(" ", "").toLowerCase();
+ PeriodFormatter formatter = simpleFormatter();
+ try {
+ return formatter.parsePeriod(inputStrNormalized);
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ public static String asString(final Period period) {
+
+ PeriodFormatter formatter = complexFormatter();
+ return formatter.print(period).trim();
+
+ }
+
+ public static String asSimpleString(final Period period) {
+
+ PeriodFormatter formatter = simpleFormatter();
+ return formatter.print(period).trim();
+
+ }
+
+ private static PeriodFormatter simpleFormatter() {
+ PeriodFormatter formatter = new PeriodFormatterBuilder().
+ appendYears().appendSuffix("y").
+ appendMonths().appendSuffix("m").
+ appendDays().appendSuffix("d").
+ appendHours().appendSuffix("h").
+ appendMinutes().appendSuffix("min").
+ toFormatter();
+ return formatter;
+ }
+
+ private static PeriodFormatter complexFormatter() {
+ PeriodFormatter formatter = new PeriodFormatterBuilder().
+ appendYears().appendSuffix(" year", " years").
+ appendSeparator(", ", " & ").
+ appendMonths().appendSuffix(" month", " months").
+ appendSeparator(", ", " & ").
+ appendDays().appendSuffix(" day", " days").
+ appendSeparator(", ", " & ").
+ appendHours().appendSuffix(" hours", "hours").
+ appendSeparator(", ", " & ").
+ appendMinutes().appendSuffix(" minute", " minutes").
+ appendSeparator(", ", " & ").
+ appendSeconds().appendSuffix(" second", " seconds").
+ toFormatter();
+ return formatter;
+ }
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/utils/MathUtils.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/utils/MathUtils.java
new file mode 100644
index 0000000..020dda3
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/utils/MathUtils.java
@@ -0,0 +1,61 @@
+package org.incode.module.base.dom.utils;
+
+import java.math.BigDecimal;
+import java.math.MathContext;
+
+/**
+ * General-purpose math utilities.
+ */
+public final class MathUtils {
+
+ private MathUtils() {}
+
+ public static BigDecimal round(final BigDecimal input, final int precision) {
+ final MathContext mc = new MathContext(precision+1);
+ return input.round(mc);
+ }
+
+ public static boolean isZeroOrNull(final BigDecimal input) {
+ return input == null ? true : input.compareTo(BigDecimal.ZERO) == 0;
+ }
+
+ public static boolean isNotZeroOrNull(final BigDecimal input) {
+ return !isZeroOrNull(input);
+ }
+
+ public static BigDecimal firstNonZero(final BigDecimal... values) {
+ for (BigDecimal value : values) {
+ if (value != null && value.compareTo(BigDecimal.ZERO) != 0) {
+ return value;
+ }
+ }
+ return BigDecimal.ZERO;
+ }
+
+ public static BigDecimal max(BigDecimal... input){
+ BigDecimal max = BigDecimal.ZERO;
+ for (BigDecimal value : input){
+ if (value != null){
+ max = max.max(value);
+ }
+ }
+ return max;
+ }
+
+ public static BigDecimal maxUsingFirstSignum(final BigDecimal... values) {
+ BigDecimal max = BigDecimal.ZERO;
+ boolean signumDetected = false;
+ BigDecimal signum = BigDecimal.ONE;
+ for (BigDecimal value : values){
+ if (value != null && value.compareTo(BigDecimal.ZERO) != 0){
+ if (!signumDetected) {
+ signum = BigDecimal.valueOf(value.signum() == -1 ? -1 : 1);
+ signumDetected = true;
+ }
+ max = max.max(value.multiply(signum));
+ }
+ }
+ return max.multiply(signum);
+
+ }
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/utils/MessageUtils.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/utils/MessageUtils.java
new file mode 100644
index 0000000..4f6a7e0
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/utils/MessageUtils.java
@@ -0,0 +1,24 @@
+package org.incode.module.base.dom.utils;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import com.google.common.base.Strings;
+
+public final class MessageUtils {
+
+ private MessageUtils(){}
+ private final static Pattern pattern = Pattern.compile(".*Reason: (.+?)[ ]*Identifier:.*");
+
+ public static String normalize(final Exception ex) {
+ if(ex == null || Strings.isNullOrEmpty(ex.getMessage())) {
+ return null;
+ }
+ String message = ex.getMessage();
+ final Matcher matcher = pattern.matcher(message);
+ if(matcher.matches()) {
+ return matcher.group(1);
+ }
+ return message;
+ }
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/utils/StringUtils.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/utils/StringUtils.java
new file mode 100644
index 0000000..89f1cc1
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/utils/StringUtils.java
@@ -0,0 +1,66 @@
+package org.incode.module.base.dom.utils;
+
+import com.google.common.base.Function;
+import com.google.common.base.Joiner;
+import com.google.common.base.Splitter;
+import com.google.common.collect.Iterables;
+
+public final class StringUtils {
+
+ private StringUtils() {
+ }
+
+ private static Function<String, String> LOWER_CASE_THEN_CAPITALIZE = new Function<String, String>() {
+ @Override
+ public String apply(final String input) {
+ return input != null? StringUtils.capitalize(input.toLowerCase()): null;
+ }
+ };
+
+ private static Function<String, String> UPPER_CASE = new Function<String, String>() {
+ @Override
+ public String apply(final String input) {
+ return input != null? input.toUpperCase(): null;
+ }
+ };
+
+ public static String enumTitle(final String string) {
+ if(string == null) {
+ return null;
+ }
+ return Joiner.on(" ").join(Iterables.transform(Splitter.on("_").split(string), LOWER_CASE_THEN_CAPITALIZE));
+ }
+
+ public static String enumDeTitle(final String string) {
+ if(string == null) {
+ return null;
+ }
+ return Joiner.on("_").join(Iterables.transform(Splitter.on(" ").split(string), UPPER_CASE));
+ }
+
+ public static String wildcardToCaseInsensitiveRegex(final String pattern) {
+ if(pattern == null) {
+ return null;
+ }
+ return "(?i)".concat(wildcardToRegex(pattern));
+ }
+
+ public static String wildcardToRegex(final String pattern) {
+ if(pattern == null) {
+ return null;
+ }
+ return pattern.replace("*", ".*").replace("?", ".");
+ }
+
+ public static String capitalize(final String str) {
+ if (str == null || str.length() == 0) {
+ return str;
+ }
+ if (str.length() == 1) {
+ return str.toUpperCase();
+ }
+ return Character.toUpperCase(str.charAt(0)) + str.substring(1);
+ }
+
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/utils/TitleBuilder.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/utils/TitleBuilder.java
new file mode 100644
index 0000000..0751728
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/utils/TitleBuilder.java
@@ -0,0 +1,95 @@
+package org.incode.module.base.dom.utils;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import org.apache.isis.applib.util.TitleBufferException;
+
+public class TitleBuilder {
+ private static final String SPACE = " ";
+ private static final String DELIMITER = "[]";
+ private static final String PARENT_SEPARATOR = " > ";
+
+ public static final Class[] NO_PARAMETER_TYPES = new Class[0];
+ public static final Object[] NO_ARGUMENTS = new Object[0];
+
+ private final StringBuilder parentString;
+ private final StringBuilder nameString;
+ private final StringBuilder referenceString;
+
+ private static String titleFor(Object object) {
+ if (object == null) {
+ return null;
+ } else if (object instanceof String) {
+ return object.toString();
+ } else {
+ try {
+ Method e = object.getClass().getMethod("title", NO_PARAMETER_TYPES);
+ return (String) e.invoke(object, NO_ARGUMENTS);
+ } catch (IllegalArgumentException | IllegalAccessException | InvocationTargetException | SecurityException var2) {
+ throw new TitleBufferException(var2);
+ } catch (NoSuchMethodException var3) {
+ return object.toString();
+ }
+ }
+ }
+
+ private TitleBuilder() {
+ this.referenceString = new StringBuilder();
+ this.nameString = new StringBuilder();
+ this.parentString = new StringBuilder();
+ }
+
+ public static TitleBuilder start() {
+ return new TitleBuilder();
+ }
+
+ public TitleBuilder withParent(final Object object){
+ parentString.append(titleFor(object));
+ parentString.append(PARENT_SEPARATOR);
+ return this;
+ }
+
+ public TitleBuilder withName(final String name){
+ if (name != null && name.length() > 0 ) {
+ if (nameString.length() > 0){
+ nameString.append(SPACE);
+ }
+ nameString.append(name);
+ }
+ return this;
+ }
+
+ public TitleBuilder withReference(final String reference){
+ referenceString.append(reference);
+ return this;
+ }
+
+ public String toString() {
+ return new StringBuilder()
+ .append(parentString)
+ .append(nameString)
+ .append(referenceString.length() > 0 && nameString.length() > 0 ? SPACE : "")
+ .append(!referenceString.toString().equals(nameString.toString()) ? delimited(referenceString) : "")
+ .toString().trim();
+ }
+
+ private StringBuilder delimited(StringBuilder stringBuilder){
+ return stringBuilder.length()>0 ? stringBuilder.insert(0,DELIMITER.charAt(0)).append(DELIMITER.charAt(1)) : stringBuilder;
+ }
+
+ public TitleBuilder withName(final Object object) {
+ final String title = titleFor(object);
+ if(title != null) {
+ nameString.append(title);
+ }
+ return this;
+ }
+
+ /**
+ * @deprecated - this method does nothing...
+ */
+ @Deprecated
+ public TitleBuilder withTupleElement(Object object) {
+ return this;
+ }
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/valuetypes/AbstractInterval.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/valuetypes/AbstractInterval.java
new file mode 100644
index 0000000..c996320
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/valuetypes/AbstractInterval.java
@@ -0,0 +1,247 @@
+package org.incode.module.base.dom.valuetypes;
+
+import org.joda.time.Interval;
+import org.joda.time.LocalDate;
+import org.joda.time.Period;
+import org.joda.time.PeriodType;
+
+public abstract class AbstractInterval<T extends AbstractInterval<T>> {
+
+ public enum IntervalEnding {
+ EXCLUDING_END_DATE, INCLUDING_END_DATE
+ }
+
+ private static class IntervalUtil {
+ private static final long MIN_VALUE = 0;
+ private static final long MAX_VALUE = Long.MAX_VALUE;
+
+ public static Interval toInterval(final AbstractInterval<?> localDateInterval) {
+ Long startInstant = toStartInstant(localDateInterval.startDate());
+ Long endInstant = toEndInstant(localDateInterval.endDateExcluding());
+ return new Interval(startInstant, endInstant);
+ }
+
+ public static LocalDate toLocalDate(final long instant) {
+ if (instant == MAX_VALUE || instant == MIN_VALUE) {
+ return null;
+ }
+ return new LocalDate(instant);
+ }
+
+ private static long toStartInstant(final LocalDate date) {
+ if (date == null) {
+ return MIN_VALUE;
+ }
+ return date.toInterval().getStartMillis();
+ }
+
+ private static long toEndInstant(final LocalDate date) {
+ if (date == null) {
+ return MAX_VALUE;
+ }
+ return date.toInterval().getStartMillis();
+ }
+
+ }
+
+ /**
+ * Determines how end dates are shown in the ui and stored in the database:
+ *
+ * {@link IntervalEnding#EXCLUDING_END_DATE} uses the start date of the next interval as end date.
+ * {@link IntervalEnding#INCLUDING_END_DATE} used the last day of the interval as the end date.
+ */
+ private static final IntervalEnding PERSISTENT_ENDING = IntervalEnding.INCLUDING_END_DATE;
+
+ protected LocalDate endDate;
+ protected LocalDate startDate;
+
+ public AbstractInterval() {
+ }
+
+ public AbstractInterval(final Interval interval) {
+ if (interval == null) {
+ throw new IllegalArgumentException("interval cannot be null");
+ }
+ startDate = IntervalUtil.toLocalDate(interval.getStartMillis());
+ endDate = IntervalUtil.toLocalDate(interval.getEndMillis());
+ }
+
+ public AbstractInterval(final LocalDate startDate, final LocalDate endDate) {
+ this(startDate, endDate, PERSISTENT_ENDING);
+ }
+
+ public AbstractInterval(final LocalDate startDate, final LocalDate endDate, final IntervalEnding ending) {
+ this.startDate = startDate;
+ this.endDate = adjustDateIn(endDate, ending);
+ }
+
+ public Interval asInterval() {
+ return IntervalUtil.toInterval(this);
+ }
+
+ /**
+ * Does this date contain the specified time interval.
+ *
+ * @param date
+ * @return
+ */
+ public boolean contains(final LocalDate date) {
+ if (date == null){
+ return false;
+ }
+ if (endDate() == null) {
+ if (startDate() == null) {
+ return true;
+ }
+ if (date.isEqual(startDate()) || date.isAfter(startDate())) {
+ return true;
+ }
+ return false;
+ }
+ return asInterval().contains(date.toInterval());
+ }
+
+ /**
+ * Does this time interval contain the specified time interval.
+ *
+ * @param localDateInterval
+ * @return
+ */
+ public boolean contains(final T localDateInterval) {
+ return asInterval().contains(localDateInterval.asInterval());
+ }
+
+ /**
+ * The duration in days
+ *
+ * @return
+ */
+ public int days() {
+ if (isInfinite()) {
+ return 0;
+ }
+ Period p = new Period(asInterval(), PeriodType.days());
+ return p.getDays();
+ }
+
+ public LocalDate endDate() {
+ return endDate(PERSISTENT_ENDING);
+ }
+
+ public LocalDate endDate(final IntervalEnding ending) {
+ if (endDate == null) {
+ return null;
+ }
+ return adjustDateOut(endDate, ending);
+ }
+
+ public LocalDate endDateExcluding() {
+ return endDate(IntervalEnding.EXCLUDING_END_DATE);
+ }
+
+ public LocalDate endDateFromStartDate() {
+ return adjustDateOut(startDate(), PERSISTENT_ENDING);
+ }
+
+ public boolean isValid() {
+ return startDate == null || endDate == null || endDate.isAfter(startDate) || endDate.equals(startDate);
+ }
+
+
+ /**
+ * For benefit of subclass toString implementations.
+ */
+ protected String dateToString(LocalDate localDate) {
+ return dateToString(localDate, "yyyy-MM-dd");
+ }
+
+ /**
+ * For benefit of subclass toString implementations.
+ */
+ protected String dateToString(LocalDate localDate, String format) {
+ return localDate == null ? "----------" : localDate.toString(format);
+ }
+
+ /**
+ * Gets the overlap between this interval and another interval.
+ *
+ * @param otherInterval
+ * @return
+ */
+ @SuppressWarnings("unchecked")
+ public T overlap(final T otherInterval) {
+ if (otherInterval == null) {
+ return null;
+ }
+ if (otherInterval.isInfinite()) {
+ return (T)this;
+ }
+ if (this.isInfinite()) {
+ return otherInterval;
+ }
+ final Interval thisAsInterval = asInterval();
+ final Interval otherAsInterval = otherInterval.asInterval();
+ Interval overlap = thisAsInterval.overlap(otherAsInterval);
+ if (overlap == null) {
+ return null;
+ }
+ return newInterval(overlap);
+ }
+
+ /**
+ * Mandatory hook
+ * @param overlap
+ * @return
+ */
+ protected abstract T newInterval(Interval overlap);
+
+ /**
+ * Does this time interval contain the specified time interval.
+ *
+ * @param interval
+ * @return
+ */
+ public boolean overlaps(final T interval) {
+ return asInterval().overlaps(interval.asInterval());
+ }
+
+ public LocalDate startDate() {
+ return startDate;
+ }
+
+ @Override
+ public abstract String toString();
+
+ /**
+ * Does this interval is within the specified interval
+ *
+ * @param interval
+ * @return
+ */
+ public boolean within(final T interval) {
+ return interval.asInterval().contains(asInterval());
+ }
+
+ private LocalDate adjustDateIn(final LocalDate date, final IntervalEnding ending) {
+ if (date == null) {
+ return null;
+ }
+ return ending == IntervalEnding.INCLUDING_END_DATE ? date.plusDays(1) : date;
+ }
+
+ private LocalDate adjustDateOut(final LocalDate date, final IntervalEnding ending) {
+ if (date == null) {
+ return null;
+ }
+ return ending == IntervalEnding.INCLUDING_END_DATE ? date.minusDays(1) : date;
+ }
+
+ public boolean isInfinite() {
+ return startDate == null && endDate == null;
+ }
+
+ public boolean isOpenEnded() {
+ return endDate == null;
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/valuetypes/LocalDateInterval.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/valuetypes/LocalDateInterval.java
new file mode 100644
index 0000000..2679d29
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/valuetypes/LocalDateInterval.java
@@ -0,0 +1,130 @@
+package org.incode.module.base.dom.valuetypes;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.joda.time.Interval;
+import org.joda.time.LocalDate;
+
+public class LocalDateInterval extends AbstractInterval<LocalDateInterval>{
+
+ public static LocalDateInterval excluding(final LocalDate startDate, final LocalDate endDate) {
+ return new LocalDateInterval(startDate, endDate, IntervalEnding.EXCLUDING_END_DATE);
+ }
+
+ public static LocalDateInterval including(final LocalDate startDate, final LocalDate endDate) {
+ return new LocalDateInterval(startDate, endDate, IntervalEnding.INCLUDING_END_DATE);
+ }
+
+ // //////////////////////////////////////
+
+ public LocalDateInterval() {
+ }
+
+ public LocalDateInterval(final Interval interval) {
+ super(interval);
+ }
+
+ public LocalDateInterval(final LocalDate startDate, final LocalDate endDate) {
+ super(startDate, endDate);
+ }
+
+ public LocalDateInterval(final LocalDate startDate, final LocalDate endDate, final IntervalEnding ending) {
+ super(startDate, endDate, ending);
+ }
+
+ // //////////////////////////////////////
+
+ @Override
+ protected LocalDateInterval newInterval(Interval overlap) {
+ return new LocalDateInterval(overlap);
+ }
+
+ // //////////////////////////////////////
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (obj == null) {
+ return false;
+ }
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof LocalDateInterval)) {
+ return false;
+ }
+ LocalDateInterval rhs = (LocalDateInterval) obj;
+ return new EqualsBuilder().
+ append(startDate, rhs.startDate).
+ append(endDate, rhs.endDate).
+ isEquals();
+ }
+
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder().append(startDate).append(endDate).hashCode();
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder =
+ new StringBuilder(
+ dateToString(startDate()))
+ .append("/")
+ .append(dateToString(endDateExcluding()));
+ return builder.toString();
+ }
+
+ public String toString(String format) {
+ StringBuilder builder =
+ new StringBuilder(
+ dateToString(startDate(), format))
+ .append("/")
+ .append(dateToString(endDate(), format));
+ return builder.toString();
+ }
+
+ // //////////////////////////////////////
+
+ /**
+ * Parse a string representation of a LocalDateInterval
+ *
+ * Since this method is only used for testing it's not heavily guarded against illegal arguments
+ *
+ * @param input a string with format yyyy-mm-dd/yyyy-mm-dd, end date is excluding
+ * @return
+ */
+ public static LocalDateInterval parseString(final String input) {
+ String[] values = input.split("/");
+ try {
+ return new LocalDateInterval(parseLocalDate(values[0]), parseLocalDate(values[1]), IntervalEnding.EXCLUDING_END_DATE);
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Unable to parse " + input);
+ }
+ }
+
+ /**
+ * Parse a string to a LocalDate
+ *
+ * @param input a string representing a parsable LocalDate, "*" or "----------" returns null
+ * @return
+ */
+ private static LocalDate parseLocalDate(final String input) {
+ if (input.contains("--") || input.contains("*")) {
+ return null;
+ }
+ return LocalDate.parse(input);
+ }
+
+
+ /**
+ * Returns an end date given the start date of the next adjoining interverval
+ *
+ * @param date
+ * @return
+ */
+ public static LocalDate endDateFromStartDate(LocalDate date) {
+ return new LocalDateInterval(date, null).endDateFromStartDate();
+
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithCodeComparable.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithCodeComparable.java
new file mode 100644
index 0000000..fe15d4e
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithCodeComparable.java
@@ -0,0 +1,7 @@
+package org.incode.module.base.dom.with;
+
+
+
+public interface WithCodeComparable<T extends WithCodeComparable<T>> extends Comparable<T>, WithCodeGetter {
+ void setCode(String code);
+}
\ No newline at end of file
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithCodeGetter.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithCodeGetter.java
new file mode 100644
index 0000000..4093edf
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithCodeGetter.java
@@ -0,0 +1,31 @@
+package org.incode.module.base.dom.with;
+
+import org.apache.isis.applib.util.ObjectContracts.ToStringEvaluator;
+
+/**
+ * Indicates that the implementing class has a {@link #getCode() code}.
+ */
+public interface WithCodeGetter {
+
+ public String getCode();
+
+ /**
+ * Utility class for obtaining the string value of an object that implements {@link WithCodeGetter}.
+ */
+ public final static class ToString {
+ private ToString() {}
+ public static ToStringEvaluator evaluator() {
+ return new ToStringEvaluator() {
+ @Override
+ public boolean canEvaluate(final Object o) {
+ return o instanceof WithCodeGetter;
+ }
+
+ @Override
+ public String evaluate(final Object o) {
+ return ((WithCodeGetter)o).getCode();
+ }
+ };
+ }
+ }
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithCodeUnique.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithCodeUnique.java
new file mode 100644
index 0000000..7e0ac93
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithCodeUnique.java
@@ -0,0 +1,5 @@
+package org.incode.module.base.dom.with;
+
+public interface WithCodeUnique extends WithCodeGetter {
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithDescriptionComparable.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithDescriptionComparable.java
new file mode 100644
index 0000000..b5d475f
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithDescriptionComparable.java
@@ -0,0 +1,8 @@
+package org.incode.module.base.dom.with;
+
+
+
+public interface WithDescriptionComparable<T extends WithDescriptionComparable<T>>
+ extends Comparable<T>, WithDescriptionGetter {
+ void setDescription(String description);
+}
\ No newline at end of file
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithDescriptionGetter.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithDescriptionGetter.java
new file mode 100644
index 0000000..c0560c9
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithDescriptionGetter.java
@@ -0,0 +1,32 @@
+package org.incode.module.base.dom.with;
+
+import org.apache.isis.applib.util.ObjectContracts.ToStringEvaluator;
+
+/**
+ * Indicates that the implementing class has a {@link #getDescription() description}.
+ */
+public interface WithDescriptionGetter {
+
+ public String getDescription();
+
+ /**
+ * Utility class for obtaining the string value of an object that implements {@link WithDescriptionGetter}.
+ */
+ public final static class ToString {
+ private ToString() {}
+ public static ToStringEvaluator evaluator() {
+ return new ToStringEvaluator() {
+ @Override
+ public boolean canEvaluate(final Object o) {
+ return o instanceof WithDescriptionGetter;
+ }
+
+ @Override
+ public String evaluate(final Object o) {
+ return ((WithDescriptionGetter)o).getDescription();
+ }
+ };
+ }
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithDescriptionUnique.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithDescriptionUnique.java
new file mode 100644
index 0000000..79d3a2f
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithDescriptionUnique.java
@@ -0,0 +1,5 @@
+package org.incode.module.base.dom.with;
+
+public interface WithDescriptionUnique extends WithDescriptionGetter {
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithInterval.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithInterval.java
new file mode 100644
index 0000000..8d22748
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithInterval.java
@@ -0,0 +1,133 @@
+package org.incode.module.base.dom.with;
+
+import java.util.Iterator;
+import java.util.SortedSet;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+
+import org.apache.isis.applib.annotation.*;
+import org.joda.time.LocalDate;
+
+import org.incode.module.base.dom.valuetypes.LocalDateInterval;
+
+public interface WithInterval<T extends WithInterval<T>> extends WithStartDate {
+
+ /**
+ * The start date of the interval.
+ *
+ * <p>
+ * A value of <tt>null</tt> implies that the parent's start date should be used. If
+ * that is <tt>null</tt>, then implies 'the beginning of time'.
+ */
+ @Property(editing = Editing.DISABLED, optionality = Optionality.OPTIONAL)
+ public LocalDate getStartDate();
+
+ public void setStartDate(LocalDate startDate);
+
+ /**
+ * The end date of the interval.
+ *
+ * <p>
+ * A value of <tt>null</tt> implies that the parent's end date should be used. If
+ * that is <tt>null</tt>, then implies 'the end of time'.
+ */
+ @Property(editing = Editing.DISABLED, optionality = Optionality.OPTIONAL)
+ public LocalDate getEndDate();
+
+ public void setEndDate(LocalDate endDate);
+
+ // /**
+ // * The parent "owning" object, if any, that is itself a {@link
+ // WithInterval}
+ // * .
+ // *
+ // * <p>
+ // * Used to determine the {@link #getEffectiveStartDate() effective start
+ // * date} and {@link #getEffectiveEndDate() effective end date} when the
+ // * actual {@link #getStartDate() start date} and {@link #getEndDate() end
+ // * date} are <tt>null</tt> (in other words the start/end date are
+ // inherited
+ // * from the parent).
+ // */
+ // @Hidden
+ // public WithInterval<?> getWithIntervalParent();
+
+ // /**
+ // * Either the {@link #getStartDate() start date}, or the
+ // * {@link #getWithIntervalParent() parent}'s start date (if any).
+ // */
+ // @Hidden
+ // public LocalDate getEffectiveStartDate();
+
+ // /**
+ // * Either the {@link #getEndDate() end date}, or the
+ // * {@link #getWithIntervalParent() parent}'s end date (if any).
+ // */
+ // @Hidden
+ // public LocalDate getEffectiveEndDate();
+
+ @Programmatic
+ public LocalDateInterval getInterval();
+
+ @Programmatic
+ public LocalDateInterval getEffectiveInterval();
+
+ @Programmatic
+ public boolean isCurrent();
+
+ public final static class Util {
+ private Util() {
+ }
+
+ // public static LocalDate effectiveStartDateOf(final WithInterval<?>
+ // wi) {
+ // if (wi.getStartDate() != null) {
+ // return wi.getStartDate();
+ // }
+ // final WithInterval<?> parentWi = wi.getWithIntervalParent();
+ // if (parentWi != null) {
+ // return parentWi.getEffectiveStartDate();
+ // }
+ // return null;
+ // }
+
+ // public static LocalDate effectiveEndDateOf(final WithInterval<?> wi)
+ // {
+ // if (wi.getEndDate() != null) {
+ // return wi.getEndDate();
+ // }
+ // final WithInterval<?> parentWi = wi.getWithIntervalParent();
+ // if (parentWi != null) {
+ // return parentWi.getEffectiveEndDate();
+ // }
+ // return null;
+ // }
+
+ public static <T extends WithInterval<T>> T firstElseNull(
+ final SortedSet<T> roles, final Predicate<T> predicate) {
+ final Iterable<T> filter = Iterables.filter(roles, predicate);
+ final Iterator<T> iterator = filter.iterator();
+ return iterator.hasNext() ? iterator.next() : null;
+ }
+ }
+
+ public final static class Predicates {
+
+ private Predicates(){}
+
+ /**
+ * A {@link Predicate} that tests whether the role's {@link WithInterval#isCurrent() current}
+ * status is the specified value.
+ */
+ public static <T extends WithInterval<T>> Predicate<T> whetherCurrentIs(final boolean current) {
+ return new Predicate<T>() {
+ public boolean apply(final T candidate) {
+ return candidate != null && candidate.isCurrent() == current;
+ }
+ };
+ }
+
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithIntervalContiguous.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithIntervalContiguous.java
new file mode 100644
index 0000000..84dc3d8
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithIntervalContiguous.java
@@ -0,0 +1,268 @@
+package org.incode.module.base.dom.with;
+
+import java.util.SortedSet;
+
+import com.google.common.base.Objects;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Sets;
+
+import org.apache.isis.applib.annotation.*;
+import org.joda.time.LocalDate;
+
+import org.incode.module.base.dom.Chained;
+
+public interface WithIntervalContiguous<T extends WithIntervalContiguous<T>>
+ extends WithIntervalMutable<T>, Comparable<T> {
+
+
+ /**
+ * The interval that immediately precedes this one, if any.
+ *
+ * <p>
+ * The predecessor's {@link #getEndDate() end date} is the day before this interval's
+ * {@link #getStartDate() start date}.
+ *
+ * <p>
+ * Implementations where successive intervals are NOT contiguous should instead implement {@link Chained}.
+ */
+ @Property(editing = Editing.DISABLED, hidden=Where.ALL_TABLES, optionality = Optionality.OPTIONAL)
+ public T getPredecessor();
+
+ /**
+ * The interval that immediately succeeds this one, if any.
+ *
+ * <p>
+ * The successor's {@link #getStartDate() start date} is the day after this interval's
+ * {@link #getEndDate() end date}.
+ *
+ * <p>
+ * Implementations where successive intervals are NOT contiguous should instead implement {@link Chained}.
+ */
+ @Property(editing = Editing.DISABLED, hidden=Where.ALL_TABLES, optionality = Optionality.OPTIONAL)
+ public T getSuccessor();
+
+
+
+ /**
+ * Show this {@link WithIntervalContiguous} in context with its
+ * predecessors and successors.
+ *
+ * <p>
+ * This will typically (always) be a derived collection obtained
+ * by filtering a collection of the "parent".
+ */
+ @Property(editing = Editing.DISABLED)
+ public SortedSet<T> getTimeline();
+
+
+ // //////////////////////////////////////
+
+
+ public interface Factory<T extends WithIntervalContiguous<T>> {
+ T newRole(LocalDate startDate, LocalDate endDate);
+ }
+
+ /**
+ * Helper class for implementations to delegate to.
+ */
+ public static class Helper<T extends WithIntervalContiguous<T>> {
+
+ private final T withInterval;
+ public Helper(final T withInterval) {
+ this.withInterval = withInterval;
+ }
+
+ // //////////////////////////////////////
+
+ public T succeededBy(
+ final LocalDate startDate,
+ final LocalDate endDate,
+ final WithIntervalContiguous.Factory<T> factory) {
+ final WithInterval<?> successor = withInterval.getSuccessor();
+ if(successor != null) {
+ successor.setStartDate(dayAfterElseNull(endDate));
+ }
+ withInterval.setEndDate(dayBeforeElseNull(startDate));
+ return factory.newRole(startDate, endDate);
+ }
+
+ public LocalDate default1SucceededBy() {
+ return dayAfterElseNull(withInterval.getEndDate());
+ }
+
+ public String validateSucceededBy(
+ final LocalDate startDate,
+ final LocalDate endDate) {
+ if(startDate != null && endDate != null && startDate.isAfter(endDate)) {
+ return "End date cannot be earlier than start date";
+ }
+ if(withInterval.getStartDate() != null && !withInterval.getStartDate().isBefore(startDate)) {
+ return "Successor must start after existing";
+ }
+ final WithInterval<?> successor = withInterval.getSuccessor();
+ if(successor != null) {
+ if (endDate == null) {
+ return "An end date is required because a successor already exists";
+ }
+ if(successor.getEndDate() != null && !endDate.isBefore(successor.getEndDate())) {
+ return "Successor must end prior to existing successor";
+ }
+ }
+ return null;
+ }
+
+ // //////////////////////////////////////
+
+
+ public T precededBy(
+ final LocalDate startDate,
+ final LocalDate endDate,
+ final WithIntervalContiguous.Factory<T> factory) {
+
+ final WithInterval<?> predecessor = withInterval.getPredecessor();
+ if(predecessor != null) {
+ predecessor.setEndDate(dayBeforeElseNull(startDate));
+ }
+ withInterval.setStartDate(dayAfterElseNull(endDate));
+ return factory.newRole(startDate, endDate);
+ }
+
+ public LocalDate default2PrecededBy() {
+ return dayBeforeElseNull(withInterval.getStartDate());
+ }
+
+ public String validatePrecededBy(
+ final LocalDate startDate,
+ final LocalDate endDate) {
+ if(startDate != null && endDate != null && startDate.isAfter(endDate)) {
+ return "End date cannot be earlier than start date";
+ }
+ if(withInterval.getEndDate() != null && !withInterval.getEndDate().isAfter(endDate)) {
+ return "Predecessor must end before existing";
+ }
+ final WithInterval<?> predecessor = withInterval.getPredecessor();
+ if(predecessor != null) {
+ if (startDate == null) {
+ return "A start date is required because a predecessor already exists";
+ }
+ if(predecessor.getStartDate() != null && !startDate.isAfter(predecessor.getStartDate())) {
+ return "Predecessor must start after existing predecessor";
+ }
+ }
+ return null;
+ }
+
+
+ // //////////////////////////////////////
+
+ @Programmatic
+ public T getPredecessor(final SortedSet<T> siblings, final Predicate<? super T> filter) {
+ return WithInterval.Util.firstElseNull(
+ siblings,
+ com.google.common.base.Predicates.<T>and(
+ filter,
+ endDatePreceding(withInterval.getStartDate())));
+ }
+
+ @Programmatic
+ public T getSuccessor(final SortedSet<T> siblings, final Predicate<? super T> filter) {
+ return WithInterval.Util.firstElseNull(
+ siblings,
+ com.google.common.base.Predicates.<T>and(
+ filter,
+ startDateFollowing(withInterval.getEndDate())));
+
+ }
+
+ private Predicate<T> startDateFollowing(final LocalDate date) {
+ return new Predicate<T>() {
+ @Override
+ public boolean apply(final T ar) {
+ return date != null && ar != null && Objects.equal(ar.getStartDate(), date.plusDays(1));
+ }
+ };
+ }
+
+ private Predicate<T> endDatePreceding(final LocalDate date) {
+ return new Predicate<T>() {
+ @Override
+ public boolean apply(final T ar) {
+ return date != null && ar != null && Objects.equal(ar.getEndDate(), date.minusDays(1));
+ }
+ };
+ }
+
+ // //////////////////////////////////////
+
+ @Programmatic
+ public SortedSet<T> getTimeline(final SortedSet<T> siblings, final Predicate<? super T> filter) {
+ return Sets.newTreeSet(Sets.filter(siblings, filter));
+ }
+
+ // //////////////////////////////////////
+
+ public T changeDates(
+ final LocalDate startDate,
+ final LocalDate endDate) {
+
+ final T predecessor = withInterval.getPredecessor();
+ if(predecessor != null) {
+ predecessor.setEndDate(dayBeforeElseNull(startDate));
+ }
+ final T successor = withInterval.getSuccessor();
+ if(successor != null) {
+ successor.setStartDate(dayAfterElseNull(endDate));
+ }
+ withInterval.setStartDate(startDate);
+ withInterval.setEndDate(endDate);
+ return withInterval;
+ }
+
+ public LocalDate default0ChangeDates() {
+ return withInterval.getEffectiveInterval().startDate();
+ }
+
+ public LocalDate default1ChangeDates() {
+ return withInterval.getEffectiveInterval().endDate();
+ }
+
+ public String validateChangeDates(
+ final LocalDate startDate,
+ final LocalDate endDate) {
+
+ if(startDate != null && endDate != null && startDate.isAfter(endDate)) {
+ return "End date cannot be earlier than start date";
+ }
+ final T predecessor = withInterval.getPredecessor();
+ if (predecessor != null) {
+ if(startDate == null) {
+ return "Start date cannot be set to null if there is a predecessor";
+ }
+ if(predecessor.getStartDate() != null && !predecessor.getStartDate().isBefore(startDate)) {
+ return "Start date cannot be on/before start of current predecessor";
+ }
+ }
+ final T successor = withInterval.getSuccessor();
+ if (successor != null) {
+ if(endDate == null) {
+ return "End date cannot be set to null if there is a successor";
+ }
+ if(successor.getEndDate() != null && !successor.getEndDate().isAfter(endDate)) {
+ return "End date cannot be on/after end of current successor";
+ }
+ }
+ return null;
+ }
+
+ // //////////////////////////////////////
+
+ private static LocalDate dayBeforeElseNull(final LocalDate date) {
+ return date!=null?date.minusDays(1):null;
+ }
+ private static LocalDate dayAfterElseNull(final LocalDate date) {
+ return date!=null?date.plusDays(1):null;
+ }
+
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithIntervalMutable.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithIntervalMutable.java
new file mode 100644
index 0000000..ba70ad0
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithIntervalMutable.java
@@ -0,0 +1,70 @@
+package org.incode.module.base.dom.with;
+
+import org.joda.time.LocalDate;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.Optionality;
+import org.apache.isis.applib.annotation.Parameter;
+import org.apache.isis.applib.annotation.SemanticsOf;
+
+import org.incode.module.base.dom.valuetypes.LocalDateInterval;
+
+public interface WithIntervalMutable<T extends WithIntervalMutable<T>> extends WithInterval<T> {
+
+ @Action(semantics = SemanticsOf.IDEMPOTENT)
+ public T changeDates(
+ final @Parameter(optionality = Optionality.OPTIONAL) LocalDate startDate,
+ final @Parameter(optionality = Optionality.OPTIONAL) LocalDate endDate);
+
+ public LocalDate default0ChangeDates();
+
+ public LocalDate default1ChangeDates();
+
+ public String validateChangeDates(
+ final LocalDate startDate,
+ final LocalDate endDate);
+
+ /**
+ * Helper class for implementations to delegate to.
+ *
+ * <p>
+ * If the class implements {@link WithIntervalContiguous} then use
+ * {@link WithIntervalContiguous.Helper} instead.
+ */
+ public static class Helper<T extends WithIntervalMutable<T>> {
+
+ private T withInterval;
+
+ public Helper(final T withInterval) {
+ this.withInterval = withInterval;
+ }
+
+ public T changeDates(
+ final LocalDate startDate,
+ final LocalDate endDate) {
+ withInterval.setStartDate(startDate);
+ withInterval.setEndDate(endDate);
+ return withInterval;
+ }
+
+ public LocalDate default0ChangeDates() {
+ LocalDateInterval interval = withInterval.getInterval();
+ return interval == null ? null : interval.startDate();
+ }
+
+ public LocalDate default1ChangeDates() {
+ LocalDateInterval interval = withInterval.getInterval();
+ return interval == null ? null : interval.endDate();
+ }
+
+ public String validateChangeDates(
+ final LocalDate startDate,
+ final LocalDate endDate) {
+ if (startDate != null && endDate != null && !startDate.isBefore(endDate)) {
+ return "End date must be after start date";
+ }
+ return null;
+ }
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithNameComparable.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithNameComparable.java
new file mode 100644
index 0000000..854768a
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithNameComparable.java
@@ -0,0 +1,8 @@
+package org.incode.module.base.dom.with;
+
+
+
+public interface WithNameComparable<T extends WithNameComparable<T>> extends Comparable<T>, WithNameGetter {
+
+ void setName(String name);
+}
\ No newline at end of file
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithNameGetter.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithNameGetter.java
new file mode 100644
index 0000000..0f19899
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithNameGetter.java
@@ -0,0 +1,32 @@
+package org.incode.module.base.dom.with;
+
+import org.apache.isis.applib.util.ObjectContracts;
+
+/**
+ * Indicates that the implementing class has a {@link #getName() name}.
+ */
+public interface WithNameGetter {
+
+ public String getName();
+
+ /**
+ * Utility class for obtaining the string value of an object that implements {@link WithNameGetter}.
+ */
+ public final static class ToString {
+ private ToString() {}
+ public static ObjectContracts.ToStringEvaluator evaluator() {
+ return new ObjectContracts.ToStringEvaluator() {
+ @Override
+ public boolean canEvaluate(final Object o) {
+ return o instanceof WithNameGetter;
+ }
+
+ @Override
+ public String evaluate(final Object o) {
+ return ((WithNameGetter)o).getName();
+ }
+ };
+ }
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithNameUnique.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithNameUnique.java
new file mode 100644
index 0000000..eaa595b
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithNameUnique.java
@@ -0,0 +1,5 @@
+package org.incode.module.base.dom.with;
+
+public interface WithNameUnique extends WithNameGetter {
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithReferenceComparable.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithReferenceComparable.java
new file mode 100644
index 0000000..8c64e07
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithReferenceComparable.java
@@ -0,0 +1,8 @@
+package org.incode.module.base.dom.with;
+
+
+
+public interface WithReferenceComparable<T extends WithReferenceComparable<T>>
+ extends Comparable<T>, WithReferenceGetter {
+ void setReference(String reference);
+}
\ No newline at end of file
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithReferenceGetter.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithReferenceGetter.java
new file mode 100644
index 0000000..0bfe1d6
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithReferenceGetter.java
@@ -0,0 +1,33 @@
+package org.incode.module.base.dom.with;
+
+import org.apache.isis.applib.util.ObjectContracts.ToStringEvaluator;
+
+
+/**
+ * Indicates that the implementing class has a {@link #getReference() reference}.
+ */
+public interface WithReferenceGetter {
+
+ public String getReference();
+
+ /**
+ * Utility class for obtaining the string value of an object that implements {@link WithReferenceGetter}.
+ */
+ public final static class ToString {
+ private ToString() {}
+ public static ToStringEvaluator evaluator() {
+ return new ToStringEvaluator() {
+ @Override
+ public boolean canEvaluate(final Object o) {
+ return o instanceof WithReferenceGetter;
+ }
+
+ @Override
+ public String evaluate(final Object o) {
+ return ((WithReferenceGetter)o).getReference();
+ }
+ };
+ }
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithReferenceUnique.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithReferenceUnique.java
new file mode 100644
index 0000000..b85b6db
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithReferenceUnique.java
@@ -0,0 +1,5 @@
+package org.incode.module.base.dom.with;
+
+public interface WithReferenceUnique extends WithReferenceGetter {
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithSequence.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithSequence.java
new file mode 100644
index 0000000..45d4986
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithSequence.java
@@ -0,0 +1,9 @@
+package org.incode.module.base.dom.with;
+
+import java.math.BigInteger;
+
+public interface WithSequence {
+
+ public BigInteger getSequence();
+ public void setSequence(BigInteger sequence);
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithStartDate.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithStartDate.java
new file mode 100644
index 0000000..81f2fd9
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithStartDate.java
@@ -0,0 +1,13 @@
+package org.incode.module.base.dom.with;
+
+import org.apache.isis.applib.annotation.Editing;
+import org.apache.isis.applib.annotation.Property;
+import org.joda.time.LocalDate;
+
+public interface WithStartDate {
+
+ @Property(editing = Editing.DISABLED)
+ public LocalDate getStartDate();
+ public void setStartDate(LocalDate startDate);
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithTitleComparable.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithTitleComparable.java
new file mode 100644
index 0000000..9a0862d
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithTitleComparable.java
@@ -0,0 +1,7 @@
+package org.incode.module.base.dom.with;
+
+
+
+public interface WithTitleComparable<T extends WithTitleComparable<T>> extends Comparable<T>, WithTitleGetter {
+ void setTitle(String title);
+}
\ No newline at end of file
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithTitleGetter.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithTitleGetter.java
new file mode 100644
index 0000000..c7a47f8
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithTitleGetter.java
@@ -0,0 +1,32 @@
+package org.incode.module.base.dom.with;
+
+import org.apache.isis.applib.util.ObjectContracts.ToStringEvaluator;
+
+/**
+ * Indicates that the implementing class has a {@link #getTitle() title}.
+ */
+public interface WithTitleGetter {
+
+ public String getTitle();
+
+ /**
+ * Utility class for obtaining the string value of an object that implements {@link WithTitleGetter}.
+ */
+ public final static class ToString {
+ private ToString() {}
+ public static ToStringEvaluator evaluator() {
+ return new ToStringEvaluator() {
+ @Override
+ public boolean canEvaluate(final Object o) {
+ return o instanceof WithTitleGetter;
+ }
+
+ @Override
+ public String evaluate(final Object o) {
+ return ((WithTitleGetter)o).getTitle();
+ }
+ };
+ }
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithTitleUnique.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithTitleUnique.java
new file mode 100644
index 0000000..e38be2f
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/dom/with/WithTitleUnique.java
@@ -0,0 +1,5 @@
+package org.incode.module.base.dom.with;
+
+public interface WithTitleUnique extends WithTitleGetter {
+
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/integtests/VT.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/integtests/VT.java
new file mode 100644
index 0000000..c490f43
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/integtests/VT.java
@@ -0,0 +1,134 @@
+package org.incode.module.base.integtests;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.math.RoundingMode;
+import org.incode.module.base.dom.valuetypes.AbstractInterval;
+import org.incode.module.base.dom.valuetypes.LocalDateInterval;
+import org.joda.time.LocalDate;
+
+/**
+ * Factory methods for value types
+ */
+public final class VT {
+
+ private VT(){}
+
+ // //////////////////////////////////////
+
+ public static LocalDateInterval ldi(String intervalStr) {
+ return intervalStr != null? LocalDateInterval.parseString(intervalStr) : null;
+ }
+
+ public static LocalDateInterval ldi(LocalDate st, LocalDate endDate, AbstractInterval.IntervalEnding intervalEnding) {
+ return new LocalDateInterval(st, endDate, intervalEnding);
+ }
+
+ public static LocalDateInterval ldix(LocalDate st, LocalDate endDate) {
+ return ldi(st, endDate, AbstractInterval.IntervalEnding.EXCLUDING_END_DATE);
+ }
+
+ // //////////////////////////////////////
+
+ /**
+ *
+ * @param dateStr - in form "yyyy-MM-dd"
+ */
+ public static LocalDate ld(String dateStr) {
+ return dateStr != null? LocalDate.parse(dateStr) : null;
+ }
+
+ public static LocalDate ld(int yyyy, int mm, int dd) {
+ return new LocalDate(yyyy,mm,dd);
+ }
+
+ // //////////////////////////////////////
+
+ public static BigInteger bi(int val) {
+ return BigInteger.valueOf(val);
+ }
+ public static BigInteger bi(Integer val) {
+ return val != null ? bi(val): null;
+ }
+
+ // //////////////////////////////////////
+
+ public static BigDecimal bd(String str) {
+ return new BigDecimal(str);
+ }
+
+ public static BigDecimal bd(double val) {
+ return BigDecimal.valueOf(val);
+ }
+ public static BigDecimal bd(double v, int scale) {
+ return bd(v).setScale(scale);
+ }
+ public static BigDecimal bd(double v, int scale, RoundingMode roundingMode) {
+ return bd(v).setScale(scale, roundingMode);
+ }
+ public static BigDecimal bd2(double v) {
+ return bd(v, 2);
+ }
+ public static BigDecimal bd2hup(double v) {
+ return bd(v,2, RoundingMode.HALF_UP);
+ }
+ public static BigDecimal bd4(double v) {
+ return bd(v,4);
+ }
+
+
+ public static BigDecimal bd(Double val) {
+ return val != null? bd(val.doubleValue()): null;
+ }
+ public static BigDecimal bd(Double val, int scale) {
+ return val != null? bd(val.doubleValue(), scale): null;
+ }
+ public static BigDecimal bd(Double val, int scale, RoundingMode roundingMode) {
+ return val != null? bd(val.doubleValue(), scale, roundingMode): null;
+ }
+ public static BigDecimal bd2(Double val) {
+ return val != null? bd2(val.doubleValue()): null;
+ }
+ public static BigDecimal bd2hup(Double val) {
+ return val != null? bd2hup(val.doubleValue()): null;
+ }
+ public static BigDecimal bd4(Double val) {
+ return val != null? bd4(val.doubleValue()): null;
+ }
+
+
+ public static BigDecimal bd(int val) {
+ return BigDecimal.valueOf(val);
+ }
+ public static BigDecimal bd(int val, int newScale) {
+ return bd(val).setScale(newScale);
+ }
+ public static BigDecimal bd1(int val) {
+ return bd(val, 1);
+ }
+ public static BigDecimal bd2(int val) {
+ return bd(val, 2);
+ }
+ public static BigDecimal bd4(int val) {
+ return bd(val, 4);
+ }
+
+
+ public static BigDecimal bd(Integer val) {
+ return val != null? bd(val.intValue()): null;
+ }
+ public static BigDecimal bd(Integer val, int newScale) {
+ return val != null? bd(val.intValue(), newScale): null;
+ }
+ public static BigDecimal bd1(Integer val) {
+ return val != null? bd1(val.intValue()): null;
+ }
+ public static BigDecimal bd2(Integer val) {
+ return val != null? bd2(val.intValue()): null;
+ }
+ public static BigDecimal bd4(Integer val) {
+ return val != null? bd4(val.intValue()): null;
+ }
+
+}
+
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/services/BaseServicesModule.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/services/BaseServicesModule.java
new file mode 100644
index 0000000..a77f27c
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/services/BaseServicesModule.java
@@ -0,0 +1,4 @@
+package org.incode.module.base.services;
+
+public class BaseServicesModule {
+}
diff --git a/extensions/lib/base/impl/src/main/java/org/incode/module/base/services/calendar/CalendarService.java b/extensions/lib/base/impl/src/main/java/org/incode/module/base/services/calendar/CalendarService.java
new file mode 100644
index 0000000..3cff4d3
--- /dev/null
+++ b/extensions/lib/base/impl/src/main/java/org/incode/module/base/services/calendar/CalendarService.java
@@ -0,0 +1,67 @@
+package org.incode.module.base.services.calendar;
+
+import javax.inject.Inject;
+
+import org.joda.time.LocalDate;
+
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.Programmatic;
+
+@DomainService(nature = NatureOfService.DOMAIN)
+public class CalendarService {
+
+ private static final int MONTHS_IN_QUARTER = 3;
+
+ // cannot have the same id as the superclass
+ // (that is also registered as a service by virtue of @DomainService)
+ public String getId() {
+ return "incodeClockService";
+ }
+
+ /**
+ * @deprecated - use {@link org.apache.isis.applib.services.clock.ClockService#nowAsMillis()}.
+ */
+ @Deprecated
+ @Programmatic
+ public long timestamp() {
+ return clockService.nowAsMillis();
+ }
+
+ // //////////////////////////////////////
+
+ @Programmatic
+ public LocalDate beginningOfMonth() {
+ return beginningOfMonth(clockService.now());
+ }
+
+ static LocalDate beginningOfMonth(final LocalDate date) {
+ final int dayOfMonth = date.getDayOfMonth();
+ return date.minusDays(dayOfMonth-1);
+ }
+
+ // //////////////////////////////////////
+
+ @Programmatic
+ public LocalDate beginningOfQuarter() {
+ final LocalDate date = clockService.now();
+ return beginningOfQuarter(date);
+ }
+
+ @Programmatic
+ public LocalDate beginningOfNextQuarter() {
+ final LocalDate date = clockService.now().plusMonths(3);
+ return beginningOfQuarter(date);
+ }
+
+ static LocalDate beginningOfQuarter(final LocalDate date) {
+ final LocalDate beginningOfMonth = beginningOfMonth(date);
+ final int monthOfYear = beginningOfMonth.getMonthOfYear();
+ final int quarter = (monthOfYear-1)/MONTHS_IN_QUARTER; // 0, 1, 2, 3
+ final int monthStartOfQuarter = quarter*MONTHS_IN_QUARTER+1;
+ return beginningOfMonth.minusMonths(monthOfYear-monthStartOfQuarter);
+ }
+
+ @Inject
+ org.apache.isis.applib.services.clock.ClockService clockService;
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/IsisMatchers.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/IsisMatchers.java
new file mode 100644
index 0000000..afa124c
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/IsisMatchers.java
@@ -0,0 +1,336 @@
+package org.incode.module.base;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.isis.commons.internal.base._Strings;
+import org.apache.isis.metamodel.commons.StringExtensions;
+import org.glassfish.pfl.dynamic.generator.Factory;
+import org.hamcrest.CoreMatchers;
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+import org.hamcrest.Matchers;
+import org.hamcrest.TypeSafeMatcher;
+import org.hamcrest.core.IsEqual;
+import org.hamcrest.core.StringContains;
+import org.hamcrest.core.StringEndsWith;
+import org.hamcrest.core.StringStartsWith;
+
+import static org.hamcrest.CoreMatchers.nullValue;
+
+/**
+ * Hamcrest {@link org.hamcrest.Matcher} implementations.
+ *
+ */
+public final class IsisMatchers {
+
+ private IsisMatchers() {
+ }
+
+ public static Matcher<String> containsStripNewLines(final String expected) {
+ final String strippedExpected = StringExtensions.stripNewLines(expected);
+ return new StringContains(false, strippedExpected) {
+ @Override
+ public boolean matchesSafely(final String actual) {
+ return super.matchesSafely(StringExtensions.stripNewLines(actual));
+ }
+
+ @Override
+ public void describeTo(final Description description) {
+ description.appendText("a string (ignoring new lines) containing").appendValue(strippedExpected);
+ }
+ };
+ }
+
+ public static Matcher<String> equalToStripNewLines(final String expected) {
+ final String strippedExpected = StringExtensions.stripNewLines(expected);
+ return new IsEqual<String>(strippedExpected) {
+ @Override
+ public boolean matches(final Object actualObj) {
+ final String actual = (String) actualObj;
+ return super.matches(StringExtensions.stripNewLines(actual));
+ }
+
+ @Override
+ public void describeTo(final Description description) {
+ description.appendText("a string (ignoring new lines) equal to").appendValue(strippedExpected);
+ }
+ };
+ }
+
+ public static StringStartsWith startsWithStripNewLines(final String expected) {
+ final String strippedExpected = StringExtensions.stripNewLines(expected);
+ return new StringStartsWith(false, strippedExpected) {
+ @Override
+ public boolean matchesSafely(final String actual) {
+ return super.matchesSafely(StringExtensions.stripNewLines(actual));
+ }
+
+ @Override
+ public void describeTo(final Description description) {
+ description.appendText("a string (ignoring new lines) starting with").appendValue(strippedExpected);
+ }
+ };
+ }
+
+ public static Matcher<String> endsWithStripNewLines(final String expected) {
+ final String strippedExpected = StringExtensions.stripNewLines(expected);
+ return new StringEndsWith(false, strippedExpected) {
+ @Override
+ public boolean matchesSafely(final String actual) {
+ return super.matchesSafely(StringExtensions.stripNewLines(actual));
+ }
+
+ @Override
+ public void describeTo(final Description description) {
+ description.appendText("a string (ignoring new lines) ending with").appendValue(strippedExpected);
+ }
+ };
+ }
+
+ public static <T> Matcher<T> anInstanceOf(final Class<T> expected) {
+ return new TypeSafeMatcher<T>() {
+ @Override
+ public boolean matchesSafely(final T actual) {
+ return expected.isAssignableFrom(actual.getClass());
+ }
+
+ @Override
+ public void describeTo(final Description description) {
+ description.appendText("an instance of ").appendValue(expected);
+ }
+ };
+ }
+
+ public static Matcher<String> nonEmptyString() {
+ return new TypeSafeMatcher<String>() {
+ @Override
+ public boolean matchesSafely(final String str) {
+ return str != null && str.length() > 0;
+ }
+
+ @Override
+ public void describeTo(final Description description) {
+ description.appendText("a non empty string");
+ }
+
+ };
+ }
+
+ @SuppressWarnings("unchecked")
+ public static Matcher<String> nonEmptyStringOrNull() {
+ return CoreMatchers.anyOf(nullValue(String.class), nonEmptyString());
+ }
+
+ public static Matcher<List<?>> containsElementThat(final Matcher<?> elementMatcher) {
+ return new TypeSafeMatcher<List<?>>() {
+ @Override
+ public boolean matchesSafely(final List<?> list) {
+ for (final Object o : list) {
+ if (elementMatcher.matches(o)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void describeTo(final Description description) {
+ description.appendText("contains element that ").appendDescriptionOf(elementMatcher);
+ }
+ };
+ }
+
+ public static <T extends Comparable<T>> Matcher<T> greaterThan(final T c) {
+ return Matchers.greaterThan(c);
+ }
+
+ public static Matcher<Class<?>> classEqualTo(final Class<?> operand) {
+
+ class ClassEqualsMatcher extends TypeSafeMatcher<Class<?>> {
+ private final Class<?> clazz;
+
+ public ClassEqualsMatcher(final Class<?> clazz) {
+ this.clazz = clazz;
+ }
+
+ @Override
+ public boolean matchesSafely(final Class<?> arg) {
+ return clazz == arg;
+ }
+
+ @Override
+ public void describeTo(final Description description) {
+ description.appendValue(clazz);
+ }
+ }
+
+ return new ClassEqualsMatcher(operand);
+ }
+
+ public static Matcher<File> existsAndNotEmpty() {
+
+ return new TypeSafeMatcher<File>() {
+
+ @Override
+ public void describeTo(final Description arg0) {
+ arg0.appendText("exists and is not empty");
+ }
+
+ @Override
+ public boolean matchesSafely(final File f) {
+ return f.exists() && f.length() > 0;
+ }
+ };
+ }
+
+ public static Matcher<String> matches(final String regex) {
+ return new TypeSafeMatcher<String>() {
+
+ @Override
+ public void describeTo(final Description description) {
+ description.appendText("string matching " + regex);
+ }
+
+ @Override
+ public boolean matchesSafely(final String str) {
+ return str.matches(regex);
+ }
+ };
+ }
+
+ public static <X> Matcher<Class<X>> anySubclassOf(final Class<X> cls) {
+ return new TypeSafeMatcher<Class<X>>() {
+
+ @Override
+ public void describeTo(final Description arg0) {
+ arg0.appendText("is subclass of ").appendText(cls.getName());
+ }
+
+ @Override
+ public boolean matchesSafely(final Class<X> item) {
+ return cls.isAssignableFrom(item);
+ }
+ };
+ }
+
+ public static <T> Matcher<List<T>> sameContentsAs(final List<T> expected) {
+ return new TypeSafeMatcher<List<T>>() {
+
+ @Override
+ public void describeTo(final Description description) {
+ description.appendText("same sequence as " + expected);
+ }
+
+ @Override
+ public boolean matchesSafely(final List<T> actual) {
+ return actual.containsAll(expected) && expected.containsAll(actual);
+ }
+ };
+ }
+
+ public static <T> Matcher<List<T>> listContaining(final T t) {
+ return new TypeSafeMatcher<List<T>>() {
+
+ @Override
+ public void describeTo(Description arg0) {
+ arg0.appendText("list containing ").appendValue(t);
+ }
+
+ @Override
+ public boolean matchesSafely(List<T> arg0) {
+ return arg0.contains(t);
+ }
+ };
+ }
+
+ public static <T> Matcher<List<T>> listContainingAll(final T... items) {
+ return new TypeSafeMatcher<List<T>>() {
+
+ @Override
+ public void describeTo(Description arg0) {
+ arg0.appendText("has items ").appendValue(items);
+
+ }
+
+ @Override
+ public boolean matchesSafely(List<T> arg0) {
+ return arg0.containsAll(Arrays.asList(items));
+ }
+ };
+ }
+
+ public static Matcher<List<Object>> containsObjectOfType(final Class<?> cls) {
+ return new TypeSafeMatcher<List<Object>>() {
+
+ @Override
+ public void describeTo(final Description desc) {
+ desc.appendText("contains instance of type " + cls.getName());
+ }
+
+ @Override
+ public boolean matchesSafely(final List<Object> items) {
+ for (final Object object : items) {
+ if (cls.isAssignableFrom(object.getClass())) {
+ return true;
+ }
+ }
+ return false;
+ }
+ };
+ }
+
+ public static Matcher<String> startsWith(final String expected) {
+ return new TypeSafeMatcher<String>() {
+
+ @Override
+ public void describeTo(Description description) {
+ description.appendText(" starts with '" + expected + "'");
+ }
+
+ @Override
+ public boolean matchesSafely(String actual) {
+ return actual.startsWith(expected);
+ }
+ };
+ }
+
+ public static Matcher<String> contains(final String expected) {
+ return new TypeSafeMatcher<String>() {
+
+ @Override
+ public void describeTo(Description description) {
+ description.appendText(" contains '" + expected + "'");
+ }
+
+ @Override
+ public boolean matchesSafely(String actual) {
+ return actual.contains(expected);
+ }
+ };
+ }
+
+
+ public static Matcher<File> equalsFile(final File file) throws IOException {
+ final String canonicalPath = file.getCanonicalPath();
+ return new TypeSafeMatcher<File>() {
+
+ @Override
+ public void describeTo(Description arg0) {
+ arg0.appendText("file '" + canonicalPath + "'");
+ }
+
+ @Override
+ public boolean matchesSafely(File arg0) {
+ try {
+ return arg0.getCanonicalPath().equals(canonicalPath);
+ } catch (IOException e) {
+ return false;
+ }
+ }
+ };
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/IncodeApplicationExceptionTest.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/IncodeApplicationExceptionTest.java
new file mode 100644
index 0000000..ffb6d64
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/IncodeApplicationExceptionTest.java
@@ -0,0 +1,17 @@
+package org.incode.module.base.dom;
+
+import org.junit.Test;
+
+import org.incode.module.base.dom.IncodeApplicationException;
+
+public class IncodeApplicationExceptionTest {
+
+ private Class<? extends Exception> cls;
+
+
+ @Test
+ public void testName() throws Exception {
+ final IncodeApplicationException ex = new IncodeApplicationException("dummy");
+
+ }
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/testing/PrivateConstructorTester.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/testing/PrivateConstructorTester.java
new file mode 100644
index 0000000..7b733e1
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/testing/PrivateConstructorTester.java
@@ -0,0 +1,18 @@
+package org.incode.module.base.dom.testing;
+
+import java.lang.reflect.Constructor;
+
+public final class PrivateConstructorTester {
+
+ private Class<?> cls;
+
+ public PrivateConstructorTester(Class<?> cls) {
+ this.cls = cls;
+ }
+
+ public void exercise() throws Exception {
+ final Constructor<?> constructor = cls.getDeclaredConstructor();
+ constructor.setAccessible(true);
+ constructor.newInstance();
+ }
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/titled/TitledEnumContractTestAbstract_title.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/titled/TitledEnumContractTestAbstract_title.java
new file mode 100644
index 0000000..05b2569
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/titled/TitledEnumContractTestAbstract_title.java
@@ -0,0 +1,33 @@
+package org.incode.module.base.dom.titled;
+
+import java.util.Set;
+
+import org.junit.Test;
+import org.reflections.Reflections;
+
+import org.incode.module.base.dom.TitledEnum;
+import org.incode.module.unittestsupport.dom.titled.TitledEnumContractTester;
+
+public class TitledEnumContractTestAbstract_title {
+ protected final String prefix;
+
+ public TitledEnumContractTestAbstract_title(final String prefix) {
+ this.prefix = prefix;
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Test
+ public void searchAndTest() {
+ Reflections reflections = new Reflections(prefix);
+
+ Set<Class<? extends TitledEnum>> subtypes =
+ reflections.getSubTypesOf(TitledEnum.class);
+ for (Class<? extends TitledEnum> subtype : subtypes) {
+ if(!Enum.class.isAssignableFrom(subtype)) {
+ continue; // ignore non-enums
+ }
+ Class<? extends Enum> enumType = (Class<? extends Enum>) subtype;
+ new TitledEnumContractTester(enumType).test();
+ }
+ }
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/titled/TitledEnumContractTester.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/titled/TitledEnumContractTester.java
new file mode 100644
index 0000000..f4e0d8c
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/titled/TitledEnumContractTester.java
@@ -0,0 +1,33 @@
+package org.incode.module.base.dom.titled;
+
+import org.hamcrest.CoreMatchers;
+
+import org.apache.isis.applib.util.Enums;
+
+import org.incode.module.base.dom.TitledEnum;
+
+import static org.junit.Assert.assertThat;
+
+public class TitledEnumContractTester {
+ protected Enum<?>[] enumValues;
+ protected Class<? extends Enum<?>> cls;
+
+ public TitledEnumContractTester(Class<? extends Enum<?>> enumType) {
+ this.cls = enumType;
+ this.enumValues = enumType.getEnumConstants();
+ }
+
+ public void test() {
+ System.out.println("TitledEnumContractTester: " + cls.getName());
+
+ for (Enum<?> enumValue: enumValues) {
+ final TitledEnum titled = (TitledEnum) enumValue;
+ final String enumName = enumValue.name();
+ assertThat(enumValue.getClass().getName()+"#"+enumName, titled.title(), CoreMatchers.is(enumTitle(enumName)));
+ }
+ }
+
+ private <T> String enumTitle(final String enumName) {
+ return Enums.getFriendlyNameOf(enumName);
+ }
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/ClassUtilsTest.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/ClassUtilsTest.java
new file mode 100644
index 0000000..15bbffd
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/ClassUtilsTest.java
@@ -0,0 +1,55 @@
+package org.incode.module.base.dom.utils;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.Assert.assertThat;
+
+public class ClassUtilsTest {
+
+ public static class Load extends ClassUtilsTest {
+
+ public static class SomeClass {
+ }
+
+ public static class SomeSubclass extends SomeClass {
+ }
+
+ public static class SomeOtherClass {
+ }
+
+ @Rule
+ public ExpectedException thrown = ExpectedException.none();
+
+ @Test
+ public void doesExist() throws Exception {
+ final Class<? extends SomeClass> cls = ClassUtils.load(SomeClass.class.getName(), SomeClass.class);
+ assertThat(cls, is(not(nullValue())));
+ }
+
+ @Test
+ public void doesNotExist() throws Exception {
+ thrown.expect(IllegalArgumentException.class);
+ thrown.expectMessage("Class 'org.incode.module.base.dom.utils.SomeNonExistentClass' not found");
+ final Class<? extends SomeClass> cls = ClassUtils.load("org.incode.module.base.dom.utils.SomeNonExistentClass", SomeClass.class);
+ assertThat(cls, is(not(nullValue())));
+ }
+
+ @Test
+ public void existsAndIsSubclass() throws Exception {
+ final Class<? extends SomeClass> cls = ClassUtils.load(SomeSubclass.class.getName(), SomeClass.class);
+ assertThat(cls, is(not(nullValue())));
+ }
+
+ @Test
+ public void existsAndIsNotASubclass() throws Exception {
+ thrown.expect(IllegalArgumentException.class);
+ thrown.expectMessage("Class 'org.incode.module.base.dom.utils.ClassUtilsTest$Load$SomeOtherClass' not a subclass of org.incode.module.base.dom.utils.ClassUtilsTest$Load$SomeClass");
+ final Class<? extends SomeClass> cls = ClassUtils.load(SomeOtherClass.class.getName(), SomeClass.class);
+ assertThat(cls, is(not(nullValue())));
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/JodaPeriodUtilsTest.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/JodaPeriodUtilsTest.java
new file mode 100644
index 0000000..470456d
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/JodaPeriodUtilsTest.java
@@ -0,0 +1,51 @@
+package org.incode.module.base.dom.utils;
+
+import org.hamcrest.core.Is;
+import org.joda.time.LocalDate;
+import org.joda.time.Period;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class JodaPeriodUtilsTest {
+
+ public static class AsPeriod extends JodaPeriodUtilsTest {
+
+ @Test
+ public void happyCase() {
+ Period period = JodaPeriodUtils.asPeriod("6y6m3d");
+ LocalDate startDate = new LocalDate(2000, 1, 1);
+ Assert.assertThat(startDate.plus(period), Is.is(new LocalDate(2006, 7, 4)));
+ }
+
+ @Test
+ public void withSpaces() {
+ Period period = JodaPeriodUtils.asPeriod(" 6Y 6m ");
+ LocalDate startDate = new LocalDate(2000, 1, 1);
+ Assert.assertThat(startDate.plus(period), Is.is(new LocalDate(2006, 7, 1)));
+ }
+
+ @Test
+ public void whenMalformed() {
+ Period period = JodaPeriodUtils.asPeriod("6x6y");
+ LocalDate startDate = new LocalDate(2000, 1, 1);
+ Assert.assertThat(startDate.plus(period), Is.is(new LocalDate(2000, 1, 1)));
+ }
+ }
+
+ public static class AsString extends JodaPeriodUtilsTest {
+ @Test
+ public void happyCase() throws Exception {
+ Period period = new Period(new LocalDate(2000, 1, 1), new LocalDate(2006, 7, 2));
+ Assert.assertThat(JodaPeriodUtils.asString(period), Is.is("6 years, 6 months & 1 day"));
+ }
+ }
+
+ public static class AsSimpleString extends JodaPeriodUtilsTest {
+ @Test
+ public void happyCase() throws Exception {
+ Period period = new Period(new LocalDate(2000, 1, 1), new LocalDate(2006, 7, 2));
+ Assert.assertThat(JodaPeriodUtils.asSimpleString(period), Is.is("6y6m1d"));
+ }
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/MathUtilsTest.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/MathUtilsTest.java
new file mode 100644
index 0000000..4063e26
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/MathUtilsTest.java
@@ -0,0 +1,60 @@
+package org.incode.module.base.dom.utils;
+
+import java.math.BigDecimal;
+import org.junit.Assert;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class MathUtilsTest {
+
+ public static class IsZeroOrNull extends MathUtilsTest {
+
+ @Test
+ public void testIsZeroOrNull() {
+ Assert.assertTrue(MathUtils.isZeroOrNull(null));
+ Assert.assertTrue(MathUtils.isZeroOrNull(BigDecimal.valueOf(0)));
+ Assert.assertFalse(MathUtils.isZeroOrNull(BigDecimal.valueOf(100)));
+ Assert.assertFalse(MathUtils.isNotZeroOrNull(null));
+ Assert.assertFalse(MathUtils.isNotZeroOrNull(BigDecimal.valueOf(0)));
+ Assert.assertTrue(MathUtils.isNotZeroOrNull(BigDecimal.valueOf(100)));
+ }
+ }
+
+ public static class Round extends MathUtilsTest {
+
+ @Test
+ public void roundDown() throws Exception {
+ assertThat(MathUtils.round(new BigDecimal("4.54"), 1), is(new BigDecimal("4.5")));
+ }
+
+ @Test
+ public void noRounding() throws Exception {
+ assertThat(MathUtils.round(new BigDecimal("4.54"), 2), is(new BigDecimal("4.54")));
+ }
+
+ @Test
+ public void roundUp() throws Exception {
+ assertThat(MathUtils.round(new BigDecimal("4.55"), 1), is(new BigDecimal("4.6")));
+ }
+ }
+
+ public static class Max extends MathUtilsTest {
+
+ @Test
+ public void happyCase() throws Exception {
+ assertThat(MathUtils.max(null, BigDecimal.ZERO, new BigDecimal("123.45"), new BigDecimal("123")), is(new BigDecimal("123.45")));
+ }
+ }
+
+ public static class SomeThing extends MathUtilsTest {
+
+ @Test
+ public void happyCase() throws Exception {
+ assertThat(MathUtils.maxUsingFirstSignum(new BigDecimal("-123.45"), new BigDecimal("-123")), is(new BigDecimal("-123.45")));
+ assertThat(MathUtils.maxUsingFirstSignum(null, BigDecimal.ZERO, new BigDecimal("-123.45"), new BigDecimal("-123")), is(new BigDecimal("-123.45")));
+ }
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/MessageUtils_Test.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/MessageUtils_Test.java
new file mode 100644
index 0000000..02a0ebd
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/MessageUtils_Test.java
@@ -0,0 +1,59 @@
+package org.incode.module.base.dom.utils;
+
+import org.assertj.core.api.Assertions;
+import org.junit.Test;
+
+import org.incode.module.base.dom.utils.MessageUtils;
+
+public class MessageUtils_Test {
+
+ @Test
+ public void when_matches_pattern() throws Exception {
+
+ final String normalized = MessageUtils.normalize(new Exception(
+ "Temp *00000000: Reason: Must be in status of 'Approved'. Identifier: org.estatio.dom.invoice.Invoice$_invoice#$$(org.joda.time.LocalDate)"));
+
+ Assertions.assertThat(normalized).isEqualTo("Must be in status of 'Approved'.");
+
+ }
+
+ @Test
+ public void when_matches_pattern_nothing_before_Reason() throws Exception {
+
+ final String normalized = MessageUtils.normalize(new Exception(
+ "Reason: Must be in status of 'Approved'. Identifier: org.estatio.dom.invoice.Invoice$_invoice#$$(org.joda.time.LocalDate)"));
+
+ Assertions.assertThat(normalized).isEqualTo("Must be in status of 'Approved'.");
+
+ }
+
+ @Test
+ public void when_matches_pattern_nothing_extra_spaces_before_Identifier() throws Exception {
+
+ final String normalized = MessageUtils.normalize(new Exception(
+ "Temp *00000000: Reason: Must be in status of 'Approved'. Identifier: org.estatio.dom.invoice.Invoice$_invoice#$$(org.joda.time.LocalDate)"));
+
+ Assertions.assertThat(normalized).isEqualTo("Must be in status of 'Approved'.");
+
+ }
+
+ @Test
+ public void when_does_not_match_pattern_no_Reason() throws Exception {
+
+ final String message = "Temp *00000000: ReAson: Must be in status of 'Approved'. Identifier: org.estatio.dom.invoice.Invoice$_invoice#$$(org.joda.time.LocalDate)";
+ final String normalized = MessageUtils.normalize(new Exception(message));
+
+ Assertions.assertThat(normalized).isEqualTo(message);
+
+ }
+
+ @Test
+ public void when_does_not_match_pattern_no_Identifier() throws Exception {
+
+ final String message = "Temp *00000000: Reason: Must be in status of 'Approved'. IDentifier: org.estatio.dom.invoice.Invoice$_invoice#$$(org.joda.time.LocalDate)";
+ final String normalized = MessageUtils.normalize(new Exception(message));
+
+ Assertions.assertThat(normalized).isEqualTo(message);
+
+ }
+}
\ No newline at end of file
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/StringUtilsTest.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/StringUtilsTest.java
new file mode 100644
index 0000000..c84d6a5
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/StringUtilsTest.java
@@ -0,0 +1,135 @@
+package org.incode.module.base.dom.utils;
+
+import java.util.Arrays;
+import java.util.Collection;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.incode.module.base.dom.testing.PrivateConstructorTester;
+
+import static org.junit.Assert.assertEquals;
+
+
+public class StringUtilsTest {
+
+ public static class constructor extends StringUtilsTest {
+ @Test
+ public void instantiate() throws Exception {
+ new PrivateConstructorTester(StringUtils.class).exercise();
+ }
+ }
+
+ @RunWith(Parameterized.class)
+ public static class EnumDeTitle extends StringUtilsTest {
+
+ private String from;
+ private String to;
+
+ @Parameterized.Parameters
+ public static Collection<Object[]> values() {
+ return Arrays.asList(
+ new Object[][]{
+ {"Foo", "FOO"},
+ {"Foo Bar", "FOO_BAR"},
+ {null, null},
+ }
+ );
+ }
+
+ public EnumDeTitle(String from, String to) {
+ this.from = from;
+ this.to = to;
+ }
+
+ @Test
+ public void nonNull() throws Exception {
+ assertEquals(to, StringUtils.enumDeTitle(from));
+ }
+
+ }
+
+ @RunWith(Parameterized.class)
+ public static class EnumTitle extends StringUtilsTest {
+
+ private String from;
+ private String to;
+
+ @Parameterized.Parameters
+ public static Collection<Object[]> values() {
+ return Arrays.asList(
+ new Object[][]{
+ {"FOO", "Foo"},
+ {"FOO_BAR", "Foo Bar"},
+ {null, null},
+ }
+ );
+ }
+
+ public EnumTitle(String from, String to) {
+ this.from = from;
+ this.to = to;
+ }
+
+ @Test
+ public void nonNull() throws Exception {
+ assertEquals(to, StringUtils.enumTitle(from));
+ }
+
+ }
+
+ @RunWith(Parameterized.class)
+ public static class WildcardToCaseInsensitiveRegex extends StringUtilsTest {
+
+ private String from;
+ private String to;
+
+ @Parameterized.Parameters
+ public static Collection<Object[]> values() {
+ return Arrays.asList(
+ new Object[][]{
+ {"*abc?def*ghi", "(?i).*abc.def.*ghi"},
+ {null, null},
+ }
+ );
+ }
+
+ public WildcardToCaseInsensitiveRegex(String from, String to) {
+ this.from = from;
+ this.to = to;
+ }
+
+ @Test
+ public void nonNull() throws Exception {
+ assertEquals(to, StringUtils.wildcardToCaseInsensitiveRegex(from));
+ }
+ }
+
+ @RunWith(Parameterized.class)
+ public static class WildcardToRegex extends StringUtilsTest {
+
+ private String from;
+ private String to;
+
+ @Parameterized.Parameters
+ public static Collection<Object[]> values() {
+ return Arrays.asList(
+ new Object[][]{
+ {"*abc?def*ghi", ".*abc.def.*ghi"},
+ {null, null},
+ }
+ );
+ }
+
+ public WildcardToRegex(String from, String to) {
+ this.from = from;
+ this.to = to;
+ }
+
+ @Test
+ public void nonNull() throws Exception {
+ assertEquals(to, StringUtils.wildcardToRegex(from));
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/TitleBuilderTest.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/TitleBuilderTest.java
new file mode 100644
index 0000000..6f35878
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/TitleBuilderTest.java
@@ -0,0 +1,32 @@
+package org.incode.module.base.dom.utils;
+
+import org.junit.Test;
+
+import org.incode.module.base.dom.utils.TitleBuilder;
+import org.incode.module.base.dom.valuetypes.LocalDateInterval;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class TitleBuilderTest {
+
+ public class TestObject {
+ public String title(){
+ return "Parent [PAR]";
+ }
+ }
+
+ @Test
+ public void testToString() throws Exception {
+ assertThat(TitleBuilder.start().withName("Name").withReference("REF").toString())
+ .isEqualTo("Name [REF]");
+ assertThat(TitleBuilder.start().withParent(new TestObject()).withName("Name").withReference("REF").toString())
+ .isEqualTo("Parent [PAR] > Name [REF]");
+ assertThat(TitleBuilder.start().withParent(new TestObject()).withName("REF").withReference("REF").toString())
+ .isEqualTo("Parent [PAR] > REF");
+ assertThat(TitleBuilder.start().withParent(new TestObject()).withName("Name1").withName("Name2").withReference("REF").toString())
+ .isEqualTo("Parent [PAR] > Name1 Name2 [REF]");
+ assertThat(TitleBuilder.start().withParent(new TestObject()).withName(LocalDateInterval.parseString("2014-01-01/2015-01-01")).toString())
+ .isEqualTo("Parent [PAR] > 2014-01-01/2015-01-01");
+
+ }
+}
\ No newline at end of file
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/valuetypes/LocalDateIntervalTest.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/valuetypes/LocalDateIntervalTest.java
new file mode 100644
index 0000000..c46bdd8
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/valuetypes/LocalDateIntervalTest.java
@@ -0,0 +1,222 @@
+package org.incode.module.base.dom.valuetypes;
+
+import org.joda.time.Interval;
+import org.joda.time.LocalDate;
+import org.junit.Test;
+import org.incode.module.base.dom.valuetypes.AbstractInterval.IntervalEnding;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.*;
+
+public class LocalDateIntervalTest {
+
+ LocalDateInterval interval120101to120401 = LocalDateInterval.excluding(new LocalDate(2012, 1, 1), new LocalDate(2012, 4, 1));
+ LocalDateInterval interval120101to120331incl = LocalDateInterval.including(new LocalDate(2012, 1, 1), new LocalDate(2012, 3, 31));
+ LocalDateInterval interval111101to120501 = LocalDateInterval.excluding(new LocalDate(2011, 11, 1), new LocalDate(2012, 5, 1));
+ LocalDateInterval interval111101to120301 = LocalDateInterval.excluding(new LocalDate(2011, 11, 1), new LocalDate(2012, 3, 1));
+ LocalDateInterval interval120201to120501 = LocalDateInterval.excluding(new LocalDate(2012, 2, 1), new LocalDate(2012, 5, 1));
+ LocalDateInterval interval120201to120301 = LocalDateInterval.excluding(new LocalDate(2012, 2, 1), new LocalDate(2012, 3, 1));
+ LocalDateInterval interval100101to110101 = LocalDateInterval.excluding(new LocalDate(2010, 1, 1), new LocalDate(2011, 1, 1));
+ LocalDateInterval interval130101to140101 = LocalDateInterval.excluding(new LocalDate(2013, 1, 1), new LocalDate(2014, 1, 1));
+ LocalDateInterval interval120201toOpen = LocalDateInterval.excluding(new LocalDate(2012, 2, 1), null);
+ LocalDateInterval interval120101toOpen = LocalDateInterval.excluding(new LocalDate(2010, 2, 1), null);
+ LocalDateInterval intervalOpen = LocalDateInterval.excluding(null, null);
+
+ public static class Instantiate extends LocalDateIntervalTest {
+
+ @Test
+ public void test() {
+ LocalDate startDate = new LocalDate(2012, 1, 1);
+ LocalDate endDate = new LocalDate(2012, 1, 31);
+ Interval jodaInterval = new Interval(startDate.toInterval().getStartMillis(), endDate.toInterval().getEndMillis());
+ LocalDateInterval interval = new LocalDateInterval(jodaInterval);
+ assertThat(interval.startDate(), is(startDate));
+ assertThat(interval.endDate(), is(endDate));
+ }
+
+ @Test
+ public void testEmptyInterval() {
+ LocalDateInterval myInterval = new LocalDateInterval();
+ assertNull(myInterval.startDate());
+ assertNull(myInterval.endDate());
+ }
+
+ }
+
+ public static class IsValid extends LocalDateIntervalTest {
+
+ @Test
+ public void testInvalid() {
+ assertFalse(new LocalDateInterval(new LocalDate(2011, 1, 1), new LocalDate(2010, 1, 1)).isValid());
+ assertFalse(new LocalDateInterval(new LocalDate(2011, 1, 1), new LocalDate(2010, 12, 30)).isValid());
+ assertTrue(new LocalDateInterval(new LocalDate(2011, 1, 1), new LocalDate(2010, 12, 31)).isValid());
+ }
+ }
+
+ public static class Overlaps extends LocalDateIntervalTest {
+
+ @Test
+ public void testIsWithinParent() {
+ assertTrue(interval120101to120331incl.overlaps(interval120101to120401));
+ assertTrue(interval111101to120501.overlaps(interval120101to120401));
+ assertTrue(interval111101to120301.overlaps(interval120101to120401));
+ assertTrue(interval120201to120501.overlaps(interval120101to120401));
+ assertTrue(interval120201to120301.overlaps(interval120101to120401));
+ assertFalse(interval100101to110101.overlaps(interval120101to120401));
+ assertFalse(interval130101to140101.overlaps(interval120101to120401));
+ assertTrue(interval120201toOpen.overlaps(interval120101to120401));
+ assertTrue(intervalOpen.overlaps(interval120101to120401));
+ }
+ }
+
+ public static class Contains extends LocalDateIntervalTest {
+
+ @Test
+ public void testIsFullInterval() {
+ assertTrue(interval120101to120331incl.contains(interval120101to120401));
+ assertTrue(interval111101to120501.contains(interval120101to120401));
+ assertFalse(interval111101to120301.contains(interval120101to120401));
+ assertFalse(interval120201to120501.contains(interval120101to120401));
+ assertFalse(interval120201to120301.contains(interval120101to120401));
+ assertFalse(interval100101to110101.contains(interval120101to120401));
+ assertFalse(interval130101to140101.contains(interval120101to120401));
+ assertFalse(interval120201toOpen.contains(interval120101to120401));
+ assertTrue(intervalOpen.contains(interval120101to120401));
+ }
+
+ @Test
+ public void testContainsDate() {
+ assertTrue(interval120101to120401.contains(new LocalDate(2012, 1, 1)));
+ assertTrue(interval120101to120401.contains(new LocalDate(2012, 3, 31)));
+ assertTrue(interval120201toOpen.contains(new LocalDate(2099, 1, 1)));
+ assertFalse(interval120201toOpen.contains(new LocalDate(2000, 1, 1)));
+ assertTrue(interval120201toOpen.contains(new LocalDate(2012, 3, 1)));
+ assertTrue(intervalOpen.contains(new LocalDate(2012, 3, 31)));
+ assertFalse(interval120101to120401.contains(new LocalDate(2012, 4, 1)));
+ }
+
+ @Test
+ public void testContainsLocalDateInterval() {
+ assertThat(LocalDateInterval.parseString("2010-01-01/2010-04-01").contains(LocalDateInterval.parseString("2010-01-01/2010-04-01")), is(true));
+ assertThat(LocalDateInterval.parseString("2010-01-01/2010-04-01").contains(LocalDateInterval.parseString("2010-01-01/2010-05-01")), is(false));
+ }
+ }
+
+ public static class StartDate extends LocalDateIntervalTest {
+
+ @Test
+ public void startDate() {
+ assertEquals(new LocalDate(2012, 1, 1), interval120101to120331incl.overlap(interval120101to120401).startDate());
+ assertEquals(new LocalDate(2012, 1, 1), interval111101to120501.overlap(interval120101to120401).startDate());
+ assertEquals(new LocalDate(2012, 1, 1), interval111101to120301.overlap(interval120101to120401).startDate());
+ assertEquals(new LocalDate(2012, 2, 1), interval120201to120501.overlap(interval120101to120401).startDate());
+ assertEquals(new LocalDate(2012, 2, 1), interval120201to120301.overlap(interval120101to120401).startDate());
+ assertEquals(new LocalDate(2012, 2, 1), interval120201toOpen.overlap(interval120101to120401).startDate());
+ assertEquals(new LocalDate(2012, 1, 1), intervalOpen.overlap(interval120101to120401).startDate());
+ }
+ }
+
+ public static class EndDateExcluding extends LocalDateIntervalTest {
+
+ @Test
+ public void endDateExcluding() {
+ assertEquals(new LocalDate(2012, 4, 1), interval120101to120331incl.overlap(interval120101to120401).endDateExcluding());
+ assertEquals(new LocalDate(2012, 4, 1), interval111101to120501.overlap(interval120101to120401).endDateExcluding());
+ assertEquals(new LocalDate(2012, 3, 1), interval111101to120301.overlap(interval120101to120401).endDateExcluding());
+ assertEquals(new LocalDate(2012, 4, 1), interval120201to120501.overlap(interval120101to120401).endDateExcluding());
+ assertEquals(new LocalDate(2012, 3, 1), interval120201to120301.overlap(interval120101to120401).endDateExcluding());
+ assertEquals(new LocalDate(2012, 4, 1), interval120201toOpen.overlap(interval120101to120401).endDateExcluding());
+ assertEquals(new LocalDate(2012, 4, 1), intervalOpen.overlap(interval120101to120401).endDateExcluding());
+ }
+ }
+
+ public static class Days extends LocalDateIntervalTest {
+
+ @Test
+ public void days() {
+ assertEquals(91, interval120101to120331incl.overlap(interval120101to120401).days());
+ assertEquals(91, interval111101to120501.overlap(interval120101to120401).days());
+ assertEquals(60, interval111101to120301.overlap(interval120101to120401).days());
+ assertEquals(60, interval120201to120501.overlap(interval120101to120401).days());
+ assertEquals(29, interval120201to120301.overlap(interval120101to120401).days());
+ assertEquals(60, interval120201toOpen.overlap(interval120101to120401).days());
+ assertEquals(91, intervalOpen.overlap(interval120101to120401).days());
+ assertEquals(91, interval120101to120401.overlap(intervalOpen).days());
+ assertEquals(0, intervalOpen.overlap(intervalOpen).days());
+ }
+ }
+
+
+ public static class EndDateFromStartDate extends LocalDateIntervalTest {
+
+ @Test
+ public void testEndDateFromStartDate() {
+ assertThat(interval120101to120331incl.endDateFromStartDate(), is(interval120101to120331incl.startDate().minusDays(1)));
+ }
+ }
+
+ public static class Overlap extends LocalDateIntervalTest {
+
+ @Test
+ public void testOverlap() {
+ testOverlap("----------/----------", "----------/----------", "----------/----------");
+ testOverlap("2010-01-01/----------", "----------/----------", "2010-01-01/----------");
+ testOverlap("----------/----------", "2010-01-01/----------", "2010-01-01/----------");
+ testOverlap("2010-01-01/----------", "2011-01-01/----------", "2011-01-01/----------");
+ testOverlap("2011-01-01/----------", "2010-01-01/----------", "2011-01-01/----------");
+ testOverlap("----------/2010-01-01", "2010-01-01/----------", null);
+ testOverlap("----------/2010-02-01", "2010-01-01/----------", "2010-01-01/2010-02-01");
+ testOverlap("2010-01-01/----------", "----------/2010-02-01", "2010-01-01/2010-02-01");
+ }
+
+ @Test
+ public void testOpen() {
+ assertThat(LocalDateInterval.parseString("*/*").overlap(LocalDateInterval.parseString("*/*")), is(LocalDateInterval.parseString("*/*")));
+ }
+
+ private void testOverlap(
+ final String firstIntervalStr,
+ final String secondIntervalStr,
+ final String expectedIntervalStr) {
+ LocalDateInterval first = LocalDateInterval.parseString(firstIntervalStr);
+ LocalDateInterval second = LocalDateInterval.parseString(secondIntervalStr);
+ LocalDateInterval overlap = first.overlap(second);
+ LocalDateInterval expected = expectedIntervalStr == null ? null : LocalDateInterval.parseString(expectedIntervalStr);
+ assertThat(overlap, is(expected));
+ }
+
+ }
+
+ public static class ToString extends LocalDateIntervalTest {
+
+ @Test
+ public void testString() {
+ assertThat(interval120201toOpen.toString(), is("2012-02-01/----------"));
+ }
+
+
+ @Test
+ public void testStringWithFormat() {
+ assertThat(LocalDateInterval.parseString("2010-07-01/2010-10-01").toString("dd-MM-yyy"), is("01-07-2010/30-09-2010"));
+ }
+ }
+
+ public static class Equals extends LocalDateIntervalTest {
+
+ @Test
+ public void testEquals() {
+ assertTrue(new LocalDateInterval().equals(new LocalDateInterval()));
+ assertTrue(new LocalDateInterval(null, null, IntervalEnding.EXCLUDING_END_DATE).equals(new LocalDateInterval(null, null, IntervalEnding.INCLUDING_END_DATE)));
+ }
+ }
+
+ public static class ParseString extends LocalDateIntervalTest {
+
+ @Test
+ public void testParseString() throws Exception {
+ assertThat(LocalDateInterval.parseString("2010-07-01/2010-10-01").endDateExcluding(), is(new LocalDate(2010, 10, 1)));
+ }
+ }
+
+
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByCodeContractTestAbstract_compareTo.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByCodeContractTestAbstract_compareTo.java
new file mode 100644
index 0000000..81100ca
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByCodeContractTestAbstract_compareTo.java
@@ -0,0 +1,49 @@
+package org.incode.module.base.dom.with;
+
+import java.util.Map;
+import java.util.Set;
+
+import com.google.common.collect.ImmutableMap;
+
+import org.junit.Test;
+import org.reflections.Reflections;
+
+import org.incode.module.unittestsupport.dom.with.ComparableByCodeContractTester;
+
+public class ComparableByCodeContractTestAbstract_compareTo {
+ protected final String packagePrefix;
+ protected Map<Class<?>, Class<?>> noninstantiableSubstitutes;
+
+ public ComparableByCodeContractTestAbstract_compareTo(
+ String packagePrefix, ImmutableMap<Class<?>, Class<?>> noninstantiableSubstitutes) {
+ this.packagePrefix = packagePrefix;
+ this.noninstantiableSubstitutes = noninstantiableSubstitutes;
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Test
+ public void searchAndTest() {
+ Reflections reflections = new Reflections(packagePrefix);
+
+ Set<Class<? extends WithCodeComparable>> subtypes =
+ reflections.getSubTypesOf(WithCodeComparable.class);
+ for (Class<? extends WithCodeComparable> subtype : subtypes) {
+ if(subtype.isInterface() || subtype.isAnonymousClass() || subtype.isLocalClass() || subtype.isMemberClass()) {
+ // skip (probably a testing class)
+ continue;
+ }
+ subtype = instantiable(subtype);
+ test(subtype);
+ }
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ private Class<? extends WithCodeComparable> instantiable(Class<? extends WithCodeComparable> cls) {
+ final Class<?> substitute = noninstantiableSubstitutes.get(cls);
+ return (Class<? extends WithCodeComparable>) (substitute!=null?substitute:cls);
+ }
+
+ private <T extends WithCodeComparable<T>> void test(Class<T> cls) {
+ new ComparableByCodeContractTester<>(cls).test();
+ }
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByCodeContractTester.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByCodeContractTester.java
new file mode 100644
index 0000000..c9839ac
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByCodeContractTester.java
@@ -0,0 +1,59 @@
+package org.incode.module.base.dom.with;
+
+import java.util.List;
+
+import org.apache.isis.unittestsupport.comparable.ComparableContractTester;
+
+import com.google.common.collect.Lists;
+
+public class ComparableByCodeContractTester<T extends WithCodeComparable<T>> {
+ protected final Class<T> cls;
+
+ public ComparableByCodeContractTester(Class<T> cls) {
+ this.cls = cls;
+ }
+
+ public static <E> List<E> listOf(E... elements) {
+ return Lists.newArrayList(elements);
+ }
+
+ public void test() {
+ System.out.println("ComparableByCodeContractTester: " + cls.getName());
+ new ComparableContractTester<>(orderedTuples()).test();
+
+ // testToString();
+ }
+
+// protected void testToString() {
+// final String str = "ABC";
+//
+// final T withCode = newWithCode(str);
+// String expectedToString = Objects.toStringHelper(withCode).add("code", "ABC").toString();
+//
+// assertThat(withCode.toString(), is(expectedToString));
+// }
+
+ @SuppressWarnings("unchecked")
+ protected List<List<T>> orderedTuples() {
+ return listOf(
+ listOf(
+ newWithCode(null),
+ newWithCode("ABC"),
+ newWithCode("ABC"),
+ newWithCode("DEF")));
+ }
+
+ private T newWithCode(String reference) {
+ final T wr = newWithCode();
+ wr.setCode(reference);
+ return wr;
+ }
+
+ private T newWithCode() {
+ try {
+ return cls.newInstance();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByDescriptionContractTestAbstract_compareTo.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByDescriptionContractTestAbstract_compareTo.java
new file mode 100644
index 0000000..4a8896d
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByDescriptionContractTestAbstract_compareTo.java
@@ -0,0 +1,49 @@
+package org.incode.module.base.dom.with;
+
+import java.util.Map;
+import java.util.Set;
+
+import com.google.common.collect.ImmutableMap;
+
+import org.junit.Test;
+import org.reflections.Reflections;
+
+import org.incode.module.unittestsupport.dom.with.ComparableByDescriptionContractTester;
+
+public class ComparableByDescriptionContractTestAbstract_compareTo {
+ protected final String packagePrefix;
+ protected Map<Class<?>, Class<?>> noninstantiableSubstitutes;
+
+ public ComparableByDescriptionContractTestAbstract_compareTo(
+ String packagePrefix, ImmutableMap<Class<?>, Class<?>> noninstantiableSubstitutes) {
+ this.packagePrefix = packagePrefix;
+ this.noninstantiableSubstitutes = noninstantiableSubstitutes;
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Test
+ public void searchAndTest() {
+ Reflections reflections = new Reflections(packagePrefix);
+
+ Set<Class<? extends WithDescriptionComparable>> subtypes =
+ reflections.getSubTypesOf(WithDescriptionComparable.class);
+ for (Class<? extends WithDescriptionComparable> subtype : subtypes) {
+ if(subtype.isInterface() || subtype.isAnonymousClass() || subtype.isLocalClass() || subtype.isMemberClass()) {
+ // skip (probably a testing class)
+ continue;
+ }
+ subtype = instantiable(subtype);
+ test(subtype);
+ }
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ private Class<? extends WithDescriptionComparable> instantiable(Class<? extends WithDescriptionComparable> cls) {
+ final Class<?> substitute = noninstantiableSubstitutes.get(cls);
+ return (Class<? extends WithDescriptionComparable>) (substitute!=null?substitute:cls);
+ }
+
+ private <T extends WithDescriptionComparable<T>> void test(Class<T> cls) {
+ new ComparableByDescriptionContractTester<>(cls).test();
+ }
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByDescriptionContractTester.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByDescriptionContractTester.java
new file mode 100644
index 0000000..acf2cbe
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByDescriptionContractTester.java
@@ -0,0 +1,63 @@
+package org.incode.module.base.dom.with;
+
+import java.util.List;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.Lists;
+
+import org.apache.isis.core.unittestsupport.comparable.ComparableContractTester;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class ComparableByDescriptionContractTester<T extends WithDescriptionComparable<T>> {
+ protected final Class<T> cls;
+
+ public ComparableByDescriptionContractTester(Class<T> cls) {
+ this.cls = cls;
+ }
+
+ public static <E> List<E> listOf(E... elements) {
+ return Lists.newArrayList(elements);
+ }
+
+ public void test() {
+ System.out.println("ComparableByDescriptionContractTester: " + cls.getName());
+ new ComparableContractTester<>(orderedTuples()).test();
+
+ testToString();
+ }
+
+ protected void testToString() {
+ final String str = "ABC";
+
+ final T withDescription = newWithDescription(str);
+ String expectedToString = Objects.toStringHelper(withDescription).add("description", "ABC").toString();
+
+ assertThat(withDescription.toString(), is(expectedToString));
+ }
+
+ @SuppressWarnings("unchecked")
+ protected List<List<T>> orderedTuples() {
+ return listOf(
+ listOf(
+ newWithDescription(null),
+ newWithDescription("ABC"),
+ newWithDescription("ABC"),
+ newWithDescription("DEF")));
+ }
+
+ private T newWithDescription(String reference) {
+ final T wr = newWithDescription();
+ wr.setDescription(reference);
+ return wr;
+ }
+
+ private T newWithDescription() {
+ try {
+ return cls.newInstance();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByNameContractTestAbstract_compareTo.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByNameContractTestAbstract_compareTo.java
new file mode 100644
index 0000000..a0b4f27
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByNameContractTestAbstract_compareTo.java
@@ -0,0 +1,49 @@
+package org.incode.module.base.dom.with;
+
+import java.util.Map;
+import java.util.Set;
+
+import com.google.common.collect.ImmutableMap;
+
+import org.junit.Test;
+import org.reflections.Reflections;
+
+import org.incode.module.unittestsupport.dom.with.ComparableByNameContractTester;
+
+public class ComparableByNameContractTestAbstract_compareTo {
+ protected final String packagePrefix;
+ protected Map<Class<?>, Class<?>> noninstantiableSubstitutes;
+
+ public ComparableByNameContractTestAbstract_compareTo(
+ String packagePrefix, ImmutableMap<Class<?>, Class<?>> noninstantiableSubstitutes) {
+ this.packagePrefix = packagePrefix;
+ this.noninstantiableSubstitutes = noninstantiableSubstitutes;
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Test
+ public void searchAndTest() {
+ Reflections reflections = new Reflections(packagePrefix);
+
+ Set<Class<? extends WithNameComparable>> subtypes =
+ reflections.getSubTypesOf(WithNameComparable.class);
+ for (Class<? extends WithNameComparable> subtype : subtypes) {
+ if(subtype.isInterface() || subtype.isAnonymousClass() || subtype.isLocalClass() || subtype.isMemberClass()) {
+ // skip (probably a testing class)
+ continue;
+ }
+ subtype = instantiable(subtype);
+ test(subtype);
+ }
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ private Class<? extends WithNameComparable> instantiable(Class<? extends WithNameComparable> cls) {
+ final Class<?> substitute = noninstantiableSubstitutes.get(cls);
+ return (Class<? extends WithNameComparable>) (substitute!=null?substitute:cls);
+ }
+
+ private <T extends WithNameComparable<T>> void test(Class<T> cls) {
+ new ComparableByNameContractTester<>(cls).test();
+ }
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByNameContractTester.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByNameContractTester.java
new file mode 100644
index 0000000..5b73a40
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByNameContractTester.java
@@ -0,0 +1,64 @@
+package org.incode.module.base.dom.with;
+
+import java.util.List;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.Lists;
+
+import org.apache.isis.core.unittestsupport.comparable.ComparableContractTester;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class ComparableByNameContractTester<T extends WithNameComparable<T>> {
+ protected final Class<T> cls;
+
+ public ComparableByNameContractTester(Class<T> cls) {
+ this.cls = cls;
+ }
+
+ public static <E> List<E> listOf(E... elements) {
+ return Lists.newArrayList(elements);
+ }
+
+ public void test() {
+ System.out.println("ComparableByNameContractTester: " + cls.getName());
+ new ComparableContractTester<>(orderedTuples()).test();
+
+ testToString();
+
+ }
+
+ protected void testToString() {
+ final String str = "ABC";
+
+ final T withName = newWithName(str);
+ String expectedToString = Objects.toStringHelper(withName).add("name", "ABC").toString();
+
+ assertThat(withName.toString(), is(expectedToString));
+ }
+
+ @SuppressWarnings("unchecked")
+ protected List<List<T>> orderedTuples() {
+ return listOf(
+ listOf(
+ newWithName(null),
+ newWithName("ABC"),
+ newWithName("ABC"),
+ newWithName("DEF")));
+ }
+
+ private T newWithName(String reference) {
+ final T wr = newWithName();
+ wr.setName(reference);
+ return wr;
+ }
+
+ private T newWithName() {
+ try {
+ return cls.newInstance();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByReferenceContractTestAbstract_compareTo.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByReferenceContractTestAbstract_compareTo.java
new file mode 100644
index 0000000..58074ce
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByReferenceContractTestAbstract_compareTo.java
@@ -0,0 +1,49 @@
+package org.incode.module.base.dom.with;
+
+import java.util.Map;
+import java.util.Set;
+
+import com.google.common.collect.ImmutableMap;
+
+import org.junit.Test;
+import org.reflections.Reflections;
+
+import org.incode.module.unittestsupport.dom.with.ComparableByReferenceContractTester;
+
+public class ComparableByReferenceContractTestAbstract_compareTo {
+ protected final String packagePrefix;
+ protected Map<Class<?>, Class<?>> noninstantiableSubstitutes;
+
+ public ComparableByReferenceContractTestAbstract_compareTo(
+ String packagePrefix, ImmutableMap<Class<?>, Class<?>> noninstantiableSubstitutes) {
+ this.packagePrefix = packagePrefix;
+ this.noninstantiableSubstitutes = noninstantiableSubstitutes;
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Test
+ public void searchAndTest() {
+ Reflections reflections = new Reflections(packagePrefix);
+
+ Set<Class<? extends WithReferenceComparable>> subtypes =
+ reflections.getSubTypesOf(WithReferenceComparable.class);
+ for (Class<? extends WithReferenceComparable> subtype : subtypes) {
+ if(subtype.isInterface() || subtype.isAnonymousClass() || subtype.isLocalClass() || subtype.isMemberClass()) {
+ // skip (probably a testing class)
+ continue;
+ }
+ subtype = instantiable(subtype);
+ test(subtype);
+ }
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ private Class<? extends WithReferenceComparable> instantiable(Class<? extends WithReferenceComparable> cls) {
+ final Class<?> substitute = noninstantiableSubstitutes.get(cls);
+ return (Class<? extends WithReferenceComparable>) (substitute!=null?substitute:cls);
+ }
+
+ private <T extends WithReferenceComparable<T>> void test(Class<T> cls) {
+ new ComparableByReferenceContractTester<>(cls).test();
+ }
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByReferenceContractTester.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByReferenceContractTester.java
new file mode 100644
index 0000000..b2ee38a
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByReferenceContractTester.java
@@ -0,0 +1,64 @@
+package org.incode.module.base.dom.with;
+
+import java.util.List;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.Lists;
+
+import org.apache.isis.core.unittestsupport.comparable.ComparableContractTester;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class ComparableByReferenceContractTester<T extends WithReferenceComparable<T>> {
+ protected final Class<T> cls;
+
+ public ComparableByReferenceContractTester(Class<T> cls) {
+ this.cls = cls;
+ }
+
+ public static <E> List<E> listOf(E... elements) {
+ return Lists.newArrayList(elements);
+ }
+
+ public void test() {
+ System.out.println("ComparableByReferenceContractTester: " + cls.getName());
+ new ComparableContractTester<>(orderedTuples()).test();
+
+ testToString();
+
+ }
+
+ protected void testToString() {
+ final String str = "ABC";
+
+ final T withReference = newWithReference(str);
+ String expectedToString = Objects.toStringHelper(withReference).add("reference", "ABC").toString();
+
+ assertThat(withReference.toString(), is(expectedToString));
+ }
+
+ @SuppressWarnings("unchecked")
+ protected List<List<T>> orderedTuples() {
+ return listOf(
+ listOf(
+ newWithReference(null),
+ newWithReference("ABC"),
+ newWithReference("ABC"),
+ newWithReference("DEF")));
+ }
+
+ private T newWithReference(String reference) {
+ final T wr = newWithReference();
+ wr.setReference(reference);
+ return wr;
+ }
+
+ private T newWithReference() {
+ try {
+ return cls.newInstance();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByTitleContractTestAbstract_compareTo.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByTitleContractTestAbstract_compareTo.java
new file mode 100644
index 0000000..e94d63f
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByTitleContractTestAbstract_compareTo.java
@@ -0,0 +1,49 @@
+package org.incode.module.base.dom.with;
+
+import java.util.Map;
+import java.util.Set;
+
+import com.google.common.collect.ImmutableMap;
+
+import org.junit.Test;
+import org.reflections.Reflections;
+
+import org.incode.module.unittestsupport.dom.with.ComparableByTitleContractTester;
+
+public class ComparableByTitleContractTestAbstract_compareTo {
+ protected final String packagePrefix;
+ protected Map<Class<?>, Class<?>> noninstantiableSubstitutes;
+
+ public ComparableByTitleContractTestAbstract_compareTo(
+ String packagePrefix, ImmutableMap<Class<?>, Class<?>> noninstantiableSubstitutes) {
+ this.packagePrefix = packagePrefix;
+ this.noninstantiableSubstitutes = noninstantiableSubstitutes;
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Test
+ public void searchAndTest() {
+ Reflections reflections = new Reflections(packagePrefix);
+
+ Set<Class<? extends WithTitleComparable>> subtypes =
+ reflections.getSubTypesOf(WithTitleComparable.class);
+ for (Class<? extends WithTitleComparable> subtype : subtypes) {
+ if(subtype.isInterface() || subtype.isAnonymousClass() || subtype.isLocalClass() || subtype.isMemberClass()) {
+ // skip (probably a testing class)
+ continue;
+ }
+ subtype = instantiable(subtype);
+ test(subtype);
+ }
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ private Class<? extends WithTitleComparable> instantiable(Class<? extends WithTitleComparable> cls) {
+ final Class<?> substitute = noninstantiableSubstitutes.get(cls);
+ return (Class<? extends WithTitleComparable>) (substitute!=null?substitute:cls);
+ }
+
+ private <T extends WithTitleComparable<T>> void test(Class<T> cls) {
+ new ComparableByTitleContractTester<>(cls).test();
+ }
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByTitleContractTester.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByTitleContractTester.java
new file mode 100644
index 0000000..0ef1903
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByTitleContractTester.java
@@ -0,0 +1,64 @@
+package org.incode.module.base.dom.with;
+
+import java.util.List;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.Lists;
+
+import org.apache.isis.core.unittestsupport.comparable.ComparableContractTester;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class ComparableByTitleContractTester<T extends WithTitleComparable<T>> {
+ protected final Class<T> cls;
+
+ public ComparableByTitleContractTester(Class<T> cls) {
+ this.cls = cls;
+ }
+
+ public static <E> List<E> listOf(E... elements) {
+ return Lists.newArrayList(elements);
+ }
+
+ public void test() {
+ System.out.println("ComparableByTitleContractTester: " + cls.getName());
+ new ComparableContractTester<>(orderedTuples()).test();
+
+ testToString();
+
+ }
+
+ protected void testToString() {
+ final String str = "ABC";
+
+ final T withTitle = newWithTitle(str);
+ String expectedToString = Objects.toStringHelper(withTitle).add("title", "ABC").toString();
+
+ assertThat(withTitle.toString(), is(expectedToString));
+ }
+
+ @SuppressWarnings("unchecked")
+ protected List<List<T>> orderedTuples() {
+ return listOf(
+ listOf(
+ newWithTitle(null),
+ newWithTitle("ABC"),
+ newWithTitle("ABC"),
+ newWithTitle("DEF")));
+ }
+
+ private T newWithTitle(String reference) {
+ final T wr = newWithTitle();
+ wr.setTitle(reference);
+ return wr;
+ }
+
+ private T newWithTitle() {
+ try {
+ return cls.newInstance();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForComparableByCode.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForComparableByCode.java
new file mode 100644
index 0000000..44c9ff5
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForComparableByCode.java
@@ -0,0 +1,24 @@
+package org.incode.module.base.dom.with;
+
+import org.apache.isis.core.unittestsupport.bidir.Instantiator;
+
+public class InstantiatorForComparableByCode implements Instantiator {
+ public final Class<? extends WithCodeComparable<?>> cls;
+ private int i;
+
+ public InstantiatorForComparableByCode(Class<? extends WithCodeComparable<?>> cls) {
+ this.cls = cls;
+ }
+
+ @Override
+ public Object instantiate() {
+ WithCodeComparable<?> newInstance;
+ try {
+ newInstance = cls.newInstance();
+ newInstance.setCode(""+(++i));
+ return newInstance;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForComparableByDescription.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForComparableByDescription.java
new file mode 100644
index 0000000..eb50c53
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForComparableByDescription.java
@@ -0,0 +1,25 @@
+package org.incode.module.base.dom.with;
+
+import org.apache.isis.core.unittestsupport.bidir.Instantiator;
+
+public class InstantiatorForComparableByDescription implements Instantiator {
+ public final Class<? extends WithDescriptionComparable<?>> cls;
+ private int i;
+
+ public InstantiatorForComparableByDescription(
+ Class<? extends WithDescriptionComparable<?>> cls) {
+ this.cls = cls;
+ }
+
+ @Override
+ public Object instantiate() {
+ WithDescriptionComparable<?> newInstance;
+ try {
+ newInstance = cls.newInstance();
+ newInstance.setDescription(""+(++i));
+ return newInstance;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForComparableByName.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForComparableByName.java
new file mode 100644
index 0000000..2aca661
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForComparableByName.java
@@ -0,0 +1,24 @@
+package org.incode.module.base.dom.with;
+
+import org.apache.isis.core.unittestsupport.bidir.Instantiator;
+
+public class InstantiatorForComparableByName implements Instantiator {
+ public final Class<? extends WithNameComparable<?>> cls;
+ private int i;
+
+ public InstantiatorForComparableByName(Class<? extends WithNameComparable<?>> cls) {
+ this.cls = cls;
+ }
+
+ @Override
+ public Object instantiate() {
+ WithNameComparable<?> newInstance;
+ try {
+ newInstance = cls.newInstance();
+ newInstance.setName(""+(++i));
+ return newInstance;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForComparableByReference.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForComparableByReference.java
new file mode 100644
index 0000000..a857176
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForComparableByReference.java
@@ -0,0 +1,25 @@
+package org.incode.module.base.dom.with;
+
+import org.apache.isis.core.unittestsupport.bidir.Instantiator;
+
+public class InstantiatorForComparableByReference implements Instantiator {
+ public final Class<? extends WithReferenceComparable<?>> cls;
+ private int i;
+
+ public InstantiatorForComparableByReference(
+ Class<? extends WithReferenceComparable<?>> cls) {
+ this.cls = cls;
+ }
+
+ @Override
+ public Object instantiate() {
+ WithReferenceComparable<?> newInstance;
+ try {
+ newInstance = cls.newInstance();
+ newInstance.setReference(""+(++i));
+ return newInstance;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForWithStartDate.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForWithStartDate.java
new file mode 100644
index 0000000..a67ac16
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForWithStartDate.java
@@ -0,0 +1,26 @@
+package org.incode.module.base.dom.with;
+
+import org.joda.time.LocalDate;
+
+import org.apache.isis.unittestsupport.bidir.Instantiator;
+
+public class InstantiatorForWithStartDate implements Instantiator {
+ public final Class<? extends WithStartDate> cls;
+ private int i;
+
+ public InstantiatorForWithStartDate(Class<? extends WithStartDate> cls) {
+ this.cls = cls;
+ }
+
+ @Override
+ public Object instantiate() {
+ WithStartDate newInstance;
+ try {
+ newInstance = cls.newInstance();
+ newInstance.setStartDate(new LocalDate(2013,1,1).plusDays(i++));
+ return newInstance;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/StaticHelperClassesContractTest_privateConstructor.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/StaticHelperClassesContractTest_privateConstructor.java
new file mode 100644
index 0000000..e9258bd
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/StaticHelperClassesContractTest_privateConstructor.java
@@ -0,0 +1,21 @@
+package org.incode.module.base.dom.with;
+
+import org.junit.Test;
+
+import org.incode.module.base.dom.testing.PrivateConstructorTester;
+
+public class StaticHelperClassesContractTest_privateConstructor {
+
+ @Test
+ public void cover() throws Exception {
+ exercise(WithCodeGetter.ToString.class);
+ exercise(WithDescriptionGetter.ToString.class);
+ exercise(WithNameGetter.ToString.class);
+ exercise(WithReferenceGetter.ToString.class);
+ exercise(WithTitleGetter.ToString.class);
+ }
+
+ private static void exercise(final Class<?> cls) throws Exception {
+ new PrivateConstructorTester(cls).exercise();
+ }
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/WithFieldUniqueContractTestAllAbstract.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/WithFieldUniqueContractTestAllAbstract.java
new file mode 100644
index 0000000..117bc76
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/WithFieldUniqueContractTestAllAbstract.java
@@ -0,0 +1,81 @@
+package org.incode.module.base.dom.with;
+
+import java.lang.annotation.Annotation;
+import java.util.Set;
+
+import javax.jdo.annotations.Unique;
+import javax.jdo.annotations.Uniques;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.reflections.Reflections;
+
+public class WithFieldUniqueContractTestAllAbstract<T> {
+ protected final Class<T> interfaceType;
+ protected final String fieldName;
+ protected final String prefix;
+
+ public WithFieldUniqueContractTestAllAbstract(
+ final String prefix, String fieldName, Class<T> interfaceType) {
+ this.prefix = prefix;
+ this.fieldName = fieldName;
+ this.interfaceType = interfaceType;
+ }
+
+ private static <T> boolean declaresUniquenesForField(final Class<? extends T> subtype, final Unique unique, String fieldName) {
+ final String[] members = unique.members();
+ return members != null && members.length == 1 && members[0].equals(fieldName);
+ }
+
+ @Test
+ public void searchAndTest() {
+
+ final Reflections reflections = new Reflections(prefix);
+ final StringBuilder buf = new StringBuilder();
+
+ Set<Class<? extends T>> domainObjectClasses = reflections.getSubTypesOf(interfaceType);
+ checkClass:
+ for (final Class<? extends T> subtype : domainObjectClasses) {
+ if(subtype.isInterface() || subtype.isAnonymousClass() || subtype.isLocalClass() || subtype.isMemberClass()) {
+ // skip (probably a testing class)
+ continue;
+ }
+
+ try {
+ subtype.getDeclaredField(fieldName);
+ } catch (NoSuchFieldException e) {
+ // assume inherited field, so skip.
+ continue;
+ }
+
+ final Annotation[] annotations = subtype.getAnnotations();
+
+ // @Unique(...)
+ for (Annotation annotation : annotations) {
+ if(annotation instanceof Unique) {
+ final Unique unique = (Unique) annotation;
+ if(declaresUniquenesForField(subtype, unique, fieldName)) {
+ continue checkClass;
+ }
+ }
+ }
+
+ // @Uniques({ @Unique(...), @Unique(...), ... })
+ for (Annotation annotation : annotations) {
+ if(annotation instanceof Uniques) {
+ Uniques uniques = (Uniques) annotation;
+ for (Unique unique : uniques.value()) {
+ if(declaresUniquenesForField(subtype, unique, fieldName)) {
+ continue checkClass;
+ }
+ }
+ }
+ }
+
+ buf.append("\n" + subtype.getName() + " is not annotated with @Unique(members={\"" + fieldName + "\"})");
+ }
+ if(buf.length() > 0) {
+ Assert.fail(buf.toString());
+ }
+ }
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/WithIntervalMutableContractTestAbstract_changeDates.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/WithIntervalMutableContractTestAbstract_changeDates.java
new file mode 100644
index 0000000..112a9cc
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/WithIntervalMutableContractTestAbstract_changeDates.java
@@ -0,0 +1,66 @@
+package org.incode.module.base.dom.with;
+
+import org.jmock.Expectations;
+import org.jmock.auto.Mock;
+import org.joda.time.LocalDate;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public abstract class WithIntervalMutableContractTestAbstract_changeDates<T extends WithIntervalMutable<T>> {
+ @Rule
+ public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(JUnitRuleMockery2.Mode.INTERFACES_AND_CLASSES);
+ protected T withIntervalMutable;
+ @Mock
+ private WithIntervalMutable.Helper<T> mockChangeDates;
+
+ @Before
+ public void setUpWithIntervalMutable() throws Exception {
+ withIntervalMutable = doCreateWithIntervalMutable(mockChangeDates);
+ }
+
+ protected abstract T doCreateWithIntervalMutable(WithIntervalMutable.Helper<T> mockChangeDates);
+
+ @Test
+ public void default0ChangeDates() {
+ final LocalDate localDate = new LocalDate(2013,7,1);
+ context.checking(new Expectations() {
+ {
+ oneOf(mockChangeDates).default0ChangeDates();
+ will(returnValue(localDate));
+ }
+ });
+ assertThat(withIntervalMutable.default0ChangeDates(), is(localDate));
+ }
+
+ @Test
+ public void default1ChangeDates() {
+ final LocalDate localDate = new LocalDate(2013,7,1);
+ context.checking(new Expectations() {
+ {
+ oneOf(mockChangeDates).default1ChangeDates();
+ will(returnValue(localDate));
+ }
+ });
+ assertThat(withIntervalMutable.default1ChangeDates(), is(localDate));
+ }
+
+ @Test
+ public void validateChangeDates() {
+ final LocalDate startDate = new LocalDate(2013,4,1);
+ final LocalDate endDate = new LocalDate(2013,7,1);
+ final String reason = "xxx";
+ context.checking(new Expectations() {
+ {
+ oneOf(mockChangeDates).validateChangeDates(startDate, endDate);
+ will(returnValue(reason));
+ }
+ });
+ assertThat(withIntervalMutable.validateChangeDates(startDate, endDate), is(reason));
+ }
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/services/calendar/CalendarServiceTest_beginningOfMonth.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/services/calendar/CalendarServiceTest_beginningOfMonth.java
new file mode 100644
index 0000000..99d6f49
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/services/calendar/CalendarServiceTest_beginningOfMonth.java
@@ -0,0 +1,63 @@
+package org.incode.module.base.services.calendar;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import org.joda.time.LocalDate;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+import org.apache.isis.applib.services.clock.ClockService;
+
+import org.incode.module.base.services.calendar.CalendarService;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+@RunWith(Parameterized.class)
+public class CalendarServiceTest_beginningOfMonth {
+
+ private CalendarService calendarService;
+ private ClockService stubClockService;
+ protected LocalDate now;
+ private LocalDate expected;
+
+ @Parameters
+ public static Collection<Object[]> data() {
+ return Arrays.asList(
+ new Object[][] {
+ { new LocalDate(2013,4,15), new LocalDate(2013,4,1)},
+ { new LocalDate(2013,4,1), new LocalDate(2013,4,1)},
+ { new LocalDate(2013,4,30), new LocalDate(2013,4,1)},
+ });
+ }
+
+ public CalendarServiceTest_beginningOfMonth(LocalDate date, LocalDate expected) {
+ this.now = date;
+ this.expected = expected;
+ }
+
+ @Before
+ public void setUp() throws Exception {
+
+ stubClockService = new ClockService() {
+ @Override
+ public LocalDate now() {
+ return now;
+ }
+ };
+
+ calendarService = new CalendarService();
+ calendarService.clockService = stubClockService;
+ }
+
+ @Test
+ public void test() throws Exception {
+ assertThat(calendarService.beginningOfMonth(), is(expected));
+ }
+
+
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/services/calendar/CalendarServiceTest_beginningOfQuarter.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/services/calendar/CalendarServiceTest_beginningOfQuarter.java
new file mode 100644
index 0000000..cade1b2
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/services/calendar/CalendarServiceTest_beginningOfQuarter.java
@@ -0,0 +1,75 @@
+package org.incode.module.base.services.calendar;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import org.joda.time.LocalDate;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+import org.apache.isis.applib.services.clock.ClockService;
+
+import org.incode.module.base.services.calendar.CalendarService;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+@RunWith(Parameterized.class)
+public class CalendarServiceTest_beginningOfQuarter {
+
+ private CalendarService calendarService;
+ private ClockService stubClockService;
+ protected LocalDate now;
+ private LocalDate expected;
+
+ @Parameters
+ public static Collection<Object[]> data() {
+ return Arrays.asList(
+ new Object[][] {
+ { new LocalDate(2013,1,15), new LocalDate(2013,1,1)},
+ { new LocalDate(2013,1,1), new LocalDate(2013,1,1)},
+ { new LocalDate(2013,1,31), new LocalDate(2013,1,1)},
+ { new LocalDate(2013,2,15), new LocalDate(2013,1,1)},
+ { new LocalDate(2013,2,1), new LocalDate(2013,1,1)},
+ { new LocalDate(2013,2,28), new LocalDate(2013,1,1)},
+ { new LocalDate(2013,3,15), new LocalDate(2013,1,1)},
+ { new LocalDate(2013,3,1), new LocalDate(2013,1,1)},
+ { new LocalDate(2013,3,31), new LocalDate(2013,1,1)},
+ { new LocalDate(2013,4,15), new LocalDate(2013,4,1)},
+ { new LocalDate(2013,4,1), new LocalDate(2013,4,1)},
+ { new LocalDate(2013,4,30), new LocalDate(2013,4,1)},
+ { new LocalDate(2013,5,15), new LocalDate(2013,4,1)},
+ { new LocalDate(2013,5,1), new LocalDate(2013,4,1)},
+ { new LocalDate(2013,5,31), new LocalDate(2013,4,1)},
+ { new LocalDate(2013,6,15), new LocalDate(2013,4,1)},
+ { new LocalDate(2013,6,1), new LocalDate(2013,4,1)},
+ { new LocalDate(2013,6,30), new LocalDate(2013,4,1)},
+ });
+ }
+
+ public CalendarServiceTest_beginningOfQuarter(LocalDate date, LocalDate expected) {
+ this.now = date;
+ this.expected = expected;
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ stubClockService = new ClockService() {
+ @Override
+ public LocalDate now() {
+ return now;
+ }
+ };
+ calendarService = new CalendarService();
+ calendarService.clockService = stubClockService;
+ }
+
+ @Test
+ public void test() throws Exception {
+ assertThat(calendarService.beginningOfQuarter(), is(expected));
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/titled/TitledEnumContractTestAbstract_title.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/titled/TitledEnumContractTestAbstract_title.java
new file mode 100644
index 0000000..3c34b14
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/titled/TitledEnumContractTestAbstract_title.java
@@ -0,0 +1,18 @@
+package org.incode.module.unittestsupport.dom.titled;
+
+import org.incode.module.base.dom.TitledEnum;
+
+/**
+ * Automatically tests all enums implementing {@link TitledEnum}.
+ *
+ * @deprecated - use superclass
+ */
+@Deprecated
+public abstract class TitledEnumContractTestAbstract_title extends
+ org.incode.module.base.dom.titled.TitledEnumContractTestAbstract_title {
+
+ protected TitledEnumContractTestAbstract_title(final String prefix) {
+ super(prefix);
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/titled/TitledEnumContractTester.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/titled/TitledEnumContractTester.java
new file mode 100644
index 0000000..a6277a2
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/titled/TitledEnumContractTester.java
@@ -0,0 +1,20 @@
+package org.incode.module.unittestsupport.dom.titled;
+
+import org.incode.module.base.dom.TitledEnum;
+
+/**
+ * @deprecated - use superclass
+ * @param <T>
+ */
+@Deprecated
+public class TitledEnumContractTester<T extends TitledEnum> extends
+ org.incode.module.base.dom.titled.TitledEnumContractTester {
+
+ /**
+ * @param enumType
+ */
+ public TitledEnumContractTester(Class<? extends Enum<?>> enumType) {
+ super(enumType);
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByCodeContractTestAbstract_compareTo.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByCodeContractTestAbstract_compareTo.java
new file mode 100644
index 0000000..a6c3b96
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByCodeContractTestAbstract_compareTo.java
@@ -0,0 +1,26 @@
+package org.incode.module.unittestsupport.dom.with;
+
+import com.google.common.collect.ImmutableMap;
+
+import org.incode.module.base.dom.with.WithCodeComparable;
+
+/**
+ * Automatically tests all domain objects implementing {@link WithCodeComparable}.
+ *
+ * <p>
+ * Any that cannot be instantiated are skipped; manually test using
+ * {@link ComparableByCodeContractTester}.
+ *
+ * @deprecated - use superclass
+ */
+@Deprecated
+public abstract class ComparableByCodeContractTestAbstract_compareTo extends
+ org.incode.module.base.dom.with.ComparableByCodeContractTestAbstract_compareTo {
+
+ protected ComparableByCodeContractTestAbstract_compareTo(
+ final String packagePrefix,
+ final ImmutableMap<Class<?>, Class<?>> noninstantiableSubstitutes) {
+ super(packagePrefix, noninstantiableSubstitutes);
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByCodeContractTester.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByCodeContractTester.java
new file mode 100644
index 0000000..43eebe2
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByCodeContractTester.java
@@ -0,0 +1,16 @@
+package org.incode.module.unittestsupport.dom.with;
+
+import org.incode.module.base.dom.with.WithCodeComparable;
+
+/**
+ * @deprecated - use superclass
+ */
+@Deprecated
+public class ComparableByCodeContractTester<T extends WithCodeComparable<T>> extends
+ org.incode.module.base.dom.with.ComparableByCodeContractTester<T> {
+
+ public ComparableByCodeContractTester(Class<T> cls) {
+ super(cls);
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByDescriptionContractTestAbstract_compareTo.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByDescriptionContractTestAbstract_compareTo.java
new file mode 100644
index 0000000..0b8627c
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByDescriptionContractTestAbstract_compareTo.java
@@ -0,0 +1,26 @@
+package org.incode.module.unittestsupport.dom.with;
+
+import com.google.common.collect.ImmutableMap;
+
+import org.incode.module.base.dom.with.WithDescriptionComparable;
+
+/**
+ * Automatically tests all domain objects implementing {@link WithDescriptionComparable}.
+ *
+ * <p>
+ * Any that cannot be instantiated are skipped; manually test using
+ * {@link ComparableByDescriptionContractTester}.
+ *
+ * @deprecated - use superclass
+ */
+@Deprecated
+public abstract class ComparableByDescriptionContractTestAbstract_compareTo extends
+ org.incode.module.base.dom.with.ComparableByDescriptionContractTestAbstract_compareTo {
+
+ protected ComparableByDescriptionContractTestAbstract_compareTo(
+ final String packagePrefix,
+ final ImmutableMap<Class<?>, Class<?>> noninstantiableSubstitutes) {
+ super(packagePrefix, noninstantiableSubstitutes);
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByDescriptionContractTester.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByDescriptionContractTester.java
new file mode 100644
index 0000000..0b22b4d
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByDescriptionContractTester.java
@@ -0,0 +1,17 @@
+package org.incode.module.unittestsupport.dom.with;
+
+import org.incode.module.base.dom.with.WithDescriptionComparable;
+
+/**
+ *
+ * @deprecated - use superclass
+ */
+@Deprecated
+public class ComparableByDescriptionContractTester<T extends WithDescriptionComparable<T>> extends
+ org.incode.module.base.dom.with.ComparableByDescriptionContractTester<T> {
+
+ public ComparableByDescriptionContractTester(Class<T> cls) {
+ super(cls);
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByNameContractTestAbstract_compareTo.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByNameContractTestAbstract_compareTo.java
new file mode 100644
index 0000000..364a717
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByNameContractTestAbstract_compareTo.java
@@ -0,0 +1,26 @@
+package org.incode.module.unittestsupport.dom.with;
+
+import com.google.common.collect.ImmutableMap;
+
+import org.incode.module.base.dom.with.WithNameComparable;
+
+/**
+ * Automatically tests all domain objects implementing {@link WithNameComparable}.
+ *
+ * <p>
+ * Any that cannot be instantiated are skipped; manually test using
+ * {@link ComparableByNameContractTester}.
+ *
+ * @deprecated - use superclass
+ */
+@Deprecated
+public abstract class ComparableByNameContractTestAbstract_compareTo extends
+ org.incode.module.base.dom.with.ComparableByNameContractTestAbstract_compareTo {
+
+ protected ComparableByNameContractTestAbstract_compareTo(
+ final String packagePrefix,
+ final ImmutableMap<Class<?>, Class<?>> noninstantiableSubstitutes) {
+ super(packagePrefix, noninstantiableSubstitutes);
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByNameContractTester.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByNameContractTester.java
new file mode 100644
index 0000000..0d965de
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByNameContractTester.java
@@ -0,0 +1,17 @@
+package org.incode.module.unittestsupport.dom.with;
+
+import org.incode.module.base.dom.with.WithNameComparable;
+
+/**
+ *
+ * @deprecated - use superclass
+ */
+@Deprecated
+public class ComparableByNameContractTester<T extends WithNameComparable<T>> extends
+ org.incode.module.base.dom.with.ComparableByNameContractTester<T> {
+
+ public ComparableByNameContractTester(Class<T> cls) {
+ super(cls);
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByReferenceContractTestAbstract_compareTo.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByReferenceContractTestAbstract_compareTo.java
new file mode 100644
index 0000000..1268a67
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByReferenceContractTestAbstract_compareTo.java
@@ -0,0 +1,26 @@
+package org.incode.module.unittestsupport.dom.with;
+
+import com.google.common.collect.ImmutableMap;
+
+import org.incode.module.base.dom.with.WithReferenceComparable;
+
+/**
+ * Automatically tests all domain objects implementing {@link WithReferenceComparable}.
+ *
+ * <p>
+ * Any that cannot be instantiated are skipped; manually test using
+ * {@link ComparableByReferenceContractTester}.
+ *
+ * @deprecated - use superclass
+ */
+@Deprecated
+public abstract class ComparableByReferenceContractTestAbstract_compareTo extends
+ org.incode.module.base.dom.with.ComparableByReferenceContractTestAbstract_compareTo {
+
+ protected ComparableByReferenceContractTestAbstract_compareTo(
+ final String packagePrefix,
+ final ImmutableMap<Class<?>, Class<?>> noninstantiableSubstitutes) {
+ super(packagePrefix, noninstantiableSubstitutes);
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByReferenceContractTester.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByReferenceContractTester.java
new file mode 100644
index 0000000..7ac408c
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByReferenceContractTester.java
@@ -0,0 +1,17 @@
+package org.incode.module.unittestsupport.dom.with;
+
+import org.incode.module.base.dom.with.WithReferenceComparable;
+
+/**
+ *
+ * @deprecated - use superclass
+ */
+@Deprecated
+public class ComparableByReferenceContractTester<T extends WithReferenceComparable<T>> extends
+ org.incode.module.base.dom.with.ComparableByReferenceContractTester<T> {
+
+ public ComparableByReferenceContractTester(Class<T> cls) {
+ super(cls);
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByTitleContractTestAbstract_compareTo.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByTitleContractTestAbstract_compareTo.java
new file mode 100644
index 0000000..fa1dd54
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByTitleContractTestAbstract_compareTo.java
@@ -0,0 +1,26 @@
+package org.incode.module.unittestsupport.dom.with;
+
+import com.google.common.collect.ImmutableMap;
+
+import org.incode.module.base.dom.with.WithTitleComparable;
+
+/**
+ * Automatically tests all domain objects implementing {@link WithTitleComparable}.
+ *
+ * <p>
+ * Any that cannot be instantiated are skipped; manually test using
+ * {@link ComparableByTitleContractTester}.
+ *
+ * @deprecated - use superclass
+ */
+@Deprecated
+public abstract class ComparableByTitleContractTestAbstract_compareTo extends
+ org.incode.module.base.dom.with.ComparableByTitleContractTestAbstract_compareTo {
+
+ protected ComparableByTitleContractTestAbstract_compareTo(
+ final String packagePrefix,
+ final ImmutableMap<Class<?>, Class<?>> noninstantiableSubstitutes) {
+ super(packagePrefix, noninstantiableSubstitutes);
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByTitleContractTester.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByTitleContractTester.java
new file mode 100644
index 0000000..9c9d9d7
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByTitleContractTester.java
@@ -0,0 +1,17 @@
+package org.incode.module.unittestsupport.dom.with;
+
+import org.incode.module.base.dom.with.WithTitleComparable;
+
+/**
+ *
+ * @deprecated - use superclass
+ */
+@Deprecated
+public class ComparableByTitleContractTester<T extends WithTitleComparable<T>> extends
+ org.incode.module.base.dom.with.ComparableByTitleContractTester<T> {
+
+ public ComparableByTitleContractTester(Class<T> cls) {
+ super(cls);
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByCode.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByCode.java
new file mode 100644
index 0000000..4f331af
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByCode.java
@@ -0,0 +1,16 @@
+package org.incode.module.unittestsupport.dom.with;
+
+import org.incode.module.base.dom.with.WithCodeComparable;
+
+/**
+ *
+ * @deprecated - use superclass
+ */
+@Deprecated
+public class InstantiatorForComparableByCode extends org.incode.module.base.dom.with.InstantiatorForComparableByCode {
+
+ public InstantiatorForComparableByCode(Class<? extends WithCodeComparable<?>> cls) {
+ super(cls);
+ }
+
+}
\ No newline at end of file
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByDescription.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByDescription.java
new file mode 100644
index 0000000..40f0171
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByDescription.java
@@ -0,0 +1,17 @@
+package org.incode.module.unittestsupport.dom.with;
+
+import org.incode.module.base.dom.with.WithDescriptionComparable;
+
+/**
+ *
+ * @deprecated - use superclass
+ */
+@Deprecated
+public class InstantiatorForComparableByDescription extends
+ org.incode.module.base.dom.with.InstantiatorForComparableByDescription {
+
+ public InstantiatorForComparableByDescription(Class<? extends WithDescriptionComparable<?>> cls) {
+ super(cls);
+ }
+
+}
\ No newline at end of file
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByName.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByName.java
new file mode 100644
index 0000000..3b580d9
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByName.java
@@ -0,0 +1,16 @@
+package org.incode.module.unittestsupport.dom.with;
+
+import org.incode.module.base.dom.with.WithNameComparable;
+
+/**
+ *
+ * @deprecated - use superclass
+ */
+@Deprecated
+public class InstantiatorForComparableByName extends org.incode.module.base.dom.with.InstantiatorForComparableByName {
+
+ public InstantiatorForComparableByName(Class<? extends WithNameComparable<?>> cls) {
+ super(cls);
+ }
+
+}
\ No newline at end of file
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByReference.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByReference.java
new file mode 100644
index 0000000..cd47f6b
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByReference.java
@@ -0,0 +1,17 @@
+package org.incode.module.unittestsupport.dom.with;
+
+import org.incode.module.base.dom.with.WithReferenceComparable;
+
+/**
+ *
+ * @deprecated - use superclass
+ */
+@Deprecated
+public class InstantiatorForComparableByReference extends
+ org.incode.module.base.dom.with.InstantiatorForComparableByReference {
+
+ public InstantiatorForComparableByReference(Class<? extends WithReferenceComparable<?>> cls) {
+ super(cls);
+ }
+
+}
\ No newline at end of file
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/InstantiatorForWithStartDate.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/InstantiatorForWithStartDate.java
new file mode 100644
index 0000000..6b85af3
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/InstantiatorForWithStartDate.java
@@ -0,0 +1,16 @@
+package org.incode.module.unittestsupport.dom.with;
+
+import org.incode.module.base.dom.with.WithStartDate;
+
+/**
+ *
+ * @deprecated - use superclass
+ */
+@Deprecated
+public class InstantiatorForWithStartDate extends org.incode.module.base.dom.with.InstantiatorForWithStartDate {
+
+ public InstantiatorForWithStartDate(Class<? extends WithStartDate> cls) {
+ super(cls);
+ }
+
+}
\ No newline at end of file
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/WithFieldUniqueContractTestAllAbstract.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/WithFieldUniqueContractTestAllAbstract.java
new file mode 100644
index 0000000..98029ca
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/WithFieldUniqueContractTestAllAbstract.java
@@ -0,0 +1,18 @@
+package org.incode.module.unittestsupport.dom.with;
+
+/**
+ *
+ * @deprecated - use superclass
+ */
+@Deprecated
+public abstract class WithFieldUniqueContractTestAllAbstract<T> extends
+ org.incode.module.base.dom.with.WithFieldUniqueContractTestAllAbstract<T> {
+
+ public WithFieldUniqueContractTestAllAbstract(
+ final String prefix,
+ final String fieldName,
+ final Class<T> interfaceType) {
+ super(prefix, fieldName, interfaceType);
+ }
+
+}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/WithIntervalMutableContractTestAbstract_changeDates.java b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/WithIntervalMutableContractTestAbstract_changeDates.java
new file mode 100644
index 0000000..8203da3
--- /dev/null
+++ b/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/WithIntervalMutableContractTestAbstract_changeDates.java
@@ -0,0 +1,13 @@
+package org.incode.module.unittestsupport.dom.with;
+
+import org.incode.module.base.dom.with.WithIntervalMutable;
+
+/**
+ *
+ * @deprecated - use superclass
+ */
+@Deprecated
+public abstract class WithIntervalMutableContractTestAbstract_changeDates<T extends WithIntervalMutable<T>> extends
+ org.incode.module.base.dom.with.WithIntervalMutableContractTestAbstract_changeDates<T> {
+
+}
diff --git a/extensions/lib/excel/fixture/.gitignore b/extensions/lib/excel/fixture/.gitignore
new file mode 100644
index 0000000..7371415
--- /dev/null
+++ b/extensions/lib/excel/fixture/.gitignore
@@ -0,0 +1,5 @@
+.gradle
+translations.pot
+*.jar
+gradle/wrapper
+!gradle-wrapper.jar
\ No newline at end of file
diff --git a/extensions/lib/excel/fixture/logging-dn-enhance.properties b/extensions/lib/excel/fixture/logging-dn-enhance.properties
new file mode 100644
index 0000000..281bfb6
--- /dev/null
+++ b/extensions/lib/excel/fixture/logging-dn-enhance.properties
@@ -0,0 +1,24 @@
+# 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/extensions/lib/excel/fixture/pom.xml b/extensions/lib/excel/fixture/pom.xml
new file mode 100644
index 0000000..b70baef
--- /dev/null
+++ b/extensions/lib/excel/fixture/pom.xml
@@ -0,0 +1,246 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.incode</groupId>
+ <artifactId>incode-parent</artifactId>
+ <version>${revision}</version>
+ <relativePath>../../../pom.xml</relativePath>
+ </parent>
+
+ <groupId>org.isisaddons.module.excel</groupId>
+ <artifactId>isis-module-excel-fixtures</artifactId>
+ <name>Incode Platform Lib Excel Fixtures</name>
+
+ <build>
+ <resources>
+ <resource>
+ <filtering>false</filtering>
+ <directory>src/main/resources</directory>
+ </resource>
+ <resource>
+ <filtering>false</filtering>
+ <directory>src/main/java</directory>
+ <includes>
+ <include>**</include>
+ </includes>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <testResources>
+ <testResource>
+ <filtering>false</filtering>
+ <directory>src/test/resources</directory>
+ </testResource>
+ <testResource>
+ <filtering>false</filtering>
+ <directory>src/test/java</directory>
+ <includes>
+ <include>**</include>
+ </includes>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </testResource>
+ </testResources>
+ <plugins>
+ <plugin>
+ <groupId>com.github.odavid.maven.plugins</groupId>
+ <artifactId>mixin-maven-plugin</artifactId>
+ <version>0.1-alpha-39</version>
+ <extensions>true</extensions>
+ <configuration>
+ <mixins>
+ <mixin>
+ <groupId>com.danhaywood.mavenmixin</groupId>
+ <artifactId>datanucleusenhance</artifactId>
+ </mixin>
+ <mixin>
+ <groupId>com.danhaywood.mavenmixin</groupId>
+ <artifactId>enforcerrelaxed</artifactId>
+ </mixin>
+ <mixin>
+ <groupId>com.danhaywood.mavenmixin</groupId>
+ <artifactId>sourceandjavadoc</artifactId>
+ </mixin>
+ <mixin>
+ <groupId>com.danhaywood.mavenmixin</groupId>
+ <artifactId>standard</artifactId>
+ </mixin>
+ <mixin>
+ <groupId>com.danhaywood.mavenmixin</groupId>
+ <artifactId>staticanalysis</artifactId>
+ </mixin>
+ <mixin>
+ <groupId>com.danhaywood.mavenmixin</groupId>
+ <artifactId>surefire</artifactId>
+ </mixin>
+<!--
+TODO: to reinstate, think that FixturesManifest needs some attention.
+ <mixin>
+ <groupId>org.incode.mavenmixin</groupId>
+ <artifactId>incode-mavenmixin-validate</artifactId>
+ </mixin>
+-->
+ </mixins>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-core-applib</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-core-wrapper</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.incode.module.fixturesupport</groupId>
+ <artifactId>incode-module-fixturesupport-dom</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.hsqldb</groupId>
+ <artifactId>hsqldb</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.axonframework</groupId>
+ <artifactId>axon-core</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.togglz</groupId>
+ <artifactId>togglz-core</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.isisaddons.module.docx</groupId>
+ <artifactId>isis-module-docx-dom</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.jdom</groupId>
+ <artifactId>jdom2</artifactId>
+ <version>2.0.3</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.isisaddons.module.excel</groupId>
+ <artifactId>isis-module-excel-dom</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.isisaddons.module.fakedata</groupId>
+ <artifactId>isis-module-fakedata-dom</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.isisaddons.module.poly</groupId>
+ <artifactId>isis-module-poly-dom</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.isisaddons.module.servletapi</groupId>
+ <artifactId>isis-module-servletapi-dom</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.isisaddons.module.stringinterpolator</groupId>
+ <artifactId>isis-module-stringinterpolator-dom</artifactId>
+ </dependency>
+
+
+ <dependency>
+ <groupId>org.isisaddons.module.audit</groupId>
+ <artifactId>isis-module-audit-dom</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.isisaddons.module.command</groupId>
+ <artifactId>isis-module-command-dom</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.isisaddons.module.publishmq</groupId>
+ <artifactId>isis-module-publishmq-dom-jdo</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.isisaddons.module.publishmq</groupId>
+ <artifactId>isis-module-publishmq-dom-outbox</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.isisaddons.module.publishmq</groupId>
+ <artifactId>isis-module-publishmq-dom-mq</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.isisaddons.module.publishmq</groupId>
+ <artifactId>isis-module-publishmq-dom-status</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.isisaddons.module.security</groupId>
+ <artifactId>isis-module-security-dom</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.isisaddons.module.sessionlogger</groupId>
+ <artifactId>isis-module-sessionlogger-dom</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.isisaddons.wicket.fullcalendar2</groupId>
+ <artifactId>isis-wicket-fullcalendar2-cpt</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.isisaddons.wicket.gmap3</groupId>
+ <artifactId>isis-wicket-gmap3-cpt</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.isisaddons.wicket.pdfjs</groupId>
+ <artifactId>isis-wicket-pdfjs-cpt</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.isisaddons.wicket.summernote</groupId>
+ <artifactId>isis-wicket-summernote-cpt</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.isisaddons.wicket.wickedcharts</groupId>
+ <artifactId>isis-wicket-wickedcharts-cpt</artifactId>
+ </dependency>
+
+
+ <!-- test -->
+ <dependency>
+ <groupId>org.apache.isis.mavendeps</groupId>
+ <artifactId>isis-mavendeps-testing</artifactId>
+ <type>pom</type>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.togglz</groupId>
+ <artifactId>togglz-junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.projectlombok</groupId>
+ <artifactId>lombok</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
+ </dependencies>
+
+</project>
diff --git a/extensions/lib/excel/fixture/src/main/java/META-INF/persistence.xml b/extensions/lib/excel/fixture/src/main/java/META-INF/persistence.xml
new file mode 100644
index 0000000..322833e
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/META-INF/persistence.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<persistence xmlns="http://java.sun.com/xml/ns/persistence"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
+
+ <persistence-unit name="org-isisaddons-module-excel-fixture">
+ </persistence-unit>
+</persistence>
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/ExcelFixturesModule.java b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/ExcelFixturesModule.java
new file mode 100644
index 0000000..6069c56
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/ExcelFixturesModule.java
@@ -0,0 +1,29 @@
+package org.isisaddons.module.excel.fixture;
+
+import java.util.Set;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+import com.google.common.collect.Sets;
+
+import org.apache.isis.applib.Module;
+import org.apache.isis.applib.ModuleAbstract;
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+
+import org.isisaddons.module.excel.ExcelModule;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.fixturescripts.ExcelDemoToDoItem_tearDown;
+
+@XmlRootElement(name = "module")
+public class ExcelFixturesModule extends ModuleAbstract {
+
+ @Override
+ public Set<Module> getDependencies() {
+ return Sets.newHashSet(
+ new ExcelModule()
+ );
+ }
+
+ @Override public FixtureScript getTeardownFixture() {
+ return new ExcelDemoToDoItem_tearDown();
+ }
+}
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/contributions/ExcelDemoToDoItem_export.java b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/contributions/ExcelDemoToDoItem_export.java
new file mode 100644
index 0000000..e538547
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/contributions/ExcelDemoToDoItem_export.java
@@ -0,0 +1,52 @@
+package org.isisaddons.module.excel.fixture.demoapp.demomodule.contributions;
+
+import java.util.List;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.Contributed;
+import org.apache.isis.applib.annotation.InvokeOn;
+import org.apache.isis.applib.annotation.Mixin;
+import org.apache.isis.applib.services.actinvoc.ActionInvocationContext;
+import org.apache.isis.applib.value.Blob;
+
+import org.isisaddons.module.excel.dom.ExcelService;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.ExcelDemoToDoItem;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.ExcelDemoToDoItemMenu;
+
+@Mixin(method = "act")
+public class ExcelDemoToDoItem_export {
+
+ private final ExcelDemoToDoItem toDoItem;
+
+ public ExcelDemoToDoItem_export(final ExcelDemoToDoItem toDoItem) {
+ this.toDoItem = toDoItem;
+ }
+
+ @Action(
+ invokeOn = InvokeOn.OBJECT_ONLY // ISIS-705 ... bulk actions returning Blobs are not yet supported
+ )
+ @ActionLayout(contributed = Contributed.AS_ACTION)
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ public Blob act() {
+ if(actionInvocationContext.isLast()) {
+ // ie current object only
+ final List toDoItems = actionInvocationContext.getDomainObjects();
+ return excelService.toExcel(toDoItems, ExcelDemoToDoItem.class, ExcelDemoToDoItem.class.getSimpleName(), "toDoItems.xlsx");
+ } else {
+ return null;
+ }
+ }
+
+
+
+ @javax.inject.Inject
+ private ExcelService excelService;
+
+ @javax.inject.Inject
+ private ExcelDemoToDoItemMenu excelModuleDemoToDoItems;
+
+ @javax.inject.Inject
+ private ActionInvocationContext actionInvocationContext;
+
+}
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/contributions/ExcelDemoToDoItem_export2.java b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/contributions/ExcelDemoToDoItem_export2.java
new file mode 100644
index 0000000..bc2285e
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/contributions/ExcelDemoToDoItem_export2.java
@@ -0,0 +1,65 @@
+package org.isisaddons.module.excel.fixture.demoapp.demomodule.contributions;
+
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.Contributed;
+import org.apache.isis.applib.annotation.InvokeOn;
+import org.apache.isis.applib.annotation.Mixin;
+import org.apache.isis.applib.services.actinvoc.ActionInvocationContext;
+import org.apache.isis.applib.value.Blob;
+
+import org.isisaddons.module.excel.dom.ExcelService;
+import org.isisaddons.module.excel.dom.WorksheetContent;
+import org.isisaddons.module.excel.dom.WorksheetSpec;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.ExcelDemoToDoItem;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.ExcelDemoToDoItemMenu;
+
+@Mixin(method = "act")
+public class ExcelDemoToDoItem_export2 {
+
+ private final ExcelDemoToDoItem toDoItem;
+
+ public ExcelDemoToDoItem_export2(final ExcelDemoToDoItem toDoItem) {
+ this.toDoItem = toDoItem;
+ }
+
+ @Action(
+ invokeOn = InvokeOn.OBJECT_ONLY // ISIS-705 ... bulk actions returning Blobs are not yet supported
+ )
+ @ActionLayout(
+ contributed = Contributed.AS_ACTION
+ )
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ public Blob act() {
+ if(actionInvocationContext.isLast()) {
+ // ie current object only
+ final List toDoItems = actionInvocationContext.getDomainObjects();
+ final List<ExcelDemoToDoItem> allItems = this.excelModuleDemoToDoItems.allInstances();
+ final List<WorksheetContent> worksheetContents = Lists.newArrayList(
+ new WorksheetContent(toDoItems, new WorksheetSpec(ExcelDemoToDoItem.class, "current")),
+ new WorksheetContent(allItems, new WorksheetSpec(ExcelDemoToDoItem.class, "all")));
+ return excelService.toExcel(worksheetContents, "toDoItems.xlsx");
+ } else {
+ return null;
+ }
+ }
+
+
+ // //////////////////////////////////////
+ // Injected Services
+ // //////////////////////////////////////
+
+ @javax.inject.Inject
+ private ExcelService excelService;
+
+ @javax.inject.Inject
+ private ExcelDemoToDoItemMenu excelModuleDemoToDoItems;
+
+ @javax.inject.Inject
+ private ActionInvocationContext actionInvocationContext;
+
+}
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/dom/bulkupdate/BulkUpdateLineItemForDemoToDoItem.java b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/dom/bulkupdate/BulkUpdateLineItemForDemoToDoItem.java
new file mode 100644
index 0000000..0a8b7dc
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/dom/bulkupdate/BulkUpdateLineItemForDemoToDoItem.java
@@ -0,0 +1,267 @@
+package org.isisaddons.module.excel.fixture.demoapp.demomodule.dom.bulkupdate;
+
+import java.math.BigDecimal;
+
+import org.joda.time.LocalDate;
+
+import org.apache.isis.applib.AbstractViewModel;
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.BookmarkPolicy;
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.DomainObjectLayout;
+import org.apache.isis.applib.annotation.InvokeOn;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.applib.services.actinvoc.ActionInvocationContext;
+
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.Category;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.ExcelDemoToDoItem;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.ExcelDemoToDoItemMenu;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.Subcategory;
+
+@DomainObject(
+ objectType = "libExcelFixture.BulkUpdateLineItemForDemoToDoItem"
+)
+@DomainObjectLayout(
+ named = "Bulk update line item",
+ bookmarking = BookmarkPolicy.AS_ROOT
+)
+public class BulkUpdateLineItemForDemoToDoItem
+ extends AbstractViewModel
+ implements Comparable<BulkUpdateLineItemForDemoToDoItem> {
+
+
+ public String title() {
+ final ExcelDemoToDoItem existingItem = getToDoItem();
+ if(existingItem != null) {
+ return "EXISTING: " + getContainer().titleOf(existingItem);
+ }
+ return "NEW: " + getDescription();
+ }
+
+
+ // //////////////////////////////////////
+ // ViewModel implementation
+ // //////////////////////////////////////
+
+
+ @Override
+ public String viewModelMemento() {
+ return toDoItemExportImportService.mementoFor(this);
+ }
+
+ @Override
+ public void viewModelInit(final String mementoStr) {
+ toDoItemExportImportService.init(mementoStr, this);
+ }
+
+
+ // //////////////////////////////////////
+ // ToDoItem (optional property)
+ // //////////////////////////////////////
+
+ private ExcelDemoToDoItem toDoItem;
+
+ @MemberOrder(sequence="1")
+ public ExcelDemoToDoItem getToDoItem() {
+ return toDoItem;
+ }
+ public void setToDoItem(final ExcelDemoToDoItem toDoItem) {
+ this.toDoItem = toDoItem;
+ }
+ public void modifyToDoItem(final ExcelDemoToDoItem toDoItem) {
+ setToDoItem(toDoItem);
+ setDescription(toDoItem.getDescription());
+ setCategory(toDoItem.getCategory());
+ setSubcategory(toDoItem.getSubcategory());
+ setComplete(toDoItem.isComplete());
+ setCost(toDoItem.getCost());
+ setDueBy(toDoItem.getDueBy());
+ setNotes(toDoItem.getNotes());
+ setOwnedBy(toDoItem.getOwnedBy());
+ }
+
+
+ // //////////////////////////////////////
+ // Description (property)
+ // //////////////////////////////////////
+
+ private String description;
+
+ @MemberOrder(sequence="2")
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(final String description) {
+ this.description = description;
+ }
+
+ // //////////////////////////////////////
+ // Category and Subcategory (property)
+ // //////////////////////////////////////
+
+ private Category category;
+
+ @MemberOrder(sequence="3")
+ public Category getCategory() {
+ return category;
+ }
+
+ public void setCategory(final Category category) {
+ this.category = category;
+ }
+
+ // //////////////////////////////////////
+
+ private Subcategory subcategory;
+
+ @MemberOrder(sequence="4")
+ public Subcategory getSubcategory() {
+ return subcategory;
+ }
+ public void setSubcategory(final Subcategory subcategory) {
+ this.subcategory = subcategory;
+ }
+
+ // //////////////////////////////////////
+ // OwnedBy (property)
+ // //////////////////////////////////////
+
+ private String ownedBy;
+
+ @MemberOrder(sequence="5")
+ public String getOwnedBy() {
+ return ownedBy;
+ }
+
+ public void setOwnedBy(final String ownedBy) {
+ this.ownedBy = ownedBy;
+ }
+
+
+ // //////////////////////////////////////
+ // DueBy (property)
+ // //////////////////////////////////////
+
+ private LocalDate dueBy;
+
+ @MemberOrder(sequence="6")
+ public LocalDate getDueBy() {
+ return dueBy;
+ }
+
+ public void setDueBy(final LocalDate dueBy) {
+ this.dueBy = dueBy;
+ }
+
+
+ // //////////////////////////////////////
+ // Complete (property),
+ // Done (action), Undo (action)
+ // //////////////////////////////////////
+
+ private boolean complete;
+
+ @MemberOrder(sequence="7")
+ public boolean isComplete() {
+ return complete;
+ }
+
+ public void setComplete(final boolean complete) {
+ this.complete = complete;
+ }
+
+
+ // //////////////////////////////////////
+ // Cost (property), UpdateCost (action)
+ // //////////////////////////////////////
+
+ private BigDecimal cost;
+
+ public BigDecimal getCost() {
+ return cost;
+ }
+
+ public void setCost(final BigDecimal cost) {
+ this.cost = cost!=null?cost.setScale(2, BigDecimal.ROUND_HALF_EVEN):null;
+ }
+
+
+ // //////////////////////////////////////
+ // Notes (property)
+ // //////////////////////////////////////
+
+ private String notes;
+
+ public String getNotes() {
+ return notes;
+ }
+
+ public void setNotes(final String notes) {
+ this.notes = notes;
+ }
+
+
+ // //////////////////////////////////////
+ // apply
+ // //////////////////////////////////////
+
+ @Action(
+ semantics = SemanticsOf.IDEMPOTENT,
+ invokeOn = InvokeOn.OBJECT_AND_COLLECTION
+ )
+ public ExcelDemoToDoItem apply() {
+ ExcelDemoToDoItem item = getToDoItem();
+ if(item == null) {
+ // description must be unique, so check
+ item = toDoItems.findToDoItemsByDescription(getDescription());
+ if(item != null) {
+ getContainer().warnUser("Item already exists with description '" + getDescription() + "'");
+ } else {
+ // create new item
+ // (since this is just a demo, haven't bothered to validate new values)
+ item = toDoItems.newToDoItem(getDescription(), getCategory(), getSubcategory(), getDueBy(), getCost());
+ item.setNotes(getNotes());
+ item.setOwnedBy(getOwnedBy());
+ item.setComplete(isComplete());
+ }
+ } else {
+ // copy over new values
+ // (since this is just a demo, haven't bothered to validate new values)
+ item.setDescription(getDescription());
+ item.setCategory(getCategory());
+ item.setSubcategory(getSubcategory());
+ item.setDueBy(getDueBy());
+ item.setCost(getCost());
+ item.setNotes(getNotes());
+ item.setOwnedBy(getOwnedBy());
+ item.setComplete(isComplete());
+ }
+ return actionInvocationContext.getInvokedOn().isCollection()? null: item;
+ }
+
+
+ // //////////////////////////////////////
+ // compareTo
+ // //////////////////////////////////////
+
+ @Override
+ public int compareTo(final BulkUpdateLineItemForDemoToDoItem other) {
+ return this.toDoItem.compareTo(other.toDoItem);
+ }
+
+
+ // //////////////////////////////////////
+ // injected services
+ // //////////////////////////////////////
+
+ @javax.inject.Inject
+ private BulkUpdateMenuForDemoToDoItem toDoItemExportImportService;
+
+ @javax.inject.Inject
+ private ExcelDemoToDoItemMenu toDoItems;
+
+ @javax.inject.Inject
+ private ActionInvocationContext actionInvocationContext;
+}
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/dom/bulkupdate/BulkUpdateLineItemForDemoToDoItem.layout.xml b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/dom/bulkupdate/BulkUpdateLineItemForDemoToDoItem.layout.xml
new file mode 100644
index 0000000..3f0684f
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/dom/bulkupdate/BulkUpdateLineItemForDemoToDoItem.layout.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<bs3:grid xsi:schemaLocation="http://isis.apache.org/applib/layout/component http://isis.apache.org/applib/layout/component/component.xsd http://isis.apache.org/applib/layout/grid/bootstrap3 http://isis.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd" xmlns:bs3="http://isis.apache.org/applib/layout/grid/bootstrap3" xmlns:cpt="http://isis.apache.org/applib/layout/component" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <bs3:row>
+ <bs3:col span="12" unreferencedActions="true">
+ <cpt:domainObject/>
+ <cpt:action id="apply"/>
+ </bs3:col>
+ </bs3:row>
+ <bs3:row>
+ <bs3:col span="4">
+ <cpt:fieldSet name="General" id="general" unreferencedProperties="true">
+ <cpt:action id="clearHints"/>
+ <cpt:action id="downloadLayoutXml"/>
+ <cpt:action id="rebuildMetamodel"/>
+ <cpt:property id="toDoItem"/>
+ <cpt:property id="description"/>
+ <cpt:property id="category"/>
+ <cpt:property id="subcategory"/>
+ <cpt:property id="ownedBy"/>
+ <cpt:property id="complete"/>
+ <cpt:property id="notes"/>
+ <cpt:property id="dueBy"/>
+ <cpt:property id="cost"/>
+ </cpt:fieldSet>
+ </bs3:col>
+ <bs3:col span="8" unreferencedCollections="true"/>
+ </bs3:row>
+</bs3:grid>
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/dom/bulkupdate/BulkUpdateManagerForDemoToDoItem.java b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/dom/bulkupdate/BulkUpdateManagerForDemoToDoItem.java
new file mode 100644
index 0000000..8107857
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/dom/bulkupdate/BulkUpdateManagerForDemoToDoItem.java
@@ -0,0 +1,195 @@
+package org.isisaddons.module.excel.fixture.demoapp.demomodule.dom.bulkupdate;
+
+import java.util.List;
+
+import javax.annotation.Nullable;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicates;
+import com.google.common.collect.Lists;
+
+import org.apache.isis.applib.DomainObjectContainer;
+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.Collection;
+import org.apache.isis.applib.annotation.CollectionLayout;
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.DomainObjectLayout;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.Nature;
+import org.apache.isis.applib.annotation.Parameter;
+import org.apache.isis.applib.annotation.ParameterLayout;
+import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.applib.value.Blob;
+
+import org.isisaddons.module.excel.dom.ExcelService;
+import org.isisaddons.module.excel.dom.WorksheetContent;
+import org.isisaddons.module.excel.dom.WorksheetSpec;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.Category;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.ExcelDemoToDoItem;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.Subcategory;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@DomainObject(
+ nature = Nature.VIEW_MODEL,
+ objectType = "libExcelFixture.BulkUpdateManagerForDemoToDoItem"
+)
+@DomainObjectLayout(
+ named ="Import/export manager",
+ bookmarking = BookmarkPolicy.AS_ROOT
+)
+public class BulkUpdateManagerForDemoToDoItem {
+
+
+ public static final WorksheetSpec WORKSHEET_SPEC =
+ new WorksheetSpec(BulkUpdateLineItemForDemoToDoItem.class, "line-items");
+
+ public BulkUpdateManagerForDemoToDoItem(){
+ }
+
+
+ public String title() {
+ return "Import/export manager";
+ }
+
+
+
+ @Getter @Setter @Nullable
+ private String fileName;
+
+ @Getter @Setter @Nullable
+ private Category category;
+
+ @Getter @Setter @Nullable
+ private Subcategory subcategory;
+
+ @Getter @Setter @Nullable
+ private boolean complete;
+
+
+ @Action(
+ semantics = SemanticsOf.IDEMPOTENT
+ )
+ public BulkUpdateManagerForDemoToDoItem changeFileName(final String fileName) {
+ setFileName(fileName);
+ return bulkUpdateMenuForDemoToDoItem.newBulkUpdateManager(this);
+ }
+ public String default0ChangeFileName() {
+ return getFileName();
+ }
+
+
+
+ @Action
+ public BulkUpdateManagerForDemoToDoItem select(
+ final Category category,
+ @Nullable
+ final Subcategory subcategory,
+ @ParameterLayout(named="Completed?")
+ final boolean completed) {
+ setCategory(category);
+ setSubcategory(subcategory);
+ setComplete(completed);
+ return bulkUpdateMenuForDemoToDoItem.newBulkUpdateManager(this);
+ }
+ public Category default0Select() {
+ return getCategory();
+ }
+ public Subcategory default1Select() {
+ return getSubcategory();
+ }
+ public boolean default2Select() {
+ return isComplete();
+ }
+ public List<Subcategory> choices1Select(
+ final Category category) {
+ return Subcategory.listFor(category);
+ }
+ public String validateSelect(
+ final Category category,
+ final Subcategory subcategory,
+ final boolean completed) {
+ return Subcategory.validate(category, subcategory);
+ }
+
+ private String currentUserName() {
+ return container.getUser().getName();
+ }
+
+
+
+ //region > toDoItems (derived collection)
+
+ @SuppressWarnings("unchecked")
+ @Collection
+ @CollectionLayout(defaultView = "table")
+ public List<ExcelDemoToDoItem> getToDoItems() {
+ return container.allMatches(ExcelDemoToDoItem.class,
+ Predicates.and(
+ //ExcelDemoToDoItem.Predicates.thoseOwnedBy(currentUserName()),
+ ExcelDemoToDoItem.Predicates.thoseCompleted(isComplete()),
+ ExcelDemoToDoItem.Predicates.thoseCategorised(getCategory(), getSubcategory())));
+ }
+
+
+ @Action(
+ semantics = SemanticsOf.SAFE
+ )
+ public Blob export() {
+ final String fileName = withExtension(getFileName(), ".xlsx");
+ final List<ExcelDemoToDoItem> items = getToDoItems();
+ return toExcel(fileName, items);
+ }
+
+ public String disableExport() {
+ return getFileName() == null? "file name is required": null;
+ }
+
+ private static String withExtension(final String fileName, final String fileExtension) {
+ return fileName.endsWith(fileExtension) ? fileName : fileName + fileExtension;
+ }
+
+ private Blob toExcel(final String fileName, final List<ExcelDemoToDoItem> items) {
+ final List<BulkUpdateLineItemForDemoToDoItem> toDoItemViewModels = Lists.transform(items, toLineItem());
+ return excelService.toExcel(new WorksheetContent(toDoItemViewModels, WORKSHEET_SPEC), fileName);
+ }
+
+ private Function<ExcelDemoToDoItem, BulkUpdateLineItemForDemoToDoItem> toLineItem() {
+ return toDoItem -> {
+ final BulkUpdateLineItemForDemoToDoItem template = new BulkUpdateLineItemForDemoToDoItem();
+ template.modifyToDoItem(toDoItem);
+ return bulkUpdateMenuForDemoToDoItem.newLineItem(template);
+ };
+ }
+
+ @Action
+ @ActionLayout(
+ named = "Import"
+ )
+ @MemberOrder(name="toDoItems", sequence="2")
+ public List<BulkUpdateLineItemForDemoToDoItem> importBlob(
+ @Parameter(fileAccept = ".xlsx")
+ @ParameterLayout(named="Excel spreadsheet")
+ final Blob spreadsheet) {
+ final List<BulkUpdateLineItemForDemoToDoItem> lineItems =
+ excelService.fromExcel(spreadsheet, WORKSHEET_SPEC);
+ container.informUser(lineItems.size() + " items imported");
+ return lineItems;
+ }
+
+
+
+ @javax.inject.Inject
+ DomainObjectContainer container;
+
+ @javax.inject.Inject
+ ExcelService excelService;
+
+ @javax.inject.Inject
+ BulkUpdateMenuForDemoToDoItem bulkUpdateMenuForDemoToDoItem;
+
+
+}
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/dom/bulkupdate/BulkUpdateManagerForDemoToDoItem.layout.xml b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/dom/bulkupdate/BulkUpdateManagerForDemoToDoItem.layout.xml
new file mode 100644
index 0000000..6049fa0
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/dom/bulkupdate/BulkUpdateManagerForDemoToDoItem.layout.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<bs3:grid xsi:schemaLocation="http://isis.apache.org/applib/layout/component http://isis.apache.org/applib/layout/component/component.xsd http://isis.apache.org/applib/layout/grid/bootstrap3 http://isis.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd" xmlns:bs3="http://isis.apache.org/applib/layout/grid/bootstrap3" xmlns:cpt="http://isis.apache.org/applib/layout/component" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <bs3:row>
+ <bs3:col span="12" unreferencedActions="true">
+ <cpt:domainObject>
+ </cpt:domainObject>
+ </bs3:col>
+ </bs3:row>
+ <bs3:row>
+ <bs3:col span="4">
+ <cpt:fieldSet name="File" id="file" unreferencedProperties="true">
+ <cpt:action id="clearHints" position="PANEL_DROPDOWN"/>
+ <cpt:action id="downloadLayoutXml" position="PANEL_DROPDOWN"/>
+ <cpt:action id="rebuildMetamodel" position="PANEL_DROPDOWN"/>
+ <cpt:property id="fileName">
+ <cpt:action id="changeFileName">
+ <cpt:named>Change</cpt:named>
+ </cpt:action>
+ </cpt:property>
+ </cpt:fieldSet>
+ <cpt:fieldSet name="Criteria" id="criteria">
+ <cpt:property id="category"/>
+ <cpt:property id="subcategory"/>
+ <cpt:property id="complete">
+ <cpt:action id="select">
+ <cpt:named>Change</cpt:named>
+ </cpt:action>
+ </cpt:property>
+ </cpt:fieldSet>
+ </bs3:col>
+ <bs3:col span="8" unreferencedCollections="true">
+ <cpt:collection id="toDoItems" defaultView="table">
+ <cpt:action id="export"/>
+ <cpt:action id="import"/>
+ </cpt:collection>
+ </bs3:col>
+ </bs3:row>
+</bs3:grid>
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/dom/bulkupdate/BulkUpdateMenuForDemoToDoItem.java b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/dom/bulkupdate/BulkUpdateMenuForDemoToDoItem.java
new file mode 100644
index 0000000..6e9ee70
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/dom/bulkupdate/BulkUpdateMenuForDemoToDoItem.java
@@ -0,0 +1,142 @@
+package org.isisaddons.module.excel.fixture.demoapp.demomodule.dom.bulkupdate;
+
+import java.math.BigDecimal;
+
+import javax.annotation.PostConstruct;
+
+import org.joda.time.LocalDate;
+
+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.DomainServiceLayout;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.applib.services.bookmark.Bookmark;
+import org.apache.isis.applib.services.bookmark.BookmarkService;
+import org.apache.isis.applib.services.memento.MementoService;
+import org.apache.isis.applib.services.memento.MementoService.Memento;
+
+import org.isisaddons.module.excel.dom.ExcelService;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.Category;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.ExcelDemoToDoItem;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.Subcategory;
+
+@DomainService(
+ nature = NatureOfService.VIEW_MENU_ONLY,
+ objectType = "libExcelFixture.BulkUpdateMenuForDemoToDoItem"
+)
+@DomainServiceLayout(
+ named = "Excel",
+ menuOrder = "60.1.1"
+)
+public class BulkUpdateMenuForDemoToDoItem {
+
+ public BulkUpdateMenuForDemoToDoItem() {
+ }
+
+ @PostConstruct
+ public void init() {
+ if(excelService == null) {
+ throw new IllegalStateException("Require ExcelService to be configured");
+ }
+ }
+
+ // //////////////////////////////////////
+ // bulk update manager (action)
+ // //////////////////////////////////////
+
+ @Action(
+ semantics = SemanticsOf.IDEMPOTENT
+ )
+ @MemberOrder(sequence="90.1")
+ public BulkUpdateManagerForDemoToDoItem bulkUpdateManager() {
+ BulkUpdateManagerForDemoToDoItem template = new BulkUpdateManagerForDemoToDoItem();
+ template.setFileName("toDoItems.xlsx");
+ template.setCategory(Category.Domestic);
+ template.setSubcategory(Subcategory.Shopping);
+ template.setComplete(false);
+ return newBulkUpdateManager(template);
+ }
+
+
+
+ // //////////////////////////////////////
+ // memento for manager
+ // //////////////////////////////////////
+
+ String mementoFor(final BulkUpdateManagerForDemoToDoItem tdieim) {
+ final Memento memento = mementoService.create();
+ memento.set("fileName", tdieim.getFileName());
+ memento.set("category", tdieim.getCategory());
+ memento.set("subcategory", tdieim.getSubcategory());
+ memento.set("completed", tdieim.isComplete());
+ return memento.asString();
+ }
+
+ void initOf(final String mementoStr, final BulkUpdateManagerForDemoToDoItem manager) {
+ final Memento memento = mementoService.parse(mementoStr);
+ manager.setFileName(memento.get("fileName", String.class));
+ manager.setCategory(memento.get("category", Category.class));
+ manager.setSubcategory(memento.get("subcategory", Subcategory.class));
+ manager.setComplete(memento.get("completed", boolean.class));
+ }
+
+ BulkUpdateManagerForDemoToDoItem newBulkUpdateManager(BulkUpdateManagerForDemoToDoItem manager) {
+ return container.newViewModelInstance(BulkUpdateManagerForDemoToDoItem.class, mementoFor(manager));
+ }
+
+ // //////////////////////////////////////
+ // memento for line item
+ // //////////////////////////////////////
+
+ String mementoFor(BulkUpdateLineItemForDemoToDoItem lineItem) {
+ final Memento memento = mementoService.create();
+ memento.set("toDoItem", bookmarkService.bookmarkFor(lineItem.getToDoItem()));
+ memento.set("description", lineItem.getDescription());
+ memento.set("category", lineItem.getCategory());
+ memento.set("subcategory", lineItem.getSubcategory());
+ memento.set("cost", lineItem.getCost());
+ memento.set("complete", lineItem.isComplete());
+ memento.set("dueBy", lineItem.getDueBy());
+ memento.set("notes", lineItem.getNotes());
+ memento.set("ownedBy", lineItem.getOwnedBy());
+ return memento.asString();
+ }
+
+ void init(String mementoStr, BulkUpdateLineItemForDemoToDoItem lineItem) {
+ final Memento memento = mementoService.parse(mementoStr);
+ lineItem.setToDoItem(bookmarkService.lookup(memento.get("toDoItem", Bookmark.class), ExcelDemoToDoItem.class));
+ lineItem.setDescription(memento.get("description", String.class));
+ lineItem.setCategory(memento.get("category", Category.class));
+ lineItem.setSubcategory(memento.get("subcategory", Subcategory.class));
+ lineItem.setCost(memento.get("cost", BigDecimal.class));
+ lineItem.setComplete(memento.get("complete", boolean.class));
+ lineItem.setDueBy(memento.get("dueBy", LocalDate.class));
+ lineItem.setNotes(memento.get("notes", String.class));
+ lineItem.setOwnedBy(memento.get("ownedBy", String.class));
+ }
+
+ BulkUpdateLineItemForDemoToDoItem newLineItem(BulkUpdateLineItemForDemoToDoItem lineItem) {
+ return container.newViewModelInstance(BulkUpdateLineItemForDemoToDoItem.class, mementoFor(lineItem));
+ }
+
+
+ // //////////////////////////////////////
+ // Injected Services
+ // //////////////////////////////////////
+
+ @javax.inject.Inject
+ private DomainObjectContainer container;
+
+ @javax.inject.Inject
+ private ExcelService excelService;
+
+ @javax.inject.Inject
+ private BookmarkService bookmarkService;
+
+ @javax.inject.Inject
+ private MementoService mementoService;
+
+}
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/dom/pivot/ExcelPivotByCategoryAndSubcategory.java b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/dom/pivot/ExcelPivotByCategoryAndSubcategory.java
new file mode 100644
index 0000000..7848072
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/dom/pivot/ExcelPivotByCategoryAndSubcategory.java
@@ -0,0 +1,45 @@
+package org.isisaddons.module.excel.fixture.demoapp.demomodule.dom.pivot;
+
+import java.math.BigDecimal;
+
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.Nature;
+
+import org.isisaddons.module.excel.dom.AggregationType;
+import org.isisaddons.module.excel.dom.PivotColumn;
+import org.isisaddons.module.excel.dom.PivotRow;
+import org.isisaddons.module.excel.dom.PivotValue;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.Category;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.Subcategory;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@DomainObject(
+ objectType = "libExcelFixture.ExcelPivotByCategoryAndSubcategory",
+ nature = Nature.VIEW_MODEL
+)
+public class ExcelPivotByCategoryAndSubcategory {
+
+ public ExcelPivotByCategoryAndSubcategory(
+ final Category category,
+ final Subcategory subcategory,
+ final BigDecimal cost){
+ this.category = category;
+ this.subcategory = subcategory;
+ this.cost = cost;
+ }
+
+ @Getter @Setter
+ @PivotRow
+ private Subcategory subcategory;
+
+ @Getter @Setter
+ @PivotColumn(order = 1)
+ private Category category;
+
+ @Getter @Setter
+ @PivotValue(order = 1, type = AggregationType.SUM)
+ private BigDecimal cost;
+
+}
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/dom/pivot/ExcelPivotByCategoryAndSubcategoryMenu.java b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/dom/pivot/ExcelPivotByCategoryAndSubcategoryMenu.java
new file mode 100644
index 0000000..3b637b6
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/dom/pivot/ExcelPivotByCategoryAndSubcategoryMenu.java
@@ -0,0 +1,72 @@
+package org.isisaddons.module.excel.fixture.demoapp.demomodule.dom.pivot;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.PostConstruct;
+
+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.DomainServiceLayout;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.applib.value.Blob;
+
+import org.isisaddons.module.excel.dom.ExcelService;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.ExcelDemoToDoItem;
+
+@DomainService(
+ nature = NatureOfService.VIEW_MENU_ONLY,
+ objectType = "libExcelFixture.ExcelPivotByCategoryAndSubcategoryMenu"
+)
+@DomainServiceLayout(
+ named = "Excel",
+ menuOrder = "60.1.2"
+)
+public class ExcelPivotByCategoryAndSubcategoryMenu {
+
+ public ExcelPivotByCategoryAndSubcategoryMenu() {
+ }
+
+ @PostConstruct
+ public void init() {
+ if(excelService == null) {
+ throw new IllegalStateException("Require ExcelService to be configured");
+ }
+ }
+
+ @Action(
+ semantics = SemanticsOf.IDEMPOTENT
+ )
+ @MemberOrder(sequence="90.2")
+ public Blob downloadDemoPivotsheet(){
+ return excelService.toExcelPivot(vm1list(), ExcelPivotByCategoryAndSubcategory.class, "pivot-example", "demo-pivots.xlsx");
+ }
+
+ private List<ExcelPivotByCategoryAndSubcategory> vm1list(){
+ List<ExcelPivotByCategoryAndSubcategory> result = new ArrayList<>();
+ for (ExcelDemoToDoItem todo : getToDoItems()){
+ result.add(
+ new ExcelPivotByCategoryAndSubcategory(
+ todo.getCategory(),
+ todo.getSubcategory(),
+ todo.getCost()
+ )
+ );
+ }
+ return result;
+ }
+
+ private List<ExcelDemoToDoItem> getToDoItems() {
+ return container.allInstances(ExcelDemoToDoItem.class);
+ }
+
+ @javax.inject.Inject
+ private ExcelService excelService;
+
+ @javax.inject.Inject
+ private DomainObjectContainer container;
+
+}
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/fixturehandlers/demotodoitem/DemoToDoItemRowHandler.java b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/fixturehandlers/demotodoitem/DemoToDoItemRowHandler.java
new file mode 100644
index 0000000..57d891f
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/fixturehandlers/demotodoitem/DemoToDoItemRowHandler.java
@@ -0,0 +1,84 @@
+package org.isisaddons.module.excel.fixture.demoapp.demomodule.fixturehandlers.demotodoitem;
+
+import java.math.BigDecimal;
+import java.util.Collections;
+import java.util.List;
+
+import org.joda.time.LocalDate;
+
+import org.apache.isis.applib.DomainObjectContainer;
+import org.apache.isis.applib.clock.Clock;
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+
+import org.isisaddons.module.excel.dom.ExcelFixture;
+import org.isisaddons.module.excel.dom.ExcelFixtureRowHandler;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.Category;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.ExcelDemoToDoItem;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.ExcelDemoToDoItemMenu;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.Subcategory;
+
+import lombok.Getter;
+import lombok.Setter;
+
+public class DemoToDoItemRowHandler implements ExcelFixtureRowHandler {
+
+ @Getter @Setter
+ private String description;
+
+ @Getter @Setter
+ private Category category;
+
+ @Getter @Setter
+ private Subcategory subcategory;
+
+ @Getter @Setter
+ private Integer daysFromToday;
+
+ @Getter @Setter
+ private BigDecimal cost;
+
+ @Override
+ public List<Object> handleRow(
+ final FixtureScript.ExecutionContext executionContext,
+ final ExcelFixture excelFixture,
+ final Object previousRow) {
+ final DemoToDoItemRowHandler previous = (DemoToDoItemRowHandler) previousRow;
+ if(category == null) {
+ category = previous.category;
+ }
+ if(subcategory == null) {
+ subcategory = previous.subcategory;
+ }
+
+ final LocalDate dueBy = daysFromToday(daysFromToday);
+ final String user = executionContext.getParameter("user");
+ final String username = user != null && user.length() > 0 ? user : container.getUser().getName();
+ ExcelDemoToDoItem toDoItem = toDoItemRepository.findToDoItemsByDescription(description);
+ if(toDoItem != null) {
+ toDoItem.setCategory(category);
+ toDoItem.setSubcategory(subcategory);
+ toDoItem.setDueBy(dueBy);
+ toDoItem.setCost(cost);
+ toDoItem.setOwnedBy(username);
+ } else {
+ toDoItem = toDoItemRepository.newToDoItem(description, category, subcategory, username, dueBy, cost);
+ }
+ executionContext.addResult(excelFixture, toDoItem);
+ return Collections.<Object>singletonList(toDoItem);
+ }
+
+ private static LocalDate daysFromToday(final Integer i) {
+ if(i == null) {
+ return null;
+ }
+ final LocalDate date = new LocalDate(Clock.getTimeAsDateTime());
+ return date.plusDays(i);
+ }
+
+
+ @javax.inject.Inject
+ private ExcelDemoToDoItemMenu toDoItemRepository;
+
+ @javax.inject.Inject
+ private DomainObjectContainer container;
+}
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/fixturehandlers/demotodoitem/DemoToDoItemRowHandler2.java b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/fixturehandlers/demotodoitem/DemoToDoItemRowHandler2.java
new file mode 100644
index 0000000..ad3d69d
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/fixturehandlers/demotodoitem/DemoToDoItemRowHandler2.java
@@ -0,0 +1,62 @@
+package org.isisaddons.module.excel.fixture.demoapp.demomodule.fixturehandlers.demotodoitem;
+
+import java.math.BigDecimal;
+
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+
+import org.isisaddons.module.excel.dom.ExcelFixture2;
+import org.isisaddons.module.excel.dom.ExcelMetaDataEnabled;
+import org.isisaddons.module.excel.dom.FixtureAwareRowHandler;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.Category;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.Subcategory;
+
+import lombok.Getter;
+import lombok.Setter;
+
+public class DemoToDoItemRowHandler2 implements FixtureAwareRowHandler<DemoToDoItemRowHandler2>, ExcelMetaDataEnabled {
+
+ @Getter @Setter
+ private String excelSheetName;
+
+ @Getter @Setter
+ private Integer excelRowNumber;
+
+ @Getter @Setter
+ private String description;
+
+ @Getter @Setter
+ private Category category;
+
+ @Getter @Setter
+ private Subcategory subcategory;
+
+ @Getter @Setter
+ private BigDecimal cost;
+
+ @Override
+ public void handleRow(final DemoToDoItemRowHandler2 previousRow) {
+ final DemoToDoItemRowHandler2 previous = previousRow;
+ if(category == null) {
+ category = previous.category;
+ }
+ if(subcategory == null) {
+ subcategory = previous.subcategory;
+ }
+
+ executionContext.addResult(excelFixture2, this);
+ }
+
+
+ /**
+ * To allow for usage within fixture scripts also.
+ */
+ @Setter
+ private FixtureScript.ExecutionContext executionContext;
+
+ /**
+ * To allow for usage within fixture scripts also.
+ */
+ @Setter
+ private ExcelFixture2 excelFixture2;
+
+}
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/fixturehandlers/excelupload/ExcelUploadRowHandler4ToDoItem.java b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/fixturehandlers/excelupload/ExcelUploadRowHandler4ToDoItem.java
new file mode 100644
index 0000000..04551a3
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/fixturehandlers/excelupload/ExcelUploadRowHandler4ToDoItem.java
@@ -0,0 +1,66 @@
+package org.isisaddons.module.excel.fixture.demoapp.demomodule.fixturehandlers.excelupload;
+
+import java.math.BigDecimal;
+import java.util.Collections;
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.joda.time.LocalDate;
+
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.Nature;
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+import org.apache.isis.applib.services.wrapper.WrapperFactory;
+
+import org.isisaddons.module.excel.dom.ExcelFixture;
+import org.isisaddons.module.excel.dom.ExcelFixtureRowHandler;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.Category;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.ExcelDemoToDoItem;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.ExcelDemoToDoItemMenu;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.Subcategory;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@DomainObject(
+ objectType = "libExcelFixture.ExcelUploadRowHandler4ToDoItem",
+ nature = Nature.VIEW_MODEL
+)
+public class ExcelUploadRowHandler4ToDoItem implements ExcelFixtureRowHandler {
+
+ @Getter @Setter
+ private String description;
+
+ @Getter @Setter
+ private String subCategory;
+
+ @Getter @Setter
+ private String ownedBy;
+
+ @Getter @Setter
+ private LocalDate dueBy;
+
+ @Getter @Setter
+ private BigDecimal cost;
+
+ @Override
+ public List<Object> handleRow(final FixtureScript.ExecutionContext executionContext, final ExcelFixture excelFixture, final Object previousRow) {
+ //final ExcelModuleDemoToDoItem toDoItem = wrapperFactory.wrap(toDoItems).newToDo(
+ final ExcelDemoToDoItem toDoItem = toDoItems.newToDoItem(
+ description,
+ Category.Professional,
+ Subcategory.valueOf(subCategory),
+ ownedBy,
+ dueBy,
+ cost);
+ executionContext.addResult(excelFixture, toDoItem);
+ return Collections.<Object>singletonList(toDoItem);
+ }
+
+ @Inject
+ ExcelDemoToDoItemMenu toDoItems;
+
+ @Inject
+ WrapperFactory wrapperFactory;
+}
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/fixturehandlers/excelupload/ExcelUploadServiceForDemoToDoItem.java b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/fixturehandlers/excelupload/ExcelUploadServiceForDemoToDoItem.java
new file mode 100644
index 0000000..3e55ecf
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/fixturehandlers/excelupload/ExcelUploadServiceForDemoToDoItem.java
@@ -0,0 +1,47 @@
+package org.isisaddons.module.excel.fixture.demoapp.demomodule.fixturehandlers.excelupload;
+
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.DomainServiceLayout;
+import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.Optionality;
+import org.apache.isis.applib.annotation.Parameter;
+import org.apache.isis.applib.annotation.ParameterLayout;
+import org.apache.isis.applib.fixturescripts.FixtureResult;
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+import org.apache.isis.applib.fixturescripts.FixtureScripts;
+import org.apache.isis.applib.value.Blob;
+
+import org.isisaddons.module.excel.dom.ExcelFixture;
+import org.isisaddons.module.excel.fixture.demoapp.demomodule.fixturehandlers.demotodoitem.DemoToDoItemRowHandler;
+
+@DomainService(
+ nature = NatureOfService.VIEW_MENU_ONLY,
+ objectType = "libExcelFixture.ExcelUploadServiceForDemoToDoItem"
+)
+@DomainServiceLayout(
+ menuBar = DomainServiceLayout.MenuBar.SECONDARY,
+ named = "Prototyping",
+ menuOrder = "900"
+)
+public class ExcelUploadServiceForDemoToDoItem {
+
+ public List<FixtureResult> uploadSpreadsheet(
+ @ParameterLayout(named = "spreadsheet")
+ final Blob file,
+ @ParameterLayout(named = "ExcelFixture parameters")
+ @Parameter(optionality = Optionality.OPTIONAL)
+ final String parameters){
+ FixtureScript script = new ExcelFixture(
+ file,
+ DemoToDoItemRowHandler.class,
+ ExcelUploadRowHandler4ToDoItem.class);
+ return fixtureScripts.runFixtureScript(script, parameters);
+ }
+
+ @Inject
+ private FixtureScripts fixtureScripts;
+}
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/fixturescripts/DemoFixture_extending_ExcelFixture2.java b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/fixturescripts/DemoFixture_extending_ExcelFixture2.java
new file mode 100644
index 0000000..7a5d362
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/fixturescripts/DemoFixture_extending_ExcelFixture2.java
@@ -0,0 +1,48 @@
+package org.isisaddons.module.excel.fixture.demoapp.demomodule.fixturescripts;
+
+import com.google.common.io.Resources;
+
+import org.apache.isis.applib.annotation.DomainObject;
+
+import org.isisaddons.module.excel.dom.ExcelFixture2;
+import org.isisaddons.module.excel.dom.WorksheetSpec;
+import org.isisaddons.module.excel.dom.util.Mode;
+import org.isisaddons.module.excel.fixture.demoapp.demomodule.fixturehandlers.demotodoitem.DemoToDoItemRowHandler2;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@DomainObject(
+ objectType = "isisexcel.DemoFixture_extending_ExcelFixture2"
+)
+public class DemoFixture_extending_ExcelFixture2 extends ExcelFixture2 {
+
+ public DemoFixture_extending_ExcelFixture2(){
+ this.resourceName = "ToDoItems.xlsx";
+ }
+
+ @Getter @Setter
+ private String resourceName;
+
+ @Override
+ protected void execute(final ExecutionContext executionContext) {
+
+ setExcelResource(Resources.getResource(getClass(), getResourceName()));
+
+ setMatcher(sheetName -> {
+
+ if (sheetName.startsWith("Sheet")) {
+ return new WorksheetSpec(
+ DemoFixture_extending_ExcelFixture2.this.rowFactoryFor(DemoToDoItemRowHandler2.class, executionContext),
+ sheetName,
+ Mode.RELAXED);
+ } else
+ return null;
+ });
+
+ setSequencer(specs -> specs);
+
+ super.execute(executionContext);
+ }
+
+}
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/fixturescripts/DemoToDoItem_create_usingExcelFixture.java b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/fixturescripts/DemoToDoItem_create_usingExcelFixture.java
new file mode 100644
index 0000000..11404d4
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/fixturescripts/DemoToDoItem_create_usingExcelFixture.java
@@ -0,0 +1,73 @@
+package org.isisaddons.module.excel.fixture.demoapp.demomodule.fixturescripts;
+
+import java.net.URL;
+import java.util.List;
+
+import com.google.common.collect.Lists;
+import com.google.common.io.Resources;
+
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+import org.apache.isis.objectstore.jdo.applib.service.support.IsisJdoSupport;
+
+import org.isisaddons.module.excel.dom.ExcelFixture;
+import org.isisaddons.module.excel.fixture.demoapp.demomodule.fixturehandlers.demotodoitem.DemoToDoItemRowHandler;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.ExcelDemoToDoItem;
+
+import lombok.Getter;
+
+public class DemoToDoItem_create_usingExcelFixture extends FixtureScript {
+
+ private final String user;
+
+ public DemoToDoItem_create_usingExcelFixture() {
+ this(null);
+ }
+
+ public DemoToDoItem_create_usingExcelFixture(String ownedBy) {
+ this.user = ownedBy;
+ }
+
+
+ @Getter
+ private List<ExcelDemoToDoItem> todoItems = Lists.newArrayList();
+
+ @Override
+ public void execute(ExecutionContext executionContext) {
+
+ final String ownedBy = this.user != null ? this.user : getContainer().getUser().getName();
+
+ installFor(ownedBy, executionContext);
+
+ getContainer().flush();
+ }
+
+ private void installFor(String user, ExecutionContext ec) {
+
+ ec.setParameter("user", user);
+
+ this.todoItems.addAll(load(ec, "ToDoItems.xlsx"));
+ this.todoItems.addAll(load(ec, "MoreToDoItems.xlsx"));
+
+ getContainer().flush();
+ }
+
+ private List<ExcelDemoToDoItem> load(
+ final ExecutionContext executionContext,
+ final String resourceName) {
+ final URL excelResource = Resources.getResource(getClass(), resourceName);
+ final ExcelFixture excelFixture = new ExcelFixture(excelResource, DemoToDoItemRowHandler.class);
+ excelFixture.setExcelResourceName(resourceName);
+ executionContext.executeChild(this, excelFixture);
+
+ return (List<ExcelDemoToDoItem>) excelFixture.getObjects();
+ }
+
+ // //////////////////////////////////////
+ // Injected services
+ // //////////////////////////////////////
+
+
+ @javax.inject.Inject
+ IsisJdoSupport isisJdoSupport;
+
+}
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/fixturescripts/DemoToDoItem_recreate_usingExcelFixture.java b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/fixturescripts/DemoToDoItem_recreate_usingExcelFixture.java
new file mode 100644
index 0000000..b986863
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/fixturescripts/DemoToDoItem_recreate_usingExcelFixture.java
@@ -0,0 +1,30 @@
+package org.isisaddons.module.excel.fixture.demoapp.demomodule.fixturescripts;
+
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.fixturescripts.ExcelDemoToDoItem_tearDown2;
+
+public class DemoToDoItem_recreate_usingExcelFixture extends FixtureScript {
+
+ private final String user;
+
+ public DemoToDoItem_recreate_usingExcelFixture() {
+ this(null);
+ }
+
+ public DemoToDoItem_recreate_usingExcelFixture(String ownedBy) {
+ this.user = ownedBy;
+ }
+
+ @Override
+ public void execute(ExecutionContext executionContext) {
+
+ final String ownedBy = this.user != null ? this.user : getContainer().getUser().getName();
+
+ executionContext.executeChild(this, new ExcelDemoToDoItem_tearDown2(ownedBy));
+ executionContext.executeChild(this, new DemoToDoItem_create_usingExcelFixture(ownedBy));
+
+ getContainer().flush();
+ }
+
+}
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/fixturescripts/MoreToDoItems.xlsx b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/fixturescripts/MoreToDoItems.xlsx
new file mode 100644
index 0000000..11204c5
Binary files /dev/null and b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/fixturescripts/MoreToDoItems.xlsx differ
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/fixturescripts/ToDoItems.xlsx b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/fixturescripts/ToDoItems.xlsx
new file mode 100644
index 0000000..acd68d8
Binary files /dev/null and b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/demomodule/fixturescripts/ToDoItems.xlsx differ
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/dom/Category.java b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/dom/Category.java
new file mode 100644
index 0000000..d2541f1
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/dom/Category.java
@@ -0,0 +1,27 @@
+package org.isisaddons.module.excel.fixture.demoapp.todomodule.dom;
+
+import java.util.Arrays;
+import java.util.List;
+
+public enum Category {
+ Professional {
+ @Override
+ public List<Subcategory> subcategories() {
+ return Arrays
+ .asList(null, Subcategory.OpenSource, Subcategory.Consulting, Subcategory.Education);
+ }
+ }, Domestic {
+ @Override
+ public List<Subcategory> subcategories() {
+ return Arrays.asList(null, Subcategory.Shopping, Subcategory.Housework, Subcategory.Garden,
+ Subcategory.Chores);
+ }
+ }, Other {
+ @Override
+ public List<Subcategory> subcategories() {
+ return Arrays.asList(null, Subcategory.Other);
+ }
+ };
+
+ public abstract List<Subcategory> subcategories();
+}
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/dom/DependenciesComparator.java b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/dom/DependenciesComparator.java
new file mode 100644
index 0000000..257d861
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/dom/DependenciesComparator.java
@@ -0,0 +1,20 @@
+package org.isisaddons.module.excel.fixture.demoapp.todomodule.dom;
+
+import java.util.Comparator;
+
+import com.google.common.collect.Ordering;
+
+public class DependenciesComparator implements Comparator<ExcelDemoToDoItem> {
+ @Override
+ public int compare(final ExcelDemoToDoItem p, final ExcelDemoToDoItem q) {
+ final Ordering<ExcelDemoToDoItem> byDescription = new Ordering<ExcelDemoToDoItem>() {
+ public int compare(final ExcelDemoToDoItem p, final ExcelDemoToDoItem q) {
+ return Ordering.natural().nullsFirst().onResultOf(ExcelDemoToDoItem::getDescription)
+ .compare(p, q);
+ }
+ };
+ return byDescription
+ .compound(Ordering.<ExcelDemoToDoItem>natural())
+ .compare(p, q);
+ }
+}
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/dom/ExcelDemoToDoItem-done.png b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/dom/ExcelDemoToDoItem-done.png
new file mode 100644
index 0000000..e71398f
Binary files /dev/null and b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/dom/ExcelDemoToDoItem-done.png differ
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/dom/ExcelDemoToDoItem-todo.png b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/dom/ExcelDemoToDoItem-todo.png
new file mode 100644
index 0000000..a2c5c0f
Binary files /dev/null and b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/dom/ExcelDemoToDoItem-todo.png differ
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/dom/ExcelDemoToDoItem.java b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/dom/ExcelDemoToDoItem.java
new file mode 100644
index 0000000..64e9983
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/dom/ExcelDemoToDoItem.java
@@ -0,0 +1,457 @@
+package org.isisaddons.module.excel.fixture.demoapp.todomodule.dom;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import javax.annotation.Nullable;
+import javax.jdo.annotations.IdentityType;
+import javax.jdo.annotations.VersionStrategy;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+import com.google.common.base.Objects;
+import com.google.common.base.Predicate;
+
+import org.joda.time.LocalDate;
+
+import org.apache.isis.applib.DomainObjectContainer;
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.BookmarkPolicy;
+import org.apache.isis.applib.annotation.CollectionLayout;
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.DomainObjectLayout;
+import org.apache.isis.applib.annotation.Editing;
+import org.apache.isis.applib.annotation.InvokeOn;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.MinLength;
+import org.apache.isis.applib.annotation.Optionality;
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.applib.clock.Clock;
+import org.apache.isis.applib.util.ObjectContracts;
+import org.apache.isis.applib.util.TitleBuffer;
+import org.apache.isis.applib.value.Blob;
+import org.apache.isis.schema.utils.jaxbadapters.PersistentEntityAdapter;
+
+import org.isisaddons.wicket.fullcalendar2.cpt.applib.CalendarEvent;
+import org.isisaddons.wicket.fullcalendar2.cpt.applib.CalendarEventable;
+import org.isisaddons.wicket.gmap3.cpt.applib.Locatable;
+import org.isisaddons.wicket.gmap3.cpt.applib.Location;
+import org.isisaddons.wicket.summernote.cpt.applib.SummernoteEditor;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@javax.jdo.annotations.PersistenceCapable(
+ identityType=IdentityType.DATASTORE,
+ schema = "libExcelFixture"
+)
+@javax.jdo.annotations.DatastoreIdentity(
+ strategy=javax.jdo.annotations.IdGeneratorStrategy.IDENTITY,
+ column="id")
+@javax.jdo.annotations.Version(
+ strategy=VersionStrategy.VERSION_NUMBER,
+ column="version")
+@javax.jdo.annotations.Uniques({
+ @javax.jdo.annotations.Unique(
+ name="ToDoItem_description_must_be_unique",
+ members={"ownedBy","description"})
+})
+@javax.jdo.annotations.Queries( {
+ @javax.jdo.annotations.Query(
+ name = "todo_all", language = "JDOQL",
+ value = "SELECT "
+ + "FROM org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.ExcelDemoToDoItem "
+ + "WHERE ownedBy == :ownedBy"),
+ @javax.jdo.annotations.Query(
+ name = "todo_notYetComplete", language = "JDOQL",
+ value = "SELECT "
+ + "FROM org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.ExcelDemoToDoItem "
+ + "WHERE ownedBy == :ownedBy "
+ + " && complete == false"),
+ @javax.jdo.annotations.Query(
+ name = "findByDescription", language = "JDOQL",
+ value = "SELECT "
+ + "FROM org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.ExcelDemoToDoItem "
+ + "WHERE ownedBy == :ownedBy "
+ + " && description == :description"),
+ @javax.jdo.annotations.Query(
+ name = "todo_complete", language = "JDOQL",
+ value = "SELECT "
+ + "FROM org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.ExcelDemoToDoItem "
+ + "WHERE ownedBy == :ownedBy "
+ + "&& complete == true"),
+ @javax.jdo.annotations.Query(
+ name = "todo_similarTo", language = "JDOQL",
+ value = "SELECT "
+ + "FROM org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.ExcelDemoToDoItem "
+ + "WHERE ownedBy == :ownedBy "
+ + "&& category == :category"),
+ @javax.jdo.annotations.Query(
+ name = "todo_autoComplete", language = "JDOQL",
+ value = "SELECT "
+ + "FROM org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.ExcelDemoToDoItem "
+ + "WHERE ownedBy == :ownedBy && "
+ + "description.indexOf(:description) >= 0")
+})
+@DomainObject(
+ autoCompleteRepository = ExcelDemoToDoItemMenu.class
+)
+@DomainObjectLayout(
+ named = "To Do Item",
+ bookmarking = BookmarkPolicy.AS_ROOT
+)
+@XmlJavaTypeAdapter(PersistentEntityAdapter.class)
+public class ExcelDemoToDoItem implements Comparable<ExcelDemoToDoItem>, CalendarEventable, Locatable {
+
+ //region > title, iconName
+
+ public String title() {
+ final TitleBuffer buf = new TitleBuffer();
+ buf.append(getDescription());
+ if (isComplete()) {
+ buf.append("- Completed!");
+ } else {
+ if (getDueBy() != null) {
+ buf.append(" due by", getDueBy());
+ }
+ }
+ return buf.toString();
+ }
+
+ public String iconName() {
+ return "ExcelModuleDemoToDoItem-" + (!isComplete() ? "todo" : "done");
+ }
+
+ //endregion
+
+ @javax.jdo.annotations.Column(allowsNull="false", length=100)
+ @Property(regexPattern = "\\w[@&:\\-\\,\\.\\+ \\w]*")
+ @Getter @Setter
+ private String description;
+
+ @javax.jdo.annotations.Persistent(defaultFetchGroup="true")
+ @javax.jdo.annotations.Column(allowsNull="true")
+ @Getter @Setter
+ private LocalDate dueBy;
+
+ @javax.jdo.annotations.Column(allowsNull="true")
+ @Getter @Setter
+ private Category category;
+
+ @javax.jdo.annotations.Column(allowsNull="true")
+ @Getter @Setter
+ private Subcategory subcategory;
+
+ @javax.jdo.annotations.Column(allowsNull="false")
+ @Getter @Setter
+ private String ownedBy;
+
+ @Property(editing = Editing.DISABLED)
+ @Getter @Setter
+ private boolean complete;
+ public boolean isComplete() {
+ return complete;
+ }
+
+ @javax.jdo.annotations.Column(allowsNull="true", scale=2)
+ @javax.validation.constraints.Digits(integer=10, fraction=2)
+ @Property(editing = Editing.DISABLED, editingDisabledReason = "Update using action")
+ @Getter @Setter
+ private BigDecimal cost;
+
+ @javax.jdo.annotations.Column(allowsNull="true", scale=2)
+ @javax.validation.constraints.Digits(integer=10, fraction=2)
+ @Property(
+ editing = Editing.DISABLED,
+ editingDisabledReason = "Update using action"
+ )
+ @Getter @Setter
+ private BigDecimal previousCost;
+
+
+ @Getter @Setter
+ @javax.jdo.annotations.Column(allowsNull="true", length=400)
+ private String notes;
+ @Property(editing = Editing.ENABLED)
+ @SummernoteEditor(height = 100, maxHeight = 300)
+ public String getNotes() {
+ return notes;
+ }
+
+
+
+ @Getter @Setter
+ @javax.jdo.annotations.Persistent(defaultFetchGroup="false")
+ @javax.jdo.annotations.Column(allowsNull="true", jdbcType="BLOB", sqlType="LONGBINARY")
+ private Blob attachment;
+
+ @Getter @Setter
+ @javax.jdo.annotations.Persistent(table="ExcelDemoToDoItemDependencies")
+ @javax.jdo.annotations.Join(column="dependingId")
+ @javax.jdo.annotations.Element(column="dependentId")
+ @CollectionLayout(sortedBy = DependenciesComparator.class)
+ private SortedSet<ExcelDemoToDoItem> dependencies = new TreeSet<>();
+
+
+
+ // no getter/setter (therefore persisted but not part of Isis' metamodel)
+ private Double locationLatitude;
+ private Double locationLongitude;
+
+
+ public String validateDueBy(final LocalDate dueBy) {
+ if (dueBy == null) {
+ return null;
+ }
+ return isMoreThanOneWeekInPast(dueBy) ? "Due by date cannot be more than one week old" : null;
+ }
+
+
+
+
+ //region > completed (action)
+
+ public ExcelDemoToDoItem completed() {
+ setComplete(true);
+ return this;
+ }
+ public String disableCompleted() {
+ return isComplete() ? "Already completed" : null;
+ }
+
+ //endregion
+
+ //region > notYetCompleted (action)
+
+ public ExcelDemoToDoItem notYetCompleted() {
+ setComplete(false);
+
+ return this;
+ }
+ // disable action dependent on state of object
+ public String disableNotYetCompleted() {
+ return !complete ? "Not yet completed" : null;
+ }
+
+ //endregion
+
+ //region > updateCosts (action)
+ public ExcelDemoToDoItem updateCosts(
+ @Nullable
+ @javax.validation.constraints.Digits(integer=10, fraction=2)
+ final BigDecimal cost,
+ @Nullable
+ @javax.validation.constraints.Digits(integer=10, fraction=2)
+ final BigDecimal previousCost
+ ) {
+ setCost(cost);
+ setPreviousCost(previousCost);
+ return this;
+ }
+ public BigDecimal default0UpdateCosts() {
+ return getCost();
+ }
+ public BigDecimal default1UpdateCosts() {
+ return getPreviousCost();
+ }
+ public String validateUpdateCosts(final BigDecimal proposedCost, final BigDecimal proposedPreviousCost) {
+ if (proposedCost != null && proposedCost.compareTo(BigDecimal.ZERO) < 0) {
+ return "Cost must be positive";
+ }
+ if (proposedPreviousCost != null && proposedPreviousCost.compareTo(BigDecimal.ZERO) < 0) {
+ return "Previous cost must be positive";
+ }
+ return null;
+ }
+ //endregion
+
+
+ //region > add (action)
+
+
+ public ExcelDemoToDoItem add(
+ final ExcelDemoToDoItem toDoItem) {
+ getDependencies().add(toDoItem);
+ return this;
+ }
+ public List<ExcelDemoToDoItem> autoComplete0Add(final @MinLength(2) String search) {
+ final List<ExcelDemoToDoItem> list = toDoItems.autoComplete(search);
+ list.removeAll(getDependencies());
+ list.remove(this);
+ return list;
+ }
+
+ public String disableAdd() {
+ if(isComplete()) {
+ return "Cannot add dependencies for items that are complete";
+ }
+ return null;
+ }
+ // validate the provided argument prior to invoking action
+ public String validateAdd(final ExcelDemoToDoItem toDoItem) {
+ if(getDependencies().contains(toDoItem)) {
+ return "Already a dependency";
+ }
+ if(toDoItem == this) {
+ return "Can't set up a dependency to self";
+ }
+ return null;
+ }
+ //endregion
+
+ //region > remove (action)
+
+ public ExcelDemoToDoItem remove(
+ final ExcelDemoToDoItem toDoItem) {
+ getDependencies().remove(toDoItem);
+ return this;
+ }
+ // disable action dependent on state of object
+ public String disableRemove() {
+ if(isComplete()) {
+ return "Cannot remove dependencies for items that are complete";
+ }
+ return getDependencies().isEmpty()? "No dependencies to remove": null;
+ }
+ // validate the provided argument prior to invoking action
+ public String validateRemove(final ExcelDemoToDoItem toDoItem) {
+ if(!getDependencies().contains(toDoItem)) {
+ return "Not a dependency";
+ }
+ return null;
+ }
+ // provide a drop-down
+ public SortedSet<ExcelDemoToDoItem> choices0Remove() {
+ return getDependencies();
+ }
+
+ //endregion
+
+ //region > delete (action)
+
+ @Action(
+ invokeOn = InvokeOn.OBJECT_AND_COLLECTION,
+ semantics = SemanticsOf.IDEMPOTENT_ARE_YOU_SURE
+ )
+ public List<ExcelDemoToDoItem> delete() {
+ container.removeIfNotAlready(this);
+ container.informUser("Deleted " + container.titleOf(this));
+ // invalid to return 'this' (cannot render a deleted object)
+ return toDoItems.toDoItemsNotYetComplete();
+ }
+
+ //endregion
+
+ //region > Programmatic Helpers
+ private static final long ONE_WEEK_IN_MILLIS = 7 * 24 * 60 * 60 * 1000L;
+
+ private static boolean isMoreThanOneWeekInPast(final LocalDate dueBy) {
+ return dueBy.toDateTimeAtStartOfDay().getMillis() < Clock.getTime() - ONE_WEEK_IN_MILLIS;
+ }
+
+ //endregion
+
+ public static class Predicates {
+
+ public static Predicate<ExcelDemoToDoItem> thoseOwnedBy(final String currentUser) {
+ return toDoItem -> Objects.equal(toDoItem.getOwnedBy(), currentUser);
+ }
+
+ public static Predicate<ExcelDemoToDoItem> thoseCompleted(
+ final boolean completed) {
+ return t -> Objects.equal(t.isComplete(), completed);
+ }
+
+ public static Predicate<ExcelDemoToDoItem> thoseCategorised(final Category category) {
+ return toDoItem -> Objects.equal(toDoItem.getCategory(), category);
+ }
+
+ public static Predicate<ExcelDemoToDoItem> thoseSubcategorised(
+ final Subcategory subcategory) {
+ return t -> Objects.equal(t.getSubcategory(), subcategory);
+ }
+
+ public static Predicate<ExcelDemoToDoItem> thoseCategorised(
+ final Category category, final Subcategory subcategory) {
+ return com.google.common.base.Predicates.and(
+ thoseCategorised(category),
+ thoseSubcategorised(subcategory));
+ }
+
+ }
+
+ //region > toString,compareTo
+ @Override
+ public String toString() {
+ return ObjectContracts.toString(this, "description","complete","dueBy","ownedBy");
+ }
+
+
+ @Override
+ public int compareTo(final ExcelDemoToDoItem other) {
+ return ObjectContracts.compare(this, other, "complete","dueBy","description");
+ }
+
+ //endregion
+
+ //region > dependencies
+
+ @javax.inject.Inject
+ DomainObjectContainer container;
+
+ @javax.inject.Inject
+ ExcelDemoToDoItemMenu toDoItems;
+ //endregion
+
+
+
+
+
+ //region > fullcalendar2: CalendarEventable impl
+
+ @Programmatic
+ @Override
+ public String getCalendarName() {
+ return getCategory().name();
+ }
+
+ @Programmatic
+ @Override
+ public CalendarEvent toCalendarEvent() {
+ if(getDueBy() == null) {
+ return null;
+ }
+ return new CalendarEvent(getDueBy().toDateTimeAtStartOfDay(), getCalendarName(), container.titleOf(this));
+ }
+
+ //endregion
+
+ //region > gmap3: location (derived property) / updateLocation (action)
+ @Property(
+ optionality = Optionality.OPTIONAL,
+ editing = Editing.DISABLED
+ )
+ @MemberOrder(sequence="3")
+ public Location getLocation() {
+ return locationLatitude != null && locationLongitude != null? new Location(locationLatitude, locationLongitude): null;
+ }
+ public void setLocation(final Location location) {
+ locationLongitude = location != null ? location.getLongitude() : null;
+ locationLatitude = location != null ? location.getLatitude() : null;
+ }
+
+ @MemberOrder(name="location", sequence="1")
+ public ExcelDemoToDoItem updateLocation(final Double longitude, final Double latitude) {
+ locationLatitude = latitude;
+ locationLongitude = longitude;
+ return this;
+ }
+
+
+ //endregion
+
+
+}
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/dom/ExcelDemoToDoItem.layout.xml b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/dom/ExcelDemoToDoItem.layout.xml
new file mode 100644
index 0000000..ca5fa1f
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/dom/ExcelDemoToDoItem.layout.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<bs3:grid xsi:schemaLocation="http://isis.apache.org/applib/layout/component http://isis.apache.org/applib/layout/component/component.xsd http://isis.apache.org/applib/layout/grid/bootstrap3 http://isis.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd" xmlns:bs3="http://isis.apache.org/applib/layout/grid/bootstrap3" xmlns:cpt="http://isis.apache.org/applib/layout/component" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <bs3:row>
+ <bs3:col span="12" unreferencedActions="true">
+ <cpt:domainObject/>
+ <cpt:action id="delete"/>
+ <cpt:action id="export">
+ <cpt:named>Export current</cpt:named>
+ <cpt:describedAs>Export current as single row in spreadsheet</cpt:describedAs>
+ </cpt:action>
+ <cpt:action id="export2">
+ <cpt:named>Export current and all</cpt:named>
+ <cpt:describedAs>Export current as single row in spreadsheet, and all on a separate sheet</cpt:describedAs>
+ </cpt:action>
+ </bs3:col>
+ </bs3:row>
+ <bs3:row>
+ <bs3:col span="4">
+ <cpt:fieldSet name="General" id="general">
+ <cpt:property id="description"/>
+ <cpt:property id="category"/>
+ <cpt:property id="subcategory"/>
+ <cpt:property id="ownedBy"/>
+ <cpt:property id="complete">
+ <cpt:action id="completed" position="BELOW"/>
+ <cpt:action id="notYetCompleted" position="BELOW"/>
+ </cpt:property>
+ </cpt:fieldSet>
+ <cpt:fieldSet name="Metadata" id="metadata">
+ <cpt:action id="clearHints" position="PANEL_DROPDOWN"/>
+ <cpt:action id="downloadLayoutXml" position="PANEL_DROPDOWN"/>
+ <cpt:action id="downloadJdoMetadata" position="PANEL_DROPDOWN"/>
+ <cpt:action id="rebuildMetamodel" position="PANEL_DROPDOWN"/>
+ <cpt:property id="datanucleusVersionLong"/>
+ <cpt:property id="datanucleusVersionTimestamp"/>
+ <cpt:property id="datanucleusIdLong"/>
+ </cpt:fieldSet>
+
+ </bs3:col>
+ <bs3:col span="8">
+ <bs3:row>
+ <bs3:col span="6">
+ <cpt:fieldSet name="Priority" id="priority">
+ <cpt:property id="dueBy"/>
+ </cpt:fieldSet>
+ <cpt:fieldSet name="Cost">
+ <cpt:property id="cost">
+ <cpt:action id="updateCost" position="BELOW"/>
+ </cpt:property>
+ <cpt:property id="previousCost"/>
+ </cpt:fieldSet>
+ </bs3:col>
+ <bs3:col span="6">
+ <cpt:fieldSet name="Other" id="other" unreferencedProperties="true">
+ <cpt:property id="notes"/>
+ <cpt:property id="attachment"/>
+ </cpt:fieldSet>
+ </bs3:col>
+ </bs3:row>
+ <bs3:row>
+ <bs3:col span="12">
+ <cpt:collection id="dependencies" defaultView="table">
+ <cpt:action id="add"/>
+ <cpt:action id="remove"/>
+ </cpt:collection>
+ </bs3:col>
+ </bs3:row>
+ </bs3:col>
+ </bs3:row>
+ <bs3:row>
+ <bs3:col span="12" unreferencedCollections="true"/>
+ </bs3:row>
+
+</bs3:grid>
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/dom/ExcelDemoToDoItem.png b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/dom/ExcelDemoToDoItem.png
new file mode 100644
index 0000000..11586b9
Binary files /dev/null and b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/dom/ExcelDemoToDoItem.png differ
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/dom/ExcelDemoToDoItemMenu.java b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/dom/ExcelDemoToDoItemMenu.java
new file mode 100644
index 0000000..dbe1958
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/dom/ExcelDemoToDoItemMenu.java
@@ -0,0 +1,215 @@
+package org.isisaddons.module.excel.fixture.demoapp.todomodule.dom;
+
+import java.math.BigDecimal;
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.Nullable;
+
+import org.joda.time.LocalDate;
+
+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.MinLength;
+import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.Parameter;
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.applib.query.QueryDefault;
+import org.apache.isis.applib.services.clock.ClockService;
+import org.apache.isis.applib.services.message.MessageService;
+import org.apache.isis.applib.services.repository.RepositoryService;
+import org.apache.isis.applib.services.user.UserService;
+
+import org.isisaddons.wicket.gmap3.cpt.applib.Location;
+
+@DomainService(
+ nature = NatureOfService.VIEW_MENU_ONLY,
+ objectType = "libExcelFixture.ExcelDemoToDoItemMenu"
+)
+@DomainServiceLayout(
+ named = "Dummy",
+ menuOrder = "20.7"
+)
+public class ExcelDemoToDoItemMenu {
+
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(bookmarking = BookmarkPolicy.AS_ROOT)
+ @MemberOrder(sequence = "1")
+ public List<ExcelDemoToDoItem> toDoItemsNotYetComplete() {
+ final List<ExcelDemoToDoItem> items = notYetCompleteNoUi();
+ if(items.isEmpty()) {
+ messageService.informUser("All to-do items have been completed :-)");
+ }
+ return items;
+ }
+
+ @Programmatic
+ public List<ExcelDemoToDoItem> notYetCompleteNoUi() {
+ return repositoryService.allMatches(
+ new QueryDefault<>(ExcelDemoToDoItem.class,
+ "todo_notYetComplete",
+ "ownedBy", currentUserName()));
+ }
+
+ @Programmatic
+ public ExcelDemoToDoItem findToDoItemsByDescription(final String description) {
+ return repositoryService.firstMatch(
+ new QueryDefault<>(ExcelDemoToDoItem.class,
+ "findByDescription",
+ "description", description,
+ "ownedBy", currentUserName()));
+ }
+
+
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @MemberOrder(sequence = "3")
+ public List<ExcelDemoToDoItem> toDoItemsComplete() {
+ final List<ExcelDemoToDoItem> items = completeNoUi();
+ if(items.isEmpty()) {
+ messageService.informUser("No to-do items have yet been completed :-(");
+ }
+ return items;
+ }
+
+ @Programmatic
+ public List<ExcelDemoToDoItem> completeNoUi() {
+ return repositoryService.allMatches(
+ new QueryDefault<>(ExcelDemoToDoItem.class,
+ "todo_complete",
+ "ownedBy", currentUserName()));
+ }
+
+
+
+ @MemberOrder(sequence = "40")
+ public ExcelDemoToDoItem newToDoItem(
+ @Parameter(regexPattern = "\\w[@&:\\-\\,\\.\\+ \\w]*")
+ final String description,
+ final Category category,
+ final Subcategory subcategory,
+ @Nullable
+ final LocalDate dueBy,
+ @Nullable
+ final BigDecimal cost) {
+ final String ownedBy = currentUserName();
+ return newToDoItem(description, category, subcategory, ownedBy, dueBy, cost);
+ }
+ public Category default1NewToDoItem() {
+ return Category.Professional;
+ }
+ public Subcategory default2NewToDoItem() {
+ return Category.Professional.subcategories().get(0);
+ }
+ public LocalDate default3NewToDoItem() {
+ return clockService.now().plusDays(14);
+ }
+ public List<Subcategory> choices2NewToDoItem(
+ final String description, final Category category) {
+ return Subcategory.listFor(category);
+ }
+ public String validateNewToDoItem(
+ final String description,
+ final Category category, final Subcategory subcategory,
+ final LocalDate dueBy, final BigDecimal cost) {
+ return Subcategory.validate(category, subcategory);
+ }
+
+
+ @Action(semantics = SemanticsOf.SAFE)
+ @MemberOrder(sequence = "50")
+ public List<ExcelDemoToDoItem> allMyToDoItems() {
+ final String currentUser = currentUserName();
+ final List<ExcelDemoToDoItem> items = repositoryService.allMatches(ExcelDemoToDoItem.class, ExcelDemoToDoItem.Predicates.thoseOwnedBy(currentUser));
+ Collections.sort(items);
+ if(items.isEmpty()) {
+ messageService.warnUser("No to-do items found.");
+ }
+ return items;
+ }
+
+
+ @Programmatic
+ public List<ExcelDemoToDoItem> autoComplete(@MinLength(1) final String description) {
+ return repositoryService.allMatches(
+ new QueryDefault<>(ExcelDemoToDoItem.class,
+ "todo_autoComplete",
+ "ownedBy", currentUserName(),
+ "description", description));
+ }
+
+
+ @Programmatic // for use by fixtures
+ public ExcelDemoToDoItem newToDoItem(
+ final String description,
+ final Category category,
+ final Subcategory subcategory,
+ final String userName,
+ final LocalDate dueBy, final BigDecimal cost) {
+ final ExcelDemoToDoItem toDoItem = new ExcelDemoToDoItem();
+ toDoItem.setDescription(description);
+ toDoItem.setCategory(category);
+ toDoItem.setSubcategory(subcategory);
+ toDoItem.setOwnedBy(userName);
+ toDoItem.setDueBy(dueBy);
+ toDoItem.setCost(cost);
+
+ toDoItem.setLocation(
+ new Location(51.5172+random(-0.05, +0.05), 0.1182 + random(-0.05, +0.05)));
+
+ LocalDate today = clockService.now();
+ toDoItem.setDueBy(today.plusDays(random(10)-2));
+
+ repositoryService.persist(toDoItem);
+
+ return toDoItem;
+ }
+
+ @Programmatic
+ public ExcelDemoToDoItem newToDoItem(final String description, final String user) {
+ return newToDoItem(description, null, null, user, null, null);
+ }
+
+ private static double random(final double from, final double to) {
+ return Math.random() * (to-from) + from;
+ }
+
+ private static int random(int n) {
+ return (int) (Math.random() * n);
+ }
+
+
+ @Programmatic
+ public List<ExcelDemoToDoItem> allInstances() {
+ return repositoryService.allInstances(ExcelDemoToDoItem.class);
+ }
+
+ private String currentUserName() {
+ return userService.getUser().getName();
+ }
+
+
+
+
+
+ @javax.inject.Inject
+ MessageService messageService;
+
+ @javax.inject.Inject
+ RepositoryService repositoryService;
+
+ @javax.inject.Inject
+ UserService userService;
+
+ @javax.inject.Inject
+ ClockService clockService;
+
+
+
+}
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/dom/Subcategory.java b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/dom/Subcategory.java
new file mode 100644
index 0000000..166266b
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/dom/Subcategory.java
@@ -0,0 +1,32 @@
+package org.isisaddons.module.excel.fixture.demoapp.todomodule.dom;
+
+import java.util.Collections;
+import java.util.List;
+
+import com.google.common.base.Predicate;
+
+public enum Subcategory {
+ // professional
+ OpenSource, Consulting, Education, Marketing,
+ // domestic
+ Shopping, Housework, Garden, Chores,
+ // other
+ Other;
+
+ public static List<Subcategory> listFor(final Category category) {
+ return category != null ? category.subcategories() : Collections.<Subcategory>emptyList();
+ }
+
+ public static String validate(final Category category, final Subcategory subcategory) {
+ if (category == null) {
+ return "Enter category first";
+ }
+ return !category.subcategories().contains(subcategory)
+ ? "Invalid subcategory for category '" + category + "'"
+ : null;
+ }
+
+ public static Predicate<Subcategory> thoseFor(final Category category) {
+ return subcategory -> category.subcategories().contains(subcategory);
+ }
+}
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/fixturescripts/ExcelDemoToDoItem_recreate5_for.java b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/fixturescripts/ExcelDemoToDoItem_recreate5_for.java
new file mode 100644
index 0000000..16ab3af
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/fixturescripts/ExcelDemoToDoItem_recreate5_for.java
@@ -0,0 +1,99 @@
+package org.isisaddons.module.excel.fixture.demoapp.todomodule.fixturescripts;
+
+import java.math.BigDecimal;
+
+import org.joda.time.LocalDate;
+
+import org.apache.isis.applib.clock.Clock;
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+import org.apache.isis.objectstore.jdo.applib.service.support.IsisJdoSupport;
+
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.Category;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.ExcelDemoToDoItem;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.ExcelDemoToDoItemMenu;
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.Subcategory;
+
+public class ExcelDemoToDoItem_recreate5_for extends FixtureScript {
+
+ private final String user;
+
+ public ExcelDemoToDoItem_recreate5_for() {
+ this(null);
+ }
+
+ public ExcelDemoToDoItem_recreate5_for(String ownedBy) {
+ this.user = ownedBy;
+ }
+
+
+ @Override
+ protected void execute(ExecutionContext executionContext) {
+
+ final String ownedBy = this.user != null? this.user : userService.getUser().getName();
+
+ executionContext.executeChild(this, new ExcelDemoToDoItem_tearDown2(ownedBy));
+
+ installFor(ownedBy, executionContext);
+
+ transactionService.flushTransaction();
+ }
+
+ private void installFor(String user, ExecutionContext executionContext) {
+
+ ExcelDemoToDoItem t1 = createToDoItemForUser("Buy milk", Category.Domestic, Subcategory.Shopping, user, daysFromToday(0), new BigDecimal("0.75"), executionContext);
+ ExcelDemoToDoItem t2 = createToDoItemForUser("Buy bread", Category.Domestic, Subcategory.Shopping, user, daysFromToday(0), new BigDecimal("1.75"), executionContext);
+ ExcelDemoToDoItem t3 = createToDoItemForUser("Buy stamps", Category.Domestic, Subcategory.Shopping, user, daysFromToday(0), new BigDecimal("10.00"), executionContext);
+ t3.setComplete(true);
+ ExcelDemoToDoItem t4 = createToDoItemForUser("Pick up laundry", Category.Domestic, Subcategory.Chores, user, daysFromToday(6), new BigDecimal("7.50"), executionContext);
+ ExcelDemoToDoItem t5 = createToDoItemForUser("Mow lawn", Category.Domestic, Subcategory.Garden, user, daysFromToday(6), null, executionContext);
+
+ createToDoItemForUser("Vacuum house", Category.Domestic, Subcategory.Housework, user, daysFromToday(3), null, executionContext);
+ createToDoItemForUser("Sharpen knives", Category.Domestic, Subcategory.Chores, user, daysFromToday(14), null, executionContext);
+
+ createToDoItemForUser("Write to penpal", Category.Other, Subcategory.Other, user, null, null, executionContext);
+
+ createToDoItemForUser("Write blog post", Category.Professional, Subcategory.Marketing, user, daysFromToday(7), null, executionContext).setComplete(true);
+ createToDoItemForUser("Organize brown bag", Category.Professional, Subcategory.Consulting, user, daysFromToday(14), null, executionContext);
+ createToDoItemForUser("Submit conference session", Category.Professional, Subcategory.Education, user, daysFromToday(21), null, executionContext);
+ createToDoItemForUser("Stage Isis release", Category.Professional, Subcategory.OpenSource, user, null, null, executionContext);
+
+ t1.add(t2);
+ t1.add(t3);
+ t1.add(t4);
+ t1.add(t5);
+
+ t2.add(t3);
+ t2.add(t4);
+ t2.add(t5);
+
+ t3.add(t4);
+
+ transactionService.flushTransaction();
+ }
+
+
+ // //////////////////////////////////////
+
+ private ExcelDemoToDoItem createToDoItemForUser(final String description, final Category category, Subcategory subcategory, String user, final LocalDate dueBy, final BigDecimal cost, ExecutionContext executionContext) {
+ final ExcelDemoToDoItem toDoItem = demoToDoItemMenu.newToDoItem(description, category, subcategory, user, dueBy, cost);
+ executionContext.add(this, toDoItem);
+ return toDoItem;
+ }
+
+ private static LocalDate daysFromToday(final int i) {
+ final LocalDate date = new LocalDate(Clock.getTimeAsDateTime());
+ return date.plusDays(i);
+ }
+
+
+ // //////////////////////////////////////
+ // Injected services
+ // //////////////////////////////////////
+
+ @javax.inject.Inject
+ private ExcelDemoToDoItemMenu demoToDoItemMenu;
+
+ @javax.inject.Inject
+ private IsisJdoSupport isisJdoSupport;
+
+}
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/fixturescripts/ExcelDemoToDoItem_recreate5_forSven.java b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/fixturescripts/ExcelDemoToDoItem_recreate5_forSven.java
new file mode 100644
index 0000000..b22fb3e
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/fixturescripts/ExcelDemoToDoItem_recreate5_forSven.java
@@ -0,0 +1,10 @@
+package org.isisaddons.module.excel.fixture.demoapp.todomodule.fixturescripts;
+
+public class ExcelDemoToDoItem_recreate5_forSven extends ExcelDemoToDoItem_recreate5_for {
+
+ public ExcelDemoToDoItem_recreate5_forSven() {
+ super("sven");
+ withDiscoverability(Discoverability.DISCOVERABLE);
+ }
+
+}
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/fixturescripts/ExcelDemoToDoItem_tearDown.java b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/fixturescripts/ExcelDemoToDoItem_tearDown.java
new file mode 100644
index 0000000..8a3f03d
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/fixturescripts/ExcelDemoToDoItem_tearDown.java
@@ -0,0 +1,14 @@
+package org.isisaddons.module.excel.fixture.demoapp.todomodule.fixturescripts;
+
+import org.apache.isis.applib.fixturescripts.teardown.TeardownFixtureAbstract2;
+
+import org.isisaddons.module.excel.fixture.demoapp.todomodule.dom.ExcelDemoToDoItem;
+
+public class ExcelDemoToDoItem_tearDown extends TeardownFixtureAbstract2 {
+
+ @Override
+ protected void execute(final ExecutionContext executionContext) {
+ deleteFrom(ExcelDemoToDoItem.class);
+ }
+
+}
diff --git a/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/fixturescripts/ExcelDemoToDoItem_tearDown2.java b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/fixturescripts/ExcelDemoToDoItem_tearDown2.java
new file mode 100644
index 0000000..36c54e2
--- /dev/null
+++ b/extensions/lib/excel/fixture/src/main/java/org/isisaddons/module/excel/fixture/demoapp/todomodule/fixturescripts/ExcelDemoToDoItem_tearDown2.java
@@ -0,0 +1,39 @@
+package org.isisaddons.module.excel.fixture.demoapp.todomodule.fixturescripts;
+
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+import org.apache.isis.applib.services.jdosupport.IsisJdoSupport;
+
+public class ExcelDemoToDoItem_tearDown2 extends FixtureScript {
+
+ private final String user;
+
+ public ExcelDemoToDoItem_tearDown2() {
+ this(null);
+ }
+
+ public ExcelDemoToDoItem_tearDown2(String ownedBy) {
+ this.user = ownedBy;
+ }
+
+ @Override
+ public void execute(ExecutionContext executionContext) {
+
+ final String ownedBy = this.user != null ? this.user : userService.getUser().getName();
+
+ isisJdoSupport.executeUpdate(String.format(
+ "delete "
+ + "from \"excelFixture\".\"ExcelDemoToDoItemDependencies\" "
+ + "where \"dependingId\" IN "
+ + "(select \"id\" from \"excelFixture\".\"ExcelDemoToDoItem\" where \"ownedBy\" = '%s') ",
+ ownedBy));
+
+ isisJdoSupport.executeUpdate(String.format(
+ "delete from \"excelFixture\".\"ExcelDemoToDoItem\" "
+ + "where \"ownedBy\" = '%s'", ownedBy));
+ }
+
+
+ @javax.inject.Inject
+ IsisJdoSupport isisJdoSupport;
+
+}
diff --git a/extensions/lib/excel/impl/pom.xml b/extensions/lib/excel/impl/pom.xml
new file mode 100644
index 0000000..342c477
--- /dev/null
+++ b/extensions/lib/excel/impl/pom.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.isis.extensions</groupId>
+ <artifactId>isis-extensions</artifactId>
+ <version>2.0.0-M3-SNAPSHOT</version>
+ <relativePath>../../../pom.xml</relativePath>
+ </parent>
+
+ <groupId>org.isisaddons.module.excel</groupId>
+ <artifactId>isis-module-excel-dom</artifactId>
+ <name>Incode Platform Lib Excel Impl</name>
+
+ <description>
+ A domain service for Apache Isis', allowing collections
+ of (view model) objects to be exported/imported to/from an
+ Excel spreadsheet. Also support for excel-based fixtures.
+ </description>
+
+ <properties>
+ <jar-plugin.automaticModuleName>org.incode.platform.lib.excel</jar-plugin.automaticModuleName>
+ <git-plugin.propertiesDir>org/incode/platform/lib/excel</git-plugin.propertiesDir>
+ </properties>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-applib</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-runtime</artifactId>
+ <!-- so as not to pollute the classpath of the domain model in the IDE -->
+ <optional>true</optional>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.isis.extensions</groupId>
+ <artifactId>isis-extensions-fixtures</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.datanucleus</groupId>
+ <artifactId>datanucleus-core</artifactId>
+ </dependency>
+
+ <!--
+ <dependency>
+ <groupId>org.apache.poi</groupId>
+ <artifactId>poi</artifactId>
+ </dependency>
+ -->
+ <dependency>
+ <groupId>org.apache.poi</groupId>
+ <artifactId>poi-ooxml</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.poi</groupId>
+ <artifactId>poi-ooxml-schemas</artifactId>
+ </dependency>
+
+ <!-- test -->
+ <dependency>
+ <groupId>org.apache.isis.core</groupId>
+ <artifactId>isis-unittestsupport</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ </dependencies>
+
+</project>
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/ExcelModule.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/ExcelModule.java
new file mode 100644
index 0000000..b27df29
--- /dev/null
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/ExcelModule.java
@@ -0,0 +1,4 @@
+package org.isisaddons.module.excel;
+
+public class ExcelModule {
+}
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/AggregationType.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/AggregationType.java
new file mode 100644
index 0000000..4333f34
--- /dev/null
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/AggregationType.java
@@ -0,0 +1,6 @@
+package org.isisaddons.module.excel.dom;
+
+public enum AggregationType {
+ SUM,
+ COUNT;
+}
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/ExcelFixture.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/ExcelFixture.java
new file mode 100644
index 0000000..a9186c7
--- /dev/null
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/ExcelFixture.java
@@ -0,0 +1,220 @@
+package org.isisaddons.module.excel.dom;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.io.Resources;
+
+import org.apache.isis.extensions.fixtures.fixturescripts.FixtureResultList;
+import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScript;
+import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScripts;
+import org.datanucleus.enhancement.Persistable;
+
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.services.bookmark.BookmarkService;
+import org.apache.isis.applib.services.registry.ServiceRegistry;
+import org.apache.isis.applib.services.repository.RepositoryService;
+import org.apache.isis.applib.value.Blob;
+
+import org.isisaddons.module.excel.dom.util.ExcelServiceImpl;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * This class should be executed using {@link FixtureScripts.MultipleExecutionStrategy#EXECUTE_ONCE_BY_VALUE} (it
+ * has value semantics).
+ */
+@DomainObject(
+ objectType = "isisexcel.ExcelFixture"
+)
+public class ExcelFixture extends FixtureScript {
+
+ private final List<Class> classes;
+
+ public ExcelFixture(final URL excelResource, final Class... classes) {
+ this(excelResource, Arrays.asList(classes));
+ }
+
+ public ExcelFixture(final URL excelResource, final List<Class> classes) {
+ this(classes);
+ setExcelResource(excelResource);
+ }
+
+ public ExcelFixture(final Blob upload, final Class... classes) {
+ this(upload, Arrays.asList(classes));
+ }
+
+ public ExcelFixture(final Blob blob, final List<Class> classes) {
+ this(classes);
+ setBlob(blob);
+ }
+
+ private ExcelFixture(final List<Class> classes) {
+ for (Class cls : classes) {
+ final boolean viewModel = ExcelFixtureRowHandler.class.isAssignableFrom(cls);
+ final boolean persistable = Persistable.class.isAssignableFrom(cls);
+ if (!viewModel && !persistable) {
+ throw new IllegalArgumentException(String.format(
+ "Class '%s' does not implement '%s', nor is it persistable",
+ cls.getSimpleName(), ExcelFixtureRowHandler.class.getSimpleName()));
+ }
+ }
+ this.classes = classes;
+ }
+
+ /**
+ * Input, optional: defines the name of the resource, used as a suffix to override {@link #getQualifiedName()}
+ * (disambiguate items when added to {@link FixtureResultList} if multiple instances of {@link ExcelFixture} are
+ * used with different excel spreadsheets).
+ */
+ @Getter @Setter
+ @MemberOrder(sequence = "1.1")
+ private String excelResourceName;
+
+ /**
+ * Input, mandatory ... the Excel spreadsheet to read.
+ */
+ @Getter @Setter
+ @MemberOrder(sequence = "1.2")
+ private URL excelResource;
+
+ /**
+ * Input, mandatory ... the Excel spreadsheet to read.
+ */
+ @Getter @Setter
+ private Blob blob;
+
+ /**
+ * Output: the objects created by this fixture, for a specific persistable/row handler class.
+ */
+ @Getter
+ private final Map<Class, List<Object>> objectsByClass = Maps.newHashMap();
+
+ /**
+ * Output: all the objects created by this fixture.
+ */
+ @Getter
+ private final List objects = Lists.newArrayList();
+
+ @Programmatic
+ @Override
+ public String getQualifiedName() {
+ return super.getQualifiedName() + (getExcelResourceName() != null ? "-" + getExcelResourceName() : "");
+ }
+
+ @Override
+ protected void execute(final ExecutionContext ec) {
+
+ final ExcelServiceImpl excelServiceImpl = new ExcelServiceImpl();
+ serviceRegistry.injectServicesInto(excelServiceImpl);
+
+ if (blob == null){
+ byte[] bytes = getBytes();
+ blob = new Blob("unused", ExcelService.XSLX_MIME_TYPE, bytes);
+ }
+
+ for (Class cls : classes) {
+ final List rowObjects = excelServiceImpl.fromExcel(blob, cls, cls.getSimpleName());
+ Object previousRow = null;
+ for (final Object rowObj : rowObjects) {
+ final List<Object> createdObjects = create(rowObj, ec, previousRow);
+ if (createdObjects != null) {
+ addToMap(cls, createdObjects);
+ addToCombined(createdObjects);
+ }
+ previousRow = rowObj;
+ }
+ }
+ }
+ //region > bytes
+ private byte[] bytes;
+
+ private byte[] getBytes() {
+ if (bytes == null) {
+ if (blob != null){
+ bytes = blob.getBytes();
+ } else {
+ bytes = readBytes();
+ }
+ }
+ return bytes;
+ }
+
+ private byte[] readBytes() {
+
+ final URL excelResource = getExcelResource();
+ try {
+ bytes = Resources.toByteArray(excelResource);
+ } catch (IOException e) {
+ throw new IllegalArgumentException("Could not read from resource: " + excelResource);
+ }
+ return bytes;
+ }
+ //endregion
+
+ private List<Object> create(
+ final Object rowObj,
+ final ExecutionContext ec,
+ final Object previousRow) {
+ if (rowObj instanceof ExcelFixtureRowHandler) {
+ final ExcelFixtureRowHandler rowHandler = (ExcelFixtureRowHandler) rowObj;
+ return rowHandler.handleRow(ec, this, previousRow);
+ } else {
+ repositoryService.persist(rowObj);
+ ec.addResult(this, rowObj);
+ return Collections.singletonList(rowObj);
+ }
+ }
+
+ private void addToMap(final Class cls, final List<Object> createdObjects) {
+ List<Object> objectList = objectsByClass.get(cls);
+ if (objectList == null) {
+ objectList = Lists.newArrayList();
+ this.objectsByClass.put(cls, objectList);
+ }
+ objectList.addAll(createdObjects);
+ }
+
+ private void addToCombined(final List<Object> createdObjects) {
+ this.objects.addAll(createdObjects);
+ }
+
+ //region > hashCode, equals
+
+ @Override
+ public boolean equals(final Object o) {
+ if (this == o)
+ return true;
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ final ExcelFixture that = (ExcelFixture) o;
+
+ return Arrays.equals(getBytes(), that.getBytes());
+
+ }
+
+ @Override
+ public int hashCode() {
+ return Arrays.hashCode(getBytes());
+ }
+
+ //endregion
+
+ @javax.inject.Inject
+ private RepositoryService repositoryService;
+ @javax.inject.Inject
+ private BookmarkService bookmarkService;
+ @javax.inject.Inject
+ private ServiceRegistry serviceRegistry;
+
+}
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/ExcelFixture2.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/ExcelFixture2.java
new file mode 100644
index 0000000..b18df3e
--- /dev/null
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/ExcelFixture2.java
@@ -0,0 +1,173 @@
+package org.isisaddons.module.excel.dom;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.inject.Inject;
+
+import com.google.common.io.Resources;
+
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.services.bookmark.BookmarkService;
+import org.apache.isis.applib.services.factory.FactoryService;
+import org.apache.isis.applib.services.registry.ServiceRegistry;
+import org.apache.isis.applib.services.repository.RepositoryService;
+import org.apache.isis.applib.value.Blob;
+import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScript;
+import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScripts;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * This class should be executed using {@link FixtureScripts.MultipleExecutionStrategy#EXECUTE_ONCE_BY_VALUE} (it
+ * has value semantics).
+ */
+@DomainObject(
+ objectType = "isisexcel.ExcelFixture2"
+)
+public class ExcelFixture2 extends FixtureScript {
+
+
+ /**
+ * Input, optional: defines the name of the resource.
+ */
+ @Getter @Setter
+ @MemberOrder(sequence = "1.1")
+ private String excelResourceName;
+
+ /**
+ * Input, either this or the blob is mandatory ... the Excel spreadsheet to read.
+ */
+ @Getter @Setter
+ @MemberOrder(sequence = "1.2")
+ private URL excelResource;
+
+ /**
+ * Input, either this or the excelResource is mandatory ... the Excel spreadsheet to read.
+ */
+ @Getter @Setter
+ private Blob blob;
+
+ /**
+ * Input, mandatory ... how to process each sheet of the workbook.
+ */
+ @Getter @Setter
+ WorksheetSpec.Matcher matcher;
+
+ /**
+ * Input, optional ... which sequence to process the matched sheets
+ */
+ @Getter @Setter
+ private WorksheetSpec.Sequencer sequencer;
+
+
+ /**
+ * Output... a list of list of objects (each representing a row of a sheet)
+ */
+ @Getter
+ private List<List<?>> lists;
+
+
+ @Override
+ protected void execute(final ExecutionContext executionContext) {
+
+ if (blob == null){
+ byte[] bytes = getBytes();
+ blob = new Blob("unused", ExcelService.XSLX_MIME_TYPE, bytes);
+ }
+
+ this.lists = excelService.fromExcel(blob, matcher, sequencer);
+
+ }
+
+ //region > bytes
+ private byte[] bytes;
+
+ private byte[] getBytes() {
+ if (bytes == null) {
+ if (blob != null){
+ bytes = blob.getBytes();
+ } else {
+ bytes = readBytes();
+ }
+ }
+ return bytes;
+ }
+
+ private byte[] readBytes() {
+
+ final URL excelResource = getExcelResource();
+ try {
+ bytes = Resources.toByteArray(excelResource);
+ } catch (IOException e) {
+ throw new IllegalArgumentException("Could not read from resource: " + excelResource);
+ }
+ return bytes;
+ }
+ //endregion
+
+
+ protected <T> WorksheetSpec.RowFactory<T> rowFactoryFor(
+ final Class<T> rowClass,
+ final ExecutionContext ec) {
+
+ return new WorksheetSpec.RowFactory<T>() {
+ @Override
+ public T create() {
+ final T importLine =
+ factoryService.instantiate(rowClass);
+ // allow the line to interact with the calling fixture
+ if(importLine instanceof FixtureAwareRowHandler<?>) {
+ final FixtureAwareRowHandler<?> farh = (FixtureAwareRowHandler<?>) importLine;
+ farh.setExecutionContext(ec);
+ farh.setExcelFixture2(ExcelFixture2.this);
+ }
+ return importLine;
+ }
+
+ @Override
+ public Class<?> getCls() {
+ return rowClass;
+ }
+ };
+ }
+ //region > hashCode, equals
+
+ @Override
+ public boolean equals(final Object o) {
+ if (this == o)
+ return true;
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ final ExcelFixture2 that = (ExcelFixture2) o;
+
+ return Arrays.equals(getBytes(), that.getBytes());
+
+ }
+
+ @Override
+ public int hashCode() {
+ return Arrays.hashCode(getBytes());
+ }
+
+ //endregion
+
+ @javax.inject.Inject
+ private RepositoryService repositoryService;
+ @javax.inject.Inject
+ private BookmarkService bookmarkService;
+ @javax.inject.Inject
+ private ServiceRegistry serviceRegistry;
+
+ @Inject
+ FactoryService factoryService;
+
+ @Inject
+ ExcelService excelService;
+
+}
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/ExcelFixtureRowHandler.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/ExcelFixtureRowHandler.java
new file mode 100644
index 0000000..8a9e48f
--- /dev/null
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/ExcelFixtureRowHandler.java
@@ -0,0 +1,12 @@
+package org.isisaddons.module.excel.dom;
+
+import java.util.List;
+
+import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScript;
+
+public interface ExcelFixtureRowHandler {
+ List<Object> handleRow(
+ final FixtureScript.ExecutionContext executionContext,
+ final ExcelFixture excelFixture,
+ final Object previousRow);
+}
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/ExcelFixtureWorkbookHandler.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/ExcelFixtureWorkbookHandler.java
new file mode 100644
index 0000000..d5375ae
--- /dev/null
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/ExcelFixtureWorkbookHandler.java
@@ -0,0 +1,12 @@
+package org.isisaddons.module.excel.dom;
+
+import java.util.List;
+
+import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScript;
+
+public interface ExcelFixtureWorkbookHandler {
+ void workbookHandled(
+ final FixtureScript.ExecutionContext executionContext,
+ final ExcelFixture2 excelFixture,
+ List<List<?>> rows);
+}
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/ExcelMetaDataEnabled.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/ExcelMetaDataEnabled.java
new file mode 100644
index 0000000..d7b6368
--- /dev/null
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/ExcelMetaDataEnabled.java
@@ -0,0 +1,10 @@
+package org.isisaddons.module.excel.dom;
+
+
+public interface ExcelMetaDataEnabled {
+
+ void setExcelSheetName(final String sheetName);
+
+ void setExcelRowNumber(final Integer rowNumber);
+
+}
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/ExcelService.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/ExcelService.java
new file mode 100644
index 0000000..8822d16
--- /dev/null
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/ExcelService.java
@@ -0,0 +1,232 @@
+package org.isisaddons.module.excel.dom;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.PostConstruct;
+import javax.inject.Inject;
+
+import com.google.common.collect.Lists;
+
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+
+import org.apache.isis.applib.RecoverableException;
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.services.bookmark.BookmarkService;
+import org.apache.isis.applib.services.registry.ServiceRegistry;
+import org.apache.isis.applib.value.Blob;
+
+import org.isisaddons.module.excel.dom.util.ExcelServiceImpl;
+import org.isisaddons.module.excel.dom.util.Mode;
+
+@DomainService(
+ nature = NatureOfService.DOMAIN
+)
+public class ExcelService {
+
+ public static class Exception extends RecoverableException {
+
+ private static final long serialVersionUID = 1L;
+
+ public Exception(final String msg, final Throwable ex) {
+ super(msg, ex);
+ }
+
+ public Exception(final Throwable ex) {
+ super(ex);
+ }
+ }
+
+ public static final String XSLX_MIME_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
+
+ private ExcelServiceImpl excelServiceImpl;
+
+ public ExcelService() {
+ }
+
+ @Programmatic
+ @PostConstruct
+ public void init(final Map<String,String> properties) {
+ excelServiceImpl = new ExcelServiceImpl();
+ serviceRegistry.injectServicesInto(excelServiceImpl);
+ }
+
+ // //////////////////////////////////////
+
+ /**
+ * Creates a Blob holding a spreadsheet of the domain objects.
+ *
+ * <p>
+ * There are no specific restrictions on the domain objects; they can be either persistable entities or
+ * view models. Do be aware though that if imported back using {@link #fromExcel(Blob, Class, String)},
+ * then new instances are always created. It is generally better therefore to work with view models than to
+ * work with entities. This also makes it easier to maintain backward compatibility in the future if the
+ * persistence model changes; using view models represents a stable API for import/export.
+ * </p>
+ *
+ * @param sheetName - must be 31 chars or less
+ */
+ public <T> Blob toExcel(
+ final List<T> domainObjects,
+ final Class<T> cls,
+ final String sheetName,
+ final String fileName) throws ExcelService.Exception {
+ return excelServiceImpl.toExcel(domainObjects, cls, sheetName, fileName);
+ }
+
+ public <T> Blob toExcel(
+ final List<T> domainObjects,
+ final Class<T> cls,
+ final String sheetName,
+ final String fileName,
+ final InputStream in) throws ExcelService.Exception {
+ return excelServiceImpl.toExcel(domainObjects, cls, sheetName, fileName, in);
+ }
+
+ @Programmatic
+ public <T> Blob toExcel(
+ final WorksheetContent worksheetContent,
+ final String fileName) throws ExcelService.Exception {
+ return excelServiceImpl.toExcel(worksheetContent, fileName);
+ }
+
+ @Programmatic
+ public <T> Blob toExcel(
+ final WorksheetContent worksheetContent,
+ final String fileName,
+ final InputStream in) throws ExcelService.Exception {
+ return excelServiceImpl.toExcel(worksheetContent, fileName, in);
+ }
+
+ @Programmatic
+ public Blob toExcel(
+ final List<WorksheetContent> worksheetContents,
+ final String fileName) throws ExcelService.Exception {
+ return excelServiceImpl.toExcel(worksheetContents, fileName);
+ }
+
+ @Programmatic
+ public Blob toExcel(
+ final List<WorksheetContent> worksheetContents,
+ final String fileName,
+ final InputStream in) throws ExcelService.Exception {
+ return excelServiceImpl.toExcel(worksheetContents, fileName, in);
+ }
+
+ @Programmatic
+ public <T> Blob toExcelPivot(
+ final List<T> domainObjects,
+ final Class<T> cls,
+ final String fileName) throws ExcelService.Exception {
+ return excelServiceImpl.toExcelPivot(domainObjects, cls, fileName);
+ }
+
+ public <T> Blob toExcelPivot(
+ final List<T> domainObjects,
+ final Class<T> cls,
+ final String sheetName,
+ final String fileName) throws ExcelService.Exception {
+ return excelServiceImpl.toExcelPivot(domainObjects, cls, sheetName, fileName);
+ }
+
+ @Programmatic
+ public <T> Blob toExcelPivot(
+ final WorksheetContent worksheetContent,
+ final String fileName) throws ExcelService.Exception {
+ return excelServiceImpl.toExcelPivot(worksheetContent, fileName);
+ }
+
+ @Programmatic
+ public Blob toExcelPivot(
+ final List<WorksheetContent> worksheetContents,
+ final String fileName) throws ExcelService.Exception {
+
+ return excelServiceImpl.toExcelPivot(worksheetContents, fileName);
+ }
+
+ /**
+ * Returns a list of objects for each line in the spreadsheet, of the specified type.
+ *
+ * <p>
+ * If the class is a view model then the objects will be properly instantiated, with the correct
+ * view model memento); otherwise the objects will be simple transient objects.
+ * </p>
+ */
+ @Programmatic
+ public <T> List<T> fromExcel(
+ final Blob excelBlob,
+ final Class<T> cls,
+ final String sheetName) throws ExcelService.Exception {
+ return fromExcel(excelBlob, new WorksheetSpec(cls, sheetName));
+ }
+
+ @Programmatic
+ public <T> List<T> fromExcel(
+ final Blob excelBlob,
+ final Class<T> cls,
+ final String sheetName,
+ final Mode mode) throws ExcelService.Exception {
+ return fromExcel(excelBlob, new WorksheetSpec(cls, sheetName, mode));
+ }
+
+ @Programmatic
+ public <T> List<T> fromExcel(
+ final Blob excelBlob,
+ final WorksheetSpec worksheetSpec) throws ExcelService.Exception {
+ return excelServiceImpl.fromExcel(excelBlob, worksheetSpec);
+ }
+
+ @Programmatic
+ public List<List<?>> fromExcel(
+ final Blob excelBlob,
+ final List<WorksheetSpec> worksheetSpecs) throws ExcelService.Exception {
+ return excelServiceImpl.fromExcel(excelBlob, worksheetSpecs);
+ }
+
+ @Programmatic
+ public List<List<?>> fromExcel(
+ final Blob excelBlob,
+ final WorksheetSpec.Matcher matcher) throws ExcelService.Exception {
+
+ return fromExcel(excelBlob, matcher, null);
+ }
+
+ @Programmatic
+ public List<List<?>> fromExcel(
+ final Blob excelBlob,
+ final WorksheetSpec.Matcher matcher,
+ final WorksheetSpec.Sequencer sequencer) throws ExcelService.Exception {
+
+ List<WorksheetSpec> worksheetSpecs = Lists.newArrayList();
+ try (ByteArrayInputStream bais = new ByteArrayInputStream(excelBlob.getBytes())) {
+ final Workbook wb = org.apache.poi.ss.usermodel.WorkbookFactory.create(bais);
+ final int numberOfSheets = wb.getNumberOfSheets();
+ for (int i = 0; i < numberOfSheets; i++) {
+ final Sheet sheet = wb.getSheetAt(i);
+ WorksheetSpec worksheetSpec = matcher.fromSheet(sheet.getSheetName());
+ if(worksheetSpec != null) {
+ worksheetSpecs.add(worksheetSpec);
+ }
+ }
+ } catch (IOException e) {
+ throw new ExcelService.Exception(e);
+ }
+
+ if(sequencer != null) {
+ worksheetSpecs = sequencer.sequence(worksheetSpecs);
+ }
+
+ return fromExcel(excelBlob, worksheetSpecs);
+ }
+
+ @Inject BookmarkService bookmarkService;
+ @Inject ServiceRegistry serviceRegistry;
+
+}
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/FixtureAwareRowHandler.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/FixtureAwareRowHandler.java
new file mode 100644
index 0000000..94e64ef
--- /dev/null
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/FixtureAwareRowHandler.java
@@ -0,0 +1,11 @@
+package org.isisaddons.module.excel.dom;
+
+
+import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScript;
+
+public interface FixtureAwareRowHandler<T extends FixtureAwareRowHandler<T>> extends RowHandler<T> {
+
+ void setExecutionContext(FixtureScript.ExecutionContext ec);
+ void setExcelFixture2(ExcelFixture2 excelFixture2);
+
+}
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/HyperLink.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/HyperLink.java
new file mode 100644
index 0000000..df3b945
--- /dev/null
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/HyperLink.java
@@ -0,0 +1,9 @@
+package org.isisaddons.module.excel.dom;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.RUNTIME)
+public @interface HyperLink {
+
+}
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/PivotColumn.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/PivotColumn.java
new file mode 100644
index 0000000..87279fe
--- /dev/null
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/PivotColumn.java
@@ -0,0 +1,9 @@
+package org.isisaddons.module.excel.dom;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.RUNTIME)
+public @interface PivotColumn {
+ int order();
+}
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/PivotDecoration.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/PivotDecoration.java
new file mode 100644
index 0000000..9c890ec
--- /dev/null
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/PivotDecoration.java
@@ -0,0 +1,9 @@
+package org.isisaddons.module.excel.dom;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.RUNTIME)
+public @interface PivotDecoration {
+ int order();
+}
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/PivotRow.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/PivotRow.java
new file mode 100644
index 0000000..7e1357a
--- /dev/null
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/PivotRow.java
@@ -0,0 +1,8 @@
+package org.isisaddons.module.excel.dom;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.RUNTIME)
+public @interface PivotRow {
+}
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/PivotValue.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/PivotValue.java
new file mode 100644
index 0000000..321cf33
--- /dev/null
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/PivotValue.java
@@ -0,0 +1,10 @@
+package org.isisaddons.module.excel.dom;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.RUNTIME)
+public @interface PivotValue {
+ int order();
+ AggregationType type() default AggregationType.SUM;
+}
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/RowHandler.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/RowHandler.java
new file mode 100644
index 0000000..b444578
--- /dev/null
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/RowHandler.java
@@ -0,0 +1,7 @@
+package org.isisaddons.module.excel.dom;
+
+public interface RowHandler<T extends RowHandler<T>> {
+
+ void handleRow(T previousRow);
+
+}
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/WorksheetContent.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/WorksheetContent.java
new file mode 100644
index 0000000..2ce96b3
--- /dev/null
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/WorksheetContent.java
@@ -0,0 +1,24 @@
+package org.isisaddons.module.excel.dom;
+
+import java.util.List;
+
+public class WorksheetContent {
+
+ private final List<?> domainObjects;
+ private final WorksheetSpec spec;
+
+ public <T> WorksheetContent(
+ final List<T> domainObjects,
+ final WorksheetSpec spec) {
+ this.domainObjects = domainObjects;
+ this.spec = spec;
+ }
+
+ public List<?> getDomainObjects() {
+ return domainObjects;
+ }
+
+ public WorksheetSpec getSpec() {
+ return spec;
+ }
+}
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/WorksheetSpec.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/WorksheetSpec.java
new file mode 100644
index 0000000..63ec002
--- /dev/null
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/WorksheetSpec.java
@@ -0,0 +1,124 @@
+package org.isisaddons.module.excel.dom;
+
+import java.util.List;
+
+import org.isisaddons.module.excel.dom.util.Mode;
+
+public class WorksheetSpec {
+
+ /**
+ * Maximum supported by Microsoft Excel UI.
+ *
+ * @see <a href="http://stackoverflow.com/questions/3681868/is-there-a-limit-on-an-excel-worksheets-name-length">this SO answer</a>, for example.
+ */
+ private static final int SHEET_NAME_MAX_LEN = 31;
+ private static final String ROW_HANDLER_SUFFIX = "RowHandler";
+
+ public interface RowFactory<Q> {
+ Q create();
+
+ Class<?> getCls();
+
+ static class Default<T> implements RowFactory<T>, ServicesInjectorAware {
+ private final Class<T> viewModelClass;
+ private ServicesInjector servicesInjector;
+
+ public Default(final Class<T> viewModelClass) {
+ this.viewModelClass = viewModelClass;
+ }
+
+ @Override
+ public T create() {
+ try {
+ final T t = viewModelClass.newInstance();
+ servicesInjector.injectServicesInto(t);
+ return t;
+ } catch (InstantiationException | IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public Class<?> getCls() {
+ return viewModelClass;
+ }
+
+ @Override
+ public void setServicesInjector(final ServicesInjector servicesInjector) {
+ this.servicesInjector = servicesInjector;
+ }
+ }
+
+ }
+
+ private final RowFactory<?> factory;
+ private final Mode mode;
+ private final String sheetName;
+
+ /**
+ * @param viewModelClass
+ * @param sheetName - must be 31 chars or less
+ * @param <T>
+ */
+ public <T> WorksheetSpec(final Class<T> viewModelClass, String sheetName) {
+ this(viewModelClass, sheetName, Mode.STRICT);
+ }
+
+ public <T> WorksheetSpec(final Class<T> viewModelClass, String sheetName, final Mode mode) {
+ this(new RowFactory.Default<>(viewModelClass), sheetName, mode);
+ }
+
+ public <T> WorksheetSpec(final RowFactory<T> factory, String sheetName, final Mode mode) {
+ this.factory = factory;
+ this.mode = mode;
+ if(sheetName == null) {
+ throw new IllegalArgumentException("Sheet name must be specified");
+ }
+ if(isTooLong(sheetName) && hasSuffix(sheetName)) {
+ sheetName = prefix(sheetName);
+ }
+ if(isTooLong(sheetName)) {
+ throw new IllegalArgumentException(
+ String.format("Sheet name must be less than 30 characters (was '%s'", sheetName));
+ }
+ this.sheetName = sheetName;
+ }
+
+ public static String prefix(final String sheetName) {
+ return sheetName.substring(0, sheetName.lastIndexOf(ROW_HANDLER_SUFFIX));
+ }
+
+ public <T> RowFactory<T> getFactory() { return (RowFactory<T>) factory; }
+
+ public String getSheetName() {
+ return sheetName;
+ }
+
+ public Mode getMode() {
+ return mode;
+ }
+
+ public static boolean isTooLong(final String sheetName) {
+ return sheetName.length() > SHEET_NAME_MAX_LEN;
+ }
+
+ public static String trim(final String sheetName) {
+ return sheetName.substring(0, SHEET_NAME_MAX_LEN);
+ }
+
+ public static boolean hasSuffix(final String sheetName) {
+ return sheetName.endsWith(ROW_HANDLER_SUFFIX);
+ }
+
+ public interface Matcher {
+ /**
+ * @return non-null to indicate how the sheet should be handled, otherwise <code>null</code> to ignore
+ */
+ WorksheetSpec fromSheet(String sheetName);
+ }
+
+ public interface Sequencer {
+ List<WorksheetSpec> sequence(List<WorksheetSpec> specs);
+ }
+
+}
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/AnnotationList.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/AnnotationList.java
new file mode 100644
index 0000000..5766bfa
--- /dev/null
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/AnnotationList.java
@@ -0,0 +1,26 @@
+package org.isisaddons.module.excel.dom.util;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class AnnotationList {
+
+ AnnotationList(List<AnnotationTriplet> list){
+ this.list = list;
+ }
+
+ List<AnnotationTriplet> list;
+
+ List<AnnotationTriplet> getByAnnotation_OrderBy_OrderAscending(String annotation){
+ List<AnnotationTriplet> result = new ArrayList<>();
+ for (AnnotationTriplet a : list){
+ if (a.getAnnotation().equals(annotation)){
+ result.add(a);
+ }
+ }
+ Collections.sort(result);
+ return result;
+ }
+
+}
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/AnnotationTriplet.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/AnnotationTriplet.java
new file mode 100644
index 0000000..c7cd4ec
--- /dev/null
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/AnnotationTriplet.java
@@ -0,0 +1,32 @@
+package org.isisaddons.module.excel.dom.util;
+
+public class AnnotationTriplet implements Comparable<AnnotationTriplet>{
+
+ AnnotationTriplet(final String annotation, final Integer colNumber, final Integer order){
+ this.annotation = annotation;
+ this.colNumber = colNumber;
+ this.order = order;
+ }
+
+ private String annotation;
+ private Integer order;
+ private Integer colNumber;
+
+ String getAnnotation() {
+ return annotation;
+ }
+
+ Integer getColnumber() {
+ return colNumber;
+ }
+
+ @Override public int compareTo(final AnnotationTriplet o) {
+
+ if (this.annotation.equals(o.annotation)){
+ return this.order.compareTo(o.order);
+ } else {
+ return this.annotation.compareTo(o.annotation);
+ }
+
+ }
+}
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/CellMarshaller.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/CellMarshaller.java
new file mode 100644
index 0000000..ec85767
--- /dev/null
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/CellMarshaller.java
@@ -0,0 +1,471 @@
+package org.isisaddons.module.excel.dom.util;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Date;
+
+import org.apache.isis.applib.services.bookmark.Bookmark;
+import org.apache.isis.applib.services.bookmark.BookmarkService;
+import org.apache.isis.metamodel.spec.ManagedObject;
+import org.apache.isis.metamodel.spec.ObjectSpecification;
+import org.apache.isis.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.poi.common.usermodel.HyperlinkType;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.xssf.usermodel.XSSFHyperlink;
+import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
+import org.joda.time.LocalDateTime;
+
+final class CellMarshaller {
+
+ private final CellStyle dateCellStyle;
+ private final CellStyle defaultCellStyle;
+ private final BookmarkService bookmarkService;
+
+ CellMarshaller(
+ final BookmarkService bookmarkService,
+ final CellStyle dateCellStyle,
+ final CellStyle defaultCellStyle){
+ this.bookmarkService = bookmarkService;
+ this.dateCellStyle = dateCellStyle;
+ this.defaultCellStyle = defaultCellStyle;
+ }
+
+ void setCellValue(
+ final ManagedObject objectAdapter,
+ final OneToOneAssociation otoa,
+ final Cell cell) {
+
+ final ManagedObject propertyAdapter = otoa.get(objectAdapter);
+
+ // null
+ if (propertyAdapter == null) {
+ cell.setBlank();
+ cell.setCellStyle(defaultCellStyle);
+ return;
+ }
+
+ final ObjectSpecification propertySpec = otoa.getSpecification();
+ final Object propertyAsObj = propertyAdapter.getPojo();
+ final String propertyAsTitle = propertyAdapter.titleString(null);
+
+ // value types
+ if(propertySpec.isValue()) {
+ if(setCellValue(cell, propertyAsObj)) {
+ return;
+ }
+ }
+
+ // reference types
+ if(!propertySpec.isParentedOrFreeCollection()) {
+ setCellValueForBookmark(cell, propertyAsObj, propertyAsTitle, defaultCellStyle);
+ return;
+ }
+
+ // fallback, best effort
+ setCellValueForString(cell, propertyAsTitle, defaultCellStyle);
+ return;
+ }
+
+ void setCellValueForHyperlink(
+ final ManagedObject objectAdapter,
+ final OneToOneAssociation otoa,
+ final Cell cell) {
+
+ final ManagedObject propertyAdapter = otoa.get(objectAdapter);
+
+ // null
+ if (propertyAdapter == null) {
+ cell.setBlank();
+ cell.setCellStyle(defaultCellStyle);
+ return;
+ }
+
+ // only String type expected
+ if(propertyAdapter.getPojo() instanceof String) {
+
+ String stringValue = (String) propertyAdapter.getPojo();
+
+ cell.setCellValue(stringValue);
+
+ CreationHelper createHelper = cell.getSheet().getWorkbook().getCreationHelper();
+ XSSFHyperlink link = (XSSFHyperlink)createHelper.createHyperlink(HyperlinkType.URL);
+ link.setAddress(stringValue);
+ cell.setHyperlink((XSSFHyperlink) link);
+
+ cell.setCellStyle(defaultCellStyle);
+
+ } else {
+ // silently ignore annotation and fall back
+ setCellValue(objectAdapter, otoa, cell);
+ }
+
+ }
+
+ private boolean setCellValue(final Cell cell, final Object valueAsObj) {
+ if(valueAsObj == null) {
+ cell.setBlank();
+ cell.setCellStyle(defaultCellStyle);
+ return true;
+ }
+
+ // string
+ if(valueAsObj instanceof String) {
+ String value = (String) valueAsObj;
+ setCellValueForString(cell, value, defaultCellStyle);
+ return true;
+ }
+
+ // boolean
+ if(valueAsObj instanceof Boolean) {
+ Boolean value = (Boolean) valueAsObj;
+ cell.setCellValue(value);
+ cell.setCellStyle(defaultCellStyle);
+ return true;
+ }
+
+ // date
+ if(valueAsObj instanceof Date) {
+ Date value = (Date) valueAsObj;
+ setCellValueForDate(cell, value, dateCellStyle);
+ return true;
+ }
+// if(valueAsObj instanceof org.apache.isis.applib.value.Date) {
+// org.apache.isis.applib.value.Date value = (org.apache.isis.applib.value.Date) valueAsObj;
+// Date dateValue = value.dateValue();
+// setCellValueForDate(cell, dateValue, dateCellStyle);
+// return true;
+// }
+// if(valueAsObj instanceof org.apache.isis.applib.value.DateTime) {
+// org.apache.isis.applib.value.DateTime value = (org.apache.isis.applib.value.DateTime) valueAsObj;
+// Date dateValue = value.dateValue();
+// setCellValueForDate(cell, dateValue, dateCellStyle);
+// return true;
+// }
+ if(valueAsObj instanceof LocalDate) {
+ LocalDate value = (LocalDate) valueAsObj;
+ Date date = value.toDateTimeAtStartOfDay().toDate();
+ setCellValueForDate(cell, date, dateCellStyle);
+ return true;
+ }
+ if(valueAsObj instanceof LocalDateTime) {
+ LocalDateTime value = (LocalDateTime) valueAsObj;
+ Date date = value.toDate();
+ setCellValueForDate(cell, date, dateCellStyle);
+ return true;
+ }
+ if(valueAsObj instanceof DateTime) {
+ DateTime value = (DateTime) valueAsObj;
+ Date date = value.toDate();
+ setCellValueForDate(cell, date, dateCellStyle);
+ return true;
+ }
+
+ // number
+ if(valueAsObj instanceof Double) {
+ Double value = (Double) valueAsObj;
+ setCellValueForDouble(cell, (double)value, defaultCellStyle);
+ return true;
+ }
+ if(valueAsObj instanceof Float) {
+ Float value = (Float) valueAsObj;
+ setCellValueForDouble(cell, (double)value, defaultCellStyle);
+ return true;
+ }
+ if(valueAsObj instanceof BigDecimal) {
+ BigDecimal value = (BigDecimal) valueAsObj;
+ setCellValueForDouble(cell, value.doubleValue(), defaultCellStyle);
+ return true;
+ }
+ if(valueAsObj instanceof BigInteger) {
+ BigInteger value = (BigInteger) valueAsObj;
+ setCellValueForDouble(cell, value.doubleValue(), defaultCellStyle);
+ return true;
+ }
+ if(valueAsObj instanceof Long) {
+ Long value = (Long) valueAsObj;
+ setCellValueForDouble(cell, (double)value, defaultCellStyle);
+ return true;
+ }
+ if(valueAsObj instanceof Integer) {
+ Integer value = (Integer) valueAsObj;
+ setCellValueForDouble(cell, (double)value, defaultCellStyle);
+ return true;
+ }
+ if(valueAsObj instanceof Short) {
+ Short value = (Short) valueAsObj;
+ setCellValueForDouble(cell, (double)value, defaultCellStyle);
+ return true;
+ }
+ if(valueAsObj instanceof Byte) {
+ Byte value = (Byte) valueAsObj;
+ setCellValueForDouble(cell, (double)value, defaultCellStyle);
+ return true;
+ }
+ if(valueAsObj instanceof Enum) {
+ Enum<?> value = (Enum<?>) valueAsObj;
+ setCellValueForEnum(cell, (Enum<?>)value, defaultCellStyle);
+ return true;
+ }
+ return false;
+ }
+
+ private static void setCellValueForString(final Cell cell, final String objectAsStr, CellStyle cellStyle) {
+ // char 10 is for linebreak within a cell; to display correctly wrap text needs to be set to true
+ if (objectAsStr.contains(Character.toString((char)10))) {
+ CellStyle wrappedCellStyle = cell.getSheet().getWorkbook().createCellStyle();
+ wrappedCellStyle.setVerticalAlignment(VerticalAlignment.TOP);
+ wrappedCellStyle.setWrapText(true);
+ cell.setCellStyle(wrappedCellStyle);
+ } else {
+ cell.setCellStyle(cellStyle);
+ }
+ cell.setCellValue(objectAsStr);
+ }
+
+ private void setCellValueForBookmark(final Cell cell, final Object propertyAsObject, final String propertyAsTitle, final CellStyle cellStyle) {
+ Bookmark bookmark = bookmarkService.bookmarkFor(propertyAsObject);
+ setCellComment(cell, bookmark.toString());
+
+ cell.setCellValue(propertyAsTitle);
+ cell.setCellStyle(cellStyle);
+ }
+
+ private static void setCellComment(final Cell cell, final String commentText) {
+ Sheet sheet = cell.getSheet();
+ Row row = cell.getRow();
+ Workbook workbook = sheet.getWorkbook();
+ CreationHelper creationHelper = workbook.getCreationHelper();
+ ClientAnchor anchor = creationHelper.createClientAnchor();
+ anchor.setCol1(cell.getColumnIndex());
+ anchor.setCol2(cell.getColumnIndex()+1);
+ anchor.setRow1(row.getRowNum());
+ anchor.setRow2(row.getRowNum()+3);
+
+ Drawing drawing = sheet.createDrawingPatriarch();
+ Comment comment1 = drawing.createCellComment(anchor);
+
+ RichTextString commentRtf = creationHelper.createRichTextString(commentText);
+
+ comment1.setString(commentRtf);
+ Comment comment = comment1;
+ cell.setCellComment(comment);
+ }
+
+ private static <E extends Enum<E>> void setCellValueForEnum(final Cell cell, final Enum<E> objectAsStr, final CellStyle cellStyle) {
+ cell.setCellValue(objectAsStr.name());
+ cell.setCellStyle(cellStyle);
+ }
+
+ private static void setCellValueForDouble(final Cell cell, double value, final CellStyle cellStyle) {
+ cell.setCellValue(value);
+ cell.setCellStyle(cellStyle);
+ }
+
+ private static void setCellValueForDate(final Cell cell, Date date, CellStyle dateCellStyle) {
+ cell.setCellValue(date);
+ cell.setCellStyle(dateCellStyle);
+ }
+
+ String getStringCellValue(Cell cell) {
+ return getCellValue(cell, String.class);
+ }
+
+ Object getCellValue(final Cell cell, final OneToOneAssociation otoa) {
+
+ final CellType cellType = cell.getCellType();
+
+ if(cellType == CellType.BLANK) {
+ return null;
+ }
+
+ final ObjectSpecification propertySpec = otoa.getSpecification();
+ Class<?> requiredType = propertySpec.getCorrespondingClass();
+
+ // value types
+ if(propertySpec.isValue()) {
+ return getCellValue(cell, requiredType);
+ }
+
+ // reference types
+ if(!propertySpec.isParentedOrFreeCollection()) {
+ return getCellComment(cell, requiredType);
+ }
+
+ return null;
+ }
+
+ @SuppressWarnings("unchecked")
+ private <T> T getCellValue(final Cell cell, final Class<T> requiredType) {
+ final CellType cellType = cell.getCellType();
+
+ if(requiredType == boolean.class || requiredType == Boolean.class) {
+ if(cellType == CellType.BOOLEAN) {
+ boolean booleanCellValue = cell.getBooleanCellValue();
+ return (T) Boolean.valueOf(booleanCellValue);
+ } else {
+ return null;
+ }
+ }
+
+ // enum
+ if(Enum.class.isAssignableFrom(requiredType)) {
+ String stringCellValue = cell.getStringCellValue();
+ @SuppressWarnings("rawtypes")
+ Class rawType = requiredType;
+ return (T) Enum.valueOf(rawType, stringCellValue);
+ }
+
+ // date
+ if(requiredType == java.util.Date.class) {
+ java.util.Date dateCellValue = cell.getDateCellValue();
+ return (T) dateCellValue;
+ }
+
+// if(requiredType == org.apache.isis.applib.value.Date.class) {
+// java.util.Date dateCellValue = cell.getDateCellValue();
+// return (T)new org.apache.isis.applib.value.Date(dateCellValue);
+// }
+
+// if(requiredType == org.apache.isis.applib.value.DateTime.class) {
+// java.util.Date dateCellValue = cell.getDateCellValue();
+// return (T)new org.apache.isis.applib.value.DateTime(dateCellValue);
+// }
+
+ if(requiredType == LocalDate.class) {
+ java.util.Date dateCellValue = cell.getDateCellValue();
+ return (T) new LocalDate(dateCellValue.getTime());
+ }
+
+ if(requiredType == LocalDateTime.class) {
+ java.util.Date dateCellValue = cell.getDateCellValue();
+ return (T) new LocalDateTime(dateCellValue.getTime());
+ }
+
+ if(requiredType == DateTime.class) {
+ java.util.Date dateCellValue = cell.getDateCellValue();
+ return (T) new DateTime(dateCellValue.getTime());
+ }
+
+
+ // number
+ if(requiredType == double.class || requiredType == Double.class) {
+ if(cellType == CellType.NUMERIC) {
+ double doubleValue = cell.getNumericCellValue();
+ return (T) Double.valueOf(doubleValue);
+ } else {
+ return null;
+ }
+ }
+
+ if(requiredType == float.class || requiredType == Float.class) {
+ if(cellType == CellType.NUMERIC) {
+ float floatValue = (float)cell.getNumericCellValue();
+ return (T) Float.valueOf(floatValue);
+ } else {
+ return null;
+ }
+ }
+
+ if(requiredType == BigDecimal.class) {
+ if(cellType == CellType.NUMERIC) {
+ double doubleValue = cell.getNumericCellValue();
+ return (T) BigDecimal.valueOf(doubleValue);
+ } else {
+ return null;
+ }
+ }
+
+ if(requiredType == BigInteger.class) {
+ if(cellType == CellType.NUMERIC) {
+ long longValue = (long)cell.getNumericCellValue();
+ return (T) BigInteger.valueOf(longValue);
+ } else {
+ return null;
+ }
+ }
+
+ if(requiredType == long.class || requiredType == Long.class) {
+ if(cellType == CellType.NUMERIC) {
+ long longValue = (long) cell.getNumericCellValue();
+ return (T) Long.valueOf(longValue);
+ } else {
+ return null;
+ }
+ }
+
+ if(requiredType == int.class || requiredType == Integer.class) {
+ if(cellType == CellType.NUMERIC) {
+ int intValue = (int) cell.getNumericCellValue();
+ return (T) Integer.valueOf(intValue);
+ } else {
+ return null;
+ }
+ }
+
+ if(requiredType == short.class || requiredType == Short.class) {
+ if(cellType == CellType.NUMERIC) {
+ short shortValue = (short) cell.getNumericCellValue();
+ return (T) Short.valueOf(shortValue);
+ } else {
+ return null;
+ }
+ }
+
+ if(requiredType == byte.class || requiredType == Byte.class) {
+ if(cellType == CellType.NUMERIC) {
+ byte byteValue = (byte) cell.getNumericCellValue();
+ return (T) Byte.valueOf(byteValue);
+ } else {
+ return null;
+ }
+ }
+
+ if(requiredType == String.class) {
+ if(cellType == CellType.STRING) {
+ return (T) cell.getStringCellValue();
+ } else if(cellType == CellType.NUMERIC) {
+ /*
+ * In some cases, when editing a string type cell in excel and
+ * when the cell content is just a number excel will silently
+ * convert the cell type to numeric. To remedy unexpected
+ * behavior we check whether we can recover numeric cells as
+ * text, accounting for the fact that an integer number is
+ * also stored with a floating point in excel, whereby
+ * a textual representation as such may be undesired.
+ *
+ * @ see https://stackoverflow.com/questions/9898512/how-to-test-if-a-double-is-an-integer
+ * @see https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html#floor-double-
+ * - If the argument value is already equal to a mathematical integer, then the result is the same as the argument.
+ * - If the argument is NaN or an infinity or positive zero or negative zero, then the result is the same as the argument.
+ */
+ double val = cell.getNumericCellValue();
+ if((val == Math.floor(val)) && !Double.isInfinite(val)) {
+ return (T) Integer.toString((int) val);
+ }
+ return (T) Double.toString(val);
+ } else {
+ return null;
+ }
+ }
+
+ return null;
+ }
+
+
+ private Object getCellComment(final Cell cell, final Class<?> requiredType) {
+ final Comment comment = cell.getCellComment();
+ if(comment == null) {
+ return null;
+ }
+ final RichTextString commentRts = comment.getString();
+ if(commentRts == null) {
+ return null;
+ }
+ final String bookmarkStr = commentRts.getString();
+ final Bookmark bookmark = new Bookmark(bookmarkStr);
+ return bookmarkService.lookup(bookmark, BookmarkService.FieldResetPolicy.DONT_REFRESH, requiredType);
+ }
+
+
+}
\ No newline at end of file
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/ExcelConverter.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/ExcelConverter.java
new file mode 100644
index 0000000..71aecb1
--- /dev/null
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/ExcelConverter.java
@@ -0,0 +1,604 @@
+package org.isisaddons.module.excel.dom.util;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.function.Predicate;
+
+import javax.annotation.Nullable;
+
+import com.google.common.base.Function;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+import org.apache.isis.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.metamodel.spec.ManagedObject;
+import org.apache.isis.metamodel.spec.ObjectSpecification;
+import org.apache.isis.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.isis.metamodel.specloader.SpecificationLoader;
+import org.apache.poi.hssf.usermodel.HSSFCellStyle;
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.CreationHelper;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.services.bookmark.BookmarkService;
+import org.apache.isis.applib.util.ObjectContracts;
+
+import org.isisaddons.module.excel.dom.AggregationType;
+import org.isisaddons.module.excel.dom.ExcelMetaDataEnabled;
+import org.isisaddons.module.excel.dom.ExcelService;
+import org.isisaddons.module.excel.dom.HyperLink;
+import org.isisaddons.module.excel.dom.PivotColumn;
+import org.isisaddons.module.excel.dom.PivotDecoration;
+import org.isisaddons.module.excel.dom.PivotRow;
+import org.isisaddons.module.excel.dom.PivotValue;
+import org.isisaddons.module.excel.dom.RowHandler;
+import org.isisaddons.module.excel.dom.WorksheetContent;
+import org.isisaddons.module.excel.dom.WorksheetSpec;
+
+class ExcelConverter {
+
+ private static final String XLSX_SUFFIX = ".xlsx";
+
+ @SuppressWarnings({ "unchecked", "deprecation" })
+ private static final Predicate<ObjectAssociation> VISIBLE_PROPERTIES =
+ ObjectAssociation.Predicates.PROPERTIES.and(
+ ObjectAssociation.Predicates.staticallyVisible(Where.STANDALONE_TABLES));
+
+ static class RowFactory {
+ private final Sheet sheet;
+ private int rowNum;
+
+ RowFactory(final Sheet sheet) {
+ this.sheet = sheet;
+ }
+
+ public Row newRow() {
+ return sheet.createRow(rowNum++);
+ }
+ }
+
+ // //////////////////////////////////////
+
+ private final SpecificationLoader specificationLoader;
+ private final AdapterManager adapterManager;
+ private final BookmarkService bookmarkService;
+ private final ServicesInjector servicesInjector;
+
... 272000 lines suppressed ...
[isis] 03/05: ISIS-2186: base module unit tests now pass
Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
danhaywood pushed a commit to branch ISIS-2186
in repository https://gitbox.apache.org/repos/asf/isis.git
commit 0145c35ae2b28edf4ba03830ca2f942c36ec5015
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Fri Nov 22 21:24:35 2019 +0000
ISIS-2186: base module unit tests now pass
---
extensions/lib/base/impl/pom.xml | 5 +++++
.../org/incode/module/base/IsisMatchers.java | 2 --
.../base/dom/IncodeApplicationExceptionTest.java | 0
.../base/dom/testing/PrivateConstructorTester.java | 0
.../TitledEnumContractTestAbstract_title.java | 2 +-
.../base/dom/titled/TitledEnumContractTester.java | 0
.../module/base/dom/utils/ClassUtilsTest.java | 0
.../module/base/dom/utils/JodaPeriodUtilsTest.java | 0
.../module/base/dom/utils/MathUtilsTest.java | 0
.../module/base/dom/utils/MessageUtils_Test.java | 0
.../module/base/dom/utils/StringUtilsTest.java | 0
.../module/base/dom/utils/TitleBuilderTest.java | 0
.../base/dom/valuetypes/LocalDateIntervalTest.java | 0
...arableByCodeContractTestAbstract_compareTo.java | 2 +-
.../dom/with/ComparableByCodeContractTester.java | 22 +++++++++++++---------
...yDescriptionContractTestAbstract_compareTo.java | 2 +-
.../ComparableByDescriptionContractTester.java | 8 ++++----
...arableByNameContractTestAbstract_compareTo.java | 2 +-
.../dom/with/ComparableByNameContractTester.java | 6 ++++--
...eByReferenceContractTestAbstract_compareTo.java | 2 +-
.../with/ComparableByReferenceContractTester.java | 6 ++++--
...rableByTitleContractTestAbstract_compareTo.java | 2 +-
.../dom/with/ComparableByTitleContractTester.java | 7 ++++---
.../dom/with/InstantiatorForComparableByCode.java | 2 +-
.../InstantiatorForComparableByDescription.java | 3 ++-
.../dom/with/InstantiatorForComparableByName.java | 3 ++-
.../with/InstantiatorForComparableByReference.java | 3 ++-
.../dom/with/InstantiatorForWithStartDate.java | 0
...lperClassesContractTest_privateConstructor.java | 0
.../WithFieldUniqueContractTestAllAbstract.java | 3 ++-
...valMutableContractTestAbstract_changeDates.java | 3 +--
.../CalendarServiceTest_beginningOfMonth.java | 0
.../CalendarServiceTest_beginningOfQuarter.java | 0
.../TitledEnumContractTestAbstract_title.java | 0
.../dom/titled/TitledEnumContractTester.java | 0
...arableByCodeContractTestAbstract_compareTo.java | 0
.../dom/with/ComparableByCodeContractTester.java | 0
...yDescriptionContractTestAbstract_compareTo.java | 0
.../ComparableByDescriptionContractTester.java | 0
...arableByNameContractTestAbstract_compareTo.java | 0
.../dom/with/ComparableByNameContractTester.java | 0
...eByReferenceContractTestAbstract_compareTo.java | 0
.../with/ComparableByReferenceContractTester.java | 0
...rableByTitleContractTestAbstract_compareTo.java | 0
.../dom/with/ComparableByTitleContractTester.java | 0
.../dom/with/InstantiatorForComparableByCode.java | 0
.../InstantiatorForComparableByDescription.java | 0
.../dom/with/InstantiatorForComparableByName.java | 0
.../with/InstantiatorForComparableByReference.java | 0
.../dom/with/InstantiatorForWithStartDate.java | 0
.../WithFieldUniqueContractTestAllAbstract.java | 0
...valMutableContractTestAbstract_changeDates.java | 0
52 files changed, 50 insertions(+), 35 deletions(-)
diff --git a/extensions/lib/base/impl/pom.xml b/extensions/lib/base/impl/pom.xml
index 09f8a77..64e8056 100644
--- a/extensions/lib/base/impl/pom.xml
+++ b/extensions/lib/base/impl/pom.xml
@@ -58,6 +58,11 @@
<artifactId>isis-metamodel</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.datanucleus</groupId>
+ <artifactId>javax.jdo</artifactId>
+ <scope>test</scope>
+ </dependency>
<!--
<dependency>
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/IsisMatchers.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/IsisMatchers.java
similarity index 99%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/IsisMatchers.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/IsisMatchers.java
index afa124c..2eb1bfe 100644
--- a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/IsisMatchers.java
+++ b/extensions/lib/base/impl/src/test/java/org/incode/module/base/IsisMatchers.java
@@ -5,9 +5,7 @@ import java.io.IOException;
import java.util.Arrays;
import java.util.List;
-import org.apache.isis.commons.internal.base._Strings;
import org.apache.isis.metamodel.commons.StringExtensions;
-import org.glassfish.pfl.dynamic.generator.Factory;
import org.hamcrest.CoreMatchers;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/IncodeApplicationExceptionTest.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/IncodeApplicationExceptionTest.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/IncodeApplicationExceptionTest.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/IncodeApplicationExceptionTest.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/testing/PrivateConstructorTester.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/testing/PrivateConstructorTester.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/testing/PrivateConstructorTester.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/testing/PrivateConstructorTester.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/titled/TitledEnumContractTestAbstract_title.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/titled/TitledEnumContractTestAbstract_title.java
similarity index 94%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/titled/TitledEnumContractTestAbstract_title.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/titled/TitledEnumContractTestAbstract_title.java
index 05b2569..cbc0c6e 100644
--- a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/titled/TitledEnumContractTestAbstract_title.java
+++ b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/titled/TitledEnumContractTestAbstract_title.java
@@ -8,7 +8,7 @@ import org.reflections.Reflections;
import org.incode.module.base.dom.TitledEnum;
import org.incode.module.unittestsupport.dom.titled.TitledEnumContractTester;
-public class TitledEnumContractTestAbstract_title {
+public abstract class TitledEnumContractTestAbstract_title {
protected final String prefix;
public TitledEnumContractTestAbstract_title(final String prefix) {
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/titled/TitledEnumContractTester.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/titled/TitledEnumContractTester.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/titled/TitledEnumContractTester.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/titled/TitledEnumContractTester.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/ClassUtilsTest.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/utils/ClassUtilsTest.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/ClassUtilsTest.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/utils/ClassUtilsTest.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/JodaPeriodUtilsTest.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/utils/JodaPeriodUtilsTest.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/JodaPeriodUtilsTest.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/utils/JodaPeriodUtilsTest.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/MathUtilsTest.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/utils/MathUtilsTest.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/MathUtilsTest.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/utils/MathUtilsTest.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/MessageUtils_Test.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/utils/MessageUtils_Test.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/MessageUtils_Test.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/utils/MessageUtils_Test.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/StringUtilsTest.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/utils/StringUtilsTest.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/StringUtilsTest.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/utils/StringUtilsTest.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/TitleBuilderTest.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/utils/TitleBuilderTest.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/utils/TitleBuilderTest.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/utils/TitleBuilderTest.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/valuetypes/LocalDateIntervalTest.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/valuetypes/LocalDateIntervalTest.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/valuetypes/LocalDateIntervalTest.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/valuetypes/LocalDateIntervalTest.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByCodeContractTestAbstract_compareTo.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByCodeContractTestAbstract_compareTo.java
similarity index 96%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByCodeContractTestAbstract_compareTo.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByCodeContractTestAbstract_compareTo.java
index 81100ca..f453174 100644
--- a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByCodeContractTestAbstract_compareTo.java
+++ b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByCodeContractTestAbstract_compareTo.java
@@ -10,7 +10,7 @@ import org.reflections.Reflections;
import org.incode.module.unittestsupport.dom.with.ComparableByCodeContractTester;
-public class ComparableByCodeContractTestAbstract_compareTo {
+public abstract class ComparableByCodeContractTestAbstract_compareTo {
protected final String packagePrefix;
protected Map<Class<?>, Class<?>> noninstantiableSubstitutes;
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByCodeContractTester.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByCodeContractTester.java
similarity index 74%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByCodeContractTester.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByCodeContractTester.java
index c9839ac..265f99e 100644
--- a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByCodeContractTester.java
+++ b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByCodeContractTester.java
@@ -4,8 +4,12 @@ import java.util.List;
import org.apache.isis.unittestsupport.comparable.ComparableContractTester;
+import com.google.common.base.MoreObjects;
import com.google.common.collect.Lists;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+
public class ComparableByCodeContractTester<T extends WithCodeComparable<T>> {
protected final Class<T> cls;
@@ -21,17 +25,17 @@ public class ComparableByCodeContractTester<T extends WithCodeComparable<T>> {
System.out.println("ComparableByCodeContractTester: " + cls.getName());
new ComparableContractTester<>(orderedTuples()).test();
- // testToString();
+ testToString();
}
-// protected void testToString() {
-// final String str = "ABC";
-//
-// final T withCode = newWithCode(str);
-// String expectedToString = Objects.toStringHelper(withCode).add("code", "ABC").toString();
-//
-// assertThat(withCode.toString(), is(expectedToString));
-// }
+ protected void testToString() {
+ final String str = "ABC";
+
+ final T withCode = newWithCode(str);
+ String expectedToString = MoreObjects.toStringHelper(withCode).add("code", "ABC").toString();
+
+ assertThat(withCode.toString(), is(expectedToString));
+ }
@SuppressWarnings("unchecked")
protected List<List<T>> orderedTuples() {
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByDescriptionContractTestAbstract_compareTo.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByDescriptionContractTestAbstract_compareTo.java
similarity index 95%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByDescriptionContractTestAbstract_compareTo.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByDescriptionContractTestAbstract_compareTo.java
index 4a8896d..a2f7587 100644
--- a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByDescriptionContractTestAbstract_compareTo.java
+++ b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByDescriptionContractTestAbstract_compareTo.java
@@ -10,7 +10,7 @@ import org.reflections.Reflections;
import org.incode.module.unittestsupport.dom.with.ComparableByDescriptionContractTester;
-public class ComparableByDescriptionContractTestAbstract_compareTo {
+public abstract class ComparableByDescriptionContractTestAbstract_compareTo {
protected final String packagePrefix;
protected Map<Class<?>, Class<?>> noninstantiableSubstitutes;
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByDescriptionContractTester.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByDescriptionContractTester.java
similarity index 87%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByDescriptionContractTester.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByDescriptionContractTester.java
index acf2cbe..bf4c114 100644
--- a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByDescriptionContractTester.java
+++ b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByDescriptionContractTester.java
@@ -2,10 +2,10 @@ package org.incode.module.base.dom.with;
import java.util.List;
-import com.google.common.base.Objects;
-import com.google.common.collect.Lists;
+import org.apache.isis.unittestsupport.comparable.ComparableContractTester;
-import org.apache.isis.core.unittestsupport.comparable.ComparableContractTester;
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.Lists;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
@@ -32,7 +32,7 @@ public class ComparableByDescriptionContractTester<T extends WithDescriptionComp
final String str = "ABC";
final T withDescription = newWithDescription(str);
- String expectedToString = Objects.toStringHelper(withDescription).add("description", "ABC").toString();
+ String expectedToString = MoreObjects.toStringHelper(withDescription).add("description", "ABC").toString();
assertThat(withDescription.toString(), is(expectedToString));
}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByNameContractTestAbstract_compareTo.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByNameContractTestAbstract_compareTo.java
similarity index 96%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByNameContractTestAbstract_compareTo.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByNameContractTestAbstract_compareTo.java
index a0b4f27..7ffa050 100644
--- a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByNameContractTestAbstract_compareTo.java
+++ b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByNameContractTestAbstract_compareTo.java
@@ -10,7 +10,7 @@ import org.reflections.Reflections;
import org.incode.module.unittestsupport.dom.with.ComparableByNameContractTester;
-public class ComparableByNameContractTestAbstract_compareTo {
+public abstract class ComparableByNameContractTestAbstract_compareTo {
protected final String packagePrefix;
protected Map<Class<?>, Class<?>> noninstantiableSubstitutes;
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByNameContractTester.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByNameContractTester.java
similarity index 87%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByNameContractTester.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByNameContractTester.java
index 5b73a40..ecdc43b 100644
--- a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByNameContractTester.java
+++ b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByNameContractTester.java
@@ -2,10 +2,12 @@ package org.incode.module.base.dom.with;
import java.util.List;
+import org.apache.isis.unittestsupport.comparable.ComparableContractTester;
+
+import com.google.common.base.MoreObjects;
import com.google.common.base.Objects;
import com.google.common.collect.Lists;
-import org.apache.isis.core.unittestsupport.comparable.ComparableContractTester;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
@@ -33,7 +35,7 @@ public class ComparableByNameContractTester<T extends WithNameComparable<T>> {
final String str = "ABC";
final T withName = newWithName(str);
- String expectedToString = Objects.toStringHelper(withName).add("name", "ABC").toString();
+ String expectedToString = MoreObjects.toStringHelper(withName).add("name", "ABC").toString();
assertThat(withName.toString(), is(expectedToString));
}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByReferenceContractTestAbstract_compareTo.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByReferenceContractTestAbstract_compareTo.java
similarity index 96%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByReferenceContractTestAbstract_compareTo.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByReferenceContractTestAbstract_compareTo.java
index 58074ce..9db2a54 100644
--- a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByReferenceContractTestAbstract_compareTo.java
+++ b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByReferenceContractTestAbstract_compareTo.java
@@ -10,7 +10,7 @@ import org.reflections.Reflections;
import org.incode.module.unittestsupport.dom.with.ComparableByReferenceContractTester;
-public class ComparableByReferenceContractTestAbstract_compareTo {
+public abstract class ComparableByReferenceContractTestAbstract_compareTo {
protected final String packagePrefix;
protected Map<Class<?>, Class<?>> noninstantiableSubstitutes;
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByReferenceContractTester.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByReferenceContractTester.java
similarity index 87%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByReferenceContractTester.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByReferenceContractTester.java
index b2ee38a..df4ad77 100644
--- a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByReferenceContractTester.java
+++ b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByReferenceContractTester.java
@@ -2,10 +2,12 @@ package org.incode.module.base.dom.with;
import java.util.List;
+import org.apache.isis.unittestsupport.comparable.ComparableContractTester;
+
+import com.google.common.base.MoreObjects;
import com.google.common.base.Objects;
import com.google.common.collect.Lists;
-import org.apache.isis.core.unittestsupport.comparable.ComparableContractTester;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
@@ -33,7 +35,7 @@ public class ComparableByReferenceContractTester<T extends WithReferenceComparab
final String str = "ABC";
final T withReference = newWithReference(str);
- String expectedToString = Objects.toStringHelper(withReference).add("reference", "ABC").toString();
+ String expectedToString = MoreObjects.toStringHelper(withReference).add("reference", "ABC").toString();
assertThat(withReference.toString(), is(expectedToString));
}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByTitleContractTestAbstract_compareTo.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByTitleContractTestAbstract_compareTo.java
similarity index 96%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByTitleContractTestAbstract_compareTo.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByTitleContractTestAbstract_compareTo.java
index e94d63f..c9d1e09 100644
--- a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByTitleContractTestAbstract_compareTo.java
+++ b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByTitleContractTestAbstract_compareTo.java
@@ -10,7 +10,7 @@ import org.reflections.Reflections;
import org.incode.module.unittestsupport.dom.with.ComparableByTitleContractTester;
-public class ComparableByTitleContractTestAbstract_compareTo {
+public abstract class ComparableByTitleContractTestAbstract_compareTo {
protected final String packagePrefix;
protected Map<Class<?>, Class<?>> noninstantiableSubstitutes;
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByTitleContractTester.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByTitleContractTester.java
similarity index 87%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByTitleContractTester.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByTitleContractTester.java
index 0ef1903..6c8029d 100644
--- a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/ComparableByTitleContractTester.java
+++ b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/ComparableByTitleContractTester.java
@@ -2,11 +2,12 @@ package org.incode.module.base.dom.with;
import java.util.List;
+import org.apache.isis.unittestsupport.comparable.ComparableContractTester;
+
+import com.google.common.base.MoreObjects;
import com.google.common.base.Objects;
import com.google.common.collect.Lists;
-import org.apache.isis.core.unittestsupport.comparable.ComparableContractTester;
-
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
@@ -33,7 +34,7 @@ public class ComparableByTitleContractTester<T extends WithTitleComparable<T>> {
final String str = "ABC";
final T withTitle = newWithTitle(str);
- String expectedToString = Objects.toStringHelper(withTitle).add("title", "ABC").toString();
+ String expectedToString = MoreObjects.toStringHelper(withTitle).add("title", "ABC").toString();
assertThat(withTitle.toString(), is(expectedToString));
}
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForComparableByCode.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/InstantiatorForComparableByCode.java
similarity index 90%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForComparableByCode.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/InstantiatorForComparableByCode.java
index 44c9ff5..cf66928 100644
--- a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForComparableByCode.java
+++ b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/InstantiatorForComparableByCode.java
@@ -1,6 +1,6 @@
package org.incode.module.base.dom.with;
-import org.apache.isis.core.unittestsupport.bidir.Instantiator;
+import org.apache.isis.unittestsupport.bidir.Instantiator;
public class InstantiatorForComparableByCode implements Instantiator {
public final Class<? extends WithCodeComparable<?>> cls;
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForComparableByDescription.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/InstantiatorForComparableByDescription.java
similarity index 91%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForComparableByDescription.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/InstantiatorForComparableByDescription.java
index eb50c53..418a2d1 100644
--- a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForComparableByDescription.java
+++ b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/InstantiatorForComparableByDescription.java
@@ -1,6 +1,7 @@
package org.incode.module.base.dom.with;
-import org.apache.isis.core.unittestsupport.bidir.Instantiator;
+
+import org.apache.isis.unittestsupport.bidir.Instantiator;
public class InstantiatorForComparableByDescription implements Instantiator {
public final Class<? extends WithDescriptionComparable<?>> cls;
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForComparableByName.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/InstantiatorForComparableByName.java
similarity index 90%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForComparableByName.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/InstantiatorForComparableByName.java
index 2aca661..0954a0a 100644
--- a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForComparableByName.java
+++ b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/InstantiatorForComparableByName.java
@@ -1,6 +1,7 @@
package org.incode.module.base.dom.with;
-import org.apache.isis.core.unittestsupport.bidir.Instantiator;
+
+import org.apache.isis.unittestsupport.bidir.Instantiator;
public class InstantiatorForComparableByName implements Instantiator {
public final Class<? extends WithNameComparable<?>> cls;
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForComparableByReference.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/InstantiatorForComparableByReference.java
similarity index 91%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForComparableByReference.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/InstantiatorForComparableByReference.java
index a857176..bc17cd9 100644
--- a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForComparableByReference.java
+++ b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/InstantiatorForComparableByReference.java
@@ -1,6 +1,7 @@
package org.incode.module.base.dom.with;
-import org.apache.isis.core.unittestsupport.bidir.Instantiator;
+
+import org.apache.isis.unittestsupport.bidir.Instantiator;
public class InstantiatorForComparableByReference implements Instantiator {
public final Class<? extends WithReferenceComparable<?>> cls;
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForWithStartDate.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/InstantiatorForWithStartDate.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/InstantiatorForWithStartDate.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/InstantiatorForWithStartDate.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/StaticHelperClassesContractTest_privateConstructor.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/StaticHelperClassesContractTest_privateConstructor.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/StaticHelperClassesContractTest_privateConstructor.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/StaticHelperClassesContractTest_privateConstructor.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/WithFieldUniqueContractTestAllAbstract.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/WithFieldUniqueContractTestAllAbstract.java
similarity index 97%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/WithFieldUniqueContractTestAllAbstract.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/WithFieldUniqueContractTestAllAbstract.java
index 117bc76..f865414 100644
--- a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/WithFieldUniqueContractTestAllAbstract.java
+++ b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/WithFieldUniqueContractTestAllAbstract.java
@@ -3,6 +3,7 @@ package org.incode.module.base.dom.with;
import java.lang.annotation.Annotation;
import java.util.Set;
+
import javax.jdo.annotations.Unique;
import javax.jdo.annotations.Uniques;
@@ -10,7 +11,7 @@ import org.junit.Assert;
import org.junit.Test;
import org.reflections.Reflections;
-public class WithFieldUniqueContractTestAllAbstract<T> {
+public abstract class WithFieldUniqueContractTestAllAbstract<T> {
protected final Class<T> interfaceType;
protected final String fieldName;
protected final String prefix;
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/WithIntervalMutableContractTestAbstract_changeDates.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/WithIntervalMutableContractTestAbstract_changeDates.java
similarity index 96%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/WithIntervalMutableContractTestAbstract_changeDates.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/WithIntervalMutableContractTestAbstract_changeDates.java
index 112a9cc..ff30fba 100644
--- a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/dom/with/WithIntervalMutableContractTestAbstract_changeDates.java
+++ b/extensions/lib/base/impl/src/test/java/org/incode/module/base/dom/with/WithIntervalMutableContractTestAbstract_changeDates.java
@@ -1,5 +1,6 @@
package org.incode.module.base.dom.with;
+import org.apache.isis.unittestsupport.jmocking.JUnitRuleMockery2;
import org.jmock.Expectations;
import org.jmock.auto.Mock;
import org.joda.time.LocalDate;
@@ -7,8 +8,6 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/services/calendar/CalendarServiceTest_beginningOfMonth.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/services/calendar/CalendarServiceTest_beginningOfMonth.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/services/calendar/CalendarServiceTest_beginningOfMonth.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/services/calendar/CalendarServiceTest_beginningOfMonth.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/services/calendar/CalendarServiceTest_beginningOfQuarter.java b/extensions/lib/base/impl/src/test/java/org/incode/module/base/services/calendar/CalendarServiceTest_beginningOfQuarter.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/base/services/calendar/CalendarServiceTest_beginningOfQuarter.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/base/services/calendar/CalendarServiceTest_beginningOfQuarter.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/titled/TitledEnumContractTestAbstract_title.java b/extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/titled/TitledEnumContractTestAbstract_title.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/titled/TitledEnumContractTestAbstract_title.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/titled/TitledEnumContractTestAbstract_title.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/titled/TitledEnumContractTester.java b/extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/titled/TitledEnumContractTester.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/titled/TitledEnumContractTester.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/titled/TitledEnumContractTester.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByCodeContractTestAbstract_compareTo.java b/extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/ComparableByCodeContractTestAbstract_compareTo.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByCodeContractTestAbstract_compareTo.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/ComparableByCodeContractTestAbstract_compareTo.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByCodeContractTester.java b/extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/ComparableByCodeContractTester.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByCodeContractTester.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/ComparableByCodeContractTester.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByDescriptionContractTestAbstract_compareTo.java b/extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/ComparableByDescriptionContractTestAbstract_compareTo.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByDescriptionContractTestAbstract_compareTo.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/ComparableByDescriptionContractTestAbstract_compareTo.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByDescriptionContractTester.java b/extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/ComparableByDescriptionContractTester.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByDescriptionContractTester.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/ComparableByDescriptionContractTester.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByNameContractTestAbstract_compareTo.java b/extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/ComparableByNameContractTestAbstract_compareTo.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByNameContractTestAbstract_compareTo.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/ComparableByNameContractTestAbstract_compareTo.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByNameContractTester.java b/extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/ComparableByNameContractTester.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByNameContractTester.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/ComparableByNameContractTester.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByReferenceContractTestAbstract_compareTo.java b/extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/ComparableByReferenceContractTestAbstract_compareTo.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByReferenceContractTestAbstract_compareTo.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/ComparableByReferenceContractTestAbstract_compareTo.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByReferenceContractTester.java b/extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/ComparableByReferenceContractTester.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByReferenceContractTester.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/ComparableByReferenceContractTester.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByTitleContractTestAbstract_compareTo.java b/extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/ComparableByTitleContractTestAbstract_compareTo.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByTitleContractTestAbstract_compareTo.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/ComparableByTitleContractTestAbstract_compareTo.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByTitleContractTester.java b/extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/ComparableByTitleContractTester.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/ComparableByTitleContractTester.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/ComparableByTitleContractTester.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByCode.java b/extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByCode.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByCode.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByCode.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByDescription.java b/extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByDescription.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByDescription.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByDescription.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByName.java b/extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByName.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByName.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByName.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByReference.java b/extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByReference.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByReference.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/InstantiatorForComparableByReference.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/InstantiatorForWithStartDate.java b/extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/InstantiatorForWithStartDate.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/InstantiatorForWithStartDate.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/InstantiatorForWithStartDate.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/WithFieldUniqueContractTestAllAbstract.java b/extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/WithFieldUniqueContractTestAllAbstract.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/WithFieldUniqueContractTestAllAbstract.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/WithFieldUniqueContractTestAllAbstract.java
diff --git a/extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/WithIntervalMutableContractTestAbstract_changeDates.java b/extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/WithIntervalMutableContractTestAbstract_changeDates.java
similarity index 100%
rename from extensions/lib/base/impl/src/test/java-TODO/org/incode/module/unittestsupport/dom/with/WithIntervalMutableContractTestAbstract_changeDates.java
rename to extensions/lib/base/impl/src/test/java/org/incode/module/unittestsupport/dom/with/WithIntervalMutableContractTestAbstract_changeDates.java
[isis] 02/05: ISIS-2186: excel module now compiles,
at least (not yet tested at all).
Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
danhaywood pushed a commit to branch ISIS-2186
in repository https://gitbox.apache.org/repos/asf/isis.git
commit ca1ca74a9c08a9a72a465205eb7099f252bb07ef
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Thu Nov 21 18:36:51 2019 +0000
ISIS-2186: excel module now compiles, at least (not yet tested at all).
---
.../isis/applib/annotation/DomainObject.java | 2 +-
.../isisaddons/module/excel/dom/ExcelFixture.java | 7 +-
.../isisaddons/module/excel/dom/ExcelService.java | 5 +-
.../isisaddons/module/excel/dom/WorksheetSpec.java | 16 +--
.../module/excel/dom/util/ExcelConverter.java | 116 +++++++++------------
.../module/excel/dom/util/ExcelServiceImpl.java | 21 +++-
.../module/excel/dom/util/PivotUtils.java | 35 +++----
.../module/excel/dom/util/SheetPivoter.java | 42 ++++----
.../module/excel/dom/util/PivotUtilsTest.java | 11 +-
.../module/excel/dom/util/SheetPivoterTest.java | 11 +-
10 files changed, 137 insertions(+), 129 deletions(-)
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java
index 34e4134..391e992 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java
@@ -42,7 +42,7 @@ import org.apache.isis.applib.events.lifecycle.ObjectUpdatingEvent;
*
* @apiNote Meta annotation {@link Component} allows for the Spring framework to pick up (discover) the
* annotated type.
- * For more details see {@link org.apache.isis.config.beans.IsisBeanFactoryPostProcessorForSpring}.
+ * For more details see <code>org.apache.isis.config.beans.IsisBeanFactoryPostProcessorForSpring</code>
*/
@Inherited
@Target({ ElementType.TYPE, ElementType.ANNOTATION_TYPE })
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/ExcelFixture.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/ExcelFixture.java
index a9186c7..c8bff95 100644
--- a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/ExcelFixture.java
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/ExcelFixture.java
@@ -11,6 +11,7 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.io.Resources;
+import org.apache.isis.applib.services.inject.ServiceInjector;
import org.apache.isis.extensions.fixtures.fixturescripts.FixtureResultList;
import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScript;
import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScripts;
@@ -27,6 +28,7 @@ import org.apache.isis.applib.value.Blob;
import org.isisaddons.module.excel.dom.util.ExcelServiceImpl;
import lombok.Getter;
+import lombok.NoArgsConstructor;
import lombok.Setter;
/**
@@ -36,6 +38,7 @@ import lombok.Setter;
@DomainObject(
objectType = "isisexcel.ExcelFixture"
)
+@SuppressWarnings("CdiManagedBeanInconsistencyInspection")
public class ExcelFixture extends FixtureScript {
private final List<Class> classes;
@@ -115,7 +118,7 @@ public class ExcelFixture extends FixtureScript {
protected void execute(final ExecutionContext ec) {
final ExcelServiceImpl excelServiceImpl = new ExcelServiceImpl();
- serviceRegistry.injectServicesInto(excelServiceImpl);
+ serviceInjector.injectServicesInto(excelServiceImpl);
if (blob == null){
byte[] bytes = getBytes();
@@ -215,6 +218,6 @@ public class ExcelFixture extends FixtureScript {
@javax.inject.Inject
private BookmarkService bookmarkService;
@javax.inject.Inject
- private ServiceRegistry serviceRegistry;
+ private ServiceInjector serviceInjector;
}
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/ExcelService.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/ExcelService.java
index 8822d16..625e670 100644
--- a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/ExcelService.java
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/ExcelService.java
@@ -11,6 +11,7 @@ import javax.inject.Inject;
import com.google.common.collect.Lists;
+import org.apache.isis.applib.services.inject.ServiceInjector;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
@@ -55,7 +56,7 @@ public class ExcelService {
@PostConstruct
public void init(final Map<String,String> properties) {
excelServiceImpl = new ExcelServiceImpl();
- serviceRegistry.injectServicesInto(excelServiceImpl);
+ serviceInjector.injectServicesInto(excelServiceImpl);
}
// //////////////////////////////////////
@@ -227,6 +228,6 @@ public class ExcelService {
}
@Inject BookmarkService bookmarkService;
- @Inject ServiceRegistry serviceRegistry;
+ @Inject ServiceInjector serviceInjector;
}
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/WorksheetSpec.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/WorksheetSpec.java
index 63ec002..098ad26 100644
--- a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/WorksheetSpec.java
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/WorksheetSpec.java
@@ -1,7 +1,13 @@
package org.isisaddons.module.excel.dom;
+import lombok.Getter;
+import lombok.Setter;
+
import java.util.List;
+import javax.inject.Inject;
+
+import org.apache.isis.applib.services.inject.ServiceInjector;
import org.isisaddons.module.excel.dom.util.Mode;
public class WorksheetSpec {
@@ -19,9 +25,11 @@ public class WorksheetSpec {
Class<?> getCls();
- static class Default<T> implements RowFactory<T>, ServicesInjectorAware {
+ static class Default<T> implements RowFactory<T> {
private final Class<T> viewModelClass;
- private ServicesInjector servicesInjector;
+
+ @Inject @Setter
+ private ServiceInjector servicesInjector;
public Default(final Class<T> viewModelClass) {
this.viewModelClass = viewModelClass;
@@ -43,10 +51,6 @@ public class WorksheetSpec {
return viewModelClass;
}
- @Override
- public void setServicesInjector(final ServicesInjector servicesInjector) {
- this.servicesInjector = servicesInjector;
- }
}
}
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/ExcelConverter.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/ExcelConverter.java
index 71aecb1..38579ce 100644
--- a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/ExcelConverter.java
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/ExcelConverter.java
@@ -6,11 +6,10 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
+import java.util.*;
import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
import javax.annotation.Nullable;
@@ -20,21 +19,19 @@ import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+import org.apache.isis.applib.services.inject.ServiceInjector;
import org.apache.isis.metamodel.adapter.ObjectAdapter;
import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.metamodel.objectmanager.ObjectManager;
import org.apache.isis.metamodel.spec.ManagedObject;
import org.apache.isis.metamodel.spec.ObjectSpecification;
+import org.apache.isis.metamodel.spec.feature.Contributed;
import org.apache.isis.metamodel.spec.feature.ObjectAssociation;
import org.apache.isis.metamodel.spec.feature.OneToOneAssociation;
import org.apache.isis.metamodel.specloader.SpecificationLoader;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
-import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.CellStyle;
-import org.apache.poi.ss.usermodel.CreationHelper;
-import org.apache.poi.ss.usermodel.Row;
-import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.isis.applib.annotation.Where;
@@ -78,30 +75,27 @@ class ExcelConverter {
// //////////////////////////////////////
private final SpecificationLoader specificationLoader;
- private final AdapterManager adapterManager;
+ private final ObjectManager objectManager;
private final BookmarkService bookmarkService;
- private final ServicesInjector servicesInjector;
+ private final ServiceInjector serviceInjector;
ExcelConverter(
final SpecificationLoader specificationLoader,
- final AdapterManager adapterManager,
+ final ObjectManager objectManager,
final BookmarkService bookmarkService,
- final ServicesInjector servicesInjector) {
+ final ServiceInjector serviceInjector) {
this.specificationLoader = specificationLoader;
- this.adapterManager = adapterManager;
+ this.objectManager = objectManager;
this.bookmarkService = bookmarkService;
- this.servicesInjector = servicesInjector;
+ this.serviceInjector = serviceInjector;
}
// //////////////////////////////////////
File appendSheet(final List<WorksheetContent> worksheetContents, XSSFWorkbook workbook) throws IOException {
- final ImmutableSet<String> worksheetNames = FluentIterable.from(worksheetContents)
- .transform(new Function<WorksheetContent, String>() {
- @Nullable @Override public String apply(@Nullable final WorksheetContent worksheetContent) {
- return worksheetContent.getSpec().getSheetName();
- }
- }).toSet();
+ final Set<String> worksheetNames = worksheetContents.stream()
+ .map(x -> x.getSpec().getSheetName())
+ .collect(Collectors.toSet());
if(worksheetNames.size() < worksheetContents.size()) {
throw new IllegalArgumentException("Sheet names must have distinct names");
}
@@ -134,18 +128,17 @@ class ExcelConverter {
final ObjectSpecification objectSpec = specificationLoader.loadSpecification(factory.getCls());
- final List<ManagedObject> adapters = Lists.transform(domainObjects, ObjectAdapter.Functions.adapterForUsing(adapterManager));
+ final List<ManagedObject> adapters = domainObjects.stream().map(objectManager::adapt).collect(Collectors.toList());
- @SuppressWarnings("deprecation")
- final List<? extends ObjectAssociation> propertyList = objectSpec.getAssociations(VISIBLE_PROPERTIES);
+ final List<ObjectAssociation> propertyList = objectSpec.streamAssociations(Contributed.INCLUDED)
+ .filter(VISIBLE_PROPERTIES)
+ .collect(Collectors.toList());
List<ObjectAssociation> annotatedAsHyperlink = new ArrayList<>();
for (Field f : fieldsAnnotatedWith(factory.getCls(), HyperLink.class)){
- for (ObjectAssociation oa :propertyList){
- if (oa.getId().equals(f.getName())){
- annotatedAsHyperlink.add(oa);
- }
- }
+ propertyList.stream()
+ .filter(oa -> Objects.equals(oa.getId(), f.getName()))
+ .forEach(annotatedAsHyperlink::add);
}
final Sheet sheet = ((Workbook) workbook).createSheet(sheetName);
@@ -224,10 +217,9 @@ class ExcelConverter {
final ObjectSpecification objectSpec = specificationLoader.loadSpecification(factory.getCls());
- final List<ObjectAdapter> adapters = Lists.transform(domainObjects, ObjectAdapter.Functions.adapterForUsing(adapterManager));
-
- @SuppressWarnings("deprecation")
- final List<? extends ObjectAssociation> propertyList = objectSpec.getAssociations(VISIBLE_PROPERTIES);
+ final List<ObjectAssociation> propertyList = objectSpec.streamAssociations(Contributed.INCLUDED)
+ .filter(VISIBLE_PROPERTIES)
+ .collect(Collectors.toList());
// Validate the annotations for pivot
validateAnnotations(propertyList, factory.getCls());
@@ -366,11 +358,7 @@ class ExcelConverter {
final WorksheetSpec worksheetSpec) {
final WorksheetSpec.RowFactory<Object> factory = worksheetSpec.getFactory();
- if(factory instanceof ServicesInjectorAware) {
- final ServicesInjectorAware servicesInjectorAware = (ServicesInjectorAware) factory;
- servicesInjectorAware.setServicesInjector(this.servicesInjector);
-
- }
+ this.serviceInjector.injectServicesInto(factory);
final Class<T> cls = (Class<T>) factory.getCls();
final String sheetName = worksheetSpec.getSheetName();
@@ -393,7 +381,7 @@ class ExcelConverter {
for (final Cell cell : row) {
try{
- if (cell.getCellType() != Cell.CELL_TYPE_BLANK) {
+ if (cell.getCellType() != CellType.BLANK) {
final int columnIndex = cell.getColumnIndex();
final String propertyName = cellMarshaller.getStringCellValue(cell);
final OneToOneAssociation property = getAssociation(objectSpec, propertyName);
@@ -419,7 +407,7 @@ class ExcelConverter {
// Let's require at least one column to be not null for detecting a blank row.
// Excel can have physical rows with cells empty that it seem do not existent for the user.
- ObjectAdapter templateAdapter = null;
+ ManagedObject templateAdapter = null;
T imported = null;
for (final Cell cell : row) {
@@ -441,9 +429,9 @@ class ExcelConverter {
importedEnhanced.setExcelSheetName(sheetName);
imported = (T) importedEnhanced;
}
- templateAdapter = this.adapterManager.adapterFor(imported);
+ templateAdapter = this.objectManager.adapt(imported);
}
- final ObjectAdapter valueAdapter = this.adapterManager.adapterFor(value);
+ final ManagedObject valueAdapter = this.objectManager.adapt(value);
otoa.set(templateAdapter, valueAdapter, InteractionInitiatedBy.USER);
}
} else {
@@ -462,13 +450,17 @@ class ExcelConverter {
}
}
- // we need to remove the templateAdapter because earlier on we will have created an adapter (and corresponding OID)
- // for a view model where the OID is initially computed on the incomplete (in fact, empty) view model.
- // removing the adapter therefore removes the OID as well, so next time an adapter is needed for the view model
- // the OID will be recomputed based on the fully populated view model pojo.
- if(templateAdapter != null) {
- this.adapterManager.removeAdapter(templateAdapter);
- }
+ //
+ // TODO: v2: to review... there is no longer an API to remove adapters.
+ // However, my hope is that it isn't needed, because we no longer maintain an oid <-> adapter map.
+ //
+// // we need to remove the templateAdapter because earlier on we will have created an adapter (and corresponding OID)
+// // for a view model where the OID is initially computed on the incomplete (in fact, empty) view model.
+// // removing the adapter therefore removes the OID as well, so next time an adapter is needed for the view model
+// // the OID will be recomputed based on the fully populated view model pojo.
+// if(templateAdapter != null) {
+// this.objectManager.removeAdapter(templateAdapter);
+// }
if (imported != null) {
importedItems.add(imported);
@@ -518,18 +510,14 @@ class ExcelConverter {
}
private static OneToOneAssociation getAssociation(final ObjectSpecification objectSpec, final String propertyNameOrId) {
- final List<ObjectAssociation> associations = objectSpec.getAssociations(Contributed.INCLUDED);
- for (final ObjectAssociation association : associations) {
- if (association instanceof OneToOneAssociation) {
- if (propertyNameOrId.equalsIgnoreCase(association.getName())) {
- return (OneToOneAssociation) association;
- }
- if (propertyNameOrId.equalsIgnoreCase(association.getId())) {
- return (OneToOneAssociation) association;
- }
- }
- }
- return null;
+ final Stream<ObjectAssociation> associations = objectSpec.streamAssociations(Contributed.INCLUDED);
+ return associations
+ .filter(OneToOneAssociation.class::isInstance)
+ .map(OneToOneAssociation.class::cast)
+ .filter(association -> propertyNameOrId.equalsIgnoreCase(association.getName())
+ || propertyNameOrId.equalsIgnoreCase(association.getId()))
+ .findFirst()
+ .orElse(null);
}
static class Property {
@@ -591,13 +579,13 @@ class ExcelConverter {
final short dateFormat = createHelper.createDataFormat().getFormat("yyyy-mm-dd");
final CellStyle dateCellStyle = wb.createCellStyle();
dateCellStyle.setDataFormat(dateFormat);
- dateCellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_TOP);
+ dateCellStyle.setVerticalAlignment(VerticalAlignment.TOP);
return dateCellStyle;
}
protected CellStyle defaultCellStyle(final Workbook wb) {
final CellStyle defaultCellStyle = wb.createCellStyle();
- defaultCellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_TOP);
+ defaultCellStyle.setVerticalAlignment(VerticalAlignment.TOP);
return defaultCellStyle;
}
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/ExcelServiceImpl.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/ExcelServiceImpl.java
index 45757bd..b0ecaab 100644
--- a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/ExcelServiceImpl.java
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/ExcelServiceImpl.java
@@ -1,11 +1,20 @@
package org.isisaddons.module.excel.dom.util;
+import lombok.SneakyThrows;
+
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collections;
import java.util.List;
-
+import java.util.function.Supplier;
+
+import org.apache.isis.applib.services.inject.ServiceInjector;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
+import org.apache.isis.metamodel.objectmanager.ObjectManager;
+import org.apache.isis.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.runtime.system.context.session.RuntimeContextBase;
+import org.apache.isis.runtime.system.session.IsisSession;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.isis.applib.annotation.Programmatic;
@@ -212,8 +221,10 @@ public class ExcelServiceImpl {
}
}
+ @SneakyThrows
private ExcelConverter newExcelConverter() {
- return new ExcelConverter(getSpecificationLoader(), getPersistenceSession(), bookmarkService, isisSessionFactory.getServicesInjector());
+ final ObjectManager objectManager = IsisSession.current().map(RuntimeContextBase::getObjectManager).orElseThrow((Supplier<Throwable>) _Exceptions::unexpectedCodeReach);
+ return new ExcelConverter(specificationLoader, objectManager, bookmarkService, serviceInjector);
}
@@ -223,6 +234,12 @@ public class ExcelServiceImpl {
@javax.inject.Inject
BookmarkService bookmarkService;
+ @javax.inject.Inject
+ SpecificationLoader specificationLoader;
+
+ @javax.inject.Inject
+ ServiceInjector serviceInjector;
+
// @javax.inject.Inject
// IsisSessionFactory isisSessionFactory;
//
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/PivotUtils.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/PivotUtils.java
index 8efb137..1c2612e 100644
--- a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/PivotUtils.java
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/PivotUtils.java
@@ -3,6 +3,7 @@ package org.isisaddons.module.excel.dom.util;
import java.util.List;
import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.isisaddons.module.excel.dom.AggregationType;
@@ -46,35 +47,33 @@ public class PivotUtils {
if (cell != null && other != null && cell.getCellType() == other.getCellType()) {
switch (cell.getCellType()) {
- case Cell.CELL_TYPE_BLANK:
- if (other.getCellType()==Cell.CELL_TYPE_BLANK){
+ case BLANK:
+ if (other.getCellType()==CellType.BLANK) {
return true;
}
break;
- case Cell.CELL_TYPE_BOOLEAN:
+ case BOOLEAN:
if (cell.getBooleanCellValue() == other.getBooleanCellValue()){
return true;
}
break;
- case Cell.CELL_TYPE_ERROR:
+ case ERROR:
if (cell.getErrorCellValue() == other.getErrorCellValue()){
return true;
}
break;
- case Cell.CELL_TYPE_FORMULA:
+ case FORMULA:
break;
- case Cell.CELL_TYPE_NUMERIC:
+ case NUMERIC:
if (cell.getNumericCellValue() == other.getNumericCellValue()){
return true;
}
break;
- case Cell.CELL_TYPE_STRING:
+ case STRING:
if (cell.getStringCellValue().equals(other.getStringCellValue())){
return true;
}
-
}
-
}
return false;
@@ -86,7 +85,7 @@ public class PivotUtils {
return target;
}
- if (target.getCellType()==Cell.CELL_TYPE_NUMERIC && source.getCellType()==Cell.CELL_TYPE_NUMERIC ){
+ if (target.getCellType()==CellType.NUMERIC && source.getCellType()==CellType.NUMERIC ){
double val1 = target.getNumericCellValue();
double val2 = source.getNumericCellValue();
target.setCellValue(val1+val2);
@@ -115,26 +114,24 @@ public class PivotUtils {
target.setHyperlink(source.getHyperlink());
}
- // Set the cell data type
- target.setCellType(source.getCellType());
-
// Set the cell data value
switch (source.getCellType()) {
- case Cell.CELL_TYPE_BLANK:
+ case BLANK:
+ target.setBlank();
break;
- case Cell.CELL_TYPE_BOOLEAN:
+ case BOOLEAN:
target.setCellValue(source.getBooleanCellValue());
break;
- case Cell.CELL_TYPE_ERROR:
+ case ERROR:
target.setCellErrorValue(source.getErrorCellValue());
break;
- case Cell.CELL_TYPE_FORMULA:
+ case FORMULA:
target.setCellFormula(source.getCellFormula());
break;
- case Cell.CELL_TYPE_NUMERIC:
+ case NUMERIC:
target.setCellValue(source.getNumericCellValue());
break;
- case Cell.CELL_TYPE_STRING:
+ case STRING:
target.setCellValue(source.getRichStringCellValue());
break;
}
diff --git a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/SheetPivoter.java b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/SheetPivoter.java
index e87571c..4cbbe28 100644
--- a/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/SheetPivoter.java
+++ b/extensions/lib/excel/impl/src/main/java/org/isisaddons/module/excel/dom/util/SheetPivoter.java
@@ -7,11 +7,7 @@ import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.util.HSSFColor;
-import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.CellStyle;
-import org.apache.poi.ss.usermodel.Font;
-import org.apache.poi.ss.usermodel.Row;
-import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellReference;
import org.isisaddons.module.excel.dom.AggregationType;
@@ -59,9 +55,9 @@ public class SheetPivoter {
final static int columnLabelOffsetY = 0; // top row used for pivot
//some styling
- final static short fieldnameBgColorIndex = HSSFColor.GREY_25_PERCENT.index;
- final static short columnHeaderValueBgColorIndex = HSSFColor.GREY_40_PERCENT.index;
- final static short sumBgColorIndex = HSSFColor.GREY_25_PERCENT.index;
+ final static short fieldnameBgColorIndex = HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex();
+ final static short columnHeaderValueBgColorIndex = HSSFColor.HSSFColorPredefined.GREY_40_PERCENT.getIndex();
+ final static short sumBgColorIndex = HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex();
static CellStyle fieldNameStyle;
static CellStyle columnHeaderValueStyle;
static CellStyle rowSumStyle;
@@ -205,11 +201,11 @@ public class SheetPivoter {
cell.setCellValue("(empty)");
return cell;
}
- if (cell.getCellType()==Cell.CELL_TYPE_BLANK){
+ if (cell.getCellType()== CellType.BLANK){
cell.setCellValue("(empty)");
return cell;
}
- if (cell.getCellType()==Cell.CELL_TYPE_STRING && cell.getStringCellValue().equals("")){
+ if (cell.getCellType()==CellType.STRING && cell.getStringCellValue().equals("")){
cell.setCellValue("(empty)");
}
return cell;
@@ -221,8 +217,8 @@ public class SheetPivoter {
for (AnnotationTriplet at : annotations.getByAnnotation_OrderBy_OrderAscending("value")){
for (srCnt = SourceLayOut.VALUES_START_AT_ROWNUMBER; srCnt <= sourceSheet.getLastRowNum(); srCnt++){
Cell c = sourceSheet.getRow(srCnt).getCell(at.getColnumber());
- if (c != null && c.getCellType()!=Cell.CELL_TYPE_BLANK){
- if (c.getCellType()!=Cell.CELL_TYPE_NUMERIC) {
+ if (c != null && c.getCellType()!=CellType.BLANK){
+ if (c.getCellType()!=CellType.NUMERIC) {
badData = true;
continue;
}
@@ -424,7 +420,7 @@ public class SheetPivoter {
// copy or add value to target cell
Cell valueCellSource = sourceSheet.getRow(rowInSource).getCell(colInSource);
Cell valueCellTarget = targetSheet.getRow(rowInTarget).getCell(colPosTarget);
- if (valueCellSource!=null && (valueCellTarget== null || valueCellTarget.getCellType()==Cell.CELL_TYPE_BLANK)){
+ if (valueCellSource!=null && (valueCellTarget== null || valueCellTarget.getCellType()==CellType.BLANK)){
valueCellTarget = targetSheet.getRow(rowInTarget).createCell(colPosTarget);
switch (type) {
case SUM:
@@ -569,33 +565,33 @@ public class SheetPivoter {
private void defineSomeCellStyles() {
TargetLayOut.boldFont= targetSheet.getWorkbook().createFont();
- TargetLayOut.boldFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
+ TargetLayOut.boldFont.setBold(true);
TargetLayOut.fieldNameStyle = targetSheet.getWorkbook().createCellStyle();
TargetLayOut.fieldNameStyle.setFillForegroundColor(TargetLayOut.fieldnameBgColorIndex);
- TargetLayOut.fieldNameStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
+ TargetLayOut.fieldNameStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
TargetLayOut.fieldNameStyle.setFont(TargetLayOut.boldFont);
TargetLayOut.columnHeaderValueStyle = targetSheet.getWorkbook().createCellStyle();
TargetLayOut.columnHeaderValueStyle.setFillForegroundColor(TargetLayOut.columnHeaderValueBgColorIndex);
- TargetLayOut.columnHeaderValueStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
+ TargetLayOut.columnHeaderValueStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
TargetLayOut.columnHeaderValueStyle.setFont(TargetLayOut.boldFont);
TargetLayOut.rowSumStyle = targetSheet.getWorkbook().createCellStyle();
- TargetLayOut.rowSumStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
+ TargetLayOut.rowSumStyle.setBorderLeft(BorderStyle.THIN);
TargetLayOut.rowSumStyle.setFillForegroundColor(TargetLayOut.sumBgColorIndex);
- TargetLayOut.rowSumStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
+ TargetLayOut.rowSumStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
TargetLayOut.columSumStyle = targetSheet.getWorkbook().createCellStyle();
- TargetLayOut.columSumStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
+ TargetLayOut.columSumStyle.setBorderTop(BorderStyle.THIN);
TargetLayOut.columSumStyle.setFillForegroundColor(TargetLayOut.sumBgColorIndex);
- TargetLayOut.columSumStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
+ TargetLayOut.columSumStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
TargetLayOut.totalSumStyle = targetSheet.getWorkbook().createCellStyle();
- TargetLayOut.totalSumStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
- TargetLayOut.totalSumStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
+ TargetLayOut.totalSumStyle.setBorderTop(BorderStyle.THIN);
+ TargetLayOut.totalSumStyle.setBorderLeft(BorderStyle.THIN);
TargetLayOut.totalSumStyle.setFillForegroundColor(TargetLayOut.sumBgColorIndex);
- TargetLayOut.totalSumStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
+ TargetLayOut.totalSumStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
}
}
diff --git a/extensions/lib/excel/impl/src/test/java/org/isisaddons/module/excel/dom/util/PivotUtilsTest.java b/extensions/lib/excel/impl/src/test/java/org/isisaddons/module/excel/dom/util/PivotUtilsTest.java
index ae87b39..b41cffc 100644
--- a/extensions/lib/excel/impl/src/test/java/org/isisaddons/module/excel/dom/util/PivotUtilsTest.java
+++ b/extensions/lib/excel/impl/src/test/java/org/isisaddons/module/excel/dom/util/PivotUtilsTest.java
@@ -5,6 +5,7 @@ import java.util.List;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
@@ -100,9 +101,9 @@ public class PivotUtilsTest {
// when (type not equal)
c1 = r.createCell(0);
- c1.setCellType(Cell.CELL_TYPE_BLANK);
+ c1.setCellType(CellType.BLANK);
c2 = r.createCell(1);
- c2.setCellType(Cell.CELL_TYPE_BOOLEAN);
+ c2.setCellType(CellType.BOOLEAN);
// then
Assertions.assertThat(PivotUtils.cellValueEquals(c1,c2)).isEqualTo(false);
@@ -142,7 +143,7 @@ public class PivotUtilsTest {
c1 = r.createCell(0);
c2 = r.createCell(1);
c1.setCellValue("a");
- c2.setCellType(Cell.CELL_TYPE_NUMERIC);
+ c2.setCellType(CellType.NUMERIC);
// then
Assertions.assertThat(PivotUtils.cellValueEquals(c1,c2)).isEqualTo(false);
@@ -173,7 +174,7 @@ public class PivotUtilsTest {
// when 0 (false) 1 (true) value in boolean cell supported
c1.setCellValue(true);
c2.setCellValue(1);
- c2.setCellType(Cell.CELL_TYPE_BOOLEAN);
+ c2.setCellType(CellType.BOOLEAN);
// then
Assertions.assertThat(PivotUtils.cellValueEquals(c1,c2)).isEqualTo(true);
@@ -255,7 +256,7 @@ public class PivotUtilsTest {
// then
Assertions.assertThat(cTarget).isEqualTo(cSource);
- Assertions.assertThat(cTarget.getCellType()).isEqualTo(Cell.CELL_TYPE_BLANK);
+ Assertions.assertThat(cTarget.getCellType()).isEqualTo(CellType.BLANK);
// given source has a value
cSource = r.createCell(1);
diff --git a/extensions/lib/excel/impl/src/test/java/org/isisaddons/module/excel/dom/util/SheetPivoterTest.java b/extensions/lib/excel/impl/src/test/java/org/isisaddons/module/excel/dom/util/SheetPivoterTest.java
index c239df8..21b0b6a 100644
--- a/extensions/lib/excel/impl/src/test/java/org/isisaddons/module/excel/dom/util/SheetPivoterTest.java
+++ b/extensions/lib/excel/impl/src/test/java/org/isisaddons/module/excel/dom/util/SheetPivoterTest.java
@@ -4,6 +4,7 @@ import java.util.Arrays;
import java.util.List;
import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
@@ -33,7 +34,7 @@ public class SheetPivoterTest {
// when
Cell c = targetSheet.createRow(0).createCell(0);
- c.setCellValue(Cell.CELL_TYPE_BLANK);
+ c.setBlank();
// then
// ************** NOTE ***************************************************************************
@@ -49,7 +50,7 @@ public class SheetPivoterTest {
// then still
Assertions.assertThat(targetSheet.getRow(0).getLastCellNum()).isEqualTo((short)1); // NOTE !!!!!!!
- Assertions.assertThat(c.getCellType()).isEqualTo(Cell.CELL_TYPE_STRING);
+ Assertions.assertThat(c.getCellType()).isEqualTo(CellType.STRING);
// and when
targetSheet.getRow(0).createCell(1).setCellValue("b");
@@ -81,8 +82,8 @@ public class SheetPivoterTest {
testRow(0, "fn3", null);
testRow(1, "fn1", null);
// last row is for summing
- Assertions.assertThat(targetSheet.getRow(2).getCell(0).getCellType()).isEqualTo(Cell.CELL_TYPE_BLANK);
- Assertions.assertThat(targetSheet.getRow(2).getCell(1).getCellType()).isEqualTo(Cell.CELL_TYPE_FORMULA);
+ Assertions.assertThat(targetSheet.getRow(2).getCell(0).getCellType()).isEqualTo(CellType.BLANK);
+ Assertions.assertThat(targetSheet.getRow(2).getCell(1).getCellType()).isEqualTo(CellType.FORMULA);
Assertions.assertThat(targetSheet.getRow(2).getCell(1).getCellFormula()).isEqualTo("SUM(B3:B2)");
}
@@ -435,7 +436,7 @@ public class SheetPivoterTest {
if (c == null) {
// OK skip
} else {
- if (c.getCellType() == Cell.CELL_TYPE_NUMERIC) {
+ if (c.getCellType() == CellType.NUMERIC) {
Assertions.assertThat(c.getNumericCellValue()).isEqualTo(null);
} else {
Assertions.assertThat(c.getStringCellValue()).isEqualTo("");
[isis] 05/05: ISIS-2186: adds fakedata/dom, fixes compile issues
Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
danhaywood pushed a commit to branch ISIS-2186
in repository https://gitbox.apache.org/repos/asf/isis.git
commit 53146aa7a9294d68d13efd795c6ed6b7f0335221
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Sun Nov 24 08:51:10 2019 +0000
ISIS-2186: adds fakedata/dom, fixes compile issues
---
extensions/lib/fakedata/impl/pom.xml | 107 +++------------------
.../isisaddons/module/fakedata/FakeDataModule.java | 45 +--------
.../isisaddons/module/fakedata/dom/Addresses.java | 21 +---
.../org/isisaddons/module/fakedata/dom/Books.java | 6 +-
.../isisaddons/module/fakedata/dom/Booleans.java | 4 -
.../module/fakedata/dom/Collections.java | 11 +--
.../org/isisaddons/module/fakedata/dom/Comms.java | 9 +-
.../module/fakedata/dom/CreditCards.java | 2 +-
.../isisaddons/module/fakedata/dom/Doubles.java | 6 +-
.../module/fakedata/dom/FakeDataService.java | 62 ++----------
.../org/isisaddons/module/fakedata/dom/Floats.java | 4 +-
.../isisaddons/module/fakedata/dom/Integers.java | 2 +-
.../isisaddons/module/fakedata/dom/IsisBlobs.java | 23 ++---
.../isisaddons/module/fakedata/dom/IsisClobs.java | 20 ++--
.../org/isisaddons/module/fakedata/dom/Longs.java | 4 +-
.../org/isisaddons/module/fakedata/dom/Lorem.java | 9 +-
.../org/isisaddons/module/fakedata/dom/Names.java | 2 +-
.../org/isisaddons/module/fakedata/dom/Uuids.java | 2 -
.../module/fakedata/dom/FakeDataServiceTest.java | 8 +-
extensions/pom.xml | 1 +
20 files changed, 61 insertions(+), 287 deletions(-)
diff --git a/extensions/lib/fakedata/impl/pom.xml b/extensions/lib/fakedata/impl/pom.xml
index 5840197..4a41793 100644
--- a/extensions/lib/fakedata/impl/pom.xml
+++ b/extensions/lib/fakedata/impl/pom.xml
@@ -3,9 +3,9 @@
<modelVersion>4.0.0</modelVersion>
<parent>
- <groupId>org.incode</groupId>
- <artifactId>incode-parent</artifactId>
- <version>${revision}</version>
+ <groupId>org.apache.isis.extensions</groupId>
+ <artifactId>isis-extensions</artifactId>
+ <version>2.0.0-M3-SNAPSHOT</version>
<relativePath>../../../pom.xml</relativePath>
</parent>
@@ -21,8 +21,6 @@
<properties>
<jar-plugin.automaticModuleName>org.incode.platform.lib.fakedata</jar-plugin.automaticModuleName>
<git-plugin.propertiesDir>org/incode/platform/lib/fakedata</git-plugin.propertiesDir>
-
- <git-plugin.gitDir>${project.basedir}/../../../../.git</git-plugin.gitDir>
</properties>
<build>
@@ -38,118 +36,35 @@
</excludes>
</resource>
</resources>
- <plugins>
- <plugin>
- <groupId>com.github.odavid.maven.plugins</groupId>
- <artifactId>mixin-maven-plugin</artifactId>
- <version>0.1-alpha-39</version>
- <extensions>true</extensions>
- <configuration>
- <mixins>
- <mixin>
- <groupId>com.danhaywood.mavenmixin</groupId>
- <artifactId>enforcerrelaxed</artifactId>
- </mixin>
- <mixin>
- <groupId>com.danhaywood.mavenmixin</groupId>
- <artifactId>standard</artifactId>
- </mixin>
- <mixin>
- <groupId>com.danhaywood.mavenmixin</groupId>
- <artifactId>sourceandjavadoc</artifactId>
- </mixin>
- <mixin>
- <groupId>com.danhaywood.mavenmixin</groupId>
- <artifactId>surefire</artifactId>
- </mixin>
- </mixins>
- </configuration>
- </plugin>
- </plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.isis.core</groupId>
- <artifactId>isis-core-applib</artifactId>
+ <artifactId>isis-applib</artifactId>
</dependency>
<dependency>
<groupId>com.github.javafaker</groupId>
<artifactId>javafaker</artifactId>
</dependency>
<dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ </dependency>
+<!--
+ <dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
</dependency>
+-->
<!-- test -->
<dependency>
<groupId>org.apache.isis.core</groupId>
- <artifactId>isis-core-unittestsupport</artifactId>
+ <artifactId>isis-unittestsupport</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
- <profiles>
- <profile>
- <id>git</id>
- <activation>
- <property>
- <name>!skip.git</name>
- </property>
- </activation>
- <build>
- <plugins>
- <plugin>
- <groupId>pl.project13.maven</groupId>
- <artifactId>git-commit-id-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
- </profile>
- <profile>
- <id>flatten</id>
- <activation>
- <property>
- <name>revision</name>
- </property>
- </activation>
- <build>
- <plugins>
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>flatten-maven-plugin</artifactId>
- <version>1.0.0</version>
- <executions>
- <execution>
- <id>flatten</id>
- <phase>process-resources</phase>
- <goals>
- <goal>flatten</goal>
- </goals>
- <configuration>
- <flattenMode>defaults</flattenMode>
- <updatePomFile>true</updatePomFile>
- <pomElements>
- <name>resolve</name>
- <description>resolve</description>
- <dependencies>resolve</dependencies>
- </pomElements>
- </configuration>
- </execution>
- <execution>
- <id>flatten.clean</id>
- <phase>clean</phase>
- <goals>
- <goal>clean</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
- </profile>
- </profiles>
-
</project>
diff --git a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/FakeDataModule.java b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/FakeDataModule.java
index 90d2702..a2b2ac3 100644
--- a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/FakeDataModule.java
+++ b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/FakeDataModule.java
@@ -1,46 +1,9 @@
package org.isisaddons.module.fakedata;
-import java.util.List;
+public class FakeDataModule {
-import javax.xml.bind.annotation.XmlRootElement;
+ public abstract static class ActionDomainEvent<S> extends org.apache.isis.applib.events.domain.ActionDomainEvent<S> {}
+ public abstract static class CollectionDomainEvent<S,T> extends org.apache.isis.applib.events.domain.CollectionDomainEvent<S,T> {}
+ public abstract static class PropertyDomainEvent<S,T> extends org.apache.isis.applib.events.domain.PropertyDomainEvent<S,T> { }
-import org.apache.isis.applib.Identifier;
-import org.apache.isis.applib.ModuleAbstract;
-
-@XmlRootElement(name = "module")
-public class FakeDataModule extends ModuleAbstract {
-
- public abstract static class ActionDomainEvent<S> extends org.apache.isis.applib.services.eventbus.ActionDomainEvent<S> {
- public ActionDomainEvent(final S source, final Identifier identifier) {
- super(source, identifier);
- }
-
- public ActionDomainEvent(final S source, final Identifier identifier, final Object... arguments) {
- super(source, identifier, arguments);
- }
-
- public ActionDomainEvent(final S source, final Identifier identifier, final List<Object> arguments) {
- super(source, identifier, arguments);
- }
- }
-
- public abstract static class CollectionDomainEvent<S,T> extends org.apache.isis.applib.services.eventbus.CollectionDomainEvent<S,T> {
- public CollectionDomainEvent(final S source, final Identifier identifier, final Of of) {
- super(source, identifier, of);
- }
-
- public CollectionDomainEvent(final S source, final Identifier identifier, final Of of, final T value) {
- super(source, identifier, of, value);
- }
- }
-
- public abstract static class PropertyDomainEvent<S,T> extends org.apache.isis.applib.services.eventbus.PropertyDomainEvent<S,T> {
- public PropertyDomainEvent(final S source, final Identifier identifier) {
- super(source, identifier);
- }
-
- public PropertyDomainEvent(final S source, final Identifier identifier, final T oldValue, final T newValue) {
- super(source, identifier, oldValue, newValue);
- }
- }
}
diff --git a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Addresses.java b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Addresses.java
index 971ec56..ab6d32d 100644
--- a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Addresses.java
+++ b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Addresses.java
@@ -1,80 +1,63 @@
package org.isisaddons.module.fakedata.dom;
-import org.apache.isis.applib.annotation.Programmatic;
-
public class Addresses extends AbstractRandomValueGenerator {
com.github.javafaker.Address javaFakerAddress;
Addresses(final FakeDataService fakeDataService) {
super(fakeDataService);
- javaFakerAddress = new com.github.javafaker.Address(
- fakeDataService.name().javaFakerName,
- fakeDataService.fakeValuesService,
- fakeDataService.randomService);
+ ;
+ javaFakerAddress = fakeDataService.javaFaker().address();
}
- @Programmatic
public String streetName() {
return javaFakerAddress.streetName();
}
- @Programmatic
public String streetAddressNumber() {
return javaFakerAddress.streetAddressNumber();
}
- @Programmatic
public String streetAddress() {
return javaFakerAddress.streetAddress(false);
}
- @Programmatic
public String streetAddressWithSecondary() {
return javaFakerAddress.streetAddress(true);
}
- @Programmatic
public String usZipCode() {
return javaFakerAddress.zipCode();
}
- @Programmatic
public String streetSuffix() {
return javaFakerAddress.streetSuffix();
}
- @Programmatic
public String citySuffix() {
return javaFakerAddress.citySuffix();
}
- @Programmatic
public String cityPrefix() {
return javaFakerAddress.cityPrefix();
}
- @Programmatic
public String city() {
return cityPrefix() + " " + fake.name().firstName() + " " + citySuffix();
}
- @Programmatic
public String usStateAbbr() {
return javaFakerAddress.stateAbbr();
}
- @Programmatic
public String country() {
return javaFakerAddress.country();
}
- @Programmatic
public String latitude() {
return javaFakerAddress.latitude();
}
- @Programmatic
public String longitude() {
return javaFakerAddress.longitude();
}
diff --git a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Books.java b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Books.java
index 7201bc8..bdbfcdf 100644
--- a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Books.java
+++ b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Books.java
@@ -1,22 +1,18 @@
package org.isisaddons.module.fakedata.dom;
-import org.apache.isis.applib.annotation.Programmatic;
-
public class Books extends AbstractRandomValueGenerator {
com.github.javafaker.Code javaFakerCode;
Books(final FakeDataService fakeDataService) {
super(fakeDataService);
- javaFakerCode = new com.github.javafaker.Code(fakeDataService.randomService);
+ javaFakerCode = fakeDataService.javaFaker().code();
}
- @Programmatic
public String isbn10() {
return javaFakerCode.isbn10();
}
- @Programmatic
public String isbn13() {
return javaFakerCode.isbn13();
}
diff --git a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Booleans.java b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Booleans.java
index 11d8707..0f5c53c 100644
--- a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Booleans.java
+++ b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Booleans.java
@@ -11,7 +11,6 @@ public class Booleans extends AbstractRandomValueGenerator {
/**
* Same as {@link #any()}.
*/
- @Programmatic
public boolean coinFlip() {
return any();
}
@@ -19,17 +18,14 @@ public class Booleans extends AbstractRandomValueGenerator {
/**
* Same as {@link #any()}.
*/
- @Programmatic
public boolean either() {
return any();
}
- @Programmatic
public boolean diceRollOf6() {
return fake.ints().upTo(6) == 5;
}
- @Programmatic
public boolean any() {
return fake.randomService.nextDouble() < 0.5;
}
diff --git a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Collections.java b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Collections.java
index 07e1d03..00308a2 100644
--- a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Collections.java
+++ b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Collections.java
@@ -3,8 +3,7 @@ package org.isisaddons.module.fakedata.dom;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.Callable;
-
-import com.google.common.base.Predicate;
+import java.util.function.Predicate;
import org.apache.isis.applib.annotation.Programmatic;
@@ -46,19 +45,19 @@ public class Collections extends AbstractRandomValueGenerator{
@Deprecated
@Programmatic
public <T> T randomBounded(final Class<T> cls) {
- final List<T> list = fake.container.allInstances(cls);
+ final List<T> list = fake.repositoryService.allInstances(cls);
return anyOf(list);
}
@Programmatic
public <T> T anyBounded(final Class<T> cls) {
- final List<T> list = fake.container.allInstances(cls);
+ final List<T> list = fake.repositoryService.allInstances(cls);
return anyOf(list);
}
@Programmatic
public <T> T anyBoundedExcept(final Class<T> cls, final Predicate<T> except) {
- final List<T> list = fake.container.allInstances(cls);
+ final List<T> list = fake.repositoryService.allInstances(cls);
return anyOfExcept(list, except);
}
@@ -264,7 +263,7 @@ public class Collections extends AbstractRandomValueGenerator{
} catch (Exception e1) {
throw new RuntimeException("Problem finding candidate values");
}
- if(!except.apply(e)) {
+ if(!except.test(e)) {
return e;
}
}
diff --git a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Comms.java b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Comms.java
index b3c2134..fac34d2 100644
--- a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Comms.java
+++ b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Comms.java
@@ -1,7 +1,5 @@
package org.isisaddons.module.fakedata.dom;
-import org.apache.isis.applib.annotation.Programmatic;
-
public class Comms extends AbstractRandomValueGenerator {
final com.github.javafaker.Internet javaFakerInternet;
@@ -10,21 +8,18 @@ public class Comms extends AbstractRandomValueGenerator {
Comms(final FakeDataService fakeDataService) {
super(fakeDataService);
final com.github.javafaker.Name name = fakeDataService.name().javaFakerName;
- javaFakerInternet = new com.github.javafaker.Internet(name, fakeDataService.fakeValuesService);
- javaFakerPhoneNumber = new com.github.javafaker.PhoneNumber(fakeDataService.fakeValuesService);
+ javaFakerInternet = fakeDataService.javaFaker().internet();
+ javaFakerPhoneNumber = fakeDataService.javaFaker().phoneNumber();
}
- @Programmatic
public String emailAddress() {
return javaFakerInternet.emailAddress();
}
- @Programmatic
public String url() {
return javaFakerInternet.url();
}
- @Programmatic
public String phoneNumber() {
return javaFakerPhoneNumber.phoneNumber();
}
diff --git a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/CreditCards.java b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/CreditCards.java
index e403e62..b31789a 100644
--- a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/CreditCards.java
+++ b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/CreditCards.java
@@ -9,7 +9,7 @@ public class CreditCards extends AbstractRandomValueGenerator {
CreditCards(final FakeDataService fakeDataService, final FakeValuesService fakeValuesService) {
super(fakeDataService);
- javaFakerBusiness = new com.github.javafaker.Business(fakeValuesService);
+ javaFakerBusiness = fakeDataService.javaFaker().business();
}
@Programmatic
diff --git a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Doubles.java b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Doubles.java
index ab55f30..0c77d29 100644
--- a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Doubles.java
+++ b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Doubles.java
@@ -1,6 +1,6 @@
package org.isisaddons.module.fakedata.dom;
-import org.apache.commons.lang.math.RandomUtils;
+import org.apache.commons.lang3.RandomUtils;
import org.apache.isis.applib.annotation.Programmatic;
public class Doubles extends AbstractRandomValueGenerator {
@@ -12,8 +12,8 @@ public class Doubles extends AbstractRandomValueGenerator {
@Programmatic
public double any() {
return fake.booleans().coinFlip()
- ? RandomUtils.nextDouble(fake.random) * Double.MAX_VALUE
- : -RandomUtils.nextDouble(fake.random) * Double.MAX_VALUE;
+ ? RandomUtils.nextDouble() * Double.MAX_VALUE
+ : -RandomUtils.nextDouble() * Double.MAX_VALUE;
}
public double upTo(final double max) {
diff --git a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/FakeDataService.java b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/FakeDataService.java
index 476d806..0b49244 100644
--- a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/FakeDataService.java
+++ b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/FakeDataService.java
@@ -7,12 +7,13 @@ import javax.inject.Inject;
import com.github.javafaker.Faker;
import com.github.javafaker.service.FakeValuesService;
import com.github.javafaker.service.RandomService;
-import org.apache.commons.lang.math.RandomUtils;
-import org.apache.isis.applib.DomainObjectContainer;
+
+import org.apache.commons.lang3.RandomUtils;
import org.apache.isis.applib.annotation.DomainService;
import org.apache.isis.applib.annotation.NatureOfService;
import org.apache.isis.applib.annotation.Programmatic;
import org.apache.isis.applib.services.clock.ClockService;
+import org.apache.isis.applib.services.repository.RepositoryService;
@DomainService(
nature = NatureOfService.DOMAIN
@@ -29,7 +30,7 @@ public class FakeDataService {
@PostConstruct
public void init() {
- random = RandomUtils.JVM_RANDOM;
+ random = new Random();
javaFaker = new Faker(random);
randomService = new RandomService(random);
@@ -116,186 +117,135 @@ public class FakeDataService {
/**
* Access to the full API of the underlying javafaker library.
*/
- @Programmatic
public Faker javaFaker() { return javaFaker; }
- // //////////////////////////////////////
- @Programmatic
public Names name() {
return names;
}
- @Programmatic
public Comms comms() {
return comms;
}
- @Programmatic
public Lorem lorem() {
return lorem;
}
- @Programmatic
public Addresses addresses() {
return addresses;
}
- @Programmatic
public CreditCards creditCards() {
return creditCards;
}
- @Programmatic
public Books books() {
return books;
}
- // //////////////////////////////////////
-
- @Programmatic
public Bytes bytes() {
return bytes;
}
- @Programmatic
public Shorts shorts() {
return shorts;
}
- @Programmatic
public Integers ints() {
return integers;
}
- @Programmatic
public Longs longs() {
return longs;
}
- @Programmatic
public Floats floats() {
return floats;
}
- @Programmatic
public Doubles doubles() {
return doubles;
}
- @Programmatic
public Chars chars() {
return chars;
}
- @Programmatic
public Booleans booleans() {
return booleans;
}
- // //////////////////////////////////////
-
- @Programmatic
public Strings strings() {
return strings;
}
- // //////////////////////////////////////
-
- @Programmatic
public Collections collections() {
return collections;
}
- @Programmatic
public Enums enums() {
return enums;
}
- // //////////////////////////////////////
-
- @Programmatic
public JavaUtilDates javaUtilDates() {
return javaUtilDates;
}
- @Programmatic
public JavaSqlDates javaSqlDates() {
return javaSqlDates;
}
- @Programmatic
public JavaSqlTimestamps javaSqlTimestamps() {
return javaSqlTimestamps;
}
- @Programmatic
public JodaLocalDates jodaLocalDates() {
return jodaLocalDates;
}
- @Programmatic
public JodaDateTimes jodaDateTimes() {
return jodaDateTimes;
}
- @Programmatic
public JodaPeriods jodaPeriods() {
return jodaPeriods;
}
- // //////////////////////////////////////
-
- @Programmatic
public BigDecimals bigDecimals() {
return bigDecimals;
}
- @Programmatic
public BigIntegers bigIntegers() {
return bigIntegers;
}
- @Programmatic
public Urls urls() {
return urls;
}
- @Programmatic
public Uuids uuids() {
return uuids;
}
- // //////////////////////////////////////
-
- @Programmatic
public IsisPasswords isisPasswords() {
return isisPasswords;
}
- @Programmatic
public IsisMoneys isisMoneys() {
return isisMoneys;
}
- @Programmatic
public IsisBlobs isisBlobs() {
return isisBlobs;
}
- @Programmatic
public IsisClobs isisClobs() {
return isisClobs;
}
- // //////////////////////////////////////
-
- // //////////////////////////////////////
-
- @Inject
- ClockService clockService;
+ @Inject ClockService clockService;
- @Inject
- DomainObjectContainer container;
+ @Inject RepositoryService repositoryService;
}
\ No newline at end of file
diff --git a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Floats.java b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Floats.java
index 4625550..82661a2 100644
--- a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Floats.java
+++ b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Floats.java
@@ -1,6 +1,6 @@
package org.isisaddons.module.fakedata.dom;
-import org.apache.commons.lang.math.RandomUtils;
+import org.apache.commons.lang3.RandomUtils;
import org.apache.isis.applib.annotation.Programmatic;
public class Floats extends AbstractRandomValueGenerator{
@@ -11,6 +11,6 @@ public class Floats extends AbstractRandomValueGenerator{
@Programmatic
public float any() {
- return RandomUtils.nextFloat(fake.random);
+ return RandomUtils.nextFloat();
}
}
diff --git a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Integers.java b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Integers.java
index acd6056..bcbf16b 100644
--- a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Integers.java
+++ b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Integers.java
@@ -1,6 +1,6 @@
package org.isisaddons.module.fakedata.dom;
-import org.apache.commons.lang.math.RandomUtils;
+import org.apache.commons.lang3.RandomUtils;
import org.apache.isis.applib.annotation.Programmatic;
public class Integers extends AbstractRandomValueGenerator{
diff --git a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/IsisBlobs.java b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/IsisBlobs.java
index de6713d..8fff8e5 100644
--- a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/IsisBlobs.java
+++ b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/IsisBlobs.java
@@ -4,14 +4,14 @@ import java.io.IOException;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.io.ByteSource;
-import com.google.common.io.Resources;
+import java.util.stream.Collectors;
+
import org.apache.isis.applib.annotation.Programmatic;
import org.apache.isis.applib.value.Blob;
+import com.google.common.io.ByteSource;
+import com.google.common.io.Resources;
+
public class IsisBlobs extends AbstractRandomValueGenerator{
public IsisBlobs(final FakeDataService fakeDataService) {
@@ -49,16 +49,9 @@ public class IsisBlobs extends AbstractRandomValueGenerator{
}
private static List<String> fileNamesEndingWith(final String suffix) {
- return Lists.newArrayList(Iterables.filter(IsisBlobs.fileNames, endsWith(suffix)));
- }
-
- private static Predicate<String> endsWith(final String suffix) {
- return new Predicate<String>() {
- @Override
- public boolean apply(final String input) {
- return input.endsWith(suffix);
- }
- };
+ return IsisBlobs.fileNames.stream()
+ .filter(input -> input.endsWith(suffix))
+ .collect(Collectors.toList());
}
diff --git a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/IsisClobs.java b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/IsisClobs.java
index 0ea3bd6..15b8dba 100644
--- a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/IsisClobs.java
+++ b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/IsisClobs.java
@@ -4,13 +4,15 @@ import java.io.IOException;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
+import java.util.stream.Collectors;
+
import com.google.common.base.Charsets;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.io.CharSource;
import com.google.common.io.Resources;
-import org.apache.isis.applib.annotation.Programmatic;
+
import org.apache.isis.applib.value.Clob;
public class IsisClobs extends AbstractRandomValueGenerator{
@@ -62,33 +64,23 @@ public class IsisClobs extends AbstractRandomValueGenerator{
"sample.rtf",
"testrtf.rtf");
- @Programmatic
public Clob any() {
final List<String> fileNames = IsisClobs.fileNames;
return asClob(fileNames);
}
- @Programmatic
public Clob anyXml() {
return asClob(fileNamesEndingWith(".xml"));
}
- @Programmatic
public Clob anyRtf() {
return asClob(fileNamesEndingWith(".rtf"));
}
private static List<String> fileNamesEndingWith(final String suffix) {
- return Lists.newArrayList(Iterables.filter(IsisClobs.fileNames, endsWith(suffix)));
- }
-
- private static Predicate<String> endsWith(final String suffix) {
- return new Predicate<String>() {
- @Override
- public boolean apply(final String input) {
- return input.endsWith(suffix);
- }
- };
+ return IsisClobs.fileNames.stream()
+ .filter(input -> input.endsWith(suffix))
+ .collect(Collectors.toList());
}
private Clob asClob(final List<String> fileNames) {
diff --git a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Longs.java b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Longs.java
index 2b70477..6dedf88 100644
--- a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Longs.java
+++ b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Longs.java
@@ -1,6 +1,6 @@
package org.isisaddons.module.fakedata.dom;
-import org.apache.commons.lang.math.RandomUtils;
+import org.apache.commons.lang3.RandomUtils;
import org.apache.isis.applib.annotation.Programmatic;
public class Longs extends AbstractRandomValueGenerator{
@@ -11,6 +11,6 @@ public class Longs extends AbstractRandomValueGenerator{
@Programmatic
public long any() {
- return RandomUtils.nextLong(fake.random);
+ return RandomUtils.nextLong();
}
}
diff --git a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Lorem.java b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Lorem.java
index e97e7b4..161045f 100644
--- a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Lorem.java
+++ b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Lorem.java
@@ -9,40 +9,33 @@ public class Lorem extends AbstractRandomValueGenerator {
Lorem(final FakeDataService fakeDataService) {
super(fakeDataService);
- javaFakerLorem = new com.github.javafaker.Lorem(fakeDataService.fakeValuesService, fakeDataService.randomService);
+ javaFakerLorem = fakeDataService.javaFaker().lorem();
}
- @Programmatic
public List<String> words(int num) {
return javaFakerLorem.words(num);
}
- @Programmatic
public List<String> words() {
return javaFakerLorem.words();
}
- @Programmatic
public String sentence(int wordCount) {
return javaFakerLorem.sentence(wordCount);
}
- @Programmatic
public String sentence() {
return javaFakerLorem.sentence();
}
- @Programmatic
public String paragraph(int sentenceCount) {
return javaFakerLorem.paragraph(sentenceCount);
}
- @Programmatic
public String paragraph() {
return javaFakerLorem.paragraph();
}
- @Programmatic
public List<String> paragraphs(int paragraphCount) {
return javaFakerLorem.paragraphs(paragraphCount);
}
diff --git a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Names.java b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Names.java
index 7bea9ad..2b5b9bb 100644
--- a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Names.java
+++ b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Names.java
@@ -7,7 +7,7 @@ public class Names extends AbstractRandomValueGenerator {
Names(final FakeDataService fakeDataService) {
super(fakeDataService);
- javaFakerName = new com.github.javafaker.Name(fakeDataService.fakeValuesService);
+ javaFakerName = fakeDataService.javaFaker().name();
}
@Programmatic
diff --git a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Uuids.java b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Uuids.java
index 22025de..dc4bd0a 100644
--- a/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Uuids.java
+++ b/extensions/lib/fakedata/impl/src/main/java/org/isisaddons/module/fakedata/dom/Uuids.java
@@ -1,7 +1,6 @@
package org.isisaddons.module.fakedata.dom;
import java.util.UUID;
-import org.apache.isis.applib.annotation.Programmatic;
public class Uuids extends AbstractRandomValueGenerator{
@@ -9,7 +8,6 @@ public class Uuids extends AbstractRandomValueGenerator{
super(fakeDataService);
}
- @Programmatic
public UUID any() {
return UUID.randomUUID();
}
diff --git a/extensions/lib/fakedata/impl/src/test/java/org/isisaddons/module/fakedata/dom/FakeDataServiceTest.java b/extensions/lib/fakedata/impl/src/test/java/org/isisaddons/module/fakedata/dom/FakeDataServiceTest.java
index b45bdc5..8a9f754 100644
--- a/extensions/lib/fakedata/impl/src/test/java/org/isisaddons/module/fakedata/dom/FakeDataServiceTest.java
+++ b/extensions/lib/fakedata/impl/src/test/java/org/isisaddons/module/fakedata/dom/FakeDataServiceTest.java
@@ -13,6 +13,8 @@ import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
+import org.apache.isis.applib.services.repository.RepositoryService;
+import org.apache.isis.unittestsupport.jmocking.JUnitRuleMockery2;
import org.jmock.Expectations;
import org.jmock.auto.Mock;
import org.joda.time.DateTime;
@@ -22,13 +24,11 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
-import org.apache.isis.applib.DomainObjectContainer;
import org.apache.isis.applib.services.clock.ClockService;
import org.apache.isis.applib.value.Blob;
import org.apache.isis.applib.value.Clob;
import org.apache.isis.applib.value.Money;
import org.apache.isis.applib.value.Password;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
import static org.assertj.core.api.Assertions.assertThat;
@@ -40,7 +40,7 @@ public class FakeDataServiceTest {
FakeDataService fakeDataService;
@Mock
- DomainObjectContainer mockContainer;
+ RepositoryService mockRepositoryService;
@Mock
ClockService mockClockService;
@@ -48,7 +48,7 @@ public class FakeDataServiceTest {
@Before
public void setUp() throws Exception {
fakeDataService = new FakeDataService();
- fakeDataService.container = mockContainer;
+ fakeDataService.repositoryService = mockRepositoryService;
fakeDataService.clockService = mockClockService;
fakeDataService.init();
diff --git a/extensions/pom.xml b/extensions/pom.xml
index 603eea0..6ade10f 100644
--- a/extensions/pom.xml
+++ b/extensions/pom.xml
@@ -237,6 +237,7 @@
<module>lib/base/impl</module>
<module>lib/excel/impl</module>
+ <module>lib/fakedata/impl</module>
</modules>
</project>