forked from moqui/moqui-framework
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ReleaseNotes.txt
581 lines (536 loc) · 33.7 KB
/
ReleaseNotes.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
Moqui Framework Release Notes
===========================================================================
Release 2.0.0 - TBD
===========================================================================
Moqui Framework 2.0.0 is a major new feature and bug fix release, with
various non backward compatible API and other changes.
This version is not yet released. The notes below are for the changes
currently in place in the source repository.
Non Backward Compatible Changes
- Java JDK 8 now required for running executable WAR
- No longer using Winstone embedded web server (now using Jetty)
- ExecutionContext and ExecutionContextFactory
- Removed initComponent() and destroyComponent() methods; were never well
supported (runtime component init and destroy caused issues)
- Removed getCamelContext() from ExecutionContextFactory and
ExecutionContext, use getTool("Camel", CamelContext.class)
- Removed getElasticSearchClient() from ExecutionContextFactory and
ExecutionContext, use getTool("ElasticSearch", Client.class)
- Removed getKieContainer, getKieSession, and getStatelessKieSession
methods from ExecutionContextFactory and ExecutionContext, use
getTool("KIE", KieToolFactory.class) and use the corresponding
methods there
- See new feature notes under Tool Factory
- Caching
- Ehcache has been removed
- The org.moqui.context.Cache interface is replaced by javax.cache.Cache
- Configuration options for caches changed (moqui-conf.cache-list.cache)
- Async Services
- Now uses more standard java.util.concurrent interfaces
- Removed ServiceCallAsync.maxRetry() - was never supported
- Removed ServiceCallAsync.persist() - was never supported well, used to
simply call through Quartz Scheduler when set
- Removed persist option from XML Actions service-call.@async attribute
- Async services never called through Quartz Scheduler (only scheduled)
- ServiceCallAsync.callWaiter() replaced by callFuture()
- Removed ServiceCallAsync.resultReceiver()
- Removed ServiceResultReceiver interface - use callFuture() instead
- Removed ServiceResultWaiter class - use callFuture() instead
- See related new features below
- JCR and Apache Jackrabbit
- The repository.@type, @location, and @conf-location attributes have
been removed and the repository.parameter sub-element added for use
with the javax.jcr.RepositoryFactory interface
- See new configuration examples in MoquiDefaultConf.xml under the
repository-list element
- Removed ServiceSemaphore entity, now using ServiceParameterSemaphore
- Deprecated methods
- These methods were deprecated (usually by methods with shorter names)
long ago and with other API changes now removing them
- Removed getLocalizedMessage() and formatValue() from L10nFacade
- Removed runScriptInCurrentContext(), evaluateCondition(),
evaluateContextField(), and evaluateStringExpand() from ResourceFacade
- ArtifactHit and ArtifactHitBin now use same artifact type enum as
ArtifactAuthz, for efficiency and consistency; configuration of
artifact-stats by sub-type no longer supported, had little value and
caused performance overhead
- The ContextStack class has moved to the org.moqui.util package
- When updating to this version recommend stopping all instances in a
cluster before starting any instance with the new version
New Features
- Now using Jetty embedded for the executable WAR instead of Winstone
- initially Jetty version 9.3.8.v20160314
- this version of Jetty requires Java 8
- now internally using Servlet API 3.1.0
- Various library updates, big cleanup of classes found in multiple jar
files (JarHell checks pass; nice in general, needed for ElasticSearch)
- Configuration
- Added default-property element to set Java System properties from the
configuration file
- Added Groovy string expansion to various configuration attributes
- looks for named fields in Java System properties and environment
variables
- used in default-property.@value and all xa-properties attributes
- replaces the old explicit check for ${moqui.runtime}, which was a
simple replacement hack
- because these are Groovy expressions the typical dots used in
property names cannot be used in these strings, use an underscore
instead of a dot, ie ${moqui_runtime} instead of ${moqui.runtime};
if a property name contains underscores and no value is found with
the literal name it replaces underscores with dots and looks again
- Tool Factory
- Added org.moqui.context.ToolFactory interface used to initialize,
destroy, and get instances of tools
- Added tools.tool-factory element in Moqui Conf XML file; has default
tools in MoquiDefaultConf.xml and can be populated or modified in
component and/or runtime conf XML files
- Use new ExecutionContextFactory.getToolFactory(),
ExecutionContextFactory.getTool(), and
ExecutionContext.getTool() methods to interact with tools
- See non backward compatible change notes for ExecutionContextFactory
- Caching
- CacheFacade now supports separate local and distributed caches both
using the javax.cache interfaces
- Added new MCache class for faster local-only caches
- implements the javax.cache.Cache interface
- supports expire by create, access, update
- supports custom expire on get
- supports max entries, eviction done in separate thread
- For distributed caches now using Hazelcast, initially version 3.6.2
- Hazelcast can be used for distributed entity cache and can be used for
web session replication, distributed execution, and OrientDB clustering
- Set many entities to cache=never to avoid overhead of caching where
read/write ratio doesn't justify it or where cache could cause issues
- Async Services
- ServiceCallAsync now using standard java.util.concurrent interfaces
- Use callFuture() to get a Future object instead of callWaiter()
- Can now get Runnable or Callable objects to run a service through a
ExecutorService of your choice
- Services can now be called local or distributed through Hazelcast
- Added ServiceCallAsync.distribute() method
- Added distribute option to XML Actions service-call.@async attribute
- Distributed services allow offloading service execution to worker nodes
- Added default Hazelcast web session replication config (see web.xml)
- Implemented distributed entity cache invalidate using a Hazelcast Topic,
enabled in Moqui Conf XML file with the @distributed-cache-invalidate
attribute on the entity-facade element
- JCR and Apache Jackrabbit
- JCR support (for content:// locations in the ResourceFacade) now uses
javax.jcr interfaces only, no dependencies on Jackrabbit
- JCR repository configuration now supports other JCR implementations by
using implementation specific RepositoryFactory parameters
- Added ADMIN_PASSWORD permission for administrative password change
(in UserServices.update#Password service)
- Added UserServices.enable#UserAccount service to enable disabled account
- EntityDataWriter now supports export with a entity master definition
name, applied only to entities exported that have a master def with the
given master name
- Added support for error screens rendered depending on type of error
- configured in the webapp.error-screen element in Moqui Conf XML file
- if error screen render fails sends original error response
- this is custom content that avoids sending an error response
- A component may now have a MoquiConf.xml file that overrides the default
configuration file (MoquiDefaultConf.xml from the classpath) but is
overridden by the runtime configuration file; the MoquiConf.xml file in
each component is merged into the main conf based on the component
dependency order (logged on startup)
- Added ExecutionContext.runAsync method to run a closure in a worker
thread with an ExecutionContext like the current (tenant, user, etc)
- Added configuration for worker thread pool parameters, used for local
async services, EC.runAsync, etc
- form-list now supports @header-dialog to put header-field widgets in a
dialog instead of in the header
- form-list now supports @select-columns to allow users to select which
fields are displayed in which columns, or not displayed
Bug Fixes
- Fixed issue with REST and other JSON request body parameters where single
entry lists were unwrapped to just the entry by the canonicalization code
- Fixed NPE in EntityFind.oneMaster() when the master value isn't found,
now returns null with no error; fixes moqui-runtime issue #18
- Fixed ElFinder rm (moqui-runtime GitHub issue #23), response for upload
- Screen sub-content directories treated as not found so directory entries
not listed (GitHub moqui-framework issue #47)
- In entity cache auto clear for list of view-entity fixed mapping of
member entity fields to view entity alias, and partial match when only
some view entity fields are on a member entity
- Cache clear fix for view-entity list cache fixes issue where adding a
permission required manual cache clear or restart for permission to apply
===========================================================================
Release 1.6.2 - 26 Mar 2016
===========================================================================
Moqui Framework 1.6.2 is a minor new feature and bug fix release.
This release is all about performance improvements, bug fixes, library
updates and cleanups. There are a number of minor new features like better
multi-tenant handling (and security), optionally loading data on start if
the DB is empty, more flexible handling of runtime Moqui Conf XML location,
database support and transaction management, and so on.
Non Backward Compatible Changes
- Entity field types are somewhat more strict for database operations; this
is partly for performance reasons and partly to avoid database errors
that happen only on certain databases (ie some allow passing a String for
a Timestamp, others don't; now you have to use a Timestamp or other date
object); use EntityValue.setString or similar methods to do data
conversions higher up
- Removed the TenantCurrency, TenantLocale, TenantTimeZone, and
TenantCountry entities; they aren't generally used and better not to have
business settings in these restricted technical config entities
New Features
- Many performance improvements based on profiling; cached entities finds
around 6x faster, non cached around 3x; screen rendering also faster
- Added JDBC Connection stash by tenant, entity group, and transaction,
can be disabled with transaction-facade.@use-connection-stash=false in
the Moqui Conf XML file
- Many code cleanups and more CompileStatic with XML handling using new
MNode class instead of Groovy Node; UserFacadeImpl and
TransactionFacadeImpl much cleaner with internal classes for state
- Added tools.@empty-db-load attribute with data file types to load on
startup (through webapp ContextListener init only) if the database is
empty (no records for moqui.basic.Enumeration)
- If the moqui.conf property (system property, command line, or in
MoquiInit.properties) starts with a forward slash ('/') it is now
considered an absolute path instead of relative to the runtime directory
allowing a conf file outside the runtime directory (an alternative
to using ../)
- UserAccount.userId and various other ID fields changed from id-long to id
as userId is only an internal/sequenced ID now, and for various others
the 40 char length changed years ago is more than adequate; existing
columns can be updated for the shorter length, but don't have to be
- Changes to run tests without example component in place (now a component
separate from moqui-runtime), using the moqui.test and other entities
- Added run-jackrabbit option to run Apache Jackrabbit locally when Moqui
starts and stop is when Moqui stops, with conf/etc in runtime/jackrabbit
- Added SubscreensDefault entity and supporting code to override default
subscreens by tenant and/or condition with database records
- Now using the VERSION_2_3_23 version for FreeMarker instead of a
previous release compatibility version
- Added methods to L10nFacade that accept a Locale when something other
than the current user's locale is needed
- Added TransactionFacade runUseOrBegin() and runRequireNew() methods to
run code (in a Groovy Closure) in a transaction
- ArtifactHit/Bin persistence now done in a worker thread instead of async
service; uses new eci.runInWorkerThread() method, may be added
ExecutionContext interface in the future
- Added XML Form text-line.depends-on element so autocomplete fields can
get data on the client from other form fields and clear on change
- Improved encode/decode handling for URL path segments and parameters
- Service parameters with allow-html=safe are now accepted even with
filtered elements and attributes, non-error messages are generated and
the clean HTML from AntiSamy is used
- Now using PegDown for Markdown processing instead of Markdown4J
- Multi Tenant
- Entity find and CrUD operations for entities in the tenantcommon group
are restricted to the DEFAULT instance, protects REST API and so on
regardless of admin permissions a tenant admin might assign
- Added tenants allowed on SubscreensItem entity and subscreens-item
element, makes more sense to filter apps by tenant than in screen
- Improvements to tenant provisioning services, new MySQL provisioning,
and enable/disable tenant services along with enable check on switch
- Added ALL_TENANTS option for scheduled services, set on system
maintenance services in quartz_data.xml by default; runs the service
for each known tenant (by moqui.tenant.Tenant records)
- Entity Facade
- DB meta data (create tables, etc) and primary sequenced ID queries now
use a separate thread to run in a different transaction instead of
suspend/resume as some databases have issues with that, especially
nested which happens when service and framework code suspends
- Service Facade
- Added separateThread option to sync service call as an alternative to
requireNewTransaction which does a suspend/resume, runs service in a
separate thread and waits for the service to complete
- Added service.@semaphore-parameter attribute which creates a distinct
semaphore per value of that parameter
- Services called with a ServiceResultWaiter now get messages passed
through from the service job in the current MessageFacade (through
the MessageFacadeException), better handling for other Throwable
- Async service calls now run through lighter weight worker thread pool
if persist not set (if persist set still through Quartz Scheduler)
- Dynamic (SPA) browser features
- Added screen element when render screen to support macros at the screen
level, such as code for components and services in Angular 2
- Added support for render mode extension (like .html, .js, etc) to
last screen name in screen path (or URL), uses the specified
render-mode and doesn't try to render additional subscreens
- Added automatic actions.json transition for all screens, runs actions
and returns results as JSON for use in client-side template rendering
- Added support for .json extension to transitions, will run the
transition and if the response goes to another screen returns path to
that screen in a list and parameters for it, along with
messages/errors/etc for client side routing between screens
Bug Fixes
- DB operations for sequenced IDs, service semaphores, and DB meta data are
now run in a separate thread instead of tx suspend/resume as some
databases have issues with suspend/resume, especially multiple
outstanding suspended transactions
- Fixed issue with conditional default subscreen URL caching
- Internal login from login/api key and async/scheduled services now checks
for disabled accounts, expired passwords, etc just like normal login
- Fixed issue with entity lists in TransactionCache, were not cloned so
new/updated records changed lists that calling code might use
- Fixed issue with cached entity lists not getting cleared when a record is
updated that wasn't in a list already in the cache but that matches its
condition
- Fixed issue with cached view-entity lists not getting cleared on new or
updated records; fixes issues with new authz, tarpits and much more not
applied immediately
- Fixed issue with cached view-entity one results not getting cleared when
a member entity is updated (was never implemented)
- Entities in the tenantcommon group no longer available for find and CrUD
operations outside the DEFAULT instance (protect tenant data)
- Fixed issue with find one when using a Map as a condition that may
contain non-PK fields and having an artifact authz filter applied, was
getting non-PK fields and constraining query when it shouldn't
(inconsistent with previous behavior)
- Fixed ElasticSearch automatic mappings where sub-object mappings always
had just the first property
- Fixed issues with Entity DataFeed where cached DataDocument mappings per
entity were not consistent and no feed was done for creates
- Fixed safe HTML service parameters (allow-html=safe), was issue loading
antisamy-esapi.xml though ESAPI so now using AntiSamy directly
- Fixed issues with DbResource reference move and other operations
- Fixed issues with ResourceReference operations and wiki page updates
===========================================================================
Release 1.6.1 - 24 Jan 2016
===========================================================================
Moqui Framework 1.6.1 is a minor new feature and bug fix release.
This is the first release after the repository reorganization in Moqui
Ecosystem. The runtime directory is now in a separate repository. The
framework build now gets JAR files from Bintray JCenter instead of having
them in the framework/lib directory. Overall the result is a small
foundation with additional libraries, components, etc added as needed using
Gradle tasks.
Build Changes
- Gradle tasks to help handle runtime directory in a separate repository
from Moqui Framework
- Added component management features as Gradle tasks
- Components available configured in addons.xml
- Repositories components come from configured in addons.xml
- Get component from current or release archive (getCurrent, getRelease)
- Get component from git repositories (getGit)
- When getting a component, automatically gets all components it depends
on (must be configured in addons.xml so it knows where to get them)
- Do a git pull for moqui, runtime, and all components
- Most JAR files removed, framework build now uses Bintray JCenter
- JAR files are downloaded as needed on build
- For convenience in IDEs to copy JAR files to the framework/dependencies
directory use: gradle framework:copyDependencies; note that this is not
necessary in IntelliJ IDEA (will import dependencies when creating a new
project based on the gradle files, use the refresh button in the Gradle
tool window to update after updating moqui)
- If your component builds source or runs Spock tests changes will be
needed, see the runtime/base-component/example/build.gradle file
New Features
- The makeCondition(Map) methods now support _comp entry for comparison
operator, _join entry for join operator, and _list entry for a list of
conditions that will be combined with other fields/values in the Map
- In FieldValueCondition if the value is a collection and operator is
EQUALS set to IN, or if NOT_EQUAL then NOT_IN
Bug Fixes
- Fixed issue with EntityFindBase.condition() where condition break down
set ignore case to true
- Fixed issue with from/thru date where conversion from String was ignored
- Fixed MySQL date-time type for milliseconds; improved example conf for XA
- If there are errors in screen actions the error message is displayed
instead of rendering the widgets (usually just resulting in more errors)
===========================================================================
Long Term To Do List - aka Informal Roadmap
===========================================================================
- Move tools from moqui-framework to tool components
- Great tools but not used by default in Moqui/Mantle/etc
- OrientDB (moqui-orientdb)
- Atomikos (moqui-atomikos; leave Bitronix in by default)
- Apache Camel (moqui-camel)
- Used in Mantle/HM/PC, but might not be used by all moqui-framework users
- ElasticSearch (moqui-search)
- KIE (moqui-kie)
- add mantle-usl dependencies on search, kie
- Possible to split out FOP? Used in MoquiFopServlet, send email attachments, PDF render service, much more...
- Support some sort of built component archive?
- More cleanly handle library jars that will no longer be in WEB-INF/lib? ie other than having Gradle download from
dependencies and put in the <component>/lib directory
- Saved form-list Finds
- Save settings for a user or group to share (i.e. associate with userId or userGroupId). Allow for any group a user is in.
- WebSocket attempt 2
- Also see WebSocket notes under User Notification
- Build WebSocket interface for Moqui NotificationMessage interfaces, use javax.websocket as much as possible
(run initially on Jetty but be able to support other WebSocket libraries)
- Send updates by NotificationMessage to browser for messages, calendar events, tasks (MyAccount stuff)
- Prototype for background process notifications, to be used for various things but start with Payroll run
(have page return immediately, send notification when done)
- User Notification
- WebSocket clients: track userId, notificationName, connectionKey
- Entity (no, keep in memory): VisitClient - visitId*, userId*, topic*, connectionKey*
- when sending out WebSocket messages lookup all active Visits for userId and send to each connectionKey
- API (with at least an example transition) for WebSocket client registry; set connectionKey on current Visit
- use Camel WebSocket? jWebSocket? (how to send message to client connection key)
- after more research candidates are (no jWebSocket because it is huge and messy):
* java_websocket: smallest (90k), no dependencies on other libraries (like Tomcat or Jetty WS), very simple
library so no authc, no pubsub; has JS library for JS client and Flash SWF file for browsers with no WebSocket
- Atmosphere: med size (460k), supports variety of transports, but no internal WebSocket (relies on Tomcat, Jetty,
etc websocket impls), has pubsub model and sessions built-in, but questionable authc facility
x Manual notification:
x API pass in notificationName, Map message, userGroupId, boolean queue (true: queue if not connected, false: only send if connected)
x API to get all outstanding notifications
x Entity: NotificationMessage - notificationMessageId*, topic, userGroupId, messageJson (from message Map)
x Entity: NotificationMessageUser - notificationMessageId*, userId*, sentDate, receivedDate
- Add Moqui Conf XML elements to configure NotificationMessageListener classes
- Listener for Email with XML Screen to layout (and try out using JSON documents as nested Maps from a screen)
- where to configure the email and screen to use? use EmailTemplate/emailTemplateId, but where to specify?
- for notifications from DataFeeds can add DataFeed.emailTemplateId (or not, what about toAddresses, etc?)
- maybe have a more general way to configure details of topics, including emailTemplateId and screenLocation...
- Angular 2 Apps
- support by screen + subscreens, or enable/disable for all apps (with separate webroot or something)?
- update bootstrap (maybe get from CDN instead of including in source...)
- for screen generate
- component.ts file
- service.ts/js file with:
- service for each transition
- service to get data for screen actions
- services for section actions
- services for form row actions
- component.html file (use 'templateUrl' in Component annotation instead of 'template')
- or use single JS file with component, embedded template (use template: and not templateUrl:), transition services?
- with system.js need to transpile in the browser?
- can transpile into JS file using typescript4j; or generate component.js
- https://github.com/martypitt/typescript4j
- Steps toward Angular, more similar client/server artifacts
- Add Mustache TemplateRenderer
- https://github.com/spullara/mustache.java
- Add form-list.actions and form-single.actions elements
- Add REST endpoint configuration for CrUD operations to form-list and form-single
- call local when rendered server-side
- set base URL, use common patterns for get single/multiple record, create, update, and delete
- use internal data from RestApi class to determine valid services available
- Improved Distributed Datasource Support
- Put all framework, mantle entities in the 4 new groups: transactional, nontransactional, configuration, analytical
- Review warnings about view-entities that have members in multiple groups (which may be in different databases)
- Test with transactional in H2 and nontransactional, configuration, analytical in OrientDB
- Known changes needed
- Check distributed foreign keys in create, update, delete (make sure records exist or don't exist in other databases)
- Add augment-member to view-entity that can be in a separate database
- Make it easier to define view-entity so that caller can treat it mostly as a normal join-based view
- Augment query results with optionally cached values from records in a separate database
- For conditions on fields from augment-member do a pre-query to get set of PKs, use them in an IN condition on
the main query (only support simple AND scenario, error otherwise); sort of like a sub-select
- How to handle order by fields on augment-member? Might require separate query and some sort of fancy sorting...
- Possibly useful
- Consider meta-data management features such as versioning and more complete history for nontransactional and
configuration, preferably using some sort of more efficient underlying features in the datasource
(like Jackrabbit/Oak; any support for this in OrientDB? ElasticSearch keeps version number for concurrency, but no history)
- Write EntityFacade interface for ElasticSearch to use like OrientDB?
- Support persistence through EntityFacade as nested documents, ie specify that detail/etc entities be included in parent/master document
- SimpleFind interface as an alternative to EntityFind for datasources that don't support joins, etc (like OrientDB)
and maybe add support for the internal record ID that can be used for faster graph traversal, etc
- Hazelcast-based improvements
- configuration for 'microservice' deployments, partitioning services to run on particular servers in a cluster and
not others (partition groups or other partition feature?)
- can use for reliable WAN service calls like needed for EntitySync?
- ie to a remote cluster
- different from commercial only WAN replication feature
- would be nice for reliable message queue
- Quartz Scheduler
- can use Hazelcast for scheduled service execution in a cluster, perhaps something on top of, underneath, or instead of Quartz Scheduler?
- consider using Hazelcast as a Quartz JobStore, ie: https://github.com/FlavioF/quartz-scheduler-hazelcast-jobstore
- DB (or ElasticSearch?) MapStore for persisted (backed up) Hazelcast maps
- use MapStore and MapLoader interfaces
- see http://docs.hazelcast.org/docs/latest/manual/html-single/index.html#loading-and-storing-persistent-data
- https://github.com/mozilla-metrics/bagheera-elasticsearch
- older, useful only as a reference for implementing something like this in Moqui
- best to implement something using the EntityFacade for easier configuration, etc
- see JDBC, etc samples: https://github.com/hazelcast/hazelcast-code-samples/tree/master/distributed-map/mapstore/src/main/java
- Persisted Queue for Async Services, etc
- use QueueStore interface
- see http://docs.hazelcast.org/docs/latest/manual/html-single/index.html#queueing-with-persistent-datastore
- use DB?
- XML Screens
- Screen section-iterate pagination
- Screen form automatic client JS validation for more service in-parameters
for: number-range, text-length, text-letters, time-range, credit-card.@types
- Dynamic Screens (database-driven: DynamicScreen* entities)
- Entity Facade
- LiquiBase integration (entity.change-set element?)
- Add view log, like current change audit log (AuditLogView?)
- Improve entity cache auto-clear performance using ehcache search
http://ehcache.org/generated/2.9.0/html/ehc-all/#page/Ehcache_Documentation_Set%2Fto-srch_searching_a_cache.html%23
- Artifact Execution Facade
- Call ArtifactExecutionFacade.push() (to track, check authz, etc) for
other types of artifacts (if/as determined to be helpful), including:
Component, Webapp, Screen Section, Screen Form, Screen Form Field,
Template, Script, Entity Field
- For record-level authz automatically add constraints to queries if
the query follows an adequate pattern and authz requires it, or fail
authz if can't add constraint
- Tools Screens
- Auto Screen
- Editable data grid, created by form-list, for detail and assoc related entities
- Entity
- Entity model internal check (relationship, view-link.key-map, ?)
- Database meta-data check/report against entity definitions; NOTE: use LiquiBase for this
- Script Run (or groovy shell?)
- Service
- Configure and run chain of services (dynamic wizard)
- Artifact Info screens (with in/out references for all)
- Screen tree and graph browse screen
- Entity usage/reference section
- Service usage/reference section on ServiceDetail screen
- Screen to install a component (upload and register, load data from it; require special permission for this, not enabled on the demo server)
- Data Document and Feed
- API (or service?) push outstanding data changes (registration/connection, time trigger; tie to SystemMessage)
- API (or service?) receive/persist data change messages - going reverse of generation for DataDocuments... should be interesting
- Consumer System Registry
- feed transport (for each: supports confirmation?)
- WebSocket (use Notification system, based on notificationName (and userId?))
- Service to send email from DataFeed (ie receive#DataFeed implementation), use XML Screen for email content
- don't do this directly, do through NotificationMessage, ie the next item... or maybe not, too many parameters for
email from too many places related to a DataDocument, may not be flexible enough and may be quite messy
- Service (receive#DataFeed impl) to send documents as User NotificationMessages (one message per DataDocument); this
is probably the best way to tie a feed to WebSocket notifications for data updates
- Use the dataFeedId as the NotificationMessage topic
- Use this in HiveMind to send notifications of project, task, and wiki changes (maybe?)
- Integration
- OData (http://www.odata.org) compliant entity auto REST API
- like current but use OData URL structure, query parameters, etc
- mount on /odata4 as alternative to existing /rest
- generate EDMX for all entities (and exported services?)
- Generate minimal Data Document based on changes (per TX possible, runs async so not really; from existing doc, like current ES doc)
- Update database from Data Document
- Data Document UI
- show/edit field, rel alias, condition, link
- special form for add (edit?) field with 5 drop-downs for relationships, one for field, all updated based on
master entity and previous selections
- Data Document REST interface
- get single by dataDocumentId and PK values for primary entity
- search through ElasticSearch for those with associated feed/index
- json-schema, RAML, Swagger API defs
- generic service for sending Data Document to REST (or other?) end point
- Service REST API
- allow mapping DataDocument operations as well
x Add artifact type for REST Resource, Method
x Call ArtifactExecutionFacade.push/pop for RestApi calls
x Setup john.doe user with permissions for root of various APIs
- Add attribute for resource/method like screen for anonymous and no authz access
x Add Service REST API for moqui system admin services
- OAuth2 Support
- Use Apache Oltu, see https://cwiki.apache.org/confluence/display/OLTU/OAuth+2.0+Authorization+Server
- Spec at http://tools.ietf.org/html/rfc6749
- http://oltu.apache.org/apidocs/oauth2/reference/org/apache/oltu/oauth2/as/request/package-summary.html
- http://search.maven.org/#search|ga|1|org.apache.oltu
- https://stormpath.com/blog/build-api-restify-stormpath/
- https://github.com/PROCERGS/login-cidadao/blob/master/app/Resources/doc/en/examplejava.md
- https://github.com/swagger-api/swagger-ui/issues/807
- Add authz and token transitions in rest.xml
- Support in Service REST API (and entity/master?)
- Add examples of auth and service calls using OAuth2
- Add OAuth2 details in Swagger and RAML files
- More?
- AS2 Client and Server
- use OpenAS2 (http://openas2.sourceforge.net, https://github.com/OpenAS2/OpenAs2App)?
- tie into SystemMessage for send/receive (with AS2 service for send, code to receive SystemMessage from AS2 server)
- Email verification by random code on registration and email change
- Login through Google, Facebook, etc
- OpenID, SAML, OAuth, ...
- https://developers.facebook.com/docs/facebook-login/login-flow-for-web/v2.0
- Workflow that manages activity flow with screens and services attached to
activities, and tasks based on them taking users to defined or automatic
screen; see BonitaSoft.com Open Source BPM for similar concept; generally
workflow without requiring implementation of an entire app once the
workflow itself is defined