/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.vertical.adminweb;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.StringTokenizer;
import javax.mail.MessagingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.dom.DOMSource;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import com.enonic.esl.containers.ExtendedMap;
import com.enonic.esl.containers.MultiValueMap;
import com.enonic.esl.util.Base64Util;
import com.enonic.esl.util.DateUtil;
import com.enonic.esl.xml.XMLTool;
import com.enonic.vertical.engine.VerticalEngineException;
import com.enonic.vertical.engine.XDG;
import com.enonic.cms.framework.xml.XMLDocument;
import com.enonic.cms.core.CmsDateAndTimeFormats;
import com.enonic.cms.core.log.LogType;
import com.enonic.cms.core.log.Table;
import com.enonic.cms.core.security.user.User;
import com.enonic.cms.core.service.AdminService;
import com.enonic.cms.core.structure.menuitem.MenuItemKey;
public class LogHandlerServlet
extends AdminHandlerBaseServlet
{
public void handlerBrowse( HttpServletRequest request, HttpServletResponse response, HttpSession session, AdminService admin,
ExtendedMap formItems )
throws VerticalAdminException
{
try
{
User user = securityService.getLoggedInAdminConsoleUser();
MultiValueMap adminParams = new MultiValueMap();
ExtendedMap transformParams = new ExtendedMap();
// select log entries for only one single entity
Document pathXML;
int menuKey = -1;
boolean popup;
if ( formItems.containsKey( "tablekeyvalue" ) )
{
popup = true;
int tableKeyValue = formItems.getInt( "tablekeyvalue" );
adminParams.put( "@tablekeyvalue", tableKeyValue );
transformParams.putInt( "tablekeyvalue", tableKeyValue );
Table tableKey = Table.parse( formItems.getInt( "tablekey" ) );
adminParams.put( "@tablekey", tableKey.asInteger() );
transformParams.putInt( "tablekey", tableKey.asInteger() );
switch ( tableKey )
{
case CONTENT:
int categoryKey = admin.getCategoryKey( tableKeyValue );
pathXML = admin.getSuperCategoryNames( categoryKey, false, true ).getAsDOMDocument();
break;
case MENUITEM:
menuKey = admin.getMenuKeyByMenuItem( new MenuItemKey( tableKeyValue ) );
transformParams.putInt( "parentkey", admin.getParentMenuItemKey( tableKeyValue ) );
pathXML = admin.getMenu( user, menuKey, false ).getAsDOMDocument();
break;
default:
pathXML = null;
}
}
else if ( formItems.containsKey( "userkey" ) )
{
popup = true;
String userKey = formItems.getString( "userkey" );
adminParams.put( "@userkey", userKey );
transformParams.put( "userkey", userKey );
/*
if (siteKey < 0) {
domainKey = formItems.getInt("selecteddomainkey", -1);
transformParams.putInt("selecteddomainkey", domainKey);
transformParams.put("domainname", admin.getDomainName(domainKey));
}
*/
pathXML = null;
}
else
{
popup = false;
pathXML = null;
}
int fromIdx = formItems.getInt( "from", 0 );
Source xmlSource;
if ( formItems.containsKey( "key" ) )
{
Document doc = admin.getLogEntry( formItems.getString( "key" ) ).getAsDOMDocument();
Element logentryElem = XMLTool.getFirstElement( doc.getDocumentElement() );
Element dataElem = XMLTool.getElement( logentryElem, "data" );
if ( "true".equals( dataElem.getAttribute( "deflated" ) ) )
{
// unzip aggregated entries
byte[] docBytes = Base64Util.decode( XMLTool.getElementText( dataElem ) );
Document tempDoc = XMLTool.deflatedBytesToDocument( docBytes );
Table tableKey = Table.parse( Integer.valueOf( logentryElem.getAttribute( "tablekey" ) ) );
transformParams.putInt( "tablekey", tableKey.asInteger() );
int tableKeyValue = Integer.valueOf( logentryElem.getAttribute( "tablekeyvalue" ) );
transformParams.putInt( "tablekeyvalue", tableKeyValue );
switch ( tableKey )
{
case CONTENT:
int categoryKey = admin.getCategoryKey( tableKeyValue );
XMLTool.mergeDocuments( tempDoc, admin.getSuperCategoryNames( categoryKey, false, true ).getAsDOMDocument(),
true );
break;
case MENUITEM:
menuKey = admin.getMenuKeyByMenuItem( new MenuItemKey( tableKeyValue ) );
transformParams.putInt( "parentkey", admin.getParentMenuItemKey( tableKeyValue ) );
XMLTool.mergeDocuments( tempDoc, admin.getMenu( user, menuKey, false ).getAsDOMDocument(), true );
break;
}
xmlSource = new DOMSource( tempDoc );
}
else
{
xmlSource = new DOMSource( XMLTool.createDocument( "logentries" ) );
}
transformParams.put( "key", formItems.containsKey( "key" ) );
}
else
{
if ( formItems.containsKey( "filter" ) )
{
StringTokenizer filter = new StringTokenizer( formItems.getString( "filter" ), ";" );
while ( filter.hasMoreTokens() )
{
String token = filter.nextToken();
String id = token.substring( 0, Math.min( 2, token.length() ) );
if ( "si".equals( id ) )
{
if ( token.charAt( 2 ) == 'a' )
{
adminParams.put( "@menukey", null );
}
else
{
int key = Integer.valueOf( token.substring( 2 ) );
adminParams.put( "@menukey", key );
}
}
else if ( "ty".equals( id ) )
{
int key = Integer.valueOf( token.substring( 2 ) );
adminParams.put( "@typekey", key );
}
else if ( "ta".equals( id ) )
{
int key = Integer.valueOf( token.substring( 2 ) );
adminParams.put( "@tablekey", key );
}
else if ( "fr".equals( id ) )
{
Date from = DateUtil.parseDate( token.substring( 2 ) );
if ( adminParams.containsKey( "@timestamp" ) )
{
Object to = adminParams.get( "@timestamp" );
adminParams.remove( "@timestamp" );
adminParams.put( "@timestamp", from, XDG.OPERATOR_RANGE );
adminParams.put( "@timestamp", to, XDG.OPERATOR_RANGE );
}
else
{
adminParams.put( "@timestamp", from, XDG.OPERATOR_GREATER_OR_EQUAL );
}
}
else if ( "to".equals( id ) )
{
Date to = DateUtil.parseDate( token.substring( 2 ) );
if ( adminParams.containsKey( "@timestamp" ) )
{
adminParams.put( "@timestamp", to, XDG.OPERATOR_RANGE );
}
else
{
adminParams.put( "@timestamp", to, XDG.OPERATOR_LESS );
}
}
}
transformParams.put( "filter", formItems.getString( "filter" ) );
}
XMLDocument xmlData = admin.getLogEntries( user, adminParams, fromIdx, 20, false );
if ( pathXML != null )
{
Document doc = xmlData.getAsDOMDocument();
XMLTool.mergeDocuments( doc, pathXML, true );
xmlSource = new DOMSource( doc );
}
else
{
xmlSource = xmlData.getAsDOMSource();
}
}
Source xslSource = AdminStore.getStylesheet( session, "log_browse.xsl" );
// Parameters
transformParams.put( "page", formItems.getString( "page" ) );
transformParams.put( "from", String.valueOf( fromIdx ) );
transformParams.putBoolean( "popup", popup );
addAccessLevelParameters( user, transformParams );
addCommonParameters( admin, user, request, transformParams, -1, menuKey );
transformXML( session, response.getWriter(), xmlSource, xslSource, transformParams );
}
catch ( IOException ioe )
{
String message = "Failed to get response writer: %t";
VerticalAdminLogger.errorAdmin(message, ioe );
}
catch ( TransformerException te )
{
String message = "XSLT error: %t";
VerticalAdminLogger.errorAdmin(message, te );
}
catch ( Exception pe )
{
String message = "Failed to parse a date: %t";
VerticalAdminLogger.errorAdmin(message, pe );
}
}
public void handlerCustom( HttpServletRequest request, HttpServletResponse response, HttpSession session, AdminService admin,
ExtendedMap formItems, String operation, ExtendedMap parameters, User user, Document verticalDoc )
throws VerticalAdminException, VerticalEngineException, MessagingException, IOException
{
if ( operation.equals( "view" ) )
{
String key = formItems.getString( "key" );
handlerView( request, response, session, admin, formItems, key, parameters, user );
}
else if ( operation.equals( "filter" ) )
{
handlerFilter( request, response, session, admin, formItems, parameters, user, verticalDoc );
}
else
{
super.handlerCustom( request, response, session, admin, formItems, operation, parameters, user, verticalDoc );
}
}
private void handlerView( HttpServletRequest request, HttpServletResponse response, HttpSession session, AdminService admin,
ExtendedMap formItems, String key, ExtendedMap parameters, User user )
throws VerticalAdminException, VerticalEngineException
{
Document doc = admin.getLogEntry( key ).getAsDOMDocument();
Element logentryElem = XMLTool.getFirstElement( doc.getDocumentElement() );
// Lookup host name
String address = logentryElem.getAttribute( "inetaddress" );
if ( address != null && address.length() > 0 )
{
try
{
InetAddress inetAddress = InetAddress.getByName( address );
String host = inetAddress.getHostName();
if ( host != null && host.length() > 0 )
{
logentryElem.setAttribute( "host", host );
}
}
catch ( UnknownHostException uhe )
{
String message = "Failed to get host name of ip address \"{0}\": %t";
VerticalAdminLogger.warn(message, address, uhe );
}
}
// select log entries for only one single entity
Document pathXML;
int menuKey = -1;
boolean popup;
if ( formItems.containsKey( "tablekeyvalue" ) )
{
popup = true;
int tableKeyValue = formItems.getInt( "tablekeyvalue" );
parameters.putInt( "tablekeyvalue", tableKeyValue );
Table tableKey = Table.parse( formItems.getInt( "tablekey" ) );
parameters.putInt( "tablekey", tableKey.asInteger() );
switch ( tableKey )
{
case CONTENT:
int categoryKey = admin.getCategoryKey( tableKeyValue );
pathXML = admin.getSuperCategoryNames( categoryKey, false, true ).getAsDOMDocument();
break;
case MENUITEM:
menuKey = admin.getMenuKeyByMenuItem( new MenuItemKey( tableKeyValue ) );
parameters.putInt( "parentkey", admin.getParentMenuItemKey( tableKeyValue ) );
pathXML = admin.getMenu( user, menuKey, false ).getAsDOMDocument();
break;
default:
pathXML = null;
}
}
else if ( formItems.containsKey( "userkey" ) )
{
popup = true;
String userKey = formItems.getString( "userkey" );
parameters.put( "userkey", userKey );
pathXML = null;
}
else
{
popup = false;
pathXML = null;
}
parameters.put( "popup", String.valueOf( popup ) );
if ( pathXML != null )
{
XMLTool.mergeDocuments( doc, pathXML, true );
}
// If type is entity create, update, remove or read include entity xml
LogType typeKey = LogType.parse( Integer.parseInt( logentryElem.getAttribute( "typekey" ) ) );
if ( typeKey == LogType.ENTITY_CREATED || typeKey == LogType.ENTITY_UPDATED || typeKey == LogType.ENTITY_OPENED )
{
Table tableKey = Table.parse( Integer.parseInt( logentryElem.getAttribute( "tablekey" ) ) );
int tableKeyValue = Integer.parseInt( logentryElem.getAttribute( "tablekeyvalue" ) );
switch ( tableKey )
{
case CONTENT:
XMLTool.mergeDocuments( doc, admin.getContent( user, tableKeyValue, 0, 0, 0 ).getAsDOMDocument() );
break;
case MENUITEM:
XMLTool.mergeDocuments( doc, admin.getMenuItem( user, tableKeyValue, false ).getAsDOMDocument() );
break;
}
}
addCommonParameters( admin, user, request, parameters, -1, menuKey );
DOMSource xmlSource = new DOMSource( doc );
// Stylesheet
Source xslSource = AdminStore.getStylesheet( session, "log_view.xsl" );
try
{
transformXML( session, response.getWriter(), xmlSource, xslSource, parameters );
}
catch ( TransformerException te )
{
String message = "Failed to transform xml: %t";
VerticalAdminLogger.errorAdmin(message, te );
}
catch ( IOException ioe )
{
String message = "Failed to get response writer: %t";
VerticalAdminLogger.errorAdmin(message, ioe );
}
}
private void handlerFilter( HttpServletRequest request, HttpServletResponse response, HttpSession session, AdminService admin,
ExtendedMap formItems, ExtendedMap parameters, User user, Document verticalDoc )
throws VerticalAdminException
{
Document menusDoc = admin.getMenusForAdmin( user ).getAsDOMDocument();
XMLTool.mergeDocuments( verticalDoc, menusDoc, true );
DOMSource xmlSource = new DOMSource( verticalDoc );
Source xslSource = AdminStore.getStylesheet( session, "log_filter.xsl" );
// Parameters
parameters.put( "currentdate", CmsDateAndTimeFormats.printAs_STORE_DATE( ( new Date() ) ) );
parameters.put( "from", formItems.getInt( "from", 0 ) );
if ( formItems.containsKey( "filter" ) )
{
parameters.put( "filter", formItems.get( "filter" ) );
}
addCommonParameters( admin, user, request, parameters, -1, -1 );
try
{
transformXML( session, response.getWriter(), xmlSource, xslSource, parameters );
}
catch ( IOException ioe )
{
String message = "Failed to get writer: %t";
VerticalAdminLogger.errorAdmin(message, ioe );
}
catch ( TransformerException te )
{
String message = "Failed to transform filter form: %t";
VerticalAdminLogger.errorAdmin(message, te );
}
}
}