Full Code of liferay/liferay-docs for AI

master 23b94b964916 cached
2539 files
72.3 MB
5.4M tokens
9593 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (21,634K chars total). Download the full file to get everything.
Repository: liferay/liferay-docs
Branch: master
Commit: 23b94b964916
Files: 2539
Total size: 72.3 MB

Directory structure:
gitextract_40y6mjuc/

├── .gitattributes
├── .gitignore
├── README.markdown
├── bin/
│   ├── convert-markdown.sh
│   ├── convert.bat
│   ├── convert.sh
│   ├── migrate.py
│   ├── update-liferay-learn-links.sh
│   ├── update-markdown-sidebar-syntax-win.sh
│   └── update-markdown-sidebar-syntax.sh
├── book/
│   ├── developer/
│   │   ├── appdev.aux
│   │   ├── appdev.tex
│   │   ├── customization.aux
│   │   ├── customization.tex
│   │   ├── frameworks.aux
│   │   ├── frameworks.tex
│   │   ├── publish.tex
│   │   ├── reference.aux
│   │   ├── reference.tex
│   │   ├── tutorials.aux
│   │   └── tutorials.tex
│   ├── developing-liferay-dxp-72.tex
│   ├── readme.md
│   ├── user/
│   │   ├── deployment.aux
│   │   ├── deployment.tex
│   │   ├── user.aux
│   │   └── user.tex
│   └── using-liferay-dxp-72.tex
├── build-common.xml
├── build.properties
├── build.xml
├── code/
│   ├── liferay-book-utils/
│   │   ├── .pydevproject
│   │   └── src/
│   │       ├── fix-latex.py
│   │       ├── format-ebook.py
│   │       └── merge-books.py
│   ├── liferay-doc-utils/
│   │   ├── .gitignore
│   │   ├── build.xml
│   │   ├── lib/
│   │   │   ├── ant-1-8-2.jar
│   │   │   ├── com.liferay.knowledge.base.markdown.converter.api.jar
│   │   │   ├── com.liferay.knowledge.base.markdown.converter.impl.jar
│   │   │   ├── commons-io-2.0.1.jar
│   │   │   ├── freemarker.jar
│   │   │   ├── jaxen-1.1.6.jar
│   │   │   ├── jdom-2.0.6.jar
│   │   │   ├── one-jar-appgen-0.97.jar
│   │   │   ├── serializer-2.7.2.jar
│   │   │   ├── xalan-2.7.2.jar
│   │   │   ├── xercesImpl.jar
│   │   │   └── xml-apis.jar
│   │   └── src/
│   │       └── com/
│   │           └── liferay/
│   │               └── documentation/
│   │                   ├── movedclassreporter/
│   │                   │   ├── BasicClassInfo.java
│   │                   │   ├── MovedClassInfo.java
│   │                   │   ├── MovedClassReporterMain.java
│   │                   │   ├── TemplateProcessor.java
│   │                   │   └── dependencies/
│   │                   │       └── moved-classes.ftl
│   │                   └── util/
│   │                       ├── AddTOCTask.java
│   │                       ├── CheckArticleImagesTask.java
│   │                       ├── CheckHeadersTask.java
│   │                       ├── CheckImageUtil.java
│   │                       ├── CheckImagesTask.java
│   │                       ├── CheckIntrosTask.java
│   │                       ├── CheckLatestCommitTask.java
│   │                       ├── CheckLinksTask.java
│   │                       ├── CleanImages.java
│   │                       ├── ConcatMarkdownTask.java
│   │                       ├── ConvertHeadersTask.java
│   │                       ├── ConvertLinksTask.java
│   │                       ├── ConvertSidebarsTask.java
│   │                       ├── DistDiffTask.java
│   │                       ├── DocsUtil.java
│   │                       ├── FindParentIntros.java
│   │                       ├── GitCompare.java
│   │                       ├── MarkdownToHtml.java
│   │                       ├── NumberHeadersTask.java
│   │                       └── NumberImagesTask.java
│   └── sample-content-portlet-lr-workspace/
│       ├── .gitignore
│       ├── build.gradle
│       ├── configs/
│       │   ├── common/
│       │   │   └── .touch
│       │   ├── dev/
│       │   │   └── portal-ext.properties
│       │   ├── local/
│       │   │   └── portal-ext.properties
│       │   ├── prod/
│       │   │   ├── osgi/
│       │   │   │   └── configs/
│       │   │   │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.cfg
│       │   │   └── portal-ext.properties
│       │   └── uat/
│       │       ├── osgi/
│       │       │   └── configs/
│       │       │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.cfg
│       │       └── portal-ext.properties
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       ├── modules/
│       │   ├── .touch
│       │   └── com.liferay.docs.samplecontent/
│       │       ├── README.markdown
│       │       ├── bnd.bnd
│       │       ├── build.gradle
│       │       └── src/
│       │           └── main/
│       │               ├── java/
│       │               │   └── com/
│       │               │       └── liferay/
│       │               │           └── docs/
│       │               │               └── samplecontent/
│       │               │                   └── portlet/
│       │               │                       └── SampleContentPortlet.java
│       │               └── resources/
│       │                   ├── META-INF/
│       │                   │   └── resources/
│       │                   │       ├── init.jsp
│       │                   │       └── view.jsp
│       │                   ├── content/
│       │                   │   └── Language.properties
│       │                   ├── organizations.json
│       │                   ├── user-groups.json
│       │                   └── users.json
│       ├── settings.gradle
│       └── themes/
│           └── .touch
├── copyright.txt
├── en/
│   ├── build.xml
│   ├── deployment/
│   │   ├── articles/
│   │   │   ├── 01-deploying-liferay/
│   │   │   │   ├── 01-deploying-liferay-intro.markdown
│   │   │   │   ├── 02-obtaining-liferay.markdown
│   │   │   │   ├── 03-preparing-for-install.markdown
│   │   │   │   ├── 04-installing-liferay.markdown
│   │   │   │   ├── 05-installing-liferay-on-tomcat.markdown
│   │   │   │   ├── 06-installing-liferay-portal-on-wildfly.markdown
│   │   │   │   ├── 12-setting-up-marketplace-and-portal-security.markdown
│   │   │   │   └── 14-document-repository-configuration/
│   │   │   │       ├── 00-document-repository-configuration-intro.markdown
│   │   │   │       ├── 01-using-simple-file-system-store.markdown
│   │   │   │       ├── 02-using-advanced-file-system-store.markdown
│   │   │   │       ├── 03-using-s3-store.markdown
│   │   │   │       └── 04-using-the-dbstore.markdown
│   │   │   ├── 02-configuring-liferay/
│   │   │   │   ├── 01-configuring-liferay-portal-intro.markdown
│   │   │   │   ├── 02-configuring-mail.markdown
│   │   │   │   ├── 03-locales-and-encoding.markdown
│   │   │   │   ├── 04-liferay-portal-clustering/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   ├── 02-point-all-nodes-to-the-same-liferay-portal-database.markdown
│   │   │   │   │   ├── 03-configure-documents-and-media-the-same-for-all-nodes.markdown
│   │   │   │   │   ├── 04-clustering-search.markdown
│   │   │   │   │   ├── 05-enabling-cluster-link.markdown
│   │   │   │   │   └── 06-auto-deploy-to-all-nodes.markdown
│   │   │   │   ├── 05-updating-a-cluster/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   ├── 02-using-rolling-restarts.markdown
│   │   │   │   │   └── 03-other-cluster-update-techniques.markdown
│   │   │   │   ├── 06-configuring-remote-staging-clustered.markdown
│   │   │   │   └── 07-content-delivery-network.markdown
│   │   │   ├── 03-installing-a-search-engine/
│   │   │   │   ├── 01-intro.markdown
│   │   │   │   ├── 02-elasticsearch/
│   │   │   │   │   ├── 01-elasticsearch-intro.markdown
│   │   │   │   │   ├── 02-preparing-to-install.markdown
│   │   │   │   │   ├── 03-installing-elasticsearch.markdown
│   │   │   │   │   ├── 04-configuring-the-connector.markdown
│   │   │   │   │   ├── 05-advanced-configuration.markdown
│   │   │   │   │   ├── 06-elasticsearch-connector-settings-reference.markdown
│   │   │   │   │   ├── 07-security.markdown
│   │   │   │   │   ├── 08-backing-up-es.markdown
│   │   │   │   │   ├── 09-upgrading-to-elasticsearch_65.markdown
│   │   │   │   │   ├── 10-upgrading-to-elasticsearch_68.markdown
│   │   │   │   │   └── 11-upgrading-to-elasticsearch-73.markdown
│   │   │   │   └── 03-solr/
│   │   │   │       ├── 01-installing-solr-intro.markdown
│   │   │   │       ├── 02-installing-solr-basic.markdown
│   │   │   │       ├── 03-installing-solr-solrcloud.markdown
│   │   │   │       └── 04-solr-settings.markdown
│   │   │   ├── 04-securing-liferay/
│   │   │   │   ├── 01-liferay-security-intro.markdown
│   │   │   │   ├── 02-logging-in-to-liferay.markdown
│   │   │   │   ├── 03-service-access-policies.markdown
│   │   │   │   ├── 04-auth-verifiers.markdown
│   │   │   │   ├── 05-ldap/
│   │   │   │   │   ├── 01-ldap-servers-intro.markdown
│   │   │   │   │   └── 02-configuring-ldap.markdown
│   │   │   │   ├── 06-token-based-authentication.markdown
│   │   │   │   ├── 07-openid-connect-authentication.markdown
│   │   │   │   ├── 08-openam-authentication.markdown
│   │   │   │   ├── 09-cas-authentication.markdown
│   │   │   │   ├── 11-ntlm-authentication.markdown
│   │   │   │   ├── 12-openid-authentication.markdown
│   │   │   │   ├── 13-kerberos.markdown
│   │   │   │   ├── 14-cors.markdown
│   │   │   │   ├── 15-antisamy.markdown
│   │   │   │   └── 15-oauth2/
│   │   │   │       ├── 01-oauth2-intro.markdown
│   │   │   │       ├── 02-scopes.markdown
│   │   │   │       └── 03-authorizing-access.markdown
│   │   │   ├── 05-upgrading-to-liferay-7-2/
│   │   │   │   ├── 01-upgrading-to-liferay-7-2-intro.markdown
│   │   │   │   ├── 02-planning-for-deprecated-apps.markdown
│   │   │   │   ├── 03-test-ugrading-a-liferay-backup-copy/
│   │   │   │   │   ├── 01-test-upgrading-a-liferay-backup-copy-intro.markdown
│   │   │   │   │   ├── 02-pruning-the-database.markdown
│   │   │   │   │   ├── 03-example-removing-intermediate-journal-article-versions.markdown
│   │   │   │   │   └── 04-upgrading-your-test-server-and-database.markdown
│   │   │   │   ├── 04-preparing-to-upgrade-the-liferay-database.markdown
│   │   │   │   ├── 05-preparing-a-new-liferay-server.markdown
│   │   │   │   ├── 06-upgrading-the-liferay-database/
│   │   │   │   │   ├── 01-upgrading-the-liferay-database-intro.markdown
│   │   │   │   │   ├── 02-tuning-for-the-data-upgrade.markdown
│   │   │   │   │   ├── 03-configuring-the-data-upgrade.markdown
│   │   │   │   │   ├── 04-upgrading-the-core-using-the-upgrade-tool.markdown
│   │   │   │   │   └── 05-upgrading-modules-using-gogo-shell.markdown
│   │   │   │   ├── 07-executing-post-upgrade-tasks.markdown
│   │   │   │   ├── 08-upgrading-a-sharded-environment.markdown
│   │   │   │   ├── 09-migrating-from-audience-targeting/
│   │   │   │   │   ├── 01-migrating-from-audience-targeting-intro.markdown
│   │   │   │   │   ├── 02-migrating-user-segments.markdown
│   │   │   │   │   └── 03-manually-migrating-from-audience-targeting.markdown
│   │   │   │   ├── 98-deprecated-apps-in-7-2-what-to-do.markdown
│   │   │   │   └── 99-apps-in-maintenance-mode.markdown
│   │   │   ├── 06-maintaining-liferay/
│   │   │   │   ├── 01-maintaining-liferay-intro.markdown
│   │   │   │   └── 02-backing-up-a-liferay-installation.markdown
│   │   │   ├── 07-monitoring-liferay/
│   │   │   │   ├── 01-monitoring-liferay-intro.markdown
│   │   │   │   └── 02-monitoring-gc-and-the-jvm.markdown
│   │   │   ├── 100-reference/
│   │   │   │   ├── 01-deployment-reference-intro.markdown
│   │   │   │   ├── 02-liferay-home.markdown
│   │   │   │   ├── 03-portal-properties.markdown
│   │   │   │   ├── 04-system-properties.markdown
│   │   │   │   └── 05-database-templates.markdown
│   │   │   └── 99-troubleshooting-deployments/
│   │   │       ├── 01-troubleshooting-deployments-intro.markdown
│   │   │       ├── database-not-ready.markdown
│   │   │       ├── sort-order-changed-with-different-database.markdown
│   │   │       └── using-files-to-config-components.markdown
│   │   ├── articles-dxp/
│   │   │   ├── 01-deploying-liferay/
│   │   │   │   ├── 07-installing-liferay-portal-on-jboss-eap.markdown
│   │   │   │   ├── 08-installing-liferay-on-weblogic.markdown
│   │   │   │   ├── 09-installing-liferay-on-websphere.markdown
│   │   │   │   ├── 11-activating-liferay-dxp.markdown
│   │   │   │   └── 13-trial-plugin-installation.markdown
│   │   │   ├── 02-configuring-liferay/
│   │   │   │   ├── 04-liferay-portal-clustering/
│   │   │   │   │   └── 04-clustering-search.markdown
│   │   │   │   └── 08-dxp-configuration-and-tuning/
│   │   │   │       ├── 01-intro.markdown
│   │   │   │       └── 02-jvm-tuning.markdown
│   │   │   ├── 03-installing-a-search-engine/
│   │   │   │   └── 03-enterprise-search/
│   │   │   │       ├── 01-les-intro.markdown
│   │   │   │       ├── 02-monitoring/
│   │   │   │       │   └── 01-monitoring-intro.markdown
│   │   │   │       └── 03-ltr/
│   │   │   │           ├── 01-learning-to-rank-intro.markdown
│   │   │   │           └── 02-configuring-learning-to-rank.markdown
│   │   │   ├── 04-securing-liferay/
│   │   │   │   └── 10-saml/
│   │   │   │       ├── 01-intro.markdown
│   │   │   │       ├── 02-setting-up-identity-provider.markdown
│   │   │   │       ├── 03-registering-a-service-provider.markdown
│   │   │   │       ├── 04-setting-up-service-provider.markdown
│   │   │   │       ├── 05-configuring-sp-and-idp-connections.markdown
│   │   │   │       └── 06-configuring-saml.markdown
│   │   │   ├── 06-maintaining-liferay/
│   │   │   │   └── 01-patching-liferay-dxp/
│   │   │   │       ├── 01-patching-liferay-dxp-intro.markdown
│   │   │   │       ├── 02-patching-basics/
│   │   │   │       │   └── 01-patching-basics-intro.markdown
│   │   │   │       ├── 03-using-the-patching-tool/
│   │   │   │       │   ├── 01-using-the-patching-tool-intro.markdown
│   │   │   │       │   ├── 02-installing-patches.markdown
│   │   │   │       │   └── 03-working-with-patches.markdown
│   │   │   │       ├── 04-configuring-the-patching-tool/
│   │   │   │       │   ├── 01-configuring-the-patching-tool-intro.markdown
│   │   │   │       │   ├── 02-patching-tool-basic-configuration.markdown
│   │   │   │       │   ├── 03-patching-tool-advanced-configuration.markdown
│   │   │   │       │   └── 04-installing-patches-on-the-liferay-war.markdown
│   │   │   │       └── 05-keeping-up-with-fix-packs/
│   │   │   │           └── 01-keeping-up-with-fix-packs-intro.markdown
│   │   │   ├── 08-lcs/
│   │   │   │   ├── 01-intro.markdown
│   │   │   │   ├── 02-getting-started.markdown
│   │   │   │   ├── 03-lcs-preconfiguration.markdown
│   │   │   │   ├── 04-registration.markdown
│   │   │   │   ├── 05-using-lcs/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   ├── 02-lcs-property-storage.markdown
│   │   │   │   │   ├── 03-managing-lcs-users.markdown
│   │   │   │   │   ├── 04-lcs-dashboard.markdown
│   │   │   │   │   ├── 05-lcs-environments.markdown
│   │   │   │   │   ├── 06-lcs-servers.markdown
│   │   │   │   │   ├── 07-lcs-account.markdown
│   │   │   │   │   ├── 08-lcs-subscriptions.markdown
│   │   │   │   │   └── 09-lcs-tokens.markdown
│   │   │   │   └── 06-lcs-troubleshooting.markdown
│   │   │   └── 100-reference/
│   │   │       ├── 06-comparing-patch-levels.markdown
│   │   │       └── 07-patching-tool-configuration-properties.markdown
│   │   ├── build.xml
│   │   └── drawings/
│   │       ├── README.markdown
│   │       ├── kerberos.odg
│   │       ├── oauth-flow.odg
│   │       └── patch-war-file-folder-structure.odg
│   ├── developer/
│   │   ├── appdev/
│   │   │   ├── articles/
│   │   │   │   ├── 01-application-development/
│   │   │   │   │   └── 01-application-development-intro.markdown
│   │   │   │   ├── 02-web-front-ends/
│   │   │   │   │   ├── 01-web-front-ends-intro.markdown
│   │   │   │   │   ├── 02-angular-widget/
│   │   │   │   │   │   └── 01-developing-an-angular-application-intro.markdown
│   │   │   │   │   ├── 03-react-widget/
│   │   │   │   │   │   └── 01-developing-react-application-intro.markdown
│   │   │   │   │   ├── 04-vue-widget/
│   │   │   │   │   │   └── 01-developing-a-vue-application-intro.markdown
│   │   │   │   │   ├── 05-liferay-mvc-portlet/
│   │   │   │   │   │   ├── 01-liferay-mvc-portlet-intro.markdown
│   │   │   │   │   │   ├── 02-creating-an-mvc-portlet.markdown
│   │   │   │   │   │   ├── 03-writing-mvc-portlet-controller-code.markdown
│   │   │   │   │   │   ├── 04-configuring-the-view-layer.markdown
│   │   │   │   │   │   ├── 05-mvc-action-command.markdown
│   │   │   │   │   │   ├── 06-mvc-render-command.markdown
│   │   │   │   │   │   └── 07-mvc-resource-command.markdown
│   │   │   │   │   ├── 06-portletmvc4pring/
│   │   │   │   │   │   ├── 01-portlet-mvc-for-spring-intro.markdown
│   │   │   │   │   │   ├── 02-developing-a-portlet-using-portletmvc4spring.markdown
│   │   │   │   │   │   └── 99-migrating-to-portletmvc4spring.markdown
│   │   │   │   │   ├── 07-jsf-portlet/
│   │   │   │   │   │   ├── 01-jsf-portlet-intro.markdown
│   │   │   │   │   │   └── 02-developing-a-jsf-portlet-application.markdown
│   │   │   │   │   └── 08-bean-portlet/
│   │   │   │   │       ├── 01-bean-portlet-intro.markdown
│   │   │   │   │       └── 02-creating-a-bean-portlet.markdown
│   │   │   │   ├── 03-service-builder/
│   │   │   │   │   ├── 01-service-builder-intro.markdown
│   │   │   │   │   ├── 02-creating-a-service-builder-project/
│   │   │   │   │   │   └── 02-creating-a-service-builder-project-intro.markdown
│   │   │   │   │   ├── 03-creating-o-r-map/
│   │   │   │   │   │   ├── 01-creating-the-service-xml-file-intro.markdown
│   │   │   │   │   │   ├── 03-defining-global-service-info/
│   │   │   │   │   │   │   └── 01-defining-global-service-information-intro.markdown
│   │   │   │   │   │   ├── 04-defining-service-entities/
│   │   │   │   │   │   │   └── 01-defining-service-entities-intro.markdown
│   │   │   │   │   │   ├── 05-defining-columns-and-attribs/
│   │   │   │   │   │   │   └── 01-defining-the-columns-attributes-for-each-service-entity-intro.markdown
│   │   │   │   │   │   ├── 06-defining-relationships-between-entities/
│   │   │   │   │   │   │   └── 01-defining-relationships-between-service-entities-intro.markdown
│   │   │   │   │   │   ├── 07-defining-service-entity-instance-order/
│   │   │   │   │   │   │   └── 01-defining-ordering-of-service-entity-instances-intro.markdown
│   │   │   │   │   │   ├── 08-defining-service-entity-finder-methods/
│   │   │   │   │   │   │   └── 01-defining-service-entity-finder-methods-intro.markdown
│   │   │   │   │   │   ├── 09-running-service-builder/
│   │   │   │   │   │   │   └── 01-running-service-builder-and-understanding-the-generated-code-intro.markdown
│   │   │   │   │   │   ├── 10-understanding-the-code-service-builder-generates/
│   │   │   │   │   │   │   └── 01-understanding-the-code-generated-by-service-builder-intro.markdown
│   │   │   │   │   │   ├── 11-iterative-development/
│   │   │   │   │   │   │   └── 01-iterative-development-intro.markdown
│   │   │   │   │   │   ├── 12-customizing-model-entities-with-model-hints/
│   │   │   │   │   │   │   └── 01-customizing-model-entities-with-model-hints-intro.markdown
│   │   │   │   │   │   ├── 13-configuring-service-properties/
│   │   │   │   │   │   │   └── 01-configuring-service-properties-intro.markdown
│   │   │   │   │   │   ├── 98-connecting-service-builder-to-an-external-database/
│   │   │   │   │   │   │   ├── 01-connecting-service-builder-to-an-external-database-intro.markdown
│   │   │   │   │   │   │   ├── 02-datasource-connect-using-a-datasourceprovider.markdown
│   │   │   │   │   │   │   └── 03-datasource-connect-using-spring-beans.markdown
│   │   │   │   │   │   └── 99-migrating-a-service-builder-module-from-spring-di-to-osgi-ds/
│   │   │   │   │   │       └── 01-migrating-a-service-builder-module-from-spring-di-to-osgi-ds-intro.markdown
│   │   │   │   │   ├── 04-business-logic-with-service-builder/
│   │   │   │   │   │   ├── 01-business-logic-with-service-builder-intro.markdown
│   │   │   │   │   │   ├── 02-creating-local-services/
│   │   │   │   │   │   │   ├── 01-implementing-an-add-method-intro.markdown
│   │   │   │   │   │   │   ├── 02-implementing-an-update-method.markdown
│   │   │   │   │   │   │   ├── 03-implementing-methods-to-get-and-count-entities.markdown
│   │   │   │   │   │   │   ├── 04-implementing-any-other-business-logic.markdown
│   │   │   │   │   │   │   └── 05-integrating-with-liferay-frameworks.markdown
│   │   │   │   │   │   ├── 03-invoking-local-services.markdown
│   │   │   │   │   │   └── 04-invoking-services-from-spring-service-builder-code.markdown
│   │   │   │   │   └── 09-advanced-queries/
│   │   │   │   │       ├── 01-advanced-query-intro.markdown
│   │   │   │   │       ├── 02-custom-sql.markdown
│   │   │   │   │       ├── 03-defining-a-custom-finder-method.markdown
│   │   │   │   │       ├── 03-dynamic-query.markdown
│   │   │   │   │       ├── 05-accessing-your-custom-finder-method-from-the-service-layer.markdown
│   │   │   │   │       └── 06-actionable-dynamic-query.markdown
│   │   │   │   ├── 04-rest-builder/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   └── 02-generating-apis-rest-builder.markdown
│   │   │   │   └── 99-troubleshooting-application-development-issues/
│   │   │   │       ├── 01-troubleshooting-application-development-issues-intro.markdown
│   │   │   │       ├── adjusting-module-logging.markdown
│   │   │   │       ├── artifact-versions-dependencies.markdown
│   │   │   │       ├── bsn-naming-syntax-issues.markdown
│   │   │   │       ├── calling-osgi-services-instead-of-static-service-utils.markdown
│   │   │   │       ├── connecting-to-jndi-data-sources.markdown
│   │   │   │       ├── detecting-unresolved-osgi-components.markdown
│   │   │   │       ├── disabling-cache-on-table-mapper-tables.markdown
│   │   │   │       ├── implementing-logging.markdown
│   │   │   │       ├── optional-imports.markdown
│   │   │   │       ├── resolving-bundle-requirements.markdown
│   │   │   │       ├── resolving-cnfe-and-cdnfe-in-osgi-bundles.markdown
│   │   │   │       ├── system-check.markdown
│   │   │   │       └── troubleshooting-front-end-dev.markdown
│   │   │   ├── build.xml
│   │   │   └── code/
│   │   │       ├── angular-guestbook/
│   │   │       │   ├── after/
│   │   │       │   │   └── my-angular-guestbook/
│   │   │       │   │       ├── .gitignore
│   │   │       │   │       ├── .npmbuildrc
│   │   │       │   │       ├── .npmbundlerrc
│   │   │       │   │       ├── README.md
│   │   │       │   │       ├── assets/
│   │   │       │   │       │   ├── .placeholder
│   │   │       │   │       │   ├── app/
│   │   │       │   │       │   │   ├── add-entry.component.html
│   │   │       │   │       │   │   ├── app.component.html
│   │   │       │   │       │   │   └── view-guestbook.component.html
│   │   │       │   │       │   └── css/
│   │   │       │   │       │       ├── add-entry.component.css
│   │   │       │   │       │       ├── app.component.css
│   │   │       │   │       │       ├── styles.css
│   │   │       │   │       │       └── view-guestbook.component.css
│   │   │       │   │       ├── package.json
│   │   │       │   │       ├── src/
│   │   │       │   │       │   ├── app/
│   │   │       │   │       │   │   ├── add-entry/
│   │   │       │   │       │   │   │   ├── add-entry.component.spec.ts
│   │   │       │   │       │   │   │   └── add-entry.component.ts
│   │   │       │   │       │   │   ├── app-routing.module.ts
│   │   │       │   │       │   │   ├── app.component.spec.ts
│   │   │       │   │       │   │   ├── app.component.ts
│   │   │       │   │       │   │   ├── app.module.ts
│   │   │       │   │       │   │   ├── dynamic.loader.ts
│   │   │       │   │       │   │   ├── entry.service.spec.ts
│   │   │       │   │       │   │   ├── entry.service.ts
│   │   │       │   │       │   │   ├── guestbook-entry.ts
│   │   │       │   │       │   │   ├── in-memory-data.service.spec.ts
│   │   │       │   │       │   │   ├── in-memory-data.service.ts
│   │   │       │   │       │   │   ├── mock-guestbook-entries.ts
│   │   │       │   │       │   │   └── view-guestbook/
│   │   │       │   │       │   │       ├── view-guestbook.component.spec.ts
│   │   │       │   │       │   │       └── view-guestbook.component.ts
│   │   │       │   │       │   ├── index.ts
│   │   │       │   │       │   ├── polyfills.ts
│   │   │       │   │       │   └── types/
│   │   │       │   │       │       └── LiferayParams.ts
│   │   │       │   │       └── tsconfig.json
│   │   │       │   └── before/
│   │   │       │       └── angular-guestbook/
│   │   │       │           ├── .editorconfig
│   │   │       │           ├── .gitignore
│   │   │       │           ├── README.md
│   │   │       │           ├── angular.json
│   │   │       │           ├── e2e/
│   │   │       │           │   ├── protractor.conf.js
│   │   │       │           │   ├── src/
│   │   │       │           │   │   ├── app.e2e-spec.ts
│   │   │       │           │   │   └── app.po.ts
│   │   │       │           │   └── tsconfig.e2e.json
│   │   │       │           ├── package.json
│   │   │       │           ├── src/
│   │   │       │           │   ├── app/
│   │   │       │           │   │   ├── add-entry/
│   │   │       │           │   │   │   ├── add-entry.component.css
│   │   │       │           │   │   │   ├── add-entry.component.html
│   │   │       │           │   │   │   ├── add-entry.component.spec.ts
│   │   │       │           │   │   │   └── add-entry.component.ts
│   │   │       │           │   │   ├── app-routing.module.ts
│   │   │       │           │   │   ├── app.component.css
│   │   │       │           │   │   ├── app.component.html
│   │   │       │           │   │   ├── app.component.spec.ts
│   │   │       │           │   │   ├── app.component.ts
│   │   │       │           │   │   ├── app.module.ts
│   │   │       │           │   │   ├── entry.service.spec.ts
│   │   │       │           │   │   ├── entry.service.ts
│   │   │       │           │   │   ├── guestbook-entry.ts
│   │   │       │           │   │   ├── in-memory-data.service.spec.ts
│   │   │       │           │   │   ├── in-memory-data.service.ts
│   │   │       │           │   │   ├── mock-guestbook-entries.ts
│   │   │       │           │   │   └── view-guestbook/
│   │   │       │           │   │       ├── view-guestbook.component.css
│   │   │       │           │   │       ├── view-guestbook.component.html
│   │   │       │           │   │       ├── view-guestbook.component.spec.ts
│   │   │       │           │   │       └── view-guestbook.component.ts
│   │   │       │           │   ├── assets/
│   │   │       │           │   │   └── .gitkeep
│   │   │       │           │   ├── browserslist
│   │   │       │           │   ├── environments/
│   │   │       │           │   │   ├── environment.prod.ts
│   │   │       │           │   │   └── environment.ts
│   │   │       │           │   ├── index.html
│   │   │       │           │   ├── karma.conf.js
│   │   │       │           │   ├── main.ts
│   │   │       │           │   ├── polyfills.ts
│   │   │       │           │   ├── styles.css
│   │   │       │           │   ├── test.ts
│   │   │       │           │   ├── tsconfig.app.json
│   │   │       │           │   ├── tsconfig.spec.json
│   │   │       │           │   └── tslint.json
│   │   │       │           ├── tsconfig.json
│   │   │       │           └── tslint.json
│   │   │       ├── react-guestbook/
│   │   │       │   ├── after/
│   │   │       │   │   └── react-guestbook-app-migrated/
│   │   │       │   │       ├── .babelrc
│   │   │       │   │       ├── .gitignore
│   │   │       │   │       ├── .npmbuildrc
│   │   │       │   │       ├── .npmbundlerrc
│   │   │       │   │       ├── README.md
│   │   │       │   │       ├── assets/
│   │   │       │   │       │   ├── .placeholder
│   │   │       │   │       │   └── css/
│   │   │       │   │       │       ├── App.css
│   │   │       │   │       │       ├── index.css
│   │   │       │   │       │       └── styles.css
│   │   │       │   │       ├── package.json
│   │   │       │   │       └── src/
│   │   │       │   │           ├── App.js
│   │   │       │   │           ├── App.test.js
│   │   │       │   │           ├── add-entry.js
│   │   │       │   │           ├── index.js
│   │   │       │   │           ├── serviceWorker.js
│   │   │       │   │           └── view-guestbook.js
│   │   │       │   └── before/
│   │   │       │       └── my-react-guestbook-app/
│   │   │       │           ├── .gitignore
│   │   │       │           ├── README.md
│   │   │       │           ├── package.json
│   │   │       │           ├── public/
│   │   │       │           │   ├── index.html
│   │   │       │           │   └── manifest.json
│   │   │       │           └── src/
│   │   │       │               ├── App.css
│   │   │       │               ├── App.js
│   │   │       │               ├── App.test.js
│   │   │       │               ├── add-entry.js
│   │   │       │               ├── index.css
│   │   │       │               ├── index.js
│   │   │       │               ├── serviceWorker.js
│   │   │       │               └── view-guestbook.js
│   │   │       └── vue-guestbook/
│   │   │           ├── after/
│   │   │           │   └── vue-guestbook-migrated/
│   │   │           │       ├── .babelrc
│   │   │           │       ├── .gitignore
│   │   │           │       ├── .npmbuildrc
│   │   │           │       ├── .npmbundlerrc
│   │   │           │       ├── README.md
│   │   │           │       ├── assets/
│   │   │           │       │   ├── .placeholder
│   │   │           │       │   └── css/
│   │   │           │       │       ├── custom.css
│   │   │           │       │       └── styles.css
│   │   │           │       ├── package.json
│   │   │           │       └── src/
│   │   │           │           ├── Api.js
│   │   │           │           ├── App.vue
│   │   │           │           ├── components/
│   │   │           │           │   ├── AddEntry.vue
│   │   │           │           │   └── ViewGuestbook.vue
│   │   │           │           └── index.js
│   │   │           └── before/
│   │   │               └── vue-guestbook/
│   │   │                   ├── .gitignore
│   │   │                   ├── README.md
│   │   │                   ├── babel.config.js
│   │   │                   ├── package.json
│   │   │                   ├── public/
│   │   │                   │   └── index.html
│   │   │                   └── src/
│   │   │                       ├── Api.js
│   │   │                       ├── App.vue
│   │   │                       ├── components/
│   │   │                       │   ├── AddEntry.vue
│   │   │                       │   └── ViewGuestbook.vue
│   │   │                       └── main.js
│   │   ├── build.xml
│   │   ├── customization/
│   │   │   ├── articles/
│   │   │   │   ├── 01-liferay-customization-intro.markdown
│   │   │   │   ├── 02-fundamentals/
│   │   │   │   │   ├── 01-fundamentals-intro.markdown
│   │   │   │   │   ├── 02-configuring-dependencies/
│   │   │   │   │   │   ├── 01-configuring-dependencies-intro.markdown
│   │   │   │   │   │   ├── 02-finding-artifacts.markdown
│   │   │   │   │   │   ├── 03-specifying-dependencies.markdown
│   │   │   │   │   │   ├── 04-resolving-third-party-library-package-dependencies.markdown
│   │   │   │   │   │   └── 05-understanding-excluded-jars.markdown
│   │   │   │   │   ├── 03-felix-gogo-shell/
│   │   │   │   │   │   └── 01-felix-gogo-shell-intro.markdown
│   │   │   │   │   ├── 04-importing-packages/
│   │   │   │   │   │   └── 01-importing-packages-intro.markdown
│   │   │   │   │   ├── 05-exporting-packages/
│   │   │   │   │   │   └── 01-exporting-packages-intro.markdown
│   │   │   │   │   ├── 06-semantic-versioning/
│   │   │   │   │   │   └── 01-semantic-versioning-intro.markdown
│   │   │   │   │   └── 07-deploying-wars-wab-generator/
│   │   │   │   │       └── 01-deploying-wars-wab-generator-intro.markdown
│   │   │   │   ├── 03-architecture/
│   │   │   │   │   ├── 01-architecture-intro.markdown
│   │   │   │   │   ├── 02-classloader-hierarchy.markdown
│   │   │   │   │   ├── 03-portal-startup-phases.markdown
│   │   │   │   │   ├── 04-benefits-of-modularity.markdown
│   │   │   │   │   ├── 05-osgi-and-modularity.markdown
│   │   │   │   │   ├── 06-module-lifecycle.markdown
│   │   │   │   │   ├── 06-ui-concepts/
│   │   │   │   │   │   ├── 01-ui-architecture-intro.markdown
│   │   │   │   │   │   ├── 02-theme-components.markdown
│   │   │   │   │   │   └── 03-understanding-the-page-layout.markdown
│   │   │   │   │   ├── 07-bundle-classloading-flow.markdown
│   │   │   │   │   └── 08-finding-extension-points.markdown
│   │   │   │   ├── 100-troubleshooting-customizations/
│   │   │   │   │   ├── 01-troubleshooting-customizations-intro.markdown
│   │   │   │   │   ├── jsp-fragment-unresolved-requirement.markdown
│   │   │   │   │   ├── jsp-fragments.markdown
│   │   │   │   │   └── using-osgi-services-from-ext-plugins.markdown
│   │   │   │   ├── 110-contributing/
│   │   │   │   │   └── 01-contributing-to-liferay-portal-intro.markdown
│   │   │   │   ├── 50-creating-model-listeners/
│   │   │   │   │   └── 01-creating-model-listeners-intro.markdown
│   │   │   │   ├── 50-customizing-jsps/
│   │   │   │   │   ├── 01-overriding-jsps-intro.markdown
│   │   │   │   │   ├── 02-customizing-jsps-with-dynamic-includes.markdown
│   │   │   │   │   ├── 03-jsp-overrides-using-portlet-filters.markdown
│   │   │   │   │   ├── 04-jsp-overrides-using-fragments.markdown
│   │   │   │   │   ├── 05-core-jsp-overrides-using-customjspbag.markdown
│   │   │   │   │   └── 06-overriding-inline-content-using-jsps.markdown
│   │   │   │   ├── 50-customizing-widgets/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   └── 02-implementing-widget-templates.markdown
│   │   │   │   ├── 50-dynamic-includes/
│   │   │   │   │   ├── 01-dynamic-include-extension-points-intro.markdown
│   │   │   │   │   ├── 02-wysiwyg-editor-dynamic-includes.markdown
│   │   │   │   │   ├── 03-top-head-jsp-dynamic-include.markdown
│   │   │   │   │   ├── 04-top-js-dynamic-include.markdown
│   │   │   │   │   └── 05-bottom-jsp-dynamic-include.markdown
│   │   │   │   ├── 50-lifecycle-events/
│   │   │   │   │   └── 01-waiting-on-lifecycle-events-intro.markdown
│   │   │   │   ├── 50-liferay-forms/
│   │   │   │   │   ├── 01-forms-intro.markdown
│   │   │   │   │   ├── 02-form-storage-adapters.markdown
│   │   │   │   │   └── 03-creating-form-storage-adapters.markdown
│   │   │   │   ├── 50-overriding-language-keys/
│   │   │   │   │   ├── 01-overriding-language-keys-intro.markdown
│   │   │   │   │   ├── 02-overriding-liferays-language-keys.markdown
│   │   │   │   │   └── 03-overriding-a-modules-language-keys.markdown
│   │   │   │   ├── 50-overriding-liferay-services/
│   │   │   │   │   └── 01-overriding-liferay-services-intro.markdown
│   │   │   │   ├── 50-overriding-lpkg-files/
│   │   │   │   │   └── 01-overriding-lpkg-files-intro.markdown
│   │   │   │   ├── 50-overriding-mvc-commands/
│   │   │   │   │   ├── 01-overriding-mvc-commands-intro.markdown
│   │   │   │   │   ├── 02-adding-logic-to-mvc-commands.markdown
│   │   │   │   │   ├── 03-overriding-mvcrendercommands.markdown
│   │   │   │   │   ├── 04-override-mvcactioncommands.markdown
│   │   │   │   │   └── 05-override-mvcresourcecommands.markdown
│   │   │   │   ├── 50-overriding-osgi-services/
│   │   │   │   │   ├── 01-overriding-osgi-services-intro.markdown
│   │   │   │   │   ├── 02-examining-an-service-to-override.markdown
│   │   │   │   │   ├── 03-creating-a-custom-osgi-service.markdown
│   │   │   │   │   └── 04-reconfiguring-components-to-use-your-osgi-service-reference.markdown
│   │   │   │   ├── 50-portlet-filters/
│   │   │   │   │   └── 01-portlet-filters-intro.markdown
│   │   │   │   ├── 50-product-navigation/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   ├── 02-customizing-the-product-menu/
│   │   │   │   │   │   ├── 01-customizing-the-product-menu-intro.markdown
│   │   │   │   │   │   ├── 02-adding-custom-panel-categories.markdown
│   │   │   │   │   │   └── 03-adding-custom-panel-apps.markdown
│   │   │   │   │   ├── 03-customizing-the-control-menu/
│   │   │   │   │   │   ├── 01-customizing-the-control-menu-intro.markdown
│   │   │   │   │   │   ├── 02-customizing-the-control-menu.markdown
│   │   │   │   │   │   └── 03-defining-icons-tooltips.markdown
│   │   │   │   │   ├── 04-extending-the-simulation-menu/
│   │   │   │   │   │   └── 01-extending-the-simulation-menu-intro.markdown
│   │   │   │   │   └── 05-providing-the-user-personal-bar/
│   │   │   │   │       ├── 01-customizing-the-user-personal-menu-intro.markdown
│   │   │   │   │       ├── 02-using-a-custom-portlet-as-the-user-personal-bar.markdown
│   │   │   │   │       └── 03-customizing-the-personal-menu.markdown
│   │   │   │   └── 99-customization-with-ext/
│   │   │   │       ├── 01-intro.markdown
│   │   │   │       ├── 02-customizing-core-functionality-with-ext/
│   │   │   │       │   ├── 01-intro.markdown
│   │   │   │       │   ├── 02-creating-an-ext-plugin.markdown
│   │   │   │       │   ├── 03-anatomy-of-an-ext-plugin.markdown
│   │   │   │       │   ├── 04-developing-an-ext-plugin.markdown
│   │   │   │       │   ├── 05-deploying-an-ext-plugin.markdown
│   │   │   │       │   └── 06-redeploying-an-ext-plugin.markdown
│   │   │   │       └── 03-customizing-osgi-modules-with-ext/
│   │   │   │           ├── 01-intro.markdown
│   │   │   │           ├── 02-creating-an-ext-module.markdown
│   │   │   │           ├── 03-developing-an-ext-module.markdown
│   │   │   │           └── 04-deploying-an-ext-module.markdown
│   │   │   ├── articles-dxp/
│   │   │   │   ├── 50-workflow/
│   │   │   │   │   ├── 01-workflow-intro.markdown
│   │   │   │   │   └── 02-sla-calendars.markdown
│   │   │   │   └── 99-customization-with-ext/
│   │   │   │       ├── 02-customizing-core-functionality-with-ext/
│   │   │   │       │   └── 01-intro.markdown
│   │   │   │       ├── 04-extending-core-classes-using-spring-with-ext-plugins.markdown
│   │   │   │       ├── 05-overriding-core-classes-with-ext-plugins.markdown
│   │   │   │       ├── 06-adding-to-the-web-xml-with-ext-plugins.markdown
│   │   │   │       └── 07-modifying-the-web-xml-with-ext-plugins.markdown
│   │   │   └── build.xml
│   │   ├── frameworks/
│   │   │   ├── articles/
│   │   │   │   ├── 01-frameworks-intro.markdown
│   │   │   │   ├── application-security/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   ├── 02-application-permissions/
│   │   │   │   │   │   ├── 01-application-permissions-intro.markdown
│   │   │   │   │   │   ├── 02-defining-permissions.markdown
│   │   │   │   │   │   ├── 03-registering-permissions.markdown
│   │   │   │   │   │   ├── 04-associate-permissions-resources.markdown
│   │   │   │   │   │   ├── 05-check-permissions.markdown
│   │   │   │   │   │   └── 06-using-portal-roles-in-a-portlet.markdown
│   │   │   │   │   ├── 04-authentication-pipelines/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── 02-auto-login.markdown
│   │   │   │   │   │   ├── 03-authentication-pipelines.markdown
│   │   │   │   │   │   └── 04-custom-login-portlet.markdown
│   │   │   │   │   └── 06-service-access-policies.markdown
│   │   │   │   ├── assets/
│   │   │   │   │   ├── 01-asset-framework-intro.markdown
│   │   │   │   │   ├── 02-adding-updating-and-deleting-assets.markdown
│   │   │   │   │   ├── 03-rendering-an-asset/
│   │   │   │   │   │   ├── 01-creating-asset-renderer-intro.markdown
│   │   │   │   │   │   ├── 02-jsp-templates-asset-renderer.markdown
│   │   │   │   │   │   └── 03-creating-factory-asset-renderer.markdown
│   │   │   │   │   ├── 04-entering-and-displaying-tags-and-categories.markdown
│   │   │   │   │   ├── 05-relating-assets.markdown
│   │   │   │   │   └── 06-implementing-asset-priority.markdown
│   │   │   │   ├── back-end-frameworks/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   ├── 02-creating-portlet-providers.markdown
│   │   │   │   │   ├── 03-retrieving-portlets.markdown
│   │   │   │   │   ├── 04-enabling-accessing-scopes.markdown
│   │   │   │   │   └── 05-message-bus/
│   │   │   │   │       ├── 01-intro.markdown
│   │   │   │   │       ├── 02-creating-destination.markdown
│   │   │   │   │       ├── 03-message-bus-event-listeners.markdown
│   │   │   │   │       ├── 04-registering-message-listeners.markdown
│   │   │   │   │       ├── 05-creating-a-message.markdown
│   │   │   │   │       ├── 06-sending-a-message.markdown
│   │   │   │   │       └── 07-sending-messages-cluster.markdown
│   │   │   │   ├── cache-configuration/
│   │   │   │   │   ├── 01-cache-configuration-intro.markdown
│   │   │   │   │   ├── 02-overriding-cache.markdown
│   │   │   │   │   └── 03-caching-data.markdown
│   │   │   │   ├── collaboration/
│   │   │   │   │   ├── 00-intro.markdown
│   │   │   │   │   ├── 01-item-selector/
│   │   │   │   │   │   ├── 00-intro.markdown
│   │   │   │   │   │   ├── 01-selecting-entities.markdown
│   │   │   │   │   │   ├── 02-creating-criterion-return-types.markdown
│   │   │   │   │   │   └── 03-creating-custom-views.markdown
│   │   │   │   │   ├── 02-documents-media-api/
│   │   │   │   │   │   ├── 00-intro.markdown
│   │   │   │   │   │   ├── 01-creating-entities/
│   │   │   │   │   │   │   ├── 00-intro.markdown
│   │   │   │   │   │   │   ├── 01-creating-files.markdown
│   │   │   │   │   │   │   ├── 02-creating-folders.markdown
│   │   │   │   │   │   │   └── 03-creating-file-shortcuts.markdown
│   │   │   │   │   │   ├── 02-deleting-entities/
│   │   │   │   │   │   │   ├── 00-intro.markdown
│   │   │   │   │   │   │   ├── 01-deleting-files.markdown
│   │   │   │   │   │   │   ├── 02-deleting-file-versions.markdown
│   │   │   │   │   │   │   ├── 03-deleting-file-shortcuts.markdown
│   │   │   │   │   │   │   ├── 04-deleting-folders.markdown
│   │   │   │   │   │   │   └── 05-moving-to-recycle-bin.markdown
│   │   │   │   │   │   ├── 03-updating-entities/
│   │   │   │   │   │   │   ├── 00-intro.markdown
│   │   │   │   │   │   │   ├── 01-updating-files.markdown
│   │   │   │   │   │   │   ├── 02-updating-folders.markdown
│   │   │   │   │   │   │   └── 03-updating-file-shortcuts.markdown
│   │   │   │   │   │   ├── 04-file-checkout/
│   │   │   │   │   │   │   ├── 00-intro.markdown
│   │   │   │   │   │   │   ├── 01-file-checkout.markdown
│   │   │   │   │   │   │   ├── 02-file-checkin.markdown
│   │   │   │   │   │   │   └── 03-cancel-checkout.markdown
│   │   │   │   │   │   ├── 05-copying-moving-entities/
│   │   │   │   │   │   │   ├── 00-intro.markdown
│   │   │   │   │   │   │   ├── 01-copying-folders.markdown
│   │   │   │   │   │   │   └── 02-moving-folders-files.markdown
│   │   │   │   │   │   └── 06-getting-entities/
│   │   │   │   │   │       ├── 00-intro.markdown
│   │   │   │   │   │       ├── 01-getting-files.markdown
│   │   │   │   │   │       ├── 02-getting-folders.markdown
│   │   │   │   │   │       └── 03-getting-multiple-types.markdown
│   │   │   │   │   ├── 03-adaptive-media/
│   │   │   │   │   │   ├── 00-intro.markdown
│   │   │   │   │   │   ├── 01-displaying-adapted-images.markdown
│   │   │   │   │   │   ├── 02-finding-adapted-images.markdown
│   │   │   │   │   │   └── 03-image-scaler.markdown
│   │   │   │   │   └── 05-social-api/
│   │   │   │   │       ├── 00-intro.markdown
│   │   │   │   │       ├── 01-applying-social-bookmarks.markdown
│   │   │   │   │       ├── 02-creating-social-bookmarks.markdown
│   │   │   │   │       ├── 03-adding-comments.markdown
│   │   │   │   │       ├── 05-rating-assets.markdown
│   │   │   │   │       ├── 09-rating-type-selection.markdown
│   │   │   │   │       ├── 10-customizing-rating-transformation.markdown
│   │   │   │   │       └── 11-flagging-assets.markdown
│   │   │   │   ├── configuration/
│   │   │   │   │   ├── 01-configuration-intro.markdown
│   │   │   │   │   ├── 02-creating-a-configuration-interface.markdown
│   │   │   │   │   ├── 03-categorizing-configurations.markdown
│   │   │   │   │   ├── 04-scoping-configurations.markdown
│   │   │   │   │   ├── 05-reading-configurations-configuration-provider.markdown
│   │   │   │   │   ├── 06-reading-configurations-portlet.markdown
│   │   │   │   │   ├── 07-reading-configurations-component.markdown
│   │   │   │   │   ├── 08-customizing-the-ui/
│   │   │   │   │   │   ├── 01-customizing-the-configuration-user-interface-intro.markdown
│   │   │   │   │   │   ├── 02-configuration-form-renderer.markdown
│   │   │   │   │   │   └── 03-configuration-forms.markdown
│   │   │   │   │   ├── 10-upgrading-a-legacy-app.markdown
│   │   │   │   │   └── 11-dynamically-populating-select-fields.markdown
│   │   │   │   ├── content-publication-management/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   ├── 02-export-import/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── 02-developing-staged-models/
│   │   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   │   ├── 02-generating-staged-models-using-service-builder.markdown
│   │   │   │   │   │   │   └── 03-creating-staged-models-manually.markdown
│   │   │   │   │   │   ├── 03-developing-data-handlers/
│   │   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   │   ├── 02-creating-portlet-data-handlers.markdown
│   │   │   │   │   │   │   └── 03-creating-staged-model-data-handlers.markdown
│   │   │   │   │   │   ├── 04-providing-entity-specific-local-services-for-export-import/
│   │   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   │   ├── 02-implementing-the-staged-model-repository-framework.markdown
│   │   │   │   │   │   │   └── 03-using-the-staged-model-repository-framework.markdown
│   │   │   │   │   │   ├── 05-using-the-export-import-lifecycle-listener-framework.markdown
│   │   │   │   │   │   └── 06-initiating-new-export-import-processes.markdown
│   │   │   │   │   └── 03-staging/
│   │   │   │   │       └── 01-intro.markdown
│   │   │   │   ├── dependency-injection/
│   │   │   │   │   ├── 01-dependency-injection-intro.markdown
│   │   │   │   │   ├── 02-cdi-dependency-injection.markdown
│   │   │   │   │   ├── declarative-services.markdown
│   │   │   │   │   ├── osgi-cdi-integration/
│   │   │   │   │   │   ├── 01-osgi-cdi-integration-intro.markdown
│   │   │   │   │   │   ├── 02-publishing-cdi-beans-as-osgi-services.markdown
│   │   │   │   │   │   └── 03-using-osgi-services-in-a-bean.markdown
│   │   │   │   │   ├── service-trackers-for-osgi-services.markdown
│   │   │   │   │   └── using-a-service-tracker.markdown
│   │   │   │   ├── friendly-urls/
│   │   │   │   │   ├── 01-friendly-urls-intro.markdown
│   │   │   │   │   └── 02-creating-friendly-urls.markdown
│   │   │   │   ├── front-end-development/
│   │   │   │   │   ├── 01-front-end-dev-intro.markdown
│   │   │   │   │   ├── 02-themes/
│   │   │   │   │   │   ├── 00-themes-intro.markdown
│   │   │   │   │   │   ├── 03-developing-themes/
│   │   │   │   │   │   │   ├── 01-developing-themes-intro.markdown
│   │   │   │   │   │   │   ├── 02-using-developer-mode-with-themes.markdown
│   │   │   │   │   │   │   ├── 03-building-themes.markdown
│   │   │   │   │   │   │   ├── 04-deploying-and-applying-themes.markdown
│   │   │   │   │   │   │   ├── 07-configuring-your-themes-app-server.markdown
│   │   │   │   │   │   │   ├── 09-automatically-deploying-theme-changes.markdown
│   │   │   │   │   │   │   ├── 10-creating-a-thumbnail-preview-for-your-theme.markdown
│   │   │   │   │   │   │   ├── 11-creating-color-schemes-for-your-theme.markdown
│   │   │   │   │   │   │   ├── 12-making-configurable-theme-settings.markdown
│   │   │   │   │   │   │   └── 13-using-font-awesome-glyph-icons-in-your-theme.markdown
│   │   │   │   │   │   ├── 04-extending-themes/
│   │   │   │   │   │   │   ├── 01-extending-themes-intro.markdown
│   │   │   │   │   │   │   ├── 02-installing-themelets-in-your-theme.markdown
│   │   │   │   │   │   │   ├── 03-injecting-additional-context-variables-into-your-templates.markdown
│   │   │   │   │   │   │   ├── 04-packaging-independent-ui-resources-for-your-site.markdown
│   │   │   │   │   │   │   ├── 05-changing-the-base-theme.markdown
│   │   │   │   │   │   │   ├── 06-copying-an-existing-themes-files.markdown
│   │   │   │   │   │   │   ├── 07-listing-your-themes-extensions.markdown
│   │   │   │   │   │   │   └── 08-overwriting-and-extending-liferay-theme-tasks.markdown
│   │   │   │   │   │   ├── 05-clay-and-themes/
│   │   │   │   │   │   │   ├── 01-clay-themes-intro.markdown
│   │   │   │   │   │   │   ├── 02-customizing-atlas-and-clay-themes.markdown
│   │   │   │   │   │   │   ├── 03-integrating-third-party-themes-with-clay.markdown
│   │   │   │   │   │   │   ├── 04-using-clay-icons-in-your-theme.markdown
│   │   │   │   │   │   │   └── 04-using-clay-mixins-in-your-theme.markdown
│   │   │   │   │   │   ├── 06-portlets-and-themes/
│   │   │   │   │   │   │   ├── 01-theming-portlets-intro.markdown
│   │   │   │   │   │   │   └── 02-embedding-portlets-in-themes/
│   │   │   │   │   │   │       ├── 01-embedding-portlets-in-themes-intro.markdown
│   │   │   │   │   │   │       ├── 02-embedding-portlets-in-themes-by-entity-type.markdown
│   │   │   │   │   │   │       ├── 03-embedding-portlets-in-a-theme-by-name.markdown
│   │   │   │   │   │   │       └── 04-setting-portlet-preferences-for-embedded-portlets.markdown
│   │   │   │   │   │   ├── 07-managing-theme-resources/
│   │   │   │   │   │   │   ├── 01-resources-importer-intro.markdown
│   │   │   │   │   │   │   ├── 02-creating-a-sitemap/
│   │   │   │   │   │   │   │   ├── 01-creating-a-sitemap-intro.markdown
│   │   │   │   │   │   │   │   ├── 02-defining-layout-templates-and-pages-in-a-sitemap.markdown
│   │   │   │   │   │   │   │   ├── 04-defining-portlets-in-a-sitemap.markdown
│   │   │   │   │   │   │   │   └── 05-retrieving-portlet-ids-with-gogo-shell.markdown
│   │   │   │   │   │   │   ├── 03-preparing-and-organizing-web-content/
│   │   │   │   │   │   │   │   └── 01-preparing-and-organizing-web-content-for-the-importer-intro.markdown
│   │   │   │   │   │   │   ├── 04-defining-assets/
│   │   │   │   │   │   │   │   └── 01-defining-assets-intro.markdown
│   │   │   │   │   │   │   ├── 05-where-to-import-resources/
│   │   │   │   │   │   │   │   └── 01-specifying-where-to-import-resources-intro.markdown
│   │   │   │   │   │   │   └── 06-creating-a-theme-lar/
│   │   │   │   │   │   │       └── 01-creating-an-archive-of-your-sites-themes-and-resources-intro.markdown
│   │   │   │   │   │   └── 10-troubleshooting-themes/
│   │   │   │   │   │       └── 01-troubleshooting-themes-intro.markdown
│   │   │   │   │   ├── 03-layout-templates/
│   │   │   │   │   │   ├── 00-layout-templates-intro.markdown
│   │   │   │   │   │   ├── 01-creating-custom-layout-template-thumbnail-previews.markdown
│   │   │   │   │   │   └── 02-including-layout-templates-with-a-theme.markdown
│   │   │   │   │   ├── 05-creating-js-widgets-with-js-tooling/
│   │   │   │   │   │   ├── 01-creating-widgets-with-javascript-tooling-intro.markdown
│   │   │   │   │   │   ├── 02-configuring-system-and-instance-settings-for-your-widget.markdown
│   │   │   │   │   │   ├── 04-localizing-your-widget.markdown
│   │   │   │   │   │   ├── 05-using-translation-features.markdown
│   │   │   │   │   │   └── 06-setting-portlet-properties-for-your-widget.markdown
│   │   │   │   │   └── 07-javascript-module-loaders/
│   │   │   │   │       ├── 01-javascript-module-loaders-intro.markdown
│   │   │   │   │       ├── 02-loading-amd-modules/
│   │   │   │   │       │   └── 01-loading-amd-modules-in-liferay-intro.markdown
│   │   │   │   │       ├── 03-using-external-libraries/
│   │   │   │   │       │   └── 01-using-external-libraries-intro.markdown
│   │   │   │   │       └── 04-loading-modules-with-aui-script-tag/
│   │   │   │   │           ├── 01-loading-modules-with-aui-script-intro.markdown
│   │   │   │   │           ├── 02-loading-aui-modules-with-aui.markdown
│   │   │   │   │           ├── 03-loading-es2015-and-metal-modules-with-aui-script-tag.markdown
│   │   │   │   │           ├── 04-loading-aui-es2015-metal-modules-with-aui.markdown
│   │   │   │   │           └── 05-loading-bundled-npm-modules-in-your-portlets.markdown
│   │   │   │   ├── info-framework/
│   │   │   │   │   ├── 01-the-info-framework-intro.markdown
│   │   │   │   │   ├── 02-creating-information-list-provider.markdown
│   │   │   │   │   ├── 03-creating-information-item-renderer.markdown
│   │   │   │   │   └── 04-custom-application-providers.markdown
│   │   │   │   ├── liferay-forms/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   └── 02-form-serialization/
│   │   │   │   │       ├── 01-intro.markdown
│   │   │   │   │       └── 02-serilaizing-forms.markdown
│   │   │   │   ├── localization/
│   │   │   │   │   ├── 01-localization-intro.markdown
│   │   │   │   │   ├── 02-localizing-your-application.markdown
│   │   │   │   │   ├── 03-localization-settings.markdown
│   │   │   │   │   ├── 04-creating-language-module.markdown
│   │   │   │   │   ├── 05-using-language-module.markdown
│   │   │   │   │   └── 06-automatically-generating-translations.markdown
│   │   │   │   ├── portlets/
│   │   │   │   │   ├── 01-portlets-intro.markdown
│   │   │   │   │   ├── 07-using-javascript-in-your-portlets/
│   │   │   │   │   │   ├── 01-using-javascript-in-your-portlets-intro.markdown
│   │   │   │   │   │   ├── 02-esplus-modules/
│   │   │   │   │   │   │   └── 01-using-esplus-modules-in-your-portlets-intro.markdown
│   │   │   │   │   │   ├── 03-using-npm-in-your-portlets/
│   │   │   │   │   │   │   ├── 01-npm-intro.markdown
│   │   │   │   │   │   │   ├── 02-formatting-for-amd/
│   │   │   │   │   │   │   │   └── 01-formatting-your-npm-modules-for-amd-intro.markdown
│   │   │   │   │   │   │   ├── 03-migrating-bundler-projects/
│   │   │   │   │   │   │   │   ├── 01-migrating-bundler-projects-intro.markdown
│   │   │   │   │   │   │   │   ├── 02-migrating-plain-js-billboard-jquery-metal-js-react-vue-bundler.markdown
│   │   │   │   │   │   │   │   ├── 03-migrating-angular-bundler.markdown
│   │   │   │   │   │   │   │   └── 04-migrating-to-the-new-mode.markdown
│   │   │   │   │   │   │   ├── 04-custom-loaders/
│   │   │   │   │   │   │   │   └── 01-creating-custom-loaders-for-the-bundler-intro.markdown
│   │   │   │   │   │   │   └── 08-npmresolver-api/
│   │   │   │   │   │   │       ├── 01-using-npmresolver-api-intro.markdown
│   │   │   │   │   │   │       ├── 02-obtaining-osgi-bundle-npm-package-descriptors.markdown
│   │   │   │   │   │   │       └── 03-obtaining-dependency-npm-package-descriptors.markdown
│   │   │   │   │   │   └── 09-spa/
│   │   │   │   │   │       ├── 01-spa-intro.markdown
│   │   │   │   │   │       ├── 02-configuring-spa-system-settings.markdown
│   │   │   │   │   │       ├── 03-disabling-spa.markdown
│   │   │   │   │   │       ├── 04-specifying-how-resources-are-loaded-during-spa-navigation.markdown
│   │   │   │   │   │       └── 05-detaching-global-listeners.markdown
│   │   │   │   │   └── 08-applying-clay-styles-to-your-app/
│   │   │   │   │       ├── 01-applying-clay-styles-intro.markdown
│   │   │   │   │       ├── 02-clay-navigation-patterns/
│   │   │   │   │       │   └── 01-applying-clay-patterns-to-your-navigation-bar-intro.markdown
│   │   │   │   │       ├── 03-clay-management-toolbar/
│   │   │   │   │       │   ├── 01-implementing-the-management-toolbar-intro.markdown
│   │   │   │   │       │   ├── 02-configuring-view-types/
│   │   │   │   │       │   │   ├── 01-configuring-mgmt-bar-view-types-intro.markdown
│   │   │   │   │       │   │   ├── 02-implementing-the-card-view.markdown
│   │   │   │   │       │   │   ├── 03-implementing-the-list-view.markdown
│   │   │   │   │       │   │   ├── 04-implementing-the-table-view.markdown
│   │   │   │   │       │   │   └── 05-updating-the-search-iterator.markdown
│   │   │   │   │       │   └── 03-filtering-and-sorting/
│   │   │   │   │       │       └── 01-filtering-and-sorting-items-with-the-management-toolbar-intro.markdown
│   │   │   │   │       ├── 04-app-title-and-back-url/
│   │   │   │   │       │   └── 01-configuring-your-apps-title-and-back-link-intro.markdown
│   │   │   │   │       ├── 05-add-button-pattern/
│   │   │   │   │       │   └── 01-using-the-add-button-pattern-intro.markdown
│   │   │   │   │       ├── 06-configuring-admin-apps/
│   │   │   │   │       │   └── 01-configuring-your-admin-apps-actions-menus-intro.markdown
│   │   │   │   │       └── 07-empty-results-message/
│   │   │   │   │           └── 01-setting-empty-results-messages-intro.markdown
│   │   │   │   ├── search/
│   │   │   │   │   ├── 01-search-framework-intro.markdown
│   │   │   │   │   ├── 02-aggregations/
│   │   │   │   │   │   ├── 01-aggregations-intro.markdown
│   │   │   │   │   │   ├── 02-base-search-aggregations-code.markdown
│   │   │   │   │   │   └── 03-statistical-aggregations.markdown
│   │   │   │   │   ├── 02-indexing-framework/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── 02-indexing.markdown
│   │   │   │   │   │   ├── 03-searching.markdown
│   │   │   │   │   │   ├── 04-results.markdown
│   │   │   │   │   │   └── 05-registrar.markdown
│   │   │   │   │   └── 03-queries-and-filters/
│   │   │   │   │       ├── 01-queries-and-filters-intro.markdown
│   │   │   │   │       └── 02-building-search-queries-and-filters.markdown
│   │   │   │   ├── segmentation-and-personalization/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   ├── 02-segment-management.markdown
│   │   │   │   │   ├── 03-request-context-contributor.markdown
│   │   │   │   │   └── 04-segment-criteria-contributors.markdown
│   │   │   │   ├── service-context/
│   │   │   │   │   └── 01-understanding-service-context-intro.markdown
│   │   │   │   ├── testing/
│   │   │   │   │   └── 01-injecting-service-components-into-tests-intro.markdown
│   │   │   │   ├── upgrade-processes/
│   │   │   │   │   ├── 01-upgrade-processes-intro.markdown
│   │   │   │   │   ├── 02-creating-an-upgrade-process-for-your-application.markdown
│   │   │   │   │   ├── 03-upgrade-processes-for-former-service-builder-plugins.markdown
│   │   │   │   │   └── 04-upgrading-data-schemas-in-development.markdown
│   │   │   │   ├── user-associated-data/
│   │   │   │   │   ├── 01-managing-uad-intro.markdown
│   │   │   │   │   ├── 02-implementing-uad.markdown
│   │   │   │   │   ├── 03-gdpr-deletion-features.markdown
│   │   │   │   │   └── 04-filtering-and-searching.markdown
│   │   │   │   ├── web-experience-management/
│   │   │   │   │   ├── 01-web-experience-management-intro.markdown
│   │   │   │   │   ├── 02-page-fragments/
│   │   │   │   │   │   ├── 01-page-fragments-intro.markdown
│   │   │   │   │   │   ├── 02-developing-a-fragment.markdown
│   │   │   │   │   │   ├── 03-making-a-fragment-configurable.markdown
│   │   │   │   │   │   ├── 04-managing-fragments-and-collections.markdown
│   │   │   │   │   │   ├── 05-page-fragments-desktop-tools.markdown
│   │   │   │   │   │   ├── 06-creating-contributed-fragment-collection.markdown
│   │   │   │   │   │   └── 07-including-default-resources-in-fragments.markdown
│   │   │   │   │   ├── 03-supporting-custom-content-types-in-pages/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── 02-mapping-a-content-type-to-a-display-page-template.markdown
│   │   │   │   │   │   ├── 03-specifying-the-fields-of-a-custom-content-type.markdown
│   │   │   │   │   │   ├── 04-providing-friendly-urls-for-a-custom-content-type.markdown
│   │   │   │   │   │   └── 05-integrating-display-pages-into-content-creation.markdown
│   │   │   │   │   ├── 04-screen-navigation/
│   │   │   │   │   │   ├── 01-screen-navigation-framework-intro.markdown
│   │   │   │   │   │   ├── 02-screen-navigation-custom-apps.markdown
│   │   │   │   │   │   └── 03-customizing-liferay-apps.markdown
│   │   │   │   │   └── 05-developing-a-fragment-renderer/
│   │   │   │   │       ├── 01-intro.markdown
│   │   │   │   │       └── 02-creating-a-fragment-renderer.markdown
│   │   │   │   ├── web-services/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   ├── 02-headless-apis/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── 02-discover-api.markdown
│   │   │   │   │   │   ├── 03-invoke-service.markdown
│   │   │   │   │   │   ├── 04-authenticated-requests.markdown
│   │   │   │   │   │   ├── 05-collections/
│   │   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   │   ├── 02-getting-collections.markdown
│   │   │   │   │   │   │   ├── 03-pagination.markdown
│   │   │   │   │   │   │   └── 04-collection-to-elements.markdown
│   │   │   │   │   │   ├── 06-api-formats.markdown
│   │   │   │   │   │   ├── 07-openapi-profiles.markdown
│   │   │   │   │   │   ├── 08-filter-and-sort.markdown
│   │   │   │   │   │   ├── 09-restrict-properties.markdown
│   │   │   │   │   │   ├── 10-multipart.markdown
│   │   │   │   │   │   ├── 11-how-to-get-site-id.markdown
│   │   │   │   │   │   ├── 12-filtrable-properties.markdown
│   │   │   │   │   │   └── 13-using-rest-apis.markdown
│   │   │   │   │   ├── 03-jax/
│   │   │   │   │   │   ├── 01-jaxrs-intro.markdown
│   │   │   │   │   │   └── 02-jax-ws.markdown
│   │   │   │   │   ├── 04-graphql/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── 02-discover-api.markdown
│   │   │   │   │   │   ├── 03-invoke-service.markdown
│   │   │   │   │   │   ├── 04-authenticated-requests.markdown
│   │   │   │   │   │   ├── 05-collections.markdown
│   │   │   │   │   │   ├── 06-mutations.markdown
│   │   │   │   │   │   ├── 07-fragments-and-node-pattern.markdown
│   │   │   │   │   │   ├── 08-language-negociation.markdown
│   │   │   │   │   │   ├── 09-filter-and-sort.markdown
│   │   │   │   │   │   ├── 10-multipart.markdown
│   │   │   │   │   │   └── 11-using-graphql-apis.markdown
│   │   │   │   │   └── 05-rest-builder/
│   │   │   │   │       ├── 01-intro.markdown
│   │   │   │   │       ├── 02-how-to-install.markdown
│   │   │   │   │       ├── 03-openapi.markdown
│   │   │   │   │       ├── 04-develop.markdown
│   │   │   │   │       ├── 05-how-to-add-features-for-managing-collections.markdown
│   │   │   │   │       ├── 06-scaffolding.markdown
│   │   │   │   │       ├── 07-support-for-oneOf-anyOf-and-allOf.markdown
│   │   │   │   │       └── 08-good-practices-and-conventions.markdown
│   │   │   │   ├── workflow/
│   │   │   │   │   ├── 01-workflow-intro.markdown
│   │   │   │   │   └── 02-workflow-framework.markdown
│   │   │   │   └── wysiwyg-editors/
│   │   │   │       ├── 01-wysiwyg-editors-intro.markdown
│   │   │   │       ├── 02-wysiwyg-editor-in-portlet/
│   │   │   │       │   └── 01-adding-a-wysiwyg-editor-to-a-portlet-intro.markdown
│   │   │   │       ├── 03-modifying-editor-configuration/
│   │   │   │       │   └── 01-modifying-an-editors-configuration-intro.markdown
│   │   │   │       ├── 04-alloy-editor/
│   │   │   │       │   ├── 01-alloy-editor-intro.markdown
│   │   │   │       │   ├── 02-adding-buttons-to-the-alloyeditor/
│   │   │   │       │   │   ├── 01-adding-buttons-to-the-alloy-editor-intro.markdown
│   │   │   │       │   │   ├── 02-preparing-and-configuring-your-module.markdown
│   │   │   │       │   │   ├── 03-adding-buttons-to-the-alloyeditor-add-toolbar.markdown
│   │   │   │       │   │   └── 04-adding-buttons-to-the-alloyeditor-styles-toolbar.markdown
│   │   │   │       │   └── 04-embedding-content/
│   │   │   │       │       └── 01-embedding-content-in-the-editor-intro.markdown
│   │   │   │       └── 05-adding-new-editor-behaviors/
│   │   │   │           └── 01-adding-new-behavior-to-an-editor-intro.markdown
│   │   │   └── build.xml
│   │   ├── reference/
│   │   │   ├── articles/
│   │   │   │   ├── 01-intro/
│   │   │   │   │   └── 01-reference-intro.markdown
│   │   │   │   ├── 02-breaking-changes.markdown
│   │   │   │   ├── 02-cdi-portlet-predefined-beans.markdown
│   │   │   │   ├── 02-classes-moved/
│   │   │   │   │   └── 01-classes-moved-from-portal-service-jar-intro.markdown
│   │   │   │   ├── 02-export-import-and-staging/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   ├── decision-to-implement-staging.markdown
│   │   │   │   │   └── liferay-archive-file.markdown
│   │   │   │   ├── 02-front-end/
│   │   │   │   │   ├── 01-front-end-intro.markdown
│   │   │   │   │   ├── 02-freemarker-macros/
│   │   │   │   │   │   └── 01-liferay-freemarker-macros-intro.markdown
│   │   │   │   │   ├── 03-front-end-taglibs/
│   │   │   │   │   │   ├── 01-front-end-taglibs-intro.markdown
│   │   │   │   │   │   ├── 02-theme-objects/
│   │   │   │   │   │   │   └── 01-liferay-theme-objects-intro.markdown
│   │   │   │   │   │   ├── 03-portlet-objects/
│   │   │   │   │   │   │   └── 01-liferay-portlet-objects-intro.markdown
│   │   │   │   │   │   ├── 04-liferay-ui-taglibs/
│   │   │   │   │   │   │   ├── 01-using-liferay-ui-taglibs-intro.markdown
│   │   │   │   │   │   │   ├── 02-liferay-ui-icons.markdown
│   │   │   │   │   │   │   ├── 03-liferay-ui-icon-lists.markdown
│   │   │   │   │   │   │   ├── 04-liferay-ui-icon-menus.markdown
│   │   │   │   │   │   │   ├── 05-liferay-ui-tabs.markdown
│   │   │   │   │   │   │   └── 06-liferay-ui-icon-help.markdown
│   │   │   │   │   │   ├── 05-liferay-frontend-taglibs/
│   │   │   │   │   │   │   ├── 01-using-liferay-frontend-taglibs-intro.markdown
│   │   │   │   │   │   │   ├── 02-add-menu/
│   │   │   │   │   │   │   │   └── 01-liferay-frontend-add-menu-intro.markdown
│   │   │   │   │   │   │   ├── 03-cards/
│   │   │   │   │   │   │   │   └── 01-liferay-frontend-cards-intro.markdown
│   │   │   │   │   │   │   ├── 04-info-bar/
│   │   │   │   │   │   │   │   └── 01-liferay-frontend-info-bar-intro.markdown
│   │   │   │   │   │   │   └── 05-liferay-frontend-management-bar/
│   │   │   │   │   │   │       ├── 01-liferay-frontend-management-bar-intro.markdown
│   │   │   │   │   │   │       ├── 02-including-actions-in-the-management-bar.markdown
│   │   │   │   │   │   │       └── 03-disabling-the-management-bar.markdown
│   │   │   │   │   │   ├── 06-liferay-util-taglibs/
│   │   │   │   │   │   │   ├── 01-using-liferay-util-taglibs-intro.markdown
│   │   │   │   │   │   │   ├── 02-liferay-util-body-bottom.markdown
│   │   │   │   │   │   │   ├── 03-liferay-util-body-top.markdown
│   │   │   │   │   │   │   ├── 04-liferay-util-buffer.markdown
│   │   │   │   │   │   │   ├── 05-liferay-util-dynamic-include.markdown
│   │   │   │   │   │   │   ├── 06-liferay-util-get-url.markdown
│   │   │   │   │   │   │   ├── 07-liferay-util-html-bottom.markdown
│   │   │   │   │   │   │   ├── 08-liferay-util-html-top.markdown
│   │   │   │   │   │   │   ├── 09-liferay-util-include.markdown
│   │   │   │   │   │   │   ├── 10-liferay-util-param.markdown
│   │   │   │   │   │   │   └── 11-liferay-util-whitespace-remover.markdown
│   │   │   │   │   │   ├── 07-clay-taglibs/
│   │   │   │   │   │   │   ├── 01-using-clay-taglibs-intro.markdown
│   │   │   │   │   │   │   ├── 02-clay-alerts.markdown
│   │   │   │   │   │   │   ├── 03-clay-badges.markdown
│   │   │   │   │   │   │   ├── 04-clay-buttons.markdown
│   │   │   │   │   │   │   ├── 05-clay-cards.markdown
│   │   │   │   │   │   │   ├── 06-clay-dropdown-and-action-menus.markdown
│   │   │   │   │   │   │   ├── 07-clay-form-elements.markdown
│   │   │   │   │   │   │   ├── 08-clay-icons.markdown
│   │   │   │   │   │   │   ├── 09-clay-links-and-labels.markdown
│   │   │   │   │   │   │   ├── 10-clay-management-toolbar.markdown
│   │   │   │   │   │   │   ├── 11-clay-navigation-bars.markdown
│   │   │   │   │   │   │   ├── 12-clay-progress-bars.markdown
│   │   │   │   │   │   │   └── 13-clay-stickers.markdown
│   │   │   │   │   │   ├── 08-chart-taglibs/
│   │   │   │   │   │   │   ├── 01-using-chart-taglibs-intro.markdown
│   │   │   │   │   │   │   ├── 02-bar-charts.markdown
│   │   │   │   │   │   │   ├── 03-line-charts.markdown
│   │   │   │   │   │   │   ├── 04-scatter-charts.markdown
│   │   │   │   │   │   │   ├── 05-spline-charts.markdown
│   │   │   │   │   │   │   ├── 06-step-charts.markdown
│   │   │   │   │   │   │   ├── 07-combination-charts.markdown
│   │   │   │   │   │   │   ├── 08-donut-charts.markdown
│   │   │   │   │   │   │   ├── 09-gauge-charts.markdown
│   │   │   │   │   │   │   ├── 10-pie-charts.markdown
│   │   │   │   │   │   │   ├── 11-geomap-charts.markdown
│   │   │   │   │   │   │   ├── 12-predictive-charts.markdown
│   │   │   │   │   │   │   └── 13-refreshing-charts-to-reflect-real-time-data.markdown
│   │   │   │   │   │   └── 09-aui-taglibs/
│   │   │   │   │   │       ├── 01-using-aui-taglibs-intro.markdown
│   │   │   │   │   │       └── 02-building-forms-with-aui-tags.markdown
│   │   │   │   │   ├── 04-liferay-npm-bundler/
│   │   │   │   │   │   ├── 01-liferay-npm-bundler-intro.markdown
│   │   │   │   │   │   ├── 03-npmbundlerrc-structure.markdown
│   │   │   │   │   │   ├── 04-how-the-default-preset-configures-the-liferay-npm-bundler.markdown
│   │   │   │   │   │   ├── 05-the-structure-of-osgi-bundles-npm.markdown
│   │   │   │   │   │   ├── 06-how-portal-publishes-npm-packages.markdown
│   │   │   │   │   │   ├── 07-how-the-bundler-formats-js-modules.markdown
│   │   │   │   │   │   ├── 08-how-liferay-amd-loader-configuration-is-exported.markdown
│   │   │   │   │   │   ├── 09-changes-between-bundler-1.x-and-2.x.markdown
│   │   │   │   │   │   ├── 10-understanding-loader-rules.markdown
│   │   │   │   │   │   └── 11-default-bundler-loaders.markdown
│   │   │   │   │   ├── 05-liferay-js-apis/
│   │   │   │   │   │   ├── 01-liferay-js-apis-intro.markdown
│   │   │   │   │   │   ├── 02-theme-display.markdown
│   │   │   │   │   │   ├── 03-working-with-urls-in-js.markdown
│   │   │   │   │   │   ├── 04-javascript-utilities.markdown
│   │   │   │   │   │   ├── 05-invoking-liferay-services.markdown
│   │   │   │   │   │   ├── 06-handling-ajax-requests.markdown
│   │   │   │   │   │   └── 07-working-with-addresses.markdown
│   │   │   │   │   ├── 06-freemarker-taglib-macros/
│   │   │   │   │   │   └── 01-freemarker-taglib-macros-intro.markdown
│   │   │   │   │   ├── 07-npm-environment/
│   │   │   │   │   │   └── 01-setting-up-your-npm-environment-intro.markdown
│   │   │   │   │   ├── 08-sitemap-page-configuration/
│   │   │   │   │   │   └── 01-sitemap-pages-configuraiton-options-intro.markdown
│   │   │   │   │   ├── 09-ckeditor-plugins/
│   │   │   │   │   │   └── 01-ckeditor-plugin-reference-guide-intro.markdown
│   │   │   │   │   ├── 11-portlet-ids/
│   │   │   │   │   │   └── 01-fully-qualified-portlet-ids-intro.markdown
│   │   │   │   │   ├── 12-spa-lifecycle-events/
│   │   │   │   │   │   └── 01-spa-lifecycle-events-intro.markdown
│   │   │   │   │   ├── 13-theme-anatomy/
│   │   │   │   │   │   └── 01-theme-anatomy-reference-guide-intro.markdown
│   │   │   │   │   └── 14-freemarker-variables/
│   │   │   │   │       └── 01-freemarker-variables-intro.markdown
│   │   │   │   ├── 02-gradle-plugins/
│   │   │   │   │   ├── 00-intro.markdown
│   │   │   │   │   ├── app-javadoc-builder-gradle-plugin.markdown
│   │   │   │   │   ├── baseline-gradle-plugin.markdown
│   │   │   │   │   ├── change-log-builder-gradle-plugin.markdown
│   │   │   │   │   ├── css-builder-gradle-plugin.markdown
│   │   │   │   │   ├── db-support-gradle-plugin.markdown
│   │   │   │   │   ├── dependency-checker-gradle-plugin.markdown
│   │   │   │   │   ├── deployment-helper-gradle-plugin.markdown
│   │   │   │   │   ├── go-gradle-plugin.markdown
│   │   │   │   │   ├── gulp-gradle-plugin.markdown
│   │   │   │   │   ├── jasper-jspc-gradle-plugin.markdown
│   │   │   │   │   ├── javadoc-formatter-gradle-plugin.markdown
│   │   │   │   │   ├── js-module-config-generator-gradle-plugin.markdown
│   │   │   │   │   ├── js-transpiler-gradle-plugin.markdown
│   │   │   │   │   ├── jsdoc-gradle-plugin.markdown
│   │   │   │   │   ├── lang-builder-gradle-plugin.markdown
│   │   │   │   │   ├── maven-plugin-builder-gradle-plugin.markdown
│   │   │   │   │   ├── node-gradle-plugin.markdown
│   │   │   │   │   ├── rest-builder-gradle-plugin.markdown
│   │   │   │   │   ├── service-builder-gradle-plugin.markdown
│   │   │   │   │   ├── source-formatter-gradle-plugin.markdown
│   │   │   │   │   ├── soy-gradle-plugin.markdown
│   │   │   │   │   ├── target-platform-gradle-plugin.markdown
│   │   │   │   │   ├── theme-builder-gradle-plugin.markdown
│   │   │   │   │   ├── tld-formatter-gradle-plugin.markdown
│   │   │   │   │   ├── tlddoc-builder-gradle-plugin.markdown
│   │   │   │   │   ├── whip-gradle-plugin.markdown
│   │   │   │   │   ├── wsdd-builder-gradle-plugin.markdown
│   │   │   │   │   ├── wsdl-builder-gradle-plugin.markdown
│   │   │   │   │   ├── xml-formatter-gradle-plugin.markdown
│   │   │   │   │   └── xsd-builder-gradle-plugin.markdown
│   │   │   │   ├── 02-item-selector-criterion-and-return-types.markdown
│   │   │   │   ├── 02-java-apis.markdown
│   │   │   │   ├── 02-liferay-faces/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   ├── 02-liferay-faces-version-scheme.markdown
│   │   │   │   │   ├── 03-understanding-liferay-faces-bridge.markdown
│   │   │   │   │   ├── 04-understanding-liferay-faces-alloy.markdown
│   │   │   │   │   └── 05-understanding-liferay-faces-portal.markdown
│   │   │   │   ├── 02-maven-plugins/
│   │   │   │   │   ├── 00-intro.markdown
│   │   │   │   │   ├── bundle-support-plugin.markdown
│   │   │   │   │   ├── css-builder-plugin.markdown
│   │   │   │   │   ├── db-support-plugin.markdown
│   │   │   │   │   ├── deployment-helper-plugin.markdown
│   │   │   │   │   ├── javadoc-formatter-plugin.markdown
│   │   │   │   │   ├── lang-builder-plugin.markdown
│   │   │   │   │   ├── rest-builder-plugin.markdown
│   │   │   │   │   ├── service-builder-plugin.markdown
│   │   │   │   │   ├── source-formatter-plugin.markdown
│   │   │   │   │   ├── theme-builder-plugin.markdown
│   │   │   │   │   ├── tld-formatter-plugin.markdown
│   │   │   │   │   ├── wsdd-builder-plugin.markdown
│   │   │   │   │   └── xml-formatter-plugin.markdown
│   │   │   │   ├── 02-meaningful-schema-versioning.markdown
│   │   │   │   ├── 02-portlet-3-opt-in.markdown
│   │   │   │   ├── 02-portlet-descriptor-to-osgi-service-property-map.markdown
│   │   │   │   ├── 02-portletmvc4spring/
│   │   │   │   │   ├── 01-portletmvc4spring-intro.markdown
│   │   │   │   │   ├── 02-portletmvc4spring-project-anatomy.markdown
│   │   │   │   │   ├── 03-portletmvc4spring-annotations.markdown
│   │   │   │   │   └── 99-portletmvc4spring-configuration-files.markdown
│   │   │   │   ├── 02-project-templates/
│   │   │   │   │   ├── 00-intro.markdown
│   │   │   │   │   ├── activator-template.markdown
│   │   │   │   │   ├── api-template.markdown
│   │   │   │   │   ├── control-menu-entry-template.markdown
│   │   │   │   │   ├── form-field-template.markdown
│   │   │   │   │   ├── fragment-template.markdown
│   │   │   │   │   ├── freemarker-portlet-template.markdown
│   │   │   │   │   ├── layout-template.markdown
│   │   │   │   │   ├── modules-ext-template.markdown
│   │   │   │   │   ├── mvc-portlet-template.markdown
│   │   │   │   │   ├── panel-app-template.markdown
│   │   │   │   │   ├── portlet-configuration-icon-template.markdown
│   │   │   │   │   ├── portlet-provider-template.markdown
│   │   │   │   │   ├── portlet-toolbar-contributor-template.markdown
│   │   │   │   │   ├── rest-template.markdown
│   │   │   │   │   ├── service-builder-template.markdown
│   │   │   │   │   ├── service-template.markdown
│   │   │   │   │   ├── service-wrapper-template.markdown
│   │   │   │   │   ├── simulation-panel-entry-template.markdown
│   │   │   │   │   ├── social-bookmark.markdown
│   │   │   │   │   ├── spring-mvc-portlet-template.markdown
│   │   │   │   │   ├── template-context-contributor-template.markdown
│   │   │   │   │   ├── theme-contributor-template.markdown
│   │   │   │   │   ├── theme-template.markdown
│   │   │   │   │   ├── war-core-ext.markdown
│   │   │   │   │   ├── war-hook-template.markdown
│   │   │   │   │   └── war-mvc-portlet-template.markdown
│   │   │   │   ├── 02-sample-projects/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   ├── 02-apps/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── greedy-policy-option-portlet.markdown
│   │   │   │   │   │   ├── kotlin-portlet.markdown
│   │   │   │   │   │   ├── service-builder-samples/
│   │   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   │   ├── service-builder-adq.markdown
│   │   │   │   │   │   │   ├── service-builder-jdbc.markdown
│   │   │   │   │   │   │   └── service-builder-jndi.markdown
│   │   │   │   │   │   ├── shared-language-keys.markdown
│   │   │   │   │   │   ├── simulation-panel-app.markdown
│   │   │   │   │   │   └── workflow-samples/
│   │   │   │   │   │       ├── 01-intro.markdown
│   │   │   │   │   │       ├── 02-workflow-asset.markdown
│   │   │   │   │   │       └── 03-workflow-basic.markdown
│   │   │   │   │   ├── 03-extensions/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── control-menu-entry.markdown
│   │   │   │   │   │   ├── document-action.markdown
│   │   │   │   │   │   ├── gogo-shell-command.markdown
│   │   │   │   │   │   ├── index-settings-contributor.markdown
│   │   │   │   │   │   ├── indexer-post-processor.markdown
│   │   │   │   │   │   ├── model-listener.markdown
│   │   │   │   │   │   ├── screen-name-validator.markdown
│   │   │   │   │   │   └── servlet.markdown
│   │   │   │   │   ├── 04-overrides/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── module-jsp-override.markdown
│   │   │   │   │   │   └── resource-bundle-override.markdown
│   │   │   │   │   ├── 05-themes/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── simple-theme.markdown
│   │   │   │   │   │   ├── template-context-contributor.markdown
│   │   │   │   │   │   └── theme-contributor.markdown
│   │   │   │   │   └── 06-ext/
│   │   │   │   │       ├── 01-intro.markdown
│   │   │   │   │       └── login-web-ext.markdown
│   │   │   │   ├── 02-segmentation-and-personalization/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   └── 02-defining-segment-criteria.markdown
│   │   │   │   ├── 02-third-party-packages-portal-exports.markdown
│   │   │   │   ├── 02-tooling/
│   │   │   │   │   ├── 00-intro.markdown
│   │   │   │   │   ├── 01-creating-a-project.markdown
│   │   │   │   │   ├── 02-deploying-a-project.markdown
│   │   │   │   │   ├── blade-cli/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── 02-installing-blade-cli.markdown
│   │   │   │   │   │   ├── 03-installing-blade-cli-with-proxy-requirements.markdown
│   │   │   │   │   │   ├── 04-managing-your-liferay-server-with-blade-cli.markdown
│   │   │   │   │   │   ├── 05-generating-project-samples-with-blade-cli.markdown
│   │   │   │   │   │   ├── 06-updating-blade-cli.markdown
│   │   │   │   │   │   ├── 07-converting-plugins-sdk-projects-with-blade-cli.markdown
│   │   │   │   │   │   ├── 08-extending-blade-cli/
│   │   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   │   ├── 02-creating-custom-commands-for-blade-cli.markdown
│   │   │   │   │   │   │   ├── 03-creating-custom-project-templates-for-blade-cli.markdown
│   │   │   │   │   │   │   ├── 04-installing-new-extensions-for-blade-cli.markdown
│   │   │   │   │   │   │   └── 05-creating-a-blade-profile.markdown
│   │   │   │   │   │   └── 100-common-errors-with-blade-cli-installation.markdown
│   │   │   │   │   ├── dev-studio/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── 02-installing-dev-studio.markdown
│   │   │   │   │   │   ├── 03-setting-proxy-requirements-for-dev-studio.markdown
│   │   │   │   │   │   ├── 04-installing-a-server-in-dev-studio.markdown
│   │   │   │   │   │   ├── 05-importing-projects-in-dev-studio.markdown
│   │   │   │   │   │   ├── 06-using-the-gogo-shell-in-dev-studio.markdown
│   │   │   │   │   │   ├── 07-searching-liferay-portal-source-with-dev-studio.markdown
│   │   │   │   │   │   ├── 08-debugging-liferay-portal-source-with-dev-studio.markdown
│   │   │   │   │   │   ├── 09-updating-dev-studio.markdown
│   │   │   │   │   │   ├── 100-gradle-in-dev-studio.markdown
│   │   │   │   │   │   └── 101-maven-in-dev-studio.markdown
│   │   │   │   │   ├── intellij/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── 02-installing-liferay-intellij-plugin.markdown
│   │   │   │   │   │   ├── 03-installing-a-server-in-intellij-idea.markdown
│   │   │   │   │   │   └── 04-updating-liferay-intellij-plugin.markdown
│   │   │   │   │   ├── liferay-js-generator/
│   │   │   │   │   │   ├── 01-js-generator-intro.markdown
│   │   │   │   │   │   ├── 02-installing-the-js-generator-and-creating-js-portlets.markdown
│   │   │   │   │   │   ├── 04-understanding-the-js-portlet-extender-configuration.markdown
│   │   │   │   │   │   ├── 05-configuration-json-options.markdown
│   │   │   │   │   │   └── 06-adapting-apps-for-liferay.markdown
│   │   │   │   │   ├── liferay-workspace/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── 02-installing-liferay-workspace.markdown
│   │   │   │   │   │   ├── 03-creating-a-liferay-workspace.markdown
│   │   │   │   │   │   ├── 04-importing-a-liferay-workspace-into-an-ide.markdown
│   │   │   │   │   │   ├── 05-setting-proxy-requirements-for-liferay-workspace.markdown
│   │   │   │   │   │   ├── 06-adding-a-liferay-bundle-to-workspace.markdown
│   │   │   │   │   │   ├── 07-setting-environment-configurations-for-liferay-workspace.markdown
│   │   │   │   │   │   ├── 08-building-nodejs-themes-in-liferay-workspace.markdown
│   │   │   │   │   │   ├── 09-building-gradle-maven-themes-in-liferay-workspace.markdown
│   │   │   │   │   │   ├── 10-managing-the-target-platform/
│   │   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   │   ├── 02-setting-the-target-platform.markdown
│   │   │   │   │   │   │   ├── 03-targeting-a-platform-outside-of-workspace.markdown
│   │   │   │   │   │   │   └── 04-targetinging-a-platform-with-maven.markdown
│   │   │   │   │   │   ├── 11-validating-modules-against-the-target-platform/
│   │   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   │   ├── 02-adding-a-third-party-librarys-capabilities-to-the-resolvers-capabilities.markdown
│   │   │   │   │   │   │   ├── 03-skipping-the-resolving-process-for-a-module.markdown
│   │   │   │   │   │   │   ├── 04-depending-on-a-customized-distribution-of-liferay.markdown
│   │   │   │   │   │   │   ├── 05-including-the-resolver-in-your-gradle-build.markdown
│   │   │   │   │   │   │   ├── 06-how-to-resolve-common-output-errors-reported-by-the-resolve-task.markdown
│   │   │   │   │   │   │   └── 99-validating-modules-outside-of-workspace.markdown
│   │   │   │   │   │   ├── 12-leveraging-docker/
│   │   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   │   ├── 02-creating-a-liferay-docker-container.markdown
│   │   │   │   │   │   │   ├── 03-configuring-a-docker-container.markdown
│   │   │   │   │   │   │   └── 04-building-a-custom-docker-image.markdown
│   │   │   │   │   │   ├── 13-updating-liferay-workspace.markdown
│   │   │   │   │   │   └── 14-updating-default-plugins-provided-by-liferay-workspace.markdown
│   │   │   │   │   ├── maven/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── 02-installing-remote-liferay-maven-artifacts.markdown
│   │   │   │   │   │   ├── 04-creating-a-maven-repository.markdown
│   │   │   │   │   │   ├── 05-configuring-local-maven-settings-to-access-repositories.markdown
│   │   │   │   │   │   ├── 06-deploying-liferay-maven-artifacts-to-a-repository.markdown
│   │   │   │   │   │   ├── 07-building-an-osgi-module-jar-with-maven.markdown
│   │   │   │   │   │   ├── 08-building-themes-in-a-maven-project.markdown
│   │   │   │   │   │   ├── 09-compiling-sass-files-in-a-maven-project.markdown
│   │   │   │   │   │   ├── 10-using-service-builder-in-a-maven-project.markdown
│   │   │   │   │   │   └── 99-upgrading-your-maven-build-environment.markdown
│   │   │   │   │   ├── theme-generator/
│   │   │   │   │   │   ├── 01-theme-generator-intro.markdown
│   │   │   │   │   │   ├── 02-installing-the-theme-generator-and-creating-themes.markdown
│   │   │   │   │   │   ├── 03-generating-layout-templates.markdown
│   │   │   │   │   │   └── 05-generating-themelets.markdown
│   │   │   │   │   └── upgrade-planner/
│   │   │   │   │       ├── 01-liferay-upgrade-planner-intro.markdown
│   │   │   │   │       └── 02-using-upgrade-planner-with-proxy-requirements.markdown
│   │   │   │   ├── 02-web-experience-management/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   ├── 02-page-fragments/
│   │   │   │   │   │   ├── 01-fragment-specific-tags-intro.markdown
│   │   │   │   │   │   ├── 02-fragment-configuration-types.markdown
│   │   │   │   │   │   └── 03-escaping-fragment-configuration-text-values.markdown
│   │   │   │   │   └── 03-asset-display-page-taglib.markdown
│   │   │   │   └── 02-workflow/
│   │   │   │       ├── 01-creating-workflow-definitions-intro.markdown
│   │   │   │       ├── 02-workflow-nodes.markdown
│   │   │   │       ├── 03-tasks.markdown
│   │   │   │       └── 04-notifications.markdown
│   │   │   ├── articles-dxp/
│   │   │   │   ├── 02-classes-moved/
│   │   │   │   │   └── 01-classes-moved-from-portal-service-jar-intro.markdown
│   │   │   │   └── 02-tooling/
│   │   │   │       └── dev-studio/
│   │   │   │           └── 02-installing-dev-studio.markdown
│   │   │   ├── build.xml
│   │   │   └── code/
│   │   │       └── adapted-react-app/
│   │   │           └── my-react-guestbook-app/
│   │   │               ├── .gitignore
│   │   │               ├── .npmbuildrc
│   │   │               ├── .npmbundlerrc
│   │   │               ├── README.md
│   │   │               ├── features/
│   │   │               │   └── localization/
│   │   │               │       └── Language.properties
│   │   │               ├── package.json
│   │   │               ├── public/
│   │   │               │   ├── index.html
│   │   │               │   └── manifest.json
│   │   │               └── src/
│   │   │                   ├── App.css
│   │   │                   ├── App.js
│   │   │                   ├── App.test.js
│   │   │                   ├── add-entry.js
│   │   │                   ├── index.css
│   │   │                   ├── index.js
│   │   │                   ├── serviceWorker.js
│   │   │                   └── view-guestbook.js
│   │   └── tutorials/
│   │       ├── articles/
│   │       │   ├── 01-tutorials-intro/
│   │       │   │   └── 01-tutorials-intro.markdown
│   │       │   ├── 02-developing-a-web-application/
│   │       │   │   ├── 01-intro.markdown
│   │       │   │   ├── 02-setting-up-liferay-development/
│   │       │   │   │   └── 01-setting-up-liferay-development-intro.markdown
│   │       │   │   ├── 03-generating-the-backend/
│   │       │   │   │   ├── 00-intro.markdown
│   │       │   │   │   ├── 01-what-is-service-builder.markdown
│   │       │   │   │   ├── 02-generating-layers.markdown
│   │       │   │   │   └── 03-implementing-service-methods.markdown
│   │       │   │   ├── 04-building-the-web-front-end/
│   │       │   │   │   ├── 01-intro.markdown
│   │       │   │   │   ├── 02-creating-the-web-project.markdown
│   │       │   │   │   ├── 03-defining-component-metadata-properties.markdown
│   │       │   │   │   ├── 04-portlet-keys.markdown
│   │       │   │   │   ├── 05-integrating-the-back-end.markdown
│   │       │   │   │   ├── 06-creating-a-button.markdown
│   │       │   │   │   ├── 07-generating-portlet-urls.markdown
│   │       │   │   │   ├── 08-linking-to-another-page.markdown
│   │       │   │   │   ├── 09-forms-and-action-urls.markdown
│   │       │   │   │   ├── 10-implementing-portlet-actions.markdown
│   │       │   │   │   ├── 11-displaying-guestbook-entries.markdown
│   │       │   │   │   └── 12-fitting-it-all-together.markdown
│   │       │   │   ├── 05-writing-admin-portlet/
│   │       │   │   │   ├── 01-writing-the-guestbook-admin-application-intro.markdown
│   │       │   │   │   ├── 02-creating-the-classes.markdown
│   │       │   │   │   ├── 03-updating-metadata.markdown
│   │       │   │   │   ├── 04-updating-your-service-layer.markdown
│   │       │   │   │   ├── 05-defining-portlet-actions.markdown
│   │       │   │   │   ├── 06-adding-tabs-to-the-guestbook-portlet.markdown
│   │       │   │   │   └── 07-creating-a-user-interface.markdown
│   │       │   │   ├── 06-displaying-message-errors/
│   │       │   │   │   ├── 01-intro.markdown
│   │       │   │   │   ├── 02-creating-language-keys.markdown
│   │       │   │   │   ├── 03-adding-error-messages.markdown
│   │       │   │   │   └── 04-adding-messages-jsp.markdown
│   │       │   │   ├── 07-permissions/
│   │       │   │   │   ├── 01-permissions-intro.markdown
│   │       │   │   │   ├── 02-defining-permissions.markdown
│   │       │   │   │   ├── 03-registering-permissions-database.markdown
│   │       │   │   │   ├── 04-registering-permissions-container.markdown
│   │       │   │   │   ├── 05-assigning-permissions-to-resources.markdown
│   │       │   │   │   └── 06-checking-permissions-jsps.markdown
│   │       │   │   ├── 08-search-and-indexing/
│   │       │   │   │   ├── 01-intro.markdown
│   │       │   │   │   ├── 02-enabling-search-and-indexing-for-guestbooks/
│   │       │   │   │   │   ├── 01-intro.markdown
│   │       │   │   │   │   ├── 02-understanding-search-and-indexing.markdown
│   │       │   │   │   │   ├── 03-registering-search-services.markdown
│   │       │   │   │   │   ├── 04-indexing-guestbooks.markdown
│   │       │   │   │   │   ├── 05-querying-guestbook.markdown
│   │       │   │   │   │   ├── 06-summarizing-search-documents.markdown
│   │       │   │   │   │   └── 07-handling-indexing-in-the-guestbook-service-layer.markdown
│   │       │   │   │   ├── 03-enabling-search-and-indexing-for-guestbook-entries/
│   │       │   │   │   │   ├── 01-intro.markdown
│   │       │   │   │   │   ├── 02-registering-search-services.markdown
│   │       │   │   │   │   ├── 03-indexing-entries.markdown
│   │       │   │   │   │   ├── 04-querying-entries.markdown
│   │       │   │   │   │   ├── 05-summarizing-search-documents.markdown
│   │       │   │   │   │   └── 06-handling-indexing-in-the-entry-service-layer.markdown
│   │       │   │   │   └── 04-updating-your-user-interface-for-search/
│   │       │   │   │       ├── 01-intro.markdown
│   │       │   │   │       ├── 02-adding-a-search-bar-to-the-guestbook-portlet.markdown
│   │       │   │   │       └── 03-creating-a-search-results-jsp-for-the-guestbook-portlet.markdown
│   │       │   │   ├── 09-assets/
│   │       │   │   │   ├── 01-intro.markdown
│   │       │   │   │   ├── 02-enabling-assets-at-the-service-layer/
│   │       │   │   │   │   ├── 01-enabling-assets-at-the-service-layer-intro.markdown
│   │       │   │   │   │   ├── 02-handling-assets-at-the-guestbook-service-layer.markdown
│   │       │   │   │   │   └── 03-handling-assets-at-the-entry-service-layer.markdown
│   │       │   │   │   ├── 03-implementing-asset-renderers/
│   │       │   │   │   │   ├── 01-implementing-asset-renderers-intro.markdown
│   │       │   │   │   │   ├── 02-implementing-a-guestbook-asset-renderer.markdown
│   │       │   │   │   │   └── 03-implementing-an-entry-asset-renderer.markdown
│   │       │   │   │   └── 04-adding-asset-features-to-your-user-interface/
│   │       │   │   │       ├── 01-adding-asset-features-to-your-user-interface-intro.markdown
│   │       │   │   │       ├── 02-creating-jsps-for-displaying-custom-assets-in-the-asset-publisher.markdown
│   │       │   │   │       ├── 03-enabling-tags-categories-and-assets-for-guestbooks.markdown
│   │       │   │   │       ├── 04-enabling-tags-categories-and-assets-for-entries.markdown
│   │       │   │   │       └── 05-enabling-comments-and-ratings-for-entries.markdown
│   │       │   │   └── 10-workflow/
│   │       │   │       ├── 01-intro.markdown
│   │       │   │       ├── 02-supporting-workflow-status/
│   │       │   │       │   ├── 01-enabling-workflow-service-layer-intro.markdown
│   │       │   │       │   ├── 02-setting-guestbook-status.markdown
│   │       │   │       │   ├── 03-setting-entry-status.markdown
│   │       │   │       │   └── 04-finding-entities-by-status.markdown
│   │       │   │       ├── 03-workflow-handlers/
│   │       │   │       │   ├── 01-implementing-workflow-handlers-intro.markdown
│   │       │   │       │   ├── 02-guestbook-workflow-handlers.markdown
│   │       │   │       │   └── 03-entry-workflow-handlers.markdown
│   │       │   │       └── 04-displaying-approved-items/
│   │       │   │           ├── 01-displaying-approved-workflow-items-intro.markdown
│   │       │   │           ├── 02-displaying-status-guestbook-admin.markdown
│   │       │   │           └── 03-displaying-approved-entries.markdown
│   │       │   ├── 03-upgrading-code-to-liferay-7.2/
│   │       │   │   ├── 01-intro.markdown
│   │       │   │   ├── 02-upgrading-your-development-environment.markdown
│   │       │   │   ├── 03-migrating-plugins-sdk-projects-to-liferay-workspace.markdown
│   │       │   │   ├── 04-upgrading-build-dependencies.markdown
│   │       │   │   ├── 05-fixing-upgrade-problems/
│   │       │   │   │   ├── 01-intro.markdown
│   │       │   │   │   ├── 02-resolving-a-projects-dependencies.markdown
│   │       │   │   │   └── 03-resolving-breaking-changes.markdown
│   │       │   │   ├── 06-upgrading-service-builder-services/
│   │       │   │   │   ├── 01-intro.markdown
│   │       │   │   │   ├── 02-removing-legacy-files.markdown
│   │       │   │   │   ├── 03-converting-a-service-builder-module-from-spring-di-to-osgi-ds.markdown
│   │       │   │   │   └── 04-rebuilding-services.markdown
│   │       │   │   ├── 07-upgrading-customization-plugins/
│   │       │   │   │   ├── 01-intro.markdown
│   │       │   │   │   ├── 02-upgrading-customization-modules.markdown
│   │       │   │   │   ├── 03-upgrading-core-jsp-hooks.markdown
│   │       │   │   │   ├── 04-upgrading-portlet-jsp-hooks.markdown
│   │       │   │   │   ├── 05-upgrading-service-wrapper-hooks.markdown
│   │       │   │   │   ├── 06-upgrading-core-language-key-hooks.markdown
│   │       │   │   │   ├── 07-upgrading-portlet-language-key-hooks.markdown
│   │       │   │   │   ├── 08-upgrading-model-listener-hooks.markdown
│   │       │   │   │   ├── 09-upgrading-event-actions-hooks.markdown
│   │       │   │   │   ├── 10-upgrading-servlet-filter-hooks.markdown
│   │       │   │   │   ├── 11-upgrading-portal-property-hooks.markdown
│   │       │   │   │   └── 12-upgrading-struts-action-hooks.markdown
│   │       │   │   ├── 08-upgrading-themes/
│   │       │   │   │   ├── 01-upgrading-a-theme-to-7-2-intro.markdown
│   │       │   │   │   ├── 02-upgrading-6.2-themes-7.2/
│   │       │   │   │   │   ├── 01-upgrading-6.2-themes-to-7.1-intro.markdown
│   │       │   │   │   │   ├── 02-setting-up-the-development-environment/
│   │       │   │   │   │   │   ├── 01-setting-up-the-development-environment-intro.markdown
│   │       │   │   │   │   │   ├── 02-installing-the-theme-generator.markdown
│   │       │   │   │   │   │   └── 03-importing-the-theme-into-the-toolkit.markdown
│   │       │   │   │   │   ├── 03-running-the-upgrade-task/
│   │       │   │   │   │   │   └── 01-running-the-theme-upgrade-task-for-6.2-themes-intro.markdown
│   │       │   │   │   │   ├── 04-updating-6.2-css-code/
│   │       │   │   │   │   │   ├── 01-updating-6.2-css-code-intro.markdown
│   │       │   │   │   │   │   ├── 02-updating-bootstrap-rules-and-font-awesome-imports.markdown
│   │       │   │   │   │   │   └── 03-updating-6.2-responsiveness.markdown
│   │       │   │   │   │   ├── 05-updating-theme-templates/
│   │       │   │   │   │   │   ├── 01-updating-6.2-theme-templates-intro.markdown
│   │       │   │   │   │   │   ├── 02-updating-6.2-portal-normal-theme-template.markdown
│   │       │   │   │   │   │   ├── 03-updating-6.2-navigation-theme-template.markdown
│   │       │   │   │   │   │   └── 04-updating-6.2-init-custom-theme-template.markdown
│   │       │   │   │   │   ├── 06-updating-the-resources-importer-configuration-and-content/
│   │       │   │   │   │   │   ├── 01-updating-the-importer-intro.markdown
│   │       │   │   │   │   │   ├── 02-updating-package-properties.markdown
│   │       │   │   │   │   │   ├── 03-updating-web-content.markdown
│   │       │   │   │   │   │   └── 04-updating-the-sitemap.markdown
│   │       │   │   │   │   └── 07-applying-clay-design-patterns/
│   │       │   │   │   │       └── 01-applying-clay-design-patterns-intro.markdown
│   │       │   │   │   ├── 03-upgrading-7.0-themes-7.2/
│   │       │   │   │   │   ├── 01-upgrading-7.0-themes-intro.markdown
│   │       │   │   │   │   ├── 02-running-the-upgrade-task/
│   │       │   │   │   │   │   └── 01-running-the-theme-upgrade-task-intro.markdown
│   │       │   │   │   │   ├── 03-updating-7.0-css-code/
│   │       │   │   │   │   │   ├── 01-updating-7.0-css-code-intro.markdown
│   │       │   │   │   │   │   ├── 02-renaming-7-0-css-files.markdown
│   │       │   │   │   │   │   ├── 03-updating-7.0-variables.markdown
│   │       │   │   │   │   │   └── 04-updating-7.0-imports.markdown
│   │       │   │   │   │   ├── 04-updating-7.0-theme-templates/
│   │       │   │   │   │   │   ├── 01-updating-7.0-theme-templates-intro.markdown
│   │       │   │   │   │   │   └── 02-updating-7.0-theme-templates-to-7.2.markdown
│   │       │   │   │   │   └── 05-bootstrap-lexicon-compatibility-layer.markdown
│   │       │   │   │   └── 04-upgrading-7.1-themes-7.2/
│   │       │   │   │       └── 01-upgrading-7-1-themes-7-2-intro.markdown
│   │       │   │   ├── 09-upgrading-layout-templates/
│   │       │   │   │   ├── 01-upgrading-layout-templates-to-7.2-intro.markdown
│   │       │   │   │   ├── 02-upgrading-6.2-layouts-7.2/
│   │       │   │   │   │   └── 01-upgrading-6-2-layout-templates-intro.markdown
│   │       │   │   │   └── 03-upgrading-7.0-7.1-layouts-7.2/
│   │       │   │   │       └── 01-upgrading-7-0-layout-templates-intro.markdown
│   │       │   │   ├── 10-upgrading-frameworks-and-features/
│   │       │   │   │   ├── 01-intro.markdown
│   │       │   │   │   ├── 02-upgrading-jndi-data-source-usage.markdown
│   │       │   │   │   ├── 03-upgrading-service-builder-service-invocation.markdown
│   │       │   │   │   ├── 04-upgrading-service-builder.markdown
│   │       │   │   │   └── 05-migrating-off-of-velocity-templates.markdown
│   │       │   │   ├── 11-upgrading-portlets/
│   │       │   │   │   ├── 01-intro.markdown
│   │       │   │   │   ├── 02-upgrading-a-genericportlet.markdown
│   │       │   │   │   ├── 03-upgrading-a-liferay-mvc-portlet.markdown
│   │       │   │   │   ├── 04-upgrading-a-liferay-jsf-portlet.markdown
│   │       │   │   │   ├── 05-upgrading-a-servlet-based-portlet.markdown
│   │       │   │   │   ├── 06-upgrading-a-spring-portlet-mvc-portlet.markdown
│   │       │   │   │   └── 07-upgrading-a-struts-1-portlet.markdown
│   │       │   │   ├── 12-upgrading-web-plugins.markdown
│   │       │   │   └── 13-upgrading-ext-plugins.markdown
│   │       │   └── 04-creating-a-theme/
│   │       │       ├── 01-creating-a-theme-intro.markdown
│   │       │       ├── 02-setting-up-the-theme.markdown
│   │       │       ├── 03-updating-the-header-and-logo.markdown
│   │       │       ├── 04-customizing-the-navigation.markdown
│   │       │       ├── 05-defining-the-footer-and-navigation.markdown
│   │       │       └── 06-adding-a-color-scheme.markdown
│   │       ├── build.xml
│   │       ├── code/
│   │       │   ├── guestbook/
│   │       │   │   ├── 04-web-front-end/
│   │       │   │   │   └── com-liferay-docs-guestbook/
│   │       │   │   │       ├── .blade.properties
│   │       │   │   │       ├── .gitignore
│   │       │   │   │       ├── build.gradle
│   │       │   │   │       ├── configs/
│   │       │   │   │       │   ├── common/
│   │       │   │   │       │   │   └── .touch
│   │       │   │   │       │   ├── dev/
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   ├── docker/
│   │       │   │   │       │   │   └── .touch
│   │       │   │   │       │   ├── local/
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   ├── prod/
│   │       │   │   │       │   │   ├── osgi/
│   │       │   │   │       │   │   │   └── configs/
│   │       │   │   │       │   │   │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   └── uat/
│   │       │   │   │       │       ├── osgi/
│   │       │   │   │       │       │   └── configs/
│   │       │   │   │       │       │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │   │       │       └── portal-ext.properties
│   │       │   │   │       ├── gradle/
│   │       │   │   │       │   └── wrapper/
│   │       │   │   │       │       ├── gradle-wrapper.jar
│   │       │   │   │       │       └── gradle-wrapper.properties
│   │       │   │   │       ├── gradle.properties
│   │       │   │   │       ├── gradlew
│   │       │   │   │       ├── gradlew.bat
│   │       │   │   │       ├── modules/
│   │       │   │   │       │   └── guestbook/
│   │       │   │   │       │       ├── .gitignore
│   │       │   │   │       │       ├── build.gradle
│   │       │   │   │       │       ├── guestbook-api/
│   │       │   │   │       │       │   ├── bnd.bnd
│   │       │   │   │       │       │   ├── build.gradle
│   │       │   │   │       │       │   └── src/
│   │       │   │   │       │       │       └── main/
│   │       │   │   │       │       │           └── java/
│   │       │   │   │       │       │               └── com/
│   │       │   │   │       │       │                   └── liferay/
│   │       │   │   │       │       │                       └── docs/
│   │       │   │   │       │       │                           └── guestbook/
│   │       │   │   │       │       │                               ├── exception/
│   │       │   │   │       │       │                               │   ├── EntryEmailException.java
│   │       │   │   │       │       │                               │   ├── EntryMessageException.java
│   │       │   │   │       │       │                               │   ├── EntryNameException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryEmailException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryMessageException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryNameException.java
│   │       │   │   │       │       │                               │   ├── GuestbookNameException.java
│   │       │   │   │       │       │                               │   ├── NoSuchGuestbookEntryException.java
│   │       │   │   │       │       │                               │   └── NoSuchGuestbookException.java
│   │       │   │   │       │       │                               ├── model/
│   │       │   │   │       │       │                               │   ├── Guestbook.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntry.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryModel.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntrySoap.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryWrapper.java
│   │       │   │   │       │       │                               │   ├── GuestbookModel.java
│   │       │   │   │       │       │                               │   ├── GuestbookSoap.java
│   │       │   │   │       │       │                               │   └── GuestbookWrapper.java
│   │       │   │   │       │       │                               └── service/
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalService.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryService.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalService.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookService.java
│   │       │   │   │       │       │                                   ├── GuestbookServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookServiceWrapper.java
│   │       │   │   │       │       │                                   └── persistence/
│   │       │   │   │       │       │                                       ├── GuestbookEntryPersistence.java
│   │       │   │   │       │       │                                       ├── GuestbookEntryUtil.java
│   │       │   │   │       │       │                                       ├── GuestbookPersistence.java
│   │       │   │   │       │       │                                       └── GuestbookUtil.java
│   │       │   │   │       │       ├── guestbook-service/
│   │       │   │   │       │       │   ├── bnd.bnd
│   │       │   │   │       │       │   ├── build.gradle
│   │       │   │   │       │       │   ├── service.xml
│   │       │   │   │       │       │   └── src/
│   │       │   │   │       │       │       └── main/
│   │       │   │   │       │       │           ├── java/
│   │       │   │   │       │       │           │   └── com/
│   │       │   │   │       │       │           │       └── liferay/
│   │       │   │   │       │       │           │           └── docs/
│   │       │   │   │       │       │           │               └── guestbook/
│   │       │   │   │       │       │           │                   ├── model/
│   │       │   │   │       │       │           │                   │   └── impl/
│   │       │   │   │       │       │           │                   │       ├── GuestbookBaseImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookCacheModel.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryBaseImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryCacheModel.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryModelImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookImpl.java
│   │       │   │   │       │       │           │                   │       └── GuestbookModelImpl.java
│   │       │   │   │       │       │           │                   └── service/
│   │       │   │   │       │       │           │                       ├── base/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryLocalServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookLocalServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceBaseImpl.java
│   │       │   │   │       │       │           │                       ├── http/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceHttp.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceSoap.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookServiceHttp.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceSoap.java
│   │       │   │   │       │       │           │                       ├── impl/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryLocalServiceImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookLocalServiceImpl.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceImpl.java
│   │       │   │   │       │       │           │                       └── persistence/
│   │       │   │   │       │       │           │                           └── impl/
│   │       │   │   │       │       │           │                               ├── GuestbookEntryPersistenceImpl.java
│   │       │   │   │       │       │           │                               ├── GuestbookPersistenceImpl.java
│   │       │   │   │       │       │           │                               └── constants/
│   │       │   │   │       │       │           │                                   └── GBPersistenceConstants.java
│   │       │   │   │       │       │           └── resources/
│   │       │   │   │       │       │               ├── META-INF/
│   │       │   │   │       │       │               │   ├── module-hbm.xml
│   │       │   │   │       │       │               │   ├── portlet-model-hints.xml
│   │       │   │   │       │       │               │   └── sql/
│   │       │   │   │       │       │               │       ├── indexes.sql
│   │       │   │   │       │       │               │       ├── sequences.sql
│   │       │   │   │       │       │               │       └── tables.sql
│   │       │   │   │       │       │               └── service.properties
│   │       │   │   │       │       └── guestbook-web/
│   │       │   │   │       │           ├── .gitignore
│   │       │   │   │       │           ├── bnd.bnd
│   │       │   │   │       │           ├── build.gradle
│   │       │   │   │       │           └── src/
│   │       │   │   │       │               └── main/
│   │       │   │   │       │                   ├── java/
│   │       │   │   │       │                   │   └── com/
│   │       │   │   │       │                   │       └── liferay/
│   │       │   │   │       │                   │           └── docs/
│   │       │   │   │       │                   │               └── guestbook/
│   │       │   │   │       │                   │                   ├── constants/
│   │       │   │   │       │                   │                   │   └── GuestbookPortletKeys.java
│   │       │   │   │       │                   │                   └── portlet/
│   │       │   │   │       │                   │                       └── GuestbookPortlet.java
│   │       │   │   │       │                   └── resources/
│   │       │   │   │       │                       ├── META-INF/
│   │       │   │   │       │                       │   └── resources/
│   │       │   │   │       │                       │       ├── css/
│   │       │   │   │       │                       │       │   └── main.scss
│   │       │   │   │       │                       │       ├── guestbook/
│   │       │   │   │       │                       │       │   ├── edit_entry.jsp
│   │       │   │   │       │                       │       │   ├── entry_actions.jsp
│   │       │   │   │       │                       │       │   └── view.jsp
│   │       │   │   │       │                       │       └── init.jsp
│   │       │   │   │       │                       └── content/
│   │       │   │   │       │                           └── Language.properties
│   │       │   │   │       └── settings.gradle
│   │       │   │   ├── 05-admin-portlet/
│   │       │   │   │   └── com-liferay-docs-guestbook/
│   │       │   │   │       ├── .blade.properties
│   │       │   │   │       ├── .gitignore
│   │       │   │   │       ├── build.gradle
│   │       │   │   │       ├── configs/
│   │       │   │   │       │   ├── common/
│   │       │   │   │       │   │   └── .touch
│   │       │   │   │       │   ├── dev/
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   ├── docker/
│   │       │   │   │       │   │   └── .touch
│   │       │   │   │       │   ├── local/
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   ├── prod/
│   │       │   │   │       │   │   ├── osgi/
│   │       │   │   │       │   │   │   └── configs/
│   │       │   │   │       │   │   │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   └── uat/
│   │       │   │   │       │       ├── osgi/
│   │       │   │   │       │       │   └── configs/
│   │       │   │   │       │       │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │   │       │       └── portal-ext.properties
│   │       │   │   │       ├── gradle/
│   │       │   │   │       │   └── wrapper/
│   │       │   │   │       │       ├── gradle-wrapper.jar
│   │       │   │   │       │       └── gradle-wrapper.properties
│   │       │   │   │       ├── gradle.properties
│   │       │   │   │       ├── gradlew
│   │       │   │   │       ├── gradlew.bat
│   │       │   │   │       ├── modules/
│   │       │   │   │       │   └── guestbook/
│   │       │   │   │       │       ├── .gitignore
│   │       │   │   │       │       ├── build.gradle
│   │       │   │   │       │       ├── guestbook-api/
│   │       │   │   │       │       │   ├── bnd.bnd
│   │       │   │   │       │       │   ├── build.gradle
│   │       │   │   │       │       │   └── src/
│   │       │   │   │       │       │       └── main/
│   │       │   │   │       │       │           └── java/
│   │       │   │   │       │       │               └── com/
│   │       │   │   │       │       │                   └── liferay/
│   │       │   │   │       │       │                       └── docs/
│   │       │   │   │       │       │                           └── guestbook/
│   │       │   │   │       │       │                               ├── exception/
│   │       │   │   │       │       │                               │   ├── EntryEmailException.java
│   │       │   │   │       │       │                               │   ├── EntryMessageException.java
│   │       │   │   │       │       │                               │   ├── EntryNameException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryEmailException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryMessageException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryNameException.java
│   │       │   │   │       │       │                               │   ├── GuestbookNameException.java
│   │       │   │   │       │       │                               │   ├── NoSuchGuestbookEntryException.java
│   │       │   │   │       │       │                               │   └── NoSuchGuestbookException.java
│   │       │   │   │       │       │                               ├── model/
│   │       │   │   │       │       │                               │   ├── Guestbook.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntry.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryModel.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntrySoap.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryWrapper.java
│   │       │   │   │       │       │                               │   ├── GuestbookModel.java
│   │       │   │   │       │       │                               │   ├── GuestbookSoap.java
│   │       │   │   │       │       │                               │   └── GuestbookWrapper.java
│   │       │   │   │       │       │                               └── service/
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalService.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryService.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalService.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookService.java
│   │       │   │   │       │       │                                   ├── GuestbookServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookServiceWrapper.java
│   │       │   │   │       │       │                                   └── persistence/
│   │       │   │   │       │       │                                       ├── GuestbookEntryPersistence.java
│   │       │   │   │       │       │                                       ├── GuestbookEntryUtil.java
│   │       │   │   │       │       │                                       ├── GuestbookPersistence.java
│   │       │   │   │       │       │                                       └── GuestbookUtil.java
│   │       │   │   │       │       ├── guestbook-service/
│   │       │   │   │       │       │   ├── bnd.bnd
│   │       │   │   │       │       │   ├── build.gradle
│   │       │   │   │       │       │   ├── service.xml
│   │       │   │   │       │       │   └── src/
│   │       │   │   │       │       │       └── main/
│   │       │   │   │       │       │           ├── java/
│   │       │   │   │       │       │           │   └── com/
│   │       │   │   │       │       │           │       └── liferay/
│   │       │   │   │       │       │           │           └── docs/
│   │       │   │   │       │       │           │               └── guestbook/
│   │       │   │   │       │       │           │                   ├── model/
│   │       │   │   │       │       │           │                   │   └── impl/
│   │       │   │   │       │       │           │                   │       ├── GuestbookBaseImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookCacheModel.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryBaseImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryCacheModel.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryModelImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookImpl.java
│   │       │   │   │       │       │           │                   │       └── GuestbookModelImpl.java
│   │       │   │   │       │       │           │                   └── service/
│   │       │   │   │       │       │           │                       ├── base/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryLocalServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookLocalServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceBaseImpl.java
│   │       │   │   │       │       │           │                       ├── http/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceHttp.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceSoap.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookServiceHttp.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceSoap.java
│   │       │   │   │       │       │           │                       ├── impl/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryLocalServiceImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookLocalServiceImpl.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceImpl.java
│   │       │   │   │       │       │           │                       └── persistence/
│   │       │   │   │       │       │           │                           └── impl/
│   │       │   │   │       │       │           │                               ├── GuestbookEntryPersistenceImpl.java
│   │       │   │   │       │       │           │                               ├── GuestbookPersistenceImpl.java
│   │       │   │   │       │       │           │                               └── constants/
│   │       │   │   │       │       │           │                                   └── GBPersistenceConstants.java
│   │       │   │   │       │       │           └── resources/
│   │       │   │   │       │       │               ├── META-INF/
│   │       │   │   │       │       │               │   ├── module-hbm.xml
│   │       │   │   │       │       │               │   ├── portlet-model-hints.xml
│   │       │   │   │       │       │               │   └── sql/
│   │       │   │   │       │       │               │       ├── indexes.sql
│   │       │   │   │       │       │               │       ├── sequences.sql
│   │       │   │   │       │       │               │       └── tables.sql
│   │       │   │   │       │       │               └── service.properties
│   │       │   │   │       │       └── guestbook-web/
│   │       │   │   │       │           ├── .gitignore
│   │       │   │   │       │           ├── bnd.bnd
│   │       │   │   │       │           ├── build.gradle
│   │       │   │   │       │           └── src/
│   │       │   │   │       │               └── main/
│   │       │   │   │       │                   ├── java/
│   │       │   │   │       │                   │   └── com/
│   │       │   │   │       │                   │       └── liferay/
│   │       │   │   │       │                   │           └── docs/
│   │       │   │   │       │                   │               └── guestbook/
│   │       │   │   │       │                   │                   ├── application/
│   │       │   │   │       │                   │                   │   └── list/
│   │       │   │   │       │                   │                   │       └── GuestbookAdminPanelApp.java
│   │       │   │   │       │                   │                   ├── constants/
│   │       │   │   │       │                   │                   │   └── GuestbookPortletKeys.java
│   │       │   │   │       │                   │                   └── portlet/
│   │       │   │   │       │                   │                       ├── GuestbookAdminPortlet.java
│   │       │   │   │       │                   │                       └── GuestbookPortlet.java
│   │       │   │   │       │                   └── resources/
│   │       │   │   │       │                       ├── META-INF/
│   │       │   │   │       │                       │   └── resources/
│   │       │   │   │       │                       │       ├── css/
│   │       │   │   │       │                       │       │   └── main.scss
│   │       │   │   │       │                       │       ├── guestbook/
│   │       │   │   │       │                       │       │   ├── edit_entry.jsp
│   │       │   │   │       │                       │       │   ├── entry_actions.jsp
│   │       │   │   │       │                       │       │   └── view.jsp
│   │       │   │   │       │                       │       ├── guestbook_admin/
│   │       │   │   │       │                       │       │   ├── edit_guestbook.jsp
│   │       │   │   │       │                       │       │   ├── guestbook_actions.jsp
│   │       │   │   │       │                       │       │   └── view.jsp
│   │       │   │   │       │                       │       └── init.jsp
│   │       │   │   │       │                       └── content/
│   │       │   │   │       │                           └── Language.properties
│   │       │   │   │       └── settings.gradle
│   │       │   │   ├── 06-messages/
│   │       │   │   │   └── com-liferay-docs-guestbook/
│   │       │   │   │       ├── .blade.properties
│   │       │   │   │       ├── .gitignore
│   │       │   │   │       ├── build.gradle
│   │       │   │   │       ├── configs/
│   │       │   │   │       │   ├── common/
│   │       │   │   │       │   │   └── .touch
│   │       │   │   │       │   ├── dev/
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   ├── docker/
│   │       │   │   │       │   │   └── .touch
│   │       │   │   │       │   ├── local/
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   ├── prod/
│   │       │   │   │       │   │   ├── osgi/
│   │       │   │   │       │   │   │   └── configs/
│   │       │   │   │       │   │   │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   └── uat/
│   │       │   │   │       │       ├── osgi/
│   │       │   │   │       │       │   └── configs/
│   │       │   │   │       │       │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │   │       │       └── portal-ext.properties
│   │       │   │   │       ├── gradle/
│   │       │   │   │       │   └── wrapper/
│   │       │   │   │       │       ├── gradle-wrapper.jar
│   │       │   │   │       │       └── gradle-wrapper.properties
│   │       │   │   │       ├── gradle.properties
│   │       │   │   │       ├── gradlew
│   │       │   │   │       ├── gradlew.bat
│   │       │   │   │       ├── modules/
│   │       │   │   │       │   └── guestbook/
│   │       │   │   │       │       ├── .gitignore
│   │       │   │   │       │       ├── build.gradle
│   │       │   │   │       │       ├── guestbook-api/
│   │       │   │   │       │       │   ├── bnd.bnd
│   │       │   │   │       │       │   ├── build.gradle
│   │       │   │   │       │       │   └── src/
│   │       │   │   │       │       │       └── main/
│   │       │   │   │       │       │           └── java/
│   │       │   │   │       │       │               └── com/
│   │       │   │   │       │       │                   └── liferay/
│   │       │   │   │       │       │                       └── docs/
│   │       │   │   │       │       │                           └── guestbook/
│   │       │   │   │       │       │                               ├── exception/
│   │       │   │   │       │       │                               │   ├── EntryEmailException.java
│   │       │   │   │       │       │                               │   ├── EntryMessageException.java
│   │       │   │   │       │       │                               │   ├── EntryNameException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryEmailException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryMessageException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryNameException.java
│   │       │   │   │       │       │                               │   ├── GuestbookNameException.java
│   │       │   │   │       │       │                               │   ├── NoSuchGuestbookEntryException.java
│   │       │   │   │       │       │                               │   └── NoSuchGuestbookException.java
│   │       │   │   │       │       │                               ├── model/
│   │       │   │   │       │       │                               │   ├── Guestbook.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntry.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryModel.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntrySoap.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryWrapper.java
│   │       │   │   │       │       │                               │   ├── GuestbookModel.java
│   │       │   │   │       │       │                               │   ├── GuestbookSoap.java
│   │       │   │   │       │       │                               │   └── GuestbookWrapper.java
│   │       │   │   │       │       │                               └── service/
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalService.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryService.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalService.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookService.java
│   │       │   │   │       │       │                                   ├── GuestbookServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookServiceWrapper.java
│   │       │   │   │       │       │                                   └── persistence/
│   │       │   │   │       │       │                                       ├── GuestbookEntryPersistence.java
│   │       │   │   │       │       │                                       ├── GuestbookEntryUtil.java
│   │       │   │   │       │       │                                       ├── GuestbookPersistence.java
│   │       │   │   │       │       │                                       └── GuestbookUtil.java
│   │       │   │   │       │       ├── guestbook-service/
│   │       │   │   │       │       │   ├── bnd.bnd
│   │       │   │   │       │       │   ├── build.gradle
│   │       │   │   │       │       │   ├── service.xml
│   │       │   │   │       │       │   └── src/
│   │       │   │   │       │       │       └── main/
│   │       │   │   │       │       │           ├── java/
│   │       │   │   │       │       │           │   └── com/
│   │       │   │   │       │       │           │       └── liferay/
│   │       │   │   │       │       │           │           └── docs/
│   │       │   │   │       │       │           │               └── guestbook/
│   │       │   │   │       │       │           │                   ├── model/
│   │       │   │   │       │       │           │                   │   └── impl/
│   │       │   │   │       │       │           │                   │       ├── GuestbookBaseImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookCacheModel.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryBaseImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryCacheModel.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryModelImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookImpl.java
│   │       │   │   │       │       │           │                   │       └── GuestbookModelImpl.java
│   │       │   │   │       │       │           │                   └── service/
│   │       │   │   │       │       │           │                       ├── base/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryLocalServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookLocalServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceBaseImpl.java
│   │       │   │   │       │       │           │                       ├── http/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceHttp.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceSoap.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookServiceHttp.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceSoap.java
│   │       │   │   │       │       │           │                       ├── impl/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryLocalServiceImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookLocalServiceImpl.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceImpl.java
│   │       │   │   │       │       │           │                       └── persistence/
│   │       │   │   │       │       │           │                           └── impl/
│   │       │   │   │       │       │           │                               ├── GuestbookEntryPersistenceImpl.java
│   │       │   │   │       │       │           │                               ├── GuestbookPersistenceImpl.java
│   │       │   │   │       │       │           │                               └── constants/
│   │       │   │   │       │       │           │                                   └── GBPersistenceConstants.java
│   │       │   │   │       │       │           └── resources/
│   │       │   │   │       │       │               ├── META-INF/
│   │       │   │   │       │       │               │   ├── module-hbm.xml
│   │       │   │   │       │       │               │   ├── portlet-model-hints.xml
│   │       │   │   │       │       │               │   └── sql/
│   │       │   │   │       │       │               │       ├── indexes.sql
│   │       │   │   │       │       │               │       ├── sequences.sql
│   │       │   │   │       │       │               │       └── tables.sql
│   │       │   │   │       │       │               └── service.properties
│   │       │   │   │       │       └── guestbook-web/
│   │       │   │   │       │           ├── .gitignore
│   │       │   │   │       │           ├── bnd.bnd
│   │       │   │   │       │           ├── build.gradle
│   │       │   │   │       │           └── src/
│   │       │   │   │       │               └── main/
│   │       │   │   │       │                   ├── java/
│   │       │   │   │       │                   │   └── com/
│   │       │   │   │       │                   │       └── liferay/
│   │       │   │   │       │                   │           └── docs/
│   │       │   │   │       │                   │               └── guestbook/
│   │       │   │   │       │                   │                   ├── application/
│   │       │   │   │       │                   │                   │   └── list/
│   │       │   │   │       │                   │                   │       └── GuestbookAdminPanelApp.java
│   │       │   │   │       │                   │                   ├── constants/
│   │       │   │   │       │                   │                   │   └── GuestbookPortletKeys.java
│   │       │   │   │       │                   │                   └── portlet/
│   │       │   │   │       │                   │                       ├── GuestbookAdminPortlet.java
│   │       │   │   │       │                   │                       └── GuestbookPortlet.java
│   │       │   │   │       │                   └── resources/
│   │       │   │   │       │                       ├── META-INF/
│   │       │   │   │       │                       │   └── resources/
│   │       │   │   │       │                       │       ├── css/
│   │       │   │   │       │                       │       │   └── main.scss
│   │       │   │   │       │                       │       ├── guestbook/
│   │       │   │   │       │                       │       │   ├── edit_entry.jsp
│   │       │   │   │       │                       │       │   ├── entry_actions.jsp
│   │       │   │   │       │                       │       │   └── view.jsp
│   │       │   │   │       │                       │       ├── guestbook_admin/
│   │       │   │   │       │                       │       │   ├── edit_guestbook.jsp
│   │       │   │   │       │                       │       │   ├── guestbook_actions.jsp
│   │       │   │   │       │                       │       │   └── view.jsp
│   │       │   │   │       │                       │       └── init.jsp
│   │       │   │   │       │                       └── content/
│   │       │   │   │       │                           └── Language.properties
│   │       │   │   │       └── settings.gradle
│   │       │   │   ├── 07-permissions/
│   │       │   │   │   └── com-liferay-docs-guestbook/
│   │       │   │   │       ├── .blade.properties
│   │       │   │   │       ├── .gitignore
│   │       │   │   │       ├── build.gradle
│   │       │   │   │       ├── configs/
│   │       │   │   │       │   ├── common/
│   │       │   │   │       │   │   └── .touch
│   │       │   │   │       │   ├── dev/
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   ├── docker/
│   │       │   │   │       │   │   └── .touch
│   │       │   │   │       │   ├── local/
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   ├── prod/
│   │       │   │   │       │   │   ├── osgi/
│   │       │   │   │       │   │   │   └── configs/
│   │       │   │   │       │   │   │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   └── uat/
│   │       │   │   │       │       ├── osgi/
│   │       │   │   │       │       │   └── configs/
│   │       │   │   │       │       │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │   │       │       └── portal-ext.properties
│   │       │   │   │       ├── gradle/
│   │       │   │   │       │   └── wrapper/
│   │       │   │   │       │       ├── gradle-wrapper.jar
│   │       │   │   │       │       └── gradle-wrapper.properties
│   │       │   │   │       ├── gradle.properties
│   │       │   │   │       ├── gradlew
│   │       │   │   │       ├── gradlew.bat
│   │       │   │   │       ├── modules/
│   │       │   │   │       │   └── guestbook/
│   │       │   │   │       │       ├── .gitignore
│   │       │   │   │       │       ├── build.gradle
│   │       │   │   │       │       ├── guestbook-api/
│   │       │   │   │       │       │   ├── bnd.bnd
│   │       │   │   │       │       │   ├── build.gradle
│   │       │   │   │       │       │   └── src/
│   │       │   │   │       │       │       └── main/
│   │       │   │   │       │       │           └── java/
│   │       │   │   │       │       │               └── com/
│   │       │   │   │       │       │                   └── liferay/
│   │       │   │   │       │       │                       └── docs/
│   │       │   │   │       │       │                           └── guestbook/
│   │       │   │   │       │       │                               ├── constants/
│   │       │   │   │       │       │                               │   ├── GuestbookConstants.java
│   │       │   │   │       │       │                               │   └── GuestbookPortletKeys.java
│   │       │   │   │       │       │                               ├── exception/
│   │       │   │   │       │       │                               │   ├── EntryEmailException.java
│   │       │   │   │       │       │                               │   ├── EntryMessageException.java
│   │       │   │   │       │       │                               │   ├── EntryNameException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryEmailException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryMessageException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryNameException.java
│   │       │   │   │       │       │                               │   ├── GuestbookNameException.java
│   │       │   │   │       │       │                               │   ├── NoSuchGuestbookEntryException.java
│   │       │   │   │       │       │                               │   └── NoSuchGuestbookException.java
│   │       │   │   │       │       │                               ├── model/
│   │       │   │   │       │       │                               │   ├── Guestbook.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntry.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryModel.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntrySoap.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryWrapper.java
│   │       │   │   │       │       │                               │   ├── GuestbookModel.java
│   │       │   │   │       │       │                               │   ├── GuestbookSoap.java
│   │       │   │   │       │       │                               │   └── GuestbookWrapper.java
│   │       │   │   │       │       │                               └── service/
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalService.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryService.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalService.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookService.java
│   │       │   │   │       │       │                                   ├── GuestbookServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookServiceWrapper.java
│   │       │   │   │       │       │                                   └── persistence/
│   │       │   │   │       │       │                                       ├── GuestbookEntryPersistence.java
│   │       │   │   │       │       │                                       ├── GuestbookEntryUtil.java
│   │       │   │   │       │       │                                       ├── GuestbookPersistence.java
│   │       │   │   │       │       │                                       └── GuestbookUtil.java
│   │       │   │   │       │       ├── guestbook-service/
│   │       │   │   │       │       │   ├── bnd.bnd
│   │       │   │   │       │       │   ├── build.gradle
│   │       │   │   │       │       │   ├── service.xml
│   │       │   │   │       │       │   └── src/
│   │       │   │   │       │       │       └── main/
│   │       │   │   │       │       │           ├── java/
│   │       │   │   │       │       │           │   └── com/
│   │       │   │   │       │       │           │       └── liferay/
│   │       │   │   │       │       │           │           └── docs/
│   │       │   │   │       │       │           │               └── guestbook/
│   │       │   │   │       │       │           │                   ├── internal/
│   │       │   │   │       │       │           │                   │   └── security/
│   │       │   │   │       │       │           │                   │       └── permission/
│   │       │   │   │       │       │           │                   │           └── resource/
│   │       │   │   │       │       │           │                   │               ├── GuestbookEntryModelResourcePermissionRegistrar.java
│   │       │   │   │       │       │           │                   │               ├── GuestbookModelResourcePermissionRegistrar.java
│   │       │   │   │       │       │           │                   │               └── GuestbookPortletResourcePermissionRegistrar.java
│   │       │   │   │       │       │           │                   ├── model/
│   │       │   │   │       │       │           │                   │   └── impl/
│   │       │   │   │       │       │           │                   │       ├── GuestbookBaseImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookCacheModel.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryBaseImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryCacheModel.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryModelImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookImpl.java
│   │       │   │   │       │       │           │                   │       └── GuestbookModelImpl.java
│   │       │   │   │       │       │           │                   └── service/
│   │       │   │   │       │       │           │                       ├── base/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryLocalServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookLocalServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceBaseImpl.java
│   │       │   │   │       │       │           │                       ├── http/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceHttp.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceSoap.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookServiceHttp.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceSoap.java
│   │       │   │   │       │       │           │                       ├── impl/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryLocalServiceImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookLocalServiceImpl.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceImpl.java
│   │       │   │   │       │       │           │                       └── persistence/
│   │       │   │   │       │       │           │                           └── impl/
│   │       │   │   │       │       │           │                               ├── GuestbookEntryPersistenceImpl.java
│   │       │   │   │       │       │           │                               ├── GuestbookPersistenceImpl.java
│   │       │   │   │       │       │           │                               └── constants/
│   │       │   │   │       │       │           │                                   └── GBPersistenceConstants.java
│   │       │   │   │       │       │           └── resources/
│   │       │   │   │       │       │               ├── META-INF/
│   │       │   │   │       │       │               │   ├── module-hbm.xml
│   │       │   │   │       │       │               │   ├── portlet-model-hints.xml
│   │       │   │   │       │       │               │   ├── resource-actions/
│   │       │   │   │       │       │               │   │   └── default.xml
│   │       │   │   │       │       │               │   └── sql/
│   │       │   │   │       │       │               │       ├── indexes.sql
│   │       │   │   │       │       │               │       ├── sequences.sql
│   │       │   │   │       │       │               │       └── tables.sql
│   │       │   │   │       │       │               ├── portlet.properties
│   │       │   │   │       │       │               └── service.properties
│   │       │   │   │       │       └── guestbook-web/
│   │       │   │   │       │           ├── .gitignore
│   │       │   │   │       │           ├── bnd.bnd
│   │       │   │   │       │           ├── build.gradle
│   │       │   │   │       │           └── src/
│   │       │   │   │       │               └── main/
│   │       │   │   │       │                   ├── java/
│   │       │   │   │       │                   │   └── com/
│   │       │   │   │       │                   │       └── liferay/
│   │       │   │   │       │                   │           └── docs/
│   │       │   │   │       │                   │               └── guestbook/
│   │       │   │   │       │                   │                   ├── application/
│   │       │   │   │       │                   │                   │   └── list/
│   │       │   │   │       │                   │                   │       └── GuestbookAdminPanelApp.java
│   │       │   │   │       │                   │                   ├── portlet/
│   │       │   │   │       │                   │                   │   ├── GuestbookAdminPortlet.java
│   │       │   │   │       │                   │                   │   └── GuestbookPortlet.java
│   │       │   │   │       │                   │                   └── web/
│   │       │   │   │       │                   │                       └── internal/
│   │       │   │   │       │                   │                           └── security/
│   │       │   │   │       │                   │                               └── permission/
│   │       │   │   │       │                   │                                   └── resource/
│   │       │   │   │       │                   │                                       ├── GuestbookEntryPermission.java
│   │       │   │   │       │                   │                                       ├── GuestbookModelPermission.java
│   │       │   │   │       │                   │                                       └── GuestbookPermission.java
│   │       │   │   │       │                   └── resources/
│   │       │   │   │       │                       ├── META-INF/
│   │       │   │   │       │                       │   ├── resource-actions/
│   │       │   │   │       │                       │   │   └── default.xml
│   │       │   │   │       │                       │   └── resources/
│   │       │   │   │       │                       │       ├── css/
│   │       │   │   │       │                       │       │   └── main.scss
│   │       │   │   │       │                       │       ├── guestbook/
│   │       │   │   │       │                       │       │   ├── edit_entry.jsp
│   │       │   │   │       │                       │       │   ├── entry_actions.jsp
│   │       │   │   │       │                       │       │   └── view.jsp
│   │       │   │   │       │                       │       ├── guestbook_admin/
│   │       │   │   │       │                       │       │   ├── edit_guestbook.jsp
│   │       │   │   │       │                       │       │   ├── guestbook_actions.jsp
│   │       │   │   │       │                       │       │   └── view.jsp
│   │       │   │   │       │                       │       └── init.jsp
│   │       │   │   │       │                       ├── content/
│   │       │   │   │       │                       │   └── Language.properties
│   │       │   │   │       │                       └── portlet.properties
│   │       │   │   │       └── settings.gradle
│   │       │   │   ├── 08-search/
│   │       │   │   │   └── com-liferay-docs-guestbook/
│   │       │   │   │       ├── .blade.properties
│   │       │   │   │       ├── .gitignore
│   │       │   │   │       ├── build.gradle
│   │       │   │   │       ├── configs/
│   │       │   │   │       │   ├── common/
│   │       │   │   │       │   │   └── .touch
│   │       │   │   │       │   ├── dev/
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   ├── docker/
│   │       │   │   │       │   │   └── .touch
│   │       │   │   │       │   ├── local/
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   ├── prod/
│   │       │   │   │       │   │   ├── osgi/
│   │       │   │   │       │   │   │   └── configs/
│   │       │   │   │       │   │   │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   └── uat/
│   │       │   │   │       │       ├── osgi/
│   │       │   │   │       │       │   └── configs/
│   │       │   │   │       │       │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │   │       │       └── portal-ext.properties
│   │       │   │   │       ├── gradle/
│   │       │   │   │       │   └── wrapper/
│   │       │   │   │       │       ├── gradle-wrapper.jar
│   │       │   │   │       │       └── gradle-wrapper.properties
│   │       │   │   │       ├── gradle.properties
│   │       │   │   │       ├── gradlew
│   │       │   │   │       ├── gradlew.bat
│   │       │   │   │       ├── modules/
│   │       │   │   │       │   └── guestbook/
│   │       │   │   │       │       ├── .gitignore
│   │       │   │   │       │       ├── build.gradle
│   │       │   │   │       │       ├── guestbook-api/
│   │       │   │   │       │       │   ├── bnd.bnd
│   │       │   │   │       │       │   ├── build.gradle
│   │       │   │   │       │       │   └── src/
│   │       │   │   │       │       │       └── main/
│   │       │   │   │       │       │           └── java/
│   │       │   │   │       │       │               └── com/
│   │       │   │   │       │       │                   └── liferay/
│   │       │   │   │       │       │                       └── docs/
│   │       │   │   │       │       │                           └── guestbook/
│   │       │   │   │       │       │                               ├── constants/
│   │       │   │   │       │       │                               │   ├── GuestbookConstants.java
│   │       │   │   │       │       │                               │   └── GuestbookPortletKeys.java
│   │       │   │   │       │       │                               ├── exception/
│   │       │   │   │       │       │                               │   ├── EntryEmailException.java
│   │       │   │   │       │       │                               │   ├── EntryMessageException.java
│   │       │   │   │       │       │                               │   ├── EntryNameException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryEmailException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryMessageException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryNameException.java
│   │       │   │   │       │       │                               │   ├── GuestbookNameException.java
│   │       │   │   │       │       │                               │   ├── NoSuchGuestbookEntryException.java
│   │       │   │   │       │       │                               │   └── NoSuchGuestbookException.java
│   │       │   │   │       │       │                               ├── model/
│   │       │   │   │       │       │                               │   ├── Guestbook.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntry.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryModel.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntrySoap.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryWrapper.java
│   │       │   │   │       │       │                               │   ├── GuestbookModel.java
│   │       │   │   │       │       │                               │   ├── GuestbookSoap.java
│   │       │   │   │       │       │                               │   └── GuestbookWrapper.java
│   │       │   │   │       │       │                               └── service/
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalService.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryService.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalService.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookService.java
│   │       │   │   │       │       │                                   ├── GuestbookServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookServiceWrapper.java
│   │       │   │   │       │       │                                   └── persistence/
│   │       │   │   │       │       │                                       ├── GuestbookEntryPersistence.java
│   │       │   │   │       │       │                                       ├── GuestbookEntryUtil.java
│   │       │   │   │       │       │                                       ├── GuestbookPersistence.java
│   │       │   │   │       │       │                                       └── GuestbookUtil.java
│   │       │   │   │       │       ├── guestbook-service/
│   │       │   │   │       │       │   ├── bnd.bnd
│   │       │   │   │       │       │   ├── build.gradle
│   │       │   │   │       │       │   ├── service.xml
│   │       │   │   │       │       │   └── src/
│   │       │   │   │       │       │       └── main/
│   │       │   │   │       │       │           ├── java/
│   │       │   │   │       │       │           │   └── com/
│   │       │   │   │       │       │           │       └── liferay/
│   │       │   │   │       │       │           │           └── docs/
│   │       │   │   │       │       │           │               └── guestbook/
│   │       │   │   │       │       │           │                   ├── internal/
│   │       │   │   │       │       │           │                   │   └── security/
│   │       │   │   │       │       │           │                   │       └── permission/
│   │       │   │   │       │       │           │                   │           └── resource/
│   │       │   │   │       │       │           │                   │               ├── GuestbookEntryModelResourcePermissionRegistrar.java
│   │       │   │   │       │       │           │                   │               ├── GuestbookModelResourcePermissionRegistrar.java
│   │       │   │   │       │       │           │                   │               └── GuestbookPortletResourcePermissionRegistrar.java
│   │       │   │   │       │       │           │                   ├── model/
│   │       │   │   │       │       │           │                   │   └── impl/
│   │       │   │   │       │       │           │                   │       ├── GuestbookBaseImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookCacheModel.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryBaseImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryCacheModel.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryModelImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookImpl.java
│   │       │   │   │       │       │           │                   │       └── GuestbookModelImpl.java
│   │       │   │   │       │       │           │                   ├── search/
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntryBatchReindexer.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntryBatchReindexerImpl.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntryKeywordQueryContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntryModelDocumentContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntryModelIndexerWriterContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntryModelSummaryContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntrySearchRegistrar.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookKeywordQueryContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookModelDocumentContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookModelIndexerWriterContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookModelSummaryContributor.java
│   │       │   │   │       │       │           │                   │   └── GuestbookSearchRegistrar.java
│   │       │   │   │       │       │           │                   └── service/
│   │       │   │   │       │       │           │                       ├── base/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryLocalServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookLocalServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceBaseImpl.java
│   │       │   │   │       │       │           │                       ├── http/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceHttp.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceSoap.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookServiceHttp.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceSoap.java
│   │       │   │   │       │       │           │                       ├── impl/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryLocalServiceImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookLocalServiceImpl.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceImpl.java
│   │       │   │   │       │       │           │                       └── persistence/
│   │       │   │   │       │       │           │                           └── impl/
│   │       │   │   │       │       │           │                               ├── GuestbookEntryPersistenceImpl.java
│   │       │   │   │       │       │           │                               ├── GuestbookPersistenceImpl.java
│   │       │   │   │       │       │           │                               └── constants/
│   │       │   │   │       │       │           │                                   └── GBPersistenceConstants.java
│   │       │   │   │       │       │           └── resources/
│   │       │   │   │       │       │               ├── META-INF/
│   │       │   │   │       │       │               │   ├── module-hbm.xml
│   │       │   │   │       │       │               │   ├── portlet-model-hints.xml
│   │       │   │   │       │       │               │   ├── resource-actions/
│   │       │   │   │       │       │               │   │   └── default.xml
│   │       │   │   │       │       │               │   └── sql/
│   │       │   │   │       │       │               │       ├── indexes.sql
│   │       │   │   │       │       │               │       ├── sequences.sql
│   │       │   │   │       │       │               │       └── tables.sql
│   │       │   │   │       │       │               ├── portlet.properties
│   │       │   │   │       │       │               └── service.properties
│   │       │   │   │       │       └── guestbook-web/
│   │       │   │   │       │           ├── .gitignore
│   │       │   │   │       │           ├── bnd.bnd
│   │       │   │   │       │           ├── build.gradle
│   │       │   │   │       │           └── src/
│   │       │   │   │       │               └── main/
│   │       │   │   │       │                   ├── java/
│   │       │   │   │       │                   │   └── com/
│   │       │   │   │       │                   │       └── liferay/
│   │       │   │   │       │                   │           └── docs/
│   │       │   │   │       │                   │               └── guestbook/
│   │       │   │   │       │                   │                   ├── application/
│   │       │   │   │       │                   │                   │   └── list/
│   │       │   │   │       │                   │                   │       └── GuestbookAdminPanelApp.java
│   │       │   │   │       │                   │                   ├── portlet/
│   │       │   │   │       │                   │                   │   ├── GuestbookAdminPortlet.java
│   │       │   │   │       │                   │                   │   └── GuestbookPortlet.java
│   │       │   │   │       │                   │                   └── web/
│   │       │   │   │       │                   │                       └── internal/
│   │       │   │   │       │                   │                           └── security/
│   │       │   │   │       │                   │                               └── permission/
│   │       │   │   │       │                   │                                   └── resource/
│   │       │   │   │       │                   │                                       ├── GuestbookEntryPermission.java
│   │       │   │   │       │                   │                                       ├── GuestbookModelPermission.java
│   │       │   │   │       │                   │                                       └── GuestbookPermission.java
│   │       │   │   │       │                   └── resources/
│   │       │   │   │       │                       ├── META-INF/
│   │       │   │   │       │                       │   ├── resource-actions/
│   │       │   │   │       │                       │   │   └── default.xml
│   │       │   │   │       │                       │   └── resources/
│   │       │   │   │       │                       │       ├── css/
│   │       │   │   │       │                       │       │   └── main.scss
│   │       │   │   │       │                       │       ├── guestbook/
│   │       │   │   │       │                       │       │   ├── edit_entry.jsp
│   │       │   │   │       │                       │       │   ├── entry_actions.jsp
│   │       │   │   │       │                       │       │   ├── view.jsp
│   │       │   │   │       │                       │       │   └── view_search.jsp
│   │       │   │   │       │                       │       ├── guestbook_admin/
│   │       │   │   │       │                       │       │   ├── edit_guestbook.jsp
│   │       │   │   │       │                       │       │   ├── guestbook_actions.jsp
│   │       │   │   │       │                       │       │   └── view.jsp
│   │       │   │   │       │                       │       └── init.jsp
│   │       │   │   │       │                       ├── content/
│   │       │   │   │       │                       │   └── Language.properties
│   │       │   │   │       │                       └── portlet.properties
│   │       │   │   │       └── settings.gradle
│   │       │   │   ├── 09-assets/
│   │       │   │   │   └── com-liferay-docs-guestbook/
│   │       │   │   │       ├── .blade.properties
│   │       │   │   │       ├── .gitignore
│   │       │   │   │       ├── build.gradle
│   │       │   │   │       ├── configs/
│   │       │   │   │       │   ├── common/
│   │       │   │   │       │   │   └── .touch
│   │       │   │   │       │   ├── dev/
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   ├── docker/
│   │       │   │   │       │   │   └── .touch
│   │       │   │   │       │   ├── local/
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   ├── prod/
│   │       │   │   │       │   │   ├── osgi/
│   │       │   │   │       │   │   │   └── configs/
│   │       │   │   │       │   │   │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   └── uat/
│   │       │   │   │       │       ├── osgi/
│   │       │   │   │       │       │   └── configs/
│   │       │   │   │       │       │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │   │       │       └── portal-ext.properties
│   │       │   │   │       ├── gradle/
│   │       │   │   │       │   └── wrapper/
│   │       │   │   │       │       ├── gradle-wrapper.jar
│   │       │   │   │       │       └── gradle-wrapper.properties
│   │       │   │   │       ├── gradle.properties
│   │       │   │   │       ├── gradlew
│   │       │   │   │       ├── gradlew.bat
│   │       │   │   │       ├── modules/
│   │       │   │   │       │   └── guestbook/
│   │       │   │   │       │       ├── .gitignore
│   │       │   │   │       │       ├── build.gradle
│   │       │   │   │       │       ├── guestbook-api/
│   │       │   │   │       │       │   ├── bnd.bnd
│   │       │   │   │       │       │   ├── build.gradle
│   │       │   │   │       │       │   └── src/
│   │       │   │   │       │       │       └── main/
│   │       │   │   │       │       │           └── java/
│   │       │   │   │       │       │               └── com/
│   │       │   │   │       │       │                   └── liferay/
│   │       │   │   │       │       │                       └── docs/
│   │       │   │   │       │       │                           └── guestbook/
│   │       │   │   │       │       │                               ├── constants/
│   │       │   │   │       │       │                               │   ├── GuestbookConstants.java
│   │       │   │   │       │       │                               │   └── GuestbookPortletKeys.java
│   │       │   │   │       │       │                               ├── exception/
│   │       │   │   │       │       │                               │   ├── EntryEmailException.java
│   │       │   │   │       │       │                               │   ├── EntryMessageException.java
│   │       │   │   │       │       │                               │   ├── EntryNameException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryEmailException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryMessageException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryNameException.java
│   │       │   │   │       │       │                               │   ├── GuestbookNameException.java
│   │       │   │   │       │       │                               │   ├── NoSuchGuestbookEntryException.java
│   │       │   │   │       │       │                               │   └── NoSuchGuestbookException.java
│   │       │   │   │       │       │                               ├── model/
│   │       │   │   │       │       │                               │   ├── Guestbook.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntry.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryModel.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntrySoap.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryWrapper.java
│   │       │   │   │       │       │                               │   ├── GuestbookModel.java
│   │       │   │   │       │       │                               │   ├── GuestbookSoap.java
│   │       │   │   │       │       │                               │   └── GuestbookWrapper.java
│   │       │   │   │       │       │                               └── service/
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalService.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryService.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalService.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookService.java
│   │       │   │   │       │       │                                   ├── GuestbookServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookServiceWrapper.java
│   │       │   │   │       │       │                                   └── persistence/
│   │       │   │   │       │       │                                       ├── GuestbookEntryPersistence.java
│   │       │   │   │       │       │                                       ├── GuestbookEntryUtil.java
│   │       │   │   │       │       │                                       ├── GuestbookPersistence.java
│   │       │   │   │       │       │                                       └── GuestbookUtil.java
│   │       │   │   │       │       ├── guestbook-service/
│   │       │   │   │       │       │   ├── bnd.bnd
│   │       │   │   │       │       │   ├── build.gradle
│   │       │   │   │       │       │   ├── service.xml
│   │       │   │   │       │       │   └── src/
│   │       │   │   │       │       │       └── main/
│   │       │   │   │       │       │           ├── java/
│   │       │   │   │       │       │           │   └── com/
│   │       │   │   │       │       │           │       └── liferay/
│   │       │   │   │       │       │           │           └── docs/
│   │       │   │   │       │       │           │               └── guestbook/
│   │       │   │   │       │       │           │                   ├── internal/
│   │       │   │   │       │       │           │                   │   └── security/
│   │       │   │   │       │       │           │                   │       └── permission/
│   │       │   │   │       │       │           │                   │           └── resource/
│   │       │   │   │       │       │           │                   │               ├── GuestbookEntryModelResourcePermissionRegistrar.java
│   │       │   │   │       │       │           │                   │               ├── GuestbookModelResourcePermissionRegistrar.java
│   │       │   │   │       │       │           │                   │               └── GuestbookPortletResourcePermissionRegistrar.java
│   │       │   │   │       │       │           │                   ├── model/
│   │       │   │   │       │       │           │                   │   └── impl/
│   │       │   │   │       │       │           │                   │       ├── GuestbookBaseImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookCacheModel.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryBaseImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryCacheModel.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryModelImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookImpl.java
│   │       │   │   │       │       │           │                   │       └── GuestbookModelImpl.java
│   │       │   │   │       │       │           │                   ├── search/
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntryBatchReindexer.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntryBatchReindexerImpl.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntryKeywordQueryContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntryModelDocumentContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntryModelIndexerWriterContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntryModelSummaryContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntrySearchRegistrar.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookKeywordQueryContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookModelDocumentContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookModelIndexerWriterContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookModelSummaryContributor.java
│   │       │   │   │       │       │           │                   │   └── GuestbookSearchRegistrar.java
│   │       │   │   │       │       │           │                   └── service/
│   │       │   │   │       │       │           │                       ├── base/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryLocalServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookLocalServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceBaseImpl.java
│   │       │   │   │       │       │           │                       ├── http/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceHttp.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceSoap.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookServiceHttp.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceSoap.java
│   │       │   │   │       │       │           │                       ├── impl/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryLocalServiceImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookLocalServiceImpl.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceImpl.java
│   │       │   │   │       │       │           │                       └── persistence/
│   │       │   │   │       │       │           │                           └── impl/
│   │       │   │   │       │       │           │                               ├── GuestbookEntryPersistenceImpl.java
│   │       │   │   │       │       │           │                               ├── GuestbookPersistenceImpl.java
│   │       │   │   │       │       │           │                               └── constants/
│   │       │   │   │       │       │           │                                   └── GBPersistenceConstants.java
│   │       │   │   │       │       │           └── resources/
│   │       │   │   │       │       │               ├── META-INF/
│   │       │   │   │       │       │               │   ├── module-hbm.xml
│   │       │   │   │       │       │               │   ├── portlet-model-hints.xml
│   │       │   │   │       │       │               │   ├── resource-actions/
│   │       │   │   │       │       │               │   │   └── default.xml
│   │       │   │   │       │       │               │   └── sql/
│   │       │   │   │       │       │               │       ├── indexes.sql
│   │       │   │   │       │       │               │       ├── sequences.sql
│   │       │   │   │       │       │               │       └── tables.sql
│   │       │   │   │       │       │               ├── portlet.properties
│   │       │   │   │       │       │               └── service.properties
│   │       │   │   │       │       └── guestbook-web/
│   │       │   │   │       │           ├── .gitignore
│   │       │   │   │       │           ├── bnd.bnd
│   │       │   │   │       │           ├── build.gradle
│   │       │   │   │       │           └── src/
│   │       │   │   │       │               └── main/
│   │       │   │   │       │                   ├── java/
│   │       │   │   │       │                   │   └── com/
│   │       │   │   │       │                   │       └── liferay/
│   │       │   │   │       │                   │           └── docs/
│   │       │   │   │       │                   │               └── guestbook/
│   │       │   │   │       │                   │                   ├── application/
│   │       │   │   │       │                   │                   │   └── list/
│   │       │   │   │       │                   │                   │       └── GuestbookAdminPanelApp.java
│   │       │   │   │       │                   │                   ├── portlet/
│   │       │   │   │       │                   │                   │   ├── GuestbookAdminPortlet.java
│   │       │   │   │       │                   │                   │   └── GuestbookPortlet.java
│   │       │   │   │       │                   │                   └── web/
│   │       │   │   │       │                   │                       └── internal/
│   │       │   │   │       │                   │                           ├── asset/
│   │       │   │   │       │                   │                           │   ├── GuestbookAssetRenderer.java
│   │       │   │   │       │                   │                           │   ├── GuestbookAssetRendererFactory.java
│   │       │   │   │       │                   │                           │   ├── GuestbookEntryAssetRenderer.java
│   │       │   │   │       │                   │                           │   └── GuestbookEntryAssetRendererFactory.java
│   │       │   │   │       │                   │                           └── security/
│   │       │   │   │       │                   │                               └── permission/
│   │       │   │   │       │                   │                                   └── resource/
│   │       │   │   │       │                   │                                       ├── GuestbookEntryPermission.java
│   │       │   │   │       │                   │                                       ├── GuestbookModelPermission.java
│   │       │   │   │       │                   │                                       └── GuestbookPermission.java
│   │       │   │   │       │                   └── resources/
│   │       │   │   │       │                       ├── META-INF/
│   │       │   │   │       │                       │   ├── resource-actions/
│   │       │   │   │       │                       │   │   └── default.xml
│   │       │   │   │       │                       │   └── resources/
│   │       │   │   │       │                       │       ├── asset/
│   │       │   │   │       │                       │       │   ├── entry/
│   │       │   │   │       │                       │       │   │   └── full_content.jsp
│   │       │   │   │       │                       │       │   └── guestbook/
│   │       │   │   │       │                       │       │       └── full_content.jsp
│   │       │   │   │       │                       │       ├── css/
│   │       │   │   │       │                       │       │   └── main.scss
│   │       │   │   │       │                       │       ├── guestbook/
│   │       │   │   │       │                       │       │   ├── edit_entry.jsp
│   │       │   │   │       │                       │       │   ├── entry_actions.jsp
│   │       │   │   │       │                       │       │   ├── view.jsp
│   │       │   │   │       │                       │       │   ├── view_entry.jsp
│   │       │   │   │       │                       │       │   └── view_search.jsp
│   │       │   │   │       │                       │       ├── guestbook_admin/
│   │       │   │   │       │                       │       │   ├── edit_guestbook.jsp
│   │       │   │   │       │                       │       │   ├── guestbook_actions.jsp
│   │       │   │   │       │                       │       │   └── view.jsp
│   │       │   │   │       │                       │       └── init.jsp
│   │       │   │   │       │                       ├── content/
│   │       │   │   │       │                       │   └── Language.properties
│   │       │   │   │       │                       └── portlet.properties
│   │       │   │   │       └── settings.gradle
│   │       │   │   └── 10-workflow/
│   │       │   │       └── com-liferay-docs-guestbook/
│   │       │   │           ├── .blade.properties
│   │       │   │           ├── .gitignore
│   │       │   │           ├── build.gradle
│   │       │   │           ├── configs/
│   │       │   │           │   ├── common/
│   │       │   │           │   │   └── .touch
│   │       │   │           │   ├── dev/
│   │       │   │           │   │   └── portal-ext.properties
│   │       │   │           │   ├── docker/
│   │       │   │           │   │   └── .touch
│   │       │   │           │   ├── local/
│   │       │   │           │   │   └── portal-ext.properties
│   │       │   │           │   ├── prod/
│   │       │   │           │   │   ├── osgi/
│   │       │   │           │   │   │   └── configs/
│   │       │   │           │   │   │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │           │   │   └── portal-ext.properties
│   │       │   │           │   └── uat/
│   │       │   │           │       ├── osgi/
│   │       │   │           │       │   └── configs/
│   │       │   │           │       │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │           │       └── portal-ext.properties
│   │       │   │           ├── gradle/
│   │       │   │           │   └── wrapper/
│   │       │   │           │       ├── gradle-wrapper.jar
│   │       │   │           │       └── gradle-wrapper.properties
│   │       │   │           ├── gradle.properties
│   │       │   │           ├── gradlew
│   │       │   │           ├── gradlew.bat
│   │       │   │           ├── modules/
│   │       │   │           │   └── guestbook/
│   │       │   │           │       ├── .gitignore
│   │       │   │           │       ├── build.gradle
│   │       │   │           │       ├── guestbook-api/
│   │       │   │           │       │   ├── bnd.bnd
│   │       │   │           │       │   ├── build.gradle
│   │       │   │           │       │   └── src/
│   │       │   │           │       │       └── main/
│   │       │   │           │       │           └── java/
│   │       │   │           │       │               └── com/
│   │       │   │           │       │                   └── liferay/
│   │       │   │           │       │                       └── docs/
│   │       │   │           │       │                           └── guestbook/
│   │       │   │           │       │                               ├── constants/
│   │       │   │           │       │                               │   ├── GuestbookConstants.java
│   │       │   │           │       │                               │   └── GuestbookPortletKeys.java
│   │       │   │           │       │                               ├── exception/
│   │       │   │           │       │                               │   ├── EntryEmailException.java
│   │       │   │           │       │                               │   ├── EntryMessageException.java
│   │       │   │           │       │                               │   ├── EntryNameException.java
│   │       │   │           │       │                               │   ├── GuestbookEntryEmailException.java
│   │       │   │           │       │                               │   ├── GuestbookEntryMessageException.java
│   │       │   │           │       │                               │   ├── GuestbookEntryNameException.java
│   │       │   │           │       │                               │   ├── GuestbookNameException.java
│   │       │   │           │       │                               │   ├── NoSuchGuestbookEntryException.java
│   │       │   │           │       │                               │   └── NoSuchGuestbookException.java
│   │       │   │           │       │                               ├── model/
│   │       │   │           │       │                               │   ├── Guestbook.java
│   │       │   │           │       │                               │   ├── GuestbookEntry.java
│   │       │   │           │       │                               │   ├── GuestbookEntryModel.java
│   │       │   │           │       │                               │   ├── GuestbookEntrySoap.java
│   │       │   │           │       │                               │   ├── GuestbookEntryWrapper.java
│   │       │   │           │       │                               │   ├── GuestbookModel.java
│   │       │   │           │       │                               │   ├── GuestbookSoap.java
│   │       │   │           │       │                               │   └── GuestbookWrapper.java
│   │       │   │           │       │                               └── service/
│   │       │   │           │       │                                   ├── GuestbookEntryLocalService.java
│   │       │   │           │       │                                   ├── GuestbookEntryLocalServiceUtil.java
│   │       │   │           │       │                                   ├── GuestbookEntryLocalServiceWrapper.java
│   │       │   │           │       │                                   ├── GuestbookEntryService.java
│   │       │   │           │       │                                   ├── GuestbookEntryServiceUtil.java
│   │       │   │           │       │                                   ├── GuestbookEntryServiceWrapper.java
│   │       │   │           │       │                                   ├── GuestbookLocalService.java
│   │       │   │           │       │                                   ├── GuestbookLocalServiceUtil.java
│   │       │   │           │       │                                   ├── GuestbookLocalServiceWrapper.java
│   │       │   │           │       │                                   ├── GuestbookService.java
│   │       │   │           │       │                                   ├── GuestbookServiceUtil.java
│   │       │   │           │       │                                   ├── GuestbookServiceWrapper.java
│   │       │   │           │       │                                   └── persistence/
│   │       │   │           │       │                                       ├── GuestbookEntryPersistence.java
│   │       │   │           │       │                                       ├── GuestbookEntryUtil.java
│   │       │   │           │       │                                       ├── GuestbookPersistence.java
│   │       │   │           │       │                                       └── GuestbookUtil.java
│   │       │   │           │       ├── guestbook-service/
│   │       │   │           │       │   ├── bnd.bnd
│   │       │   │           │       │   ├── build.gradle
│   │       │   │           │       │   ├── service.xml
│   │       │   │           │       │   └── src/
│   │       │   │           │       │       └── main/
│   │       │   │           │       │           ├── java/
│   │       │   │           │       │           │   └── com/
│   │       │   │           │       │           │       └── liferay/
│   │       │   │           │       │           │           └── docs/
│   │       │   │           │       │           │               └── guestbook/
│   │       │   │           │       │           │                   ├── internal/
│   │       │   │           │       │           │                   │   └── security/
│   │       │   │           │       │           │                   │       └── permission/
│   │       │   │           │       │           │                   │           └── resource/
│   │       │   │           │       │           │                   │               ├── GuestbookEntryModelResourcePermissionRegistrar.java
│   │       │   │           │       │           │                   │               ├── GuestbookModelResourcePermissionRegistrar.java
│   │       │   │           │       │           │                   │               └── GuestbookPortletResourcePermissionRegistrar.java
│   │       │   │           │       │           │                   ├── model/
│   │       │   │           │       │           │                   │   └── impl/
│   │       │   │           │       │           │                   │       ├── GuestbookBaseImpl.java
│   │       │   │           │       │           │                   │       ├── GuestbookCacheModel.java
│   │       │   │           │       │           │                   │       ├── GuestbookEntryBaseImpl.java
│   │       │   │           │       │           │                   │       ├── GuestbookEntryCacheModel.java
│   │       │   │           │  

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
# Set default behaviour, in case users don't have core.autocrlf set.
* text=auto

# Explicitly declare text files we want to always be normalized and converted
# to native line endings on checkout.
*.c text
*.h text
*.java text
*.xml text
*.gradle text
*.fodp text diff=xml
*.properties text
*.css text
*.js text
*.sql text
*.txt text
*.xsl text
*.tex text
*.markdown text
*.md text

# Declare files that will always have CRLF line endings on checkout.
*.sln text eol=crlf

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
*.gif binary


================================================
FILE: .gitignore
================================================
*~
*.bak
*.class
*.iml
*.swp
*-tmp.html
.project
.classpath
.settings
git-modified-list.txt
nbbuild.xml
properties/
.METADATA
.DS_Store
.directory 
.gradle
.nb-gradle
.vscode

node_modules/

/*.ipr
/*.iws
/*.patch
build.*.properties

build/
classes/
dist/
**nbproject**
.ivy/
.sass-cache/
.DS_Store/
*#
/develop/tutorials/code/osgi/modules/form-nav-extension-portlet/.nb-gradle/
/develop/tutorials/code/osgi/modules/com.liferay.docs.greetingimpl/.nb-gradle/
/develop/tutorials/code/osgi/modules/com.liferay.docs.greetingapi/.nb-gradle/
/develop/tutorials/code/osgi/modules/com.liferay.docs.greetingcommand/.nb-gradle/
**/temp/**
/develop/tutorials/code/com-liferay-docs-guestbook/.nb-gradle/


================================================
FILE: README.markdown
================================================
# LIFERAY-DOCS

<a href="https://dev.liferay.com" >
<img src="guidelines/images/liferayDeveloperNetworkSmallerEdit7.jpg" alt="Liferay Docs Icon">
</a>

[![Slack Status](https://community-chat.liferay.com/badge.svg)](https://liferay-community.slack.com/messages/C5XE4BH3Q/)

Welcome to Liferay's official documentation project, the home of
[Liferay Developer Network](https://dev.liferay.com) articles. All articles are
written in
<a href="http://fletcher.github.com/peg-multimarkdown/mmd-manual.pdf" target="_blank">
Markdown</a>, making them easy to write and read. Approved articles are
uploaded to the Liferay Developer Network (LDN) and converted automatically to
HTML. In this project, you can contribute new articles, improve existing
articles, or fix documentation bugs. To produce documentation that is
comprehensive and stylistically consistent, the liferay-docs project provides
<a href="guidelines/03-writers-guidelines.markdown" target="_blank">writing guidelines</a>,
<a href="guidelines/02-standards-and-customizations.markdown" target="_blank">standards & customizations</a>,
and a
<a href="develop/tutorial-template.markdown" target="_blank">tutorial template</a>.

You'll learn how quickly to submit a new article and its images next. 

## Quick Steps to Submit a New Article

You can follow these steps to create a new article and contribute it from 
GitHub. 

1.  Sign in to GitHub. If you don't already have a GitHub account, you must
    [join](https://github.com/join) GitHub in order to contribute to
    liferay-docs. 

2.  Click on a `new-articles` link folder below. These match the LDN sections
    where you can add a articles:

    - <a href="develop/new-articles" target="_blank">`develop/new-articles`</a>

    - <a href="discover/new-articles" target="_blank">`discover/new-articles`</a>

    - <a href="distribute/new-articles" target="_blank">`distribute/new-articles`</a>

3.  Select the liferay-docs branch that matches the Liferay Portal version
    you're writing about: 

    <table border="1">
    <tr>
    <td><b>&nbsp;Branch&nbsp;</b></td>
    <td><b>&nbsp;Portal Version&nbsp;</b></td>
    </tr>
    <tr>
    <td>&nbsp;master&nbsp;</td>
    <td>&nbsp;7.2</td>
    </tr>
    <tr>
    <td>&nbsp;7.1.x&nbsp;</td>
    <td>&nbsp;7.1</td>
    </tr>
    <tr>
    <td>&nbsp;7.0.x&nbsp;</td>
    <td>&nbsp;7.0</td>
    </tr>
    <tr>
    <td>&nbsp;6.2.x</td>
    <td>&nbsp;6.2</td>
    </tr>
    </table>

4.  Click the **plus** sign after **new-articles/:**
    ![new articles folder](guidelines/images/new-articles-folder.png)

5.  Write your article and click the
    ![Propose new file](guidelines/images/propose-new-file.png) button, to
    prepare a [pull request](https://help.github.com/articles/using-pull-requests/). 

6.  Send the pull request to the default user `liferay`. 

7.  Drag your article's images into the pull request's comments to associate
    the images with your article. 

Your new article is submitted! Liferay's Knowledge Management team will review
your contribution. Approved changes are merged into the liferay-docs repo and
published to the [Liferay Developer Network](https://dev.liferay.com). 

If you want to clone our repository and do serious documentation work on your
own machine, [click here](guidelines/01-creating-docs-for-liferay.markdown) to go
to our guidelines section. 

Thanks for helping us out with Liferay documentation! 

## Redirect instructions

```
cd liferay-docs
./bin/update_liferay_learn_links.sh path/to/properties/file
```

For example, 

```bash
cd liferay-learn
cat ./site/docs/redirects_keep.properties ./site/docs/redirects_new.properties > ~/redirects.properties
cd ../liferay-docs
./bin/update_liferay_learn_links.sh ~/redirects.properties
```


================================================
FILE: bin/convert-markdown.sh
================================================
#!/bin/sh

scriptPath=$(readlink -f "$0")

classpathDir=$(dirname $(dirname "$scriptPath"))/lib
htmlFile=$1
htmlFile=$(echo "${htmlFile}" | sed 's/[^.]*$//')
htmlFile=${htmlFile}html
#echo "java -cp "${classpathDir}/*" com.liferay.documentation.util.MarkdownToHtml $1 ${htmlFile}"
#java -cp "${classpathDir}/*" com.liferay.documentation.util.MarkdownToHtml $1 ${htmlFile}
# echo "java -cp "${classpathDir}/*" com.liferay.knowledge.base.markdown.converter.cli.MarkdownConverterCLI $1 > ${htmlFile}"
java -cp "${classpathDir}/*" com.liferay.knowledge.base.markdown.converter.cli.MarkdownConverterCLI /dev/stdin 
exit 0


================================================
FILE: bin/convert.bat
================================================
@echo off

set CLASSPATH=%~dp0\..\lib

if "%1"=="" goto usage
if "%2"=="" goto convert

java -cp .;%CLASSPATH%\* com.liferay.knowledge.base.markdown.converter.cli.MarkdownConverterCLI %1 > %2

goto end

:usage

echo Usage: convert.bat [Markdown file to convert] or convert.bat [Markdown file to convert] [HTML file to be written]
echo.
echo Run the convert.bat script from any directory.
echo.
echo The first argument is the path to the Markdown file to convert to HTML.
echo.
echo The second argument is optional. It specifies the path to the HTML file to be created. If this argument is omitted, the HTML file to be created will be created in the same directory as the Markdown file and will have the same filename as the Markdown file except that the .markdown file extension will be replaced by the .html file extension.
echo.
goto end

:convert

set htmlFile=%1
set htmlFile=%htmlFile:markdown=html%

java -cp .;%CLASSPATH%\* com.liferay.knowledge.base.markdown.converter.cli.MarkdownConverterCLI %1 > %htmlFile%

:end


================================================
FILE: bin/convert.sh
================================================
#!/bin/sh

scriptPath=$(readlink -f "$0")

classpathDir=$(dirname $(dirname "$scriptPath"))/lib

if [ $# -lt 1 ]; then
	echo
	echo Usage: ./convert.sh \[Markdown file to convert\] or ./convert.sh \[Markdown file to convert\] \[HTML file to be written\]
	echo
	echo Run the convert.sh script from the liferay-docs directory or any subdirectory.
	echo
	echo The first argument is the path to the Markdown file to convert to HTML.
	echo
	echo The second argument is optional. It specifies the path to the HTML file to be created. If this argument is omitted, the HTML file to be created is created in the same directory as the Markdown file and has the same filename as the Markdown file except that the .markdown file extension is replaced by the .html file extension.  
	echo
	exit 1
elif [ $# -lt 2 ]; then
	htmlFile=$1
	htmlFile=$(echo "${htmlFile}" | sed 's/[^.]*$//')
	htmlFile=${htmlFile}html
	#echo "java -cp "${classpathDir}/*" com.liferay.documentation.util.MarkdownToHtml $1 ${htmlFile}"
	#java -cp "${classpathDir}/*" com.liferay.documentation.util.MarkdownToHtml $1 ${htmlFile}
	echo "java -cp "${classpathDir}/*" com.liferay.knowledge.base.markdown.converter.cli.MarkdownConverterCLI $1 > ${htmlFile}"
	java -cp "${classpathDir}/*" com.liferay.knowledge.base.markdown.converter.cli.MarkdownConverterCLI $1 > ${htmlFile}
	exit 0
else
	java -cp "${classpathDir}/*" com.liferay.documentation.util.MarkdownToHtml $1 > $2
	exit 0
fi


================================================
FILE: bin/migrate.py
================================================
import os
import re
import shutil
import sys


def append_to_line(line, new_line):
    line = line.replace("\r","")
    line = line.replace("\n", "")
    line = line + " " + new_line.lstrip()
    return line

def end_sidebar(sidebar_line, newFile):
    if sidebar_line not in "":
        sidebar_line = sidebar_line.replace("| ", "")
        newFile.write(sidebar_line)
        newFile.write("```\n")
        sidebar_line = ""
    return sidebar_line

def write_and_reset_string(line, newFile):
    if line not in "":
        newFile.write(line)
        line = ""

    return line


if __name__ == "__main__":

    if (len(sys.argv) < 2):
        print("Usage:\n\tpython migrate.py article [dest_folder]\n\nDescription:\n\tMigrates the article to an .md file and converts the content to liferay-learn Markdown/MyST syntax. The converted article destination folder [dest_folder] is the current folder by default but is typically set to a liferay-learn folder.\n\n\tIMPORTANT: Run this script in the liferay-docs article's folder so that the script can use the image file paths found in the article to copy the image files to the [dest_folder]/[article_name]/images/ folder.")
        sys.exit()

    article = sys.argv[1]

    dest_folder = "."
    if (len(sys.argv)) > 2:
        dest_folder = sys.argv[2]

    if not (os.path.isdir(dest_folder)):
        os.mkdir(dest_folder)

    article_name = article.split('.markdown')[0]

    new_article_path = dest_folder + "/" + article_name + ".md"

    # Copy referenced image files to [article destination folder]/[article_name]/images

    file = open(article)
    content = file.read()
    file.close()

    png_split = content.split('.png)')

    images = []

    png_split_len = len(png_split) - 1
    ii = 0;

    while (ii < png_split_len):
        paran_split = png_split[ii].split('(')

        if (len(paran_split) > 1):
            image = paran_split[len(paran_split) - 1] + '.png'
            images.append(image)

        ii = ii + 1

    article_name_folder = dest_folder + "/" + article_name
    images_folder = article_name_folder + "/images"

    if (len(images) > 0):

        if not os.path.isdir(article_name_folder):
            os.mkdir(article_name_folder)

        if not os.path.isdir(images_folder):
            os.mkdir(images_folder)

        print("Writing images to folder: " + images_folder)

    for ff in images:
        shutil.copy(ff, images_folder)

    # Process the text

    file = open(article)
    lines = file.readlines()
    file.close()

    # Open the destination file for writing to
    newFile = open(new_article_path, 'w')

    print("Migrating to article: " + new_article_path)

    # Track the last significant line's first non-space character column index
    prev_index = -1

    # Variables for storing text that belongs on the same line; hard returns are
    # removed
    list_item_line = ""
    para_line = ""
    sidebar_line = ""

    # Variables that allow you to skip more detailed condition checks
    done_header_id = False
    done_title = False
    done_toc = False
    prev_sidebar_line_empty = False

    # Variables for markup context
    in_code = False
    in_header_id = False

    images_folder_path = "](./" + article_name + "/images/"

    for line in lines:

        # Set all image file locations to the ./[article_name]/images/ folder
        line = re.sub("\]\((../)+images/", images_folder_path, line)

        # Replace legacy tokens
        line = re.sub("@product@", "Liferay DXP", line)
        line = re.sub("@commerce@", "Liferay Commerce", line)
        line = re.sub("@ide@", "Dev Studio DXP", line)
        line = re.sub("@app-ref@", "https://docs.liferay.com/dxp/apps", line)
        line = re.sub("@platform-ref@", "https://docs.liferay.com/dxp/portal", line)

        # Convenience variable for working with the current line free of leading
        # and trailing white space.
        trimmed_line = line.lstrip()

        if not done_header_id:
            # Skip over all of the legacy header-id stuff

            if trimmed_line.startswith("---"):
                if not in_header_id:
                    in_header_id = True
                else:
                    done_header_id = True
                    in_header_id = False

            continue
        if not done_title and trimmed_line in "":
            # Skip empty lines until the title is written
            continue
        elif line.startswith("#"):
            # Handle heading
            newFile.write(line)

            if not done_title:
                done_title = True
        elif not done_toc and trimmed_line in "":
            # Skip empty lines until TOC is done
            continue
        elif trimmed_line.startswith("```"):
            # Toggle whether we're in code

            # Write any saved text
            para_line = write_and_reset_string(para_line, newFile)
            sidebar_line = end_sidebar(sidebar_line, newFile)
            list_item_line = write_and_reset_string(list_item_line, newFile)

            # Write the current line as is
            newFile.write(line)

            # Track whether code block has started or ended
            if (in_code):
                in_code = False
            else:
                in_code = True
        elif re.search("^\d.", trimmed_line):
            # Handle an ordered list item

            # Write any saved text
            para_line = write_and_reset_string(para_line, newFile)
            sidebar_line = end_sidebar(sidebar_line, newFile)
            list_item_line = write_and_reset_string(list_item_line, newFile)

            # Start all ordered list items with 1.
            list_item_line = re.sub("\d+.\s*", "1. ", line, 1)

            prev_index = re.search("\S", line).start()
        elif trimmed_line.startswith("-"):
            # Handle an unordered-list item starting with -

            # Write any saved text
            para_line = write_and_reset_string(para_line, newFile)
            sidebar_line = end_sidebar(sidebar_line, newFile)
            list_item_line = write_and_reset_string(list_item_line, newFile)

            # Start list items with '*' instead of '-', followed by a single space
            list_item_line = re.sub("-\s*", "* ", line, 1)

            prev_index = re.search("\S", line).start()
        elif trimmed_line.startswith("* "):
            # Handle an unordered-list item starting with *

            # Write any saved text
            para_line = write_and_reset_string(para_line, newFile)
            sidebar_line = end_sidebar(sidebar_line, newFile)
            list_item_line = write_and_reset_string(list_item_line, newFile)

            # Start list items with '*', followed by a single space
            list_item_line = re.sub("\*\s*", "* ", line, 1)

            prev_index = re.search("\S", line).start()
        elif re.search("^\|", line.strip()):

            if not re.search("^\|.*\|$", line.strip()):

                # Handle a sidebar line

                # Write any saved text
                para_line = write_and_reset_string(para_line, newFile)
                list_item_line = write_and_reset_string(list_item_line, newFile)

                pipe_index = re.search("|", line).start()

                tmp_line = line.replace("| ", "", 1).strip()
                if tmp_line in "":
                    prev_sidebar_line_empty = True
                    sidebar_line += "\n"
                else:

                    # Replace the leading pipe with a space
                    stripped_line = line.replace("| ", "", 1)

                    if sidebar_line in "":

                        # Start the sidebar

                        if "**Note:**" in stripped_line:
                            newFile.write("```{note}\n")
                            stripped_line = stripped_line.replace("**Note:**", "", 1)
                        elif "**Tip:**" in stripped_line:
                            newFile.write("```{tip}\n")
                            stripped_line = stripped_line.replace("**Tip:**", "", 1)
                        elif "**Warning:**" in stripped_line:
                            newFile.write("```{warning}\n")
                            stripped_line = stripped_line.replace("**Warning:**", "", 1)
                        elif "**Important:**" in stripped_line:
                            newFile.write("```{important}\n")
                            stripped_line = stripped_line.replace("**Important:**", "", 1)
                        elif "**Note**:" in stripped_line:
                            newFile.write("```{note}\n")
                            stripped_line = stripped_line.replace("**Note**:", "", 1)
                        elif "**Tip**:" in stripped_line:
                            newFile.write("```{tip}\n")
                            stripped_line = stripped_line.replace("**Tip**:", "", 1)
                        elif "**Warning**:" in stripped_line:
                            newFile.write("```{warning}\n")
                            stripped_line = stripped_line.replace("**Warning**:", "", 1)
                        elif "**Important**:" in stripped_line:
                            newFile.write("```{important}\n")
                            stripped_line = stripped_line.replace("**Important**:", "", 1)
                        else:
                            newFile.write("```{note}\n")

                    if sidebar_line in "":
                        sidebar_line = stripped_line.lstrip()
                    else:
                        if prev_sidebar_line_empty:
                            sidebar_line = sidebar_line + stripped_line
                            prev_sidebar_line_empty = False
                        else:
                            sidebar_line = sidebar_line.rstrip() + " " + stripped_line.lstrip()

                    prev_index = re.search("\S", line).start()
            else:
                # Handle table line

                para_line = write_and_reset_string(para_line, newFile)
                sidebar_line = end_sidebar(sidebar_line, newFile)
                list_item_line = write_and_reset_string(list_item_line, newFile)

                # Write the table line
                newFile.write(line)
        elif in_code:

            # Write code line
            newFile.write(line)
        elif trimmed_line.startswith("[TOC"):
            # Don't write anything for the legacy TOC line
            done_toc = True
            continue
        elif para_line != "":

            if re.search("^[\d\-]", trimmed_line):
                # Write the existing paragraph and start a list item
                list_item_line = line

                para_line = write_and_reset_string(para_line, newFile)

                prev_index = re.search("\S", line).start()
            elif re.search("^[\:]", trimmed_line):

                # Write definition term
                newFile.write(para_line)

                # Start the term definition
                para_line = line

                prev_index = re.search("\S", line).start()
            elif re.search("^[\w\*\@\!\(\&\.\[\`\s(\w\*\@\!\(\&\.\[\`)]", trimmed_line):

                para_line = append_to_line(para_line, trimmed_line)
            else:

                # Write the existing paragraph and the current line
                para_line = write_and_reset_string(para_line, newFile)
                newFile.write(line)

                if re.search("\S", line):
                    prev_index = re.search("\S", line).start()
        elif re.search("^[\w\*\@\!\(\&\.\[\`\s\:(\w\*\@\!\(\&\.\[\`)]", trimmed_line):

            sidebar_line = end_sidebar(sidebar_line, newFile)

            if re.search("\S", line):
                index = re.search("\S", line).start()

                if index > prev_index:

                    if list_item_line != "":
                        list_item_line = append_to_line(list_item_line, line)
                    elif (para_line != ""):
                        para_line = append_to_line(para_line, line)
                    else:
                        para_line = line
                        prev_index = index
                else:
                    para_line = write_and_reset_string(para_line, newFile)
                    sidebar_line = end_sidebar(sidebar_line, newFile)
                    list_item_line = write_and_reset_string(list_item_line, newFile)

                    para_line = line
                    prev_index = index
            else:
                # Empty line

                para_line = write_and_reset_string(para_line, newFile)
                sidebar_line = end_sidebar(sidebar_line, newFile)
                list_item_line = write_and_reset_string(list_item_line, newFile)

                # Write the current line
                newFile.write(line)
        else:

            if not done_header_id and trimmed_line in "":
                # Skip writing empty lines before writing the title line
                continue
            else:
                # Set index to first non-space character
                if re.search("\S", line):
                    prev_index = re.search("\S", line).start()


                para_line = write_and_reset_string(para_line, newFile)
                sidebar_line = end_sidebar(sidebar_line, newFile)
                list_item_line = write_and_reset_string(list_item_line, newFile)

                # Write the current line
                newFile.write(line)

    # Done looping through the lines

    # Finish writing the current paragraph, list item, or sidebar

    if para_line != "":
        newFile.write(para_line)
    elif list_item_line != "":
        newFile.write(list_item_line)
    elif sidebar_line != "":
        newFile.write(sidebar_line)

    newFile.close()

================================================
FILE: bin/update-liferay-learn-links.sh
================================================
#!/bin/bash

# This script was inspired by the answers at
# https://stackoverflow.com/questions/30724170/how-to-read-properties-file-using-shell-script

redirects_file=~/redirects_all.properties

if [ "${#}" -eq 0 ]
then
    echo "Must input a properties file"
    echo "Usage: ./bin/update-liferay-learn_links.sh path/to/properties/file"
    exit 1
fi

if [ "${#}" -ge 1 ]
then
    if [ ! -f ${1} ]
    then
        echo "File ${1} does not exist."

        exit 1
    else
        redirects_file=${1}
    fi
fi

echo "Redirects file ${redirects_file}"

# Read configuration into an associative array
declare -A REDIRECT

# IFS is the 'internal field separator'. In this case, your file uses '='
IFS="="
while read -r key value
do
    if [ -n $value ]; then
        REDIRECT[$key]=$value
    else
        REDIRECT[$key]=$value
    fi
done < ${redirects_file}
unset IFS

for file in `find . -type f -name "*.markdown"`
do
    if [ -n "$(grep learn.liferay.com $(echo ${file}))" ]
    then
        echo "${file}"

        for key in "${!REDIRECT[@]}"
        do
            sed -i s@$key@${REDIRECT[$key]}@g "${file}"
        done
    fi
done

================================================
FILE: bin/update-markdown-sidebar-syntax-win.sh
================================================
#!/bin/sh

developdir="../develop"
distributedir="../distribute"
usedir="../use"

for file in $(find $developdir -name "*.markdown")
do
perl -p0777i.bak -e 's/\r\n[ \t]*---[ ]*(\r\n)+[ ]*!\[.*\]\(.*\)[\s]*/\r\n\+\$\$\$\r\n\r\n/g' $file
perl -p0777i.bak -e 's/\r\n[ \t]*---[ ]*(\r\n)/\r\n\$\$\$\r\n/g' $file
done

for file in $(find $distributedir -name "*.markdown")
do
perl -p0777i.bak -e 's/\r\n[ \t]*---[ ]*(\r\n)+[ ]*!\[.*\]\(.*\)[\s]*/\r\n\+\$\$\$\r\n\r\n/g' $file
perl -p0777i.bak -e 's/\r\n[ \t]*---[ ]*(\r\n)/\r\n\$\$\$\r\n/g' $file
done

for file in $(find $usedir -name "*.markdown")
do
perl -p0777i.bak -e 's/\r\n[ \t]*---[ ]*(\r\n)+[ ]*!\[.*\]\(.*\)[\s]*/\r\n\+\$\$\$\r\n\r\n/g' $file
perl -p0777i.bak -e 's/\r\n[ \t]*---[ ]*(\r\n)/\r\n\$\$\$\r\n/g' $file
done


================================================
FILE: bin/update-markdown-sidebar-syntax.sh
================================================
#!/bin/sh

developdir="../develop"
distributedir="../distribute"
usedir="../use"

for file in $(find $developdir -name "*.markdown")
do
perl -p0777i -e 's/\n[ \t]*---[ ]*\n+[ ]*!\[.*\]\(.*\)[\s]*/\n\+\$\$\$\n\n/g' $file
perl -p0777i -e 's/\n[ \t]*---[ ]*\n/\n\$\$\$\n/g' $file
done

for file in $(find $distributedir -name "*.markdown")
do
perl -p0777i -e 's/\n[ \t]*---[ ]*\n+[ ]*!\[.*\]\(.*\)[\s]*/\n\+\$\$\$\n\n/g' $file
perl -p0777i -e 's/\n[ \t]*---[ ]*\n/\n\$\$\$\n/g' $file
done

for file in $(find $usedir -name "*.markdown")
do
perl -p0777i -e 's/\n[ \t]*---[ ]*\n+[ ]*!\[.*\]\(.*\)[\s]*/\n\+\$\$\$\n\n/g' $file
perl -p0777i -e 's/\n[ \t]*---[ ]*\n/\n\$\$\$\n/g' $file
done


================================================
FILE: book/developer/appdev.aux
================================================
\relax 
\providecommand{\transparent@use}[1]{}
\providecommand\hyper@newdestlabel[2]{}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {229}Application Development}{661}{chapter.229}\protected@file@percent }
\newlabel{application-development}{{229}{661}{Application Development}{chapter.229}{}}
\@writefile{toc}{\contentsline {section}{\numberline {229.1}Getting Started with Liferay Development}{662}{section.229.1}\protected@file@percent }
\newlabel{getting-started-with-liferay-development}{{229.1}{662}{Getting Started with Liferay Development}{section.229.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {229.2}Create Your Object Model and Database in One Shot}{662}{section.229.2}\protected@file@percent }
\newlabel{create-your-object-model-and-database-in-one-shot}{{229.2}{662}{Create Your Object Model and Database in One Shot}{section.229.2}{}}
\@writefile{toc}{\contentsline {section}{\numberline {229.3}Create a REST Interface}{663}{section.229.3}\protected@file@percent }
\newlabel{create-a-rest-interface}{{229.3}{663}{Create a REST Interface}{section.229.3}{}}
\@writefile{toc}{\contentsline {section}{\numberline {229.4}Create a Web Client}{663}{section.229.4}\protected@file@percent }
\newlabel{create-a-web-client}{{229.4}{663}{Create a Web Client}{section.229.4}{}}
\@writefile{toc}{\contentsline {section}{\numberline {229.5}Use Liferay's Frameworks}{663}{section.229.5}\protected@file@percent }
\newlabel{use-liferays-frameworks}{{229.5}{663}{Use Liferay's Frameworks}{section.229.5}{}}
\@writefile{toc}{\contentsline {section}{\numberline {229.6}Next Steps}{663}{section.229.6}\protected@file@percent }
\newlabel{next-steps}{{229.6}{663}{Next Steps}{section.229.6}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {230}Developing Web Front-Ends}{665}{chapter.230}\protected@file@percent }
\newlabel{developing-web-front-ends}{{230}{665}{Developing Web Front-Ends}{chapter.230}{}}
\@writefile{toc}{\contentsline {section}{\numberline {230.1}Using Popular Frameworks}{665}{section.230.1}\protected@file@percent }
\newlabel{using-popular-frameworks}{{230.1}{665}{Using Popular Frameworks}{section.230.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {230.2}Getting Started}{666}{section.230.2}\protected@file@percent }
\newlabel{getting-started}{{230.2}{666}{Getting Started}{section.230.2}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {231}Developing an Angular Application}{669}{chapter.231}\protected@file@percent }
\newlabel{developing-an-angular-application}{{231}{669}{Developing an Angular Application}{chapter.231}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {231.1}{\ignorespaces Apps like this Guestbook app are easy to migrate to Liferay DXP.}}{669}{figure.231.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {231.1}Related Topics}{673}{section.231.1}\protected@file@percent }
\newlabel{related-topics}{{231.1}{673}{Related Topics}{section.231.1}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {232}Developing a React Application}{675}{chapter.232}\protected@file@percent }
\newlabel{developing-a-react-application}{{232}{675}{Developing a React Application}{chapter.232}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {232.1}{\ignorespaces Apps like this Guestbook app are easy to migrate to Liferay DXP.}}{675}{figure.232.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {232.1}Related Topics}{678}{section.232.1}\protected@file@percent }
\newlabel{related-topics-1}{{232.1}{678}{Related Topics}{section.232.1}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {233}Developing a Vue Application}{679}{chapter.233}\protected@file@percent }
\newlabel{developing-a-vue-application}{{233}{679}{Developing a Vue Application}{chapter.233}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {233.1}{\ignorespaces Vue Apps like this Guestbook App are easy to deploy, and they look great in Liferay DXP.}}{680}{figure.233.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {233.1}Related Topics}{683}{section.233.1}\protected@file@percent }
\newlabel{related-topics-2}{{233.1}{683}{Related Topics}{section.233.1}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {234}Liferay MVC Portlet}{685}{chapter.234}\protected@file@percent }
\newlabel{liferay-mvc-portlet}{{234}{685}{Liferay MVC Portlet}{chapter.234}{}}
\@writefile{toc}{\contentsline {section}{\numberline {234.1}MVC Layers and Modularity}{685}{section.234.1}\protected@file@percent }
\newlabel{mvc-layers-and-modularity}{{234.1}{685}{MVC Layers and Modularity}{section.234.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {234.2}Liferay MVC Command Classes}{686}{section.234.2}\protected@file@percent }
\newlabel{liferay-mvc-command-classes}{{234.2}{686}{Liferay MVC Command Classes}{section.234.2}{}}
\@writefile{toc}{\contentsline {section}{\numberline {234.3}Liferay MVC Portlet Component}{686}{section.234.3}\protected@file@percent }
\newlabel{liferay-mvc-portlet-component}{{234.3}{686}{Liferay MVC Portlet Component}{section.234.3}{}}
\@writefile{toc}{\contentsline {section}{\numberline {234.4}A Simpler MVC Portlet}{687}{section.234.4}\protected@file@percent }
\newlabel{a-simpler-mvc-portlet}{{234.4}{687}{A Simpler MVC Portlet}{section.234.4}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {235}Creating an MVC Portlet}{689}{chapter.235}\protected@file@percent }
\newlabel{creating-an-mvc-portlet}{{235}{689}{Creating an MVC Portlet}{chapter.235}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {235.1}{\ignorespaces The example portlet shows a message defined by the language property \texttt  {yourmvc.caption=Hello\ from\ YourMVC!} in the Language.properties file.}}{691}{figure.235.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {235.1}Related Topics}{691}{section.235.1}\protected@file@percent }
\newlabel{related-topics-3}{{235.1}{691}{Related Topics}{section.235.1}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {236}Writing MVC Portlet Controller Code}{693}{chapter.236}\protected@file@percent }
\newlabel{writing-mvc-portlet-controller-code}{{236}{693}{Writing MVC Portlet Controller Code}{chapter.236}{}}
\@writefile{toc}{\contentsline {section}{\numberline {236.1}Action Methods}{693}{section.236.1}\protected@file@percent }
\newlabel{action-methods}{{236.1}{693}{Action Methods}{section.236.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {236.2}Render Logic}{694}{section.236.2}\protected@file@percent }
\newlabel{render-logic}{{236.2}{694}{Render Logic}{section.236.2}{}}
\@writefile{toc}{\contentsline {section}{\numberline {236.3}Setting and Retrieving Request and Response Parameters and Attributes}{695}{section.236.3}\protected@file@percent }
\newlabel{setting-and-retrieving-request-and-response-parameters-and-attributes}{{236.3}{695}{Setting and Retrieving Request and Response Parameters and Attributes}{section.236.3}{}}
\@writefile{toc}{\contentsline {section}{\numberline {236.4}Related Topics}{696}{section.236.4}\protected@file@percent }
\newlabel{related-topics-4}{{236.4}{696}{Related Topics}{section.236.4}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {237}Configuring the View Layer}{697}{chapter.237}\protected@file@percent }
\newlabel{configuring-the-view-layer}{{237}{697}{Configuring the View Layer}{chapter.237}{}}
\@writefile{toc}{\contentsline {section}{\numberline {237.1}Using the init.jsp}{697}{section.237.1}\protected@file@percent }
\newlabel{using-the-init.jsp}{{237.1}{697}{Using the init.jsp}{section.237.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {237.2}Using Render URLs}{698}{section.237.2}\protected@file@percent }
\newlabel{using-render-urls}{{237.2}{698}{Using Render URLs}{section.237.2}{}}
\@writefile{toc}{\contentsline {section}{\numberline {237.3}Using Action URLs}{699}{section.237.3}\protected@file@percent }
\newlabel{using-action-urls}{{237.3}{699}{Using Action URLs}{section.237.3}{}}
\@writefile{toc}{\contentsline {section}{\numberline {237.4}Related Topics}{699}{section.237.4}\protected@file@percent }
\newlabel{related-topics-5}{{237.4}{699}{Related Topics}{section.237.4}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {238}MVC Action Command}{701}{chapter.238}\protected@file@percent }
\newlabel{mvc-action-command}{{238}{701}{MVC Action Command}{chapter.238}{}}
\@writefile{toc}{\contentsline {section}{\numberline {238.1}Related Topics}{703}{section.238.1}\protected@file@percent }
\newlabel{related-topics-6}{{238.1}{703}{Related Topics}{section.238.1}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {239}MVC Render Command}{705}{chapter.239}\protected@file@percent }
\newlabel{mvc-render-command}{{239}{705}{MVC Render Command}{chapter.239}{}}
\@writefile{toc}{\contentsline {section}{\numberline {239.1}Related Topics}{706}{section.239.1}\protected@file@percent }
\newlabel{related-topics-7}{{239.1}{706}{Related Topics}{section.239.1}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {240}MVC Resource Command}{707}{chapter.240}\protected@file@percent }
\newlabel{mvc-resource-command}{{240}{707}{MVC Resource Command}{chapter.240}{}}
\@writefile{toc}{\contentsline {section}{\numberline {240.1}Related Topics}{709}{section.240.1}\protected@file@percent }
\newlabel{related-topics-8}{{240.1}{709}{Related Topics}{section.240.1}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {241}PortletMVC4Spring}{711}{chapter.241}\protected@file@percent }
\newlabel{portletmvc4spring}{{241}{711}{PortletMVC4Spring}{chapter.241}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {241.1}{\ignorespaces This PortletMVC4Spring portlet enables users to enter job applications. It uses the Spring features mentioned above and handles requests from multiple portlet phases.}}{712}{figure.241.1}\protected@file@percent }
\gdef \LT@xii {\LT@entry 
    {1}{234.8775pt}\LT@entry 
    {1}{234.8775pt}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {242}Developing a Portlet Using PortletMVC4Spring}{715}{chapter.242}\protected@file@percent }
\newlabel{developing-a-portlet-using-portletmvc4spring}{{242}{715}{Developing a Portlet Using PortletMVC4Spring}{chapter.242}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {242.1}{\ignorespaces The archetype's sample portlet prints a greeting (e.g., \emph  {Hello, Joe Bloggs}) on submitting a first and last name.}}{715}{figure.242.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {242.1}Related Topics}{719}{section.242.1}\protected@file@percent }
\newlabel{related-topics-9}{{242.1}{719}{Related Topics}{section.242.1}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {243}Migrating to PortletMVC4Spring}{721}{chapter.243}\protected@file@percent }
\newlabel{migrating-to-portletmvc4spring}{{243}{721}{Migrating to PortletMVC4Spring}{chapter.243}{}}
\@writefile{toc}{\contentsline {section}{\numberline {243.1}Related Topics}{722}{section.243.1}\protected@file@percent }
\newlabel{related-topics-10}{{243.1}{722}{Related Topics}{section.243.1}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {244}JSF Portlet}{723}{chapter.244}\protected@file@percent }
\newlabel{jsf-portlet}{{244}{723}{JSF Portlet}{chapter.244}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {245}Developing a JSF Portlet Application}{725}{chapter.245}\protected@file@percent }
\newlabel{developing-a-jsf-portlet-application}{{245}{725}{Developing a JSF Portlet Application}{chapter.245}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {246}Bean Portlet}{729}{chapter.246}\protected@file@percent }
\newlabel{bean-portlet}{{246}{729}{Bean Portlet}{chapter.246}{}}
\@writefile{toc}{\contentsline {section}{\numberline {246.1}Portlet Configuration Annotations}{729}{section.246.1}\protected@file@percent }
\newlabel{portlet-configuration-annotations}{{246.1}{729}{Portlet Configuration Annotations}{section.246.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {246.2}Dependency Injection}{730}{section.246.2}\protected@file@percent }
\newlabel{dependency-injection}{{246.2}{730}{Dependency Injection}{section.246.2}{}}
\gdef \LT@xiii {\LT@entry 
    {1}{287.70345pt}\LT@entry 
    {1}{182.05156pt}}
\@writefile{toc}{\contentsline {section}{\numberline {246.3}Portlet Phase Methods}{731}{section.246.3}\protected@file@percent }
\newlabel{portlet-phase-methods}{{246.3}{731}{Portlet Phase Methods}{section.246.3}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {247}Creating a Bean Portlet}{733}{chapter.247}\protected@file@percent }
\newlabel{creating-a-bean-portlet}{{247}{733}{Creating a Bean Portlet}{chapter.247}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {247.1}{\ignorespaces The Foo portlet prints the message returned from \texttt  {doView} method and shows the included JSP's contents.}}{735}{figure.247.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {247.1}Related Topics}{735}{section.247.1}\protected@file@percent }
\newlabel{related-topics-11}{{247.1}{735}{Related Topics}{section.247.1}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {248}Service Builder}{737}{chapter.248}\protected@file@percent }
\newlabel{service-builder}{{248}{737}{Service Builder}{chapter.248}{}}
\@writefile{toc}{\contentsline {section}{\numberline {248.1}Customization via Implementation Classes}{738}{section.248.1}\protected@file@percent }
\newlabel{customization-via-implementation-classes}{{248.1}{738}{Customization via Implementation Classes}{section.248.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {248.2}Hibernate Configurations}{738}{section.248.2}\protected@file@percent }
\newlabel{hibernate-configurations}{{248.2}{738}{Hibernate Configurations}{section.248.2}{}}
\@writefile{toc}{\contentsline {section}{\numberline {248.3}Caching}{738}{section.248.3}\protected@file@percent }
\newlabel{caching}{{248.3}{738}{Caching}{section.248.3}{}}
\@writefile{toc}{\contentsline {section}{\numberline {248.4}Dynamic Query and Custom SQL Query}{738}{section.248.4}\protected@file@percent }
\newlabel{dynamic-query-and-custom-sql-query}{{248.4}{738}{Dynamic Query and Custom SQL Query}{section.248.4}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {249}Creating a Service Builder Project}{741}{chapter.249}\protected@file@percent }
\newlabel{creating-a-service-builder-project}{{249}{741}{Creating a Service Builder Project}{chapter.249}{}}
\@writefile{toc}{\contentsline {section}{\numberline {249.1}Related Topics}{742}{section.249.1}\protected@file@percent }
\newlabel{related-topics-12}{{249.1}{742}{Related Topics}{section.249.1}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {250}Creating the service.xml File}{743}{chapter.250}\protected@file@percent }
\newlabel{creating-the-service.xml-file}{{250}{743}{Creating the service.xml File}{chapter.250}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {251}Defining Global Service Information}{745}{chapter.251}\protected@file@percent }
\newlabel{defining-global-service-information}{{251}{745}{Defining Global Service Information}{chapter.251}{}}
\@writefile{toc}{\contentsline {section}{\numberline {251.1}Dependency Injector}{745}{section.251.1}\protected@file@percent }
\newlabel{dependency-injector}{{251.1}{745}{Dependency Injector}{section.251.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {251.2}Package Path}{746}{section.251.2}\protected@file@percent }
\newlabel{package-path}{{251.2}{746}{Package Path}{section.251.2}{}}
\@writefile{toc}{\contentsline {section}{\numberline {251.3}Multiversion concurrency control (MVCC)}{746}{section.251.3}\protected@file@percent }
\newlabel{multiversion-concurrency-control-mvcc}{{251.3}{746}{Multiversion concurrency control (MVCC)}{section.251.3}{}}
\@writefile{toc}{\contentsline {section}{\numberline {251.4}Namespace Options}{747}{section.251.4}\protected@file@percent }
\newlabel{namespace-options}{{251.4}{747}{Namespace Options}{section.251.4}{}}
\@writefile{toc}{\contentsline {section}{\numberline {251.5}Author}{747}{section.251.5}\protected@file@percent }
\newlabel{author}{{251.5}{747}{Author}{section.251.5}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {252}Defining Service Entities}{749}{chapter.252}\protected@file@percent }
\newlabel{defining-service-entities}{{252}{749}{Defining Service Entities}{chapter.252}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {253}Defining the Columns (Attributes) for Each Service Entity}{751}{chapter.253}\protected@file@percent }
\newlabel{defining-the-columns-attributes-for-each-service-entity}{{253}{751}{Defining the Columns (Attributes) for Each Service Entity}{chapter.253}{}}
\@writefile{toc}{\contentsline {section}{\numberline {253.1}Create Entity Columns}{751}{section.253.1}\protected@file@percent }
\newlabel{create-entity-columns}{{253.1}{751}{Create Entity Columns}{section.253.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {253.2}Support Multi-tenancy}{752}{section.253.2}\protected@file@percent }
\newlabel{support-multi-tenancy}{{253.2}{752}{Support Multi-tenancy}{section.253.2}{}}
\@writefile{toc}{\contentsline {section}{\numberline {253.3}Workflow Fields}{752}{section.253.3}\protected@file@percent }
\newlabel{workflow-fields}{{253.3}{752}{Workflow Fields}{section.253.3}{}}
\@writefile{toc}{\contentsline {section}{\numberline {253.4}Audit Entities}{752}{section.253.4}\protected@file@percent }
\newlabel{audit-entities}{{253.4}{752}{Audit Entities}{section.253.4}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {254}Defining Relationships Between Service Entities}{753}{chapter.254}\protected@file@percent }
\newlabel{defining-relationships-between-service-entities}{{254}{753}{Defining Relationships Between Service Entities}{chapter.254}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {254.1}{\ignorespaces Relating entities is a snap in Liferay Dev Studio DXP's \emph  {Diagram} mode for \texttt  {service.xml}.}}{754}{figure.254.1}\protected@file@percent }
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {255}Defining Ordering of Service Entity Instances}{755}{chapter.255}\protected@file@percent }
\newlabel{defining-ordering-of-service-entity-instances}{{255}{755}{Defining Ordering of Service Entity Instances}{chapter.255}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {256}Defining Service Entity Finder Methods}{757}{chapter.256}\protected@file@percent }
\newlabel{defining-service-entity-finder-methods}{{256}{757}{Defining Service Entity Finder Methods}{chapter.256}{}}
\@writefile{toc}{\contentsline {section}{\numberline {256.1}Creating Finders}{757}{section.256.1}\protected@file@percent }
\newlabel{creating-finders}{{256.1}{757}{Creating Finders}{section.256.1}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {257}Running Service Builder}{759}{chapter.257}\protected@file@percent }
\newlabel{running-service-builder}{{257}{759}{Running Service Builder}{chapter.257}{}}
\@writefile{toc}{\contentsline {section}{\numberline {257.1}Gradle}{759}{section.257.1}\protected@file@percent }
\newlabel{gradle}{{257.1}{759}{Gradle}{section.257.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {257.2}Maven}{759}{section.257.2}\protected@file@percent }
\newlabel{maven}{{257.2}{759}{Maven}{section.257.2}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {258}Understanding the Code Generated by Service Builder}{761}{chapter.258}\protected@file@percent }
\newlabel{understanding-the-code-generated-by-service-builder}{{258}{761}{Understanding the Code Generated by Service Builder}{chapter.258}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {258.1}{\ignorespaces Service Builder generates these persistence classes and interfaces for an example entity called \emph  {Event}. You shouldn't (and you won't need to) customize any of these classes or interfaces.}}{762}{figure.258.1}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {258.2}{\ignorespaces Service Builder generates these service classes and interfaces. Only the {[}ENTITY\_NAME{]}LocalServiceImpl (e.g., EventLocalServiceImpl for the Event entity) allows custom methods to be added to the service layer.}}{763}{figure.258.2}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {258.3}{\ignorespaces Service Builder generates these model classes and interfaces. Only \texttt  {{[}ENTITY\_NAME{]}Impl} (e.g., \texttt  {EventImpl} for the Event entity) allows custom methods to be added to the service layer.}}{765}{figure.258.3}\protected@file@percent }
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {259}Iterative Development}{767}{chapter.259}\protected@file@percent }
\newlabel{iterative-development}{{259}{767}{Iterative Development}{chapter.259}{}}
\@writefile{toc}{\contentsline {section}{\numberline {259.1}Related Topics}{767}{section.259.1}\protected@file@percent }
\newlabel{related-topics-13}{{259.1}{767}{Related Topics}{section.259.1}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {260}Customizing Model Entities With Model Hints}{769}{chapter.260}\protected@file@percent }
\newlabel{customizing-model-entities-with-model-hints}{{260}{769}{Customizing Model Entities With Model Hints}{chapter.260}{}}
\@writefile{toc}{\contentsline {section}{\numberline {260.1}Model Hint Types}{771}{section.260.1}\protected@file@percent }
\newlabel{model-hint-types}{{260.1}{771}{Model Hint Types}{section.260.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {260.2}Default Hints}{771}{section.260.2}\protected@file@percent }
\newlabel{default-hints}{{260.2}{771}{Default Hints}{section.260.2}{}}
\@writefile{toc}{\contentsline {section}{\numberline {260.3}Hint Collections}{772}{section.260.3}\protected@file@percent }
\newlabel{hint-collections}{{260.3}{772}{Hint Collections}{section.260.3}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {261}Configuring service.properties}{775}{chapter.261}\protected@file@percent }
\newlabel{configuring-service.properties}{{261}{775}{Configuring service.properties}{chapter.261}{}}
\@writefile{toc}{\contentsline {section}{\numberline {261.1}Related Topics}{775}{section.261.1}\protected@file@percent }
\newlabel{related-topics-14}{{261.1}{775}{Related Topics}{section.261.1}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {262}Connecting Service Builder to an External Database}{777}{chapter.262}\protected@file@percent }
\newlabel{connecting-service-builder-to-an-external-database}{{262}{777}{Connecting Service Builder to an External Database}{chapter.262}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {263}Connecting the Data Source Using a DataSourceProvider}{779}{chapter.263}\protected@file@percent }
\newlabel{connecting-the-data-source-using-a-datasourceprovider}{{263}{779}{Connecting the Data Source Using a DataSourceProvider}{chapter.263}{}}
\@writefile{toc}{\contentsline {section}{\numberline {263.1}Related Topics}{781}{section.263.1}\protected@file@percent }
\newlabel{related-topics-15}{{263.1}{781}{Related Topics}{section.263.1}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {264}Connecting the Data Source Using Spring Beans}{783}{chapter.264}\protected@file@percent }
\newlabel{connecting-the-data-source-using-spring-beans}{{264}{783}{Connecting the Data Source Using Spring Beans}{chapter.264}{}}
\@writefile{toc}{\contentsline {section}{\numberline {264.1}Specify Your Database and a Data Source Name in Your \texttt  {service.xml}}{784}{section.264.1}\protected@file@percent }
\newlabel{specify-your-database-and-a-data-source-name-in-your-service.xml}{{264.1}{784}{\texorpdfstring {Specify Your Database and a Data Source Name in Your \texttt {service.xml}}{Specify Your Database and a Data Source Name in Your service.xml}}{section.264.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {264.2}Create the Database Manually}{784}{section.264.2}\protected@file@percent }
\newlabel{create-the-database-manually}{{264.2}{784}{Create the Database Manually}{section.264.2}{}}
\@writefile{toc}{\contentsline {section}{\numberline {264.3}Define the Data Source}{784}{section.264.3}\protected@file@percent }
\newlabel{define-the-data-source}{{264.3}{784}{Define the Data Source}{section.264.3}{}}
\@writefile{toc}{\contentsline {section}{\numberline {264.4}Connect Your Service Builder Module to the Data Source Via a Spring Bean}{784}{section.264.4}\protected@file@percent }
\newlabel{connect-your-service-builder-module-to-the-data-source-via-a-spring-bean}{{264.4}{784}{Connect Your Service Builder Module to the Data Source Via a Spring Bean}{section.264.4}{}}
\@writefile{toc}{\contentsline {section}{\numberline {264.5}Run Service Builder}{786}{section.264.5}\protected@file@percent }
\newlabel{run-service-builder}{{264.5}{786}{Run Service Builder}{section.264.5}{}}
\@writefile{toc}{\contentsline {section}{\numberline {264.6}Related Topics}{786}{section.264.6}\protected@file@percent }
\newlabel{related-topics-16}{{264.6}{786}{Related Topics}{section.264.6}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {265}Migrating a Service Builder Module from Spring DI to OSGi DS}{787}{chapter.265}\protected@file@percent }
\newlabel{migrating-a-service-builder-module-from-spring-di-to-osgi-ds}{{265}{787}{Migrating a Service Builder Module from Spring DI to OSGi DS}{chapter.265}{}}
\@writefile{toc}{\contentsline {section}{\numberline {265.1}Step 1: Prepare Your Project for DS}{787}{section.265.1}\protected@file@percent }
\newlabel{step-1-prepare-your-project-for-ds}{{265.1}{787}{Step 1: Prepare Your Project for DS}{section.265.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {265.2}Step 2: Update Your Spring Bean Classes}{788}{section.265.2}\protected@file@percent }
\newlabel{step-2-update-your-spring-bean-classes}{{265.2}{788}{Step 2: Update Your Spring Bean Classes}{section.265.2}{}}
\@writefile{toc}{\contentsline {section}{\numberline {265.3}Step 3: Resolve Any Circular Dependencies}{789}{section.265.3}\protected@file@percent }
\newlabel{step-3-resolve-any-circular-dependencies}{{265.3}{789}{Step 3: Resolve Any Circular Dependencies}{section.265.3}{}}
\@writefile{toc}{\contentsline {section}{\numberline {265.4}Related Topics}{790}{section.265.4}\protected@file@percent }
\newlabel{related-topics-17}{{265.4}{790}{Related Topics}{section.265.4}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {266}Business Logic with Service Builder}{791}{chapter.266}\protected@file@percent }
\newlabel{business-logic-with-service-builder}{{266}{791}{Business Logic with Service Builder}{chapter.266}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {267}Implementing an Add Method}{793}{chapter.267}\protected@file@percent }
\newlabel{implementing-an-add-method}{{267}{793}{Implementing an Add Method}{chapter.267}{}}
\@writefile{toc}{\contentsline {section}{\numberline {267.1}Step 1: Declare an add method with parameters for creating the entity}{794}{section.267.1}\protected@file@percent }
\newlabel{step-1-declare-an-add-method-with-parameters-for-creating-the-entity}{{267.1}{794}{Step 1: Declare an add method with parameters for creating the entity}{section.267.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {267.2}Step 2: Validate the parameters}{795}{section.267.2}\protected@file@percent }
\newlabel{step-2-validate-the-parameters}{{267.2}{795}{Step 2: Validate the parameters}{section.267.2}{}}
\@writefile{toc}{\contentsline {section}{\numberline {267.3}Step 3: Generate a primary key}{795}{section.267.3}\protected@file@percent }
\newlabel{step-3-generate-a-primary-key}{{267.3}{795}{Step 3: Generate a primary key}{section.267.3}{}}
\@writefile{toc}{\contentsline {section}{\numberline {267.4}Step 4: Create an entity instance}{795}{section.267.4}\protected@file@percent }
\newlabel{step-4-create-an-entity-instance}{{267.4}{795}{Step 4: Create an entity instance}{section.267.4}{}}
\@writefile{toc}{\contentsline {section}{\numberline {267.5}Step 5: Populate the entity attributes}{796}{section.267.5}\protected@file@percent }
\newlabel{step-5-populate-the-entity-attributes}{{267.5}{796}{Step 5: Populate the entity attributes}{section.267.5}{}}
\@writefile{toc}{\contentsline {section}{\numberline {267.6}Step 6: Persist the entity}{796}{section.267.6}\protected@file@percent }
\newlabel{step-6-persist-the-entity}{{267.6}{796}{Step 6: Persist the entity}{section.267.6}{}}
\@writefile{toc}{\contentsline {section}{\numberline {267.7}Step 7: Return the entity}{796}{section.267.7}\protected@file@percent }
\newlabel{step-7-return-the-entity}{{267.7}{796}{Step 7: Return the entity}{section.267.7}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {268}Implementing Update and Delete Methods}{797}{chapter.268}\protected@file@percent }
\newlabel{implementing-update-and-delete-methods}{{268}{797}{Implementing Update and Delete Methods}{chapter.268}{}}
\@writefile{toc}{\contentsline {section}{\numberline {268.1}Implementing an Update Method}{797}{section.268.1}\protected@file@percent }
\newlabel{implementing-an-update-method}{{268.1}{797}{Implementing an Update Method}{section.268.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {268.2}Step 1: Declare an Update Method with Parameters for Updating the Entity}{798}{section.268.2}\protected@file@percent }
\newlabel{step-1-declare-an-update-method-with-parameters-for-updating-the-entity}{{268.2}{798}{Step 1: Declare an Update Method with Parameters for Updating the Entity}{section.268.2}{}}
\@writefile{toc}{\contentsline {section}{\numberline {268.3}Step 2: Validate the Parameters}{798}{section.268.3}\protected@file@percent }
\newlabel{step-2-validate-the-parameters-1}{{268.3}{798}{Step 2: Validate the Parameters}{section.268.3}{}}
\@writefile{toc}{\contentsline {section}{\numberline {268.4}Step 3: Retrieve the Entity Instance}{799}{section.268.4}\protected@file@percent }
\newlabel{step-3-retrieve-the-entity-instance}{{268.4}{799}{Step 3: Retrieve the Entity Instance}{section.268.4}{}}
\@writefile{toc}{\contentsline {section}{\numberline {268.5}Step 4: Update the Entity Attributes}{799}{section.268.5}\protected@file@percent }
\newlabel{step-4-update-the-entity-attributes}{{268.5}{799}{Step 4: Update the Entity Attributes}{section.268.5}{}}
\@writefile{toc}{\contentsline {section}{\numberline {268.6}Step 5: Persist and Return the Updated Entity Instance}{799}{section.268.6}\protected@file@percent }
\newlabel{step-5-persist-and-return-the-updated-entity-instance}{{268.6}{799}{Step 5: Persist and Return the Updated Entity Instance}{section.268.6}{}}
\@writefile{toc}{\contentsline {section}{\numberline {268.7}Step 6: Run Service Builder}{799}{section.268.7}\protected@file@percent }
\newlabel{step-6-run-service-builder}{{268.7}{799}{Step 6: Run Service Builder}{section.268.7}{}}
\@writefile{toc}{\contentsline {section}{\numberline {268.8}Implementing a Delete Method}{799}{section.268.8}\protected@file@percent }
\newlabel{implementing-a-delete-method}{{268.8}{799}{Implementing a Delete Method}{section.268.8}{}}
\@writefile{toc}{\contentsline {section}{\numberline {268.9}Related Topics}{800}{section.268.9}\protected@file@percent }
\newlabel{related-topics-18}{{268.9}{800}{Related Topics}{section.268.9}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {269}Implementing Methods to Get and Count Entities}{801}{chapter.269}\protected@file@percent }
\newlabel{implementing-methods-to-get-and-count-entities}{{269}{801}{Implementing Methods to Get and Count Entities}{chapter.269}{}}
\@writefile{toc}{\contentsline {section}{\numberline {269.1}Getter Methods}{801}{section.269.1}\protected@file@percent }
\newlabel{getter-methods}{{269.1}{801}{Getter Methods}{section.269.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {269.2}Counter Methods}{802}{section.269.2}\protected@file@percent }
\newlabel{counter-methods}{{269.2}{802}{Counter Methods}{section.269.2}{}}
\@writefile{toc}{\contentsline {section}{\numberline {269.3}Service Method Prefixes and Transactional Aspects}{803}{section.269.3}\protected@file@percent }
\newlabel{service-method-prefixes-and-transactional-aspects}{{269.3}{803}{Service Method Prefixes and Transactional Aspects}{section.269.3}{}}
\@writefile{toc}{\contentsline {section}{\numberline {269.4}Related Topics}{804}{section.269.4}\protected@file@percent }
\newlabel{related-topics-19}{{269.4}{804}{Related Topics}{section.269.4}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {270}Implementing Any Other Business Logic}{805}{chapter.270}\protected@file@percent }
\newlabel{implementing-any-other-business-logic}{{270}{805}{Implementing Any Other Business Logic}{chapter.270}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {271}Integrating with Liferay's Frameworks}{807}{chapter.271}\protected@file@percent }
\newlabel{integrating-with-liferays-frameworks}{{271}{807}{Integrating with Liferay's Frameworks}{chapter.271}{}}
\@writefile{toc}{\contentsline {section}{\numberline {271.1}Related Topics}{808}{section.271.1}\protected@file@percent }
\newlabel{related-topics-20}{{271.1}{808}{Related Topics}{section.271.1}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {272}Invoking Local Services}{809}{chapter.272}\protected@file@percent }
\newlabel{invoking-local-services}{{272}{809}{Invoking Local Services}{chapter.272}{}}
\@writefile{toc}{\contentsline {section}{\numberline {272.1}Step 1: Reference the Local Service Component}{809}{section.272.1}\protected@file@percent }
\newlabel{step-1-reference-the-local-service-component}{{272.1}{809}{Step 1: Reference the Local Service Component}{section.272.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {272.2}Step 2: Call the Component's Methods}{810}{section.272.2}\protected@file@percent }
\newlabel{step-2-call-the-components-methods}{{272.2}{810}{Step 2: Call the Component's Methods}{section.272.2}{}}
\@writefile{toc}{\contentsline {section}{\numberline {272.3}Related Topics}{811}{section.272.3}\protected@file@percent }
\newlabel{related-topics-21}{{272.3}{811}{Related Topics}{section.272.3}{}}
\gdef \LT@xiv {\LT@entry 
    {1}{194.50543pt}\LT@entry 
    {1}{275.24957pt}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {273}Invoking Services from Spring Service Builder Code}{813}{chapter.273}\protected@file@percent }
\newlabel{invoking-services-from-spring-service-builder-code}{{273}{813}{Invoking Services from Spring Service Builder Code}{chapter.273}{}}
\@writefile{toc}{\contentsline {section}{\numberline {273.1}Referencing a Spring Bean that is in the Application Context}{814}{section.273.1}\protected@file@percent }
\newlabel{referencing-a-spring-bean-that-is-in-the-application-context}{{273.1}{814}{Referencing a Spring Bean that is in the Application Context}{section.273.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {273.2}Referencing OSGi Services}{814}{section.273.2}\protected@file@percent }
\newlabel{referencing-osgi-services}{{273.2}{814}{Referencing OSGi Services}{section.273.2}{}}
\@writefile{toc}{\contentsline {section}{\numberline {273.3}Related Topics}{815}{section.273.3}\protected@file@percent }
\newlabel{related-topics-22}{{273.3}{815}{Related Topics}{section.273.3}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {274}Advanced Queries}{817}{chapter.274}\protected@file@percent }
\newlabel{advanced-queries}{{274}{817}{Advanced Queries}{chapter.274}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {275}Custom SQL}{819}{chapter.275}\protected@file@percent }
\newlabel{custom-sql}{{275}{819}{Custom SQL}{chapter.275}{}}
\@writefile{toc}{\contentsline {section}{\numberline {275.1}Specify Your Custom SQL}{819}{section.275.1}\protected@file@percent }
\newlabel{specify-your-custom-sql}{{275.1}{819}{Specify Your Custom SQL}{section.275.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {275.2}Related Topics}{820}{section.275.2}\protected@file@percent }
\newlabel{related-topics-23}{{275.2}{820}{Related Topics}{section.275.2}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {276}Defining a Custom Finder Method}{821}{chapter.276}\protected@file@percent }
\newlabel{defining-a-custom-finder-method}{{276}{821}{Defining a Custom Finder Method}{chapter.276}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {277}Dynamic Query}{823}{chapter.277}\protected@file@percent }
\newlabel{dynamic-query}{{277}{823}{Dynamic Query}{chapter.277}{}}
\@writefile{toc}{\contentsline {section}{\numberline {277.1}Example Finder Method: findByGuestbookNameEntryName}{823}{section.277.1}\protected@file@percent }
\newlabel{example-finder-method-findbyguestbooknameentryname}{{277.1}{823}{Example Finder Method: findByGuestbookNameEntryName}{section.277.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {277.2}Using a Hibernate Session}{825}{section.277.2}\protected@file@percent }
\newlabel{using-a-hibernate-session}{{277.2}{825}{Using a Hibernate Session}{section.277.2}{}}
\@writefile{toc}{\contentsline {section}{\numberline {277.3}Creating Dynamic Queries}{826}{section.277.3}\protected@file@percent }
\newlabel{creating-dynamic-queries}{{277.3}{826}{Creating Dynamic Queries}{section.277.3}{}}
\@writefile{toc}{\contentsline {section}{\numberline {277.4}Restriction Criteria}{826}{section.277.4}\protected@file@percent }
\newlabel{restriction-criteria}{{277.4}{826}{Restriction Criteria}{section.277.4}{}}
\@writefile{toc}{\contentsline {section}{\numberline {277.5}Projection Criteria}{827}{section.277.5}\protected@file@percent }
\newlabel{projection-criteria}{{277.5}{827}{Projection Criteria}{section.277.5}{}}
\@writefile{toc}{\contentsline {section}{\numberline {277.6}Order Criteria}{827}{section.277.6}\protected@file@percent }
\newlabel{order-criteria}{{277.6}{827}{Order Criteria}{section.277.6}{}}
\@writefile{toc}{\contentsline {section}{\numberline {277.7}Executing the Dynamic Query}{828}{section.277.7}\protected@file@percent }
\newlabel{executing-the-dynamic-query}{{277.7}{828}{Executing the Dynamic Query}{section.277.7}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {278}Accessing Your Custom Finder Method from the Service Layer}{829}{chapter.278}\protected@file@percent }
\newlabel{accessing-your-custom-finder-method-from-the-service-layer}{{278}{829}{Accessing Your Custom Finder Method from the Service Layer}{chapter.278}{}}
\@writefile{toc}{\contentsline {section}{\numberline {278.1}Related Topics}{830}{section.278.1}\protected@file@percent }
\newlabel{related-topics-24}{{278.1}{830}{Related Topics}{section.278.1}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {279}Actionable Dynamic Queries}{831}{chapter.279}\protected@file@percent }
\newlabel{actionable-dynamic-queries}{{279}{831}{Actionable Dynamic Queries}{chapter.279}{}}
\@writefile{toc}{\contentsline {section}{\numberline {279.1}Related Topics}{833}{section.279.1}\protected@file@percent }
\newlabel{related-topics-25}{{279.1}{833}{Related Topics}{section.279.1}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {280}REST Builder}{835}{chapter.280}\protected@file@percent }
\newlabel{rest-builder}{{280}{835}{REST Builder}{chapter.280}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {281}Generating APIs with REST Builder}{837}{chapter.281}\protected@file@percent }
\newlabel{generating-apis-with-rest-builder}{{281}{837}{Generating APIs with REST Builder}{chapter.281}{}}
\@writefile{toc}{\contentsline {section}{\numberline {281.1}Related Topics}{838}{section.281.1}\protected@file@percent }
\newlabel{related-topics-26}{{281.1}{838}{Related Topics}{section.281.1}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {282}Troubleshooting Application Development Issues}{839}{chapter.282}\protected@file@percent }
\newlabel{troubleshooting-application-development-issues}{{282}{839}{Troubleshooting Application Development Issues}{chapter.282}{}}
\@writefile{toc}{\contentsline {section}{\numberline {282.1}Modules}{839}{section.282.1}\protected@file@percent }
\newlabel{modules}{{282.1}{839}{Modules}{section.282.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {282.2}Services and Components}{840}{section.282.2}\protected@file@percent }
\newlabel{services-and-components}{{282.2}{840}{Services and Components}{section.282.2}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {283}Adjusting Module Logging}{841}{chapter.283}\protected@file@percent }
\newlabel{adjusting-module-logging}{{283}{841}{Adjusting Module Logging}{chapter.283}{}}
\@writefile{toc}{\contentsline {section}{\numberline {283.1}Related Topics}{842}{section.283.1}\protected@file@percent }
\newlabel{related-topics-27}{{283.1}{842}{Related Topics}{section.283.1}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {284}Identifying Liferay Artifact Versions for Dependencies}{843}{chapter.284}\protected@file@percent }
\newlabel{identifying-liferay-artifact-versions-for-dependencies}{{284}{843}{Identifying Liferay Artifact Versions for Dependencies}{chapter.284}{}}
\@writefile{toc}{\contentsline {section}{\numberline {284.1}Related Topics}{843}{section.284.1}\protected@file@percent }
\newlabel{related-topics-28}{{284.1}{843}{Related Topics}{section.284.1}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {285}Resolving Bundle-SymbolicName Syntax Issues}{845}{chapter.285}\protected@file@percent }
\newlabel{resolving-bundle-symbolicname-syntax-issues}{{285}{845}{Resolving Bundle-SymbolicName Syntax Issues}{chapter.285}{}}
\@writefile{toc}{\contentsline {section}{\numberline {285.1}Related Topics}{845}{section.285.1}\protected@file@percent }
\newlabel{related-topics-29}{{285.1}{845}{Related Topics}{section.285.1}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {286}Calling Non-OSGi Code that Uses OSGi Services}{847}{chapter.286}\protected@file@percent }
\newlabel{calling-non-osgi-code-that-uses-osgi-services}{{286}{847}{Calling Non-OSGi Code that Uses OSGi Services}{chapter.286}{}}
\@writefile{toc}{\contentsline {section}{\numberline {286.1}Related Topics}{847}{section.286.1}\protected@file@percent }
\newlabel{related-topics-30}{{286.1}{847}{Related Topics}{section.286.1}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {287}Connecting to JNDI Data Sources}{849}{chapter.287}\protected@file@percent }
\newlabel{connecting-to-jndi-data-sources}{{287}{849}{Connecting to JNDI Data Sources}{chapter.287}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {288}Detecting Unresolved OSGi Components}{851}{chapter.288}\protected@file@percent }
\newlabel{detecting-unresolved-osgi-components}{{288}{851}{Detecting Unresolved OSGi Components}{chapter.288}{}}
\@writefile{toc}{\contentsline {section}{\numberline {288.1}Declarative Services Components}{851}{section.288.1}\protected@file@percent }
\newlabel{declarative-services-components}{{288.1}{851}{Declarative Services Components}{section.288.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {288.2}Declarative Services Unsatisfied Component Scanner}{852}{section.288.2}\protected@file@percent }
\newlabel{declarative-services-unsatisfied-component-scanner}{{288.2}{852}{Declarative Services Unsatisfied Component Scanner}{section.288.2}{}}
\@writefile{toc}{\contentsline {section}{\numberline {288.3}ds:unsatisfied Command}{852}{section.288.3}\protected@file@percent }
\newlabel{dsunsatisfied-command}{{288.3}{852}{ds:unsatisfied Command}{section.288.3}{}}
\@writefile{toc}{\contentsline {section}{\numberline {288.4}Service Builder Components}{853}{section.288.4}\protected@file@percent }
\newlabel{service-builder-components}{{288.4}{853}{Service Builder Components}{section.288.4}{}}
\@writefile{toc}{\contentsline {section}{\numberline {288.5}Unavailable Component Scanner}{853}{section.288.5}\protected@file@percent }
\newlabel{unavailable-component-scanner}{{288.5}{853}{Unavailable Component Scanner}{section.288.5}{}}
\@writefile{toc}{\contentsline {section}{\numberline {288.6}dm na Command}{854}{section.288.6}\protected@file@percent }
\newlabel{dm-na-command}{{288.6}{854}{dm na Command}{section.288.6}{}}
\@writefile{toc}{\contentsline {section}{\numberline {288.7}ServiceProxyFactory}{854}{section.288.7}\protected@file@percent }
\newlabel{serviceproxyfactory}{{288.7}{854}{ServiceProxyFactory}{section.288.7}{}}
\@writefile{toc}{\contentsline {section}{\numberline {288.8}Related Topics}{854}{section.288.8}\protected@file@percent }
\newlabel{related-topics-31}{{288.8}{854}{Related Topics}{section.288.8}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {289}Disabling Cache for Table Mapper Tables}{855}{chapter.289}\protected@file@percent }
\newlabel{disabling-cache-for-table-mapper-tables}{{289}{855}{Disabling Cache for Table Mapper Tables}{chapter.289}{}}
\@writefile{toc}{\contentsline {section}{\numberline {289.1}Why would I want to disable cache on a table mapper?}{855}{section.289.1}\protected@file@percent }
\newlabel{why-would-i-want-to-disable-cache-on-a-table-mapper}{{289.1}{855}{Why would I want to disable cache on a table mapper?}{section.289.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {289.2}Disabling a Table Mapper Cache}{856}{section.289.2}\protected@file@percent }
\newlabel{disabling-a-table-mapper-cache}{{289.2}{856}{Disabling a Table Mapper Cache}{section.289.2}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {290}Implementing Logging}{857}{chapter.290}\protected@file@percent }
\newlabel{implementing-logging}{{290}{857}{Implementing Logging}{chapter.290}{}}
\@writefile{toc}{\contentsline {section}{\numberline {290.1}Related Topics}{858}{section.290.1}\protected@file@percent }
\newlabel{related-topics-32}{{290.1}{858}{Related Topics}{section.290.1}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {291}Declaring Optional Import Package Requirements}{859}{chapter.291}\protected@file@percent }
\newlabel{declaring-optional-import-package-requirements}{{291}{859}{Declaring Optional Import Package Requirements}{chapter.291}{}}
\@writefile{toc}{\contentsline {section}{\numberline {291.1}Related Topics}{860}{section.291.1}\protected@file@percent }
\newlabel{related-topics-33}{{291.1}{860}{Related Topics}{section.291.1}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {292}Resolving Bundle Requirements}{861}{chapter.292}\protected@file@percent }
\newlabel{resolving-bundle-requirements}{{292}{861}{Resolving Bundle Requirements}{chapter.292}{}}
\@writefile{toc}{\contentsline {section}{\numberline {292.1}Related Topics}{862}{section.292.1}\protected@file@percent }
\newlabel{related-topics-34}{{292.1}{862}{Related Topics}{section.292.1}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {293}Resolving ClassNotFoundException and NoClassDefFoundError in OSGi Bundles}{863}{chapter.293}\protected@file@percent }
\newlabel{resolving-classnotfoundexception-and-noclassdeffounderror-in-osgi-bundles}{{293}{863}{Resolving ClassNotFoundException and NoClassDefFoundError in OSGi Bundles}{chapter.293}{}}
\@writefile{toc}{\contentsline {section}{\numberline {293.1}Case 1: The Missing Class Belongs to an OSGi Module}{863}{section.293.1}\protected@file@percent }
\newlabel{case-1-the-missing-class-belongs-to-an-osgi-module}{{293.1}{863}{Case 1: The Missing Class Belongs to an OSGi Module}{section.293.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {293.2}Case 2: The Missing Class Doesn't Belong to an OSGi Module}{864}{section.293.2}\protected@file@percent }
\newlabel{case-2-the-missing-class-doesnt-belong-to-an-osgi-module}{{293.2}{864}{Case 2: The Missing Class Doesn't Belong to an OSGi Module}{section.293.2}{}}
\@writefile{toc}{\contentsline {section}{\numberline {293.3}Case 3: The Missing Class Belongs to a Global Library}{864}{section.293.3}\protected@file@percent }
\newlabel{case-3-the-missing-class-belongs-to-a-global-library}{{293.3}{864}{Case 3: The Missing Class Belongs to a Global Library}{section.293.3}{}}
\@writefile{toc}{\contentsline {section}{\numberline {293.4}Case 4: The Missing Class Belongs to a Java Runtime Package}{865}{section.293.4}\protected@file@percent }
\newlabel{case-4-the-missing-class-belongs-to-a-java-runtime-package}{{293.4}{865}{Case 4: The Missing Class Belongs to a Java Runtime Package}{section.293.4}{}}
\@writefile{toc}{\contentsline {section}{\numberline {293.5}Related Topics}{865}{section.293.5}\protected@file@percent }
\newlabel{related-topics-35}{{293.5}{865}{Related Topics}{section.293.5}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {294}System Check}{867}{chapter.294}\protected@file@percent }
\newlabel{system-check}{{294}{867}{System Check}{chapter.294}{}}
\@writefile{toc}{\contentsline {section}{\numberline {294.1}Related Topics}{867}{section.294.1}\protected@file@percent }
\newlabel{related-topics-36}{{294.1}{867}{Related Topics}{section.294.1}{}}
\@writefile{lof}{\addvspace {10pt}}
\@writefile{lot}{\addvspace {10pt}}
\@writefile{toc}{\contentsline {chapter}{\chapternumberline {295}Troubleshooting Front-End Development Issues}{869}{chapter.295}\protected@file@percent }
\newlabel{troubleshooting-front-end-development-issues}{{295}{869}{Troubleshooting Front-End Development Issues}{chapter.295}{}}
\@writefile{toc}{\contentsline {section}{\numberline {295.1}CSS}{869}{section.295.1}\protected@file@percent }
\newlabel{css}{{295.1}{869}{CSS}{section.295.1}{}}
\newlabel{broken-css-angular-app}{{295.1}{869}{CSS}{section*.7}{}}
\newlabel{portal-css-broken-ie}{{295.1}{869}{CSS}{section*.8}{}}
\@writefile{toc}{\contentsline {section}{\numberline {295.2}Modules}{869}{section.295.2}\protected@file@percent }
\newlabel{modules-1}{{295.2}{869}{Modules}{section.295.2}{}}
\newlabel{jquery-anonymous-module-error}{{295.2}{869}{Modules}{section*.9}{}}
\newlabel{source-maps-not-showing}{{295.2}{870}{Modules}{section*.10}{}}
\newlabel{disable-bundler-analytics}{{295.2}{870}{Modules}{section*.11}{}}
\@writefile{toc}{\contentsline {section}{\numberline {295.3}Portlets}{870}{section.295.3}\protected@file@percent }
\newlabel{portlets}{{295.3}{870}{Portlets}{section.295.3}{}}
\newlabel{angular-react-vue-portlet-disable-spa}{{295.3}{870}{Portlets}{section*.12}{}}
\@setckpt{developer/appdev}{
\setcounter{page}{871}
\setcounter{equation}{0}
\setcounter{enumi}{3}
\setcounter{enumii}{1}
\setcounter{enumiii}{3}
\setcounter{enumiv}{0}
\setcounter{footnote}{0}
\setcounter{mpfootnote}{0}
\setcounter{@memmarkcntra}{0}
\setcounter{storedpagenumber}{1}
\setcounter{book}{0}
\setcounter{part}{3}
\setcounter{chapter}{295}
\setcounter{section}{3}
\setcounter{subsection}{0}
\setcounter{subsubsection}{0}
\setcounter{paragraph}{0}
\setcounter{subparagraph}{0}
\setcounter{@ppsavesec}{0}
\setcounter{@ppsaveapp}{0}
\setcounter{vslineno}{0}
\setcounter{poemline}{0}
\setcounter{modulo@vs}{0}
\setcounter{memfvsline}{0}
\setcounter{verse}{0}
\setcounter{chrsinstr}{0}
\setcounter{poem}{0}
\setcounter{newflo@tctr}{4}
\setcounter{@contsubnum}{0}
\setcounter{section@level}{0}
\setcounter{maxsecnumdepth}{1}
\setcounter{sidefootnote}{0}
\setcounter{pagenote}{0}
\setcounter{pagenoteshadow}{0}
\setcounter{memfbvline}{0}
\setcounter{bvlinectr}{0}
\setcounter{cp@cntr}{0}
\setcounter{ism@mctr}{0}
\setcounter{xsm@mctr}{0}
\setcounter{csm@mctr}{0}
\setcounter{ksm@mctr}{0}
\setcounter{xksm@mctr}{0}
\setcounter{cksm@mctr}{0}
\setcounter{msm@mctr}{0}
\setcounter{xmsm@mctr}{0}
\setcounter{cmsm@mctr}{0}
\setcounter{bsm@mctr}{0}
\setcounter{workm@mctr}{0}
\setcounter{sheetsequence}{943}
\setcounter{lastsheet}{2851}
\setcounter{lastpage}{2779}
\setcounter{figure}{0}
\setcounter{lofdepth}{1}
\setcounter{table}{0}
\setcounter{lotdepth}{1}
\setcounter{Item}{1096}
\setcounter{Hfootnote}{5}
\setcounter{bookmark@seq@number}{0}
\setcounter{memhycontfloat}{0}
\setcounter{Hpagenote}{0}
\setcounter{r@tfl@t}{0}
\setcounter{float@type}{4}
\setcounter{LT@tables}{14}
\setcounter{LT@chunks}{3}
\setcounter{parentequation}{0}
\setcounter{FancyVerbLine}{0}
}


================================================
FILE: book/developer/appdev.tex
================================================
\chapter{Application Development}\label{application-development}

Writing applications on Liferay's standards-based platform makes your
life easier. Whether you create headless services for clients to access,
full-blown web applications with beautiful UIs, or anything in between,
Liferay DXP streamlines the process to help you get your job done
faster.

Liferay's framework embraces your existing tools and build environments
like \href{https://maven.apache.org}{Maven} and
\href{https://gradle.org}{Gradle}. You can work with the standard
technologies you know and leverage Liferay's APIs for Documents,
Permissions, Search, or Content when you need them. Here's a high level
view of what you can do:

\begin{itemize}
\item
  \textbf{Deployment of existing standards-based apps:} If you have an
  existing app built outside of Liferay DXP, you can deploy it on
  Liferay DXP. The Liferay Bundler Generator and Liferay npm Bundler
  provide the project scaffolding and packaging to deploy
  \href{https://angular.io/}{Angular},
  \href{https://reactjs.org/}{React}, and \href{https://vuejs.org/}{Vue}
  web front-ends as Widgets. Spring Portlet MVC app conversion to
  \href{https://github.com/liferay/portletmvc4spring}{PortletMVC4Spring}
  requires only a few steps. JSF applications work almost as-is. Portlet
  3.0 or 2.0 compliant portlets deploy on Liferay DXP.
\item
  \textbf{Back-end Java services, web services, and REST services:}
  Service Builder is an object-relational mapper where you describe your
  data model in a single \texttt{xml} file. From this, you can generate
  the tables, a Java API for accessing your data model, and web
  services. On top of these, REST Builder generates OpenAPI-based REST
  services your client applications can call.
\item
  \textbf{Authentication and single-sign on (SSO):} OAuth 2.0, OpenID
  Connect, and SAML are built-in and ready to go.
\item
  \textbf{Front-end web development using Java EE and/or JavaScript:}
  Use Java EE standard Portlet technology (JSR 168, JSR 286, JSR 362)
  with CDI and/or JSF. Prefer Spring?
  \href{https://github.com/liferay/portletmvc4spring}{PortletMVC4Spring}
  brings the Spring MVC Framework to Liferay. Rather have a client-side
  app? Write it in \href{https://angular.io/}{Angular},
  \href{https://reactjs.org/}{React}, or \href{https://vuejs.org/}{Vue}.
  Been using Liferay DXP for a while? Liferay MVC Portlet is better than
  ever.
\item
  \textbf{Frameworks and APIs for every need:} Be more productive by
  using Liferay's built-in and well-tested APIs that cover often-used
  features like file management(upload/download), permissions, comments,
  out-of-process messaging, or UI elements such as data tables and item
  selectors. Liferay DXP offers many APIs for every need, from an entire
  workflow framework to a streamlined way of getting request parameters.
\item
  \textbf{Tool freedom:} Liferay provides Maven archetypes,
  \href{/docs/7-2/reference/-/knowledge_base/r/liferay-workspace}{Liferay
  Workspace},
  \href{/docs/7-2/reference/-/knowledge_base/r/gradle-plugins}{Gradle}
  and \href{/docs/7-2/reference/-/knowledge_base/r/maven-plugins}{Maven}
  plugins, a \href{http://yeoman.io/}{Yeoman}-based
  \href{/docs/7-2/reference/-/knowledge_base/r/theme-generator}{theme
  generator}, and
  \href{/docs/7-2/reference/-/knowledge_base/r/blade-cli}{Blade CLI} to
  integrate with any development workflow. On top of that, you can use
  our \href{/docs/7-2/reference/-/knowledge_base/r/intellij}{IntelliJ
  plugin} or the Eclipse-based
  \href{/docs/7-2/reference/-/knowledge_base/r/liferay-dev-studio}{Liferay
  Developer Studio} if you need a full-blown development environment.
\item
  \textbf{Developer community:} The \href{https://liferay.dev}{Liferay
  DXP community} is helpful and active.
\end{itemize}

\section{Getting Started with Liferay
Development}\label{getting-started-with-liferay-development}

Want to see what it's like to develop an app on Liferay DXP? Here's a
quick tour.

\section{Create Your Object Model and Database in One
Shot}\label{create-your-object-model-and-database-in-one-shot}

You don't need a database to work with Liferay, but if your app uses
one, you can design it and your object model at the same time with
Liferay's object-relational mapper,
\href{/docs/7-2/appdev/-/knowledge_base/a/service-builder}{Service
Builder}. You define your object model in a single \texttt{xml} file:

\begin{verbatim}
<?xml version="1.0"?>
<!DOCTYPE service-builder PUBLIC "-//Liferay//DTD Service Builder 7.2.0//EN" "http://www.liferay.com/dtd/liferay-service-builder_7_0_0.dtd">
<service-builder auto-namespace-tables="true" package-path="com.liferay.docs.guestbook">
    <author>liferay</author>
    <namespace>GB</namespace>
    <entity name="Guestbook" local-service="true" remote-service="true" uuid="true">

        <column name="guestbookId" primary="true" type="long" />
        <column name="name" type="String" />

        <finder name="Name" return-type="Collection"/>
            <finder-column name="name" />
        </finder>

    </entity>

    <entity name="Entry" local-service="true" remote-service="true" uuid="true">
    
        <column name="entryId" primary="true" type="long" />
        <column name="name" type="String" />
        <column name="email" type="String" />
        <column name="message" type="String" />
        <column name="guestbookId" type="long" />

        <finder name="Email" return-type="Collection" />
            <finder-column name="email" />
        </finder>

    </entity>

</service-builder>
\end{verbatim}

Service Builder generates your object model, database, SOAP, and JSON
web services automatically. Java classes are ready for you to implement
your business logic around generated CRUD operations. The web services
are mapped to your business logic. If you want a REST interface, you can
create one.

\section{Create a REST Interface}\label{create-a-rest-interface}

\href{/docs/7-2/appdev/-/knowledge_base/a/rest-builder}{REST Builder}
helps you define REST interfaces for your APIs, using
\href{https://swagger.io/docs/specification/about/}{OpenAPI/Swagger}.
Create your
\href{https://swagger.io/docs/specification/basic-structure/}{YAML
definition} file for your REST interface along with a configuration file
defining where Java classes, a client, and tests should be generated,
and you have REST endpoints ready to call your API.

Next, you need a client. You can use Liferay DXP in headless mode and
write your web and mobile clients any way you want. Or you can create
your web clients on Liferay's platform and take advantage of its many
tools and APIs that speed up development.

\section{Create a Web Client}\label{create-a-web-client}

Liferay DXP is an ideal platform upon which to build a web client. Its
Java EE-based technology means you can pick from the best it has to
offer: Spring MVC using
\href{https://github.com/liferay/portletmvc4spring}{PortletMVC4Spring},
the new backwards-compatible Portlet 3, JSF using
\href{https://liferayfaces.org}{Liferay Faces}, or the venerable
OSGi-based
\href{/docs/7-2/appdev/-/knowledge_base/a/liferay-mvc-portlet}{Liferay
MVC Portlet}. If you're a front-end developer, deploy your Angular,
React, or Vue-based front-end applications to run as widgets next to the
rest of Liferay DXP's installed applications.

\section{Use Liferay's Frameworks}\label{use-liferays-frameworks}

Your apps need features. Liferay has implemented tons of common
functionality you can use in your applications. The
\href{https://docs.liferay.com/dxp/portal/7.2-latest/taglibs/util-taglib/liferay-ui/tld-summary.html}{Liferay-UI}
tag library has tons of web components like Search Container (a sortable
data table), panels, buttons, and more. Liferay's
\href{/docs/7-2/frameworks/-/knowledge_base/f/asset-framework}{Asset
Framework} can publish data from your application in context wherever
users need it---as a notification, a related asset, as tagged or
categorized data, or as relevant data based on a
\href{/docs/7-2/user/-/knowledge_base/u/creating-user-segments}{user
segment}. Need to provide file upload/download? Use the
\href{/docs/7-2/frameworks/-/knowledge_base/f/documents-and-media-api}{Documents
API}. Need a robust permissions system? Use
\href{/docs/7-2/frameworks/-/knowledge_base/f/defining-application-permissions}{Liferay
permissions}. Want users to submit comments? Use Liferay's
\href{/docs/7-2/frameworks/-/knowledge_base/f/adding-comments-to-your-app}{comments}.
Need to process data outside the request/response? Use the Message Bus.
Should users select items from a list? Use the
\href{/docs/7-2/frameworks/-/knowledge_base/f/item-selector}{Item
Selector}.

\section{Next Steps}\label{next-steps}

So what's next? \href{/download}{Download} Liferay DXP and
\href{/docs/7-2/reference/-/knowledge_base/r/creating-a-project}{create
your first project}! Have a look at our
\href{/docs/7-2/appdev/-/knowledge_base/a/service-builder}{back-end},
\href{/docs/7-2/appdev/-/knowledge_base/a/rest-builder}{REST Builder},
and \href{/docs/7-2/appdev/-/knowledge_base/a/web-front-ends}{front-end}
docs, examine what Liferay's
\href{/docs/7-2/frameworks/-/knowledge_base/f/frameworks}{frameworks}
have to offer, and then go create the beautiful things that only you can
make.

\chapter{Developing Web Front-Ends}\label{developing-web-front-ends}

Liferay's open development framework removes barriers so developers can
write applications faster. If you already have an application, you can
deploy it on Liferay DXP:

\begin{itemize}
\tightlist
\item
  Java-based standards (CDI, JSF, Portlets, Spring)
\item
  Front-end standards (Angular, React, Vue)
\end{itemize}

If you plan to write a new application and deploy it on Liferay DXP, you
can use the frameworks you know along with the build tools (Gradle,
Maven) you know. Liferay also offers its own development framework
called MVC Portlet that it uses to develop applications. When you want
to integrate with
\href{/docs/7-2/appdev/-/knowledge_base/a/service-builder}{Liferay
services} and frameworks such as permissions, assets, and indexers,
you'll find that these easily and seamlessly blend with your application
to provide a great user experience.

Regardless of your development strategy for applications, you'll find
Liferay DXP to be a flexible platform that supports anything you need to
write.

\section{Using Popular Frameworks}\label{using-popular-frameworks}

Liferay gives you a head start on developing and deploying apps that use
these popular Java and JavaScript-based technologies:

\begin{itemize}
\tightlist
\item
  \href{/docs/7-2/appdev/-/knowledge_base/a/developing-an-angular-application}{Angular
  Widget}
\item
  \href{/docs/7-2/appdev/-/knowledge_base/a/developing-a-react-application}{React
  Widget}
\item
  \href{/docs/7-2/appdev/-/knowledge_base/a/developing-a-vue-application}{Vue
  Widget}
\item
  \href{/docs/7-2/appdev/-/knowledge_base/a/liferay-mvc-portlet}{Liferay
  MVC Portlet}
\item
  \href{/docs/7-2/appdev/-/knowledge_base/a/portletmvc4spring}{PortletMVC4Spring
  Portlet}
\item
  \href{/docs/7-2/appdev/-/knowledge_base/a/jsf-portlet}{JSF Portlet}
\end{itemize}

\noindent\hrulefill

\textbf{Note:} The Reference section describes
\href{/docs/7-2/reference/-/knowledge_base/r/sample-projects}{sample
projects} and
\href{/docs/7-2/reference/-/knowledge_base/r/project-templates}{project
templates} for creating UIs using other technologies.

\noindent\hrulefill

Angular, React, and Vue applications are written the same as you would
outside of Liferay DXP---using \href{https://www.npmjs.com/}{npm} and
the webpack dev server. The Liferay JS Generator creates a portlet
bundle (project) for developing and deploying each type of app. The
bundle project comes with npm commands for building, testing, and
deploying the app. It packages the app's dependencies (including
JavaScript packages), deploys the bundle as a JAR, and installs the
bundle to Liferay DXP's run time environment, making your app available
as a widget.

You can also develop web front-ends using Java EE standards. Liferay DXP
supports the \href{https://jcp.org/en/jsr/detail?id=362}{JSR 362}
Portlet 3.0 standard which is backwards-compatible with the
\href{http://jcp.org/en/jsr/detail?id=286}{JSR 286} Portlet 2.0 standard
from the Java Community Process (JCP). Each portlet framework has
benefits you may wish to consider.

Bean Portlet is the only framework containing all of the Portlet 3
features:

\begin{itemize}
\tightlist
\item
  Contexts and Dependency Injection (CDI)
\item
  Extended method annotations
\item
  Explicit render state
\item
  Action, render, and resource parameters
\item
  Asynchronous support
\end{itemize}

If you're a JavaServer Faces (JSF) developer, the
\href{/docs/7-1/reference/-/knowledge_base/r/understanding-liferay-faces-bridge}{Liferay
Faces Bridge} supports deploying JSF web apps as portlets without
writing portlet-specific Java code. It also contains innovative features
that make it possible to leverage the power of JSF 2.x inside a portlet
application.

If Spring is your thing, Spring Portlet MVC portlets are easy to
configure and deploy on Liferay DXP. You can continue using Spring
features, including Spring beans and Spring dependency injection.

Last but not least, Liferay MVC Portlet continues to be a favorite with
experienced Liferay developers, and makes portlet development easy for
Liferay newcomers. It leverages OSGi Declarative Services (DS) for
injecting dependencies and defining configurable extension points. Since
Liferay DXP core and Liferay-written apps use DS, gaining experience
with DS helps you develop Liferay DXP extensions and customizations.
Liferay MVC Portlet works seamlessly with many Liferay frameworks, such
as MVC commands, Service Builder, and more.

No matter which development framework you choose, you'll be able to get
an app up and running fast.

\section{Getting Started}\label{getting-started}

If you have an existing app that uses one the frameworks described
above, your first step is to deploy it to Liferay DXP. Most deployments
involve configuration steps that you can complete in an hour or less.

You can also build apps from scratch using the tools you like or
leveraging Liferay's tool offering. Liferay provides templates for
creating all kinds of apps and samples that you can examine and modify
to fit your needs.

Once your app is functional, you can improve your app by integrating it
with Liferay frameworks:

\begin{itemize}
\tightlist
\item
  Localization
\item
  Permissions
\item
  Search and indexing
\item
  Asset publishing
\item
  Workflow
\item
  Staging
\item
  Data export and import
\end{itemize}

Liferay provides frameworks that integrate these features fast. As you
develop apps on Liferay DXP, you'll enjoy using what you know, discover
frameworks and tools that boost your productivity, and have fun creating
rich, full-featured applications.

If you're experienced with developing one of the listed app types, feel
free to jump ahead to it. Otherwise, Angular Widgets is next.

\chapter{Developing an Angular
Application}\label{developing-an-angular-application}

Running an existing Angular app on Liferay DXP makes the app available
as a widget for using on site pages. You can
\href{/docs/7-2/reference/-/knowledge_base/r/adapting-existing-apps-to-run-on-product}{adapt
your existing Angular app}, but this doesn't give you access to the
bundler and its various loaders to develop your project further in
Liferay DXP. To have access to all of Liferay DXP's features, you must
use the Liferay JS Generator and Liferay npm Bundler to merge your files
into a portlet bundle, adapt your routes and CSS, and deploy your
bundle.

\begin{figure}
\centering
\includegraphics{./images/appdev-angular-app-migrated.png}
\caption{Apps like this Guestbook app are easy to migrate to Liferay
DXP.}
\end{figure}

Follow these steps:

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\item
  Using \href{https://www.npmjs.com}{npm}, install the Liferay JS
  Generator:

\begin{verbatim}
npm install -g yo generator-liferay-js
\end{verbatim}
\item
  Generate an Angular-based portlet bundle project for deploying your
  app to your \href{/deployment/docs/installing-product}{Liferay DXP
  installation}.

\begin{verbatim}
yo liferay-js
\end{verbatim}

  Select \texttt{Angular\ based\ portlet} and opt for generating sample
  code. Here's the bundle's structure:

  \begin{itemize}
  \tightlist
  \item
    \texttt{{[}my-angular-portlet-bundle{]}}

    \begin{itemize}
    \tightlist
    \item
      \texttt{assets/} → CSS, HTML templates, and resources

      \begin{itemize}
      \tightlist
      \item
        \texttt{css/} → CSS files

        \begin{itemize}
        \tightlist
        \item
          \texttt{styles.css} → Default CSS file
        \end{itemize}
      \item
        \texttt{app/} → HTML templates

        \begin{itemize}
        \tightlist
        \item
          \texttt{app.component.html} → Root component template
        \end{itemize}
      \end{itemize}
    \item
      \texttt{features/} → Liferay DXP bundle features

      \begin{itemize}
      \tightlist
      \item
        \texttt{localization/} → Resource bundles

        \begin{itemize}
        \tightlist
        \item
          \texttt{Language.properties} → Default language keys
        \end{itemize}
      \end{itemize}
    \item
      \texttt{src/} → JavaScript an TypeScript files

      \begin{itemize}
      \tightlist
      \item
        \texttt{app/} → Application modules and Components

        \begin{itemize}
        \tightlist
        \item
          \texttt{app.component.ts} → Main component
        \item
          \texttt{app.module.ts} → Root module
        \item
          \texttt{dynamic.loader.ts} → Loads an Angular component
          dynamically for the portlet to attach to
        \end{itemize}
      \item
        \texttt{types/}

        \begin{itemize}
        \tightlist
        \item
          \texttt{LiferayParams.ts} → Parameters passed by Liferay DXP
          to the JavaScript module
        \end{itemize}
      \item
        \texttt{index.ts} → Main module invoked by the ``bootstrap''
        module to initialize the portlet
      \item
        \texttt{polyfills.ts} → Fills in browser JavaScript
        implementation gaps
      \end{itemize}
    \item
      \texttt{package.json} → npm bundle configuration
    \item
      \texttt{README.md}
    \item
      \texttt{.npmbuildrc} → Build configuration
    \item
      \texttt{.npmbundlerrc} → Bundler configuration
    \item
      \texttt{tsconfig.json} → TypeScript configuration
    \end{itemize}
  \end{itemize}
\item
  Copy your app files, matching the types listed below, into your new
  project.
\end{enumerate}

\noindent\hrulefill

\begin{verbatim}
 File type | Destination | Comments |
 --------- | ----------- | -------- |
 HTML | `assets/app/` | Merge your main component with the existing `app.component.html`. |
 CSS  | `assets/css/` | Overwrite `styles.css`. |
 TypeScript and JavaScript | `src/app/` |  Merge with all files **except** `app.module.ts`---the root module merge is explained in a later step. |
\end{verbatim}

\noindent\hrulefill

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\setcounter{enumi}{3}
\item
  Update your component class \texttt{templateUrl}s to use the
  \texttt{web-context} value declared in your project's
  \texttt{.npmbundlerrc} file. Here's the format:

\begin{verbatim}
templateUrl: `/o/[web-context]/app/[template]`
\end{verbatim}

  Here's an example:

\begin{verbatim}
templateUrl: '/o/my-angular-guestbook/app/add-entry/add-entry.component.html'
\end{verbatim}
\item
  Update your bundle to use portlet-level styling.

  \begin{itemize}
  \item
    Import all component CSS files through the CSS file (default is
    \texttt{styles.css}) your bundle's \texttt{package.json} file sets
    for your portlet. Here's the default setting:

\begin{verbatim}
"portlet": {
    "com.liferay.portlet.header-portlet-css": "/css/styles.css",
...
}
\end{verbatim}
  \item
    Remove \texttt{selector} and \texttt{styleUrls} properties from your
    component classes.
  \end{itemize}
\item
  In your routing module's \texttt{@NgModule} decorator, configure the
  router option \texttt{useHash:\ true}. This tells Angular to use
  client-side routing in the form of \texttt{.../\#/{[}route{]}}, which
  prevents client-side parameters (i.e., anything after \texttt{\#})
  from being sent back to Liferay DXP.

  For example, your routing module class \texttt{@NgModule} decorator
  might look like this:

\begin{verbatim}
@NgModule({
  imports: [RouterModule.forRoot(routes, {useHash: true})],
  exports: [RouterModule]
})
export class AppRoutingModule { }
\end{verbatim}
\item
  Also in your routing module, export your view components for your root
  module (discussed next) to use. For example,

\begin{verbatim}
export const routingComponents = [ViewComponent1, ViewComponent2]
\end{verbatim}
\item
  Merge your root module with \texttt{src/app/app.module.ts},
  configuring it to dynamically load components.
\end{enumerate}

\noindent\hrulefill

\begin{verbatim}
 **Note:** Components must be loaded dynamically to attach to the portlet's
 DOM. The DOM is determined at run time when the portlet's page is
 rendered. 
\end{verbatim}

\noindent\hrulefill

\begin{verbatim}
-   Import the `routingComponents` constant and the app routing module class
    from your app routing module. For example,

    ```javascript
    import { AppRoutingModule, routingComponents } from './app-routing.module';
    ```

-   Specify the base href for the router to use in the navigation URLs. 

    ```javascript
    import { APP_BASE_HREF } from '@angular/common';
    ...
    
    @NgModule({
        ...
        providers: [{provide: APP_BASE_HREF, useValue: '/'}]
    })
    ```

-   Declare the `routingComponents` constant in your `@NgModule` decorator. 

    ```javascript
    @NgModule({
      declarations: [
          routingComponents,
          ...
      ],
      ...
    })
    ```

-   Make sure your `@NgModule` `bootstrap` property has no components. All 
    components are loaded dynamically using the `entryComponents` array
    property. The empty `ngDoBootstrap()` method nullifies the default
    bootstrap implementation. 

    ```javascript
    @NgModule({
      ...
        entryComponents: [AppComponent],
        bootstrap: [],
        ...
    })
    export class AppModule {
        ngDoBootstrap() {}
        ...
    }
    ```

Your root module `app.module.ts` should look like this: 

```javascript
import { APP_BASE_HREF } from '@angular/common';
import { AppRoutingModule, routingComponents } from './app-routing.module';
// more imports ...

@NgModule({
  declarations: [
    AppComponent,
    routingComponents, 
    // more declarations ...
  ],
  imports: [
    AppRoutingModule,
    // more imports ...
  ],
  entryComponents: [AppComponent],
  providers: [{provide: APP_BASE_HREF, useValue: '/'}],
  bootstrap: [],
  // more properties ...
})
export class AppModule {
    ngDoBootstrap() {}

    // ...
}
```
\end{verbatim}

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\setcounter{enumi}{8}
\tightlist
\item
  Merge your app \texttt{package.json} file's \texttt{dependencies} and
  \texttt{devDependencies} into the bundle's \texttt{package.json}.
\end{enumerate}

\noindent\hrulefill

\begin{verbatim}
 **Note:** To work around build errors caused by the `rxjs` dependency, set
 the dependency to version `"6.0.0"`. See
 [LPS-92848](https://issues.liferay.com/browse/LPS-92848)
 for details. 
\end{verbatim}

\noindent\hrulefill

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\setcounter{enumi}{9}
\item
  Finally, deploy your bundle:

\begin{verbatim}
npm run deploy
\end{verbatim}
\end{enumerate}

Congratulations! Your Angular app is deployed and now available as a
widget that you can add to site pages.

The Liferay npm Bundler confirms the deployment:

\begin{verbatim}
Report written to liferay-npm-bundler-report.html
Deployed my-angular-guestbook-1.0.0.jar to c:\git\bundles
\end{verbatim}

The Liferay DXP console confirms your bundle started:

\begin{verbatim}
2019-03-22 20:17:53.181 INFO  [fileinstall-C:/git/bundles/osgi/modules][BundleStartStopLogger:39] STARTED my-angular-guestbook_1.0.0 [1695]
\end{verbatim}

To find your widget, select the \emph{Add} icon
(\includegraphics{./images/icon-add-app.png}), navigate to
\emph{Widgets} and then the category you specified to the Liferay Bundle
Generator (\emph{Sample} is the default category).

\section{Related Topics}\label{related-topics}

\href{/docs/7-2/frameworks/-/knowledge_base/f/web-services}{Web
Services}

\href{/docs/7-2/appdev/-/knowledge_base/a/service-builder}{Service
Builder}

\href{/docs/7-2/frameworks/-/knowledge_base/f/localization}{Localization}

\chapter{Developing a React
Application}\label{developing-a-react-application}

Running an existing React app on Liferay DXP makes the app available as
a widget for using on site pages. You can
\href{/docs/7-2/reference/-/knowledge_base/r/adapting-existing-apps-to-run-on-product}{adapt
your existing React app}, but this doesn't give you access to the
bundler and its various loaders to develop your project further in
Liferay DXP. To have access to all of Liferay DXP's features, you must
use the Liferay JS Generator and Liferay npm Bundler to merge your files
into a portlet bundle, update your static resource paths, and deploy
your bundle.

\begin{figure}
\centering
\includegraphics{./images/appdev-react-app-migrated.png}
\caption{Apps like this Guestbook app are easy to migrate to Liferay
DXP.}
\end{figure}

Follow these steps:

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\item
  Using \href{https://www.npmjs.com/}{npm}, install the Liferay JS
  Generator:

\begin{verbatim}
npm install -g yo generator-liferay-js
\end{verbatim}
\item
  Generate a React based portlet bundle project for deploying your app
  to your \href{/deployment/docs/installing-product}{Liferay DXP
  installation}.

\begin{verbatim}
yo liferay-js
\end{verbatim}

  Select \texttt{React\ based\ portlet} and opt for generating sample
  code. Here's the bundle's structure:

  \begin{itemize}
  \tightlist
  \item
    \texttt{my-react-portlet-bundle}

    \begin{itemize}
    \tightlist
    \item
      \texttt{assets/} → CSS and resources

      \begin{itemize}
      \tightlist
      \item
        \texttt{css/} → CSS files

        \begin{itemize}
        \tightlist
        \item
          \texttt{styles.css} → Default CSS file
        \end{itemize}
      \end{itemize}
    \item
      \texttt{features/} → Liferay DXP bundle features

      \begin{itemize}
      \tightlist
      \item
        \texttt{localization} → Resource bundles

        \begin{itemize}
        \tightlist
        \item
          \texttt{Language.properties} → Default language keys
        \end{itemize}
      \end{itemize}
    \item
      \texttt{src/} → JavaScript and React component files

      \begin{itemize}
      \tightlist
      \item
        \texttt{AppComponent.js} → Sample React component that you can
        remove
      \item
        \texttt{index.js} → Main module used to initialize the portlet
      \end{itemize}
    \item
      \texttt{.babelrc} → Babel configuration
    \item
      \texttt{.npmbuildrc} → Build configuration
    \item
      \texttt{.npmbundlerrc} → Bundler configuration
    \item
      \texttt{package.json} → npm bundle configuration
    \item
      \texttt{README.md}
    \end{itemize}
  \end{itemize}
\item
  Copy your app files, matching the types listed below, into your new
  project.
\end{enumerate}

\noindent\hrulefill

\begin{verbatim}
 File type | Destination | Comments |
 --------- | ----------- | -------- |
 CSS  | `assets/css/` | Overwrite `styles.css`. |
 JavaScript | `src/` |  Merge with all files **except** `index.js`---the main module merge is explained in a later step. |
 Static resources | `assets/` |  Include resources such as image files here |
\end{verbatim}

\noindent\hrulefill

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\setcounter{enumi}{3}
\item
  Update your bundle to use portlet-level styling.

  \begin{itemize}
  \tightlist
  \item
    Import all component CSS files through the CSS file (default is
    \texttt{styles.css}) your bundle's \texttt{package.json} file sets
    for your portlet. Here's the default setting:
  \end{itemize}

\begin{verbatim}
 "portlet": {
     "com.liferay.portlet.header-portlet-css": "/css/styles.css",
     ...
 }
\end{verbatim}

  \begin{itemize}
  \tightlist
  \item
    Remove any CSS imports you have in your JS files
  \end{itemize}
\item
  Update any static resource references to use the \texttt{web-context}
  value declared in your project's \texttt{.npmbundlerrc} file, and
  remove any imports for the resource. For example, if you have an image
  file called \texttt{logo.png} in your \texttt{assets} folder, you
  would use the format below. Note that the \texttt{assets} folder is
  not included in the path.

  Here is the format:

\begin{verbatim}
/o/[web-context]/[resource]
\end{verbatim}

  Here's an example image resource:

\begin{verbatim}
<img alt="React logo" src="/o/react-guestbook-migrated/logo.png">
\end{verbatim}
\item
  Merge your entry module with \texttt{src/index.js}, configuring it to
  dynamically load components.
\end{enumerate}

\noindent\hrulefill

\begin{verbatim}
 **Note:** Components must be loaded dynamically to attach to the portlet's
 DOM. The DOM is determined at run time when the portlet's page is
 rendered. 
\end{verbatim}

\noindent\hrulefill

\begin{verbatim}
-   Use the `HashRouter` for routing between component views, as Liferay DXP 
    requires hash routing for proper portal navigation:

   ```javascript
    import { HashRouter as Router } from 'react-router-dom';
   ```

-   Place your code inside the `main()` function.

-   Render your app inside the `portletElementId` element that is passed in 
    the `main()` function. This is required to render the React app inside
    the portlet.

Your entry module `index.js` should look like this. 

```javascript
import React from 'react';
import ReactDOM from 'react-dom';
//import './index.css';//removed for Portal Migration
import App from './App';
import { HashRouter as Router } from 'react-router-dom';

export default function main({portletNamespace, contextPath, 
portletElementId}) {
      ReactDOM.render((
        <Router>
          <App/>
        </Router>
      ), document.getElementById(portletElementId));
}
```
\end{verbatim}

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\setcounter{enumi}{6}
\item
  Merge your app \texttt{package.json} file's \texttt{dependencies} and
  \texttt{devDependencies} into the bundle's \texttt{package.json}.
\item
  Finally, deploy your bundle:

\begin{verbatim}
npm run deploy
\end{verbatim}
\end{enumerate}

Congratulations! Your React app is deployed and now available as a
widget that you can add to site pages.

The Liferay npm Bundler confirms the deployment:

\begin{verbatim}
Report written to liferay-npm-bundler-report.html
Deployed my-react-guestbook-1.0.0.jar to c:\git\bundles
\end{verbatim}

The Liferay DXP console confirms your bundle started:

\begin{verbatim}
2019-03-22 20:17:53.181 INFO  
[fileinstall-C:/git/bundles/osgi/modules][BundleStartStopLogger:39] 
STARTED my-react-guestbook_1.0.0 [1695]
\end{verbatim}

To Find your widget, click the \emph{Add} icon
(\includegraphics{./images/icon-add-app.png}), navigate to
\emph{Widgets} and then the category you specified to the Liferay Bundle
Generator (\emph{Sample} is the default category).

\section{Related Topics}\label{related-topics-1}

\href{/docs/7-2/frameworks/-/knowledge_base/f/web-services}{Web
Services}

\href{/docs/7-2/appdev/-/knowledge_base/a/service-builder}{Service
Builder}

\href{/docs/7-2/frameworks/-/knowledge_base/f/localization}{Localization}

\chapter{Developing a Vue
Application}\label{developing-a-vue-application}

Running an existing Vue app on Liferay DXP makes the app available as a
widget for using on site pages. You can
\href{/docs/7-2/reference/-/knowledge_base/r/adapting-existing-apps-to-run-on-product}{adapt
your existing Vue app}, but this doesn't give you access to the bundler
and its various loaders to develop your project further in Liferay DXP.
To have access to all of Liferay DXP's features, you must use the
Liferay JS Generator and Liferay npm Bundler to merge your files into a
portlet bundle, update your static resource paths, and deploy your
bundle. The steps below demonstrate how to prepare a Vue app that uses
single file components (\texttt{.vue} files) with multiple views.

\begin{figure}
\centering
\includegraphics{./images/appdev-vue-migrated.png}
\caption{Vue Apps like this Guestbook App are easy to deploy, and they
look great in Liferay DXP.}
\end{figure}

\noindent\hrulefill

\textbf{Note:} if you have a tree of components expressed as
\texttt{.vue} templates, only the root one will be available as a true
AMD module.

\noindent\hrulefill

Follow these steps:

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\item
  Using \href{https://www.npmjs.com/}{npm}, install the Liferay JS
  Generator:

\begin{verbatim}
npm install -g yo generator-liferay-js
\end{verbatim}
\item
  Generate a Vue based portlet bundle project:

\begin{verbatim}
yo liferay-js
\end{verbatim}

  Select \texttt{Vue\ based\ portlet} and opt for generating sample
  code. Here's the bundle's structure:

  \begin{itemize}
  \tightlist
  \item
    \texttt{my-vue-portlet-bundle}

    \begin{itemize}
    \tightlist
    \item
      \texttt{assets/} → CSS and resources

      \begin{itemize}
      \tightlist
      \item
        \texttt{css/} → CSS not included in \texttt{.vue} files.
      \end{itemize}
    \item
      \texttt{features/} → Liferay DXP bundle features

      \begin{itemize}
      \tightlist
      \item
        \texttt{localization/} → Resource bundles

        \begin{itemize}
        \tightlist
        \item
          \texttt{Language.properties} → Default language keys
        \end{itemize}
      \item
        \texttt{settings.json} → Placeholder System Settings
      \end{itemize}
    \item
      \texttt{src/} → JavaScript and Vue files

      \begin{itemize}
      \tightlist
      \item
        \texttt{index.js} → Main module used to initialize the portlet
      \end{itemize}
    \item
      \texttt{.babelrc} → Babel configuration
    \item
      \texttt{.npmbuildrc} → Build configuration
    \item
      \texttt{.npmbundlerrc} → Bundler configuration
    \item
      \texttt{package.json} → npm bundle configuration
    \item
      \texttt{README.md}
    \end{itemize}
  \end{itemize}
\item
  Copy your app files, matching the types listed below, into your new
  project.
\end{enumerate}

\noindent\hrulefill

\begin{verbatim}
 File type | Destination | Comments |
 --------- | ----------- | -------- |
 CSS  | `assets/css/` | Overwrite `styles.css`. |
 Static resources | `assets` |  Include resources such as image files here |
 VUE and JS| `src` | Merge your main component with the existing `index.js`. More info on that below. |
\end{verbatim}

\noindent\hrulefill

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\setcounter{enumi}{3}
\item
  Update your bundle to use portlet-level styling.

  \begin{itemize}
  \item
    If you have internal CSS included with
    \texttt{\textless{}style\textgreater{}} tags in your \texttt{.vue}
    files, import \texttt{.index.css} in \texttt{/assets/styles.css}.
    This is generated by the modified build script further down:

\begin{verbatim}
@import '../index.css';
\end{verbatim}
  \item
    Import all custom CSS files (i.e.~CSS not included in \texttt{.vue}
    files) through the CSS file (default is \texttt{styles.css}) your
    bundle's \texttt{package.json} file sets for your portlet. Here's
    the default setting:

\begin{verbatim}
"portlet": {
    "com.liferay.portlet.header-portlet-css": "/css/styles.css",
...
}
\end{verbatim}
  \end{itemize}
\item
  Update any static resource references to use the \texttt{web-context}
  value declared in your project's \texttt{.npmbundlerrc} file. Here's
  the format:

\begin{verbatim}
/o/[web-context]/[resource]
\end{verbatim}

  Here's an example image resource:

\begin{verbatim}
<img alt="Vue logo" src="/o/vue-guestbook-migrated/logo.png">
\end{verbatim}
\item
  Merge your entry module with \texttt{src/index.js}, following these
  steps to dynamically load components.
\end{enumerate}

\noindent\hrulefill

\begin{verbatim}
 **Note:** Components must be loaded dynamically to attach to the portlet's
 DOM. The DOM is determined at runtime when the portlet's page is
 rendered. 
\end{verbatim}

\noindent\hrulefill

\begin{verbatim}
-   Use Vue's runtime + compiler module 
    (`import Vue from 'vue/dist/vue.common';`) so you don't have to process 
    templates during build time. This is imported by default at the top of 
    the file.

-   Remove the sample content from the `main()` function (i.e. the `node` 
    constant and its use), and replace it with your router code.

-   Make these updates to the `new Vue` instance:

    -   Remove the default data properties (the ones you just removed in the 
        sample content), and set the render element to `portletElementId`. 
        This is required and ensures that your app is rendered inside the 
        portlet.
    -   Add the router.
    -   Add a render function that mounts your component wrapper to the Vue 
        instance and displays it.
        
    Your updated configuration should look like this:

    ```javascript
    new Vue({
      el: `#${portletElementId}`,
      render: h => h(App),
      router
    })
    ```

Your entry module `index.js` should look like this. 

```javascript
import Vue from 'vue/dist/vue.common';
import App from './App.vue'
import VueRouter from 'vue-router'
//Component imports

export default function main({portletNamespace, contextPath, portletElementId}) {

  Vue.config.productionTip = false

  Vue.use(VueRouter)

  const router = new VueRouter({
      routes: [
          {
            ...
          }
      ]
  })
  new Vue({
    el: `#${portletElementId}`,
    render: h => h(App),
    router
  })
}
```
\end{verbatim}

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\setcounter{enumi}{6}
\item
  Merge your app \texttt{package.json} file's \texttt{dependencies} and
  \texttt{devDependencies} into the project's \texttt{package.json}, and
  replace the \texttt{babel-cli} and \texttt{babel-preset-env} dev
  dependencies with the newer \texttt{"@babel/cli":\ "\^{}7.0.0"} and
  \texttt{"@babel/preset-env":\ "\^{}7.4.2"} packages instead. Also
  include the \texttt{"vueify":\ "9.4.1"} dev dependency.
\item
  Update the \texttt{.babelrc} file to use \texttt{@babel/preset-env}
  instead of \texttt{env}:

\begin{verbatim}
"presets": ["@babel/preset-env"]
\end{verbatim}
\item
  If you're using \texttt{.vue} files, replace the build script in the
  \texttt{package.json} with the one below to use
  \texttt{vue-cli-service}. The updated build script uses vue-cli to
  access the main entrypoint for the app (\texttt{index.js} in the
  example below) and combines all the Vue templates and JS files into
  one single file named \texttt{index.common.js} and generates an
  \texttt{index.css} file for any internal CSS included with
  \texttt{\textless{}style\textgreater{}} tags in \texttt{.vue} files:

\begin{verbatim}
"scripts": {
  "build": "babel --source-maps -d build src && vue-cli-service build --dest 
  build/ --formats commonjs --target lib --name index ./src/index.js && npm 
  run copy-assets && liferay-npm-bundler",
  "copy-assets": "lnbs-copy-assets",
  "deploy": "npm run build && lnbs-deploy",
  "start": "lnbs-start"
}
\end{verbatim}
\item
  Update the \texttt{main} entry of the \texttt{package.json} to match
  the new \href{http://www.commonjs.org/}{CommonJS} file name specified
  in the previous step:

\begin{verbatim}
"main": "index.common"
\end{verbatim}
\item
  Finally, deploy your portlet bundle:

\begin{verbatim}
npm run deploy
\end{verbatim}
\end{enumerate}

Congratulations! Your Vue app is deployed and now available as a widget
that you can add to site pages.

The liferay-npm-bundler confirms the deployment:

\begin{verbatim}
Report written to liferay-npm-bundler-report.html
Deployed my-vue-guestbook-1.0.0.jar to c:\git\bundles
\end{verbatim}

The Liferay DXP console confirms your bundle started:

\begin{verbatim}
2019-03-22 20:17:53.181 INFO  
[fileinstall-C:/git/bundles/osgi/modules][BundleStartStopLogger:39] 
STARTED my-vue-guestbook_1.0.0 [1695]
\end{verbatim}

Find your widget by selecting the \emph{Add} icon
(\includegraphics{./images/icon-add-app.png}) and navigating to
\emph{Widgets} and the category you specified to the Liferay Bundle
Generator (\emph{Sample} is the default category).

\section{Related Topics}\label{related-topics-2}

\href{/docs/7-2/frameworks/-/knowledge_base/f/web-services}{Web
Services}

\href{/docs/7-2/appdev/-/knowledge_base/a/service-builder}{Service
Builder}

\href{/docs/7-2/frameworks/-/knowledge_base/f/localization}{Localization}

\chapter{Liferay MVC Portlet}\label{liferay-mvc-portlet}

If you're an experienced developer, this is not the first time you've
heard about Model View Controller. If there are so many implementations
of MVC frameworks in Java, why did Liferay create yet another one? Stay
with us and you'll see that Liferay MVC Portlet provides these benefits:

\begin{itemize}
\tightlist
\item
  It's lightweight, as opposed to many other Java MVC frameworks.
\item
  There are no special configuration files that need to be kept in sync
  with your code.
\item
  It's a simple extension of
  \href{https://docs.liferay.com/portlet-api/3.0/javadocs/javax/portlet/GenericPortlet.html}{\texttt{GenericPortlet}}.
\item
  You avoid writing a bunch of boilerplate code, since Liferay's MVC
  Portlet framework only looks for some pre-defined parameters when the
  \texttt{init()} method is called.
\item
  The controller can be broken down into MVC command classes, each of
  which handles the controller code for a particular
  \href{/docs/7-2/frameworks/-/knowledge_base/f/portlets}{portlet phase}
  (render, action, and resource serving phases).
\item
  An MVC command class can serve multiple portlets.
\item
  Liferay's portlets use it. That means there are plenty of robust
  implementations to reference when you need to design or troubleshoot
  your Liferay applications.
\end{itemize}

The Liferay MVC Portlet framework is light and easy to use. The default
\href{/docs/7-2/reference/-/knowledge_base/r/using-the-mvc-portlet-template}{\texttt{MVCPortlet}
project} template generates a fully configured and working project.

Here, you'll learn how MVCPortlet works by covering these topics:

\begin{itemize}
\tightlist
\item
  \hyperref[mvc-layers-and-modularity]{MVC layers and modularity}
\item
  \hyperref[liferay-mvc-command-classes]{Liferay MVC command classes}
\item
  \hyperref[liferay-mvc-portlet-component]{Liferay MVC portlet
  component}
\item
  \hyperref[a-simpler-mvc-portlet]{Simple MVC portlets}
\end{itemize}

Review how each layer of the Liferay MVC portlet framework helps you
separate the concerns of your application.

\section{MVC Layers and Modularity}\label{mvc-layers-and-modularity}

In MVC, there are three layers, and you can probably guess what they
are.

\textbf{Model:} The model layer holds the application data and logic for
manipulating it.

\textbf{View:} The view layer contains logic for displaying data.

\textbf{Controller:} The middle man in the MVC pattern, the Controller
contains logic for passing the data back and forth between the view and
the model layers.

Liferay DXP's applications are divided into multiple discrete modules.
With \href{/docs/7-2/appdev/-/knowledge_base/a/service-builder}{Service
Builder}, the model layer is generated into a \texttt{service} and an
\texttt{api} module. That accounts for the model in the MVC pattern. The
view and the controller layers share a module, the \texttt{web} module.

Generating the skeleton for a
\href{/docs/7-2/reference/-/knowledge_base/r/using-the-service-builder-template}{multi-module
Service Builder-driven MVC application} saves you lots of time and gets
you started on the more important (and interesting, if we're being
honest) development work.

\section{Liferay MVC Command Classes}\label{liferay-mvc-command-classes}

In a larger application, your \texttt{-Portlet} class can become
monstrous and unwieldy if it holds all of the controller logic. Liferay
provides MVC command classes to break up your controller functionality.

\begin{itemize}
\tightlist
\item
  \textbf{\href{https://docs.liferay.com/dxp/portal/7.2-latest/javadocs/portal-kernel/com/liferay/portal/kernel/portlet/bridges/mvc/MVCActionCommand.html}{\texttt{MVCActionCommand}}:}
  Use \texttt{-ActionCommand} classes to hold each of your portlet
  actions, which are invoked by action URLs.
\item
  \textbf{\href{https://docs.liferay.com/dxp/portal/7.2-latest/javadocs/portal-kernel/com/liferay/portal/kernel/portlet/bridges/mvc/MVCRenderCommand.html}{\texttt{MVCRenderCommand}}:}
  Use \texttt{-RenderCommand} classes to hold a \texttt{render} method
  that dispatches to the appropriate JSP, by responding to render URLs.
\item
  \textbf{\href{https://docs.liferay.com/dxp/portal/7.2-latest/javadocs/portal-kernel/com/liferay/portal/kernel/portlet/bridges/mvc/MVCResourceCommand.html}{\texttt{MVCResourceCommand}}:}
  Use \texttt{-ResourceCommand} classes to serve resources based on
  resource URLs.
\end{itemize}

There must be some confusing configuration files to keep everything
wired together and working properly, right? Wrong: it's all easily
managed in the \texttt{-Portlet} class's
\href{https://docs.osgi.org/javadoc/osgi.cmpn/7.0.0/org/osgi/service/component/annotations/Component.html}{\texttt{@Component}}
annotation.

\section{Liferay MVC Portlet
Component}\label{liferay-mvc-portlet-component}

Whether or not you plan to split up the controller into MVC command
classes, the portlet \texttt{@Component} annotation configures the
portlet. Here's a simple portlet component as an example:

\begin{verbatim}
@Component(
    property = {
        "com.liferay.portlet.css-class-wrapper=portlet-hello-world",
        "com.liferay.portlet.display-category=category.sample",
        "com.liferay.portlet.icon=/icons/hello_world.png",
        "com.liferay.portlet.preferences-owned-by-group=true",
        "com.liferay.portlet.private-request-attributes=false",
        "com.liferay.portlet.private-session-attributes=false",
        "com.liferay.portlet.remoteable=true",
        "com.liferay.portlet.render-weight=50",
        "com.liferay.portlet.use-default-template=true",
        "javax.portlet.display-name=Hello World",
        "javax.portlet.expiration-cache=0",
        "javax.portlet.init-param.always-display-default-configuration-icons=true",
        "javax.portlet.name=" + HelloWorldPortletKeys.HELLO_WORLD,
        "javax.portlet.resource-bundle=content.Language",
        "javax.portlet.security-role-ref=guest,power-user,user",
        "javax.portlet.supports.mime-type=text/html"
    },
    service = Portlet.class
)
public class HelloWorldPortlet extends MVCPortlet {
}
\end{verbatim}

The \texttt{javax.portlet.name} property is required. When using MVC
commands, the \texttt{javax.portlet.name} property value links
particular portlet URL/command combinations to the correct portlet.

\noindent\hrulefill

\textbf{Important:} Make your portlet name unique, considering how
\href{/docs/7-2/reference/-/knowledge_base/r/portlet-descriptor-to-osgi-service-property-map\#ten}{Liferay
DXP uses the name to create the portlet's ID}.

\noindent\hrulefill

There can be some confusion over exactly what kind of
\texttt{Portlet.class} implementation you're publishing with a
component. The service registry expects this to be the
\href{https://docs.liferay.com/portlet-api/3.0/javadocs/javax/portlet/Portlet.html}{\texttt{javax.portlet.Portlet}}
interface. Import that, and not, for example,
\texttt{com.liferay.portal.kernel.model.Portlet}.

\noindent\hrulefill

\textbf{Note:} The DTD
\href{https://docs.liferay.com/dxp/portal/7.2-latest/definitions/liferay-portlet-app_7_2_0.dtd.html}{liferay-portlet-app\_7\_2\_0.dtd}
defines all the Liferay-specific attributes you can specify as
properties in your portlet components.

Consider the \texttt{\textless{}css-class-wrapper\textgreater{}} element
from the above link as an example. To specify that property in your
component, use this syntax in your property list:

\texttt{"com.liferay.portlet.css-class-wrapper=portlet-hello-world",}

The properties namespaced with \texttt{javax.portlet.} are elements of
the
\href{https://docs.liferay.com/portlet-api/3.0/portlet-app_3_0.xsd}{\texttt{portlet.xml}
descriptor}.

\noindent\hrulefill

\section{A Simpler MVC Portlet}\label{a-simpler-mvc-portlet}

In simpler applications, you don't use MVC commands. Your portlet render
URLs specify JSP paths in \texttt{mvcPath} parameters.

\begin{verbatim}
<portlet:renderURL var="addEntryURL">
    <portlet:param name="mvcPath" value="/entry/edit_entry.jsp" />
    <portlet:param name="redirect" value="<%= redirect %>" />
</portlet:renderURL>
\end{verbatim}

As you've seen, Liferay's MVC Portlet framework gives you a
well-structured controller layer that takes very little time to
implement. With all your free time, you could

\begin{itemize}
\tightlist
\item
  Learn a new language
\item
  Take pottery classes
\item
  Lift weights
\item
  Work on your application's business logic
\end{itemize}

It's entirely up to you.

To get into the details of creating an MVC Portlet application, continue
with
\href{/docs/7-2/appdev/-/knowledge_base/a/creating-an-mvc-portlet}{Creating
an MVC Portlet}.

\chapter{Creating an MVC Portlet}\label{creating-an-mvc-portlet}

Generating MVC portlet projects is a snap using Liferay's project
templates. Here you'll generate an MVC Portlet project and deploy the
portlet to Liferay DXP.

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\item
  Generate an
  \href{/docs/7-2/reference/-/knowledge_base/r/using-the-mvc-portlet-template}{MVC
  Portlet project} using a Gradle or Maven.

  Here's the resulting folder structure for an MVC Portlet class named
  \texttt{MyMvcPortlet} in a base package
  \texttt{com.liferay.docs.mvcportlet}:

  \begin{itemize}
  \tightlist
  \item
    \texttt{my-mvc-portlet-project} → Arbitrary project name.

    \begin{itemize}
    \tightlist
    \item
      \texttt{gradle}

      \begin{itemize}
      \tightlist
      \item
        \texttt{wrapper}

        \begin{itemize}
        \tightlist
        \item
          \texttt{gradle-wrapper.jar}
        \item
          \texttt{gradle-wrapper.properties}
        \end{itemize}
      \end{itemize}
    \item
      \texttt{src}

      \begin{itemize}
      \tightlist
      \item
        \texttt{main}

        \begin{itemize}
        \tightlist
        \item
          \texttt{java}

          \begin{itemize}
          \tightlist
          \item
            \texttt{com/liferay/docs/mvcportlet}

            \begin{itemize}
            \tightlist
            \item
              \texttt{constants}

              \begin{itemize}
              \tightlist
              \item
                \texttt{MyMvcPortletKeys.java} → Declares portlet
                constants.
              \end{itemize}
            \item
              \texttt{portlet}

              \begin{itemize}
              \tightlist
              \item
                \texttt{MyMvcPortlet.java} → MVC Portlet class.
              \end{itemize}
            \end{itemize}
          \end{itemize}
        \item
          \texttt{resources}

          \begin{itemize}
          \tightlist
          \item
            \texttt{content}

            \begin{itemize}
            \tightlist
            \item
              \texttt{Language.properties} → Resource bundle
            \end{itemize}
          \item
            \texttt{META-INF}

            \begin{itemize}
            \tightlist
            \item
              \texttt{resources}

              \begin{itemize}
              \tightlist
              \item
                \texttt{init.jsp} → Imports classes and taglibs and
                defines commonly used objects from the theme and the
                portlet.
              \item
                \texttt{view.jsp} → Default view template.
              \end{itemize}
            \end{itemize}
          \end{itemize}
        \end{itemize}
      \end{itemize}
    \item
      \texttt{bnd.bnd} → OSGi bundle metadata.
    \item
      \texttt{build.gradle}
    \item
      \texttt{gradlew}
    \end{itemize}
  \end{itemize}

  The Maven-generated project includes a \texttt{pom.xml} file and does
  not include the Gradle-specific files, but otherwise is exactly the
  same.

  Here's the resulting MVC Portlet class:
\end{enumerate}

\begin{verbatim}
package com.liferay.docs.mvcportlet.portlet;

import com.liferay.docs.mvcportlet.constants.MyMvcPortletKeys;
import com.liferay.portal.kernel.portlet.bridges.mvc.MVCPortlet;
import javax.portlet.Portlet;
import org.osgi.service.component.annotations.Component;

@Component(
    immediate = true,
    property = {
        "com.liferay.portlet.display-category=category.sample",
        "com.liferay.portlet.instanceable=true",
        "javax.portlet.display-name=my-mvc-portlet-project Portlet",
        "javax.portlet.init-param.template-path=/",
        "javax.portlet.init-param.view-template=/view.jsp",
        "javax.portlet.name=" + MyMvcPortletKeys.MyMvc,
        "javax.portlet.resource-bundle=content.Language",
        "javax.portlet.security-role-ref=power-user,user"
    },
    service = Portlet.class
)
public class MyMvcPortlet extends MVCPortlet {
}
\end{verbatim}

The class extends
\href{https://docs.liferay.com/dxp/portal/7.2-latest/javadocs/portal-kernel/com/liferay/portal/kernel/portlet/bridges/mvc/MVCPortlet.html}{\texttt{MVCPortlet}}.
The
\href{https://docs.osgi.org/javadoc/osgi.cmpn/7.0.0/org/osgi/service/component/annotations/Component.html}{\texttt{@Component}}
annotation and \texttt{service\ =\ Portlet.class} attribute makes the
class an OSGi Declarative Services component that provides the
\href{https://docs.liferay.com/portlet-api/3.0/javadocs/javax/portlet/Portlet.html}{\texttt{javax.portlet.Portlet}}
service type. The \texttt{immediate\ =\ true} attribute activates the
service immediately on the portlet's deployment.

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\setcounter{enumi}{1}
\item
  Set any portlet configuration or Liferay portlet configuration values
  using \texttt{javax.portlet.*} and \texttt{com.liferay.portlet.*}
  \texttt{@Component} annotation properties
  \href{/docs/7-2/reference/-/knowledge_base/r/portlet-descriptor-to-osgi-service-property-map}{\texttt{javax.portlet.*}
  and \texttt{com.liferay.portlet.*} \texttt{@Component} annotation
  properties} respectively.

  Here are the example component's properties:

  \begin{itemize}
  \item
    \texttt{"com.liferay.portlet.display-category=category.sample"}:
    Sets the Widget's category to ``Sample''.
  \item
    \texttt{"com.liferay.portlet.instanceable=true"}: Activates the
    component immediately when its bundle installs.
  \item
    \texttt{"javax.portlet.display-name=my-mvc-portlet-project\ Portlet"}:
    Sets the portlet's Widget name.
  \item
    \texttt{"javax.portlet.init-param.template-path=/"}: The path under
    \texttt{src/main/resources/META-INF/resources/} where the templates
    reside.
  \item
    \texttt{"javax.portlet.init-param.view-template=/view.jsp"}: Default
    view template.
  \item
    \texttt{"javax.portlet.name="\ +\ MyMvcPortletKeys.MyMvc}: The
    portlet's unique identity.
  \item
    \texttt{"javax.portlet.resource-bundle=content.Language"}: Sets the
    portlet's
    \href{/docs/7-2/frameworks/-/knowledge_base/f/localization}{resource
    bundle} to the \texttt{content/Language*.properties} file(s) in the
    \texttt{src/main/resources/} folder.
  \item
    \texttt{"javax.portlet.security-role-ref=power-user,user"}: Makes
    the Liferay DXP virtual instance's power user and user Roles
    available for defining the portlet's permissions.
  \end{itemize}
\end{enumerate}

\noindent\hrulefill

\begin{verbatim}
 **Note:** To opt-in to Portlet 3.0 features, set the component property
 `"javax.portlet.version=3.0"`.
\end{verbatim}

\noindent\hrulefill

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\setcounter{enumi}{2}
\item
  The portlet renders content via the view template
  \texttt{src/main/resources/META-INF/resources/view.jsp} by default.
\item
  Build your project.

  \emph{Gradle:}

\begin{verbatim}
gradlew jar
\end{verbatim}

  \emph{Maven:}

\begin{verbatim}
mvn clean package
\end{verbatim}
\item
  Deploy the project
  \href{/docs/7-2/reference/-/knowledge_base/r/deploying-a-project}{using
  your build environment} or by building the project JAR and copying it
  to the \texttt{deploy/} folder in your
  \href{/docs/7-2/deploy/-/knowledge_base/d/liferay-home}{Liferay Home}.
\end{enumerate}

The MVC Portlet is now available in the Liferay DXP UI, in the Widget
category you assigned it.

\begin{figure}
\centering
\includegraphics{./images/default-mvc-portlet-on-page.png}
\caption{The example portlet shows a message defined by the language
property \texttt{yourmvc.caption=Hello\ from\ YourMVC!} in the
Language.properties file.}
\end{figure}

Congratulations on creating and deploying an MVC Portlet!

\section{Related Topics}\label{related-topics-3}

\href{/docs/7-2/appdev/-/knowledge_base/a/writing-mvc-portlet-controller-code}{Writing
MVC Portlet Controller Code}

\href{/docs/7-2/appdev/-/knowledge_base/a/configuring-the-view-layer}{Configuring
the View Layer}

\href{/docs/7-2/appdev/-/knowledge_base/a/mvc-action-command}{MVC Action
Command}

\href{/docs/7-2/appdev/-/knowledge_base/a/mvc-render-command}{MVC Render
Command}

\href{/docs/7-2/appdev/-/knowledge_base/a/mvc-resource-command}{MVC
Resource Command}

\chapter{Writing MVC Portlet Controller
Code}\label{writing-mvc-portlet-controller-code}

In MVC, your controller is a traffic director: it provides data to the
right front-end view for display to the user, and it takes data the user
entered in the front-end and passes it to the right back-end service.
For this reason, the controller must process requests from the
front-end, and it must determine the right front-end view to pass data
back to the user.

If you have a small application that's not heavy on controller logic,
you can put all your controller code in the \texttt{-Portlet} class. If
you have more complex needs (lots of actions, complex render logic to
implement, or maybe even some resource serving code), consider breaking
the controller into
\href{/docs/7-2/appdev/-/knowledge_base/a/mvc-render-command}{MVC Render
Command classes},
\href{/docs/7-2/appdev/-/knowledge_base/a/mvc-action-command}{MVC Action
Command classes}, and
\href{/docs/7-2/appdev/-/knowledge_base/a/mvc-resource-command}{MVC
Resource Command classes}. Here you'll implement controller logic for
small applications, where all the controller code is in the
\texttt{-Portlet} class. It involves these things:

\begin{itemize}
\tightlist
\item
  Action methods
\item
  Render logic
\item
  Setting and retrieving request parameters and attributes
\end{itemize}

Start with creating action methods.

\section{Action Methods}\label{action-methods}

Your portlet class can act as your controller by itself and process
requests using action methods. Here's a sample action method:

\begin{verbatim}
public void addGuestbook(ActionRequest request, ActionResponse response)
        throws PortalException, SystemException {

    ServiceContext serviceContext = ServiceContextFactory.getInstance(
        Guestbook.class.getName(), request);

    String name = ParamUtil.getString(request, "name");

    try {
        _guestbookService.addGuestbook(serviceContext.getUserId(),
                name, serviceContext);

        SessionMessages.add(request, "guestbookAdded");

    } catch (Exception e) {
        SessionErrors.add(request, e.getClass().getName());

        response.setRenderParameter("mvcPath",
            "/html/guestbook/edit_guestbook.jsp");
    }

}
\end{verbatim}

This action method has one job: call a service to add a guestbook. If
the call succeeds, the message \texttt{"guestbookAdded"} is associated
with the request and added to the
\href{https://docs.liferay.com/dxp/portal/7.2-latest/javadocs/portal-kernel/com/liferay/portal/kernel/servlet/SessionMessages.html}{\texttt{SessionMessages}
object}. If an exception is thrown, it's caught, and the class name is
associated with the request and added to the
\href{https://docs.liferay.com/dxp/portal/7.2-latest/javadocs/portal-kernel/com/liferay/portal/kernel/servlet/SessionErrors.html}{\texttt{SessionErrors}
object}, and the response is set to render \texttt{edit\_guestbook.jsp}.
Setting the \texttt{mvcPath} render parameter is a Liferay
\texttt{MVCPortlet} framework convention that denotes the next view to
render to the user.

While action methods respond to user actions, render logic determines
the view to display to the user. Render logic is next.

\section{Render Logic}\label{render-logic}

Here's how MVC Portlet determines which view to render. Note the
\texttt{init-param} properties you set in your component:

\begin{verbatim}
"javax.portlet.init-param.template-path=/",
"javax.portlet.init-param.view-template=/view.jsp",
\end{verbatim}

The \texttt{template-path} property tells the MVC framework where your
JSP files live. In the above example, \texttt{/} means that the JSP
files are in your project's root \texttt{resources} folder. That's why
it's important to follow Liferay's standard folder structure. The
\texttt{view-template} property directs the default rendering to
\texttt{view.jsp}.

Here's the path of a hypothetical Web module's resource folder:

\begin{verbatim}
docs.liferaymvc.web/src/main/resources/META-INF/resources
\end{verbatim}

Based on that resource folder, the \texttt{view.jsp} file is found at

\begin{verbatim}
docs.liferaymvc.web/src/main/resources/META-INF/resources/view.jsp
\end{verbatim}

and that's the application's default view. When the portlet's
\texttt{init} method (e.g., your portlet's override of
\texttt{MVCPortlet.init()}) is called, Liferay reads the initialization
parameters you specify and directs rendering to the default JSP.
Throughout the controller, you can render different views (JSP files) by
setting the render parameter \texttt{mvcPath} like this:

\begin{verbatim}
actionResponse.setRenderParameter("mvcPath", "/error.jsp");
\end{verbatim}

You can avoid render logic by using initialization parameters and render
parameters, but most of the time you'll override the portlet's
\texttt{render} method. Here's an example:

\begin{verbatim}
@Override
public void render(RenderRequest renderRequest,
        RenderResponse renderResponse) throws PortletException, IOException {

    try {
        ServiceContext serviceContext = ServiceContextFactory.getInstance(
                Guestbook.class.getName(), renderRequest);

        long groupId = serviceContext.getScopeGroupId();

        long guestbookId = ParamUtil.getLong(renderRequest, "guestbookId");

        List<Guestbook> guestbooks = _guestbookService
                .getGuestbooks(groupId);

        if (guestbooks.size() == 0) {
            Guestbook guestbook = _guestbookService.addGuestbook(
                    serviceContext.getUserId(), "Main", serviceContext);

            guestbookId = guestbook.getGuestbookId();

        }

        if (!(guestbookId > 0)) {
            guestbookId = guestbooks.get(0).getGuestbookId();
        }

        renderRequest.setAttribute("guestbookId", guestbookId);

    } catch (Exception e) {

        throw new PortletException(e);
    }

    super.render(renderRequest, renderResponse);

}
\end{verbatim}

This render logic provides the view layer with data to display to the
user. The \texttt{render} method above sets the render request attribute
\texttt{guestbookId} with the ID of a guestbook to display. If
guestbooks exist, it chooses the first. Otherwise, it creates a
guestbook and sets it to display. Lastly the method passes the render
request and render response objects to the base class via its
\texttt{render} method.

\noindent\hrulefill

\textbf{Note:} Are you wondering how to call
\href{/docs/7-2/appdev/-/knowledge_base/a/service-builder}{Service
Builder services} in 7.0? In short, obtain a reference to the service by
annotating one of your fields of that service type with the
\texttt{@Reference}
\href{/docs/7-2/frameworks/-/knowledge_base/f/declarative-services}{Declarative
Services} annotation.

\texttt{@Reference\ \ private\ GuestbookService\ \_guestbookService;}

Once done, you can call the service's methods.

\texttt{\_guestbookService.addGuestbook(serviceContext.getUserId(),\ "Main",\ \ \ \ \ \ \ \ \ \ serviceContext);}

\noindent\hrulefill

Before venturing into the view layer, the next section demonstrates ways
to pass information between the controller and view layers.

\section{Setting and Retrieving Request and Response Parameters and
Attributes}\label{setting-and-retrieving-request-and-response-parameters-and-attributes}

A handy utility class called
\href{https://docs.liferay.com/dxp/portal/7.2-latest/javadocs/portal-kernel/com/liferay/portal/kernel/util/ParamUtil.html}{\texttt{ParamUtil}}
facilitates retrieving parameters from an
\href{https://docs.liferay.com/portlet-api/3.0/javadocs/javax/portlet/ActionRequest.html}{\texttt{ActionRequest}}
or a
\href{https://docs.liferay.com/portlet-api/3.0/javadocs/javax/portlet/RenderRequest.html}{\texttt{RenderRequest}}.

For example, this JSP passes a parameter named \texttt{guestbookId} in
an action URL.

\begin{verbatim}
<portlet:actionURL name="doSomething" var="doSomethingURL">
    <portlet:param name="guestbookId" 
            value="<%= String.valueOf(entry.getGuestbookId()) %>" />
</portlet:actionURL>
\end{verbatim}

The \texttt{\textless{}portlet:actionURL\textgreater{}} tag's
\texttt{name} attribute maps the action URL to a controller action
method named \texttt{doSomething}. Triggering an action URL invokes the
corresponding method in the controller.

The controller's \texttt{doSomething} method referenced in this example
gets the \texttt{guestbookId} parameter value from the
\texttt{ActionRequest}.

\begin{verbatim}
long guestbookId = ParamUtil.getLong(actionRequest, "guestbookId");
\end{verbatim}

To pass information back to the view layer, the controller code can set
render parameters on response objects.

\begin{verbatim}
actionResponse.setRenderParameter("mvcPath", "/error.jsp");
\end{verbatim}

The code above sets a parameter called \texttt{mvcPath} to JSP path
\texttt{/error.jsp}. This causes the controller's render method to
redirect the user to that JSP.

Your controller class can also set attributes into response objects
using the \texttt{setAttribute} method.

\begin{verbatim}
renderResponse.setAttribute("guestbookId", guestbookId);
\end{verbatim}

JSPs can use Java code in scriptlets to interact with the request
object.

\begin{verbatim}
<%
    long guestbookId = Long.valueOf((Long) renderRequest
            .getAttribute("guestbookId"));
%>
\end{verbatim}

Passing information back and forth from your view and controller is
important, but there's more to the view layer than that. The view layer
is up next.

\section{Related Topics}\label{related-topics-4}

\href{/docs/7-2/appdev/-/knowledge_base/a/creating-an-mvc-portlet}{Creating
an MVC Portlet}

\href{/docs/7-2/appdev/-/knowledge_base/a/configuring-the-view-layer}{Configuring
the View Layer}

\href{/docs/7-2/appdev/-/knowledge_base/a/mvc-action-command}{MVC Action
Command}

\href{/docs/7-2/appdev/-/knowledge_base/a/mvc-render-command}{MVC Render
Command}

\href{/docs/7-2/appdev/-/knowledge_base/a/mvc-resource-command}{MVC
Resource Command}

\chapter{Configuring the View Layer}\label{configuring-the-view-layer}

This section briefly covers how to get your view layer working, from
organizing your imports in one JSP file, to creating URLs that direct
processing to methods in your portlet class.

\noindent\hrulefill

Note: As you create JSPs, you can
\href{/docs/7-1/tutorials/-/knowledge_base/t/applying-clay-styles-to-your-app}{apply
Clay styles to your app to match Liferay's apps}.

\noindent\hrulefill

\section{Using the init.jsp}\label{using-the-init.jsp}

Liferay's practice puts all Java imports, tag library declarations, and
variable initializations into a JSP called \texttt{init.jsp}. If you use
\href{/docs/7-1/tutorials/-/knowledge_base/t/blade-cli}{Blade CLI} or
\href{/docs/7-1/tutorials/-/knowledge_base/t/liferay-ide}{Liferay Dev
Studio DXP} to create a module based on the \texttt{mvc-portlet} project
template, these taglib declarations and initializations are added
automatically to your \texttt{init.jsp}:

\begin{verbatim}
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>

<%@ taglib uri="http://liferay.com/tld/aui" prefix="aui" %>
<%@ taglib uri="http://liferay.com/tld/portlet" prefix="liferay-portlet" %>
<%@ taglib uri="http://liferay.com/tld/theme" prefix="liferay-theme" %>
<%@ taglib uri="http://liferay.com/tld/ui" prefix="liferay-ui" %>

<liferay-theme:defineObjects />

<portlet:defineObjects />
\end{verbatim}

Here are the tag libraries it gives you:

\begin{itemize}
\tightlist
\item
  \href{https://docs.liferay.com/ce/portal/7.2-latest/taglibs/util-taglib/c/tld-frame.html}{\texttt{c}}:
  JSTL core tags.
\item
  \href{https://docs.liferay.com/ce/portal/7.2-latest/taglibs/util-taglib/portlet/tld-frame.html}{\texttt{portlet}}:
  Standard portlet component tags.
\item
  \href{https://docs.liferay.com/ce/portal/7.2-latest/taglibs/util-taglib/aui/tld-summary.html}{\texttt{aui}}:
  \href{https://alloyui.com/}{AlloyUI} component tags.
\item
  \href{https://docs.liferay.com/ce/portal/7.2-latest/taglibs/util-taglib/liferay-portlet/tld-frame.html}{\texttt{liferay-portlet}}:
  Liferay portlet component tags.
\item
  \href{https://docs.liferay.com/ce/portal/7.2-latest/taglibs/util-taglib/liferay-theme/tld-frame.html}{\texttt{liferay-theme}}:
  Liferay theme component tags.
\item
  \href{https://docs.liferay.com/ce/portal/7.2-latest/taglibs/util-taglib/liferay-ui/tld-frame.html}{\texttt{liferay-ui}}:
  Liferay UI component tags.
\end{itemize}

These tags make portlet and Liferay objects available:

\begin{itemize}
\item
  \texttt{\textless{}portlet:defineObjects\ /\textgreater{}}: Implicit
  Java variables that reference Portlet API objects. The objects
  available are limited to those available in the current portlet
  request. For details, see the \texttt{defineObjects} tag in
  \href{https://jcp.org/en/jsr/detail?id=286}{JSR-286}.
\item
  \texttt{\textless{}liferay-theme:defineObjects\ /\textgreater{}}:
  Implicit Java variables that reference Liferay objects.
\end{itemize}

To use all that the \texttt{init.jsp} has, include it in your other
JSPs:

\begin{verbatim}
<%@include file="/html/init.jsp"%>
\end{verbatim}

A JSP uses render URLs to display other pages and action URLs to invoke
controller methods.

\section{Using Render URLs}\label{using-render-urls}

A render URL attached to a UI component action displays another page.
For example, this render URL displays the JSP \texttt{/path/to/foo.jsp}.

\begin{verbatim}
<portlet:renderURL var="adminURL">
    <portlet:param name="mvcPath" value="/path/to/foo.jsp" />
</portlet:renderURL>
\end{verbatim}

Here's how to use a render URL:

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\item
  Add a
  \href{https://docs.liferay.com/dxp/portal/7.2-latest/taglibs/util-taglib/portlet/renderURL.html}{\texttt{\textless{}portlet:renderURL\textgreater{}}}
  to your JSP.
\item
  Name the render URL via a \texttt{var} attribute in the
  \texttt{\textless{}portlet:renderURL\textgreater{}} tag. The
  \texttt{\textless{}portlet:renderURL\textgreater{}} tag constructs the
  URL and assigns it to the variable. For example, this render URL is
  assigned to the variable named \texttt{adminURL}:

\begin{verbatim}
<portlet:renderURL var="adminURL">
   ...
</portlet:renderURL>
\end{verbatim}
\item
  As sub-element to the
  \texttt{\textless{}portlet:renderURL\textgreater{}} tag, add a
  \href{https://docs.liferay.com/dxp/portal/7.2-latest/taglibs/util-taglib/portlet/param.html}{\texttt{\textless{}portlet:param\textgreater{}}}
  tag with the following attributes:

  \texttt{name="mvcPath"}: Your controller's \texttt{render} method
  forwards processing to the JSP at the path specified in the
  \texttt{value}.

  \texttt{value="/path/to/foo.jsp"}: The path to the JSP to render.
  Replace the value \texttt{/path/to/foo.jsp} with your JSP path.

\begin{verbatim}
<portlet:renderURL var="adminURL">
    <portlet:param name="mvcPath" value="/path/to/foo.jsp" />
</portlet:renderURL>
\end{verbatim}
\item
  To invoke the render URL, assign its variable (\texttt{var}) to a UI
  component action, such as a button or navigation bar item action.
\end{enumerate}

Invoking the UI component causes the controller's render method to
display the \texttt{mvcPath} parameter's JSP.

\section{Using Action URLs}\label{using-action-urls}

Action methods are different because they invoke an action (i.e., code),
rather than link to another page. For example, this action URL invokes a
controller method called \texttt{doSomething} and passes a parameter
called \texttt{redirect}. The \texttt{redirect} parameter contains the
path of the JSP to render after invoking the action:

\begin{verbatim}
<portlet:actionURL name="doSomething" var="doSomethingURL">
    <portlet:param name="redirect" value="<%= redirect %>" />
</portlet:actionURL>
\end{verbatim}

Here's how to use an action URL:

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\item
  Add a
  \href{https://docs.liferay.com/dxp/portal/7.2-latest/taglibs/util-taglib/portlet/actionURL.html}{\texttt{\textless{}portlet:actionURL\textgreater{}}}
  to your JSP.
\item
  Add a \texttt{name} and \texttt{var} attribute to the
  \texttt{\textless{}portlet:actionURL\textgreater{}}. The
  \texttt{\textless{}portlet:actionURL\textgreater{}} tag constructs the
  URL and assigns it to the \texttt{var} variable.

  \texttt{name}: Controller action to invoke.

  \texttt{var}: Variable to assign the action URL to.

\begin{verbatim}
<portlet:actionURL name="doSomething" var="doSomethingURL">
   ...
</portlet:actionURL>
\end{verbatim}
\item
  As sub-element to the
  \texttt{\textless{}portlet:actionURL\textgreater{}} tag, add a
  \href{https://docs.liferay.com/dxp/portal/7.2-latest/taglibs/util-taglib/portlet/param.html}{\texttt{\textless{}portlet:param\textgreater{}}}
  tag that has the following attributes:

  \texttt{name="redirect"}: Tells the portlet to redirect to the JSP
  associated with this parameter.

  \texttt{value="/path/to/foo.jsp"}: Redirects the user to this JSP path
  after invoking the action. Replace the value \texttt{/path/to/bar.jsp}
  with your JSP path.

\begin{verbatim}
<portlet:actionURL name="doSomething" var="doSomethingURL">
    <portlet:param name="redirect" value="/path/to/bar.jsp" />
</portlet:actionURL>
\end{verbatim}
\item
  To invoke the action URL, assign its variable (\texttt{var}) to a UI
  component action, such as a button or navigation bar item action.
\end{enumerate}

Congratulations! Your portlet is ready for action.

These simple examples demonstrate how Liferay MVC Portlet facilitates
communication between a smaller application's view layer and controller.

\section{Related Topics}\label{related-topics-5}

\href{/docs/7-2/appdev/-/knowledge_base/a/writing-mvc-portlet-controller-code}{Writing
MVC Portlet Controller Code}

\href{/docs/7-2/appdev/-/knowledge_base/a/mvc-action-command}{MVC Action
Command}

\href{/docs/7-2/appdev/-/knowledge_base/a/mvc-render-command}{MVC Render
Command}

\href{/docs/7-2/appdev/-/knowledge_base/a/mvc-resource-command}{MVC
Resource Command}

\href{/docs/7-2/reference/-/knowledge_base/r/front-end-taglibs}{Front-end
Taglibs}

\href{https://portal.liferay.dev/docs/7-2/reference/-/knowledge_base/r/liferay-javascript-apis}{Liferay
JavaScript APIs}

\chapter{MVC Action Command}\label{mvc-action-command}

Liferay's MVC Portlet framework enables you to handle
\href{/docs/7-2/appdev/-/knowledge_base/a/liferay-mvc-portlet}{MVCPortlet}
\href{/docs/7-2/appdev/-/knowledge_base/a/configuring-the-view-layer\#using-action-urls}{actions}
in separate classes. This facilitates managing action logic in portlets
that have many actions. Each action URL in your portlet's JSPs invokes
an appropriate action command class.

Here are the steps:

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\item
  \href{/docs/7-2/appdev/-/knowledge_base/a/configuring-the-view-layer}{Configure
  your JSPs} to use action URLs via
  \href{https://docs.liferay.com/dxp/portal/7.2-latest/taglibs/util-taglib/portlet/actionURL.html}{\texttt{\textless{}portlet:actionURL\textgreater{}}}
  tags. For example, the
  \href{https://github.com/liferay/liferay-blade-samples/blob/7.1/gradle/apps/action-command-portlet/src/main/resources/META-INF/resources/view.jsp}{action-command-portlet}
  sample uses this action URL:

\begin{verbatim}
<liferay-portlet:actionURL name="greet" var="greetURL" />
\end{verbatim}

  Name the action URL via its \texttt{name} attribute. Your
  \texttt{*MVCActionCommand} class maps to this name. Assign the
  \texttt{var} attribute a variable name.
\item
  Assign the action URL variable (\texttt{var}) to a UI component.
  Acting on the UI component invokes the action. For example, the
  sample's \texttt{greetURL} action URL variable triggers on submitting
  this form:

\begin{verbatim}
<aui:form action="<%= greetURL %>" method="post" name="fm">
    <aui:input name="name" type="text" />

    <aui:button-row>
        <aui:button type="submit"></aui:button>
    </aui:button-row>
</aui:form>
\end{verbatim}
\item
  Create a class that implements the
  \href{https://docs.liferay.com/dxp/portal/7.2-latest/javadocs/portal-kernel/com/liferay/portal/kernel/portlet/bridges/mvc/MVCActionCommand.html}{\texttt{MVCActionCommand}}
  interface, or that extends the
  \href{https://docs.liferay.com/dxp/portal/7.2-latest/javadocs/portal-kernel/com/liferay/portal/kernel/portlet/bridges/mvc/BaseMVCActionCommand.html}{\texttt{BaseMVCActionCommand}}
  class. The latter may save you time, since it already implements
  \texttt{MVCActionCommand}.
\end{enumerate}

\noindent\hrulefill

\begin{verbatim}
 **Tip:** Naming your `*MVCActionCommand` class after the action it 
 performs makes the action mappings more obvious for maintaining the code.
 For example, if your action class edits some kind of entry, you could name
 its class `EditEntryMVCActionCommand`. If your application has several MVC
 command classes, naming them this way helps differentiate them. 
\end{verbatim}

\noindent\hrulefill

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\setcounter{enumi}{3}
\item
  Annotate your class with an
  \href{https://docs.osgi.org/javadoc/osgi.cmpn/7.0.0/org/osgi/service/component/annotations/Component.html}{\texttt{@Component}}
  annotation, like this one:

\begin{verbatim}
@Component(
    property = {
        "javax.portlet.name=your_portlet_name_YourPortlet",
        "mvc.command.name=/your/jsp/action/url"
    },
    service = MVCActionCommand.class
)
\end{verbatim}
\item
  Set a \texttt{javax.portlet.name} property to your portlet's internal
  ID.

  Note, you can apply MVC Command classes to multiple portlets by
  setting a \texttt{javax.portlet.name} property for each portlet. For
  example, the \texttt{javax.portlet.name} properties in this component
  apply it to three specific portlets.

\begin{verbatim}
@Component(
    immediate = true,
    property = {
        "javax.portlet.name=" + BlogsPortletKeys.BLOGS,
        "javax.portlet.name=" + BlogsPortletKeys.BLOGS_ADMIN,
        "javax.portlet.name=" + BlogsPortletKeys.BLOGS_AGGREGATOR,
        "mvc.command.name=/blogs/edit_entry"
    },
    service = MVCActionCommand.class
)
public class EditEntryMVCActionCommand extends BaseMVCActionCommand {
    ...
}
\end{verbatim}
\item
  Set the \texttt{mvc.command.name} property to your
  \texttt{\textless{}portlet:actionURL\textgreater{}} tag's
  \texttt{name}. This maps your class to the action URL of the same
  name.
\item
  Register your class as an \texttt{MVCActionCommand} service by setting
  the \texttt{service} attribute to \texttt{MVCActionCommand.class}.
\item
  Implement your action logic by overriding the appropriate method of
  the class you're implementing or extending.

  \begin{itemize}
  \item
    \href{https://docs.liferay.com/dxp/portal/7.2-latest/javadocs/portal-kernel/com/liferay/portal/kernel/portlet/bridges/mvc/MVCActionCommand.html}{\texttt{MVCActionCommand}}
    implementations override the \texttt{processAction} method.
  \item
    \href{https://docs.liferay.com/dxp/portal/7.2-latest/javadocs/portal-kernel/com/liferay/portal/kernel/portlet/bridges/mvc/BaseMVCActionCommand.html}{\texttt{BaseMVCActionCommand}}
    extensions override the \texttt{doProcessAction} method.
  \end{itemize}

  Here's an example of overriding \texttt{MVCActionCommand}'s
  \texttt{processAction} method. This action logic gets the name
  parameter from the \texttt{ActionRequest} and adds it to the session
  messages and to an \texttt{ActionRequest} attribute.

\begin{verbatim}
@Override
public boolean processAction(
        ActionRequest actionRequest, ActionResponse actionResponse)
    throws PortletException {

    _handleActionCommand(actionRequest);

    return true;
}

private void _handleActionCommand(ActionRequest actionRequest) {
    String name = ParamUtil.get(actionRequest, "name", StringPool.BLANK);

    if (_log.isInfoEnabled()) {
        _log.info("Hello " + name);
    }

    String greetingMessage = "Hello " + name + "! Welcome to OSGi";

    actionRequest.setAttribute("GREETER_MESSAGE", greetingMessage);

    SessionMessages.add(actionRequest, "greetingMessage", greetingMessage);
}

private static final Log _log = LogFactoryUtil.getLog(
    GreeterActionCommand.class);
\end{verbatim}
\end{enumerate}

Congratulations! You've created an \texttt{MVCActionCommand} that
handles your portlet actions.

\section{Related Topics}\label{related-topics-6}

\href{/docs/7-2/appdev/-/knowledge_base/a/creating-an-mvc-portlet}{Creating
an MVC Portlet}

\href{/docs/7-2/appdev/-/knowledge_base/a/configuring-the-view-layer}{Configuring
the View Layer}

\href{/docs/7-2/appdev/-/knowledge_base/a/mvc-render-command}{MVC Render
Command}

\href{/docs/7-2/appdev/-/knowledge_base/a/mvc-resource-command}{MVC
Resource Command}

\href{/docs/7-2/customization/-/knowledge_base/c/overriding-liferay-mvc-commands}{MVC
Command Overrides}

\chapter{MVC Render Command}\label{mvc-render-command}

\texttt{MVCRenderCommand}s are classes that respond to
\href{/docs/7-2/appdev/-/knowledge_base/a/liferay-mvc-portlet}{MVCPortlet}
\href{/docs/7-2/appdev/-/knowledge_base/a/writing-mvc-portlet-controller-code\#render-logic}{render
URLs}. If your render logic is simple and you want to implement all of
your render logic in your portlet class, see
\href{/docs/7-2/appdev/-/knowledge_base/a/liferay-mvc-portlet}{Writing
MVC Portlet Controller Code}. If your render logic is complex or you
want clean separation between render paths, use
\texttt{MVCRenderCommand}s. Each render URL in your portlet's JSPs
invokes an appropriate render command class.

Here are the steps:

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\item
  \href{/docs/7-2/appdev/-/knowledge_base/a/configuring-the-view-layer}{Configure
  your JSPs} to generate render URLs via
  \href{https://docs.liferay.com/dxp/portal/7.2-latest/taglibs/util-taglib/portlet/renderURL.html}{\texttt{\textless{}portlet:renderURL\textgreater{}}}
  tags.

  For example, this
  \href{https://github.com/liferay/liferay-blade-samples/tree/7.1/gradle/apps/render-command-portlet}{render-command-portlet}
  sample render URL invokes an MVC render command named
  \texttt{/blade/render}.

\begin{verbatim}
<portlet:renderURL var="bladeRender">
    <portlet:param name="mvcRenderCommandName" value="/blade/render" />
</portlet:renderURL>
\end{verbatim}
\item
  Name the render URL via its
  \texttt{\textless{}portlet:param\textgreater{}} named
  \texttt{mvcRenderCommandName}. The render URL and
  \texttt{*MVCRenderCommand} class (demonstrated later) map to the
  \texttt{mvcRenderCommandName} value.
\item
  Assign the \texttt{\textless{}portlet:renderURL\textgreater{}}'s
  \texttt{var} attribute a variable name to pass to a UI component.
\item
  Assign the render URL variable (\texttt{var}) to a UI component. When
  the user triggers the UI component, the \texttt{*MVCRenderCommand}
  class that matches the render URL handles the render request.

  For example, the render URL with the variable \texttt{bladeRender}
  triggers on users clicking this button.

\begin{verbatim}
<aui:button href="<%= bladeRender %>" value="goto page render" />
\end{verbatim}
\item
  Create a class that implements the
  \href{https://docs.liferay.com/dxp/portal/7.2-latest/javadocs/portal-kernel/com/liferay/portal/kernel/portlet/bridges/mvc/MVCRenderCommand.html}{\texttt{MVCRenderCommand}}
  interface.
\item
  Annotate the class with an
  \href{https://docs.osgi.org/javadoc/osgi.cmpn/7.0.0/org/osgi/service/component/annotations/Component.html}{\texttt{@Component}}
  annotation, like this one:

\begin{verbatim}
@Component(
    property = {
        "javax.portlet.name=com_liferay_blade_samples_portlet_rendercommand_BladeRenderPortlet",
        "mvc.command.name=/blade/render"
    },
    service = MVCRenderCommand.class
)
\end{verbatim}
\item
  Set a \texttt{javax.portlet.name} property to your portlet's internal
  ID.
\item
  Set a \texttt{mvc.command.name} property to your
  \texttt{\textless{}portlet:renderURL\textgreater{}} tag
  \texttt{mvcRenderCommandName} portlet parameter value. This maps your
  class to the render URL.
\item
  Register your class as an \texttt{MVCRenderCommand} service by setting
  the \texttt{service} attribute to \texttt{MVCRenderCommand.class}.

  Note, you can apply MVC Command classes to multiple portlets by
  setting a \texttt{javax.portlet.name} property for each portlet and
  apply MVC Command classes to multiple command names by setting an
  \texttt{mvc.command.name} property for each command name. For example,
  this component's \texttt{javax.portlet.name} properties and
  \texttt{mvc.command.name} properties apply it to two specific portlets
  and two specific command names.

\begin{verbatim}
@Component(
    immediate = true,
    property = {
       "javax.portlet.name=" + HelloWorldPortletKeys.HELLO_MY_WORLD,
       "javax.portlet.name=" + HelloWorldPortletKeys.HELLO_WORLD,
       "mvc.command.name=/hello/edit_super_entry",
       "mvc.command.name=/hello/edit_entry"
    },
    service = MVCRenderCommand.class
)
\end{verbatim}
\item
  Implement your render logic in a method that overrides
  \href{https://docs.liferay.com/dxp/portal/7.2-latest/javadocs/portal-kernel/com/liferay/portal/kernel/portlet/bridges/mvc/MVCRenderCommand.html}{\texttt{MVCRenderCommand}}'s
  \texttt{render} method. Some \texttt{*MVCRenderCommand}s, such as the
  one below, always render the same JSP.

\begin{verbatim}
public class BlogsViewMVCRenderCommand implements MVCRenderCommand {

    @Override
    public String render(
        RenderRequest renderRequest, RenderResponse renderResponse) {

        return "/blogs/view.jsp";
    }

}
\end{verbatim}
\end{enumerate}

As you can see, MVC render commands are easy to implement and can
respond to multiple command names for multiple portlets.

\section{Related Topics}\label{related-topics-7}

\href{/docs/7-2/appdev/-/knowledge_base/a/creating-an-mvc-portlet}{Creating
an MVC Portlet}

\href{/docs/7-2/appdev/-/knowledge_base/a/configuring-the-view-layer}{Configuring
the View Layer}

\href{/docs/7-2/appdev/-/knowledge_base/a/mvc-resource-command}{MVC
Resource Command}

\href{/docs/7-2/appdev/-/knowledge_base/a/mvc-action-command}{MVC Action
Command}

\href{/docs/7-2/customization/-/knowledge_base/c/overriding-liferay-mvc-commands}{MVC
Command Overrides}

\chapter{MVC Resource Command}\label{mvc-resource-command}

When using Liferay's
\href{/docs/7-2/appdev/-/knowledge_base/a/liferay-mvc-portlet}{MVCPortlet
framework}, you can create resource URLs in your JSPs to retrieve
images, XML, or any other kind of resource from a Liferay DXP instance.
The resource URL then invokes the corresponding MVC resource command
class (\texttt{*MVCResourceCommand}) that processes the resource request
and response.

Here how to create your own MVC Resource Command:

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\item
  \href{/docs/7-2/appdev/-/knowledge_base/a/configuring-the-view-layer}{Configure
  your JSPs} to generate resource URLs via
  \href{https://docs.liferay.com/dxp/portal/7.2-latest/taglibs/util-taglib/portlet/resourceURL.html}{\texttt{\textless{}portlet:resourceURL\textgreater{}}}
  tags.

  For example, this
  \href{https://github.com/liferay/liferay-blade-samples/tree/7.1/gradle/apps/resource-command-portlet}{resource-command-portlet}
  sample resource URL invokes an MVC resource command named
  \texttt{/blade/captcha}.

\begin{verbatim}
<portlet:resourceURL id="/blade/captcha" var="captchaURL" />
\end{verbatim}
\item
  Name the resource URL via its \texttt{id} attribute.
\item
  Assign the resource URL's \texttt{var} attribute a variable name to
  pass to a UI component.
\item
  Assign the resource URL variable (\texttt{var}) to a UI component,
  such as a button or icon. When the user triggers the UI component, the
  \texttt{*MVCResourceCommand} class that matches the resource URL
  handles the resource request.

  For example, the sample's resource URL is triggered when the user
  clicks on this
  \href{https://docs.liferay.com/dxp/apps/foundation/latest/taglibdocs/liferay-captcha/captcha.html}{\texttt{liferay-captcha}}
  component:

\begin{verbatim}
<liferay-captcha:captcha url="<%= captchaURL %>" />
\end{verbatim}
\item
  Create a class that implements the
  \href{https://docs.liferay.com/dxp/portal/7.2-latest/javadocs/portal-kernel/com/liferay/portal/kernel/portlet/bridges/mvc/MVCResourceCommand.html}{\texttt{MVCResourceCommand}}
  interface, or that extends the
  \href{https://docs.liferay.com/dxp/portal/7.2-latest/javadocs/portal-kernel/com/liferay/portal/kernel/portlet/bridges/mvc/BaseMVCResourceCommand.html}{\texttt{BaseMVCResourceCommand}}
  class. The latter may save you time, since it already implements
  \texttt{MVCResourceCommand}.
\end{enumerate}

\noindent\hrulefill

\begin{verbatim}
 **Tip:** Naming your `*MVCResourceCommand` class after the resource it 
 provides makes the resource mappings more obvious for maintaining the
 code. For example, if your resource URL serves a captcha, you could name
 its class `CaptchaMVCResourceCommand`. If your application has several MVC
 command classes, naming them this way helps differentiate them. 
\end{verbatim}

\noindent\hrulefill

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\setcounter{enumi}{5}
\item
  Annotate your class with an
  \href{https://docs.osgi.org/javadoc/osgi.cmpn/7.0.0/org/osgi/service/component/annotations/Component.html}{\texttt{@Component}}
  annotation, like this one:

\begin{verbatim}
@Component(
    property = {
        "javax.portlet.name=your_portlet_name_YourPortlet",
        "mvc.command.name=/your/jsp/resource/url"
    },
    service = MVCResourceCommand.class
)
public class YourMVCResourceCommand extends BaseMVCResourceCommand {
    // your resource handling code
}
\end{verbatim}

  \begin{enumerate}
  \def\labelenumii{\arabic{enumii}.}
  \item
    Set a \texttt{javax.portlet.name} property to your portlet's
    internal ID.
  \item
    Set the \texttt{mvc.command.name} property to your
    \texttt{\textless{}portlet:resourceURL\textgreater{}} tag's
    \texttt{id}. This maps your class to the resource URL of the same
    name.
  \item
    Register your class as an \texttt{MVCResourceCommand} service by
    setting the \texttt{service} attribute to
    \texttt{MVCResourceCommand.class}.
  \end{enumerate}
\item
  Implement your resource logic by overriding the appropriate method of
  the class you're implementing or extending.

  \begin{itemize}
  \item
    \href{https://docs.liferay.com/dxp/portal/7.2-latest/javadocs/portal-kernel/com/liferay/portal/kernel/portlet/bridges/mvc/MVCResourceCommand.html}{\texttt{MVCResourceCommand}}
    implementations override the \texttt{serveResource} method.
  \item
    \href{https://docs.liferay.com/dxp/portal/7.2-latest/javadocs/portal-kernel/com/liferay/portal/kernel/portlet/bridges/mvc/BaseMVCResourceCommand.html}{\texttt{BaseMVCResourceCommand}}
    extensions override the \texttt{doServeResource} method.
  \end{itemize}
\end{enumerate}

For example, the
\href{https://github.com/liferay/liferay-blade-samples/tree/7.1/gradle/apps/resource-command-portlet}{resource-command-portlet}'s
\texttt{CaptchaMVCResourceCommand} class implements the
\texttt{MVCResourceCommand} interface with only a single method:
\texttt{serveResource}.

\begin{verbatim}
@Component(
    immediate = true,
    property = {
        "javax.portlet.name=com_liferay_blade_samples_portlet_resourcecommand_CaptchaPortlet",
        "mvc.command.name=/blade/captcha"
    },
    service = MVCResourceCommand.class
)
public class CaptchaMVCResourceCommand implements MVCResourceCommand {

    @Override
    public boolean serveResource(
            ResourceRequest resourceRequest, ResourceResponse resourceResponse)
        throws PortletException {

        if (_log.isInfoEnabled()) {
            _log.info("get captcha resource ");
        }

        try {
            CaptchaUtil.serveImage(resourceRequest, resourceResponse);

            return false;
        }
        catch (Exception e) {
            _log.error(e.getMessage(), e);

            return true;
        }
    }

    private static final Log _log = LogFactoryUtil.getLog(
        CaptchaMVCResourceCommand.class);

}
\end{verbatim}

This \texttt{serveResource} method processes the resource request and
response via the \texttt{javax.portlet.ResourceRequest} and
\texttt{javax.portlet.ResourceResponse} parameters, respectively. Note
that the \texttt{try} block uses the helper class
\href{https://docs.liferay.com/dxp/portal/7.2-latest/javadocs/portal-kernel/com/liferay/portal/kernel/captcha/CaptchaUtil.html}{\texttt{CaptchaUtil}}
to serve the CAPTCHA image. Though you don't have to create such a
helper class, doing so often simplifies your code.

Great! Now you know how to use \texttt{MVCResourceCommand} to process
resources in your Liferay MVC Portlets.

\section{Related Topics}\label{related-topics-8}

\href{/docs/7-2/appdev/-/knowledge_base/a/creating-an-mvc-portlet}{Creating
an MVC Portlet}

\href{/docs/7-2/appdev/-/knowledge_base/a/configuring-the-view-layer}{Configuring
the View Layer}

\href{/docs/7-2/appdev/-/knowledge_base/a/mvc-render-command}{MVC Render
Command}

\href{/docs/7-2/appdev/-/knowledge_base/a/mvc-action-command}{MVC Action
Command}

\href{/docs/7-2/customization/-/knowledge_base/c/overriding-liferay-mvc-commands}{MVC
Command Overrides}

\chapter{PortletMVC4Spring}\label{portletmvc4spring}

PortletMVC4Spring is a way to develop portlets using the Spring
Framework and the Model View Controller (MVC) pattern. While the Spring
Framework supports developing \emph{servlet-based} web applications
using
\href{https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html}{Spring
Web MVC}, PortletMVC4Spring supports developing \emph{portlet-based}
applications using MVC. You can build
\href{https://spring.io/projects/spring-framework}{Spring Framework}
Liferay DXP portlets with features like these:

\begin{itemize}
\tightlist
\item
  Inversion of control (IoC) / dependency injection (DI)
\item
  Annotations
\item
  Security
\item
  Binding and validation
\item
  Multi-part file upload
\item
  \ldots{} and more
\end{itemize}

You'll learn these things about PortletMVC4Spring:

\begin{itemize}
\item
  \textbf{Developing a Portlet Using PortletMVC4Spring:} Demonstrates
  creating and deploying a portlet using PortletMVC4Spring.
\item
  \textbf{Annotation-based Controller Development:} Shows how to
  implement controllers using plain old Java objects (POJOs) and
  annotations.
\end{itemize}

\noindent\hrulefill

\textbf{Background:} The PortletMVC4Spring project began as Spring
Portlet MVC and was part of the
\href{https://spring.io/projects/spring-framework}{Spring Framework}.
When the project was pruned from version 5.0.x of the Spring Framework
under
\href{https://github.com/spring-projects/spring-framework/issues/18701}{SPR-14129},
it became necessary to fork and rename the project. This made it
possible to improve and maintain the project for compatibility with the
latest versions of the Spring Framework and the Portlet API.

\href{http://www.liferay.com}{Liferay} adopted Spring Portlet MVC in
March of 2019 and the project was renamed to \textbf{PortletMVC4Spring}.

\noindent\hrulefill

If you're familiar with Spring Web MVC, it's helpful to compare it with
PortletMVC4Spring. Portlet workflow differs from servlet workflow
because a request to the portlet can have two distinct phases: the
\texttt{ACTION\_PHASE} and the \texttt{RENDER\_PHASE}. The
\texttt{ACTION\_PHASE} is executed only once and is where any back-end
changes or actions occur, such as making changes in a database. The
\texttt{RENDER\_PHASE} presents the portlet's content to the user each
time the display is refreshed. Thus for a single request, the
\texttt{ACTION\_PHASE} is executed only once, but the
\texttt{RENDER\_PHASE} may be executed multiple times. This provides
(and requires) a clean separation between the activities that modify the
system's persistent state and the activities that generate content. The
Portlet 2.0 Specification added two more phases: The event phase and the
resource phase, both of which are supported by annotation-driven
dispatching.

PortletMVC4Spring provides annotations that support requests from the
render, action, event, and resource serving portlet phases; Spring Web
MVC provides only a \texttt{@RequestMapping} annotation. Where a Spring
Web MVC controller might have a single handler method annotated with
\texttt{@RequestMapping}, an equivalent PortletMVC4Spring controller
might have multiple handler methods, each using one of the phase
annotations: \texttt{@ActionMapping}, \texttt{@EventMapping},
\texttt{@RenderMapping}, or \texttt{@ResourceMapping}.

The PortletMVC4Spring framework uses a \texttt{DispatcherPortlet} that
dispatches requests to handlers, with configurable handler mappings and
view resolution, just as the \texttt{DispatcherServlet} in the web
framework does.

\noindent\hrulefill

\textbf{Note:} For more information on portlets, portlet specifications,
and how portlets differ from servlets, see
\href{/docs/7-2/frameworks/-/knowledge_base/f/portlets}{Portlets}.

\noindent\hrulefill

Liferay also provides full-featured sample portlets that demonstrate
using JSP and \href{https://www.thymeleaf.org}{Thymeleaf} view
templates. They exercise many features that form-based portlet
applications typically require.

\begin{figure}
\centering
\includegraphics{./images/portletmvc4spring-applicant-jsp-app.png}
\caption{This PortletMVC4Spring portlet enables users to enter job
applications. It uses the Spring features mentioned above and handles
requests from multiple portlet phases.}
\end{figure}

The samples are available here:

\noindent\hrulefill

\begin{longtable}[]{@{}
  >{\raggedright\arraybackslash}p{(\columnwidth - 2\tabcolsep) * \real{0.5000}}
  >{\raggedright\arraybackslash}p{(\columnwidth - 2\tabcolsep) * \real{0.5000}}@{}}
\toprule\noalign{}
\begin{minipage}[b]{\linewidth}\raggedright
Source Code
\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright
Maven Central
\end{minipage} \\
\midrule\noalign{}
\endhead
\bottomrule\noalign{}
\endlastfoot
\href{https://github.com/liferay/portletmvc4spring/tree/master/demo/applicant-jsp-portlet}{applicant-jsp-portlet}
&
\href{https://search.maven.org/search?q=a:com.liferay.portletmvc4spring.demo.applicant.jsp.portlet}{com.liferay.portletmvc4spring.demo.applicant.jsp.portlet.war} \\
\href{https://github.com/liferay/portletmvc4spring/tree/master/demo/applicant-thymeleaf-portlet}{applicant-thymeleaf-portlet}
&
\href{https://search.maven.org/search?q=a:com.liferay.portletmvc4spring.demo.applicant.thymeleaf.portlet}{com.liferay.portletmvc4spring.demo.applicant.thymeleaf.portlet.war} \\
\end{longtable}

\noindent\hrulefill

Now that you have a basic understanding of PortletMVC4Spring portlets
and how they compare to Spring Web MVC applications, it's time to
develop a PortletMVC4Spring portlet.

\chapter{Developing a Portlet Using
PortletMVC4Spring}\label{developing-a-portlet-using-portletmvc4spring}

PortletMVC4Spring compliments the Spring Web framework and MVC design
pattern by providing annotations that map portlet requests to Controller
classes and methods. Here you'll develop and deploy a portlet
application that uses PortletMVC4Spring, Spring, and JSP/JSPX templates.

\begin{figure}
\centering
\includegraphics{./images/portletmvc4Spring-developing.png}
\caption{The archetype's sample portlet prints a greeting (e.g.,
\emph{Hello, Joe Bloggs}) on submitting a first and last name.}
\end{figure}

Follow these steps to create and deploy your portlet application:

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\item
  Create a PortletMVC4Spring project. See
  \href{/docs/7-2/reference/-/knowledge_base/r/portletmvc4spring-project-anatomy}{PortletMVC4Spring
  Project Anatomy} for the project structure and commands for generating
  PortletMVC4Spring projects. Here's the Maven command for generating
  the JSP/JSPX project. This article lists sample code from the
  generated project.

\begin{verbatim}
mvn archetype:generate \
-DarchetypeGroupId=com.liferay.portletmvc4spring.archetype \
-DarchetypeArtifactId=com.liferay.portletmvc4spring.archetype.form.jsp.portlet \
-DarchetypeVersion=5.1.0 \ 
-DgroupId=com.mycompany \ 
-DartifactId=com.mycompany.my.form.jsp.portlet
\end{verbatim}
\item
  In your project's Gradle build file or Maven POM, add your app's
  dependencies. Here are the PortletMVC4Spring development dependencies:

  \textbf{Gradle:}

\begin{verbatim}
compile group: 'com.liferay.portletmvc4spring', name: 'com.liferay.portletmvc4spring.framework', version: '5.1.0'
compile group: 'com.liferay.portletmvc4spring', name: 'com.liferay.portletmvc4spring.security', version: '5.1.0'
providedCompile group: 'javax.portlet', name: 'portlet-api', version: '3.0.0'
\end{verbatim}

  \textbf{Maven:}

\begin{verbatim}
<dependency>
    <groupId>com.liferay.portletmvc4spring</groupId>
    <artifactId>com.liferay.portletmvc4spring.framework</artifactId>
    <version>5.1.0</version>
</dependency>
<dependency>
    <groupId>com.liferay.portletmvc4spring</groupId>
    <artifactId>com.liferay.portletmvc4spring.security</artifactId>
    <version>5.1.0</version>
</dependency>
<dependency>
    <groupId>javax.portlet</groupId>
    <artifactId>portlet-api</artifactId>
    <version>3.0.0</version>
    <scope>provided</scope>
</dependency>
\end{verbatim}

  At this point you can develop your Model, View, or Controller
  components, in any order.
\item
  Create your Model class(es) in a package for models (e.g.,
  \texttt{java/{[}my-package-path{]}/dto}). The sample Model class is
  \texttt{User}.

\begin{verbatim}
public class User implements Serializable {

    private static final long serialVersionUID = 1234273427623725552L;

    @NotBlank
    private String firstName;

    @NotBlank
    private String lastName;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}
\end{verbatim}
\item
  Create your View using a Spring Web-supported template type. If you
  didn't generate your project using the archetype mentioned above,
  specify a View resolver for template type in your
  \texttt{spring-context/portlet-application-context.xml} portlet
  application context. (See
  \href{/docs/7-2/reference/-/knowledge_base/r/portletmvc4spring-configuration-files}{PortletMVC4Spring
  Configuration Files} for details).

  The sample \texttt{user.jspx} template renders a form for submitting a
  user's first and last name.

\begin{verbatim}
<?xml version="1.0" encoding="UTF-8"?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page"
          xmlns:portlet="http://xmlns.jcp.org/portlet_3_0"
          xmlns:spring="http://www.springframework.org/tags"
          xmlns:form="http://www.springframework.org/tags/form"
          version="2.1">
    <jsp:directive.page contentType="text/html" pageEncoding="UTF-8" />
    <portlet:defineObjects/>
    <link href="${contextPath}/resources/css/main.css" rel="stylesheet" type="text/css"/>
    <portlet:actionURL var="mainFormActionURL"/>
    <form:form id="${namespace}mainForm" action="${mainFormActionURL}" class="user-form" method="post" modelAttribute="user">
        <p class="caption">
            <spring:message code="personal-information" />
        </p>
        <fieldset>
            <div class="form-group">
                <form:label for="${namespace}firstName" path="firstName">
                    <spring:message code="first-name" />
                </form:label>
                <form:input id="${namespace}firstName" cssClass="form-control" path="firstName"/>
                <form:errors path="firstName" cssClass="portlet-msg-error"/>
            </div>
            <div class="form-group">
                <form:label for="${namespace}lastName" path="lastName">
                    <spring:message code="last-name" />
                </form:label>
                <form:input id="${namespace}lastName" cssClass="form-control" path="lastName"/>
                <form:errors path="lastName" cssClass="portlet-msg-error"/>
            </div>
        </fieldset>
        <hr />
        <spring:message code="submit" var="submit" />
        <input class="btn btn-primary" value="${submit}" type="submit"/>
    </form:form>
</jsp:root>
\end{verbatim}

  To invoke actions in your Controller, associate action URLs with your
  templates. The sample template associates the action URL variable
  \texttt{mainFormActionURL} with its form element.

\begin{verbatim}
<portlet:actionURL var="mainFormActionURL"/>
<form:form id="${namespace}mainForm" action="${mainFormActionURL}" class="user-form" method="post" modelAttribute="user">
    ...
\end{verbatim}

  A \texttt{\textless{}form:form/\textgreater{}} element's
  \texttt{modelAttribute} attribute targets an application Model. The
  sample template targets the application's \texttt{user} Model.
\item
  Style your portlet by adding CSS to a stylesheet (e.g.,
  \texttt{webapp/resources/css/main.css}) and linking your template to
  it.

\begin{verbatim}
<link href="${contextPath}/resources/css/main.css" rel="stylesheet" type="text/css"/>
\end{verbatim}
\item
  Define your portlet's messages in a properties file (e.g.,
  \texttt{src/main/resources/content/{[}portlet{]}.properties}). The
  sample \texttt{user.jspx} template references some of these
  properties:

\begin{verbatim}
first-name=First Name
greetings=Greetings, {0} {1}!
javax.portlet.display-name=com.mycompany.my.form.jsp.portlet
javax.portlet.keywords=com.mycompany.my.form.jsp.portlet
javax.portlet.short-title=com.mycompany.my.form.jsp.portlet
javax.portlet.title=com.mycompany.my.form.jsp.portlet
last-name=Last Name
personal-information=Personal Information
submit=Submit
todays-date-is=Today''s date is {0}
\end{verbatim}
\item
  Create a Controller class to handle portlet requests. Here's an
  example:

\begin{verbatim}
@Controller
@RequestMapping("VIEW")
public class MyController {
    ...
}
\end{verbatim}

  The
  \href{https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/Controller.html}{\texttt{@Controller}}
  annotation applies the Spring Controller component stereotype. The
  Spring Framework scans Controller classes for Controller annotations.

  The
  \href{https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html}{\texttt{@RequestMapping("VIEW")}}
  annotation marks the class's public methods as request handler methods
  for the portlet's
  \href{/docs/7-2/frameworks/-/knowledge_base/f/portlets}{VIEW mode}.
\item
  In your Controller, apply \texttt{@RenderMapping} annotations to
  methods for handling portlet render requests. Import the annotation
  \texttt{com.liferay.portletmvc4spring.bind.annotation.RenderMapping}
  and make sure each handler method returns a string that matches the
  name of a template to render. Here are the sample's render request
  handler methods:

\begin{verbatim}
@RenderMapping
public String prepareView() {
    return "user";
}

@RenderMapping(params = "javax.portlet.action=success")
public String showGreeting(ModelMap modelMap) {

    DateFormat dateFormat = new SimpleDateFormat("EEEE, MMMM d, yyyy G");

    Calendar todayCalendar = Calendar.getInstance();

    modelMap.put("todaysDate", dateFormat.format(todayCalendar.getTime()));

    return "greeting";
}
\end{verbatim}

  The \texttt{@RenderMapping} annotation causes the \texttt{prepareView}
  method above to be invoked if no other handler methods match the
  request. \texttt{prepareView} renders the \texttt{user} template
  (i.e., \texttt{user.jspx}).

  The \texttt{@RenderMapping(params\ =\ "javax.portlet.action=success")}
  annotation causes the \texttt{showGreeting} method to be invoked if
  the render request has the parameter setting
  \texttt{javax.portlet.action=success}. \texttt{showGreeting} renders
  the \texttt{greeting} template (i.e., \texttt{greeting.jspx}).
\item
  In your Controller, apply \texttt{@ActionMapping} annotations to your
  portlet action request handling methods. Import the annotation
  \texttt{com.liferay.portletmvc4spring.bind.annotation.ActionMapping}.

  The sample Controller's action handler method below is annotated with
  \texttt{@ActionMapping}, making it the default action handler if no
  other action handlers match the request. Since this portlet only has
  one action handler, the \texttt{submitApplicant} method handles all of
  the portlet's action requests.

\begin{verbatim}
@ActionMapping
public void submitApplicant(@ModelAttribute("user") User user, BindingResult bindingResult, ModelMap modelMap,
                            Locale locale, ActionResponse actionResponse, SessionStatus sessionStatus) {

    localValidatorFactoryBean.validate(user, bindingResult);

    if (!bindingResult.hasErrors()) {

        if (logger.isDebugEnabled()) {
            logger.debug("firstName=" + user.getFirstName());
            logger.debug("lastName=" + user.getLastName());
        }

        MutableRenderParameters mutableRenderParameters = actionResponse.getRenderParameters();

        mutableRenderParameters.setValue("javax.portlet.action", "success");

        sessionStatus.setComplete();
    }
}
\end{verbatim}

  The
  \href{https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/ModelAttribute.html}{\texttt{@ModelAttribute}}
  annotation in method parameter
  \texttt{@ModelAttribute("user")\ User\ user} associates the View's
  \texttt{user} Model (comprising a first name and last name) to the
  \texttt{User} object passed to this method.

  Note, the \texttt{submitApplicant} method sets the
  \texttt{javax.portlet.action} render parameter to
  \texttt{success}---the previous render handler method
  \texttt{showGreeting} matches this request parameter.
\item
  Configure any additional resources and beans in the project's
  descriptors and Spring context files respectively. (See
  \href{/docs/7-2/reference/-/knowledge_base/r/portletmvc4spring-configuration-files}{PortletMVC4Spring
  Configuration Files} for details).
\item
  Build the project WAR using Gradle or Maven.
\item
  Deploy the WAR by copying it to your
  \texttt{{[}Liferay-Home{]}/deploy} folder.
\end{enumerate}

Liferay DXP logs the deployment and the portlet is now available in the
Liferay DXP UI. Find your portlet by selecting the \emph{Add} icon
(\includegraphics{./images/icon-add-app.png}) and navigating to
\emph{Widgets} and the category you specified to the Liferay Bundle
Generator (\emph{Sample} is the default category).

Congratulations! You created and deployed a PortletMVC4Spring Portlet.

\section{Related Topics}\label{related-topics-9}

\href{/docs/7-2/reference/-/knowledge_base/r/portletmvc4spring-project-anatomy}{PortletMVC4Spring
Project Anatomy}

\href{/docs/7-2/reference/-/knowledge_base/r/portletmvc4spring-annotations}{PortletMVC4Spring
Annotations}

\href{/docs/7-2/reference/-/knowledge_base/r/portletmvc4spring-configuration-files}{PortletMVC4Spring
Configuration Files}

\href{/docs/7-2/appdev/-/knowledge_base/a/migrating-to-portletmvc4spring}{Migrating
to PortletMVC4Spring}

\chapter{Migrating to
PortletMVC4Spring}\label{migrating-to-portletmvc4spring}

To continue developing a portlet to use Spring Framework version 5.0
onward, migrate it from Spring Portlet MVC to
\href{/docs/7-2/appdev/-/knowledge_base/a/portletmvc4spring}{PortletMVC4Spring}.
Here are the steps:

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\item
  In your \texttt{pom.xml} or \texttt{build.gradle} descriptor, use the
  Spring Framework version 5.1.x artifacts by replacing dependencies on
  the \texttt{spring-webmvc-portlet} artifact with the
  \texttt{com.liferay.portletmvc4spring.framework} artifact.

  Maven:

\begin{verbatim}
<dependency>
    <groupId>com.liferay.portletmvc4spring</groupId>
    <artifactId>com.liferay.portletmvc4spring.framework</artifactId>
    <version>5.1.0</version>    
</dependency>
<dependency>
    <groupId>com.liferay.portletmvc4spring</groupId>
    <artifactId>com.liferay.portletmvc4spring.security</artifactId>
    <version>5.1.0</version>    
</dependency>
\end{verbatim}

  Gradle:

\begin{verbatim}
compile group: 'com.liferay.portletmvc4spring', name: 'com.liferay.portletmvc4spring.framework', version: '5.1.0'
compile group: 'com.liferay.portletmvc4spring', name: 'com.liferay.portletmvc4spring.security', version: '5.1.0'
\end{verbatim}
\item
  In your \texttt{WEB-INF/portlet.xml} descriptor, replace uses of
  \texttt{org.springframework.web.portlet.DispatcherPortlet} with
  \href{https://liferay.github.io/portletmvc4spring/apidocs/com/liferay/portletmvc4spring/DispatcherPortlet.html}{\texttt{com.liferay.portletmvc4spring.DispatcherPortlet}}.
\item
  Replace uses of the Spring Portlet MVC
  \href{https://docs.spring.io/spring-framework/docs/4.3.4.RELEASE/javadoc-api/org/springframework/web/portlet/mvc/annotation/AnnotationMethodHandlerAdapter.html}{\texttt{AnnotationMethodHandlerAdapter}}
  class with the PortletMVC4Spring
  \href{https://liferay.github.io/portletmvc4spring/apidocs/com/liferay/portletmvc4spring/mvc/method/annotation/PortletRequestMappingHandlerAdapter.html}{\texttt{PortletRequestMappingHandlerAdapter}}
  class. \texttt{PortletRequestMappingHandlerAdapter} uses the
  \texttt{HandlerMethod} infrastructure that
  \href{https://docs.spring.io/spring/docs/5.1.x/spring-framework-reference/web.html\#spring-web}{Spring
  Web MVC 5.1.x} is based on.
\item
  If you specified \texttt{AnnotationMethodHandlerAdapter} as a
  \texttt{\textless{}bean\textgreater{}} in a Spring configuration
  descriptor, replace its fully-qualified class name
  \texttt{org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter}
  with
  \texttt{com.liferay.portletmvc4spring.mvc.method.annotation.PortletRequestMappingHandlerAdapter}.

  Also address these bean property changes:

  \begin{itemize}
  \item
    \href{https://docs.spring.io/spring-framework/docs/4.3.4.RELEASE/javadoc-a
Download .txt
Showing preview only (302K chars total). Download the full file or copy to clipboard to get everything.
gitextract_40y6mjuc/

├── .gitattributes
├── .gitignore
├── README.markdown
├── bin/
│   ├── convert-markdown.sh
│   ├── convert.bat
│   ├── convert.sh
│   ├── migrate.py
│   ├── update-liferay-learn-links.sh
│   ├── update-markdown-sidebar-syntax-win.sh
│   └── update-markdown-sidebar-syntax.sh
├── book/
│   ├── developer/
│   │   ├── appdev.aux
│   │   ├── appdev.tex
│   │   ├── customization.aux
│   │   ├── customization.tex
│   │   ├── frameworks.aux
│   │   ├── frameworks.tex
│   │   ├── publish.tex
│   │   ├── reference.aux
│   │   ├── reference.tex
│   │   ├── tutorials.aux
│   │   └── tutorials.tex
│   ├── developing-liferay-dxp-72.tex
│   ├── readme.md
│   ├── user/
│   │   ├── deployment.aux
│   │   ├── deployment.tex
│   │   ├── user.aux
│   │   └── user.tex
│   └── using-liferay-dxp-72.tex
├── build-common.xml
├── build.properties
├── build.xml
├── code/
│   ├── liferay-book-utils/
│   │   ├── .pydevproject
│   │   └── src/
│   │       ├── fix-latex.py
│   │       ├── format-ebook.py
│   │       └── merge-books.py
│   ├── liferay-doc-utils/
│   │   ├── .gitignore
│   │   ├── build.xml
│   │   ├── lib/
│   │   │   ├── ant-1-8-2.jar
│   │   │   ├── com.liferay.knowledge.base.markdown.converter.api.jar
│   │   │   ├── com.liferay.knowledge.base.markdown.converter.impl.jar
│   │   │   ├── commons-io-2.0.1.jar
│   │   │   ├── freemarker.jar
│   │   │   ├── jaxen-1.1.6.jar
│   │   │   ├── jdom-2.0.6.jar
│   │   │   ├── one-jar-appgen-0.97.jar
│   │   │   ├── serializer-2.7.2.jar
│   │   │   ├── xalan-2.7.2.jar
│   │   │   ├── xercesImpl.jar
│   │   │   └── xml-apis.jar
│   │   └── src/
│   │       └── com/
│   │           └── liferay/
│   │               └── documentation/
│   │                   ├── movedclassreporter/
│   │                   │   ├── BasicClassInfo.java
│   │                   │   ├── MovedClassInfo.java
│   │                   │   ├── MovedClassReporterMain.java
│   │                   │   ├── TemplateProcessor.java
│   │                   │   └── dependencies/
│   │                   │       └── moved-classes.ftl
│   │                   └── util/
│   │                       ├── AddTOCTask.java
│   │                       ├── CheckArticleImagesTask.java
│   │                       ├── CheckHeadersTask.java
│   │                       ├── CheckImageUtil.java
│   │                       ├── CheckImagesTask.java
│   │                       ├── CheckIntrosTask.java
│   │                       ├── CheckLatestCommitTask.java
│   │                       ├── CheckLinksTask.java
│   │                       ├── CleanImages.java
│   │                       ├── ConcatMarkdownTask.java
│   │                       ├── ConvertHeadersTask.java
│   │                       ├── ConvertLinksTask.java
│   │                       ├── ConvertSidebarsTask.java
│   │                       ├── DistDiffTask.java
│   │                       ├── DocsUtil.java
│   │                       ├── FindParentIntros.java
│   │                       ├── GitCompare.java
│   │                       ├── MarkdownToHtml.java
│   │                       ├── NumberHeadersTask.java
│   │                       └── NumberImagesTask.java
│   └── sample-content-portlet-lr-workspace/
│       ├── .gitignore
│       ├── build.gradle
│       ├── configs/
│       │   ├── common/
│       │   │   └── .touch
│       │   ├── dev/
│       │   │   └── portal-ext.properties
│       │   ├── local/
│       │   │   └── portal-ext.properties
│       │   ├── prod/
│       │   │   ├── osgi/
│       │   │   │   └── configs/
│       │   │   │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.cfg
│       │   │   └── portal-ext.properties
│       │   └── uat/
│       │       ├── osgi/
│       │       │   └── configs/
│       │       │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.cfg
│       │       └── portal-ext.properties
│       ├── gradle/
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       ├── modules/
│       │   ├── .touch
│       │   └── com.liferay.docs.samplecontent/
│       │       ├── README.markdown
│       │       ├── bnd.bnd
│       │       ├── build.gradle
│       │       └── src/
│       │           └── main/
│       │               ├── java/
│       │               │   └── com/
│       │               │       └── liferay/
│       │               │           └── docs/
│       │               │               └── samplecontent/
│       │               │                   └── portlet/
│       │               │                       └── SampleContentPortlet.java
│       │               └── resources/
│       │                   ├── META-INF/
│       │                   │   └── resources/
│       │                   │       ├── init.jsp
│       │                   │       └── view.jsp
│       │                   ├── content/
│       │                   │   └── Language.properties
│       │                   ├── organizations.json
│       │                   ├── user-groups.json
│       │                   └── users.json
│       ├── settings.gradle
│       └── themes/
│           └── .touch
├── copyright.txt
├── en/
│   ├── build.xml
│   ├── deployment/
│   │   ├── articles/
│   │   │   ├── 01-deploying-liferay/
│   │   │   │   ├── 01-deploying-liferay-intro.markdown
│   │   │   │   ├── 02-obtaining-liferay.markdown
│   │   │   │   ├── 03-preparing-for-install.markdown
│   │   │   │   ├── 04-installing-liferay.markdown
│   │   │   │   ├── 05-installing-liferay-on-tomcat.markdown
│   │   │   │   ├── 06-installing-liferay-portal-on-wildfly.markdown
│   │   │   │   ├── 12-setting-up-marketplace-and-portal-security.markdown
│   │   │   │   └── 14-document-repository-configuration/
│   │   │   │       ├── 00-document-repository-configuration-intro.markdown
│   │   │   │       ├── 01-using-simple-file-system-store.markdown
│   │   │   │       ├── 02-using-advanced-file-system-store.markdown
│   │   │   │       ├── 03-using-s3-store.markdown
│   │   │   │       └── 04-using-the-dbstore.markdown
│   │   │   ├── 02-configuring-liferay/
│   │   │   │   ├── 01-configuring-liferay-portal-intro.markdown
│   │   │   │   ├── 02-configuring-mail.markdown
│   │   │   │   ├── 03-locales-and-encoding.markdown
│   │   │   │   ├── 04-liferay-portal-clustering/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   ├── 02-point-all-nodes-to-the-same-liferay-portal-database.markdown
│   │   │   │   │   ├── 03-configure-documents-and-media-the-same-for-all-nodes.markdown
│   │   │   │   │   ├── 04-clustering-search.markdown
│   │   │   │   │   ├── 05-enabling-cluster-link.markdown
│   │   │   │   │   └── 06-auto-deploy-to-all-nodes.markdown
│   │   │   │   ├── 05-updating-a-cluster/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   ├── 02-using-rolling-restarts.markdown
│   │   │   │   │   └── 03-other-cluster-update-techniques.markdown
│   │   │   │   ├── 06-configuring-remote-staging-clustered.markdown
│   │   │   │   └── 07-content-delivery-network.markdown
│   │   │   ├── 03-installing-a-search-engine/
│   │   │   │   ├── 01-intro.markdown
│   │   │   │   ├── 02-elasticsearch/
│   │   │   │   │   ├── 01-elasticsearch-intro.markdown
│   │   │   │   │   ├── 02-preparing-to-install.markdown
│   │   │   │   │   ├── 03-installing-elasticsearch.markdown
│   │   │   │   │   ├── 04-configuring-the-connector.markdown
│   │   │   │   │   ├── 05-advanced-configuration.markdown
│   │   │   │   │   ├── 06-elasticsearch-connector-settings-reference.markdown
│   │   │   │   │   ├── 07-security.markdown
│   │   │   │   │   ├── 08-backing-up-es.markdown
│   │   │   │   │   ├── 09-upgrading-to-elasticsearch_65.markdown
│   │   │   │   │   ├── 10-upgrading-to-elasticsearch_68.markdown
│   │   │   │   │   └── 11-upgrading-to-elasticsearch-73.markdown
│   │   │   │   └── 03-solr/
│   │   │   │       ├── 01-installing-solr-intro.markdown
│   │   │   │       ├── 02-installing-solr-basic.markdown
│   │   │   │       ├── 03-installing-solr-solrcloud.markdown
│   │   │   │       └── 04-solr-settings.markdown
│   │   │   ├── 04-securing-liferay/
│   │   │   │   ├── 01-liferay-security-intro.markdown
│   │   │   │   ├── 02-logging-in-to-liferay.markdown
│   │   │   │   ├── 03-service-access-policies.markdown
│   │   │   │   ├── 04-auth-verifiers.markdown
│   │   │   │   ├── 05-ldap/
│   │   │   │   │   ├── 01-ldap-servers-intro.markdown
│   │   │   │   │   └── 02-configuring-ldap.markdown
│   │   │   │   ├── 06-token-based-authentication.markdown
│   │   │   │   ├── 07-openid-connect-authentication.markdown
│   │   │   │   ├── 08-openam-authentication.markdown
│   │   │   │   ├── 09-cas-authentication.markdown
│   │   │   │   ├── 11-ntlm-authentication.markdown
│   │   │   │   ├── 12-openid-authentication.markdown
│   │   │   │   ├── 13-kerberos.markdown
│   │   │   │   ├── 14-cors.markdown
│   │   │   │   ├── 15-antisamy.markdown
│   │   │   │   └── 15-oauth2/
│   │   │   │       ├── 01-oauth2-intro.markdown
│   │   │   │       ├── 02-scopes.markdown
│   │   │   │       └── 03-authorizing-access.markdown
│   │   │   ├── 05-upgrading-to-liferay-7-2/
│   │   │   │   ├── 01-upgrading-to-liferay-7-2-intro.markdown
│   │   │   │   ├── 02-planning-for-deprecated-apps.markdown
│   │   │   │   ├── 03-test-ugrading-a-liferay-backup-copy/
│   │   │   │   │   ├── 01-test-upgrading-a-liferay-backup-copy-intro.markdown
│   │   │   │   │   ├── 02-pruning-the-database.markdown
│   │   │   │   │   ├── 03-example-removing-intermediate-journal-article-versions.markdown
│   │   │   │   │   └── 04-upgrading-your-test-server-and-database.markdown
│   │   │   │   ├── 04-preparing-to-upgrade-the-liferay-database.markdown
│   │   │   │   ├── 05-preparing-a-new-liferay-server.markdown
│   │   │   │   ├── 06-upgrading-the-liferay-database/
│   │   │   │   │   ├── 01-upgrading-the-liferay-database-intro.markdown
│   │   │   │   │   ├── 02-tuning-for-the-data-upgrade.markdown
│   │   │   │   │   ├── 03-configuring-the-data-upgrade.markdown
│   │   │   │   │   ├── 04-upgrading-the-core-using-the-upgrade-tool.markdown
│   │   │   │   │   └── 05-upgrading-modules-using-gogo-shell.markdown
│   │   │   │   ├── 07-executing-post-upgrade-tasks.markdown
│   │   │   │   ├── 08-upgrading-a-sharded-environment.markdown
│   │   │   │   ├── 09-migrating-from-audience-targeting/
│   │   │   │   │   ├── 01-migrating-from-audience-targeting-intro.markdown
│   │   │   │   │   ├── 02-migrating-user-segments.markdown
│   │   │   │   │   └── 03-manually-migrating-from-audience-targeting.markdown
│   │   │   │   ├── 98-deprecated-apps-in-7-2-what-to-do.markdown
│   │   │   │   └── 99-apps-in-maintenance-mode.markdown
│   │   │   ├── 06-maintaining-liferay/
│   │   │   │   ├── 01-maintaining-liferay-intro.markdown
│   │   │   │   └── 02-backing-up-a-liferay-installation.markdown
│   │   │   ├── 07-monitoring-liferay/
│   │   │   │   ├── 01-monitoring-liferay-intro.markdown
│   │   │   │   └── 02-monitoring-gc-and-the-jvm.markdown
│   │   │   ├── 100-reference/
│   │   │   │   ├── 01-deployment-reference-intro.markdown
│   │   │   │   ├── 02-liferay-home.markdown
│   │   │   │   ├── 03-portal-properties.markdown
│   │   │   │   ├── 04-system-properties.markdown
│   │   │   │   └── 05-database-templates.markdown
│   │   │   └── 99-troubleshooting-deployments/
│   │   │       ├── 01-troubleshooting-deployments-intro.markdown
│   │   │       ├── database-not-ready.markdown
│   │   │       ├── sort-order-changed-with-different-database.markdown
│   │   │       └── using-files-to-config-components.markdown
│   │   ├── articles-dxp/
│   │   │   ├── 01-deploying-liferay/
│   │   │   │   ├── 07-installing-liferay-portal-on-jboss-eap.markdown
│   │   │   │   ├── 08-installing-liferay-on-weblogic.markdown
│   │   │   │   ├── 09-installing-liferay-on-websphere.markdown
│   │   │   │   ├── 11-activating-liferay-dxp.markdown
│   │   │   │   └── 13-trial-plugin-installation.markdown
│   │   │   ├── 02-configuring-liferay/
│   │   │   │   ├── 04-liferay-portal-clustering/
│   │   │   │   │   └── 04-clustering-search.markdown
│   │   │   │   └── 08-dxp-configuration-and-tuning/
│   │   │   │       ├── 01-intro.markdown
│   │   │   │       └── 02-jvm-tuning.markdown
│   │   │   ├── 03-installing-a-search-engine/
│   │   │   │   └── 03-enterprise-search/
│   │   │   │       ├── 01-les-intro.markdown
│   │   │   │       ├── 02-monitoring/
│   │   │   │       │   └── 01-monitoring-intro.markdown
│   │   │   │       └── 03-ltr/
│   │   │   │           ├── 01-learning-to-rank-intro.markdown
│   │   │   │           └── 02-configuring-learning-to-rank.markdown
│   │   │   ├── 04-securing-liferay/
│   │   │   │   └── 10-saml/
│   │   │   │       ├── 01-intro.markdown
│   │   │   │       ├── 02-setting-up-identity-provider.markdown
│   │   │   │       ├── 03-registering-a-service-provider.markdown
│   │   │   │       ├── 04-setting-up-service-provider.markdown
│   │   │   │       ├── 05-configuring-sp-and-idp-connections.markdown
│   │   │   │       └── 06-configuring-saml.markdown
│   │   │   ├── 06-maintaining-liferay/
│   │   │   │   └── 01-patching-liferay-dxp/
│   │   │   │       ├── 01-patching-liferay-dxp-intro.markdown
│   │   │   │       ├── 02-patching-basics/
│   │   │   │       │   └── 01-patching-basics-intro.markdown
│   │   │   │       ├── 03-using-the-patching-tool/
│   │   │   │       │   ├── 01-using-the-patching-tool-intro.markdown
│   │   │   │       │   ├── 02-installing-patches.markdown
│   │   │   │       │   └── 03-working-with-patches.markdown
│   │   │   │       ├── 04-configuring-the-patching-tool/
│   │   │   │       │   ├── 01-configuring-the-patching-tool-intro.markdown
│   │   │   │       │   ├── 02-patching-tool-basic-configuration.markdown
│   │   │   │       │   ├── 03-patching-tool-advanced-configuration.markdown
│   │   │   │       │   └── 04-installing-patches-on-the-liferay-war.markdown
│   │   │   │       └── 05-keeping-up-with-fix-packs/
│   │   │   │           └── 01-keeping-up-with-fix-packs-intro.markdown
│   │   │   ├── 08-lcs/
│   │   │   │   ├── 01-intro.markdown
│   │   │   │   ├── 02-getting-started.markdown
│   │   │   │   ├── 03-lcs-preconfiguration.markdown
│   │   │   │   ├── 04-registration.markdown
│   │   │   │   ├── 05-using-lcs/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   ├── 02-lcs-property-storage.markdown
│   │   │   │   │   ├── 03-managing-lcs-users.markdown
│   │   │   │   │   ├── 04-lcs-dashboard.markdown
│   │   │   │   │   ├── 05-lcs-environments.markdown
│   │   │   │   │   ├── 06-lcs-servers.markdown
│   │   │   │   │   ├── 07-lcs-account.markdown
│   │   │   │   │   ├── 08-lcs-subscriptions.markdown
│   │   │   │   │   └── 09-lcs-tokens.markdown
│   │   │   │   └── 06-lcs-troubleshooting.markdown
│   │   │   └── 100-reference/
│   │   │       ├── 06-comparing-patch-levels.markdown
│   │   │       └── 07-patching-tool-configuration-properties.markdown
│   │   ├── build.xml
│   │   └── drawings/
│   │       ├── README.markdown
│   │       ├── kerberos.odg
│   │       ├── oauth-flow.odg
│   │       └── patch-war-file-folder-structure.odg
│   ├── developer/
│   │   ├── appdev/
│   │   │   ├── articles/
│   │   │   │   ├── 01-application-development/
│   │   │   │   │   └── 01-application-development-intro.markdown
│   │   │   │   ├── 02-web-front-ends/
│   │   │   │   │   ├── 01-web-front-ends-intro.markdown
│   │   │   │   │   ├── 02-angular-widget/
│   │   │   │   │   │   └── 01-developing-an-angular-application-intro.markdown
│   │   │   │   │   ├── 03-react-widget/
│   │   │   │   │   │   └── 01-developing-react-application-intro.markdown
│   │   │   │   │   ├── 04-vue-widget/
│   │   │   │   │   │   └── 01-developing-a-vue-application-intro.markdown
│   │   │   │   │   ├── 05-liferay-mvc-portlet/
│   │   │   │   │   │   ├── 01-liferay-mvc-portlet-intro.markdown
│   │   │   │   │   │   ├── 02-creating-an-mvc-portlet.markdown
│   │   │   │   │   │   ├── 03-writing-mvc-portlet-controller-code.markdown
│   │   │   │   │   │   ├── 04-configuring-the-view-layer.markdown
│   │   │   │   │   │   ├── 05-mvc-action-command.markdown
│   │   │   │   │   │   ├── 06-mvc-render-command.markdown
│   │   │   │   │   │   └── 07-mvc-resource-command.markdown
│   │   │   │   │   ├── 06-portletmvc4pring/
│   │   │   │   │   │   ├── 01-portlet-mvc-for-spring-intro.markdown
│   │   │   │   │   │   ├── 02-developing-a-portlet-using-portletmvc4spring.markdown
│   │   │   │   │   │   └── 99-migrating-to-portletmvc4spring.markdown
│   │   │   │   │   ├── 07-jsf-portlet/
│   │   │   │   │   │   ├── 01-jsf-portlet-intro.markdown
│   │   │   │   │   │   └── 02-developing-a-jsf-portlet-application.markdown
│   │   │   │   │   └── 08-bean-portlet/
│   │   │   │   │       ├── 01-bean-portlet-intro.markdown
│   │   │   │   │       └── 02-creating-a-bean-portlet.markdown
│   │   │   │   ├── 03-service-builder/
│   │   │   │   │   ├── 01-service-builder-intro.markdown
│   │   │   │   │   ├── 02-creating-a-service-builder-project/
│   │   │   │   │   │   └── 02-creating-a-service-builder-project-intro.markdown
│   │   │   │   │   ├── 03-creating-o-r-map/
│   │   │   │   │   │   ├── 01-creating-the-service-xml-file-intro.markdown
│   │   │   │   │   │   ├── 03-defining-global-service-info/
│   │   │   │   │   │   │   └── 01-defining-global-service-information-intro.markdown
│   │   │   │   │   │   ├── 04-defining-service-entities/
│   │   │   │   │   │   │   └── 01-defining-service-entities-intro.markdown
│   │   │   │   │   │   ├── 05-defining-columns-and-attribs/
│   │   │   │   │   │   │   └── 01-defining-the-columns-attributes-for-each-service-entity-intro.markdown
│   │   │   │   │   │   ├── 06-defining-relationships-between-entities/
│   │   │   │   │   │   │   └── 01-defining-relationships-between-service-entities-intro.markdown
│   │   │   │   │   │   ├── 07-defining-service-entity-instance-order/
│   │   │   │   │   │   │   └── 01-defining-ordering-of-service-entity-instances-intro.markdown
│   │   │   │   │   │   ├── 08-defining-service-entity-finder-methods/
│   │   │   │   │   │   │   └── 01-defining-service-entity-finder-methods-intro.markdown
│   │   │   │   │   │   ├── 09-running-service-builder/
│   │   │   │   │   │   │   └── 01-running-service-builder-and-understanding-the-generated-code-intro.markdown
│   │   │   │   │   │   ├── 10-understanding-the-code-service-builder-generates/
│   │   │   │   │   │   │   └── 01-understanding-the-code-generated-by-service-builder-intro.markdown
│   │   │   │   │   │   ├── 11-iterative-development/
│   │   │   │   │   │   │   └── 01-iterative-development-intro.markdown
│   │   │   │   │   │   ├── 12-customizing-model-entities-with-model-hints/
│   │   │   │   │   │   │   └── 01-customizing-model-entities-with-model-hints-intro.markdown
│   │   │   │   │   │   ├── 13-configuring-service-properties/
│   │   │   │   │   │   │   └── 01-configuring-service-properties-intro.markdown
│   │   │   │   │   │   ├── 98-connecting-service-builder-to-an-external-database/
│   │   │   │   │   │   │   ├── 01-connecting-service-builder-to-an-external-database-intro.markdown
│   │   │   │   │   │   │   ├── 02-datasource-connect-using-a-datasourceprovider.markdown
│   │   │   │   │   │   │   └── 03-datasource-connect-using-spring-beans.markdown
│   │   │   │   │   │   └── 99-migrating-a-service-builder-module-from-spring-di-to-osgi-ds/
│   │   │   │   │   │       └── 01-migrating-a-service-builder-module-from-spring-di-to-osgi-ds-intro.markdown
│   │   │   │   │   ├── 04-business-logic-with-service-builder/
│   │   │   │   │   │   ├── 01-business-logic-with-service-builder-intro.markdown
│   │   │   │   │   │   ├── 02-creating-local-services/
│   │   │   │   │   │   │   ├── 01-implementing-an-add-method-intro.markdown
│   │   │   │   │   │   │   ├── 02-implementing-an-update-method.markdown
│   │   │   │   │   │   │   ├── 03-implementing-methods-to-get-and-count-entities.markdown
│   │   │   │   │   │   │   ├── 04-implementing-any-other-business-logic.markdown
│   │   │   │   │   │   │   └── 05-integrating-with-liferay-frameworks.markdown
│   │   │   │   │   │   ├── 03-invoking-local-services.markdown
│   │   │   │   │   │   └── 04-invoking-services-from-spring-service-builder-code.markdown
│   │   │   │   │   └── 09-advanced-queries/
│   │   │   │   │       ├── 01-advanced-query-intro.markdown
│   │   │   │   │       ├── 02-custom-sql.markdown
│   │   │   │   │       ├── 03-defining-a-custom-finder-method.markdown
│   │   │   │   │       ├── 03-dynamic-query.markdown
│   │   │   │   │       ├── 05-accessing-your-custom-finder-method-from-the-service-layer.markdown
│   │   │   │   │       └── 06-actionable-dynamic-query.markdown
│   │   │   │   ├── 04-rest-builder/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   └── 02-generating-apis-rest-builder.markdown
│   │   │   │   └── 99-troubleshooting-application-development-issues/
│   │   │   │       ├── 01-troubleshooting-application-development-issues-intro.markdown
│   │   │   │       ├── adjusting-module-logging.markdown
│   │   │   │       ├── artifact-versions-dependencies.markdown
│   │   │   │       ├── bsn-naming-syntax-issues.markdown
│   │   │   │       ├── calling-osgi-services-instead-of-static-service-utils.markdown
│   │   │   │       ├── connecting-to-jndi-data-sources.markdown
│   │   │   │       ├── detecting-unresolved-osgi-components.markdown
│   │   │   │       ├── disabling-cache-on-table-mapper-tables.markdown
│   │   │   │       ├── implementing-logging.markdown
│   │   │   │       ├── optional-imports.markdown
│   │   │   │       ├── resolving-bundle-requirements.markdown
│   │   │   │       ├── resolving-cnfe-and-cdnfe-in-osgi-bundles.markdown
│   │   │   │       ├── system-check.markdown
│   │   │   │       └── troubleshooting-front-end-dev.markdown
│   │   │   ├── build.xml
│   │   │   └── code/
│   │   │       ├── angular-guestbook/
│   │   │       │   ├── after/
│   │   │       │   │   └── my-angular-guestbook/
│   │   │       │   │       ├── .gitignore
│   │   │       │   │       ├── .npmbuildrc
│   │   │       │   │       ├── .npmbundlerrc
│   │   │       │   │       ├── README.md
│   │   │       │   │       ├── assets/
│   │   │       │   │       │   ├── .placeholder
│   │   │       │   │       │   ├── app/
│   │   │       │   │       │   │   ├── add-entry.component.html
│   │   │       │   │       │   │   ├── app.component.html
│   │   │       │   │       │   │   └── view-guestbook.component.html
│   │   │       │   │       │   └── css/
│   │   │       │   │       │       ├── add-entry.component.css
│   │   │       │   │       │       ├── app.component.css
│   │   │       │   │       │       ├── styles.css
│   │   │       │   │       │       └── view-guestbook.component.css
│   │   │       │   │       ├── package.json
│   │   │       │   │       ├── src/
│   │   │       │   │       │   ├── app/
│   │   │       │   │       │   │   ├── add-entry/
│   │   │       │   │       │   │   │   ├── add-entry.component.spec.ts
│   │   │       │   │       │   │   │   └── add-entry.component.ts
│   │   │       │   │       │   │   ├── app-routing.module.ts
│   │   │       │   │       │   │   ├── app.component.spec.ts
│   │   │       │   │       │   │   ├── app.component.ts
│   │   │       │   │       │   │   ├── app.module.ts
│   │   │       │   │       │   │   ├── dynamic.loader.ts
│   │   │       │   │       │   │   ├── entry.service.spec.ts
│   │   │       │   │       │   │   ├── entry.service.ts
│   │   │       │   │       │   │   ├── guestbook-entry.ts
│   │   │       │   │       │   │   ├── in-memory-data.service.spec.ts
│   │   │       │   │       │   │   ├── in-memory-data.service.ts
│   │   │       │   │       │   │   ├── mock-guestbook-entries.ts
│   │   │       │   │       │   │   └── view-guestbook/
│   │   │       │   │       │   │       ├── view-guestbook.component.spec.ts
│   │   │       │   │       │   │       └── view-guestbook.component.ts
│   │   │       │   │       │   ├── index.ts
│   │   │       │   │       │   ├── polyfills.ts
│   │   │       │   │       │   └── types/
│   │   │       │   │       │       └── LiferayParams.ts
│   │   │       │   │       └── tsconfig.json
│   │   │       │   └── before/
│   │   │       │       └── angular-guestbook/
│   │   │       │           ├── .editorconfig
│   │   │       │           ├── .gitignore
│   │   │       │           ├── README.md
│   │   │       │           ├── angular.json
│   │   │       │           ├── e2e/
│   │   │       │           │   ├── protractor.conf.js
│   │   │       │           │   ├── src/
│   │   │       │           │   │   ├── app.e2e-spec.ts
│   │   │       │           │   │   └── app.po.ts
│   │   │       │           │   └── tsconfig.e2e.json
│   │   │       │           ├── package.json
│   │   │       │           ├── src/
│   │   │       │           │   ├── app/
│   │   │       │           │   │   ├── add-entry/
│   │   │       │           │   │   │   ├── add-entry.component.css
│   │   │       │           │   │   │   ├── add-entry.component.html
│   │   │       │           │   │   │   ├── add-entry.component.spec.ts
│   │   │       │           │   │   │   └── add-entry.component.ts
│   │   │       │           │   │   ├── app-routing.module.ts
│   │   │       │           │   │   ├── app.component.css
│   │   │       │           │   │   ├── app.component.html
│   │   │       │           │   │   ├── app.component.spec.ts
│   │   │       │           │   │   ├── app.component.ts
│   │   │       │           │   │   ├── app.module.ts
│   │   │       │           │   │   ├── entry.service.spec.ts
│   │   │       │           │   │   ├── entry.service.ts
│   │   │       │           │   │   ├── guestbook-entry.ts
│   │   │       │           │   │   ├── in-memory-data.service.spec.ts
│   │   │       │           │   │   ├── in-memory-data.service.ts
│   │   │       │           │   │   ├── mock-guestbook-entries.ts
│   │   │       │           │   │   └── view-guestbook/
│   │   │       │           │   │       ├── view-guestbook.component.css
│   │   │       │           │   │       ├── view-guestbook.component.html
│   │   │       │           │   │       ├── view-guestbook.component.spec.ts
│   │   │       │           │   │       └── view-guestbook.component.ts
│   │   │       │           │   ├── assets/
│   │   │       │           │   │   └── .gitkeep
│   │   │       │           │   ├── browserslist
│   │   │       │           │   ├── environments/
│   │   │       │           │   │   ├── environment.prod.ts
│   │   │       │           │   │   └── environment.ts
│   │   │       │           │   ├── index.html
│   │   │       │           │   ├── karma.conf.js
│   │   │       │           │   ├── main.ts
│   │   │       │           │   ├── polyfills.ts
│   │   │       │           │   ├── styles.css
│   │   │       │           │   ├── test.ts
│   │   │       │           │   ├── tsconfig.app.json
│   │   │       │           │   ├── tsconfig.spec.json
│   │   │       │           │   └── tslint.json
│   │   │       │           ├── tsconfig.json
│   │   │       │           └── tslint.json
│   │   │       ├── react-guestbook/
│   │   │       │   ├── after/
│   │   │       │   │   └── react-guestbook-app-migrated/
│   │   │       │   │       ├── .babelrc
│   │   │       │   │       ├── .gitignore
│   │   │       │   │       ├── .npmbuildrc
│   │   │       │   │       ├── .npmbundlerrc
│   │   │       │   │       ├── README.md
│   │   │       │   │       ├── assets/
│   │   │       │   │       │   ├── .placeholder
│   │   │       │   │       │   └── css/
│   │   │       │   │       │       ├── App.css
│   │   │       │   │       │       ├── index.css
│   │   │       │   │       │       └── styles.css
│   │   │       │   │       ├── package.json
│   │   │       │   │       └── src/
│   │   │       │   │           ├── App.js
│   │   │       │   │           ├── App.test.js
│   │   │       │   │           ├── add-entry.js
│   │   │       │   │           ├── index.js
│   │   │       │   │           ├── serviceWorker.js
│   │   │       │   │           └── view-guestbook.js
│   │   │       │   └── before/
│   │   │       │       └── my-react-guestbook-app/
│   │   │       │           ├── .gitignore
│   │   │       │           ├── README.md
│   │   │       │           ├── package.json
│   │   │       │           ├── public/
│   │   │       │           │   ├── index.html
│   │   │       │           │   └── manifest.json
│   │   │       │           └── src/
│   │   │       │               ├── App.css
│   │   │       │               ├── App.js
│   │   │       │               ├── App.test.js
│   │   │       │               ├── add-entry.js
│   │   │       │               ├── index.css
│   │   │       │               ├── index.js
│   │   │       │               ├── serviceWorker.js
│   │   │       │               └── view-guestbook.js
│   │   │       └── vue-guestbook/
│   │   │           ├── after/
│   │   │           │   └── vue-guestbook-migrated/
│   │   │           │       ├── .babelrc
│   │   │           │       ├── .gitignore
│   │   │           │       ├── .npmbuildrc
│   │   │           │       ├── .npmbundlerrc
│   │   │           │       ├── README.md
│   │   │           │       ├── assets/
│   │   │           │       │   ├── .placeholder
│   │   │           │       │   └── css/
│   │   │           │       │       ├── custom.css
│   │   │           │       │       └── styles.css
│   │   │           │       ├── package.json
│   │   │           │       └── src/
│   │   │           │           ├── Api.js
│   │   │           │           ├── App.vue
│   │   │           │           ├── components/
│   │   │           │           │   ├── AddEntry.vue
│   │   │           │           │   └── ViewGuestbook.vue
│   │   │           │           └── index.js
│   │   │           └── before/
│   │   │               └── vue-guestbook/
│   │   │                   ├── .gitignore
│   │   │                   ├── README.md
│   │   │                   ├── babel.config.js
│   │   │                   ├── package.json
│   │   │                   ├── public/
│   │   │                   │   └── index.html
│   │   │                   └── src/
│   │   │                       ├── Api.js
│   │   │                       ├── App.vue
│   │   │                       ├── components/
│   │   │                       │   ├── AddEntry.vue
│   │   │                       │   └── ViewGuestbook.vue
│   │   │                       └── main.js
│   │   ├── build.xml
│   │   ├── customization/
│   │   │   ├── articles/
│   │   │   │   ├── 01-liferay-customization-intro.markdown
│   │   │   │   ├── 02-fundamentals/
│   │   │   │   │   ├── 01-fundamentals-intro.markdown
│   │   │   │   │   ├── 02-configuring-dependencies/
│   │   │   │   │   │   ├── 01-configuring-dependencies-intro.markdown
│   │   │   │   │   │   ├── 02-finding-artifacts.markdown
│   │   │   │   │   │   ├── 03-specifying-dependencies.markdown
│   │   │   │   │   │   ├── 04-resolving-third-party-library-package-dependencies.markdown
│   │   │   │   │   │   └── 05-understanding-excluded-jars.markdown
│   │   │   │   │   ├── 03-felix-gogo-shell/
│   │   │   │   │   │   └── 01-felix-gogo-shell-intro.markdown
│   │   │   │   │   ├── 04-importing-packages/
│   │   │   │   │   │   └── 01-importing-packages-intro.markdown
│   │   │   │   │   ├── 05-exporting-packages/
│   │   │   │   │   │   └── 01-exporting-packages-intro.markdown
│   │   │   │   │   ├── 06-semantic-versioning/
│   │   │   │   │   │   └── 01-semantic-versioning-intro.markdown
│   │   │   │   │   └── 07-deploying-wars-wab-generator/
│   │   │   │   │       └── 01-deploying-wars-wab-generator-intro.markdown
│   │   │   │   ├── 03-architecture/
│   │   │   │   │   ├── 01-architecture-intro.markdown
│   │   │   │   │   ├── 02-classloader-hierarchy.markdown
│   │   │   │   │   ├── 03-portal-startup-phases.markdown
│   │   │   │   │   ├── 04-benefits-of-modularity.markdown
│   │   │   │   │   ├── 05-osgi-and-modularity.markdown
│   │   │   │   │   ├── 06-module-lifecycle.markdown
│   │   │   │   │   ├── 06-ui-concepts/
│   │   │   │   │   │   ├── 01-ui-architecture-intro.markdown
│   │   │   │   │   │   ├── 02-theme-components.markdown
│   │   │   │   │   │   └── 03-understanding-the-page-layout.markdown
│   │   │   │   │   ├── 07-bundle-classloading-flow.markdown
│   │   │   │   │   └── 08-finding-extension-points.markdown
│   │   │   │   ├── 100-troubleshooting-customizations/
│   │   │   │   │   ├── 01-troubleshooting-customizations-intro.markdown
│   │   │   │   │   ├── jsp-fragment-unresolved-requirement.markdown
│   │   │   │   │   ├── jsp-fragments.markdown
│   │   │   │   │   └── using-osgi-services-from-ext-plugins.markdown
│   │   │   │   ├── 110-contributing/
│   │   │   │   │   └── 01-contributing-to-liferay-portal-intro.markdown
│   │   │   │   ├── 50-creating-model-listeners/
│   │   │   │   │   └── 01-creating-model-listeners-intro.markdown
│   │   │   │   ├── 50-customizing-jsps/
│   │   │   │   │   ├── 01-overriding-jsps-intro.markdown
│   │   │   │   │   ├── 02-customizing-jsps-with-dynamic-includes.markdown
│   │   │   │   │   ├── 03-jsp-overrides-using-portlet-filters.markdown
│   │   │   │   │   ├── 04-jsp-overrides-using-fragments.markdown
│   │   │   │   │   ├── 05-core-jsp-overrides-using-customjspbag.markdown
│   │   │   │   │   └── 06-overriding-inline-content-using-jsps.markdown
│   │   │   │   ├── 50-customizing-widgets/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   └── 02-implementing-widget-templates.markdown
│   │   │   │   ├── 50-dynamic-includes/
│   │   │   │   │   ├── 01-dynamic-include-extension-points-intro.markdown
│   │   │   │   │   ├── 02-wysiwyg-editor-dynamic-includes.markdown
│   │   │   │   │   ├── 03-top-head-jsp-dynamic-include.markdown
│   │   │   │   │   ├── 04-top-js-dynamic-include.markdown
│   │   │   │   │   └── 05-bottom-jsp-dynamic-include.markdown
│   │   │   │   ├── 50-lifecycle-events/
│   │   │   │   │   └── 01-waiting-on-lifecycle-events-intro.markdown
│   │   │   │   ├── 50-liferay-forms/
│   │   │   │   │   ├── 01-forms-intro.markdown
│   │   │   │   │   ├── 02-form-storage-adapters.markdown
│   │   │   │   │   └── 03-creating-form-storage-adapters.markdown
│   │   │   │   ├── 50-overriding-language-keys/
│   │   │   │   │   ├── 01-overriding-language-keys-intro.markdown
│   │   │   │   │   ├── 02-overriding-liferays-language-keys.markdown
│   │   │   │   │   └── 03-overriding-a-modules-language-keys.markdown
│   │   │   │   ├── 50-overriding-liferay-services/
│   │   │   │   │   └── 01-overriding-liferay-services-intro.markdown
│   │   │   │   ├── 50-overriding-lpkg-files/
│   │   │   │   │   └── 01-overriding-lpkg-files-intro.markdown
│   │   │   │   ├── 50-overriding-mvc-commands/
│   │   │   │   │   ├── 01-overriding-mvc-commands-intro.markdown
│   │   │   │   │   ├── 02-adding-logic-to-mvc-commands.markdown
│   │   │   │   │   ├── 03-overriding-mvcrendercommands.markdown
│   │   │   │   │   ├── 04-override-mvcactioncommands.markdown
│   │   │   │   │   └── 05-override-mvcresourcecommands.markdown
│   │   │   │   ├── 50-overriding-osgi-services/
│   │   │   │   │   ├── 01-overriding-osgi-services-intro.markdown
│   │   │   │   │   ├── 02-examining-an-service-to-override.markdown
│   │   │   │   │   ├── 03-creating-a-custom-osgi-service.markdown
│   │   │   │   │   └── 04-reconfiguring-components-to-use-your-osgi-service-reference.markdown
│   │   │   │   ├── 50-portlet-filters/
│   │   │   │   │   └── 01-portlet-filters-intro.markdown
│   │   │   │   ├── 50-product-navigation/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   ├── 02-customizing-the-product-menu/
│   │   │   │   │   │   ├── 01-customizing-the-product-menu-intro.markdown
│   │   │   │   │   │   ├── 02-adding-custom-panel-categories.markdown
│   │   │   │   │   │   └── 03-adding-custom-panel-apps.markdown
│   │   │   │   │   ├── 03-customizing-the-control-menu/
│   │   │   │   │   │   ├── 01-customizing-the-control-menu-intro.markdown
│   │   │   │   │   │   ├── 02-customizing-the-control-menu.markdown
│   │   │   │   │   │   └── 03-defining-icons-tooltips.markdown
│   │   │   │   │   ├── 04-extending-the-simulation-menu/
│   │   │   │   │   │   └── 01-extending-the-simulation-menu-intro.markdown
│   │   │   │   │   └── 05-providing-the-user-personal-bar/
│   │   │   │   │       ├── 01-customizing-the-user-personal-menu-intro.markdown
│   │   │   │   │       ├── 02-using-a-custom-portlet-as-the-user-personal-bar.markdown
│   │   │   │   │       └── 03-customizing-the-personal-menu.markdown
│   │   │   │   └── 99-customization-with-ext/
│   │   │   │       ├── 01-intro.markdown
│   │   │   │       ├── 02-customizing-core-functionality-with-ext/
│   │   │   │       │   ├── 01-intro.markdown
│   │   │   │       │   ├── 02-creating-an-ext-plugin.markdown
│   │   │   │       │   ├── 03-anatomy-of-an-ext-plugin.markdown
│   │   │   │       │   ├── 04-developing-an-ext-plugin.markdown
│   │   │   │       │   ├── 05-deploying-an-ext-plugin.markdown
│   │   │   │       │   └── 06-redeploying-an-ext-plugin.markdown
│   │   │   │       └── 03-customizing-osgi-modules-with-ext/
│   │   │   │           ├── 01-intro.markdown
│   │   │   │           ├── 02-creating-an-ext-module.markdown
│   │   │   │           ├── 03-developing-an-ext-module.markdown
│   │   │   │           └── 04-deploying-an-ext-module.markdown
│   │   │   ├── articles-dxp/
│   │   │   │   ├── 50-workflow/
│   │   │   │   │   ├── 01-workflow-intro.markdown
│   │   │   │   │   └── 02-sla-calendars.markdown
│   │   │   │   └── 99-customization-with-ext/
│   │   │   │       ├── 02-customizing-core-functionality-with-ext/
│   │   │   │       │   └── 01-intro.markdown
│   │   │   │       ├── 04-extending-core-classes-using-spring-with-ext-plugins.markdown
│   │   │   │       ├── 05-overriding-core-classes-with-ext-plugins.markdown
│   │   │   │       ├── 06-adding-to-the-web-xml-with-ext-plugins.markdown
│   │   │   │       └── 07-modifying-the-web-xml-with-ext-plugins.markdown
│   │   │   └── build.xml
│   │   ├── frameworks/
│   │   │   ├── articles/
│   │   │   │   ├── 01-frameworks-intro.markdown
│   │   │   │   ├── application-security/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   ├── 02-application-permissions/
│   │   │   │   │   │   ├── 01-application-permissions-intro.markdown
│   │   │   │   │   │   ├── 02-defining-permissions.markdown
│   │   │   │   │   │   ├── 03-registering-permissions.markdown
│   │   │   │   │   │   ├── 04-associate-permissions-resources.markdown
│   │   │   │   │   │   ├── 05-check-permissions.markdown
│   │   │   │   │   │   └── 06-using-portal-roles-in-a-portlet.markdown
│   │   │   │   │   ├── 04-authentication-pipelines/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── 02-auto-login.markdown
│   │   │   │   │   │   ├── 03-authentication-pipelines.markdown
│   │   │   │   │   │   └── 04-custom-login-portlet.markdown
│   │   │   │   │   └── 06-service-access-policies.markdown
│   │   │   │   ├── assets/
│   │   │   │   │   ├── 01-asset-framework-intro.markdown
│   │   │   │   │   ├── 02-adding-updating-and-deleting-assets.markdown
│   │   │   │   │   ├── 03-rendering-an-asset/
│   │   │   │   │   │   ├── 01-creating-asset-renderer-intro.markdown
│   │   │   │   │   │   ├── 02-jsp-templates-asset-renderer.markdown
│   │   │   │   │   │   └── 03-creating-factory-asset-renderer.markdown
│   │   │   │   │   ├── 04-entering-and-displaying-tags-and-categories.markdown
│   │   │   │   │   ├── 05-relating-assets.markdown
│   │   │   │   │   └── 06-implementing-asset-priority.markdown
│   │   │   │   ├── back-end-frameworks/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   ├── 02-creating-portlet-providers.markdown
│   │   │   │   │   ├── 03-retrieving-portlets.markdown
│   │   │   │   │   ├── 04-enabling-accessing-scopes.markdown
│   │   │   │   │   └── 05-message-bus/
│   │   │   │   │       ├── 01-intro.markdown
│   │   │   │   │       ├── 02-creating-destination.markdown
│   │   │   │   │       ├── 03-message-bus-event-listeners.markdown
│   │   │   │   │       ├── 04-registering-message-listeners.markdown
│   │   │   │   │       ├── 05-creating-a-message.markdown
│   │   │   │   │       ├── 06-sending-a-message.markdown
│   │   │   │   │       └── 07-sending-messages-cluster.markdown
│   │   │   │   ├── cache-configuration/
│   │   │   │   │   ├── 01-cache-configuration-intro.markdown
│   │   │   │   │   ├── 02-overriding-cache.markdown
│   │   │   │   │   └── 03-caching-data.markdown
│   │   │   │   ├── collaboration/
│   │   │   │   │   ├── 00-intro.markdown
│   │   │   │   │   ├── 01-item-selector/
│   │   │   │   │   │   ├── 00-intro.markdown
│   │   │   │   │   │   ├── 01-selecting-entities.markdown
│   │   │   │   │   │   ├── 02-creating-criterion-return-types.markdown
│   │   │   │   │   │   └── 03-creating-custom-views.markdown
│   │   │   │   │   ├── 02-documents-media-api/
│   │   │   │   │   │   ├── 00-intro.markdown
│   │   │   │   │   │   ├── 01-creating-entities/
│   │   │   │   │   │   │   ├── 00-intro.markdown
│   │   │   │   │   │   │   ├── 01-creating-files.markdown
│   │   │   │   │   │   │   ├── 02-creating-folders.markdown
│   │   │   │   │   │   │   └── 03-creating-file-shortcuts.markdown
│   │   │   │   │   │   ├── 02-deleting-entities/
│   │   │   │   │   │   │   ├── 00-intro.markdown
│   │   │   │   │   │   │   ├── 01-deleting-files.markdown
│   │   │   │   │   │   │   ├── 02-deleting-file-versions.markdown
│   │   │   │   │   │   │   ├── 03-deleting-file-shortcuts.markdown
│   │   │   │   │   │   │   ├── 04-deleting-folders.markdown
│   │   │   │   │   │   │   └── 05-moving-to-recycle-bin.markdown
│   │   │   │   │   │   ├── 03-updating-entities/
│   │   │   │   │   │   │   ├── 00-intro.markdown
│   │   │   │   │   │   │   ├── 01-updating-files.markdown
│   │   │   │   │   │   │   ├── 02-updating-folders.markdown
│   │   │   │   │   │   │   └── 03-updating-file-shortcuts.markdown
│   │   │   │   │   │   ├── 04-file-checkout/
│   │   │   │   │   │   │   ├── 00-intro.markdown
│   │   │   │   │   │   │   ├── 01-file-checkout.markdown
│   │   │   │   │   │   │   ├── 02-file-checkin.markdown
│   │   │   │   │   │   │   └── 03-cancel-checkout.markdown
│   │   │   │   │   │   ├── 05-copying-moving-entities/
│   │   │   │   │   │   │   ├── 00-intro.markdown
│   │   │   │   │   │   │   ├── 01-copying-folders.markdown
│   │   │   │   │   │   │   └── 02-moving-folders-files.markdown
│   │   │   │   │   │   └── 06-getting-entities/
│   │   │   │   │   │       ├── 00-intro.markdown
│   │   │   │   │   │       ├── 01-getting-files.markdown
│   │   │   │   │   │       ├── 02-getting-folders.markdown
│   │   │   │   │   │       └── 03-getting-multiple-types.markdown
│   │   │   │   │   ├── 03-adaptive-media/
│   │   │   │   │   │   ├── 00-intro.markdown
│   │   │   │   │   │   ├── 01-displaying-adapted-images.markdown
│   │   │   │   │   │   ├── 02-finding-adapted-images.markdown
│   │   │   │   │   │   └── 03-image-scaler.markdown
│   │   │   │   │   └── 05-social-api/
│   │   │   │   │       ├── 00-intro.markdown
│   │   │   │   │       ├── 01-applying-social-bookmarks.markdown
│   │   │   │   │       ├── 02-creating-social-bookmarks.markdown
│   │   │   │   │       ├── 03-adding-comments.markdown
│   │   │   │   │       ├── 05-rating-assets.markdown
│   │   │   │   │       ├── 09-rating-type-selection.markdown
│   │   │   │   │       ├── 10-customizing-rating-transformation.markdown
│   │   │   │   │       └── 11-flagging-assets.markdown
│   │   │   │   ├── configuration/
│   │   │   │   │   ├── 01-configuration-intro.markdown
│   │   │   │   │   ├── 02-creating-a-configuration-interface.markdown
│   │   │   │   │   ├── 03-categorizing-configurations.markdown
│   │   │   │   │   ├── 04-scoping-configurations.markdown
│   │   │   │   │   ├── 05-reading-configurations-configuration-provider.markdown
│   │   │   │   │   ├── 06-reading-configurations-portlet.markdown
│   │   │   │   │   ├── 07-reading-configurations-component.markdown
│   │   │   │   │   ├── 08-customizing-the-ui/
│   │   │   │   │   │   ├── 01-customizing-the-configuration-user-interface-intro.markdown
│   │   │   │   │   │   ├── 02-configuration-form-renderer.markdown
│   │   │   │   │   │   └── 03-configuration-forms.markdown
│   │   │   │   │   ├── 10-upgrading-a-legacy-app.markdown
│   │   │   │   │   └── 11-dynamically-populating-select-fields.markdown
│   │   │   │   ├── content-publication-management/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   ├── 02-export-import/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── 02-developing-staged-models/
│   │   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   │   ├── 02-generating-staged-models-using-service-builder.markdown
│   │   │   │   │   │   │   └── 03-creating-staged-models-manually.markdown
│   │   │   │   │   │   ├── 03-developing-data-handlers/
│   │   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   │   ├── 02-creating-portlet-data-handlers.markdown
│   │   │   │   │   │   │   └── 03-creating-staged-model-data-handlers.markdown
│   │   │   │   │   │   ├── 04-providing-entity-specific-local-services-for-export-import/
│   │   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   │   ├── 02-implementing-the-staged-model-repository-framework.markdown
│   │   │   │   │   │   │   └── 03-using-the-staged-model-repository-framework.markdown
│   │   │   │   │   │   ├── 05-using-the-export-import-lifecycle-listener-framework.markdown
│   │   │   │   │   │   └── 06-initiating-new-export-import-processes.markdown
│   │   │   │   │   └── 03-staging/
│   │   │   │   │       └── 01-intro.markdown
│   │   │   │   ├── dependency-injection/
│   │   │   │   │   ├── 01-dependency-injection-intro.markdown
│   │   │   │   │   ├── 02-cdi-dependency-injection.markdown
│   │   │   │   │   ├── declarative-services.markdown
│   │   │   │   │   ├── osgi-cdi-integration/
│   │   │   │   │   │   ├── 01-osgi-cdi-integration-intro.markdown
│   │   │   │   │   │   ├── 02-publishing-cdi-beans-as-osgi-services.markdown
│   │   │   │   │   │   └── 03-using-osgi-services-in-a-bean.markdown
│   │   │   │   │   ├── service-trackers-for-osgi-services.markdown
│   │   │   │   │   └── using-a-service-tracker.markdown
│   │   │   │   ├── friendly-urls/
│   │   │   │   │   ├── 01-friendly-urls-intro.markdown
│   │   │   │   │   └── 02-creating-friendly-urls.markdown
│   │   │   │   ├── front-end-development/
│   │   │   │   │   ├── 01-front-end-dev-intro.markdown
│   │   │   │   │   ├── 02-themes/
│   │   │   │   │   │   ├── 00-themes-intro.markdown
│   │   │   │   │   │   ├── 03-developing-themes/
│   │   │   │   │   │   │   ├── 01-developing-themes-intro.markdown
│   │   │   │   │   │   │   ├── 02-using-developer-mode-with-themes.markdown
│   │   │   │   │   │   │   ├── 03-building-themes.markdown
│   │   │   │   │   │   │   ├── 04-deploying-and-applying-themes.markdown
│   │   │   │   │   │   │   ├── 07-configuring-your-themes-app-server.markdown
│   │   │   │   │   │   │   ├── 09-automatically-deploying-theme-changes.markdown
│   │   │   │   │   │   │   ├── 10-creating-a-thumbnail-preview-for-your-theme.markdown
│   │   │   │   │   │   │   ├── 11-creating-color-schemes-for-your-theme.markdown
│   │   │   │   │   │   │   ├── 12-making-configurable-theme-settings.markdown
│   │   │   │   │   │   │   └── 13-using-font-awesome-glyph-icons-in-your-theme.markdown
│   │   │   │   │   │   ├── 04-extending-themes/
│   │   │   │   │   │   │   ├── 01-extending-themes-intro.markdown
│   │   │   │   │   │   │   ├── 02-installing-themelets-in-your-theme.markdown
│   │   │   │   │   │   │   ├── 03-injecting-additional-context-variables-into-your-templates.markdown
│   │   │   │   │   │   │   ├── 04-packaging-independent-ui-resources-for-your-site.markdown
│   │   │   │   │   │   │   ├── 05-changing-the-base-theme.markdown
│   │   │   │   │   │   │   ├── 06-copying-an-existing-themes-files.markdown
│   │   │   │   │   │   │   ├── 07-listing-your-themes-extensions.markdown
│   │   │   │   │   │   │   └── 08-overwriting-and-extending-liferay-theme-tasks.markdown
│   │   │   │   │   │   ├── 05-clay-and-themes/
│   │   │   │   │   │   │   ├── 01-clay-themes-intro.markdown
│   │   │   │   │   │   │   ├── 02-customizing-atlas-and-clay-themes.markdown
│   │   │   │   │   │   │   ├── 03-integrating-third-party-themes-with-clay.markdown
│   │   │   │   │   │   │   ├── 04-using-clay-icons-in-your-theme.markdown
│   │   │   │   │   │   │   └── 04-using-clay-mixins-in-your-theme.markdown
│   │   │   │   │   │   ├── 06-portlets-and-themes/
│   │   │   │   │   │   │   ├── 01-theming-portlets-intro.markdown
│   │   │   │   │   │   │   └── 02-embedding-portlets-in-themes/
│   │   │   │   │   │   │       ├── 01-embedding-portlets-in-themes-intro.markdown
│   │   │   │   │   │   │       ├── 02-embedding-portlets-in-themes-by-entity-type.markdown
│   │   │   │   │   │   │       ├── 03-embedding-portlets-in-a-theme-by-name.markdown
│   │   │   │   │   │   │       └── 04-setting-portlet-preferences-for-embedded-portlets.markdown
│   │   │   │   │   │   ├── 07-managing-theme-resources/
│   │   │   │   │   │   │   ├── 01-resources-importer-intro.markdown
│   │   │   │   │   │   │   ├── 02-creating-a-sitemap/
│   │   │   │   │   │   │   │   ├── 01-creating-a-sitemap-intro.markdown
│   │   │   │   │   │   │   │   ├── 02-defining-layout-templates-and-pages-in-a-sitemap.markdown
│   │   │   │   │   │   │   │   ├── 04-defining-portlets-in-a-sitemap.markdown
│   │   │   │   │   │   │   │   └── 05-retrieving-portlet-ids-with-gogo-shell.markdown
│   │   │   │   │   │   │   ├── 03-preparing-and-organizing-web-content/
│   │   │   │   │   │   │   │   └── 01-preparing-and-organizing-web-content-for-the-importer-intro.markdown
│   │   │   │   │   │   │   ├── 04-defining-assets/
│   │   │   │   │   │   │   │   └── 01-defining-assets-intro.markdown
│   │   │   │   │   │   │   ├── 05-where-to-import-resources/
│   │   │   │   │   │   │   │   └── 01-specifying-where-to-import-resources-intro.markdown
│   │   │   │   │   │   │   └── 06-creating-a-theme-lar/
│   │   │   │   │   │   │       └── 01-creating-an-archive-of-your-sites-themes-and-resources-intro.markdown
│   │   │   │   │   │   └── 10-troubleshooting-themes/
│   │   │   │   │   │       └── 01-troubleshooting-themes-intro.markdown
│   │   │   │   │   ├── 03-layout-templates/
│   │   │   │   │   │   ├── 00-layout-templates-intro.markdown
│   │   │   │   │   │   ├── 01-creating-custom-layout-template-thumbnail-previews.markdown
│   │   │   │   │   │   └── 02-including-layout-templates-with-a-theme.markdown
│   │   │   │   │   ├── 05-creating-js-widgets-with-js-tooling/
│   │   │   │   │   │   ├── 01-creating-widgets-with-javascript-tooling-intro.markdown
│   │   │   │   │   │   ├── 02-configuring-system-and-instance-settings-for-your-widget.markdown
│   │   │   │   │   │   ├── 04-localizing-your-widget.markdown
│   │   │   │   │   │   ├── 05-using-translation-features.markdown
│   │   │   │   │   │   └── 06-setting-portlet-properties-for-your-widget.markdown
│   │   │   │   │   └── 07-javascript-module-loaders/
│   │   │   │   │       ├── 01-javascript-module-loaders-intro.markdown
│   │   │   │   │       ├── 02-loading-amd-modules/
│   │   │   │   │       │   └── 01-loading-amd-modules-in-liferay-intro.markdown
│   │   │   │   │       ├── 03-using-external-libraries/
│   │   │   │   │       │   └── 01-using-external-libraries-intro.markdown
│   │   │   │   │       └── 04-loading-modules-with-aui-script-tag/
│   │   │   │   │           ├── 01-loading-modules-with-aui-script-intro.markdown
│   │   │   │   │           ├── 02-loading-aui-modules-with-aui.markdown
│   │   │   │   │           ├── 03-loading-es2015-and-metal-modules-with-aui-script-tag.markdown
│   │   │   │   │           ├── 04-loading-aui-es2015-metal-modules-with-aui.markdown
│   │   │   │   │           └── 05-loading-bundled-npm-modules-in-your-portlets.markdown
│   │   │   │   ├── info-framework/
│   │   │   │   │   ├── 01-the-info-framework-intro.markdown
│   │   │   │   │   ├── 02-creating-information-list-provider.markdown
│   │   │   │   │   ├── 03-creating-information-item-renderer.markdown
│   │   │   │   │   └── 04-custom-application-providers.markdown
│   │   │   │   ├── liferay-forms/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   └── 02-form-serialization/
│   │   │   │   │       ├── 01-intro.markdown
│   │   │   │   │       └── 02-serilaizing-forms.markdown
│   │   │   │   ├── localization/
│   │   │   │   │   ├── 01-localization-intro.markdown
│   │   │   │   │   ├── 02-localizing-your-application.markdown
│   │   │   │   │   ├── 03-localization-settings.markdown
│   │   │   │   │   ├── 04-creating-language-module.markdown
│   │   │   │   │   ├── 05-using-language-module.markdown
│   │   │   │   │   └── 06-automatically-generating-translations.markdown
│   │   │   │   ├── portlets/
│   │   │   │   │   ├── 01-portlets-intro.markdown
│   │   │   │   │   ├── 07-using-javascript-in-your-portlets/
│   │   │   │   │   │   ├── 01-using-javascript-in-your-portlets-intro.markdown
│   │   │   │   │   │   ├── 02-esplus-modules/
│   │   │   │   │   │   │   └── 01-using-esplus-modules-in-your-portlets-intro.markdown
│   │   │   │   │   │   ├── 03-using-npm-in-your-portlets/
│   │   │   │   │   │   │   ├── 01-npm-intro.markdown
│   │   │   │   │   │   │   ├── 02-formatting-for-amd/
│   │   │   │   │   │   │   │   └── 01-formatting-your-npm-modules-for-amd-intro.markdown
│   │   │   │   │   │   │   ├── 03-migrating-bundler-projects/
│   │   │   │   │   │   │   │   ├── 01-migrating-bundler-projects-intro.markdown
│   │   │   │   │   │   │   │   ├── 02-migrating-plain-js-billboard-jquery-metal-js-react-vue-bundler.markdown
│   │   │   │   │   │   │   │   ├── 03-migrating-angular-bundler.markdown
│   │   │   │   │   │   │   │   └── 04-migrating-to-the-new-mode.markdown
│   │   │   │   │   │   │   ├── 04-custom-loaders/
│   │   │   │   │   │   │   │   └── 01-creating-custom-loaders-for-the-bundler-intro.markdown
│   │   │   │   │   │   │   └── 08-npmresolver-api/
│   │   │   │   │   │   │       ├── 01-using-npmresolver-api-intro.markdown
│   │   │   │   │   │   │       ├── 02-obtaining-osgi-bundle-npm-package-descriptors.markdown
│   │   │   │   │   │   │       └── 03-obtaining-dependency-npm-package-descriptors.markdown
│   │   │   │   │   │   └── 09-spa/
│   │   │   │   │   │       ├── 01-spa-intro.markdown
│   │   │   │   │   │       ├── 02-configuring-spa-system-settings.markdown
│   │   │   │   │   │       ├── 03-disabling-spa.markdown
│   │   │   │   │   │       ├── 04-specifying-how-resources-are-loaded-during-spa-navigation.markdown
│   │   │   │   │   │       └── 05-detaching-global-listeners.markdown
│   │   │   │   │   └── 08-applying-clay-styles-to-your-app/
│   │   │   │   │       ├── 01-applying-clay-styles-intro.markdown
│   │   │   │   │       ├── 02-clay-navigation-patterns/
│   │   │   │   │       │   └── 01-applying-clay-patterns-to-your-navigation-bar-intro.markdown
│   │   │   │   │       ├── 03-clay-management-toolbar/
│   │   │   │   │       │   ├── 01-implementing-the-management-toolbar-intro.markdown
│   │   │   │   │       │   ├── 02-configuring-view-types/
│   │   │   │   │       │   │   ├── 01-configuring-mgmt-bar-view-types-intro.markdown
│   │   │   │   │       │   │   ├── 02-implementing-the-card-view.markdown
│   │   │   │   │       │   │   ├── 03-implementing-the-list-view.markdown
│   │   │   │   │       │   │   ├── 04-implementing-the-table-view.markdown
│   │   │   │   │       │   │   └── 05-updating-the-search-iterator.markdown
│   │   │   │   │       │   └── 03-filtering-and-sorting/
│   │   │   │   │       │       └── 01-filtering-and-sorting-items-with-the-management-toolbar-intro.markdown
│   │   │   │   │       ├── 04-app-title-and-back-url/
│   │   │   │   │       │   └── 01-configuring-your-apps-title-and-back-link-intro.markdown
│   │   │   │   │       ├── 05-add-button-pattern/
│   │   │   │   │       │   └── 01-using-the-add-button-pattern-intro.markdown
│   │   │   │   │       ├── 06-configuring-admin-apps/
│   │   │   │   │       │   └── 01-configuring-your-admin-apps-actions-menus-intro.markdown
│   │   │   │   │       └── 07-empty-results-message/
│   │   │   │   │           └── 01-setting-empty-results-messages-intro.markdown
│   │   │   │   ├── search/
│   │   │   │   │   ├── 01-search-framework-intro.markdown
│   │   │   │   │   ├── 02-aggregations/
│   │   │   │   │   │   ├── 01-aggregations-intro.markdown
│   │   │   │   │   │   ├── 02-base-search-aggregations-code.markdown
│   │   │   │   │   │   └── 03-statistical-aggregations.markdown
│   │   │   │   │   ├── 02-indexing-framework/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── 02-indexing.markdown
│   │   │   │   │   │   ├── 03-searching.markdown
│   │   │   │   │   │   ├── 04-results.markdown
│   │   │   │   │   │   └── 05-registrar.markdown
│   │   │   │   │   └── 03-queries-and-filters/
│   │   │   │   │       ├── 01-queries-and-filters-intro.markdown
│   │   │   │   │       └── 02-building-search-queries-and-filters.markdown
│   │   │   │   ├── segmentation-and-personalization/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   ├── 02-segment-management.markdown
│   │   │   │   │   ├── 03-request-context-contributor.markdown
│   │   │   │   │   └── 04-segment-criteria-contributors.markdown
│   │   │   │   ├── service-context/
│   │   │   │   │   └── 01-understanding-service-context-intro.markdown
│   │   │   │   ├── testing/
│   │   │   │   │   └── 01-injecting-service-components-into-tests-intro.markdown
│   │   │   │   ├── upgrade-processes/
│   │   │   │   │   ├── 01-upgrade-processes-intro.markdown
│   │   │   │   │   ├── 02-creating-an-upgrade-process-for-your-application.markdown
│   │   │   │   │   ├── 03-upgrade-processes-for-former-service-builder-plugins.markdown
│   │   │   │   │   └── 04-upgrading-data-schemas-in-development.markdown
│   │   │   │   ├── user-associated-data/
│   │   │   │   │   ├── 01-managing-uad-intro.markdown
│   │   │   │   │   ├── 02-implementing-uad.markdown
│   │   │   │   │   ├── 03-gdpr-deletion-features.markdown
│   │   │   │   │   └── 04-filtering-and-searching.markdown
│   │   │   │   ├── web-experience-management/
│   │   │   │   │   ├── 01-web-experience-management-intro.markdown
│   │   │   │   │   ├── 02-page-fragments/
│   │   │   │   │   │   ├── 01-page-fragments-intro.markdown
│   │   │   │   │   │   ├── 02-developing-a-fragment.markdown
│   │   │   │   │   │   ├── 03-making-a-fragment-configurable.markdown
│   │   │   │   │   │   ├── 04-managing-fragments-and-collections.markdown
│   │   │   │   │   │   ├── 05-page-fragments-desktop-tools.markdown
│   │   │   │   │   │   ├── 06-creating-contributed-fragment-collection.markdown
│   │   │   │   │   │   └── 07-including-default-resources-in-fragments.markdown
│   │   │   │   │   ├── 03-supporting-custom-content-types-in-pages/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── 02-mapping-a-content-type-to-a-display-page-template.markdown
│   │   │   │   │   │   ├── 03-specifying-the-fields-of-a-custom-content-type.markdown
│   │   │   │   │   │   ├── 04-providing-friendly-urls-for-a-custom-content-type.markdown
│   │   │   │   │   │   └── 05-integrating-display-pages-into-content-creation.markdown
│   │   │   │   │   ├── 04-screen-navigation/
│   │   │   │   │   │   ├── 01-screen-navigation-framework-intro.markdown
│   │   │   │   │   │   ├── 02-screen-navigation-custom-apps.markdown
│   │   │   │   │   │   └── 03-customizing-liferay-apps.markdown
│   │   │   │   │   └── 05-developing-a-fragment-renderer/
│   │   │   │   │       ├── 01-intro.markdown
│   │   │   │   │       └── 02-creating-a-fragment-renderer.markdown
│   │   │   │   ├── web-services/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   ├── 02-headless-apis/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── 02-discover-api.markdown
│   │   │   │   │   │   ├── 03-invoke-service.markdown
│   │   │   │   │   │   ├── 04-authenticated-requests.markdown
│   │   │   │   │   │   ├── 05-collections/
│   │   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   │   ├── 02-getting-collections.markdown
│   │   │   │   │   │   │   ├── 03-pagination.markdown
│   │   │   │   │   │   │   └── 04-collection-to-elements.markdown
│   │   │   │   │   │   ├── 06-api-formats.markdown
│   │   │   │   │   │   ├── 07-openapi-profiles.markdown
│   │   │   │   │   │   ├── 08-filter-and-sort.markdown
│   │   │   │   │   │   ├── 09-restrict-properties.markdown
│   │   │   │   │   │   ├── 10-multipart.markdown
│   │   │   │   │   │   ├── 11-how-to-get-site-id.markdown
│   │   │   │   │   │   ├── 12-filtrable-properties.markdown
│   │   │   │   │   │   └── 13-using-rest-apis.markdown
│   │   │   │   │   ├── 03-jax/
│   │   │   │   │   │   ├── 01-jaxrs-intro.markdown
│   │   │   │   │   │   └── 02-jax-ws.markdown
│   │   │   │   │   ├── 04-graphql/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── 02-discover-api.markdown
│   │   │   │   │   │   ├── 03-invoke-service.markdown
│   │   │   │   │   │   ├── 04-authenticated-requests.markdown
│   │   │   │   │   │   ├── 05-collections.markdown
│   │   │   │   │   │   ├── 06-mutations.markdown
│   │   │   │   │   │   ├── 07-fragments-and-node-pattern.markdown
│   │   │   │   │   │   ├── 08-language-negociation.markdown
│   │   │   │   │   │   ├── 09-filter-and-sort.markdown
│   │   │   │   │   │   ├── 10-multipart.markdown
│   │   │   │   │   │   └── 11-using-graphql-apis.markdown
│   │   │   │   │   └── 05-rest-builder/
│   │   │   │   │       ├── 01-intro.markdown
│   │   │   │   │       ├── 02-how-to-install.markdown
│   │   │   │   │       ├── 03-openapi.markdown
│   │   │   │   │       ├── 04-develop.markdown
│   │   │   │   │       ├── 05-how-to-add-features-for-managing-collections.markdown
│   │   │   │   │       ├── 06-scaffolding.markdown
│   │   │   │   │       ├── 07-support-for-oneOf-anyOf-and-allOf.markdown
│   │   │   │   │       └── 08-good-practices-and-conventions.markdown
│   │   │   │   ├── workflow/
│   │   │   │   │   ├── 01-workflow-intro.markdown
│   │   │   │   │   └── 02-workflow-framework.markdown
│   │   │   │   └── wysiwyg-editors/
│   │   │   │       ├── 01-wysiwyg-editors-intro.markdown
│   │   │   │       ├── 02-wysiwyg-editor-in-portlet/
│   │   │   │       │   └── 01-adding-a-wysiwyg-editor-to-a-portlet-intro.markdown
│   │   │   │       ├── 03-modifying-editor-configuration/
│   │   │   │       │   └── 01-modifying-an-editors-configuration-intro.markdown
│   │   │   │       ├── 04-alloy-editor/
│   │   │   │       │   ├── 01-alloy-editor-intro.markdown
│   │   │   │       │   ├── 02-adding-buttons-to-the-alloyeditor/
│   │   │   │       │   │   ├── 01-adding-buttons-to-the-alloy-editor-intro.markdown
│   │   │   │       │   │   ├── 02-preparing-and-configuring-your-module.markdown
│   │   │   │       │   │   ├── 03-adding-buttons-to-the-alloyeditor-add-toolbar.markdown
│   │   │   │       │   │   └── 04-adding-buttons-to-the-alloyeditor-styles-toolbar.markdown
│   │   │   │       │   └── 04-embedding-content/
│   │   │   │       │       └── 01-embedding-content-in-the-editor-intro.markdown
│   │   │   │       └── 05-adding-new-editor-behaviors/
│   │   │   │           └── 01-adding-new-behavior-to-an-editor-intro.markdown
│   │   │   └── build.xml
│   │   ├── reference/
│   │   │   ├── articles/
│   │   │   │   ├── 01-intro/
│   │   │   │   │   └── 01-reference-intro.markdown
│   │   │   │   ├── 02-breaking-changes.markdown
│   │   │   │   ├── 02-cdi-portlet-predefined-beans.markdown
│   │   │   │   ├── 02-classes-moved/
│   │   │   │   │   └── 01-classes-moved-from-portal-service-jar-intro.markdown
│   │   │   │   ├── 02-export-import-and-staging/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   ├── decision-to-implement-staging.markdown
│   │   │   │   │   └── liferay-archive-file.markdown
│   │   │   │   ├── 02-front-end/
│   │   │   │   │   ├── 01-front-end-intro.markdown
│   │   │   │   │   ├── 02-freemarker-macros/
│   │   │   │   │   │   └── 01-liferay-freemarker-macros-intro.markdown
│   │   │   │   │   ├── 03-front-end-taglibs/
│   │   │   │   │   │   ├── 01-front-end-taglibs-intro.markdown
│   │   │   │   │   │   ├── 02-theme-objects/
│   │   │   │   │   │   │   └── 01-liferay-theme-objects-intro.markdown
│   │   │   │   │   │   ├── 03-portlet-objects/
│   │   │   │   │   │   │   └── 01-liferay-portlet-objects-intro.markdown
│   │   │   │   │   │   ├── 04-liferay-ui-taglibs/
│   │   │   │   │   │   │   ├── 01-using-liferay-ui-taglibs-intro.markdown
│   │   │   │   │   │   │   ├── 02-liferay-ui-icons.markdown
│   │   │   │   │   │   │   ├── 03-liferay-ui-icon-lists.markdown
│   │   │   │   │   │   │   ├── 04-liferay-ui-icon-menus.markdown
│   │   │   │   │   │   │   ├── 05-liferay-ui-tabs.markdown
│   │   │   │   │   │   │   └── 06-liferay-ui-icon-help.markdown
│   │   │   │   │   │   ├── 05-liferay-frontend-taglibs/
│   │   │   │   │   │   │   ├── 01-using-liferay-frontend-taglibs-intro.markdown
│   │   │   │   │   │   │   ├── 02-add-menu/
│   │   │   │   │   │   │   │   └── 01-liferay-frontend-add-menu-intro.markdown
│   │   │   │   │   │   │   ├── 03-cards/
│   │   │   │   │   │   │   │   └── 01-liferay-frontend-cards-intro.markdown
│   │   │   │   │   │   │   ├── 04-info-bar/
│   │   │   │   │   │   │   │   └── 01-liferay-frontend-info-bar-intro.markdown
│   │   │   │   │   │   │   └── 05-liferay-frontend-management-bar/
│   │   │   │   │   │   │       ├── 01-liferay-frontend-management-bar-intro.markdown
│   │   │   │   │   │   │       ├── 02-including-actions-in-the-management-bar.markdown
│   │   │   │   │   │   │       └── 03-disabling-the-management-bar.markdown
│   │   │   │   │   │   ├── 06-liferay-util-taglibs/
│   │   │   │   │   │   │   ├── 01-using-liferay-util-taglibs-intro.markdown
│   │   │   │   │   │   │   ├── 02-liferay-util-body-bottom.markdown
│   │   │   │   │   │   │   ├── 03-liferay-util-body-top.markdown
│   │   │   │   │   │   │   ├── 04-liferay-util-buffer.markdown
│   │   │   │   │   │   │   ├── 05-liferay-util-dynamic-include.markdown
│   │   │   │   │   │   │   ├── 06-liferay-util-get-url.markdown
│   │   │   │   │   │   │   ├── 07-liferay-util-html-bottom.markdown
│   │   │   │   │   │   │   ├── 08-liferay-util-html-top.markdown
│   │   │   │   │   │   │   ├── 09-liferay-util-include.markdown
│   │   │   │   │   │   │   ├── 10-liferay-util-param.markdown
│   │   │   │   │   │   │   └── 11-liferay-util-whitespace-remover.markdown
│   │   │   │   │   │   ├── 07-clay-taglibs/
│   │   │   │   │   │   │   ├── 01-using-clay-taglibs-intro.markdown
│   │   │   │   │   │   │   ├── 02-clay-alerts.markdown
│   │   │   │   │   │   │   ├── 03-clay-badges.markdown
│   │   │   │   │   │   │   ├── 04-clay-buttons.markdown
│   │   │   │   │   │   │   ├── 05-clay-cards.markdown
│   │   │   │   │   │   │   ├── 06-clay-dropdown-and-action-menus.markdown
│   │   │   │   │   │   │   ├── 07-clay-form-elements.markdown
│   │   │   │   │   │   │   ├── 08-clay-icons.markdown
│   │   │   │   │   │   │   ├── 09-clay-links-and-labels.markdown
│   │   │   │   │   │   │   ├── 10-clay-management-toolbar.markdown
│   │   │   │   │   │   │   ├── 11-clay-navigation-bars.markdown
│   │   │   │   │   │   │   ├── 12-clay-progress-bars.markdown
│   │   │   │   │   │   │   └── 13-clay-stickers.markdown
│   │   │   │   │   │   ├── 08-chart-taglibs/
│   │   │   │   │   │   │   ├── 01-using-chart-taglibs-intro.markdown
│   │   │   │   │   │   │   ├── 02-bar-charts.markdown
│   │   │   │   │   │   │   ├── 03-line-charts.markdown
│   │   │   │   │   │   │   ├── 04-scatter-charts.markdown
│   │   │   │   │   │   │   ├── 05-spline-charts.markdown
│   │   │   │   │   │   │   ├── 06-step-charts.markdown
│   │   │   │   │   │   │   ├── 07-combination-charts.markdown
│   │   │   │   │   │   │   ├── 08-donut-charts.markdown
│   │   │   │   │   │   │   ├── 09-gauge-charts.markdown
│   │   │   │   │   │   │   ├── 10-pie-charts.markdown
│   │   │   │   │   │   │   ├── 11-geomap-charts.markdown
│   │   │   │   │   │   │   ├── 12-predictive-charts.markdown
│   │   │   │   │   │   │   └── 13-refreshing-charts-to-reflect-real-time-data.markdown
│   │   │   │   │   │   └── 09-aui-taglibs/
│   │   │   │   │   │       ├── 01-using-aui-taglibs-intro.markdown
│   │   │   │   │   │       └── 02-building-forms-with-aui-tags.markdown
│   │   │   │   │   ├── 04-liferay-npm-bundler/
│   │   │   │   │   │   ├── 01-liferay-npm-bundler-intro.markdown
│   │   │   │   │   │   ├── 03-npmbundlerrc-structure.markdown
│   │   │   │   │   │   ├── 04-how-the-default-preset-configures-the-liferay-npm-bundler.markdown
│   │   │   │   │   │   ├── 05-the-structure-of-osgi-bundles-npm.markdown
│   │   │   │   │   │   ├── 06-how-portal-publishes-npm-packages.markdown
│   │   │   │   │   │   ├── 07-how-the-bundler-formats-js-modules.markdown
│   │   │   │   │   │   ├── 08-how-liferay-amd-loader-configuration-is-exported.markdown
│   │   │   │   │   │   ├── 09-changes-between-bundler-1.x-and-2.x.markdown
│   │   │   │   │   │   ├── 10-understanding-loader-rules.markdown
│   │   │   │   │   │   └── 11-default-bundler-loaders.markdown
│   │   │   │   │   ├── 05-liferay-js-apis/
│   │   │   │   │   │   ├── 01-liferay-js-apis-intro.markdown
│   │   │   │   │   │   ├── 02-theme-display.markdown
│   │   │   │   │   │   ├── 03-working-with-urls-in-js.markdown
│   │   │   │   │   │   ├── 04-javascript-utilities.markdown
│   │   │   │   │   │   ├── 05-invoking-liferay-services.markdown
│   │   │   │   │   │   ├── 06-handling-ajax-requests.markdown
│   │   │   │   │   │   └── 07-working-with-addresses.markdown
│   │   │   │   │   ├── 06-freemarker-taglib-macros/
│   │   │   │   │   │   └── 01-freemarker-taglib-macros-intro.markdown
│   │   │   │   │   ├── 07-npm-environment/
│   │   │   │   │   │   └── 01-setting-up-your-npm-environment-intro.markdown
│   │   │   │   │   ├── 08-sitemap-page-configuration/
│   │   │   │   │   │   └── 01-sitemap-pages-configuraiton-options-intro.markdown
│   │   │   │   │   ├── 09-ckeditor-plugins/
│   │   │   │   │   │   └── 01-ckeditor-plugin-reference-guide-intro.markdown
│   │   │   │   │   ├── 11-portlet-ids/
│   │   │   │   │   │   └── 01-fully-qualified-portlet-ids-intro.markdown
│   │   │   │   │   ├── 12-spa-lifecycle-events/
│   │   │   │   │   │   └── 01-spa-lifecycle-events-intro.markdown
│   │   │   │   │   ├── 13-theme-anatomy/
│   │   │   │   │   │   └── 01-theme-anatomy-reference-guide-intro.markdown
│   │   │   │   │   └── 14-freemarker-variables/
│   │   │   │   │       └── 01-freemarker-variables-intro.markdown
│   │   │   │   ├── 02-gradle-plugins/
│   │   │   │   │   ├── 00-intro.markdown
│   │   │   │   │   ├── app-javadoc-builder-gradle-plugin.markdown
│   │   │   │   │   ├── baseline-gradle-plugin.markdown
│   │   │   │   │   ├── change-log-builder-gradle-plugin.markdown
│   │   │   │   │   ├── css-builder-gradle-plugin.markdown
│   │   │   │   │   ├── db-support-gradle-plugin.markdown
│   │   │   │   │   ├── dependency-checker-gradle-plugin.markdown
│   │   │   │   │   ├── deployment-helper-gradle-plugin.markdown
│   │   │   │   │   ├── go-gradle-plugin.markdown
│   │   │   │   │   ├── gulp-gradle-plugin.markdown
│   │   │   │   │   ├── jasper-jspc-gradle-plugin.markdown
│   │   │   │   │   ├── javadoc-formatter-gradle-plugin.markdown
│   │   │   │   │   ├── js-module-config-generator-gradle-plugin.markdown
│   │   │   │   │   ├── js-transpiler-gradle-plugin.markdown
│   │   │   │   │   ├── jsdoc-gradle-plugin.markdown
│   │   │   │   │   ├── lang-builder-gradle-plugin.markdown
│   │   │   │   │   ├── maven-plugin-builder-gradle-plugin.markdown
│   │   │   │   │   ├── node-gradle-plugin.markdown
│   │   │   │   │   ├── rest-builder-gradle-plugin.markdown
│   │   │   │   │   ├── service-builder-gradle-plugin.markdown
│   │   │   │   │   ├── source-formatter-gradle-plugin.markdown
│   │   │   │   │   ├── soy-gradle-plugin.markdown
│   │   │   │   │   ├── target-platform-gradle-plugin.markdown
│   │   │   │   │   ├── theme-builder-gradle-plugin.markdown
│   │   │   │   │   ├── tld-formatter-gradle-plugin.markdown
│   │   │   │   │   ├── tlddoc-builder-gradle-plugin.markdown
│   │   │   │   │   ├── whip-gradle-plugin.markdown
│   │   │   │   │   ├── wsdd-builder-gradle-plugin.markdown
│   │   │   │   │   ├── wsdl-builder-gradle-plugin.markdown
│   │   │   │   │   ├── xml-formatter-gradle-plugin.markdown
│   │   │   │   │   └── xsd-builder-gradle-plugin.markdown
│   │   │   │   ├── 02-item-selector-criterion-and-return-types.markdown
│   │   │   │   ├── 02-java-apis.markdown
│   │   │   │   ├── 02-liferay-faces/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   ├── 02-liferay-faces-version-scheme.markdown
│   │   │   │   │   ├── 03-understanding-liferay-faces-bridge.markdown
│   │   │   │   │   ├── 04-understanding-liferay-faces-alloy.markdown
│   │   │   │   │   └── 05-understanding-liferay-faces-portal.markdown
│   │   │   │   ├── 02-maven-plugins/
│   │   │   │   │   ├── 00-intro.markdown
│   │   │   │   │   ├── bundle-support-plugin.markdown
│   │   │   │   │   ├── css-builder-plugin.markdown
│   │   │   │   │   ├── db-support-plugin.markdown
│   │   │   │   │   ├── deployment-helper-plugin.markdown
│   │   │   │   │   ├── javadoc-formatter-plugin.markdown
│   │   │   │   │   ├── lang-builder-plugin.markdown
│   │   │   │   │   ├── rest-builder-plugin.markdown
│   │   │   │   │   ├── service-builder-plugin.markdown
│   │   │   │   │   ├── source-formatter-plugin.markdown
│   │   │   │   │   ├── theme-builder-plugin.markdown
│   │   │   │   │   ├── tld-formatter-plugin.markdown
│   │   │   │   │   ├── wsdd-builder-plugin.markdown
│   │   │   │   │   └── xml-formatter-plugin.markdown
│   │   │   │   ├── 02-meaningful-schema-versioning.markdown
│   │   │   │   ├── 02-portlet-3-opt-in.markdown
│   │   │   │   ├── 02-portlet-descriptor-to-osgi-service-property-map.markdown
│   │   │   │   ├── 02-portletmvc4spring/
│   │   │   │   │   ├── 01-portletmvc4spring-intro.markdown
│   │   │   │   │   ├── 02-portletmvc4spring-project-anatomy.markdown
│   │   │   │   │   ├── 03-portletmvc4spring-annotations.markdown
│   │   │   │   │   └── 99-portletmvc4spring-configuration-files.markdown
│   │   │   │   ├── 02-project-templates/
│   │   │   │   │   ├── 00-intro.markdown
│   │   │   │   │   ├── activator-template.markdown
│   │   │   │   │   ├── api-template.markdown
│   │   │   │   │   ├── control-menu-entry-template.markdown
│   │   │   │   │   ├── form-field-template.markdown
│   │   │   │   │   ├── fragment-template.markdown
│   │   │   │   │   ├── freemarker-portlet-template.markdown
│   │   │   │   │   ├── layout-template.markdown
│   │   │   │   │   ├── modules-ext-template.markdown
│   │   │   │   │   ├── mvc-portlet-template.markdown
│   │   │   │   │   ├── panel-app-template.markdown
│   │   │   │   │   ├── portlet-configuration-icon-template.markdown
│   │   │   │   │   ├── portlet-provider-template.markdown
│   │   │   │   │   ├── portlet-toolbar-contributor-template.markdown
│   │   │   │   │   ├── rest-template.markdown
│   │   │   │   │   ├── service-builder-template.markdown
│   │   │   │   │   ├── service-template.markdown
│   │   │   │   │   ├── service-wrapper-template.markdown
│   │   │   │   │   ├── simulation-panel-entry-template.markdown
│   │   │   │   │   ├── social-bookmark.markdown
│   │   │   │   │   ├── spring-mvc-portlet-template.markdown
│   │   │   │   │   ├── template-context-contributor-template.markdown
│   │   │   │   │   ├── theme-contributor-template.markdown
│   │   │   │   │   ├── theme-template.markdown
│   │   │   │   │   ├── war-core-ext.markdown
│   │   │   │   │   ├── war-hook-template.markdown
│   │   │   │   │   └── war-mvc-portlet-template.markdown
│   │   │   │   ├── 02-sample-projects/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   ├── 02-apps/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── greedy-policy-option-portlet.markdown
│   │   │   │   │   │   ├── kotlin-portlet.markdown
│   │   │   │   │   │   ├── service-builder-samples/
│   │   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   │   ├── service-builder-adq.markdown
│   │   │   │   │   │   │   ├── service-builder-jdbc.markdown
│   │   │   │   │   │   │   └── service-builder-jndi.markdown
│   │   │   │   │   │   ├── shared-language-keys.markdown
│   │   │   │   │   │   ├── simulation-panel-app.markdown
│   │   │   │   │   │   └── workflow-samples/
│   │   │   │   │   │       ├── 01-intro.markdown
│   │   │   │   │   │       ├── 02-workflow-asset.markdown
│   │   │   │   │   │       └── 03-workflow-basic.markdown
│   │   │   │   │   ├── 03-extensions/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── control-menu-entry.markdown
│   │   │   │   │   │   ├── document-action.markdown
│   │   │   │   │   │   ├── gogo-shell-command.markdown
│   │   │   │   │   │   ├── index-settings-contributor.markdown
│   │   │   │   │   │   ├── indexer-post-processor.markdown
│   │   │   │   │   │   ├── model-listener.markdown
│   │   │   │   │   │   ├── screen-name-validator.markdown
│   │   │   │   │   │   └── servlet.markdown
│   │   │   │   │   ├── 04-overrides/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── module-jsp-override.markdown
│   │   │   │   │   │   └── resource-bundle-override.markdown
│   │   │   │   │   ├── 05-themes/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── simple-theme.markdown
│   │   │   │   │   │   ├── template-context-contributor.markdown
│   │   │   │   │   │   └── theme-contributor.markdown
│   │   │   │   │   └── 06-ext/
│   │   │   │   │       ├── 01-intro.markdown
│   │   │   │   │       └── login-web-ext.markdown
│   │   │   │   ├── 02-segmentation-and-personalization/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   └── 02-defining-segment-criteria.markdown
│   │   │   │   ├── 02-third-party-packages-portal-exports.markdown
│   │   │   │   ├── 02-tooling/
│   │   │   │   │   ├── 00-intro.markdown
│   │   │   │   │   ├── 01-creating-a-project.markdown
│   │   │   │   │   ├── 02-deploying-a-project.markdown
│   │   │   │   │   ├── blade-cli/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── 02-installing-blade-cli.markdown
│   │   │   │   │   │   ├── 03-installing-blade-cli-with-proxy-requirements.markdown
│   │   │   │   │   │   ├── 04-managing-your-liferay-server-with-blade-cli.markdown
│   │   │   │   │   │   ├── 05-generating-project-samples-with-blade-cli.markdown
│   │   │   │   │   │   ├── 06-updating-blade-cli.markdown
│   │   │   │   │   │   ├── 07-converting-plugins-sdk-projects-with-blade-cli.markdown
│   │   │   │   │   │   ├── 08-extending-blade-cli/
│   │   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   │   ├── 02-creating-custom-commands-for-blade-cli.markdown
│   │   │   │   │   │   │   ├── 03-creating-custom-project-templates-for-blade-cli.markdown
│   │   │   │   │   │   │   ├── 04-installing-new-extensions-for-blade-cli.markdown
│   │   │   │   │   │   │   └── 05-creating-a-blade-profile.markdown
│   │   │   │   │   │   └── 100-common-errors-with-blade-cli-installation.markdown
│   │   │   │   │   ├── dev-studio/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── 02-installing-dev-studio.markdown
│   │   │   │   │   │   ├── 03-setting-proxy-requirements-for-dev-studio.markdown
│   │   │   │   │   │   ├── 04-installing-a-server-in-dev-studio.markdown
│   │   │   │   │   │   ├── 05-importing-projects-in-dev-studio.markdown
│   │   │   │   │   │   ├── 06-using-the-gogo-shell-in-dev-studio.markdown
│   │   │   │   │   │   ├── 07-searching-liferay-portal-source-with-dev-studio.markdown
│   │   │   │   │   │   ├── 08-debugging-liferay-portal-source-with-dev-studio.markdown
│   │   │   │   │   │   ├── 09-updating-dev-studio.markdown
│   │   │   │   │   │   ├── 100-gradle-in-dev-studio.markdown
│   │   │   │   │   │   └── 101-maven-in-dev-studio.markdown
│   │   │   │   │   ├── intellij/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── 02-installing-liferay-intellij-plugin.markdown
│   │   │   │   │   │   ├── 03-installing-a-server-in-intellij-idea.markdown
│   │   │   │   │   │   └── 04-updating-liferay-intellij-plugin.markdown
│   │   │   │   │   ├── liferay-js-generator/
│   │   │   │   │   │   ├── 01-js-generator-intro.markdown
│   │   │   │   │   │   ├── 02-installing-the-js-generator-and-creating-js-portlets.markdown
│   │   │   │   │   │   ├── 04-understanding-the-js-portlet-extender-configuration.markdown
│   │   │   │   │   │   ├── 05-configuration-json-options.markdown
│   │   │   │   │   │   └── 06-adapting-apps-for-liferay.markdown
│   │   │   │   │   ├── liferay-workspace/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── 02-installing-liferay-workspace.markdown
│   │   │   │   │   │   ├── 03-creating-a-liferay-workspace.markdown
│   │   │   │   │   │   ├── 04-importing-a-liferay-workspace-into-an-ide.markdown
│   │   │   │   │   │   ├── 05-setting-proxy-requirements-for-liferay-workspace.markdown
│   │   │   │   │   │   ├── 06-adding-a-liferay-bundle-to-workspace.markdown
│   │   │   │   │   │   ├── 07-setting-environment-configurations-for-liferay-workspace.markdown
│   │   │   │   │   │   ├── 08-building-nodejs-themes-in-liferay-workspace.markdown
│   │   │   │   │   │   ├── 09-building-gradle-maven-themes-in-liferay-workspace.markdown
│   │   │   │   │   │   ├── 10-managing-the-target-platform/
│   │   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   │   ├── 02-setting-the-target-platform.markdown
│   │   │   │   │   │   │   ├── 03-targeting-a-platform-outside-of-workspace.markdown
│   │   │   │   │   │   │   └── 04-targetinging-a-platform-with-maven.markdown
│   │   │   │   │   │   ├── 11-validating-modules-against-the-target-platform/
│   │   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   │   ├── 02-adding-a-third-party-librarys-capabilities-to-the-resolvers-capabilities.markdown
│   │   │   │   │   │   │   ├── 03-skipping-the-resolving-process-for-a-module.markdown
│   │   │   │   │   │   │   ├── 04-depending-on-a-customized-distribution-of-liferay.markdown
│   │   │   │   │   │   │   ├── 05-including-the-resolver-in-your-gradle-build.markdown
│   │   │   │   │   │   │   ├── 06-how-to-resolve-common-output-errors-reported-by-the-resolve-task.markdown
│   │   │   │   │   │   │   └── 99-validating-modules-outside-of-workspace.markdown
│   │   │   │   │   │   ├── 12-leveraging-docker/
│   │   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   │   ├── 02-creating-a-liferay-docker-container.markdown
│   │   │   │   │   │   │   ├── 03-configuring-a-docker-container.markdown
│   │   │   │   │   │   │   └── 04-building-a-custom-docker-image.markdown
│   │   │   │   │   │   ├── 13-updating-liferay-workspace.markdown
│   │   │   │   │   │   └── 14-updating-default-plugins-provided-by-liferay-workspace.markdown
│   │   │   │   │   ├── maven/
│   │   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   │   ├── 02-installing-remote-liferay-maven-artifacts.markdown
│   │   │   │   │   │   ├── 04-creating-a-maven-repository.markdown
│   │   │   │   │   │   ├── 05-configuring-local-maven-settings-to-access-repositories.markdown
│   │   │   │   │   │   ├── 06-deploying-liferay-maven-artifacts-to-a-repository.markdown
│   │   │   │   │   │   ├── 07-building-an-osgi-module-jar-with-maven.markdown
│   │   │   │   │   │   ├── 08-building-themes-in-a-maven-project.markdown
│   │   │   │   │   │   ├── 09-compiling-sass-files-in-a-maven-project.markdown
│   │   │   │   │   │   ├── 10-using-service-builder-in-a-maven-project.markdown
│   │   │   │   │   │   └── 99-upgrading-your-maven-build-environment.markdown
│   │   │   │   │   ├── theme-generator/
│   │   │   │   │   │   ├── 01-theme-generator-intro.markdown
│   │   │   │   │   │   ├── 02-installing-the-theme-generator-and-creating-themes.markdown
│   │   │   │   │   │   ├── 03-generating-layout-templates.markdown
│   │   │   │   │   │   └── 05-generating-themelets.markdown
│   │   │   │   │   └── upgrade-planner/
│   │   │   │   │       ├── 01-liferay-upgrade-planner-intro.markdown
│   │   │   │   │       └── 02-using-upgrade-planner-with-proxy-requirements.markdown
│   │   │   │   ├── 02-web-experience-management/
│   │   │   │   │   ├── 01-intro.markdown
│   │   │   │   │   ├── 02-page-fragments/
│   │   │   │   │   │   ├── 01-fragment-specific-tags-intro.markdown
│   │   │   │   │   │   ├── 02-fragment-configuration-types.markdown
│   │   │   │   │   │   └── 03-escaping-fragment-configuration-text-values.markdown
│   │   │   │   │   └── 03-asset-display-page-taglib.markdown
│   │   │   │   └── 02-workflow/
│   │   │   │       ├── 01-creating-workflow-definitions-intro.markdown
│   │   │   │       ├── 02-workflow-nodes.markdown
│   │   │   │       ├── 03-tasks.markdown
│   │   │   │       └── 04-notifications.markdown
│   │   │   ├── articles-dxp/
│   │   │   │   ├── 02-classes-moved/
│   │   │   │   │   └── 01-classes-moved-from-portal-service-jar-intro.markdown
│   │   │   │   └── 02-tooling/
│   │   │   │       └── dev-studio/
│   │   │   │           └── 02-installing-dev-studio.markdown
│   │   │   ├── build.xml
│   │   │   └── code/
│   │   │       └── adapted-react-app/
│   │   │           └── my-react-guestbook-app/
│   │   │               ├── .gitignore
│   │   │               ├── .npmbuildrc
│   │   │               ├── .npmbundlerrc
│   │   │               ├── README.md
│   │   │               ├── features/
│   │   │               │   └── localization/
│   │   │               │       └── Language.properties
│   │   │               ├── package.json
│   │   │               ├── public/
│   │   │               │   ├── index.html
│   │   │               │   └── manifest.json
│   │   │               └── src/
│   │   │                   ├── App.css
│   │   │                   ├── App.js
│   │   │                   ├── App.test.js
│   │   │                   ├── add-entry.js
│   │   │                   ├── index.css
│   │   │                   ├── index.js
│   │   │                   ├── serviceWorker.js
│   │   │                   └── view-guestbook.js
│   │   └── tutorials/
│   │       ├── articles/
│   │       │   ├── 01-tutorials-intro/
│   │       │   │   └── 01-tutorials-intro.markdown
│   │       │   ├── 02-developing-a-web-application/
│   │       │   │   ├── 01-intro.markdown
│   │       │   │   ├── 02-setting-up-liferay-development/
│   │       │   │   │   └── 01-setting-up-liferay-development-intro.markdown
│   │       │   │   ├── 03-generating-the-backend/
│   │       │   │   │   ├── 00-intro.markdown
│   │       │   │   │   ├── 01-what-is-service-builder.markdown
│   │       │   │   │   ├── 02-generating-layers.markdown
│   │       │   │   │   └── 03-implementing-service-methods.markdown
│   │       │   │   ├── 04-building-the-web-front-end/
│   │       │   │   │   ├── 01-intro.markdown
│   │       │   │   │   ├── 02-creating-the-web-project.markdown
│   │       │   │   │   ├── 03-defining-component-metadata-properties.markdown
│   │       │   │   │   ├── 04-portlet-keys.markdown
│   │       │   │   │   ├── 05-integrating-the-back-end.markdown
│   │       │   │   │   ├── 06-creating-a-button.markdown
│   │       │   │   │   ├── 07-generating-portlet-urls.markdown
│   │       │   │   │   ├── 08-linking-to-another-page.markdown
│   │       │   │   │   ├── 09-forms-and-action-urls.markdown
│   │       │   │   │   ├── 10-implementing-portlet-actions.markdown
│   │       │   │   │   ├── 11-displaying-guestbook-entries.markdown
│   │       │   │   │   └── 12-fitting-it-all-together.markdown
│   │       │   │   ├── 05-writing-admin-portlet/
│   │       │   │   │   ├── 01-writing-the-guestbook-admin-application-intro.markdown
│   │       │   │   │   ├── 02-creating-the-classes.markdown
│   │       │   │   │   ├── 03-updating-metadata.markdown
│   │       │   │   │   ├── 04-updating-your-service-layer.markdown
│   │       │   │   │   ├── 05-defining-portlet-actions.markdown
│   │       │   │   │   ├── 06-adding-tabs-to-the-guestbook-portlet.markdown
│   │       │   │   │   └── 07-creating-a-user-interface.markdown
│   │       │   │   ├── 06-displaying-message-errors/
│   │       │   │   │   ├── 01-intro.markdown
│   │       │   │   │   ├── 02-creating-language-keys.markdown
│   │       │   │   │   ├── 03-adding-error-messages.markdown
│   │       │   │   │   └── 04-adding-messages-jsp.markdown
│   │       │   │   ├── 07-permissions/
│   │       │   │   │   ├── 01-permissions-intro.markdown
│   │       │   │   │   ├── 02-defining-permissions.markdown
│   │       │   │   │   ├── 03-registering-permissions-database.markdown
│   │       │   │   │   ├── 04-registering-permissions-container.markdown
│   │       │   │   │   ├── 05-assigning-permissions-to-resources.markdown
│   │       │   │   │   └── 06-checking-permissions-jsps.markdown
│   │       │   │   ├── 08-search-and-indexing/
│   │       │   │   │   ├── 01-intro.markdown
│   │       │   │   │   ├── 02-enabling-search-and-indexing-for-guestbooks/
│   │       │   │   │   │   ├── 01-intro.markdown
│   │       │   │   │   │   ├── 02-understanding-search-and-indexing.markdown
│   │       │   │   │   │   ├── 03-registering-search-services.markdown
│   │       │   │   │   │   ├── 04-indexing-guestbooks.markdown
│   │       │   │   │   │   ├── 05-querying-guestbook.markdown
│   │       │   │   │   │   ├── 06-summarizing-search-documents.markdown
│   │       │   │   │   │   └── 07-handling-indexing-in-the-guestbook-service-layer.markdown
│   │       │   │   │   ├── 03-enabling-search-and-indexing-for-guestbook-entries/
│   │       │   │   │   │   ├── 01-intro.markdown
│   │       │   │   │   │   ├── 02-registering-search-services.markdown
│   │       │   │   │   │   ├── 03-indexing-entries.markdown
│   │       │   │   │   │   ├── 04-querying-entries.markdown
│   │       │   │   │   │   ├── 05-summarizing-search-documents.markdown
│   │       │   │   │   │   └── 06-handling-indexing-in-the-entry-service-layer.markdown
│   │       │   │   │   └── 04-updating-your-user-interface-for-search/
│   │       │   │   │       ├── 01-intro.markdown
│   │       │   │   │       ├── 02-adding-a-search-bar-to-the-guestbook-portlet.markdown
│   │       │   │   │       └── 03-creating-a-search-results-jsp-for-the-guestbook-portlet.markdown
│   │       │   │   ├── 09-assets/
│   │       │   │   │   ├── 01-intro.markdown
│   │       │   │   │   ├── 02-enabling-assets-at-the-service-layer/
│   │       │   │   │   │   ├── 01-enabling-assets-at-the-service-layer-intro.markdown
│   │       │   │   │   │   ├── 02-handling-assets-at-the-guestbook-service-layer.markdown
│   │       │   │   │   │   └── 03-handling-assets-at-the-entry-service-layer.markdown
│   │       │   │   │   ├── 03-implementing-asset-renderers/
│   │       │   │   │   │   ├── 01-implementing-asset-renderers-intro.markdown
│   │       │   │   │   │   ├── 02-implementing-a-guestbook-asset-renderer.markdown
│   │       │   │   │   │   └── 03-implementing-an-entry-asset-renderer.markdown
│   │       │   │   │   └── 04-adding-asset-features-to-your-user-interface/
│   │       │   │   │       ├── 01-adding-asset-features-to-your-user-interface-intro.markdown
│   │       │   │   │       ├── 02-creating-jsps-for-displaying-custom-assets-in-the-asset-publisher.markdown
│   │       │   │   │       ├── 03-enabling-tags-categories-and-assets-for-guestbooks.markdown
│   │       │   │   │       ├── 04-enabling-tags-categories-and-assets-for-entries.markdown
│   │       │   │   │       └── 05-enabling-comments-and-ratings-for-entries.markdown
│   │       │   │   └── 10-workflow/
│   │       │   │       ├── 01-intro.markdown
│   │       │   │       ├── 02-supporting-workflow-status/
│   │       │   │       │   ├── 01-enabling-workflow-service-layer-intro.markdown
│   │       │   │       │   ├── 02-setting-guestbook-status.markdown
│   │       │   │       │   ├── 03-setting-entry-status.markdown
│   │       │   │       │   └── 04-finding-entities-by-status.markdown
│   │       │   │       ├── 03-workflow-handlers/
│   │       │   │       │   ├── 01-implementing-workflow-handlers-intro.markdown
│   │       │   │       │   ├── 02-guestbook-workflow-handlers.markdown
│   │       │   │       │   └── 03-entry-workflow-handlers.markdown
│   │       │   │       └── 04-displaying-approved-items/
│   │       │   │           ├── 01-displaying-approved-workflow-items-intro.markdown
│   │       │   │           ├── 02-displaying-status-guestbook-admin.markdown
│   │       │   │           └── 03-displaying-approved-entries.markdown
│   │       │   ├── 03-upgrading-code-to-liferay-7.2/
│   │       │   │   ├── 01-intro.markdown
│   │       │   │   ├── 02-upgrading-your-development-environment.markdown
│   │       │   │   ├── 03-migrating-plugins-sdk-projects-to-liferay-workspace.markdown
│   │       │   │   ├── 04-upgrading-build-dependencies.markdown
│   │       │   │   ├── 05-fixing-upgrade-problems/
│   │       │   │   │   ├── 01-intro.markdown
│   │       │   │   │   ├── 02-resolving-a-projects-dependencies.markdown
│   │       │   │   │   └── 03-resolving-breaking-changes.markdown
│   │       │   │   ├── 06-upgrading-service-builder-services/
│   │       │   │   │   ├── 01-intro.markdown
│   │       │   │   │   ├── 02-removing-legacy-files.markdown
│   │       │   │   │   ├── 03-converting-a-service-builder-module-from-spring-di-to-osgi-ds.markdown
│   │       │   │   │   └── 04-rebuilding-services.markdown
│   │       │   │   ├── 07-upgrading-customization-plugins/
│   │       │   │   │   ├── 01-intro.markdown
│   │       │   │   │   ├── 02-upgrading-customization-modules.markdown
│   │       │   │   │   ├── 03-upgrading-core-jsp-hooks.markdown
│   │       │   │   │   ├── 04-upgrading-portlet-jsp-hooks.markdown
│   │       │   │   │   ├── 05-upgrading-service-wrapper-hooks.markdown
│   │       │   │   │   ├── 06-upgrading-core-language-key-hooks.markdown
│   │       │   │   │   ├── 07-upgrading-portlet-language-key-hooks.markdown
│   │       │   │   │   ├── 08-upgrading-model-listener-hooks.markdown
│   │       │   │   │   ├── 09-upgrading-event-actions-hooks.markdown
│   │       │   │   │   ├── 10-upgrading-servlet-filter-hooks.markdown
│   │       │   │   │   ├── 11-upgrading-portal-property-hooks.markdown
│   │       │   │   │   └── 12-upgrading-struts-action-hooks.markdown
│   │       │   │   ├── 08-upgrading-themes/
│   │       │   │   │   ├── 01-upgrading-a-theme-to-7-2-intro.markdown
│   │       │   │   │   ├── 02-upgrading-6.2-themes-7.2/
│   │       │   │   │   │   ├── 01-upgrading-6.2-themes-to-7.1-intro.markdown
│   │       │   │   │   │   ├── 02-setting-up-the-development-environment/
│   │       │   │   │   │   │   ├── 01-setting-up-the-development-environment-intro.markdown
│   │       │   │   │   │   │   ├── 02-installing-the-theme-generator.markdown
│   │       │   │   │   │   │   └── 03-importing-the-theme-into-the-toolkit.markdown
│   │       │   │   │   │   ├── 03-running-the-upgrade-task/
│   │       │   │   │   │   │   └── 01-running-the-theme-upgrade-task-for-6.2-themes-intro.markdown
│   │       │   │   │   │   ├── 04-updating-6.2-css-code/
│   │       │   │   │   │   │   ├── 01-updating-6.2-css-code-intro.markdown
│   │       │   │   │   │   │   ├── 02-updating-bootstrap-rules-and-font-awesome-imports.markdown
│   │       │   │   │   │   │   └── 03-updating-6.2-responsiveness.markdown
│   │       │   │   │   │   ├── 05-updating-theme-templates/
│   │       │   │   │   │   │   ├── 01-updating-6.2-theme-templates-intro.markdown
│   │       │   │   │   │   │   ├── 02-updating-6.2-portal-normal-theme-template.markdown
│   │       │   │   │   │   │   ├── 03-updating-6.2-navigation-theme-template.markdown
│   │       │   │   │   │   │   └── 04-updating-6.2-init-custom-theme-template.markdown
│   │       │   │   │   │   ├── 06-updating-the-resources-importer-configuration-and-content/
│   │       │   │   │   │   │   ├── 01-updating-the-importer-intro.markdown
│   │       │   │   │   │   │   ├── 02-updating-package-properties.markdown
│   │       │   │   │   │   │   ├── 03-updating-web-content.markdown
│   │       │   │   │   │   │   └── 04-updating-the-sitemap.markdown
│   │       │   │   │   │   └── 07-applying-clay-design-patterns/
│   │       │   │   │   │       └── 01-applying-clay-design-patterns-intro.markdown
│   │       │   │   │   ├── 03-upgrading-7.0-themes-7.2/
│   │       │   │   │   │   ├── 01-upgrading-7.0-themes-intro.markdown
│   │       │   │   │   │   ├── 02-running-the-upgrade-task/
│   │       │   │   │   │   │   └── 01-running-the-theme-upgrade-task-intro.markdown
│   │       │   │   │   │   ├── 03-updating-7.0-css-code/
│   │       │   │   │   │   │   ├── 01-updating-7.0-css-code-intro.markdown
│   │       │   │   │   │   │   ├── 02-renaming-7-0-css-files.markdown
│   │       │   │   │   │   │   ├── 03-updating-7.0-variables.markdown
│   │       │   │   │   │   │   └── 04-updating-7.0-imports.markdown
│   │       │   │   │   │   ├── 04-updating-7.0-theme-templates/
│   │       │   │   │   │   │   ├── 01-updating-7.0-theme-templates-intro.markdown
│   │       │   │   │   │   │   └── 02-updating-7.0-theme-templates-to-7.2.markdown
│   │       │   │   │   │   └── 05-bootstrap-lexicon-compatibility-layer.markdown
│   │       │   │   │   └── 04-upgrading-7.1-themes-7.2/
│   │       │   │   │       └── 01-upgrading-7-1-themes-7-2-intro.markdown
│   │       │   │   ├── 09-upgrading-layout-templates/
│   │       │   │   │   ├── 01-upgrading-layout-templates-to-7.2-intro.markdown
│   │       │   │   │   ├── 02-upgrading-6.2-layouts-7.2/
│   │       │   │   │   │   └── 01-upgrading-6-2-layout-templates-intro.markdown
│   │       │   │   │   └── 03-upgrading-7.0-7.1-layouts-7.2/
│   │       │   │   │       └── 01-upgrading-7-0-layout-templates-intro.markdown
│   │       │   │   ├── 10-upgrading-frameworks-and-features/
│   │       │   │   │   ├── 01-intro.markdown
│   │       │   │   │   ├── 02-upgrading-jndi-data-source-usage.markdown
│   │       │   │   │   ├── 03-upgrading-service-builder-service-invocation.markdown
│   │       │   │   │   ├── 04-upgrading-service-builder.markdown
│   │       │   │   │   └── 05-migrating-off-of-velocity-templates.markdown
│   │       │   │   ├── 11-upgrading-portlets/
│   │       │   │   │   ├── 01-intro.markdown
│   │       │   │   │   ├── 02-upgrading-a-genericportlet.markdown
│   │       │   │   │   ├── 03-upgrading-a-liferay-mvc-portlet.markdown
│   │       │   │   │   ├── 04-upgrading-a-liferay-jsf-portlet.markdown
│   │       │   │   │   ├── 05-upgrading-a-servlet-based-portlet.markdown
│   │       │   │   │   ├── 06-upgrading-a-spring-portlet-mvc-portlet.markdown
│   │       │   │   │   └── 07-upgrading-a-struts-1-portlet.markdown
│   │       │   │   ├── 12-upgrading-web-plugins.markdown
│   │       │   │   └── 13-upgrading-ext-plugins.markdown
│   │       │   └── 04-creating-a-theme/
│   │       │       ├── 01-creating-a-theme-intro.markdown
│   │       │       ├── 02-setting-up-the-theme.markdown
│   │       │       ├── 03-updating-the-header-and-logo.markdown
│   │       │       ├── 04-customizing-the-navigation.markdown
│   │       │       ├── 05-defining-the-footer-and-navigation.markdown
│   │       │       └── 06-adding-a-color-scheme.markdown
│   │       ├── build.xml
│   │       ├── code/
│   │       │   ├── guestbook/
│   │       │   │   ├── 04-web-front-end/
│   │       │   │   │   └── com-liferay-docs-guestbook/
│   │       │   │   │       ├── .blade.properties
│   │       │   │   │       ├── .gitignore
│   │       │   │   │       ├── build.gradle
│   │       │   │   │       ├── configs/
│   │       │   │   │       │   ├── common/
│   │       │   │   │       │   │   └── .touch
│   │       │   │   │       │   ├── dev/
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   ├── docker/
│   │       │   │   │       │   │   └── .touch
│   │       │   │   │       │   ├── local/
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   ├── prod/
│   │       │   │   │       │   │   ├── osgi/
│   │       │   │   │       │   │   │   └── configs/
│   │       │   │   │       │   │   │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   └── uat/
│   │       │   │   │       │       ├── osgi/
│   │       │   │   │       │       │   └── configs/
│   │       │   │   │       │       │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │   │       │       └── portal-ext.properties
│   │       │   │   │       ├── gradle/
│   │       │   │   │       │   └── wrapper/
│   │       │   │   │       │       ├── gradle-wrapper.jar
│   │       │   │   │       │       └── gradle-wrapper.properties
│   │       │   │   │       ├── gradle.properties
│   │       │   │   │       ├── gradlew
│   │       │   │   │       ├── gradlew.bat
│   │       │   │   │       ├── modules/
│   │       │   │   │       │   └── guestbook/
│   │       │   │   │       │       ├── .gitignore
│   │       │   │   │       │       ├── build.gradle
│   │       │   │   │       │       ├── guestbook-api/
│   │       │   │   │       │       │   ├── bnd.bnd
│   │       │   │   │       │       │   ├── build.gradle
│   │       │   │   │       │       │   └── src/
│   │       │   │   │       │       │       └── main/
│   │       │   │   │       │       │           └── java/
│   │       │   │   │       │       │               └── com/
│   │       │   │   │       │       │                   └── liferay/
│   │       │   │   │       │       │                       └── docs/
│   │       │   │   │       │       │                           └── guestbook/
│   │       │   │   │       │       │                               ├── exception/
│   │       │   │   │       │       │                               │   ├── EntryEmailException.java
│   │       │   │   │       │       │                               │   ├── EntryMessageException.java
│   │       │   │   │       │       │                               │   ├── EntryNameException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryEmailException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryMessageException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryNameException.java
│   │       │   │   │       │       │                               │   ├── GuestbookNameException.java
│   │       │   │   │       │       │                               │   ├── NoSuchGuestbookEntryException.java
│   │       │   │   │       │       │                               │   └── NoSuchGuestbookException.java
│   │       │   │   │       │       │                               ├── model/
│   │       │   │   │       │       │                               │   ├── Guestbook.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntry.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryModel.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntrySoap.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryWrapper.java
│   │       │   │   │       │       │                               │   ├── GuestbookModel.java
│   │       │   │   │       │       │                               │   ├── GuestbookSoap.java
│   │       │   │   │       │       │                               │   └── GuestbookWrapper.java
│   │       │   │   │       │       │                               └── service/
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalService.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryService.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalService.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookService.java
│   │       │   │   │       │       │                                   ├── GuestbookServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookServiceWrapper.java
│   │       │   │   │       │       │                                   └── persistence/
│   │       │   │   │       │       │                                       ├── GuestbookEntryPersistence.java
│   │       │   │   │       │       │                                       ├── GuestbookEntryUtil.java
│   │       │   │   │       │       │                                       ├── GuestbookPersistence.java
│   │       │   │   │       │       │                                       └── GuestbookUtil.java
│   │       │   │   │       │       ├── guestbook-service/
│   │       │   │   │       │       │   ├── bnd.bnd
│   │       │   │   │       │       │   ├── build.gradle
│   │       │   │   │       │       │   ├── service.xml
│   │       │   │   │       │       │   └── src/
│   │       │   │   │       │       │       └── main/
│   │       │   │   │       │       │           ├── java/
│   │       │   │   │       │       │           │   └── com/
│   │       │   │   │       │       │           │       └── liferay/
│   │       │   │   │       │       │           │           └── docs/
│   │       │   │   │       │       │           │               └── guestbook/
│   │       │   │   │       │       │           │                   ├── model/
│   │       │   │   │       │       │           │                   │   └── impl/
│   │       │   │   │       │       │           │                   │       ├── GuestbookBaseImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookCacheModel.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryBaseImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryCacheModel.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryModelImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookImpl.java
│   │       │   │   │       │       │           │                   │       └── GuestbookModelImpl.java
│   │       │   │   │       │       │           │                   └── service/
│   │       │   │   │       │       │           │                       ├── base/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryLocalServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookLocalServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceBaseImpl.java
│   │       │   │   │       │       │           │                       ├── http/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceHttp.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceSoap.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookServiceHttp.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceSoap.java
│   │       │   │   │       │       │           │                       ├── impl/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryLocalServiceImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookLocalServiceImpl.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceImpl.java
│   │       │   │   │       │       │           │                       └── persistence/
│   │       │   │   │       │       │           │                           └── impl/
│   │       │   │   │       │       │           │                               ├── GuestbookEntryPersistenceImpl.java
│   │       │   │   │       │       │           │                               ├── GuestbookPersistenceImpl.java
│   │       │   │   │       │       │           │                               └── constants/
│   │       │   │   │       │       │           │                                   └── GBPersistenceConstants.java
│   │       │   │   │       │       │           └── resources/
│   │       │   │   │       │       │               ├── META-INF/
│   │       │   │   │       │       │               │   ├── module-hbm.xml
│   │       │   │   │       │       │               │   ├── portlet-model-hints.xml
│   │       │   │   │       │       │               │   └── sql/
│   │       │   │   │       │       │               │       ├── indexes.sql
│   │       │   │   │       │       │               │       ├── sequences.sql
│   │       │   │   │       │       │               │       └── tables.sql
│   │       │   │   │       │       │               └── service.properties
│   │       │   │   │       │       └── guestbook-web/
│   │       │   │   │       │           ├── .gitignore
│   │       │   │   │       │           ├── bnd.bnd
│   │       │   │   │       │           ├── build.gradle
│   │       │   │   │       │           └── src/
│   │       │   │   │       │               └── main/
│   │       │   │   │       │                   ├── java/
│   │       │   │   │       │                   │   └── com/
│   │       │   │   │       │                   │       └── liferay/
│   │       │   │   │       │                   │           └── docs/
│   │       │   │   │       │                   │               └── guestbook/
│   │       │   │   │       │                   │                   ├── constants/
│   │       │   │   │       │                   │                   │   └── GuestbookPortletKeys.java
│   │       │   │   │       │                   │                   └── portlet/
│   │       │   │   │       │                   │                       └── GuestbookPortlet.java
│   │       │   │   │       │                   └── resources/
│   │       │   │   │       │                       ├── META-INF/
│   │       │   │   │       │                       │   └── resources/
│   │       │   │   │       │                       │       ├── css/
│   │       │   │   │       │                       │       │   └── main.scss
│   │       │   │   │       │                       │       ├── guestbook/
│   │       │   │   │       │                       │       │   ├── edit_entry.jsp
│   │       │   │   │       │                       │       │   ├── entry_actions.jsp
│   │       │   │   │       │                       │       │   └── view.jsp
│   │       │   │   │       │                       │       └── init.jsp
│   │       │   │   │       │                       └── content/
│   │       │   │   │       │                           └── Language.properties
│   │       │   │   │       └── settings.gradle
│   │       │   │   ├── 05-admin-portlet/
│   │       │   │   │   └── com-liferay-docs-guestbook/
│   │       │   │   │       ├── .blade.properties
│   │       │   │   │       ├── .gitignore
│   │       │   │   │       ├── build.gradle
│   │       │   │   │       ├── configs/
│   │       │   │   │       │   ├── common/
│   │       │   │   │       │   │   └── .touch
│   │       │   │   │       │   ├── dev/
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   ├── docker/
│   │       │   │   │       │   │   └── .touch
│   │       │   │   │       │   ├── local/
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   ├── prod/
│   │       │   │   │       │   │   ├── osgi/
│   │       │   │   │       │   │   │   └── configs/
│   │       │   │   │       │   │   │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   └── uat/
│   │       │   │   │       │       ├── osgi/
│   │       │   │   │       │       │   └── configs/
│   │       │   │   │       │       │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │   │       │       └── portal-ext.properties
│   │       │   │   │       ├── gradle/
│   │       │   │   │       │   └── wrapper/
│   │       │   │   │       │       ├── gradle-wrapper.jar
│   │       │   │   │       │       └── gradle-wrapper.properties
│   │       │   │   │       ├── gradle.properties
│   │       │   │   │       ├── gradlew
│   │       │   │   │       ├── gradlew.bat
│   │       │   │   │       ├── modules/
│   │       │   │   │       │   └── guestbook/
│   │       │   │   │       │       ├── .gitignore
│   │       │   │   │       │       ├── build.gradle
│   │       │   │   │       │       ├── guestbook-api/
│   │       │   │   │       │       │   ├── bnd.bnd
│   │       │   │   │       │       │   ├── build.gradle
│   │       │   │   │       │       │   └── src/
│   │       │   │   │       │       │       └── main/
│   │       │   │   │       │       │           └── java/
│   │       │   │   │       │       │               └── com/
│   │       │   │   │       │       │                   └── liferay/
│   │       │   │   │       │       │                       └── docs/
│   │       │   │   │       │       │                           └── guestbook/
│   │       │   │   │       │       │                               ├── exception/
│   │       │   │   │       │       │                               │   ├── EntryEmailException.java
│   │       │   │   │       │       │                               │   ├── EntryMessageException.java
│   │       │   │   │       │       │                               │   ├── EntryNameException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryEmailException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryMessageException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryNameException.java
│   │       │   │   │       │       │                               │   ├── GuestbookNameException.java
│   │       │   │   │       │       │                               │   ├── NoSuchGuestbookEntryException.java
│   │       │   │   │       │       │                               │   └── NoSuchGuestbookException.java
│   │       │   │   │       │       │                               ├── model/
│   │       │   │   │       │       │                               │   ├── Guestbook.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntry.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryModel.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntrySoap.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryWrapper.java
│   │       │   │   │       │       │                               │   ├── GuestbookModel.java
│   │       │   │   │       │       │                               │   ├── GuestbookSoap.java
│   │       │   │   │       │       │                               │   └── GuestbookWrapper.java
│   │       │   │   │       │       │                               └── service/
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalService.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryService.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalService.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookService.java
│   │       │   │   │       │       │                                   ├── GuestbookServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookServiceWrapper.java
│   │       │   │   │       │       │                                   └── persistence/
│   │       │   │   │       │       │                                       ├── GuestbookEntryPersistence.java
│   │       │   │   │       │       │                                       ├── GuestbookEntryUtil.java
│   │       │   │   │       │       │                                       ├── GuestbookPersistence.java
│   │       │   │   │       │       │                                       └── GuestbookUtil.java
│   │       │   │   │       │       ├── guestbook-service/
│   │       │   │   │       │       │   ├── bnd.bnd
│   │       │   │   │       │       │   ├── build.gradle
│   │       │   │   │       │       │   ├── service.xml
│   │       │   │   │       │       │   └── src/
│   │       │   │   │       │       │       └── main/
│   │       │   │   │       │       │           ├── java/
│   │       │   │   │       │       │           │   └── com/
│   │       │   │   │       │       │           │       └── liferay/
│   │       │   │   │       │       │           │           └── docs/
│   │       │   │   │       │       │           │               └── guestbook/
│   │       │   │   │       │       │           │                   ├── model/
│   │       │   │   │       │       │           │                   │   └── impl/
│   │       │   │   │       │       │           │                   │       ├── GuestbookBaseImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookCacheModel.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryBaseImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryCacheModel.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryModelImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookImpl.java
│   │       │   │   │       │       │           │                   │       └── GuestbookModelImpl.java
│   │       │   │   │       │       │           │                   └── service/
│   │       │   │   │       │       │           │                       ├── base/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryLocalServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookLocalServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceBaseImpl.java
│   │       │   │   │       │       │           │                       ├── http/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceHttp.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceSoap.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookServiceHttp.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceSoap.java
│   │       │   │   │       │       │           │                       ├── impl/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryLocalServiceImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookLocalServiceImpl.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceImpl.java
│   │       │   │   │       │       │           │                       └── persistence/
│   │       │   │   │       │       │           │                           └── impl/
│   │       │   │   │       │       │           │                               ├── GuestbookEntryPersistenceImpl.java
│   │       │   │   │       │       │           │                               ├── GuestbookPersistenceImpl.java
│   │       │   │   │       │       │           │                               └── constants/
│   │       │   │   │       │       │           │                                   └── GBPersistenceConstants.java
│   │       │   │   │       │       │           └── resources/
│   │       │   │   │       │       │               ├── META-INF/
│   │       │   │   │       │       │               │   ├── module-hbm.xml
│   │       │   │   │       │       │               │   ├── portlet-model-hints.xml
│   │       │   │   │       │       │               │   └── sql/
│   │       │   │   │       │       │               │       ├── indexes.sql
│   │       │   │   │       │       │               │       ├── sequences.sql
│   │       │   │   │       │       │               │       └── tables.sql
│   │       │   │   │       │       │               └── service.properties
│   │       │   │   │       │       └── guestbook-web/
│   │       │   │   │       │           ├── .gitignore
│   │       │   │   │       │           ├── bnd.bnd
│   │       │   │   │       │           ├── build.gradle
│   │       │   │   │       │           └── src/
│   │       │   │   │       │               └── main/
│   │       │   │   │       │                   ├── java/
│   │       │   │   │       │                   │   └── com/
│   │       │   │   │       │                   │       └── liferay/
│   │       │   │   │       │                   │           └── docs/
│   │       │   │   │       │                   │               └── guestbook/
│   │       │   │   │       │                   │                   ├── application/
│   │       │   │   │       │                   │                   │   └── list/
│   │       │   │   │       │                   │                   │       └── GuestbookAdminPanelApp.java
│   │       │   │   │       │                   │                   ├── constants/
│   │       │   │   │       │                   │                   │   └── GuestbookPortletKeys.java
│   │       │   │   │       │                   │                   └── portlet/
│   │       │   │   │       │                   │                       ├── GuestbookAdminPortlet.java
│   │       │   │   │       │                   │                       └── GuestbookPortlet.java
│   │       │   │   │       │                   └── resources/
│   │       │   │   │       │                       ├── META-INF/
│   │       │   │   │       │                       │   └── resources/
│   │       │   │   │       │                       │       ├── css/
│   │       │   │   │       │                       │       │   └── main.scss
│   │       │   │   │       │                       │       ├── guestbook/
│   │       │   │   │       │                       │       │   ├── edit_entry.jsp
│   │       │   │   │       │                       │       │   ├── entry_actions.jsp
│   │       │   │   │       │                       │       │   └── view.jsp
│   │       │   │   │       │                       │       ├── guestbook_admin/
│   │       │   │   │       │                       │       │   ├── edit_guestbook.jsp
│   │       │   │   │       │                       │       │   ├── guestbook_actions.jsp
│   │       │   │   │       │                       │       │   └── view.jsp
│   │       │   │   │       │                       │       └── init.jsp
│   │       │   │   │       │                       └── content/
│   │       │   │   │       │                           └── Language.properties
│   │       │   │   │       └── settings.gradle
│   │       │   │   ├── 06-messages/
│   │       │   │   │   └── com-liferay-docs-guestbook/
│   │       │   │   │       ├── .blade.properties
│   │       │   │   │       ├── .gitignore
│   │       │   │   │       ├── build.gradle
│   │       │   │   │       ├── configs/
│   │       │   │   │       │   ├── common/
│   │       │   │   │       │   │   └── .touch
│   │       │   │   │       │   ├── dev/
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   ├── docker/
│   │       │   │   │       │   │   └── .touch
│   │       │   │   │       │   ├── local/
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   ├── prod/
│   │       │   │   │       │   │   ├── osgi/
│   │       │   │   │       │   │   │   └── configs/
│   │       │   │   │       │   │   │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   └── uat/
│   │       │   │   │       │       ├── osgi/
│   │       │   │   │       │       │   └── configs/
│   │       │   │   │       │       │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │   │       │       └── portal-ext.properties
│   │       │   │   │       ├── gradle/
│   │       │   │   │       │   └── wrapper/
│   │       │   │   │       │       ├── gradle-wrapper.jar
│   │       │   │   │       │       └── gradle-wrapper.properties
│   │       │   │   │       ├── gradle.properties
│   │       │   │   │       ├── gradlew
│   │       │   │   │       ├── gradlew.bat
│   │       │   │   │       ├── modules/
│   │       │   │   │       │   └── guestbook/
│   │       │   │   │       │       ├── .gitignore
│   │       │   │   │       │       ├── build.gradle
│   │       │   │   │       │       ├── guestbook-api/
│   │       │   │   │       │       │   ├── bnd.bnd
│   │       │   │   │       │       │   ├── build.gradle
│   │       │   │   │       │       │   └── src/
│   │       │   │   │       │       │       └── main/
│   │       │   │   │       │       │           └── java/
│   │       │   │   │       │       │               └── com/
│   │       │   │   │       │       │                   └── liferay/
│   │       │   │   │       │       │                       └── docs/
│   │       │   │   │       │       │                           └── guestbook/
│   │       │   │   │       │       │                               ├── exception/
│   │       │   │   │       │       │                               │   ├── EntryEmailException.java
│   │       │   │   │       │       │                               │   ├── EntryMessageException.java
│   │       │   │   │       │       │                               │   ├── EntryNameException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryEmailException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryMessageException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryNameException.java
│   │       │   │   │       │       │                               │   ├── GuestbookNameException.java
│   │       │   │   │       │       │                               │   ├── NoSuchGuestbookEntryException.java
│   │       │   │   │       │       │                               │   └── NoSuchGuestbookException.java
│   │       │   │   │       │       │                               ├── model/
│   │       │   │   │       │       │                               │   ├── Guestbook.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntry.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryModel.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntrySoap.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryWrapper.java
│   │       │   │   │       │       │                               │   ├── GuestbookModel.java
│   │       │   │   │       │       │                               │   ├── GuestbookSoap.java
│   │       │   │   │       │       │                               │   └── GuestbookWrapper.java
│   │       │   │   │       │       │                               └── service/
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalService.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryService.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalService.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookService.java
│   │       │   │   │       │       │                                   ├── GuestbookServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookServiceWrapper.java
│   │       │   │   │       │       │                                   └── persistence/
│   │       │   │   │       │       │                                       ├── GuestbookEntryPersistence.java
│   │       │   │   │       │       │                                       ├── GuestbookEntryUtil.java
│   │       │   │   │       │       │                                       ├── GuestbookPersistence.java
│   │       │   │   │       │       │                                       └── GuestbookUtil.java
│   │       │   │   │       │       ├── guestbook-service/
│   │       │   │   │       │       │   ├── bnd.bnd
│   │       │   │   │       │       │   ├── build.gradle
│   │       │   │   │       │       │   ├── service.xml
│   │       │   │   │       │       │   └── src/
│   │       │   │   │       │       │       └── main/
│   │       │   │   │       │       │           ├── java/
│   │       │   │   │       │       │           │   └── com/
│   │       │   │   │       │       │           │       └── liferay/
│   │       │   │   │       │       │           │           └── docs/
│   │       │   │   │       │       │           │               └── guestbook/
│   │       │   │   │       │       │           │                   ├── model/
│   │       │   │   │       │       │           │                   │   └── impl/
│   │       │   │   │       │       │           │                   │       ├── GuestbookBaseImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookCacheModel.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryBaseImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryCacheModel.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryModelImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookImpl.java
│   │       │   │   │       │       │           │                   │       └── GuestbookModelImpl.java
│   │       │   │   │       │       │           │                   └── service/
│   │       │   │   │       │       │           │                       ├── base/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryLocalServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookLocalServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceBaseImpl.java
│   │       │   │   │       │       │           │                       ├── http/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceHttp.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceSoap.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookServiceHttp.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceSoap.java
│   │       │   │   │       │       │           │                       ├── impl/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryLocalServiceImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookLocalServiceImpl.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceImpl.java
│   │       │   │   │       │       │           │                       └── persistence/
│   │       │   │   │       │       │           │                           └── impl/
│   │       │   │   │       │       │           │                               ├── GuestbookEntryPersistenceImpl.java
│   │       │   │   │       │       │           │                               ├── GuestbookPersistenceImpl.java
│   │       │   │   │       │       │           │                               └── constants/
│   │       │   │   │       │       │           │                                   └── GBPersistenceConstants.java
│   │       │   │   │       │       │           └── resources/
│   │       │   │   │       │       │               ├── META-INF/
│   │       │   │   │       │       │               │   ├── module-hbm.xml
│   │       │   │   │       │       │               │   ├── portlet-model-hints.xml
│   │       │   │   │       │       │               │   └── sql/
│   │       │   │   │       │       │               │       ├── indexes.sql
│   │       │   │   │       │       │               │       ├── sequences.sql
│   │       │   │   │       │       │               │       └── tables.sql
│   │       │   │   │       │       │               └── service.properties
│   │       │   │   │       │       └── guestbook-web/
│   │       │   │   │       │           ├── .gitignore
│   │       │   │   │       │           ├── bnd.bnd
│   │       │   │   │       │           ├── build.gradle
│   │       │   │   │       │           └── src/
│   │       │   │   │       │               └── main/
│   │       │   │   │       │                   ├── java/
│   │       │   │   │       │                   │   └── com/
│   │       │   │   │       │                   │       └── liferay/
│   │       │   │   │       │                   │           └── docs/
│   │       │   │   │       │                   │               └── guestbook/
│   │       │   │   │       │                   │                   ├── application/
│   │       │   │   │       │                   │                   │   └── list/
│   │       │   │   │       │                   │                   │       └── GuestbookAdminPanelApp.java
│   │       │   │   │       │                   │                   ├── constants/
│   │       │   │   │       │                   │                   │   └── GuestbookPortletKeys.java
│   │       │   │   │       │                   │                   └── portlet/
│   │       │   │   │       │                   │                       ├── GuestbookAdminPortlet.java
│   │       │   │   │       │                   │                       └── GuestbookPortlet.java
│   │       │   │   │       │                   └── resources/
│   │       │   │   │       │                       ├── META-INF/
│   │       │   │   │       │                       │   └── resources/
│   │       │   │   │       │                       │       ├── css/
│   │       │   │   │       │                       │       │   └── main.scss
│   │       │   │   │       │                       │       ├── guestbook/
│   │       │   │   │       │                       │       │   ├── edit_entry.jsp
│   │       │   │   │       │                       │       │   ├── entry_actions.jsp
│   │       │   │   │       │                       │       │   └── view.jsp
│   │       │   │   │       │                       │       ├── guestbook_admin/
│   │       │   │   │       │                       │       │   ├── edit_guestbook.jsp
│   │       │   │   │       │                       │       │   ├── guestbook_actions.jsp
│   │       │   │   │       │                       │       │   └── view.jsp
│   │       │   │   │       │                       │       └── init.jsp
│   │       │   │   │       │                       └── content/
│   │       │   │   │       │                           └── Language.properties
│   │       │   │   │       └── settings.gradle
│   │       │   │   ├── 07-permissions/
│   │       │   │   │   └── com-liferay-docs-guestbook/
│   │       │   │   │       ├── .blade.properties
│   │       │   │   │       ├── .gitignore
│   │       │   │   │       ├── build.gradle
│   │       │   │   │       ├── configs/
│   │       │   │   │       │   ├── common/
│   │       │   │   │       │   │   └── .touch
│   │       │   │   │       │   ├── dev/
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   ├── docker/
│   │       │   │   │       │   │   └── .touch
│   │       │   │   │       │   ├── local/
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   ├── prod/
│   │       │   │   │       │   │   ├── osgi/
│   │       │   │   │       │   │   │   └── configs/
│   │       │   │   │       │   │   │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   └── uat/
│   │       │   │   │       │       ├── osgi/
│   │       │   │   │       │       │   └── configs/
│   │       │   │   │       │       │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │   │       │       └── portal-ext.properties
│   │       │   │   │       ├── gradle/
│   │       │   │   │       │   └── wrapper/
│   │       │   │   │       │       ├── gradle-wrapper.jar
│   │       │   │   │       │       └── gradle-wrapper.properties
│   │       │   │   │       ├── gradle.properties
│   │       │   │   │       ├── gradlew
│   │       │   │   │       ├── gradlew.bat
│   │       │   │   │       ├── modules/
│   │       │   │   │       │   └── guestbook/
│   │       │   │   │       │       ├── .gitignore
│   │       │   │   │       │       ├── build.gradle
│   │       │   │   │       │       ├── guestbook-api/
│   │       │   │   │       │       │   ├── bnd.bnd
│   │       │   │   │       │       │   ├── build.gradle
│   │       │   │   │       │       │   └── src/
│   │       │   │   │       │       │       └── main/
│   │       │   │   │       │       │           └── java/
│   │       │   │   │       │       │               └── com/
│   │       │   │   │       │       │                   └── liferay/
│   │       │   │   │       │       │                       └── docs/
│   │       │   │   │       │       │                           └── guestbook/
│   │       │   │   │       │       │                               ├── constants/
│   │       │   │   │       │       │                               │   ├── GuestbookConstants.java
│   │       │   │   │       │       │                               │   └── GuestbookPortletKeys.java
│   │       │   │   │       │       │                               ├── exception/
│   │       │   │   │       │       │                               │   ├── EntryEmailException.java
│   │       │   │   │       │       │                               │   ├── EntryMessageException.java
│   │       │   │   │       │       │                               │   ├── EntryNameException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryEmailException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryMessageException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryNameException.java
│   │       │   │   │       │       │                               │   ├── GuestbookNameException.java
│   │       │   │   │       │       │                               │   ├── NoSuchGuestbookEntryException.java
│   │       │   │   │       │       │                               │   └── NoSuchGuestbookException.java
│   │       │   │   │       │       │                               ├── model/
│   │       │   │   │       │       │                               │   ├── Guestbook.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntry.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryModel.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntrySoap.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryWrapper.java
│   │       │   │   │       │       │                               │   ├── GuestbookModel.java
│   │       │   │   │       │       │                               │   ├── GuestbookSoap.java
│   │       │   │   │       │       │                               │   └── GuestbookWrapper.java
│   │       │   │   │       │       │                               └── service/
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalService.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryService.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalService.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookService.java
│   │       │   │   │       │       │                                   ├── GuestbookServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookServiceWrapper.java
│   │       │   │   │       │       │                                   └── persistence/
│   │       │   │   │       │       │                                       ├── GuestbookEntryPersistence.java
│   │       │   │   │       │       │                                       ├── GuestbookEntryUtil.java
│   │       │   │   │       │       │                                       ├── GuestbookPersistence.java
│   │       │   │   │       │       │                                       └── GuestbookUtil.java
│   │       │   │   │       │       ├── guestbook-service/
│   │       │   │   │       │       │   ├── bnd.bnd
│   │       │   │   │       │       │   ├── build.gradle
│   │       │   │   │       │       │   ├── service.xml
│   │       │   │   │       │       │   └── src/
│   │       │   │   │       │       │       └── main/
│   │       │   │   │       │       │           ├── java/
│   │       │   │   │       │       │           │   └── com/
│   │       │   │   │       │       │           │       └── liferay/
│   │       │   │   │       │       │           │           └── docs/
│   │       │   │   │       │       │           │               └── guestbook/
│   │       │   │   │       │       │           │                   ├── internal/
│   │       │   │   │       │       │           │                   │   └── security/
│   │       │   │   │       │       │           │                   │       └── permission/
│   │       │   │   │       │       │           │                   │           └── resource/
│   │       │   │   │       │       │           │                   │               ├── GuestbookEntryModelResourcePermissionRegistrar.java
│   │       │   │   │       │       │           │                   │               ├── GuestbookModelResourcePermissionRegistrar.java
│   │       │   │   │       │       │           │                   │               └── GuestbookPortletResourcePermissionRegistrar.java
│   │       │   │   │       │       │           │                   ├── model/
│   │       │   │   │       │       │           │                   │   └── impl/
│   │       │   │   │       │       │           │                   │       ├── GuestbookBaseImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookCacheModel.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryBaseImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryCacheModel.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryModelImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookImpl.java
│   │       │   │   │       │       │           │                   │       └── GuestbookModelImpl.java
│   │       │   │   │       │       │           │                   └── service/
│   │       │   │   │       │       │           │                       ├── base/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryLocalServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookLocalServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceBaseImpl.java
│   │       │   │   │       │       │           │                       ├── http/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceHttp.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceSoap.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookServiceHttp.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceSoap.java
│   │       │   │   │       │       │           │                       ├── impl/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryLocalServiceImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookLocalServiceImpl.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceImpl.java
│   │       │   │   │       │       │           │                       └── persistence/
│   │       │   │   │       │       │           │                           └── impl/
│   │       │   │   │       │       │           │                               ├── GuestbookEntryPersistenceImpl.java
│   │       │   │   │       │       │           │                               ├── GuestbookPersistenceImpl.java
│   │       │   │   │       │       │           │                               └── constants/
│   │       │   │   │       │       │           │                                   └── GBPersistenceConstants.java
│   │       │   │   │       │       │           └── resources/
│   │       │   │   │       │       │               ├── META-INF/
│   │       │   │   │       │       │               │   ├── module-hbm.xml
│   │       │   │   │       │       │               │   ├── portlet-model-hints.xml
│   │       │   │   │       │       │               │   ├── resource-actions/
│   │       │   │   │       │       │               │   │   └── default.xml
│   │       │   │   │       │       │               │   └── sql/
│   │       │   │   │       │       │               │       ├── indexes.sql
│   │       │   │   │       │       │               │       ├── sequences.sql
│   │       │   │   │       │       │               │       └── tables.sql
│   │       │   │   │       │       │               ├── portlet.properties
│   │       │   │   │       │       │               └── service.properties
│   │       │   │   │       │       └── guestbook-web/
│   │       │   │   │       │           ├── .gitignore
│   │       │   │   │       │           ├── bnd.bnd
│   │       │   │   │       │           ├── build.gradle
│   │       │   │   │       │           └── src/
│   │       │   │   │       │               └── main/
│   │       │   │   │       │                   ├── java/
│   │       │   │   │       │                   │   └── com/
│   │       │   │   │       │                   │       └── liferay/
│   │       │   │   │       │                   │           └── docs/
│   │       │   │   │       │                   │               └── guestbook/
│   │       │   │   │       │                   │                   ├── application/
│   │       │   │   │       │                   │                   │   └── list/
│   │       │   │   │       │                   │                   │       └── GuestbookAdminPanelApp.java
│   │       │   │   │       │                   │                   ├── portlet/
│   │       │   │   │       │                   │                   │   ├── GuestbookAdminPortlet.java
│   │       │   │   │       │                   │                   │   └── GuestbookPortlet.java
│   │       │   │   │       │                   │                   └── web/
│   │       │   │   │       │                   │                       └── internal/
│   │       │   │   │       │                   │                           └── security/
│   │       │   │   │       │                   │                               └── permission/
│   │       │   │   │       │                   │                                   └── resource/
│   │       │   │   │       │                   │                                       ├── GuestbookEntryPermission.java
│   │       │   │   │       │                   │                                       ├── GuestbookModelPermission.java
│   │       │   │   │       │                   │                                       └── GuestbookPermission.java
│   │       │   │   │       │                   └── resources/
│   │       │   │   │       │                       ├── META-INF/
│   │       │   │   │       │                       │   ├── resource-actions/
│   │       │   │   │       │                       │   │   └── default.xml
│   │       │   │   │       │                       │   └── resources/
│   │       │   │   │       │                       │       ├── css/
│   │       │   │   │       │                       │       │   └── main.scss
│   │       │   │   │       │                       │       ├── guestbook/
│   │       │   │   │       │                       │       │   ├── edit_entry.jsp
│   │       │   │   │       │                       │       │   ├── entry_actions.jsp
│   │       │   │   │       │                       │       │   └── view.jsp
│   │       │   │   │       │                       │       ├── guestbook_admin/
│   │       │   │   │       │                       │       │   ├── edit_guestbook.jsp
│   │       │   │   │       │                       │       │   ├── guestbook_actions.jsp
│   │       │   │   │       │                       │       │   └── view.jsp
│   │       │   │   │       │                       │       └── init.jsp
│   │       │   │   │       │                       ├── content/
│   │       │   │   │       │                       │   └── Language.properties
│   │       │   │   │       │                       └── portlet.properties
│   │       │   │   │       └── settings.gradle
│   │       │   │   ├── 08-search/
│   │       │   │   │   └── com-liferay-docs-guestbook/
│   │       │   │   │       ├── .blade.properties
│   │       │   │   │       ├── .gitignore
│   │       │   │   │       ├── build.gradle
│   │       │   │   │       ├── configs/
│   │       │   │   │       │   ├── common/
│   │       │   │   │       │   │   └── .touch
│   │       │   │   │       │   ├── dev/
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   ├── docker/
│   │       │   │   │       │   │   └── .touch
│   │       │   │   │       │   ├── local/
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   ├── prod/
│   │       │   │   │       │   │   ├── osgi/
│   │       │   │   │       │   │   │   └── configs/
│   │       │   │   │       │   │   │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   └── uat/
│   │       │   │   │       │       ├── osgi/
│   │       │   │   │       │       │   └── configs/
│   │       │   │   │       │       │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │   │       │       └── portal-ext.properties
│   │       │   │   │       ├── gradle/
│   │       │   │   │       │   └── wrapper/
│   │       │   │   │       │       ├── gradle-wrapper.jar
│   │       │   │   │       │       └── gradle-wrapper.properties
│   │       │   │   │       ├── gradle.properties
│   │       │   │   │       ├── gradlew
│   │       │   │   │       ├── gradlew.bat
│   │       │   │   │       ├── modules/
│   │       │   │   │       │   └── guestbook/
│   │       │   │   │       │       ├── .gitignore
│   │       │   │   │       │       ├── build.gradle
│   │       │   │   │       │       ├── guestbook-api/
│   │       │   │   │       │       │   ├── bnd.bnd
│   │       │   │   │       │       │   ├── build.gradle
│   │       │   │   │       │       │   └── src/
│   │       │   │   │       │       │       └── main/
│   │       │   │   │       │       │           └── java/
│   │       │   │   │       │       │               └── com/
│   │       │   │   │       │       │                   └── liferay/
│   │       │   │   │       │       │                       └── docs/
│   │       │   │   │       │       │                           └── guestbook/
│   │       │   │   │       │       │                               ├── constants/
│   │       │   │   │       │       │                               │   ├── GuestbookConstants.java
│   │       │   │   │       │       │                               │   └── GuestbookPortletKeys.java
│   │       │   │   │       │       │                               ├── exception/
│   │       │   │   │       │       │                               │   ├── EntryEmailException.java
│   │       │   │   │       │       │                               │   ├── EntryMessageException.java
│   │       │   │   │       │       │                               │   ├── EntryNameException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryEmailException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryMessageException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryNameException.java
│   │       │   │   │       │       │                               │   ├── GuestbookNameException.java
│   │       │   │   │       │       │                               │   ├── NoSuchGuestbookEntryException.java
│   │       │   │   │       │       │                               │   └── NoSuchGuestbookException.java
│   │       │   │   │       │       │                               ├── model/
│   │       │   │   │       │       │                               │   ├── Guestbook.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntry.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryModel.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntrySoap.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryWrapper.java
│   │       │   │   │       │       │                               │   ├── GuestbookModel.java
│   │       │   │   │       │       │                               │   ├── GuestbookSoap.java
│   │       │   │   │       │       │                               │   └── GuestbookWrapper.java
│   │       │   │   │       │       │                               └── service/
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalService.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryService.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalService.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookService.java
│   │       │   │   │       │       │                                   ├── GuestbookServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookServiceWrapper.java
│   │       │   │   │       │       │                                   └── persistence/
│   │       │   │   │       │       │                                       ├── GuestbookEntryPersistence.java
│   │       │   │   │       │       │                                       ├── GuestbookEntryUtil.java
│   │       │   │   │       │       │                                       ├── GuestbookPersistence.java
│   │       │   │   │       │       │                                       └── GuestbookUtil.java
│   │       │   │   │       │       ├── guestbook-service/
│   │       │   │   │       │       │   ├── bnd.bnd
│   │       │   │   │       │       │   ├── build.gradle
│   │       │   │   │       │       │   ├── service.xml
│   │       │   │   │       │       │   └── src/
│   │       │   │   │       │       │       └── main/
│   │       │   │   │       │       │           ├── java/
│   │       │   │   │       │       │           │   └── com/
│   │       │   │   │       │       │           │       └── liferay/
│   │       │   │   │       │       │           │           └── docs/
│   │       │   │   │       │       │           │               └── guestbook/
│   │       │   │   │       │       │           │                   ├── internal/
│   │       │   │   │       │       │           │                   │   └── security/
│   │       │   │   │       │       │           │                   │       └── permission/
│   │       │   │   │       │       │           │                   │           └── resource/
│   │       │   │   │       │       │           │                   │               ├── GuestbookEntryModelResourcePermissionRegistrar.java
│   │       │   │   │       │       │           │                   │               ├── GuestbookModelResourcePermissionRegistrar.java
│   │       │   │   │       │       │           │                   │               └── GuestbookPortletResourcePermissionRegistrar.java
│   │       │   │   │       │       │           │                   ├── model/
│   │       │   │   │       │       │           │                   │   └── impl/
│   │       │   │   │       │       │           │                   │       ├── GuestbookBaseImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookCacheModel.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryBaseImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryCacheModel.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryModelImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookImpl.java
│   │       │   │   │       │       │           │                   │       └── GuestbookModelImpl.java
│   │       │   │   │       │       │           │                   ├── search/
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntryBatchReindexer.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntryBatchReindexerImpl.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntryKeywordQueryContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntryModelDocumentContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntryModelIndexerWriterContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntryModelSummaryContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntrySearchRegistrar.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookKeywordQueryContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookModelDocumentContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookModelIndexerWriterContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookModelSummaryContributor.java
│   │       │   │   │       │       │           │                   │   └── GuestbookSearchRegistrar.java
│   │       │   │   │       │       │           │                   └── service/
│   │       │   │   │       │       │           │                       ├── base/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryLocalServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookLocalServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceBaseImpl.java
│   │       │   │   │       │       │           │                       ├── http/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceHttp.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceSoap.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookServiceHttp.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceSoap.java
│   │       │   │   │       │       │           │                       ├── impl/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryLocalServiceImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookLocalServiceImpl.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceImpl.java
│   │       │   │   │       │       │           │                       └── persistence/
│   │       │   │   │       │       │           │                           └── impl/
│   │       │   │   │       │       │           │                               ├── GuestbookEntryPersistenceImpl.java
│   │       │   │   │       │       │           │                               ├── GuestbookPersistenceImpl.java
│   │       │   │   │       │       │           │                               └── constants/
│   │       │   │   │       │       │           │                                   └── GBPersistenceConstants.java
│   │       │   │   │       │       │           └── resources/
│   │       │   │   │       │       │               ├── META-INF/
│   │       │   │   │       │       │               │   ├── module-hbm.xml
│   │       │   │   │       │       │               │   ├── portlet-model-hints.xml
│   │       │   │   │       │       │               │   ├── resource-actions/
│   │       │   │   │       │       │               │   │   └── default.xml
│   │       │   │   │       │       │               │   └── sql/
│   │       │   │   │       │       │               │       ├── indexes.sql
│   │       │   │   │       │       │               │       ├── sequences.sql
│   │       │   │   │       │       │               │       └── tables.sql
│   │       │   │   │       │       │               ├── portlet.properties
│   │       │   │   │       │       │               └── service.properties
│   │       │   │   │       │       └── guestbook-web/
│   │       │   │   │       │           ├── .gitignore
│   │       │   │   │       │           ├── bnd.bnd
│   │       │   │   │       │           ├── build.gradle
│   │       │   │   │       │           └── src/
│   │       │   │   │       │               └── main/
│   │       │   │   │       │                   ├── java/
│   │       │   │   │       │                   │   └── com/
│   │       │   │   │       │                   │       └── liferay/
│   │       │   │   │       │                   │           └── docs/
│   │       │   │   │       │                   │               └── guestbook/
│   │       │   │   │       │                   │                   ├── application/
│   │       │   │   │       │                   │                   │   └── list/
│   │       │   │   │       │                   │                   │       └── GuestbookAdminPanelApp.java
│   │       │   │   │       │                   │                   ├── portlet/
│   │       │   │   │       │                   │                   │   ├── GuestbookAdminPortlet.java
│   │       │   │   │       │                   │                   │   └── GuestbookPortlet.java
│   │       │   │   │       │                   │                   └── web/
│   │       │   │   │       │                   │                       └── internal/
│   │       │   │   │       │                   │                           └── security/
│   │       │   │   │       │                   │                               └── permission/
│   │       │   │   │       │                   │                                   └── resource/
│   │       │   │   │       │                   │                                       ├── GuestbookEntryPermission.java
│   │       │   │   │       │                   │                                       ├── GuestbookModelPermission.java
│   │       │   │   │       │                   │                                       └── GuestbookPermission.java
│   │       │   │   │       │                   └── resources/
│   │       │   │   │       │                       ├── META-INF/
│   │       │   │   │       │                       │   ├── resource-actions/
│   │       │   │   │       │                       │   │   └── default.xml
│   │       │   │   │       │                       │   └── resources/
│   │       │   │   │       │                       │       ├── css/
│   │       │   │   │       │                       │       │   └── main.scss
│   │       │   │   │       │                       │       ├── guestbook/
│   │       │   │   │       │                       │       │   ├── edit_entry.jsp
│   │       │   │   │       │                       │       │   ├── entry_actions.jsp
│   │       │   │   │       │                       │       │   ├── view.jsp
│   │       │   │   │       │                       │       │   └── view_search.jsp
│   │       │   │   │       │                       │       ├── guestbook_admin/
│   │       │   │   │       │                       │       │   ├── edit_guestbook.jsp
│   │       │   │   │       │                       │       │   ├── guestbook_actions.jsp
│   │       │   │   │       │                       │       │   └── view.jsp
│   │       │   │   │       │                       │       └── init.jsp
│   │       │   │   │       │                       ├── content/
│   │       │   │   │       │                       │   └── Language.properties
│   │       │   │   │       │                       └── portlet.properties
│   │       │   │   │       └── settings.gradle
│   │       │   │   ├── 09-assets/
│   │       │   │   │   └── com-liferay-docs-guestbook/
│   │       │   │   │       ├── .blade.properties
│   │       │   │   │       ├── .gitignore
│   │       │   │   │       ├── build.gradle
│   │       │   │   │       ├── configs/
│   │       │   │   │       │   ├── common/
│   │       │   │   │       │   │   └── .touch
│   │       │   │   │       │   ├── dev/
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   ├── docker/
│   │       │   │   │       │   │   └── .touch
│   │       │   │   │       │   ├── local/
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   ├── prod/
│   │       │   │   │       │   │   ├── osgi/
│   │       │   │   │       │   │   │   └── configs/
│   │       │   │   │       │   │   │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │   │       │   │   └── portal-ext.properties
│   │       │   │   │       │   └── uat/
│   │       │   │   │       │       ├── osgi/
│   │       │   │   │       │       │   └── configs/
│   │       │   │   │       │       │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │   │       │       └── portal-ext.properties
│   │       │   │   │       ├── gradle/
│   │       │   │   │       │   └── wrapper/
│   │       │   │   │       │       ├── gradle-wrapper.jar
│   │       │   │   │       │       └── gradle-wrapper.properties
│   │       │   │   │       ├── gradle.properties
│   │       │   │   │       ├── gradlew
│   │       │   │   │       ├── gradlew.bat
│   │       │   │   │       ├── modules/
│   │       │   │   │       │   └── guestbook/
│   │       │   │   │       │       ├── .gitignore
│   │       │   │   │       │       ├── build.gradle
│   │       │   │   │       │       ├── guestbook-api/
│   │       │   │   │       │       │   ├── bnd.bnd
│   │       │   │   │       │       │   ├── build.gradle
│   │       │   │   │       │       │   └── src/
│   │       │   │   │       │       │       └── main/
│   │       │   │   │       │       │           └── java/
│   │       │   │   │       │       │               └── com/
│   │       │   │   │       │       │                   └── liferay/
│   │       │   │   │       │       │                       └── docs/
│   │       │   │   │       │       │                           └── guestbook/
│   │       │   │   │       │       │                               ├── constants/
│   │       │   │   │       │       │                               │   ├── GuestbookConstants.java
│   │       │   │   │       │       │                               │   └── GuestbookPortletKeys.java
│   │       │   │   │       │       │                               ├── exception/
│   │       │   │   │       │       │                               │   ├── EntryEmailException.java
│   │       │   │   │       │       │                               │   ├── EntryMessageException.java
│   │       │   │   │       │       │                               │   ├── EntryNameException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryEmailException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryMessageException.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryNameException.java
│   │       │   │   │       │       │                               │   ├── GuestbookNameException.java
│   │       │   │   │       │       │                               │   ├── NoSuchGuestbookEntryException.java
│   │       │   │   │       │       │                               │   └── NoSuchGuestbookException.java
│   │       │   │   │       │       │                               ├── model/
│   │       │   │   │       │       │                               │   ├── Guestbook.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntry.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryModel.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntrySoap.java
│   │       │   │   │       │       │                               │   ├── GuestbookEntryWrapper.java
│   │       │   │   │       │       │                               │   ├── GuestbookModel.java
│   │       │   │   │       │       │                               │   ├── GuestbookSoap.java
│   │       │   │   │       │       │                               │   └── GuestbookWrapper.java
│   │       │   │   │       │       │                               └── service/
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalService.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryLocalServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryService.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookEntryServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalService.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookLocalServiceWrapper.java
│   │       │   │   │       │       │                                   ├── GuestbookService.java
│   │       │   │   │       │       │                                   ├── GuestbookServiceUtil.java
│   │       │   │   │       │       │                                   ├── GuestbookServiceWrapper.java
│   │       │   │   │       │       │                                   └── persistence/
│   │       │   │   │       │       │                                       ├── GuestbookEntryPersistence.java
│   │       │   │   │       │       │                                       ├── GuestbookEntryUtil.java
│   │       │   │   │       │       │                                       ├── GuestbookPersistence.java
│   │       │   │   │       │       │                                       └── GuestbookUtil.java
│   │       │   │   │       │       ├── guestbook-service/
│   │       │   │   │       │       │   ├── bnd.bnd
│   │       │   │   │       │       │   ├── build.gradle
│   │       │   │   │       │       │   ├── service.xml
│   │       │   │   │       │       │   └── src/
│   │       │   │   │       │       │       └── main/
│   │       │   │   │       │       │           ├── java/
│   │       │   │   │       │       │           │   └── com/
│   │       │   │   │       │       │           │       └── liferay/
│   │       │   │   │       │       │           │           └── docs/
│   │       │   │   │       │       │           │               └── guestbook/
│   │       │   │   │       │       │           │                   ├── internal/
│   │       │   │   │       │       │           │                   │   └── security/
│   │       │   │   │       │       │           │                   │       └── permission/
│   │       │   │   │       │       │           │                   │           └── resource/
│   │       │   │   │       │       │           │                   │               ├── GuestbookEntryModelResourcePermissionRegistrar.java
│   │       │   │   │       │       │           │                   │               ├── GuestbookModelResourcePermissionRegistrar.java
│   │       │   │   │       │       │           │                   │               └── GuestbookPortletResourcePermissionRegistrar.java
│   │       │   │   │       │       │           │                   ├── model/
│   │       │   │   │       │       │           │                   │   └── impl/
│   │       │   │   │       │       │           │                   │       ├── GuestbookBaseImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookCacheModel.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryBaseImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryCacheModel.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookEntryModelImpl.java
│   │       │   │   │       │       │           │                   │       ├── GuestbookImpl.java
│   │       │   │   │       │       │           │                   │       └── GuestbookModelImpl.java
│   │       │   │   │       │       │           │                   ├── search/
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntryBatchReindexer.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntryBatchReindexerImpl.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntryKeywordQueryContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntryModelDocumentContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntryModelIndexerWriterContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntryModelSummaryContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookEntrySearchRegistrar.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookKeywordQueryContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookModelDocumentContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookModelIndexerWriterContributor.java
│   │       │   │   │       │       │           │                   │   ├── GuestbookModelSummaryContributor.java
│   │       │   │   │       │       │           │                   │   └── GuestbookSearchRegistrar.java
│   │       │   │   │       │       │           │                   └── service/
│   │       │   │   │       │       │           │                       ├── base/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryLocalServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookLocalServiceBaseImpl.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceBaseImpl.java
│   │       │   │   │       │       │           │                       ├── http/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceHttp.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceSoap.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookServiceHttp.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceSoap.java
│   │       │   │   │       │       │           │                       ├── impl/
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryLocalServiceImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookEntryServiceImpl.java
│   │       │   │   │       │       │           │                       │   ├── GuestbookLocalServiceImpl.java
│   │       │   │   │       │       │           │                       │   └── GuestbookServiceImpl.java
│   │       │   │   │       │       │           │                       └── persistence/
│   │       │   │   │       │       │           │                           └── impl/
│   │       │   │   │       │       │           │                               ├── GuestbookEntryPersistenceImpl.java
│   │       │   │   │       │       │           │                               ├── GuestbookPersistenceImpl.java
│   │       │   │   │       │       │           │                               └── constants/
│   │       │   │   │       │       │           │                                   └── GBPersistenceConstants.java
│   │       │   │   │       │       │           └── resources/
│   │       │   │   │       │       │               ├── META-INF/
│   │       │   │   │       │       │               │   ├── module-hbm.xml
│   │       │   │   │       │       │               │   ├── portlet-model-hints.xml
│   │       │   │   │       │       │               │   ├── resource-actions/
│   │       │   │   │       │       │               │   │   └── default.xml
│   │       │   │   │       │       │               │   └── sql/
│   │       │   │   │       │       │               │       ├── indexes.sql
│   │       │   │   │       │       │               │       ├── sequences.sql
│   │       │   │   │       │       │               │       └── tables.sql
│   │       │   │   │       │       │               ├── portlet.properties
│   │       │   │   │       │       │               └── service.properties
│   │       │   │   │       │       └── guestbook-web/
│   │       │   │   │       │           ├── .gitignore
│   │       │   │   │       │           ├── bnd.bnd
│   │       │   │   │       │           ├── build.gradle
│   │       │   │   │       │           └── src/
│   │       │   │   │       │               └── main/
│   │       │   │   │       │                   ├── java/
│   │       │   │   │       │                   │   └── com/
│   │       │   │   │       │                   │       └── liferay/
│   │       │   │   │       │                   │           └── docs/
│   │       │   │   │       │                   │               └── guestbook/
│   │       │   │   │       │                   │                   ├── application/
│   │       │   │   │       │                   │                   │   └── list/
│   │       │   │   │       │                   │                   │       └── GuestbookAdminPanelApp.java
│   │       │   │   │       │                   │                   ├── portlet/
│   │       │   │   │       │                   │                   │   ├── GuestbookAdminPortlet.java
│   │       │   │   │       │                   │                   │   └── GuestbookPortlet.java
│   │       │   │   │       │                   │                   └── web/
│   │       │   │   │       │                   │                       └── internal/
│   │       │   │   │       │                   │                           ├── asset/
│   │       │   │   │       │                   │                           │   ├── GuestbookAssetRenderer.java
│   │       │   │   │       │                   │                           │   ├── GuestbookAssetRendererFactory.java
│   │       │   │   │       │                   │                           │   ├── GuestbookEntryAssetRenderer.java
│   │       │   │   │       │                   │                           │   └── GuestbookEntryAssetRendererFactory.java
│   │       │   │   │       │                   │                           └── security/
│   │       │   │   │       │                   │                               └── permission/
│   │       │   │   │       │                   │                                   └── resource/
│   │       │   │   │       │                   │                                       ├── GuestbookEntryPermission.java
│   │       │   │   │       │                   │                                       ├── GuestbookModelPermission.java
│   │       │   │   │       │                   │                                       └── GuestbookPermission.java
│   │       │   │   │       │                   └── resources/
│   │       │   │   │       │                       ├── META-INF/
│   │       │   │   │       │                       │   ├── resource-actions/
│   │       │   │   │       │                       │   │   └── default.xml
│   │       │   │   │       │                       │   └── resources/
│   │       │   │   │       │                       │       ├── asset/
│   │       │   │   │       │                       │       │   ├── entry/
│   │       │   │   │       │                       │       │   │   └── full_content.jsp
│   │       │   │   │       │                       │       │   └── guestbook/
│   │       │   │   │       │                       │       │       └── full_content.jsp
│   │       │   │   │       │                       │       ├── css/
│   │       │   │   │       │                       │       │   └── main.scss
│   │       │   │   │       │                       │       ├── guestbook/
│   │       │   │   │       │                       │       │   ├── edit_entry.jsp
│   │       │   │   │       │                       │       │   ├── entry_actions.jsp
│   │       │   │   │       │                       │       │   ├── view.jsp
│   │       │   │   │       │                       │       │   ├── view_entry.jsp
│   │       │   │   │       │                       │       │   └── view_search.jsp
│   │       │   │   │       │                       │       ├── guestbook_admin/
│   │       │   │   │       │                       │       │   ├── edit_guestbook.jsp
│   │       │   │   │       │                       │       │   ├── guestbook_actions.jsp
│   │       │   │   │       │                       │       │   └── view.jsp
│   │       │   │   │       │                       │       └── init.jsp
│   │       │   │   │       │                       ├── content/
│   │       │   │   │       │                       │   └── Language.properties
│   │       │   │   │       │                       └── portlet.properties
│   │       │   │   │       └── settings.gradle
│   │       │   │   └── 10-workflow/
│   │       │   │       └── com-liferay-docs-guestbook/
│   │       │   │           ├── .blade.properties
│   │       │   │           ├── .gitignore
│   │       │   │           ├── build.gradle
│   │       │   │           ├── configs/
│   │       │   │           │   ├── common/
│   │       │   │           │   │   └── .touch
│   │       │   │           │   ├── dev/
│   │       │   │           │   │   └── portal-ext.properties
│   │       │   │           │   ├── docker/
│   │       │   │           │   │   └── .touch
│   │       │   │           │   ├── local/
│   │       │   │           │   │   └── portal-ext.properties
│   │       │   │           │   ├── prod/
│   │       │   │           │   │   ├── osgi/
│   │       │   │           │   │   │   └── configs/
│   │       │   │           │   │   │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │           │   │   └── portal-ext.properties
│   │       │   │           │   └── uat/
│   │       │   │           │       ├── osgi/
│   │       │   │           │       │   └── configs/
│   │       │   │           │       │       └── com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.config
│   │       │   │           │       └── portal-ext.properties
│   │       │   │           ├── gradle/
│   │       │   │           │   └── wrapper/
│   │       │   │           │       ├── gradle-wrapper.jar
│   │       │   │           │       └── gradle-wrapper.properties
│   │       │   │           ├── gradle.properties
│   │       │   │           ├── gradlew
│   │       │   │           ├── gradlew.bat
│   │       │   │           ├── modules/
│   │       │   │           │   └── guestbook/
│   │       │   │           │       ├── .gitignore
│   │       │   │           │       ├── build.gradle
│   │       │   │           │       ├── guestbook-api/
│   │       │   │           │       │   ├── bnd.bnd
│   │       │   │           │       │   ├── build.gradle
│   │       │   │           │       │   └── src/
│   │       │   │           │       │       └── main/
│   │       │   │           │       │           └── java/
│   │       │   │           │       │               └── com/
│   │       │   │           │       │                   └── liferay/
│   │       │   │           │       │                       └── docs/
│   │       │   │           │       │                           └── guestbook/
│   │       │   │           │       │                               ├── constants/
│   │       │   │           │       │                               │   ├── GuestbookConstants.java
│   │       │   │           │       │                               │   └── GuestbookPortletKeys.java
│   │       │   │           │       │                               ├── exception/
│   │       │   │           │       │                               │   ├── EntryEmailException.java
│   │       │   │           │       │                               │   ├── EntryMessageException.java
│   │       │   │           │       │                               │   ├── EntryNameException.java
│   │       │   │           │       │                               │   ├── GuestbookEntryEmailException.java
│   │       │   │           │       │                               │   ├── GuestbookEntryMessageException.java
│   │       │   │           │       │                               │   ├── GuestbookEntryNameException.java
│   │       │   │           │       │                               │   ├── GuestbookNameException.java
│   │       │   │           │       │                               │   ├── NoSuchGuestbookEntryException.java
│   │       │   │           │       │                               │   └── NoSuchGuestbookException.java
│   │       │   │           │       │                               ├── model/
│   │       │   │           │       │                               │   ├── Guestbook.java
│   │       │   │           │       │                               │   ├── GuestbookEntry.java
│   │       │   │           │       │                               │   ├── GuestbookEntryModel.java
│   │       │   │           │       │                               │   ├── GuestbookEntrySoap.java
│   │       │   │           │       │                               │   ├── GuestbookEntryWrapper.java
│   │       │   │           │       │                               │   ├── GuestbookModel.java
│   │       │   │           │       │                               │   ├── GuestbookSoap.java
│   │       │   │           │       │                               │   └── GuestbookWrapper.java
│   │       │   │           │       │                               └── service/
│   │       │   │           │       │                                   ├── GuestbookEntryLocalService.java
│   │       │   │           │       │                                   ├── GuestbookEntryLocalServiceUtil.java
│   │       │   │           │       │                                   ├── GuestbookEntryLocalServiceWrapper.java
│   │       │   │           │       │                                   ├── GuestbookEntryService.java
│   │       │   │           │       │                                   ├── GuestbookEntryServiceUtil.java
│   │       │   │           │       │                                   ├── GuestbookEntryServiceWrapper.java
│   │       │   │           │       │                                   ├── GuestbookLocalService.java
│   │       │   │           │       │                                   ├── GuestbookLocalServiceUtil.java
│   │       │   │           │       │                                   ├── GuestbookLocalServiceWrapper.java
│   │       │   │           │       │                                   ├── GuestbookService.java
│   │       │   │           │       │                                   ├── GuestbookServiceUtil.java
│   │       │   │           │       │                                   ├── GuestbookServiceWrapper.java
│   │       │   │           │       │                                   └── persistence/
│   │       │   │           │       │                                       ├── GuestbookEntryPersistence.java
│   │       │   │           │       │                                       ├── GuestbookEntryUtil.java
│   │       │   │           │       │                                       ├── GuestbookPersistence.java
│   │       │   │           │       │                                       └── GuestbookUtil.java
│   │       │   │           │       ├── guestbook-service/
│   │       │   │           │       │   ├── bnd.bnd
│   │       │   │           │       │   ├── build.gradle
│   │       │   │           │       │   ├── service.xml
│   │       │   │           │       │   └── src/
│   │       │   │           │       │       └── main/
│   │       │   │           │       │           ├── java/
│   │       │   │           │       │           │   └── com/
│   │       │   │           │       │           │       └── liferay/
│   │       │   │           │       │           │           └── docs/
│   │       │   │           │       │           │               └── guestbook/
│   │       │   │           │       │           │                   ├── internal/
│   │       │   │           │       │           │                   │   └── security/
│   │       │   │           │       │           │                   │       └── permission/
│   │       │   │           │       │           │                   │           └── resource/
│   │       │   │           │       │           │                   │               ├── GuestbookEntryModelResourcePermissionRegistrar.java
│   │       │   │           │       │           │                   │               ├── GuestbookModelResourcePermissionRegistrar.java
│   │       │   │           │       │           │                   │               └── GuestbookPortletResourcePermissionRegistrar.java
│   │       │   │           │       │           │                   ├── model/
│   │       │   │           │       │           │                   │   └── impl/
│   │       │   │           │       │           │                   │       ├── GuestbookBaseImpl.java
│   │       │   │           │       │           │                   │       ├── GuestbookCacheModel.java
│   │       │   │           │       │           │                   │       ├── GuestbookEntryBaseImpl.java
│   │       │   │           │       │           │                   │       ├── GuestbookEntryCacheModel.java
│   │       │   │           │       │           │                   │       ├── GuestbookEntryImpl.java
│   │       │   │           │       │           │ 
Download .txt
Showing preview only (778K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (9593 symbols across 570 files)

FILE: bin/migrate.py
  function append_to_line (line 7) | def append_to_line(line, new_line):
  function end_sidebar (line 13) | def end_sidebar(sidebar_line, newFile):
  function write_and_reset_string (line 21) | def write_and_reset_string(line, newFile):

FILE: code/liferay-doc-utils/src/com/liferay/documentation/movedclassreporter/BasicClassInfo.java
  class BasicClassInfo (line 5) | public class BasicClassInfo {
    method BasicClassInfo (line 7) | public BasicClassInfo(File file, String pkg) {
    method getFile (line 19) | public File getFile() {
    method getName (line 23) | public String getName() {
    method getPkg (line 27) | public String getPkg() {
    method getPkgEnd (line 31) | public String getPkgEnd() {

FILE: code/liferay-doc-utils/src/com/liferay/documentation/movedclassreporter/MovedClassInfo.java
  class MovedClassInfo (line 3) | public class MovedClassInfo {
    method MovedClassInfo (line 4) | public MovedClassInfo(BasicClassInfo basicClassInfo) {
    method getBasicClassInfo (line 10) | public BasicClassInfo getBasicClassInfo() {
    method getGroup (line 14) | public String getGroup( ) {
    method setGroup (line 18) | public void setGroup(String group) {
    method getPackageNew (line 22) | public String getPackageNew() {
    method setPackageNew (line 26) | public void setPackageNew(String packageNew) {
    method getModule (line 30) | public String getModule() {
    method setModule (line 34) | public void setModule(String module) {
    method getModuleVersion (line 38) | public String getModuleVersion() {
    method setModuleVersion (line 42) | public void setModuleVersion(String moduleVersion) {
    method getName (line 46) | public String getName() {
    method setName (line 50) | public void setName(String name) {
    method getPackageOld (line 54) | public String getPackageOld() {

FILE: code/liferay-doc-utils/src/com/liferay/documentation/movedclassreporter/MovedClassReporterMain.java
  class MovedClassReporterMain (line 19) | public class MovedClassReporterMain {
    method main (line 27) | public static void main(String[] args) {
    method extractModuleInfo (line 325) | private static void extractModuleInfo(BasicClassInfo classInfo, MovedC...
    method sortByClassName (line 393) | private static void sortByClassName(
    method sortByPackageName (line 408) | private static void sortByPackageName(
    method removeJavaSuffix (line 429) | private static void removeJavaSuffix(
    method getPackage (line 441) | private static String getPackage(File serviceClass) throws Exception {
    method listBndFiles (line 471) | private static void listBndFiles(String directoryName, ArrayList<File>...
    method listJavaFiles (line 491) | private static void listJavaFiles(File directory, ArrayList<File> file...

FILE: code/liferay-doc-utils/src/com/liferay/documentation/movedclassreporter/TemplateProcessor.java
  class TemplateProcessor (line 15) | public class TemplateProcessor {
    method processMovedClassesTemplate (line 17) | public void processMovedClassesTemplate(List<MovedClassInfo> movedClas...

FILE: code/liferay-doc-utils/src/com/liferay/documentation/util/AddTOCTask.java
  class AddTOCTask (line 16) | public class AddTOCTask extends Task {
    method execute (line 18) | @Override
    method addTOCs (line 46) | private static void addTOCs(List<String> fileListNoTOC) throws IOExcep...
    method getFilesWithNoTOC (line 96) | private static List<String> getFilesWithNoTOC(List<String> fileList)
    method setDocdir (line 140) | public void setDocdir(String docdir) {
    method setProductType (line 144) | public void setProductType(String productType) {

FILE: code/liferay-doc-utils/src/com/liferay/documentation/util/CheckArticleImagesTask.java
  class CheckArticleImagesTask (line 14) | public class CheckArticleImagesTask extends Task {
    method execute (line 16) | @Override
    method setArticle (line 94) | public void setArticle(String article) {
    method setDocdir (line 98) | public void setDocdir(String docdir) {
    method setImagedir (line 102) | public void setImagedir(String imagedir) {

FILE: code/liferay-doc-utils/src/com/liferay/documentation/util/CheckHeadersTask.java
  class CheckHeadersTask (line 19) | public class CheckHeadersTask extends Task {
    method execute (line 21) | @Override
    method setDocdir (line 188) | public void setDocdir(String docdir) {
    method setProductType (line 192) | public void setProductType(String productType) {

FILE: code/liferay-doc-utils/src/com/liferay/documentation/util/CheckImageUtil.java
  class CheckImageUtil (line 11) | public class CheckImageUtil {
    method checkImgSrc (line 13) | public static List<String> checkImgSrc(

FILE: code/liferay-doc-utils/src/com/liferay/documentation/util/CheckImagesTask.java
  class CheckImagesTask (line 23) | public class CheckImagesTask extends Task {
    method execute (line 31) | @Override
    method setResolveImages (line 141) | public void setResolveImages(boolean resolveImages) {
    method setDocdir (line 145) | public void setDocdir(String docdir) {
    method setProductType (line 149) | public void setProductType(String productType) {
    method checkImages (line 168) | private static void checkImages(List<File> images, Map<File,
    method getFileName (line 297) | private static String getFileName(String path) {
    method getImagePaths (line 319) | private static List<String> getImagePaths(File article) {
    method replaceImagePaths (line 400) | private void replaceImagePaths(File docDir) throws IOException {

FILE: code/liferay-doc-utils/src/com/liferay/documentation/util/CheckIntrosTask.java
  class CheckIntrosTask (line 11) | public class CheckIntrosTask extends Task {
    method execute (line 13) | @Override
    method setDocdir (line 48) | public void setDocdir(String docdir) {
    method checkFolderForIntros (line 52) | private void checkFolderForIntros(File folder) {

FILE: code/liferay-doc-utils/src/com/liferay/documentation/util/CheckLatestCommitTask.java
  class CheckLatestCommitTask (line 45) | public class CheckLatestCommitTask extends Task {
    method execute (line 47) | @Override
    method setDocDir (line 165) | public void setDocDir(String docDir) {
    method setDocLocation (line 169) | public void setDocLocation(String docLocation) {
    method setDxpParam (line 173) | public void setDxpParam(String dxpParam) {
    method setDistDir (line 177) | public void setDistDir(String distDir) {
    method setZipName (line 181) | public void setZipName(String zipName) {
    method addToZipFile (line 194) | private static void addToZipFile(String modFile, ZipOutputStream zipOu...
    method getIntroFiles (line 226) | private static Set<String> getIntroFiles(Set<String> markdownFiles) {
    method getMarkdownFiles (line 266) | private static Set<File> getMarkdownFiles(File dir) {
    method generateLatestCommitFile (line 301) | private static void generateLatestCommitFile(String headCommit)
    method getArticlesWithModifiedImages (line 317) | private static Set<String> getArticlesWithModifiedImages(Set<File> zip...
    method getHeadCommit (line 343) | private static String getHeadCommit() throws IOException {
    method getImageFiles (line 359) | private static Set<File> getImageFiles(File dir) {
    method getModifiedFiles (line 388) | private static List<String> getModifiedFiles(String commit, String doc...
    method mapModFilesToZipFiles (line 477) | private static Set<String> mapModFilesToZipFiles(Set<String> modifiedF...
    method openGitRepository (line 509) | private static Repository openGitRepository() throws IOException {
    method scanMarkdownForAllImages (line 524) | private static Set<String> scanMarkdownForAllImages(Set<String> modifi...
    method scanMarkdownForImage (line 587) | private static Set<File> scanMarkdownForImage(String imgPath, Set<File...
    method unzipFile (line 627) | private static void unzipFile(String docDir, String zipName)
    method writeDeletedTextFile (line 672) | private static void writeDeletedTextFile(List<String> deletedFiles, St...

FILE: code/liferay-doc-utils/src/com/liferay/documentation/util/CheckLinksTask.java
  class CheckLinksTask (line 29) | public class CheckLinksTask extends Task {
    method execute (line 31) | @Override
    method setApiLinks (line 160) | public void setApiLinks(boolean apiLinks) {
    method setDocdir (line 164) | public void setDocdir(String docdir) {
    method setLegacyLinks (line 168) | public void setLegacyLinks(boolean legacyLinks) {
    method setAppReferenceSite (line 172) | public void setAppReferenceSite(String appReferenceSite) {
    method setPlatformReferenceSite (line 176) | public void setPlatformReferenceSite(String platformReferenceSite) {
    method setAppToken (line 180) | public void setAppToken(String appToken) {
    method setPlatformToken (line 184) | public void setPlatformToken(String platformToken) {
    method setDxpCheck (line 188) | public void setDxpCheck(boolean dxpCheck) {
    method addDxpOnlyArticles (line 202) | private static List<File> addDxpOnlyArticles(List<File> articles, Stri...
    method assembleId (line 239) | private static String assembleId(String heading, int idCount) {
    method assignDirHeaders (line 267) | private static ArrayList<List<String>> assignDirHeaders(String line, i...
    method assignReferencedDirArticles (line 316) | private static void assignReferencedDirArticles(String[] dirs) {
    method checkMultiLinks (line 362) | private static void checkMultiLinks(File article, String line, LineNum...
    method checkMultiSubLinks (line 430) | private static void checkMultiSubLinks(File article, String line, Line...
    method countStrings (line 462) | private static int countStrings(String line) {
    method doesDocFoldersMatch (line 504) | private static boolean doesDocFoldersMatch(String line, int lineIndex) {
    method extractHeader (line 552) | private static String extractHeader(String line, File article, LineNum...
    method extractHeading (line 576) | private static String extractHeading(String line) {
    method extractMultiStrings (line 617) | private static LinkedHashMap<String, Integer> extractMultiStrings(Stri...
    method extractLdnUrl (line 657) | private static String extractLdnUrl(String line, int lineNumber, File ...
    method extractSubHeader (line 690) | private static String extractSubHeader(String line, File article, Line...
    method findArticleMatchingLink (line 715) | private static File findArticleMatchingLink(List<File> articles, Strin...
    method findArticles (line 749) | private static List<File> findArticles(String path) {
    method findCurrentDirArticles (line 807) | private static List<File> findCurrentDirArticles(File articleDir) {
    method findHeaders (line 846) | private static ArrayList<List<String>> findHeaders(List<File> articles...
    method generateVirtualSecondaryHeader (line 903) | private static String generateVirtualSecondaryHeader(String line, Stri...
    method getDxpArticles (line 938) | private static List<File> getDxpArticles(String path) {
    method getHeaderDir (line 971) | private static String getHeaderDir(String line, int lineIndex) {
    method includeDxpOverrides (line 1019) | private static List<File> includeDxpOverrides(List<File> articles, Lis...
    method isApiUrlValid (line 1085) | private static boolean isApiUrlValid(File article, LineNumberReader in...
    method isLdnUrlValid (line 1134) | private static boolean isLdnUrlValid(String url, File article, int lin...
    method isSubUrlValid (line 1178) | private static boolean isSubUrlValid(File article, String secondaryHea...
    method isUrlValid (line 1222) | private static boolean isUrlValid(String line, File article, LineNumbe...
    method logInvalidUrl (line 1302) | private static void logInvalidUrl(File article, int lineNumber, String...

FILE: code/liferay-doc-utils/src/com/liferay/documentation/util/CleanImages.java
  class CleanImages (line 11) | public class CleanImages {
    method main (line 13) | public static void main(String[] args) throws Exception {
    method extractImageName (line 113) | private static String extractImageName(String line, String dirType) {

FILE: code/liferay-doc-utils/src/com/liferay/documentation/util/ConcatMarkdownTask.java
  class ConcatMarkdownTask (line 19) | public class ConcatMarkdownTask extends Task {
    method execute (line 21) | public void execute() throws BuildException {
    method numberImage (line 103) | private String numberImage (String line, int chapter, int imageNum) {
    method collectFiles (line 121) | public List<File> collectFiles(File dir) throws FileNotFoundException,...
    method getFileListingNoSort (line 138) | private List<File> getFileListingNoSort(
    method stripHeaderIds (line 155) | private void stripHeaderIds(String markdownFilePath) throws IOException {
    method validateDirectory (line 170) | private void validateDirectory(
    method setDocdir (line 186) | public void setDocdir(String docdir) {

FILE: code/liferay-doc-utils/src/com/liferay/documentation/util/ConvertHeadersTask.java
  class ConvertHeadersTask (line 16) | public class ConvertHeadersTask extends Task {
    method execute (line 18) | public void execute() throws BuildException {
    method setDocdir (line 96) | public void setDocdir(String docdir) {

FILE: code/liferay-doc-utils/src/com/liferay/documentation/util/ConvertLinksTask.java
  class ConvertLinksTask (line 16) | public class ConvertLinksTask  extends Task {
    method execute (line 18) | public void execute() throws BuildException {
    method setDocdir (line 273) | public void setDocdir(String docdir) {
    method getHeaderID (line 277) | private static String getHeaderID(String line, String findStr, String ...
    method getOldLink (line 286) | private static String getOldLink(String docType, String line, String f...
    method getVersion (line 296) | private static String getVersion(String line, String findStr) {

FILE: code/liferay-doc-utils/src/com/liferay/documentation/util/ConvertSidebarsTask.java
  class ConvertSidebarsTask (line 19) | public class ConvertSidebarsTask extends Task {
    method execute (line 21) | public void execute() throws BuildException {
    method setDocdir (line 168) | public void setDocdir(String docdir) {

FILE: code/liferay-doc-utils/src/com/liferay/documentation/util/DistDiffTask.java
  class DistDiffTask (line 23) | public class DistDiffTask extends Task {
    method execute (line 25) | @Override
    method setDocdir (line 197) | public void setDocdir(String docdir) {
    method setPurposedir (line 201) | public void setPurposedir(String purposedir) {
    method addToZipFile (line 205) | private static void addToZipFile(String modFile, ZipOutputStream zipOu...
    method findIntroFiles (line 225) | private static void findIntroFiles(Set<File> markdownFiles, Set<String...
    method findMarkdownFiles (line 252) | private static void findMarkdownFiles(File dir, Set<File> chFiles) {
    method scanMarkdownForAllImages (line 277) | private static void scanMarkdownForAllImages(Set<File> modifiedMarkdow...
    method scanMarkdownForImage (line 311) | private static void scanMarkdownForImage(String img, Set<File> chFiles...

FILE: code/liferay-doc-utils/src/com/liferay/documentation/util/DocsUtil.java
  class DocsUtil (line 13) | public class DocsUtil {
    method getMarkdownFileList (line 15) | public static List<String> getMarkdownFileList(String docDir, String d...

FILE: code/liferay-doc-utils/src/com/liferay/documentation/util/FindParentIntros.java
  class FindParentIntros (line 10) | public class FindParentIntros {
    method main (line 12) | public static void main(String[] args) throws IOException {

FILE: code/liferay-doc-utils/src/com/liferay/documentation/util/GitCompare.java
  class GitCompare (line 21) | public class GitCompare {
    method main (line 23) | public static void main(String[] args) throws GitAPIException, IOExcep...
    method addTimeStamp (line 73) | private static void addTimeStamp(String message, PrintWriter writer) {
    method gitTreeParser (line 79) | private static AbstractTreeIterator gitTreeParser(Repository repo, Str...
    method openGitRepository (line 99) | private static Repository openGitRepository() throws IOException {

FILE: code/liferay-doc-utils/src/com/liferay/documentation/util/MarkdownToHtml.java
  class MarkdownToHtml (line 28) | public class MarkdownToHtml {
    method main (line 30) | public static void main(String[] args) throws IOException {

FILE: code/liferay-doc-utils/src/com/liferay/documentation/util/NumberHeadersTask.java
  class NumberHeadersTask (line 21) | public class NumberHeadersTask extends Task {
    method execute (line 23) | @Override
    method assembleId (line 179) | private static String assembleId(String heading, int idCount) {
    method checkOverrideHeaders (line 205) | private static void checkOverrideHeaders(String duplicateFile, String ...
    method extractHeading (line 326) | private static String extractHeading(String line, int indexOfFirstHead...
    method generateNewHeader (line 358) | private static String generateNewHeader(String filename, String line, ...
    method getArticlesDirName (line 405) | private static String getArticlesDirName(String filename) {
    method getDuplicateFiles (line 420) | private static List<String> getDuplicateFiles(String docDir,
    method getFileList (line 438) | private static List<String> getFileList(String docDir, String dirType)
    method getHeaderId (line 497) | private static String getHeaderId(String headerIdLine) {
    method getHeaderIdLine (line 510) | private static String getHeaderIdLine(File file) throws IOException {
    method isOverrideFile (line 530) | private static boolean isOverrideFile(String filename, List<String> du...
    method validateHeaderId (line 545) | private static void validateHeaderId(String filename, String headerIdL...
    method setDocdir (line 605) | public void setDocdir(String docdir) {
    method setProductType (line 609) | public void setProductType(String productType) {

FILE: code/liferay-doc-utils/src/com/liferay/documentation/util/NumberImagesTask.java
  class NumberImagesTask (line 16) | public class NumberImagesTask extends Task {
    method execute (line 18) | @Override
    method setDocDir (line 85) | public void setDocDir(String docDir) {
    method setProductType (line 89) | public void setProductType(String productType) {
    method numberImages (line 93) | private void numberImages(String markdownFilePath) throws IOException {
    method resetImages (line 134) | private void resetImages(String markdownFilePath) throws IOException {

FILE: code/sample-content-portlet-lr-workspace/modules/com.liferay.docs.samplecontent/src/main/java/com/liferay/docs/samplecontent/portlet/SampleContentPortlet.java
  class SampleContentPortlet (line 40) | @Component(
    method addUsers (line 55) | public void addUsers(ActionRequest request, ActionResponse response) {
    method addOrganizations (line 156) | public void addOrganizations(ActionRequest request, ActionResponse res...
    method addUserGroups (line 249) | public void addUserGroups(ActionRequest request, ActionResponse respon...
    method getUserLocalService (line 310) | public UserLocalService getUserLocalService() {
    method getOrganizationLocalService (line 314) | public OrganizationLocalService getOrganizationLocalService() {
    method getUserGroupLocalService (line 318) | public UserGroupLocalService getUserGroupLocalService() {
    method getRoleLocalService (line 322) | public RoleLocalService getRoleLocalService() {
    method setUserLocalService (line 326) | @Reference
    method setOrganizationLocalService (line 331) | @Reference
    method setUserGroupLocalService (line 336) | @Reference
    method setRoleLocalService (line 341) | @Reference
    class JSONOrgWrapper (line 353) | private class JSONOrgWrapper {
      method JSONOrgWrapper (line 355) | public JSONOrgWrapper(JSONObject jsonObject, String parentOrgName) {
      method getJSONObject (line 360) | public JSONObject getJSONObject() {
      method getParentOrgName (line 364) | public String getParentOrgName() {

FILE: en/developer/appdev/code/angular-guestbook/after/my-angular-guestbook/src/app/add-entry/add-entry.component.ts
  class AddEntryComponent (line 13) | class AddEntryComponent implements OnInit {
    method constructor (line 19) | constructor(
    method ngOnInit (line 26) | ngOnInit() {
    method getEntries (line 31) | getEntries(): void {
    method getEntriesLength (line 36) | getEntriesLength(): void {
    method goBack (line 41) | goBack(): void {
    method add (line 46) | add(name: string, message: string): void {

FILE: en/developer/appdev/code/angular-guestbook/after/my-angular-guestbook/src/app/app-routing.module.ts
  class AppRoutingModule (line 18) | class AppRoutingModule { }

FILE: en/developer/appdev/code/angular-guestbook/after/my-angular-guestbook/src/app/app.component.ts
  class AppComponent (line 7) | class AppComponent {

FILE: en/developer/appdev/code/angular-guestbook/after/my-angular-guestbook/src/app/app.module.ts
  class AppModule (line 39) | class AppModule {
    method ngDoBootstrap (line 43) | ngDoBootstrap() {}

FILE: en/developer/appdev/code/angular-guestbook/after/my-angular-guestbook/src/app/dynamic.loader.ts
  class DynamicLoader (line 16) | class DynamicLoader {
    method constructor (line 17) | constructor(private injector: Injector) {}
    method loadComponent (line 19) | loadComponent<T>(component: Type<T>, params: LiferayParams) {

FILE: en/developer/appdev/code/angular-guestbook/after/my-angular-guestbook/src/app/entry.service.ts
  class EntryService (line 15) | class EntryService {
    method constructor (line 19) | constructor(
    method getEntries (line 24) | getEntries (): Observable<GuestbookEntry[]> {
    method addEntry (line 35) | addEntry (entry: GuestbookEntry): void { //removed return type Observa...
    method log (line 45) | private log(message: string) {

FILE: en/developer/appdev/code/angular-guestbook/after/my-angular-guestbook/src/app/guestbook-entry.ts
  class GuestbookEntry (line 1) | class GuestbookEntry {

FILE: en/developer/appdev/code/angular-guestbook/after/my-angular-guestbook/src/app/in-memory-data.service.ts
  class InMemoryDataService (line 8) | class InMemoryDataService implements InMemoryDbService {
    method createDb (line 9) | createDb() {
    method genId (line 25) | genId(entries: GuestbookEntry[]): number {

FILE: en/developer/appdev/code/angular-guestbook/after/my-angular-guestbook/src/app/mock-guestbook-entries.ts
  constant ENTRIES (line 3) | const ENTRIES: GuestbookEntry[] = [

FILE: en/developer/appdev/code/angular-guestbook/after/my-angular-guestbook/src/app/view-guestbook/view-guestbook.component.ts
  class ViewGuestbookComponent (line 10) | class ViewGuestbookComponent implements OnInit {
    method constructor (line 14) | constructor(private entryService: EntryService) { }
    method ngOnInit (line 16) | ngOnInit() {
    method getEntries (line 20) | getEntries(): void {

FILE: en/developer/appdev/code/angular-guestbook/after/my-angular-guestbook/src/types/LiferayParams.ts
  type LiferayParams (line 7) | interface LiferayParams {

FILE: en/developer/appdev/code/angular-guestbook/before/angular-guestbook/e2e/protractor.conf.js
  method onPrepare (line 22) | onPrepare() {

FILE: en/developer/appdev/code/angular-guestbook/before/angular-guestbook/e2e/src/app.po.ts
  class AppPage (line 3) | class AppPage {
    method navigateTo (line 4) | navigateTo() {
    method getTitleText (line 8) | getTitleText() {

FILE: en/developer/appdev/code/angular-guestbook/before/angular-guestbook/src/app/add-entry/add-entry.component.ts
  class AddEntryComponent (line 12) | class AddEntryComponent implements OnInit {
    method constructor (line 18) | constructor(
    method ngOnInit (line 24) | ngOnInit() {
    method getEntries (line 29) | getEntries(): void {
    method getEntriesLength (line 34) | getEntriesLength(): void {
    method goBack (line 39) | goBack(): void {
    method add (line 43) | add(name: string, message: string): void {

FILE: en/developer/appdev/code/angular-guestbook/before/angular-guestbook/src/app/app-routing.module.ts
  class AppRoutingModule (line 16) | class AppRoutingModule { }

FILE: en/developer/appdev/code/angular-guestbook/before/angular-guestbook/src/app/app.component.ts
  class AppComponent (line 8) | class AppComponent {

FILE: en/developer/appdev/code/angular-guestbook/before/angular-guestbook/src/app/app.module.ts
  class AppModule (line 36) | class AppModule { }

FILE: en/developer/appdev/code/angular-guestbook/before/angular-guestbook/src/app/entry.service.ts
  class EntryService (line 15) | class EntryService {
    method constructor (line 19) | constructor(
    method getEntries (line 23) | getEntries (): Observable<GuestbookEntry[]> {
    method addEntry (line 32) | addEntry (entry: GuestbookEntry): Observable<GuestbookEntry> {
    method log (line 41) | private log(message: string) {
    method handleError (line 52) | private handleError<T> (operation = 'operation', result?: T) {

FILE: en/developer/appdev/code/angular-guestbook/before/angular-guestbook/src/app/guestbook-entry.ts
  class GuestbookEntry (line 1) | class GuestbookEntry {

FILE: en/developer/appdev/code/angular-guestbook/before/angular-guestbook/src/app/in-memory-data.service.ts
  class InMemoryDataService (line 8) | class InMemoryDataService implements InMemoryDbService {
    method createDb (line 9) | createDb() {
    method genId (line 25) | genId(entries: GuestbookEntry[]): number {

FILE: en/developer/appdev/code/angular-guestbook/before/angular-guestbook/src/app/mock-guestbook-entries.ts
  constant ENTRIES (line 3) | const ENTRIES: GuestbookEntry[] = [

FILE: en/developer/appdev/code/angular-guestbook/before/angular-guestbook/src/app/view-guestbook/view-guestbook.component.ts
  class ViewGuestbookComponent (line 10) | class ViewGuestbookComponent implements OnInit {
    method onSelect (line 13) | onSelect(entry: GuestbookEntry): void {
    method constructor (line 19) | constructor(private entryService: EntryService) { }
    method ngOnInit (line 21) | ngOnInit() {
    method getEntries (line 25) | getEntries(): void {

FILE: en/developer/appdev/code/react-guestbook/after/react-guestbook-app-migrated/src/App.js
  class App (line 6) | class App extends React.Component {
    method constructor (line 7) | constructor(props) {
    method addEntry (line 23) | addEntry(name, message){
    method resetRedirect (line 34) | resetRedirect(){
    method render (line 40) | render(){

FILE: en/developer/appdev/code/react-guestbook/after/react-guestbook-app-migrated/src/add-entry.js
  class EntryForm (line 4) | class EntryForm extends React.Component {
    method constructor (line 5) | constructor(props) {
    method handleChange (line 13) | handleChange(event) {
    method handleClick (line 17) | handleClick(event) {
    method render (line 26) | render() {

FILE: en/developer/appdev/code/react-guestbook/after/react-guestbook-app-migrated/src/index.js
  function main (line 13) | function main({portletNamespace, contextPath, portletElementId}) {

FILE: en/developer/appdev/code/react-guestbook/after/react-guestbook-app-migrated/src/serviceWorker.js
  function register (line 23) | function register(config) {
  function registerValidSW (line 57) | function registerValidSW(swUrl, config) {
  function checkValidServiceWorker (line 101) | function checkValidServiceWorker(swUrl, config) {
  function unregister (line 129) | function unregister() {

FILE: en/developer/appdev/code/react-guestbook/after/react-guestbook-app-migrated/src/view-guestbook.js
  class Guestbook (line 4) | class Guestbook extends React.Component {
    method render (line 6) | render() {

FILE: en/developer/appdev/code/react-guestbook/before/my-react-guestbook-app/src/App.js
  class App (line 6) | class App extends React.Component {
    method constructor (line 7) | constructor(props) {
    method addEntry (line 23) | addEntry(name, message){
    method resetRedirect (line 35) | resetRedirect(){
    method render (line 41) | render(){

FILE: en/developer/appdev/code/react-guestbook/before/my-react-guestbook-app/src/add-entry.js
  class EntryForm (line 4) | class EntryForm extends React.Component {
    method constructor (line 5) | constructor(props) {
    method handleChange (line 13) | handleChange(event) {
    method handleClick (line 17) | handleClick(event) {
    method render (line 26) | render() {

FILE: en/developer/appdev/code/react-guestbook/before/my-react-guestbook-app/src/serviceWorker.js
  function register (line 23) | function register(config) {
  function registerValidSW (line 57) | function registerValidSW(swUrl, config) {
  function checkValidServiceWorker (line 101) | function checkValidServiceWorker(swUrl, config) {
  function unregister (line 129) | function unregister() {

FILE: en/developer/appdev/code/react-guestbook/before/my-react-guestbook-app/src/view-guestbook.js
  class Guestbook (line 4) | class Guestbook extends React.Component {
    method render (line 6) | render() {

FILE: en/developer/appdev/code/vue-guestbook/after/vue-guestbook-migrated/src/Api.js
  class Api (line 3) | class Api {
    method getEntries (line 4) | static getEntries() {
    method addEntry (line 21) | static addEntry(entry) {

FILE: en/developer/appdev/code/vue-guestbook/after/vue-guestbook-migrated/src/index.js
  function main (line 7) | function main({portletNamespace, contextPath, portletElementId}) {

FILE: en/developer/appdev/code/vue-guestbook/before/vue-guestbook/src/Api.js
  class Api (line 3) | class Api {
    method getEntries (line 4) | static getEntries() {
    method addEntry (line 21) | static addEntry(entry) {

FILE: en/developer/reference/code/adapted-react-app/my-react-guestbook-app/src/App.js
  class App (line 6) | class App extends React.Component {
    method constructor (line 7) | constructor(props) {
    method addEntry (line 23) | addEntry(name, message){
    method resetRedirect (line 35) | resetRedirect(){
    method render (line 41) | render(){

FILE: en/developer/reference/code/adapted-react-app/my-react-guestbook-app/src/add-entry.js
  class EntryForm (line 4) | class EntryForm extends React.Component {
    method constructor (line 5) | constructor(props) {
    method handleChange (line 13) | handleChange(event) {
    method handleClick (line 17) | handleClick(event) {
    method render (line 26) | render() {

FILE: en/developer/reference/code/adapted-react-app/my-react-guestbook-app/src/serviceWorker.js
  function register (line 23) | function register(config) {
  function registerValidSW (line 57) | function registerValidSW(swUrl, config) {
  function checkValidServiceWorker (line 101) | function checkValidServiceWorker(swUrl, config) {
  function unregister (line 129) | function unregister() {

FILE: en/developer/reference/code/adapted-react-app/my-react-guestbook-app/src/view-guestbook.js
  class Guestbook (line 4) | class Guestbook extends React.Component {
    method render (line 6) | render() {

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/exception/EntryEmailException.java
  class EntryEmailException (line 23) | @ProviderType
    method EntryEmailException (line 26) | public EntryEmailException() {
    method EntryEmailException (line 29) | public EntryEmailException(String msg) {
    method EntryEmailException (line 33) | public EntryEmailException(String msg, Throwable cause) {
    method EntryEmailException (line 37) | public EntryEmailException(Throwable cause) {

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/exception/EntryMessageException.java
  class EntryMessageException (line 23) | @ProviderType
    method EntryMessageException (line 26) | public EntryMessageException() {
    method EntryMessageException (line 29) | public EntryMessageException(String msg) {
    method EntryMessageException (line 33) | public EntryMessageException(String msg, Throwable cause) {
    method EntryMessageException (line 37) | public EntryMessageException(Throwable cause) {

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/exception/EntryNameException.java
  class EntryNameException (line 23) | @ProviderType
    method EntryNameException (line 26) | public EntryNameException() {
    method EntryNameException (line 29) | public EntryNameException(String msg) {
    method EntryNameException (line 33) | public EntryNameException(String msg, Throwable cause) {
    method EntryNameException (line 37) | public EntryNameException(Throwable cause) {

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/exception/GuestbookEntryEmailException.java
  class GuestbookEntryEmailException (line 23) | @ProviderType
    method GuestbookEntryEmailException (line 26) | public GuestbookEntryEmailException() {
    method GuestbookEntryEmailException (line 29) | public GuestbookEntryEmailException(String msg) {
    method GuestbookEntryEmailException (line 33) | public GuestbookEntryEmailException(String msg, Throwable cause) {
    method GuestbookEntryEmailException (line 37) | public GuestbookEntryEmailException(Throwable cause) {

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/exception/GuestbookEntryMessageException.java
  class GuestbookEntryMessageException (line 23) | @ProviderType
    method GuestbookEntryMessageException (line 26) | public GuestbookEntryMessageException() {
    method GuestbookEntryMessageException (line 29) | public GuestbookEntryMessageException(String msg) {
    method GuestbookEntryMessageException (line 33) | public GuestbookEntryMessageException(String msg, Throwable cause) {
    method GuestbookEntryMessageException (line 37) | public GuestbookEntryMessageException(Throwable cause) {

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/exception/GuestbookEntryNameException.java
  class GuestbookEntryNameException (line 23) | @ProviderType
    method GuestbookEntryNameException (line 26) | public GuestbookEntryNameException() {
    method GuestbookEntryNameException (line 29) | public GuestbookEntryNameException(String msg) {
    method GuestbookEntryNameException (line 33) | public GuestbookEntryNameException(String msg, Throwable cause) {
    method GuestbookEntryNameException (line 37) | public GuestbookEntryNameException(Throwable cause) {

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/exception/GuestbookNameException.java
  class GuestbookNameException (line 23) | @ProviderType
    method GuestbookNameException (line 26) | public GuestbookNameException() {
    method GuestbookNameException (line 29) | public GuestbookNameException(String msg) {
    method GuestbookNameException (line 33) | public GuestbookNameException(String msg, Throwable cause) {
    method GuestbookNameException (line 37) | public GuestbookNameException(Throwable cause) {

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/exception/NoSuchGuestbookEntryException.java
  class NoSuchGuestbookEntryException (line 23) | @ProviderType
    method NoSuchGuestbookEntryException (line 26) | public NoSuchGuestbookEntryException() {
    method NoSuchGuestbookEntryException (line 29) | public NoSuchGuestbookEntryException(String msg) {
    method NoSuchGuestbookEntryException (line 33) | public NoSuchGuestbookEntryException(String msg, Throwable cause) {
    method NoSuchGuestbookEntryException (line 37) | public NoSuchGuestbookEntryException(Throwable cause) {

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/exception/NoSuchGuestbookException.java
  class NoSuchGuestbookException (line 23) | @ProviderType
    method NoSuchGuestbookException (line 26) | public NoSuchGuestbookException() {
    method NoSuchGuestbookException (line 29) | public NoSuchGuestbookException(String msg) {
    method NoSuchGuestbookException (line 33) | public NoSuchGuestbookException(String msg, Throwable cause) {
    method NoSuchGuestbookException (line 37) | public NoSuchGuestbookException(Throwable cause) {

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/model/Guestbook.java
  type Guestbook (line 30) | @ImplementationClassName("com.liferay.docs.guestbook.model.impl.Guestboo...
    method get (line 42) | @Override
    method getAttributeClass (line 47) | @Override
    method getTypeClass (line 52) | @Override

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/model/GuestbookEntry.java
  type GuestbookEntry (line 30) | @ImplementationClassName(
    method get (line 44) | @Override
    method getAttributeClass (line 49) | @Override
    method getTypeClass (line 54) | @Override

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/model/GuestbookEntryModel.java
  type GuestbookEntryModel (line 39) | @ProviderType
    method getPrimaryKey (line 55) | public long getPrimaryKey();
    method setPrimaryKey (line 62) | public void setPrimaryKey(long primaryKey);
    method getUuid (line 69) | @AutoEscape
    method setUuid (line 78) | @Override
    method getEntryId (line 86) | public long getEntryId();
    method setEntryId (line 93) | public void setEntryId(long entryId);
    method getName (line 100) | @AutoEscape
    method setName (line 108) | public void setName(String name);
    method getEmail (line 115) | @AutoEscape
    method setEmail (line 123) | public void setEmail(String email);
    method getMessage (line 130) | @AutoEscape
    method setMessage (line 138) | public void setMessage(String message);
    method getGuestbookId (line 145) | public long getGuestbookId();
    method setGuestbookId (line 152) | public void setGuestbookId(long guestbookId);
    method getGroupId (line 159) | @Override
    method setGroupId (line 167) | @Override
    method getCompanyId (line 175) | @Override
    method setCompanyId (line 183) | @Override
    method getUserId (line 191) | @Override
    method setUserId (line 199) | @Override
    method getUserUuid (line 207) | @Override
    method setUserUuid (line 215) | @Override
    method getUserName (line 223) | @AutoEscape
    method setUserName (line 232) | @Override
    method getCreateDate (line 240) | @Override
    method setCreateDate (line 248) | @Override
    method getModifiedDate (line 256) | @Override
    method setModifiedDate (line 264) | @Override
    method getStatus (line 272) | @Override
    method setStatus (line 280) | @Override
    method getStatusByUserId (line 288) | @Override
    method setStatusByUserId (line 296) | @Override
    method getStatusByUserUuid (line 304) | @Override
    method setStatusByUserUuid (line 312) | @Override
    method getStatusByUserName (line 320) | @AutoEscape
    method setStatusByUserName (line 329) | @Override
    method getStatusDate (line 337) | @Override
    method setStatusDate (line 345) | @Override
    method isApproved (line 353) | @Override
    method isDenied (line 361) | @Override
    method isDraft (line 369) | @Override
    method isExpired (line 377) | @Override
    method isInactive (line 385) | @Override
    method isIncomplete (line 393) | @Override
    method isPending (line 401) | @Override
    method isScheduled (line 409) | @Override

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/model/GuestbookEntrySoap.java
  class GuestbookEntrySoap (line 31) | @ProviderType
    method toSoapModel (line 34) | public static GuestbookEntrySoap toSoapModel(GuestbookEntry model) {
    method toSoapModels (line 57) | public static GuestbookEntrySoap[] toSoapModels(GuestbookEntry[] model...
    method toSoapModels (line 67) | public static GuestbookEntrySoap[][] toSoapModels(
    method toSoapModels (line 87) | public static GuestbookEntrySoap[] toSoapModels(
    method GuestbookEntrySoap (line 100) | public GuestbookEntrySoap() {
    method getPrimaryKey (line 103) | public long getPrimaryKey() {
    method setPrimaryKey (line 107) | public void setPrimaryKey(long pk) {
    method getUuid (line 111) | public String getUuid() {
    method setUuid (line 115) | public void setUuid(String uuid) {
    method getEntryId (line 119) | public long getEntryId() {
    method setEntryId (line 123) | public void setEntryId(long entryId) {
    method getName (line 127) | public String getName() {
    method setName (line 131) | public void setName(String name) {
    method getEmail (line 135) | public String getEmail() {
    method setEmail (line 139) | public void setEmail(String email) {
    method getMessage (line 143) | public String getMessage() {
    method setMessage (line 147) | public void setMessage(String message) {
    method getGuestbookId (line 151) | public long getGuestbookId() {
    method setGuestbookId (line 155) | public void setGuestbookId(long guestbookId) {
    method getGroupId (line 159) | public long getGroupId() {
    method setGroupId (line 163) | public void setGroupId(long groupId) {
    method getCompanyId (line 167) | public long getCompanyId() {
    method setCompanyId (line 171) | public void setCompanyId(long companyId) {
    method getUserId (line 175) | public long getUserId() {
    method setUserId (line 179) | public void setUserId(long userId) {
    method getUserName (line 183) | public String getUserName() {
    method setUserName (line 187) | public void setUserName(String userName) {
    method getCreateDate (line 191) | public Date getCreateDate() {
    method setCreateDate (line 195) | public void setCreateDate(Date createDate) {
    method getModifiedDate (line 199) | public Date getModifiedDate() {
    method setModifiedDate (line 203) | public void setModifiedDate(Date modifiedDate) {
    method getStatus (line 207) | public int getStatus() {
    method setStatus (line 211) | public void setStatus(int status) {
    method getStatusByUserId (line 215) | public long getStatusByUserId() {
    method setStatusByUserId (line 219) | public void setStatusByUserId(long statusByUserId) {
    method getStatusByUserName (line 223) | public String getStatusByUserName() {
    method setStatusByUserName (line 227) | public void setStatusByUserName(String statusByUserName) {
    method getStatusDate (line 231) | public Date getStatusDate() {
    method setStatusDate (line 235) | public void setStatusDate(Date statusDate) {

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/model/GuestbookEntryWrapper.java
  class GuestbookEntryWrapper (line 36) | @ProviderType
    method GuestbookEntryWrapper (line 41) | public GuestbookEntryWrapper(GuestbookEntry guestbookEntry) {
    method getModelAttributes (line 45) | @Override
    method setModelAttributes (line 69) | @Override
    method getCompanyId (line 173) | @Override
    method getCreateDate (line 183) | @Override
    method getEmail (line 193) | @Override
    method getEntryId (line 203) | @Override
    method getGroupId (line 213) | @Override
    method getGuestbookId (line 223) | @Override
    method getMessage (line 233) | @Override
    method getModifiedDate (line 243) | @Override
    method getName (line 253) | @Override
    method getPrimaryKey (line 263) | @Override
    method getStatus (line 273) | @Override
    method getStatusByUserId (line 283) | @Override
    method getStatusByUserName (line 293) | @Override
    method getStatusByUserUuid (line 303) | @Override
    method getStatusDate (line 313) | @Override
    method getUserId (line 323) | @Override
    method getUserName (line 333) | @Override
    method getUserUuid (line 343) | @Override
    method getUuid (line 353) | @Override
    method isApproved (line 363) | @Override
    method isDenied (line 373) | @Override
    method isDraft (line 383) | @Override
    method isExpired (line 393) | @Override
    method isInactive (line 403) | @Override
    method isIncomplete (line 413) | @Override
    method isPending (line 423) | @Override
    method isScheduled (line 433) | @Override
    method persist (line 438) | @Override
    method setCompanyId (line 448) | @Override
    method setCreateDate (line 458) | @Override
    method setEmail (line 468) | @Override
    method setEntryId (line 478) | @Override
    method setGroupId (line 488) | @Override
    method setGuestbookId (line 498) | @Override
    method setMessage (line 508) | @Override
    method setModifiedDate (line 518) | @Override
    method setName (line 528) | @Override
    method setPrimaryKey (line 538) | @Override
    method setStatus (line 548) | @Override
    method setStatusByUserId (line 558) | @Override
    method setStatusByUserName (line 568) | @Override
    method setStatusByUserUuid (line 578) | @Override
    method setStatusDate (line 588) | @Override
    method setUserId (line 598) | @Override
    method setUserName (line 608) | @Override
    method setUserUuid (line 618) | @Override
    method setUuid (line 628) | @Override
    method getStagedModelType (line 633) | @Override
    method wrap (line 638) | @Override

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/model/GuestbookModel.java
  type GuestbookModel (line 39) | @ProviderType
    method getPrimaryKey (line 55) | public long getPrimaryKey();
    method setPrimaryKey (line 62) | public void setPrimaryKey(long primaryKey);
    method getUuid (line 69) | @AutoEscape
    method setUuid (line 78) | @Override
    method getGuestbookId (line 86) | public long getGuestbookId();
    method setGuestbookId (line 93) | public void setGuestbookId(long guestbookId);
    method getName (line 100) | @AutoEscape
    method setName (line 108) | public void setName(String name);
    method getGroupId (line 115) | @Override
    method setGroupId (line 123) | @Override
    method getCompanyId (line 131) | @Override
    method setCompanyId (line 139) | @Override
    method getUserId (line 147) | @Override
    method setUserId (line 155) | @Override
    method getUserUuid (line 163) | @Override
    method setUserUuid (line 171) | @Override
    method getUserName (line 179) | @AutoEscape
    method setUserName (line 188) | @Override
    method getCreateDate (line 196) | @Override
    method setCreateDate (line 204) | @Override
    method getModifiedDate (line 212) | @Override
    method setModifiedDate (line 220) | @Override
    method getStatus (line 228) | @Override
    method setStatus (line 236) | @Override
    method getStatusByUserId (line 244) | @Override
    method setStatusByUserId (line 252) | @Override
    method getStatusByUserUuid (line 260) | @Override
    method setStatusByUserUuid (line 268) | @Override
    method getStatusByUserName (line 276) | @AutoEscape
    method setStatusByUserName (line 285) | @Override
    method getStatusDate (line 293) | @Override
    method setStatusDate (line 301) | @Override
    method isApproved (line 309) | @Override
    method isDenied (line 317) | @Override
    method isDraft (line 325) | @Override
    method isExpired (line 333) | @Override
    method isInactive (line 341) | @Override
    method isIncomplete (line 349) | @Override
    method isPending (line 357) | @Override
    method isScheduled (line 365) | @Override

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/model/GuestbookSoap.java
  class GuestbookSoap (line 31) | @ProviderType
    method toSoapModel (line 34) | public static GuestbookSoap toSoapModel(Guestbook model) {
    method toSoapModels (line 54) | public static GuestbookSoap[] toSoapModels(Guestbook[] models) {
    method toSoapModels (line 64) | public static GuestbookSoap[][] toSoapModels(Guestbook[][] models) {
    method toSoapModels (line 81) | public static GuestbookSoap[] toSoapModels(List<Guestbook> models) {
    method GuestbookSoap (line 92) | public GuestbookSoap() {
    method getPrimaryKey (line 95) | public long getPrimaryKey() {
    method setPrimaryKey (line 99) | public void setPrimaryKey(long pk) {
    method getUuid (line 103) | public String getUuid() {
    method setUuid (line 107) | public void setUuid(String uuid) {
    method getGuestbookId (line 111) | public long getGuestbookId() {
    method setGuestbookId (line 115) | public void setGuestbookId(long guestbookId) {
    method getName (line 119) | public String getName() {
    method setName (line 123) | public void setName(String name) {
    method getGroupId (line 127) | public long getGroupId() {
    method setGroupId (line 131) | public void setGroupId(long groupId) {
    method getCompanyId (line 135) | public long getCompanyId() {
    method setCompanyId (line 139) | public void setCompanyId(long companyId) {
    method getUserId (line 143) | public long getUserId() {
    method setUserId (line 147) | public void setUserId(long userId) {
    method getUserName (line 151) | public String getUserName() {
    method setUserName (line 155) | public void setUserName(String userName) {
    method getCreateDate (line 159) | public Date getCreateDate() {
    method setCreateDate (line 163) | public void setCreateDate(Date createDate) {
    method getModifiedDate (line 167) | public Date getModifiedDate() {
    method setModifiedDate (line 171) | public void setModifiedDate(Date modifiedDate) {
    method getStatus (line 175) | public int getStatus() {
    method setStatus (line 179) | public void setStatus(int status) {
    method getStatusByUserId (line 183) | public long getStatusByUserId() {
    method setStatusByUserId (line 187) | public void setStatusByUserId(long statusByUserId) {
    method getStatusByUserName (line 191) | public String getStatusByUserName() {
    method setStatusByUserName (line 195) | public void setStatusByUserName(String statusByUserName) {
    method getStatusDate (line 199) | public Date getStatusDate() {
    method setStatusDate (line 203) | public void setStatusDate(Date statusDate) {

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/model/GuestbookWrapper.java
  class GuestbookWrapper (line 36) | @ProviderType
    method GuestbookWrapper (line 41) | public GuestbookWrapper(Guestbook guestbook) {
    method getModelAttributes (line 45) | @Override
    method setModelAttributes (line 66) | @Override
    method getCompanyId (line 152) | @Override
    method getCreateDate (line 162) | @Override
    method getGroupId (line 172) | @Override
    method getGuestbookId (line 182) | @Override
    method getModifiedDate (line 192) | @Override
    method getName (line 202) | @Override
    method getPrimaryKey (line 212) | @Override
    method getStatus (line 222) | @Override
    method getStatusByUserId (line 232) | @Override
    method getStatusByUserName (line 242) | @Override
    method getStatusByUserUuid (line 252) | @Override
    method getStatusDate (line 262) | @Override
    method getUserId (line 272) | @Override
    method getUserName (line 282) | @Override
    method getUserUuid (line 292) | @Override
    method getUuid (line 302) | @Override
    method isApproved (line 312) | @Override
    method isDenied (line 322) | @Override
    method isDraft (line 332) | @Override
    method isExpired (line 342) | @Override
    method isInactive (line 352) | @Override
    method isIncomplete (line 362) | @Override
    method isPending (line 372) | @Override
    method isScheduled (line 382) | @Override
    method persist (line 387) | @Override
    method setCompanyId (line 397) | @Override
    method setCreateDate (line 407) | @Override
    method setGroupId (line 417) | @Override
    method setGuestbookId (line 427) | @Override
    method setModifiedDate (line 437) | @Override
    method setName (line 447) | @Override
    method setPrimaryKey (line 457) | @Override
    method setStatus (line 467) | @Override
    method setStatusByUserId (line 477) | @Override
    method setStatusByUserName (line 487) | @Override
    method setStatusByUserUuid (line 497) | @Override
    method setStatusDate (line 507) | @Override
    method setUserId (line 517) | @Override
    method setUserName (line 527) | @Override
    method setUserUuid (line 537) | @Override
    method setUuid (line 547) | @Override
    method getStagedModelType (line 552) | @Override
    method wrap (line 557) | @Override

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/GuestbookEntryLocalService.java
  type GuestbookEntryLocalService (line 53) | @ProviderType
    method addGuestbookEntry (line 73) | @Indexable(type = IndexableType.REINDEX)
    method addGuestbookEntry (line 76) | public GuestbookEntry addGuestbookEntry(
    method createGuestbookEntry (line 87) | @Transactional(enabled = false)
    method deleteGuestbookEntry (line 97) | @Indexable(type = IndexableType.DELETE)
    method deleteGuestbookEntry (line 108) | @Indexable(type = IndexableType.DELETE)
    method deletePersistedModel (line 115) | @Override
    method dynamicQuery (line 119) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method dynamicQuery (line 128) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method dynamicQuery (line 143) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method dynamicQuery (line 160) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method dynamicQueryCount (line 171) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method dynamicQueryCount (line 181) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method fetchGuestbookEntry (line 185) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method fetchGuestbookEntryByUuidAndGroupId (line 195) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getActionableDynamicQuery (line 199) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getExportActionableDynamicQuery (line 202) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbookEntries (line 217) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbookEntries (line 220) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbookEntries (line 224) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbookEntries (line 229) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbookEntriesByUuidAndCompanyId (line 241) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbookEntriesByUuidAndCompanyId (line 255) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbookEntriesCount (line 265) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbookEntriesCount (line 268) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbookEntry (line 278) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbookEntryByUuidAndGroupId (line 290) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getIndexableActionableDynamicQuery (line 295) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getOSGiServiceIdentifier (line 303) | public String getOSGiServiceIdentifier();
    method getPersistedModel (line 305) | @Override
    method updateGuestbookEntry (line 316) | @Indexable(type = IndexableType.REINDEX)
    method updateGuestbookEntry (line 319) | public GuestbookEntry updateGuestbookEntry(

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/GuestbookEntryLocalServiceUtil.java
  class GuestbookEntryLocalServiceUtil (line 34) | @ProviderType
    method addGuestbookEntry (line 49) | public static com.liferay.docs.guestbook.model.GuestbookEntry
    method addGuestbookEntry (line 56) | public static com.liferay.docs.guestbook.model.GuestbookEntry
    method createGuestbookEntry (line 73) | public static com.liferay.docs.guestbook.model.GuestbookEntry
    method deleteGuestbookEntry (line 86) | public static com.liferay.docs.guestbook.model.GuestbookEntry
    method deleteGuestbookEntry (line 101) | public static com.liferay.docs.guestbook.model.GuestbookEntry
    method deletePersistedModel (line 111) | public static com.liferay.portal.kernel.model.PersistedModel
    method dynamicQuery (line 119) | public static com.liferay.portal.kernel.dao.orm.DynamicQuery
    method dynamicQuery (line 131) | public static <T> java.util.List<T> dynamicQuery(
    method dynamicQuery (line 149) | public static <T> java.util.List<T> dynamicQuery(
    method dynamicQuery (line 169) | public static <T> java.util.List<T> dynamicQuery(
    method dynamicQueryCount (line 184) | public static long dynamicQueryCount(
    method dynamicQueryCount (line 197) | public static long dynamicQueryCount(
    method fetchGuestbookEntry (line 204) | public static com.liferay.docs.guestbook.model.GuestbookEntry
    method fetchGuestbookEntryByUuidAndGroupId (line 217) | public static com.liferay.docs.guestbook.model.GuestbookEntry
    method getActionableDynamicQuery (line 223) | public static com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery
    method getExportActionableDynamicQuery (line 229) | public static com.liferay.portal.kernel.dao.orm.ExportActionableDynami...
    method getGuestbookEntries (line 248) | public static java.util.List
    method getGuestbookEntries (line 255) | public static java.util.List
    method getGuestbookEntries (line 262) | public static java.util.List
    method getGuestbookEntries (line 271) | public static java.util.List
    method getGuestbookEntriesByUuidAndCompanyId (line 288) | public static java.util.List
    method getGuestbookEntriesByUuidAndCompanyId (line 306) | public static java.util.List
    method getGuestbookEntriesCount (line 323) | public static int getGuestbookEntriesCount() {
    method getGuestbookEntriesCount (line 327) | public static int getGuestbookEntriesCount(long groupId, long guestboo...
    method getGuestbookEntry (line 338) | public static com.liferay.docs.guestbook.model.GuestbookEntry
    method getGuestbookEntryByUuidAndGroupId (line 353) | public static com.liferay.docs.guestbook.model.GuestbookEntry
    method getIndexableActionableDynamicQuery (line 360) | public static
    method getOSGiServiceIdentifier (line 372) | public static String getOSGiServiceIdentifier() {
    method getPersistedModel (line 376) | public static com.liferay.portal.kernel.model.PersistedModel
    method updateGuestbookEntry (line 389) | public static com.liferay.docs.guestbook.model.GuestbookEntry
    method updateGuestbookEntry (line 396) | public static com.liferay.docs.guestbook.model.GuestbookEntry
    method getService (line 408) | public static GuestbookEntryLocalService getService() {

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/GuestbookEntryLocalServiceWrapper.java
  class GuestbookEntryLocalServiceWrapper (line 28) | @ProviderType
    method GuestbookEntryLocalServiceWrapper (line 33) | public GuestbookEntryLocalServiceWrapper(
    method addGuestbookEntry (line 45) | @Override
    method addGuestbookEntry (line 52) | @Override
    method createGuestbookEntry (line 69) | @Override
    method deleteGuestbookEntry (line 83) | @Override
    method deleteGuestbookEntry (line 98) | @Override
    method deletePersistedModel (line 109) | @Override
    method dynamicQuery (line 117) | @Override
    method dynamicQuery (line 128) | @Override
    method dynamicQuery (line 147) | @Override
    method dynamicQuery (line 169) | @Override
    method dynamicQueryCount (line 185) | @Override
    method dynamicQueryCount (line 199) | @Override
    method fetchGuestbookEntry (line 208) | @Override
    method fetchGuestbookEntryByUuidAndGroupId (line 222) | @Override
    method getActionableDynamicQuery (line 230) | @Override
    method getExportActionableDynamicQuery (line 237) | @Override
    method getGuestbookEntries (line 258) | @Override
    method getGuestbookEntries (line 265) | @Override
    method getGuestbookEntries (line 273) | @Override
    method getGuestbookEntries (line 283) | @Override
    method getGuestbookEntriesByUuidAndCompanyId (line 301) | @Override
    method getGuestbookEntriesByUuidAndCompanyId (line 319) | @Override
    method getGuestbookEntriesCount (line 337) | @Override
    method getGuestbookEntriesCount (line 342) | @Override
    method getGuestbookEntry (line 355) | @Override
    method getGuestbookEntryByUuidAndGroupId (line 371) | @Override
    method getIndexableActionableDynamicQuery (line 380) | @Override
    method getOSGiServiceIdentifier (line 392) | @Override
    method getPersistedModel (line 397) | @Override
    method updateGuestbookEntry (line 411) | @Override
    method updateGuestbookEntry (line 418) | @Override
    method getWrappedService (line 430) | @Override
    method setWrappedService (line 435) | @Override

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/GuestbookEntryService.java
  type GuestbookEntryService (line 36) | @AccessControlled
    method getOSGiServiceIdentifier (line 56) | public String getOSGiServiceIdentifier();

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/GuestbookEntryServiceUtil.java
  class GuestbookEntryServiceUtil (line 34) | @ProviderType
    method getOSGiServiceIdentifier (line 48) | public static String getOSGiServiceIdentifier() {
    method getService (line 52) | public static GuestbookEntryService getService() {

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/GuestbookEntryServiceWrapper.java
  class GuestbookEntryServiceWrapper (line 28) | @ProviderType
    method GuestbookEntryServiceWrapper (line 32) | public GuestbookEntryServiceWrapper(
    method getOSGiServiceIdentifier (line 43) | @Override
    method getWrappedService (line 48) | @Override
    method setWrappedService (line 53) | @Override

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/GuestbookLocalService.java
  type GuestbookLocalService (line 53) | @ProviderType
    method addGuestbook (line 73) | @Indexable(type = IndexableType.REINDEX)
    method addGuestbook (line 76) | public Guestbook addGuestbook(
    method createGuestbook (line 86) | @Transactional(enabled = false)
    method deleteGuestbook (line 95) | @Indexable(type = IndexableType.DELETE)
    method deleteGuestbook (line 105) | @Indexable(type = IndexableType.DELETE)
    method deletePersistedModel (line 111) | @Override
    method dynamicQuery (line 115) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method dynamicQuery (line 124) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method dynamicQuery (line 139) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method dynamicQuery (line 156) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method dynamicQueryCount (line 167) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method dynamicQueryCount (line 177) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method fetchGuestbook (line 181) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method fetchGuestbookByUuidAndGroupId (line 191) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getActionableDynamicQuery (line 194) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getExportActionableDynamicQuery (line 197) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbook (line 208) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbookByUuidAndGroupId (line 219) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbooks (line 234) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbooks (line 237) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbooks (line 240) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbooks (line 243) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbooksByUuidAndCompanyId (line 254) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbooksByUuidAndCompanyId (line 268) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbooksCount (line 278) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbooksCount (line 281) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getIndexableActionableDynamicQuery (line 284) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getOSGiServiceIdentifier (line 292) | public String getOSGiServiceIdentifier();
    method getPersistedModel (line 294) | @Override
    method updateGuestbook (line 305) | @Indexable(type = IndexableType.REINDEX)

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/GuestbookLocalServiceUtil.java
  class GuestbookLocalServiceUtil (line 34) | @ProviderType
    method addGuestbook (line 49) | public static com.liferay.docs.guestbook.model.Guestbook addGuestbook(
    method addGuestbook (line 55) | public static com.liferay.docs.guestbook.model.Guestbook addGuestbook(
    method createGuestbook (line 69) | public static com.liferay.docs.guestbook.model.Guestbook createGuestbook(
    method deleteGuestbook (line 81) | public static com.liferay.docs.guestbook.model.Guestbook deleteGuestbook(
    method deleteGuestbook (line 94) | public static com.liferay.docs.guestbook.model.Guestbook deleteGuestbook(
    method deletePersistedModel (line 104) | public static com.liferay.portal.kernel.model.PersistedModel
    method dynamicQuery (line 112) | public static com.liferay.portal.kernel.dao.orm.DynamicQuery
    method dynamicQuery (line 124) | public static <T> java.util.List<T> dynamicQuery(
    method dynamicQuery (line 142) | public static <T> java.util.List<T> dynamicQuery(
    method dynamicQuery (line 162) | public static <T> java.util.List<T> dynamicQuery(
    method dynamicQueryCount (line 177) | public static long dynamicQueryCount(
    method dynamicQueryCount (line 190) | public static long dynamicQueryCount(
    method fetchGuestbook (line 197) | public static com.liferay.docs.guestbook.model.Guestbook fetchGuestbook(
    method fetchGuestbookByUuidAndGroupId (line 210) | public static com.liferay.docs.guestbook.model.Guestbook
    method getActionableDynamicQuery (line 216) | public static com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery
    method getExportActionableDynamicQuery (line 222) | public static com.liferay.portal.kernel.dao.orm.ExportActionableDynami...
    method getGuestbook (line 237) | public static com.liferay.docs.guestbook.model.Guestbook getGuestbook(
    method getGuestbookByUuidAndGroupId (line 252) | public static com.liferay.docs.guestbook.model.Guestbook
    method getGuestbooks (line 270) | public static java.util.List<com.liferay.docs.guestbook.model.Guestbook>
    method getGuestbooks (line 276) | public static java.util.List<com.liferay.docs.guestbook.model.Guestbook>
    method getGuestbooks (line 282) | public static java.util.List<com.liferay.docs.guestbook.model.Guestbook>
    method getGuestbooks (line 288) | public static java.util.List<com.liferay.docs.guestbook.model.Guestbook>
    method getGuestbooksByUuidAndCompanyId (line 304) | public static java.util.List<com.liferay.docs.guestbook.model.Guestbook>
    method getGuestbooksByUuidAndCompanyId (line 320) | public static java.util.List<com.liferay.docs.guestbook.model.Guestbook>
    method getGuestbooksCount (line 336) | public static int getGuestbooksCount() {
    method getGuestbooksCount (line 340) | public static int getGuestbooksCount(long groupId) {
    method getIndexableActionableDynamicQuery (line 344) | public static
    method getOSGiServiceIdentifier (line 356) | public static String getOSGiServiceIdentifier() {
    method getPersistedModel (line 360) | public static com.liferay.portal.kernel.model.PersistedModel
    method updateGuestbook (line 373) | public static com.liferay.docs.guestbook.model.Guestbook updateGuestbook(
    method getService (line 379) | public static GuestbookLocalService getService() {

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/GuestbookLocalServiceWrapper.java
  class GuestbookLocalServiceWrapper (line 28) | @ProviderType
    method GuestbookLocalServiceWrapper (line 32) | public GuestbookLocalServiceWrapper(
    method addGuestbook (line 44) | @Override
    method addGuestbook (line 51) | @Override
    method createGuestbook (line 67) | @Override
    method deleteGuestbook (line 80) | @Override
    method deleteGuestbook (line 94) | @Override
    method deletePersistedModel (line 105) | @Override
    method dynamicQuery (line 113) | @Override
    method dynamicQuery (line 124) | @Override
    method dynamicQuery (line 143) | @Override
    method dynamicQuery (line 164) | @Override
    method dynamicQueryCount (line 180) | @Override
    method dynamicQueryCount (line 194) | @Override
    method fetchGuestbook (line 203) | @Override
    method fetchGuestbookByUuidAndGroupId (line 217) | @Override
    method getActionableDynamicQuery (line 225) | @Override
    method getExportActionableDynamicQuery (line 232) | @Override
    method getGuestbook (line 249) | @Override
    method getGuestbookByUuidAndGroupId (line 265) | @Override
    method getGuestbooks (line 285) | @Override
    method getGuestbooks (line 292) | @Override
    method getGuestbooks (line 299) | @Override
    method getGuestbooks (line 306) | @Override
    method getGuestbooksByUuidAndCompanyId (line 323) | @Override
    method getGuestbooksByUuidAndCompanyId (line 341) | @Override
    method getGuestbooksCount (line 358) | @Override
    method getGuestbooksCount (line 363) | @Override
    method getIndexableActionableDynamicQuery (line 368) | @Override
    method getOSGiServiceIdentifier (line 380) | @Override
    method getPersistedModel (line 385) | @Override
    method updateGuestbook (line 399) | @Override
    method getWrappedService (line 406) | @Override
    method setWrappedService (line 411) | @Override

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/GuestbookService.java
  type GuestbookService (line 36) | @AccessControlled
    method getOSGiServiceIdentifier (line 56) | public String getOSGiServiceIdentifier();

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/GuestbookServiceUtil.java
  class GuestbookServiceUtil (line 34) | @ProviderType
    method getOSGiServiceIdentifier (line 48) | public static String getOSGiServiceIdentifier() {
    method getService (line 52) | public static GuestbookService getService() {

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/GuestbookServiceWrapper.java
  class GuestbookServiceWrapper (line 28) | @ProviderType
    method GuestbookServiceWrapper (line 32) | public GuestbookServiceWrapper(GuestbookService guestbookService) {
    method getOSGiServiceIdentifier (line 41) | @Override
    method getWrappedService (line 46) | @Override
    method setWrappedService (line 51) | @Override

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/persistence/GuestbookEntryPersistence.java
  type GuestbookEntryPersistence (line 34) | @ProviderType
    method findByUuid (line 50) | public java.util.List<GuestbookEntry> findByUuid(String uuid);
    method findByUuid (line 64) | public java.util.List<GuestbookEntry> findByUuid(
    method findByUuid (line 80) | public java.util.List<GuestbookEntry> findByUuid(
    method findByUuid (line 99) | public java.util.List<GuestbookEntry> findByUuid(
    method findByUuid_First (line 113) | public GuestbookEntry findByUuid_First(
    method fetchByUuid_First (line 126) | public GuestbookEntry fetchByUuid_First(
    method findByUuid_Last (line 139) | public GuestbookEntry findByUuid_Last(
    method fetchByUuid_Last (line 152) | public GuestbookEntry fetchByUuid_Last(
    method findByUuid_PrevAndNext (line 166) | public GuestbookEntry[] findByUuid_PrevAndNext(
    method removeByUuid (line 177) | public void removeByUuid(String uuid);
    method countByUuid (line 185) | public int countByUuid(String uuid);
    method findByUUID_G (line 195) | public GuestbookEntry findByUUID_G(String uuid, long groupId)
    method fetchByUUID_G (line 205) | public GuestbookEntry fetchByUUID_G(String uuid, long groupId);
    method fetchByUUID_G (line 215) | public GuestbookEntry fetchByUUID_G(
    method removeByUUID_G (line 225) | public GuestbookEntry removeByUUID_G(String uuid, long groupId)
    method countByUUID_G (line 235) | public int countByUUID_G(String uuid, long groupId);
    method findByUuid_C (line 244) | public java.util.List<GuestbookEntry> findByUuid_C(
    method findByUuid_C (line 260) | public java.util.List<GuestbookEntry> findByUuid_C(
    method findByUuid_C (line 277) | public java.util.List<GuestbookEntry> findByUuid_C(
    method findByUuid_C (line 297) | public java.util.List<GuestbookEntry> findByUuid_C(
    method findByUuid_C_First (line 312) | public GuestbookEntry findByUuid_C_First(
    method fetchByUuid_C_First (line 326) | public GuestbookEntry fetchByUuid_C_First(
    method findByUuid_C_Last (line 340) | public GuestbookEntry findByUuid_C_Last(
    method fetchByUuid_C_Last (line 354) | public GuestbookEntry fetchByUuid_C_Last(
    method findByUuid_C_PrevAndNext (line 369) | public GuestbookEntry[] findByUuid_C_PrevAndNext(
    method removeByUuid_C (line 381) | public void removeByUuid_C(String uuid, long companyId);
    method countByUuid_C (line 390) | public int countByUuid_C(String uuid, long companyId);
    method findByG_G (line 399) | public java.util.List<GuestbookEntry> findByG_G(
    method findByG_G (line 415) | public java.util.List<GuestbookEntry> findByG_G(
    method findByG_G (line 432) | public java.util.List<GuestbookEntry> findByG_G(
    method findByG_G (line 452) | public java.util.List<GuestbookEntry> findByG_G(
    method findByG_G_First (line 467) | public GuestbookEntry findByG_G_First(
    method fetchByG_G_First (line 481) | public GuestbookEntry fetchByG_G_First(
    method findByG_G_Last (line 495) | public GuestbookEntry findByG_G_Last(
    method fetchByG_G_Last (line 509) | public GuestbookEntry fetchByG_G_Last(
    method findByG_G_PrevAndNext (line 524) | public GuestbookEntry[] findByG_G_PrevAndNext(
    method removeByG_G (line 536) | public void removeByG_G(long groupId, long guestbookId);
    method countByG_G (line 545) | public int countByG_G(long groupId, long guestbookId);
    method cacheResult (line 552) | public void cacheResult(GuestbookEntry guestbookEntry);
    method cacheResult (line 559) | public void cacheResult(java.util.List<GuestbookEntry> guestbookEntries);
    method create (line 567) | public GuestbookEntry create(long entryId);
    method remove (line 576) | public GuestbookEntry remove(long entryId)
    method updateImpl (line 579) | public GuestbookEntry updateImpl(GuestbookEntry guestbookEntry);
    method findByPrimaryKey (line 588) | public GuestbookEntry findByPrimaryKey(long entryId)
    method fetchByPrimaryKey (line 597) | public GuestbookEntry fetchByPrimaryKey(long entryId);
    method findAll (line 604) | public java.util.List<GuestbookEntry> findAll();
    method findAll (line 617) | public java.util.List<GuestbookEntry> findAll(int start, int end);
    method findAll (line 631) | public java.util.List<GuestbookEntry> findAll(
    method findAll (line 649) | public java.util.List<GuestbookEntry> findAll(
    method removeAll (line 658) | public void removeAll();
    method countAll (line 665) | public int countAll();

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/persistence/GuestbookEntryUtil.java
  class GuestbookEntryUtil (line 44) | @ProviderType
    method clearCache (line 56) | public static void clearCache() {
    method clearCache (line 63) | public static void clearCache(GuestbookEntry guestbookEntry) {
    method countWithDynamicQuery (line 70) | public static long countWithDynamicQuery(DynamicQuery dynamicQuery) {
    method fetchByPrimaryKeys (line 77) | public static Map<Serializable, GuestbookEntry> fetchByPrimaryKeys(
    method findWithDynamicQuery (line 86) | public static List<GuestbookEntry> findWithDynamicQuery(
    method findWithDynamicQuery (line 95) | public static List<GuestbookEntry> findWithDynamicQuery(
    method findWithDynamicQuery (line 104) | public static List<GuestbookEntry> findWithDynamicQuery(
    method update (line 115) | public static GuestbookEntry update(GuestbookEntry guestbookEntry) {
    method update (line 122) | public static GuestbookEntry update(
    method findByUuid (line 134) | public static List<GuestbookEntry> findByUuid(String uuid) {
    method findByUuid (line 150) | public static List<GuestbookEntry> findByUuid(
    method findByUuid (line 169) | public static List<GuestbookEntry> findByUuid(
    method findByUuid (line 190) | public static List<GuestbookEntry> findByUuid(
    method findByUuid_First (line 207) | public static GuestbookEntry findByUuid_First(
    method fetchByUuid_First (line 222) | public static GuestbookEntry fetchByUuid_First(
    method findByUuid_Last (line 236) | public static GuestbookEntry findByUuid_Last(
    method fetchByUuid_Last (line 251) | public static GuestbookEntry fetchByUuid_Last(
    method findByUuid_PrevAndNext (line 266) | public static GuestbookEntry[] findByUuid_PrevAndNext(
    method removeByUuid (line 281) | public static void removeByUuid(String uuid) {
    method countByUuid (line 291) | public static int countByUuid(String uuid) {
    method findByUUID_G (line 303) | public static GuestbookEntry findByUUID_G(String uuid, long groupId)
    method fetchByUUID_G (line 317) | public static GuestbookEntry fetchByUUID_G(String uuid, long groupId) {
    method fetchByUUID_G (line 329) | public static GuestbookEntry fetchByUUID_G(
    method removeByUUID_G (line 342) | public static GuestbookEntry removeByUUID_G(String uuid, long groupId)
    method countByUUID_G (line 356) | public static int countByUUID_G(String uuid, long groupId) {
    method findByUuid_C (line 367) | public static List<GuestbookEntry> findByUuid_C(
    method findByUuid_C (line 386) | public static List<GuestbookEntry> findByUuid_C(
    method findByUuid_C (line 406) | public static List<GuestbookEntry> findByUuid_C(
    method findByUuid_C (line 429) | public static List<GuestbookEntry> findByUuid_C(
    method findByUuid_C_First (line 447) | public static GuestbookEntry findByUuid_C_First(
    method fetchByUuid_C_First (line 465) | public static GuestbookEntry fetchByUuid_C_First(
    method findByUuid_C_Last (line 482) | public static GuestbookEntry findByUuid_C_Last(
    method fetchByUuid_C_Last (line 500) | public static GuestbookEntry fetchByUuid_C_Last(
    method findByUuid_C_PrevAndNext (line 518) | public static GuestbookEntry[] findByUuid_C_PrevAndNext(
    method removeByUuid_C (line 534) | public static void removeByUuid_C(String uuid, long companyId) {
    method countByUuid_C (line 545) | public static int countByUuid_C(String uuid, long companyId) {
    method findByG_G (line 556) | public static List<GuestbookEntry> findByG_G(
    method findByG_G (line 575) | public static List<GuestbookEntry> findByG_G(
    method findByG_G (line 595) | public static List<GuestbookEntry> findByG_G(
    method findByG_G (line 618) | public static List<GuestbookEntry> findByG_G(
    method findByG_G_First (line 637) | public static GuestbookEntry findByG_G_First(
    method fetchByG_G_First (line 655) | public static GuestbookEntry fetchByG_G_First(
    method findByG_G_Last (line 672) | public static GuestbookEntry findByG_G_Last(
    method fetchByG_G_Last (line 690) | public static GuestbookEntry fetchByG_G_Last(
    method findByG_G_PrevAndNext (line 708) | public static GuestbookEntry[] findByG_G_PrevAndNext(
    method removeByG_G (line 724) | public static void removeByG_G(long groupId, long guestbookId) {
    method countByG_G (line 735) | public static int countByG_G(long groupId, long guestbookId) {
    method cacheResult (line 744) | public static void cacheResult(GuestbookEntry guestbookEntry) {
    method cacheResult (line 753) | public static void cacheResult(List<GuestbookEntry> guestbookEntries) {
    method create (line 763) | public static GuestbookEntry create(long entryId) {
    method remove (line 774) | public static GuestbookEntry remove(long entryId)
    method updateImpl (line 781) | public static GuestbookEntry updateImpl(GuestbookEntry guestbookEntry) {
    method findByPrimaryKey (line 792) | public static GuestbookEntry findByPrimaryKey(long entryId)
    method fetchByPrimaryKey (line 805) | public static GuestbookEntry fetchByPrimaryKey(long entryId) {
    method findAll (line 814) | public static List<GuestbookEntry> findAll() {
    method findAll (line 829) | public static List<GuestbookEntry> findAll(int start, int end) {
    method findAll (line 845) | public static List<GuestbookEntry> findAll(
    method findAll (line 865) | public static List<GuestbookEntry> findAll(
    method removeAll (line 876) | public static void removeAll() {
    method countAll (line 885) | public static int countAll() {
    method getPersistence (line 889) | public static GuestbookEntryPersistence getPersistence() {

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/persistence/GuestbookPersistence.java
  type GuestbookPersistence (line 34) | @ProviderType
    method findByUuid (line 49) | public java.util.List<Guestbook> findByUuid(String uuid);
    method findByUuid (line 63) | public java.util.List<Guestbook> findByUuid(
    method findByUuid (line 79) | public java.util.List<Guestbook> findByUuid(
    method findByUuid (line 98) | public java.util.List<Guestbook> findByUuid(
    method findByUuid_First (line 112) | public Guestbook findByUuid_First(
    method fetchByUuid_First (line 125) | public Guestbook fetchByUuid_First(
    method findByUuid_Last (line 138) | public Guestbook findByUuid_Last(
    method fetchByUuid_Last (line 151) | public Guestbook fetchByUuid_Last(
    method findByUuid_PrevAndNext (line 165) | public Guestbook[] findByUuid_PrevAndNext(
    method removeByUuid (line 176) | public void removeByUuid(String uuid);
    method countByUuid (line 184) | public int countByUuid(String uuid);
    method findByUUID_G (line 194) | public Guestbook findByUUID_G(String uuid, long groupId)
    method fetchByUUID_G (line 204) | public Guestbook fetchByUUID_G(String uuid, long groupId);
    method fetchByUUID_G (line 214) | public Guestbook fetchByUUID_G(
    method removeByUUID_G (line 224) | public Guestbook removeByUUID_G(String uuid, long groupId)
    method countByUUID_G (line 234) | public int countByUUID_G(String uuid, long groupId);
    method findByUuid_C (line 243) | public java.util.List<Guestbook> findByUuid_C(String uuid, long compan...
    method findByUuid_C (line 258) | public java.util.List<Guestbook> findByUuid_C(
    method findByUuid_C (line 275) | public java.util.List<Guestbook> findByUuid_C(
    method findByUuid_C (line 295) | public java.util.List<Guestbook> findByUuid_C(
    method findByUuid_C_First (line 310) | public Guestbook findByUuid_C_First(
    method fetchByUuid_C_First (line 324) | public Guestbook fetchByUuid_C_First(
    method findByUuid_C_Last (line 338) | public Guestbook findByUuid_C_Last(
    method fetchByUuid_C_Last (line 352) | public Guestbook fetchByUuid_C_Last(
    method findByUuid_C_PrevAndNext (line 367) | public Guestbook[] findByUuid_C_PrevAndNext(
    method removeByUuid_C (line 379) | public void removeByUuid_C(String uuid, long companyId);
    method countByUuid_C (line 388) | public int countByUuid_C(String uuid, long companyId);
    method findByGroupId (line 396) | public java.util.List<Guestbook> findByGroupId(long groupId);
    method findByGroupId (line 410) | public java.util.List<Guestbook> findByGroupId(
    method findByGroupId (line 426) | public java.util.List<Guestbook> findByGroupId(
    method findByGroupId (line 445) | public java.util.List<Guestbook> findByGroupId(
    method findByGroupId_First (line 459) | public Guestbook findByGroupId_First(
    method fetchByGroupId_First (line 472) | public Guestbook fetchByGroupId_First(
    method findByGroupId_Last (line 485) | public Guestbook findByGroupId_Last(
    method fetchByGroupId_Last (line 498) | public Guestbook fetchByGroupId_Last(
    method findByGroupId_PrevAndNext (line 512) | public Guestbook[] findByGroupId_PrevAndNext(
    method removeByGroupId (line 523) | public void removeByGroupId(long groupId);
    method countByGroupId (line 531) | public int countByGroupId(long groupId);
    method cacheResult (line 538) | public void cacheResult(Guestbook guestbook);
    method cacheResult (line 545) | public void cacheResult(java.util.List<Guestbook> guestbooks);
    method create (line 553) | public Guestbook create(long guestbookId);
    method remove (line 562) | public Guestbook remove(long guestbookId) throws NoSuchGuestbookExcept...
    method updateImpl (line 564) | public Guestbook updateImpl(Guestbook guestbook);
    method findByPrimaryKey (line 573) | public Guestbook findByPrimaryKey(long guestbookId)
    method fetchByPrimaryKey (line 582) | public Guestbook fetchByPrimaryKey(long guestbookId);
    method findAll (line 589) | public java.util.List<Guestbook> findAll();
    method findAll (line 602) | public java.util.List<Guestbook> findAll(int start, int end);
    method findAll (line 616) | public java.util.List<Guestbook> findAll(
    method findAll (line 634) | public java.util.List<Guestbook> findAll(
    method removeAll (line 643) | public void removeAll();
    method countAll (line 650) | public int countAll();

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/persistence/GuestbookUtil.java
  class GuestbookUtil (line 44) | @ProviderType
    method clearCache (line 56) | public static void clearCache() {
    method clearCache (line 63) | public static void clearCache(Guestbook guestbook) {
    method countWithDynamicQuery (line 70) | public static long countWithDynamicQuery(DynamicQuery dynamicQuery) {
    method fetchByPrimaryKeys (line 77) | public static Map<Serializable, Guestbook> fetchByPrimaryKeys(
    method findWithDynamicQuery (line 86) | public static List<Guestbook> findWithDynamicQuery(
    method findWithDynamicQuery (line 95) | public static List<Guestbook> findWithDynamicQuery(
    method findWithDynamicQuery (line 104) | public static List<Guestbook> findWithDynamicQuery(
    method update (line 115) | public static Guestbook update(Guestbook guestbook) {
    method update (line 122) | public static Guestbook update(
    method findByUuid (line 134) | public static List<Guestbook> findByUuid(String uuid) {
    method findByUuid (line 150) | public static List<Guestbook> findByUuid(String uuid, int start, int e...
    method findByUuid (line 167) | public static List<Guestbook> findByUuid(
    method findByUuid (line 188) | public static List<Guestbook> findByUuid(
    method findByUuid_First (line 205) | public static Guestbook findByUuid_First(
    method fetchByUuid_First (line 219) | public static Guestbook fetchByUuid_First(
    method findByUuid_Last (line 233) | public static Guestbook findByUuid_Last(
    method fetchByUuid_Last (line 247) | public static Guestbook fetchByUuid_Last(
    method findByUuid_PrevAndNext (line 262) | public static Guestbook[] findByUuid_PrevAndNext(
    method removeByUuid (line 276) | public static void removeByUuid(String uuid) {
    method countByUuid (line 286) | public static int countByUuid(String uuid) {
    method findByUUID_G (line 298) | public static Guestbook findByUUID_G(String uuid, long groupId)
    method fetchByUUID_G (line 311) | public static Guestbook fetchByUUID_G(String uuid, long groupId) {
    method fetchByUUID_G (line 323) | public static Guestbook fetchByUUID_G(
    method removeByUUID_G (line 336) | public static Guestbook removeByUUID_G(String uuid, long groupId)
    method countByUUID_G (line 349) | public static int countByUUID_G(String uuid, long groupId) {
    method findByUuid_C (line 360) | public static List<Guestbook> findByUuid_C(String uuid, long companyId) {
    method findByUuid_C (line 377) | public static List<Guestbook> findByUuid_C(
    method findByUuid_C (line 397) | public static List<Guestbook> findByUuid_C(
    method findByUuid_C (line 420) | public static List<Guestbook> findByUuid_C(
    method findByUuid_C_First (line 438) | public static Guestbook findByUuid_C_First(
    method fetchByUuid_C_First (line 455) | public static Guestbook fetchByUuid_C_First(
    method findByUuid_C_Last (line 472) | public static Guestbook findByUuid_C_Last(
    method fetchByUuid_C_Last (line 489) | public static Guestbook fetchByUuid_C_Last(
    method findByUuid_C_PrevAndNext (line 507) | public static Guestbook[] findByUuid_C_PrevAndNext(
    method removeByUuid_C (line 522) | public static void removeByUuid_C(String uuid, long companyId) {
    method countByUuid_C (line 533) | public static int countByUuid_C(String uuid, long companyId) {
    method findByGroupId (line 543) | public static List<Guestbook> findByGroupId(long groupId) {
    method findByGroupId (line 559) | public static List<Guestbook> findByGroupId(
    method findByGroupId (line 578) | public static List<Guestbook> findByGroupId(
    method findByGroupId (line 600) | public static List<Guestbook> findByGroupId(
    method findByGroupId_First (line 617) | public static Guestbook findByGroupId_First(
    method fetchByGroupId_First (line 631) | public static Guestbook fetchByGroupId_First(
    method findByGroupId_Last (line 646) | public static Guestbook findByGroupId_Last(
    method fetchByGroupId_Last (line 660) | public static Guestbook fetchByGroupId_Last(
    method findByGroupId_PrevAndNext (line 675) | public static Guestbook[] findByGroupId_PrevAndNext(
    method removeByGroupId (line 689) | public static void removeByGroupId(long groupId) {
    method countByGroupId (line 699) | public static int countByGroupId(long groupId) {
    method cacheResult (line 708) | public static void cacheResult(Guestbook guestbook) {
    method cacheResult (line 717) | public static void cacheResult(List<Guestbook> guestbooks) {
    method create (line 727) | public static Guestbook create(long guestbookId) {
    method remove (line 738) | public static Guestbook remove(long guestbookId)
    method updateImpl (line 744) | public static Guestbook updateImpl(Guestbook guestbook) {
    method findByPrimaryKey (line 755) | public static Guestbook findByPrimaryKey(long guestbookId)
    method fetchByPrimaryKey (line 767) | public static Guestbook fetchByPrimaryKey(long guestbookId) {
    method findAll (line 776) | public static List<Guestbook> findAll() {
    method findAll (line 791) | public static List<Guestbook> findAll(int start, int end) {
    method findAll (line 807) | public static List<Guestbook> findAll(
    method findAll (line 826) | public static List<Guestbook> findAll(
    method removeAll (line 837) | public static void removeAll() {
    method countAll (line 846) | public static int countAll() {
    method getPersistence (line 850) | public static GuestbookPersistence getPersistence() {

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/model/impl/GuestbookBaseImpl.java
  class GuestbookBaseImpl (line 34) | @ProviderType
    method persist (line 43) | @Override

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/model/impl/GuestbookCacheModel.java
  class GuestbookCacheModel (line 37) | @ProviderType
    method equals (line 41) | @Override
    method hashCode (line 60) | @Override
    method toString (line 65) | @Override
    method toEntityModel (line 100) | @Override
    method readExternal (line 167) | @Override
    method writeExternal (line 190) | @Override

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/model/impl/GuestbookEntryBaseImpl.java
  class GuestbookEntryBaseImpl (line 34) | @ProviderType
    method persist (line 43) | @Override

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/model/impl/GuestbookEntryCacheModel.java
  class GuestbookEntryCacheModel (line 37) | @ProviderType
    method equals (line 41) | @Override
    method hashCode (line 61) | @Override
    method toString (line 66) | @Override
    method toEntityModel (line 107) | @Override
    method readExternal (line 189) | @Override
    method writeExternal (line 216) | @Override

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/model/impl/GuestbookEntryImpl.java
  class GuestbookEntryImpl (line 28) | @ProviderType
    method GuestbookEntryImpl (line 36) | public GuestbookEntryImpl() {

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/model/impl/GuestbookEntryModelImpl.java
  class GuestbookEntryModelImpl (line 69) | @JSON(strict = true)
    method setEntityCacheEnabled (line 141) | public static void setEntityCacheEnabled(boolean entityCacheEnabled) {
    method setFinderCacheEnabled (line 145) | public static void setFinderCacheEnabled(boolean finderCacheEnabled) {
    method toModel (line 155) | public static GuestbookEntry toModel(GuestbookEntrySoap soapModel) {
    method toModels (line 188) | public static List<GuestbookEntry> toModels(
    method GuestbookEntryModelImpl (line 205) | public GuestbookEntryModelImpl() {
    method getPrimaryKey (line 208) | @Override
    method setPrimaryKey (line 213) | @Override
    method getPrimaryKeyObj (line 218) | @Override
    method setPrimaryKeyObj (line 223) | @Override
    method getModelClass (line 228) | @Override
    method getModelClassName (line 233) | @Override
    method getModelAttributes (line 238) | @Override
    method setModelAttributes (line 263) | @Override
    method getAttributeGetterFunctions (line 281) | public Map<String, Function<GuestbookEntry, Object>>
    method getAttributeSetterBiConsumers (line 287) | public Map<String, BiConsumer<GuestbookEntry, Object>>
    method _getProxyProviderFunction (line 293) | private static Function<InvocationHandler, GuestbookEntry>
    method getUuid (line 409) | @JSON
    method setUuid (line 420) | @Override
    method getOriginalUuid (line 431) | public String getOriginalUuid() {
    method getEntryId (line 435) | @JSON
    method setEntryId (line 441) | @Override
    method getName (line 446) | @JSON
    method setName (line 457) | @Override
    method getEmail (line 462) | @JSON
    method setEmail (line 473) | @Override
    method getMessage (line 478) | @JSON
    method setMessage (line 489) | @Override
    method getGuestbookId (line 494) | @JSON
    method setGuestbookId (line 500) | @Override
    method getOriginalGuestbookId (line 513) | public long getOriginalGuestbookId() {
    method getGroupId (line 517) | @JSON
    method setGroupId (line 523) | @Override
    method getOriginalGroupId (line 536) | public long getOriginalGroupId() {
    method getCompanyId (line 540) | @JSON
    method setCompanyId (line 546) | @Override
    method getOriginalCompanyId (line 559) | public long getOriginalCompanyId() {
    method getUserId (line 563) | @JSON
    method setUserId (line 569) | @Override
    method getUserUuid (line 574) | @Override
    method setUserUuid (line 586) | @Override
    method getUserName (line 590) | @JSON
    method setUserName (line 601) | @Override
    method getCreateDate (line 606) | @JSON
    method setCreateDate (line 612) | @Override
    method getModifiedDate (line 619) | @JSON
    method hasSetModifiedDate (line 625) | public boolean hasSetModifiedDate() {
    method setModifiedDate (line 629) | @Override
    method getStatus (line 636) | @JSON
    method setStatus (line 642) | @Override
    method getStatusByUserId (line 647) | @JSON
    method setStatusByUserId (line 653) | @Override
    method getStatusByUserUuid (line 658) | @Override
    method setStatusByUserUuid (line 670) | @Override
    method getStatusByUserName (line 674) | @JSON
    method setStatusByUserName (line 685) | @Override
    method getStatusDate (line 690) | @JSON
    method setStatusDate (line 696) | @Override
    method getStagedModelType (line 701) | @Override
    method isApproved (line 707) | @Override
    method isDenied (line 717) | @Override
    method isDraft (line 727) | @Override
    method isExpired (line 737) | @Override
    method isInactive (line 747) | @Override
    method isIncomplete (line 757) | @Override
    method isPending (line 767) | @Override
    method isScheduled (line 777) | @Override
    method getColumnBitmask (line 787) | public long getColumnBitmask() {
    method getExpandoBridge (line 791) | @Override
    method setExpandoBridgeAttributes (line 797) | @Override
    method toEscapedModel (line 804) | @Override
    method clone (line 814) | @Override
    method compareTo (line 840) | @Override
    method equals (line 856) | @Override
    method hashCode (line 878) | @Override
    method isEntityCacheEnabled (line 883) | @Override
    method isFinderCacheEnabled (line 888) | @Override
    method resetOriginalValues (line 893) | @Override
    method toCacheModel (line 919) | @Override
    method toString (line 1016) | @Override
    method toXmlString (line 1048) | @Override

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/model/impl/GuestbookImpl.java
  class GuestbookImpl (line 28) | @ProviderType
    method GuestbookImpl (line 36) | public GuestbookImpl() {

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/model/impl/GuestbookModelImpl.java
  class GuestbookModelImpl (line 68) | @JSON(strict = true)
    method setEntityCacheEnabled (line 134) | public static void setEntityCacheEnabled(boolean entityCacheEnabled) {
    method setFinderCacheEnabled (line 138) | public static void setFinderCacheEnabled(boolean finderCacheEnabled) {
    method toModel (line 148) | public static Guestbook toModel(GuestbookSoap soapModel) {
    method toModels (line 178) | public static List<Guestbook> toModels(GuestbookSoap[] soapModels) {
    method GuestbookModelImpl (line 192) | public GuestbookModelImpl() {
    method getPrimaryKey (line 195) | @Override
    method setPrimaryKey (line 200) | @Override
    method getPrimaryKeyObj (line 205) | @Override
    method setPrimaryKeyObj (line 210) | @Override
    method getModelClass (line 215) | @Override
    method getModelClassName (line 220) | @Override
    method getModelAttributes (line 225) | @Override
    method setModelAttributes (line 249) | @Override
    method getAttributeGetterFunctions (line 267) | public Map<String, Function<Guestbook, Object>>
    method getAttributeSetterBiConsumers (line 273) | public Map<String, BiConsumer<Guestbook, Object>>
    method _getProxyProviderFunction (line 279) | private static Function<InvocationHandler, Guestbook>
    method getUuid (line 371) | @JSON
    method setUuid (line 382) | @Override
    method getOriginalUuid (line 393) | public String getOriginalUuid() {
    method getGuestbookId (line 397) | @JSON
    method setGuestbookId (line 403) | @Override
    method getName (line 408) | @JSON
    method setName (line 419) | @Override
    method getGroupId (line 424) | @JSON
    method setGroupId (line 430) | @Override
    method getOriginalGroupId (line 443) | public long getOriginalGroupId() {
    method getCompanyId (line 447) | @JSON
    method setCompanyId (line 453) | @Override
    method getOriginalCompanyId (line 466) | public long getOriginalCompanyId() {
    method getUserId (line 470) | @JSON
    method setUserId (line 476) | @Override
    method getUserUuid (line 481) | @Override
    method setUserUuid (line 493) | @Override
    method getUserName (line 497) | @JSON
    method setUserName (line 508) | @Override
    method getCreateDate (line 513) | @JSON
    method setCreateDate (line 519) | @Override
    method getModifiedDate (line 524) | @JSON
    method hasSetModifiedDate (line 530) | public boolean hasSetModifiedDate() {
    method setModifiedDate (line 534) | @Override
    method getStatus (line 541) | @JSON
    method setStatus (line 547) | @Override
    method getStatusByUserId (line 552) | @JSON
    method setStatusByUserId (line 558) | @Override
    method getStatusByUserUuid (line 563) | @Override
    method setStatusByUserUuid (line 575) | @Override
    method getStatusByUserName (line 579) | @JSON
    method setStatusByUserName (line 590) | @Override
    method getStatusDate (line 595) | @JSON
    method setStatusDate (line 601) | @Override
    method getStagedModelType (line 606) | @Override
    method isApproved (line 612) | @Override
    method isDenied (line 622) | @Override
    method isDraft (line 632) | @Override
    method isExpired (line 642) | @Override
    method isInactive (line 652) | @Override
    method isIncomplete (line 662) | @Override
    method isPending (line 672) | @Override
    method isScheduled (line 682) | @Override
    method getColumnBitmask (line 692) | public long getColumnBitmask() {
    method getExpandoBridge (line 696) | @Override
    method setExpandoBridgeAttributes (line 702) | @Override
    method toEscapedModel (line 709) | @Override
    method clone (line 719) | @Override
    method compareTo (line 742) | @Override
    method equals (line 757) | @Override
    method hashCode (line 779) | @Override
    method isEntityCacheEnabled (line 784) | @Override
    method isFinderCacheEnabled (line 789) | @Override
    method resetOriginalValues (line 794) | @Override
    method toCacheModel (line 813) | @Override
    method toString (line 891) | @Override
    method toXmlString (line 923) | @Override

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/service/base/GuestbookEntryLocalServiceBaseImpl.java
  class GuestbookEntryLocalServiceBaseImpl (line 78) | @ProviderType
    method addGuestbookEntry (line 95) | @Indexable(type = IndexableType.REINDEX)
    method createGuestbookEntry (line 109) | @Override
    method deleteGuestbookEntry (line 122) | @Indexable(type = IndexableType.DELETE)
    method deleteGuestbookEntry (line 137) | @Indexable(type = IndexableType.DELETE)
    method dynamicQuery (line 145) | @Override
    method dynamicQuery (line 159) | @Override
    method dynamicQuery (line 176) | @Override
    method dynamicQuery (line 197) | @Override
    method dynamicQueryCount (line 212) | @Override
    method dynamicQueryCount (line 224) | @Override
    method fetchGuestbookEntry (line 232) | @Override
    method fetchGuestbookEntryByUuidAndGroupId (line 244) | @Override
    method getGuestbookEntry (line 258) | @Override
    method getActionableDynamicQuery (line 265) | @Override
    method getIndexableActionableDynamicQuery (line 279) | @Override
    method initActionableDynamicQuery (line 296) | protected void initActionableDynamicQuery(
    method getExportActionableDynamicQuery (line 306) | @Override
    method deletePersistedModel (line 410) | @Override
    method getPersistedModel (line 418) | @Override
    method getGuestbookEntriesByUuidAndCompanyId (line 432) | @Override
    method getGuestbookEntriesByUuidAndCompanyId (line 449) | @Override
    method getGuestbookEntryByUuidAndGroupId (line 466) | @Override
    method getGuestbookEntries (line 485) | @Override
    method getGuestbookEntriesCount (line 495) | @Override
    method updateGuestbookEntry (line 506) | @Indexable(type = IndexableType.REINDEX)
    method getAopInterfaces (line 512) | @Override
    method setAopProxy (line 520) | @Override
    method getOSGiServiceIdentifier (line 530) | @Override
    method getModelClass (line 535) | protected Class<?> getModelClass() {
    method getModelClassName (line 539) | protected String getModelClassName() {
    method runSQL (line 548) | protected void runSQL(String sql) {

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/service/base/GuestbookEntryServiceBaseImpl.java
  class GuestbookEntryServiceBaseImpl (line 46) | public abstract class GuestbookEntryServiceBaseImpl
    method getAopInterfaces (line 55) | @Override
    method setAopProxy (line 62) | @Override
    method getOSGiServiceIdentifier (line 72) | @Override
    method getModelClass (line 77) | protected Class<?> getModelClass() {
    method getModelClassName (line 81) | protected String getModelClassName() {
    method runSQL (line 90) | protected void runSQL(String sql) {

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/service/base/GuestbookLocalServiceBaseImpl.java
  class GuestbookLocalServiceBaseImpl (line 78) | @ProviderType
    method addGuestbook (line 95) | @Indexable(type = IndexableType.REINDEX)
    method createGuestbook (line 109) | @Override
    method deleteGuestbook (line 122) | @Indexable(type = IndexableType.DELETE)
    method deleteGuestbook (line 134) | @Indexable(type = IndexableType.DELETE)
    method dynamicQuery (line 140) | @Override
    method dynamicQuery (line 154) | @Override
    method dynamicQuery (line 171) | @Override
    method dynamicQuery (line 192) | @Override
    method dynamicQueryCount (line 207) | @Override
    method dynamicQueryCount (line 219) | @Override
    method fetchGuestbook (line 227) | @Override
    method fetchGuestbookByUuidAndGroupId (line 239) | @Override
    method getGuestbook (line 251) | @Override
    method getActionableDynamicQuery (line 256) | @Override
    method getIndexableActionableDynamicQuery (line 270) | @Override
    method initActionableDynamicQuery (line 288) | protected void initActionableDynamicQuery(
    method getExportActionableDynamicQuery (line 298) | @Override
    method deletePersistedModel (line 402) | @Override
    method getPersistedModel (line 409) | @Override
    method getGuestbooksByUuidAndCompanyId (line 423) | @Override
    method getGuestbooksByUuidAndCompanyId (line 440) | @Override
    method getGuestbookByUuidAndGroupId (line 457) | @Override
    method getGuestbooks (line 475) | @Override
    method getGuestbooksCount (line 485) | @Override
    method updateGuestbook (line 496) | @Indexable(type = IndexableType.REINDEX)
    method getAopInterfaces (line 502) | @Override
    method setAopProxy (line 510) | @Override
    method getOSGiServiceIdentifier (line 520) | @Override
    method getModelClass (line 525) | protected Class<?> getModelClass() {
    method getModelClassName (line 529) | protected String getModelClassName() {
    method runSQL (line 538) | protected void runSQL(String sql) {

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/service/base/GuestbookServiceBaseImpl.java
  class GuestbookServiceBaseImpl (line 46) | public abstract class GuestbookServiceBaseImpl
    method getAopInterfaces (line 55) | @Override
    method setAopProxy (line 62) | @Override
    method getOSGiServiceIdentifier (line 72) | @Override
    method getModelClass (line 77) | protected Class<?> getModelClass() {
    method getModelClassName (line 81) | protected String getModelClassName() {
    method runSQL (line 90) | protected void runSQL(String sql) {

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/service/http/GuestbookEntryServiceHttp.java
  class GuestbookEntryServiceHttp (line 46) | @ProviderType

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/service/http/GuestbookEntryServiceSoap.java
  class GuestbookEntryServiceSoap (line 58) | @ProviderType

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/service/http/GuestbookServiceHttp.java
  class GuestbookServiceHttp (line 46) | @ProviderType

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/service/http/GuestbookServiceSoap.java
  class GuestbookServiceSoap (line 58) | @ProviderType

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/service/impl/GuestbookEntryLocalServiceImpl.java
  class GuestbookEntryLocalServiceImpl (line 53) | @Component(property = "model.class.name=com.liferay.docs.guestbook.model...
    method addGuestbookEntry (line 66) | public GuestbookEntry addGuestbookEntry(long userId, long guestbookId,...
    method updateGuestbookEntry (line 102) | public GuestbookEntry updateGuestbookEntry(long userId, long guestbookId,
    method deleteGuestbookEntry (line 131) | public GuestbookEntry deleteGuestbookEntry(GuestbookEntry entry)
    method deleteGuestbookEntry (line 139) | public GuestbookEntry deleteGuestbookEntry(long entryId) throws Portal...
    method getGuestbookEntries (line 147) | public List<GuestbookEntry> getGuestbookEntries(long groupId, long gue...
    method getGuestbookEntries (line 151) | public List<GuestbookEntry> getGuestbookEntries(long groupId, long gue...
    method getGuestbookEntries (line 158) | public List<GuestbookEntry> getGuestbookEntries(long groupId, long gue...
    method getGuestbookEntry (line 165) | public GuestbookEntry getGuestbookEntry(long entryId) throws PortalExc...
    method getGuestbookEntriesCount (line 169) | public int getGuestbookEntriesCount(long groupId, long guestbookId) {
    method validate (line 173) | protected void validate(String name, String email, String entry)

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/service/impl/GuestbookEntryServiceImpl.java
  class GuestbookEntryServiceImpl (line 35) | @Component(

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/service/impl/GuestbookLocalServiceImpl.java
  class GuestbookLocalServiceImpl (line 50) | @Component(property = "model.class.name=com.liferay.docs.guestbook.model...
    method addGuestbook (line 62) | public Guestbook addGuestbook(long userId, String name,
    method getGuestbooks (line 92) | public List<Guestbook> getGuestbooks(long groupId) {
    method getGuestbooks (line 97) | public List<Guestbook> getGuestbooks(long groupId, int start, int end,
    method getGuestbooks (line 103) | public List<Guestbook> getGuestbooks(long groupId, int start, int end) {
    method getGuestbooksCount (line 108) | public int getGuestbooksCount(long groupId) {
    method validate (line 113) | protected void validate(String name) throws PortalException {

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/service/impl/GuestbookServiceImpl.java
  class GuestbookServiceImpl (line 35) | @Component(

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/service/persistence/impl/GuestbookEntryPersistenceImpl.java
  class GuestbookEntryPersistenceImpl (line 77) | @Component(service = GuestbookEntryPersistence.class)
    method findByUuid (line 110) | @Override
    method findByUuid (line 127) | @Override
    method findByUuid (line 145) | @Override
    method findByUuid (line 167) | @Override
    method findByUuid_First (line 293) | @Override
    method fetchByUuid_First (line 324) | @Override
    method findByUuid_Last (line 345) | @Override
    method fetchByUuid_Last (line 376) | @Override
    method findByUuid_PrevAndNext (line 405) | @Override
    method getByUuid_PrevAndNext (line 440) | protected GuestbookEntry getByUuid_PrevAndNext(
    method removeByUuid (line 565) | @Override
    method countByUuid (line 580) | @Override
    method findByUUID_G (line 655) | @Override
    method fetchByUUID_G (line 691) | @Override
    method fetchByUUID_G (line 704) | @Override
    method removeByUUID_G (line 803) | @Override
    method countByUUID_G (line 819) | @Override
    method findByUuid_C (line 901) | @Override
    method findByUuid_C (line 920) | @Override
    method findByUuid_C (line 941) | @Override
    method findByUuid_C (line 965) | @Override
    method findByUuid_C_First (line 1100) | @Override
    method fetchByUuid_C_First (line 1136) | @Override
    method findByUuid_C_Last (line 1160) | @Override
    method fetchByUuid_C_Last (line 1196) | @Override
    method findByUuid_C_PrevAndNext (line 1227) | @Override
    method getByUuid_C_PrevAndNext (line 1264) | protected GuestbookEntry getByUuid_C_PrevAndNext(
    method removeByUuid_C (line 1395) | @Override
    method countByUuid_C (line 1413) | @Override
    method findByG_G (line 1495) | @Override
    method findByG_G (line 1514) | @Override
    method findByG_G (line 1535) | @Override
    method findByG_G (line 1559) | @Override
    method findByG_G_First (line 1681) | @Override
    method fetchByG_G_First (line 1717) | @Override
    method findByG_G_Last (line 1741) | @Override
    method fetchByG_G_Last (line 1777) | @Override
    method findByG_G_PrevAndNext (line 1808) | @Override
    method getByG_G_PrevAndNext (line 1843) | protected GuestbookEntry getByG_G_PrevAndNext(
    method removeByG_G (line 1963) | @Override
    method countByG_G (line 1981) | @Override
    method GuestbookEntryPersistenceImpl (line 2036) | public GuestbookEntryPersistenceImpl() {
    method cacheResult (line 2054) | @Override
    method cacheResult (line 2075) | @Override
    method clearCache (line 2097) | @Override
    method clearCache (line 2113) | @Override
    method clearCache (line 2125) | @Override
    method cacheUniqueFindersCache (line 2140) | protected void cacheUniqueFindersCache(
    method clearUniqueFindersCache (line 2154) | protected void clearUniqueFindersCache(
    method create (line 2186) | @Override
    method remove (line 2209) | @Override
    method remove (line 2223) | @Override
    method removeImpl (line 2257) | @Override
    method updateImpl (line 2288) | @Override
    method findByPrimaryKey (line 2483) | @Override
    method findByPrimaryKey (line 2508) | @Override
    method fetchByPrimaryKey (line 2521) | @Override
    method findAll (line 2531) | @Override
    method findAll (line 2547) | @Override
    method findAll (line 2564) | @Override
    method findAll (line 2585) | @Override
    method removeAll (line 2677) | @Override
    method countAll (line 2689) | @Override
    method getBadColumnNames (line 2721) | @Override
    method getEntityCache (line 2726) | @Override
    method getPKDBName (line 2731) | @Override
    method getSelectSQL (line 2736) | @Override
    method getTableColumnsMap (line 2741) | @Override
    method activate (line 2749) | @Activate
    method deactivate (line 2845) | @Deactivate
    method setConfiguration (line 2853) | @Override
    method setDataSource (line 2867) | @Override
    method setSessionFactory (line 2876) | @Override

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/service/persistence/impl/GuestbookPersistenceImpl.java
  class GuestbookPersistenceImpl (line 77) | @Component(service = GuestbookPersistence.class)
    method findByUuid (line 109) | @Override
    method findByUuid (line 126) | @Override
    method findByUuid (line 144) | @Override
    method findByUuid (line 166) | @Override
    method findByUuid_First (line 292) | @Override
    method fetchByUuid_First (line 322) | @Override
    method findByUuid_Last (line 343) | @Override
    method fetchByUuid_Last (line 373) | @Override
    method findByUuid_PrevAndNext (line 402) | @Override
    method getByUuid_PrevAndNext (line 437) | protected Guestbook getByUuid_PrevAndNext(
    method removeByUuid (line 561) | @Override
    method countByUuid (line 576) | @Override
    method findByUUID_G (line 651) | @Override
    method fetchByUUID_G (line 687) | @Override
    method fetchByUUID_G (line 700) | @Override
    method removeByUUID_G (line 799) | @Override
    method countByUUID_G (line 815) | @Override
    method findByUuid_C (line 897) | @Override
    method findByUuid_C (line 916) | @Override
    method findByUuid_C (line 937) | @Override
    method findByUuid_C (line 961) | @Override
    method findByUuid_C_First (line 1096) | @Override
    method fetchByUuid_C_First (line 1132) | @Override
    method findByUuid_C_Last (line 1156) | @Override
    method fetchByUuid_C_Last (line 1192) | @Override
    method findByUuid_C_PrevAndNext (line 1223) | @Override
    method getByUuid_C_PrevAndNext (line 1258) | protected Guestbook getByUuid_C_PrevAndNext(
    method removeByUuid_C (line 1387) | @Override
    method countByUuid_C (line 1405) | @Override
    method findByGroupId (line 1486) | @Override
    method findByGroupId (line 1504) | @Override
    method findByGroupId (line 1522) | @Override
    method findByGroupId (line 1544) | @Override
    method findByGroupId_First (line 1657) | @Override
    method fetchByGroupId_First (line 1687) | @Override
    method findByGroupId_Last (line 1708) | @Override
    method fetchByGroupId_Last (line 1738) | @Override
    method findByGroupId_PrevAndNext (line 1767) | @Override
    method getByGroupId_PrevAndNext (line 1800) | protected Guestbook getByGroupId_PrevAndNext(
    method removeByGroupId (line 1913) | @Override
    method countByGroupId (line 1929) | @Override
    method GuestbookPersistenceImpl (line 1977) | public GuestbookPersistenceImpl() {
    method cacheResult (line 1995) | @Override
    method cacheResult (line 2014) | @Override
    method clearCache (line 2036) | @Override
    method clearCache (line 2052) | @Override
    method clearCache (line 2063) | @Override
    method cacheUniqueFindersCache (line 2077) | protected void cacheUniqueFindersCache(
    method clearUniqueFindersCache (line 2090) | protected void clearUniqueFindersCache(
    method create (line 2121) | @Override
    method remove (line 2144) | @Override
    method remove (line 2156) | @Override
    method removeImpl (line 2190) | @Override
    method updateImpl (line 2220) | @Override
    method findByPrimaryKey (line 2404) | @Override
    method findByPrimaryKey (line 2429) | @Override
    method fetchByPrimaryKey (line 2442) | @Override
    method findAll (line 2452) | @Override
    method findAll (line 2468) | @Override
    method findAll (line 2485) | @Override
    method findAll (line 2505) | @Override
    method removeAll (line 2597) | @Override
    method countAll (line 2609) | @Override
    method getBadColumnNames (line 2641) | @Override
    method getEntityCache (line 2646) | @Override
    method getPKDBName (line 2651) | @Override
    method getSelectSQL (line 2656) | @Override
    method getTableColumnsMap (line 2661) | @Override
    method activate (line 2669) | @Activate
    method deactivate (line 2760) | @Deactivate
    method setConfiguration (line 2768) | @Override
    method setDataSource (line 2782) | @Override
    method setSessionFactory (line 2791) | @Override

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/service/persistence/impl/constants/GBPersistenceConstants.java
  class GBPersistenceConstants (line 29) | @Component(immediate = true, service = {})
    method activate (line 38) | @Activate

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/resources/META-INF/sql/indexes.sql
  type IX_9294AD47 (line 1) | create index IX_9294AD47 on GB_Guestbook (groupId)
  type IX_9314A9F7 (line 2) | create index IX_9314A9F7 on GB_Guestbook (uuid_[$COLUMN_LENGTH:75$], com...
  type IX_EDD4239 (line 3) | create unique index IX_EDD4239 on GB_Guestbook (uuid_[$COLUMN_LENGTH:75$...
  type IX_E84D72FD (line 5) | create index IX_E84D72FD on GB_GuestbookEntry (groupId, guestbookId)
  type IX_CC265FEF (line 6) | create index IX_CC265FEF on GB_GuestbookEntry (uuid_[$COLUMN_LENGTH:75$]...
  type IX_4A541631 (line 7) | create unique index IX_4A541631 on GB_GuestbookEntry (uuid_[$COLUMN_LENG...

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/resources/META-INF/sql/tables.sql
  type GB_Guestbook (line 1) | create table GB_Guestbook (
  type GB_GuestbookEntry (line 17) | create table GB_GuestbookEntry (

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-web/src/main/java/com/liferay/docs/guestbook/constants/GuestbookPortletKeys.java
  class GuestbookPortletKeys (line 6) | public class GuestbookPortletKeys {

FILE: en/developer/tutorials/code/guestbook/04-web-front-end/com-liferay-docs-guestbook/modules/guestbook/guestbook-web/src/main/java/com/liferay/docs/guestbook/portlet/GuestbookPortlet.java
  class GuestbookPortlet (line 35) | @Component(immediate = true, property = { "com.liferay.portlet.display-c...
    method addEntry (line 50) | public void addEntry(ActionRequest request, ActionResponse response) t...
    method deleteEntry (line 95) | public void deleteEntry(ActionRequest request, ActionResponse response...
    method render (line 116) | @Override

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/exception/EntryEmailException.java
  class EntryEmailException (line 23) | @ProviderType
    method EntryEmailException (line 26) | public EntryEmailException() {
    method EntryEmailException (line 29) | public EntryEmailException(String msg) {
    method EntryEmailException (line 33) | public EntryEmailException(String msg, Throwable cause) {
    method EntryEmailException (line 37) | public EntryEmailException(Throwable cause) {

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/exception/EntryMessageException.java
  class EntryMessageException (line 23) | @ProviderType
    method EntryMessageException (line 26) | public EntryMessageException() {
    method EntryMessageException (line 29) | public EntryMessageException(String msg) {
    method EntryMessageException (line 33) | public EntryMessageException(String msg, Throwable cause) {
    method EntryMessageException (line 37) | public EntryMessageException(Throwable cause) {

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/exception/EntryNameException.java
  class EntryNameException (line 23) | @ProviderType
    method EntryNameException (line 26) | public EntryNameException() {
    method EntryNameException (line 29) | public EntryNameException(String msg) {
    method EntryNameException (line 33) | public EntryNameException(String msg, Throwable cause) {
    method EntryNameException (line 37) | public EntryNameException(Throwable cause) {

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/exception/GuestbookEntryEmailException.java
  class GuestbookEntryEmailException (line 23) | @ProviderType
    method GuestbookEntryEmailException (line 26) | public GuestbookEntryEmailException() {
    method GuestbookEntryEmailException (line 29) | public GuestbookEntryEmailException(String msg) {
    method GuestbookEntryEmailException (line 33) | public GuestbookEntryEmailException(String msg, Throwable cause) {
    method GuestbookEntryEmailException (line 37) | public GuestbookEntryEmailException(Throwable cause) {

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/exception/GuestbookEntryMessageException.java
  class GuestbookEntryMessageException (line 23) | @ProviderType
    method GuestbookEntryMessageException (line 26) | public GuestbookEntryMessageException() {
    method GuestbookEntryMessageException (line 29) | public GuestbookEntryMessageException(String msg) {
    method GuestbookEntryMessageException (line 33) | public GuestbookEntryMessageException(String msg, Throwable cause) {
    method GuestbookEntryMessageException (line 37) | public GuestbookEntryMessageException(Throwable cause) {

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/exception/GuestbookEntryNameException.java
  class GuestbookEntryNameException (line 23) | @ProviderType
    method GuestbookEntryNameException (line 26) | public GuestbookEntryNameException() {
    method GuestbookEntryNameException (line 29) | public GuestbookEntryNameException(String msg) {
    method GuestbookEntryNameException (line 33) | public GuestbookEntryNameException(String msg, Throwable cause) {
    method GuestbookEntryNameException (line 37) | public GuestbookEntryNameException(Throwable cause) {

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/exception/GuestbookNameException.java
  class GuestbookNameException (line 23) | @ProviderType
    method GuestbookNameException (line 26) | public GuestbookNameException() {
    method GuestbookNameException (line 29) | public GuestbookNameException(String msg) {
    method GuestbookNameException (line 33) | public GuestbookNameException(String msg, Throwable cause) {
    method GuestbookNameException (line 37) | public GuestbookNameException(Throwable cause) {

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/exception/NoSuchGuestbookEntryException.java
  class NoSuchGuestbookEntryException (line 23) | @ProviderType
    method NoSuchGuestbookEntryException (line 26) | public NoSuchGuestbookEntryException() {
    method NoSuchGuestbookEntryException (line 29) | public NoSuchGuestbookEntryException(String msg) {
    method NoSuchGuestbookEntryException (line 33) | public NoSuchGuestbookEntryException(String msg, Throwable cause) {
    method NoSuchGuestbookEntryException (line 37) | public NoSuchGuestbookEntryException(Throwable cause) {

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/exception/NoSuchGuestbookException.java
  class NoSuchGuestbookException (line 23) | @ProviderType
    method NoSuchGuestbookException (line 26) | public NoSuchGuestbookException() {
    method NoSuchGuestbookException (line 29) | public NoSuchGuestbookException(String msg) {
    method NoSuchGuestbookException (line 33) | public NoSuchGuestbookException(String msg, Throwable cause) {
    method NoSuchGuestbookException (line 37) | public NoSuchGuestbookException(Throwable cause) {

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/model/Guestbook.java
  type Guestbook (line 30) | @ImplementationClassName("com.liferay.docs.guestbook.model.impl.Guestboo...
    method get (line 42) | @Override
    method getAttributeClass (line 47) | @Override
    method getTypeClass (line 52) | @Override

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/model/GuestbookEntry.java
  type GuestbookEntry (line 30) | @ImplementationClassName(
    method get (line 44) | @Override
    method getAttributeClass (line 49) | @Override
    method getTypeClass (line 54) | @Override

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/model/GuestbookEntryModel.java
  type GuestbookEntryModel (line 39) | @ProviderType
    method getPrimaryKey (line 55) | public long getPrimaryKey();
    method setPrimaryKey (line 62) | public void setPrimaryKey(long primaryKey);
    method getUuid (line 69) | @AutoEscape
    method setUuid (line 78) | @Override
    method getEntryId (line 86) | public long getEntryId();
    method setEntryId (line 93) | public void setEntryId(long entryId);
    method getName (line 100) | @AutoEscape
    method setName (line 108) | public void setName(String name);
    method getEmail (line 115) | @AutoEscape
    method setEmail (line 123) | public void setEmail(String email);
    method getMessage (line 130) | @AutoEscape
    method setMessage (line 138) | public void setMessage(String message);
    method getGuestbookId (line 145) | public long getGuestbookId();
    method setGuestbookId (line 152) | public void setGuestbookId(long guestbookId);
    method getGroupId (line 159) | @Override
    method setGroupId (line 167) | @Override
    method getCompanyId (line 175) | @Override
    method setCompanyId (line 183) | @Override
    method getUserId (line 191) | @Override
    method setUserId (line 199) | @Override
    method getUserUuid (line 207) | @Override
    method setUserUuid (line 215) | @Override
    method getUserName (line 223) | @AutoEscape
    method setUserName (line 232) | @Override
    method getCreateDate (line 240) | @Override
    method setCreateDate (line 248) | @Override
    method getModifiedDate (line 256) | @Override
    method setModifiedDate (line 264) | @Override
    method getStatus (line 272) | @Override
    method setStatus (line 280) | @Override
    method getStatusByUserId (line 288) | @Override
    method setStatusByUserId (line 296) | @Override
    method getStatusByUserUuid (line 304) | @Override
    method setStatusByUserUuid (line 312) | @Override
    method getStatusByUserName (line 320) | @AutoEscape
    method setStatusByUserName (line 329) | @Override
    method getStatusDate (line 337) | @Override
    method setStatusDate (line 345) | @Override
    method isApproved (line 353) | @Override
    method isDenied (line 361) | @Override
    method isDraft (line 369) | @Override
    method isExpired (line 377) | @Override
    method isInactive (line 385) | @Override
    method isIncomplete (line 393) | @Override
    method isPending (line 401) | @Override
    method isScheduled (line 409) | @Override

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/model/GuestbookEntrySoap.java
  class GuestbookEntrySoap (line 31) | @ProviderType
    method toSoapModel (line 34) | public static GuestbookEntrySoap toSoapModel(GuestbookEntry model) {
    method toSoapModels (line 57) | public static GuestbookEntrySoap[] toSoapModels(GuestbookEntry[] model...
    method toSoapModels (line 67) | public static GuestbookEntrySoap[][] toSoapModels(
    method toSoapModels (line 87) | public static GuestbookEntrySoap[] toSoapModels(
    method GuestbookEntrySoap (line 100) | public GuestbookEntrySoap() {
    method getPrimaryKey (line 103) | public long getPrimaryKey() {
    method setPrimaryKey (line 107) | public void setPrimaryKey(long pk) {
    method getUuid (line 111) | public String getUuid() {
    method setUuid (line 115) | public void setUuid(String uuid) {
    method getEntryId (line 119) | public long getEntryId() {
    method setEntryId (line 123) | public void setEntryId(long entryId) {
    method getName (line 127) | public String getName() {
    method setName (line 131) | public void setName(String name) {
    method getEmail (line 135) | public String getEmail() {
    method setEmail (line 139) | public void setEmail(String email) {
    method getMessage (line 143) | public String getMessage() {
    method setMessage (line 147) | public void setMessage(String message) {
    method getGuestbookId (line 151) | public long getGuestbookId() {
    method setGuestbookId (line 155) | public void setGuestbookId(long guestbookId) {
    method getGroupId (line 159) | public long getGroupId() {
    method setGroupId (line 163) | public void setGroupId(long groupId) {
    method getCompanyId (line 167) | public long getCompanyId() {
    method setCompanyId (line 171) | public void setCompanyId(long companyId) {
    method getUserId (line 175) | public long getUserId() {
    method setUserId (line 179) | public void setUserId(long userId) {
    method getUserName (line 183) | public String getUserName() {
    method setUserName (line 187) | public void setUserName(String userName) {
    method getCreateDate (line 191) | public Date getCreateDate() {
    method setCreateDate (line 195) | public void setCreateDate(Date createDate) {
    method getModifiedDate (line 199) | public Date getModifiedDate() {
    method setModifiedDate (line 203) | public void setModifiedDate(Date modifiedDate) {
    method getStatus (line 207) | public int getStatus() {
    method setStatus (line 211) | public void setStatus(int status) {
    method getStatusByUserId (line 215) | public long getStatusByUserId() {
    method setStatusByUserId (line 219) | public void setStatusByUserId(long statusByUserId) {
    method getStatusByUserName (line 223) | public String getStatusByUserName() {
    method setStatusByUserName (line 227) | public void setStatusByUserName(String statusByUserName) {
    method getStatusDate (line 231) | public Date getStatusDate() {
    method setStatusDate (line 235) | public void setStatusDate(Date statusDate) {

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/model/GuestbookEntryWrapper.java
  class GuestbookEntryWrapper (line 36) | @ProviderType
    method GuestbookEntryWrapper (line 41) | public GuestbookEntryWrapper(GuestbookEntry guestbookEntry) {
    method getModelAttributes (line 45) | @Override
    method setModelAttributes (line 69) | @Override
    method getCompanyId (line 173) | @Override
    method getCreateDate (line 183) | @Override
    method getEmail (line 193) | @Override
    method getEntryId (line 203) | @Override
    method getGroupId (line 213) | @Override
    method getGuestbookId (line 223) | @Override
    method getMessage (line 233) | @Override
    method getModifiedDate (line 243) | @Override
    method getName (line 253) | @Override
    method getPrimaryKey (line 263) | @Override
    method getStatus (line 273) | @Override
    method getStatusByUserId (line 283) | @Override
    method getStatusByUserName (line 293) | @Override
    method getStatusByUserUuid (line 303) | @Override
    method getStatusDate (line 313) | @Override
    method getUserId (line 323) | @Override
    method getUserName (line 333) | @Override
    method getUserUuid (line 343) | @Override
    method getUuid (line 353) | @Override
    method isApproved (line 363) | @Override
    method isDenied (line 373) | @Override
    method isDraft (line 383) | @Override
    method isExpired (line 393) | @Override
    method isInactive (line 403) | @Override
    method isIncomplete (line 413) | @Override
    method isPending (line 423) | @Override
    method isScheduled (line 433) | @Override
    method persist (line 438) | @Override
    method setCompanyId (line 448) | @Override
    method setCreateDate (line 458) | @Override
    method setEmail (line 468) | @Override
    method setEntryId (line 478) | @Override
    method setGroupId (line 488) | @Override
    method setGuestbookId (line 498) | @Override
    method setMessage (line 508) | @Override
    method setModifiedDate (line 518) | @Override
    method setName (line 528) | @Override
    method setPrimaryKey (line 538) | @Override
    method setStatus (line 548) | @Override
    method setStatusByUserId (line 558) | @Override
    method setStatusByUserName (line 568) | @Override
    method setStatusByUserUuid (line 578) | @Override
    method setStatusDate (line 588) | @Override
    method setUserId (line 598) | @Override
    method setUserName (line 608) | @Override
    method setUserUuid (line 618) | @Override
    method setUuid (line 628) | @Override
    method getStagedModelType (line 633) | @Override
    method wrap (line 638) | @Override

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/model/GuestbookModel.java
  type GuestbookModel (line 39) | @ProviderType
    method getPrimaryKey (line 55) | public long getPrimaryKey();
    method setPrimaryKey (line 62) | public void setPrimaryKey(long primaryKey);
    method getUuid (line 69) | @AutoEscape
    method setUuid (line 78) | @Override
    method getGuestbookId (line 86) | public long getGuestbookId();
    method setGuestbookId (line 93) | public void setGuestbookId(long guestbookId);
    method getName (line 100) | @AutoEscape
    method setName (line 108) | public void setName(String name);
    method getGroupId (line 115) | @Override
    method setGroupId (line 123) | @Override
    method getCompanyId (line 131) | @Override
    method setCompanyId (line 139) | @Override
    method getUserId (line 147) | @Override
    method setUserId (line 155) | @Override
    method getUserUuid (line 163) | @Override
    method setUserUuid (line 171) | @Override
    method getUserName (line 179) | @AutoEscape
    method setUserName (line 188) | @Override
    method getCreateDate (line 196) | @Override
    method setCreateDate (line 204) | @Override
    method getModifiedDate (line 212) | @Override
    method setModifiedDate (line 220) | @Override
    method getStatus (line 228) | @Override
    method setStatus (line 236) | @Override
    method getStatusByUserId (line 244) | @Override
    method setStatusByUserId (line 252) | @Override
    method getStatusByUserUuid (line 260) | @Override
    method setStatusByUserUuid (line 268) | @Override
    method getStatusByUserName (line 276) | @AutoEscape
    method setStatusByUserName (line 285) | @Override
    method getStatusDate (line 293) | @Override
    method setStatusDate (line 301) | @Override
    method isApproved (line 309) | @Override
    method isDenied (line 317) | @Override
    method isDraft (line 325) | @Override
    method isExpired (line 333) | @Override
    method isInactive (line 341) | @Override
    method isIncomplete (line 349) | @Override
    method isPending (line 357) | @Override
    method isScheduled (line 365) | @Override

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/model/GuestbookSoap.java
  class GuestbookSoap (line 31) | @ProviderType
    method toSoapModel (line 34) | public static GuestbookSoap toSoapModel(Guestbook model) {
    method toSoapModels (line 54) | public static GuestbookSoap[] toSoapModels(Guestbook[] models) {
    method toSoapModels (line 64) | public static GuestbookSoap[][] toSoapModels(Guestbook[][] models) {
    method toSoapModels (line 81) | public static GuestbookSoap[] toSoapModels(List<Guestbook> models) {
    method GuestbookSoap (line 92) | public GuestbookSoap() {
    method getPrimaryKey (line 95) | public long getPrimaryKey() {
    method setPrimaryKey (line 99) | public void setPrimaryKey(long pk) {
    method getUuid (line 103) | public String getUuid() {
    method setUuid (line 107) | public void setUuid(String uuid) {
    method getGuestbookId (line 111) | public long getGuestbookId() {
    method setGuestbookId (line 115) | public void setGuestbookId(long guestbookId) {
    method getName (line 119) | public String getName() {
    method setName (line 123) | public void setName(String name) {
    method getGroupId (line 127) | public long getGroupId() {
    method setGroupId (line 131) | public void setGroupId(long groupId) {
    method getCompanyId (line 135) | public long getCompanyId() {
    method setCompanyId (line 139) | public void setCompanyId(long companyId) {
    method getUserId (line 143) | public long getUserId() {
    method setUserId (line 147) | public void setUserId(long userId) {
    method getUserName (line 151) | public String getUserName() {
    method setUserName (line 155) | public void setUserName(String userName) {
    method getCreateDate (line 159) | public Date getCreateDate() {
    method setCreateDate (line 163) | public void setCreateDate(Date createDate) {
    method getModifiedDate (line 167) | public Date getModifiedDate() {
    method setModifiedDate (line 171) | public void setModifiedDate(Date modifiedDate) {
    method getStatus (line 175) | public int getStatus() {
    method setStatus (line 179) | public void setStatus(int status) {
    method getStatusByUserId (line 183) | public long getStatusByUserId() {
    method setStatusByUserId (line 187) | public void setStatusByUserId(long statusByUserId) {
    method getStatusByUserName (line 191) | public String getStatusByUserName() {
    method setStatusByUserName (line 195) | public void setStatusByUserName(String statusByUserName) {
    method getStatusDate (line 199) | public Date getStatusDate() {
    method setStatusDate (line 203) | public void setStatusDate(Date statusDate) {

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/model/GuestbookWrapper.java
  class GuestbookWrapper (line 36) | @ProviderType
    method GuestbookWrapper (line 41) | public GuestbookWrapper(Guestbook guestbook) {
    method getModelAttributes (line 45) | @Override
    method setModelAttributes (line 66) | @Override
    method getCompanyId (line 152) | @Override
    method getCreateDate (line 162) | @Override
    method getGroupId (line 172) | @Override
    method getGuestbookId (line 182) | @Override
    method getModifiedDate (line 192) | @Override
    method getName (line 202) | @Override
    method getPrimaryKey (line 212) | @Override
    method getStatus (line 222) | @Override
    method getStatusByUserId (line 232) | @Override
    method getStatusByUserName (line 242) | @Override
    method getStatusByUserUuid (line 252) | @Override
    method getStatusDate (line 262) | @Override
    method getUserId (line 272) | @Override
    method getUserName (line 282) | @Override
    method getUserUuid (line 292) | @Override
    method getUuid (line 302) | @Override
    method isApproved (line 312) | @Override
    method isDenied (line 322) | @Override
    method isDraft (line 332) | @Override
    method isExpired (line 342) | @Override
    method isInactive (line 352) | @Override
    method isIncomplete (line 362) | @Override
    method isPending (line 372) | @Override
    method isScheduled (line 382) | @Override
    method persist (line 387) | @Override
    method setCompanyId (line 397) | @Override
    method setCreateDate (line 407) | @Override
    method setGroupId (line 417) | @Override
    method setGuestbookId (line 427) | @Override
    method setModifiedDate (line 437) | @Override
    method setName (line 447) | @Override
    method setPrimaryKey (line 457) | @Override
    method setStatus (line 467) | @Override
    method setStatusByUserId (line 477) | @Override
    method setStatusByUserName (line 487) | @Override
    method setStatusByUserUuid (line 497) | @Override
    method setStatusDate (line 507) | @Override
    method setUserId (line 517) | @Override
    method setUserName (line 527) | @Override
    method setUserUuid (line 537) | @Override
    method setUuid (line 547) | @Override
    method getStagedModelType (line 552) | @Override
    method wrap (line 557) | @Override

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/GuestbookEntryLocalService.java
  type GuestbookEntryLocalService (line 53) | @ProviderType
    method addGuestbookEntry (line 73) | @Indexable(type = IndexableType.REINDEX)
    method addGuestbookEntry (line 76) | public GuestbookEntry addGuestbookEntry(
    method createGuestbookEntry (line 87) | @Transactional(enabled = false)
    method deleteGuestbookEntry (line 97) | @Indexable(type = IndexableType.DELETE)
    method deleteGuestbookEntry (line 108) | @Indexable(type = IndexableType.DELETE)
    method deletePersistedModel (line 115) | @Override
    method dynamicQuery (line 119) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method dynamicQuery (line 128) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method dynamicQuery (line 143) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method dynamicQuery (line 160) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method dynamicQueryCount (line 171) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method dynamicQueryCount (line 181) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method fetchGuestbookEntry (line 185) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method fetchGuestbookEntryByUuidAndGroupId (line 195) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getActionableDynamicQuery (line 199) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getExportActionableDynamicQuery (line 202) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbookEntries (line 217) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbookEntries (line 220) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbookEntries (line 224) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbookEntries (line 229) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbookEntriesByUuidAndCompanyId (line 241) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbookEntriesByUuidAndCompanyId (line 255) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbookEntriesCount (line 265) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbookEntriesCount (line 268) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbookEntry (line 278) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbookEntryByUuidAndGroupId (line 290) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getIndexableActionableDynamicQuery (line 295) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getOSGiServiceIdentifier (line 303) | public String getOSGiServiceIdentifier();
    method getPersistedModel (line 305) | @Override
    method updateGuestbookEntry (line 316) | @Indexable(type = IndexableType.REINDEX)
    method updateGuestbookEntry (line 319) | public GuestbookEntry updateGuestbookEntry(

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/GuestbookEntryLocalServiceUtil.java
  class GuestbookEntryLocalServiceUtil (line 34) | @ProviderType
    method addGuestbookEntry (line 49) | public static com.liferay.docs.guestbook.model.GuestbookEntry
    method addGuestbookEntry (line 56) | public static com.liferay.docs.guestbook.model.GuestbookEntry
    method createGuestbookEntry (line 73) | public static com.liferay.docs.guestbook.model.GuestbookEntry
    method deleteGuestbookEntry (line 86) | public static com.liferay.docs.guestbook.model.GuestbookEntry
    method deleteGuestbookEntry (line 101) | public static com.liferay.docs.guestbook.model.GuestbookEntry
    method deletePersistedModel (line 111) | public static com.liferay.portal.kernel.model.PersistedModel
    method dynamicQuery (line 119) | public static com.liferay.portal.kernel.dao.orm.DynamicQuery
    method dynamicQuery (line 131) | public static <T> java.util.List<T> dynamicQuery(
    method dynamicQuery (line 149) | public static <T> java.util.List<T> dynamicQuery(
    method dynamicQuery (line 169) | public static <T> java.util.List<T> dynamicQuery(
    method dynamicQueryCount (line 184) | public static long dynamicQueryCount(
    method dynamicQueryCount (line 197) | public static long dynamicQueryCount(
    method fetchGuestbookEntry (line 204) | public static com.liferay.docs.guestbook.model.GuestbookEntry
    method fetchGuestbookEntryByUuidAndGroupId (line 217) | public static com.liferay.docs.guestbook.model.GuestbookEntry
    method getActionableDynamicQuery (line 223) | public static com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery
    method getExportActionableDynamicQuery (line 229) | public static com.liferay.portal.kernel.dao.orm.ExportActionableDynami...
    method getGuestbookEntries (line 248) | public static java.util.List
    method getGuestbookEntries (line 255) | public static java.util.List
    method getGuestbookEntries (line 262) | public static java.util.List
    method getGuestbookEntries (line 271) | public static java.util.List
    method getGuestbookEntriesByUuidAndCompanyId (line 288) | public static java.util.List
    method getGuestbookEntriesByUuidAndCompanyId (line 306) | public static java.util.List
    method getGuestbookEntriesCount (line 323) | public static int getGuestbookEntriesCount() {
    method getGuestbookEntriesCount (line 327) | public static int getGuestbookEntriesCount(long groupId, long guestboo...
    method getGuestbookEntry (line 338) | public static com.liferay.docs.guestbook.model.GuestbookEntry
    method getGuestbookEntryByUuidAndGroupId (line 353) | public static com.liferay.docs.guestbook.model.GuestbookEntry
    method getIndexableActionableDynamicQuery (line 360) | public static
    method getOSGiServiceIdentifier (line 372) | public static String getOSGiServiceIdentifier() {
    method getPersistedModel (line 376) | public static com.liferay.portal.kernel.model.PersistedModel
    method updateGuestbookEntry (line 389) | public static com.liferay.docs.guestbook.model.GuestbookEntry
    method updateGuestbookEntry (line 396) | public static com.liferay.docs.guestbook.model.GuestbookEntry
    method getService (line 408) | public static GuestbookEntryLocalService getService() {

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/GuestbookEntryLocalServiceWrapper.java
  class GuestbookEntryLocalServiceWrapper (line 28) | @ProviderType
    method GuestbookEntryLocalServiceWrapper (line 33) | public GuestbookEntryLocalServiceWrapper(
    method addGuestbookEntry (line 45) | @Override
    method addGuestbookEntry (line 52) | @Override
    method createGuestbookEntry (line 69) | @Override
    method deleteGuestbookEntry (line 83) | @Override
    method deleteGuestbookEntry (line 98) | @Override
    method deletePersistedModel (line 109) | @Override
    method dynamicQuery (line 117) | @Override
    method dynamicQuery (line 128) | @Override
    method dynamicQuery (line 147) | @Override
    method dynamicQuery (line 169) | @Override
    method dynamicQueryCount (line 185) | @Override
    method dynamicQueryCount (line 199) | @Override
    method fetchGuestbookEntry (line 208) | @Override
    method fetchGuestbookEntryByUuidAndGroupId (line 222) | @Override
    method getActionableDynamicQuery (line 230) | @Override
    method getExportActionableDynamicQuery (line 237) | @Override
    method getGuestbookEntries (line 258) | @Override
    method getGuestbookEntries (line 265) | @Override
    method getGuestbookEntries (line 273) | @Override
    method getGuestbookEntries (line 283) | @Override
    method getGuestbookEntriesByUuidAndCompanyId (line 301) | @Override
    method getGuestbookEntriesByUuidAndCompanyId (line 319) | @Override
    method getGuestbookEntriesCount (line 337) | @Override
    method getGuestbookEntriesCount (line 342) | @Override
    method getGuestbookEntry (line 355) | @Override
    method getGuestbookEntryByUuidAndGroupId (line 371) | @Override
    method getIndexableActionableDynamicQuery (line 380) | @Override
    method getOSGiServiceIdentifier (line 392) | @Override
    method getPersistedModel (line 397) | @Override
    method updateGuestbookEntry (line 411) | @Override
    method updateGuestbookEntry (line 418) | @Override
    method getWrappedService (line 430) | @Override
    method setWrappedService (line 435) | @Override

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/GuestbookEntryService.java
  type GuestbookEntryService (line 36) | @AccessControlled
    method getOSGiServiceIdentifier (line 56) | public String getOSGiServiceIdentifier();

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/GuestbookEntryServiceUtil.java
  class GuestbookEntryServiceUtil (line 34) | @ProviderType
    method getOSGiServiceIdentifier (line 48) | public static String getOSGiServiceIdentifier() {
    method getService (line 52) | public static GuestbookEntryService getService() {

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/GuestbookEntryServiceWrapper.java
  class GuestbookEntryServiceWrapper (line 28) | @ProviderType
    method GuestbookEntryServiceWrapper (line 32) | public GuestbookEntryServiceWrapper(
    method getOSGiServiceIdentifier (line 43) | @Override
    method getWrappedService (line 48) | @Override
    method setWrappedService (line 53) | @Override

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/GuestbookLocalService.java
  type GuestbookLocalService (line 53) | @ProviderType
    method addGuestbook (line 73) | @Indexable(type = IndexableType.REINDEX)
    method addGuestbook (line 76) | public Guestbook addGuestbook(
    method createGuestbook (line 86) | @Transactional(enabled = false)
    method deleteGuestbook (line 95) | @Indexable(type = IndexableType.DELETE)
    method deleteGuestbook (line 105) | @Indexable(type = IndexableType.DELETE)
    method deleteGuestbook (line 108) | public Guestbook deleteGuestbook(
    method deletePersistedModel (line 115) | @Override
    method dynamicQuery (line 119) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method dynamicQuery (line 128) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method dynamicQuery (line 143) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method dynamicQuery (line 160) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method dynamicQueryCount (line 171) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method dynamicQueryCount (line 181) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method fetchGuestbook (line 185) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method fetchGuestbookByUuidAndGroupId (line 195) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getActionableDynamicQuery (line 198) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getExportActionableDynamicQuery (line 201) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbook (line 212) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbookByUuidAndGroupId (line 223) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbooks (line 238) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbooks (line 241) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbooks (line 244) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbooks (line 247) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbooksByUuidAndCompanyId (line 258) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbooksByUuidAndCompanyId (line 272) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbooksCount (line 282) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getGuestbooksCount (line 285) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getIndexableActionableDynamicQuery (line 288) | @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    method getOSGiServiceIdentifier (line 296) | public String getOSGiServiceIdentifier();
    method getPersistedModel (line 298) | @Override
    method updateGuestbook (line 309) | @Indexable(type = IndexableType.REINDEX)
    method updateGuestbook (line 312) | public Guestbook updateGuestbook(

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/GuestbookLocalServiceUtil.java
  class GuestbookLocalServiceUtil (line 34) | @ProviderType
    method addGuestbook (line 49) | public static com.liferay.docs.guestbook.model.Guestbook addGuestbook(
    method addGuestbook (line 55) | public static com.liferay.docs.guestbook.model.Guestbook addGuestbook(
    method createGuestbook (line 69) | public static com.liferay.docs.guestbook.model.Guestbook createGuestbook(
    method deleteGuestbook (line 81) | public static com.liferay.docs.guestbook.model.Guestbook deleteGuestbook(
    method deleteGuestbook (line 94) | public static com.liferay.docs.guestbook.model.Guestbook deleteGuestbook(
    method deleteGuestbook (line 101) | public static com.liferay.docs.guestbook.model.Guestbook deleteGuestbook(
    method deletePersistedModel (line 113) | public static com.liferay.portal.kernel.model.PersistedModel
    method dynamicQuery (line 121) | public static com.liferay.portal.kernel.dao.orm.DynamicQuery
    method dynamicQuery (line 133) | public static <T> java.util.List<T> dynamicQuery(
    method dynamicQuery (line 151) | public static <T> java.util.List<T> dynamicQuery(
    method dynamicQuery (line 171) | public static <T> java.util.List<T> dynamicQuery(
    method dynamicQueryCount (line 186) | public static long dynamicQueryCount(
    method dynamicQueryCount (line 199) | public static long dynamicQueryCount(
    method fetchGuestbook (line 206) | public static com.liferay.docs.guestbook.model.Guestbook fetchGuestbook(
    method fetchGuestbookByUuidAndGroupId (line 219) | public static com.liferay.docs.guestbook.model.Guestbook
    method getActionableDynamicQuery (line 225) | public static com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery
    method getExportActionableDynamicQuery (line 231) | public static com.liferay.portal.kernel.dao.orm.ExportActionableDynami...
    method getGuestbook (line 246) | public static com.liferay.docs.guestbook.model.Guestbook getGuestbook(
    method getGuestbookByUuidAndGroupId (line 261) | public static com.liferay.docs.guestbook.model.Guestbook
    method getGuestbooks (line 279) | public static java.util.List<com.liferay.docs.guestbook.model.Guestbook>
    method getGuestbooks (line 285) | public static java.util.List<com.liferay.docs.guestbook.model.Guestbook>
    method getGuestbooks (line 291) | public static java.util.List<com.liferay.docs.guestbook.model.Guestbook>
    method getGuestbooks (line 297) | public static java.util.List<com.liferay.docs.guestbook.model.Guestbook>
    method getGuestbooksByUuidAndCompanyId (line 313) | public static java.util.List<com.liferay.docs.guestbook.model.Guestbook>
    method getGuestbooksByUuidAndCompanyId (line 329) | public static java.util.List<com.liferay.docs.guestbook.model.Guestbook>
    method getGuestbooksCount (line 345) | public static int getGuestbooksCount() {
    method getGuestbooksCount (line 349) | public static int getGuestbooksCount(long groupId) {
    method getIndexableActionableDynamicQuery (line 353) | public static
    method getOSGiServiceIdentifier (line 365) | public static String getOSGiServiceIdentifier() {
    method getPersistedModel (line 369) | public static com.liferay.portal.kernel.model.PersistedModel
    method updateGuestbook (line 382) | public static com.liferay.docs.guestbook.model.Guestbook updateGuestbook(
    method updateGuestbook (line 388) | public static com.liferay.docs.guestbook.model.Guestbook updateGuestbook(
    method getService (line 398) | public static GuestbookLocalService getService() {

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/GuestbookLocalServiceWrapper.java
  class GuestbookLocalServiceWrapper (line 28) | @ProviderType
    method GuestbookLocalServiceWrapper (line 32) | public GuestbookLocalServiceWrapper(
    method addGuestbook (line 44) | @Override
    method addGuestbook (line 51) | @Override
    method createGuestbook (line 67) | @Override
    method deleteGuestbook (line 80) | @Override
    method deleteGuestbook (line 94) | @Override
    method deleteGuestbook (line 102) | @Override
    method deletePersistedModel (line 116) | @Override
    method dynamicQuery (line 124) | @Override
    method dynamicQuery (line 135) | @Override
    method dynamicQuery (line 154) | @Override
    method dynamicQuery (line 175) | @Override
    method dynamicQueryCount (line 191) | @Override
    method dynamicQueryCount (line 205) | @Override
    method fetchGuestbook (line 214) | @Override
    method fetchGuestbookByUuidAndGroupId (line 228) | @Override
    method getActionableDynamicQuery (line 236) | @Override
    method getExportActionableDynamicQuery (line 243) | @Override
    method getGuestbook (line 260) | @Override
    method getGuestbookByUuidAndGroupId (line 276) | @Override
    method getGuestbooks (line 296) | @Override
    method getGuestbooks (line 303) | @Override
    method getGuestbooks (line 310) | @Override
    method getGuestbooks (line 317) | @Override
    method getGuestbooksByUuidAndCompanyId (line 334) | @Override
    method getGuestbooksByUuidAndCompanyId (line 352) | @Override
    method getGuestbooksCount (line 369) | @Override
    method getGuestbooksCount (line 374) | @Override
    method getIndexableActionableDynamicQuery (line 379) | @Override
    method getOSGiServiceIdentifier (line 391) | @Override
    method getPersistedModel (line 396) | @Override
    method updateGuestbook (line 410) | @Override
    method updateGuestbook (line 417) | @Override
    method getWrappedService (line 428) | @Override
    method setWrappedService (line 433) | @Override

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/GuestbookService.java
  type GuestbookService (line 36) | @AccessControlled
    method getOSGiServiceIdentifier (line 56) | public String getOSGiServiceIdentifier();

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/GuestbookServiceUtil.java
  class GuestbookServiceUtil (line 34) | @ProviderType
    method getOSGiServiceIdentifier (line 48) | public static String getOSGiServiceIdentifier() {
    method getService (line 52) | public static GuestbookService getService() {

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/GuestbookServiceWrapper.java
  class GuestbookServiceWrapper (line 28) | @ProviderType
    method GuestbookServiceWrapper (line 32) | public GuestbookServiceWrapper(GuestbookService guestbookService) {
    method getOSGiServiceIdentifier (line 41) | @Override
    method getWrappedService (line 46) | @Override
    method setWrappedService (line 51) | @Override

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/persistence/GuestbookEntryPersistence.java
  type GuestbookEntryPersistence (line 34) | @ProviderType
    method findByUuid (line 50) | public java.util.List<GuestbookEntry> findByUuid(String uuid);
    method findByUuid (line 64) | public java.util.List<GuestbookEntry> findByUuid(
    method findByUuid (line 80) | public java.util.List<GuestbookEntry> findByUuid(
    method findByUuid (line 99) | public java.util.List<GuestbookEntry> findByUuid(
    method findByUuid_First (line 113) | public GuestbookEntry findByUuid_First(
    method fetchByUuid_First (line 126) | public GuestbookEntry fetchByUuid_First(
    method findByUuid_Last (line 139) | public GuestbookEntry findByUuid_Last(
    method fetchByUuid_Last (line 152) | public GuestbookEntry fetchByUuid_Last(
    method findByUuid_PrevAndNext (line 166) | public GuestbookEntry[] findByUuid_PrevAndNext(
    method removeByUuid (line 177) | public void removeByUuid(String uuid);
    method countByUuid (line 185) | public int countByUuid(String uuid);
    method findByUUID_G (line 195) | public GuestbookEntry findByUUID_G(String uuid, long groupId)
    method fetchByUUID_G (line 205) | public GuestbookEntry fetchByUUID_G(String uuid, long groupId);
    method fetchByUUID_G (line 215) | public GuestbookEntry fetchByUUID_G(
    method removeByUUID_G (line 225) | public GuestbookEntry removeByUUID_G(String uuid, long groupId)
    method countByUUID_G (line 235) | public int countByUUID_G(String uuid, long groupId);
    method findByUuid_C (line 244) | public java.util.List<GuestbookEntry> findByUuid_C(
    method findByUuid_C (line 260) | public java.util.List<GuestbookEntry> findByUuid_C(
    method findByUuid_C (line 277) | public java.util.List<GuestbookEntry> findByUuid_C(
    method findByUuid_C (line 297) | public java.util.List<GuestbookEntry> findByUuid_C(
    method findByUuid_C_First (line 312) | public GuestbookEntry findByUuid_C_First(
    method fetchByUuid_C_First (line 326) | public GuestbookEntry fetchByUuid_C_First(
    method findByUuid_C_Last (line 340) | public GuestbookEntry findByUuid_C_Last(
    method fetchByUuid_C_Last (line 354) | public GuestbookEntry fetchByUuid_C_Last(
    method findByUuid_C_PrevAndNext (line 369) | public GuestbookEntry[] findByUuid_C_PrevAndNext(
    method removeByUuid_C (line 381) | public void removeByUuid_C(String uuid, long companyId);
    method countByUuid_C (line 390) | public int countByUuid_C(String uuid, long companyId);
    method findByG_G (line 399) | public java.util.List<GuestbookEntry> findByG_G(
    method findByG_G (line 415) | public java.util.List<GuestbookEntry> findByG_G(
    method findByG_G (line 432) | public java.util.List<GuestbookEntry> findByG_G(
    method findByG_G (line 452) | public java.util.List<GuestbookEntry> findByG_G(
    method findByG_G_First (line 467) | public GuestbookEntry findByG_G_First(
    method fetchByG_G_First (line 481) | public GuestbookEntry fetchByG_G_First(
    method findByG_G_Last (line 495) | public GuestbookEntry findByG_G_Last(
    method fetchByG_G_Last (line 509) | public GuestbookEntry fetchByG_G_Last(
    method findByG_G_PrevAndNext (line 524) | public GuestbookEntry[] findByG_G_PrevAndNext(
    method removeByG_G (line 536) | public void removeByG_G(long groupId, long guestbookId);
    method countByG_G (line 545) | public int countByG_G(long groupId, long guestbookId);
    method cacheResult (line 552) | public void cacheResult(GuestbookEntry guestbookEntry);
    method cacheResult (line 559) | public void cacheResult(java.util.List<GuestbookEntry> guestbookEntries);
    method create (line 567) | public GuestbookEntry create(long entryId);
    method remove (line 576) | public GuestbookEntry remove(long entryId)
    method updateImpl (line 579) | public GuestbookEntry updateImpl(GuestbookEntry guestbookEntry);
    method findByPrimaryKey (line 588) | public GuestbookEntry findByPrimaryKey(long entryId)
    method fetchByPrimaryKey (line 597) | public GuestbookEntry fetchByPrimaryKey(long entryId);
    method findAll (line 604) | public java.util.List<GuestbookEntry> findAll();
    method findAll (line 617) | public java.util.List<GuestbookEntry> findAll(int start, int end);
    method findAll (line 631) | public java.util.List<GuestbookEntry> findAll(
    method findAll (line 649) | public java.util.List<GuestbookEntry> findAll(
    method removeAll (line 658) | public void removeAll();
    method countAll (line 665) | public int countAll();

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/persistence/GuestbookEntryUtil.java
  class GuestbookEntryUtil (line 44) | @ProviderType
    method clearCache (line 56) | public static void clearCache() {
    method clearCache (line 63) | public static void clearCache(GuestbookEntry guestbookEntry) {
    method countWithDynamicQuery (line 70) | public static long countWithDynamicQuery(DynamicQuery dynamicQuery) {
    method fetchByPrimaryKeys (line 77) | public static Map<Serializable, GuestbookEntry> fetchByPrimaryKeys(
    method findWithDynamicQuery (line 86) | public static List<GuestbookEntry> findWithDynamicQuery(
    method findWithDynamicQuery (line 95) | public static List<GuestbookEntry> findWithDynamicQuery(
    method findWithDynamicQuery (line 104) | public static List<GuestbookEntry> findWithDynamicQuery(
    method update (line 115) | public static GuestbookEntry update(GuestbookEntry guestbookEntry) {
    method update (line 122) | public static GuestbookEntry update(
    method findByUuid (line 134) | public static List<GuestbookEntry> findByUuid(String uuid) {
    method findByUuid (line 150) | public static List<GuestbookEntry> findByUuid(
    method findByUuid (line 169) | public static List<GuestbookEntry> findByUuid(
    method findByUuid (line 190) | public static List<GuestbookEntry> findByUuid(
    method findByUuid_First (line 207) | public static GuestbookEntry findByUuid_First(
    method fetchByUuid_First (line 222) | public static GuestbookEntry fetchByUuid_First(
    method findByUuid_Last (line 236) | public static GuestbookEntry findByUuid_Last(
    method fetchByUuid_Last (line 251) | public static GuestbookEntry fetchByUuid_Last(
    method findByUuid_PrevAndNext (line 266) | public static GuestbookEntry[] findByUuid_PrevAndNext(
    method removeByUuid (line 281) | public static void removeByUuid(String uuid) {
    method countByUuid (line 291) | public static int countByUuid(String uuid) {
    method findByUUID_G (line 303) | public static GuestbookEntry findByUUID_G(String uuid, long groupId)
    method fetchByUUID_G (line 317) | public static GuestbookEntry fetchByUUID_G(String uuid, long groupId) {
    method fetchByUUID_G (line 329) | public static GuestbookEntry fetchByUUID_G(
    method removeByUUID_G (line 342) | public static GuestbookEntry removeByUUID_G(String uuid, long groupId)
    method countByUUID_G (line 356) | public static int countByUUID_G(String uuid, long groupId) {
    method findByUuid_C (line 367) | public static List<GuestbookEntry> findByUuid_C(
    method findByUuid_C (line 386) | public static List<GuestbookEntry> findByUuid_C(
    method findByUuid_C (line 406) | public static List<GuestbookEntry> findByUuid_C(
    method findByUuid_C (line 429) | public static List<GuestbookEntry> findByUuid_C(
    method findByUuid_C_First (line 447) | public static GuestbookEntry findByUuid_C_First(
    method fetchByUuid_C_First (line 465) | public static GuestbookEntry fetchByUuid_C_First(
    method findByUuid_C_Last (line 482) | public static GuestbookEntry findByUuid_C_Last(
    method fetchByUuid_C_Last (line 500) | public static GuestbookEntry fetchByUuid_C_Last(
    method findByUuid_C_PrevAndNext (line 518) | public static GuestbookEntry[] findByUuid_C_PrevAndNext(
    method removeByUuid_C (line 534) | public static void removeByUuid_C(String uuid, long companyId) {
    method countByUuid_C (line 545) | public static int countByUuid_C(String uuid, long companyId) {
    method findByG_G (line 556) | public static List<GuestbookEntry> findByG_G(
    method findByG_G (line 575) | public static List<GuestbookEntry> findByG_G(
    method findByG_G (line 595) | public static List<GuestbookEntry> findByG_G(
    method findByG_G (line 618) | public static List<GuestbookEntry> findByG_G(
    method findByG_G_First (line 637) | public static GuestbookEntry findByG_G_First(
    method fetchByG_G_First (line 655) | public static GuestbookEntry fetchByG_G_First(
    method findByG_G_Last (line 672) | public static GuestbookEntry findByG_G_Last(
    method fetchByG_G_Last (line 690) | public static GuestbookEntry fetchByG_G_Last(
    method findByG_G_PrevAndNext (line 708) | public static GuestbookEntry[] findByG_G_PrevAndNext(
    method removeByG_G (line 724) | public static void removeByG_G(long groupId, long guestbookId) {
    method countByG_G (line 735) | public static int countByG_G(long groupId, long guestbookId) {
    method cacheResult (line 744) | public static void cacheResult(GuestbookEntry guestbookEntry) {
    method cacheResult (line 753) | public static void cacheResult(List<GuestbookEntry> guestbookEntries) {
    method create (line 763) | public static GuestbookEntry create(long entryId) {
    method remove (line 774) | public static GuestbookEntry remove(long entryId)
    method updateImpl (line 781) | public static GuestbookEntry updateImpl(GuestbookEntry guestbookEntry) {
    method findByPrimaryKey (line 792) | public static GuestbookEntry findByPrimaryKey(long entryId)
    method fetchByPrimaryKey (line 805) | public static GuestbookEntry fetchByPrimaryKey(long entryId) {
    method findAll (line 814) | public static List<GuestbookEntry> findAll() {
    method findAll (line 829) | public static List<GuestbookEntry> findAll(int start, int end) {
    method findAll (line 845) | public static List<GuestbookEntry> findAll(
    method findAll (line 865) | public static List<GuestbookEntry> findAll(
    method removeAll (line 876) | public static void removeAll() {
    method countAll (line 885) | public static int countAll() {
    method getPersistence (line 889) | public static GuestbookEntryPersistence getPersistence() {

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/persistence/GuestbookPersistence.java
  type GuestbookPersistence (line 34) | @ProviderType
    method findByUuid (line 49) | public java.util.List<Guestbook> findByUuid(String uuid);
    method findByUuid (line 63) | public java.util.List<Guestbook> findByUuid(
    method findByUuid (line 79) | public java.util.List<Guestbook> findByUuid(
    method findByUuid (line 98) | public java.util.List<Guestbook> findByUuid(
    method findByUuid_First (line 112) | public Guestbook findByUuid_First(
    method fetchByUuid_First (line 125) | public Guestbook fetchByUuid_First(
    method findByUuid_Last (line 138) | public Guestbook findByUuid_Last(
    method fetchByUuid_Last (line 151) | public Guestbook fetchByUuid_Last(
    method findByUuid_PrevAndNext (line 165) | public Guestbook[] findByUuid_PrevAndNext(
    method removeByUuid (line 176) | public void removeByUuid(String uuid);
    method countByUuid (line 184) | public int countByUuid(String uuid);
    method findByUUID_G (line 194) | public Guestbook findByUUID_G(String uuid, long groupId)
    method fetchByUUID_G (line 204) | public Guestbook fetchByUUID_G(String uuid, long groupId);
    method fetchByUUID_G (line 214) | public Guestbook fetchByUUID_G(
    method removeByUUID_G (line 224) | public Guestbook removeByUUID_G(String uuid, long groupId)
    method countByUUID_G (line 234) | public int countByUUID_G(String uuid, long groupId);
    method findByUuid_C (line 243) | public java.util.List<Guestbook> findByUuid_C(String uuid, long compan...
    method findByUuid_C (line 258) | public java.util.List<Guestbook> findByUuid_C(
    method findByUuid_C (line 275) | public java.util.List<Guestbook> findByUuid_C(
    method findByUuid_C (line 295) | public java.util.List<Guestbook> findByUuid_C(
    method findByUuid_C_First (line 310) | public Guestbook findByUuid_C_First(
    method fetchByUuid_C_First (line 324) | public Guestbook fetchByUuid_C_First(
    method findByUuid_C_Last (line 338) | public Guestbook findByUuid_C_Last(
    method fetchByUuid_C_Last (line 352) | public Guestbook fetchByUuid_C_Last(
    method findByUuid_C_PrevAndNext (line 367) | public Guestbook[] findByUuid_C_PrevAndNext(
    method removeByUuid_C (line 379) | public void removeByUuid_C(String uuid, long companyId);
    method countByUuid_C (line 388) | public int countByUuid_C(String uuid, long companyId);
    method findByGroupId (line 396) | public java.util.List<Guestbook> findByGroupId(long groupId);
    method findByGroupId (line 410) | public java.util.List<Guestbook> findByGroupId(
    method findByGroupId (line 426) | public java.util.List<Guestbook> findByGroupId(
    method findByGroupId (line 445) | public java.util.List<Guestbook> findByGroupId(
    method findByGroupId_First (line 459) | public Guestbook findByGroupId_First(
    method fetchByGroupId_First (line 472) | public Guestbook fetchByGroupId_First(
    method findByGroupId_Last (line 485) | public Guestbook findByGroupId_Last(
    method fetchByGroupId_Last (line 498) | public Guestbook fetchByGroupId_Last(
    method findByGroupId_PrevAndNext (line 512) | public Guestbook[] findByGroupId_PrevAndNext(
    method removeByGroupId (line 523) | public void removeByGroupId(long groupId);
    method countByGroupId (line 531) | public int countByGroupId(long groupId);
    method cacheResult (line 538) | public void cacheResult(Guestbook guestbook);
    method cacheResult (line 545) | public void cacheResult(java.util.List<Guestbook> guestbooks);
    method create (line 553) | public Guestbook create(long guestbookId);
    method remove (line 562) | public Guestbook remove(long guestbookId) throws NoSuchGuestbookExcept...
    method updateImpl (line 564) | public Guestbook updateImpl(Guestbook guestbook);
    method findByPrimaryKey (line 573) | public Guestbook findByPrimaryKey(long guestbookId)
    method fetchByPrimaryKey (line 582) | public Guestbook fetchByPrimaryKey(long guestbookId);
    method findAll (line 589) | public java.util.List<Guestbook> findAll();
    method findAll (line 602) | public java.util.List<Guestbook> findAll(int start, int end);
    method findAll (line 616) | public java.util.List<Guestbook> findAll(
    method findAll (line 634) | public java.util.List<Guestbook> findAll(
    method removeAll (line 643) | public void removeAll();
    method countAll (line 650) | public int countAll();

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-api/src/main/java/com/liferay/docs/guestbook/service/persistence/GuestbookUtil.java
  class GuestbookUtil (line 44) | @ProviderType
    method clearCache (line 56) | public static void clearCache() {
    method clearCache (line 63) | public static void clearCache(Guestbook guestbook) {
    method countWithDynamicQuery (line 70) | public static long countWithDynamicQuery(DynamicQuery dynamicQuery) {
    method fetchByPrimaryKeys (line 77) | public static Map<Serializable, Guestbook> fetchByPrimaryKeys(
    method findWithDynamicQuery (line 86) | public static List<Guestbook> findWithDynamicQuery(
    method findWithDynamicQuery (line 95) | public static List<Guestbook> findWithDynamicQuery(
    method findWithDynamicQuery (line 104) | public static List<Guestbook> findWithDynamicQuery(
    method update (line 115) | public static Guestbook update(Guestbook guestbook) {
    method update (line 122) | public static Guestbook update(
    method findByUuid (line 134) | public static List<Guestbook> findByUuid(String uuid) {
    method findByUuid (line 150) | public static List<Guestbook> findByUuid(String uuid, int start, int e...
    method findByUuid (line 167) | public static List<Guestbook> findByUuid(
    method findByUuid (line 188) | public static List<Guestbook> findByUuid(
    method findByUuid_First (line 205) | public static Guestbook findByUuid_First(
    method fetchByUuid_First (line 219) | public static Guestbook fetchByUuid_First(
    method findByUuid_Last (line 233) | public static Guestbook findByUuid_Last(
    method fetchByUuid_Last (line 247) | public static Guestbook fetchByUuid_Last(
    method findByUuid_PrevAndNext (line 262) | public static Guestbook[] findByUuid_PrevAndNext(
    method removeByUuid (line 276) | public static void removeByUuid(String uuid) {
    method countByUuid (line 286) | public static int countByUuid(String uuid) {
    method findByUUID_G (line 298) | public static Guestbook findByUUID_G(String uuid, long groupId)
    method fetchByUUID_G (line 311) | public static Guestbook fetchByUUID_G(String uuid, long groupId) {
    method fetchByUUID_G (line 323) | public static Guestbook fetchByUUID_G(
    method removeByUUID_G (line 336) | public static Guestbook removeByUUID_G(String uuid, long groupId)
    method countByUUID_G (line 349) | public static int countByUUID_G(String uuid, long groupId) {
    method findByUuid_C (line 360) | public static List<Guestbook> findByUuid_C(String uuid, long companyId) {
    method findByUuid_C (line 377) | public static List<Guestbook> findByUuid_C(
    method findByUuid_C (line 397) | public static List<Guestbook> findByUuid_C(
    method findByUuid_C (line 420) | public static List<Guestbook> findByUuid_C(
    method findByUuid_C_First (line 438) | public static Guestbook findByUuid_C_First(
    method fetchByUuid_C_First (line 455) | public static Guestbook fetchByUuid_C_First(
    method findByUuid_C_Last (line 472) | public static Guestbook findByUuid_C_Last(
    method fetchByUuid_C_Last (line 489) | public static Guestbook fetchByUuid_C_Last(
    method findByUuid_C_PrevAndNext (line 507) | public static Guestbook[] findByUuid_C_PrevAndNext(
    method removeByUuid_C (line 522) | public static void removeByUuid_C(String uuid, long companyId) {
    method countByUuid_C (line 533) | public static int countByUuid_C(String uuid, long companyId) {
    method findByGroupId (line 543) | public static List<Guestbook> findByGroupId(long groupId) {
    method findByGroupId (line 559) | public static List<Guestbook> findByGroupId(
    method findByGroupId (line 578) | public static List<Guestbook> findByGroupId(
    method findByGroupId (line 600) | public static List<Guestbook> findByGroupId(
    method findByGroupId_First (line 617) | public static Guestbook findByGroupId_First(
    method fetchByGroupId_First (line 631) | public static Guestbook fetchByGroupId_First(
    method findByGroupId_Last (line 646) | public static Guestbook findByGroupId_Last(
    method fetchByGroupId_Last (line 660) | public static Guestbook fetchByGroupId_Last(
    method findByGroupId_PrevAndNext (line 675) | public static Guestbook[] findByGroupId_PrevAndNext(
    method removeByGroupId (line 689) | public static void removeByGroupId(long groupId) {
    method countByGroupId (line 699) | public static int countByGroupId(long groupId) {
    method cacheResult (line 708) | public static void cacheResult(Guestbook guestbook) {
    method cacheResult (line 717) | public static void cacheResult(List<Guestbook> guestbooks) {
    method create (line 727) | public static Guestbook create(long guestbookId) {
    method remove (line 738) | public static Guestbook remove(long guestbookId)
    method updateImpl (line 744) | public static Guestbook updateImpl(Guestbook guestbook) {
    method findByPrimaryKey (line 755) | public static Guestbook findByPrimaryKey(long guestbookId)
    method fetchByPrimaryKey (line 767) | public static Guestbook fetchByPrimaryKey(long guestbookId) {
    method findAll (line 776) | public static List<Guestbook> findAll() {
    method findAll (line 791) | public static List<Guestbook> findAll(int start, int end) {
    method findAll (line 807) | public static List<Guestbook> findAll(
    method findAll (line 826) | public static List<Guestbook> findAll(
    method removeAll (line 837) | public static void removeAll() {
    method countAll (line 846) | public static int countAll() {
    method getPersistence (line 850) | public static GuestbookPersistence getPersistence() {

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/model/impl/GuestbookBaseImpl.java
  class GuestbookBaseImpl (line 34) | @ProviderType
    method persist (line 43) | @Override

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/model/impl/GuestbookCacheModel.java
  class GuestbookCacheModel (line 37) | @ProviderType
    method equals (line 41) | @Override
    method hashCode (line 60) | @Override
    method toString (line 65) | @Override
    method toEntityModel (line 100) | @Override
    method readExternal (line 167) | @Override
    method writeExternal (line 190) | @Override

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/model/impl/GuestbookEntryBaseImpl.java
  class GuestbookEntryBaseImpl (line 34) | @ProviderType
    method persist (line 43) | @Override

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/model/impl/GuestbookEntryCacheModel.java
  class GuestbookEntryCacheModel (line 37) | @ProviderType
    method equals (line 41) | @Override
    method hashCode (line 61) | @Override
    method toString (line 66) | @Override
    method toEntityModel (line 107) | @Override
    method readExternal (line 189) | @Override
    method writeExternal (line 216) | @Override

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/model/impl/GuestbookEntryImpl.java
  class GuestbookEntryImpl (line 28) | @ProviderType
    method GuestbookEntryImpl (line 36) | public GuestbookEntryImpl() {

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/model/impl/GuestbookEntryModelImpl.java
  class GuestbookEntryModelImpl (line 69) | @JSON(strict = true)
    method setEntityCacheEnabled (line 141) | public static void setEntityCacheEnabled(boolean entityCacheEnabled) {
    method setFinderCacheEnabled (line 145) | public static void setFinderCacheEnabled(boolean finderCacheEnabled) {
    method toModel (line 155) | public static GuestbookEntry toModel(GuestbookEntrySoap soapModel) {
    method toModels (line 188) | public static List<GuestbookEntry> toModels(
    method GuestbookEntryModelImpl (line 205) | public GuestbookEntryModelImpl() {
    method getPrimaryKey (line 208) | @Override
    method setPrimaryKey (line 213) | @Override
    method getPrimaryKeyObj (line 218) | @Override
    method setPrimaryKeyObj (line 223) | @Override
    method getModelClass (line 228) | @Override
    method getModelClassName (line 233) | @Override
    method getModelAttributes (line 238) | @Override
    method setModelAttributes (line 263) | @Override
    method getAttributeGetterFunctions (line 281) | public Map<String, Function<GuestbookEntry, Object>>
    method getAttributeSetterBiConsumers (line 287) | public Map<String, BiConsumer<GuestbookEntry, Object>>
    method _getProxyProviderFunction (line 293) | private static Function<InvocationHandler, GuestbookEntry>
    method getUuid (line 409) | @JSON
    method setUuid (line 420) | @Override
    method getOriginalUuid (line 431) | public String getOriginalUuid() {
    method getEntryId (line 435) | @JSON
    method setEntryId (line 441) | @Override
    method getName (line 446) | @JSON
    method setName (line 457) | @Override
    method getEmail (line 462) | @JSON
    method setEmail (line 473) | @Override
    method getMessage (line 478) | @JSON
    method setMessage (line 489) | @Override
    method getGuestbookId (line 494) | @JSON
    method setGuestbookId (line 500) | @Override
    method getOriginalGuestbookId (line 513) | public long getOriginalGuestbookId() {
    method getGroupId (line 517) | @JSON
    method setGroupId (line 523) | @Override
    method getOriginalGroupId (line 536) | public long getOriginalGroupId() {
    method getCompanyId (line 540) | @JSON
    method setCompanyId (line 546) | @Override
    method getOriginalCompanyId (line 559) | public long getOriginalCompanyId() {
    method getUserId (line 563) | @JSON
    method setUserId (line 569) | @Override
    method getUserUuid (line 574) | @Override
    method setUserUuid (line 586) | @Override
    method getUserName (line 590) | @JSON
    method setUserName (line 601) | @Override
    method getCreateDate (line 606) | @JSON
    method setCreateDate (line 612) | @Override
    method getModifiedDate (line 619) | @JSON
    method hasSetModifiedDate (line 625) | public boolean hasSetModifiedDate() {
    method setModifiedDate (line 629) | @Override
    method getStatus (line 636) | @JSON
    method setStatus (line 642) | @Override
    method getStatusByUserId (line 647) | @JSON
    method setStatusByUserId (line 653) | @Override
    method getStatusByUserUuid (line 658) | @Override
    method setStatusByUserUuid (line 670) | @Override
    method getStatusByUserName (line 674) | @JSON
    method setStatusByUserName (line 685) | @Override
    method getStatusDate (line 690) | @JSON
    method setStatusDate (line 696) | @Override
    method getStagedModelType (line 701) | @Override
    method isApproved (line 707) | @Override
    method isDenied (line 717) | @Override
    method isDraft (line 727) | @Override
    method isExpired (line 737) | @Override
    method isInactive (line 747) | @Override
    method isIncomplete (line 757) | @Override
    method isPending (line 767) | @Override
    method isScheduled (line 777) | @Override
    method getColumnBitmask (line 787) | public long getColumnBitmask() {
    method getExpandoBridge (line 791) | @Override
    method setExpandoBridgeAttributes (line 797) | @Override
    method toEscapedModel (line 804) | @Override
    method clone (line 814) | @Override
    method compareTo (line 840) | @Override
    method equals (line 856) | @Override
    method hashCode (line 878) | @Override
    method isEntityCacheEnabled (line 883) | @Override
    method isFinderCacheEnabled (line 888) | @Override
    method resetOriginalValues (line 893) | @Override
    method toCacheModel (line 919) | @Override
    method toString (line 1016) | @Override
    method toXmlString (line 1048) | @Override

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/model/impl/GuestbookImpl.java
  class GuestbookImpl (line 28) | @ProviderType
    method GuestbookImpl (line 36) | public GuestbookImpl() {

FILE: en/developer/tutorials/code/guestbook/05-admin-portlet/com-liferay-docs-guestbook/modules/guestbook/guestbook-service/src/main/java/com/liferay/docs/guestbook/model/impl/GuestbookModelImpl.java
  class GuestbookModelImpl (line 68) | @JSON(strict = true)
    method setEntityCacheEnabled (line 134) | public static void setEntityCacheEnabled(boolean entityCacheEnabled) {
    method setFinderCacheEnabled (line 138) | public static void setFinderCacheEnabled(boolean finderCacheEnabled) {
    method toModel (line 148) | public static Guestbook toModel(GuestbookSoap soapModel) {
    method toModels (line 178) | public static List<Guestbook> toModels(GuestbookSoap[] soapModels) {
    method GuestbookModelImpl (line 192) | public GuestbookModelImpl() {
    method getPrimaryKey (line 195) | @Override
    method setPrimaryKey (line 200) | @Override
    method getPrimaryKeyObj (line 205) | @Override
    method setPrimaryKeyObj (line 210) | @Override
    method getModelClass (line 215) | @Override
    method getModelClassName (line 220) | @Override
    method getModelAttributes (line 225) | @Override
    method setModelAttributes (line 249) | @Override
    method getAttributeGetterFunctions (line 267) | public Map<String, Function<Guestbook, Object>>
    method getAttributeSetterBiConsumers (line 273) | public Map<String, BiConsumer<Guestbook, Object>>
    method _getProxyProviderFunction (line 279) | private static Function<InvocationHandler, Guestbook>
    method getUuid (line 371) | @JSON
    method setUuid (line 382) | @Override
    method getOriginalUuid (line 393) | public String getOriginalUuid() {
    method getGuestbookId (line 397) | @JSON
    method setGuestbookId (line 403) | @Override
    method getName (line 408) | @JSON
    method setName (line 419) | @Override
    method getGroupId (line 424) | @JSON
    method setGroupId (line 430) | @Override
    method getOriginalGroupId (line 443) | public long getOriginalGroupId() {
    method getCompanyId (line 447) | @JSON
    method setCompanyId (line 453) | @Override
    method getOriginalCompanyId (line 466) | public long getOriginalCompanyId() {
    method getUserId (line 470) | @JSON
  
Copy disabled (too large) Download .json
Condensed preview — 2539 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (22,128K chars).
[
  {
    "path": ".gitattributes",
    "chars": 582,
    "preview": "# Set default behaviour, in case users don't have core.autocrlf set.\n* text=auto\n\n# Explicitly declare text files we wan"
  },
  {
    "path": ".gitignore",
    "chars": 692,
    "preview": "*~\n*.bak\n*.class\n*.iml\n*.swp\n*-tmp.html\n.project\n.classpath\n.settings\ngit-modified-list.txt\nnbbuild.xml\nproperties/\n.MET"
  },
  {
    "path": "README.markdown",
    "chars": 3747,
    "preview": "# LIFERAY-DOCS\n\n<a href=\"https://dev.liferay.com\" >\n<img src=\"guidelines/images/liferayDeveloperNetworkSmallerEdit7.jpg\""
  },
  {
    "path": "bin/convert-markdown.sh",
    "chars": 617,
    "preview": "#!/bin/sh\n\nscriptPath=$(readlink -f \"$0\")\n\nclasspathDir=$(dirname $(dirname \"$scriptPath\"))/lib\nhtmlFile=$1\nhtmlFile=$(e"
  },
  {
    "path": "bin/convert.bat",
    "chars": 1024,
    "preview": "@echo off\n\nset CLASSPATH=%~dp0\\..\\lib\n\nif \"%1\"==\"\" goto usage\nif \"%2\"==\"\" goto convert\n\njava -cp .;%CLASSPATH%\\* com.lif"
  },
  {
    "path": "bin/convert.sh",
    "chars": 1439,
    "preview": "#!/bin/sh\n\nscriptPath=$(readlink -f \"$0\")\n\nclasspathDir=$(dirname $(dirname \"$scriptPath\"))/lib\n\nif [ $# -lt 1 ]; then\n\t"
  },
  {
    "path": "bin/migrate.py",
    "chars": 13826,
    "preview": "import os\nimport re\nimport shutil\nimport sys\n\n\ndef append_to_line(line, new_line):\n    line = line.replace(\"\\r\",\"\")\n    "
  },
  {
    "path": "bin/update-liferay-learn-links.sh",
    "chars": 1141,
    "preview": "#!/bin/bash\n\n# This script was inspired by the answers at\n# https://stackoverflow.com/questions/30724170/how-to-read-pro"
  },
  {
    "path": "bin/update-markdown-sidebar-syntax-win.sh",
    "chars": 773,
    "preview": "#!/bin/sh\n\ndevelopdir=\"../develop\"\ndistributedir=\"../distribute\"\nusedir=\"../use\"\n\nfor file in $(find $developdir -name \""
  },
  {
    "path": "bin/update-markdown-sidebar-syntax.sh",
    "chars": 683,
    "preview": "#!/bin/sh\n\ndevelopdir=\"../develop\"\ndistributedir=\"../distribute\"\nusedir=\"../use\"\n\nfor file in $(find $developdir -name \""
  },
  {
    "path": "book/developer/appdev.aux",
    "chars": 57076,
    "preview": "\\relax \n\\providecommand{\\transparent@use}[1]{}\n\\providecommand\\hyper@newdestlabel[2]{}\n\\@writefile{lof}{\\addvspace {10pt"
  },
  {
    "path": "book/developer/appdev.tex",
    "chars": 387215,
    "preview": "\\chapter{Application Development}\\label{application-development}\n\nWriting applications on Liferay's standards-based plat"
  },
  {
    "path": "book/developer/customization.aux",
    "chars": 74458,
    "preview": "\\relax \n\\providecommand{\\transparent@use}[1]{}\n\\providecommand\\hyper@newdestlabel[2]{}\n\\@writefile{lof}{\\addvspace {10pt"
  },
  {
    "path": "book/developer/customization.tex",
    "chars": 428100,
    "preview": "\\chapter{Liferay Customization}\\label{liferay-customization}\n\nLiferay DXP is highly customizable. Its modular architectu"
  },
  {
    "path": "book/developer/frameworks.aux",
    "chars": 263293,
    "preview": "\\relax \n\\providecommand{\\transparent@use}[1]{}\n\\providecommand\\hyper@newdestlabel[2]{}\n\\@writefile{lof}{\\addvspace {10pt"
  },
  {
    "path": "book/developer/frameworks.tex",
    "chars": 1477884,
    "preview": "\\chapter{Application Security}\\label{application-security}\n\nLiferay's development framework provides an application secu"
  },
  {
    "path": "book/developer/publish.tex",
    "chars": 60906,
    "preview": "\\chapter{Publishing Your App}\\label{publishing-your-app}\n\nAs you develop apps, you may want to sell them to or share the"
  },
  {
    "path": "book/developer/reference.aux",
    "chars": 298710,
    "preview": "\\relax \n\\providecommand{\\transparent@use}[1]{}\n\\providecommand\\hyper@newdestlabel[2]{}\n\\@writefile{lof}{\\addvspace {10pt"
  },
  {
    "path": "book/developer/reference.tex",
    "chars": 1441321,
    "preview": "\\chapter{Developer Reference}\\label{developer-reference}\n\nThis developer reference contains lists of options for various"
  },
  {
    "path": "book/developer/tutorials.aux",
    "chars": 77033,
    "preview": "\\relax \n\\providecommand{\\transparent@use}[1]{}\n\\providecommand\\hyper@newdestlabel[2]{}\n\\@writefile{lof}{\\addvspace {10pt"
  },
  {
    "path": "book/developer/tutorials.tex",
    "chars": 519271,
    "preview": "\\chapter{Developer Tutorials}\\label{developer-tutorials}\n\nLiferay's developer tutorials help you learn from scratch. The"
  },
  {
    "path": "book/developing-liferay-dxp-72.tex",
    "chars": 12110,
    "preview": "\\documentclass[11pt,openright,twoside]{memoir}\n\n% \\usepackage{ucs}\n\\usepackage[english]{babel}\n\\usepackage{fontspec}\n\\us"
  },
  {
    "path": "book/readme.md",
    "chars": 1440,
    "preview": "# Liferay Documentation Books Readme\n\nThe documentation in this branch has been concatenated together in all its section"
  },
  {
    "path": "book/user/deployment.aux",
    "chars": 160747,
    "preview": "\\relax \n\\providecommand{\\transparent@use}[1]{}\n\\providecommand\\zref@newlabel[2]{}\n\\providecommand\\hyper@newdestlabel[2]{"
  },
  {
    "path": "book/user/deployment.tex",
    "chars": 807114,
    "preview": "\\chapter{Deploying Liferay DXP}\\label{deploying-liferay-dxp}\n\n{This document has been updated and ported to Liferay Lear"
  },
  {
    "path": "book/user/user.aux",
    "chars": 390994,
    "preview": "\\relax \n\\providecommand{\\transparent@use}[1]{}\n\\providecommand\\zref@newlabel[2]{}\n\\providecommand\\hyper@newdestlabel[2]{"
  },
  {
    "path": "book/user/user.tex",
    "chars": 1458239,
    "preview": "\\chapter{The Liferay Distinction}\\label{the-liferay-distinction}\n\nYour web presence is a big deal, and the software plat"
  },
  {
    "path": "book/using-liferay-dxp-72.tex",
    "chars": 12815,
    "preview": "\\documentclass[11pt,openright,twoside]{memoir}\n\n% \\usepackage{ucs}\n\\usepackage[english]{babel}\n\\usepackage{fontspec}\n\\us"
  },
  {
    "path": "build-common.xml",
    "chars": 28093,
    "preview": "<?xml version=\"1.0\"?>\n\n<project name=\"Dev Site Documentation Management\" basedir=\".\">\n\t<property name=\"project.dir\" valu"
  },
  {
    "path": "build.properties",
    "chars": 674,
    "preview": "##\n## DO NOT EDIT THIS FILE.\n##\n## To update the properties of this file, create a separate properties file\n## named \"bu"
  },
  {
    "path": "build.xml",
    "chars": 1233,
    "preview": "<?xml version=\"1.0\"?>\n\n<project name=\"Liferay Documentation\" default=\"usage\" basedir=\".\">\n\t<property name=\"project.dir\" "
  },
  {
    "path": "code/liferay-book-utils/.pydevproject",
    "chars": 423,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<?eclipse-pydev version=\"1.0\"?><pydev_project>\n<pydev_pathpropert"
  },
  {
    "path": "code/liferay-book-utils/src/fix-latex.py",
    "chars": 1124,
    "preview": "#!/usr/bin/python\n# encoding: utf-8\n'''\n -- \n\n is a description\n\nIt defines classes_and_methods\n\n@author:     Rich Sezov"
  },
  {
    "path": "code/liferay-book-utils/src/format-ebook.py",
    "chars": 693,
    "preview": "'''\nCreated on Jan 23, 2015\n\n@author: rsezov\n'''\nimport argparse\n\nparser = argparse.ArgumentParser()\nparser.add_argument"
  },
  {
    "path": "code/liferay-book-utils/src/merge-books.py",
    "chars": 2441,
    "preview": "import argparse\n\nparser = argparse.ArgumentParser()\nparser.add_argument(\"output\", help=\"The file name to be written\")\npa"
  },
  {
    "path": "code/liferay-doc-utils/.gitignore",
    "chars": 13,
    "preview": "/dist/\n/bin/\n"
  },
  {
    "path": "code/liferay-doc-utils/build.xml",
    "chars": 2148,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<project default=\"deploy\">\n\t<property name=\"project.dir\" value=\"."
  },
  {
    "path": "code/liferay-doc-utils/src/com/liferay/documentation/movedclassreporter/BasicClassInfo.java",
    "chars": 629,
    "preview": "package com.liferay.documentation.movedclassreporter;\n\nimport java.io.File;\n\npublic class BasicClassInfo {\n\n\tpublic Basi"
  },
  {
    "path": "code/liferay-doc-utils/src/com/liferay/documentation/movedclassreporter/MovedClassInfo.java",
    "chars": 1237,
    "preview": "package com.liferay.documentation.movedclassreporter;\n\npublic class MovedClassInfo {\n\tpublic MovedClassInfo(BasicClassIn"
  },
  {
    "path": "code/liferay-doc-utils/src/com/liferay/documentation/movedclassreporter/MovedClassReporterMain.java",
    "chars": 15502,
    "preview": "package com.liferay.documentation.movedclassreporter;\n\nimport java.io.File;\nimport java.io.FileReader;\nimport java.io.Fi"
  },
  {
    "path": "code/liferay-doc-utils/src/com/liferay/documentation/movedclassreporter/TemplateProcessor.java",
    "chars": 1437,
    "preview": "package com.liferay.documentation.movedclassreporter;\n\nimport java.io.File;\nimport java.io.FileWriter;\nimport java.io.IO"
  },
  {
    "path": "code/liferay-doc-utils/src/com/liferay/documentation/movedclassreporter/dependencies/moved-classes.ftl",
    "chars": 1288,
    "preview": "\nTo leverage the benefits of modularization, many classes from <em>${oldJar}</em>\nhave been moved into application and f"
  },
  {
    "path": "code/liferay-doc-utils/src/com/liferay/documentation/util/AddTOCTask.java",
    "chars": 3422,
    "preview": "package com.liferay.documentation.util;\n\nimport java.io.BufferedWriter;\nimport java.io.File;\nimport java.io.FileReader;\n"
  },
  {
    "path": "code/liferay-doc-utils/src/com/liferay/documentation/util/CheckArticleImagesTask.java",
    "chars": 2656,
    "preview": "package com.liferay.documentation.util;\n\nimport java.io.File;\nimport java.io.FileNotFoundException;\nimport java.io.FileR"
  },
  {
    "path": "code/liferay-doc-utils/src/com/liferay/documentation/util/CheckHeadersTask.java",
    "chars": 4737,
    "preview": "package com.liferay.documentation.util;\n\nimport java.io.File;\nimport java.io.FileReader;\nimport java.io.FilenameFilter;\n"
  },
  {
    "path": "code/liferay-doc-utils/src/com/liferay/documentation/util/CheckImageUtil.java",
    "chars": 1738,
    "preview": "package com.liferay.documentation.util;\n\nimport java.io.File;\nimport java.io.FileNotFoundException;\nimport java.io.FileR"
  },
  {
    "path": "code/liferay-doc-utils/src/com/liferay/documentation/util/CheckImagesTask.java",
    "chars": 11470,
    "preview": "package com.liferay.documentation.util;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.nio.charset.Standa"
  },
  {
    "path": "code/liferay-doc-utils/src/com/liferay/documentation/util/CheckIntrosTask.java",
    "chars": 1791,
    "preview": "package com.liferay.documentation.util;\n\nimport java.io.File;\nimport java.io.FileFilter;\nimport java.util.ArrayList;\nimp"
  },
  {
    "path": "code/liferay-doc-utils/src/com/liferay/documentation/util/CheckLatestCommitTask.java",
    "chars": 21792,
    "preview": "package com.liferay.documentation.util;\n\nimport java.io.BufferedInputStream;\nimport java.io.BufferedOutputStream;\nimport"
  },
  {
    "path": "code/liferay-doc-utils/src/com/liferay/documentation/util/CheckLinksTask.java",
    "chars": 41932,
    "preview": "package com.liferay.documentation.util;\n\nimport java.io.File;\nimport java.io.FileReader;\nimport java.io.IOException;\nimp"
  },
  {
    "path": "code/liferay-doc-utils/src/com/liferay/documentation/util/CleanImages.java",
    "chars": 3012,
    "preview": "package com.liferay.documentation.util;\n\nimport java.io.File;\nimport java.io.FileReader;\nimport java.io.LineNumberReader"
  },
  {
    "path": "code/liferay-doc-utils/src/com/liferay/documentation/util/ConcatMarkdownTask.java",
    "chars": 4593,
    "preview": "package com.liferay.documentation.util;\n\nimport java.io.File;\nimport java.io.FileNotFoundException;\nimport java.io.FileR"
  },
  {
    "path": "code/liferay-doc-utils/src/com/liferay/documentation/util/ConvertHeadersTask.java",
    "chars": 2619,
    "preview": "package com.liferay.documentation.util;\n\nimport java.io.BufferedWriter;\nimport java.io.File;\nimport java.io.FileReader;\n"
  },
  {
    "path": "code/liferay-doc-utils/src/com/liferay/documentation/util/ConvertLinksTask.java",
    "chars": 10103,
    "preview": "package com.liferay.documentation.util;\n\nimport java.io.BufferedWriter;\nimport java.io.File;\nimport java.io.FileReader;\n"
  },
  {
    "path": "code/liferay-doc-utils/src/com/liferay/documentation/util/ConvertSidebarsTask.java",
    "chars": 4429,
    "preview": "package com.liferay.documentation.util;\n\nimport java.io.BufferedWriter;\nimport java.io.File;\nimport java.io.FileReader;\n"
  },
  {
    "path": "code/liferay-doc-utils/src/com/liferay/documentation/util/DistDiffTask.java",
    "chars": 9160,
    "preview": "package com.liferay.documentation.util;\n\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileNotFoun"
  },
  {
    "path": "code/liferay-doc-utils/src/com/liferay/documentation/util/DocsUtil.java",
    "chars": 1933,
    "preview": "package com.liferay.documentation.util;\n\nimport java.io.File;\nimport java.io.FilenameFilter;\nimport java.util.ArrayList;"
  },
  {
    "path": "code/liferay-doc-utils/src/com/liferay/documentation/util/FindParentIntros.java",
    "chars": 1568,
    "preview": "package com.liferay.documentation.util;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.util.ArrayList;\nim"
  },
  {
    "path": "code/liferay-doc-utils/src/com/liferay/documentation/util/GitCompare.java",
    "chars": 3423,
    "preview": "package com.liferay.documentation.util;\n\nimport java.io.IOException;\nimport java.io.PrintWriter;\nimport java.util.Calend"
  },
  {
    "path": "code/liferay-doc-utils/src/com/liferay/documentation/util/MarkdownToHtml.java",
    "chars": 1794,
    "preview": "/**\n * Copyright (c) 2000-present Liferay, Inc. All rights reserved.\n *\n * This library is free software; you can redist"
  },
  {
    "path": "code/liferay-doc-utils/src/com/liferay/documentation/util/NumberHeadersTask.java",
    "chars": 15374,
    "preview": "package com.liferay.documentation.util;\n\nimport java.io.BufferedWriter;\nimport java.io.File;\nimport java.io.FileReader;\n"
  },
  {
    "path": "code/liferay-doc-utils/src/com/liferay/documentation/util/NumberImagesTask.java",
    "chars": 4432,
    "preview": "package com.liferay.documentation.util;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.util.ArrayList;\nim"
  },
  {
    "path": "code/sample-content-portlet-lr-workspace/.gitignore",
    "chars": 18,
    "preview": "/bundles\n/.gradle\n"
  },
  {
    "path": "code/sample-content-portlet-lr-workspace/build.gradle",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "code/sample-content-portlet-lr-workspace/configs/common/.touch",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "code/sample-content-portlet-lr-workspace/configs/dev/portal-ext.properties",
    "chars": 279,
    "preview": "include-and-override=portal-developer.properties\n\n#\n# MySQL\n#\n#jdbc.default.driverClassName=com.mysql.jdbc.Driver\n#jdbc."
  },
  {
    "path": "code/sample-content-portlet-lr-workspace/configs/local/portal-ext.properties",
    "chars": 279,
    "preview": "include-and-override=portal-developer.properties\n\n#\n# MySQL\n#\n#jdbc.default.driverClassName=com.mysql.jdbc.Driver\n#jdbc."
  },
  {
    "path": "code/sample-content-portlet-lr-workspace/configs/prod/osgi/configs/com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.cfg",
    "chars": 54,
    "preview": "operationMode=REMOTE\ntransportAddresses=127.0.0.1:9300"
  },
  {
    "path": "code/sample-content-portlet-lr-workspace/configs/prod/portal-ext.properties",
    "chars": 229,
    "preview": "#\n# MySQL\n#\n#jdbc.default.driverClassName=com.mysql.jdbc.Driver\n#jdbc.default.url=jdbc:mysql://localhost/lportal?useUnic"
  },
  {
    "path": "code/sample-content-portlet-lr-workspace/configs/uat/osgi/configs/com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.cfg",
    "chars": 78,
    "preview": "operationMode=REMOTE\ntransportAddresses=127.0.0.1:9300\nlogExceptionsOnly=false"
  },
  {
    "path": "code/sample-content-portlet-lr-workspace/configs/uat/portal-ext.properties",
    "chars": 229,
    "preview": "#\n# MySQL\n#\n#jdbc.default.driverClassName=com.mysql.jdbc.Driver\n#jdbc.default.url=jdbc:mysql://localhost/lportal?useUnic"
  },
  {
    "path": "code/sample-content-portlet-lr-workspace/gradle/wrapper/gradle-wrapper.properties",
    "chars": 231,
    "preview": "#Thu Jan 14 10:53:42 CST 2016\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_"
  },
  {
    "path": "code/sample-content-portlet-lr-workspace/gradle.properties",
    "chars": 660,
    "preview": "#liferay.workspace.bundle.artifact.group=com.liferay\n#liferay.workspace.bundle.artifact.name=portal-tomcat-bundle\nlifera"
  },
  {
    "path": "code/sample-content-portlet-lr-workspace/gradlew",
    "chars": 4971,
    "preview": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start "
  },
  {
    "path": "code/sample-content-portlet-lr-workspace/gradlew.bat",
    "chars": 2314,
    "preview": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem "
  },
  {
    "path": "code/sample-content-portlet-lr-workspace/modules/.touch",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "code/sample-content-portlet-lr-workspace/modules/com.liferay.docs.samplecontent/README.markdown",
    "chars": 2088,
    "preview": "# Sample Content Portlet\n\nThe Sample Content portlet allows you to create sample content for Liferay. This\nsample conten"
  },
  {
    "path": "code/sample-content-portlet-lr-workspace/modules/com.liferay.docs.samplecontent/bnd.bnd",
    "chars": 271,
    "preview": "Bundle-Name: Sample Content Portlet\nBundle-SymbolicName: com.liferay.docs.samplecontent\nBundle-Version: 1.0.0.${tstamp}\n"
  },
  {
    "path": "code/sample-content-portlet-lr-workspace/modules/com.liferay.docs.samplecontent/build.gradle",
    "chars": 266,
    "preview": "dependencies {\n\tcompile 'com.liferay.portal:com.liferay.portal.kernel:2.0.0'\n\tcompile 'javax.portlet:portlet-api:2.0'\n\tc"
  },
  {
    "path": "code/sample-content-portlet-lr-workspace/modules/com.liferay.docs.samplecontent/src/main/java/com/liferay/docs/samplecontent/portlet/SampleContentPortlet.java",
    "chars": 10968,
    "preview": "package com.liferay.docs.samplecontent.portlet;\n\nimport java.io.BufferedReader;\nimport java.io.File;\nimport java.io.File"
  },
  {
    "path": "code/sample-content-portlet-lr-workspace/modules/com.liferay.docs.samplecontent/src/main/resources/META-INF/resources/init.jsp",
    "chars": 533,
    "preview": "<%@ taglib uri=\"http://java.sun.com/jsp/jstl/core\" prefix=\"c\" %>\n<%@ taglib uri=\"http://java.sun.com/portlet_2_0\" prefix"
  },
  {
    "path": "code/sample-content-portlet-lr-workspace/modules/com.liferay.docs.samplecontent/src/main/resources/META-INF/resources/view.jsp",
    "chars": 1677,
    "preview": "<%@ include file=\"init.jsp\" %>\n\n<portlet:actionURL name=\"addUsers\" var=\"addUsersURL\"></portlet:actionURL>\n<portlet:actio"
  },
  {
    "path": "code/sample-content-portlet-lr-workspace/modules/com.liferay.docs.samplecontent/src/main/resources/content/Language.properties",
    "chars": 558,
    "preview": "javax.portlet.title.com_liferay_docs_samplecontent_SampleContentPortlet=com.liferay.docs.samplecontent JSP Portlet\njavax"
  },
  {
    "path": "code/sample-content-portlet-lr-workspace/modules/com.liferay.docs.samplecontent/src/main/resources/organizations.json",
    "chars": 658,
    "preview": "{\"Organizations\": [\n\t{\n\t\"Name\": \"Lunar Resort\",\n\t\"Organizations\": [\n\t\t{\n\t\t\"Name\": \"Physical Plant Department\",\n\t\t\"Organi"
  },
  {
    "path": "code/sample-content-portlet-lr-workspace/modules/com.liferay.docs.samplecontent/src/main/resources/user-groups.json",
    "chars": 307,
    "preview": "{\"User Groups\": [\n\t{\n\t\"Name\": \"List Creators\",\n\t\"Description\": \"The List Creators user group can manage dynamic data lis"
  },
  {
    "path": "code/sample-content-portlet-lr-workspace/modules/com.liferay.docs.samplecontent/src/main/resources/users.json",
    "chars": 635,
    "preview": "{\"Users\": [\n\t{\n\t\"Screen Name\": \"jjeffries\",\n\t\"First Name\": \"James\",\n\t\"Last Name\": \"Jeffries\",\n\t\"Male\": true,\n\t\"Job Title"
  },
  {
    "path": "code/sample-content-portlet-lr-workspace/settings.gradle",
    "chars": 276,
    "preview": "buildscript {\n\tdependencies {\n\t\tclasspath group: \"com.liferay\", name: \"com.liferay.gradle.plugins.workspace\", version: \""
  },
  {
    "path": "code/sample-content-portlet-lr-workspace/themes/.touch",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "copyright.txt",
    "chars": 1789,
    "preview": "<!-- \nCopyright (c) 2017 Liferay, Inc. All rights reserved. \n\nCreative Commons Attribution-ShareAlike 3.0 Unported (CC B"
  },
  {
    "path": "en/build.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\"?>\n\n<project name=\"Language Folder - English\" basedir=\".\">\n\t<property name=\"language.dir\" value=\"en\" "
  },
  {
    "path": "en/deployment/articles/01-deploying-liferay/01-deploying-liferay-intro.markdown",
    "chars": 1886,
    "preview": "---\nheader-id: deploying-product\n---\n\n# Deploying @product@\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-info\">\n  <span "
  },
  {
    "path": "en/deployment/articles/01-deploying-liferay/02-obtaining-liferay.markdown",
    "chars": 4227,
    "preview": "---\nheader-id: obtaining-product\n---\n\n# Obtaining @product@\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-info\">\n  <span "
  },
  {
    "path": "en/deployment/articles/01-deploying-liferay/03-preparing-for-install.markdown",
    "chars": 12826,
    "preview": "---\nheader-id: preparing-for-install\n---\n\n# Preparing for Install\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-info\">\n  "
  },
  {
    "path": "en/deployment/articles/01-deploying-liferay/04-installing-liferay.markdown",
    "chars": 7577,
    "preview": "---\nheader-id: installing-product\n---\n\n# Installing @product@\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-info\">\n  <spa"
  },
  {
    "path": "en/deployment/articles/01-deploying-liferay/05-installing-liferay-on-tomcat.markdown",
    "chars": 16240,
    "preview": "---\nheader-id: installing-product-on-tomcat\n---\n\n# Installing @product@ on Tomcat\n\n[TOC levels=1-4]\n\n<aside class=\"alert"
  },
  {
    "path": "en/deployment/articles/01-deploying-liferay/06-installing-liferay-portal-on-wildfly.markdown",
    "chars": 19036,
    "preview": "---\nheader-id: installing-product-on-wildfly\n---\n\n# Installing @product@ on Wildfly\n\n[TOC levels=1-4]\n\n<aside class=\"ale"
  },
  {
    "path": "en/deployment/articles/01-deploying-liferay/12-setting-up-marketplace-and-portal-security.markdown",
    "chars": 2629,
    "preview": "---\nheader-id: setting-up-marketplace-and-portal-security\n---\n\n# Setting Up Marketplace\n\n[TOC levels=1-4]\n\n<aside class="
  },
  {
    "path": "en/deployment/articles/01-deploying-liferay/14-document-repository-configuration/00-document-repository-configuration-intro.markdown",
    "chars": 2583,
    "preview": "---\nheader-id: document-repository-configuration\n---\n\n# Document Repository Configuration\n\n[TOC levels=1-4]\n\n<aside clas"
  },
  {
    "path": "en/deployment/articles/01-deploying-liferay/14-document-repository-configuration/01-using-simple-file-system-store.markdown",
    "chars": 2758,
    "preview": "---\nheader-id: using-the-simple-file-system-store\n---\n\n# Using the Simple File System Store\n\n[TOC levels=1-4]\n\n<aside cl"
  },
  {
    "path": "en/deployment/articles/01-deploying-liferay/14-document-repository-configuration/02-using-advanced-file-system-store.markdown",
    "chars": 2963,
    "preview": "---\nheader-id: using-the-advanced-file-system-store\n---\n\n# Using the Advanced File System Store\n\n[TOC levels=1-4]\n\n<asid"
  },
  {
    "path": "en/deployment/articles/01-deploying-liferay/14-document-repository-configuration/03-using-s3-store.markdown",
    "chars": 2627,
    "preview": "---\nheader-id: using-amazon-simple-storage-service\n---\n\n# Using Amazon Simple Storage Service\n\n[TOC levels=1-4]\n\n<aside "
  },
  {
    "path": "en/deployment/articles/01-deploying-liferay/14-document-repository-configuration/04-using-the-dbstore.markdown",
    "chars": 1052,
    "preview": "---\nheader-id: using-the-dbstore\n---\n\n# Using the DBStore\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-info\">\n  <span cl"
  },
  {
    "path": "en/deployment/articles/02-configuring-liferay/01-configuring-liferay-portal-intro.markdown",
    "chars": 674,
    "preview": "---\nheader-id: configuring-product\n---\n\n# Configuring @product@\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-info\">\n  <s"
  },
  {
    "path": "en/deployment/articles/02-configuring-liferay/02-configuring-mail.markdown",
    "chars": 6098,
    "preview": "---\nheader-id: configuring-mail\n---\n\n# Configuring Mail\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-info\">\n  <span clas"
  },
  {
    "path": "en/deployment/articles/02-configuring-liferay/03-locales-and-encoding.markdown",
    "chars": 5292,
    "preview": "---\nheader-id: locales-and-encoding-configuration\n---\n\n# Locales and Encoding Configuration\n\n[TOC levels=1-4]\n\n<aside cl"
  },
  {
    "path": "en/deployment/articles/02-configuring-liferay/04-liferay-portal-clustering/01-intro.markdown",
    "chars": 3054,
    "preview": "---\nheader-id: liferay-clustering\n---\n\n# @product@ Clustering\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-info\">\n  <spa"
  },
  {
    "path": "en/deployment/articles/02-configuring-liferay/04-liferay-portal-clustering/02-point-all-nodes-to-the-same-liferay-portal-database.markdown",
    "chars": 6836,
    "preview": "---\nheader-id: point-all-nodes-to-the-same-database\n---\n\n# Point all Nodes to the Same @product@ Database\n\n[TOC levels=1"
  },
  {
    "path": "en/deployment/articles/02-configuring-liferay/04-liferay-portal-clustering/03-configure-documents-and-media-the-same-for-all-nodes.markdown",
    "chars": 1117,
    "preview": "---\nheader-id: configure-documents-and-media-the-same-for-all-nodes\n---\n\n# Configure Documents and Media the Same for al"
  },
  {
    "path": "en/deployment/articles/02-configuring-liferay/04-liferay-portal-clustering/04-clustering-search.markdown",
    "chars": 1933,
    "preview": "---\nheader-id: clustering-search\n---\n\n# Clustering Search\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-info\">\n  <span cl"
  },
  {
    "path": "en/deployment/articles/02-configuring-liferay/04-liferay-portal-clustering/05-enabling-cluster-link.markdown",
    "chars": 16894,
    "preview": "---\nheader-id: enabling-cluster-link\n---\n\n# Enabling Cluster Link\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-info\">\n  "
  },
  {
    "path": "en/deployment/articles/02-configuring-liferay/04-liferay-portal-clustering/06-auto-deploy-to-all-nodes.markdown",
    "chars": 1183,
    "preview": "---\nheader-id: auto-deploy-to-all-nodes\n---\n\n# Auto Deploy to All Nodes\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-inf"
  },
  {
    "path": "en/deployment/articles/02-configuring-liferay/05-updating-a-cluster/01-intro.markdown",
    "chars": 4435,
    "preview": "---\nheader-id: updating-a-cluster\n---\n\n# Updating a Cluster\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-info\">\n  <span "
  },
  {
    "path": "en/deployment/articles/02-configuring-liferay/05-updating-a-cluster/02-using-rolling-restarts.markdown",
    "chars": 3610,
    "preview": "---\nheader-id: using-rolling-restarts\n---\n\n# Rolling Restarts\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-info\">\n  <spa"
  },
  {
    "path": "en/deployment/articles/02-configuring-liferay/05-updating-a-cluster/03-other-cluster-update-techniques.markdown",
    "chars": 1913,
    "preview": "---\nheader-id: other-cluster-update-techniques\n---\n\n# Blue-Green Deployment\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert"
  },
  {
    "path": "en/deployment/articles/02-configuring-liferay/06-configuring-remote-staging-clustered.markdown",
    "chars": 5609,
    "preview": "---\nheader-id: configuring-remote-staging-in-a-clustered-environment\n---\n\n# Configuring Remote Staging in a Clustered En"
  },
  {
    "path": "en/deployment/articles/02-configuring-liferay/07-content-delivery-network.markdown",
    "chars": 5280,
    "preview": "---\nheader-id: content-delivery-network\n---\n\n# Content Delivery Network\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-inf"
  },
  {
    "path": "en/deployment/articles/03-installing-a-search-engine/01-intro.markdown",
    "chars": 4916,
    "preview": "---\nheader-id: installing-a-search-engine\n---\n\n# Installing a Search Engine\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert"
  },
  {
    "path": "en/deployment/articles/03-installing-a-search-engine/02-elasticsearch/01-elasticsearch-intro.markdown",
    "chars": 5763,
    "preview": "---\nheader-id: elasticsearch\n---\n\n# Elasticsearch\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-info\">\n  <span class=\"wys"
  },
  {
    "path": "en/deployment/articles/03-installing-a-search-engine/02-elasticsearch/02-preparing-to-install.markdown",
    "chars": 3655,
    "preview": "---\nheader-id: preparing-to-install-elasticsearch\n---\n\n# Preparing to Install Elasticsearch\n\n[TOC levels=1-4]\n\n<aside cl"
  },
  {
    "path": "en/deployment/articles/03-installing-a-search-engine/02-elasticsearch/03-installing-elasticsearch.markdown",
    "chars": 15629,
    "preview": "---\nheader-id: installing-elasticsearch\n---\n\n# Installing Elasticsearch\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-inf"
  },
  {
    "path": "en/deployment/articles/03-installing-a-search-engine/02-elasticsearch/04-configuring-the-connector.markdown",
    "chars": 11628,
    "preview": "---\nheader-id: configuring-the-liferay-elasticsearch-connector\n---\n\n# Configuring the Liferay Elasticsearch Connector\n\n["
  },
  {
    "path": "en/deployment/articles/03-installing-a-search-engine/02-elasticsearch/05-advanced-configuration.markdown",
    "chars": 8287,
    "preview": "---\nheader-id: advanced-configuration-of-the-liferay-elasticsearch-connector\n---\n\n# Advanced Configuration of the Lifera"
  },
  {
    "path": "en/deployment/articles/03-installing-a-search-engine/02-elasticsearch/06-elasticsearch-connector-settings-reference.markdown",
    "chars": 9019,
    "preview": "---\nheader-id: elasticsearch-connector-settings-reference\n---\n\n# Elasticsearch Connector Settings: Reference\n\n[TOC level"
  },
  {
    "path": "en/deployment/articles/03-installing-a-search-engine/02-elasticsearch/07-security.markdown",
    "chars": 12700,
    "preview": "---\nheader-id: installing-liferay-enterprise-search-security\n---\n\n# Installing Liferay Enterprise Search Security\n\n[TOC "
  },
  {
    "path": "en/deployment/articles/03-installing-a-search-engine/02-elasticsearch/08-backing-up-es.markdown",
    "chars": 7010,
    "preview": "---\nheader-id: backing-up-elasticsearch\n---\n\n# Backing Up Elasticsearch\n\n[TOC levels=1-4]\n\n[Elasticsearch replicas](http"
  },
  {
    "path": "en/deployment/articles/03-installing-a-search-engine/02-elasticsearch/09-upgrading-to-elasticsearch_65.markdown",
    "chars": 2619,
    "preview": "---\nheader-id: upgrading-to-elasticsearch-6-5\n---\n\n# Upgrading to Elasticsearch 6.5\n\n[TOC levels=1-4]\n\nElasticsearch 6.5"
  },
  {
    "path": "en/deployment/articles/03-installing-a-search-engine/02-elasticsearch/10-upgrading-to-elasticsearch_68.markdown",
    "chars": 2535,
    "preview": "---\nheader-id: upgrading-to-elasticsearch-6-8\n---\n\n# Upgrading to Elasticsearch 6.8\n\n[TOC levels=1-4]\n\nElasticsearch 6.8"
  },
  {
    "path": "en/deployment/articles/03-installing-a-search-engine/02-elasticsearch/11-upgrading-to-elasticsearch-73.markdown",
    "chars": 4155,
    "preview": "---\nheader-id: upgrading-to-elasticsearch-7\n---\n\n# Upgrading to Elasticsearch 7\n\n[TOC levels=1-4]\n\nElasticsearch 7 is su"
  },
  {
    "path": "en/deployment/articles/03-installing-a-search-engine/03-solr/01-installing-solr-intro.markdown",
    "chars": 3752,
    "preview": "---\nheader-id: installing-solr\n---\n\n# Installing Solr\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-info\">\n  <span class="
  },
  {
    "path": "en/deployment/articles/03-installing-a-search-engine/03-solr/02-installing-solr-basic.markdown",
    "chars": 7886,
    "preview": "---\nheader-id: installing-solr-basic-installation\n---\n\n# Installing Solr: Basic Installation\n\n[TOC levels=1-4]\n\n<aside c"
  },
  {
    "path": "en/deployment/articles/03-installing-a-search-engine/03-solr/03-installing-solr-solrcloud.markdown",
    "chars": 5710,
    "preview": "---\nheader-id: high-availability-with-solrcloud\n---\n\n# Installing Solr: High Availability with SolrCloud\n\n[TOC levels=1-"
  },
  {
    "path": "en/deployment/articles/03-installing-a-search-engine/03-solr/04-solr-settings.markdown",
    "chars": 2256,
    "preview": "---\nheader-id: solr-connector-settings\n---\n\n# Solr Connector Settings\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-info\""
  },
  {
    "path": "en/deployment/articles/04-securing-liferay/01-liferay-security-intro.markdown",
    "chars": 5848,
    "preview": "---\nheader-id: securing-product\n---\n\n# Securing @product@\n<aside class=\"alert alert-info\">\n   <span class=\"wysiwyg-color"
  },
  {
    "path": "en/deployment/articles/04-securing-liferay/02-logging-in-to-liferay.markdown",
    "chars": 4818,
    "preview": "---\nheader-id: logging-into-liferay\n---\n\n# Logging into @product@\n\n<aside class=\"alert alert-info\">\n   <span class=\"wysi"
  },
  {
    "path": "en/deployment/articles/04-securing-liferay/03-service-access-policies.markdown",
    "chars": 11130,
    "preview": "---\nheader-id: service-access-policies\n---\n\n# Service Access Policies\n\n<aside class=\"alert alert-info\">\n   <span class=\""
  },
  {
    "path": "en/deployment/articles/04-securing-liferay/04-auth-verifiers.markdown",
    "chars": 7880,
    "preview": "---\nheader-id: authentication-verifiers\n---\n\n# Authentication Verifiers\n\n<aside class=\"alert alert-info\">\n   <span class"
  },
  {
    "path": "en/deployment/articles/04-securing-liferay/05-ldap/01-ldap-servers-intro.markdown",
    "chars": 10388,
    "preview": "---\nheader-id: ldap\n---\n\n# LDAP\n\n<aside class=\"alert alert-info\">\n   <span class=\"wysiwyg-color-blue120\">This document h"
  },
  {
    "path": "en/deployment/articles/04-securing-liferay/05-ldap/02-configuring-ldap.markdown",
    "chars": 7437,
    "preview": "---\nheader-id: configuring-ldap\n---\n\n# Configuring LDAP\n\n<aside class=\"alert alert-info\">\n   <span class=\"wysiwyg-color-"
  },
  {
    "path": "en/deployment/articles/04-securing-liferay/06-token-based-authentication.markdown",
    "chars": 3891,
    "preview": "---\nheader-id: token-based-single-sign-on-authentication\n---\n\n# Token-based Single Sign On Authentication\n\n<aside class="
  },
  {
    "path": "en/deployment/articles/04-securing-liferay/07-openid-connect-authentication.markdown",
    "chars": 5881,
    "preview": "---\nheader-id: authenticating-with-openid-connect\n---\n\n# Authenticating with OpenID Connect\n\n<aside class=\"alert alert-i"
  },
  {
    "path": "en/deployment/articles/04-securing-liferay/08-openam-authentication.markdown",
    "chars": 5335,
    "preview": "---\nheader-id: opensso-single-sign-on-authentication\n---\n\n# OpenAM Single Sign On Authentication\n\n\n<aside class=\"alert a"
  },
  {
    "path": "en/deployment/articles/04-securing-liferay/09-cas-authentication.markdown",
    "chars": 5945,
    "preview": "---\nheader-id: cas-central-authentication-service-single-sign-on-authentication\n---\n\n# CAS (Central Authentication Servi"
  },
  {
    "path": "en/deployment/articles/04-securing-liferay/11-ntlm-authentication.markdown",
    "chars": 3923,
    "preview": "---\nheader-id: ntlm-single-sign-on-authentication\n---\n\n#  NTLM Single Sign On Authentication\n\n[TOC levels=1-4]\n\nNTLM (NT"
  },
  {
    "path": "en/deployment/articles/04-securing-liferay/12-openid-authentication.markdown",
    "chars": 2707,
    "preview": "---\nheader-id: openid-single-sign-on-authentication\n---\n\n# OpenID Single Sign On Authentication\n\n[TOC levels=1-4]\n\nOpenI"
  },
  {
    "path": "en/deployment/articles/04-securing-liferay/13-kerberos.markdown",
    "chars": 9954,
    "preview": "---\nheader-id: authenticating-with-kerberos\n---\n\n# Authenticating with Kerberos\n\n<aside class=\"alert alert-info\">\n   <sp"
  },
  {
    "path": "en/deployment/articles/04-securing-liferay/14-cors.markdown",
    "chars": 4037,
    "preview": "---\nheader-id: configuring-cors\n---\n\n# Configuring CORS\n\n<aside class=\"alert alert-info\">\n   <span class=\"wysiwyg-color-"
  },
  {
    "path": "en/deployment/articles/04-securing-liferay/15-antisamy.markdown",
    "chars": 3167,
    "preview": "---\nheader-id: antisamy\n---\n\n# AntiSamy\n\n<aside class=\"alert alert-info\">\n   <span class=\"wysiwyg-color-blue120\">This do"
  },
  {
    "path": "en/deployment/articles/04-securing-liferay/15-oauth2/01-oauth2-intro.markdown",
    "chars": 7484,
    "preview": "---\nheader-id: oauth-2-0\n---\n\n# OAuth 2.0\n\n<aside class=\"alert alert-info\">\n   <span class=\"wysiwyg-color-blue120\">This "
  },
  {
    "path": "en/deployment/articles/04-securing-liferay/15-oauth2/02-scopes.markdown",
    "chars": 3862,
    "preview": "---\nheader-id: oauth2-scopes\n---\n\n# OAuth2 Scopes\n\n<aside class=\"alert alert-info\">\n   <span class=\"wysiwyg-color-blue12"
  },
  {
    "path": "en/deployment/articles/04-securing-liferay/15-oauth2/03-authorizing-access.markdown",
    "chars": 8241,
    "preview": "---\nheader-id: authorizing-account-access-with-oauth2\n---\n\n# Authorizing Account Access with OAuth2\n\n<aside class=\"alert"
  },
  {
    "path": "en/deployment/articles/05-upgrading-to-liferay-7-2/01-upgrading-to-liferay-7-2-intro.markdown",
    "chars": 13920,
    "preview": "---\nheader-id: upgrading-to-product-ver\n---\n\n# Upgrading to @product-ver@\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-i"
  },
  {
    "path": "en/deployment/articles/05-upgrading-to-liferay-7-2/02-planning-for-deprecated-apps.markdown",
    "chars": 1025,
    "preview": "---\nheader-id: planning-for-deprecated-applications\n---\n\n# Planning for Deprecated Applications\n\n[TOC levels=1-4]\n\n<asid"
  },
  {
    "path": "en/deployment/articles/05-upgrading-to-liferay-7-2/03-test-ugrading-a-liferay-backup-copy/01-test-upgrading-a-liferay-backup-copy-intro.markdown",
    "chars": 2634,
    "preview": "---\nheader-id: test-upgrading-a-product-backup-copy\n---\n\n# Test Upgrading a @product@ Backup Copy\n\n[TOC levels=1-4]\n\n<as"
  },
  {
    "path": "en/deployment/articles/05-upgrading-to-liferay-7-2/03-test-ugrading-a-liferay-backup-copy/02-pruning-the-database.markdown",
    "chars": 7651,
    "preview": "---\nheader-id: pruning-the-database\n---\n\n# Pruning the Database\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-info\">\n  <s"
  },
  {
    "path": "en/deployment/articles/05-upgrading-to-liferay-7-2/03-test-ugrading-a-liferay-backup-copy/03-example-removing-intermediate-journal-article-versions.markdown",
    "chars": 6545,
    "preview": "---\nheader-id: example-removing-intermediate-journal-article-versions\n---\n\n# Example: Removing Intermediate Journal Arti"
  },
  {
    "path": "en/deployment/articles/05-upgrading-to-liferay-7-2/03-test-ugrading-a-liferay-backup-copy/04-upgrading-your-test-server-and-database.markdown",
    "chars": 2514,
    "preview": "---\nheader-id: upgrading-your-test-server-and-database\n---\n\n# Upgrading Your Test Server and Database\n\n[TOC levels=1-4]\n"
  },
  {
    "path": "en/deployment/articles/05-upgrading-to-liferay-7-2/04-preparing-to-upgrade-the-liferay-database.markdown",
    "chars": 2333,
    "preview": "---\nheader-id: preparing-to-upgrade-the-product-database\n---\n\n# Preparing to Upgrade the @product@ Database\n\n[TOC levels"
  },
  {
    "path": "en/deployment/articles/05-upgrading-to-liferay-7-2/05-preparing-a-new-liferay-server.markdown",
    "chars": 10877,
    "preview": "---\nheader-id: preparing-a-new-product-server-for-data-upgrade\n---\n\n# Preparing a New @product@ Server for Data Upgrade\n"
  },
  {
    "path": "en/deployment/articles/05-upgrading-to-liferay-7-2/06-upgrading-the-liferay-database/01-upgrading-the-liferay-database-intro.markdown",
    "chars": 2600,
    "preview": "---\nheader-id: upgrading-the-product-data\n---\n\n# Upgrading the @product@ Data\n\n[TOC levels=1-4]\n\n<aside class=\"alert ale"
  },
  {
    "path": "en/deployment/articles/05-upgrading-to-liferay-7-2/06-upgrading-the-liferay-database/02-tuning-for-the-data-upgrade.markdown",
    "chars": 6273,
    "preview": "---\nheader-id: tuning-for-the-data-upgrade\n---\n\n# Tuning for the Data Upgrade\n\n[TOC levels=1-4]\n\n<aside class=\"alert ale"
  },
  {
    "path": "en/deployment/articles/05-upgrading-to-liferay-7-2/06-upgrading-the-liferay-database/03-configuring-the-data-upgrade.markdown",
    "chars": 7973,
    "preview": "---\nheader-id: configuring-the-data-upgrade\n---\n\n# Configuring the Data Upgrade\n\n[TOC levels=1-4]\n\n<aside class=\"alert a"
  },
  {
    "path": "en/deployment/articles/05-upgrading-to-liferay-7-2/06-upgrading-the-liferay-database/04-upgrading-the-core-using-the-upgrade-tool.markdown",
    "chars": 4479,
    "preview": "---\nheader-id: upgrading-the-core-using-the-upgrade-tool\n---\n\n# Upgrading the Core Using the Upgrade Tool\n\n[TOC levels=1"
  },
  {
    "path": "en/deployment/articles/05-upgrading-to-liferay-7-2/06-upgrading-the-liferay-database/05-upgrading-modules-using-gogo-shell.markdown",
    "chars": 9487,
    "preview": "---\nheader-id: upgrading-modules-using-gogo-shell\n---\n\n# Upgrading Modules Using Gogo Shell\n\n[TOC levels=1-4]\n\n<aside cl"
  },
  {
    "path": "en/deployment/articles/05-upgrading-to-liferay-7-2/07-executing-post-upgrade-tasks.markdown",
    "chars": 2106,
    "preview": "---\nheader-id: executing-post-upgrade-tasks\n---\n\n# Executing Post-Upgrade Tasks\n\n[TOC levels=1-4]\n\n<aside class=\"alert a"
  },
  {
    "path": "en/deployment/articles/05-upgrading-to-liferay-7-2/08-upgrading-a-sharded-environment.markdown",
    "chars": 5155,
    "preview": "---\nheader-id: upgrading-a-sharded-environment\n---\n\n# Upgrading a Sharded Environment\n\n[TOC levels=1-4]\n\n<aside class=\"a"
  },
  {
    "path": "en/deployment/articles/05-upgrading-to-liferay-7-2/09-migrating-from-audience-targeting/01-migrating-from-audience-targeting-intro.markdown",
    "chars": 1931,
    "preview": "---\nheader-id: migrating-from-audience-targeting-to-segmentation-and-personalization\n---\n\n# Migrating From Audience Targ"
  },
  {
    "path": "en/deployment/articles/05-upgrading-to-liferay-7-2/09-migrating-from-audience-targeting/02-migrating-user-segments.markdown",
    "chars": 3141,
    "preview": "---\nheader-id: migrating-user-segments\n---\n\n# Migrating User Segments\n\n[TOC levels=1-4]\n\nIn Audience Targeting, a user s"
  },
  {
    "path": "en/deployment/articles/05-upgrading-to-liferay-7-2/09-migrating-from-audience-targeting/03-manually-migrating-from-audience-targeting.markdown",
    "chars": 3754,
    "preview": "---\nheader-id: manually-migrating-from-audience-targeting\n---\n\n# Manually Migrating from Audience Targeting\n\n[TOC levels"
  },
  {
    "path": "en/deployment/articles/05-upgrading-to-liferay-7-2/98-deprecated-apps-in-7-2-what-to-do.markdown",
    "chars": 5301,
    "preview": "---\nheader-id: deprecated-apps-in-7-2-what-to-do\n---\n\n# Deprecated Apps in 7.2: What to Do\n\n[TOC levels=1-4]\n\n<aside cla"
  },
  {
    "path": "en/deployment/articles/05-upgrading-to-liferay-7-2/99-apps-in-maintenance-mode.markdown",
    "chars": 1439,
    "preview": "---\nheader-id: apps-in-maintenance-mode\n---\n\n# Apps in Maintenance Mode\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-inf"
  },
  {
    "path": "en/deployment/articles/06-maintaining-liferay/01-maintaining-liferay-intro.markdown",
    "chars": 1327,
    "preview": "---\nheader-id: maintaining-liferay\n---\n\n# Maintaining @product@\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-info\">\n  <s"
  },
  {
    "path": "en/deployment/articles/06-maintaining-liferay/02-backing-up-a-liferay-installation.markdown",
    "chars": 5041,
    "preview": "---\nheader-id: backing-up-a-liferay-installation\n---\n\n# Backing up a @product@ Installation\n\n[TOC levels=1-4]\n\n<aside cl"
  },
  {
    "path": "en/deployment/articles/07-monitoring-liferay/01-monitoring-liferay-intro.markdown",
    "chars": 596,
    "preview": "---\nheader-id: monitoring-product\n---\n\n# Monitoring @product@\n\n[TOC levels=1-4]\n\nThese articles show you how to monitor "
  },
  {
    "path": "en/deployment/articles/07-monitoring-liferay/02-monitoring-gc-and-the-jvm.markdown",
    "chars": 2863,
    "preview": "---\nheader-id: monitoring-garbage-collection-and-the-jvm\n---\n\n# Monitoring Garbage Collection and the JVM\n\n[TOC levels=1"
  },
  {
    "path": "en/deployment/articles/100-reference/01-deployment-reference-intro.markdown",
    "chars": 1081,
    "preview": "---\nheader-id: deployment-reference\n---\n\n# Deployment Reference\n\n[TOC levels=1-4]\n\nHere you'll find definitions, default"
  },
  {
    "path": "en/deployment/articles/100-reference/02-liferay-home.markdown",
    "chars": 4042,
    "preview": "---\nheader-id: liferay-home\n---\n\n# Liferay Home\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-info\">\n  <span class=\"wysiw"
  },
  {
    "path": "en/deployment/articles/100-reference/03-portal-properties.markdown",
    "chars": 2241,
    "preview": "---\nheader-id: portal-properties\n---\n\n# Portal Properties\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-info\">\n  <span cl"
  },
  {
    "path": "en/deployment/articles/100-reference/04-system-properties.markdown",
    "chars": 724,
    "preview": "---\nheader-id: system-properties\n---\n\n# System Properties\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-info\">\n  <span cl"
  },
  {
    "path": "en/deployment/articles/100-reference/05-database-templates.markdown",
    "chars": 1772,
    "preview": "---\nheader-id: database-templates\n---\n\n# Database Templates\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-info\">\n  <span "
  },
  {
    "path": "en/deployment/articles/99-troubleshooting-deployments/01-troubleshooting-deployments-intro.markdown",
    "chars": 2119,
    "preview": "---\nheader-id: troubleshooting-deployments\n---\n\n# Troubleshooting Deployments\n\n[TOC levels=1-4]\n\nWhen coding on any plat"
  },
  {
    "path": "en/deployment/articles/99-troubleshooting-deployments/database-not-ready.markdown",
    "chars": 1080,
    "preview": "---\nheader-id: portal-failed-to-initialize-because-the-database-wasnt-ready\n---\n\n# @product@ Failed to Initialize Becaus"
  },
  {
    "path": "en/deployment/articles/99-troubleshooting-deployments/sort-order-changed-with-different-database.markdown",
    "chars": 814,
    "preview": "---\nheader-id: sort-order-changed-with-a-different-database\n---\n\n# Sort Order Changed with a Different Database\n\n[TOC le"
  },
  {
    "path": "en/deployment/articles/99-troubleshooting-deployments/using-files-to-config-components.markdown",
    "chars": 5600,
    "preview": "---\nheader-id: using-files-to-configure-product-modules\n---\n\n# Using Files to Configure Module Components\n\n[TOC levels=1"
  },
  {
    "path": "en/deployment/articles-dxp/01-deploying-liferay/07-installing-liferay-portal-on-jboss-eap.markdown",
    "chars": 18784,
    "preview": "---\nheader-id: installing-product-on-jboss-eap\n---\n\n# Installing @product@ on JBoss EAP\n\n[TOC levels=1-4]\n\n<aside class="
  },
  {
    "path": "en/deployment/articles-dxp/01-deploying-liferay/08-installing-liferay-on-weblogic.markdown",
    "chars": 13943,
    "preview": "---\nheader-id: installing-liferay-dxp-on-weblogic-12c-r2\n---\n\n# Installing @product@ on WebLogic 12c R2\n\n[TOC levels=1-4"
  },
  {
    "path": "en/deployment/articles-dxp/01-deploying-liferay/09-installing-liferay-on-websphere.markdown",
    "chars": 22253,
    "preview": "---\nheader-id: installing-liferay-dxp-on-websphere\n---\n\n# Installing @product@ on WebSphere\n\n[TOC levels=1-4]\n\n<aside cl"
  },
  {
    "path": "en/deployment/articles-dxp/01-deploying-liferay/11-activating-liferay-dxp.markdown",
    "chars": 1221,
    "preview": "---\nheader-id: activating-liferay-dxp\n---\n\n# Activating Liferay DXP\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-info\">\n"
  },
  {
    "path": "en/deployment/articles-dxp/01-deploying-liferay/13-trial-plugin-installation.markdown",
    "chars": 3866,
    "preview": "---\nheader-id: trial-plugin-installation\n---\n\n# Trial Plugin Installation\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-i"
  },
  {
    "path": "en/deployment/articles-dxp/02-configuring-liferay/04-liferay-portal-clustering/04-clustering-search.markdown",
    "chars": 1445,
    "preview": "---\nheader-id: clustering-search\n---\n\n# Clustering Search\n\n[TOC levels=1-4]\n\nSearch should always run on a separate envi"
  },
  {
    "path": "en/deployment/articles-dxp/02-configuring-liferay/08-dxp-configuration-and-tuning/01-intro.markdown",
    "chars": 5170,
    "preview": "---\nheader-id: tuning-guidelines\n---\n\n# Tuning Guidelines\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-info\">\n  <span cl"
  },
  {
    "path": "en/deployment/articles-dxp/02-configuring-liferay/08-dxp-configuration-and-tuning/02-jvm-tuning.markdown",
    "chars": 5685,
    "preview": "---\nheader-id: java-virtual-machine-tuning\n---\n\n# Java Virtual Machine Tuning\n\n[TOC levels=1-4]\n\n<aside class=\"alert ale"
  },
  {
    "path": "en/deployment/articles-dxp/03-installing-a-search-engine/03-enterprise-search/01-les-intro.markdown",
    "chars": 3648,
    "preview": "---\nheader-id: installing-liferay-enterprise-search\n---\n\n# Installing Liferay Enterprise Search\n\n[TOC levels=1-4]\n\n<asid"
  },
  {
    "path": "en/deployment/articles-dxp/03-installing-a-search-engine/03-enterprise-search/02-monitoring/01-monitoring-intro.markdown",
    "chars": 11646,
    "preview": "---\nheader-id: installing-liferay-enterprise-search-monitoring\n---\n\n# Installing Liferay Enterprise Search Monitoring\n\n["
  },
  {
    "path": "en/deployment/articles-dxp/03-installing-a-search-engine/03-enterprise-search/03-ltr/01-learning-to-rank-intro.markdown",
    "chars": 6775,
    "preview": "---\nheader-id: liferay-enterprise-search-learning-to-rank\n---\n\n# Liferay Enterprise Search: Learning to Rank\n\n[TOC level"
  },
  {
    "path": "en/deployment/articles-dxp/03-installing-a-search-engine/03-enterprise-search/03-ltr/02-configuring-learning-to-rank.markdown",
    "chars": 5006,
    "preview": "---\nheader-id: configuring-learning-to-rank\n---\n\n# Configuring Learning to Rank\n\n[TOC levels=1-4]\n\nBefore beginning, you"
  },
  {
    "path": "en/deployment/articles-dxp/04-securing-liferay/10-saml/01-intro.markdown",
    "chars": 13609,
    "preview": "---\nheader-id: authenticating-using-saml\n---\n\n# Authenticating Using SAML\n\n[TOC levels=1-4]\n\n<aside class=\"alert alert-i"
  },
  {
    "path": "en/deployment/articles-dxp/04-securing-liferay/10-saml/02-setting-up-identity-provider.markdown",
    "chars": 7697,
    "preview": "---\nheader-id: setting-up-liferay-as-a-saml-identity-provider\n---\n\n# Setting up @product@ as a SAML Identity Provider\n\n["
  },
  {
    "path": "en/deployment/articles-dxp/04-securing-liferay/10-saml/03-registering-a-service-provider.markdown",
    "chars": 5365,
    "preview": "---\nheader-id: registering-a-saml-service-provider\n---\n\n# Registering a SAML Service Provider\n\n[TOC levels=1-4]\n\n<aside "
  },
  {
    "path": "en/deployment/articles-dxp/04-securing-liferay/10-saml/04-setting-up-service-provider.markdown",
    "chars": 8037,
    "preview": "---\nheader-id: setting-up-liferay-as-a-saml-service-provider\n---\n\n# Setting up @product@ as a SAML Service Provider\n\n[TO"
  },
  {
    "path": "en/deployment/articles-dxp/04-securing-liferay/10-saml/05-configuring-sp-and-idp-connections.markdown",
    "chars": 5662,
    "preview": "---\nheader-id: changing-the-settings-for-service-provider-and-identity-provider-connection\n---\n\n# Changing the Settings "
  }
]

// ... and 2339 more files (download for full content)

About this extraction

This page contains the full source code of the liferay/liferay-docs GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2539 files (72.3 MB), approximately 5.4M tokens, and a symbol index with 9593 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.

Copied to clipboard!