/*
* Copyright (C) 2015 maartenl
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package awesomeness.vaadin;
import awesomeness.vaadin.utils.Utilities;
import com.vaadin.addon.jpacontainer.JPAContainer;
import com.vaadin.data.Container;
import com.vaadin.data.Item;
import com.vaadin.data.Property;
import com.vaadin.data.util.filter.And;
import com.vaadin.data.util.filter.Compare;
import com.vaadin.server.Sizeable;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.DateField;
import com.vaadin.ui.FormLayout;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Panel;
import com.vaadin.ui.Table;
import com.vaadin.ui.TextArea;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.util.Date;
import java.util.logging.Logger;
import mmud.database.entities.game.Admin;
import mmud.database.entities.game.Commandlog;
import mmud.database.entities.game.Log;
import mmud.database.entities.game.Systemlog;
import mmud.rest.services.LogBean;
/**
*
* @author maartenl
*/
public class Logs extends VerticalLayout
{
private static final Logger logger = Logger.getLogger(Logs.class.getName());
private final CheckBox filterOnDeputyMessages;
private final Table logsTable;
private final Table chatlogsTable;
private final Table systemlogsTable;
private Date initialLogDate;
private final Admin currentUser;
private final LogBean logBean;
Logs(final Admin currentUser, final LogBean logBean)
{
initialLogDate = Date.from(LocalDate.now().plusYears(10).atStartOfDay().toInstant(ZoneOffset.UTC));
this.currentUser = currentUser;
this.logBean = logBean;
final JPAContainer<Log> logattributes = Utilities.getJPAContainer(Log.class);
final Container.Filter filter = new Compare.Equal("deputy",
true);
final JPAContainer<Commandlog> chatlogattributes = Utilities.getJPAContainer(Commandlog.class);
final JPAContainer<Systemlog> systemlogattributes = Utilities.getJPAContainer(Systemlog.class);
Panel logsearchPanel = new Panel("Game Logs");
addComponent(logsearchPanel);
HorizontalLayout logsearchLayout = new HorizontalLayout();
logsearchPanel.setContent(logsearchLayout);
filterOnDeputyMessages = new CheckBox("Show only dep messages");
filterOnDeputyMessages.setValue(true);
filterOnDeputyMessages.addValueChangeListener(new Property.ValueChangeListener()
{
{
logattributes.addContainerFilter(filter);
}
@Override
public void valueChange(Property.ValueChangeEvent event)
{
if (event.getProperty().getValue().equals(Boolean.TRUE))
{
logattributes.addContainerFilter(filter);
} else
{
logattributes.removeContainerFilter(filter);
}
}
});
logsearchLayout.addComponent(filterOnDeputyMessages);
// Create a DateField with the default style
DateField logdateField = new DateField();
logsearchLayout.addComponent(logdateField);
logdateField.addValueChangeListener(new Property.ValueChangeListener()
{
private Container.Filter logFilter = createFilter("creation", initialLogDate);
{
logattributes.addContainerFilter(logFilter);
}
@Override
public void valueChange(Property.ValueChangeEvent event)
{
Date thedate = (Date) event.getProperty().getValue();
logBean.writeDeputyLog(currentUser, "Consulted game log of " + thedate + ".");
logattributes.removeContainerFilter(logFilter);
logFilter = createFilter("creation", thedate);
logattributes.addContainerFilter(logFilter);
}
});
Panel logtablePanel = new Panel();
addComponent(logtablePanel);
logsTable = new Table("Game Logs", logattributes);
logsTable.setVisibleColumns("id", "name", "message", "deputy", "creation");
Utilities.setTableSize(logsTable);
logsTable.setSelectable(true);
logsTable.setImmediate(true);
logsTable.setSortAscending(false);
logsTable.setSortContainerPropertyId("creation");
logsTable.setSortEnabled(false);
logtablePanel.setContent(logsTable);
Panel addendumPanel = new Panel();
addComponent(addendumPanel);
FormLayout addendumLayout = new FormLayout();
addendumPanel.setContent(addendumLayout);
final TextArea contents = new TextArea("Addendum");
contents.setRows(15);
contents.setWidth(80, Sizeable.Unit.PERCENTAGE);
addendumLayout.addComponent(contents);
logsTable.addValueChangeListener(new Property.ValueChangeListener()
{
@Override
public void valueChange(Property.ValueChangeEvent event)
{
Object itemId = event.getProperty().getValue();
Item item = logsTable.getItem(itemId);
boolean entitySelected = item != null;
if (entitySelected && item.getItemProperty("addendum") != null)
{
contents.setValue(item.getItemProperty("addendum").toString());
} else
{
contents.setValue(null);
}
}
});
Panel chatlogsearchPanel = new Panel("Chat logs");
addComponent(chatlogsearchPanel);
HorizontalLayout chatlogsearchLayout = new HorizontalLayout();
chatlogsearchPanel.setContent(chatlogsearchLayout);
// Create a DateField with the default style
final TextField reason = new TextField("Reason");
DateField chatlogdateField = new DateField();
chatlogsearchLayout.addComponent(chatlogdateField);
chatlogdateField.addValueChangeListener(new Property.ValueChangeListener()
{
private Container.Filter logFilter = createFilter("stamp", initialLogDate);
{
chatlogattributes.addContainerFilter(logFilter);
}
@Override
public void valueChange(Property.ValueChangeEvent event)
{
Date thedate = (Date) event.getProperty().getValue();
if (reason.getValue() == null || reason.getValue().trim().equals(""))
{
thedate = initialLogDate;
logBean.writeDeputyLog(currentUser, "Tried consulting chat log of " + thedate + ", without reason given.");
} else
{
logBean.writeDeputyLog(currentUser, "Consulted chat log of " + thedate + ".", "Reason given was : " + reason.getValue());
}
chatlogattributes.removeContainerFilter(logFilter);
logFilter = createFilter("stamp", thedate);
chatlogattributes.addContainerFilter(logFilter);
}
});
reason.setWidth(80, Sizeable.Unit.PERCENTAGE);
chatlogsearchLayout.addComponent(reason);
Panel chatlogtablePanel = new Panel();
addComponent(chatlogtablePanel);
chatlogsTable = new Table("Chat Logs", chatlogattributes);
chatlogsTable.setVisibleColumns("id", "name", "command", "stamp");
Utilities.setTableSize(chatlogsTable);
chatlogsTable.setSelectable(true);
chatlogsTable.setImmediate(true);
chatlogsTable.setSortAscending(false);
chatlogsTable.setSortContainerPropertyId("stamp");
chatlogsTable.setSortEnabled(false);
chatlogtablePanel.setContent(chatlogsTable);
Panel syslogsearchPanel = new Panel("System logs");
addComponent(syslogsearchPanel);
HorizontalLayout syslogsearchLayout = new HorizontalLayout();
syslogsearchPanel.setContent(syslogsearchLayout);
// Create a DateField with the default style
DateField syslogdateField = new DateField();
syslogsearchLayout.addComponent(syslogdateField);
syslogdateField.addValueChangeListener(new Property.ValueChangeListener()
{
private Container.Filter logFilter = createFilter("millis", initialLogDate);
{
systemlogattributes.addContainerFilter(logFilter);
}
@Override
public void valueChange(Property.ValueChangeEvent event)
{
Date thedate = (Date) event.getProperty().getValue();
logBean.writeDeputyLog(currentUser, "Consulted system log of " + thedate + ".");
systemlogattributes.removeContainerFilter(logFilter);
logFilter = createFilter("millis", thedate);
systemlogattributes.addContainerFilter(logFilter);
}
});
Panel systemlogtablePanel = new Panel();
addComponent(systemlogtablePanel);
systemlogsTable = new Table("System Logs", systemlogattributes);
systemlogsTable.setVisibleColumns("id", "message", "millis", "creationdate", "sequence", "logger", "level", "class1", "method", "thread");
Utilities.setTableSize(systemlogsTable);
systemlogsTable.setSelectable(true);
systemlogsTable.setImmediate(true);
systemlogsTable.setSortAscending(false);
systemlogsTable.setSortContainerPropertyId("millis");
systemlogsTable.setSortEnabled(false);
systemlogtablePanel.setContent(systemlogsTable);
}
private Container.Filter createFilter(String dateFieldName, Date logDate2)
{
LocalDate logDate = logDate2.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
Date fromDate = Date.from(logDate.atStartOfDay().toInstant(ZoneOffset.UTC));
Date toDate = Date.from(logDate.plusDays(1).atStartOfDay().toInstant(ZoneOffset.UTC));
return new And(new Compare.GreaterOrEqual(dateFieldName,
fromDate), new Compare.LessOrEqual(dateFieldName, toDate));
}
private Container.Filter createFilter(String dateFieldName, LocalDate logDate)
{
Date fromDate = Date.from(logDate.atStartOfDay().toInstant(ZoneOffset.UTC));
Date toDate = Date.from(logDate.plusDays(1).atStartOfDay().toInstant(ZoneOffset.UTC));
return new And(new Compare.GreaterOrEqual(dateFieldName,
fromDate), new Compare.LessOrEqual(dateFieldName, toDate));
}
private Container.Filter createFilter(Date logDate)
{
long fromDate = logDate.getTime();
long toDate = fromDate + (1000 * 60 * 60 * 24);
return new And(new Compare.GreaterOrEqual("millis",
fromDate), new Compare.LessOrEqual("millis", toDate));
}
}