This page was moved to https://cwiki.apache.org/confluence/display/CAUSEWAY/Roadmap to Version 2
Click in the link above if you are not automatically redirected in 10 seconds.


You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 85 Next »

This is a summary of features we do have in mind.

Getting ready for Java 11

For now we want Isis 2.x releases to run on JRE 8, but we need to be prepared for the coming long-term-support release of Java 11. We are keeping an eye on experimental builds utilizing the Java module path, while at the same time further try to get rid of 3rd party libraries.

We've started to remove use of guava and began to utilize the Java 8 Stream API. ISIS-1277 - Getting issue details... STATUS is to track work for moving up to Java 11.

Extending persistence layer support

Current version does support JDO on top of DataNucleus (DN). We are considering to also support JPA. Supporting JPA on top of DN as a first initial step should be quite easy, and the first thing to be tackled. Decoupling the framework from DN in order to support Spring Boot is another thing.

Jakarta EE

With version 2.0.0-M1 we enabled the framework to run on JEE platforms. Currently missing is proper documentation on best practices and how to setup your IDE. Though not specific to JEE but related, we also need to push the technique of skinny-war deployment.

Deprecate web.xml deployment descriptors

Since the Servlet 3.0 standard deployment descriptors can be replaced with an alternative solution utilizing annotations.

Improve the metamodel cache management and speed-up bootstrapping

The cache management we have with ObjectAdapter, might be simplified such that we just work with java.lang.Object so far as possible. We would have a "disposable" ObjectAdapter that we instantiate around an Object whenever we need it - to access into the metamodel - and then throw it away after. Or perhaps eventually we might not need ObjectAdapter at all, just simply use #getClass() to look up the ObjectSpecification.

It might also be useful to be able to serialize the metamodel into some sort of flat file, eg XML. One reason for doing this is as a safety net - to allow refactorings of the metamodel building and check that the output is still the same. A serialized metamodel might also be useful for tooling/static analysis.

UI enhancement: support for more complex dialogs

UI enhancement: allow actions to be invoked for rows on a table

We envisage an additional column which provides "common" actions as a drop-down that can be invoked against the row instance without having to navigate into the object first. A simple modal dialog could suffice.

UI enhancement: allow to "peek" at domain objects

Another idea of saving the user from having to navigate away, is to somehow let the user "peek" at the main details of a domain object. This could be within a fieldset, or it could be in a row of a table. Perhaps this is enabled by the presence of supplementary xxx.layout.xml, eg Customer.row.xml or Customer.peek.xml which identify the properties to be rendered.

UI enhancement: "tab per item" for small collections

For small collections of domain objects, these could be presented as "tab per item" with full details, rather than "row per item" as with current tables.

UI enhancement: allow for entering grids of data

This is typically for bulk entry of data which is then validated all together.

Quoting Dan:

I haven't figured out the coding model yet, but it might be to resurrect the "validate()" supporting method on the domain class to check that all data entered is correct.  I see this being used with view models rather than with entities. There would also need to be some sort of "save()" method that would allow the view models to post their state into actual entities.

Authentication: support for OAuth 2.0

OAuth 2.0 support is a thing modern frameworks should not lack. We have no concrete plans yet but talked about integrating with [keycloak](https://www.keycloak.org/).

UI architectural redesign

Decouple current Wicket UI from the framework's core components.

Quoting Dan:

At a rather grander scale, one long-term vision I have is to replace our Wicket UI with one that works across the REST API.  This is the direction that the .NET NakedObjects framework has taken.  In fact because both frameworks use [Restful Objects](http://www.restfulobjects.org) as their API (albeit slightly different dialects) then it ought to be possible for us to support their UI.  But I'd also like us to have our "own" Rest UI also, with the explicit goal of making it easier for developers to customise the UI ... it should be easy to move from fully generic to fully  customised, or any point in between.  At the moment the Wicket UI makes this too hard to do.  Having a REST UI based on Angular.x (and eventually, web components) will hopefully improve this. Sebastian Slutzky [...] is making steady progress on this. It'll take a while yet before we get to feature equivalence with the Wicket UI, though.

Allow for multiple backends to feed the UI with data.

Quoting Dan:

Moving to a REST UI also enables another idea, which is that of composite UIs.  At the moment the framework assigns an OID to every domain object, be that a domain service, an entity or a view model.  This is basically the object type (as in @DomainObject(objectType=... ) or @DomainService(objectType=...) ) along with an ID (for an entity, it's datastore Id and for a view model, a seriailsation of its internal state). With REST this OID is part of the URL, with the rest of the URL in effect specifying the "backend" that owns the domain object.  My idea is that the UI being rendered is made up of state that could be from multiple backends; they are all just URLs, after all.  What I haven't figured out is how to define references from one backend app (eg order_mgmt) to another backend (eg customer).  And I also don't know how to do mixins (eg  so that order_mgmt could contribute the "recentOrders" collection to a representation of a customer).  But if we could figure this out, then it could be possible to use an Isis REST UI on top of multiple backend microservices - all they would need is a REST API.  This also motivates [... as mentioned above] supporting different backend persistence runtimes such as SpringBoot/Hibernate and Axon/CQRS.

Feature Showcase

Deprecation Tracker

org.apache.isis.applib

  • AbstractContainedObject.java - entire class
  • AbstractDomainObject.java  - entire class
  • AbstractFactoryAndRepository.java  - entire class
  • DomainObjectContainer.java  - entire class
  • IsisApplibModule.java
  •     ActionDomainEvent - the N-arg constructors (just use the 0-arg ones)
  •     CollectionDomainEvent - the N arg constructors (just use the 0-arg ones)
  •     PropertyDomainEvent  - the N arg constructors (just use the 0-arg ones)

org.apache.isis.applib.annotation

  • Action.java
  •     publishingPayloadFactory()  - attribute; use the simpler PublisherService SPI instead
  • DomainObject.java
  •     publishingPayloadFactory() - attribute, use the simpler PublisherService SPI instead
  • PublishedAction.java - entire annotation, use @Action(publishing=...) instead
  • PublishedObject.java - entire annotation, use @DomainObject(publishing=...) instead
  • PublishingPayloadFactoryForAction.java - entire annotation, replaced with simpler PublisherService SPI
  • PublishingPayloadFactoryForObject.java - entire annotation, replaced with simpler PublisherService SPI
  • ActionInteraction.java  - entire annotation, use @Action(domainEvent=...)
  • CollectionInteraction.java - entire annotation, use @Collection(domainEvent=...)
  • PostsActionInvokedEvent.java - entire annotation, use @Action(domainEvent=...) instead
  • PostsCollectionAddedToEvent.java - entire annotation, use @Collection(domainEvent=...) instead.
  • PostsCollectionRemovedFromEvent.java - entire annotation, use @Collection(domainEvent=...) instead.
  • PostsPropertyChangedEvent.java - entire annotation, use @Property(domainEvent=...) instead.
  • PropertyInteraction.java - entire annotation, use @Property(domainEvent=...) instead.
  • ActionOrder.java - entire annotation, use @MemberOrder instead
  • FieldOrder.java - entire annotation, use @MemberOrder instead
  • ActionSemantics.java  - entire annotation, use @Action(semantics=...)
  • Idempotent.java - entire annotation, use @Action(semantics=...) instead.
  • QueryOnly.java - entire annotation, use @Action(semantics=...) instead.
  • Aggregated.java - entire annotation, not supported internally
  • NotPersistable.java - entire annotation, not supported and does nothing
  • AutoComplete.java - entire annotation, use @DomainObject(autoComplete...=...)
  • Bookmarkable.java - entire annotation, use @DomainObjectLayout(bookmarking=...)
  • Bounded.java - entire annotation, use @DomainObject(bounded=...)
  • Bulk.java - entire annotation, use @Action(invokeOn=...)
  • Bulk.InteractionContext - entire service, use ActionInvocationContext service instead
  • InvokedOn.java - entire enum, along with @Bulk annotation.
  • CollectionLayout.java
  •     render() - use @CollectionLayout(defaultView=...) instead
  • Render.java - entire annotation, use @CollectionLayout(defaultView=...) instead
  • RenderType.java - supporting enum for @Render annotation
  • Resolve.java - entire annotation, use @CollectionLayout(defaultView=...) instead
  • Audited.java - entire annotation, use @DomainObject(audited=...)
  • Command.java - entire annotation, use @Action(command=...) instead
  • CommandExecuteIn.java - entire annotation, use @Action(commandExecuteIn=...) instead
  • CommandPersistence.java - entire annotation, use @Action(commandPersistence=...) instead
  • CssClass.java - entire annotation, use @XxxLayout(cssClass=...) instead, where Xxx is Property, Collection, Action, Parameter, DomainObject, ViewModel
  • CssClassFa.java - entire annotation, use @XxxLayout(cssClass=...) instead, where Xxx is Property, Collection, Action, Parameter, DomainObject, ViewModel
  • Debug.java - entire annotation, use @Action#(restrictTo=...) instead
  • Exploration.java - entire annotation, use @Action(restrictTo=....) instead
  • Prototype.java  - entire annotation, use @Action(restrictTo=....) instead
  • DescribedAs.java - entire annotation, use @XxxLayout(describedAs=...) instead
  • Disabled.java - entire annotation, use @Property(editingDisabledReason=...) instead
  • Hidden.java - entire annotation, use @Property(hidden=...), @Collection(hidden=...), @Action(hidden=...)
  • Ignore.java - entire annotation, use @Programmatic instead.
  • Immutable.java - entire annotation, use @DomainObject(editing=...) instead
  • Mandatory.java - entire annotation, use @Property(optionality=...) and @Parameter(optionality=...), or @javax.annotations.Nullable
  • Optional.java - entire annotation, use @Property(optionality=...) and @Parameter(optionality=...), or @javax.annotations.Nullable
  • Mask.java - entire annotation, not supported by either Wicket viewer or RO viewer
  • MaxLength.java - entire annotation, use @Property(maxLength=...) and @Parameter(maxLength=...)
  • MemberGroups.java - entire annotation, use @MemberGroupLayout instead
  • MultiLine.java - entire annotation, use @PropertyLayout(multiLine=...) and @ParameterLayout(multiLine=...) instead.
  • MustSatisfy.java - entire annotation, use @Property(mustSatisfy=....) or @Parameter(mustSatisfy=...) instead
  • Named.java - entire annotation, use @XxxLayout(named=...) instead, where Xxx is Property, Collection, Action, Parameter, DomainObject, ViewModel
  • Plural.java - entire annotation, use @DomainObjectLayout(plural=...) instead
  • RegEx.java - entire annotation, use @Property(regexPatternFlags=...) or @Parameter(regexPatternFlags=...) instead
  • RenderedAsDayBefore.java - entire annotation, use @PropertyLayout(renderedAsDayBefore=...) and @ParameterLayout(renderedAsDayBefore=...)
  • SortedBy.java - entire annotation, use @CollectionLayout(sortedBy=...) instead
  • TypeOf.java - entire annotation, use @Collection(typeOf=...) or @Action(typeOf=...) instead.
  • TypicalLength.java - entire annotation, use @PropertyLayout(typicalLength=...) instead.
  • NotContributed.java - entire annotation, use @DomainService(nature=...) or mixins instead.
  • NotInServiceMenu.java - entire annotation, use @DomainService(nature=...) or mixins instead.
  • NotPersisted.java - entire annotation, use @Property(notPersisted=...) instead
  • ObjectType.java - entire annotation, use @DomainObject(objectType=...) or @javax.jdo.annotations.Discriminator instead.
  • Paged.java - entire annotation, use @DomainObjectLayout(paged=...) or @CollectionLayout(paged=...) instead.
  • Parameter.java
  •     minLength() attribute; not supported.  For autocomplete, use @MinLength annotation.
  • When.java - entire enum, no replacement (believe is unused within the framwork)

org.apache.isis.applib.clock

  • Clock.java -
  •     getTimeAsCalendar()  (1 usage found)
  •     getTimeAsDate()  (1 usage found)

org.apache.isis.applib.events

  • entire package.  These event classes supported only by WrapperFactory; redundant as @Xxx(domainEvent=...) on member achieves much the same effect using event bus

org.apache.isis.applib.filter

  • entire package of Filter classes; use Java 8 Predicate instead.






org.apache.isis.applib.fixturescripts

  • FixtureScript.java  - various methods to simplify API
  •     add(...) - use addResult(...) instead
  •     asKeyValueMap(String) - removed; this shouldn't have had public visibility.
  •     execute(...) and executeChild(...) - use ExecutionContext#executeChild(FixtureScript, String, FixtureScript)} instead
  •     executeIfNotAlready(FixtureScript) - removed; this shouldn't have had public visibility.
  •     lookup(String, Class<T>) - use ExecutionContext#lookup(...) instead
  • FixtureScripts.java - remove deprecated methods; framework provides an implementation of this service, and use FixtureScriptsSpecificatoinProvider to configure instead.

org.apache.isis.applib.marker - remove these marker interaces (tend to use annotations in preference)

  • ImmutableOncePersisted.java  
  • ImmutableUntilPersisted.java
  • NeverImmutable.java
  • NonPersistable.java
  • ProgramPersistable.java

org.apache.isis.applib.services.actinvoc

  • ActionInvocationContext.java -remove unused constructors

org.apache.isis.applib.services.audit  (2 usages found)

  • AuditingService3.java - remove entire service, use AuditerService instead

org.apache.isis.applib.services.background  (10 usages found)

  • ActionInvocationMemento.java - remove entire class, use InteractionDto and CommandDto are used internally instead
  • BackgroundCommandService.java - remove methods using AIM, instead keep those using CommandDto (in BackgroundCommandService2)
  • BackgroundService.java
  •     asActionInvocationMemento(Method, Object, Object[]) - remove this internal API, no longer called by framework

org.apache.isis.applib.services.bookmark  (8 usages found)

  • BookmarkService.java - deprecated methods, have overloads in BookmarkService2 subtype [suggest we retain these for now]

org.apache.isis.applib.services.classdiscovery

  • ClassDiscoveryService.java , push down into ClassDiscoveryService2

org.apache.isis.applib.services.command

  • Command2.java  - methods for working with interaction events (remove with those event types)
  •     flushActionInteractionEvents()
  •     peekActionInteractionEvent()
  •     popActionInteractionEvent()  
  •     pushActionInteractionEvent(ActionInteractionEvent<?>)

org.apache.isis.applib.services.command.spi

  • CommandService.java
  •     startTransaction(Command, UUID) - no longer required to do anything, so remove

org.apache.isis.applib.services.eventbus

  • AbstractInteractionEvent.java - remove
  • ActionInteractionEvent.java - remove
  • ActionInvokedEvent.java - remove
  • CollectionAddedToEvent.java - remove
  • CollectionInteractionEvent.java - remove
  • CollectionRemovedFromEvent.java  - remove
  • PropertyChangedEvent.java - remove
  • PropertyInteractionEvent.java - remove

org.apache.isis.applib.services.memento  (19 usages found)

  • MementoService.java - remove entire service (previously to support view models, but now @ViewModel and JAXB)

org.apache.isis.applib.services.metamodel

  • MetaModelService2.java - push down to subtype, retain overloads for now

org.apache.isis.applib.services.publish - remove classes pertaining to original PublishingService (payload factories etc).

  • EventMetadata.java - remove class
  • EventPayload.java - remove class
  • EventPayloadForActionInvocation.java - remove class
  • EventPayloadForObjectChanged.java - remove class
  • PublishedEventStateType.java - remove class
  • PublishingService.java - remove domain service interface
  • StatusMessageMessageType.java - remove class

org.apache.isis.applib.services.settings

  • SettingTypes.java - remove, used only by 3rd party code (incode platform settings module)

org.apache.isis.applib.services.wrapper

  • WrapperObject.java
  •     save() and wrapped() - remove to avoid name clashes, use __isis_Xxx() methods instead

org.apache.isis.applib.snapshot

  • Snapshottable.java - remove ?  [suggest we retain the Snapshot service for now]

org.apache.isis.applib.value

  • DateTime.java
  •     longValue() - use #millisSinceEpoch()
  • Time.java
  •     longValue() - use #millisSinceEpoch()

org.apache.isis.core.objectstore.jdo.applib.annotations - remove package entirely

  • Auditable.java - use @DomainObject(audited=...) instead.

org.apache.isis.objectstore.jdo.applib

  • Auditable.java - use @DomainObject(audited=...) instead.

org.apache.isis.objectstore.jdo.applib.service

  • DomainChangeJdoAbstract.java - move to incode platform
  • JdoColumnLength.java - remove class (all constants defined in other classes)
  • Util.java - remove

org.apache.isis.objectstore.jdo.applib.service.support

  • IsisJdoSupport.java - replaced by org.apache.isis.applib.services.jdosupport.IsisJdoSupport
  • No labels