package org.jboss.windup.graph.rexster;
import com.tinkerpop.frames.FramedGraph;
import com.tinkerpop.rexster.protocol.EngineConfiguration;
import com.tinkerpop.rexster.protocol.EngineController;
import com.tinkerpop.rexster.server.DefaultRexsterApplication;
import com.tinkerpop.rexster.server.HttpRexsterServer;
import com.tinkerpop.rexster.server.RexProRexsterServer;
import com.tinkerpop.rexster.server.RexsterProperties;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.logging.Logger;
import org.apache.commons.configuration.HierarchicalConfiguration;
import org.jboss.forge.furnace.addons.Addon;
import org.jboss.forge.furnace.container.simple.lifecycle.SimpleContainer;
import org.jboss.forge.furnace.repositories.AddonRepository;
import org.jboss.windup.graph.GraphContext;
import org.jboss.windup.graph.listeners.AfterGraphInitializationListener;
import org.jboss.windup.graph.listeners.BeforeGraphCloseListener;
public class RexsterInitializer implements AfterGraphInitializationListener, BeforeGraphCloseListener {
private String rexsterExtractDirectory;
private Map configuration;
private static final Logger log = Logger.getLogger(RexsterInitializer.class.getName());
boolean started = false;
private RexProRexsterServer rexPro;
private HttpRexsterServer rexsterServer;
private Addon getAddon() {
Set addons = SimpleContainer.getFurnace(RexsterInitializer.class.getClassLoader()).getAddonRegistry(new AddonRepository[0]).getAddons();
Iterator var2 = addons.iterator();
Addon addon;
boolean isRexster;
do {
if(!var2.hasNext()) {
return null;
}
addon = (Addon)var2.next();
isRexster = addon.getId().getName().contains("rexster");
} while(!isRexster);
return addon;
}
public void start(FramedGraph graph) {
try {
PrintWriter e = new PrintWriter("rexster.xml");
Throwable var3 = null;
try {
String path = this.getClass().getResource("/public").getPath();
if(path.contains("!")) {
path = path.split("!")[0];
}
if(path.contains(":")) {
path = path.split(":")[1];
}
if(path.endsWith(".jar")) {
File properties = new File(path);
(new File(this.rexsterExtractDirectory)).mkdirs();
this.extractZipFile(properties, this.rexsterExtractDirectory);
} else {
String properties1 = path.substring(0, path.length() - 8);
this.rexsterExtractDirectory = properties1;
}
e.println(this.createRexsterXmlFileString(this.configuration));
e.flush();
RexsterProperties properties2 = new RexsterProperties("rexster.xml");
this.configureScriptEngine(properties2);
this.rexsterServer = new HttpRexsterServer(properties2);
this.rexsterServer.start(new DefaultRexsterApplication("main", graph.getBaseGraph()));
this.rexPro = new RexProRexsterServer(properties2, true);
this.rexPro.start(new DefaultRexsterApplication("main", graph));
this.started = true;
} catch (Throwable var15) {
var3 = var15;
throw var15;
} finally {
if(e != null) {
if(var3 != null) {
try {
e.close();
} catch (Throwable var14) {
var3.addSuppressed(var14);
}
} else {
e.close();
}
}
}
} catch (FileNotFoundException var17) {
log.warning("rexster was not able to run");
} catch (Exception var18) {
log.warning("Error while creating rexster.xml");
}
}
public boolean isStarted() {
return this.started;
}
private void extractZipFile(File jarFile, String destDir) throws IOException {
JarFile jar = new JarFile(jarFile);
Enumeration enumEntries = jar.entries();
while(true) {
while(enumEntries.hasMoreElements()) {
JarEntry file = (JarEntry)enumEntries.nextElement();
File f = new File(destDir + File.separator + file.getName());
if(file.isDirectory()) {
f.mkdir();
} else {
InputStream is = jar.getInputStream(file);
FileOutputStream fos = new FileOutputStream(f);
while(is.available() > 0) {
fos.write(is.read());
}
fos.close();
is.close();
}
}
return;
}
}
private void configureScriptEngine(RexsterProperties properties) {
ArrayList configuredScriptEngines = new ArrayList();
List configs = properties.getScriptEngines();
Iterator var4 = configs.iterator();
while(var4.hasNext()) {
HierarchicalConfiguration config = (HierarchicalConfiguration)var4.next();
configuredScriptEngines.add(new EngineConfiguration(config));
}
EngineController.configure(configuredScriptEngines);
}
private String createRexsterXmlFileString(Map conf) {
String fileString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rexster>\n <http>\n <server-port>8182</server-port>\n <server-host>0.0.0.0</server-host>\n <base-uri>http://localhost</base-uri>\n <web-root>" + this.rexsterExtractDirectory + "/public</web-root>\n" + " <character-set>UTF-8</character-set>\n" + " <enable-jmx>false</enable-jmx>\n" + " <enable-doghouse>true</enable-doghouse>\n" + " <max-post-size>2097152</max-post-size>\n" + " <max-header-size>8192</max-header-size>\n" + " <upload-timeout-millis>30000</upload-timeout-millis>\n" + " <thread-pool>\n" + " <worker>\n" + " <core-size>8</core-size>\n" + " <max-size>8</max-size>\n" + " </worker>\n" + " <kernal>\n" + " <core-size>4</core-size>\n" + " <max-size>4</max-size>\n" + " </kernal>\n" + " </thread-pool>\n" + " <io-strategy>leader-follower</io-strategy>\n" + " </http>\n" + " <rexpro>\n" + " <server-port>8184</server-port>\n" + " <server-host>0.0.0.0</server-host>\n" + " <session-max-idle>1790000</session-max-idle>\n" + " <session-check-interval>3000000</session-check-interval>\n" + " <enable-jmx>false</enable-jmx>\n" + " <read-buffer>65536</read-buffer>\n" + " <thread-pool>\n" + " <worker>\n" + " <core-size>8</core-size>\n" + " <max-size>8</max-size>\n" + " </worker>\n" + " <kernal>\n" + " <core-size>4</core-size>\n" + " <max-size>4</max-size>\n" + " </kernal>\n" + " </thread-pool>\n" + " <io-strategy>leader-follower</io-strategy>\n" + " </rexpro>\n" + " <shutdown-port>8183</shutdown-port>\n" + " <shutdown-host>127.0.0.1</shutdown-host>\n" + " <config-check-interval>10000</config-check-interval>\n" + " <script-engines>\n" + " <script-engine>\n" + " <name>gremlin-groovy</name>\n" + " <reset-threshold>-1</reset-threshold>\n" + " <init-scripts>config/init.groovy</init-scripts>\n" + " <imports>com.tinkerpop.rexster.client.*</imports>\n" + " <static-imports>java.lang.Math.PI</static-imports>\n" + " </script-engine>\n" + " </script-engines>\n" + " <security>\n" + " <authentication>\n" + " <type>default</type>\n" + " <configuration>\n" + " <users>\n" + " <user>\n" + " <username>rexster</username>\n" + " <password>rexster</password>\n" + " </user>\n" + " </users>\n" + " </configuration>\n" + " </authentication>\n" + " </security>\n" + " <metrics>\n" + " <reporter>\n" + " <type>jmx</type>\n" + " </reporter>\n" + " <reporter>\n" + " <type>http</type>\n" + " </reporter>\n" + " <reporter>\n" + " <type>console</type>\n" + " <properties>\n" + " <rates-time-unit>SECONDS</rates-time-unit>\n" + " <duration-time-unit>SECONDS</duration-time-unit>\n" + " <report-period>10</report-period>\n" + " <report-time-unit>MINUTES</report-time-unit>\n" + " <includes>http.rest.*</includes>\n" + " <excludes>http.rest.*.delete</excludes>\n" + " </properties>\n" + " </reporter>\n" + " </metrics>\n" + " <graphs>\n" + "<graph>\n" + " <graph-name>titan</graph-name>\n" + " <graph-type>com.thinkaurelius.titan.tinkerpop.rexster.TitanGraphConfiguration</graph-type>\n" + " <graph-location> " + conf.get("storage.directory") + "</graph-location>\n" + " <graph-read-only>false</graph-read-only>\n" + " <properties>\n" + " <storage.backend>" + conf.get("storage.backend") + "</storage.backend>\n" + " <storage.directory>" + conf.get("storage.directory") + "</storage.directory>\n" + " <index.search.backend>" + conf.get("index.search.backend") + "</index.search.backend>\n" + " <index.search.directory> " + conf.get("index.search.directory") + "</index.search.directory>\n" + " </properties>\n" + " <extensions>\n" + " <allows>\n" + " <allow>tp:gremlin</allow>\n" + " </allows>\n" + " </extensions>\n" + " </graph>" + " </graphs>\n" + "</rexster>";
return fileString;
}
public void afterGraphStarted(Map configuration, GraphContext graphContext) {
this.configuration = configuration;
this.rexsterExtractDirectory = this.getAddon().getRepository().getAddonDescriptor(this.getAddon().getId()).getParent() + "/rexster-extract";
this.start(graphContext.getFramed());
}
public void beforeGraphClose() {
try {
if(this.rexPro != null) {
this.rexPro.stop();
}
if(this.rexsterServer != null) {
this.rexsterServer.stop();
}
} catch (Exception var2) {
var2.printStackTrace();
}
}
}