Skip to content

Commit

Permalink
chore(Content) fixes #23184 : Improve the field validation exception …
Browse files Browse the repository at this point in the history
…log (#30100)

### Proposed Changes
* Improving the amount of information printed by the Contentlet
Validation process.
* Some methods in the call stack were updated so they don't have to
print the error message again. And now, we're also logging the name and
ID of the Workflow Action that triggered the validation.
* The error data was not reduced at all, but just improved they way it's
printed to make it easier to read and take less space in the log. When
validating a text field in a Contentlet, the error logging went from
this:
```log
[20/09/24 19:19:36:147 GMT]  INFO util.ActivityLogger: class com.dotcms.content.elasticsearch.business.ESContentletAPIImpl: system : Contentlet to be saved:  , StartDate: N/D; EndDate: N/D; User:dotcms.org.1; ContentIdentifier: 
[20/09/24 19:19:36:148 GMT]  WARN business.ESContentletAPIImpl: Field [title] is required
[20/09/24 19:19:36:149 GMT]  WARN business.ESContentletAPIImpl: Contentlet with id:`Unknown/New` and title:`` has invalid / missing field(s).
List of non valid fields
REQUIRED: title/Title


[20/09/24 19:19:36:149 GMT]  WARN business.ESContentletAPIImpl: Contentlet with id:`Unknown/New` and title:`` has invalid / missing field(s).
List of non valid fields
REQUIRED: title/Title


[20/09/24 19:19:36:149 GMT]  WARN business.ESContentletAPIImpl: com.dotcms.content.elasticsearch.business.ESContentletAPIImpl.validateContentlet(ESContentletAPIImpl.java:7376)
[20/09/24 19:19:36:150 GMT]  WARN business.ESContentletAPIImpl: Contentlet with id:`Unknown/New` and title:`` has invalid / missing field(s).
List of non valid fields
REQUIRED: title/Title


com.dotmarketing.portlets.contentlet.business.DotContentletValidationException: Contentlet with id:`Unknown/New` and title:`` has invalid / missing field(s).
List of non valid fields
REQUIRED: title/Title


	at com.dotcms.content.elasticsearch.business.ESContentletAPIImpl.validateContentlet(ESContentletAPIImpl.java:7376) ~[?:?]
	at com.dotcms.content.elasticsearch.business.ESContentletAPIImpl.validateContentlet(ESContentletAPIImpl.java:8115) ~[?:?]
	at com.dotmarketing.portlets.contentlet.business.ContentletAPIInterceptor.validateContentlet(ContentletAPIInterceptor.java:2271) ~[?:?]
	at com.dotcms.content.elasticsearch.business.ESContentletAPIImpl.internalCheckin(ESContentletAPIImpl.java:5382) ~[?:?]
	at com.dotcms.content.elasticsearch.business.ESContentletAPIImpl.lambda$checkin$59(ESContentletAPIImpl.java:5001) ~[?:?]
	at com.dotcms.concurrent.lock.StripedLockImpl.tryLock(StripedLockImpl.java:100) ~[?:?]
	at com.dotcms.concurrent.lock.StripedLockImpl.tryLock(StripedLockImpl.java:55) ~[?:?]
	at com.dotcms.concurrent.lock.IdentifierStripedLock.tryLock(IdentifierStripedLock.java:16) ~[?:?]
	at com.dotcms.content.elasticsearch.business.ESContentletAPIImpl.checkin(ESContentletAPIImpl.java:5000) ~[?:?]
	at com.dotcms.content.elasticsearch.business.ESContentletAPIImpl.checkin(ESContentletAPIImpl.java:9908) ~[?:?]
	at com.dotcms.content.elasticsearch.business.ESContentletAPIImpl.checkin(ESContentletAPIImpl.java:9971) ~[?:?]
	at com.dotmarketing.portlets.contentlet.business.ContentletAPIInterceptor.checkin(ContentletAPIInterceptor.java:195) ~[?:?]
	at com.dotmarketing.portlets.workflows.actionlet.SaveContentActionlet.executeAction(SaveContentActionlet.java:79) ~[?:?]
	at com.dotmarketing.portlets.workflows.business.WorkflowAPIImpl.fireWorkflowPostCheckin(WorkflowAPIImpl.java:2424) ~[?:?]
	at com.dotmarketing.portlets.workflows.business.WorkflowAPIImpl.lambda$fireContentWorkflow$73(WorkflowAPIImpl.java:3382) ~[?:?]
	at com.dotcms.util.ThreadContextUtil.wrapVoidNoReindex(ThreadContextUtil.java:85) ~[?:?]
	at com.dotmarketing.portlets.workflows.business.WorkflowAPIImpl.fireContentWorkflow(WorkflowAPIImpl.java:3382) ~[?:?]
	at com.dotmarketing.portlets.contentlet.business.web.ContentletWebAPIImpl.saveWebAsset(ContentletWebAPIImpl.java:538) ~[?:?]
	at com.dotmarketing.portlets.contentlet.business.web.ContentletWebAPIImpl.saveContent(ContentletWebAPIImpl.java:161) ~[?:?]
	at com.dotmarketing.portlets.contentlet.ajax.ContentletAjax.saveContent(ContentletAjax.java:1987) ~[?:?]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
	at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[?:?]
	at com.dotcms.repackage.org.directwebremoting.impl.CreatorModule$1.doFilter(CreatorModule.java:229) ~[?:?]
	at com.dotcms.repackage.org.directwebremoting.impl.CreatorModule.executeMethod(CreatorModule.java:241) ~[?:?]
	at com.dotcms.repackage.org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:379) ~[?:?]
	at com.dotcms.repackage.org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:332) ~[?:?]
	at com.dotcms.repackage.org.directwebremoting.dwrp.BaseCallHandler.handle(BaseCallHandler.java:104) ~[?:?]
	at com.dotcms.repackage.org.directwebremoting.servlet.UrlProcessor.handle(UrlProcessor.java:120) ~[?:?]
	at com.dotcms.repackage.org.directwebremoting.servlet.DwrServlet.doPost(DwrServlet.java:141) ~[?:?]
	at com.dotmarketing.servlets.DwrWrapperServlet.doPost(DwrWrapperServlet.java:60) ~[?:?]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:555) ~[?:?]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:623) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
	at com.dotmarketing.filters.CMSFilter.doFilterInternal(CMSFilter.java:181) ~[?:?]
	at com.dotmarketing.filters.CMSFilter.doFilter(CMSFilter.java:61) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
	at com.dotcms.filters.interceptor.AbstractWebInterceptorSupportFilter.doFilter(AbstractWebInterceptorSupportFilter.java:90) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
	at com.dotcms.filters.interceptor.AbstractWebInterceptorSupportFilter.doFilter(AbstractWebInterceptorSupportFilter.java:90) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
	at com.dotcms.visitor.filter.servlet.VisitorFilter.doFilter(VisitorFilter.java:81) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
	at com.dotcms.vanityurl.filters.VanityURLFilter.doFilter(VanityURLFilter.java:107) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
	at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176) ~[?:?]
	at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) ~[?:?]
	at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) ~[?:?]
	at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:389) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
	at com.dotmarketing.filters.TimeMachineFilter.doFilter(TimeMachineFilter.java:137) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
	at com.dotmarketing.filters.ThreadNameFilter.doFilter(ThreadNameFilter.java:88) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
	at com.dotmarketing.filters.CookiesFilter.doFilter(CookiesFilter.java:53) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
	at com.dotmarketing.filters.CharsetEncodingFilter.doFilter(CharsetEncodingFilter.java:99) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
	at com.dotcms.filters.interceptor.AbstractWebInterceptorSupportFilter.doFilter(AbstractWebInterceptorSupportFilter.java:90) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
	at org.apache.catalina.filters.HttpHeaderSecurityFilter.doFilter(HttpHeaderSecurityFilter.java:129) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
	at com.dotcms.filters.NormalizationFilter.doFilter(NormalizationFilter.java:89) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168) ~[?:?]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[?:?]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481) ~[?:?]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) ~[?:?]
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:670) ~[?:?]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[?:?]
	at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:765) ~[?:?]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[?:?]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) ~[?:?]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390) ~[?:?]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[?:?]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:928) ~[?:?]
	at org.apache.tomcat.util.net.Nio2Endpoint$SocketProcessor.doRun(Nio2Endpoint.java:1732) ~[?:?]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[?:?]
	at org.apache.tomcat.util.net.AbstractEndpoint.processSocket(AbstractEndpoint.java:1295) ~[?:?]
	at org.apache.tomcat.util.net.SecureNio2Channel$HandshakeWriteCompletionHandler.completed(SecureNio2Channel.java:121) ~[?:?]
	at org.apache.tomcat.util.net.SecureNio2Channel$HandshakeWriteCompletionHandler.completed(SecureNio2Channel.java:114) ~[?:?]
	at java.base/sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:127) ~[?:?]
	at java.base/sun.nio.ch.Invoker.invokeDirect(Invoker.java:158) ~[?:?]
	at java.base/sun.nio.ch.UnixAsynchronousSocketChannelImpl.implWrite(UnixAsynchronousSocketChannelImpl.java:746) ~[?:?]
	at java.base/sun.nio.ch.AsynchronousSocketChannelImpl.write(AsynchronousSocketChannelImpl.java:383) ~[?:?]
	at java.base/sun.nio.ch.AsynchronousSocketChannelImpl.write(AsynchronousSocketChannelImpl.java:400) ~[?:?]
	at org.apache.tomcat.util.net.SecureNio2Channel.handshakeInternal(SecureNio2Channel.java:302) ~[?:?]
	at org.apache.tomcat.util.net.SecureNio2Channel.handshake(SecureNio2Channel.java:222) ~[?:?]
	at org.apache.tomcat.util.net.Nio2Endpoint$SocketProcessor.doRun(Nio2Endpoint.java:1709) ~[?:?]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[?:?]
	at org.apache.tomcat.util.net.AbstractEndpoint.processSocket(AbstractEndpoint.java:1295) ~[?:?]
	at org.apache.tomcat.util.net.SecureNio2Channel$HandshakeReadCompletionHandler.completed(SecureNio2Channel.java:104) ~[?:?]
	at org.apache.tomcat.util.net.SecureNio2Channel$HandshakeReadCompletionHandler.completed(SecureNio2Channel.java:97) ~[?:?]
	at java.base/sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:127) ~[?:?]
	at java.base/sun.nio.ch.UnixAsynchronousSocketChannelImpl.finishRead(UnixAsynchronousSocketChannelImpl.java:439) ~[?:?]
	at java.base/sun.nio.ch.UnixAsynchronousSocketChannelImpl.finish(UnixAsynchronousSocketChannelImpl.java:191) ~[?:?]
	at java.base/sun.nio.ch.UnixAsynchronousSocketChannelImpl.onEvent(UnixAsynchronousSocketChannelImpl.java:213) ~[?:?]
	at java.base/sun.nio.ch.EPollPort$EventHandlerTask.run(EPollPort.java:306) ~[?:?]
	at java.base/sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:112) ~[?:?]
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[?:?]
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[?:?]
	at java.base/java.lang.Thread.run(Thread.java:829) [?:?]
[20/09/24 19:19:36:150 GMT]  WARN actionlet.SaveContentActionlet: Contentlet with id:`Unknown/New` and title:`` has invalid / missing field(s).
List of non valid fields
REQUIRED: title/Title


[20/09/24 19:19:36:150 GMT]  WARN actionlet.SaveContentActionlet: Contentlet with id:`Unknown/New` and title:`` has invalid / missing field(s).
List of non valid fields
REQUIRED: title/Title


[20/09/24 19:19:36:150 GMT]  WARN actionlet.SaveContentActionlet: com.dotcms.content.elasticsearch.business.ESContentletAPIImpl.validateContentlet(ESContentletAPIImpl.java:7376)
[20/09/24 19:19:36:151 GMT] ERROR business.WorkflowAPIImpl: There was an unexpected error: Contentlet with id:`Unknown/New` and title:`` has invalid / missing field(s).
List of non valid fields
REQUIRED: title/Title


[20/09/24 19:19:36:151 GMT]  WARN web.ContentletWebAPIImpl: com.dotmarketing.exception.DotRuntimeException: Contentlet with id:`Unknown/New` and title:`` has invalid / missing field(s).
List of non valid fields
REQUIRED: title/Title


[20/09/24 19:19:36:151 GMT]  WARN web.ContentletWebAPIImpl: Contentlet with id:`Unknown/New` and title:`` has invalid / missing field(s).
List of non valid fields
REQUIRED: title/Title

```
To this:
```log
13:27:43.015  INFO  util.ActivityLogger - class com.dotcms.content.elasticsearch.business.ESContentletAPIImpl: system : Contentlet to be saved:  , StartDate: N/D; EndDate: N/D; User:dotcms.org.1; ContentIdentifier: 
13:27:43.016  WARN  business.ESContentletAPIImpl - Field [title] is required
13:27:43.016  WARN  business.ESContentletAPIImpl - Contentlet with ID 'Unknown/New' [''] has invalid/missing field(s). - Fields: [REQUIRED]: Title (title) 
13:27:43.016  WARN  business.ESContentletAPIImpl - com.dotcms.content.elasticsearch.business.ESContentletAPIImpl.validateContentlet(ESContentletAPIImpl.java:7382)
13:27:43.016  ERROR business.WorkflowAPIImpl - Failed to fire Workflow Action 'Publish' [b9d89c80-3d88-4311-8365-187323c96436]: Contentlet with ID 'Unknown/New' [''] has invalid/missing field(s). - Fields: [REQUIRED]: Title (title) 
```
```
  • Loading branch information
jcastro-dotcms authored Sep 24, 2024
1 parent 477606b commit 3977a3b
Show file tree
Hide file tree
Showing 8 changed files with 220 additions and 220 deletions.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
package com.dotmarketing.portlets.contentlet.business;

import com.dotmarketing.portlets.contentlet.model.Contentlet;
import com.dotmarketing.portlets.structure.model.Field;
import com.dotmarketing.portlets.structure.model.Relationship;
import com.dotmarketing.util.UtilMethods;
import com.liferay.util.StringPool;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import java.util.Set;

import static com.liferay.util.StringPool.BLANK;
import static com.liferay.util.StringPool.SPACE;

import com.dotmarketing.portlets.contentlet.model.Contentlet;
import com.dotmarketing.portlets.structure.model.Field;
import com.dotmarketing.portlets.structure.model.Relationship;
/**
* Used for throwing contentlet validation problems
* @author Jason Tesser
Expand All @@ -30,8 +33,8 @@ public class DotContentletValidationException extends DotContentletStateExceptio
public final static String VALIDATION_FAILED_BAD_CARDINALITY = "badCar";

private static final long serialVersionUID = 1L;
private Map<String, List<Field>> notValidFields = new HashMap<>();
private Map<String, Map<Relationship, List<Contentlet>>> notValidRelationships = new HashMap<>();
private final Map<String, List<Field>> notValidFields = new HashMap<>();
private final Map<String, Map<Relationship, List<Contentlet>>> notValidRelationships = new HashMap<>();

/**
* Used for throwing contentlet validation problems
Expand Down Expand Up @@ -219,59 +222,66 @@ public String toString() {
return toString(true);
}

public String toString(boolean parentException) {
/**
* Returns a string representation of the list of errors found during the validation of a
* new or existing Contentlet.
*
* @param parentException If the parent exception error message must be included as well, set
* this to {@code true}.
*
* @return The list of validation errors, if any.
*/
public String toString(final boolean parentException) {
final StringBuilder builder = new StringBuilder();
if (parentException) {
builder.append(super.toString()).append("\n");
builder.append(super.toString());
}
//Print the Field errors
Set<String> keys = notValidFields.keySet();
if (keys.size() > 0) {
builder.append("List of non valid fields\n");
for (String key : keys) {
builder.append(key.toUpperCase()).append(": ");
List<Field> fields = notValidFields.get(key);
if (!keys.isEmpty()) {
builder.append("Fields: ");
for (final String key : keys) {
builder.append("[").append(key.toUpperCase()).append("]").append(": ");
final List<Field> fields = notValidFields.get(key);

for (int i = 0; i < fields.size(); i++) {
Field field = fields.get(i);

final Field field = fields.get(i);
if (i > 0) {
builder.append(", ");
}

builder.append(field.getVelocityVarName()).append("/")
.append(field.getFieldName());
builder.append(field.getFieldName()).append(" (")
.append(field.getVelocityVarName()).append(")");
}
builder.append("\n");
builder.append(SPACE);
}
}
//Print the Relationship errors
keys = notValidRelationships.keySet();
if (keys.size() > 0) {
builder.append("List of non valid relationships\n");
for (String key : keys) {
builder.append(key.toUpperCase()).append(": ");
Map<Relationship, List<Contentlet>> relationshipContentlets = notValidRelationships
.get(key);
for (Entry<Relationship, List<Contentlet>> relationship : relationshipContentlets
.entrySet()) {
builder.append(relationship.getKey().getRelationTypeValue()).append(", ");
if (!keys.isEmpty()) {
builder.append(UtilMethods.isSet(notValidFields.keySet()) ? " / " : BLANK).append("Relationships: ");
int i = 0;
for (final String key : keys) {
builder.append("[").append(key.toUpperCase()).append("]").append(": ");
final Map<Relationship, List<Contentlet>> relationshipContentlets = notValidRelationships.get(key);
for (final Entry<Relationship, List<Contentlet>> relationship : relationshipContentlets.entrySet()) {
builder.append(relationship.getKey().getRelationTypeValue());
}
builder.append("\n");
if (i > 0) {
builder.append(", ");
}
builder.append(SPACE);
i++;
}
}
builder.append("\n");
return builder.toString();
return builder.toString().trim();
}

@Override
public String getMessage() {
final String toString = toString(false);

if (UtilMethods.isSet(toString)) {
return super.getMessage() + "\n" + toString;
} else {
return super.getMessage();
}
final String toString = this.toString(false);
return UtilMethods.isSet(toString)
? super.getMessage() + " - " + toString
: super.getMessage();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import com.dotcms.contenttype.model.type.ContentType;
import com.dotcms.contenttype.model.type.PageContentType;
import com.dotcms.contenttype.transform.contenttype.StructureTransformer;
import com.dotcms.exception.ExceptionUtil;
import com.dotcms.publisher.environment.bean.Environment;
import com.dotcms.repackage.javax.portlet.WindowState;
import com.dotcms.repackage.org.directwebremoting.WebContextFactory;
Expand Down Expand Up @@ -909,12 +910,19 @@ private Contentlet populateContent(Map<String, Object> contentletFormData,
return contentlet;
}

private void handleException(final Exception ae) {

if(!(ae instanceof DotContentletValidationException) && !(ae instanceof DotLanguageException)){
Logger.warnAndDebug(this.getClass(), ae.toString(), ae);
/**
* Prints more or less details of the specified Exception depending on its original cause. For
* more verbose exceptions such as {@link DotContentletValidationException} or
* {@link DotLanguageException}, all details have already made it to the log, so those are not
* required.
*
* @param exception The exception to handle.
*/
private void handleException(final Exception exception) {
if (ExceptionUtil.causedBy(exception, DotContentletValidationException.class) || ExceptionUtil.causedBy(exception, DotLanguageException.class)) {
Logger.debug(this, exception.toString(), exception);
} else {
Logger.debug(this, ae.toString(), ae);
Logger.warnAndDebug(this.getClass(), exception.toString(), exception);
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,24 @@
package com.dotmarketing.portlets.workflows.actionlet;

import com.dotcms.business.WrapInTransaction;
import com.dotcms.exception.ExceptionUtil;
import com.dotmarketing.business.APILocator;
import com.dotmarketing.exception.DotDataException;
import com.dotmarketing.exception.DotSecurityException;
import com.dotmarketing.portlets.contentlet.business.ContentletAPI;
import com.dotmarketing.portlets.contentlet.business.DotContentletValidationException;
import com.dotmarketing.portlets.contentlet.model.Contentlet;
import com.dotmarketing.portlets.contentlet.model.ContentletDependencies;
import com.dotmarketing.portlets.workflows.model.*;
import com.dotmarketing.portlets.workflows.model.WorkflowActionClassParameter;
import com.dotmarketing.portlets.workflows.model.WorkflowActionFailureException;
import com.dotmarketing.portlets.workflows.model.WorkflowActionletParameter;
import com.dotmarketing.portlets.workflows.model.WorkflowProcessor;
import com.dotmarketing.portlets.workflows.model.WorkflowStep;
import com.dotmarketing.util.Logger;
import com.dotmarketing.util.UtilMethods;
import com.google.common.annotations.VisibleForTesting;

import com.liferay.portal.model.User;

import java.util.List;
import java.util.Map;

Expand Down Expand Up @@ -86,13 +91,11 @@ public void executeAction(final WorkflowProcessor processor,

Logger.debug(this,
()->"content version already saved for the contentlet: " + contentlet.getIdentifier());
} catch (Exception e) {
if (e instanceof DotContentletValidationException){
Logger.warnAndDebug(this.getClass(),e.getMessage(),e);
} else{
Logger.error(this.getClass(),e.getMessage(),e);
}
throw new WorkflowActionFailureException(e.getMessage(),e);
} catch (final Exception e) {
if (!(e instanceof DotContentletValidationException)) {
Logger.error(this.getClass(), ExceptionUtil.getErrorMessage(e), e);
}
throw new WorkflowActionFailureException(ExceptionUtil.getErrorMessage(e), e);
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package com.dotmarketing.portlets.workflows.business;

import static com.dotmarketing.portlets.contentlet.util.ContentletUtil.isHost;

import com.dotcms.ai.workflow.DotEmbeddingsActionlet;
import com.dotcms.ai.workflow.OpenAIAutoTagActionlet;
import com.dotcms.ai.workflow.OpenAIContentPromptActionlet;
Expand Down Expand Up @@ -140,6 +138,12 @@
import com.liferay.portal.model.User;
import com.liferay.util.StringPool;
import io.vavr.control.Try;
import org.apache.commons.lang.time.StopWatch;
import org.apache.commons.lang3.concurrent.ConcurrentUtils;
import org.elasticsearch.search.query.QueryPhaseExecutionException;
import org.osgi.framework.BundleContext;

import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
Expand Down Expand Up @@ -168,11 +172,8 @@
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import javax.annotation.Nullable;
import org.apache.commons.lang.time.StopWatch;
import org.apache.commons.lang3.concurrent.ConcurrentUtils;
import org.elasticsearch.search.query.QueryPhaseExecutionException;
import org.osgi.framework.BundleContext;

import static com.dotmarketing.portlets.contentlet.util.ContentletUtil.isHost;

/**
* Implementation class for {@link WorkflowAPI}.
Expand Down Expand Up @@ -2402,12 +2403,10 @@ private WorkflowProcessor fireWorkflowPreCheckin(final Contentlet contentlet, fi
@WrapInTransaction
@Override
public void fireWorkflowPostCheckin(final WorkflowProcessor processor) throws DotDataException,DotWorkflowException{

try{
if(!processor.inProcess()){
return;
}

processor.getContentlet().setActionId(processor.getAction().getId());

final List<WorkflowActionClass> actionClasses = processor.getActionClasses();
Expand All @@ -2417,7 +2416,7 @@ public void fireWorkflowPostCheckin(final WorkflowProcessor processor) throws Do
final WorkFlowActionlet actionlet = actionClass.getActionlet();
final Map<String,WorkflowActionClassParameter> params = findParamsForActionClass(actionClass);
if (processor.isRunningBulk() && actionlet instanceof BatchAction) {
final BatchAction batchable = BatchAction.class.cast(actionlet);
final BatchAction batchable = (BatchAction) actionlet;
batchable.preBatchAction(processor, actionClass, params);
//gather data to run in batch later
} else {
Expand Down Expand Up @@ -2445,14 +2444,13 @@ public void fireWorkflowPostCheckin(final WorkflowProcessor processor) throws Do
Logger.info(this, "Added contentlet to the index at the end of the workflow execution, dependencies: " + includeDependencies);
}
}
} catch(Exception e) {

/* Show a more descriptive error of what caused an issue here */
Logger.error(WorkflowAPIImpl.class, "There was an unexpected error: " + e.getMessage());
Logger.debug(WorkflowAPIImpl.class, e.getMessage(), e);
throw new DotWorkflowException(e.getMessage(), e);
} catch (final Exception e) {
final String errorMsg = String.format("Failed to fire Workflow Action '%s' [%s]: %s",
processor.getAction().getName(), processor.getAction().getId(), ExceptionUtil.getErrorMessage(e));
Logger.error(WorkflowAPIImpl.class, errorMsg);
Logger.debug(WorkflowAPIImpl.class, errorMsg, e);
throw new DotWorkflowException(ExceptionUtil.getErrorMessage(e), e);
} finally {

// not matters what we need to reindex in deferred the index just in case.
if (UtilMethods.isSet(processor.getContentlet()) &&
UtilMethods.isSet(processor.getContentlet().getIdentifier())) {
Expand Down
48 changes: 25 additions & 23 deletions dotCMS/src/main/java/com/dotmarketing/util/Logger.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,29 @@
*/
package com.dotmarketing.util;

import java.io.File;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import com.dotcms.rest.api.v1.system.logger.ChangeLoggerLevelEvent;
import com.liferay.util.StringPool;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.velocity.servlet.VelocityServlet;
import org.apache.velocity.tools.view.tools.ViewTool;
import com.dotcms.business.expiring.ExpiringMap;
import com.dotcms.business.expiring.ExpiringMapBuilder;
import com.dotcms.exception.ExceptionUtil;
import com.dotcms.rest.api.v1.system.logger.ChangeLoggerLevelEvent;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.RemovalCause;
import com.github.benmanes.caffeine.cache.RemovalListener;
import com.google.common.base.Objects;
import com.liferay.util.StringPool;
import io.vavr.Lazy;
import io.vavr.control.Try;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.velocity.servlet.VelocityServlet;
import org.apache.velocity.tools.view.tools.ViewTool;

import java.io.File;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
* @author David Torres
Expand Down Expand Up @@ -293,20 +294,21 @@ public static void warnAndDebug(Class cl, String message, Throwable ex) {
* @param message
* @param ex
*/
public static void warnAndDebug(String clazz, String message, Throwable ex) {
org.apache.logging.log4j.Logger logger = loadLogger(clazz);
public static void warnAndDebug(final String clazz, final String message, final Throwable ex) {
final org.apache.logging.log4j.Logger logger = loadLogger(clazz);
logger.warn(message);
try {
logger.warn(message);
// we don't want to eat the real message - EVER
logger.warn(ex.getMessage());
try {
// Never swallow the original message, EVER! Unless it's the same as the current one
if (!message.equalsIgnoreCase(ex.getMessage())) {
logger.warn(ex.getMessage());
}
if (UtilMethods.isSet(ex.getStackTrace()) && null != ex.getStackTrace()[0]) {
logger.warn(ex.getStackTrace()[0]);
} catch (Throwable t) {
logger.debug(() -> t);
}
logger.debug(() -> message, ex);
} catch (java.lang.IllegalStateException e) {
ex.printStackTrace();
} catch (final IllegalStateException e) {
logger.warn(String.format("Failed to log warnAndDebug message: %s",
ExceptionUtil.getErrorMessage(e)));
}
}

Expand Down
Loading

0 comments on commit 3977a3b

Please sign in to comment.