Creating custom DDM field types in Liferay 7.x

This blog post is the result of an attempt to extend the DDM modules in Liferay with custom field types. First, we'll recap what DDM actually means and where it is used. After that, we'll showcase an example of a flexible custom DDM field type that we created. Finally, we'll give some pointers on how you can create custom DDM field types on your own.

DDM... what's DDM?

DDM stands for Dynamic Data Mapping, a set of modules that define various types of fields that can be used to assemble:

  • Web content structures for creating web content articles.
  • Data definitions for creating dynamic data list records.
  • Metadata sets for creating documents based on document types.

Liferay bundles with an ever expanding set of DDM field types out of the box. At the moment of speaking (Liferay 7.1 has just released), the following field types are available:

Is it ever enough?

For basic content management needs, the default set of DDM field types is usually sufficient. However, there certainly are use cases which would require you to create custom field types:

  • You want to dynamically populate the options of a dropdown field from the response of a REST endpoint.
  • You want to provide a field that can point to a user, a group or any other entity in Liferay.
  • You want to have a text field with some very specific validation, e.g. email address, URL or phone number validation.

In this article, we will examine how to create such custom fields. As an example, we'll pick the first use case and try to create a field type which takes the response of a REST endpoint as the possible values of a dropdown list.

A new field type was born: REST Select

The default Select field in Liferay allows content authors to pick a value from a predefined list of possible values for an article. This is great for simple purposes, but what if you want to dynamically populate this dropdown list with values from an external platform? Or if the values that should be listed depend on the user that requests them?

Meet the brand new REST Select field. This dropdown field allows you to configure a REST endpoint and how to map the JSON fields in the response onto the labels and values of the possible options.

Install the module

Perform the following actions to install the module in your Liferay installation:

  1. Clone https://github.com/limburgie/com.liferay.dynamic.data.mapping.field.extender and checkout the 7.x/field/ddm-rest-select branch.
  2. Build the project using Maven by executing mvn clean package.
  3. Move the resulting JAR (you can find it in the target folder) into the deploy folder of Liferay.

Define the field in a structure

  1. Create a new web content structure. 
  2. Drag the "REST Select" field type into the structure definition.
  3. Configure the field's endpoint and option mappings by selecting the field.

Apart from the default attributes like "Field Label" and "Required", notice there are 3 additional attributes to be configured. The first attribute should be filled with the URL of a REST endpoint. This should be an endpoint that returns a list of JSON objects. E.g. the endpoint http://localhost:8080/api/jsonws/country/get-countries (a built-in endpoint in Liferay) returns the following output:

With the two remaining attributes, you configure what should be respectively in the label and the value of the HTML <option> elements. E.g. in this case, if you pick the "nameCurrentValue" JSON attribute for the option label and the "a3" JSON attribute for the option value, this will produce the following HTML:

Create a new article using the structure

When creating a new web content article based on the structure you've just created, you're able to select a country from the dynamically loaded dropdown list!

Cool, now I want to create my own DDM field type! So... how?

In this part of the post, we'll explore how Liferay was extended to support the new REST Select field. Hopefully, this gives you enough insights to start working on your own custom DDM field type!

Disclaimer

It turned out to be quite a journey to create new DDM fields in Liferay, even in 7.x. You would expect that every field type is defined in its own OSGi module, but the woeful truth is that the definition and rendering of these fields is scattered throughout several Liferay modules in both client-side and server-side code. So the result is rather hacky to say the least.

Please only consider this solution if there is absolutely no other way!!

With that being said, do go on reading this article (wink)

The code

The starting point is https://github.com/limburgie/com.liferay.dynamic.data.mapping.field.extender. This repository provides a skeleton project that can be extended to support new DDM field types. Each part that needs to be extended or implemented is marked with a //TODO comment. You can do a diff of this main branch with the 7.x/field/ddm-rest-select branch to see the different changes to provide your own implementation.

Recommendations

  • Make sure that ALL todos are configured. Forgetting to implement only one of them and it will not work and Liferay will give you no clue.
  • Make sure to start Liferay in developer mode -Dexternal-properties=portal-developer.properties to setenv.sh (Unix) or setenv.bat (Windows).
  • If your changes don't seem to be reflected, uninstall the module from the Gogo shell and then reinstall it again to clear any remaining state.

Conclusion

While it was a real challenge to create a custom DDM field, it IS possible and if you inject enough flexibility in your field, it can serve multiple purposes. Please send me your feedback on how you would do things differently or what field types you are missing at the moment in Liferay 7.x.

Thanks for reading!

Blogs

Great article, Peter! The skeleton you provided will be quite helpful for custom fields creation on DDM. Thanks for spreading the word :)

Nice article! But I have some questions. I've cloned the other example (ddm-users) and I have deployed it and added to my web content structure. The question is, what it's the purpose of this field? It should show fullName instead of screenName, but where? When is invoked the overriden method getValueAcessor?

 

Thanks!

Many thanks Peter. I've played a little with your code to create a generic <div> with a style attribute just to give web content form some background color. With respect to your code I implemented the ability to nest other fields (and having them properly saved on DB). You'll find a fork in https://github.com/szacchino/com.liferay.dynamic.data.mapping.field.extender/tree/7.0/field/ddm-rest-select

I forked only the 7.0/field/ddm-rest-select branch

 

 

Hi Sandro,

your code is helpful but i'm stuck with a issue in building project, with "mvn clean package", is 

error :  

Unresolved requirement: Import-Package: com.liferay.dynamic.data.mapping.util.impl; version="[1.2.0,2.0.0)"

Please help me out how to resolve this issue. 

 

in liferay 7.1  tomcat server bundle state is "Installed", i need to make it "Active".  

Hi Shubham,

 

sorry for the late comment but I wasn't notified of your response. I think your problem is caused by a code (mine) written for liferay 7.0.4 thus importing libraries available in liferay 7.0.4. You should verify which version of com.liferay.dynamic.data.mapping.util.impl is available in your Liferay 7.1 or deploy the correct version of com.liferay.dynamic.. to your instance (but I think this is not a great advice for production). Also take a look to the 7.1 branch of Peter's original code and in particular to its pom.xml https://github.com/limburgie/com.liferay.dynamic.data.mapping.field.extender/blob/7.1/field/ddm-rest-select/pom.xml

Thanks for the blog above. I was able to create a new element based on the example above.

 

In my custom element, I have input with type "hidden".

 

Unfortunately, I am not able to get the desired behavior i.e.:

1. When I add the element on the structure I see the correct behavior. OK.

2. When I add the same element by adding the element to a native form element "HTML" and drag custom element inside the type becomes "text".  KO.

 

Any suggestion on why there could be a difference in behavior. Did you tried to put your custom field inside a native element like "HTML"?  Any suggestions...

 

Thanks!

Hello, Thanks for the article, i have used that but i have to implement this solution for creating additional Metadata for documents and media of Liferay, there am getting unexpected null error. searching for the solution i came to know that this solution is working fine with structure of web content. can you please suggest me something through which i can get my solution.

 

I am getting this error in browser console:

Uncaught TypeError: Cannot read property 'append' of null

 

Thanks!

Thanks for the article! Was exactly what i needed. But I got one issue here: When I'm logged in into Liferay and deploy my new field, everything seems to work. But as soon as I log out and in again, I always get: liferay n.getFieldClass(...) is not a constructor. when I try to load my structure. After a page reload the error is gone and everything works fine, but initially the error occurs. It seems that at first load he didn't execute the custom_fields.ext.js and my field is not listed in A.FormBuildField.types. On second load it's there. Any suggestions on how to fix that or where I messed up?

I think that the reported error depends on the version of Liferay you are using: just today I faced the same error installing the code on Liferay 7.0.6 (ga7); since the js code for DDM Fields changed in Liferay 7.0.6, I added one file (ddm_form.js) and updated some other files from 7.0.6 source code (you'll find those files in src/main/resources).  Only including the original 7.0.6 JS code with this bundle I'm able to make everything works properly. 

 

In the 7.0/field/ddm-rest-select branch of the repo you'll find updated code. I didn't  tested it on the old 7.0.4 version of liferay and it may not work anymore on that.

In the previous comment I was talking about my experience on my fork on https://github.com/szacchino/com.liferay.dynamic.data.mapping.field.extender/tree/7.0/field/ddm-rest-select

Sorry for the confusion

Thanks you very much for the quick response, I appreciate it. I saw your changes and reexamined my code and compared it with yours, so even if it wasn't the same problem we had, it still pushed me into the right direction.  Thanks for that.

 

So in case someone has a similar problem in the future: 

I found the cause of my problem and in the end it's trivial and totally my fault. I somehow had a copy/paste error in { ATTRS: {

    dataType: ''

}

where I had the wrong type declared for the field. I don't understand how a reload of the page resolved that issue, but since i fixed it, the problem doesn't occur anymore.  

Hi michael,

 

i am also facing same issue could you please suggest what dataType need to provide to get resolve this issue.

 

dataType: {                         value: 'string'                     },

 

Issue :

 

Uncaught TypeError: n.getFieldClass(...) is not a constructor.

Hi Bhavesh,

 

in my case the correct value was 'email', since i declared the field: 'ddm-email', 

like so:

ATTRS: {

   dataType: {

      value: 'email'

   },

   fieldNamespace: {

      value: 'ddm'

   }

}

 

NAME: 'ddm-email'

}

 

But after working some more with custom ddm-fields and extending existing ddm-fields, I discovered that the n.getFieldClass(...) isn't tied to that specifically. It's more of a generic error that occurs whenever there was something wrong with your code, since it occurs, when the field is tried to be instantiated. It could be your file missing, some code breaking execution, your field to not be found... I had to do a lot of debugging to fix this error on several occasions.      So I can't give you a specific hint.

Hello

When we try to implement this DDM work in Lifray 7.4, we get the following error. Is there a solution method for 7.4 version?

 

at com.liferay.portal.servlet.filters.secure.BaseAuthFilter.processFilter(BaseAuthFilter.java:339) [portal-impl.jar:?]

                at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:215) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:147) [portal-kernel.jar:?]

                at com.liferay.portal.servlet.filters.etag.ETagFilter.processFilter(ETagFilter.java:87) [portal-impl.jar:?]

                at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:215) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:147) [portal-kernel.jar:?]

                at com.liferay.portal.servlet.filters.autologin.AutoLoginFilter.processFilter(AutoLoginFilter.java:262) [portal-impl.jar:?]

                at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:215) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:147) [portal-kernel.jar:?]

                at com.liferay.portal.sharepoint.SharepointFilter.processFilter(SharepointFilter.java:88) [portal-impl.jar:?]

                at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:215) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:147) [portal-kernel.jar:?]

                at com.liferay.portal.servlet.filters.virtualhost.VirtualHostFilter.processFilter(VirtualHostFilter.java:244) [portal-impl.jar:?]

                at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:215) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:147) [portal-kernel.jar:?]

                at com.liferay.portal.monitoring.internal.servlet.filter.MonitoringFilter.processFilter(MonitoringFilter.java:139) [bundleFile:?]

                at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:215) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:196) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:99) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:196) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:99) [portal-kernel.jar:?]

                at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176) [urlrewritefilter-4.0.4.jar:4.0.4]

                at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) [urlrewritefilter-4.0.4.jar:4.0.4]

                at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) [urlrewritefilter-4.0.4.jar:4.0.4]

                at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:389) [urlrewritefilter-4.0.4.jar:4.0.4]

                at com.liferay.portal.url.rewrite.filter.internal.URLRewriteFilter.processFilter(URLRewriteFilter.java:98) [bundleFile:?]

                at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:215) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:175) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:99) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:175) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:99) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:196) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:99) [portal-kernel.jar:?]

                at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter.doFilter(InvokerFilter.java:104) [portal-kernel.jar:?]

                at com.liferay.shielded.container.internal.proxy.FilterWrapper.doFilter(FilterWrapper.java:79) [com.liferay.shielded.container.impl.jar:?]

                at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) [catalina.jar:9.0.56]

                at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) [catalina.jar:9.0.56]

                at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) [catalina.jar:9.0.56]

                at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) [catalina.jar:9.0.56]

                at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540) [catalina.jar:9.0.56]

                at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) [catalina.jar:9.0.56]

                at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [catalina.jar:9.0.56]

                at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) [catalina.jar:9.0.56]

                at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) [catalina.jar:9.0.56]

                at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382) [tomcat-coyote.jar:9.0.56]

                at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-coyote.jar:9.0.56]

                at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895) [tomcat-coyote.jar:9.0.56]

                at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1732) [tomcat-coyote.jar:9.0.56]

                at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-coyote.jar:9.0.56]

                at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) [tomcat-util.jar:9.0.56]

                at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) [tomcat-util.jar:9.0.56]

                at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:9.0.56]

                at java.lang.Thread.run(Thread.java:750) [?:1.8.0_322]

Caused by: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.liferay.portal.model.impl.UserImpl#40901]

                at org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:1950) ~[hibernate-core.jar:3.6.10.Final]

                at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2595) ~[hibernate-core.jar:3.6.10.Final]

                at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2495) ~[hibernate-core.jar:3.6.10.Final]

                at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2822) ~[hibernate-core.jar:3.6.10.Final]

                at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:113) ~[hibernate-core.jar:3.6.10.Final]

                at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273) ~[hibernate-core.jar:3.6.10.Final]

                at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:265) ~[hibernate-core.jar:3.6.10.Final]

                at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:185) ~[hibernate-core.jar:3.6.10.Final]

                at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) ~[hibernate-core.jar:3.6.10.Final]

                at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) ~[hibernate-core.jar:3.6.10.Final]

                at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216) ~[hibernate-core.jar:3.6.10.Final]

                at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383) ~[hibernate-core.jar:3.6.10.Final]

                at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133) ~[hibernate-core.jar:3.6.10.Final]

                at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:663) ~[spring-orm.jar:4.3.22.RELEASE]

                ... 146 more

2022-04-28 19:32:46.377 INFO  [Thread-7][ThemeHotDeployListener:171] 1 theme for dialect-theme was unregistered

2022-04-28 19:32:47.360 INFO  [Thread-7][ThemeHotDeployListener:171] 1 theme for classic-theme was unregistered

2022-04-28 19:32:48.330 INFO  [Thread-7][ThemeHotDeployListener:171] 1 theme for minium-theme was unregistered

2022-04-28 19:32:48.700 INFO  [Thread-7][ThemeHotDeployListener:171] 1 theme for admin-theme was unregistered

2022-04-28 19:32:49.022 INFO  [Thread-7][ThemeHotDeployListener:171] 1 theme for speedwell-theme was unregistered

2022-04-28 19:32:53.319 INFO  [Thread-7][ENGINE:-2] Database closed

29-Apr-2022 10:14:05.640 INFO [main] org.apache.catalina.startup.Catalina.load Server initialization in [862] milliseconds

Loading jar:file:/data01/wlsadmin/liferay/liferay-ce-portal-7.4.3.20-ga20/tomcat-9.0.56/webapps/ROOT/WEB-INF/shielded-container-lib/portal-impl.jar!/system.properties

Loading jar:file:/data01/wlsadmin/liferay/liferay-ce-portal-7.4.3.20-ga20/tomcat-9.0.56/webapps/ROOT/WEB-INF/shielded-container-lib/portal-impl.jar!/portal.properties

Loading file:/data01/wlsadmin/liferay/liferay-ce-portal-7.4.3.20-ga20/portal-setup-wizard.properties

2022-04-29 10:14:11.794 INFO  [main][PortalContextLoaderListener:123] JVM arguments: -Djava.util.logging.config.file=/turkcell/wlsadmin/liferay/liferay-ce-portal-7.4.3.20-ga20/tomcat-9.0.56/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dfile.encoding=UTF-8 -Djava.locale.providers=JRE,COMPAT,CLDR -Djava.net.preferIPv4Stack=true -Duser.timezone=GMT -Xms2560m -Xmx2560m -XX:MaxNewSize=1536m -XX:MaxMetaspaceSize=768m -XX:MetaspaceSize=768m -XX:NewSize=1536m -XX:SurvivorRatio=7 -Dignore.endorsed.dirs= -Dcatalina.base=/turkcell/wlsadmin/liferay/liferay-ce-portal-7.4.3.20-ga20/tomcat-9.0.56 -Dcatalina.home=/turkcell/wlsadmin/liferay/liferay-ce-portal-7.4.3.20-ga20/tomcat-9.0.56 -Djava.io.tmpdir=/turkcell/wlsadmin/liferay/liferay-ce-portal-7.4.3.20-ga20/tomcat-9.0.56/temp

2022-04-29 10:14:56.575 WARN  [main][DialectDetector:81] Liferay is configured to use Hypersonic as its database. Do NOT use Hypersonic in production. Hypersonic is an embedded database useful for development and demonstration purposes. The database settings can be changed in portal-ext.properties.

2022-04-29 10:14:56.576 INFO  [main][DialectDetector:148] Using dialect com.liferay.portal.dao.orm.hibernate.HSQLDialect for HSQL Database Engine 2.3

2022-04-29 10:14:59.453 INFO  [main][ModuleFrameworkImpl:1238] Starting initial bundles

2022-04-29 10:15:12.131 INFO  [main][ModuleFrameworkImpl:1535] Started initial bundles

2022-04-29 10:15:12.132 INFO  [main][ModuleFrameworkImpl:1584] Starting dynamic bundles

2022-04-29 10:15:25.650 INFO  [Start Level: Equinox Container: 00e8fa77-db35-4138-829d-2e7cc9984bf5][Policy:289] Attempting to load AntiSamy policy from an input stream.

2022-04-29 10:15:25.730 INFO  [CM Configuration Updater (ManagedServiceFactory Update: factoryPid=[com.liferay.portal.security.antisamy.configuration.AntiSamyClassNameConfiguration])][Policy:289] Attempting to load AntiSamy policy from an input stream.

2022-04-29 10:15:25.775 INFO  [CM Configuration Updater (ManagedServiceFactory Update: factoryPid=[com.liferay.portal.security.antisamy.configuration.AntiSamyClassNameConfiguration])][Policy:289] Attempting to load AntiSamy policy from an input stream.

^C

[wlsadmin@intappstb08 logs]$ vi catalina.out

 

        at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4766) [catalina.jar:9.0.56]

        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5230) [catalina.jar:9.0.56]

        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:9.0.56]

        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:726) [catalina.jar:9.0.56]

        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:698) [catalina.jar:9.0.56]

        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:696) [catalina.jar:9.0.56]

        at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:690) [catalina.jar:9.0.56]

        at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1889) [catalina.jar:9.0.56]

        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_322]

        at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_322]

        at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) [tomcat-util.jar:9.0.56]

        at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112) [?:1.8.0_322]

        at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:583) [catalina.jar:9.0.56]

        at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:473) [catalina.jar:9.0.56]

        at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1618) [catalina.jar:9.0.56]

        at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:319) [catalina.jar:9.0.56]

        at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123) [catalina.jar:9.0.56]

        at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:423) [catalina.jar:9.0.56]

        at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:366) [catalina.jar:9.0.56]

        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:946) [catalina.jar:9.0.56]

        at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:835) [catalina.jar:9.0.56]

        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:9.0.56]

        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1396) [catalina.jar:9.0.56]

        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1386) [catalina.jar:9.0.56]

        at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_322]

        at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) [tomcat-util.jar:9.0.56]

        at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134) [?:1.8.0_322]

        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:919) [catalina.jar:9.0.56]

        at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:263) [catalina.jar:9.0.56]

        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:9.0.56]

        at org.apache.catalina.core.StandardService.startInternal(StandardService.java:432) [catalina.jar:9.0.56]

        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:9.0.56]

        at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:927) [catalina.jar:9.0.56]

        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:9.0.56]

        at org.apache.catalina.startup.Catalina.start(Catalina.java:772) [catalina.jar:9.0.56]

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_322]

        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_322]

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_322]

        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_322]

        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:345) [bootstrap.jar:9.0.56]

        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:476) [bootstrap.jar:9.0.56]

2022-04-29 10:15:47.404 INFO  [main][ModuleFrameworkImpl:1667] Started web bundles

2022-04-29 10:15:47.404 INFO  [main][ModuleFrameworkImpl:253] Navigate to Control Panel > System > Gogo Shell and enter "lb" to see all bundles

2022-04-29 10:15:47.427 ERROR [fileinstall-directory-watcher][DirectoryWatcher:1173] Unable to start bundle: file:/data01/wlsadmin/liferay/liferay-ce-portal-7.4.3.20-ga20/osgi/modules/com.liferay.dynamic.data.mapping.field.extender-0.0.1-SNAPSHOT.jar

com.liferay.portal.kernel.log.LogSanitizerException: org.osgi.framework.BundleException: Could not resolve module: com.liferay.dynamic.data.mapping.field.extender [1488]_  Unresolved requirement: Import-Package: com.liferay.document.library.kernel.service; version="[1.0.0,2.0.0)"_ [Sanitized]

        at org.eclipse.osgi.container.Module.start(Module.java:444) ~[org.eclipse.osgi.jar:?]

        at org.eclipse.osgi.internal.framework.EquinoxBundle.start(EquinoxBundle.java:428) ~[org.eclipse.osgi.jar:?]

        at com.liferay.portal.file.install.internal.DirectoryWatcher._startBundle(DirectoryWatcher.java:1156) [bundleFile:?]

        at com.liferay.portal.file.install.internal.DirectoryWatcher._startBundles(DirectoryWatcher.java:1189) [bundleFile:?]

        at com.liferay.portal.file.install.internal.DirectoryWatcher._startAllBundles(DirectoryWatcher.java:1130) [bundleFile:?]

        at com.liferay.portal.file.install.internal.DirectoryWatcher._process(DirectoryWatcher.java:1041) [bundleFile:?]

        at com.liferay.portal.file.install.internal.DirectoryWatcher.run(DirectoryWatcher.java:221) [bundleFile:?]