Skip to content

Commit

Permalink
prepare external plugins
Browse files Browse the repository at this point in the history
  • Loading branch information
Oliver Rode committed Apr 3, 2018
1 parent e392ad1 commit 6d6c77c
Show file tree
Hide file tree
Showing 187 changed files with 191 additions and 76,677 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@
**/.externalToolBuilders/
**/*.lnk
**/*.versionsBackup
**/*.dll
35 changes: 30 additions & 5 deletions app/src/main/java/de/serviceflow/frankenstein/Configuration.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,10 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Properties;

import de.serviceflow.frankenstein.plugin.api.ConfigManager;
import de.serviceflow.frankenstein.vf.VideoFilter;
import de.serviceflow.frankenstein.vf.VideoSource;
import de.serviceflow.frankenstein.vf.input.CameraInput;
Expand All @@ -35,7 +37,7 @@
/**
* Handles information about the configuration of the 'Project' and the tool.
*/
public class Configuration {
public class Configuration implements ConfigManager {
// Ini-File properties
Properties iniProperties = new Properties();

Expand All @@ -53,8 +55,8 @@ public class Configuration {
public String outputVideo = null;
private String recordingVideo = null;
private String inputVideoStreamURL = null;


public int limitOutputWidth = 2880;

public int testScreenWidth = 1280;
Expand All @@ -74,12 +76,21 @@ public class Configuration {

private final File configFile;

private final PluginManager pluginManager = new PluginManager();

public SectionedProperties metadata = new SectionedProperties();

public static StringBuffer usage = new StringBuffer();

private static Configuration configuration;

public static ConfigManager getInstance() {
return configuration;
}


public static Configuration cliCreateConfiguration(String[] args) {
Configuration configuration = new Configuration(null);
configuration = new Configuration(null);

int optionKeyIndex;
String optionValue;
Expand All @@ -96,6 +107,8 @@ public static Configuration cliCreateConfiguration(String[] args) {
optionProperties = getOptionProperties(args, optionKeyIndex);
cliConfigureSource(configuration, optionValue, optionProperties);

configuration.getPluginManager().load(configuration);

// todo ...

if (getOptionIndex(args, "?")>=0) {
Expand Down Expand Up @@ -306,7 +319,7 @@ public String getInputStreamURL() {
public void setInputStreamURL(String inputVideoStreamURL) {
this.inputVideoStreamURL = inputVideoStreamURL;
}

public String getRecordingVideoPath() {
return iniProperties.getProperty("recordingvideopath", iniProperties.getProperty("inputvideopath"));
}
Expand Down Expand Up @@ -341,4 +354,16 @@ public static String getUsage() {
return usage.toString();
}

public PluginManager getPluginManager() {
return pluginManager;
}

private static Locale locale = Locale.getDefault();


public Locale getLocale() {
return locale;
}


}
25 changes: 11 additions & 14 deletions app/src/main/java/de/serviceflow/frankenstein/Main.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package de.serviceflow.frankenstein;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

public class Main {
Expand All @@ -15,21 +13,20 @@ public static void main(String[] args) {
System.exit(0);
}

if (args.length==0 || c.isVisual()) {
if (args.length == 0 || c.isVisual()) {

de.serviceflow.frankenstein.fxml.FxMain.fxmain(c);
/*
Class<?> fxMain;
try {
fxMain = Class.forName("de.serviceflow.frankenstein.fxml.FxMain");
Class<?> parameterTypes[] = {de.serviceflow.frankenstein.Configuration.class};
Method main = fxMain.getDeclaredMethod("fxmain", parameterTypes);
Object[] invokeArgs = {c};
main.invoke(fxMain, invokeArgs);
} catch (ClassNotFoundException | IllegalAccessException | IllegalArgumentException
| InvocationTargetException | NoSuchMethodException | SecurityException e) {
e.printStackTrace();
}
* Class<?> fxMain; try { fxMain =
* Class.forName("de.serviceflow.frankenstein.fxml.FxMain");
* Class<?> parameterTypes[] =
* {de.serviceflow.frankenstein.Configuration.class}; Method main =
* fxMain.getDeclaredMethod("fxmain", parameterTypes); Object[]
* invokeArgs = {c}; main.invoke(fxMain, invokeArgs); } catch
* (ClassNotFoundException | IllegalAccessException |
* IllegalArgumentException | InvocationTargetException |
* NoSuchMethodException | SecurityException e) {
* e.printStackTrace(); }
*/
}
}
Expand Down
118 changes: 118 additions & 0 deletions app/src/main/java/de/serviceflow/frankenstein/PluginManager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
package de.serviceflow.frankenstein;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import de.serviceflow.frankenstein.fxml.FxMain;
import de.serviceflow.frankenstein.plugin.api.SegmentVideoFilter;
import de.serviceflow.frankenstein.vf.segment.BWFilter;
import de.serviceflow.frankenstein.vf.segment.StereoDistanceFilter;

public class PluginManager {

private List<SegmentVideoFilter> segmentFilters;

public void load(Configuration configuration) {
createSegmentFilters();
}

public List<SegmentVideoFilter> getLocalFilters() {
return segmentFilters;
}

public void createSegmentFilters() {
segmentFilters = new ArrayList<SegmentVideoFilter>();

try {
segmentFilters.add(new BWFilter());
segmentFilters.add(new StereoDistanceFilter());
} catch (Throwable t) {
t.printStackTrace();
}

try {
String pluginOpenCVbase;
String pluginJogAmpbase;

String version = getClass().getPackage().getImplementationVersion();
String fs;
if (version != null && !version.endsWith("-SNAPSHOT")) {
fs = "/";
pluginOpenCVbase = "https://oss.sonatype.org/service/local/repositories/releases/content/de/serviceflow/frankenstein/plugin/opencv/plugin-opencv/"
+ version;
pluginJogAmpbase = "https://oss.sonatype.org/service/local/repositories/releases/content/de/serviceflow/frankenstein/plugin/jogamp/plugin-jogamp/"
+ version;
} else {
// Assume development environment in packaged state cwd =
// app/src/main/resources
// @todo Eclipse:
// https://stackoverflow.com/questions/6092200/how-to-fix-an-unsatisfiedlinkerror-cant-find-dependent-libraries-in-a-jni-pro
fs = File.separator;
version = "0.3.4-SNAPSHOT";
String baseFromAppResources = ".." + fs + ".." + fs + ".." + fs + ".." + fs;
pluginOpenCVbase = new File(System.getProperty("user.dir") + fs + baseFromAppResources + "plugin-opencv"
+ fs + "java" + fs + "target").toURI().toURL().toExternalForm();
pluginJogAmpbase = new File(System.getProperty("user.dir") + fs + baseFromAppResources + "plugin-jogamp"
+ fs + "java" + fs + "target").toURI().toURL().toExternalForm();
}

System.out.println("version (e.g. 0.3.3) = " + version);

String pluginOpenCVRef = pluginOpenCVbase + "/" + "plugin-opencv-" + version + ".jar";
String pluginJogAmpRef = pluginJogAmpbase + "/" + "plugin-jogamp-" + version + ".jar";

// Filters completly in jar
segmentFilters.add(loadExternalFilterInstance(
"de.serviceflow.frankenstein.plugin.opencv.NativeExampleFilter", pluginOpenCVRef));
segmentFilters.add(loadExternalFilterInstance(
"de.serviceflow.frankenstein.plugin.opencv.VideoEqualizerFilter", pluginOpenCVRef));
// segmentFilters.add(loadExternalFilterInstance(
// "de.serviceflow.frankenstein.plugin.opencv.ExternalSampleFilter",
// pluginOpenCVRef));
segmentFilters.add(loadExternalFilterInstance("de.serviceflow.frankenstein.plugin.jogamp.GLExampleFilter",
pluginJogAmpRef));
} catch (Throwable t) {
t.printStackTrace();
}

}

private SegmentVideoFilter loadExternalFilterInstance(String filterClassName, String ref) {
try {
// use dynamic loading and reflection when loading jni proxy class
// from jar, so app do not depend on it.
System.out.println("loading " + filterClassName + " from " + ref + " ...");
URLClassLoader childLoader = getLoader(ref);
Class<?> filterClass = Class.forName(filterClassName, true, childLoader);
SegmentVideoFilter filter = (SegmentVideoFilter) filterClass.newInstance();
return filter;
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | MalformedURLException
| SecurityException
| IllegalArgumentException /*
* | InvocationTargetException |
* NoSuchMethodException
*/ e) {
throw new RuntimeException("Failed loading filter " + filterClassName + " from " + ref, e);
}
}

static Map<String, URLClassLoader> loaders = new HashMap<String, URLClassLoader>();

static synchronized URLClassLoader getLoader(String ref) throws MalformedURLException {
ref = ref.intern();
URLClassLoader loader = loaders.get(ref);
if (loader == null) {
URL[] urls = new URL[] { new URL(ref) };
loader = new URLClassLoader(urls, FxMain.class.getClassLoader());
loaders.put(ref, loader);
}
return loader;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

public class FilterSetupController {

private ProcessingSceneController parent;
// private ProcessingSceneController parent;

private Stage stage;

Expand All @@ -27,7 +27,7 @@ public class FilterSetupController {
BorderPane bpContainer;

public void configure(ProcessingSceneController parent, Stage stage) {
this.parent = parent;
// this.parent = parent;
this.stage = stage;

cbFilter.getItems().setAll(parent.getLocalFilters());
Expand Down

0 comments on commit 6d6c77c

Please sign in to comment.