package de.skuzzle.polly.core.internal.mypolly;
import java.util.Calendar;
import java.util.Date;
import org.apache.log4j.Logger;
import de.skuzzle.jeve.EventProvider;
import de.skuzzle.polly.core.Polly;
import de.skuzzle.polly.core.configuration.ConfigurationProviderImpl;
import de.skuzzle.polly.core.internal.ShutdownManagerImpl;
import de.skuzzle.polly.core.internal.commands.CommandManagerImpl;
import de.skuzzle.polly.core.internal.conversations.ConversationManagerImpl;
import de.skuzzle.polly.core.internal.formatting.FormatManagerImpl;
import de.skuzzle.polly.core.internal.httpv2.WebInterfaceManagerImpl;
import de.skuzzle.polly.core.internal.irc.IrcManagerImpl;
import de.skuzzle.polly.core.internal.mail.MailManagerImpl;
import de.skuzzle.polly.core.internal.paste.PasteServiceManagerImpl;
import de.skuzzle.polly.core.internal.persistence.PersistenceManagerV2Impl;
import de.skuzzle.polly.core.internal.plugins.PluginManagerImpl;
import de.skuzzle.polly.core.internal.roles.RoleManagerImpl;
import de.skuzzle.polly.core.internal.runonce.RunOnceManagerImpl;
import de.skuzzle.polly.core.internal.status.StatusManagerImpl;
import de.skuzzle.polly.core.internal.users.UserManagerImpl;
import de.skuzzle.polly.core.parser.InputParser;
import de.skuzzle.polly.core.parser.InputScanner;
import de.skuzzle.polly.core.parser.Position;
import de.skuzzle.polly.core.parser.ast.Identifier;
import de.skuzzle.polly.core.parser.ast.declarations.Declaration;
import de.skuzzle.polly.core.parser.ast.declarations.Namespace;
import de.skuzzle.polly.core.parser.ast.expressions.Expression;
import de.skuzzle.polly.core.parser.ast.expressions.literals.DateLiteral;
import de.skuzzle.polly.core.parser.ast.expressions.literals.Literal;
import de.skuzzle.polly.core.parser.ast.visitor.ASTTraversalException;
import de.skuzzle.polly.core.parser.ast.visitor.ExecutionVisitor;
import de.skuzzle.polly.core.parser.ast.visitor.ParentSetter;
import de.skuzzle.polly.core.parser.ast.visitor.resolving.TypeResolver;
import de.skuzzle.polly.core.parser.problems.ProblemReporter;
import de.skuzzle.polly.core.parser.problems.SimpleProblemReporter;
import de.skuzzle.polly.core.util.TypeMapper;
import de.skuzzle.polly.sdk.AbstractDisposable;
import de.skuzzle.polly.sdk.CommandManager;
import de.skuzzle.polly.sdk.Configuration;
import de.skuzzle.polly.sdk.ConfigurationProvider;
import de.skuzzle.polly.sdk.ConversationManager;
import de.skuzzle.polly.sdk.FormatManager;
import de.skuzzle.polly.sdk.IrcManager;
import de.skuzzle.polly.sdk.MailManager;
import de.skuzzle.polly.sdk.MyPolly;
import de.skuzzle.polly.sdk.PersistenceManagerV2;
import de.skuzzle.polly.sdk.PluginManager;
import de.skuzzle.polly.sdk.RunOnceManager;
import de.skuzzle.polly.sdk.StatusManager;
import de.skuzzle.polly.sdk.Types;
import de.skuzzle.polly.sdk.User;
import de.skuzzle.polly.sdk.UserManager;
import de.skuzzle.polly.sdk.UtilityManager;
import de.skuzzle.polly.sdk.eventlistener.GenericEvent;
import de.skuzzle.polly.sdk.eventlistener.GenericListener;
import de.skuzzle.polly.sdk.exceptions.DisposingException;
import de.skuzzle.polly.sdk.httpv2.WebinterfaceManager;
import de.skuzzle.polly.sdk.paste.PasteServiceManager;
import de.skuzzle.polly.sdk.roles.RoleManager;
import de.skuzzle.polly.sdk.time.DateUtils;
import de.skuzzle.polly.sdk.time.Time;
/**
*
* @author Simon
* @version 27.07.2011 ae73250
*/
public class MyPollyImpl extends AbstractDisposable implements MyPolly {
private final static Logger logger = Logger.getLogger(MyPollyImpl.class.getName());
private final static String[] DAYS = {"montag", "dienstag", "mittwoch",
"donnerstag", "freitag", "samstag", "sonntag"};
private CommandManagerImpl commandManager;
private IrcManagerImpl ircManager;
private PluginManagerImpl pluginManager;
private ConfigurationProviderImpl configProvider;
private PersistenceManagerV2Impl persistence;
private UserManagerImpl userManager;
private FormatManagerImpl formatManager;
private ConversationManagerImpl conversationManager;
private ShutdownManagerImpl shutdownManager;
private Date startTime;
private PasteServiceManagerImpl pasteManager;
private MailManagerImpl mailManager;
private RoleManagerImpl roleManager;
private WebInterfaceManagerImpl webInterfaceManager;
private RunOnceManagerImpl runOnceManager;
private EventProvider eventProvider;
private final StatusManager statusManager;
public MyPollyImpl(CommandManagerImpl cmdMngr,
IrcManagerImpl ircMngr,
PluginManagerImpl plgnMngr,
ConfigurationProviderImpl configProviderImpl,
PersistenceManagerV2Impl pMngr,
UserManagerImpl usrMngr,
FormatManagerImpl fmtMngr,
ConversationManagerImpl convMngr,
ShutdownManagerImpl shutdownManager,
PasteServiceManagerImpl pasteManager,
MailManagerImpl mailManager,
RoleManagerImpl roleManager,
WebInterfaceManagerImpl webInterfaceManager,
RunOnceManagerImpl runOnceManager,
EventProvider eventProvider) {
this.commandManager = cmdMngr;
this.ircManager = ircMngr;
this.pluginManager = plgnMngr;
this.configProvider = configProviderImpl;
this.persistence = pMngr;
this.userManager = usrMngr;
this.formatManager = fmtMngr;
this.conversationManager = convMngr;
this.shutdownManager = shutdownManager;
this.pasteManager = pasteManager;
this.startTime = Time.currentTime();
this.mailManager = mailManager;
this.roleManager = roleManager;
this.webInterfaceManager = webInterfaceManager;
this.runOnceManager = runOnceManager;
this.statusManager = new StatusManagerImpl(this);
}
@Override
public Types parse(String value) {
final User executor = this.users().getAdmin();
final ProblemReporter reporter = new SimpleProblemReporter();
final InputScanner is = new InputScanner(value);
final InputParser ip = new InputParser(is, reporter);
is.setSkipWhiteSpaces(true);
try {
final Expression exp = ip.parseSingleExpression();
exp.visit(new ParentSetter());
final String nsName = executor.getCurrentNickName() == null
? executor.getName()
: executor.getCurrentNickName();
final Namespace ns = Namespace.forName(nsName);
final Namespace workingNs = ns.enter();
int m = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
workingNs.declare(new Declaration(Position.NONE, new Identifier("morgen"),
new DateLiteral(Position.NONE, DateUtils.getDayDate(m + 1))));
workingNs.declare(new Declaration(Position.NONE, new Identifier("übermorgen"),
new DateLiteral(Position.NONE, DateUtils.getDayDate(m + 2))));
int start = Calendar.MONDAY;
for (String day : DAYS) {
workingNs.declare(new Declaration(Position.NONE, new Identifier(day),
new DateLiteral(Position.NONE, DateUtils.getDayDate(start++))));
}
// resolve types
TypeResolver.resolveAST(exp, workingNs, reporter);
final ExecutionVisitor exec = new ExecutionVisitor(ns, workingNs, reporter);
exp.visit(exec);
final Literal result = exec.getSingleResult();
return TypeMapper.literalToTypes(result);
} catch (ASTTraversalException e) {
logger.warn("", e);
// ignore the exception, just use plain value which was submitted
return new Types.StringType(value);
}
}
@Override
public StatusManager status() {
return this.statusManager;
}
@Override
public WebinterfaceManager webInterface() {
return this.webInterfaceManager;
}
@Override
public RunOnceManager runOnce() {
return this.runOnceManager;
}
@Override
public IrcManager irc() {
return this.ircManager;
}
@Override
public String getPollyVersion() {
return Polly.class.getPackage().getImplementationVersion();
}
@Override
public PersistenceManagerV2 persistence() {
return this.persistence;
}
@Override
public UserManager users() {
return this.userManager;
}
@Override
public CommandManager commands() {
return this.commandManager;
}
@Override
public PluginManager plugins() {
return this.pluginManager;
}
@Override
public synchronized void shutdown() {
this.shutdownManager.shutdown();
}
@Override
public ShutdownManagerImpl shutdownManager() {
return this.shutdownManager;
}
@Deprecated
public void shutdown(boolean exit) {
this.shutdownManager.shutdown(exit);
}
@Override
public ConfigurationProvider configuration() {
return this.configProvider;
}
@Override
public PasteServiceManager pasting() {
return this.pasteManager;
}
@Override
public UtilityManager utilities() {
return new UtilityManager() {/* TODO: utilities */};
}
@Override
public String getLoggerName(Class<?> clazz) {
return "polly.Plugin." + clazz.getName();
}
@Override
public FormatManager formatting() {
return this.formatManager;
}
@Override
public ConversationManager conversations() {
return this.conversationManager;
}
public Date getStartTime() {
return this.startTime;
}
public boolean isDebugMode() {
return this.configProvider.getRootConfiguration().readBoolean(
Configuration.DEBUG_MODE);
}
@Override
public MailManager mails() {
return this.mailManager;
}
@Override
protected void actualDispose() throws DisposingException {
this.shutdown();
}
@Override
public RoleManager roles() {
return this.roleManager;
}
@Override
public void addGenericListener(GenericListener listener) {
this.eventProvider.addListener(GenericListener.class, listener);
}
@Override
public void removeGenericListener(GenericListener listener) {
this.eventProvider.removeListener(GenericListener.class, listener);
}
@Override
public void fireGenericEvent(final GenericEvent e) {
this.eventProvider.dispatch(GenericListener.class, e,
GenericListener::genericEvent);
}
}