# Standard MO Log Table

The `com.splwg.base.api.maintenanceObject.MaintenanceLogCHandlerHelper` can be used for the Standard MO Log Table Change Handler validations.

The following standard validations are provided by this helper class:

- Log entry cannot be deleted if of type: Created, Exception, Status Transition, Status Transition Error, System, User Details.
- Validates the characteristic value possibly stored on the log entry.
- Long description or message are required, but not both.
- User details must provide long description.

The following default methods for Add are provided by this helper class:

- Log `dateTime` to system date time.
- User to current system user.
- Log sequence to next highest number.
- Status to the parent entity's status (will warn if specified input differs from parent status).

To use the validations, create an instance of the helper class in the MO Change Handler and get the validation rules from the Helper. First you must create a new Characteristic Entity in the Characteristic Entity Lookup for your object. This entity can be selected on any Characteristic Type to indicate that that characteristic type can be used in the log messages for this log. Sample code follows.

## Change Handler Sample Code

    public class OutboundCrossReferenceMessageLog_CHandler extends AbstractChangeHandler<OutboundCrossReferenceMessageLog>
    	{
    	private final MaintenanceLogCHandlerHelper helper = new MaintenanceLogCHandlerHelper<OutboundCrossReferenceMessageLog,
    	OutboundCrossReferenceMessage>(new MaintenanceObject_Id("O2-OXREFMSG"), OutboundCrossReferenceMessageLog.properties,
    	OutboundCrossReferenceMessageLog.properties.lookOnParentOutboundCrossReferenceMessage(),
    	CharacteristicEntityLookup.constants.OUTBOUND_CROSS_REFERENCE_MESSAGE_LOG);
    	public void prepareToAdd(DataTransferObject<OutboundCrossReferenceMessageLog> newDTO)
    		{
    		helper.prepareToAdd(newDTO);
    		}
    	public void prepareToChange(OutboundCrossReferenceMessageLog unchangedEntity,
    	DataTransferObject<OutboundCrossReferenceMessageLog> newDTO)
    		{
    		helper.prepareToChange(unchangedEntity, newDTO);
    		}
    	public ValidationRule[] getValidationRules()
    		{
    		return helper.getValidationRules();
    		}
    	}

## Change Handler Junit Test Code

    public void testLongDescRequiredIfLogTypeIsUserDetails()
    	{
    	startChanges();
    	OutboundCrossReferenceMessage_DTO dto = (OutboundCrossReferenceMessage_DTO) createDTO(OutboundCrossReferenceMessage.class);
    	dto.setBusinessObjectId(new BusinessObject_Id("ZZ-OXREFBO"));
    	outXrefMsgTest.setDtoData(dto);
    	OutboundCrossReferenceMessage outboundCrossReferenceMessage = dto.newEntity();
    	OutboundCrossReferenceMessageLog_DTO outboundCrossReferenceMessageLogDto1 = (OutboundCrossReferenceMessageLog_DTO)
    	createDTO(OutboundCrossReferenceMessageLog.class);
    	outboundCrossReferenceMessageLogDto1.setLogEntryType(LogEntryTypeLookup.constants.USER_DETAILS);
    	try
    		{
    		outboundCrossReferenceMessage.getLogs().add(outboundCrossReferenceMessageLogDto1, null);
    		saveChanges();
    		fail("An error should have been thrown");
    		}
    	catch (ApplicationError e)
    		{
    		verifyViolatedRule(MaintenanceLogCHandlerHelper
    		.longDescriptionIsRequiredIfLogTypeIsUserDetails
    		(OutboundCrossReferenceMessageLog.properties), e);
    		}
    	}

Parent topic: Change Handler Helpers for Maintenance Objects