package com.delcyon.capo.webapp.servlets;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.EnumSet;
import java.util.logging.Level;
import javax.jcr.Session;
import org.w3c.dom.Document;
import com.delcyon.capo.CapoApplication;
import com.delcyon.capo.resourcemanager.ResourceDescriptor;
import com.delcyon.capo.resourcemanager.ResourceDescriptor.Action;
import com.delcyon.capo.resourcemanager.ResourceDescriptor.State;
import com.delcyon.capo.server.CapoServer;
import com.delcyon.capo.server.jackrabbit.CapoJcrServer;
import com.delcyon.capo.webapp.widgets.WCapoResourceExplorer;
import com.delcyon.capo.webapp.widgets.WCapoSearchControl;
import com.delcyon.capo.webapp.widgets.WConsoleWidget;
import com.delcyon.capo.webapp.widgets.WXmlNavigationBar;
import com.delcyon.capo.xml.dom.ResourceDocument;
import eu.webtoolkit.jwt.AlignmentFlag;
import eu.webtoolkit.jwt.PositionScheme;
import eu.webtoolkit.jwt.Signal1.Listener;
import eu.webtoolkit.jwt.StandardButton;
import eu.webtoolkit.jwt.TextFormat;
import eu.webtoolkit.jwt.WApplication;
import eu.webtoolkit.jwt.WBootstrapTheme;
import eu.webtoolkit.jwt.WContainerWidget;
import eu.webtoolkit.jwt.WEnvironment;
import eu.webtoolkit.jwt.WGridLayout;
import eu.webtoolkit.jwt.WLength;
import eu.webtoolkit.jwt.WLink;
import eu.webtoolkit.jwt.WLink.Type;
import eu.webtoolkit.jwt.WMessageBox;
public class CapoWebApplication extends WApplication {
private WContainerWidget rootContainerWidget;
private WGridLayout rootLayout;
private WCapoResourceExplorer capoResourceExplorer;
private ResourceDocument document;
private Session jcrSession;
private WCapoSearchControl capoSearchControl;
private WXmlNavigationBar navigation;
private WConsoleWidget consoleWidget;
private Listener<String> consoleListener;
public CapoWebApplication(WEnvironment env, boolean embedded) {
super(env);
WBootstrapTheme bootstrapTheme = new WBootstrapTheme();
setTheme(bootstrapTheme);
useStyleSheet(new WLink("/wr/css/local.css"));
//setCssTheme("polished");
setTitle("Capo");
require("/wr/ace/ace.js");
WApplication.getInstance().enableUpdates(true);
try
{
jcrSession = CapoJcrServer.createSession();
createUI();
}
catch (Exception exception)
{
CapoWebApplication.exception(Level.SEVERE, "error creating UI", exception);
}
}
public Session getJcrSession()
{
return this.jcrSession;
}
private void createUI() throws Exception
{
rootContainerWidget = getRoot();
rootContainerWidget.setPadding(new WLength(0));
rootContainerWidget.setLayout(getRootLayout());
//WApplication.getInstance().internalPathChanged().addListener(this, this::processInternalPathChanged);
getRootLayout().addWidget(getNavigationContainer(),0,0);
getRootLayout().addWidget(getCapoResourceExplorer(),1,0);
getNavigationContainer().setLayoutItem(getRootLayout().getItemAt(1));
//getRootLayout().addWidget(getConsoleWidget(),2,0);
//FileResourceType fileResourceType = new FileResourceType();
//ResourceDescriptor resourceDescriptor = fileResourceType.getResourceDescriptor("file:/");
ResourceDescriptor resourceDescriptor = CapoApplication.getDataManager().getResourceDescriptor(null, "repo:"+WApplication.getInstance().getInternalPath());
if(resourceDescriptor.getResourceMetaData(null).exists() == false)
{
resourceDescriptor.performAction(null, Action.CREATE);
resourceDescriptor.reset(State.OPEN);
}
//ResourceDescriptor resourceDescriptor2 = CapoApplication.getDataManager().getResourceDirectory("CLIENTS_DIR");
//ResourceDocumentBuilder documentBuilder = new ResourceDocumentBuilder();
//document = (ResourceDocument) documentBuilder.buildDocument(resourceDescriptor2);
getCapoResourceExplorer().setRootResourceDescriptor(resourceDescriptor);
}
private WCapoResourceExplorer getCapoResourceExplorer() {
if (capoResourceExplorer == null)
{
capoResourceExplorer = new WCapoResourceExplorer();
}
return capoResourceExplorer;
}
private WConsoleWidget getConsoleWidget()
{
if(consoleWidget == null)
{
consoleWidget = new WConsoleWidget();
consoleListener = (input) -> {
if(input.startsWith("["))
{
input = input.replaceFirst("(\\[.+\\]) ([a-zA-Z0-9]+) ([a-zA-Z0-9\\.]+) - (.*)", "<span class='console-msg-tsrc'>$1</span> <span class='console-msg-level'>$2</span> <span class='console-msg-jsrc'>$3</span> - $4");
getConsoleWidget().append(input,TextFormat.XHTMLText);
}
else
{
getConsoleWidget().append(input,TextFormat.PlainText);
}
};
CapoServer.errConsole.output().addListener(this, consoleListener);
CapoServer.outConsole.output().addListener(this, consoleListener);
}
return consoleWidget;
}
private WGridLayout getRootLayout() {
if (rootLayout == null)
{
rootLayout = new WGridLayout();
rootLayout.setContentsMargins(0,0,0,0);
getRootLayout().setRowStretch(1, 1);
}
return rootLayout;
}
private WXmlNavigationBar getNavigationContainer() throws Exception
{
if(navigation == null)
{
//create and make nav container and nav bar widget
Document menuDocument = CapoApplication.getDocumentBuilder().parse(CapoWebApplication.class.getClassLoader().getResource("main_navigation_menu.xml").openStream());
navigation = new WXmlNavigationBar(menuDocument.getDocumentElement());
navigation.addWidget(getSearchControl(),AlignmentFlag.AlignRight);
navigation.setResponsive(false);
navigation.setTitle("Capo",new WLink(Type.InternalPath,"/"));
navigation.setPopup(true);
navigation.setHeight(new WLength(5));
navigation.setMargin(0);
navigation.setOffsets(0);
navigation.setPositionScheme(PositionScheme.Relative);
navigation.setAttributeValue("style", "background-color: black;");
}
return navigation;
}
private WCapoSearchControl getSearchControl()
{
if(capoSearchControl == null)
{
capoSearchControl = new WCapoSearchControl();
}
return capoSearchControl;
}
public static void exception(Level level,String message, Exception exception)
{
CapoApplication.logger.log(level, message, exception);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
PrintStream printStream = new PrintStream(byteArrayOutputStream);
exception.printStackTrace(printStream);
WMessageBox.show(message,"<pre class='error_message'>"+new String(byteArrayOutputStream.toByteArray())+"</pre>", EnumSet.of(StandardButton.Ok));
}
/* (non-Javadoc)
* @see eu.webtoolkit.jwt.WApplication#destroy()
*/
@Override
public void destroy()
{
getConsoleWidget().destroy();
CapoServer.errConsole.output().removeListener(consoleListener);
CapoServer.outConsole.output().removeListener(consoleListener);
super.destroy();
}
}