Showing preview only (5,156K chars total). Download the full file or copy to clipboard to get everything.
Repository: moqui/moqui-framework
Branch: master
Commit: d12a86e1ac73
Files: 336
Total size: 4.8 MB
Directory structure:
gitextract_s15y4lew/
├── .github/
│ └── workflows/
│ └── gradle-wrapper-validation.yml
├── .gitignore
├── .travis.yml
├── .whitesource
├── AUTHORS
├── LICENSE.md
├── MoquiInit.properties
├── Procfile
├── Procfile.README
├── README.md
├── ReleaseNotes.md
├── SECURITY.md
├── addons.xml
├── build.gradle
├── build.xml
├── docker/
│ ├── README.md
│ ├── build-compose-up.sh
│ ├── clean.sh
│ ├── compose-down.sh
│ ├── compose-up.sh
│ ├── elasticsearch/
│ │ ├── data/
│ │ │ └── README
│ │ └── moquiconfig/
│ │ ├── elasticsearch.yml
│ │ └── log4j2.properties
│ ├── kibana/
│ │ └── kibana.yml
│ ├── moqui-acme-postgres.yml
│ ├── moqui-cluster1-compose.yml
│ ├── moqui-mysql-compose.yml
│ ├── moqui-postgres-compose.yml
│ ├── moqui-run.sh
│ ├── mysql-compose.yml
│ ├── nginx/
│ │ └── my_proxy.conf
│ ├── opensearch/
│ │ └── data/
│ │ └── nodes/
│ │ └── README
│ ├── postgres-compose.yml
│ ├── postgres_backup.sh
│ └── simple/
│ ├── Dockerfile
│ └── docker-build.sh
├── framework/
│ ├── build.gradle
│ ├── data/
│ │ ├── CommonL10nData.xml
│ │ ├── CurrencyData.xml
│ │ ├── EntityTypeData.xml
│ │ ├── GeoCountryData.xml
│ │ ├── MoquiSetupData.xml
│ │ ├── SecurityTypeData.xml
│ │ └── UnitData.xml
│ ├── entity/
│ │ ├── BasicEntities.xml
│ │ ├── EntityEntities.xml
│ │ ├── OlapEntities.xml
│ │ ├── ResourceEntities.xml
│ │ ├── Screen.eecas.xml
│ │ ├── ScreenEntities.xml
│ │ ├── SecurityEntities.xml
│ │ ├── ServerEntities.xml
│ │ ├── ServiceEntities.xml
│ │ └── TestEntities.xml
│ ├── lib/
│ │ └── btm-4.0.1.jar
│ ├── screen/
│ │ ├── AddedEmailAuthcFactor.xml
│ │ ├── EmailAuthcFactorSent.xml
│ │ ├── NotificationEmail.xml
│ │ ├── PasswordReset.xml
│ │ ├── ScreenRenderEmail.xml
│ │ └── SingleUseCode.xml
│ ├── service/
│ │ └── org/
│ │ └── moqui/
│ │ ├── EmailServices.xml
│ │ ├── EntityServices.xml
│ │ ├── SmsServices.xml
│ │ ├── impl/
│ │ │ ├── BasicServices.xml
│ │ │ ├── ElFinderServices.xml
│ │ │ ├── EmailServices.xml
│ │ │ ├── EntityServices.xml
│ │ │ ├── EntitySyncServices.xml
│ │ │ ├── GoogleServices.xml
│ │ │ ├── InstanceServices.xml
│ │ │ ├── PrintServices.xml
│ │ │ ├── ScreenServices.xml
│ │ │ ├── ServerServices.xml
│ │ │ ├── ServiceServices.xml
│ │ │ ├── SystemMessageServices.xml
│ │ │ ├── UserServices.xml
│ │ │ └── WikiServices.xml
│ │ └── search/
│ │ ├── ElasticSearchServices.xml
│ │ └── SearchServices.xml
│ ├── src/
│ │ ├── main/
│ │ │ ├── groovy/
│ │ │ │ └── org/
│ │ │ │ └── moqui/
│ │ │ │ └── impl/
│ │ │ │ ├── actions/
│ │ │ │ │ └── XmlAction.java
│ │ │ │ ├── context/
│ │ │ │ │ ├── ArtifactExecutionFacadeImpl.groovy
│ │ │ │ │ ├── ArtifactExecutionInfoImpl.java
│ │ │ │ │ ├── CacheFacadeImpl.groovy
│ │ │ │ │ ├── ContextJavaUtil.java
│ │ │ │ │ ├── ElasticFacadeImpl.groovy
│ │ │ │ │ ├── ExecutionContextFactoryImpl.groovy
│ │ │ │ │ ├── ExecutionContextImpl.java
│ │ │ │ │ ├── L10nFacadeImpl.java
│ │ │ │ │ ├── LoggerFacadeImpl.groovy
│ │ │ │ │ ├── MessageFacadeImpl.groovy
│ │ │ │ │ ├── NotificationMessageImpl.groovy
│ │ │ │ │ ├── ResourceFacadeImpl.groovy
│ │ │ │ │ ├── TransactionCache.groovy
│ │ │ │ │ ├── TransactionFacadeImpl.groovy
│ │ │ │ │ ├── TransactionInternalBitronix.groovy
│ │ │ │ │ ├── UserFacadeImpl.groovy
│ │ │ │ │ ├── WebFacadeImpl.groovy
│ │ │ │ │ ├── reference/
│ │ │ │ │ │ ├── BaseResourceReference.java
│ │ │ │ │ │ ├── ComponentResourceReference.java
│ │ │ │ │ │ ├── ContentResourceReference.groovy
│ │ │ │ │ │ ├── DbResourceReference.groovy
│ │ │ │ │ │ └── WrapperResourceReference.groovy
│ │ │ │ │ ├── renderer/
│ │ │ │ │ │ ├── FtlMarkdownTemplateRenderer.groovy
│ │ │ │ │ │ ├── FtlTemplateRenderer.java
│ │ │ │ │ │ ├── GStringTemplateRenderer.groovy
│ │ │ │ │ │ ├── MarkdownTemplateRenderer.groovy
│ │ │ │ │ │ └── NoTemplateRenderer.groovy
│ │ │ │ │ └── runner/
│ │ │ │ │ ├── GroovyScriptRunner.groovy
│ │ │ │ │ ├── JavaxScriptRunner.groovy
│ │ │ │ │ └── XmlActionsScriptRunner.groovy
│ │ │ │ ├── entity/
│ │ │ │ │ ├── AggregationUtil.java
│ │ │ │ │ ├── EntityCache.groovy
│ │ │ │ │ ├── EntityConditionFactoryImpl.groovy
│ │ │ │ │ ├── EntityDataDocument.groovy
│ │ │ │ │ ├── EntityDataFeed.groovy
│ │ │ │ │ ├── EntityDataLoaderImpl.groovy
│ │ │ │ │ ├── EntityDataWriterImpl.groovy
│ │ │ │ │ ├── EntityDatasourceFactoryImpl.groovy
│ │ │ │ │ ├── EntityDbMeta.groovy
│ │ │ │ │ ├── EntityDefinition.groovy
│ │ │ │ │ ├── EntityDynamicViewImpl.groovy
│ │ │ │ │ ├── EntityEcaRule.groovy
│ │ │ │ │ ├── EntityFacadeImpl.groovy
│ │ │ │ │ ├── EntityFindBase.groovy
│ │ │ │ │ ├── EntityFindBuilder.java
│ │ │ │ │ ├── EntityFindImpl.java
│ │ │ │ │ ├── EntityJavaUtil.java
│ │ │ │ │ ├── EntityListImpl.java
│ │ │ │ │ ├── EntityListIteratorImpl.java
│ │ │ │ │ ├── EntityListIteratorWrapper.java
│ │ │ │ │ ├── EntityQueryBuilder.java
│ │ │ │ │ ├── EntitySqlException.groovy
│ │ │ │ │ ├── EntityValueBase.java
│ │ │ │ │ ├── EntityValueImpl.java
│ │ │ │ │ ├── FieldInfo.java
│ │ │ │ │ ├── condition/
│ │ │ │ │ │ ├── BasicJoinCondition.java
│ │ │ │ │ │ ├── ConditionAlias.java
│ │ │ │ │ │ ├── ConditionField.java
│ │ │ │ │ │ ├── DateCondition.groovy
│ │ │ │ │ │ ├── EntityConditionImplBase.java
│ │ │ │ │ │ ├── FieldToFieldCondition.groovy
│ │ │ │ │ │ ├── FieldValueCondition.java
│ │ │ │ │ │ ├── ListCondition.java
│ │ │ │ │ │ ├── TrueCondition.java
│ │ │ │ │ │ └── WhereCondition.groovy
│ │ │ │ │ └── elastic/
│ │ │ │ │ ├── ElasticDatasourceFactory.groovy
│ │ │ │ │ ├── ElasticEntityFind.java
│ │ │ │ │ ├── ElasticEntityListIterator.java
│ │ │ │ │ ├── ElasticEntityValue.java
│ │ │ │ │ └── ElasticSynchronization.groovy
│ │ │ │ ├── screen/
│ │ │ │ │ ├── ScreenDefinition.groovy
│ │ │ │ │ ├── ScreenFacadeImpl.groovy
│ │ │ │ │ ├── ScreenForm.groovy
│ │ │ │ │ ├── ScreenRenderImpl.groovy
│ │ │ │ │ ├── ScreenSection.groovy
│ │ │ │ │ ├── ScreenTestImpl.groovy
│ │ │ │ │ ├── ScreenTree.groovy
│ │ │ │ │ ├── ScreenUrlInfo.groovy
│ │ │ │ │ ├── ScreenWidgetRender.java
│ │ │ │ │ ├── ScreenWidgetRenderFtl.groovy
│ │ │ │ │ ├── ScreenWidgets.groovy
│ │ │ │ │ └── WebFacadeStub.groovy
│ │ │ │ ├── service/
│ │ │ │ │ ├── EmailEcaRule.groovy
│ │ │ │ │ ├── ParameterInfo.java
│ │ │ │ │ ├── RestApi.groovy
│ │ │ │ │ ├── ScheduledJobRunner.groovy
│ │ │ │ │ ├── ServiceCallAsyncImpl.groovy
│ │ │ │ │ ├── ServiceCallImpl.java
│ │ │ │ │ ├── ServiceCallJobImpl.groovy
│ │ │ │ │ ├── ServiceCallSpecialImpl.groovy
│ │ │ │ │ ├── ServiceCallSyncImpl.java
│ │ │ │ │ ├── ServiceDefinition.java
│ │ │ │ │ ├── ServiceEcaRule.groovy
│ │ │ │ │ ├── ServiceFacadeImpl.groovy
│ │ │ │ │ ├── ServiceJsonRpcDispatcher.groovy
│ │ │ │ │ ├── ServiceRunner.groovy
│ │ │ │ │ └── runner/
│ │ │ │ │ ├── EntityAutoServiceRunner.groovy
│ │ │ │ │ ├── InlineServiceRunner.java
│ │ │ │ │ ├── JavaServiceRunner.groovy
│ │ │ │ │ ├── RemoteJsonRpcServiceRunner.groovy
│ │ │ │ │ ├── RemoteRestServiceRunner.groovy
│ │ │ │ │ └── ScriptServiceRunner.java
│ │ │ │ ├── tools/
│ │ │ │ │ ├── H2ServerToolFactory.groovy
│ │ │ │ │ ├── JCSCacheToolFactory.groovy
│ │ │ │ │ ├── JackrabbitRunToolFactory.groovy
│ │ │ │ │ ├── MCacheToolFactory.java
│ │ │ │ │ └── SubEthaSmtpToolFactory.groovy
│ │ │ │ ├── util/
│ │ │ │ │ ├── EdiHandler.groovy
│ │ │ │ │ ├── ElFinderConnector.groovy
│ │ │ │ │ ├── ElasticSearchLogger.groovy
│ │ │ │ │ ├── JdbcExtractor.java
│ │ │ │ │ ├── MoquiShiroRealm.groovy
│ │ │ │ │ ├── RestSchemaUtil.groovy
│ │ │ │ │ ├── SimpleSgmlReader.groovy
│ │ │ │ │ └── SimpleSigner.java
│ │ │ │ └── webapp/
│ │ │ │ ├── ElasticRequestLogFilter.groovy
│ │ │ │ ├── GroovyShellEndpoint.groovy
│ │ │ │ ├── MoquiAbstractEndpoint.groovy
│ │ │ │ ├── MoquiAuthFilter.groovy
│ │ │ │ ├── MoquiContextListener.groovy
│ │ │ │ ├── MoquiFopServlet.groovy
│ │ │ │ ├── MoquiServlet.groovy
│ │ │ │ ├── MoquiSessionListener.groovy
│ │ │ │ ├── NotificationEndpoint.groovy
│ │ │ │ ├── NotificationWebSocketListener.groovy
│ │ │ │ └── ScreenResourceNotFoundException.groovy
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── moqui/
│ │ │ │ ├── BaseArtifactException.java
│ │ │ │ ├── BaseException.java
│ │ │ │ ├── Moqui.java
│ │ │ │ ├── context/
│ │ │ │ │ ├── ArtifactAuthorizationException.java
│ │ │ │ │ ├── ArtifactExecutionFacade.java
│ │ │ │ │ ├── ArtifactExecutionInfo.java
│ │ │ │ │ ├── ArtifactTarpitException.java
│ │ │ │ │ ├── AuthenticationRequiredException.java
│ │ │ │ │ ├── CacheFacade.java
│ │ │ │ │ ├── ElasticFacade.java
│ │ │ │ │ ├── ExecutionContext.java
│ │ │ │ │ ├── ExecutionContextFactory.java
│ │ │ │ │ ├── L10nFacade.java
│ │ │ │ │ ├── LogEventSubscriber.java
│ │ │ │ │ ├── LoggerFacade.java
│ │ │ │ │ ├── MessageFacade.java
│ │ │ │ │ ├── MessageFacadeException.java
│ │ │ │ │ ├── MoquiLog4jAppender.java
│ │ │ │ │ ├── NotificationMessage.java
│ │ │ │ │ ├── NotificationMessageListener.java
│ │ │ │ │ ├── PasswordChangeRequiredException.java
│ │ │ │ │ ├── ResourceFacade.java
│ │ │ │ │ ├── ScriptRunner.java
│ │ │ │ │ ├── SecondFactorRequiredException.java
│ │ │ │ │ ├── TemplateRenderer.java
│ │ │ │ │ ├── ToolFactory.java
│ │ │ │ │ ├── TransactionException.java
│ │ │ │ │ ├── TransactionFacade.java
│ │ │ │ │ ├── TransactionInternal.java
│ │ │ │ │ ├── UserFacade.java
│ │ │ │ │ ├── ValidationError.java
│ │ │ │ │ ├── WebFacade.java
│ │ │ │ │ └── WebMediaTypeException.java
│ │ │ │ ├── entity/
│ │ │ │ │ ├── EntityCondition.java
│ │ │ │ │ ├── EntityConditionFactory.java
│ │ │ │ │ ├── EntityDataLoader.java
│ │ │ │ │ ├── EntityDataWriter.java
│ │ │ │ │ ├── EntityDatasourceFactory.java
│ │ │ │ │ ├── EntityDynamicView.java
│ │ │ │ │ ├── EntityException.java
│ │ │ │ │ ├── EntityFacade.java
│ │ │ │ │ ├── EntityFind.java
│ │ │ │ │ ├── EntityList.java
│ │ │ │ │ ├── EntityListIterator.java
│ │ │ │ │ ├── EntityNotFoundException.java
│ │ │ │ │ ├── EntityValue.java
│ │ │ │ │ └── EntityValueNotFoundException.java
│ │ │ │ ├── etl/
│ │ │ │ │ ├── FlatXmlExtractor.java
│ │ │ │ │ └── SimpleEtl.java
│ │ │ │ ├── jcache/
│ │ │ │ │ ├── MCache.java
│ │ │ │ │ ├── MCacheConfiguration.java
│ │ │ │ │ ├── MCacheManager.java
│ │ │ │ │ ├── MEntry.java
│ │ │ │ │ └── MStats.java
│ │ │ │ ├── resource/
│ │ │ │ │ ├── ClasspathResourceReference.java
│ │ │ │ │ ├── ResourceReference.java
│ │ │ │ │ └── UrlResourceReference.java
│ │ │ │ ├── screen/
│ │ │ │ │ ├── ScreenFacade.java
│ │ │ │ │ ├── ScreenRender.java
│ │ │ │ │ └── ScreenTest.java
│ │ │ │ ├── service/
│ │ │ │ │ ├── ServiceCall.java
│ │ │ │ │ ├── ServiceCallAsync.java
│ │ │ │ │ ├── ServiceCallJob.java
│ │ │ │ │ ├── ServiceCallSpecial.java
│ │ │ │ │ ├── ServiceCallSync.java
│ │ │ │ │ ├── ServiceCallback.java
│ │ │ │ │ ├── ServiceException.java
│ │ │ │ │ └── ServiceFacade.java
│ │ │ │ └── util/
│ │ │ │ ├── CollectionUtilities.java
│ │ │ │ ├── ContextBinding.java
│ │ │ │ ├── ContextStack.java
│ │ │ │ ├── LiteStringMap.java
│ │ │ │ ├── MClassLoader.java
│ │ │ │ ├── MNode.java
│ │ │ │ ├── ObjectUtilities.java
│ │ │ │ ├── RestClient.java
│ │ │ │ ├── SimpleTopic.java
│ │ │ │ ├── StringUtilities.java
│ │ │ │ ├── SystemBinding.java
│ │ │ │ └── WebUtilities.java
│ │ │ ├── resources/
│ │ │ │ ├── META-INF/
│ │ │ │ │ ├── jakarta.mime.types
│ │ │ │ │ └── services/
│ │ │ │ │ └── org.moqui.context.ExecutionContextFactory
│ │ │ │ ├── MoquiDefaultConf.xml
│ │ │ │ ├── bitronix-default-config.properties
│ │ │ │ ├── cache.ccf
│ │ │ │ ├── log4j2.xml
│ │ │ │ ├── org/
│ │ │ │ │ └── moqui/
│ │ │ │ │ └── impl/
│ │ │ │ │ ├── pollEmailServer.groovy
│ │ │ │ │ ├── sendEmailMessage.groovy
│ │ │ │ │ └── sendEmailTemplate.groovy
│ │ │ │ └── shiro.ini
│ │ │ └── webapp/
│ │ │ └── WEB-INF/
│ │ │ └── web.xml
│ │ ├── start/
│ │ │ └── java/
│ │ │ └── MoquiStart.java
│ │ └── test/
│ │ └── groovy/
│ │ ├── CacheFacadeTests.groovy
│ │ ├── ConcurrentExecution.groovy
│ │ ├── EntityCrud.groovy
│ │ ├── EntityFindTests.groovy
│ │ ├── EntityNoSqlCrud.groovy
│ │ ├── L10nFacadeTests.groovy
│ │ ├── MessageFacadeTests.groovy
│ │ ├── MoquiSuite.groovy
│ │ ├── ResourceFacadeTests.groovy
│ │ ├── ServiceCrudImplicit.groovy
│ │ ├── ServiceFacadeTests.groovy
│ │ ├── SubSelectTests.groovy
│ │ ├── SystemScreenRenderTests.groovy
│ │ ├── TimezoneTest.groovy
│ │ ├── ToolsRestApiTests.groovy
│ │ ├── ToolsScreenRenderTests.groovy
│ │ ├── TransactionFacadeTests.groovy
│ │ └── UserFacadeTests.groovy
│ ├── template/
│ │ └── XmlActions.groovy.ftl
│ └── xsd/
│ ├── common-types-3.xsd
│ ├── email-eca-3.xsd
│ ├── entity-definition-3.xsd
│ ├── entity-eca-3.xsd
│ ├── framework-catalog.xml
│ ├── moqui-conf-3.xsd
│ ├── rest-api-3.xsd
│ ├── service-definition-3.xsd
│ ├── service-eca-3.xsd
│ ├── xml-actions-3.xsd
│ ├── xml-form-3.xsd
│ └── xml-screen-3.xsd
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/workflows/gradle-wrapper-validation.yml
================================================
name: "Validate Gradle Wrapper"
on: [push, pull_request]
jobs:
validation:
name: "Validation"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: gradle/wrapper-validation-action@v1
================================================
FILE: .gitignore
================================================
# gradle/build files
build
.gradle
/framework/dependencies
# build generated files
/moqui*.war
/Save*.zip
# runtime directory (separate repository so ignore directory entirely)
/runtime
/execwartmp
/docker/runtime
/docker/db
/docker/elasticsearch/data/nodes
/docker/opensearch/data/nodes/*
/docker/opensearch/data/*.conf
!/docker/opensearch/data/nodes/README
/docker/acme.sh
/docker/nginx/conf.d
/docker/nginx/vhost.d
/docker/nginx/html
## Do not want to accidentally commit production certificates https://www.theregister.com/2024/07/25/data_from_deleted_github_repos/
/docker/certs
!/docker/certs/moqui1.local.*
!/docker/certs/moqui2.local.*
!/docker/certs/moqui.local.*
!/docker/certs/README
# IntelliJ IDEA files
.idea
out
*.ipr
*.iws
*.iml
# Eclipse files (and some general ones also used by Eclipse)
.metadata
bin
tmp
*.tmp
*.bak
*.swp
*~.nib
local.properties
.settings
.loadpath
# NetBeans files
nbproject/private
nbbuild
.nb-gradle
nbdist
nbactions.xml
nb-configuration.xml
# VSCode files
.vscode
# Emacs files
.projectile
# Version managers (sdkman, mise, asdf)
mise.toml
.tool-versions
# OSX auto files
.DS_Store
.AppleDouble
.LSOverride
._*
# Windows auto files
Thumbs.db
ehthumbs.db
Desktop.ini
# Linux auto files
*~
================================================
FILE: .travis.yml
================================================
language: groovy
jdk:
- openjdk11
install: true
env:
- TERM=dumb
script:
- ./gradlew getRuntime
- ./gradlew load
- ./gradlew test --info
cache:
directories:
- $HOME/.gradle/caches
- $HOME/.gradle/wrapper
================================================
FILE: .whitesource
================================================
{
"generalSettings": {
"shouldScanRepo": true
},
"checkRunSettings": {
"vulnerableCheckRunConclusionLevel": "failure"
},
"issueSettings": {
"minSeverityLevel": "LOW"
}
}
================================================
FILE: AUTHORS
================================================
Moqui Framework (http://github.com/moqui/moqui)
This software is in the public domain under CC0 1.0 Universal plus a
Grant of Patent License.
To the extent possible under law, the author(s) have dedicated all
copyright and related and neighboring rights to this software to the
public domain worldwide. This software is distributed without any
warranty.
You should have received a copy of the CC0 Public Domain Dedication
along with this software (see the LICENSE.md file). If not, see
<http://creativecommons.org/publicdomain/zero/1.0/>.
===========================================================================
Copyright Waiver
I dedicate any and all copyright interest in this software to the
public domain. I make this dedication for the benefit of the public at
large and to the detriment of my heirs and successors. I intend this
dedication to be an overt act of relinquishment in perpetuity of all
present and future rights to this software under copyright law.
To the best of my knowledge and belief, my contributions are either
originally authored by me or are derived from prior works which I have
verified are also in the public domain and are not subject to claims
of copyright by other parties.
To the best of my knowledge and belief, no individual, business,
organization, government, or other entity has any copyright interest
in my contributions, and I affirm that I will not make contributions
that are otherwise encumbered.
Signed by git commit adding my legal name and git username:
Written in 2010-2022 by David E. Jones - jonesde
Written in 2021-2026 by D. Michael Jones - acetousk
Written in 2014-2015 by Solomon Bessire - sbessire
Written in 2014-2015 by Jacopo Cappellato - jacopoc
Written in 2014-2015 by Abdullah Shaikh - abdullahs
Written in 2014-2015 by Yao Chunlin - chunlinyao
Written in 2014-2015 by Jimmy Shen - shendepu
Written in 2014-2015 by Dony Zulkarnaen - donniexyz
Written in 2015 by Sam Hamilton - samhamilton
Written in 2015 by Leonardo Carvalho - CarvalhoLeonardo
Written in 2015 by Swapnil M Mane - swapnilmmane
Written in 2015 by Anton Akhiar - akhiar
Written in 2015-2023 by Jens Hardings - jenshp
Written in 2016 by Shifeng Zhang - zhangshifeng
Written in 2016 by Scott Gray - lektran
Written in 2016 by Mark Haney - mphaney
Written in 2016 by Qiushi Yan - yanqiushi
Written in 2017 by Oleg Andrieiev - oandreyev
Written in 2018 by Zhang Wei - zhangwei1979
Written in 2018 by Nirendra Singh - nirendra10695
Written in 2018-2023 by Ayman Abi Abdallah - aabiabdallah
Written in 2019 by Daniel Taylor - danieltaylor-nz
Written in 2020 by Jacob Barnes - Tellan
Written in 2020 by Amir Anjomshoaa - amiranjom
Written in 2021 by Deepak Dixit - dixitdeepak
Written in 2021 by Taher Alkhateeb - pythys
Written in 2022 by Zhang Wei - hellozhangwei
Written in 2023 by Rohit Pawar - rohitpawar2811
===========================================================================
Grant of Patent License
I hereby grant to recipients of software a perpetual, worldwide,
non-exclusive, no-charge, royalty-free, irrevocable (except as stated in
this section) patent license to make, have made, use, offer to sell, sell,
import, and otherwise transfer the Work, where such license applies only to
those patent claims licensable by me that are necessarily infringed by my
Contribution(s) alone or by combination of my Contribution(s) with the
Work to which such Contribution(s) was submitted. If any entity institutes
patent litigation against me or any other entity (including a cross-claim
or counterclaim in a lawsuit) alleging that my Contribution, or the Work to
which I have contributed, constitutes direct or contributory patent
infringement, then any patent licenses granted to that entity under this
Agreement for that Contribution or Work shall terminate as of the date such
litigation is filed.
Signed by git commit adding my legal name and git username:
Written in 2010-2022 by David E. Jones - jonesde
Written in 2021-2021 by D. Michael Jones - acetousk
Written in 2014-2015 by Solomon Bessire - sbessire
Written in 2014-2015 by Jacopo Cappellato - jacopoc
Written in 2014-2015 by Yao Chunlin - chunlinyao
Written in 2015 by Dony Zulkarnaen - donniexyz
Written in 2015 by Swapnil M Mane - swapnilmmane
Written in 2015 by Jimmy Shen - shendepu
Written in 2015-2016 by Sam Hamilton - samhamilton
Written in 2015 by Leonardo Carvalho - CarvalhoLeonardo
Written in 2015 by Anton Akhiar - akhiar
Written in 2015-2023 by Jens Hardings - jenshp
Written in 2016 by Shifeng Zhang - zhangshifeng
Written in 2016 by Scott Gray - lektran
Written in 2016 by Mark Haney - mphaney
Written in 2016 by Qiushi Yan - yanqiushi
Written in 2017 by Oleg Andrieiev - oandreyev
Written in 2018 by Zhang Wei - zhangwei1979
Written in 2018 by Nirendra Singh - nirendra10695
Written in 2018-2023 by Ayman Abi Abdallah - aabiabdallah
Written in 2019 by Daniel Taylor - danieltaylor-nz
Written in 2020 by Jacob Barnes - Tellan
Written in 2020 by Amir Anjomshoaa - amiranjom
Written in 2021 by Deepak Dixit - dixitdeepak
Written in 2021 by Taher Alkhateeb - pythys
Written in 2022 by Zhang Wei - hellozhangwei
Written in 2023 by Rohit Pawar - rohitpawar2811
===========================================================================
================================================
FILE: LICENSE.md
================================================
Because of a lack of patent licensing in CC0 1.0 this software includes a
separate Grant of Patent License adapted from Apache License 2.0.
===========================================================================
Creative Commons Legal Code
CC0 1.0 Universal
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
HEREUNDER.
Statement of Purpose
The laws of most jurisdictions throughout the world automatically confer
exclusive Copyright and Related Rights (defined below) upon the creator
and subsequent owner(s) (each and all, an "owner") of an original work of
authorship and/or a database (each, a "Work").
Certain owners wish to permanently relinquish those rights to a Work for
the purpose of contributing to a commons of creative, cultural and
scientific works ("Commons") that the public can reliably and without fear
of later claims of infringement build upon, modify, incorporate in other
works, reuse and redistribute as freely as possible in any form whatsoever
and for any purposes, including without limitation commercial purposes.
These owners may contribute to the Commons to promote the ideal of a free
culture and the further production of creative, cultural and scientific
works, or to gain reputation or greater distribution for their Work in
part through the use and efforts of others.
For these and/or other purposes and motivations, and without any
expectation of additional consideration or compensation, the person
associating CC0 with a Work (the "Affirmer"), to the extent that he or she
is an owner of Copyright and Related Rights in the Work, voluntarily
elects to apply CC0 to the Work and publicly distribute the Work under its
terms, with knowledge of his or her Copyright and Related Rights in the
Work and the meaning and intended legal effect of CC0 on those rights.
1. Copyright and Related Rights. A Work made available under CC0 may be
protected by copyright and related or neighboring rights ("Copyright and
Related Rights"). Copyright and Related Rights include, but are not
limited to, the following:
i. the right to reproduce, adapt, distribute, perform, display,
communicate, and translate a Work;
ii. moral rights retained by the original author(s) and/or performer(s);
iii. publicity and privacy rights pertaining to a person's image or
likeness depicted in a Work;
iv. rights protecting against unfair competition in regards to a Work,
subject to the limitations in paragraph 4(a), below;
v. rights protecting the extraction, dissemination, use and reuse of data
in a Work;
vi. database rights (such as those arising under Directive 96/9/EC of the
European Parliament and of the Council of 11 March 1996 on the legal
protection of databases, and under any national implementation
thereof, including any amended or successor version of such
directive); and
vii. other similar, equivalent or corresponding rights throughout the
world based on applicable law or treaty, and any national
implementations thereof.
2. Waiver. To the greatest extent permitted by, but not in contravention
of, applicable law, Affirmer hereby overtly, fully, permanently,
irrevocably and unconditionally waives, abandons, and surrenders all of
Affirmer's Copyright and Related Rights and associated claims and causes
of action, whether now known or unknown (including existing as well as
future claims and causes of action), in the Work (i) in all territories
worldwide, (ii) for the maximum duration provided by applicable law or
treaty (including future time extensions), (iii) in any current or future
medium and for any number of copies, and (iv) for any purpose whatsoever,
including without limitation commercial, advertising or promotional
purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
member of the public at large and to the detriment of Affirmer's heirs and
successors, fully intending that such Waiver shall not be subject to
revocation, rescission, cancellation, termination, or any other legal or
equitable action to disrupt the quiet enjoyment of the Work by the public
as contemplated by Affirmer's express Statement of Purpose.
3. Public License Fallback. Should any part of the Waiver for any reason
be judged legally invalid or ineffective under applicable law, then the
Waiver shall be preserved to the maximum extent permitted taking into
account Affirmer's express Statement of Purpose. In addition, to the
extent the Waiver is so judged Affirmer hereby grants to each affected
person a royalty-free, non transferable, non sublicensable, non exclusive,
irrevocable and unconditional license to exercise Affirmer's Copyright and
Related Rights in the Work (i) in all territories worldwide, (ii) for the
maximum duration provided by applicable law or treaty (including future
time extensions), (iii) in any current or future medium and for any number
of copies, and (iv) for any purpose whatsoever, including without
limitation commercial, advertising or promotional purposes (the
"License"). The License shall be deemed effective as of the date CC0 was
applied by Affirmer to the Work. Should any part of the License for any
reason be judged legally invalid or ineffective under applicable law, such
partial invalidity or ineffectiveness shall not invalidate the remainder
of the License, and in such case Affirmer hereby affirms that he or she
will not (i) exercise any of his or her remaining Copyright and Related
Rights in the Work or (ii) assert any associated claims and causes of
action with respect to the Work, in either case contrary to Affirmer's
express Statement of Purpose.
4. Limitations and Disclaimers.
a. No trademark or patent rights held by Affirmer are waived, abandoned,
surrendered, licensed or otherwise affected by this document.
b. Affirmer offers the Work as-is and makes no representations or
warranties of any kind concerning the Work, express, implied,
statutory or otherwise, including without limitation warranties of
title, merchantability, fitness for a particular purpose, non
infringement, or the absence of latent or other defects, accuracy, or
the present or absence of errors, whether or not discoverable, all to
the greatest extent permissible under applicable law.
c. Affirmer disclaims responsibility for clearing rights of other persons
that may apply to the Work or any use thereof, including without
limitation any person's Copyright and Related Rights in the Work.
Further, Affirmer disclaims responsibility for obtaining any necessary
consents, permissions or other rights required for any use of the
Work.
d. Affirmer understands and acknowledges that Creative Commons is not a
party to this document and has no duty or obligation with respect to
this CC0 or use of the Work.
===========================================================================
Grant of Patent License
"License" shall mean the terms and conditions for use, reproduction, and
distribution.
"Licensor" shall mean the original copyright owner or entity authorized by
the original copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all other
entities that control, are controlled by, or are under common control with
that entity. For the purposes of this definition, "control" means (i) the
power, direct or indirect, to cause the direction or management of such
entity, whether by contract or otherwise, or (ii) ownership of fifty
percent (50%) or more of the outstanding shares, or (iii) beneficial
ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity exercising
permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation source,
and configuration files.
"Object" form shall mean any form resulting from mechanical transformation
or translation of a Source form, including but not limited to compiled
object code, generated documentation, and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or Object form,
made available under the License, as indicated by a copyright notice that
is included in or attached to the work.
"Derivative Works" shall mean any work, whether in Source or Object form,
that is based on (or derived from) the Work and for which the editorial
revisions, annotations, elaborations, or other modifications represent, as
a whole, an original work of authorship. For the purposes of this License,
Derivative Works shall not include works that remain separable from, or
merely link (or bind by name) to the interfaces of, the Work and
Derivative Works thereof.
"Contribution" shall mean any work of authorship, including the original
version of the Work and any modifications or additions to that Work or
Derivative Works thereof, that is intentionally submitted to Licensor for
inclusion in the Work by the copyright owner or by an individual or Legal
Entity authorized to submit on behalf of the copyright owner. For the
purposes of this definition, "submitted" means any form of electronic,
verbal, or written communication sent to the Licensor or its
representatives, including but not limited to communication on electronic
mailing lists, source code control systems, and issue tracking systems that
are managed by, or on behalf of, the Licensor for the purpose of discussing
and improving the Work, but excluding communication that is conspicuously
marked or otherwise designated in writing by the copyright owner as "Not a
Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity on
behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
Each Contributor hereby grants to You a perpetual, worldwide,
non-exclusive, no-charge, royalty-free, irrevocable (except as stated in
this section) patent license to make, have made, use, offer to sell, sell,
import, and otherwise transfer the Work, where such license applies only to
those patent claims licensable by such Contributor that are necessarily
infringed by their Contribution(s) alone or by combination of their
Contribution(s) with the Work to which such Contribution(s) was submitted.
If You institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work or a
Contribution incorporated within the Work constitutes direct or
contributory patent infringement, then any patent licenses granted to You
under this License for that Work shall terminate as of the date such
litigation is filed.
================================================
FILE: MoquiInit.properties
================================================
# No copyright or license for configuration file, details here are not
# considered a creative work.
# This file is used for the base settings when deploying moqui.war as a
# webapp in a servlet container or running the WAR file as an executable
# JAR with java -jar.
# NOTE: configure here before running "gradle build", this file is added
# to the war file.
# You can override these settings with command-line arguments like:
# -Dmoqui.runtime=runtime
# -Dmoqui.conf=conf/MoquiProductionConf.xml
# The location of the runtime directory for Moqui to use.
# If empty it will come from the "moqui.runtime" system property.
#
# The default property below assumes the application server is started in a
# directory that is a sibling to a "moqui" directory that contains a "runtime"
# directory.
moqui.runtime=../moqui/runtime
# NOTE: if there is a "runtime" directory in the war file (in the root of the
# webapp) that will be used instead of this setting to make it easier to
# include the runtime in a deployed war without knowing where it will be
# exploded in the file system.
# The Moqui Conf XML file to use for runtime settings.
# This property is relative to the runtime location.
moqui.conf=conf/MoquiProductionConf.xml
================================================
FILE: Procfile
================================================
web: java -cp . MoquiStart port=5000 conf=conf/MoquiProductionConf.xml
================================================
FILE: Procfile.README
================================================
No memory or other JVM options specified here so that the standard JAVA_TOOL_OPTIONS env var may be used (command line args trump JAVA_TOOL_OPTIONS)
For example: export JAVA_TOOL_OPTIONS="-Xmx1024m -Xms1024m"
Note that in Java 21 if no max heap size is specified it will default to 1/4 system memory
The port specified here is the default for the AWS ElasticBeanstalk Java SE image
see: https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-se-procfile.html
================================================
FILE: README.md
================================================
## Welcome to Moqui Framework
[](https://github.com/moqui/moqui-framework/blob/master/LICENSE.md)
[](https://travis-ci.org/moqui/moqui-framework)
[](https://github.com/moqui/moqui-framework/releases)
[](https://github.com/moqui/moqui-framework/commits/master)
[](https://github.com/moqui/moqui-framework/releases)
[](https://github.com/moqui/moqui-framework/releases/tag/v4.0.0)
[](https://forum.moqui.org)
[](https://groups.google.com/d/forum/moqui)
[](https://www.linkedin.com/groups/4640689)
[](https://gitter.im/moqui/moqui-framework?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[](http://stackoverflow.com/questions/tagged/moqui)
For information about community infrastructure for code, discussions, support, etc see the Community Guide:
<https://www.moqui.org/docs/moqui/Community+Guide>
For details about running and deploying Moqui see:
<https://www.moqui.org/docs/framework/Run+and+Deploy>
Note that a runtime directory is required for Moqui Framework to run, but is not included in the source repository. The
Gradle get component, load, and run tasks will automatically add the default runtime (from the moqui-runtime repository).
For information about the current and near future status of Moqui Framework
see the [ReleaseNotes.md](https://github.com/moqui/moqui-framework/blob/master/ReleaseNotes.md) file.
For an overview of features see:
<https://www.moqui.org/docs/framework/Framework+Features>
Get started with Moqui development quickly using the Tutorial at:
<https://www.moqui.org/docs/framework/Quick+Tutorial>
For comprehensive documentation of Moqui Framework see the wiki based documentation on moqui.org (*running on Moqui HiveMind*):
<https://www.moqui.org/m/docs/framework>
================================================
FILE: ReleaseNotes.md
================================================
# Moqui Framework Release Notes
## Release 4.0.0 - 27 Feb 2026
Moqui framework v4.0.0 is a major new release with massive changes some of which
are breaking changes. All users are advised to upgrade to benefit from all the
new features, security fixes, upgrades, performance improvements and so on.
### Major Changes
#### Java Upgrade to Version 21 (Incompatible Change)
Moqui Framework now requires Java 21. This provides improved performance,
long-term support, and access to modern JVM features, while removing legacy
APIs. All custom code and components must be validated against Java 21 to ensure
compatibility.
As part of this work:
- Remove deprecated finalize methods no longer applicable in JDK21.
- Lots of code improvements to comply with JDK21.
#### Groovy upgrade to version 5 (Incompatible Change)
Groovy 5 in combination with newer JDK21 is more strict in @CompileStatic. There
were illegal bytecodes being generated, and it has to do with accessing fields
from inner classes.
Another change is that Groovysh is removed. Therefore, the terminal interface
was rewritten from scratch using a different architecture based on
`groovy.lang.GroovyShell`. This led to both Screen changes (in runtime) and
backend changes.
#### Change EntityValue API (Breaking Change)
Change `EntityValue.getEntityName()` to `EntityValue.resolveEntityName()` and
`EntityValue.getEntityNamePretty()` to `EntityValue.resolveEntityNamePretty()`.
Groovy 4+ introduced a change in the way property to method mapping happens as
[documented](https://groovy-lang.org/style-guide.html#_getters_and_setters).
This introduced a bug that occurs when querying an entity that has a field named
`entityName`. The bug occurs because the query returns an object of type
`org.moqui.entity.EntityValue`. The problem is that the EntityValue class has a
method called getEntityName() and as per the groovy 4+ behavior this function is
called when trying to access a field named `entityName`. Sample code:
```
def someMember = ec.entity
.find('moqui.entity.view.DbViewEntityMember')
.condition(...)
.one()
someMember.entityName // BUG returns .getEntityName(), not .get('entityName')
```
#### Upgrade to Jetty version 12.1 and EE 11
This is a major migration. It bumps jetty to version 12.1 and also servlet
related packages (websocket, webapp, proxy) to jakarta EE 11.
The upgrade broke the existing custom moqui class loaders, and required
significant refactoring of class loaders and webapp structure (e.g.
WebAppContext, Session Handling, etc ...)
Impact on developers:
Any custom work for jetty should be upgraded to the new versions compatible with
jetty 12.1 and jakarta EE 11
#### Upgrade all javax libraries to jakarta
All libraries including commons-fileupload, xml.bind-api, activation, mail,
websocket, servlets (6.1), and others are all migrated to their jakarta
equivalents. As part of this exercise, many deprecated, old or irrelevant / not
used dependencies were removed. This change required refactoring critical moqui
facades and core API to comply with the switch to Jakarta.
Any custom work for older javax should be upgraded where applicable to use the
jakarta equivalent libraries.
#### Integration with the New Bitronix Fork (Incompatible Change)
Moqui Framework now depends on the actively maintained Bitronix fork at:
https://github.com/moqui/bitronix
The current integrated version is 4.0.0-BETA1, with stabilization ongoing.
This fork includes:
- Major modernization and cleanup
- Jakarta namespace migration
- JMS namespace migration
- Important bug fixes and stability improvements
- Legacy Bitronix artifacts are no longer supported.
- Deployments must remove old Bitronix dependencies.
#### Migration From javax.transaction to jakarta.transaction (BREAKING CHANGE)
Moqui has migrated all transaction-related imports and internal APIs from
javax.transaction.* to jakarta.transaction.*, following changes in the new
Bitronix fork.
Impact on developers:
- Any code referencing javax.transaction.* must update imports to
jakarta.transaction.*.
- Affects transaction facade usage, user transactions, and service-layer
transaction management.
- If using custom transaction API, then compilation failures should be expected
until imports are updated. This does not impact projects that are purely
depending on moqui facades without accessing the underlying APIs
This aligns Moqui with the Jakarta EE namespace changes and the newer Bitronix
transaction manager.
#### Upgrade Infrastructure
- Postgres to version 18.1
- MySQL to version 9.5
- Remove docker compose "version" obsolete key
- Upgrade opensearch to 3.4.0
- Upgrade java in docker to eclipse-temurin:21
- Switch jwilder/nginx-proxy to nginxproxy/nginx-proxy
These upgrades require careful planning when migrating to moqui V4. It is
recommended to delete elastic / open search and reindex, and to switch
from elasticsearch to opensearch. Also ensure an upgrade path for your chosen
database.
Also, in newer versions of docker, the "version" key is obsolete, so ensure
updating installed docker so that it works without the "version" setting.
#### Gradle Wrapper Updated to 9.2 (BREAKING CHANGE)
The framework now builds using Gradle 9.2, bringing:
- Faster builds
- Stricter validation and deprecation cleanup
Changes included:
- Refactored property assignments and function calls to satisfy newer Gradle immutability rules.
- Replaced deprecated exec {} blocks with Groovy execute() usage (Windows support still being refined).
- Updated and corrected dependency declarations, including replacing deprecated modules and fixing invalid version strings.
- Numerous misc. updates required by Gradle 9.x API changes.
- Unified dependencyUpdates settings
This upgrade required significant modifications to component build scripts.
Given the upgrade to gradle, Java and bitronix, the following community components were upgraded to comply with new requirements:
- HiveMind
- PopCommerce
- PopRestStore
- example
- mantle-braintree
- mantle-usl
- moqui-camel
- moqui-cups
- moqui-fop
- moqui-hazelcast
- moqui-image
- moqui-orientdb
- moqui-poi
- moqui-runtime
- moqui-sftp
- moqui-sso
- moqui-wikitext
- start
### New Features
- Upgrade groovy to version 5
- Upgrade to JDK21 by default
- Upgrade to Apache Shiro 2, no longer using INI factory, but rather INI environment classes
- Upgrade to jetty 2.1 and jakarta EE 11
- Upgrade docker infrastructure including opensearch, mysql, postgres to latest
- Upgrade all dependencies to their latest versions
- Switch from Thread.getId() to Thread.threadId() to work on both virtual and platform threads
## Release 3.9.9 - 25 Feb 2026
Moqui Framework 3.9.9 is a minor new feature and bug fix release, but mostly a maintenance release for the Moqui Framework
4.0.0 release series.
For a complete list see the commit log:
https://github.com/moqui/moqui-framework/compare/v3.0.0...v3.9.9
## Release 3.1.0 - Canceled release
## Release 3.0.0 - 31 May 2022
Moqui Framework 3.0.0 is a major new feature and bug fix release with some changes that are not backward compatible.
Java 11 is now the minimum Java version required. For development and deployment make sure Java 11 is installed
(such as openjdk-11-jdk or adoptopenjdk-11-openj9 on Linux), active (on Linux use 'sudo update-alternatives --config java'),
and that JAVA_HOME is set to the Java 11 JDK install path (for openjdk-11-jdk on Linux: /usr/lib/jvm/java-11-openjdk-amd64).
In this release the old moqui-elasticsearch component with embedded ElasticSearch is no longer supported. Instead, the new
ElasticFacade is included in the framework as a client to an external OpenSearch or ElasticSearch instance which can be
installed in runtime/opensearch or runtime/elasticsearch and automatically started/stopped in a separate process by the
MoquiStart class (executable WAR, not when WAR file dropped into Servlet container).
For search the recommended versions for this release are OpenSearch 1.3.1 (https://opensearch.org/) or ElasticSearch 7.10.2.
For ElasticSearch this is the last version released under the Apache 2.0 license).
Now that JavaScript/CSS minify and certain other issues with tools have been resolved, Gradle 7+ is supported.
This is a brief summary of the changes since the last release, for a complete list see the commit log:
https://github.com/moqui/moqui-framework/compare/v2.1.3...v3.0.0
### Non Backward Compatible Changes
- Java 11 is now required, updated from Java 8
- Updated Spock to 2.1 and with that update now using JUnit Platform and JUnit 5 (Jupiter); with this update old JUnit 4
test annotations and such are supported, but JUnit 4 TestSuite implementations need to be updated to use the new
JUnit Platform and Jupiter annotations
- Library updates have been done that conflict with ElasticSearch making it impossible to run embedded
- XMLRPC support had been partly removed years ago, is now completely removed
- CUPS4J library no longer included in moqui-framework, use the moqui-cups component to add this functionality
- Network printing services (org.moqui.impl.PrintServices) are now mostly placeholders that return error messages if used, CUPS4J
library and services that depend on it are now in the moqui-cups tool component
- H2 has non-backward compatible changes, including VALUE now being a reserved word; the Moqui Conf XML file now supports
per-database entity and field name substitution to handle this and similar future issues; the main issue this cannot
solve is with older H2 database files that have columns named VALUE, these may need to be changes to THE_VALUE using
an older version of H2 before updating (this is less common as H2 databases are not generally retained long-term)
### New Features
- Recommended Gradle version is 7+ with updates to support the latest versions of Gradle
- Updated Jetty to version 10 (which requires Java 11 or later)
- MFA support for login and update password in screens and REST API with factors including authc code by email and SMS,
TOTP code (via authenticator app), backup codes; can set a flag on UserGroup to require second factor for all users in
the group, and if any user has any additional factor enable then a second factor will be required
- Various security updates including vulnerabilities in 3rd party libraries (including Log4j, Jackson, Shiro, Jetty),
and some in Moqui itself including XSS vulnerabilities in certain error cases and other framework generated
messages/responses based on testing with OWASP Zap and two commercial third party reviews (done by larger Moqui users)
- Optimization for startup-add-missing to get meta data for all tables and columns instead of per entity for much faster startup
when enabled; default for runtime-add-missing is now 'false' and startup-add-missing is now 'true' for all DBs including H2
- View Entity find improvements
- correlated sub-select using SQL LATERAL (mysql8, postgres, db2) or APPLY (mssql and oracle; not yet implemented)
- extend the member-entity.@sub-select attribute with non-lateral option where not wanted, is used by default as is best for how
sub-select is commonly used in view entities
- entity find SQL improvements for view entities where a member entity links to another member-entity with a function on a join field
- support entity-condition in view-entity used as a sub-select, was being ignored before
- Improvements to DataDocument generation for a DataFeed to handle very large database tables to feed to ES or elsewhere,
including chunking and excluding service parameters from the per ExecutionContext instance service call history
- DataFeed and DataDocument support for manual delete of documents and automatic delete on primary entity record delete
- Scheduled screen render to send regular reports to users by email (simple email with CSV or XSLT attachment) using
saved finds on any form-list based screen
- For entity field encryption default to PBEWithHmacSHA256AndAES_128 instead of PBEWithMD5AndDES, and add configuration
options for old field encrypt settings (algo, key, etc) to support changing settings, with a service to re-encrypt all
encrypted fields on all records, or can re-encrypt only when data is touched (as long as all old settings are retained,
the framework will attempt decrypt with each)
- Groovy Shell screen added to the Tools app (with special permission), an interactive Groovy Console for testing in
various environments and for fixing certain production issues
### Bug Fixes
- H2 embedded shutdown hook removal updated, no more Bitronix errors on shutdown from H2 already having been terminated
## Release 2.1.3 - 07 Dec 2019
Moqui Framework 2.1.3 is a patch level new feature and bug fix release.
There are only minor changes and fixes in this release. For a complete list of changes see:
https://github.com/moqui/moqui-framework/compare/v2.1.2...v2.1.3
This is the last release where the moqui-elasticsearch component for embedded ElasticSearch will be supported. It is
being replaced by the new ElasticFacade included in this release.
### New Features
- Java 11 now supported with some additional libraries (like javax.activation) included by default; some code changes
to address deprecations in the Java 11 API but more needed to resolve all for better future compatibility
(in other words expect deprecation warnings when building with Java 11)
- Built-in ElasticSearch client in the new ElasticFacade that uses pooled HTTP connections with the Moqui RestClient
for the ElasticSearch JSON REST API; this is most easily used with Groovy where you can use the inline Map and List
syntax to build what becomes the JSON body for search and other requests; after this release it will replace the old
moqui-elasticsearch component, now included in the framework because the large ES jar files are no longer required
- RestClient improvements to support an externally managed RequestFactory to maintain a HttpClient across requests
for connection pooling, managing cookies, etc
- Support for binary render modes for screen with new ScreenWidgetRender interface and screen-facade.screen-output
element in the Moqui Conf XML file; this was initially implemented to support an xlsx render mode implemented in
the new moqui-poi tool component
- Screen rendering to XLSX file with one sheet to form-list enabled with the form-list.@show-xlsx-button attribute,
the XLS button will only show if the moqui-poi tool component is in place
- Support for binary rendered screen attachments to emails, and reusable emailScreenAsync transition and EmailScreenSection
to easily add a form to screens to send the screen render as an attachment to an outgoing email, rendered in the background
- WikiServices to upload and delete attachments, and delete wiki pages; improvements to clone wiki page
## Release 2.1.2 - 23 July 2019
Moqui Framework 2.1.2 is a patch level new feature and bug fix release.
There are only minor changes and fixes in this release. For a complete list of changes see:
https://github.com/moqui/moqui-framework/compare/v2.1.1...v2.1.2
### New Features
- Service include for refactoring, etc with new services.service-include element
- RestClient now supports retry on timeout for call() and 429 (velocity) return for callFuture()
- The general worker thread pool now checks for an active ExecutionContext after each run to make sure destroyed
- CORS preflight OPTIONS request and CORS actual request handling in MoquiServlet
- headers configured using cors-preflight and cors-actual types in webapp.response-header elements with default headers in MoquiDefaultConf.xml
- allowed origins configured with the webapp.@allow-origins attribute which defaults the value of the 'webapp_allow_origins'
property or env var for production configuration; default to empty which means only same origin is allowed
- Docker and instance management monitoring and configuration option improvements, Postgres support for database instances
- Entity field currency-amount now has 4 decimal digits in the DB and currency-precise has 5 decimal digits for more currency flexibility
- Added minRetryTime to ServiceJob to avoid immediate and excessive retries
- New Gradle tasks for managing git tags
- Support for read only clone datasource configuration and use (if available) in entity finds
### Bug Fixes
- Issue with DataFeed Runnable not destroying the ExecutionContext causing errors to bleed over
- Fix double content type header in RestClient in certain scenarios
## Release 2.1.1 - 29 Nov 2018
Moqui Framework 2.1.1 is a patch level new feature and bug fix release.
While this release has new features maybe significant enough to warrant a 2.2.0 version bump it is mostly refinements and
improvements to existing functionality or to address design limitations and generally make things easier and cleaner.
There are various bug fixes and security improvements in this release. There are no known backward compatibility issues since the
last release but there are minor cases where default behavior has changed (see detailed notes).
### New Features
- Various library updates (see framework/build.gradle for details)
- Updated to Gradle 4 along with changes to gradle files that require Gradle 4.0 or later
- In gradle addRuntime task create version.json files for framework/runtime and for each component, shown on System app dashboard
- New gradle gitCheckoutAll task to bulk checkout branches with option to create
- New default/example Procfile, include in moqui-plus-runtime.war
##### Web Facade and HTTP
- RestClient improvements for background requests with a Future, retry on 429 for velocity limited APIs, multipart requests, etc
- In user preferences support override by Java system property (or env var if default-property declared in Moqui Conf XML)
- Add WebFacade.getRequestBodyText() method, use to get body text more easily and now necessary as WebFacade reads the body for all
requests with a text content type instead of just application/json or text/json types as before
- Add email support for notifications with basic default template, enabled only per user for a specific NotificationTopic
- Add NotificationTopic for web (screen) critical errors
- Invalidate session before login (with attributes copy to new session) to mitigate session fixation attacks
- Add more secure defaults for Strict-Transport-Security, Content-Security-Policy, and X-Frame-Options
##### XML Screen and Form
- Support for Vue component based XML Screens using a .js file and a .vuet file that gets merged into the Vue component as the
template (template can be inline in the .js file); for an example see the DynamicExampleItems.xml screen in the example component
- XML Screen and WebFacade response headers now configurable with webapp.response-header element in Moqui Conf XML
- Add moqui-conf.screen-facade.screen and screen.subscreens-item elements that override screen.subscreens.subscreens-item elements
within a screen definition so that application root screens can be added under webroot and apps in a MoquiConf.xml file in a
component or in the active Moqui Conf XML file instead of using database records
- Add support for 'no sub-path' subscreens to extend or override screens, transitions, and resources under the parent screen by
looking first in each no sub-path subscreen for a given screen path and if not found then look under the parent screen; for
example this is used in the moqui-org component for the moqui.org web-site so that /index.html is found in the moqui-org
component and so that /Login resolves to the Login.xml screen in the moqui-org component instead of the default one under webroot
- Add screen path alias support configured with ScreenPathAlias entity records
- Now uses URLDecoder for all screen path segments to match use of URLEncoder as default for URL encoding in output
- In XML Screen transition both service-call and actions are now allowed, service-call runs first
- Changed Markdown rendering from Pegdown to flexmark-java to support CommonMark 0.28, some aspects of GitHub Flavored Markdown,
and automatic table of contents
- Add form-single.@pass-through-parameters attribute to create hidden inputs for current request parameters
- Moved validate-* attributes from XML Form field element to sub-field elements so that in form-list different validation can be
done for header, first-/second-/last-row, and default-/conditional-field; as part of this the automatic validate settings from
transition.service-call are now set on the sub-field instead of the field element
##### Service Facade
- Add seca.@id and eeca.@id attributes to specify optional IDs that can be used to override or disable SECAs and EECAs
- SystemMessage improvements for security, HTTP receive endpoint, processing/etc timeouts, etc
- Service semaphore concurrency improvements, support for semaphore-name which defaults to prior behavior of service name
##### Entity Facade
- Add eeca.set-results attribute to set results of actions in the fields for rules run before entity operation
- Add entity.relationship.key-value element for constants on join conditions
- Authorization based entity find filters are now applied after view entities are trimmed so constraints are only added for
entities actually used in the query
- EntityDataLoader now supports a create only mode (used in the improved Data Import screen in the Tools app, usable directly)
- Add mysql8 database conf for new MySQL 8 JDBC driver
### Bug Fixes
- Serious bug in MoquiAuthFilter where it did not destroy ExecutionContext leaving it in place for the next request using that
thread; also changed MoquiServlet to better protect against existing ExecutionContext for thread; also changed WebFacade init
from HTTP request to remove current user if it doesn't match user authenticated in session with Shiro, or if no user is
authenticated in session
- MNode merge methods did not properly clear node by name internal cache when adding child nodes causing new children to show up
in full child node list but not when getting first or all children by node name if they had been accessed by name before the merge
- Fix RestClient path and parameter encoding
- Fix RestClient basic authentication realm issue, now custom builds Authorization request header
- Fix issue in update#Password service with reset password when UserAccount has a resetPassword but no currentPassword
- Disable default geo IP lookup for Visit records because the freegeoip service has been discontinued
- Fix DataFeed trigger false positives for PK fields on related entities included in DataDocument definitions
- Fix transaction response type screen-last in vuet/vapps mode, history wasn't being maintained server side
## Release 2.1.0 - 22 Oct 2017
Moqui Framework 2.1.0 is a minor new feature and bug fix release.
Most of the effort in the Moqui Ecosystem since the last release has been on the business artifact and application levels. Most of
the framework changes have been for improved user interfaces but there have also been various lower level refinements and
enhancements.
This release has a few bug fixes from the 2.0.0 release and has new features like DbResource and WikiPage version management,
a simple tool for ETL, DataDocument based dynamic view entities, and various XML Screen and Form widget options and usability
improvements. This release was originally planned to be a patch level release primarily for bug fixes but very soon after the 2.0.0
release work start on the Vue based client rendering (SPA) functionality and various other new features that due to business deals
progressed quickly.
The default moqui-runtime now has support for hybrid static/dynamic XML Screen rendering based on Vue JS. There are various changes
for better server side handling but most changes are in moqui-runtime. See the moqui-runtime release notes for more details.
Some of these changes may be useful for other client rendering purposes, ie for other client side tools and frameworks.
### Non Backward Compatible Changes
- New compile dependency on Log4J2 and not just SLF4J
- DataDocument JSON generation no longer automatically adds all primary key fields of the primary entity to allow for aggregation
by function in DataDocument based queries (where DataDocument is used to create a dynamic view entity); for ElasticSearch indexing
a unique ID is required so all primary key fields of the primary entity should be defined
- The DataDocumentField, DataDocumentCondition, and DataDocumentLink entities now have an artificial/sequenced secondary key instead
of using another field (fieldPath, fieldNameAlias, label); existing tables may work with some things but reloading seed data will
fail if you have any DataDocument records in place; these are typically seed data records so the easiest way to update/migrate
is to drop the tables for DataDocumentField/Link/Condition entities and then reload seed data as normal for a code update
- If using moqui-elasticsearch the index approach has changed to one index per DataDocument to prep for ES6 and improve the
performance and index types by field name; to update an existing instance it is best to start with an empty ES instance or at
least delete old indexes and re-index based on data feeds
- The default Dockerfile now runs the web server on port 80 instead of 8080 within the container
### New Features
- Various library updates
- SLF4J MDC now used to track moqui_userId and moqui_visitorId for logging
- New ExecutionContextFactory.registerLogEventSubscriber() method to register for Log4J2 LogEvent processing, initially used in the
moqui-elasticsearch component to send log messages to ElasticSearch for use in the new LogViewer screen in the System app
- Improved Docker Compose samples with HTTPS and PostgreSQL, new file for Kibana behind transparent proxy servlet in Moqui
- Added MoquiAuthFilter that can be used to require authorization and specified permission for arbitrary paths such as servlets;
this is used along with the Jetty ProxyServlet$Transparent to provide secure access to things server only accessible tools like
ElasticSearch (on /elastic) and Kibana (on /kibana) in the moqui-elasticsearch component
- Multi service calls now pass results from previous calls to subsequent calls if parameter names match, and return results
- Service jobs may now have a lastRunTime parameter passed by the job scheduler; lastRunTime on lock and passed to service is now
the last run time without an error
- view-entity now supports member-entity with entity-condition and no key-map for more flexible join expressions
- TransactionCache now handles more situations like using EntityListIterator.next() calls and not just getCompleteList(), and
deletes through the tx cache are more cleanly handled for records created through the tx cache
- ResourceReference support for versions in supported implementations (initially DbResourceReference)
- ResourceFacade locations now support a version suffix following a hash
- Improved wiki services to track version along with underlying ResourceReference
- New SimpleEtl class plus support for extract and load through EntityFacade
- Various improvements in send#EmailTemplate, email view tracking with transparent pixel image
- Improvements for form-list aggregations and show-total now supports avg, count, min, max, first, and last in addition to sum
- Improved SQLException handling with more useful messages and error codes from database
- Added view-entity.member-relationship element as a simpler alternative to member-entity using existing relationships
- DataDocumentField now has a functionName attribute for functions on fields in a DataDocument based query
- Any DataDocument can now be treated as an entity using the name pattern DataDocument.${dataDocumentId}
- Sub-select (sub-query) is now supported for view-entity by a simple flag on member-entity (or member-relationship); this changes
the query structure so the member entity is joined in a select clause with any conditions for fields on that member entity put
in its where clause instead of the where clause for the top-level select; any fields selected are selected in the sub-select as
are any fields used for the join ON conditions; the first example of this is the InvoicePaymentApplicationSummary view-entity in
mantle-usl which also uses alias.@function and alias.complex-alias to use concat_ws for combined name aliases
- Sub-select also now supported for view-entity members of other view entities; this provides much more flexibility for functions
and complex-aliases in the sub-select queries; there are also examples of this in mantle-usl
- Now uses Jackson Databind for JSON serialization and deserialization; date/time values are in millis since epoch
### Bug Fixes
- Improved exception (throwable) handling for service jobs, now handled like other errors and don't break the scheduler
- Fixed field.@hide attribute not working with runtime conditions, now evaluated each time a form-list is rendered
- Fixed long standing issue with distinct counts and limited selected fields, now uses a distinct sub-select under a count select
- Fixed long standing issue where view-entity aliased fields were not decrypted
- Fixed issue with XML entity data loading using sub-elements for related entities and under those sub-elements for field data
- Fixed regression in EntityFind where cache was used even if forUpdate was set
- Fixed concurrency issue with screen history (symptom was NPE on iterator.next() call)
## Release 2.0.0 - 24 Nov 2016
Moqui Framework 2.0.0 is a major new feature and bug fix release, with various non backward compatible API and other changes.
This is the first release since 1.0.0 with significant and non backwards compatible changes to the framework API. Various deprecated
methods have been removed. The Cache Facade now uses the standard javax.cache interfaces and the Service Facade now uses standard
java.util.concurrent interfaces for async and scheduled services. Ehcache and Quartz Scheduler have been replaced by direct,
efficient interfaces implementations.
This release includes significant improvements in configuration and with the new ToolFactory functionality is more modular with
more internals exposed through interfaces and extendable through components. Larger and less universally used tool are now in
separate components including Apache Camel, Apache FOP, ElasticSearch, JBoss KIE and Drools, and OrientDB.
Multi-server instances are far better supported by using Hazelcast for distributed entity cache invalidation, notifications,
caching, background service execution, and for web session replication. The moqui-hazelcast component is pre-configured to enable
all of this functionality in its MoquiConf.xml file. To use add the component and add a hazelcast.xml file to the classpath with
settings for your cluster (auto-discover details, etc).
Moqui now scales up better with performance improvements, concurrency fixes, and Hazelcast support (through interfaces other
distributed system libraries like Apache Ignite could also be used). Moqui also now scales down better with improved memory
efficiency and through more modular tools much smaller runtime footprints are possible.
The multi-tenant functionality has been removed and replaced with the multi-instance approach. There is now a Dockerfile included
with the recommended approach to run Moqui in Docker containers and Docker Compose files for various scenarios including an
automatic reverse proxy using nginx-proxy. There are now service interfaces and screens in the System application for managing
multiple Moqui instances from a master instance. Instances with their own database can be automatically provisioned using
configurable services, with initial support for Docker containers and MySQL databases. Provisioning services will be added over time
to support other instance hosts and databases, and you can write your own for whatever infrastructure you prefer to use.
To support WebSocket a more recent Servlet API the embedded servlet container is now Jetty 9 instead of Winstone. When running
behind a proxy such as nginx or httpd running in the embedded mode (executable WAR file) is now adequate for production use.
If you are upgrading from an earlier version of Moqui Framework please read all notes about Non Backward Compatible Changes. Code,
configuration, and database meta data changes may be necessary depending on which features of the framework you are using.
In this version Moqui Framework starts and runs faster, uses less memory, is more flexible, configuration is easier, and there are
new and better ways to deploy and manage multiple instances. A decent machine ($1800 USD Linux workstation, i7-6800K 6 core CPU)
generated around 350 screens per second with an average response time under 200ms. This was running Moqui and MySQL on the same
machine with a JMeter script running on a separate machine doing a 23 step order to ship/bill process that included 2 reports
(one MySQL based, one ElasticSearch based) and all the GL posting, etc. The load simulated entering and shipping (by internal users)
around 1000 orders/minute which would support thousands of concurrent internal or ecommerce users. On larger server hardware and
with some lower level tuning (this was on stock/default Linux, Java 8, and MySQL 5.7 settings) a single machine could handle
significantly more traffic.
With the latest framework code and the new Hazelcast plugin Moqui supports high performance clusters to handle massive loads. The
most significant limit is now database performance as we need a transactional SQL database for this sort of business process
(with locking on inventory reservations and issuances, GL posting, etc as currently implemented in Mantle USL).
Enjoy!
### Non Backward Compatible Changes
- Java JDK 8 now required (Java 7 no longer supported)
- Now requires Servlet Container supporting the Servlet 3.1 specification
- No longer using Winstone embedded web server, now using Jetty 9
- Multi-Tenant Functionality Removed
- ExecutionContext.getTenant() and getTenantId() removed
- UserFacade.loginUser() third parameter (tenantId) removed
- CacheFacade.getCache() with second parameter for tenantId removed
- EntityFacade no longer per-tenant, getTenantId() removed
- TransactionInternal and EntityDatasourceFactory methods no longer have tenantId parameter
- Removed tenantcommon entity group and moqui.tenant entities
- Removed tenant related MoquiStart command line options
- Removed tenant related Moqui Conf XML, XML Screen, etc attributes
- Entity Definitions
- XSDs updated for these changes, though old attributes still supported
- changed entity.@package-name to entity.@package
- changed entity.@group-name to entity.@group
- changed relationship.@related-entity-name to relationship.@related
- changed key-map.@related-field-name to key-map.@related
- UserField no longer supported (UserField and UserFieldValue entities)
- XML Screen and Form
- field.@entry-name attribute replaced by field.@from attribute (more meaningful, matches attribute used on set element); the old
entry-name attribute is still supported, but removed from XSD
- Service Job Scheduling
- Quartz Scheduler has been removed, use new ServiceJob instead with more relevant options, much cleaner and more manageable
- Removed ServiceFacade.getScheduler() method
- Removed ServiceCallSchedule interface, implementation, and ServiceFacade.schedule() factory method
- Removed ServiceQuartzJob class (impl of Job interface)
- Removed EntityJobStore class (impl of JobStore interface); this is a huge and complicated class to handle the various
complexities of Quartz and was never fully working, had some remaining issues in testing
- Removed HistorySchedulerListener and HistoryTriggerListener classes
- Removed all entities in the moqui.service.scheduler and moqui.service.quartz packages
- Removed quartz.properties and quartz_data.xml configuration files
- Removed Scheduler screens from System app in tools component
- For all of these artifacts see moqui-framework commit #d42ede0 and moqui-runtime commit #6a9c61e
- Externalized Tools
- ElasticSearch (and Apache Lucene)
- libraries, classes and all related services, screens, etc are now in the moqui-elasticsearch component
- System/DataDocument screens now in moqui-elasticsearch component and added to tools/System app through SubscreensItem record
- all ElasticSearch services in org.moqui.impl.EntityServices moved to org.moqui.search.SearchServices including:
index#DataDocuments, put#DataDocumentMappings, index#DataFeedDocuments, search#DataDocuments, search#CountBySource
- Moved index#WikiSpacePages service from org.moqui.impl.WikiServices to org.moqui.search.SearchServices
- ElasticSearch dependent REST API methods moved to the 'elasticsearch' REST API in the moqui-elasticsearch component
- Apache FOP is now in the moqui-fop tool component; everything in the framework, including the now poorly named MoquiFopServlet,
use generic interfaces but XML-FO files will not transform to PDF/etc without this component in place
- OrientDB and Entity Facade interface implementations are now in the moqui-orientdb component, see its README.md for usage
- Apache Camel along with the CamelServiceRunner and MoquiServiceEndpoint are now in the moqui-camel component which has a
MoquiConf.xml file so no additional configuration is needed
- JBoss KIE and Drools are now in tool component moqui-kie, an optional component for mantle-usl; has MoquiConf to add ToolFactory
- Atomikos TM moved to moqui-atomikos tool component
- ExecutionContext and ExecutionContextFactory
- Removed initComponent(), destroyComponent() methods; were never well supported (runtime component init/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)
- NotificationMessage
- NotificationMessage, NotificationMessageListener interfaces have various changes for more features and to better support
serialized messages for notification through a distributed topic
- 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
- Service parameter.subtype element removed, use the much more flexible nested parameter element
- 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
- OWASP ESAPI and AntiSamy
- ESAPI removed, now using simple StringEscapeUtils from commons-lang
- AntiSamy replaced by Jsoup.clean()
- Removed ServiceSemaphore entity, now using ServiceParameterSemaphore
- Deprecated methods
- These methods were deprecated (by methods with shorter names) long ago and with other API changes now removing them
- Removed getLocalizedMessage() and formatValue() from L10nFacade
- Removed renderTemplateInCurrentContext(), runScriptInCurrentContext(), evaluateCondition(), evaluateContextField(), and
evaluateStringExpand() from ResourceFacade
- Removed EntityFacade.makeFind()
- 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
- Removed ArtifactAuthzRecord/Cond entities and support for them; this was never all that useful and is replaced by the
ArtifactAuthzFilter and EntityFilter entities
- The ContextStack class has moved to the org.moqui.util package
- Replaced Apache HttpComponents client with jetty-client to get support for HTTP/2, cleaner API, better async support, etc
- 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
- using Jetty 9 which requires Java 8
- now internally using Servlet API 3.1.0
- Many library updates, cleanup of classes found in multiple jar files (ElasticSearch JarHell checks pass; nice in general)
- 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
- Deployment and Docker
- The MoquiStart class can now run from an expanded WAR file, i.e. from a directory with the contents of a Moqui executable WAR
- On startup DataSource (database) connections are retried 5 times, every 5 seconds, for situations where init of separate
containers is triggered at the same time like with Docker Compose
- Added a MySQLConf.xml file where settings can come from Java system properties or system environment variables
- The various webapp.@http* attributes can now be set as system properties or environment variables
- Added a Dockerfile and docker-build.sh script to build a Docker image from moqui-plus-runtime.war or moqui.war and runtime
- Added sample Docker Compose files for moqui+mysql, and for moqui, mysql, and nginx-proxy for reverse proxy that supports
virtual hosts for multiple Docker containers running Moqui
- Added script to run a Docker Compose file after copying configuration and data persistence runtime directories if needed
- Multi-Instance Management
- New services (InstanceServices.xml) and screens in the System app for Moqui instance management
- This replaces the removed multi-tenant functionality
- Initially supports Docker for the instance hosting environment via Docker REST API
- Initially supports MySQL for instance databases (one DB per instance, just like in the past)
- 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
- WebSocket Support
- Now looks for javax.websocket.server.ServerContainer in ServletContext during init, available from ECFI.getServerContainer()
- If ServletContainer found adds endpoints defined in the webapp.endpoint element in the Moqui Conf XML file
- Added MoquiAbstractEndpoint, extend this when implementing an Endpoint so that Moqui objects such as ExecutionContext/Factory
are available, UserFacade initialized from handshake (HTTP upgrade) request, etc
- Added NotificationEndpoint which listens for NotificationMessage through ECFI and sends them over WebSocket to notify user
- NotificationMessage
- Notifications can now be configured to send through a topic interface for distributed topics (implemented in the
moqui-hazelcast component); this handles the scenario where a notification is generated on one server but a user is connected
(by WebSocket, etc) to another
- Various additional fields for display in the JavaScript NotificationClient including type, title and link templates, etc
- 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
- Support for distributed caches such as Hazelcast
- New interfaces to plugin entity distributed cache invalidation through a SimpleTopic interface, supported in moqui-hazelcast
- Set many entities to cache=never, avoid overhead of cache where read/write ratio doesn't justify it or 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
- Added ServiceCallAsync.distribute() method
- Added distribute option to XML Actions service-call.@async attribute
- Distributed executor is configurable, supported in moqui-hazelcast
- Distributed services allow offloading service execution to worker nodes
- Service Jobs
- Configure ad-hoc (explicitly executed) or scheduled jobs using the new ServiceJob and related entities
- Tracks execution in ServiceJobRun records
- Can send NotificationMessage, success or error, to configured topic
- Run service job through ServiceCallJob interface, ec.service.job()
- Replacement for Quartz Scheduler scheduled services
- Added SubEtha SMTP server which receives email messages and calls EMECA rules, an alternative to polling IMAP and POP3 servers
- Hazelcast Integration (moqui-hazelcast component)
- These features are only enabled with this tool component in place
- Added default Hazelcast web session replication config
- Hazelcast can be used for distributed entity cache, web session replication, distributed execution, and OrientDB clustering
- 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
- XSL-FO rendering now supports a generic ToolFactory to create a org.xml.sax.ContentHandler object, with an implementation
using Apache FOP now in the moqui-fop component
- 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 RepositoryFactory parameters
- Added ADMIN_PASSWORD permission for administrative password change (in UserServices.update#Password service)
- Added UserServices.enable#UserAccount service to enable disabled account
- 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 (user, etc)
- Added configuration for worker thread pool parameters, used for local async services, EC.runAsync, etc
- Transaction Facade
- The write-through transaction cache now supports a read only mode
- Added service.@no-tx-cache attribute which flushes and disables write through transaction cache for the rest of the transaction
- Added flushAndDisableTransactionCache() method to flush/disable the write through cache like service.@no-tx-cache
- Entity Facade
- In view-entity.alias.complex-alias the expression attribute is now expanded so context fields may be inserted or other Groovy
expressions evaluated using dollar-sign curly-brace (${}) syntax
- Added view-entity.alias.case element with when and else sub-elements that contain complex-alias elements; these can be used for
CASE, CASE WHEN, etc SQL expressions
- EntityFind.searchFormMap() now has a defaultParameters argument, used when no conditions added from the input fields Map
- EntityDataWriter now supports export with a entity master definition name, applied only to entities exported that have a master
definition with the given master name
- XML Screen and Form
- screen path URLs that don't exist are now by default disabled instead of throwing an exception
- 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
- added search-form-inputs.default-parameters element whose attributes are used as defaultParameters in searchFormMap()
- ArtifactAuthzFailure records are only created when a user tries to use an artifact, not when simply checking to see if use is
permitted (such as in menus, links, etc)
- significant macro cleanups and improvements
- csv render macros now improved to support more screen elements, more intelligently handle links (only include anchor/text), etc
- text render macros now use fixed width output (number of characters) along with new field attributes to specify print settings
- added field.@aggregate attribute for use in form-list with options to aggregate field values across multiple results or
display fields in a sub-list under a row with the common fields for the group of rows
- added form-single.@owner-form attribute to skip HTML form element and add the HTML form attribute to fields so they are owned
by a different form elsewhere in the web page
- The /status path now a transition instead of a screen and returns JSON with more server status information
- XML Actions now statically import all the old StupidUtilities methods so 'StupidUtilities.' is no longer needed, shouldn't be used
- StupidUtilities and StupidJavaUtilities reorganized into the new ObjectUtilities, CollectionUtilities, and StringUtilities
classes in the moqui.util package (in the moqui-util project)
### Bug Fixes
- Fixed issues with clean shutdown running with the embedded Servlet container and with gradle test
- Fixed issue with REST and other requests using various HTTP request methods that were not handled, MoquiServlet now uses the
HttpServlet.service() method instead of the various do*() methods
- Fixed issue with REST and other JSON request body parameters where single entry lists were unwrapped to just the entry
- Fixed NPE in EntityFind.oneMaster() when the master value isn't found, 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 adding a permission on the fly
- Fixed issue with Entity/DataEdit screens in the Tools application where the parameter and form field name 'entityName' conflicted
with certain entities that have a field named entityName
- Concurrency Issues
- Fixed concurrent update errors in EntityCache RA (reverse association) using Collections.synchronizedList()
- Fixed per-entity DataFeed info rebuild to avoid multiple runs and rebuild before adding to cache in use to avoid partial data
- Fixed attribute and child node wrapper caching in FtlNodeWrapper where in certain cases a false null would be returned
## 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 Road Map
- Support local printers, scales, etc in web-based apps using https://qz.io/
- PDF, Office, etc document indexing for wiki attachments (using Apache Tika)
- Wiki page version history with full content history diff, etc; store just differences, lib for that?
- https://code.google.com/archive/p/java-diff-utils/
- compile group: 'com.googlecode.java-diff-utils', name: 'diffutils', version: '1.3.0'
- https://bitbucket.org/cowwoc/google-diff-match-patch/
- compile group: 'org.bitbucket.cowwoc', name: 'diff-match-patch', version: '1.1'
- Option for transition to only mount if all response URLs for screen paths exist
- 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.
- allow different aggregate/show-total/etc options in select-columns, more complex but makes sense?
- add form-list presets in xml file, like saved finds but perhaps more options? allow different aggregate settings in presets?
- form-list data prep, more self-contained
- X form-list.entity-find element support instead of form-list.@list attribute
- _ form-list.service-call
- _ also more general form-list.actions element?
- form-single.entity-find-one element support, maybe form-single.actions too
- Instance Provisioning and Management
- embedded and gradle docker client (for docker host or docker swarm)
- direct through Docker API
- https://docs.docker.com/engine/reference/commandline/dockerd/#bind-docker-to-another-host-port-or-a-unix-socket
- https://docs.docker.com/engine/security/https/
- https://docs.docker.com/engine/reference/api/docker_remote_api/
- Support incremental (add/subtract) updates in EntityValue.update() or a variation of it; deterministic DB style
- Support seek for faster pagination like jOOQ: https://blog.jooq.org/2013/10/26/faster-sql-paging-with-jooq-using-the-seek-method/
- 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...
- Some sort of EntityDynamicView handling without joins possible? Maybe augment member methods?
- DataDocument support across multiple databases, doing something other than one big dynamic join...
- 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
- Try Caffeine JCache at https://github.com/ben-manes/caffeine
- do in moqui-caffeine tool component
- add multiple threads to SpeedTest.xml?
- WebSocket Notifications
- Increment message, event, task count labels in header?
- DataDocument add flag if new or updated
- if new increment count with JS
- Side note: DataDocument add info about what was updated somehow?
- User Notification
- Add Moqui Conf XML elements to configure NotificationMessageListener classes
- Listener to send 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...
- 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 V4 (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?)
- use Apache Olingo (http://olingo.apache.org)
- see: https://templth.wordpress.com/2015/04/27/implementing-an-odata-service-with-olingo/
- also add an ElasticSearch interface? https://templth.wordpress.com/2015/04/03/handling-odata-queries-with-elasticsearch/
- 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
- Add attribute for resource/method like screen for anonymous and no authz access
- OAuth2 Support
- Simple OAuth2 for authentication only
- https://tools.ietf.org/html/draft-ietf-oauth-v2-27#section-4.4
- use current api key functionality, or expand for limiting tokens to a particular client by registered client ID
- 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
================================================
FILE: SECURITY.md
================================================
# Security Policy
## Supported Versions
The primary supported version for each repository is the latest commit in the master (primary) branch.
Moqui Ecosystem projects are maintained by volunteer contributors, primarily people who use and work with the code as part of their employment or professional services. There are periodic community releases but most distributions and releases involve custom code and are managed, internally or publicly, by third parties. Community releases are checkpoint releases, not maintained release branches, and are best for evaluation rather than production use.
Moqui uses a 'continous release' approach for managing code repositories. Aside from new (work-in-progress) and archived repositories, the master branch in each repository is considered production ready. Rather than running a centrally dictated release schedule and process, the focus is on keeping master branches in a production ready state so that users may use whatever release process and frequency they prefer.
For most use cases we recommend using code directly from the master branch in each repository. For stabilization and periodic updates (instead of continuous) we recommend using a fork for each git repository with an 'upstream' remote pointing to the Moqui Ecosystem repository for easy upstream updates.
## Reporting a Vulnerability
To report security issues that should not be disclosed publicly before they are fixed, please use the private **[moqui-board@googlegroups.com](mailto:moqui-board@googlegroups.com)** mailing list. This is setup so that anyone can send messages to it, but only members of the group can read the messages.
## Issues and Pull Requests
For more information on submitting issues and pull requests please see the [Issue and Pull Request Guide](https://moqui.org/m/docs/moqui/Issue+and+Pull+Request+Guide) on moqui.org.
================================================
FILE: addons.xml
================================================
<addons default-repository="github">
<!--
========== MODIFYING THIS FILE NOT RECOMMENDED ==========
Contains known open source Moqui components, those in the GitHub 'moqui' group and others.
To add or override repository, runtime, and component elements use a "myaddons.xml" file.
-->
<repository name="github">
<location type="current" url="https://github.com/${component.'@group'}/${component.'@name'}/archive/${component.'@branch'}.zip"/>
<location type="release" url="https://github.com/${component.'@group'}/${component.'@name'}/archive/v${component.'@version'}.zip"/>
<location type="binary" url="https://github.com/${component.'@group'}/${component.'@name'}/releases/download/v${component.'@version'}/${component.'@name'}-${component.'@version'}.zip"/>
<location type="git" url="https://github.com/${component.'@group'}/${component.'@name'}.git"/>
</repository>
<repository name="github-ssh">
<location type="current" url="https://github.com/${component.'@group'}/${component.'@name'}/archive/${component.'@branch'}.zip"/>
<location type="release" url="https://github.com/${component.'@group'}/${component.'@name'}/archive/v${component.'@version'}.zip"/>
<location type="binary" url="https://github.com/${component.'@group'}/${component.'@name'}/releases/download/v${component.'@version'}/${component.'@name'}-${component.'@version'}.zip"/>
<location type="git" url="git@github.com:${component.'@group'}/${component.'@name'}.git"/>
</repository>
<repository name="bitbucket">
<location type="current" url="https://bitbucket.org/${component.'@group'}/${component.'@name'}/get/${component.'@branch'}.zip"/>
<location type="release" url="https://bitbucket.org/${component.'@group'}/${component.'@name'}/get/v${component.'@version'}.zip"/>
<location type="git" url="https://bitbucket.org/${component.'@group'}/${component.'@name'}.git"/>
</repository>
<repository name="bitbucket-ssh">
<location type="current" url="https://bitbucket.org/${component.'@group'}/${component.'@name'}/get/${component.'@branch'}.zip"/>
<location type="release" url="https://bitbucket.org/${component.'@group'}/${component.'@name'}/get/v${component.'@version'}.zip"/>
<location type="git" url="git@bitbucket.org:${component.'@group'}/${component.'@name'}.git"/>
</repository>
<repository name="bitbucket-token">
<location type="git" url="https://x-token-auth:${component.'@token'}@bitbucket.org/${component.'@group'}/${component.'@name'}.git"/>
</repository>
<!-- Where to get runtime directory if not present -->
<runtime name="moqui-runtime" group="moqui" version="4.0.0" branch="master"/>
<!-- Example Component -->
<component name="example" group="moqui" version="4.0.0" branch="master"/>
<component name="start" group="moqui" version="1.0.2" branch="master"/>
<!-- Moqui Tool Components -->
<component name="moqui-aws" group="moqui" version="1.1.2" branch="master"/>
<component name="moqui-camel" group="moqui" version="2.0.0" branch="master"/>
<component name="moqui-cups" group="moqui" version="1.0.2" branch="master"/>
<!-- no longer supported: <component name="moqui-elasticsearch" group="moqui" version="1.2.2" branch="master"/> -->
<component name="moqui-fop" group="moqui" version="2.0.0" branch="master"/>
<component name="moqui-hazelcast" group="moqui" version="2.0.0" branch="master"/>
<component name="moqui-image" group="moqui" version="1.0.0" branch="master"/>
<component name="moqui-kie" group="moqui" version="2.0.0" branch="master"/>
<component name="moqui-orientdb" group="moqui" version="2.0.0" branch="master"/>
<component name="moqui-poi" group="moqui" version="1.0.3" branch="master"/>
<component name="moqui-sftp" group="moqui" version="1.0.3" branch="master"/>
<component name="moqui-sso" group="moqui" version="2.0.0" branch="master"/>
<component name="moqui-wikitext" group="moqui" version="1.0.5" branch="master"/>
<!-- <component name="moqui-atomikos" group="moqui" version="1.0.0" branch="master"/> Deprecated after Moqui 4.0 release and bitronix fork (Atomikos intentionally broke community version to sell commercial; not actively maintained -->
<!-- Mantle Business Artifact and Integration Components -->
<component name="mantle-udm" group="moqui" version="2.2.1" branch="master"/>
<component name="mantle-usl" group="moqui" version="3.0.0" branch="master"/>
<component name="AuthorizeDotNet" group="moqui" version="1.2.5" branch="master"/>
<component name="mantle-edi" group="moqui" version="1.1.5" branch="master"/>
<component name="mantle-paytrace" group="moqui" version="1.0.3" branch="master"/>
<component name="mantle-shippo" group="moqui" version="1.2.1" branch="master"/>
<component name="mantle-yotpo" group="moqui" version="1.0.2" branch="master"/>
<component name="mantle-braintree" group="moqui" version="2.0.0" branch="master"/>
<component name="mantle-rsis" group="moqui" version="" branch="master"/><!-- no releases yet -->
<component name="mantle-oagis" group="moqui" version="" branch="master"/><!-- no releases yet -->
<component name="mantle-ubpl" group="moqui" version="" branch="master"/><!-- no releases -->
<!-- Moqui Applications -->
<component name="SimpleScreens" group="moqui" version="2.2.2" branch="master"/>
<component name="HiveMind" group="moqui" version="1.5.2" branch="master"/>
<component name="PopCommerce" group="moqui" version="2.2.2" branch="master"/>
<component name="MarbleERP" group="moqui" version="1.0.1" branch="master"/>
<component name="PopRestStore" group="moqui" version="1.1.2" branch="master"/>
<component name="WeCreate" group="moqui" version="" branch="master"/>
<component name="moqui-mjml" group="moqui" version="" branch="master"/>
<!-- Moqui Web and Demo Sites -->
<component name="moqui-org" group="moqui" version="" branch="master"/><!-- no releases -->
<component name="moqui-demo" group="moqui" version="" branch="master"/><!-- no releases -->
<!-- Third Party Components -->
<component name="moqui-captcha" group="shendepu" version="" branch="master"/><!-- no releases -->
<component name="moqui-chile" group="Moitcl" version="" branch="master"/><!-- no releases -->
<component name="moqui-de_DE-addon" group="mckhoi" version="" branch="master"/><!-- no releases -->
<!-- <component name="moqui-graphql" group="shendepu" version="" branch="master"/> Deprecated, graphql was a bad idea. Don't use it -->
<!-- <component name="moqui-react-ssr" group="shendepu" version="" branch="master"/> Deprecated, moqui-react-ssr is an experiment. We suggest you just use standard js tools if you want full control over the UI. no releases -->
<component name="moqui-zh_CN-addon" group="chunlinyao" version="" branch="master"/><!-- no releases -->
<!-- moqui-fop replacement use alibaba easyexcel for excel output -->
<component name="moqui-easyexcel" group="chunlinyao" version="" branch="master"/><!-- no releases -->
<component name="OFBizToMantle" group="jonesde" version="" branch="master"/><!-- no releases -->
<component name="ServiceJobMonitor" group="tailorsoft" version="" branch="master"/><!-- no releases -->
<component name="Sales" group="xolvegroup" version="" branch="main"/><!-- no releases -->
<component name="WorkManagement" group="xolvegroup" version="" branch="main"/><!-- no releases -->
<component name="coarchy" group="coarchy" version="" branch="coarchy"/><!-- no releases -->
<component name="stripe" group="coarchy" version="" branch="master"/><!-- no releases -->
<!-- Component Sets -->
<!-- NOTE: using these component sets is NOT recommended, with so many components doing
different things it is better to add and configure only the components you need;
some components change system behavior and may cause unexpected and undesired results -->
<component-set name="framework" components="example,moqui-aws,moqui-cups,moqui-fop,moqui-hazelcast,moqui-kie,moqui-orientdb,moqui-poi,moqui-sftp,moqui-wikitext"/>
<component-set name="mantle" components="mantle-udm,mantle-usl,AuthorizeDotNet,mantle-edi,mantle-paytrace,mantle-shippo,mantle-yotpo"/>
<component-set name="apps" components="HiveMind,PopCommerce,PopRestStore,MarbleERP"/>
<component-set name="ecosystem" sets="framework,mantle,apps"/>
<component-set name="demo" components="moqui-poi,moqui-demo,example,HiveMind,PopCommerce,PopRestStore,MarbleERP"/>
<component-set name="popc" components="PopCommerce,PopRestStore"/>
<component-set name="all-moqui" components="example,start,moqui-aws,moqui-camel,moqui-cups,moqui-fop,moqui-hazelcast,moqui-image,moqui-kie,moqui-orientdb,moqui-poi,moqui-sftp,moqui-sso,moqui-wikitext,mantle-udm,mantle-usl,AuthorizeDotNet,mantle-edi,mantle-paytrace,mantle-shippo,mantle-yotpo,mantle-braintree,mantle-rsis,mantle-oagis,mantle-ubpl,SimpleScreens,HiveMind,PopCommerce,MarbleERP,PopRestStore,WeCreate,moqui-mjml,moqui-org,moqui-demo"/>
<component-set name="all-working" components="example,start,moqui-aws,moqui-camel,moqui-cups,moqui-fop,moqui-hazelcast,moqui-image,moqui-kie,moqui-orientdb,moqui-poi,moqui-sftp,moqui-sso,moqui-wikitext,mantle-udm,mantle-usl,AuthorizeDotNet,mantle-edi,mantle-paytrace,mantle-shippo,mantle-yotpo,mantle-braintree,mantle-rsis,mantle-oagis,mantle-ubpl,SimpleScreens,HiveMind,PopCommerce,MarbleERP,PopRestStore,WeCreate,moqui-org,moqui-demo,moqui-de_DE-addon,moqui-zh_CN-addon,Sales,WorkManagement,coarchy,stripe"/>
<!-- Release builds:
gradle getComponentSet -PcomponentSet=demo -PlocationType=release
gradle getComponentSet -PcomponentSet=popc -PlocationType=release
gradle getComponent -Pcomponent=HiveMind -PlocationType=release
- these make the source distro for each
- to build the demo war: gradle load test addRuntime
-->
</addons>
================================================
FILE: build.gradle
================================================
/*
* This software is in the public domain under CC0 1.0 Universal plus a
* Grant of Patent License.
*
* To the extent possible under law, the author(s) have dedicated all
* copyright and related and neighboring rights to this software to the
* public domain worldwide. This software is distributed without any
* warranty.
*
* You should have received a copy of the CC0 Public Domain Dedication
* along with this software (see the LICENSE.md file). If not, see
* <http://creativecommons.org/publicdomain/zero/1.0/>.
*/
plugins {
id 'com.github.ben-manes.versions' version '0.53.0'
id 'org.ajoberstar.grgit' version '5.3.3'
}
// Filters dependencyUpdates to report only stable (official) releases
// Use `./gradlew dependencyUpdates` to check which packages are upgradable in all components
dependencyUpdates.resolutionStrategy {
componentSelection { rules ->
rules.all { ComponentSelection selection ->
boolean rejected = ['alpha', 'beta', 'rc', 'cr', 'm', 'b'].any { qualifier ->
selection.candidate.version ==~ /(?i).*[.-]${qualifier}[.\d-].*/
}
if (rejected) selection.reject('Release candidate')
}
}
}
// Run headless so GradleWorkerMain does not steal focus (mostly a macOS annoyance)
allprojects {
tasks.withType(JavaForkOptions) {
jvmArgs '-Djava.awt.headless=true'
}
repositories {
mavenCentral()
}
}
import groovy.util.Node
import groovy.xml.XmlParser
import groovy.xml.XmlSlurper
import org.ajoberstar.grgit.*
defaultTasks 'build'
def openSearchVersion = '3.4.0'
def elasticSearchVersion = '7.10.2'
def tomcatHome = '../apache-tomcat'
// no longer include version in war file name: def getWarName() { 'moqui-' + childProjects.framework.version + '.war' }
def getWarName() { 'moqui.war' }
def plusRuntimeName = 'moqui-plus-runtime.war'
def execTempDir = 'execwartmp'
def moquiRuntime = 'runtime'
def moquiConfDev = 'conf/MoquiDevConf.xml'
def moquiConfProduction = 'conf/MoquiProductionConf.xml'
def allCleanTasks = getTasksByName('clean', true)
def allBuildTasks = getTasksByName('build', true)
def allTestTasks = getTasksByName('test', true)
allTestTasks.each { it.systemProperties << System.properties.subMap(getDefaultPropertyKeys()) }
// kill the build -> check -> test dependency, only run tests explicitly and not always on build
getTasksByName('check', true).each { it.dependsOn.clear() }
Set<Task> getComponentTestTasks() {
Set<Task> testTasks = new LinkedHashSet()
for (Project subProject in getSubprojects())
if (subProject.getPath().startsWith(':runtime:component:')) testTasks.addAll(subProject.getTasksByName('test', false))
return testTasks
}
def getDefaultPropertyKeys() {
def defaultProperties = []
Node confXml = new XmlParser().parse(file('framework/src/main/resources/MoquiDefaultConf.xml'))
for (Node defaultProperty in confXml.'default-property') { defaultProperties << defaultProperty.'@name' }
defaultProperties
}
// ========== clean tasks ==========
task clean(type: Delete) { delete file(warName); delete file(execTempDir); delete file('wartemp'); cleanVersionDetailFiles() }
task cleanTempDir(type: Delete) { delete file(execTempDir) }
task cleanDb { doLast {
if (!file(moquiRuntime).exists()) return
delete files(file(moquiRuntime+'/db/derby').listFiles()) - files(moquiRuntime+'/db/derby/derby.properties')
delete file(moquiRuntime+'/db/h2')
delete file(moquiRuntime+'/db/orientdb/databases')
delete fileTree(dir: moquiRuntime+'/txlog', include: '*')
cleanElasticSearch(moquiRuntime)
} }
task cleanLog(type: Delete) { delete fileTree(dir: moquiRuntime+'/log', include: '*') }
task cleanSessions(type: Delete) { delete fileTree(dir: moquiRuntime+'/sessions', include: '*') }
task cleanLoadSave(type: Delete) { delete file('SaveH2.zip'); delete file('SaveDEFAULT.zip')
delete file('SaveTransactional.zip'); delete file('SaveAnalytical.zip'); delete file('SaveOrientDb.zip')
delete file('SaveElasticSearch.zip'); delete file('SaveOpenSearch.zip') }
task cleanPlusRuntime(type: Delete) { delete file(plusRuntimeName) }
task cleanOther(type: Delete) { delete fileTree(dir: '.', includes: ['**/.nbattrs', '**/*~', '**/.#*', '**/.DS_Store', '**/*.rej', '**/*.orig']) }
task cleanAll { dependsOn clean, allCleanTasks, cleanDb, cleanLog, cleanSessions, cleanLoadSave, cleanPlusRuntime }
// ========== ElasticSearch tasks (for install in runtime/elasticsearch) ==========
def cleanElasticSearch(String moquiRuntime) {
File osDir = file(moquiRuntime + '/opensearch')
String workDir = moquiRuntime + (osDir.exists() ? '/opensearch' : '/elasticsearch')
if (file(workDir+'/bin').exists()) {
def pidFile = file(workDir+'/pid')
if (pidFile.exists()) {
String pid = pidFile.getText()
logger.lifecycle("${osDir.exists() ? 'OpenSearch' : 'ElasticSearch'} running with pid ${pid}, stopping before deleting data then restarting")
['kill', pid].execute(null, file(workDir)).waitFor()
['tail', "--pid=${pid}", '-f', '/dev/null'].execute(null, file(workDir)).waitFor()
delete file(workDir+'/data')
if (file(workDir+'/logs').exists()) delete files(file(workDir+'/logs').listFiles())
if (pidFile.exists()) delete pidFile
startSearch()
} else {
logger.lifecycle("Found ${osDir.exists() ? 'OpenSearch' : 'ElasticSearch'} in ${workDir}/bin directory but no pid, deleting data without stop/start; WARNING if ${osDir.exists() ? 'OpenSearch' : 'ElasticSearch'} is running this will cause problems!")
delete file(workDir+'/data')
if (file(workDir+'/logs').exists()) delete files(file(workDir+'/logs').listFiles())
}
} else {
delete file(workDir+'/data')
if (file(workDir+'/logs').exists()) delete files(file(workDir+'/logs').listFiles())
}
}
task downloadOpenSearch { doLast {
// NOTE: works with Linux and macOS
// TODO: Windows support...
String distType = "tar.gz"
// https://artifacts.opensearch.org/releases/core/opensearch/1.3.1/opensearch-min-1.3.1-linux-x64.tar.gz
String esUrl = "https://artifacts.opensearch.org/releases/core/opensearch/${openSearchVersion}/opensearch-min-${openSearchVersion}-linux-x64.${distType}"
String targetDirPath = moquiRuntime + '/opensearch'
String esExtraDirPath = targetDirPath + '/opensearch-' + openSearchVersion
File targetDir = file(targetDirPath)
if (targetDir.exists()) { logger.lifecycle("Found directory at ${targetDirPath}, deleting"); delete targetDir }
File zipFile = file("${moquiRuntime}/opensearch-min-${openSearchVersion}-linux-x64.${distType}")
if (!zipFile.exists()) {
logger.lifecycle("Downloading OpenSearch from ${esUrl}")
ant.get(src: esUrl, dest: zipFile)
} else {
logger.lifecycle("Found OpenSearch archive at ${zipFile.getPath()}, using that instead of downloading")
}
// the eachFile closure removes the first path from each file, moving everything up a directory, which also requires delete of the extra dirs
copy { from distType == "zip" ? zipTree(zipFile) : tarTree(zipFile); into targetDir; eachFile {
def pathList = it.getRelativePath().getSegments() as List
if (pathList[0] == ".") pathList = pathList.tail()
it.setPath(pathList.tail().join("/"))
return it
} }
// make sure there is a logs directory, OpenSearch (just like ES) has start error without it
File esLogsDir = file(targetDirPath + '/logs')
if (!esLogsDir.exists()) esLogsDir.mkdir()
File extraDir = file(esExtraDirPath)
if (extraDir.exists()) delete extraDir
delete zipFile
}}
task downloadElasticSearch { doLast {
String suffix
String distType
String osName = System.getProperty("os.name").toLowerCase()
if (osName.startsWith("windows")) {
suffix = "windows-x86_64.zip"
distType = "zip"
} else if (osName.startsWith("mac")) {
suffix = "darwin-x86_64.tar.gz"
distType = "tar.gz"
} else {
suffix = "linux-x86_64.tar.gz"
distType = "tar.gz"
}
String esUrl = "https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-oss-${elasticSearchVersion}-no-jdk-${suffix}"
String targetDirPath = moquiRuntime + '/elasticsearch'
String esExtraDirPath = targetDirPath + '/elasticsearch-' + elasticSearchVersion
File targetDir = file(targetDirPath)
if (targetDir.exists()) { logger.lifecycle("Found directory at ${targetDirPath}, deleting"); delete targetDir }
File zipFile = file("${targetDirPath}-${elasticSearchVersion}.${distType}")
if (!zipFile.exists()) {
logger.lifecycle("Downloading ElasticSearch from ${esUrl}")
ant.get(src: esUrl, dest: zipFile)
} else {
logger.lifecycle("Found ElasticSearch archive at ${zipFile.getPath()}, using that instead of downloading")
}
// the eachFile closure removes the first path from each file, moving everything up a directory, which also requires delete of the extra dirs
copy { from distType == "zip"? zipTree(zipFile) : tarTree(zipFile); into targetDir; eachFile {
def pathList = it.getRelativePath().getSegments() as List
if (pathList[0] == ".") pathList = pathList.tail()
it.setPath(pathList.tail().join("/"))
return it
} }
// make sure there is a logs directory, ES start error without it
File esLogsDir = file(targetDirPath + '/logs')
if (!esLogsDir.exists()) esLogsDir.mkdir()
File extraDir = file(esExtraDirPath)
if (extraDir.exists()) delete extraDir
delete zipFile
}}
/* startElasticSearch old approach, with ES 7.10.2 and OpenSearch never exits, gradle just sits there doing nothing (though same command in terminal does exit)
task startElasticSearch(type:Exec) {
File osDir = file(moquiRuntime + '/opensearch')
workingDir moquiRuntime + (osDir.exists() ? '/opensearch' : '/elasticsearch')
commandLine (osDir.exists() ? ['./bin/opensearch', '-d', '-p', 'pid'] : ['./bin/elasticsearch', '-d', '-p', 'pid'])
ignoreExitValue true
onlyIf { (file(moquiRuntime + '/elasticsearch/bin').exists() || file(moquiRuntime + '/opensearch/bin').exists())
&& !file(moquiRuntime + '/elasticsearch/pid').exists() && !file(moquiRuntime + '/opensearch/pid').exists() }
doFirst {
logger.lifecycle("Starting ${osDir.exists() ? 'OpenSearch' : 'ElasticSearch'} installed in runtime/${osDir.exists() ? 'opensearch' : 'elasticsearch'}")
}
}
*/
void startSearch(String moquiRuntime) {
File osDir = file(moquiRuntime + '/opensearch')
String workDir = moquiRuntime + (osDir.exists() ? '/opensearch' : '/elasticsearch')
def pidFile = file(workDir + '/pid')
def binFile = file(workDir + '/bin')
if (binFile.exists() && !pidFile.exists()) {
logger.lifecycle("Starting ${osDir.exists() ? 'OpenSearch' : 'ElasticSearch'} installed in ${workDir}")
ProcessBuilder pb = new ProcessBuilder((osDir.exists() ? './bin/opensearch' : './bin/elasticsearch'), '-d', '-p', 'pid')
pb.directory(file(workDir))
pb.redirectOutput()
pb.redirectError()
pb.inheritIO()
logger.lifecycle("Starting process with command ${pb.command()} in ${pb.directory().path}")
try {
Process proc = pb.start()
// logger.lifecycle("ran start waiting...")
int result = proc.waitFor()
logger.lifecycle("Process finished with ${result}")
} catch (Exception e) {
logger.lifecycle("Error starting ${osDir.exists() ? 'OpenSearch' : 'ElasticSearch'}", e)
}
} else {
if (pidFile.exists()) logger.lifecycle("Not Starting ${osDir.exists() ? 'OpenSearch' : 'ElasticSearch'} installed in ${workDir}, pid file already exists")
if (!binFile.exists()) logger.lifecycle("Not Starting ${osDir.exists() ? 'OpenSearch' : 'ElasticSearch'}, no ${workDir}/bin directory found")
}
}
task startElasticSearch { doLast {
startSearch(moquiRuntime)
} }
void stopSearch(String moquiRuntime) {
File osDir = file(moquiRuntime + '/opensearch')
String workDir = moquiRuntime + (osDir.exists() ? '/opensearch' : '/elasticsearch')
def pidFile = file(workDir + '/pid')
def binFile = file(workDir + '/bin')
if (pidFile.exists() && binFile.exists()) {
String pid = pidFile.getText()
logger.lifecycle("Stopping ${osDir.exists() ? 'OpenSearch' : 'ElasticSearch'} installed in ${workDir} with pid ${pid}")
["kill", pid].execute(null, file(workDir)).waitFor()
if (pidFile.exists()) delete pidFile
} else {
if (!pidFile.exists()) logger.lifecycle("Not Stopping ${osDir.exists() ? 'OpenSearch' : 'ElasticSearch'} installed in ${workDir}, no pid file found")
if (!binFile.exists()) logger.lifecycle("Not Stopping ${osDir.exists() ? 'OpenSearch' : 'ElasticSearch'}, no ${workDir}/bin directory found")
}
}
task stopElasticSearch { doLast {
stopSearch(moquiRuntime)
} }
// ========== JDBC driver download tasks ==========
task getPostgresJdbc {
description = "Download the latest PostgreSQL JDBC driver to runtime/lib"
dependsOn 'getRuntime'
doLast {
def libDir = file(moquiRuntime + '/lib')
if (!libDir.exists()) libDir.mkdirs()
// Remove existing Postgres JAR files
fileTree(dir: libDir, include: 'postgres*.jar').each { it.delete() }
// Get the latest version from Maven repository
def metadataUrl = 'https://repo1.maven.org/maven2/org/postgresql/postgresql/maven-metadata.xml'
def metadataFile = file("${buildDir}/postgresql-maven-metadata.xml")
ant.get(src: metadataUrl, dest: metadataFile)
def metadata = new XmlSlurper().parse(metadataFile)
def latestVersion = metadata.versioning.latest.text()
metadataFile.delete()
// Download the latest version
def downloadUrl = "https://repo1.maven.org/maven2/org/postgresql/postgresql/${latestVersion}/postgresql-${latestVersion}.jar"
def jarFile = file("${libDir}/postgresql-${latestVersion}.jar")
logger.lifecycle("Downloading PostgreSQL JDBC driver ${latestVersion} from ${downloadUrl}")
ant.get(src: downloadUrl, dest: jarFile)
logger.lifecycle("Downloaded PostgreSQL JDBC driver to ${jarFile}")
}
}
task getMySqlJdbc {
description = "Download the latest MySQL JDBC driver to runtime/lib"
dependsOn 'getRuntime'
doLast {
def libDir = file(moquiRuntime + '/lib')
if (!libDir.exists()) libDir.mkdirs()
// Remove existing MySQL connector JAR files
fileTree(dir: libDir, include: 'mysql-connector*.jar').each { it.delete() }
// Get the latest version from Maven repository
def metadataUrl = 'https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/maven-metadata.xml'
def metadataFile = file("${buildDir}/mysql-connector-j-maven-metadata.xml")
ant.get(src: metadataUrl, dest: metadataFile)
def metadata = new XmlSlurper().parse(metadataFile)
def latestVersion = metadata.versioning.latest.text()
metadataFile.delete()
// Download the latest version
def downloadUrl = "https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/${latestVersion}/mysql-connector-j-${latestVersion}.jar"
def jarFile = file("${libDir}/mysql-connector-j-${latestVersion}.jar")
logger.lifecycle("Downloading MySQL JDBC driver ${latestVersion} from ${downloadUrl}")
ant.get(src: downloadUrl, dest: jarFile)
logger.lifecycle("Downloaded MySQL JDBC driver to ${jarFile}")
}
}
// ========== development tasks ==========
task setupIntellij {
description = "Adds all XML catalog items to intellij to enable autocomplete"
doLast {
def ideaDir = "${rootDir}/.idea"
def parser = new XmlSlurper()
parser.setFeature("http://apache.org/xml/features/disallow-doctype-decl", false)
parser.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false)
def catalogEntries = parser.parse(file("${rootDir}/framework/xsd/framework-catalog.xml"))
.system
.list()
.stream()
.map { [url: it.@systemId, location: "\$PROJECT_DIR\$/framework/xsd/${it.@uri}"] }
.collect(java.util.stream.Collectors.toList())
mkdir ideaDir
def rawXml
def miscFile = file("${ideaDir}/misc.xml")
if (!miscFile.exists()) {
def builder = new groovy.xml.StreamingMarkupBuilder()
builder.encoding = 'UTF-8'
rawXml = builder.bind {
project(version: '4') {
component(name: 'ExternalStorageConfigurationManager', enabled: true)
component(name: 'ProjectResources') {
catalogEntries.each { resource(url: it.url, location: it.location) }
}
}
}
} else {
def projectNode = parser.parse(miscFile)
def resourcesNode = projectNode.children().find { it.@name == 'ProjectResources' }
if (resourcesNode.size() == 0) {
projectNode.appendNode {
component(name: 'ProjectResources') {
catalogEntries.each { resource(url: it.url, location: it.location) }
}
}
} else {
catalogEntries.each { cat ->
def existingEntry = resourcesNode.children().find { it.@url == cat.url }
if (existingEntry.size() > 0) {
existingEntry.replaceNode { resource(url: cat.url, location: cat.location) }
} else {
resourcesNode.appendNode { resource(url: cat.url, location: cat.location) }
}
}
}
rawXml = projectNode
}
def misc = groovy.xml.XmlUtil.serialize(rawXml)
miscFile.write(misc)
}
}
task setupVscode {
description = "Configures VS Code settings with runtime directory exclusions"
doLast {
def settingsFile = file("${rootDir}/.vscode/settings.json")
mkdir settingsFile.parentFile
def settings = (settingsFile.exists() && settingsFile.length() > 0) ?
new groovy.json.JsonSlurper().parseText(settingsFile.text) : [:]
// Disable gitignore for search (so we can manually exclude build/runtime dirs)
settings['search.useIgnoreFiles'] = false
// Add search.exclude if missing
if (!settings['search.exclude']) settings['search.exclude'] = [:]
// Add exclusion patterns
settings['search.exclude']['**/build'] = true
settings['search.exclude']['runtime/{log,sessions,txlog,db,elasticsearch,opensearch}'] = true
// Write formatted JSON
settingsFile.text = groovy.json.JsonOutput.prettyPrint(groovy.json.JsonOutput.toJson(settings))
logger.lifecycle("VS Code settings updated at ${settingsFile}")
}
}
// ========== test task ==========
// NOTE1: to run startElasticSearch before the first test task add it as a dependency to all test tasks
// NOTE2: to run stopElasticSearch after the last test task make all test tasks finalizedBy stopElasticSearch
getTasksByName('test', true).each {
if (it.path != ':test') {
// logger.lifecycle("Adding dependencies for test task ${it.getPath()}")
it.dependsOn(startElasticSearch)
it.finalizedBy(stopElasticSearch)
}
}
// ========== check/update tasks ==========
task getRuntime {
description = "If the runtime directory does not exist get it using settings in myaddons.xml or addons.xml; also check default components in myaddons.xml (addons.@default) and download any missing"
doLast { checkRuntimeDirAndDefaults(project.hasProperty('locationType') ? locationType : null) }
}
task checkRuntime { doLast {
if (!file('runtime').exists()) throw new GradleException("Required 'runtime' directory not found. Use 'gradle getRuntime' or 'gradle getComponent' or manually clone the moqui-runtime repository. This must be done in a separate Gradle run before a build so Gradle can find and run build tasks.")
} }
task gitPullAll {
description = "Do a git pull to update moqui, runtime, and each installed component (for each where a .git directory is found)"
doLast {
// framework and runtime
if (file(".git").exists()) { doGitPullWithStatus(file('.').path) }
if (file("runtime/.git").exists()) { doGitPullWithStatus(file('runtime').path) }
// all directories under runtime/component
for (File compDir in file('runtime/component').listFiles().findAll { it.isDirectory() && it.listFiles().find { it.name == '.git' } }) {
doGitPullWithStatus(compDir.path)
}
}
}
def doGitPullWithStatus(def gitDir) {
try {
def curGrgit = Grgit.open(dir: gitDir)
logger.lifecycle("\nPulling ${gitDir} (branch:${curGrgit.branch.current()?.name}, tracking:${curGrgit.branch.current()?.trackingBranch?.name})")
def beforeHead = curGrgit.head()
curGrgit.pull()
def afterHead = curGrgit.head()
if (beforeHead == afterHead) {
logger.lifecycle("Already up-to-date.")
} else {
List<Commit> commits = curGrgit.log { range(beforeHead, afterHead) }
for (Commit commit in commits) logger.lifecycle("- ${commit.getAbbreviatedId(7)} by ${commit.committer?.name}: ${commit.shortMessage}")
}
} catch (Throwable t) {
logger.error(t.message)
}
}
task gitCheckoutAll {
description = "Do a git checkout on moqui, runtime, and each installed component (for each where a .git directory is found); use -Pbranch= (required) to specify a branch, use -Pcreate=true to create branches with the given name"
doLast {
if (!project.hasProperty('branch')) throw new InvalidUserDataException("No branch property specified (use -Pbranch=...)")
String curBranch = branch
String curTag = (project.hasProperty('tag') ? tag : null) ?: curBranch
boolean createBranch = false
if (project.hasProperty('create') && create == 'true') createBranch = true
List<String> gitDirectories = []
if (file(".git").exists()) gitDirectories.add(file('.').path)
if (file("runtime/.git").exists()) gitDirectories.add(file('runtime').path)
for (File compDir in file('runtime/component').listFiles().findAll { it.isDirectory() && it.listFiles().find { it.name == '.git' } })
gitDirectories.add(compDir.path)
for (String gitDir in gitDirectories) {
def curGrgit = Grgit.open(dir: gitDir)
def branchList = curGrgit.branch.list(mode: org.ajoberstar.grgit.operation.BranchListOp.Mode.ALL)
def tagList = curGrgit.tag.list()
def targetBranch = branchList.find({ it.name == curBranch })
def targetTag = tagList.find({ it.name == curTag })
if (targetBranch == null && targetTag == null) {
def originBranch = branchList.find({ it.name == 'origin/' + curBranch })
if (originBranch != null) {
logger.lifecycle("In ${gitDir} branch ${curBranch} not found but found ${originBranch.name}, creating local branch tracking that branch")
targetBranch = curGrgit.branch.add(name: curBranch, startPoint: originBranch, mode: org.ajoberstar.grgit.operation.BranchAddOp.Mode.TRACK)
}
}
if (createBranch || targetBranch != null || targetTag != null) {
if (targetTag != null) {
if (createBranch && curBranch != curTag) {
logger.lifecycle("== Git checkout ${gitDir} tag ${curTag} and create branch ${curBranch}")
try { curGrgit.checkout(branch: curBranch, createBranch: true, startPoint: targetTag) }
catch (Exception e) { logger.lifecycle("Checkout error", e) }
} else {
logger.lifecycle("== Git checkout ${gitDir} tag ${curTag}")
try { curGrgit.checkout(branch: curTag, createBranch: false) }
catch (Exception e) { logger.lifecycle("Checkout error", e) }
}
} else {
logger.lifecycle("== Git checkout ${gitDir} branch ${curBranch} create ${createBranch}")
try { curGrgit.checkout(branch: curBranch, createBranch: createBranch) }
catch (Exception e) { logger.lifecycle("Checkout error", e) }
}
} else {
logger.lifecycle("* No branch or tag '${curBranch}' in ${gitDir}\nBranches: ${branchList.collect({it.name})}\nTags: ${tagList.collect({it.name})}")
}
logger.lifecycle("")
}
}
}
task gitStatusAll {
description = "Do a git status to check moqui, runtime, and each installed component (for each where a .git directory is found)"
doLast {
List<String> gitDirectories = []
if (file(".git").exists()) gitDirectories.add(file('.').path)
if (file("runtime/.git").exists()) gitDirectories.add(file('runtime').path)
for (File compDir in file('runtime/component').listFiles().findAll { it.isDirectory() && it.listFiles().find { it.name == '.git' } })
gitDirectories.add(compDir.path)
for (String gitDir in gitDirectories) {
def curGrgit = Grgit.open(dir: gitDir)
logger.lifecycle("\nGit status for ${gitDir} (branch:${curGrgit.branch.current()?.name}, tracking:${curGrgit.branch.current()?.trackingBranch?.name})")
try {
if (curGrgit.remote.list().find({ it.name == 'upstream'})) {
def upstreamAhead = curGrgit.log { range curGrgit.resolve.toCommit('refs/remotes/upstream/master'), curGrgit.resolve.toCommit('refs/remotes/origin/master') }
if (upstreamAhead) logger.lifecycle("- origin/master ${upstreamAhead.size()} commits ahead of upstream/master")
}
} catch (Exception e) {
logger.error("Error finding commits ahead of upstream", e)
}
try {
def masterLatest = curGrgit.resolve.toCommit('refs/remotes/origin/master')
if (masterLatest == null) {
logger.error("No origin/master branch exists, can't determine unpushed commits")
} else {
def unpushed = curGrgit.log { range masterLatest, curGrgit.resolve.toCommit('HEAD') }
if (unpushed) logger.lifecycle("--- ${unpushed.size()} commits unpushed (ahead of origin/master)")
for (Commit commit in unpushed) logger.lifecycle(" - ${commit.getAbbreviatedId(8)} - ${commit.shortMessage}")
}
} catch (Exception e) {
logger.error("Error finding unpushed commits", e)
}
def curStatus = curGrgit.status()
if (curStatus.isClean()) logger.lifecycle("* nothing to commit, working directory clean")
if (curStatus.staged.added || curStatus.staged.modified || curStatus.staged.removed) logger.lifecycle("--- Changes to be committed::")
for (String fn in curStatus.staged.added) logger.lifecycle(" added: ${fn}")
for (String fn in curStatus.staged.modified) logger.lifecycle(" modified: ${fn}")
for (String fn in curStatus.staged.removed) logger.lifecycle(" removed: ${fn}")
if (curStatus.unstaged.added || curStatus.unstaged.modified || curStatus.unstaged.removed) logger.lifecycle("--- Changes not staged for commit:")
for (String fn in curStatus.unstaged.added) logger.lifecycle(" added: ${fn}")
for (String fn in curStatus.unstaged.modified) logger.lifecycle(" modified: ${fn}")
for (String fn in curStatus.unstaged.removed) logger.lifecycle(" removed: ${fn}")
}
}
}
task gitUpstreamAll {
description = "Do a git pull upstream:master for moqui, runtime, and each installed component (for each where a .git directory is found and has a remote called upstream)"
doLast {
String remoteName = project.hasProperty('remote') ? remote : 'upstream'
List<String> gitDirectories = []
if (file(".git").exists()) gitDirectories.add(file('.').path)
if (file("runtime/.git").exists()) gitDirectories.add(file('runtime').path)
for (File compDir in file('runtime/component').listFiles().findAll { it.isDirectory() && it.listFiles().find { it.name == '.git' } })
gitDirectories.add(compDir.path)
for (String gitDir in gitDirectories) {
def curGrgit = Grgit.open(dir: gitDir)
if (curGrgit.remote.list().find({ it.name == remoteName})) {
logger.lifecycle("\nGit merge ${remoteName} for ${gitDir}")
curGrgit.pull(remote: remoteName, branch: 'master')
} else {
logger.lifecycle("\nNo ${remoteName} remote for ${gitDir}")
}
}
}
}
task gitTagAll {
description = "Do a git add or remove tag on the currently checked out commit in moqui, runtime, and each installed component"
doLast {
def tagName = (project.hasProperty('tag')) ? tag : null;
def tagMessage = (project.hasProperty('message')) ? message : null;
boolean removeTags = (project.hasProperty('remove') && remove == 'true')
boolean pushTags = (project.hasProperty('push') && push == 'true')
// Users can simply push tags to the remote
if (tagName == null && pushTags == false)
throw new InvalidUserDataException("No tag property specified (use -Ptag=...) and No push tag specified (use -Ppush=true)")
List<String> gitDirectories = []
if (file(".git").exists()) gitDirectories.add(file('.').path)
if (file("runtime/.git").exists()) gitDirectories.add(file('runtime').path)
for (File compDir in file('runtime/component').listFiles().findAll { it.isDirectory() && it.listFiles().find { it.name == '.git' } })
gitDirectories.add(compDir.path)
def frameworkDir = gitDirectories.first()
for (String gitDir in gitDirectories) {
def relativePath = "."+gitDir.minus(frameworkDir)
def curGrgit = Grgit.open(dir: gitDir)
def branchName = curGrgit.branch.current().name
def commit = curGrgit.log(maxCommits: 1).find()
if (tagName != null) {
def tagList = curGrgit.tag.list()
def targetTag = tagList.find({ it.name == tagName })
if (targetTag == null) {
if (removeTags) {
logger.lifecycle("== Git tag '${tagName}' not found in ${branchName} of ${relativePath} ... skipping")
} else {
curGrgit.tag.add(name: tagName, message: tagMessage ?: "Tagging version ${tagName}")
logger.lifecycle("== Git tagging commit ${commit.abbreviatedId} - '${commit.shortMessage}' by '${commit.author.name}' in ${branchName} of ${relativePath}")
}
} else {
if (removeTags) {
curGrgit.tag.remove(names: [tagName])
logger.lifecycle("== Git removing tag '${tagName}' in ${branchName} of ${relativePath}")
} else {
logger.lifecycle("== Git tag '${tagName}' already exists in ${branchName} of ${relativePath}, skipping...")
}
}
}
if (pushTags) {
if (removeTags) {
curGrgit.push(refsOrSpecs: [':refs/tags/'+tagName])
} else {
curGrgit.push(tags: true)
}
logger.lifecycle("== Git pushing tag changes to remote of ${relativePath}")
}
}
}
}
task gitDiffTagsAll {
description = "Do a git diff between two tags in the currently checked out branch in moqui, runtime, and each installed component"
doLast {
if (!project.hasProperty('taga') || taga == null)
throw new InvalidUserDataException("No taga property specified (use -Ptaga=...)")
// If tagb is not passed, we assume HEAD
def tagb = (project.hasProperty('tagb') && tagb != null) ? tagb : "HEAD";
logger.lifecycle("== Git diffing tags ${taga} and ${tagb}")
List<String> gitDirectories = []
if (file(".git").exists()) gitDirectories.add(file('.').path)
if (file("runtime/.git").exists()) gitDirectories.add(file('runtime').path)
for (File compDir in file('runtime/component').listFiles().findAll { it.isDirectory() && it.listFiles().find { it.name == '.git' } })
gitDirectories.add(compDir.path)
def frameworkDir = gitDirectories.first()
for (String gitDir in gitDirectories) {
def relativePath = "."+gitDir.minus(frameworkDir)
def grgit = Grgit.open(dir: gitDir)
def tagList = grgit.tag.list()
def tagaCommit = tagList.find({ it.name == taga })
def tagbCommit = tagList.find({ it.name == tagb })
logger.lifecycle("${relativePath}")
if ((taga == "HEAD" || tagaCommit != null) && (tagb == "HEAD" || tagbCommit != null)) {
grgit.log {
range taga, tagb
}.each {
logger.lifecycle(" ${it.abbreviatedId} - ${it.shortMessage}")
}
}
}
}
}
task gitMergeAll {
description = "Do a git diff between two tags in the currently checked out branch in moqui, runtime, and each installed component"
doLast {
def branchName = (project.hasProperty('branch')) ? branch : null;
def tagName = (project.hasProperty('tag')) ? tag : null;
def mergeMode = (project.hasProperty('mode')) ? mode : null;
def mergeMessage = (project.hasProperty('message')) ? message : null;
def pushMerge = (project.hasProperty('push')) ? push : null;
List<String> gitDirectories = []
if (file(".git").exists()) gitDirectories.add(file('.').path)
if (file("runtime/.git").exists()) gitDirectories.add(file('runtime').path)
for (File compDir in file('runtime/component').listFiles().findAll { it.isDirectory() && it.listFiles().find { it.name == '.git' } })
gitDirectories.add(compDir.path)
def frameworkDir = gitDirectories.first()
for (String gitDir in gitDirectories) {
def relativePath = "."+gitDir.minus(frameworkDir)
logger.lifecycle("${relativePath}")
def grgit = Grgit.open(dir: gitDir)
def currentBranch = grgit.branch.current()?.name;
if (branchName == currentBranch)
continue
def doMerge = false;
if (branchName && grgit.branch.list().find({ it.name == branchName }) != null) {
doMerge = true;
}
if (tagName && grgit.tag.list().find({ it.name == tagName }) != null) {
doMerge = true;
}
if (doMerge) {
grgit.merge(head: branchName ?: tagName, mode: mergeMode, message: mergeMessage)
logger.lifecycle(" Merging ${branchName ?: tagName} into ${currentBranch}")
}
if (pushMerge) {
grgit.push();
logger.lifecycle(" Pushing merge")
}
}
}
}
// ========== run tasks ==========
task run(type: JavaExec) {
dependsOn checkRuntime, allBuildTasks, cleanTempDir
workingDir = '.'; jvmArgs = ['-server', '-XX:-OmitStackTraceInFastThrow']
systemProperties = ['moqui.conf':moquiConfDev, 'moqui.runtime':moquiRuntime]
// NOTE: this is a hack, using -jar instead of a class name, and then the first argument is the name of the jar file
mainClass = '-jar'; args = [warName]
}
task runProduction(type: JavaExec) {
dependsOn checkRuntime, allBuildTasks, cleanTempDir
workingDir = '.'; jvmArgs = ['-server', '-Xms1024M']
systemProperties = ['moqui.conf':moquiConfProduction, 'moqui.runtime':moquiRuntime]
mainClass = '-jar'; args = [warName]
}
task load(type: JavaExec) {
description = "Run Moqui to load data; to specify data types use something like: gradle load -Ptypes=seed,seed-initial,install"
dependsOn checkRuntime, allBuildTasks
systemProperties = ['moqui.conf':moquiConfDev, 'moqui.runtime':moquiRuntime]
workingDir = '.'; jvmArgs = ['-server']; mainClass = '-jar'
args = [warName, 'load', (project.properties.containsKey('types') ? "types=${types}" : "types=all")]
}
task loadSeed(type: JavaExec) {
dependsOn checkRuntime, allBuildTasks
systemProperties = ['moqui.conf':moquiConfProduction, 'moqui.runtime':moquiRuntime]
workingDir = '.'; jvmArgs = ['-server']; mainClass = '-jar'
args = [warName, 'load', (project.properties.containsKey('types') ? "types=${types}" : "types=seed")]
}
task loadSeedInitial(type: JavaExec) {
dependsOn checkRuntime, allBuildTasks
systemProperties = ['moqui.conf':moquiConfProduction, 'moqui.runtime':moquiRuntime]
workingDir = '.'; jvmArgs = ['-server']; mainClass = '-jar'
args = [warName, 'load', (project.properties.containsKey('types') ? "types=${types}" : "types=seed,seed-initial")]
}
task loadProduction(type: JavaExec) {
dependsOn checkRuntime, allBuildTasks
systemProperties = ['moqui.conf':moquiConfProduction, 'moqui.runtime':moquiRuntime]
workingDir = '.'; jvmArgs = ['-server']; mainClass = '-jar'
args = [warName, 'load', (project.properties.containsKey('types') ? "types=${types}" : "types=seed,seed-initial,install")]
}
task saveDb { doLast {
if (file(moquiRuntime+'/db/derby/moqui').exists())
ant.zip(destfile: 'SaveDerby.zip') { fileset(dir: moquiRuntime+'/db/derby/moqui') { include(name: '**/*') } }
if (file(moquiRuntime+'/db/h2').exists())
ant.zip(destfile: 'SaveH2.zip') { fileset(dir: moquiRuntime+'/db/h2') { include(name: '**/*') } }
if (file(moquiRuntime+'/db/orientdb/databases').exists())
ant.zip(destfile: 'SaveOrientDb.zip') { fileset(dir: moquiRuntime+'/db/orientdb/databases') { include(name: '**/*') } }
File osDir = file(moquiRuntime + '/opensearch')
String workDir = moquiRuntime + (osDir.exists() ? '/opensearch' : '/elasticsearch')
if (file(workDir+'/data').exists()) {
if (file(workDir+'/bin').exists()) {
def pidFile = file(workDir+'/pid')
if (pidFile.exists()) {
String pid = pidFile.getText()
logger.lifecycle("ElasticSearch running with pid ${pid}, stopping before saving data then restarting")
['kill', pid].execute(null, file(workDir)).waitFor()
['tail', "--pid=${pid}", '-f', '/dev/null'].execute(null, file(workDir)).waitFor()
if (pidFile.exists()) delete pidFile
ant.zip(destfile: (osDir.exists() ? 'SaveOpenSearch.zip' : 'SaveElasticSearch.zip')) { fileset(dir: workDir+'/data') { include(name: '**/*') } }
startSearch(moquiRuntime)
} else {
logger.lifecycle("Found ${osDir.exists() ? 'OpenSearch' : 'ElasticSearch'} ${workDir}/bin directory but no pid, saving data without stop/start; WARNING if ElasticSearch is running this will cause problems!")
ant.zip(destfile: (osDir.exists() ? 'SaveOpenSearch.zip' : 'SaveElasticSearch.zip')) { fileset(dir: workDir+'/data') { include(name: '**/*') } }
}
} else {
ant.zip(destfile: (osDir.exists() ? 'SaveOpenSearch.zip' : 'SaveElasticSearch.zip')) { fileset(dir: workDir+'/data') { include(name: '**/*') } }
}
}
} }
task loadSave {
description = "Clean all, build and load, then save database (H2, Derby), OrientDB, and OpenSearch/ElasticSearch files; to be used before reloadSave"
dependsOn cleanAll, load, saveDb
}
task reloadSave {
description = "After a loadSave clean database (H2, Derby), OrientDB, and ElasticSearch files and reload from saved copy"
dependsOn cleanTempDir, cleanDb, cleanLog, cleanSessions
dependsOn allBuildTasks
doLast {
if (file('SaveDerby.zip').exists()) copy { from zipTree('SaveDerby.zip'); into file(moquiRuntime+'/db/derby/moqui') }
if (file('SaveH2.zip').exists()) copy { from zipTree('SaveH2.zip'); into file(moquiRuntime+'/db/h2') }
if (file('SaveOrientDb.zip').exists()) copy { from zipTree('SaveOrientDb.zip'); into file(moquiRuntime+'/db/orientdb/databases') }
if (file('SaveElasticSearch.zip').exists()) {
String esDir = moquiRuntime+'/elasticsearch'
if (file(esDir+'/bin').exists()) {
def pidFile = file(esDir+'/pid')
if (pidFile.exists()) {
String pid = pidFile.getText()
logger.lifecycle("ElasticSearch running with pid ${pid}, stopping before restoring data then restarting")
['kill', pid].execute(null, file(esDir)).waitFor()
['tail', "--pid=${pid}", '-f', '/dev/null'].execute(null, file(esDir)).waitFor()
copy { from zipTree('SaveElasticSearch.zip'); into file(moquiRuntime+'/elasticsearch/data') }
if (pidFile.exists()) delete pidFile
['./bin/elasticsearch', '-d', '-p', 'pid'].execute(null, file(esDir)).waitFor()
} else {
logger.lifecycle("Found ElasticSearch ${esDir}/bin directory but no pid, saving data without stop/start; WARNING if ElasticSearch is running this will cause problems!")
copy { from zipTree('SaveElasticSearch.zip'); into file(moquiRuntime+'/elasticsearch/data') }
}
} else {
copy { from zipTree('SaveElasticSearch.zip'); into file(moquiRuntime+'/elasticsearch/data') }
}
}
if (file('SaveOpenSearch.zip').exists()) {
String esDir = moquiRuntime+'/opensearch'
if (file(esDir+'/bin').exists()) {
def pidFile = file(esDir+'/pid')
if (pidFile.exists()) {
String pid = pidFile.getText()
logger.lifecycle("OpenSearch running with pid ${pid}, stopping before restoring data then restarting")
['kill', pid].execute(null, file(esDir)).waitFor()
['tail', "--pid=${pid}", '-f', '/dev/null'].execute(null, file(esDir)).waitFor()
copy { from zipTree('SaveOpenSearch.zip'); into file(moquiRuntime+'/opensearch/data') }
if (pidFile.exists()) delete pidFile
['./bin/opensearch', '-d', '-p', 'pid'].execute(null, file(esDir)).waitFor()
} else {
logger.lifecycle("Found OpenSearch ${esDir}/bin directory but no pid, saving data without stop/start; WARNING if OpenSearch is running this will cause problems!")
copy { from zipTree('SaveOpenSearch.zip'); into file(moquiRuntime+'/opensearch/data') }
}
} else {
copy { from zipTree('SaveOpenSearch.zip'); into file(moquiRuntime+'/opensearch/data') }
}
}
}
}
// ========== deploy tasks ==========
task deployTomcat { doLast {
// remove runtime directory, may have been added for logs/etc
delete file(tomcatHome + '/runtime')
// remove ROOT directory and war to avoid conflicts
delete file(tomcatHome + '/webapps/ROOT')
delete file(tomcatHome + '/webapps/ROOT.war')
// copy the war file to ROOT.war
copy { from file(warName); into file(tomcatHome + '/webapps'); rename(warName, 'ROOT.war') }
} }
task plusRuntimeWarTemp {
dependsOn checkRuntime, allBuildTasks
doLast {
File wartempFile = file('wartemp')
if (wartempFile.exists()) delete wartempFile
// make version detail files
makeVersionDetailFiles()
// unzip the "moqui-${version}.war" file to the wartemp directory
copy { from zipTree(warName); into wartempFile }
// copy runtime directory (with a few exceptions) into a runtime directory in the war
copy {
from fileTree(dir: '.', include: moquiRuntime+'/**',
excludes: ['**/*.jar', '**/build', moquiRuntime+'/classes/**', moquiRuntime+'/lib/**', moquiRuntime+'/log/**', moquiRuntime+'/sessions/**'])
into wartempFile
}
// copy the jar files from runtime/lib
copy { from fileTree(dir: moquiRuntime+'/lib', include: '**/*.jar').files into 'wartemp/WEB-INF/lib' }
// copy the classpath resource files from runtime/classes
copy { from fileTree(dir: moquiRuntime+'/classes', include: '**/*') into 'wartemp/WEB-INF/classes' }
// copy the jar files from components
copy { from fileTree(dir: moquiRuntime+'/base-component', include: '**/*.jar').files into 'wartemp/WEB-INF/lib' }
copy {
from fileTree(dir: moquiRuntime+'/component', include: '**/*.jar', exclude: '**/librepo/*.jar').files
into 'wartemp/WEB-INF/lib'
duplicatesStrategy DuplicatesStrategy.WARN
}
copy {
from fileTree(dir: moquiRuntime+'/ecomponent', include: '**/*.jar', exclude: '**/librepo/*.jar').files
into 'wartemp/WEB-INF/lib'
duplicatesStrategy DuplicatesStrategy.WARN
}
// add MoquiInit.properties fresh copy, just in case it was changed
copy { from file('MoquiInit.properties') into 'wartemp/WEB-INF/classes' }
// add Procfile to root
copy { from file('Procfile') into 'wartemp' }
// special case: copy elasticsearch plugin/module jars (needed for ES installed in runtime/elasticsearch
if (file(moquiRuntime+'/elasticsearch').exists())
copy { from fileTree(dir: '.', include: moquiRuntime+'/elasticsearch/**/*.jar') into wartempFile }
// special case: copy opensearch plugin/module jars (needed for ES installed in runtime/opensearch
if (file(moquiRuntime+'/opensearch').exists())
copy { from fileTree(dir: '.', include: moquiRuntime+'/opensearch/**/*.jar') into wartempFile }
// special case: copy jackrabbit standalone jar (if exists)
copy { from fileTree(dir: moquiRuntime + '/jackrabbit', include: 'jackrabbit-standalone-*.jar').files; into 'wartemp/' + moquiRuntime + '/jackrabbit' }
// clean up version detail files
cleanVersionDetailFiles()
}
}
task addRuntime(type: Zip) {
description = "Create moqui-plus-runtime.war file from the moqui.war file and the runtime directory embedded in it"
dependsOn checkRuntime, allBuildTasks, plusRuntimeWarTemp
archiveFileName = plusRuntimeName
destinationDirectory = file('.')
from file('wartemp')
doFirst { if (file(plusRuntimeName).exists()) delete file(plusRuntimeName) }
doLast { delete file('wartemp') }
}
// don't use this task directly, use addRuntimeTomcat which calls this
task deployTomcatRuntime { doLast {
delete file(tomcatHome + '/runtime'); delete file(tomcatHome + '/webapps/ROOT'); delete file(tomcatHome + '/webapps/ROOT.war')
copy { from file(plusRuntimeName); into file(tomcatHome + '/webapps'); rename(plusRuntimeName, 'ROOT.war') }
} }
task addRuntimeTomcat {
dependsOn addRuntime
dependsOn deployTomcatRuntime
}
// ========== component tasks ==========
task getDefaults {
description = "Get a component using specified location type, also check/get all components it depends on; requires component property; locationType property optional (defaults to git if there is a .git directory, otherwise to current)"
doLast {
String curLocationType = file('.git').exists() ? 'git' : 'current'
if (project.hasProperty('locationType')) curLocationType = locationType
getComponentTop(curLocationType)
}
}
task getComponent {
description = "Get a component using specified location type, also check/get all components it depends on; requires component property; locationType property optional (defaults to git if there is a .git directory, otherwise to current)"
doLast {
String curLocationType = file('.git').exists() ? 'git' : 'current'
if (project.hasProperty('locationType')) curLocationType = locationType
getComponentTop(curLocationType)
}
}
task createComponent {
description = "Create a new component. Set new component name with -Pcomponent=new_component_name (based on the moqui start component here: https://github.com/moqui/start)"
doLast {
String curLocationType = file('.git').exists() ? 'git' : 'current'
if (project.hasProperty('locationType')) curLocationType = locationType
if (project.hasProperty('component')) {
checkRuntimeDirAndDefaults(curLocationType)
Set compsChecked = new TreeSet()
def startComponentName = 'start'
File componentDir = getComponent(startComponentName, curLocationType, parseAddons(), parseMyaddons(), compsChecked)
if (componentDir?.exists()) {
logger.lifecycle("Got component start, dependent components checked: ${compsChecked}")
def newComponent = file("runtime/component/${component}")
def renameSuccessful = componentDir.renameTo(newComponent)
if (!renameSuccessful) {
logger.error("Failed to rename component start to ${component}. Try removing the existing component directory first or giving this program write permissions.")
} else {
logger.lifecycle("Renamed component start to ${component}")
}
print "Updated file: "
newComponent.eachFileRecurse(groovy.io.FileType.FILES) { file ->
try {
// If file name is startComponentName.* rename to component.*
if (file.name.startsWith(startComponentName)) {
String newFileName = (file.name - startComponentName)
newFileName = component + newFileName
File newFile = new File(file.parent, newFileName)
file.renameTo(newFile)
file = newFile
print "${file.path - newComponent.path - '/'}, "
}
String content = file.text
if (content.contains(startComponentName)) {
content = content.replaceAll(startComponentName, component)
file.text = content
print "${file.path - newComponent.path - '/'}, "
}
} catch (IOException e) {
println "Error processing file ${file.path}: ${e.message}"
}
}
print "\n\n"
println "Select rest api (r), screens (s), or both (B):"
def componentInput = System.in.newReader().readLine()
if (componentInput == 'r') {
new File(newComponent, 'screen').deleteDir()
new File(newComponent, 'template').deleteDir()
new File(newComponent, 'data/AppSeedData.xml').delete()
new File(newComponent, 'MoquiConf.xml').delete()
def moquiConf = new File(newComponent, 'MoquiConf.xml')
moquiConf.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" +
"<!-- No copyright or license for configuration file, details here are not considered a creative work. -->\n" +
"<moqui-conf xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://moqui.org/xsd/moqui-conf-3.xsd\">\n" +
"</moqui-conf>")
println "Selected rest api so, deleted screen, template, and AppSeedData.xml\n"
} else if (componentInput == 's') {
new File(newComponent, "services/${component}.rest.xml").delete()
new File(newComponent, 'data/ApiSeedData.xml').delete()
println "Selected screens so, deleted rest api and ApiSeedData.xml\n"
} else if (componentInput == 'b' || componentInput == 'B' || componentInput == '') {
println "Selected both rest api and screens\n"
} else {
println "Invalid input. Try again"
newComponent.deleteDir()
return
}
println "Are you going to code or test in groovy or java [y/N]"
def codeInput = System.in.newReader().readLine()
if (codeInput == 'y' || codeInput == 'Y') {
println "Keeping src folder\n"
} else if (codeInput == 'n' || codeInput == 'N' || codeInput == '') {
new File(newComponent, 'src').deleteDir()
new File(newComponent, 'build.grade').delete()
println "Selected no so, deleted src and build.grade\n"
} else {
println "Invalid input. Try again"
newComponent.deleteDir()
return
}
println "Setup a git repository [Y/n]"
def gitInput = System.in.newReader().readLine()
if (gitInput == 'y' || gitInput == 'Y' || gitInput == '') {
new File(newComponent, '.git').deleteDir()
// Setup git repository
def grgit = Grgit.init(dir: newComponent.path)
grgit.add(patterns: ['.'])
// Can't get signing to work easily. If signing works well then might as well commit
// grgit.commit(message: 'Initial commit')
println "Selected yes, so git is initialized\n"
println "To setup the git remote origin, type the git remote url or enter to skip"
def remoteUrl = System.in.newReader().readLine()
if (remoteUrl != '') {
grgit.remote.add(name: 'origin', url: remoteUrl)
println "Run the following to push the git repository:\ncd runtime/component/${component} && git commit -m 'Initial commit' && git push && cd ../../.."
} else {
println "Run the following to push the git repository:\ncd runtime/component/${component} && git commit -m 'Initial commit' && git remote add origin git@github.com:yourgroup/${component} && git push && cd ../../.."
}
} else if (gitInput == 'n' || gitInput == 'N') {
new File(newComponent, '.git').deleteDir()
println "Selected no, so git is not initialized\n"
println "Run the following to push the git repository:\ncd runtime/component/${component} && git commit -m 'Initial commit' && git remote add origin git@github.com:yourgroup/${component} && git push && cd ../../.."
} else {
println "Invalid input. Try again"
newComponent.deleteDir()
return
}
println "Add to myaddons.xml [Y/n]"
def myaddonsInput = System.in.newReader().readLine()
if (myaddonsInput == 'y' || myaddonsInput == 'Y' || myaddonsInput == '') {
def myaddonsFile = file('myaddons.xml')
if (myaddonsFile.exists()){
// Iterate through myaddons file and delete the lines that are </addons>
// Read the lines from the file
def lines = myaddonsFile.readLines()
// Filter out the lines that contain </addons>
def filteredLines = lines.findAll { !it.contains("</addons>") }
// Write the filtered lines back to the file
myaddonsFile.text = filteredLines.join('\n')
} else {
println "myaddons.xml not found. Creating one\nEnter repository github (g), github-ssh (GS), bitbucket (b), or bitbucket-ssh (bs)"
def repositoryInput = System.in.newReader().readLine()
myaddonsFile.append("<addons default-repository=\"")
if (repositoryInput == 'g' || repositoryInput == 'G') {
myaddonsFile.append('github')
} else if (repositoryInput == 'gs' || repositoryInput == 'GS' || repositoryInput == '') {
myaddonsFile.append('github-ssh')
} else if (repositoryInput == 'b' || repositoryInput == 'B') {
myaddonsFile.append('bitbucket')
} else if (repositoryInput == 'bs' || repositoryInput == 'BS') {
myaddonsFile.append('bitbucket-ssh')
} else {
println "Invalid input. Setting to github-ssh"
myaddonsFile.append('github-ssh')
}
myaddonsFile.append("\">")
}
println "Enter the component git repository group"
def groupInput = System.in.newReader().readLine()
println "Enter the component git repository name"
def nameInput = System.in.newReader().readLine()
// get git branch
def grgit = Grgit.open(dir: newComponent.path)
def branch = grgit.branch.current().name
myaddonsFile.append("\n <component group=\"${groupInput}\" name=\"${nameInput}\" branch=\"${branch}\"/>")
myaddonsFile.append("\n</addons>")
} else if (myaddonsInput == 'n' || myaddonsInput == 'N') {
println "Selected no, so component not added to myaddons.xml\n"
} else {
println "Invalid input. Try again"
newComponent.deleteDir()
return
}
}
} else {
throw new InvalidUserDataException("No component property specified")
}
}
}
task getCurrent {
description = "Get the current archive for a component, also check each component it depends on and if not present get its current archive; requires component property"
doLast { getComponentTop('current') }
}
task getRelease {
description = "Get the release archive for a component, also check each component it depends on and if not present get its configured release archive; requires component property"
doLast { getComponentTop('release') }
}
task getBinary {
description = "Get the binary release archive for a component, also check each component it depends on and if not present get its configured release archive; requires component property"
doLast { getComponentTop('binary') }
}
task getGit {
description = "Clone the git repository for a component, also check each component it depends on and if not present clone its git repository; requires component property"
doLast { getComponentTop('git') }
}
task getDepends {
description = "Check/Get all dependencies for all components in runtime/component; locationType property optional (defaults to git if there is a .git directory, otherwise to current)"
doLast {
String curLocationType = file('.git').exists() ? 'git' : 'current'
if (project.hasProperty('locationType')) curLocationType = locationType
checkAllComponentDependencies(curLocationType)
}
}
task getComponentSet {
description = "Gets all components in the specied componentSet using specified location type, also check/get all components it depends on; requires -Pcomponent property; -PlocationType property optional (defaults to git if there is a .git directory, otherwise to current)"
doLast {
String curLocationType = file('.git').exists() ? 'git' : 'current'
if (project.hasProperty('locationType')) curLocationType = locationType
if (!project.hasProperty('componentSet')) throw new InvalidUserDataException("No componentSet property specified")
checkRuntimeDirAndDefaults(curLocationType)
Set compsChecked = new TreeSet()
loadComponentSet((String) componentSet, curLocationType, parseAddons(), parseMyaddons(), compsChecked)
logger.lifecycle("Got component-set ${componentSet}, got or checked components: ${compsChecked}")
}
}
task zipComponents {
description = "Create a .zip archive file for each component in runtime/component"
dependsOn allBuildTasks
doLast { for (File compDir in findComponentDirs()) createComponentZip(compDir) }
}
task zipComponent {
description = "Create a .zip archive file a single component in runtime/component; requires component property"
dependsOn allBuildTasks
doLast {
if (!project.hasProperty('component')) throw new InvalidUserDataException("No component property specified")
createComponentZip(file('runtime/component/' + component))
}
}
// ========== utility methods ==========
def createComponentZip(File compDir) {
File compXmlFile = file("${compDir.path}/component.xml")
if (!compXmlFile.exists()) {
logger.lifecycle("No component.xml file found at ${compXmlFile.path}, not creating component zip")
return
}
Node compXml = new XmlParser().parse(compXmlFile)
File zipFile = file("${compDir.parentFile.path}/${compXml.'@name'}${compXml.'@version' ? '-' + compXml.'@version' : ''}.zip")
if (zipFile.exists()) { logger.lifecycle("Deleting existing component zip file: ${zipFile.name}"); zipFile.delete() }
// exclude build, src, librepo, build.gradle, defaultexcludes (which includes .git)
ant.zip(destfile: zipFile.path) { fileset(dir: compDir.parentFile.path, includes: "${compDir.name}/**", defaultexcludes: 'yes',
excludes: "${compDir.name}/build/**,${compDir.name}/src/**,${compDir.name}/librepo/**,${compDir.name}/build.gradle") }
logger.lifecycle("Created component zip file: ${zipFile.name}")
}
def checkRuntimeDirAndDefaults(String locType) {
Node addons = parseAddons()
Node myaddons = parseMyaddons()
if (!locType) locType = file('.git').exists() ? 'git' : 'current'
File runtimeDir = file('runtime')
if (!runtimeDir.exists()) {
Node runtimeNode = myaddons != null && myaddons.runtime ? (Node) myaddons.runtime[0] : null
if (runtimeNode == null) runtimeNode = addons != null && addons.runtime ? (Node) addons.runtime[0] : null
if (runtimeNode == null) throw new InvalidUserDataException("The runtime directory does not exist and no runtime element found in myaddons.xml or addons.xml")
downloadComponent("runtime", locType, runtimeNode, addons, myaddons)
}
// look for @default in myaddons.xml only
if (myaddons?.'@default') {
String defaultComps = myaddons.'@default'
Set compsChecked = new TreeSet()
Set defaultCompsDownloaded = new TreeSet()
for (String compName in defaultComps.split(',')) {
compName = compName.trim()
if (!compName) continue
File componentDir = file("runtime/component/${compName}")
if (componentDir.exists()) continue
getComponent(compName, locType, addons, myaddons, compsChecked)
defaultCompsDownloaded.add(compName)
}
if (defaultCompsDownloaded)
logger.lifecycle("Got default components ${defaultCompsDownloaded}, dependent components checked: ${compsChecked}")
}
}
def loadComponentSet(String setName, String curLocationType, Node addons, Node myaddons, Set compsChecked) {
Node setNode = null
if (myaddons) setNode = myaddons.'component-set'.find({ it."@name" == setName })
if (setNode == null) setNode = addons.'component-set'.find({ it."@name" == setName })
if (setNode == null) throw new InvalidUserDataException("Could not find component-set with name ${setName}")
String components = setNode.'@components'
if (components) for (String compName in components.split(","))
getComponent(compName, curLocationType, addons, myaddons, compsChecked)
String sets = setNode.'@sets'
if (sets) for (String subsetName in sets.split(","))
loadComponentSet(subsetName, curLocationType, addons, myaddons, compsChecked)
}
Collection<File> findComponentDirs() {
file('runtime/component').listFiles().findAll({ it.isDirectory() && it.listFiles().find({ it.name == 'component.xml' }) })
}
Node parseAddons() { new XmlParser().parse(file('addons.xml')) }
Node parseMyaddons() { if (file('myaddons.xml').exists()) { new XmlParser().parse(file('myaddons.xml')) } else { null } }
Node parseComponent(project) { new XmlParser().parse(project.file('component.xml')) }
def getComponentTop(String locationType) {
if (project.hasProperty('component')) {
checkRuntimeDirAndDefaults(locationType)
Set compsChecked = new TreeSet()
File componentDir = getComponent(component, locationType, parseAddons(), parseMyaddons(), compsChecked)
if (componentDir?.exists()) logger.lifecycle("Got component ${component}, dependent components checked: ${compsChecked}")
} else {
throw new InvalidUserDataException("No component property specified")
}
}
File getComponent(String compName, String type, Node addons, Node myaddons, Set compsChecked) {
// get the component
Node component = myaddons != null ? (Node) myaddons.component.find({ it."@name" == compName }) : null
if (component == null) component = (Node) addons.component.find({ it."@name" == compName })
if (component == null) throw new InvalidUserDataException("Component ${compName} not found in myaddons.xml or addons.xml")
if (component.'@skip-get' == 'true') { logger.lifecycle("Skipping get component ${compName} (skip-get=true)"); return null }
File componentDir = downloadComponent("runtime/component/${compName}", type, component, addons, myaddons)
checkComponentDependencies(compName, type, addons, myaddons, compsChecked)
return componentDir
}
File downloadComponent(String targetDirPath, String type, Node component, Node addons, Node myaddons) {
String compName = component.'@name'
String branch = component.'@branch'
// fall back to 'current' (branch-based) if release/binary requested but version is empty
if (type in ['release', 'binary'] && !component.'@version') type = 'current'
String repositoryName = (component.'@repository' ?: myaddons?.'@default-repository' ?: addons.'@default-repository' ?: 'github')
Node repository = myaddons != null ? (Node) myaddons.repository.find({ it."@name" == repositoryName }) : null
if (repository == null) repository = (Node) addons.repository.find({ it."@name" == repositoryName })
if (repository == null) throw new InvalidUserDataException("Repository ${repositoryName} not found in myaddons.xml or addons.xml")
Node location = (Node) repository.location.find({ it."@type" == type })
if (location == null) throw new InvalidUserDataException("Location for type ${type} now found in repository ${repositoryName}")
String url = Eval.me('component', component, '"""' + location.'@url' + '"""')
logger.lifecycle("Getting ${compName} (type ${type}) from ${url} at ${branch} to ${targetDirPath}")
File targetDir = file(targetDirPath)
if (targetDir.exists()) { logger.lifecycle("Component ${compName} already exists at ${targetDir}"); return targetDir }
if (type in ['current', 'release', 'binary']) {
File zipFile = file("${targetDirPath}.zip")
ant.get(src: url, dest: zipFile)
// the eachFile closure removes the first path from each file, moving everything up a directory
copy { from zipTree(zipFile); into targetDir; eachFile { it.setPath((it.getRelativePath().getSegments() as List).tail().join("/")); return it } }
delete zipFile
// delete the empty directories left over from zip expansion with first path removed
String archiveDirName = compName + '-'
if (type == 'current') { archiveDirName += component.'@branch' } else { archiveDirName += component.'@version' }
// logger.lifecycle("Deleting dir ${targetDirPath}/${archiveDirName}")
delete file("${targetDirPath}/${archiveDirName}")
} else if (type == 'git') {
Grgit.clone(dir: targetDir, uri: url, refToCheckout: branch)
}
logger.lifecycle("Downloaded ${compName} to ${targetDirPath}")
return targetDir
}
def checkComponentDependencies(String compName, String type, Node addons, Node myaddons, Set compsChecked) {
File componentDir = file("runtime/component/${compName}")
if (!componentDir.exists()) return
compsChecked.add(compName)
File compXmlFile = file("${componentDir.path}/component.xml")
if (!compXmlFile.exists()) return
Node compXml = new XmlParser().parse(compXmlFile)
for (Node dependsOn in compXml.'depends-on') {
String depCompName = dependsOn.'@name'
if (file("runtime/component/${depCompName}").exists()) {
if (!compsChecked.contains(depCompName)) checkComponentDependencies(depCompName, type, addons, myaddons, compsChecked)
} else {
getComponent(depCompName, type, addons, myaddons, compsChecked)
}
}
}
def checkAllComponentDependencies(String type) {
Node addons = parseAddons()
Node myaddons = parseMyaddons()
Set compsChecked = new TreeSet()
for (File compDir in findComponentDirs()) {
checkComponentDependencies(compDir.name, type, addons, myaddons, compsChecked)
}
logger.lifecycle("Dependent components checked: ${compsChecked}")
}
def makeVersionDetailFiles() {
if (file(".git").exists()) {
def topVersionMap = [framework:getVersionDetailMap(file('.'))]
if (file("runtime/.git").exists()) topVersionMap.runtime = getVersionDetailMap(file('runtime'))
file('runtime/version.json').write(groovy.json.JsonOutput.toJson(topVersionMap), "UTF-8")
}
for (File compDir in file('runtime/component').listFiles().findAll { it.isDirectory() && it.listFiles().find { it.name == '.git' } }) {
def versionMap = getVersionDetailMap(compDir)
if (versionMap == null) continue
file(compDir.path + '/version.json').write(groovy.json.JsonOutput.toJson(versionMap), "UTF-8")
}
}
Map getVersionDetailMap(File gitDir) {
def curGrgit = Grgit.open(dir: gitDir)
if (curGrgit == null) return null
String trackingName = curGrgit.branch.current()?.trackingBranch?.name
String trackingUrl = ""
int trackingNameSlash = trackingName ? trackingName.indexOf('/') : -1
if (trackingNameSlash > 0) {
String remoteName = trackingName.substring(0, trackingNameSlash)
def trackingRemote = curGrgit.remote.list().find({ it.name == remoteName })
if (trackingRemote != null) trackingUrl = trackingRemote.url
}
try {
String headId = curGrgit.head()?.id
// tags come in order of oldest first so want to find last in case multiple tags refer to HEAD commit
def headTag = curGrgit.tag.list().reverse().find({ it.commit.id == headId })
return [branch:curGrgit.branch.current()?.name, tracking:trackingName, url:trackingUrl, head:headId?.take(10), tag:headTag?.name]
} catch (Throwable t) {
logger.lifecycle("Error getting git info for directory ${gitDir?.path}", t)
return null
}
}
def cleanVersionDetailFiles() {
def runtimeVersionFile = file("runtime/version.json")
if (runtimeVersionFile.exists()) runtimeVersionFile.delete()
for (File compDir in file('runtime/component').listFiles().findAll { it.isDirectory() }) {
File versionDetailFile = file(compDir.path + '/version.json')
if (versionDetailFile.exists()) versionDetailFile.delete()
}
}
// ========== combined tasks ==========
task cleanPullLoad { dependsOn cleanAll, gitPullAll, load }
task cleanPullTest { dependsOn cleanAll, gitPullAll, load, allTestTasks }
task cleanPullCompTest { dependsOn cleanAll, gitPullAll, load, getComponentTestTasks() }
task compTest { dependsOn getComponentTestTasks() }
================================================
FILE: build.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!--
This software is in the public domain under CC0 1.0 Universal plus a
Grant of Patent License.
To the extent possible under law, the author(s) have dedicated all
copyright and related and neighboring rights to this software to the
public domain worldwide. This software is distributed without any
warranty.
You should have received a copy of the CC0 Public Domain Dedication
along with this software (see the LICENSE.md file). If not, see
<http://creativecommons.org/publicdomain/zero/1.0/>.
-->
<!--
README: These are just tools for using the Moqui WAR file.
The actual build is done with Gradle.
-->
<project name="Moqui WAR Tools" default="run" basedir=".">
<property environment="env"/>
<property name="tomcat.home" value="../apache-tomcat-8.5.14"/>
<property name="moqui.runtime" value="runtime"/>
<property name="moqui.conf.dev" value="conf/MoquiDevConf.xml"/>
<property name="moqui.conf.production" value="conf/MoquiProductionConf.xml"/>
<target name="add-runtime">
<!-- unzip the "moqui.war" file to the wartemp directory -->
<mkdir dir="wartemp"/>
<unzip src="moqui.war" dest="wartemp"/>
<copy todir="wartemp">
<fileset dir="." includes="${moqui.runtime}/**" excludes="**/*.jar,${moqui.runtime}/lib/**,${moqui.runtime}/classes/**,${moqui.runtime}/log/**"/>
</copy>
<copy todir="wartemp/WEB-INF/lib"><fileset dir="${moqui.runtime}/lib" includes="*.jar"/></copy>
<copy todir="wartemp/WEB-INF/classes"><fileset dir="${moqui.runtime}/classes" includes="**/*"/></copy>
<copy todir="wartemp/WEB-INF/lib" flatten="true"><fileset dir="${moqui.runtime}/base-component" includes="**/*.jar"/></copy>
<copy todir="wartemp/WEB-INF/lib" flatten="true"><fileset dir="${moqui.runtime}/component" includes="**/*.jar"/></copy>
<copy todir="wartemp/WEB-INF/lib" flatten="true" failonerror="false"><fileset dir="${moqui.runtime}/ecomponent" includes="**/*.jar"/></copy>
<copy file="MoquiInit.properties" todir="wartemp/WEB-INF/classes" overwrite="true"/>
<copy todir="wartemp"><fileset dir="." includes="${moqui.runtime}/elasticsearch/**/*.jar"/></copy>
<!-- zip it up again -->
<zip destfile="moqui-plus-runtime.war" basedir="wartemp"/>
<delete verbose="off" failonerror="false" dir="wartemp"/>
</target>
<target name="deploy-tomcat">
<delete verbose="on" failonerror="false" dir="${tomcat.home}/runtime"/>
<delete verbose="on" failonerror="false" dir="${tomcat.home}/webapps/ROOT"/>
<delete verbose="on" failonerror="false" file="${tomcat.home}/webapps/ROOT.war"/>
<delete verbose="on" failonerror="false">
<fileset dir="${tomcat.home}/logs" includes="*"/>
</delete>
<copy file="moqui.war" tofile="${tomcat.home}/webapps/ROOT.war"/>
</target>
<target name="run" description="Run Moqui Web server in dev/default mode with Embedded Winstone (run the executable war file)">
<delete verbose="off" failonerror="false" dir="execwartmp"/>
<java jar="moqui.war" fork="true">
<jvmarg value="-server"/>
<jvmarg value="-Xmx256M"/>
<jvmarg value="-Dmoqui.conf=${moqui.conf.dev}"/>
<jvmarg value="-Dmoqui.runtime=${moqui.runtime}"/>
</java>
</target>
<target name="run-production" description="Run Moqui Web server in production mode">
<delete verbose="off" failonerror="false" dir="execwartmp"/>
<java jar="moqui.war" fork="true">
<jvmarg value="-server"/>
<jvmarg value="-Xms512M"/>
<jvmarg value="-Xmx512M"/>
<jvmarg value="-Dmoqui.conf=${moqui.conf.production}"/>
<jvmarg value="-Dmoqui.runtime=${moqui.runtime}"/>
</java>
</target>
<target name="load" description="Run Moqui data loader (run the executable war file with -load)">
<java jar="moqui.war" fork="true">
<jvmarg value="-server"/>
<jvmarg value="-Xmx256M"/>
<jvmarg value="-Dmoqui.conf=${moqui.conf.dev}"/>
<jvmarg value="-Dmoqui.runtime=${moqui.runtime}"/>
<arg value="-load"/>
</java>
</target>
<target name="load-production" description="Run Moqui data loader in production mode">
<java jar="moqui.war" fork="true">
<jvmarg value="-server"/>
<jvmarg value="-Xmx256M"/>
<jvmarg value="-Dmoqui.conf=${moqui.conf.production}"/>
<jvmarg value="-Dmoqui.runtime=${moqui.runtime}"/>
<arg value="-load"/>
</java>
</target>
</project>
================================================
FILE: docker/README.md
================================================
# Moqui On Docker
This directory contains everything needed to deploy moqui on docker.
## Prerequisites
- Docker.
- Docker Compose Plugin.
- Java 21.
- Convenience scripts require bash.
## Deployment Instructions
To deploy moqui on docker with all necessary services, follow below:
- Choose a docker compose file in `docker/`. For example to deploy moqui on
postgres you can choose moqui-postgres-compose.yml.
- Find and download a suitable JDBC driver for the target database, download its
jar file and place it in `runtime/lib`.
- Generate moqui war file `./gradlew build`
- Get into docker folder `cd docker`
- Build chosen compose file, e.g. `./build-compose-up.sh moqui-postgres-compose.yml`
This last step would build the "moqui" image and deploy all services. You can
confirm by accessing the system on http://localhost
For a more secure and complete deployment, it is recommended to carefully review
the compose files and adjust as needed, including changing credentials and other
settings such as setting the host names, configuring for letsencrypt, etc ...
## Compose Files
There are multiple compose files offered providing different services:
- moqui-acme-postgres.yml: Moqui, nginx, postgres and automatically issues SSL
certificates from letsencrypt. Requires configuring variables including
`VIRTUAL_HOST` and `LETSENCRYPT_HOST` and postgres driver.
- moqui-postgres-compose.yml: Moqui with postgres and nginx standard deployment.
- moqui-mysql-compose.yml: Moqui with mysql and nginx standard deployment.
- mysql-compose.yml: deploys all services with mysql except moqui itself. Useful
when deploying moqui elsewhere like on a servlet container.
- postgres-compose.yml: Same as mysql-compose but replacing mysql with postgres
- moqui-cluster1-compose.yml: Moqui with mysql. Designed to be deployed in a
hazelcast cluster for horizontal scaling. Requires preparing moqui with
the hazelcast component and mysql driver.
## Helper Scripts
- `build-compose-up.sh`: Given a certain compose file, build "moqui" and deploy
all services in the chosen yml file.
- `clean.sh`: Clean the artifacts generated upon deployment including the
database, opensearch and runtime.
- `compose-down.sh`: Tear down all services of a certain yml file
- `compose-up.sh`: Deploy all services of a certain yml file. If the "moqui"
image exists in the yml file and it is not built, this script will fail, and
you should use the build-compose-up.sh instead.
- `postgres_backup.sh`: Convenience script to create a database dump. Might need
adjusting the credentials.
## Moqui Image
The actual image "moqui" is generated from the Dockerfile found in
`docker/simple/Dockerfile`. All compose files depend on a "moqui" image
generated by this file.
Note: The deployment and tear down scripts can accept a container image name to
override the default name. For example, to use a hardened JDK image, a command
like the following can be used:
`./build-compose-up.sh moqui-acme-postgres.yml .. eclipse-temurin:21-jdk-ubi10-minimal`
================================================
FILE: docker/build-compose-up.sh
================================================
#! /bin/bash
if [[ ! $1 ]]; then
echo "Usage: ./build-compose-up.sh <docker compose file> [<moqui directory like ..>] [<runtime image like eclipse-temurin:21-jdk>]"
exit 1
fi
COMP_FILE="${1}"
MOQUI_HOME="${2:-..}"
NAME_TAG=moqui
RUNTIME_IMAGE="${3:-eclipse-temurin:21-jdk}"
if [ -f simple/docker-build.sh ]; then
cd simple
./docker-build.sh ../.. $NAME_TAG $RUNTIME_IMAGE
# shellcheck disable=SC2103
cd ..
fi
if [ -f compose-up.sh ]; then
./compose-up.sh $COMP_FILE $MOQUI_HOME $RUNTIME_IMAGE
fi
================================================
FILE: docker/clean.sh
================================================
#! /bin/bash
search_name=opensearch
if [ -d runtime/opensearch/bin ]; then search_name=opensearch;
elif [ -d runtime/elasticsearch/bin ]; then search_name=elasticsearch;
fi
rm -Rf runtime/
rm -Rf runtime1/
rm -Rf runtime2/
rm -Rf db/
rm -Rf $search_name/data/nodes
rm -Rf $search_name/data/*.conf
rm $search_name/logs/*.log
docker rm moqui-server
docker rm moqui-database
docker rm nginx-proxy
================================================
FILE: docker/compose-down.sh
================================================
#! /bin/bash
if [[ ! $1 ]]; then
echo "Usage: ./compose-down.sh <docker compose file>"
exit 1
fi
COMP_FILE="${1}"
# set the project name to 'moqui', network will be called 'moqui_default'
docker compose -f $COMP_FILE -p moqui down
================================================
FILE: docker/compose-up.sh
================================================
#! /bin/bash
if [[ ! $1 ]]; then
echo "Usage: ./compose-up.sh <docker compose file> [<moqui directory like ..>] [<runtime image like eclipse-temurin:21-jdk>]"
exit 1
fi
COMP_FILE="${1}"
MOQUI_HOME="${2:-..}"
NAME_TAG=moqui
RUNTIME_IMAGE="${3:-eclipse-temurin:21-jdk}"
# Note: If you don't have access to your conf directory while running this:
# This will make it so that your docker/conf directory no longer has your configuration files in it.
# This is because when docker-compose provisions a volume on the host it applies the host's data before the image's data.
# - change docker compose's moqui-server conf volume path from ./runtime/conf to conf
# - add a top level volumes: tag with conf: below
# - remove the next block of if statements from this file and you should be good to go
search_name=opensearch
if [ -d runtime/opensearch/bin ]; then search_name=opensearch;
elif [ -d runtime/elasticsearch/bin ]; then search_name=elasticsearch;
fi
if [ ! -e runtime ]; then mkdir runtime; fi
if [ ! -e runtime/conf ]; then cp -R $MOQUI_HOME/runtime/conf runtime/; fi
if [ ! -e runtime/lib ]; then cp -R $MOQUI_HOME/runtime/lib runtime/; fi
if [ ! -e runtime/classes ]; then cp -R $MOQUI_HOME/runtime/classes runtime/; fi
if [ ! -e runtime/log ]; then cp -R $MOQUI_HOME/runtime/log runtime/; fi
if [ ! -e runtime/txlog ]; then cp -R $MOQUI_HOME/runtime/txlog runtime/; fi
if [ ! -e runtime/db ]; then cp -R $MOQUI_HOME/runtime/db runtime/; fi
if [ ! -e runtime/$search_name ]; then cp -R $MOQUI_HOME/runtime/$search_name runtime/; fi
# set the project name to 'moqui', network will be called 'moqui_default'
docker compose -f $COMP_FILE -p moqui up -d
================================================
FILE: docker/elasticsearch/data/README
================================================
This directory must exist for mapping otherwise created as root in container and elasticsearch cannot access it.
================================================
FILE: docker/elasticsearch/moquiconfig/elasticsearch.yml
================================================
# ======================== Elasticsearch Configuration =========================
#
# NOTE: Elasticsearch comes with reasonable defaults for most settings.
# Before you set out to tweak and tune the configuration, make sure you
# understand what are you trying to accomplish and the consequences.
#
# The primary way of configuring a node is via this file. This template lists
# the most important settings you may want to configure for a production cluster.
#
# Please see the documentation for further information on configuration options:
# <http://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration.html>
#
# ---------------------------------- Cluster -----------------------------------
#
# Use a descriptive name for your cluster:
cluster.name: MoquiElasticSearch
# ------------------------------------ Node ------------------------------------
#
# Use a descriptive name for the node:
# NOTE: for cluster use auto generated
# node.name: MoquiLocal
# Add custom attributes to the node:
#
#node.attr.rack: r1
node.master: false
node.data: false
node.ingest: false
# ----------------------------------- Paths ------------------------------------
#
# Path to directory where to store the data (separate multiple locations by comma):
#
#path.data: /path/to/data
#
# Path to log files:
#
#path.logs: /path/to/logs
#
# ----------------------------------- Memory ----------
gitextract_s15y4lew/ ├── .github/ │ └── workflows/ │ └── gradle-wrapper-validation.yml ├── .gitignore ├── .travis.yml ├── .whitesource ├── AUTHORS ├── LICENSE.md ├── MoquiInit.properties ├── Procfile ├── Procfile.README ├── README.md ├── ReleaseNotes.md ├── SECURITY.md ├── addons.xml ├── build.gradle ├── build.xml ├── docker/ │ ├── README.md │ ├── build-compose-up.sh │ ├── clean.sh │ ├── compose-down.sh │ ├── compose-up.sh │ ├── elasticsearch/ │ │ ├── data/ │ │ │ └── README │ │ └── moquiconfig/ │ │ ├── elasticsearch.yml │ │ └── log4j2.properties │ ├── kibana/ │ │ └── kibana.yml │ ├── moqui-acme-postgres.yml │ ├── moqui-cluster1-compose.yml │ ├── moqui-mysql-compose.yml │ ├── moqui-postgres-compose.yml │ ├── moqui-run.sh │ ├── mysql-compose.yml │ ├── nginx/ │ │ └── my_proxy.conf │ ├── opensearch/ │ │ └── data/ │ │ └── nodes/ │ │ └── README │ ├── postgres-compose.yml │ ├── postgres_backup.sh │ └── simple/ │ ├── Dockerfile │ └── docker-build.sh ├── framework/ │ ├── build.gradle │ ├── data/ │ │ ├── CommonL10nData.xml │ │ ├── CurrencyData.xml │ │ ├── EntityTypeData.xml │ │ ├── GeoCountryData.xml │ │ ├── MoquiSetupData.xml │ │ ├── SecurityTypeData.xml │ │ └── UnitData.xml │ ├── entity/ │ │ ├── BasicEntities.xml │ │ ├── EntityEntities.xml │ │ ├── OlapEntities.xml │ │ ├── ResourceEntities.xml │ │ ├── Screen.eecas.xml │ │ ├── ScreenEntities.xml │ │ ├── SecurityEntities.xml │ │ ├── ServerEntities.xml │ │ ├── ServiceEntities.xml │ │ └── TestEntities.xml │ ├── lib/ │ │ └── btm-4.0.1.jar │ ├── screen/ │ │ ├── AddedEmailAuthcFactor.xml │ │ ├── EmailAuthcFactorSent.xml │ │ ├── NotificationEmail.xml │ │ ├── PasswordReset.xml │ │ ├── ScreenRenderEmail.xml │ │ └── SingleUseCode.xml │ ├── service/ │ │ └── org/ │ │ └── moqui/ │ │ ├── EmailServices.xml │ │ ├── EntityServices.xml │ │ ├── SmsServices.xml │ │ ├── impl/ │ │ │ ├── BasicServices.xml │ │ │ ├── ElFinderServices.xml │ │ │ ├── EmailServices.xml │ │ │ ├── EntityServices.xml │ │ │ ├── EntitySyncServices.xml │ │ │ ├── GoogleServices.xml │ │ │ ├── InstanceServices.xml │ │ │ ├── PrintServices.xml │ │ │ ├── ScreenServices.xml │ │ │ ├── ServerServices.xml │ │ │ ├── ServiceServices.xml │ │ │ ├── SystemMessageServices.xml │ │ │ ├── UserServices.xml │ │ │ └── WikiServices.xml │ │ └── search/ │ │ ├── ElasticSearchServices.xml │ │ └── SearchServices.xml │ ├── src/ │ │ ├── main/ │ │ │ ├── groovy/ │ │ │ │ └── org/ │ │ │ │ └── moqui/ │ │ │ │ └── impl/ │ │ │ │ ├── actions/ │ │ │ │ │ └── XmlAction.java │ │ │ │ ├── context/ │ │ │ │ │ ├── ArtifactExecutionFacadeImpl.groovy │ │ │ │ │ ├── ArtifactExecutionInfoImpl.java │ │ │ │ │ ├── CacheFacadeImpl.groovy │ │ │ │ │ ├── ContextJavaUtil.java │ │ │ │ │ ├── ElasticFacadeImpl.groovy │ │ │ │ │ ├── ExecutionContextFactoryImpl.groovy │ │ │ │ │ ├── ExecutionContextImpl.java │ │ │ │ │ ├── L10nFacadeImpl.java │ │ │ │ │ ├── LoggerFacadeImpl.groovy │ │ │ │ │ ├── MessageFacadeImpl.groovy │ │ │ │ │ ├── NotificationMessageImpl.groovy │ │ │ │ │ ├── ResourceFacadeImpl.groovy │ │ │ │ │ ├── TransactionCache.groovy │ │ │ │ │ ├── TransactionFacadeImpl.groovy │ │ │ │ │ ├── TransactionInternalBitronix.groovy │ │ │ │ │ ├── UserFacadeImpl.groovy │ │ │ │ │ ├── WebFacadeImpl.groovy │ │ │ │ │ ├── reference/ │ │ │ │ │ │ ├── BaseResourceReference.java │ │ │ │ │ │ ├── ComponentResourceReference.java │ │ │ │ │ │ ├── ContentResourceReference.groovy │ │ │ │ │ │ ├── DbResourceReference.groovy │ │ │ │ │ │ └── WrapperResourceReference.groovy │ │ │ │ │ ├── renderer/ │ │ │ │ │ │ ├── FtlMarkdownTemplateRenderer.groovy │ │ │ │ │ │ ├── FtlTemplateRenderer.java │ │ │ │ │ │ ├── GStringTemplateRenderer.groovy │ │ │ │ │ │ ├── MarkdownTemplateRenderer.groovy │ │ │ │ │ │ └── NoTemplateRenderer.groovy │ │ │ │ │ └── runner/ │ │ │ │ │ ├── GroovyScriptRunner.groovy │ │ │ │ │ ├── JavaxScriptRunner.groovy │ │ │ │ │ └── XmlActionsScriptRunner.groovy │ │ │ │ ├── entity/ │ │ │ │ │ ├── AggregationUtil.java │ │ │ │ │ ├── EntityCache.groovy │ │ │ │ │ ├── EntityConditionFactoryImpl.groovy │ │ │ │ │ ├── EntityDataDocument.groovy │ │ │ │ │ ├── EntityDataFeed.groovy │ │ │ │ │ ├── EntityDataLoaderImpl.groovy │ │ │ │ │ ├── EntityDataWriterImpl.groovy │ │ │ │ │ ├── EntityDatasourceFactoryImpl.groovy │ │ │ │ │ ├── EntityDbMeta.groovy │ │ │ │ │ ├── EntityDefinition.groovy │ │ │ │ │ ├── EntityDynamicViewImpl.groovy │ │ │ │ │ ├── EntityEcaRule.groovy │ │ │ │ │ ├── EntityFacadeImpl.groovy │ │ │ │ │ ├── EntityFindBase.groovy │ │ │ │ │ ├── EntityFindBuilder.java │ │ │ │ │ ├── EntityFindImpl.java │ │ │ │ │ ├── EntityJavaUtil.java │ │ │ │ │ ├── EntityListImpl.java │ │ │ │ │ ├── EntityListIteratorImpl.java │ │ │ │ │ ├── EntityListIteratorWrapper.java │ │ │ │ │ ├── EntityQueryBuilder.java │ │ │ │ │ ├── EntitySqlException.groovy │ │ │ │ │ ├── EntityValueBase.java │ │ │ │ │ ├── EntityValueImpl.java │ │ │ │ │ ├── FieldInfo.java │ │ │ │ │ ├── condition/ │ │ │ │ │ │ ├── BasicJoinCondition.java │ │ │ │ │ │ ├── ConditionAlias.java │ │ │ │ │ │ ├── ConditionField.java │ │ │ │ │ │ ├── DateCondition.groovy │ │ │ │ │ │ ├── EntityConditionImplBase.java │ │ │ │ │ │ ├── FieldToFieldCondition.groovy │ │ │ │ │ │ ├── FieldValueCondition.java │ │ │ │ │ │ ├── ListCondition.java │ │ │ │ │ │ ├── TrueCondition.java │ │ │ │ │ │ └── WhereCondition.groovy │ │ │ │ │ └── elastic/ │ │ │ │ │ ├── ElasticDatasourceFactory.groovy │ │ │ │ │ ├── ElasticEntityFind.java │ │ │ │ │ ├── ElasticEntityListIterator.java │ │ │ │ │ ├── ElasticEntityValue.java │ │ │ │ │ └── ElasticSynchronization.groovy │ │ │ │ ├── screen/ │ │ │ │ │ ├── ScreenDefinition.groovy │ │ │ │ │ ├── ScreenFacadeImpl.groovy │ │ │ │ │ ├── ScreenForm.groovy │ │ │ │ │ ├── ScreenRenderImpl.groovy │ │ │ │ │ ├── ScreenSection.groovy │ │ │ │ │ ├── ScreenTestImpl.groovy │ │ │ │ │ ├── ScreenTree.groovy │ │ │ │ │ ├── ScreenUrlInfo.groovy │ │ │ │ │ ├── ScreenWidgetRender.java │ │ │ │ │ ├── ScreenWidgetRenderFtl.groovy │ │ │ │ │ ├── ScreenWidgets.groovy │ │ │ │ │ └── WebFacadeStub.groovy │ │ │ │ ├── service/ │ │ │ │ │ ├── EmailEcaRule.groovy │ │ │ │ │ ├── ParameterInfo.java │ │ │ │ │ ├── RestApi.groovy │ │ │ │ │ ├── ScheduledJobRunner.groovy │ │ │ │ │ ├── ServiceCallAsyncImpl.groovy │ │ │ │ │ ├── ServiceCallImpl.java │ │ │ │ │ ├── ServiceCallJobImpl.groovy │ │ │ │ │ ├── ServiceCallSpecialImpl.groovy │ │ │ │ │ ├── ServiceCallSyncImpl.java │ │ │ │ │ ├── ServiceDefinition.java │ │ │ │ │ ├── ServiceEcaRule.groovy │ │ │ │ │ ├── ServiceFacadeImpl.groovy │ │ │ │ │ ├── ServiceJsonRpcDispatcher.groovy │ │ │ │ │ ├── ServiceRunner.groovy │ │ │ │ │ └── runner/ │ │ │ │ │ ├── EntityAutoServiceRunner.groovy │ │ │ │ │ ├── InlineServiceRunner.java │ │ │ │ │ ├── JavaServiceRunner.groovy │ │ │ │ │ ├── RemoteJsonRpcServiceRunner.groovy │ │ │ │ │ ├── RemoteRestServiceRunner.groovy │ │ │ │ │ └── ScriptServiceRunner.java │ │ │ │ ├── tools/ │ │ │ │ │ ├── H2ServerToolFactory.groovy │ │ │ │ │ ├── JCSCacheToolFactory.groovy │ │ │ │ │ ├── JackrabbitRunToolFactory.groovy │ │ │ │ │ ├── MCacheToolFactory.java │ │ │ │ │ └── SubEthaSmtpToolFactory.groovy │ │ │ │ ├── util/ │ │ │ │ │ ├── EdiHandler.groovy │ │ │ │ │ ├── ElFinderConnector.groovy │ │ │ │ │ ├── ElasticSearchLogger.groovy │ │ │ │ │ ├── JdbcExtractor.java │ │ │ │ │ ├── MoquiShiroRealm.groovy │ │ │ │ │ ├── RestSchemaUtil.groovy │ │ │ │ │ ├── SimpleSgmlReader.groovy │ │ │ │ │ └── SimpleSigner.java │ │ │ │ └── webapp/ │ │ │ │ ├── ElasticRequestLogFilter.groovy │ │ │ │ ├── GroovyShellEndpoint.groovy │ │ │ │ ├── MoquiAbstractEndpoint.groovy │ │ │ │ ├── MoquiAuthFilter.groovy │ │ │ │ ├── MoquiContextListener.groovy │ │ │ │ ├── MoquiFopServlet.groovy │ │ │ │ ├── MoquiServlet.groovy │ │ │ │ ├── MoquiSessionListener.groovy │ │ │ │ ├── NotificationEndpoint.groovy │ │ │ │ ├── NotificationWebSocketListener.groovy │ │ │ │ └── ScreenResourceNotFoundException.groovy │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── moqui/ │ │ │ │ ├── BaseArtifactException.java │ │ │ │ ├── BaseException.java │ │ │ │ ├── Moqui.java │ │ │ │ ├── context/ │ │ │ │ │ ├── ArtifactAuthorizationException.java │ │ │ │ │ ├── ArtifactExecutionFacade.java │ │ │ │ │ ├── ArtifactExecutionInfo.java │ │ │ │ │ ├── ArtifactTarpitException.java │ │ │ │ │ ├── AuthenticationRequiredException.java │ │ │ │ │ ├── CacheFacade.java │ │ │ │ │ ├── ElasticFacade.java │ │ │ │ │ ├── ExecutionContext.java │ │ │ │ │ ├── ExecutionContextFactory.java │ │ │ │ │ ├── L10nFacade.java │ │ │ │ │ ├── LogEventSubscriber.java │ │ │ │ │ ├── LoggerFacade.java │ │ │ │ │ ├── MessageFacade.java │ │ │ │ │ ├── MessageFacadeException.java │ │ │ │ │ ├── MoquiLog4jAppender.java │ │ │ │ │ ├── NotificationMessage.java │ │ │ │ │ ├── NotificationMessageListener.java │ │ │ │ │ ├── PasswordChangeRequiredException.java │ │ │ │ │ ├── ResourceFacade.java │ │ │ │ │ ├── ScriptRunner.java │ │ │ │ │ ├── SecondFactorRequiredException.java │ │ │ │ │ ├── TemplateRenderer.java │ │ │ │ │ ├── ToolFactory.java │ │ │ │ │ ├── TransactionException.java │ │ │ │ │ ├── TransactionFacade.java │ │ │ │ │ ├── TransactionInternal.java │ │ │ │ │ ├── UserFacade.java │ │ │ │ │ ├── ValidationError.java │ │ │ │ │ ├── WebFacade.java │ │ │ │ │ └── WebMediaTypeException.java │ │ │ │ ├── entity/ │ │ │ │ │ ├── EntityCondition.java │ │ │ │ │ ├── EntityConditionFactory.java │ │ │ │ │ ├── EntityDataLoader.java │ │ │ │ │ ├── EntityDataWriter.java │ │ │ │ │ ├── EntityDatasourceFactory.java │ │ │ │ │ ├── EntityDynamicView.java │ │ │ │ │ ├── EntityException.java │ │ │ │ │ ├── EntityFacade.java │ │ │ │ │ ├── EntityFind.java │ │ │ │ │ ├── EntityList.java │ │ │ │ │ ├── EntityListIterator.java │ │ │ │ │ ├── EntityNotFoundException.java │ │ │ │ │ ├── EntityValue.java │ │ │ │ │ └── EntityValueNotFoundException.java │ │ │ │ ├── etl/ │ │ │ │ │ ├── FlatXmlExtractor.java │ │ │ │ │ └── SimpleEtl.java │ │ │ │ ├── jcache/ │ │ │ │ │ ├── MCache.java │ │ │ │ │ ├── MCacheConfiguration.java │ │ │ │ │ ├── MCacheManager.java │ │ │ │ │ ├── MEntry.java │ │ │ │ │ └── MStats.java │ │ │ │ ├── resource/ │ │ │ │ │ ├── ClasspathResourceReference.java │ │ │ │ │ ├── ResourceReference.java │ │ │ │ │ └── UrlResourceReference.java │ │ │ │ ├── screen/ │ │ │ │ │ ├── ScreenFacade.java │ │ │ │ │ ├── ScreenRender.java │ │ │ │ │ └── ScreenTest.java │ │ │ │ ├── service/ │ │ │ │ │ ├── ServiceCall.java │ │ │ │ │ ├── ServiceCallAsync.java │ │ │ │ │ ├── ServiceCallJob.java │ │ │ │ │ ├── ServiceCallSpecial.java │ │ │ │ │ ├── ServiceCallSync.java │ │ │ │ │ ├── ServiceCallback.java │ │ │ │ │ ├── ServiceException.java │ │ │ │ │ └── ServiceFacade.java │ │ │ │ └── util/ │ │ │ │ ├── CollectionUtilities.java │ │ │ │ ├── ContextBinding.java │ │ │ │ ├── ContextStack.java │ │ │ │ ├── LiteStringMap.java │ │ │ │ ├── MClassLoader.java │ │ │ │ ├── MNode.java │ │ │ │ ├── ObjectUtilities.java │ │ │ │ ├── RestClient.java │ │ │ │ ├── SimpleTopic.java │ │ │ │ ├── StringUtilities.java │ │ │ │ ├── SystemBinding.java │ │ │ │ └── WebUtilities.java │ │ │ ├── resources/ │ │ │ │ ├── META-INF/ │ │ │ │ │ ├── jakarta.mime.types │ │ │ │ │ └── services/ │ │ │ │ │ └── org.moqui.context.ExecutionContextFactory │ │ │ │ ├── MoquiDefaultConf.xml │ │ │ │ ├── bitronix-default-config.properties │ │ │ │ ├── cache.ccf │ │ │ │ ├── log4j2.xml │ │ │ │ ├── org/ │ │ │ │ │ └── moqui/ │ │ │ │ │ └── impl/ │ │ │ │ │ ├── pollEmailServer.groovy │ │ │ │ │ ├── sendEmailMessage.groovy │ │ │ │ │ └── sendEmailTemplate.groovy │ │ │ │ └── shiro.ini │ │ │ └── webapp/ │ │ │ └── WEB-INF/ │ │ │ └── web.xml │ │ ├── start/ │ │ │ └── java/ │ │ │ └── MoquiStart.java │ │ └── test/ │ │ └── groovy/ │ │ ├── CacheFacadeTests.groovy │ │ ├── ConcurrentExecution.groovy │ │ ├── EntityCrud.groovy │ │ ├── EntityFindTests.groovy │ │ ├── EntityNoSqlCrud.groovy │ │ ├── L10nFacadeTests.groovy │ │ ├── MessageFacadeTests.groovy │ │ ├── MoquiSuite.groovy │ │ ├── ResourceFacadeTests.groovy │ │ ├── ServiceCrudImplicit.groovy │ │ ├── ServiceFacadeTests.groovy │ │ ├── SubSelectTests.groovy │ │ ├── SystemScreenRenderTests.groovy │ │ ├── TimezoneTest.groovy │ │ ├── ToolsRestApiTests.groovy │ │ ├── ToolsScreenRenderTests.groovy │ │ ├── TransactionFacadeTests.groovy │ │ └── UserFacadeTests.groovy │ ├── template/ │ │ └── XmlActions.groovy.ftl │ └── xsd/ │ ├── common-types-3.xsd │ ├── email-eca-3.xsd │ ├── entity-definition-3.xsd │ ├── entity-eca-3.xsd │ ├── framework-catalog.xml │ ├── moqui-conf-3.xsd │ ├── rest-api-3.xsd │ ├── service-definition-3.xsd │ ├── service-eca-3.xsd │ ├── xml-actions-3.xsd │ ├── xml-form-3.xsd │ └── xml-screen-3.xsd ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat └── settings.gradle
Showing preview only (251K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2780 symbols across 120 files)
FILE: framework/src/main/groovy/org/moqui/impl/actions/XmlAction.java
class XmlAction (line 33) | public class XmlAction {
method XmlAction (line 43) | public XmlAction(ExecutionContextFactoryImpl ecfi, MNode xmlNode, Stri...
method XmlAction (line 49) | public XmlAction(ExecutionContextFactoryImpl ecfi, String xmlText, Str...
method run (line 60) | public Object run(ExecutionContextImpl eci) {
method checkCondition (line 77) | public boolean checkCondition(ExecutionContextImpl eci) {
method writeGroovyWithLines (line 84) | public String writeGroovyWithLines() {
method getGroovyClass (line 92) | public Class getGroovyClass() {
method makeGroovyClass (line 96) | protected synchronized Class makeGroovyClass() {
method getGroovyString (line 110) | public String getGroovyString() {
FILE: framework/src/main/groovy/org/moqui/impl/context/ArtifactExecutionInfoImpl.java
class ArtifactExecutionInfoImpl (line 30) | public class ArtifactExecutionInfoImpl implements ArtifactExecutionInfo {
method ArtifactExecutionInfoImpl (line 72) | public ArtifactExecutionInfoImpl(String name, ArtifactType typeEnum, A...
method setParameters (line 82) | public ArtifactExecutionInfoImpl setParameters(Map<String, Object> par...
method getName (line 84) | @Override
method getTypeEnum (line 87) | @Override
method getTypeDescription (line 89) | @Override
method getActionEnum (line 95) | @Override
method getActionDescription (line 97) | @Override
method getAuthorizedUserId (line 103) | @Override
method setAuthorizedUserId (line 105) | void setAuthorizedUserId(String authorizedUserId) { this.internalAutho...
method getAuthorizedAuthzType (line 107) | @Override
method setAuthorizedAuthzType (line 109) | void setAuthorizedAuthzType(AuthzType authorizedAuthzType) { this.inte...
method getAuthorizedActionEnum (line 111) | @Override
method setAuthorizedActionEnum (line 113) | void setAuthorizedActionEnum(AuthzAction authorizedActionEnum) { this....
method isAuthorizationInheritable (line 115) | @Override
method setAuthorizationInheritable (line 117) | void setAuthorizationInheritable(boolean isAuthorizationInheritable) {...
method getAuthorizationWasRequired (line 119) | @Override
method setAuthzReqdAndIsAccess (line 121) | public ArtifactExecutionInfoImpl setAuthzReqdAndIsAccess(boolean authz...
method setTrackArtifactHit (line 126) | public ArtifactExecutionInfoImpl setTrackArtifactHit(boolean tah) { tr...
method getAuthorizationWasGranted (line 127) | @Override
method setAuthorizationWasGranted (line 129) | void setAuthorizationWasGranted(boolean value) { internalAuthzWasGrant...
method getMoquiTxId (line 131) | public Long getMoquiTxId() { return moquiTxId; }
method setMoquiTxId (line 132) | void setMoquiTxId(Long txId) { moquiTxId = txId; }
method getAacv (line 134) | ArtifactAuthzCheck getAacv() { return internalAacv; }
method copyAacvInfo (line 136) | public void copyAacvInfo(ArtifactAuthzCheck aacv, String userId, boole...
method copyAuthorizedInfo (line 145) | public void copyAuthorizedInfo(ArtifactExecutionInfoImpl aeii) {
method setEndTime (line 155) | void setEndTime() { this.endTimeNanos = System.nanoTime(); }
method getRunningTime (line 156) | @Override
method getRunningTimeMillisDouble (line 158) | public double getRunningTimeMillisDouble() { return (endTimeNanos != 0...
method getRunningTimeMillisLong (line 159) | public long getRunningTimeMillisLong() { return Math.round((endTimeNan...
method calcChildTime (line 160) | private void calcChildTime(boolean recurse) {
method getThisRunningTime (line 167) | @Override
method getChildrenRunningTime (line 169) | @Override
method getRunningTimeMillis (line 175) | public BigDecimal getRunningTimeMillis() { return new BigDecimal(getRu...
method getThisRunningTimeMillis (line 176) | public BigDecimal getThisRunningTimeMillis() { return new BigDecimal(g...
method getChildrenRunningTimeMillis (line 177) | public BigDecimal getChildrenRunningTimeMillis() { return new BigDecim...
method setParent (line 179) | void setParent(ArtifactExecutionInfoImpl parentAeii) { this.parentAeii...
method getParent (line 180) | @Override
method getPercentOfParentTime (line 182) | @Override
method addChild (line 187) | void addChild(ArtifactExecutionInfoImpl aeii) {
method getChildList (line 191) | @Override
method print (line 198) | public void print(Writer writer, int level, boolean children) {
method getKeyString (line 217) | private String getKeyString() { return nameInternal + ":" + internalTy...
method getKeyStringNoName (line 218) | private String getKeyStringNoName() { return internalTypeEnum.name() +...
class ArtifactTypeStats (line 220) | public static class ArtifactTypeStats {
method add (line 230) | public void add(ArtifactTypeStats that) {
method cloneStats (line 249) | public ArtifactTypeStats cloneStats(ArtifactTypeStats that) {
method getArtifactTypeStats (line 255) | static ArtifactTypeStats getArtifactTypeStats(ArrayList<ArtifactExecut...
method addArtifactTypeStats (line 260) | static void addArtifactTypeStats(ArrayList<ArtifactExecutionInfoImpl> ...
method hotSpotByTime (line 341) | @SuppressWarnings("unchecked")
method addToMapByTime (line 380) | @SuppressWarnings("unchecked")
method printHotSpotList (line 415) | static void printHotSpotList(Writer writer, List<Map> infoList) throws...
method consolidateArtifactInfo (line 431) | static List<Map> consolidateArtifactInfo(List<ArtifactExecutionInfoImp...
method consolidateArtifactInfo (line 437) | @SuppressWarnings("unchecked")
method printArtifactInfoList (line 469) | public static String printArtifactInfoList(List<Map> infoList) throws ...
method printArtifactInfoList (line 474) | @SuppressWarnings("unchecked")
method toString (line 497) | @Override public String toString() {
method toBasicString (line 504) | @Override public String toBasicString() {
class ArtifactAuthzCheck (line 514) | public static class ArtifactAuthzCheck {
method ArtifactAuthzCheck (line 521) | public ArtifactAuthzCheck(EntityValueBase aacvEvb) {
method toString (line 541) | @Override public String toString() {
FILE: framework/src/main/groovy/org/moqui/impl/context/ContextJavaUtil.java
class ContextJavaUtil (line 55) | public class ContextJavaUtil {
method unwrapMap (line 62) | public static Map<String, Object> unwrapMap(Map<String, Object> source...
method unwrap (line 75) | @SuppressWarnings("unchecked")
class ArtifactStatsInfo (line 112) | public static class ArtifactStatsInfo {
method ArtifactStatsInfo (line 120) | ArtifactStatsInfo(ArtifactExecutionInfo.ArtifactType artifactTypeEnu...
method getAverage (line 125) | double getAverage() { return hitCount > 0 ? totalTimeMillis / hitCou...
method getStdDev (line 126) | double getStdDev() {
method countHit (line 130) | public boolean countHit(long startTime, double runningTime) {
method isHitSlow (line 149) | boolean isHitSlow(double runningTime) {
class ArtifactBinInfo (line 169) | public static class ArtifactBinInfo {
method ArtifactBinInfo (line 176) | ArtifactBinInfo(ArtifactStatsInfo statsInfo, long startTime) {
method countHit (line 181) | void countHit(double runningTime, boolean isSlow) {
method makeAhbValue (line 197) | EntityValue makeAhbValue(ExecutionContextFactoryImpl ecfi, Timestamp...
class ArtifactHitInfo (line 218) | public static class ArtifactHitInfo {
method ArtifactHitInfo (line 230) | ArtifactHitInfo(ExecutionContextImpl eci, boolean isSlowHit, Artifac...
method makeAhiValue (line 256) | EntityValue makeAhiValue(ExecutionContextFactoryImpl ecfi) {
class RollbackInfo (line 300) | static class RollbackInfo {
method RollbackInfo (line 307) | public RollbackInfo(String causeMessage, Throwable causeThrowable, E...
class TxStackInfo (line 315) | static class TxStackInfo {
method getActiveXaResourceMap (line 332) | public Map<String, XAResource> getActiveXaResourceMap() { return act...
method getActiveSynchronizationMap (line 333) | public Map<String, Synchronization> getActiveSynchronizationMap() { ...
method getTxConByGroup (line 334) | public Map<String, ConnectionWrapper> getTxConByGroup() { return txC...
method TxStackInfo (line 336) | public TxStackInfo(TransactionFacadeImpl tfi) { transactionFacade = ...
method clearCurrent (line 338) | public void clearCurrent() {
method closeTxConnections (line 359) | public void closeTxConnections() {
class EntityRecordLock (line 370) | public static class EntityRecordLock {
method EntityRecordLock (line 376) | public EntityRecordLock(String entityName, String pkString, ArrayLis...
method mutator (line 386) | EntityRecordLock mutator(String mutateEntityName, String mutatePkStr...
method register (line 392) | void register(ConcurrentHashMap<String, ArrayList<EntityRecordLock>>...
method clear (line 443) | void clear(ConcurrentHashMap<String, ArrayList<EntityRecordLock>> re...
class ConnectionWrapper (line 470) | public static class ConnectionWrapper implements Connection {
method ConnectionWrapper (line 475) | public ConnectionWrapper(Connection con, TransactionFacadeImpl tfi, ...
method getGroupName (line 481) | public String getGroupName() { return groupName; }
method closeInternal (line 483) | public void closeInternal() throws SQLException {
method createStatement (line 487) | @Override public Statement createStatement() throws SQLException { r...
method prepareStatement (line 488) | @Override public PreparedStatement prepareStatement(String sql) thro...
method prepareCall (line 489) | @Override public CallableStatement prepareCall(String sql) throws SQ...
method nativeSQL (line 490) | @Override public String nativeSQL(String sql) throws SQLException { ...
method setAutoCommit (line 491) | @Override public void setAutoCommit(boolean autoCommit) throws SQLEx...
method getAutoCommit (line 492) | @Override public boolean getAutoCommit() throws SQLException { retur...
method commit (line 493) | @Override public void commit() throws SQLException { con.commit(); }
method rollback (line 494) | @Override public void rollback() throws SQLException { con.rollback(...
method close (line 496) | @Override
method isClosed (line 501) | @Override public boolean isClosed() throws SQLException { return con...
method getMetaData (line 502) | @Override public DatabaseMetaData getMetaData() throws SQLException ...
method setReadOnly (line 503) | @Override public void setReadOnly(boolean readOnly) throws SQLExcept...
method isReadOnly (line 504) | @Override public boolean isReadOnly() throws SQLException { return c...
method setCatalog (line 505) | @Override public void setCatalog(String catalog) throws SQLException...
method getCatalog (line 506) | @Override public String getCatalog() throws SQLException { return co...
method setTransactionIsolation (line 507) | @Override public void setTransactionIsolation(int level) throws SQLE...
method getTransactionIsolation (line 508) | @Override public int getTransactionIsolation() throws SQLException {...
method getWarnings (line 509) | @Override public SQLWarning getWarnings() throws SQLException { retu...
method clearWarnings (line 510) | @Override public void clearWarnings() throws SQLException { con.clea...
method createStatement (line 512) | @Override public Statement createStatement(int resultSetType, int re...
method prepareStatement (line 514) | @Override public PreparedStatement prepareStatement(String sql, int ...
method prepareCall (line 516) | @Override public CallableStatement prepareCall(String sql, int resul...
method getTypeMap (line 519) | @Override public Map<String, Class<?>> getTypeMap() throws SQLExcept...
method setTypeMap (line 520) | @Override public void setTypeMap(Map<String, Class<?>> map) throws S...
method setHoldability (line 521) | @Override public void setHoldability(int holdability) throws SQLExce...
method getHoldability (line 522) | @Override public int getHoldability() throws SQLException { return c...
method setSavepoint (line 523) | @Override public Savepoint setSavepoint() throws SQLException { retu...
method setSavepoint (line 524) | @Override public Savepoint setSavepoint(String name) throws SQLExcep...
method rollback (line 525) | @Override public void rollback(Savepoint savepoint) throws SQLExcept...
method releaseSavepoint (line 526) | @Override public void releaseSavepoint(Savepoint savepoint) throws S...
method createStatement (line 528) | @Override public Statement createStatement(int resultSetType, int re...
method prepareStatement (line 530) | @Override public PreparedStatement prepareStatement(String sql, int ...
method prepareCall (line 532) | @Override public CallableStatement prepareCall(String sql, int resul...
method prepareStatement (line 534) | @Override public PreparedStatement prepareStatement(String sql, int ...
method prepareStatement (line 536) | @Override public PreparedStatement prepareStatement(String sql, int[...
method prepareStatement (line 538) | @Override public PreparedStatement prepareStatement(String sql, Stri...
method createClob (line 541) | @Override public Clob createClob() throws SQLException { return con....
method createBlob (line 542) | @Override public Blob createBlob() throws SQLException { return con....
method createNClob (line 543) | @Override public NClob createNClob() throws SQLException { return co...
method createSQLXML (line 544) | @Override public SQLXML createSQLXML() throws SQLException { return ...
method isValid (line 545) | @Override public boolean isValid(int timeout) throws SQLException { ...
method setClientInfo (line 546) | @Override public void setClientInfo(String name, String value) throw...
method setClientInfo (line 547) | @Override public void setClientInfo(Properties properties) throws SQ...
method getClientInfo (line 548) | @Override public String getClientInfo(String name) throws SQLExcepti...
method getClientInfo (line 549) | @Override public Properties getClientInfo() throws SQLException { re...
method createArrayOf (line 550) | @Override public Array createArrayOf(String typeName, Object[] eleme...
method createStruct (line 552) | @Override public Struct createStruct(String typeName, Object[] attri...
method setSchema (line 555) | @Override public void setSchema(String schema) throws SQLException {...
method getSchema (line 556) | @Override public String getSchema() throws SQLException { return con...
method abort (line 558) | @Override public void abort(Executor executor) throws SQLException {...
method setNetworkTimeout (line 559) | @Override public void setNetworkTimeout(Executor executor, int milli...
method getNetworkTimeout (line 561) | @Override public int getNetworkTimeout() throws SQLException { retur...
method unwrap (line 563) | @Override public <T> T unwrap(Class<T> iface) throws SQLException { ...
method isWrapperFor (line 564) | @Override public boolean isWrapperFor(Class<?> iface) throws SQLExce...
method hashCode (line 567) | @Override public int hashCode() { return con.hashCode(); }
method equals (line 568) | @Override public boolean equals(Object obj) { return obj instanceof ...
method toString (line 569) | @Override public String toString() {
class GStringJsonSerializer (line 595) | static class GStringJsonSerializer extends StdSerializer<GString> {
method GStringJsonSerializer (line 596) | GStringJsonSerializer() { super(GString.class); }
method serialize (line 597) | @Override public void serialize(GString value, JsonGenerator gen, Se...
class TimestampNoNegativeJsonSerializer (line 600) | static class TimestampNoNegativeJsonSerializer extends StdSerializer<T...
method TimestampNoNegativeJsonSerializer (line 601) | TimestampNoNegativeJsonSerializer() { super(Timestamp.class); }
method serialize (line 602) | @Override public void serialize(Timestamp value, JsonGenerator gen, ...
class LiteStringMapJsonSerializer (line 616) | static class LiteStringMapJsonSerializer extends StdSerializer<LiteStr...
method LiteStringMapJsonSerializer (line 617) | LiteStringMapJsonSerializer() { super(LiteStringMap.class); }
method serialize (line 618) | @Override public void serialize(LiteStringMap lsm, JsonGenerator gen...
class ResourceReferenceJsonSerializer (line 634) | static class ResourceReferenceJsonSerializer extends StdSerializer<Res...
method ResourceReferenceJsonSerializer (line 635) | ResourceReferenceJsonSerializer() { super(ResourceReference.class); }
method serialize (line 636) | @Override public void serialize(ResourceReference resourceRef, JsonG...
class WorkerThreadFactory (line 653) | public static class WorkerThreadFactory implements ThreadFactory {
method newThread (line 656) | public Thread newThread(Runnable r) { return new Thread(workerGroup,...
class JobThreadFactory (line 658) | public static class JobThreadFactory implements ThreadFactory {
method newThread (line 661) | public Thread newThread(Runnable r) { return new Thread(workerGroup,...
class WorkerThreadPoolExecutor (line 663) | public static class WorkerThreadPoolExecutor extends ThreadPoolExecutor {
method WorkerThreadPoolExecutor (line 665) | public WorkerThreadPoolExecutor(ExecutionContextFactoryImpl ecfi, in...
method afterExecute (line 671) | @Override protected void afterExecute(Runnable runnable, Throwable t...
class ScheduledThreadFactory (line 695) | static class ScheduledThreadFactory implements ThreadFactory {
method newThread (line 698) | public Thread newThread(Runnable r) { return new Thread(workerGroup,...
class CustomScheduledTask (line 700) | public static class CustomScheduledTask<V> implements RunnableSchedule...
method CustomScheduledTask (line 705) | public CustomScheduledTask(Runnable runnable, RunnableScheduledFutur...
method CustomScheduledTask (line 710) | public CustomScheduledTask(Callable<V> callable, RunnableScheduledFu...
method isPeriodic (line 716) | @Override public boolean isPeriodic() { return future.isPeriodic(); }
method getDelay (line 717) | @Override public long getDelay(@NotNull TimeUnit timeUnit) { return ...
method compareTo (line 718) | @Override public int compareTo(@NotNull Delayed delayed) { return fu...
method run (line 720) | @Override public void run() {
method cancel (line 728) | @Override public boolean cancel(boolean b) { return future.cancel(b); }
method isCancelled (line 729) | @Override public boolean isCancelled() { return future.isCancelled(); }
method isDone (line 730) | @Override public boolean isDone() { return future.isDone(); }
method get (line 732) | @Override public V get() throws InterruptedException, ExecutionExcep...
method get (line 733) | @Override public V get(long l, @NotNull TimeUnit timeUnit) throws In...
method toString (line 737) | @Override public String toString() {
class CustomScheduledExecutor (line 741) | public static class CustomScheduledExecutor extends ScheduledThreadPoo...
method CustomScheduledExecutor (line 742) | public CustomScheduledExecutor(int coreThreads) {
method CustomScheduledExecutor (line 745) | public CustomScheduledExecutor(int coreThreads, ThreadFactory thread...
method decorateTask (line 748) | protected <V> RunnableScheduledFuture<V> decorateTask(Runnable r, Ru...
method decorateTask (line 751) | protected <V> RunnableScheduledFuture<V> decorateTask(Callable<V> c,...
class ScheduledRunnableInfo (line 755) | static class ScheduledRunnableInfo {
method ScheduledRunnableInfo (line 759) | ScheduledRunnableInfo(Runnable command, long period) {
FILE: framework/src/main/groovy/org/moqui/impl/context/ExecutionContextImpl.java
class ExecutionContextImpl (line 48) | public class ExecutionContextImpl implements ExecutionContext {
method ExecutionContextImpl (line 81) | public ExecutionContextImpl(ExecutionContextFactoryImpl ecfi, Thread f...
method initCaches (line 115) | @SuppressWarnings("unchecked")
method getL10nMessageCache (line 120) | Cache<String, String> getL10nMessageCache() { return l10nMessageCache; }
method getTarpitHitCache (line 121) | public Cache<String, ArrayList> getTarpitHitCache() { return tarpitHit...
method getFactory (line 123) | @Override public @Nonnull ExecutionContextFactory getFactory() { retur...
method getContext (line 125) | @Override public @Nonnull ContextStack getContext() { return contextSt...
method getContextRoot (line 126) | @Override public @Nonnull Map<String, Object> getContextRoot() { retur...
method getContextBinding (line 127) | @Override public @Nonnull ContextBinding getContextBinding() { return ...
method getTool (line 129) | @Override
method getWeb (line 134) | @Override public @Nullable WebFacade getWeb() { return webFacade; }
method getWebImpl (line 135) | public @Nullable WebFacadeImpl getWebImpl() { return webFacadeImpl; }
method getUser (line 137) | @Override public @Nonnull UserFacade getUser() { return userFacade; }
method getMessage (line 138) | @Override public @Nonnull MessageFacade getMessage() { return messageF...
method getArtifactExecution (line 139) | @Override public @Nonnull ArtifactExecutionFacade getArtifactExecution...
method getL10n (line 140) | @Override public @Nonnull L10nFacade getL10n() { return l10nFacade; }
method getResource (line 141) | @Override public @Nonnull ResourceFacade getResource() { return resour...
method getLogger (line 142) | @Override public @Nonnull LoggerFacade getLogger() { return loggerFaca...
method getCache (line 143) | @Override public @Nonnull CacheFacade getCache() { return cacheFacade; }
method getTransaction (line 144) | @Override public @Nonnull TransactionFacade getTransaction() { return ...
method getEntity (line 146) | @Override public @Nonnull EntityFacade getEntity() { return activeEnti...
method getEntityFacade (line 147) | public @Nonnull EntityFacadeImpl getEntityFacade() { return activeEnti...
method getElastic (line 149) | @Override public @Nonnull ElasticFacade getElastic() { return ecfi.ela...
method getService (line 150) | @Override public @Nonnull ServiceFacade getService() { return serviceF...
method getScreen (line 151) | @Override public @Nonnull ScreenFacade getScreen() { return screenFaca...
method makeNotificationMessage (line 153) | @Override public @Nonnull NotificationMessage makeNotificationMessage(...
method getNotificationMessages (line 155) | @Override
method initWebFacade (line 178) | @Override
method setWebFacade (line 200) | public void setWebFacade(WebFacade wf) {
method getSkipStats (line 206) | public boolean getSkipStats() {
method runAsync (line 215) | @Override
method runInWorkerThread (line 221) | public Future runInWorkerThread(@Nonnull Closure closure) {
method destroy (line 226) | @Override
method toString (line 245) | @Override public String toString() { return "ExecutionContext"; }
class ThreadPoolRunnable (line 247) | public static class ThreadPoolRunnable implements Runnable {
method ThreadPoolRunnable (line 252) | public ThreadPoolRunnable(ExecutionContextImpl eci, Closure closure) {
method ThreadPoolRunnable (line 259) | public ThreadPoolRunnable(ExecutionContextFactoryImpl ecfi, Closure ...
method run (line 265) | @Override
method getEcfi (line 286) | public ExecutionContextFactoryImpl getEcfi() { return ecfi; }
method setEcfi (line 287) | public void setEcfi(ExecutionContextFactoryImpl ecfi) { this.ecfi = ...
method getClosure (line 288) | public Closure getClosure() { return closure; }
method setClosure (line 289) | public void setClosure(Closure closure) { this.closure = closure; }
FILE: framework/src/main/groovy/org/moqui/impl/context/L10nFacadeImpl.java
class L10nFacadeImpl (line 42) | public class L10nFacadeImpl implements L10nFacade {
method L10nFacadeImpl (line 50) | public L10nFacadeImpl(ExecutionContextImpl eci) { this.eci = eci; }
method getLocale (line 52) | protected Locale getLocale() { return eci.userFacade.getLocale(); }
method getTimeZone (line 53) | protected TimeZone getTimeZone() { return eci.userFacade.getTimeZone(); }
method localize (line 55) | @Override
method localize (line 57) | @Override
method formatCurrencyNoSymbol (line 105) | @Override
method formatCurrency (line 107) | @Override
method formatCurrency (line 109) | @Override
method formatCurrency (line 111) | @Override
method formatCurrency (line 113) | public String formatCurrency(Object amount, String uomId, Integer frac...
method roundCurrency (line 173) | @Override
method roundCurrency (line 175) | @Override
method roundCurrency (line 177) | @Override
method roundCurrency (line 181) | @Override
method parseTime (line 208) | @Override
method formatTime (line 236) | public String formatTime(Time input, String format, Locale locale, Tim...
method parseDate (line 245) | @Override
method formatDate (line 285) | public String formatDate(java.util.Date input, String format, Locale l...
method parseTimestamp (line 306) | @Override
method parseTimestamp (line 311) | @Override
method formatTimestamp (line 355) | public static String formatTimestamp(java.util.Date input, String form...
method parseDateTime (line 360) | @Override public Calendar parseDateTime(String input, String format) {
method formatDateTime (line 362) | @Override public String formatDateTime(Calendar input, String format, ...
method parseNumber (line 368) | @Override public BigDecimal parseNumber(String input, String format) {
method formatNumber (line 370) | @Override public String formatNumber(Number input, String format, Loca...
method format (line 385) | @Override
method format (line 389) | @Override
FILE: framework/src/main/groovy/org/moqui/impl/context/reference/BaseResourceReference.java
class BaseResourceReference (line 26) | public abstract class BaseResourceReference extends ResourceReference {
method BaseResourceReference (line 30) | public BaseResourceReference() { }
method init (line 32) | @Override
method init (line 34) | public abstract ResourceReference init(String location, ExecutionConte...
method createNew (line 36) | @Override public abstract ResourceReference createNew(String location);
method getLocation (line 37) | @Override public abstract String getLocation();
method openStream (line 38) | @Override public abstract InputStream openStream();
method getOutputStream (line 39) | @Override public abstract OutputStream getOutputStream();
method getText (line 40) | @Override public abstract String getText();
method supportsAll (line 42) | @Override public abstract boolean supportsAll();
method supportsUrl (line 43) | @Override public abstract boolean supportsUrl();
method getUrl (line 44) | @Override public abstract URL getUrl();
method supportsDirectory (line 45) | @Override public abstract boolean supportsDirectory();
method isFile (line 46) | @Override public abstract boolean isFile();
method isDirectory (line 47) | @Override public abstract boolean isDirectory();
method getDirectoryEntries (line 48) | @Override public abstract List<ResourceReference> getDirectoryEntries();
method supportsExists (line 50) | @Override public abstract boolean supportsExists();
method getExists (line 51) | @Override public abstract boolean getExists();
method supportsLastModified (line 52) | @Override public abstract boolean supportsLastModified();
method getLastModified (line 53) | @Override public abstract long getLastModified();
method supportsSize (line 54) | @Override public abstract boolean supportsSize();
method getSize (line 55) | @Override public abstract long getSize();
method supportsWrite (line 57) | @Override public abstract boolean supportsWrite();
method putText (line 58) | @Override public abstract void putText(String text);
method putStream (line 59) | @Override public abstract void putStream(InputStream stream);
method move (line 60) | @Override public abstract void move(String newLocation);
method makeDirectory (line 62) | @Override public abstract ResourceReference makeDirectory(String name);
method makeFile (line 63) | @Override public abstract ResourceReference makeFile(String name);
method delete (line 64) | @Override public abstract boolean delete();
FILE: framework/src/main/groovy/org/moqui/impl/context/reference/ComponentResourceReference.java
class ComponentResourceReference (line 22) | public class ComponentResourceReference extends WrapperResourceReference {
method ComponentResourceReference (line 25) | public ComponentResourceReference() { super(); }
method init (line 27) | public ResourceReference init(String location, ExecutionContextFactory...
method createNew (line 60) | @Override
method getLocation (line 67) | @Override
method getDirectoryEntries (line 70) | @Override
FILE: framework/src/main/groovy/org/moqui/impl/context/renderer/FtlTemplateRenderer.java
class FtlTemplateRenderer (line 39) | @CompileStatic
method FtlTemplateRenderer (line 48) | public FtlTemplateRenderer() { }
method init (line 50) | @SuppressWarnings("unchecked")
method render (line 58) | public void render(String location, Writer writer) {
method stripTemplateExtension (line 64) | public String stripTemplateExtension(String fileName) { return fileNam...
method destroy (line 66) | public void destroy() { }
method getFtlTemplateByLocation (line 68) | @SuppressWarnings("unchecked")
method makeTemplate (line 90) | private Template makeTemplate(final String location, boolean hasVersio...
method getFtlConfiguration (line 118) | public Configuration getFtlConfiguration() { return defaultFtlConfigur...
method makeFtlConfiguration (line 120) | private static Configuration makeFtlConfiguration(ExecutionContextFact...
class MoquiConfiguration (line 150) | private static class MoquiConfiguration extends Configuration {
method MoquiConfiguration (line 152) | MoquiConfiguration(Version version, ExecutionContextFactoryImpl ecfi) {
method getTemplate (line 157) | @Override
method getEcfi (line 175) | public ExecutionContextFactoryImpl getEcfi() { return ecfi; }
method setEcfi (line 176) | public void setEcfi(ExecutionContextFactoryImpl ecfi) { this.ecfi = ...
class MoquiTemplateExceptionHandler (line 197) | private static class MoquiTemplateExceptionHandler implements Template...
method handleTemplateException (line 198) | public void handleTemplateException(final TemplateException te, Envi...
FILE: framework/src/main/groovy/org/moqui/impl/entity/AggregationUtil.java
class AggregationUtil (line 33) | public class AggregationUtil {
type AggregateFunction (line 37) | public enum AggregateFunction { MIN, MAX, SUM, AVG, COUNT, FIRST, LAST }
class AggregateField (line 40) | public static class AggregateField {
method AggregateField (line 46) | public AggregateField(String fn, AggregateFunction func, boolean gb,...
method AggregationUtil (line 60) | public AggregationUtil(String listName, String listEntryName, Aggregat...
method aggregateList (line 75) | @SuppressWarnings("unchecked")
method processAggregateOriginal (line 153) | @SuppressWarnings("unchecked")
method getField (line 291) | private Object getField(String fieldName, ContextStack context, Object...
method doFunction (line 305) | @SuppressWarnings("unchecked")
FILE: framework/src/main/groovy/org/moqui/impl/entity/EntityFindBuilder.java
class EntityFindBuilder (line 32) | public class EntityFindBuilder extends EntityQueryBuilder {
method EntityFindBuilder (line 40) | public EntityFindBuilder(EntityDefinition entityDefinition, EntityFind...
method makeDistinct (line 51) | public void makeDistinct() { sqlTopLevel.append("DISTINCT "); }
method makeCountFunction (line 53) | public void makeCountFunction(FieldOrderOptions[] fieldOptionsArray, b...
method closeCountSubSelect (line 71) | public void closeCountSubSelect(int fiaLength, boolean isDistinct, boo...
method expandJoinFromAlias (line 75) | public void expandJoinFromAlias(final MNode entityNode, final String s...
method makeSqlFromClause (line 101) | public void makeSqlFromClause() {
method makeSqlFromClause (line 106) | public EntityConditionImplBase makeSqlFromClause(final EntityDefinitio...
method appendJoinConditions (line 331) | public void appendJoinConditions(MNode relatedMemberEntityNode, String...
method makeSqlViewTableName (line 409) | public EntityConditionImplBase makeSqlViewTableName(EntityDefinition l...
method makeSqlMemberSubSelect (line 469) | public void makeSqlMemberSubSelect(String entityAlias, MNode memberEnt...
method makeWhereClause (line 656) | public void makeWhereClause() {
method makeGroupByClause (line 667) | public void makeGroupByClause() {
method makeHavingClause (line 699) | public void makeHavingClause(EntityConditionImplBase condition) {
method makeOrderByClause (line 705) | public void makeOrderByClause(ArrayList<String> orderByFieldList, bool...
method addLimitOffset (line 739) | public void addLimitOffset(Integer limit, Integer offset) {
method makeForUpdate (line 760) | public void makeForUpdate() {
method makePreparedStatement (line 770) | @Override
FILE: framework/src/main/groovy/org/moqui/impl/entity/EntityFindImpl.java
class EntityFindImpl (line 31) | public class EntityFindImpl extends EntityFindBase {
method EntityFindImpl (line 35) | public EntityFindImpl(EntityFacadeImpl efi, String entityName) { super...
method EntityFindImpl (line 36) | public EntityFindImpl(EntityFacadeImpl efi, EntityDefinition ed) { sup...
method makeEntityDynamicView (line 38) | @Override
method oneExtended (line 46) | @Override
method iteratorExtended (line 107) | @Override
method countExtended (line 166) | @Override
FILE: framework/src/main/groovy/org/moqui/impl/entity/EntityJavaUtil.java
class EntityJavaUtil (line 41) | public class EntityJavaUtil {
method enDeCrypt (line 46) | static String enDeCrypt(String value, boolean encrypt, EntityFacadeImp...
method enDeCrypt (line 73) | static String enDeCrypt(String value, boolean encrypt, MNode configNod...
method makeFieldOrderOptions (line 155) | @SuppressWarnings("unused")
class FieldOrderOptions (line 157) | public static class FieldOrderOptions {
method getFieldName (line 170) | public String getFieldName() { return fieldName; }
method getNullsFirstLast (line 171) | Boolean getNullsFirstLast() { return nullsFirstLast; }
method getDescending (line 172) | public boolean getDescending() { return descending; }
method getCaseUpperLower (line 173) | Boolean getCaseUpperLower() { return caseUpperLower; }
method FieldOrderOptions (line 175) | public FieldOrderOptions(String orderByName) {
class EntityInfo (line 253) | public static class EntityInfo {
method EntityInfo (line 283) | EntityInfo(EntityDefinition ed, boolean memberNeverCache) {
method setFields (line 418) | void setFields(Map<String, Object> src, Map<String, Object> dest, bo...
method setFieldsEv (line 488) | void setFieldsEv(Map<String, Object> src, EntityValueBase dest, Bool...
method cloneMapRemoveFields (line 541) | public Map<String, Object> cloneMapRemoveFields(Map<String, Object> ...
class RelationshipInfo (line 555) | public static class RelationshipInfo {
method RelationshipInfo (line 571) | RelationshipInfo(MNode relNode, EntityDefinition fromEd, EntityFacad...
method riPrettyName (line 606) | public String riPrettyName() { return prettyName; }
method riRelatedEntityName (line 607) | public String riRelatedEntityName() { return relatedEntityName; }
method hasReverse (line 609) | private boolean hasReverse() {
method findReverse (line 627) | public RelationshipInfo findReverse() {
method getTargetParameterMap (line 640) | public Map<String, Object> getTargetParameterMap(Map valueSource) {
method toString (line 653) | public String toString() { return relationshipName + (shortAlias != ...
method camelCaseToUnderscored (line 658) | public static String camelCaseToUnderscored(String camelCase) {
method underscoredToCamelCase (line 677) | public static String underscoredToCamelCase(String underscored, boolea...
class EntityConditionParameter (line 702) | public static class EntityConditionParameter {
method EntityConditionParameter (line 707) | public EntityConditionParameter(FieldInfo fieldInfo, Object value, E...
method getFieldInfo (line 713) | public FieldInfo getFieldInfo() { return fieldInfo; }
method getValue (line 715) | public Object getValue() { return value; }
method setPreparedStatementValue (line 717) | void setPreparedStatementValue(int index) throws EntityException {
method toString (line 721) | @Override
class QueryStatsInfo (line 725) | public static class QueryStatsInfo {
method QueryStatsInfo (line 731) | public QueryStatsInfo(String entityName, String sql) {
method countHit (line 735) | public void countHit(EntityFacadeImpl efi, long runTimeNanos, boolea...
method getEntityName (line 751) | public String getEntityName() { return entityName; }
method getSql (line 752) | public String getSql() { return sql; }
method getAverage (line 759) | double getAverage() { return hitCount > 0 ? totalTimeNanos / hitCoun...
method getStdDev (line 760) | double getStdDev() {
method makeDisplayMap (line 765) | public Map<String, Object> makeDisplayMap() {
type WriteMode (line 777) | public enum WriteMode { CREATE, UPDATE, DELETE }
class EntityWriteInfo (line 778) | public static class EntityWriteInfo {
method EntityWriteInfo (line 782) | public EntityWriteInfo(EntityValueBase evb, WriteMode writeMode) {
class FindAugmentInfo (line 789) | public static class FindAugmentInfo {
method FindAugmentInfo (line 794) | public FindAugmentInfo(ArrayList<EntityValueBase> valueList, Set<Map...
FILE: framework/src/main/groovy/org/moqui/impl/entity/EntityListImpl.java
class EntityListImpl (line 36) | public class EntityListImpl implements EntityList {
method EntityListImpl (line 45) | public EntityListImpl() { }
method EntityListImpl (line 47) | public EntityListImpl(EntityFacadeImpl efi) {
method EntityListImpl (line 52) | public EntityListImpl(EntityFacadeImpl efi, int initialCapacity) {
method writeExternal (line 57) | @Override public void writeExternal(ObjectOutput out) throws IOExcepti...
method readExternal (line 62) | @SuppressWarnings("unchecked")
method getEfi (line 67) | @SuppressWarnings("unchecked")
method getFirst (line 74) | @Override public EntityValue getFirst() { return valueList != null && ...
method filterByDate (line 76) | @Override public EntityList filterByDate(String fromDateName, String t...
method getDateLong (line 113) | private static Long getDateLong(Object dateObj) {
method filterByDate (line 119) | @Override public EntityList filterByDate(String fromDateName, String t...
method filterByAnd (line 124) | @Override public EntityList filterByAnd(Map<String, Object> fields) { ...
method filterByAnd (line 125) | @Override public EntityList filterByAnd(Map<String, Object> fields, Bo...
method filterInternal (line 148) | private void filterInternal(String[] names, Object[] values, boolean h...
method valueMatches (line 161) | private boolean valueMatches(EntityValue value, String[] names, Object...
method filterByAnd (line 183) | @Override public EntityList filterByAnd(Object... namesAndValues) {
method filter (line 211) | @Override public EntityList filter(Closure<Boolean> closure, Boolean i...
method find (line 226) | @Override public EntityValue find(Closure<Boolean> closure) {
method findByAnd (line 235) | @Override public EntityValue findByAnd(Map<String, Object> fields) {
method findByAnd (line 261) | @Override public EntityValue findByAnd(Object... namesAndValues) {
method findAll (line 291) | @Override public EntityList findAll(Closure<Boolean> closure) {
method removeByAnd (line 303) | @Override public EntityList removeByAnd(Map<String, Object> fields) { ...
method filterByCondition (line 305) | @Override public EntityList filterByCondition(EntityCondition conditio...
method filterByLimit (line 325) | @Override public EntityList filterByLimit(Integer offset, Integer limi...
method filterByLimit (line 342) | @Override public EntityList filterByLimit(String inputFieldsMapName, b...
method getOffset (line 370) | @Override public Integer getOffset() { return this.offset; }
method getLimit (line 371) | @Override public Integer getLimit() { return this.limit; }
method getPageIndex (line 373) | @Override public int getPageIndex() { return (offset != null ? offset ...
method getPageSize (line 374) | @Override public int getPageSize() { return limit != null ? limit : 20; }
method orderByFields (line 376) | @Override public EntityList orderByFields(List<String> fieldNames) {
method sort (line 381) | @Override public void sort(Comparator<? super EntityValue> comparator)...
method indexMatching (line 383) | @Override public int indexMatching(Map<String, Object> valueMap) {
method move (line 394) | @Override public void move(int fromIndex, int toIndex) {
method addIfMissing (line 402) | @Override public EntityList addIfMissing(EntityValue value) {
method addAllIfMissing (line 407) | @Override public EntityList addAllIfMissing(EntityList el) {
method writeXmlText (line 412) | @Override public int writeXmlText(Writer writer, String prefix, int de...
method iterator (line 418) | @Override public @Nonnull Iterator<EntityValue> iterator() { return ne...
class EntityIterator (line 419) | private class EntityIterator implements Iterator<EntityValue> {
method hasNext (line 422) | @Override public boolean hasNext() { return (curIndex + 1) < valueLi...
method next (line 423) | @Override public EntityValue next() {
method remove (line 429) | @Override public void remove() {
method getPlainValueList (line 439) | @Override public List<Map<String, Object>> getPlainValueList(int depen...
method getMasterValueList (line 444) | @Override public List<Map<String, Object>> getMasterValueList(String n...
method getValueMapList (line 449) | @Override public ArrayList<Map<String, Object>> getValueMapList() {
method clone (line 461) | @Override public Object clone() { return this.cloneList(); }
method cloneList (line 463) | @Override public EntityList cloneList() {
method deepCloneList (line 469) | public EntityListImpl deepCloneList() {
method setFromCache (line 479) | @Override public void setFromCache() {
method isFromCache (line 484) | @Override public boolean isFromCache() { return fromCache; }
method size (line 485) | @Override public int size() { return valueList.size(); }
method isEmpty (line 486) | @Override public boolean isEmpty() { return valueList.isEmpty(); }
method contains (line 487) | @Override public boolean contains(Object o) { return valueList.contain...
method toArray (line 488) | @Override public @Nonnull Object[] toArray() { return valueList.toArra...
method toArray (line 490) | @SuppressWarnings("SuspiciousToArrayCall")
method add (line 493) | @Override public boolean add(EntityValue e) {
method remove (line 497) | @Override public boolean remove(Object o) {
method containsAll (line 502) | @Override public boolean containsAll(@Nonnull Collection<?> objects) {...
method addAll (line 504) | @Override public boolean addAll(@Nonnull Collection<? extends EntityVa...
method addAll (line 508) | @Override public boolean addAll(int i, @Nonnull Collection<? extends E...
method removeAll (line 513) | @Override public boolean removeAll(@Nonnull Collection<?> objects) {
method retainAll (line 517) | @Override public boolean retainAll(@Nonnull Collection<?> objects) {
method clear (line 521) | @Override public void clear() {
method get (line 526) | @Override public EntityValue get(int i) { return valueList.get(i); }
method set (line 527) | @Override public EntityValue set(int i, EntityValue e) {
method add (line 531) | @Override public void add(int i, EntityValue e) {
method remove (line 535) | @Override public EntityValue remove(int i) {
method indexOf (line 540) | @Override public int indexOf(Object o) { return valueList.indexOf(o); }
method lastIndexOf (line 541) | @Override public int lastIndexOf(Object o) { return valueList.lastInde...
method listIterator (line 542) | @Override public @Nonnull ListIterator<EntityValue> listIterator() { r...
method listIterator (line 543) | @Override public @Nonnull ListIterator<EntityValue> listIterator(int i...
method subList (line 544) | @Override public @Nonnull List<EntityValue> subList(int start, int end...
method toString (line 545) | @Override public String toString() { return valueList.toString(); }
class EmptyEntityList (line 547) | @SuppressWarnings("unused")
method EmptyEntityList (line 549) | public EmptyEntityList() { }
method writeExternal (line 550) | @Override public void writeExternal(ObjectOutput out) throws IOExcep...
method readExternal (line 551) | @Override public void readExternal(ObjectInput objectInput) throws I...
method getFirst (line 552) | @Override public EntityValue getFirst() { return null; }
method filterByDate (line 553) | @Override public EntityList filterByDate(String fromDateName, String...
method filterByDate (line 554) | @Override public EntityList filterByDate(String fromDateName, String...
method filterByAnd (line 555) | @Override public EntityList filterByAnd(Map<String, Object> fields) ...
method filterByAnd (line 556) | @Override public EntityList filterByAnd(Map<String, Object> fields, ...
method filterByAnd (line 557) | @Override public EntityList filterByAnd(Object... namesAndValues) { ...
method removeByAnd (line 558) | @Override public EntityList removeByAnd(Map<String, Object> fields) ...
method filterByCondition (line 559) | @Override public EntityList filterByCondition(EntityCondition condit...
method filter (line 560) | @Override public EntityList filter(Closure<Boolean> closure, Boolean...
method find (line 561) | @Override public EntityValue find(Closure<Boolean> closure) { return...
method findByAnd (line 562) | @Override public EntityValue findByAnd(Map<String, Object> fields) {...
method findByAnd (line 563) | @Override public EntityValue findByAnd(Object... namesAndValues) { r...
method findAll (line 564) | @Override public EntityList findAll(Closure<Boolean> closure) { retu...
method filterByLimit (line 565) | @Override public EntityList filterByLimit(Integer offset, Integer li...
method filterByLimit (line 566) | @Override public EntityList filterByLimit(String inputFieldsMapName,...
method getOffset (line 567) | @Override public Integer getOffset() { return this.offset; }
method getLimit (line 568) | @Override public Integer getLimit() { return this.limit; }
method getPageIndex (line 569) | @Override public int getPageIndex() { return (offset != null ? offse...
method getPageSize (line 570) | @Override public int getPageSize() { return limit != null ? limit : ...
method orderByFields (line 571) | @Override public EntityList orderByFields(List<String> fieldNames) {...
method indexMatching (line 572) | @Override public int indexMatching(Map valueMap) { return -1; }
method move (line 573) | @Override public void move(int fromIndex, int toIndex) { throw new I...
method addIfMissing (line 574) | @Override public EntityList addIfMissing(EntityValue value) { throw ...
method addAllIfMissing (line 575) | @Override public EntityList addAllIfMissing(EntityList el) { throw n...
method iterator (line 576) | @Override public @Nonnull Iterator<EntityValue> iterator() { return ...
method clone (line 577) | @Override public Object clone() { return this.cloneList(); }
method writeXmlText (line 578) | @Override public int writeXmlText(Writer writer, String prefix, int ...
method getPlainValueList (line 579) | @Override public List<Map<String, Object>> getPlainValueList(int dep...
method getMasterValueList (line 580) | @Override public List<Map<String, Object>> getMasterValueList(String...
method getValueMapList (line 581) | @Override public ArrayList<Map<String, Object>> getValueMapList() { ...
method cloneList (line 582) | @Override public EntityList cloneList() { return this; }
method setFromCache (line 583) | @Override public void setFromCache() { }
method isFromCache (line 584) | @Override public boolean isFromCache() { return false; }
method size (line 585) | @Override public int size() { return 0; }
method isEmpty (line 586) | @Override public boolean isEmpty() { return true; }
method contains (line 587) | @Override public boolean contains(Object o) { return false; }
method toArray (line 588) | @SuppressWarnings("unchecked") @Override public @Nonnull Object[] to...
method toArray (line 589) | @SuppressWarnings("unchecked") @Override public @Nonnull <T> T[] toA...
method add (line 590) | @Override public boolean add(EntityValue e) { throw new IllegalArgum...
method remove (line 591) | @Override public boolean remove(Object o) { return false; }
method containsAll (line 592) | @Override public boolean containsAll(@Nonnull Collection<?> objects)...
method addAll (line 593) | @Override public boolean addAll(@Nonnull Collection<? extends Entity...
method addAll (line 594) | @Override public boolean addAll(int i, @Nonnull Collection<? extends...
method removeAll (line 595) | @Override public boolean removeAll(@Nonnull Collection<?> objects) {...
method retainAll (line 596) | @Override public boolean retainAll(@Nonnull Collection<?> objects) {...
method clear (line 597) | @Override public void clear() { }
method get (line 598) | @Override public EntityValue get(int i) { return null; }
method set (line 599) | @Override public EntityValue set(int i, EntityValue e) { throw new I...
method add (line 600) | @Override public void add(int i, EntityValue e) { throw new IllegalA...
method remove (line 601) | @Override public EntityValue remove(int i) { return null; }
method indexOf (line 602) | @Override public int indexOf(Object o) { return -1; }
method lastIndexOf (line 603) | @Override public int lastIndexOf(Object o) { return -1; }
method listIterator (line 604) | @Override public @Nonnull ListIterator<EntityValue> listIterator() {...
method listIterator (line 605) | @Override public @Nonnull ListIterator<EntityValue> listIterator(int...
method subList (line 606) | @Override public @Nonnull List<EntityValue> subList(int start, int e...
method toString (line 607) | @Override public String toString() { return "[]"; }
method getEmptyIterator (line 609) | public static ListIterator getEmptyIterator() { return emptyIterator; }
FILE: framework/src/main/groovy/org/moqui/impl/entity/EntityListIteratorImpl.java
class EntityListIteratorImpl (line 33) | public class EntityListIteratorImpl implements EntityListIterator {
method EntityListIteratorImpl (line 53) | public EntityListIteratorImpl(Connection con, ResultSet rs, EntityDefi...
method close (line 90) | @Override public void close() {
method afterLast (line 116) | @Override public void afterLast() {
method beforeFirst (line 121) | @Override public void beforeFirst() {
method last (line 127) | @Override public boolean last() {
method first (line 138) | @Override public boolean first() {
method currentEntityValue (line 144) | @Override public EntityValue currentEntityValue() { return currentEnti...
method currentEntityValueBase (line 145) | public EntityValueBase currentEntityValueBase() {
method currentIndex (line 165) | @Override public int currentIndex() {
method absolute (line 169) | @Override public boolean absolute(final int rowNum) {
method relative (line 175) | @Override public boolean relative(final int rows) {
method hasNext (line 182) | @Override public boolean hasNext() {
method hasPrevious (line 194) | @Override public boolean hasPrevious() {
method next (line 207) | @Override public EntityValue next() {
method nextIndex (line 238) | @Override public int nextIndex() { return currentIndex() + 1; }
method previous (line 240) | @Override public EntityValue previous() {
method previousIndex (line 262) | @Override public int previousIndex() { return currentIndex() - 1; }
method setFetchSize (line 264) | @Override public void setFetchSize(int rows) {
method getCompleteList (line 269) | @Override public EntityList getCompleteList(boolean closeAfter) {
method getPartialList (line 293) | @Override public EntityList getPartialList(int offset, int limit, bool...
method writeXmlText (line 325) | @Override
method writeXmlTextMaster (line 339) | @Override
method remove (line 355) | @Override
method set (line 366) | @Override
method add (line 374) | @Override
FILE: framework/src/main/groovy/org/moqui/impl/entity/EntityListIteratorWrapper.java
class EntityListIteratorWrapper (line 30) | class EntityListIteratorWrapper implements EntityListIterator {
method EntityListIteratorWrapper (line 40) | EntityListIteratorWrapper(List<EntityValue> valList, EntityDefinition ...
method close (line 68) | @Override public void close() {
method afterLast (line 76) | @Override public void afterLast() { this.internalIndex = valueList.siz...
method beforeFirst (line 77) | @Override public void beforeFirst() { internalIndex = -1; }
method last (line 78) | @Override public boolean last() { internalIndex = (valueList.size() - ...
method first (line 79) | @Override public boolean first() { internalIndex = 0; return true; }
method currentEntityValue (line 81) | @Override public EntityValue currentEntityValue() {
method currentIndex (line 85) | @Override public int currentIndex() { return internalIndex; }
method absolute (line 87) | @Override public boolean absolute(int rowNum) {
method relative (line 91) | @Override public boolean relative(int rows) {
method hasNext (line 96) | @Override public boolean hasNext() { return internalIndex < (valueList...
method hasPrevious (line 97) | @Override public boolean hasPrevious() { return internalIndex > 0; }
method next (line 99) | @Override public EntityValue next() {
method nextIndex (line 105) | @Override public int nextIndex() { return internalIndex + 1; }
method previous (line 107) | @Override public EntityValue previous() {
method previousIndex (line 113) | @Override public int previousIndex() { return internalIndex - 1; }
method setFetchSize (line 115) | @Override public void setFetchSize(int rows) {/* do nothing, just igno...
method getCompleteList (line 117) | @Override public EntityList getCompleteList(boolean closeAfter) {
method getPartialList (line 128) | @Override public EntityList getPartialList(int offset, int limit, bool...
method writeXmlText (line 155) | @Override public int writeXmlText(Writer writer, String prefix, int de...
method writeXmlTextMaster (line 163) | @Override public int writeXmlTextMaster(Writer writer, String prefix, ...
method remove (line 171) | @Override public void remove() {
method set (line 178) | @Override public void set(EntityValue e) {
method add (line 185) | @Override public void add(EntityValue e) {
FILE: framework/src/main/groovy/org/moqui/impl/entity/EntityQueryBuilder.java
class EntityQueryBuilder (line 31) | public class EntityQueryBuilder implements Runnable {
method EntityQueryBuilder (line 55) | public EntityQueryBuilder(EntityDefinition entityDefinition, EntityFac...
method getMainEd (line 63) | public EntityDefinition getMainEd() { return mainEntityDefinition; }
method makeConnection (line 65) | Connection makeConnection(boolean useClone) {
method useConnection (line 70) | void useConnection(Connection c) {
method isFindOne (line 75) | public void isFindOne() { isFindOne = true; }
method handleSqlException (line 77) | protected static void handleSqlException(Exception e, String sql) {
method makePreparedStatement (line 81) | public PreparedStatement makePreparedStatement() {
method run (line 101) | public void run() {
method executeQuery (line 122) | ResultSet executeQuery() throws SQLException {
method executeUpdate (line 158) | int executeUpdate() throws SQLException {
method closeAll (line 195) | void closeAll() throws SQLException {
method releaseAll (line 211) | void releaseAll() {
method sanitizeColumnName (line 217) | public static String sanitizeColumnName(String colName) {
method setPreparedStatementValue (line 241) | void setPreparedStatementValue(int index, Object value, FieldInfo fiel...
method setPreparedStatementValues (line 245) | void setPreparedStatementValues() {
method makeSqlSelectFields (line 255) | public void makeSqlSelectFields(FieldInfo[] fieldInfoArray, FieldOrder...
method addWhereClause (line 290) | public void addWhereClause(FieldInfo[] pkFieldArray, LiteStringMap val...
FILE: framework/src/main/groovy/org/moqui/impl/entity/EntityValueBase.java
class EntityValueBase (line 48) | public abstract class EntityValueBase implements EntityValue {
method EntityValueBase (line 77) | public EntityValueBase() { valueMapInternal = new LiteStringMap<>().us...
method EntityValueBase (line 79) | public EntityValueBase(EntityDefinition ed, EntityFacadeImpl efip) {
method writeExternal (line 86) | @Override public void writeExternal(ObjectOutput out) throws IOExcepti...
method readExternal (line 93) | @SuppressWarnings("unchecked")
method getEntityFacadeImpl (line 113) | protected EntityFacadeImpl getEntityFacadeImpl() {
method getTxCache (line 122) | private TransactionCache getTxCache(ExecutionContextFactoryImpl ecfi) {
method getEntityDefinition (line 126) | public EntityDefinition getEntityDefinition() {
method getValueMap (line 132) | public LiteStringMap<Object> getValueMap() { return valueMapInternal; }
method getDbValueMap (line 133) | protected LiteStringMap<Object> getDbValueMap() { return dbValueMap; }
method setDbValueMap (line 135) | protected void setDbValueMap(Map<String, Object> map) {
method setSyncedWithDb (line 148) | public void setSyncedWithDb() {
method getIsFromDb (line 154) | public boolean getIsFromDb() { return isFromDb; }
method resolveEntityName (line 156) | @Override public String resolveEntityName() { return entityName; }
method resolveEntityNamePretty (line 157) | @Override public String resolveEntityNamePretty() { return StringUtili...
method isModified (line 158) | @Override public boolean isModified() { return modified; }
method isFieldModified (line 159) | @Override public boolean isFieldModified(String name) { if (name == nu...
method isFieldModifiedIString (line 160) | private boolean isFieldModifiedIString(String name) {
method touchField (line 181) | @Override public EntityValue touchField(String name) {
method isFieldSet (line 189) | @Override public boolean isFieldSet(String name) { return valueMapInte...
method isField (line 190) | @Override public boolean isField(String name) { return getEntityDefini...
method isMutable (line 191) | @Override public boolean isMutable() { return mutable; }
method setFromCache (line 192) | public void setFromCache() { mutable = false; }
method getMap (line 194) | @Override
method get (line 219) | @Override
method getKnownField (line 255) | public Object getKnownField(FieldInfo fieldInfo) {
method getNoCheckSimple (line 394) | @Override public Object getNoCheckSimple(String name) { return valueMa...
method getOriginalDbValue (line 396) | @Override public Object getOriginalDbValue(String name) {
method getOldDbValue (line 399) | protected Object getOldDbValue(String name) {
method containsPrimaryKey (line 404) | @Override public boolean containsPrimaryKey() { return this.getEntityD...
method getPrimaryKeys (line 405) | @Override public Map<String, Object> getPrimaryKeys() {
method getPrimaryKeysString (line 424) | @Override public String getPrimaryKeysString() {
method primaryKeyMatches (line 441) | public boolean primaryKeyMatches(EntityValueBase evb) {
method set (line 458) | @Override public EntityValue set(String name, Object value) { put(name...
method setAll (line 459) | @Override public EntityValue setAll(Map<String, Object> fields) {
method setString (line 464) | @Override public EntityValue setString(String name, String value) {
method getBoolean (line 473) | @Override public Boolean getBoolean(String name) { return DefaultGroov...
method getString (line 474) | @Override public String getString(String name) {
method getTimestamp (line 481) | @Override public Timestamp getTimestamp(String name) { return DefaultG...
method getTime (line 482) | @Override public Time getTime(String name) { return DefaultGroovyMetho...
method getDate (line 483) | @Override public java.sql.Date getDate(String name) { return DefaultGr...
method getLong (line 484) | @Override public Long getLong(String name) { return DefaultGroovyMetho...
method getDouble (line 485) | @Override public Double getDouble(String name) { return DefaultGroovyM...
method getBigDecimal (line 486) | @Override public BigDecimal getBigDecimal(String name) { return Defaul...
method getBytes (line 488) | @Override public byte[] getBytes(String name) {
method setBytes (line 504) | @Override public EntityValue setBytes(String name, byte[] theBytes) {
method getSerialBlob (line 512) | @Override public SerialBlob getSerialBlob(String name) {
method setFields (line 525) | @Override public EntityValue setFields(Map<String, Object> fields, boo...
method setSequencedIdPrimary (line 535) | @Override
method setSequencedIdSecondary (line 551) | @Override
method compareTo (line 590) | @Override
method compareFields (line 611) | @SuppressWarnings("unchecked")
method mapMatches (line 623) | @Override
method createOrUpdate (line 635) | @Override
method store (line 654) | @Override
method handleAuditLog (line 657) | private void handleAuditLog(boolean isUpdate, LiteStringMap<Object> ol...
method addThreeFieldPkValues (line 744) | private void addThreeFieldPkValues(Map<String, Object> parms, EntityDe...
method findRelated (line 764) | @Override
method findRelated (line 772) | private EntityList findRelated(final EntityJavaUtil.RelationshipInfo r...
method findRelatedOne (line 792) | @Override
method findRelatedOne (line 799) | private EntityValue findRelatedOne(final EntityJavaUtil.RelationshipIn...
method findRelatedCount (line 818) | @Override
method findRelatedFk (line 839) | @Override
method deleteRelated (line 855) | @Override
method deleteWithRelated (line 862) | @Override
method deleteWithCascade (line 891) | @Override
method checkFks (line 928) | @Override
method checkAgainstDatabaseInfo (line 963) | @Override
method checkAgainstDatabase (line 1024) | @Override
method makeXmlElement (line 1066) | @Override
method writeXmlText (line 1088) | @Override
method writeXmlTextMaster (line 1099) | @Override
method plainMapXmlWriter (line 1110) | @SuppressWarnings("unchecked")
method getPlainValueMap (line 1194) | @Override
method internalPlainValueMap (line 1199) | private Map<String, Object> internalPlainValueMap(int dependentLevels,...
method getMasterValueMap (line 1236) | @Override
method internalMasterValueMap (line 1244) | private Map<String, Object> internalMasterValueMap(ArrayList<EntityDef...
method size (line 1295) | @Override public int size() { return valueMapInternal.size(); }
method isEmpty (line 1296) | @Override public boolean isEmpty() { return valueMapInternal.isEmpty(); }
method containsKey (line 1297) | @Override public boolean containsKey(Object o) { return valueMapIntern...
method containsValue (line 1298) | @Override public boolean containsValue(Object o) { return values().con...
method get (line 1299) | @Override public Object get(Object o) {
method put (line 1308) | @Override public Object put(final String name, Object value) {
method putNoCheck (line 1313) | public Object putNoCheck(final String name, Object value) {
method putKnownField (line 1319) | protected Object putKnownField(final FieldInfo fieldInfo, Object value) {
method remove (line 1341) | @Override public Object remove(Object o) {
method putAll (line 1351) | @Override public void putAll(Map<? extends String, ?> map) {
method clear (line 1359) | @Override public void clear() { modified = true; valueMapInternal.clea...
method keySet (line 1360) | @Override public @Nonnull Set<String> keySet() { return new HashSet<>(...
method values (line 1361) | @Override public @Nonnull Collection<Object> values() {
method entrySet (line 1369) | @Override public @Nonnull Set<Entry<String, Object>> entrySet() {
method equals (line 1381) | @Override public boolean equals(Object obj) {
method hashCode (line 1388) | @Override public int hashCode() { return entityName.hashCode() + value...
method toString (line 1389) | @Override public String toString() { return "[" + entityName + ": " + ...
method clone (line 1390) | @Override public Object clone() { return cloneValue(); }
method cloneValue (line 1391) | @Override public abstract EntityValue cloneValue();
method cloneDbValue (line 1392) | public abstract EntityValue cloneDbValue(boolean getOld);
method doDataFeed (line 1394) | private boolean doDataFeed(ExecutionContextImpl ec) {
method checkSetFieldDefaults (line 1400) | private void checkSetFieldDefaults(EntityDefinition ed, ExecutionConte...
method checkSetDefault (line 1411) | private void checkSetDefault(String fieldName, String defaultStr, Exec...
method makeErrorMsg (line 1433) | private String makeErrorMsg(String baseMsg, String expandMsg, EntityDe...
method registerMutateLock (line 1446) | private void registerMutateLock() {
method create (line 1497) | @Override
method basicCreate (line 1554) | public void basicCreate(Connection con) throws SQLException {
method createExtended (line 1578) | public abstract void createExtended(FieldInfo[] fieldInfoArray, Connec...
method update (line 1580) | @Override
method basicUpdate (line 1709) | public void basicUpdate(Connection con) throws SQLException {
method updateExtended (line 1741) | public abstract void updateExtended(FieldInfo[] pkFieldArray, FieldInf...
method delete (line 1743) | @Override
method deleteExtended (line 1791) | public abstract void deleteExtended(Connection con) throws SQLException;
method refresh (line 1793) | @Override
method refreshExtended (line 1841) | public abstract boolean refreshExtended() throws SQLException;
method getEtlType (line 1843) | @Override public String getEtlType() { return entityName; }
method getEtlValues (line 1844) | @Override public Map<String, Object> getEtlValues() { return valueMapI...
class EntityFieldEntry (line 1846) | private static class EntityFieldEntry implements Entry<String, Object> {
method EntityFieldEntry (line 1849) | private EntityFieldEntry(FieldInfo fi, EntityValueBase evb) {
method getKey (line 1853) | @Override public String getKey() { return fi.name; }
method getValue (line 1854) | @Override public Object getValue() { return evb.getKnownField(fi); }
method setValue (line 1855) | @Override public Object setValue(Object v) { return evb.set(fi.name,...
method hashCode (line 1856) | @Override public int hashCode() {
method equals (line 1860) | @Override public boolean equals(Object obj) {
class DeletedEntityValue (line 1870) | public static class DeletedEntityValue extends EntityValueBase {
method DeletedEntityValue (line 1871) | public DeletedEntityValue(EntityDefinition ed, EntityFacadeImpl efip...
method cloneValue (line 1872) | @Override public EntityValue cloneValue() { return this; }
method cloneDbValue (line 1873) | @Override public EntityValue cloneDbValue(boolean getOld) { return t...
method createExtended (line 1874) | @Override public void createExtended(FieldInfo[] fieldInfoArray, Con...
method updateExtended (line 1876) | @Override public void updateExtended(FieldInfo[] pkFieldArray, Field...
method deleteExtended (line 1878) | @Override public void deleteExtended(Connection con) { throw new Uns...
method refreshExtended (line 1879) | @Override public boolean refreshExtended() { throw new UnsupportedOp...
FILE: framework/src/main/groovy/org/moqui/impl/entity/EntityValueImpl.java
class EntityValueImpl (line 28) | public class EntityValueImpl extends EntityValueBase {
method EntityValueImpl (line 32) | public EntityValueImpl() { }
method EntityValueImpl (line 34) | public EntityValueImpl(EntityDefinition ed, EntityFacadeImpl efip) { s...
method cloneValue (line 36) | @Override
method cloneDbValue (line 45) | @Override
method createExtended (line 55) | @SuppressWarnings("MismatchedQueryAndUpdateOfStringBuilder")
method updateExtended (line 110) | @SuppressWarnings("MismatchedQueryAndUpdateOfStringBuilder")
method deleteExtended (line 157) | @SuppressWarnings("MismatchedQueryAndUpdateOfStringBuilder")
method refreshExtended (line 191) | @SuppressWarnings("MismatchedQueryAndUpdateOfStringBuilder")
FILE: framework/src/main/groovy/org/moqui/impl/entity/FieldInfo.java
class FieldInfo (line 34) | public class FieldInfo {
method FieldInfo (line 56) | public FieldInfo(EntityDefinition ed, MNode fieldNode, int index) {
method getFullColumnName (line 165) | public String getFullColumnName() {
method safeStripZeroes (line 170) | static BigDecimal safeStripZeroes(BigDecimal input) {
method convertFromString (line 177) | public Object convertFromString(String value, L10nFacadeImpl l10n) {
method convertToString (line 249) | public String convertToString(Object value) {
method getResultSetValue (line 290) | void getResultSetValue(ResultSet rs, int index, LiteStringMap<Object> ...
method setPreparedStatementValue (line 421) | public void setPreparedStatementValue(PreparedStatement ps, int index,...
method setPreparedStatementValue (line 474) | private void setPreparedStatementValue(PreparedStatement ps, int index...
method toString (line 619) | @Override public String toString() { return name; }
FILE: framework/src/main/groovy/org/moqui/impl/entity/condition/BasicJoinCondition.java
class BasicJoinCondition (line 28) | public class BasicJoinCondition implements EntityConditionImplBase {
method BasicJoinCondition (line 35) | public BasicJoinCondition(EntityConditionImplBase lhs, JoinOperator op...
method getOperator (line 42) | public JoinOperator getOperator() { return operator; }
method getLhs (line 43) | public EntityConditionImplBase getLhs() { return lhsInternal; }
method getRhs (line 44) | public EntityConditionImplBase getRhs() { return rhsInternal; }
method makeSqlWhere (line 46) | @Override
method makeSearchFilter (line 56) | @Override
method mapMatches (line 69) | @Override
method mapMatchesAny (line 82) | @Override
method mapKeysNotContained (line 86) | @Override
method populateMap (line 91) | @Override
method getAllAliases (line 96) | @Override
method filter (line 101) | @Override
method ignoreCase (line 113) | @Override
method toString (line 116) | @Override
method hashCode (line 122) | @Override
method createHashCode (line 124) | private int createHashCode() {
method equals (line 128) | @Override
method writeExternal (line 137) | @Override
method readExternal (line 143) | @Override
FILE: framework/src/main/groovy/org/moqui/impl/entity/condition/ConditionAlias.java
class ConditionAlias (line 26) | public class ConditionAlias extends ConditionField implements Externaliz...
method ConditionAlias (line 35) | public ConditionAlias() { }
method ConditionAlias (line 36) | public ConditionAlias(String entityAlias, String fieldName, EntityDefi...
method getEntityAlias (line 49) | public String getEntityAlias() { return entityAlias; }
method getFieldName (line 50) | public String getFieldName() { return fieldName; }
method getAliasEntityName (line 51) | public String getAliasEntityName() { return aliasEntityName; }
method getAliasEntityDef (line 52) | private EntityDefinition getAliasEntityDef(EntityDefinition otherEd) {
method getColumnName (line 58) | public String getColumnName(EntityDefinition ed) {
method getFieldInfo (line 75) | public FieldInfo getFieldInfo(EntityDefinition ed) {
method toString (line 83) | @Override
method hashCode (line 86) | @Override
method createHashCode (line 88) | private int createHashCode() {
method equals (line 93) | @Override
method writeExternal (line 104) | @Override
method readExternal (line 111) | @Override
FILE: framework/src/main/groovy/org/moqui/impl/entity/condition/ConditionField.java
class ConditionField (line 22) | public class ConditionField implements Externalizable {
method ConditionField (line 28) | public ConditionField() { }
method ConditionField (line 29) | public ConditionField(String fieldName) {
method ConditionField (line 34) | public ConditionField(FieldInfo fi) {
method getFieldName (line 42) | public String getFieldName() { return fieldName; }
method getColumnName (line 43) | public String getColumnName(EntityDefinition ed) {
method getFieldInfo (line 47) | public FieldInfo getFieldInfo(EntityDefinition ed) {
method toString (line 52) | @Override
method hashCode (line 55) | @Override
method equals (line 58) | @Override
method writeExternal (line 69) | @Override
method readExternal (line 74) | @Override
FILE: framework/src/main/groovy/org/moqui/impl/entity/condition/EntityConditionImplBase.java
type EntityConditionImplBase (line 11) | public interface EntityConditionImplBase extends EntityCondition {
method makeSqlWhere (line 14) | void makeSqlWhere(EntityQueryBuilder eqb, EntityDefinition subMemberEd);
method makeSearchFilter (line 16) | void makeSearchFilter(List<Map<String, Object>> filterList);
method getAllAliases (line 18) | void getAllAliases(Set<String> entityAliasSet, Set<String> fieldAliasS...
method filter (line 20) | EntityConditionImplBase filter(String entityAlias, EntityDefinition ma...
FILE: framework/src/main/groovy/org/moqui/impl/entity/condition/FieldValueCondition.java
class FieldValueCondition (line 32) | public class FieldValueCondition implements EntityConditionImplBase, Ext...
method FieldValueCondition (line 42) | public FieldValueCondition() { }
method FieldValueCondition (line 43) | public FieldValueCondition(ConditionField field, ComparisonOperator op...
method getOperator (line 59) | public ComparisonOperator getOperator() { return operator; }
method getFieldName (line 60) | public String getFieldName() { return field.fieldName; }
method getValue (line 61) | public Object getValue() { return value; }
method getIgnoreCase (line 62) | public boolean getIgnoreCase() { return ignoreCase; }
method makeSqlWhere (line 64) | @Override
method valueToCollection (line 140) | Object valueToCollection(Object value) {
method makeSearchFilter (line 149) | @Override
method getElasticOperator (line 243) | String getElasticOperator() {
method mapMatches (line 253) | @Override
method mapMatchesAny (line 257) | @Override
method mapKeysNotContained (line 259) | @Override
method populateMap (line 262) | @Override
method getAllAliases (line 269) | @Override
method filter (line 278) | @Override
method ignoreCase (line 302) | @Override
method toString (line 305) | @Override
method hashCode (line 311) | @Override
method createHashCode (line 313) | private int createHashCode() {
method equals (line 317) | @Override
method writeExternal (line 330) | @Override
method readExternal (line 338) | @Override
FILE: framework/src/main/groovy/org/moqui/impl/entity/condition/ListCondition.java
class ListCondition (line 28) | public class ListCondition implements EntityConditionImplBase {
method ListCondition (line 35) | public ListCondition(List<EntityConditionImplBase> conditionList, Join...
method addCondition (line 60) | public void addCondition(EntityConditionImplBase condition) {
method addConditions (line 65) | public void addConditions(ArrayList<EntityConditionImplBase> condList) {
method addConditions (line 72) | public void addConditions(ListCondition listCond) { addConditions(list...
method getOperator (line 74) | public JoinOperator getOperator() { return operator; }
method getConditionList (line 75) | public ArrayList<EntityConditionImplBase> getConditionList() { return ...
method makeSqlWhere (line 77) | @SuppressWarnings("MismatchedQueryAndUpdateOfStringBuilder")
method makeSearchFilter (line 92) | @Override
method mapMatches (line 109) | @Override
method mapMatchesAny (line 120) | @Override
method mapKeysNotContained (line 129) | @Override
method populateMap (line 140) | @Override
method getAllAliases (line 150) | @Override
method filter (line 157) | @Override
method ignoreCase (line 178) | @Override
method toString (line 181) | @Override
method hashCode (line 192) | @Override public int hashCode() { return curHashCode; }
method createHashCode (line 193) | private int createHashCode() { return (conditionList != null ? conditi...
method equals (line 195) | @Override
method writeExternal (line 203) | @Override
method readExternal (line 208) | @Override
FILE: framework/src/main/groovy/org/moqui/impl/entity/condition/TrueCondition.java
class TrueCondition (line 25) | public class TrueCondition implements EntityConditionImplBase {
method TrueCondition (line 28) | public TrueCondition() { }
method makeSqlWhere (line 30) | @Override public void makeSqlWhere(EntityQueryBuilder eqb, EntityDefin...
method makeSearchFilter (line 31) | @Override
method mapMatches (line 36) | @Override public boolean mapMatches(Map<String, Object> map) { return ...
method mapMatchesAny (line 37) | @Override public boolean mapMatchesAny(Map<String, Object> map) { retu...
method mapKeysNotContained (line 38) | @Override public boolean mapKeysNotContained(Map<String, Object> map) ...
method populateMap (line 40) | @Override public boolean populateMap(Map<String, Object> map) { return...
method getAllAliases (line 41) | @Override public void getAllAliases(Set<String> entityAliasSet, Set<St...
method filter (line 42) | @Override public EntityConditionImplBase filter(String entityAlias, En...
method ignoreCase (line 44) | @Override public EntityCondition ignoreCase() { return this; }
method toString (line 45) | @Override public String toString() { return "1=1"; }
method hashCode (line 47) | @Override public int hashCode() { return 127; }
method equals (line 48) | @Override public boolean equals(Object o) { return !(o == null || o.ge...
method writeExternal (line 50) | @Override public void writeExternal(ObjectOutput out) throws IOExcepti...
method readExternal (line 51) | @Override public void readExternal(ObjectInput in) throws IOException,...
FILE: framework/src/main/groovy/org/moqui/impl/entity/elastic/ElasticEntityFind.java
class ElasticEntityFind (line 29) | public class ElasticEntityFind extends EntityFindBase {
method ElasticEntityFind (line 33) | public ElasticEntityFind(EntityFacadeImpl efip, String entityName, Ela...
method makeEntityDynamicView (line 38) | @Override
method makeQueryMap (line 43) | Map<String, Object> makeQueryMap(EntityConditionImplBase whereConditio...
method makeSortList (line 52) | List<Object> makeSortList(ArrayList<String> orderByExpanded, EntityDef...
method oneExtended (line 78) | @Override
method iteratorExtended (line 150) | @Override
method countExtended (line 193) | @Override
FILE: framework/src/main/groovy/org/moqui/impl/entity/elastic/ElasticEntityListIterator.java
class ElasticEntityListIterator (line 32) | public class ElasticEntityListIterator implements EntityListIterator {
method ElasticEntityListIterator (line 65) | public ElasticEntityListIterator(Map<String, Object> searchMap, Entity...
method isFirst (line 110) | boolean isFirst() { return overallIndex == 0; }
method isBeforeFirst (line 111) | boolean isBeforeFirst() { return overallIndex < 0; }
method isLast (line 112) | boolean isLast() { if (resultCount != null) { return overallIndex == r...
method isAfterLast (line 113) | boolean isAfterLast() { if (resultCount != null) { return overallIndex...
method nextResult (line 115) | boolean nextResult() {
method fetchNext (line 128) | @SuppressWarnings("unchecked")
method previousResult (line 254) | boolean previousResult() {
method fetchPrevious (line 266) | void fetchPrevious() {
method hasCurrentValue (line 273) | boolean hasCurrentValue() {
method resetCurrentList (line 277) | void resetCurrentList() {
method close (line 286) | @Override public void close() {
method afterLast (line 301) | @Override public void afterLast() {
method beforeFirst (line 306) | @Override public void beforeFirst() {
method last (line 312) | @Override public boolean last() {
method first (line 326) | @Override public boolean first() {
method currentEntityValue (line 336) | @Override public EntityValue currentEntityValue() { return currentEnti...
method currentEntityValueBase (line 337) | public EntityValueBase currentEntityValueBase() {
method currentIndex (line 362) | @Override public int currentIndex() {
method absolute (line 366) | @Override public boolean absolute(final int rowNum) {
method relative (line 383) | @Override public boolean relative(final int rows) {
method hasNext (line 390) | @Override public boolean hasNext() {
method hasPrevious (line 398) | @Override public boolean hasPrevious() {
method next (line 407) | @Override public EntityValue next() {
method nextIndex (line 434) | @Override public int nextIndex() { return currentIndex() + 1; }
method previous (line 436) | @Override public EntityValue previous() {
method previousIndex (line 454) | @Override public int previousIndex() { return currentIndex() - 1; }
method setFetchSize (line 456) | @Override public void setFetchSize(int rows) {
method getCompleteList (line 461) | @Override public EntityList getCompleteList(boolean closeAfter) {
method getPartialList (line 482) | @Override public EntityList getPartialList(int offset, int limit, bool...
method writeXmlText (line 514) | @Override
method writeXmlTextMaster (line 525) | @Override
method remove (line 537) | @Override
method set (line 545) | @Override
method add (line 553) | @Override
FILE: framework/src/main/groovy/org/moqui/impl/entity/elastic/ElasticEntityValue.java
class ElasticEntityValue (line 34) | public class ElasticEntityValue extends EntityValueBase {
method ElasticEntityValue (line 39) | public ElasticEntityValue() { }
method ElasticEntityValue (line 41) | public ElasticEntityValue(EntityDefinition ed, EntityFacadeImpl efip, ...
method writeExternal (line 46) | @Override
method readExternal (line 51) | @Override
method getEdf (line 56) | public ElasticDatasourceFactory getEdf() {
method cloneValue (line 66) | @Override
method cloneDbValue (line 75) | @Override
method createExtended (line 85) | @Override
method updateExtended (line 100) | @Override
method deleteExtended (line 115) | @Override
method refreshExtended (line 128) | @Override
FILE: framework/src/main/groovy/org/moqui/impl/screen/ScreenWidgetRender.java
type ScreenWidgetRender (line 16) | public interface ScreenWidgetRender {
method render (line 17) | void render(ScreenWidgets widgets, ScreenRenderImpl sri);
FILE: framework/src/main/groovy/org/moqui/impl/service/ParameterInfo.java
class ParameterInfo (line 32) | public class ParameterInfo {
type ParameterAllowHtml (line 35) | public enum ParameterAllowHtml { ANY, SAFE, NONE }
type ParameterType (line 36) | public enum ParameterType { STRING, INTEGER, LONG, FLOAT, DOUBLE, BIG_...
method ParameterInfo (line 77) | public ParameterInfo(ServiceDefinition sd, MNode parameterNode) {
method convertType (line 145) | Object convertType(String namePrefix, Object parameterValue, boolean i...
method validateParameterHtml (line 240) | Object validateParameterHtml(String namePrefix, Object parameterValue,...
method canonicalizeAndCheckHtml (line 262) | private String canonicalizeAndCheckHtml(ServiceDefinition sd, String n...
FILE: framework/src/main/groovy/org/moqui/impl/service/ServiceCallImpl.java
class ServiceCallImpl (line 25) | public class ServiceCallImpl implements ServiceCall {
method ServiceCallImpl (line 36) | public ServiceCallImpl(ServiceFacadeImpl sfi) { this.sfi = sfi; }
method serviceNameInternal (line 38) | protected void serviceNameInternal(String serviceName) {
method serviceNameInternal (line 62) | protected void serviceNameInternal(String path, String verb, String no...
method getServiceName (line 84) | @Override
method getCurrentParameters (line 87) | @Override
method getServiceDefinition (line 92) | public ServiceDefinition getServiceDefinition() {
method isEntityAutoPattern (line 98) | public boolean isEntityAutoPattern() {
method validateCall (line 103) | public void validateCall(ExecutionContextImpl eci) {
FILE: framework/src/main/groovy/org/moqui/impl/service/ServiceCallSyncImpl.java
class ServiceCallSyncImpl (line 24) | public class ServiceCallSyncImpl extends ServiceCallImpl implements Serv...
method ServiceCallSyncImpl (line 38) | public ServiceCallSyncImpl(ServiceFacadeImpl sfi) { super(sfi); }
method name (line 40) | @Override public ServiceCallSync name(String serviceName) { serviceNam...
method name (line 41) | @Override public ServiceCallSync name(String v, String n) { serviceNam...
method name (line 42) | @Override public ServiceCallSync name(String p, String v, String n) { ...
method parameters (line 44) | @Override public ServiceCallSync parameters(Map<String, ?> map) { if (...
method parameter (line 45) | @Override public ServiceCallSync parameter(String name, Object value) ...
method ignoreTransaction (line 47) | @Override public ServiceCallSync ignoreTransaction(boolean it) { this....
method requireNewTransaction (line 48) | @Override public ServiceCallSync requireNewTransaction(boolean rnt) { ...
method useTransactionCache (line 49) | @Override public ServiceCallSync useTransactionCache(boolean utc) { th...
method transactionTimeout (line 50) | @Override public ServiceCallSync transactionTimeout(int timeout) { thi...
method ignorePreviousError (line 52) | @Override public ServiceCallSync ignorePreviousError(boolean ipe) { th...
method softValidate (line 53) | @Override public ServiceCallSync softValidate(boolean sv) { this.softV...
method multi (line 54) | @Override public ServiceCallSync multi(boolean mlt) { this.multi = mlt...
method disableAuthz (line 55) | @Override public ServiceCallSync disableAuthz() { disableAuthz = true;...
method noRememberParameters (line 56) | @Override public ServiceCallSync noRememberParameters() { rememberPara...
method call (line 58) | @Override
method callSingle (line 132) | private Map<String, Object> callSingle(Map<String, Object> currentPara...
method clearSemaphore (line 422) | @SuppressWarnings("unused")
method checkAddSemaphore (line 455) | @SuppressWarnings("unused")
method runImplicitEntityAuto (line 558) | private Map<String, Object> runImplicitEntityAuto(Map<String, Object> ...
FILE: framework/src/main/groovy/org/moqui/impl/service/ServiceDefinition.java
class ServiceDefinition (line 38) | public class ServiceDefinition {
method ServiceDefinition (line 81) | public ServiceDefinition(ServiceFacadeImpl sfi, String path, MNode sn) {
method mergeAutoParameters (line 243) | private void mergeAutoParameters(MNode parametersNode, MNode autoParam...
method mergeParameter (line 277) | private void mergeParameter(MNode parametersNode, MNode overrideParame...
method mergeParameter (line 308) | private static MNode mergeParameter(MNode parametersNode, final String...
method makeServiceName (line 318) | public static String makeServiceName(String path, String verb, String ...
method makeServiceNameNoHash (line 322) | public static String makeServiceNameNoHash(String path, String verb, S...
method getPathFromName (line 326) | public static String getPathFromName(String serviceName) {
method getVerbFromName (line 336) | public static String getVerbFromName(String serviceName) {
method getNounFromName (line 346) | public static String getNounFromName(String serviceName) {
method getVerbAuthzActionEnum (line 352) | public static ArtifactExecutionInfo.AuthzAction getVerbAuthzActionEnum...
method getInParameter (line 359) | public MNode getInParameter(String name) {
method getInParameterNames (line 365) | public ArrayList<String> getInParameterNames() {
method getOutParameter (line 369) | public MNode getOutParameter(String name) {
method getOutParameterNames (line 375) | public ArrayList<String> getOutParameterNames() {
method convertValidateCleanParameters (line 379) | public Map<String, Object> convertValidateCleanParameters(Map<String,...
method nestedParameterClean (line 388) | @SuppressWarnings("unchecked")
method validateParameterSingle (line 563) | private boolean validateParameterSingle(MNode valNode, String paramete...
method nestedRemoveNullsFromResultMap (line 833) | @SuppressWarnings("unchecked")
FILE: framework/src/main/groovy/org/moqui/impl/service/runner/InlineServiceRunner.java
class InlineServiceRunner (line 29) | public class InlineServiceRunner implements ServiceRunner {
method InlineServiceRunner (line 33) | public InlineServiceRunner() { }
method init (line 35) | @Override
method runService (line 41) | @Override
method destroy (line 74) | @Override
FILE: framework/src/main/groovy/org/moqui/impl/service/runner/ScriptServiceRunner.java
class ScriptServiceRunner (line 29) | @CompileStatic
method ScriptServiceRunner (line 34) | public ScriptServiceRunner() { }
method init (line 36) | @Override
method runService (line 42) | @Override
method combineResults (line 72) | static void combineResults(ServiceDefinition sd, Map<String, Object> a...
method destroy (line 85) | @Override
FILE: framework/src/main/groovy/org/moqui/impl/tools/MCacheToolFactory.java
class MCacheToolFactory (line 25) | public class MCacheToolFactory implements ToolFactory<CacheManager> {
method MCacheToolFactory (line 34) | public MCacheToolFactory() { }
method getName (line 36) | @Override
method init (line 38) | @Override
method preFacadeInit (line 40) | @Override
method getInstance (line 46) | @Override
method destroy (line 52) | @Override
method getEcf (line 55) | ExecutionContextFactory getEcf() { return ecf; }
FILE: framework/src/main/groovy/org/moqui/impl/util/JdbcExtractor.java
class JdbcExtractor (line 30) | public class JdbcExtractor implements SimpleEtl.Extractor {
method JdbcExtractor (line 38) | public JdbcExtractor(ExecutionContextImpl eci) { this.eci = eci; }
method setSqlInfo (line 40) | public JdbcExtractor setSqlInfo(String recordType, String selectSql) {
method setDbInfo (line 45) | public JdbcExtractor setDbInfo(String dbType, String host, String port...
method getRecordType (line 56) | public String getRecordType() { return recordType; }
method extract (line 58) | @Override
FILE: framework/src/main/groovy/org/moqui/impl/util/SimpleSigner.java
class SimpleSigner (line 29) | public class SimpleSigner {
method SimpleSigner (line 35) | public SimpleSigner(String keyResource) {
method SimpleSigner (line 39) | public SimpleSigner(String keyResource, String keyType, String signatu...
method sign (line 46) | public String sign(String data) throws Exception {
method initKey (line 54) | private void initKey() {
method readKey (line 64) | public static byte[] readKey(String resourcePath) throws IOException {
FILE: framework/src/main/java/org/moqui/BaseArtifactException.java
class BaseArtifactException (line 24) | public class BaseArtifactException extends BaseException {
method BaseArtifactException (line 27) | public BaseArtifactException(String message) { super(message); populat...
method BaseArtifactException (line 28) | public BaseArtifactException(String message, Deque<ArtifactExecutionIn...
method BaseArtifactException (line 29) | public BaseArtifactException(String message, Throwable nested) { super...
method BaseArtifactException (line 30) | public BaseArtifactException(String message, Throwable nested, Deque<A...
method BaseArtifactException (line 32) | public BaseArtifactException(Throwable nested) { super(nested); popula...
method populateArtifactStack (line 34) | private void populateArtifactStack() {
method getArtifactStack (line 39) | public Deque<ArtifactExecutionInfo> getArtifactStack() { return artifa...
method printStackTrace (line 41) | @Override public void printStackTrace() { printStackTrace(System.err); }
method printStackTrace (line 42) | @Override public void printStackTrace(PrintStream printStream) {
method printStackTrace (line 48) | @Override public void printStackTrace(PrintWriter printWriter) {
method getStackTrace (line 54) | @Override public StackTraceElement[] getStackTrace() {
FILE: framework/src/main/java/org/moqui/BaseException.java
class BaseException (line 22) | public class BaseException extends RuntimeException {
method BaseException (line 23) | public BaseException(String message) { super(message); }
method BaseException (line 24) | public BaseException(String message, Throwable nested) { super(message...
method BaseException (line 25) | public BaseException(Throwable nested) { super(nested); }
method printStackTrace (line 27) | @Override public void printStackTrace() { filterStackTrace(this); supe...
method printStackTrace (line 28) | @Override public void printStackTrace(PrintStream printStream) { filte...
method printStackTrace (line 29) | @Override public void printStackTrace(PrintWriter printWriter) { filte...
method getStackTrace (line 30) | @Override public StackTraceElement[] getStackTrace() {
method filterStackTrace (line 36) | public static Throwable filterStackTrace(Throwable t) {
method filterStackTrace (line 41) | public static StackTraceElement[] filterStackTrace(StackTraceElement[]...
FILE: framework/src/main/java/org/moqui/Moqui.java
class Moqui (line 35) | @SuppressWarnings("unused")
method dynamicInit (line 52) | public static void dynamicInit(ExecutionContextFactory executionContex...
method dynamicInit (line 57) | public static <K extends ExecutionContextFactory> K dynamicInit(Class<...
method dynamicReInit (line 83) | public static <K extends ExecutionContextFactory> K dynamicReInit(Clas...
method getExecutionContextFactory (line 101) | public static ExecutionContextFactory getExecutionContextFactory() { r...
method getExecutionContext (line 103) | public static ExecutionContext getExecutionContext() {
method destroyActiveExecutionContext (line 108) | public static void destroyActiveExecutionContext() { activeExecutionCo...
method destroyActiveExecutionContextFactory (line 111) | public static void destroyActiveExecutionContextFactory() { activeExec...
method loadData (line 116) | public static void loadData(Map<String, String> argMap) {
FILE: framework/src/main/java/org/moqui/context/ArtifactAuthorizationException.java
class ArtifactAuthorizationException (line 21) | public class ArtifactAuthorizationException extends BaseArtifactException {
method ArtifactAuthorizationException (line 24) | public ArtifactAuthorizationException(String str) { super(str); }
method ArtifactAuthorizationException (line 25) | public ArtifactAuthorizationException(String str, Throwable nested) { ...
method ArtifactAuthorizationException (line 26) | public ArtifactAuthorizationException(String str, ArtifactExecutionInf...
method getArtifactInfo (line 31) | public ArtifactExecutionInfo getArtifactInfo() { return artifactInfo; }
FILE: framework/src/main/java/org/moqui/context/ArtifactExecutionFacade.java
type ArtifactExecutionFacade (line 21) | public interface ArtifactExecutionFacade {
method peek (line 27) | ArtifactExecutionInfo peek();
method push (line 31) | void push(ArtifactExecutionInfo aei, boolean requiresAuthz);
method push (line 32) | ArtifactExecutionInfo push(String name, ArtifactExecutionInfo.Artifact...
method pop (line 35) | ArtifactExecutionInfo pop(ArtifactExecutionInfo aei);
method getStack (line 44) | Deque<ArtifactExecutionInfo> getStack();
method getStackArray (line 47) | ArrayList<ArtifactExecutionInfo> getStackArray();
method getHistory (line 49) | List<ArtifactExecutionInfo> getHistory();
method printHistory (line 50) | String printHistory();
method disableAuthz (line 60) | boolean disableAuthz();
method enableAuthz (line 66) | void enableAuthz();
method disableTarpit (line 68) | boolean disableTarpit();
method enableTarpit (line 69) | void enableTarpit();
method setAnonymousAuthorizedAll (line 71) | void setAnonymousAuthorizedAll();
method setAnonymousAuthorizedView (line 72) | void setAnonymousAuthorizedView();
method disableEntityEca (line 78) | boolean disableEntityEca();
method enableEntityEca (line 82) | void enableEntityEca();
FILE: framework/src/main/java/org/moqui/context/ArtifactExecutionInfo.java
type ArtifactExecutionInfo (line 26) | @SuppressWarnings("unused")
type ArtifactType (line 28) | enum ArtifactType { AT_XML_SCREEN, AT_XML_SCREEN_TRANS, AT_XML_SCREEN_...
type AuthzAction (line 29) | enum AuthzAction { AUTHZA_VIEW, AUTHZA_CREATE, AUTHZA_UPDATE, AUTHZA_D...
type AuthzType (line 30) | enum AuthzType { AUTHZT_ALLOW, AUTHZT_DENY, AUTHZT_ALWAYS }
method getName (line 54) | String getName();
method getTypeEnum (line 55) | ArtifactType getTypeEnum();
method getTypeDescription (line 56) | String getTypeDescription();
method getActionEnum (line 57) | AuthzAction getActionEnum();
method getActionDescription (line 58) | String getActionDescription();
method getAuthorizedUserId (line 60) | String getAuthorizedUserId();
method getAuthorizedAuthzType (line 61) | AuthzType getAuthorizedAuthzType();
method getAuthorizedActionEnum (line 62) | AuthzAction getAuthorizedActionEnum();
method isAuthorizationInheritable (line 63) | boolean isAuthorizationInheritable();
method getAuthorizationWasRequired (line 64) | boolean getAuthorizationWasRequired();
method getAuthorizationWasGranted (line 65) | boolean getAuthorizationWasGranted();
method getRunningTime (line 67) | long getRunningTime();
method getRunningTimeMillis (line 68) | BigDecimal getRunningTimeMillis();
method getThisRunningTime (line 69) | long getThisRunningTime();
method getThisRunningTimeMillis (line 70) | BigDecimal getThisRunningTimeMillis();
method getChildrenRunningTime (line 71) | long getChildrenRunningTime();
method getChildrenRunningTimeMillis (line 72) | BigDecimal getChildrenRunningTimeMillis();
method getChildList (line 73) | List<ArtifactExecutionInfo> getChildList();
method getParent (line 74) | ArtifactExecutionInfo getParent();
method getPercentOfParentTime (line 75) | BigDecimal getPercentOfParentTime();
method print (line 77) | void print(Writer writer, int level, boolean children);
method toBasicString (line 78) | String toBasicString();
FILE: framework/src/main/java/org/moqui/context/ArtifactTarpitException.java
class ArtifactTarpitException (line 19) | public class ArtifactTarpitException extends BaseArtifactException {
method ArtifactTarpitException (line 23) | public ArtifactTarpitException(String str) { super(str); }
method ArtifactTarpitException (line 24) | public ArtifactTarpitException(String str, Throwable nested) { super(s...
method ArtifactTarpitException (line 25) | public ArtifactTarpitException(String str, Integer retryAfterSeconds) {
method getRetryAfterSeconds (line 30) | public Integer getRetryAfterSeconds() { return retryAfterSeconds; }
FILE: framework/src/main/java/org/moqui/context/AuthenticationRequiredException.java
class AuthenticationRequiredException (line 19) | public class AuthenticationRequiredException extends BaseArtifactExcepti...
method AuthenticationRequiredException (line 20) | public AuthenticationRequiredException(String str) { super(str); }
method AuthenticationRequiredException (line 21) | public AuthenticationRequiredException(String str, Throwable nested) {...
FILE: framework/src/main/java/org/moqui/context/CacheFacade.java
type CacheFacade (line 21) | public interface CacheFacade {
method clearAllCaches (line 22) | void clearAllCaches();
method clearCachesByPrefix (line 23) | void clearCachesByPrefix(String prefix);
method getCache (line 27) | Cache getCache(String cacheName);
method getCache (line 29) | <K, V> Cache<K, V> getCache(String cacheName, Class<K> keyType, Class<...
method getLocalCache (line 32) | MCache getLocalCache(String cacheName);
method getDistributedCache (line 35) | Cache getDistributedCache(String cacheName);
method registerCache (line 39) | void registerCache(Cache cache);
method getCacheNames (line 41) | Set<String> getCacheNames();
method cacheExists (line 42) | boolean cacheExists(String cacheName);
FILE: framework/src/main/java/org/moqui/context/ElasticFacade.java
type ElasticFacade (line 27) | public interface ElasticFacade {
method getDefault (line 30) | ElasticClient getDefault();
method getClient (line 32) | ElasticClient getClient(String clusterName);
method getClientList (line 34) | List<ElasticClient> getClientList();
type ElasticClient (line 36) | interface ElasticClient {
method getClusterName (line 37) | String getClusterName();
method getClusterLocation (line 38) | String getClusterLocation();
method getServerInfo (line 40) | Map getServerInfo();
method indexExists (line 43) | boolean indexExists(String index);
method aliasExists (line 45) | boolean aliasExists(String alias);
method createIndex (line 47) | void createIndex(String index, Map docMapping, String alias);
method putMapping (line 49) | void putMapping(String index, Map docMapping);
method deleteIndex (line 51) | void deleteIndex(String index);
method index (line 54) | void index(String index, String _id, Map document);
method update (line 56) | void update(String index, String _id, Map documentFragment);
method delete (line 58) | void delete(String index, String _id);
method deleteByQuery (line 60) | Integer deleteByQuery(String index, Map queryMap);
method bulk (line 63) | void bulk(String index, List<Map> actionSourceList);
method bulkIndex (line 65) | void bulkIndex(String index, String idField, List<Map> documentList);
method bulkIndex (line 66) | void bulkIndex(String index, String docType, String idField, List<Ma...
method get (line 69) | Map get(String index, String _id);
method getSource (line 71) | Map getSource(String index, String _id);
method get (line 73) | List<Map> get(String index, List<String> _idList);
method search (line 77) | Map search(String index, Map searchMap);
method searchHits (line 80) | List<Map> searchHits(String index, Map searchMap);
method validateQuery (line 85) | Map validateQuery(String index, Map queryMap, boolean explain);
method count (line 89) | long count(String index, Map countMap);
method countResponse (line 92) | Map countResponse(String index, Map countMap);
method getPitId (line 96) | String getPitId(String index, String keepAlive);
method deletePit (line 98) | void deletePit(String pitId);
method call (line 101) | RestClient.RestResponse call(RestClient.Method method, String index,...
method callFuture (line 103) | Future<RestClient.RestResponse> callFuture(RestClient.Method method,...
method makeRestClient (line 105) | RestClient makeRestClient(RestClient.Method method, String index, St...
method checkCreateDataDocumentIndexes (line 108) | void checkCreateDataDocumentIndexes(String indexName);
method checkCreateDataDocumentIndex (line 110) | void checkCreateDataDocumentIndex(String dataDocumentId);
method putDataDocumentMappings (line 112) | void putDataDocumentMappings(String indexName);
method verifyDataDocumentIndexes (line 114) | void verifyDataDocumentIndexes(List<Map> documentList);
method bulkIndexDataDocument (line 118) | void bulkIndexDataDocument(List<Map> documentList);
method objectToJson (line 121) | String objectToJson(Object jsonObject);
method jsonToObject (line 123) | Object jsonToObject(String jsonString);
FILE: framework/src/main/java/org/moqui/context/ExecutionContext.java
type ExecutionContext (line 38) | @SuppressWarnings("unused")
method getFactory (line 41) | @Nonnull ExecutionContextFactory getFactory();
method getContext (line 44) | @Nonnull ContextStack getContext();
method getContextBinding (line 45) | @Nonnull ContextBinding getContextBinding();
method getContextRoot (line 47) | @Nonnull Map<String, Object> getContextRoot();
method getTool (line 53) | <V> V getTool(@Nonnull String toolName, Class<V> instanceClass, Object...
method getWeb (line 58) | @Nullable WebFacade getWeb();
method getUser (line 61) | @Nonnull UserFacade getUser();
method getMessage (line 64) | @Nonnull MessageFacade getMessage();
method getArtifactExecution (line 67) | @Nonnull ArtifactExecutionFacade getArtifactExecution();
method getL10n (line 70) | @Nonnull L10nFacade getL10n();
method getResource (line 73) | @Nonnull ResourceFacade getResource();
method getLogger (line 76) | @Nonnull LoggerFacade getLogger();
method getCache (line 79) | @Nonnull CacheFacade getCache();
method getTransaction (line 82) | @Nonnull TransactionFacade getTransaction();
method getEntity (line 85) | @Nonnull EntityFacade getEntity();
method getElastic (line 88) | @Nonnull ElasticFacade getElastic();
method getService (line 91) | @Nonnull ServiceFacade getService();
method getScreen (line 94) | @Nonnull ScreenFacade getScreen();
method makeNotificationMessage (line 96) | @Nonnull NotificationMessage makeNotificationMessage();
method getNotificationMessages (line 97) | @Nonnull List<NotificationMessage> getNotificationMessages(@Nullable S...
method initWebFacade (line 101) | void initWebFacade(@Nonnull String webappMoquiName, @Nonnull HttpServl...
method runAsync (line 105) | Future runAsync(@Nonnull Closure closure);
method destroy (line 110) | void destroy();
FILE: framework/src/main/java/org/moqui/context/ExecutionContextFactory.java
type ExecutionContextFactory (line 31) | public interface ExecutionContextFactory {
method getExecutionContext (line 33) | @Nonnull ExecutionContext getExecutionContext();
method destroyActiveExecutionContext (line 36) | void destroyActiveExecutionContext();
method checkEmptyDb (line 41) | boolean checkEmptyDb();
method destroy (line 43) | void destroy();
method isDestroyed (line 44) | boolean isDestroyed();
method getRuntimePath (line 47) | @Nonnull String getRuntimePath();
method getMoquiVersion (line 48) | @Nonnull String getMoquiVersion();
method getToolFactory (line 51) | <V> ToolFactory<V> getToolFactory(@Nonnull String toolName);
method getTool (line 54) | <V> V getTool(@Nonnull String toolName, Class<V> instanceClass, Object...
method getComponentBaseLocations (line 57) | @Nonnull LinkedHashMap<String, String> getComponentBaseLocations();
method getL10n (line 60) | @Nonnull L10nFacade getL10n();
method getResource (line 63) | @Nonnull ResourceFacade getResource();
method getLogger (line 66) | @Nonnull LoggerFacade getLogger();
method getCache (line 69) | @Nonnull CacheFacade getCache();
method getTransaction (line 72) | @Nonnull TransactionFacade getTransaction();
method getEntity (line 75) | @Nonnull EntityFacade getEntity();
method getElastic (line 78) | @Nonnull ElasticFacade getElastic();
method getService (line 81) | @Nonnull ServiceFacade getService();
method getScreen (line 84) | @Nonnull ScreenFacade getScreen();
method getClassLoader (line 87) | @Nonnull ClassLoader getClassLoader();
method getGroovyClassLoader (line 89) | @Nonnull GroovyClassLoader getGroovyClassLoader();
method getServletContext (line 92) | @Nonnull ServletContext getServletContext();
method getServerContainer (line 94) | @Nonnull ServerContainer getServerContainer();
method initServletContext (line 96) | void initServletContext(ServletContext sc);
method registerNotificationMessageListener (line 98) | void registerNotificationMessageListener(@Nonnull NotificationMessageL...
method registerLogEventSubscriber (line 100) | void registerLogEventSubscriber(@Nonnull LogEventSubscriber subscriber);
method getLogEventSubscribers (line 101) | List<LogEventSubscriber> getLogEventSubscribers();
FILE: framework/src/main/java/org/moqui/context/L10nFacade.java
type L10nFacade (line 24) | public interface L10nFacade {
method localize (line 35) | String localize(String original);
method localize (line 37) | String localize(String original, Locale locale);
method formatCurrency (line 49) | String formatCurrency(Object amount, String uomId, Integer fractionDig...
method formatCurrency (line 50) | String formatCurrency(Object amount, String uomId, Integer fractionDig...
method formatCurrency (line 51) | String formatCurrency(Object amount, String uomId, Integer fractionDig...
method formatCurrency (line 52) | String formatCurrency(Object amount, String uomId);
method formatCurrencyNoSymbol (line 53) | String formatCurrencyNoSymbol(Object amount, String uomId);
method roundCurrency (line 62) | BigDecimal roundCurrency(BigDecimal amount, String uomId, boolean prec...
method roundCurrency (line 63) | BigDecimal roundCurrency(java.math.BigDecimal amount, String uomId, bo...
method roundCurrency (line 64) | BigDecimal roundCurrency(java.math.BigDecimal amount, String uomId, bo...
method roundCurrency (line 65) | BigDecimal roundCurrency(java.math.BigDecimal amount, String uomId);
method format (line 74) | String format(Object value, String format);
method format (line 75) | String format(Object value, String format, Locale locale, TimeZone tz);
method parseTime (line 77) | java.sql.Time parseTime(String input, String format);
method parseDate (line 78) | java.sql.Date parseDate(String input, String format);
method parseTimestamp (line 79) | Timestamp parseTimestamp(String input, String format);
method parseTimestamp (line 80) | Timestamp parseTimestamp(String input, String format, Locale locale, T...
method parseDateTime (line 81) | java.util.Calendar parseDateTime(String input, String format);
method formatDateTime (line 82) | String formatDateTime(Calendar input, String format, Locale locale, Ti...
method parseNumber (line 84) | java.math.BigDecimal parseNumber(String input, String format);
method formatNumber (line 85) | String formatNumber(Number input, String format, Locale locale);
FILE: framework/src/main/java/org/moqui/context/LogEventSubscriber.java
type LogEventSubscriber (line 20) | public interface LogEventSubscriber {
method process (line 21) | void process(LogEvent event);
FILE: framework/src/main/java/org/moqui/context/LoggerFacade.java
type LoggerFacade (line 17) | public interface LoggerFacade {
method log (line 52) | void log(int level, String message, Throwable thrown);
method trace (line 54) | void trace(String message);
method debug (line 55) | void debug(String message);
method info (line 56) | void info(String message);
method warn (line 57) | void warn(String message);
method error (line 58) | void error(String message);
method trace (line 60) | void trace(String message, Throwable thrown);
method debug (line 61) | void debug(String message, Throwable thrown);
method info (line 62) | void info(String message, Throwable thrown);
method warn (line 63) | void warn(String message, Throwable thrown);
method error (line 64) | void error(String message, Throwable thrown);
method logEnabled (line 67) | boolean logEnabled(int level);
FILE: framework/src/main/java/org/moqui/context/MessageFacade.java
type MessageFacade (line 21) | public interface MessageFacade {
method getMessages (line 28) | List<String> getMessages();
method getMessageInfos (line 30) | List<MessageInfo> getMessageInfos();
method getMessagesString (line 34) | String getMessagesString();
method addMessage (line 38) | void addMessage(String message);
method addMessage (line 41) | void addMessage(String message, NotificationType type);
method addMessage (line 45) | void addMessage(String message, String type);
method addPublic (line 49) | void addPublic(String message, NotificationType type);
method addPublic (line 54) | void addPublic(String message, String type);
method getPublicMessages (line 56) | List<String> getPublicMessages();
method getPublicMessageInfos (line 57) | List<MessageInfo> getPublicMessageInfos();
method getErrors (line 60) | List<String> getErrors();
method addError (line 65) | void addError(String error);
method getValidationErrors (line 70) | List<ValidationError> getValidationErrors();
method addValidationError (line 71) | void addValidationError(String form, String field, String serviceName,...
method addError (line 72) | void addError(ValidationError error);
method hasError (line 75) | boolean hasError();
method getErrorsString (line 79) | String getErrorsString();
method clearAll (line 83) | void clearAll();
method clearErrors (line 87) | void clearErrors();
method copyMessages (line 90) | void copyMessages(MessageFacade mf);
method pushErrors (line 92) | void pushErrors();
method popErrors (line 94) | void popErrors();
class MessageInfo (line 96) | class MessageInfo implements Serializable {
method MessageInfo (line 99) | public MessageInfo(String message, NotificationType type) {
method MessageInfo (line 103) | public MessageInfo(String message, String type) {
method getMessage (line 116) | public String getMessage() { return message; }
method getType (line 117) | public NotificationType getType() { return type; }
method getTypeString (line 118) | public String getTypeString() { return type.toString(); }
method toString (line 119) | public String toString() { return "[" + type.toString() + "] " + mes...
FILE: framework/src/main/java/org/moqui/context/MessageFacadeException.java
class MessageFacadeException (line 18) | public class MessageFacadeException extends BaseArtifactException {
method MessageFacadeException (line 20) | public MessageFacadeException(MessageFacade mf, Throwable nested) { su...
method getMessageFacade (line 21) | public MessageFacade getMessageFacade() { return messageFacade; }
FILE: framework/src/main/java/org/moqui/context/MoquiLog4jAppender.java
class MoquiLog4jAppender (line 27) | @Plugin(name="MoquiLog4jAppender", category="Core", elementType="appende...
method MoquiLog4jAppender (line 33) | protected MoquiLog4jAppender(String name, Filter filter, Layout<? exte...
method append (line 38) | @Override
method createAppender (line 62) | @PluginFactory
FILE: framework/src/main/java/org/moqui/context/NotificationMessage.java
type NotificationMessage (line 19) | @SuppressWarnings("unused")
type NotificationType (line 21) | enum NotificationType { info, success, warning, danger }
method userId (line 27) | NotificationMessage userId(String userId);
method userIds (line 28) | NotificationMessage userIds(Set<String> userIds);
method getUserIds (line 29) | Set<String> getUserIds();
method userGroupId (line 30) | NotificationMessage userGroupId(String userGroupId);
method getUserGroupId (line 31) | String getUserGroupId();
method getNotifyUserIds (line 36) | Set<String> getNotifyUserIds();
method topic (line 38) | NotificationMessage topic(String topic);
method getTopic (line 39) | String getTopic();
method subTopic (line 41) | NotificationMessage subTopic(String subTopic);
method getSubTopic (line 42) | String getSubTopic();
method message (line 48) | NotificationMessage message(String messageJson);
method message (line 53) | NotificationMessage message(Map<String, Object> message);
method getMessageJson (line 54) | String getMessageJson();
method getMessageMap (line 55) | Map<String, Object> getMessageMap();
method title (line 58) | NotificationMessage title(String title);
method getTitle (line 60) | String getTitle();
method link (line 62) | NotificationMessage link(String link);
method getLink (line 64) | String getLink();
method type (line 66) | NotificationMessage type(NotificationType type);
method type (line 68) | NotificationMessage type(String type);
method getType (line 70) | String getType();
method showAlert (line 72) | NotificationMessage showAlert(boolean show);
method isShowAlert (line 74) | boolean isShowAlert();
method alertNoAutoHide (line 75) | NotificationMessage alertNoAutoHide(boolean noAutoHide);
method isAlertNoAutoHide (line 76) | boolean isAlertNoAutoHide();
method persistOnSend (line 78) | NotificationMessage persistOnSend(Boolean persist);
method isPersistOnSend (line 79) | boolean isPersistOnSend();
method emailTemplateId (line 81) | NotificationMessage emailTemplateId(String id);
method getEmailTemplateId (line 82) | String getEmailTemplateId();
method emailMessageSave (line 84) | NotificationMessage emailMessageSave(Boolean save);
method isEmailMessageSave (line 85) | boolean isEmailMessageSave();
method getEmailMessageIdByUserId (line 88) | Map<String, String> getEmailMessageIdByUserId();
method send (line 95) | NotificationMessage send(boolean persist);
method send (line 97) | NotificationMessage send();
method getNotificationMessageId (line 99) | String getNotificationMessageId();
method markSent (line 100) | NotificationMessage markSent(String userId);
method markViewed (line 101) | NotificationMessage markViewed(String userId);
method getWrappedMessageMap (line 104) | Map<String, Object> getWrappedMessageMap();
method getWrappedMessageJson (line 106) | String getWrappedMessageJson();
FILE: framework/src/main/java/org/moqui/context/NotificationMessageListener.java
type NotificationMessageListener (line 16) | public interface NotificationMessageListener {
method init (line 17) | void init(ExecutionContextFactory ecf);
method destroy (line 18) | void destroy();
method onMessage (line 19) | void onMessage(NotificationMessage nm);
FILE: framework/src/main/java/org/moqui/context/PasswordChangeRequiredException.java
class PasswordChangeRequiredException (line 19) | public class PasswordChangeRequiredException extends CredentialsException {
method PasswordChangeRequiredException (line 20) | public PasswordChangeRequiredException() { super(); }
method PasswordChangeRequiredException (line 21) | public PasswordChangeRequiredException(String str) { super(str); }
method PasswordChangeRequiredException (line 22) | public PasswordChangeRequiredException(Throwable nested) { super(neste...
method PasswordChangeRequiredException (line 23) | public PasswordChangeRequiredException(String str, Throwable nested) {...
FILE: framework/src/main/java/org/moqui/context/ResourceFacade.java
type ResourceFacade (line 28) | public interface ResourceFacade {
method getLocationReference (line 36) | ResourceReference getLocationReference(String location);
method getUriReference (line 37) | ResourceReference getUriReference(URI uri);
method getLocationStream (line 43) | InputStream getLocationStream(String location);
method getLocationText (line 46) | String getLocationText(String location, boolean cache);
method getLocationDataSource (line 47) | DataSource getLocationDataSource(String location);
method template (line 50) | void template(String location, Writer writer);
method template (line 51) | void template(String location, Writer writer, String defaultExtension);
method template (line 52) | String template(String location, String defaultExtension);
method script (line 59) | Object script(String location, String method);
method script (line 60) | Object script(String location, String method, Map additionalContext);
method condition (line 66) | boolean condition(String expression, String debugLocation);
method condition (line 67) | boolean condition(String expression, String debugLocation, Map additio...
method expression (line 74) | Object expression(String expr, String debugLocation);
method expression (line 75) | Object expression(String expr, String debugLocation, Map additionalCon...
method expand (line 84) | String expand(String inputString, String debugLocation);
method expand (line 85) | String expand(String inputString, String debugLocation, Map additional...
method expand (line 86) | String expand(String inputString, String debugLocation, Map additional...
method expandNoL10n (line 87) | String expandNoL10n(String inputString, String debugLocation);
method xslFoTransform (line 89) | Integer xslFoTransform(StreamSource xslFoSrc, StreamSource xsltSrc, Ou...
method getContentType (line 91) | String getContentType(String filename);
FILE: framework/src/main/java/org/moqui/context/ScriptRunner.java
type ScriptRunner (line 18) | public interface ScriptRunner {
method init (line 19) | ScriptRunner init(ExecutionContextFactory ecf);
method run (line 20) | Object run(String location, String method, ExecutionContext ec) throws...
method destroy (line 21) | void destroy();
FILE: framework/src/main/java/org/moqui/context/SecondFactorRequiredException.java
class SecondFactorRequiredException (line 19) | public class SecondFactorRequiredException extends AuthenticationExcepti...
method SecondFactorRequiredException (line 20) | public SecondFactorRequiredException() { super(); }
method SecondFactorRequiredException (line 21) | public SecondFactorRequiredException(String str) { super(str); }
method SecondFactorRequiredException (line 22) | public SecondFactorRequiredException(Throwable nested) { super(nested); }
method SecondFactorRequiredException (line 23) | public SecondFactorRequiredException(String str, Throwable nested) { s...
FILE: framework/src/main/java/org/moqui/context/TemplateRenderer.java
type TemplateRenderer (line 20) | public interface TemplateRenderer {
method init (line 21) | TemplateRenderer init(ExecutionContextFactory ecf);
method render (line 22) | void render(String location, Writer writer) throws BaseException;
method stripTemplateExtension (line 23) | String stripTemplateExtension(String fileName);
method destroy (line 24) | void destroy();
FILE: framework/src/main/java/org/moqui/context/ToolFactory.java
type ToolFactory (line 18) | public interface ToolFactory<V> {
method getName (line 21) | default String getName() {
method init (line 29) | default void init(ExecutionContextFactory ecf) { }
method preFacadeInit (line 33) | default void preFacadeInit(ExecutionContextFactory ecf) { }
method getInstance (line 40) | V getInstance(Object... parameters);
method destroy (line 43) | default void destroy() { }
method postFacadeDestroy (line 46) | default void postFacadeDestroy() { }
FILE: framework/src/main/java/org/moqui/context/TransactionException.java
class TransactionException (line 21) | public class TransactionException extends BaseArtifactException {
method TransactionException (line 22) | public TransactionException(String str) { super(str); }
method TransactionException (line 23) | public TransactionException(String str, Throwable nested) { super(str,...
FILE: framework/src/main/java/org/moqui/context/TransactionFacade.java
type TransactionFacade (line 64) | @SuppressWarnings("unused")
method runUseOrBegin (line 68) | Object runUseOrBegin(Integer timeout, String rollbackMessage, Closure ...
method runRequireNew (line 70) | Object runRequireNew(Integer timeout, String rollbackMessage, Closure ...
method getTransactionManager (line 72) | jakarta.transaction.TransactionManager getTransactionManager();
method getUserTransaction (line 73) | jakarta.transaction.UserTransaction getUserTransaction();
method getStatus (line 76) | int getStatus() throws TransactionException;
method getStatusString (line 78) | String getStatusString() throws TransactionException;
method isTransactionInPlace (line 80) | boolean isTransactionInPlace() throws TransactionException;
method begin (line 89) | boolean begin(Integer timeout) throws TransactionException;
method commit (line 92) | void commit(boolean beganTransaction) throws TransactionException;
method commit (line 95) | void commit() throws TransactionException;
method rollback (line 100) | void rollback(boolean beganTransaction, String causeMessage, Throwable...
method rollback (line 103) | void rollback(String causeMessage, Throwable causeThrowable) throws Tr...
method setRollbackOnly (line 106) | void setRollbackOnly(String causeMessage, Throwable causeThrowable) th...
method suspend (line 108) | boolean suspend() throws TransactionException;
method resume (line 110) | void resume() throws TransactionException;
method enlistConnection (line 112) | java.sql.Connection enlistConnection(javax.sql.XAConnection con) throw...
method enlistResource (line 114) | void enlistResource(XAResource resource) throws TransactionException;
method getActiveXaResource (line 115) | XAResource getActiveXaResource(String resourceName);
method putAndEnlistActiveXaResource (line 116) | void putAndEnlistActiveXaResource(String resourceName, XAResource xar);
method registerSynchronization (line 118) | void registerSynchronization(Synchronization sync) throws TransactionE...
method getActiveSynchronization (line 119) | Synchronization getActiveSynchronization(String syncName);
method putAndEnlistActiveSynchronization (line 120) | void putAndEnlistActiveSynchronization(String syncName, Synchronizatio...
method initTransactionCache (line 122) | void initTransactionCache(boolean readOnly);
method isTransactionCacheActive (line 123) | boolean isTransactionCacheActive();
method flushAndDisableTransactionCache (line 124) | void flushAndDisableTransactionCache();
FILE: framework/src/main/java/org/moqui/context/TransactionInternal.java
type TransactionInternal (line 23) | public interface TransactionInternal {
method init (line 24) | TransactionInternal init(ExecutionContextFactory ecf);
method getTransactionManager (line 26) | TransactionManager getTransactionManager();
method getUserTransaction (line 27) | UserTransaction getUserTransaction();
method getDataSource (line 28) | DataSource getDataSource(EntityFacade ef, MNode datasourceNode);
method destroy (line 30) | void destroy();
FILE: framework/src/main/java/org/moqui/context/UserFacade.java
type UserFacade (line 22) | @SuppressWarnings("unused")
method getLocale (line 25) | Locale getLocale();
method setLocale (line 30) | void setLocale(Locale locale);
method getTimeZone (line 33) | TimeZone getTimeZone();
method setTimeZone (line 38) | void setTimeZone(TimeZone tz);
method getCurrencyUomId (line 41) | String getCurrencyUomId();
method setCurrencyUomId (line 46) | void setCurrencyUomId(String uomId);
method getPreference (line 52) | String getPreference(String preferenceKey);
method setPreference (line 58) | void setPreference(String preferenceKey, String preferenceValue);
method getPreferences (line 60) | Map<String, String> getPreferences(String keyRegexp);
method getContext (line 64) | Map<String, Object> getContext();
method getNowTimestamp (line 73) | Timestamp getNowTimestamp();
method getNowCalendar (line 75) | Calendar getNowCalendar();
method getPeriodRange (line 80) | ArrayList<Timestamp> getPeriodRange(String period, String poffset, Str...
method getPeriodRange (line 81) | ArrayList<Timestamp> getPeriodRange(String period, int poffset, java.s...
method getPeriodRange (line 82) | ArrayList<Timestamp> getPeriodRange(String period, String poffset);
method getPeriodDescription (line 83) | String getPeriodDescription(String period, String poffset, String pdate);
method getPeriodRange (line 84) | ArrayList<Timestamp> getPeriodRange(String baseName, Map<String, Objec...
method setEffectiveTime (line 91) | void setEffectiveTime(Timestamp effectiveTime);
method loginUser (line 98) | boolean loginUser(String username, String password);
method logoutUser (line 100) | void logoutUser();
method loginUserKey (line 103) | boolean loginUserKey(String loginKey);
method getLoginKey (line 105) | String getLoginKey();
method getLoginKey (line 106) | String getLoginKey(float expireHours);
method loginAnonymousIfNoUser (line 109) | boolean loginAnonymousIfNoUser();
method hasPermission (line 118) | boolean hasPermission(String userPermissionId);
method isInGroup (line 127) | boolean isInGroup(String userGroupId);
method getUserGroupIdSet (line 129) | Set<String> getUserGroupIdSet();
method getUserId (line 132) | String getUserId();
method getUsername (line 135) | String getUsername();
method getUserAccount (line 138) | EntityValue getUserAccount();
method getVisitUserId (line 141) | String getVisitUserId();
method getVisitId (line 144) | String getVisitId();
method getVisit (line 146) | EntityValue getVisit();
method getVisitorId (line 147) | String getVisitorId();
method getClientIp (line 149) | String getClientIp();
FILE: framework/src/main/java/org/moqui/context/ValidationError.java
class ValidationError (line 30) | @SuppressWarnings("unused")
method ValidationError (line 36) | public ValidationError(String field, String message, Throwable nested) {
method ValidationError (line 43) | public ValidationError(String form, String field, String serviceName, ...
method getForm (line 50) | public String getForm() { return form; }
method getFormPretty (line 51) | public String getFormPretty() { return StringUtilities.camelCaseToPret...
method getField (line 52) | public String getField() { return field; }
method getFieldPretty (line 53) | public String getFieldPretty() { return StringUtilities.camelCaseToPre...
method getServiceName (line 54) | public String getServiceName() { return serviceName; }
method getServiceNamePretty (line 55) | public String getServiceNamePretty() { return StringUtilities.camelCas...
method toStringPretty (line 57) | public String toStringPretty() {
method getMap (line 71) | public Map<String, String> getMap() {
FILE: framework/src/main/java/org/moqui/context/WebFacade.java
type WebFacade (line 28) | @SuppressWarnings("unused")
method getRequestUrl (line 30) | String getRequestUrl();
method getParameters (line 31) | Map<String, Object> getParameters();
method getRequest (line 33) | HttpServletRequest getRequest();
method getRequestAttributes (line 34) | Map<String, Object> getRequestAttributes();
method getRequestParameters (line 37) | Map<String, Object> getRequestParameters();
method getSecureRequestParameters (line 40) | Map<String, Object> getSecureRequestParameters();
method getHostName (line 42) | String getHostName(boolean withPort);
method getPathInfo (line 45) | String getPathInfo();
method getPathInfoList (line 48) | ArrayList<String> getPathInfoList();
method getRequestBodyText (line 50) | String getRequestBodyText();
method getResourceDistinctValue (line 52) | String getResourceDistinctValue();
method getResponse (line 54) | HttpServletResponse getResponse();
method getSession (line 56) | HttpSession getSession();
method getSessionAttributes (line 57) | Map<String, Object> getSessionAttributes();
method getSessionToken (line 59) | String getSessionToken();
method getServletContext (line 61) | ServletContext getServletContext();
method getApplicationAttributes (line 62) | Map<String, Object> getApplicationAttributes();
method getWebappRootUrl (line 63) | String getWebappRootUrl(boolean requireFullUrl, Boolean useEncryption);
method getErrorParameters (line 65) | Map<String, Object> getErrorParameters();
method getSavedMessages (line 66) | List<MessageInfo> getSavedMessages();
method getSavedPublicMessages (line 67) | List<MessageInfo> getSavedPublicMessages();
method getSavedErrors (line 68) | List<String> getSavedErrors();
method getSavedValidationErrors (line 69) | List<ValidationError> getSavedValidationErrors();
method getFieldValidationErrors (line 71) | List<ValidationError> getFieldValidationErrors(String fieldName);
method getScreenHistory (line 76) | List<Map> getScreenHistory();
method sendJsonResponse (line 78) | void sendJsonResponse(Object responseObj);
method sendJsonError (line 79) | void sendJsonError(int statusCode, String message, Throwable origThrow...
method sendTextResponse (line 80) | void sendTextResponse(String text);
method sendTextResponse (line 81) | void sendTextResponse(String text, String contentType, String filename);
method sendResourceResponse (line 84) | void sendResourceResponse(String location);
method sendResourceResponse (line 89) | void sendResourceResponse(String location, boolean inline);
method sendError (line 90) | void sendError(int errorCode, String message, Throwable origThrowable);
method handleJsonRpcServiceCall (line 92) | void handleJsonRpcServiceCall();
method handleEntityRestCall (line 93) | void handleEntityRestCall(List<String> extraPathNameList, boolean mast...
method handleServiceRestCall (line 94) | void handleServiceRestCall(List<String> extraPathNameList);
method handleSystemMessage (line 95) | void handleSystemMessage(List<String> extraPathNameList);
FILE: framework/src/main/java/org/moqui/context/WebMediaTypeException.java
class WebMediaTypeException (line 20) | public class WebMediaTypeException extends BaseArtifactException {
method WebMediaTypeException (line 21) | public WebMediaTypeException(String str) { super(str); }
method WebMediaTypeException (line 22) | public WebMediaTypeException(String str, Throwable nested) { super(str...
FILE: framework/src/main/java/org/moqui/entity/EntityCondition.java
type EntityCondition (line 26) | public interface EntityCondition extends Externalizable {
type ComparisonOperator (line 46) | enum ComparisonOperator { EQUALS, NOT_EQUAL,
type JoinOperator (line 50) | enum JoinOperator { AND, OR }
method mapMatches (line 53) | boolean mapMatches(Map<String, Object> map);
method mapMatchesAny (line 55) | boolean mapMatchesAny(Map<String, Object> map);
method mapKeysNotContained (line 57) | boolean mapKeysNotContained(Map<String, Object> map);
method populateMap (line 60) | boolean populateMap(Map<String, Object> map);
method ignoreCase (line 67) | EntityCondition ignoreCase();
FILE: framework/src/main/java/org/moqui/entity/EntityConditionFactory.java
type EntityConditionFactory (line 26) | @SuppressWarnings("unused")
method getTrueCondition (line 29) | EntityCondition getTrueCondition();
method makeCondition (line 31) | EntityCondition makeCondition(EntityCondition lhs, EntityCondition.Joi...
method makeCondition (line 33) | EntityCondition makeCondition(String fieldName, EntityCondition.Compar...
method makeCondition (line 34) | EntityCondition makeCondition(String fieldName, EntityCondition.Compar...
method makeConditionToField (line 36) | EntityCondition makeConditionToField(String fieldName, EntityCondition...
method makeCondition (line 39) | EntityCondition makeCondition(List<EntityCondition> conditionList);
method makeCondition (line 40) | EntityCondition makeCondition(List<EntityCondition> conditionList, Ent...
method makeCondition (line 43) | EntityCondition makeCondition(List<Object> conditionList, String listO...
method makeCondition (line 45) | EntityCondition makeCondition(Map<String, Object> fieldMap, EntityCond...
method makeCondition (line 48) | EntityCondition makeCondition(Map<String, Object> fieldMap);
method makeConditionDate (line 50) | EntityCondition makeConditionDate(String fromFieldName, String thruFie...
method makeConditionWhere (line 52) | EntityCondition makeConditionWhere(String sqlWhereClause);
method comparisonOperatorFromEnumId (line 55) | EntityCondition.ComparisonOperator comparisonOperatorFromEnumId(String...
FILE: framework/src/main/java/org/moqui/entity/EntityDataLoader.java
type EntityDataLoader (line 29) | @SuppressWarnings("unused")
method location (line 35) | EntityDataLoader location(String location);
method locationList (line 40) | EntityDataLoader locationList(List<String> locationList);
method xmlText (line 45) | EntityDataLoader xmlText(String xmlText);
method csvText (line 46) | EntityDataLoader csvText(String csvText);
method jsonText (line 47) | EntityDataLoader jsonText(String jsonText);
method dataTypes (line 53) | EntityDataLoader dataTypes(Set<String> dataTypes);
method componentNameList (line 55) | EntityDataLoader componentNameList(List<String> componentNames);
method transactionTimeout (line 60) | EntityDataLoader transactionTimeout(int tt);
method useTryInsert (line 66) | EntityDataLoader useTryInsert(boolean useTryInsert);
method onlyCreate (line 71) | EntityDataLoader onlyCreate(boolean onlyInsert);
method dummyFks (line 81) | EntityDataLoader dummyFks(boolean dummyFks);
method messageNoActionFiles (line 85) | EntityDataLoader messageNoActionFiles(boolean messageNoActionFiles);
method disableEntityEca (line 91) | EntityDataLoader disableEntityEca(boolean disable);
method disableAuditLog (line 92) | EntityDataLoader disableAuditLog(boolean disable);
method disableFkCreate (line 93) | EntityDataLoader disableFkCreate(boolean disable);
method disableDataFeed (line 94) | EntityDataLoader disableDataFeed(boolean disable);
method csvDelimiter (line 96) | EntityDataLoader csvDelimiter(char delimiter);
method csvCommentStart (line 97) | EntityDataLoader csvCommentStart(char commentStart);
method csvQuoteChar (line 98) | EntityDataLoader csvQuoteChar(char quoteChar);
method csvEntityName (line 101) | EntityDataLoader csvEntityName(String entityName);
method csvFieldNames (line 103) | EntityDataLoader csvFieldNames(List<String> fieldNames);
method defaultValues (line 105) | EntityDataLoader defaultValues(Map<String, Object> defaultValues);
method check (line 112) | List<String> check();
method check (line 113) | long check(List<String> messageList);
method checkInfo (line 115) | List<Map<String, Object>> checkInfo();
method checkInfo (line 116) | long checkInfo(List<Map<String, Object>> diffInfoList, List<String> me...
method load (line 119) | long load();
method load (line 120) | long load(List<String> messageList);
method list (line 126) | EntityList list();
FILE: framework/src/main/java/org/moqui/entity/EntityDataWriter.java
type EntityDataWriter (line 27) | @SuppressWarnings("unused")
type FileType (line 34) | enum FileType { XML, JSON, CSV }
method fileType (line 36) | EntityDataWriter fileType(FileType ft);
method fileType (line 37) | EntityDataWriter fileType(String ft);
method entityName (line 44) | EntityDataWriter entityName(String entityName);
method entityNames (line 50) | EntityDataWriter entityNames(Collection<String> entityNames);
method skipEntityName (line 52) | EntityDataWriter skipEntityName(String entityName);
method skipEntityNames (line 53) | EntityDataWriter skipEntityNames(Collection<String> enList);
method allEntities (line 60) | EntityDataWriter allEntities();
method dependentRecords (line 67) | EntityDataWriter dependentRecords(boolean dependents);
method dependentLevels (line 72) | EntityDataWriter dependentLevels(int levels);
method master (line 76) | EntityDataWriter master(String masterName);
method filterMap (line 83) | EntityDataWriter filterMap(Map<String, Object> filterMap);
method orderBy (line 90) | EntityDataWriter orderBy(List<String> orderByList);
method fromDate (line 96) | EntityDataWriter fromDate(Timestamp fromDate);
method thruDate (line 101) | EntityDataWriter thruDate(Timestamp thruDate);
method isoDateTime (line 104) | EntityDataWriter isoDateTime(boolean iso);
method tableColumnNames (line 106) | EntityDataWriter tableColumnNames(boolean tcn);
method file (line 112) | int file(String filename);
method zipFile (line 113) | int zipFile(String filenameWithinZip, String zipFilename);
method directory (line 118) | int directory(String path);
method zipDirectory (line 120) | int zipDirectory(String pathWithinZip, String zipFilename);
method zipDirectory (line 122) | int zipDirectory(String pathWithinZip, OutputStream outputStream);
method writer (line 127) | int writer(Writer writer);
FILE: framework/src/main/java/org/moqui/entity/EntityDatasourceFactory.java
type EntityDatasourceFactory (line 20) | public interface EntityDatasourceFactory {
method init (line 21) | EntityDatasourceFactory init(EntityFacade ef, MNode datasourceNode);
method destroy (line 22) | void destroy();
method checkTableExists (line 23) | boolean checkTableExists(String entityName);
method checkAndAddTable (line 24) | boolean checkAndAddTable(String entityName);
method checkAndAddAllTables (line 25) | int checkAndAddAllTables();
method makeEntityValue (line 26) | EntityValue makeEntityValue(String entityName);
method makeEntityFind (line 27) | EntityFind makeEntityFind(String entityName);
method createBulk (line 28) | void createBulk(List<EntityValue> valueList);
method getDataSource (line 31) | DataSource getDataSource();
FILE: framework/src/main/java/org/moqui/entity/EntityDynamicView.java
type EntityDynamicView (line 25) | @SuppressWarnings("unused")
method setEntityName (line 28) | EntityDynamicView setEntityName(String entityName);
method addMemberEntity (line 30) | EntityDynamicView addMemberEntity(String entityAlias, String entityNam...
method addRelationshipMember (line 33) | EntityDynamicView addRelationshipMember(String entityAlias, String joi...
method getMemberEntityNodes (line 36) | List<MNode> getMemberEntityNodes();
method addAliasAll (line 38) | EntityDynamicView addAliasAll(String entityAlias, String prefix);
method addAlias (line 40) | EntityDynamicView addAlias(String entityAlias, String name);
method addAlias (line 43) | EntityDynamicView addAlias(String entityAlias, String name, String fie...
method addRelationship (line 45) | EntityDynamicView addRelationship(String type, String title, String re...
FILE: framework/src/main/java/org/moqui/entity/EntityException.java
class EntityException (line 20) | public class EntityException extends org.moqui.BaseException {
method EntityException (line 22) | public EntityException(String str) {
method EntityException (line 26) | public EntityException(String str, Throwable nested) {
FILE: framework/src/main/java/org/moqui/entity/EntityFacade.java
type EntityFacade (line 28) | @SuppressWarnings("unused")
method getDatasourceFactory (line 33) | EntityDatasourceFactory getDatasourceFactory(String groupName);
method getConditionFactory (line 39) | EntityConditionFactory getConditionFactory();
method makeValue (line 46) | EntityValue makeValue(String entityName);
method find (line 54) | EntityFind find(String entityName);
method find (line 55) | EntityFind find(MNode entityFindNode);
method fastFindOne (line 56) | EntityValue fastFindOne(String entityName, Boolean useCache, boolean d...
method createBulk (line 59) | void createBulk(List<EntityValue> valueList);
method rest (line 75) | Object rest(String operation, List<String> entityPath, Map parameters,...
method sqlFind (line 87) | EntityListIterator sqlFind(String sql, List<Object> sqlParameterList, ...
method getDataDocuments (line 106) | ArrayList<Map> getDataDocuments(String dataDocumentId, EntityCondition...
method getDataFeedDocuments (line 117) | ArrayList<Map> getDataFeedDocuments(String dataFeedId, Timestamp fromU...
method sequencedIdPrimary (line 128) | String sequencedIdPrimary(String seqName, Long staggerMax, Long bankSi...
method getEntityGroupName (line 134) | String getEntityGroupName(String entityName);
method getConnection (line 144) | Connection getConnection(String groupName) throws EntityException;
method getConnection (line 145) | Connection getConnection(String groupName, boolean useClone) throws En...
method makeDataLoader (line 160) | EntityDataLoader makeDataLoader();
method makeDataWriter (line 168) | EntityDataWriter makeDataWriter();
method makeEtlLoader (line 170) | SimpleEtl.Loader makeEtlLoader();
method makeValue (line 177) | EntityValue makeValue(Element element);
method getCalendarForTzLc (line 179) | Calendar getCalendarForTzLc();
FILE: framework/src/main/java/org/moqui/entity/EntityFind.java
type EntityFind (line 32) | @SuppressWarnings("unused")
method entity (line 39) | EntityFind entity(String entityName);
method getEntity (line 40) | String getEntity();
method makeEntityDynamicView (line 48) | EntityDynamicView makeEntityDynamicView();
method condition (line 58) | EntityFind condition(String fieldName, Object value);
method condition (line 61) | EntityFind condition(String fieldName, EntityCondition.ComparisonOpera...
method condition (line 62) | EntityFind condition(String fieldName, String operator, Object value);
method conditionToField (line 65) | EntityFind conditionToField(String fieldName, EntityCondition.Comparis...
method condition (line 77) | EntityFind condition(Map<String, Object> fields);
method condition (line 83) | EntityFind condition(EntityCondition condition);
method conditionDate (line 88) | EntityFind conditionDate(String fromFieldName, String thruFieldName, j...
method getHasCondition (line 90) | boolean getHasCondition();
method getHasHavingCondition (line 91) | boolean getHasHavingCondition();
method havingCondition (line 98) | EntityFind havingCondition(EntityCondition condition);
method getWhereEntityCondition (line 101) | EntityCondition getWhereEntityCondition();
method getHavingEntityCondition (line 104) | EntityCondition getHavingEntityCondition();
method searchFormInputs (line 120) | EntityFind searchFormInputs(String inputFieldsMapName, String defaultO...
method searchFormMap (line 121) | EntityFind searchFormMap(Map <String, Object> inputFieldsMap, Map<Stri...
method selectField (line 130) | EntityFind selectField(String fieldToSelect);
method selectFields (line 135) | EntityFind selectFields(Collection<String> fieldsToSelect);
method getSelectFields (line 136) | List<String> getSelectFields();
method orderBy (line 146) | EntityFind orderBy(String orderByFieldName);
method orderBy (line 151) | EntityFind orderBy(List<String> orderByFieldNames);
method getOrderBy (line 152) | List<String> getOrderBy();
method useCache (line 159) | EntityFind useCache(Boolean useCache);
method getUseCache (line 160) | boolean getUseCache();
method useClone (line 163) | EntityFind useClone(boolean uc);
method distinct (line 172) | EntityFind distinct(boolean distinct);
method getDistinct (line 173) | boolean getDistinct();
method offset (line 180) | EntityFind offset(Integer offset);
method offset (line 182) | EntityFind offset(int pageIndex, int pageSize);
method getOffset (line 183) | Integer getOffset();
method limit (line 190) | EntityFind limit(Integer limit);
method getLimit (line 191) | Integer getLimit();
method getPageIndex (line 194) | int getPageIndex();
method getPageSize (line 196) | int getPageSize();
method forUpdate (line 205) | EntityFind forUpdate(boolean forUpdate);
method getForUpdate (line 206) | boolean getForUpdate();
method resultSetType (line 218) | EntityFind resultSetType(int resultSetType);
method getResultSetType (line 219) | int getResultSetType();
method resultSetConcurrency (line 228) | EntityFind resultSetConcurrency(int resultSetConcurrency);
method getResultSetConcurrency (line 229) | int getResultSetConcurrency();
method fetchSize (line 239) | EntityFind fetchSize(Integer fetchSize);
method getFetchSize (line 240) | Integer getFetchSize();
method maxRows (line 250) | EntityFind maxRows(Integer maxRows);
method getMaxRows (line 251) | Integer getMaxRows();
method disableAuthz (line 254) | EntityFind disableAuthz();
method requireSearchFormParameters (line 256) | EntityFind requireSearchFormParameters(boolean req);
method shouldCache (line 258) | boolean shouldCache();
method one (line 263) | EntityValue one() throws EntityException;
method oneMaster (line 267) | Map<String, Object> oneMaster(String name) throws EntityException;
method list (line 270) | EntityList list() throws EntityException;
method listMaster (line 274) | List<Map<String, Object>> listMaster(String name) throws EntityException;
method iterator (line 295) | EntityListIterator iterator() throws EntityException;
method count (line 298) | long count() throws EntityException;
method updateAll (line 306) | long updateAll(Map<String, Object> fieldsToSet) throws EntityException;
method deleteAll (line 313) | long deleteAll() throws EntityException;
method getQueryTextList (line 317) | ArrayList<String> getQueryTextList();
FILE: framework/src/main/java/org/moqui/entity/EntityList.java
type EntityList (line 30) | @SuppressWarnings("unused")
method getFirst (line 37) | EntityValue getFirst();
method filterByDate (line 47) | EntityList filterByDate(String fromDateName, String thruDateName, Time...
method filterByDate (line 48) | EntityList filterByDate(String fromDateName, String thruDateName, Time...
method filterByAnd (line 55) | EntityList filterByAnd(Map<String, Object> fields);
method filterByAnd (line 56) | EntityList filterByAnd(Map<String, Object> fields, Boolean include);
method filterByAnd (line 63) | EntityList filterByAnd(Object... namesAndValues);
method removeByAnd (line 65) | EntityList removeByAnd(Map<String, Object> fields);
method filterByCondition (line 74) | EntityList filterByCondition(EntityCondition condition, Boolean include);
method filter (line 78) | EntityList filter(Closure<Boolean> closure, Boolean include);
method find (line 81) | EntityValue find(Closure<Boolean> closure);
method findByAnd (line 82) | EntityValue findByAnd(Map<String, Object> fields);
method findByAnd (line 83) | EntityValue findByAnd(Object... namesAndValues);
method findAll (line 87) | EntityList findAll(Closure<Boolean> closure);
method filterByLimit (line 95) | EntityList filterByLimit(Integer offset, Integer limit);
method filterByLimit (line 97) | EntityList filterByLimit(String inputFieldsMapName, boolean alwaysPagi...
method getOffset (line 100) | Integer getOffset();
method getLimit (line 102) | Integer getLimit();
method getPageIndex (line 104) | int getPageIndex();
method getPageSize (line 106) | int getPageSize();
method orderByFields (line 114) | EntityList orderByFields(List<String> fieldNames);
method indexMatching (line 116) | int indexMatching(Map<String, Object> valueMap);
method move (line 117) | void move(int fromIndex, int toIndex);
method addIfMissing (line 120) | EntityList addIfMissing(EntityValue value);
method addAllIfMissing (line 122) | EntityList addAllIfMissing(EntityList el);
method writeXmlText (line 131) | int writeXmlText(Writer writer, String prefix, int dependentLevels);
method iterator (line 137) | @Override
method getPlainValueList (line 142) | List<Map<String, Object>> getPlainValueList(int dependentLevels);
method getMasterValueList (line 143) | List<Map<String, Object>> getMasterValueList(String name);
method getValueMapList (line 144) | ArrayList<Map<String, Object>> getValueMapList();
method cloneList (line 146) | EntityList cloneList();
method setFromCache (line 148) | void setFromCache();
method isFromCache (line 149) | boolean isFromCache();
FILE: framework/src/main/java/org/moqui/entity/EntityListIterator.java
type EntityListIterator (line 22) | @SuppressWarnings("unused")
method close (line 26) | void close() throws EntityException;
method afterLast (line 29) | void afterLast() throws EntityException;
method beforeFirst (line 32) | void beforeFirst() throws EntityException;
method last (line 35) | boolean last() throws EntityException;
method first (line 38) | boolean first() throws EntityException;
method currentEntityValue (line 43) | EntityValue currentEntityValue() throws EntityException;
method currentIndex (line 45) | int currentIndex() throws EntityException;
method absolute (line 52) | boolean absolute(int rowNum) throws EntityException;
method relative (line 58) | boolean relative(int rows) throws EntityException;
method hasNext (line 71) | @Override boolean hasNext();
method hasPrevious (line 76) | @Override boolean hasPrevious();
method next (line 88) | @Override EntityValue next();
method nextIndex (line 91) | @Override int nextIndex();
method previous (line 96) | @Override EntityValue previous();
method previousIndex (line 99) | @Override int previousIndex();
method setFetchSize (line 101) | void setFetchSize(int rows) throws EntityException;
method getCompleteList (line 103) | EntityList getCompleteList(boolean closeAfter) throws EntityException;
method getPartialList (line 108) | EntityList getPartialList(int offset, int limit, boolean closeAfter) t...
method writeXmlText (line 117) | int writeXmlText(Writer writer, String prefix, int dependentLevels);
method writeXmlTextMaster (line 118) | int writeXmlTextMaster(Writer writer, String prefix, String masterName);
FILE: framework/src/main/java/org/moqui/entity/EntityNotFoundException.java
class EntityNotFoundException (line 16) | public class EntityNotFoundException extends EntityException {
method EntityNotFoundException (line 17) | public EntityNotFoundException(String str) {
FILE: framework/src/main/java/org/moqui/entity/EntityValue.java
type EntityValue (line 30) | @SuppressWarnings("unused")
method resolveEntityName (line 33) | String resolveEntityName();
method resolveEntityNamePretty (line 34) | String resolveEntityNamePretty();
method isModified (line 37) | boolean isModified();
method isFieldModified (line 39) | boolean isFieldModified(String name);
method touchField (line 41) | EntityValue touchField(String name);
method isFieldSet (line 43) | boolean isFieldSet(String name);
method isField (line 46) | boolean isField(String name);
method isMutable (line 48) | boolean isMutable();
method getMap (line 52) | Map<String, Object> getMap();
method get (line 67) | Object get(String name);
method getNoCheckSimple (line 72) | Object getNoCheckSimple(String name);
method containsPrimaryKey (line 75) | boolean containsPrimaryKey();
method getPrimaryKeys (line 77) | Map<String, Object> getPrimaryKeys();
method getPrimaryKeysString (line 78) | String getPrimaryKeysString();
method set (line 85) | EntityValue set(String name, Object value);
method setAll (line 94) | EntityValue setAll(Map<String, Object> fields);
method setString (line 106) | EntityValue setString(String name, String value);
method getBoolean (line 108) | Boolean getBoolean(String name);
method getString (line 110) | String getString(String name);
method getTimestamp (line 112) | java.sql.Timestamp getTimestamp(String name);
method getTime (line 113) | java.sql.Time getTime(String name);
method getDate (line 114) | java.sql.Date getDate(String name);
method getLong (line 116) | Long getLong(String name);
method getDouble (line 117) | Double getDouble(String name);
method getBigDecimal (line 118) | BigDecimal getBigDecimal(String name);
method getBytes (line 120) | byte[] getBytes(String name);
method setBytes (line 121) | EntityValue setBytes(String name, byte[] theBytes);
method getSerialBlob (line 122) | SerialBlob getSerialBlob(String name);
method setFields (line 135) | EntityValue setFields(Map<String, Object> fields, boolean setIfEmpty, ...
method setSequencedIdPrimary (line 143) | EntityValue setSequencedIdPrimary();
method setSequencedIdSecondary (line 152) | EntityValue setSequencedIdSecondary();
method compareTo (line 158) | @Override
method mapMatches (line 162) | boolean mapMatches(Map<String, Object> theMap);
method cloneValue (line 164) | EntityValue cloneValue();
method create (line 169) | EntityValue create() throws EntityException;
method createOrUpdate (line 174) | EntityValue createOrUpdate() throws EntityException;
method store (line 176) | EntityValue store() throws EntityException;
method update (line 181) | EntityValue update() throws EntityException;
method delete (line 186) | EntityValue delete() throws EntityException;
method refresh (line 191) | boolean refresh() throws EntityException;
method getOriginalDbValue (line 193) | Object getOriginalDbValue(String name);
method findRelated (line 204) | EntityList findRelated(String relationshipName, Map<String, Object> by...
method findRelatedOne (line 213) | EntityValue findRelatedOne(String relationshipName, Boolean useCache, ...
method findRelatedCount (line 215) | long findRelatedCount(final String relationshipName, Boolean useCache);
method findRelatedFk (line 226) | EntityList findRelatedFk(Set<String> skipEntities);
method deleteRelated (line 232) | void deleteRelated(String relationshipName) throws EntityException;
method deleteWithRelated (line 239) | boolean deleteWithRelated(Set<String> relationshipsToDelete);
method deleteWithCascade (line 255) | void deleteWithCascade(Set<String> clearRefEntities, Set<String> valid...
method checkFks (line 264) | boolean checkFks(boolean insertDummy) throws EntityException;
method checkAgainstDatabase (line 266) | long checkAgainstDatabase(List<String> messages);
method checkAgainstDatabaseInfo (line 267) | long checkAgainstDatabaseInfo(List<Map<String, Object>> diffInfoList, ...
method makeXmlElement (line 274) | Element makeXmlElement(Document document, String prefix);
method writeXmlText (line 283) | int writeXmlText(Writer writer, String prefix, int dependentLevels);
method writeXmlTextMaster (line 284) | int writeXmlTextMaster(Writer pw, String prefix, String masterName);
method getPlainValueMap (line 290) | Map<String, Object> getPlainValueMap(int dependentLevels);
method getMasterValueMap (line 293) | Map<String, Object> getMasterValueMap(String name);
FILE: framework/src/main/java/org/moqui/entity/EntityValueNotFoundException.java
class EntityValueNotFoundException (line 16) | public class EntityValueNotFoundException extends EntityException {
method EntityValueNotFoundException (line 17) | public EntityValueNotFoundException(String str) {
FILE: framework/src/main/java/org/moqui/etl/FlatXmlExtractor.java
class FlatXmlExtractor (line 31) | public class FlatXmlExtractor implements SimpleEtl.Extractor {
method FlatXmlExtractor (line 37) | FlatXmlExtractor(ResourceReference xmlRef) { resourceRef = xmlRef; }
method extract (line 39) | @Override
class FlatXmlHandler (line 64) | private static class FlatXmlHandler extends DefaultHandler {
method FlatXmlHandler (line 74) | FlatXmlHandler(FlatXmlExtractor fxe) { extractor = fxe; }
method startElement (line 76) | @Override
method characters (line 99) | @Override
method endElement (line 106) | @Override
method setDocumentLocator (line 137) | @Override
FILE: framework/src/main/java/org/moqui/etl/SimpleEtl.java
class SimpleEtl (line 19) | @SuppressWarnings("unused")
method SimpleEtl (line 35) | public SimpleEtl(@Nonnull Extractor extractor, @Nonnull Loader loader) {
method addTransformer (line 42) | public SimpleEtl addTransformer(@Nonnull Transformer transformer) {
method addTransformer (line 48) | public SimpleEtl addTransformer(@Nonnull String type, @Nonnull Transfo...
method addConfiguration (line 54) | public SimpleEtl addConfiguration(TransformConfiguration config) {
method setConfiguration (line 61) | public SimpleEtl setConfiguration(TransformConfiguration config) {
method stopOnError (line 66) | public SimpleEtl stopOnError() { this.stopOnError = true; return this; }
method setTimeout (line 68) | public SimpleEtl setTimeout(Integer timeout) { this.timeout = timeout;...
method process (line 71) | public SimpleEtl process() {
method getExtractor (line 90) | public Extractor getExtractor() { return extractor; }
method getLoader (line 91) | public Loader getLoader() { return loader; }
method addMessage (line 93) | public SimpleEtl addMessage(String msg) { this.messages.add(msg); retu...
method getMessages (line 94) | public List<String> getMessages() { return Collections.unmodifiableLis...
method getExtractCount (line 95) | public int getExtractCount() { return extractCount; }
method getSkipCount (line 96) | public int getSkipCount() { return skipCount; }
method getLoadCount (line 97) | public int getLoadCount() { return loadCount; }
method getRunTime (line 98) | public long getRunTime() { return endTime - startTime; }
method getExtractException (line 100) | public Exception getExtractException() { return extractException; }
method getTransformErrors (line 101) | public List<EtlError> getTransformErrors() { return Collections.unmodi...
method getLoadErrors (line 102) | public List<EtlError> getLoadErrors() { return Collections.unmodifiabl...
method hasError (line 103) | public boolean hasError() { return extractException != null || transfo...
method getSingleErrorCause (line 104) | public Throwable getSingleErrorCause() {
method processEntry (line 116) | public boolean processEntry(Entry extractEntry) throws StopException {
class TransformConfiguration (line 150) | public static class TransformConfiguration {
method TransformConfiguration (line 156) | public TransformConfiguration() { }
method addTransformer (line 159) | public TransformConfiguration addTransformer(@Nonnull Transformer tr...
method addTransformer (line 166) | public TransformConfiguration addTransformer(@Nonnull String type, @...
method runTransformers (line 173) | void runTransformers(SimpleEtl etl, EntryTransform entryTransform, A...
method transformEntry (line 199) | void transformEntry(SimpleEtl etl, Transformer transformer, EntryTra...
method copyFrom (line 209) | void copyFrom(TransformConfiguration conf) {
class StopException (line 219) | public static class StopException extends Exception {
method StopException (line 220) | public StopException(Throwable t) { super(t); }
class EtlError (line 223) | public static class EtlError {
method EtlError (line 226) | EtlError(Entry entry, Throwable t) { this.entry = entry; this.error ...
type Entry (line 229) | public interface Entry {
method getEtlType (line 230) | String getEtlType();
method getEtlValues (line 231) | Map<String, Object> getEtlValues();
class SimpleEntry (line 233) | public static class SimpleEntry implements Entry {
method SimpleEntry (line 236) | public SimpleEntry(String type, Map<String, Object> values) { this.t...
method getEtlType (line 237) | @Override public String getEtlType() { return type; }
method getEtlValues (line 238) | @Override public Map<String, Object> getEtlValues() { return values; }
class EntryTransform (line 241) | public static class EntryTransform {
method EntryTransform (line 245) | EntryTransform(Entry entry) { this.entry = entry; }
method getEntry (line 247) | public Entry getEntry() { return entry; }
method loadCurrent (line 250) | public EntryTransform loadCurrent(boolean load) { loadCurrent = load...
method addEntry (line 252) | public EntryTransform addEntry(Entry newEntry) {
type Extractor (line 259) | public interface Extractor {
method extract (line 261) | void extract(SimpleEtl etl) throws Exception;
type Transformer (line 264) | public interface Transformer {
method transform (line 266) | void transform(EntryTransform entryTransform) throws Exception;
type Loader (line 268) | public interface Loader {
method init (line 270) | void init(Integer timeout);
method load (line 272) | void load(Entry entry) throws Exception;
method complete (line 274) | void complete(SimpleEtl etl);
FILE: framework/src/main/java/org/moqui/jcache/MCache.java
class MCache (line 38) | @SuppressWarnings("unused")
class WorkerThreadFactory (line 63) | private static class WorkerThreadFactory implements ThreadFactory {
method newThread (line 66) | @Override public Thread newThread(Runnable r) { return new Thread(wo...
method MCache (line 72) | public MCache(String name, CacheManager manager, Configuration<K, V> c...
method setMaxEntries (line 109) | public synchronized void setMaxEntries(int elements) {
method getMaxEntries (line 127) | public int getMaxEntries() { return evictRunnable != null ? evictRunna...
method getName (line 129) | @Override
method get (line 132) | @Override
method get (line 138) | public V get(K key, ExpiryPolicy policy) {
method get (line 145) | public V get(K key, long expireBeforeTime) {
method getEntry (line 151) | public MEntry<K, V> getEntry(final K key, final ExpiryPolicy policy) {...
method getEntryNoCheck (line 153) | public MEntry<K, V> getEntryNoCheck(K key) {
method getEntryInternal (line 166) | private MEntry<K, V> getEntryInternal(final K key, final ExpiryPolicy ...
method getCheckExpired (line 210) | private MEntry<K, V> getCheckExpired(K key) {
method getCheckExpired (line 221) | private MEntry<K, V> getCheckExpired(K key, long currentTime) {
method getAll (line 233) | @Override
method containsKey (line 243) | @Override
method put (line 249) | @Override
method getAndPut (line 263) | @Override
method putAll (line 281) | @Override
method putIfAbsent (line 286) | @Override
method remove (line 304) | @Override
method remove (line 315) | @Override
method getAndRemove (line 332) | @Override
method replace (line 345) | @Override
method replace (line 359) | @Override
method getAndReplace (line 373) | @Override
method removeAll (line 388) | @Override
method removeAll (line 394) | @Override
method clear (line 402) | @Override
method getConfiguration (line 409) | @Override
method loadAll (line 416) | @Override
method invoke (line 420) | @Override
method invokeAll (line 424) | @Override
method registerCacheEntryListener (line 428) | @Override
method deregisterCacheEntryListener (line 432) | @Override
method getCacheManager (line 437) | @Override
method close (line 440) | @Override
method isClosed (line 446) | @Override
method unwrap (line 449) | @Override
method iterator (line 455) | @Override
class CacheIterator (line 461) | private static class CacheIterator<K, V> implements Iterator<Entry<K, ...
method CacheIterator (line 469) | CacheIterator(MCache<K, V> mCache) {
method hasNext (line 476) | @Override
method next (line 479) | @Override
method remove (line 499) | @Override
method getEntryList (line 510) | public ArrayList<Entry<K, V>> getEntryList() {
method clearExpired (line 527) | public int clearExpired() {
method getStats (line 545) | public CacheStatisticsMXBean getStats() { return stats; }
method getMStats (line 546) | public MStats getMStats() { return stats; }
method size (line 547) | public int size() { return entryStore.size(); }
method getAccessDuration (line 549) | public Duration getAccessDuration() { return accessDuration; }
method getCreationDuration (line 550) | public Duration getCreationDuration() { return creationDuration; }
method getUpdateDuration (line 551) | public Duration getUpdateDuration() { return updateDuration; }
class EvictRunnable (line 553) | private static class EvictRunnable<K, V> implements Runnable {
method EvictRunnable (line 557) | EvictRunnable(MCache mc, int entries) { cache = mc; maxEntries = ent...
method run (line 558) | @Override
class AccessComparator (line 585) | private static class AccessComparator implements Comparator<MEntry> {
method compare (line 586) | @Override
FILE: framework/src/main/java/org/moqui/jcache/MCacheConfiguration.java
class MCacheConfiguration (line 19) | @SuppressWarnings("unused")
method MCacheConfiguration (line 21) | public MCacheConfiguration() {
method MCacheConfiguration (line 25) | public MCacheConfiguration(CompleteConfiguration<K, V> conf) {
method setMaxEntries (line 33) | public MCacheConfiguration<K, V> setMaxEntries(int elements) {
method getMaxEntries (line 37) | public int getMaxEntries() {
method setMaxCheckSeconds (line 42) | public MCacheConfiguration<K, V> setMaxCheckSeconds(long seconds) {
method getMaxCheckSeconds (line 47) | public long getMaxCheckSeconds() {
FILE: framework/src/main/java/org/moqui/jcache/MCacheManager.java
class MCacheManager (line 30) | public class MCacheManager implements CacheManager {
method getMCacheManager (line 34) | public static MCacheManager getMCacheManager() { return singleCacheMan...
method MCacheManager (line 42) | private MCacheManager() {
method getCachingProvider (line 48) | @Override
method getURI (line 50) | @Override
method getClassLoader (line 52) | @Override
method getProperties (line 54) | @Override
method createCache (line 57) | @Override
method getCache (line 71) | @Override
method getCache (line 77) | @Override
method getCacheNames (line 84) | @Override
method destroyCache (line 90) | @Override
method enableManagement (line 102) | @Override
method enableStatistics (line 105) | @Override
method close (line 109) | @Override
method isClosed (line 114) | @Override
method unwrap (line 117) | @Override
FILE: framework/src/main/java/org/moqui/jcache/MEntry.java
class MEntry (line 20) | public class MEntry<K, V> implements Cache.Entry<K, V> {
method MEntry (line 33) | MEntry(K key, V value) {
method MEntry (line 41) | MEntry(K key, V value, long createdTime) {
method getKey (line 49) | @Override
method getValue (line 54) | @Override
method unwrap (line 59) | @Override
method valueEquals (line 65) | boolean valueEquals(V otherValue) {
method setValue (line 73) | void setValue(V val, long updateTime) {
method setValueIfEquals (line 82) | boolean setValueIfEquals(V oldVal, V val, long updateTime) {
method getCreatedTime (line 94) | public long getCreatedTime() {
method getLastUpdatedTime (line 98) | public long getLastUpdatedTime() {
method getLastAccessTime (line 102) | public long getLastAccessTime() {
method getAccessCount (line 106) | public long getAccessCount() {
method isExpired (line 115) | @SuppressWarnings("unused")
method isExpired (line 121) | boolean isExpired(long accessTime, ExpiryPolicy policy) {
method isExpired (line 126) | boolean isExpired(Duration accessDuration, Duration creationDuration, ...
method isExpired (line 130) | boolean isExpired(long accessTime, Duration accessDuration, Duration c...
method hashCode (line 153) | @Override
method equals (line 158) | @Override
FILE: framework/src/main/java/org/moqui/jcache/MStats.java
class MStats (line 18) | public class MStats implements CacheStatisticsMXBean {
method clear (line 30) | @Override
method getCacheHits (line 41) | @Override
method getCacheHitPercentage (line 46) | @Override
method getCacheMisses (line 51) | @Override
method getCacheMissPercentage (line 56) | @Override
method getCacheGets (line 61) | @Override
method getCachePuts (line 66) | @Override
method getCacheRemovals (line 71) | @Override
method getCacheEvictions (line 76) | @Override
method getAverageGetTime (line 81) | @Override
method getAveragePutTime (line 86) | @Override
method getAverageRemoveTime (line 91) | @Override
method getCacheExpires (line 96) | public long getCacheExpires() {
method countRemoval (line 114) | void countRemoval() {
method countBulkRemoval (line 119) | void countBulkRemoval(long entries) {
method countExpire (line 123) | void countExpire() {
FILE: framework/src/main/java/org/moqui/resource/ClasspathResourceReference.java
class ClasspathResourceReference (line 22) | public class ClasspathResourceReference extends UrlResourceReference {
method ClasspathResourceReference (line 25) | public ClasspathResourceReference() { super(); }
method init (line 27) | @Override public ResourceReference init(String location) {
method createNew (line 44) | @Override public ResourceReference createNew(String location) {
method openStream (line 50) | @Override public InputStream openStream() {
method getExists (line 61) | @Override public boolean getExists() {
method getLocation (line 66) | @Override public String getLocation() { return "classpath://" + stripp...
FILE: framework/src/main/java/org/moqui/resource/ResourceReference.java
class ResourceReference (line 32) | public abstract class ResourceReference implements Serializable {
method init (line 39) | public abstract ResourceReference init(String location);
method createNew (line 41) | public abstract ResourceReference createNew(String location);
method getLocation (line 43) | public abstract String getLocation();
method openStream (line 44) | public abstract InputStream openStream();
method getOutputStream (line 45) | public abstract OutputStream getOutputStream();
method getText (line 46) | public abstract String getText();
method supportsAll (line 48) | public abstract boolean supportsAll();
method supportsUrl (line 49) | public abstract boolean supportsUrl();
method getUrl (line 50) | public abstract URL getUrl();
method supportsDirectory (line 52) | public abstract boolean supportsDirectory();
method isFile (line 53) | public abstract boolean isFile();
method isDirectory (line 54) | public abstract boolean isDirectory();
method supportsExists (line 56) | public abstract boolean supportsExists();
method getExists (line 57) | public abstract boolean getExists();
method supportsLastModified (line 59) | public abstract boolean supportsLastModified();
method getLastModified (line 60) | public abstract long getLastModified();
method supportsSize (line 62) | public abstract boolean supportsSize();
method getSize (line 63) | public abstract long getSize();
method supportsWrite (line 65) | public abstract boolean supportsWrite();
method putText (line 66) | public abstract void putText(String text);
method putStream (line 67) | public abstract void putStream(InputStream stream);
method move (line 68) | public abstract void move(String newLocation);
method makeDirectory (line 69) | public abstract ResourceReference makeDirectory(String name);
method makeFile (line 70) | public abstract ResourceReference makeFile(String name);
method delete (line 71) | public abstract boolean delete();
method getDirectoryEntries (line 74) | public abstract List<ResourceReference> getDirectoryEntries();
method putBytes (line 76) | public void putBytes(byte[] bytes) { putStream(new ByteArrayInputStrea...
method getUri (line 78) | public URI getUri() {
method getFileName (line 108) | public String getFileName() {
method getContentType (line 117) | public String getContentType() {
method isBinary (line 121) | public boolean isBinary() { return isBinaryContentType(getContentType(...
method isText (line 122) | public boolean isText() { return isTextContentType(getContentType()); }
method getParent (line 125) | public ResourceReference getParent() {
method findMatchingDirectory (line 141) | public ResourceReference findMatchingDirectory() {
method getChild (line 155) | public ResourceReference getChild(String childName) {
method getChildren (line 168) | public List<ResourceReference> getChildren() {
method findChildFile (line 177) | public ResourceReference findChildFile(String relativePath) {
method findChildDirectory (line 246) | public ResourceReference findChildDirectory(String relativePath) {
method internalFindChildDir (line 289) | private ResourceReference internalFindChildDir(ResourceReference direc...
method internalFindChildFile (line 328) | private ResourceReference internalFindChildFile(ResourceReference dire...
method getActualChildPath (line 365) | public String getActualChildPath() {
method walkChildTree (line 379) | public void walkChildTree(List<Map> allChildFileFlatList, List<Map> ch...
method walkChildFileTree (line 385) | private void walkChildFileTree(ResourceReference rootResource, String ...
method destroy (line 418) | public void destroy() { }
method toString (line 419) | @Override public String toString() {
method getSubContentRefByPath (line 424) | private Map<String, ResourceReference> getSubContentRefByPath() {
method isTextFilename (line 429) | public static boolean isTextFilename(String filename) {
method isBinaryFilename (line 434) | public static boolean isBinaryFilename(String filename) {
method getContentType (line 439) | public static String getContentType(String filename) {
method isTextContentType (line 448) | public static boolean isTextContentType(String contentType) {
method isBinaryContentType (line 470) | public static boolean isBinaryContentType(String contentType) {
method stripLocationPrefix (line 474) | public static String stripLocationPrefix(String location) {
method getLocationPrefix (line 488) | public static String getLocationPrefix(String location) {
method supportsVersion (line 499) | public boolean supportsVersion() { return false; }
method getVersion (line 500) | public Version getVersion(String versionName) { return null; }
method getCurrentVersion (line 501) | public Version getCurrentVersion() { return null; }
method getRootVersion (line 502) | public Version getRootVersion() { return null; }
method getVersionHistory (line 503) | public ArrayList<Version> getVersionHistory() { return new ArrayList<>...
method getNextVersions (line 504) | public ArrayList<Version> getNextVersions(String versionName) { return...
method openStream (line 505) | public InputStream openStream(String versionName) { return openStream(...
method getText (line 506) | public String getText(String versionName) { return getText(); }
class Version (line 508) | public static class Version {
method Version (line 512) | public Version(ResourceReference ref, String versionName, String pre...
method getRef (line 516) | public ResourceReference getRef() { return ref; }
method getVersionName (line 517) | public String getVersionName() { return versionName; }
method getPreviousVersionName (line 518) | public String getPreviousVersionName() { return previousVersionName; }
method getPreviousVersion (line 519) | public Version getPreviousVersion() { return ref.getVersion(previous...
method getNextVersions (line 520) | public ArrayList<Version> getNextVersions() { return ref.getNextVers...
method getUserId (line 521) | public String getUserId() { return userId; }
method getVersionDate (line 522) | public Timestamp getVersionDate() { return versionDate; }
method openStream (line 523) | public InputStream openStream() { return ref.openStream(versionName); }
method getText (line 524) | public String getText() { return ref.getText(versionName); }
method getMap (line 525) | public Map<String, Object> getMap() {
FILE: framework/src/main/java/org/moqui/resource/UrlResourceReference.java
class UrlResourceReference (line 29) | public class UrlResourceReference extends ResourceReference {
method UrlResourceReference (line 37) | public UrlResourceReference() { }
method UrlResourceReference (line 38) | public UrlResourceReference(File file) {
method init (line 45) | @Override
method getFile (line 82) | public File getFile() {
method createNew (line 90) | @Override public ResourceReference createNew(String location) {
method getLocation (line 96) | @Override public String getLocation() { return locationUrl.toString(); }
method openStream (line 98) | @Override public InputStream openStream() {
method getOutputStream (line 108) | @Override public OutputStream getOutputStream() {
method getText (line 124) | @Override public String getText() { return ObjectUtilities.getStreamTe...
method supportsAll (line 125) | @Override public boolean supportsAll() { return isFileProtocol; }
method supportsUrl (line 126) | @Override public boolean supportsUrl() { return true; }
method getUrl (line 128) | @Override public URL getUrl() { return locationUrl; }
method supportsDirectory (line 130) | @Override public boolean supportsDirectory() { return isFileProtocol; }
method isFile (line 131) | @Override public boolean isFile() {
method isDirectory (line 139) | @Override public boolean isDirectory() {
method getDirectoryEntries (line 147) | @Override public List<ResourceReference> getDirectoryEntries() {
method supportsExists (line 163) | @Override public boolean supportsExists() { return isFileProtocol || e...
method getExists (line 165) | @Override public boolean getExists() {
method supportsLastModified (line 178) | @Override public boolean supportsLastModified() { return isFileProtoco...
method getLastModified (line 179) | @Override public long getLastModified() {
method supportsSize (line 187) | @Override public boolean supportsSize() { return isFileProtocol; }
method getSize (line 188) | @Override public long getSize() { return isFileProtocol ? getFile().le...
method supportsWrite (line 190) | @Override public boolean supportsWrite() { return isFileProtocol; }
method putText (line 191) | @Override public void putText(String text) {
method putStream (line 211) | @Override public void putStream(InputStream stream) {
method move (line 231) | @Override public void move(final String newLocation) {
method makeDirectory (line 251) | @Override public ResourceReference makeDirectory(final String name) {
method makeFile (line 262) | @Override public ResourceReference makeFile(final String name) {
method delete (line 279) | @Override
FILE: framework/src/main/java/org/moqui/screen/ScreenFacade.java
type ScreenFacade (line 17) | public interface ScreenFacade {
method makeRender (line 20) | ScreenRender makeRender();
method makeTest (line 22) | ScreenTest makeTest();
FILE: framework/src/main/java/org/moqui/screen/ScreenRender.java
type ScreenRender (line 23) | public interface ScreenRender {
method rootScreen (line 28) | ScreenRender rootScreen(String screenLocation);
method rootScreenFromHost (line 35) | ScreenRender rootScreenFromHost(String host);
method screenPath (line 41) | ScreenRender screenPath(List<String> screenNameList);
method screenPath (line 42) | ScreenRender screenPath(String path);
method lastStandalone (line 45) | ScreenRender lastStandalone(String ls);
method renderMode (line 56) | ScreenRender renderMode(String outputType);
method encoding (line 63) | ScreenRender encoding(String characterEncoding);
method macroTemplate (line 70) | ScreenRender macroTemplate(String macroTemplateLocation);
method baseLinkUrl (line 77) | ScreenRender baseLinkUrl(String baseLinkUrl);
method servletContextPath (line 86) | ScreenRender servletContextPath(String scp);
method webappName (line 94) | ScreenRender webappName(String wan);
method saveHistory (line 97) | ScreenRender saveHistory(boolean sh);
method render (line 102) | void render(HttpServletRequest request, HttpServletResponse response);
method render (line 107) | void render(Writer writer);
method render (line 108) | void render(OutputStream os);
method render (line 111) | String render();
FILE: framework/src/main/java/org/moqui/screen/ScreenTest.java
type ScreenTest (line 21) | @SuppressWarnings("unused")
method rootScreen (line 24) | ScreenTest rootScreen(String screenLocation);
method baseScreenPath (line 26) | ScreenTest baseScreenPath(String screenPath);
method renderMode (line 29) | ScreenTest renderMode(String outputType);
method encoding (line 31) | ScreenTest encoding(String characterEncoding);
method macroTemplate (line 34) | ScreenTest macroTemplate(String macroTemplateLocation);
method baseLinkUrl (line 37) | ScreenTest baseLinkUrl(String baseLinkUrl);
method servletContextPath (line 39) | ScreenTest servletContextPath(String scp);
method webappName (line 41) | ScreenTest webappName(String wan);
method skipJsonSerialize (line 44) | ScreenTest skipJsonSerialize(boolean skip);
method getNoRequiredParameterPaths (line 47) | List<String> getNoRequiredParameterPaths(Set<String> screensToSkip);
method render (line 55) | ScreenTestRender render(String screenPath, Map<String, Object> paramet...
method renderAll (line 56) | void renderAll(List<String> screenPathList, Map<String, Object> parame...
method getRenderCount (line 58) | long getRenderCount();
method getErrorCount (line 59) | long getErrorCount();
method getRenderTotalChars (line 60) | long getRenderTotalChars();
method getStartTime (line 61) | long getStartTime();
type ScreenTestRender (line 63) | interface ScreenTestRender {
method getScreenRender (line 64) | ScreenRender getScreenRender();
method getOutput (line 65) | String getOutput();
method getJsonObject (line 66) | Object getJsonObject();
method getRenderTime (line 67) | long getRenderTime();
method getPostRenderContext (line 68) | Map getPostRenderContext();
method getErrorMessages (line 69) | List<String> getErrorMessages();
method assertContains (line 70) | boolean assertContains(String text);
method assertNotContains (line 71) | boolean assertNotContains(String text);
method assertRegex (line 72) | boolean assertRegex(String regex);
FILE: framework/src/main/java/org/moqui/service/ServiceCall.java
type ServiceCall (line 18) | public interface ServiceCall {
method getServiceName (line 19) | String getServiceName();
method getCurrentParameters (line 22) | Map<String, Object> getCurrentParameters();
FILE: framework/src/main/java/org/moqui/service/ServiceCallAsync.java
type ServiceCallAsync (line 20) | @SuppressWarnings("unused")
method name (line 26) | ServiceCallAsync name(String serviceName);
method name (line 28) | ServiceCallAsync name(String verb, String noun);
method name (line 30) | ServiceCallAsync name(String path, String verb, String noun);
method parameters (line 33) | ServiceCallAsync parameters(Map<String, Object> context);
method parameter (line 36) | ServiceCallAsync parameter(String name, Object value);
method distribute (line 46) | ServiceCallAsync distribute(boolean dist);
method call (line 52) | void call() throws ServiceException;
method callFuture (line 64) | Future<Map<String, Object>> callFuture() throws ServiceException;
method getRunnable (line 67) | Runnable getRunnable();
method getCallable (line 69) | Callable<Map<String, Object>> getCallable();
FILE: framework/src/main/java/org/moqui/service/ServiceCallJob.java
type ServiceCallJob (line 24) | @SuppressWarnings("unused")
method parameters (line 27) | ServiceCallJob parameters(Map<String, Object> context);
method parameter (line 29) | ServiceCallJob parameter(String name, Object value);
method localOnly (line 31) | ServiceCallJob localOnly(boolean local);
method run (line 46) | String run() throws ServiceException;
FILE: framework/src/main/java/org/moqui/service/ServiceCallSpecial.java
type ServiceCallSpecial (line 18) | @SuppressWarnings("unused")
method name (line 24) | ServiceCallSpecial name(String serviceName);
method name (line 26) | ServiceCallSpecial name(String verb, String noun);
method name (line 28) | ServiceCallSpecial name(String path, String verb, String noun);
method parameters (line 31) | ServiceCallSpecial parameters(Map<String, Object> context);
method parameter (line 34) | ServiceCallSpecial parameter(String name, Object value);
method registerOnCommit (line 38) | void registerOnCommit();
method registerOnRollback (line 41) | void registerOnRollback();
FILE: framework/src/main/java/org/moqui/service/ServiceCallSync.java
type ServiceCallSync (line 18) | @SuppressWarnings("unused")
method name (line 24) | ServiceCallSync name(String serviceName);
method name (line 26) | ServiceCallSync name(String verb, String noun);
method name (line 28) | ServiceCallSync name(String path, String verb, String noun);
method parameters (line 31) | ServiceCallSync parameters(Map<String, ?> context);
method parameter (line 34) | ServiceCallSync parameter(String name, Object value);
method ignoreTransaction (line 38) | ServiceCallSync ignoreTransaction(boolean ignoreTransaction);
method requireNewTransaction (line 45) | ServiceCallSync requireNewTransaction(boolean requireNewTransaction);
method transactionTimeout (line 47) | ServiceCallSync transactionTimeout(int timeout);
method useTransactionCache (line 65) | ServiceCallSync useTransactionCache(boolean useTransactionCache);
method ignorePreviousError (line 68) | ServiceCallSync ignorePreviousError(boolean ipe);
method softValidate (line 70) | ServiceCallSync softValidate(boolean sv);
method multi (line 76) | ServiceCallSync multi(boolean mlt);
method noRememberParameters (line 80) | ServiceCallSync noRememberParameters();
method disableAuthz (line 83) | ServiceCallSync disableAuthz();
method call (line 93) | Map<String, Object> call() throws ServiceException;
FILE: framework/src/main/java/org/moqui/service/ServiceCallback.java
type ServiceCallback (line 18) | public interface ServiceCallback {
method isEnabled (line 19) | boolean isEnabled();
method receiveEvent (line 20) | void receiveEvent(Map<String, Object> context, Map<String, Object> res...
method receiveEvent (line 21) | void receiveEvent(Map<String, Object> context, Throwable t);
FILE: framework/src/main/java/org/moqui/service/ServiceException.java
class ServiceException (line 19) | public class ServiceException extends org.moqui.BaseException {
method ServiceException (line 21) | public ServiceException(String str) {
method ServiceException (line 25) | public ServiceException(String str, Throwable nested) {
FILE: framework/src/main/java/org/moqui/service/ServiceFacade.java
type ServiceFacade (line 21) | @SuppressWarnings("unused")
method sync (line 25) | ServiceCallSync sync();
method async (line 28) | ServiceCallAsync async();
method job (line 35) | ServiceCallJob job(String jobName);
method special (line 38) | ServiceCallSpecial special();
method callJsonRpc (line 41) | Map<String, Object> callJsonRpc(String location, String method, Map<St...
method rest (line 44) | RestClient rest();
method registerCallback (line 51) | void registerCallback(String serviceName, ServiceCallback serviceCallb...
FILE: framework/src/main/java/org/moqui/util/CollectionUtilities.java
class CollectionUtilities (line 31) | @SuppressWarnings("unused")
class KeyValue (line 35) | public static class KeyValue {
method KeyValue (line 38) | public KeyValue(String key, Object value) { this.key = key; this.val...
method toHashMap (line 41) | public static HashMap<String, Object> toHashMap(Object... keyValues) {
method getMapArrayListValues (line 52) | public static ArrayList<Object> getMapArrayListValues(ArrayList<Map<Ob...
method filterMapList (line 66) | public static void filterMapList(List<Map> theList, Map<String, Object...
method filterMapList (line 70) | public static void filterMapList(List<Map> theList, Map<String, Object...
method checkRemove (line 102) | private static boolean checkRemove(Map curMap, String[] fieldNameArray...
method filterMapListByDate (line 114) | public static List<Map> filterMapListByDate(List<Map> theList, String ...
method filterMapListByDate (line 136) | public static void filterMapListByDate(List<Map> theList, String fromD...
method orderMapList (line 142) | public static List<Map<String, Object>> orderMapList(List<Map<String, ...
method orderMapList (line 145) | public static List<Map<String, Object>> orderMapList(List<Map<String, ...
class MapOrderByComparator (line 151) | public static class MapOrderByComparator implements Comparator<Map> {
method MapOrderByComparator (line 155) | public MapOrderByComparator(List<? extends CharSequence> fieldNameLi...
method nullsLast (line 174) | public MapOrderByComparator nullsLast(Boolean nl) {
method compare (line 179) | @SuppressWarnings("unchecked")
method equals (line 230) | @Override public boolean equals(Object obj) {
method toString (line 234) | @Override public String toString() { return Arrays.toString(fieldNam...
method findMaximalMatch (line 242) | public static Map<String, Object> findMaximalMatch(List<Map<String, Ob...
method addToListInMap (line 284) | @SuppressWarnings("unchecked")
method addToSetInMap (line 296) | @SuppressWarnings("unchecked")
method addToMapInMap (line 307) | @SuppressWarnings("unchecked")
method addToBigDecimalInMap (line 318) | @SuppressWarnings("unchecked")
method addBigDecimalsInMap (line 332) | public static void addBigDecimalsInMap(Map<String, Object> baseMap, Ma...
method divideBigDecimalsInMap (line 343) | public static void divideBigDecimalsInMap(Map<String, Object> baseMap,...
method stdDevMaxFromMapField (line 354) | public static Map<String, BigDecimal> stdDevMaxFromMapField(List<Map<S...
method findFieldNestedMap (line 383) | public static Object findFieldNestedMap(String key, Map theMap) {
method findAllFieldsNestedMap (line 403) | public static void findAllFieldsNestedMap(String key, Map theMap, Set<...
method flattenNestedMap (line 443) | @SuppressWarnings("unchecked")
method flattenNestedMapWithKeys (line 463) | public static Map<String, String> flattenNestedMapWithKeys(Map<String,...
method flattenNestedMapWithKeys (line 467) | @SuppressWarnings("unchecked")
method mergeNestedMap (line 496) | @SuppressWarnings("unchecked")
method removeNullsFromMap (line 544) | @SuppressWarnings("unchecked")
method mapMatchesFields (line 551) | public static boolean mapMatchesFields(Map<String, Object> baseMap, Ma...
method deepCopyNode (line 564) | public static Node deepCopyNode(Node original) { return deepCopyNode(o...
method deepCopyNode (line 566) | @SuppressWarnings("unchecked")
method nodeText (line 588) | public static String nodeText(Object nodeObj) {
method nodeChild (line 613) | public static Node nodeChild(Node parent, String childName) {
method paginateList (line 620) | public static void paginateList(String listName, String pageListName, ...
method paginateList (line 628) | public static List paginateList(List theList, String pageListName, Map...
method paginateParameters (line 641) | public static Map paginateParameters(int listSize, String pageListName...
FILE: framework/src/main/java/org/moqui/util/ContextBinding.java
class ContextBinding (line 18) | public class ContextBinding extends Binding {
method ContextBinding (line 20) | public ContextBinding(ContextStack variables) {
method getVariable (line 25) | @Override
method setV
Condensed preview — 336 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,273K chars).
[
{
"path": ".github/workflows/gradle-wrapper-validation.yml",
"chars": 223,
"preview": "name: \"Validate Gradle Wrapper\"\non: [push, pull_request]\n\njobs:\n validation:\n name: \"Validation\"\n runs-on: ubuntu"
},
{
"path": ".gitignore",
"chars": 1241,
"preview": "\n# gradle/build files\nbuild\n.gradle\n/framework/dependencies\n\n# build generated files\n/moqui*.war\n/Save*.zip\n\n# runtime d"
},
{
"path": ".travis.yml",
"chars": 229,
"preview": "language: groovy\n\njdk:\n - openjdk11\n\ninstall: true\n\nenv:\n - TERM=dumb\n\nscript:\n - ./gradlew getRuntime\n - ./gradlew "
},
{
"path": ".whitesource",
"chars": 194,
"preview": "{\n \"generalSettings\": {\n \"shouldScanRepo\": true\n },\n \"checkRunSettings\": {\n \"vulnerableCheckRunConclusionLevel\""
},
{
"path": "AUTHORS",
"chars": 5261,
"preview": "Moqui Framework (http://github.com/moqui/moqui)\n\nThis software is in the public domain under CC0 1.0 Universal plus a\nGr"
},
{
"path": "LICENSE.md",
"chars": 11128,
"preview": "Because of a lack of patent licensing in CC0 1.0 this software includes a\nseparate Grant of Patent License adapted from "
},
{
"path": "MoquiInit.properties",
"chars": 1237,
"preview": "# No copyright or license for configuration file, details here are not\n# considered a creative work.\n\n# This file is use"
},
{
"path": "Procfile",
"chars": 71,
"preview": "web: java -cp . MoquiStart port=5000 conf=conf/MoquiProductionConf.xml\n"
},
{
"path": "Procfile.README",
"chars": 467,
"preview": "No memory or other JVM options specified here so that the standard JAVA_TOOL_OPTIONS env var may be used (command line a"
},
{
"path": "README.md",
"chars": 2660,
"preview": "## Welcome to Moqui Framework\n\n[](https:/"
},
{
"path": "ReleaseNotes.md",
"chars": 77150,
"preview": "# Moqui Framework Release Notes\n\n## Release 4.0.0 - 27 Feb 2026\n\nMoqui framework v4.0.0 is a major new release with mass"
},
{
"path": "SECURITY.md",
"chars": 1869,
"preview": "# Security Policy\n\n## Supported Versions\n\nThe primary supported version for each repository is the latest commit in the "
},
{
"path": "addons.xml",
"chars": 10087,
"preview": "<addons default-repository=\"github\">\n <!--\n ========== MODIFYING THIS FILE NOT RECOMMENDED ==========\n\n Contain"
},
{
"path": "build.gradle",
"chars": 73348,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "build.xml",
"chars": 4696,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "docker/README.md",
"chars": 3050,
"preview": "# Moqui On Docker\n\nThis directory contains everything needed to deploy moqui on docker.\n\n## Prerequisites\n\n- Docker.\n- D"
},
{
"path": "docker/build-compose-up.sh",
"chars": 514,
"preview": "#! /bin/bash\n\nif [[ ! $1 ]]; then\n echo \"Usage: ./build-compose-up.sh <docker compose file> [<moqui directory like ..>]"
},
{
"path": "docker/clean.sh",
"chars": 397,
"preview": "#! /bin/bash\n\nsearch_name=opensearch\nif [ -d runtime/opensearch/bin ]; then search_name=opensearch;\nelif [ -d runtime/el"
},
{
"path": "docker/compose-down.sh",
"chars": 238,
"preview": "#! /bin/bash\n\nif [[ ! $1 ]]; then\n echo \"Usage: ./compose-down.sh <docker compose file>\"\n exit 1\nfi\n\nCOMP_FILE=\"${1}\"\n"
},
{
"path": "docker/compose-up.sh",
"chars": 1674,
"preview": "#! /bin/bash\n\nif [[ ! $1 ]]; then\n echo \"Usage: ./compose-up.sh <docker compose file> [<moqui directory like ..>] [<run"
},
{
"path": "docker/elasticsearch/data/README",
"chars": 113,
"preview": "This directory must exist for mapping otherwise created as root in container and elasticsearch cannot access it.\n"
},
{
"path": "docker/elasticsearch/moquiconfig/elasticsearch.yml",
"chars": 4074,
"preview": "# ======================== Elasticsearch Configuration =========================\n#\n# NOTE: Elasticsearch comes with reas"
},
{
"path": "docker/elasticsearch/moquiconfig/log4j2.properties",
"chars": 3987,
"preview": "status = info\n\n# log action execution errors for easier debugging\nlogger.action.name = org.elasticsearch.action\nlogger.a"
},
{
"path": "docker/kibana/kibana.yml",
"chars": 4652,
"preview": "# Kibana is served by a back end server. This setting specifies the port to use.\nserver.port: 5601\n\n# Specifies the addr"
},
{
"path": "docker/moqui-acme-postgres.yml",
"chars": 7183,
"preview": "# A Docker Compose application with Moqui, Postgres, OpenSearch, OpenSearch Dashboards, and virtual hosting through\n# ng"
},
{
"path": "docker/moqui-cluster1-compose.yml",
"chars": 9089,
"preview": "# NOTE: ElasticSearch uses odd user and directory setup for externally mapped data, etc directories, see:\n# https://www."
},
{
"path": "docker/moqui-mysql-compose.yml",
"chars": 6110,
"preview": "# A Docker Compose application with Moqui, MySQL, OpenSearch, OpenSearch Dashboards, and virtual hosting through\n# nginx"
},
{
"path": "docker/moqui-postgres-compose.yml",
"chars": 5777,
"preview": "# A Docker Compose application with Moqui, Postgres, OpenSearch, OpenSearch Dashboards, and virtual hosting through\n# ng"
},
{
"path": "docker/moqui-run.sh",
"chars": 1632,
"preview": "#! /bin/bash\n\necho \"Usage: moqui-run.sh [<moqui directory like ..>] [<group/name:tag>] [<runtime image like eclipse-temu"
},
{
"path": "docker/mysql-compose.yml",
"chars": 3440,
"preview": "# A Docker Compose application with Moqui, MySQL, OpenSearch, OpenSearch Dashboards, and virtual hosting through\n# nginx"
},
{
"path": "docker/nginx/my_proxy.conf",
"chars": 853,
"preview": "client_max_body_size 20M;\n\nproxy_connect_timeout 3600s;\nproxy_read_timeout 3600s;\nproxy_send_timeout 3600s;\n\n# NOTE: thi"
},
{
"path": "docker/opensearch/data/nodes/README",
"chars": 110,
"preview": "This directory must exist for mapping otherwise created as root in container and opensearch cannot access it.\n"
},
{
"path": "docker/postgres-compose.yml",
"chars": 3446,
"preview": "# A Docker Compose application with Moqui, Postgres, OpenSearch, OpenSearch Dashboards, and virtual hosting through\n# ng"
},
{
"path": "docker/postgres_backup.sh",
"chars": 3043,
"preview": "#!/bin/bash\n\n# This is a simple script to do a rotating backup of PostgreSQL (default once per day, retain 30 days)\n# Fo"
},
{
"path": "docker/simple/Dockerfile",
"chars": 2606,
"preview": "# Builds a minimal docker image with openjdk and moqui with various volumes for configuration and persisted data outside"
},
{
"path": "docker/simple/docker-build.sh",
"chars": 1487,
"preview": "#! /bin/bash\n\necho \"Usage: docker-build.sh [<moqui directory like ../..>] [<group/name:tag>] [<runtime image like eclips"
},
{
"path": "framework/build.gradle",
"chars": 11515,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/data/CommonL10nData.xml",
"chars": 6829,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/data/CurrencyData.xml",
"chars": 21119,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/data/EntityTypeData.xml",
"chars": 2494,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/data/GeoCountryData.xml",
"chars": 33388,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/data/MoquiSetupData.xml",
"chars": 11101,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/data/SecurityTypeData.xml",
"chars": 4430,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/data/UnitData.xml",
"chars": 50048,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/entity/BasicEntities.xml",
"chars": 57120,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/entity/EntityEntities.xml",
"chars": 26572,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/entity/OlapEntities.xml",
"chars": 2094,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/entity/ResourceEntities.xml",
"chars": 12173,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/entity/Screen.eecas.xml",
"chars": 2125,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a \nGrant "
},
{
"path": "framework/entity/ScreenEntities.xml",
"chars": 36946,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/entity/SecurityEntities.xml",
"chars": 40154,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/entity/ServerEntities.xml",
"chars": 25836,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/entity/ServiceEntities.xml",
"chars": 35797,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/entity/TestEntities.xml",
"chars": 3730,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a \nGrant "
},
{
"path": "framework/screen/AddedEmailAuthcFactor.xml",
"chars": 1225,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/screen/EmailAuthcFactorSent.xml",
"chars": 1109,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/screen/NotificationEmail.xml",
"chars": 2308,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/screen/PasswordReset.xml",
"chars": 1480,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/screen/ScreenRenderEmail.xml",
"chars": 2966,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/screen/SingleUseCode.xml",
"chars": 1100,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/service/org/moqui/EmailServices.xml",
"chars": 4994,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/service/org/moqui/EntityServices.xml",
"chars": 3806,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/service/org/moqui/SmsServices.xml",
"chars": 1784,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/service/org/moqui/impl/BasicServices.xml",
"chars": 13068,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/service/org/moqui/impl/ElFinderServices.xml",
"chars": 2088,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/service/org/moqui/impl/EmailServices.xml",
"chars": 6037,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/service/org/moqui/impl/EntityServices.xml",
"chars": 24292,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/service/org/moqui/impl/EntitySyncServices.xml",
"chars": 18741,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/service/org/moqui/impl/GoogleServices.xml",
"chars": 2588,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/service/org/moqui/impl/InstanceServices.xml",
"chars": 50327,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/service/org/moqui/impl/PrintServices.xml",
"chars": 10823,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/service/org/moqui/impl/ScreenServices.xml",
"chars": 27465,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/service/org/moqui/impl/ServerServices.xml",
"chars": 8294,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/service/org/moqui/impl/ServiceServices.xml",
"chars": 1760,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/service/org/moqui/impl/SystemMessageServices.xml",
"chars": 30023,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/service/org/moqui/impl/UserServices.xml",
"chars": 62688,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/service/org/moqui/impl/WikiServices.xml",
"chars": 67591,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a \nGrant "
},
{
"path": "framework/service/org/moqui/search/ElasticSearchServices.xml",
"chars": 983,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/service/org/moqui/search/SearchServices.xml",
"chars": 22388,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThis software is in the public domain under CC0 1.0 Universal plus a\nGrant o"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/actions/XmlAction.java",
"chars": 5553,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/ArtifactExecutionFacadeImpl.groovy",
"chars": 43504,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n * \n * To the ext"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/ArtifactExecutionInfoImpl.java",
"chars": 31639,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/CacheFacadeImpl.groovy",
"chars": 15513,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/ContextJavaUtil.java",
"chars": 42366,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/ElasticFacadeImpl.groovy",
"chars": 53292,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/ExecutionContextFactoryImpl.groovy",
"chars": 104124,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/ExecutionContextImpl.java",
"chars": 13052,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/L10nFacadeImpl.java",
"chars": 21127,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/LoggerFacadeImpl.groovy",
"chars": 3310,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/MessageFacadeImpl.groovy",
"chars": 9611,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/NotificationMessageImpl.groovy",
"chars": 25646,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/ResourceFacadeImpl.groovy",
"chars": 31858,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/TransactionCache.groovy",
"chars": 24278,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/TransactionFacadeImpl.groovy",
"chars": 34884,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/TransactionInternalBitronix.groovy",
"chars": 7696,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/UserFacadeImpl.groovy",
"chars": 58829,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/WebFacadeImpl.groovy",
"chars": 79147,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n * \n * To the ext"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/reference/BaseResourceReference.java",
"chars": 2766,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/reference/ComponentResourceReference.java",
"chars": 3439,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/reference/ContentResourceReference.groovy",
"chars": 10553,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/reference/DbResourceReference.groovy",
"chars": 20160,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/reference/WrapperResourceReference.groovy",
"chars": 2677,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/renderer/FtlMarkdownTemplateRenderer.groovy",
"chars": 4669,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/renderer/FtlTemplateRenderer.java",
"chars": 11497,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/renderer/GStringTemplateRenderer.groovy",
"chars": 3730,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/renderer/MarkdownTemplateRenderer.groovy",
"chars": 5338,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/renderer/NoTemplateRenderer.groovy",
"chars": 1314,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/runner/GroovyScriptRunner.groovy",
"chars": 2444,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/runner/JavaxScriptRunner.groovy",
"chars": 3484,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/context/runner/XmlActionsScriptRunner.groovy",
"chars": 3424,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/AggregationUtil.java",
"chars": 18344,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/EntityCache.groovy",
"chars": 31397,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/EntityConditionFactoryImpl.groovy",
"chars": 29917,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/EntityDataDocument.groovy",
"chars": 40317,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/EntityDataFeed.groovy",
"chars": 50653,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/EntityDataLoaderImpl.groovy",
"chars": 57471,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/EntityDataWriterImpl.groovy",
"chars": 20282,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/EntityDatasourceFactoryImpl.groovy",
"chars": 7155,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/EntityDbMeta.groovy",
"chars": 72941,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/EntityDefinition.groovy",
"chars": 67130,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/EntityDynamicViewImpl.groovy",
"chars": 6352,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/EntityEcaRule.groovy",
"chars": 7755,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/EntityFacadeImpl.groovy",
"chars": 123420,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n * \n * To the ext"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/EntityFindBase.groovy",
"chars": 78900,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/EntityFindBuilder.java",
"chars": 47092,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/EntityFindImpl.java",
"chars": 9633,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/EntityJavaUtil.java",
"chars": 41566,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/EntityListImpl.java",
"chars": 29550,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/EntityListIteratorImpl.java",
"chars": 16356,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/EntityListIteratorWrapper.java",
"chars": 7535,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/EntityQueryBuilder.java",
"chars": 12356,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/EntitySqlException.groovy",
"chars": 5074,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n * \n * To the ext"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/EntityValueBase.java",
"chars": 99885,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/EntityValueImpl.java",
"chars": 12463,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/FieldInfo.java",
"chars": 35832,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/condition/BasicJoinCondition.java",
"chars": 6130,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/condition/ConditionAlias.java",
"chars": 4889,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/condition/ConditionField.java",
"chars": 2899,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/condition/DateCondition.groovy",
"chars": 5350,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/condition/EntityConditionImplBase.java",
"chars": 901,
"preview": "package org.moqui.impl.entity.condition;\n\nimport org.moqui.entity.EntityCondition;\nimport org.moqui.impl.entity.EntityDe"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/condition/FieldToFieldCondition.groovy",
"chars": 7054,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/condition/FieldValueCondition.java",
"chars": 15594,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/condition/ListCondition.java",
"chars": 9366,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/condition/TrueCondition.java",
"chars": 2294,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/condition/WhereCondition.groovy",
"chars": 3614,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/elastic/ElasticDatasourceFactory.groovy",
"chars": 10429,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/elastic/ElasticEntityFind.java",
"chars": 11256,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/elastic/ElasticEntityListIterator.java",
"chars": 24178,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/elastic/ElasticEntityValue.java",
"chars": 6362,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/entity/elastic/ElasticSynchronization.groovy",
"chars": 2326,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/screen/ScreenDefinition.groovy",
"chars": 74953,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/screen/ScreenFacadeImpl.groovy",
"chars": 26790,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n * \n * To the ext"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/screen/ScreenForm.groovy",
"chars": 157311,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/screen/ScreenRenderImpl.groovy",
"chars": 138474,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/screen/ScreenSection.groovy",
"chars": 7109,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/screen/ScreenTestImpl.groovy",
"chars": 15106,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/screen/ScreenTree.groovy",
"chars": 11351,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/screen/ScreenUrlInfo.groovy",
"chars": 66401,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/screen/ScreenWidgetRender.java",
"chars": 665,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/screen/ScreenWidgetRenderFtl.groovy",
"chars": 1121,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/screen/ScreenWidgets.groovy",
"chars": 1246,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/screen/WebFacadeStub.groovy",
"chars": 26366,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/service/EmailEcaRule.groovy",
"chars": 5926,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/service/ParameterInfo.java",
"chars": 17792,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/service/RestApi.groovy",
"chars": 46756,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/service/ScheduledJobRunner.groovy",
"chars": 17364,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n * \n * To the ext"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/service/ServiceCallAsyncImpl.groovy",
"chars": 8480,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/service/ServiceCallImpl.java",
"chars": 5675,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/service/ServiceCallJobImpl.groovy",
"chars": 17200,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/service/ServiceCallSpecialImpl.groovy",
"chars": 8494,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/service/ServiceCallSyncImpl.java",
"chars": 38185,
"preview": "package org.moqui.impl.service;\n\nimport groovy.lang.Closure;\nimport org.moqui.BaseException;\nimport org.moqui.context.*;"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/service/ServiceDefinition.java",
"chars": 46017,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/service/ServiceEcaRule.groovy",
"chars": 6798,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/service/ServiceFacadeImpl.groovy",
"chars": 47946,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n * \n * To the ext"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/service/ServiceJsonRpcDispatcher.groovy",
"chars": 5650,
"preview": "package org.moqui.impl.service\n\nimport groovy.transform.CompileStatic\n\n/*\n * This software is in the public domain under"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/service/ServiceRunner.groovy",
"chars": 818,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/service/runner/EntityAutoServiceRunner.groovy",
"chars": 32628,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/service/runner/InlineServiceRunner.java",
"chars": 2991,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/service/runner/JavaServiceRunner.groovy",
"chars": 4333,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/service/runner/RemoteJsonRpcServiceRunner.groovy",
"chars": 4660,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/service/runner/RemoteRestServiceRunner.groovy",
"chars": 3738,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/service/runner/ScriptServiceRunner.java",
"chars": 3451,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/tools/H2ServerToolFactory.groovy",
"chars": 3402,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/tools/JCSCacheToolFactory.groovy",
"chars": 2503,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/tools/JackrabbitRunToolFactory.groovy",
"chars": 4685,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/tools/MCacheToolFactory.java",
"chars": 1849,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/tools/SubEthaSmtpToolFactory.groovy",
"chars": 6863,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/util/EdiHandler.groovy",
"chars": 24492,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/util/ElFinderConnector.groovy",
"chars": 13397,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/util/ElasticSearchLogger.groovy",
"chars": 11247,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/util/JdbcExtractor.java",
"chars": 3520,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/util/MoquiShiroRealm.groovy",
"chars": 24616,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/util/RestSchemaUtil.groovy",
"chars": 47826,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/util/SimpleSgmlReader.groovy",
"chars": 6307,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/util/SimpleSigner.java",
"chars": 3177,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/webapp/ElasticRequestLogFilter.groovy",
"chars": 13427,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/webapp/GroovyShellEndpoint.groovy",
"chars": 8404,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/webapp/MoquiAbstractEndpoint.groovy",
"chars": 5354,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a\n * Grant of Patent License.\n *\n * To the exte"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/webapp/MoquiAuthFilter.groovy",
"chars": 3945,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
},
{
"path": "framework/src/main/groovy/org/moqui/impl/webapp/MoquiContextListener.groovy",
"chars": 12500,
"preview": "/*\n * This software is in the public domain under CC0 1.0 Universal plus a \n * Grant of Patent License.\n * \n * To the ex"
}
]
// ... and 136 more files (download for full content)
About this extraction
This page contains the full source code of the moqui/moqui-framework GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 336 files (4.8 MB), approximately 1.3M tokens, and a symbol index with 2780 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.