/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.log;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import org.jdom.Document;
import org.jdom.Element;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import com.enonic.cms.core.security.user.UserEntity;
import com.enonic.cms.core.servlet.ServletRequestAccessor;
import com.enonic.cms.core.time.TimeService;
import com.enonic.cms.store.dao.LogEntryDao;
import com.enonic.cms.store.dao.UserDao;
@Service("logService")
public class LogServiceImpl
implements LogService
{
@Autowired
private LogEntryDao logEntryDao;
@Autowired
private TimeService timeService;
@Autowired
private UserDao userDao;
private static final int PATH_FIELD_MAX_LENGTH = 256;
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public LogEntryResultSet getLogEntries( LogEntrySpecification spec, String orderBy, final int count, final int index )
{
if ( spec == null )
{
throw new IllegalArgumentException( "Given LogEntrySpecification cannot be null" );
}
List<LogEntryKey> keys = logEntryDao.findBySpecification( spec, orderBy );
final int queryResultTotalSize = keys.size();
if ( index > queryResultTotalSize )
{
return (LogEntryResultSet) new LogEntryResultSetNonLazy( index ).addError(
"Index greater than result count: " + index + " greater than " + queryResultTotalSize );
}
int toIndex = Math.min( queryResultTotalSize, count + index );
LogEntryResultSet resultSet =
new LogEntryResultSetLazyFetcher( new LogEntryEntityFetcherImpl( logEntryDao ), keys.subList( index, toIndex ), index,
queryResultTotalSize );
return resultSet;
}
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public LogEntryKey storeNew( StoreNewLogEntryCommand command )
{
Assert.notNull( command.getType(), "type cannot be nul" );
Assert.notNull( command.getUser(), "user cannot be nul" );
Assert.notNull( command.getTitle(), "title cannot be nul" );
HttpServletRequest httpRequest = ServletRequestAccessor.getRequest();
String clientInetAddress = null;
if ( httpRequest != null )
{
clientInetAddress = httpRequest.getRemoteAddr();
}
UserEntity user = userDao.findByKey( command.getUser() );
LogEntryEntity logEntry = new LogEntryEntity();
logEntry.setType( command.getType().asInteger() );
logEntry.setTimestamp( timeService.getNowAsDateTime().toDate() );
logEntry.setInetAddress( clientInetAddress );
logEntry.setUser( user );
if ( command.getTable() != null )
{
logEntry.setTableKey( command.getTable().asInteger() );
logEntry.setKeyValue( command.getTableKeyValue() );
}
if ( command.getSite() != null )
{
logEntry.setSite( command.getSite() );
}
logEntry.setTitle( command.getTitle() );
if ( command.getPath() != null )
{
logEntry.setPath( enshurePathWithinBoundary( command.getPath() ) );
}
if ( command.getXmlData() != null )
{
logEntry.setXmlData( command.getXmlData() );
}
else
{
logEntry.setXmlData( createEmptyXmlData() );
}
logEntryDao.storeNew( logEntry );
return logEntry.getKey();
}
private String enshurePathWithinBoundary( String suggestedPath )
{
String path = suggestedPath;
if ( StringUtils.isNotEmpty( path ) && path.length() > PATH_FIELD_MAX_LENGTH )
{
String pathTooLongEnding = " ...";
path = path.substring( 0, PATH_FIELD_MAX_LENGTH - pathTooLongEnding.length() );
path = path + pathTooLongEnding;
}
return path;
}
private Document createEmptyXmlData()
{
Element root = new Element( "data" );
return new Document( root );
}
}