package de.elatexam.editor;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
import net.databinder.auth.data.hib.BasicPassword;
import net.databinder.auth.hib.AuthDataApplication;
import net.databinder.hib.Databinder;
import net.databinder.hib.SessionUnit;
import org.apache.wicket.authroles.authorization.strategies.role.Roles;
import org.apache.wicket.markup.html.IHeaderContributor;
import org.apache.wicket.markup.html.IHeaderResponse;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.request.Request;
import org.apache.wicket.request.Response;
import org.hibernate.Session;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.criterion.Projections;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.wicketstuff.jslibraries.CDN;
import org.wicketstuff.jslibraries.JSLib;
import org.wicketstuff.jslibraries.Library;
import org.wicketstuff.jslibraries.VersionDescriptor;
import de.elatexam.editor.components.form.EnhanceFormsListener;
import de.elatexam.editor.pages.OverviewPage;
import de.elatexam.editor.pages.ShowSubtaskDefsPage;
import de.elatexam.editor.pages.StatisticPage;
import de.elatexam.editor.pages.TaskDefPage;
import de.elatexam.editor.pages.UploadComplexTaskdefPage;
import de.elatexam.editor.user.BasicUser;
public class TaskEditorApplication extends AuthDataApplication {
/**
* @return
*/
public static TaskEditorApplication getInstance() {
return (TaskEditorApplication) get();
}
@Override
public org.apache.wicket.Session newSession(final Request request, final Response response) {
return new TaskEditorSession(request);
}
/*
* (non-Javadoc)
*
* @see net.databinder.hib.DataApplication#configureHibernate(org.hibernate.cfg .AnnotationConfiguration)
*/
@Override
protected void configureHibernate(final AnnotationConfiguration config) {
super.configureHibernate(config);
// add all model classes from persistence.xml
addPersistentModelClasses(config, getClass().getClassLoader().getResourceAsStream("META-INF/persistence.xml"));
// config.setProperty("hibernate.show_sql", "true");
}
/**
* Fetch all <class> elements from META-INF/persistence.xml and, assuming these classes have JPA annotations,
* add them to the hibernate configuration.
*
* @param config
* @param in
*/
private void addPersistentModelClasses(final AnnotationConfiguration config, final InputStream in) {
try {
final DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder;
docBuilder = docBuilderFactory.newDocumentBuilder();
final Document doc = docBuilder.parse(in);
final XPath xpath = XPathFactory.newInstance().newXPath();
final NodeList nodes = (NodeList) xpath.evaluate("//class/text()", doc, XPathConstants.NODESET);
for (int i = 0; i < nodes.getLength(); i++) {
config.addAnnotatedClass(Class.forName(nodes.item(i).getNodeValue()));
}
return;
} catch (final Exception e) {
e.printStackTrace();
}
System.exit(1);
}
@Override
public Class<OverviewPage> getHomePage() {
return OverviewPage.class;
}
public byte[] getSalt() {
return "secrect hash salt".getBytes();
}
public Class<BasicUser> getUserClass() {
return BasicUser.class;
}
/* (non-Javadoc)
* @see net.databinder.auth.hib.AuthDataApplication#getSignInPageClass()
*/
@Override
public Class<? extends WebPage> getSignInPageClass() {
return OverviewPage.class;
}
@Override
protected void init() {
super.init();
getHeaderContributorListenerCollection().add(JSLib.getHeaderContribution(VersionDescriptor.exactVersion(Library.JQUERY, 1,4,2), true, CDN.GOOGLE));
// enable request logger, needed to show live session count
getRequestLoggerSettings().setRequestLoggerEnabled(true);
getApplicationSettings().setPageExpiredErrorPage(OverviewPage.class);
getMarkupSettings().setDefaultMarkupEncoding("UTF8");
mountPage("taskdefs", TaskDefPage.class);
mountPage("statistics", StatisticPage.class);
mountPage("subtaskdefs", ShowSubtaskDefsPage.class);
mountPage("import", UploadComplexTaskdefPage.class);
getMarkupSettings().setStripWicketTags(true);
// make sure there is at least one user with role admin
Databinder.ensureSession(new SessionUnit() {
public Object run(final Session sess) {
final Number count = (Number) sess.createCriteria(BasicUser.class).setProjection(Projections.rowCount()).uniqueResult();
if (count.intValue() == 0) {
final BasicUser adminUser = new BasicUser();
adminUser.setUsername("admin");
adminUser.setPassword(new BasicPassword("admin"));
adminUser.addRole(Roles.ADMIN);
sess.save(adminUser);
sess.getTransaction().commit();
}
return null;
}
});
// add error highlighting behaviour to any form components
getComponentInstantiationListeners().add(new EnhanceFormsListener());
}
/**
* Has the current user the role ADMIN?
*
* @return
*/
public static boolean isAdmin() {
return TaskEditorSession.get().getUser().hasRole(Roles.ADMIN);
}
}