/*******************************************************************************
* Copyright 2013
* Ubiquitous Knowledge Processing (UKP) Lab
* Technische Universität Darmstadt
*
* 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 de.tudarmstadt.ukp.csniper.webapp.page;
import java.io.IOException;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.feedback.FeedbackMessage;
import org.apache.wicket.feedback.IFeedbackMessageFilter;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.springframework.core.io.support.PropertiesLoaderUtils;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.context.support.WebApplicationContextUtils;
import de.tudarmstadt.ukp.csniper.webapp.search.cqp.CqpEngine;
import de.tudarmstadt.ukp.csniper.webapp.search.cqp.CqpMacro;
import de.tudarmstadt.ukp.csniper.webapp.security.page.LogInOutPanel;
import de.tudarmstadt.ukp.csniper.webapp.support.task.TaskService;
import de.tudarmstadt.ukp.csniper.webapp.support.wicket.ExpandableList;
public abstract class ApplicationPageBase
extends WebPage
{
private final static Log LOG = LogFactory.getLog(ApplicationPageBase.class);
private static final long serialVersionUID = -1690130604031181803L;
private LogInOutPanel logInOutPanel;
private InfoPanel helpPanel;
private InfoPanel macroPanel;
private AjaxLink<Void> openHelp;
private AjaxLink<Void> openMacros;
private FeedbackPanel feedbackPanel;
private Label versionLabel;
protected ApplicationPageBase()
{
commonInit();
}
protected ApplicationPageBase(final PageParameters parameters)
{
super(parameters);
commonInit();
}
@SuppressWarnings({ "serial" })
private void commonInit()
{
getSession().setLocale(Locale.ENGLISH);
logInOutPanel = new LogInOutPanel("logInOutPanel");
helpPanel = new InfoPanel("helpPanel", "page.help");
macroPanel = new InfoPanel("macroPanel", "page.macros")
{
@Override
protected void initialize()
{
super.initialize();
Map<String, String> macros = new HashMap<String, String>();
for (CqpMacro macro : CqpEngine.getMacros()) {
macros.put(macro.getName(), macro.getBodyAsHtml());
}
infoPanel.replaceWith(new ExpandableList("infoPanel", macros));
}
};
openHelp = new AjaxLink<Void>("openHelp")
{
@Override
public void onClick(AjaxRequestTarget aTarget)
{
helpPanel.setVisible(!helpPanel.isVisible());
aTarget.add(helpPanel);
}
};
openMacros = new AjaxLink<Void>("openMacros")
{
@Override
public void onClick(AjaxRequestTarget aTarget)
{
macroPanel.setVisible(!macroPanel.isVisible());
aTarget.add(macroPanel);
}
};
feedbackPanel = new FeedbackPanel("feedbackPanel");
feedbackPanel.setOutputMarkupId(true);
feedbackPanel.setFilter(new IFeedbackMessageFilter()
{
@Override
public boolean accept(FeedbackMessage aMessage)
{
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String username = auth != null ? auth.getName() : "UNKNOWN";
if (aMessage.isFatal()) {
LOG.fatal(username + ": " + aMessage.getMessage());
}
else if (aMessage.isError()) {
LOG.error(username + ": " + aMessage.getMessage());
}
else if (aMessage.isWarning()) {
LOG.warn(username + ": " + aMessage.getMessage());
}
else if (aMessage.isInfo()) {
LOG.info(username + ": " + aMessage.getMessage());
}
else if (aMessage.isDebug()) {
LOG.debug(username + ": " + aMessage.getMessage());
}
return true;
}
});
Properties props = getVersionProperties();
versionLabel = new Label("version", props.getProperty("version") + " ("
+ props.getProperty("timestamp") + ")");
add(openHelp);
add(openMacros);
add(helpPanel);
add(macroPanel);
add(logInOutPanel);
add(feedbackPanel);
add(versionLabel);
}
@Override
protected void onConfigure()
{
super.onConfigure();
// logInOutPanel.setVisible(AuthenticatedWebSession.get().isSignedIn());
openHelp.setVisible(!StringUtils.isBlank(getString("page.help", null, "")));
openMacros.setVisible(!StringUtils.isBlank(getString("page.macros", null, "")));
}
public FeedbackPanel getFeedbackPanel()
{
return feedbackPanel;
}
public Properties getVersionProperties()
{
try {
return PropertiesLoaderUtils.loadAllProperties("/META-INF/version.properties");
}
catch (IOException e) {
LOG.error("Unable to load version information", e);
return new Properties();
}
}
public TaskService getTaskService()
{
return (TaskService) WebApplicationContextUtils.getRequiredWebApplicationContext(
((WebApplication) getApplication()).getServletContext()).getBean("taskService");
}
}