/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2013 by Pentaho : http://www.pentaho.com
*
*******************************************************************************
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************/
package org.pentaho.di.core.logging;
import org.pentaho.di.core.Const;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import org.pentaho.di.core.util.EnvUtil;
public class LogMessage implements LogMessageInterface {
private String logChannelId;
private String message;
private String subject;
private Object[] arguments;
private LogLevel level;
private String copy;
/**
* Backward compatibility : no registry used, just log the subject as part of the message
*
* @param message
* @param logChannelId
*/
public LogMessage( String subject, LogLevel level ) {
this.subject = subject;
this.level = level;
this.message = null;
this.logChannelId = null;
}
/**
* Recommended use :
*
* @param message
* @param logChannelId
* @param level
* the log level
*/
public LogMessage( String message, String logChannelId, LogLevel level ) {
this.message = message;
this.logChannelId = logChannelId;
this.level = level;
lookupSubject();
}
public LogMessage( String message, String logChannelId, Object[] arguments, LogLevel level ) {
this.message = message;
this.logChannelId = logChannelId;
this.arguments = arguments;
this.level = level;
lookupSubject();
}
private void lookupSubject() {
// Derive the subject from the registry
//
LoggingObjectInterface loggingObject = LoggingRegistry.getInstance().getLoggingObject( logChannelId );
boolean detailedLogTurnOn = "Y".equals( EnvUtil.getSystemProperty( Const.KETTLE_LOG_MARK_MAPPINGS ) ) ? true : false;
if ( loggingObject != null ) {
if ( !detailedLogTurnOn ) {
subject = loggingObject.getObjectName();
} else {
subject = getDetailedSubject( loggingObject );
}
copy = loggingObject.getObjectCopy();
}
}
/**
* @param loggingObject
* @return
*/
private String getDetailedSubject( LoggingObjectInterface loggingObject ) {
List<String> subjects = getSubjectTree( loggingObject );
return subjects.size() > 1 ? formatDetailedSubject( subjects ) : subjects.get( 0 );
}
/**
* @param loggingObject
*/
private List<String> getSubjectTree( LoggingObjectInterface loggingObject ) {
List<String> subjects = new ArrayList<String>();
while ( loggingObject != null ) {
subjects.add( loggingObject.getObjectName() );
loggingObject = loggingObject.getParent();
}
return subjects;
}
/**
* @param string
* @param subjects
* @return
*/
private String formatDetailedSubject( List<String> subjects ) {
StringBuilder string = new StringBuilder();
int currentStep = 0;
int rootStep = subjects.size() - 1;
for ( int i = rootStep - 1; i > currentStep; i-- ) {
string.append( "[" ).append( subjects.get( i ) ).append( "]" ).append( "." );
}
string.append( subjects.get( currentStep ) );
return string.toString();
}
@Override
@Deprecated
public String toString() {
if ( message == null ) {
return subject;
}
if ( arguments != null && arguments.length > 0 ) {
return subject + " - " + MessageFormat.format( message, arguments );
} else {
return subject + " - " + message;
}
}
@Override
public LogLevel getLevel() {
return level;
}
@Deprecated
public void setLevel( LogLevel level ) {
this.level = level;
}
/**
* @return The formatted message.
*/
@Override
public String getMessage() {
if ( arguments != null && arguments.length > 0 ) {
return MessageFormat.format( message, arguments );
} else {
return message;
}
}
/**
* @param message
* the message to set
*/
@Deprecated
public void setMessage( String message ) {
this.message = message;
}
/**
* @return the subject
*/
@Override
public String getSubject() {
return subject;
}
/**
* @param subject
* the subject to set
*/
@Deprecated
public void setSubject( String subject ) {
this.subject = subject;
}
/**
* @return the logChannelId
*/
@Override
public String getLogChannelId() {
return logChannelId;
}
/**
* @param logChannelId
* the logChannelId to set
*/
@Deprecated
public void setLogChannelId( String logChannelId ) {
this.logChannelId = logChannelId;
}
/**
* @return the arguments
*/
@Override
public Object[] getArguments() {
return arguments;
}
/**
* @param arguments
* the arguments to set
*/
@Deprecated
public void setArguments( Object[] arguments ) {
this.arguments = arguments;
}
public boolean isError() {
return level.isError();
}
@Override
public String getCopy() {
return copy;
}
public void setCopy( String copy ) {
this.copy = copy;
}
}