Initial commit
This commit is contained in:
commit
bac7809f3c
10 changed files with 483 additions and 0 deletions
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
|
@ -0,0 +1,4 @@
|
|||
/lib/
|
||||
/build/
|
||||
/javadoc/
|
||||
/run.sh
|
10
build.isbpl
Normal file
10
build.isbpl
Normal file
|
@ -0,0 +1,10 @@
|
|||
"builder.isbpl" include
|
||||
|
||||
func dependencies {
|
||||
"https://github.com/TudbuT/tuddylib/raw/master/TuddyLIB.jar" download
|
||||
"https://github.com/TudbuT/tuddylib/raw/master/TuddyLIB-javadoc.zip" download
|
||||
"https://github.com/TudbuT/isbpl-random-stuff/raw/master/ISBPL.jar" download
|
||||
}
|
||||
|
||||
"Tryumph" =name
|
||||
"de.tudbut.tryumph.Launch" =mainClass
|
280
builder.isbpl
Normal file
280
builder.isbpl
Normal file
|
@ -0,0 +1,280 @@
|
|||
"#stream.isbpl" include
|
||||
"#time.isbpl" include
|
||||
|
||||
def ProcessBuilder "java.lang.ProcessBuilder" JIO class =ProcessBuilder
|
||||
def URL "java.net.URL" JIO class =URL
|
||||
def String "java.lang.String" JIO class =String
|
||||
def File "java.io.File" JIO class =File
|
||||
def Files "java.nio.file.Files" JIO class =Files
|
||||
def System "java.lang.System" JIO class =System
|
||||
|
||||
def deps
|
||||
|
||||
func ensureDepsExist {
|
||||
("lib" File°new1)°exists0 not if {
|
||||
[ dependencies ] =deps
|
||||
}
|
||||
}
|
||||
|
||||
func file {
|
||||
with path ;
|
||||
("lib" File°new1)°mkdir0 pop
|
||||
def file (path File°new1) =file
|
||||
def name file°getName0 =name
|
||||
def newfile (("lib/" name)°strconcat File°new1) =newfile
|
||||
"\n> Using " puts
|
||||
name puts
|
||||
"..." puts
|
||||
newfile°exists0 if {
|
||||
"\n: Skipped. (Force by deleting lib/" puts name puts ")" puts
|
||||
name
|
||||
2 stop
|
||||
}
|
||||
file°exists0 not if {
|
||||
"\n: Ignored. File " puts
|
||||
path puts
|
||||
" does not exist!" puts
|
||||
name
|
||||
2 stop
|
||||
}
|
||||
"Java" try {
|
||||
file°toPath0 newfile°toPath0 0 anew Files°copy3 pop
|
||||
} {
|
||||
pop pop pop printStackTrace0
|
||||
}
|
||||
name
|
||||
}
|
||||
|
||||
func download {
|
||||
with url ;
|
||||
("lib" File°new1)°mkdir0 pop
|
||||
(url URL)°new1 =url
|
||||
def name (url°getPath0 "/" )°strsplit =name
|
||||
(name (name°alen 1 -))°aget =name
|
||||
def newfile (("lib/" name)°strconcat File°new1) =newfile
|
||||
"\n> Downloading " puts
|
||||
name puts
|
||||
"..." puts
|
||||
newfile°exists0 if {
|
||||
"\n: Skipped. (Force by deleting lib/" puts name puts ")" puts
|
||||
name
|
||||
2 stop
|
||||
}
|
||||
def ms getms =ms
|
||||
def inp
|
||||
"Java" try {
|
||||
url°openStream0 =inp
|
||||
} {
|
||||
pop pop pop printStackTrace0
|
||||
"\n: Download failed." puts
|
||||
name
|
||||
2 stop
|
||||
}
|
||||
def file ("lib/" name)°strconcat STREAM.create.file.out stream =file
|
||||
while { inp°read0 dup -1 eq not } {
|
||||
file STREAM.write stream
|
||||
}
|
||||
pop
|
||||
file STREAM.close stream
|
||||
"\n: Took " puts
|
||||
((getms ms -) (1000 _long) / dup =ms) ltos puts
|
||||
"s (" puts
|
||||
((newfile°length0 ms /) (1000 _long) /) ltos puts
|
||||
"Kbps)" puts
|
||||
name
|
||||
}
|
||||
|
||||
func build {
|
||||
def script "build.sh" STREAM.create.file.out stream =script
|
||||
"\n> Generating javac command..." puts
|
||||
"rm build.sh\n" script stream.write
|
||||
"mkdir build > /dev/null 2>&1\n" script stream.write
|
||||
"mkdir src > /dev/null 2>&1\n" script stream.write
|
||||
"mkdir -p res/META-INF > /dev/null 2>&1\n" script stream.write
|
||||
"mkdir lib > /dev/null 2>&1\n" script stream.write
|
||||
"cd src ; find . | grep '\\.java$' | sed 's/^\\.\\/\\(.*\\)$/\\1/g' > ../build/buildfiles.txt\n" script stream.write
|
||||
"javac -d ../build " script stream.write
|
||||
deps°alen if {
|
||||
"-cp " script stream.write
|
||||
{
|
||||
with dep ;
|
||||
"'../lib/" script stream.write
|
||||
dep script stream.write
|
||||
"':" script stream.write
|
||||
} deps foreach
|
||||
}
|
||||
" @../build/buildfiles.txt\n" script stream.write
|
||||
"E=$?\n" script stream.write
|
||||
"cd .. ; rm build/buildfiles.txt\n" script stream.write
|
||||
"exit $E\n" script stream.write
|
||||
script STREAM.close stream
|
||||
"\n> Running javac...\n" puts
|
||||
([ "bash" "build.sh" ] ProcessBuilder°new1)°inheritIO0°start0°waitFor0
|
||||
0 eq not if {
|
||||
": javac failed!" puts
|
||||
}
|
||||
}
|
||||
|
||||
func javadoc {
|
||||
def script "javadoc.sh" STREAM.create.file.out stream =script
|
||||
"\n> Generating javadoc command..." puts
|
||||
"rm javadoc.sh\n" script stream.write
|
||||
"mkdir javadoc > /dev/null 2>&1\n" script stream.write
|
||||
"mkdir src > /dev/null 2>&1\n" script stream.write
|
||||
"cd src ; find . | grep '\\.java$' | sed 's/^\\.\\/\\(.*\\)$/\\1/g' > ../javadoc/files.txt\n" script stream.write
|
||||
"javadoc -d ../javadoc " script stream.write
|
||||
deps°alen if {
|
||||
"-cp " script stream.write
|
||||
{
|
||||
with dep ;
|
||||
"'../lib/" script stream.write
|
||||
dep script stream.write
|
||||
"':" script stream.write
|
||||
} deps foreach
|
||||
}
|
||||
" @../javadoc/files.txt\n" script stream.write
|
||||
"E=$?\n" script stream.write
|
||||
"cd ../javadoc\n" script stream.write
|
||||
"rm files.txt\n" script stream.write
|
||||
"rm ../'" script stream.write
|
||||
name script stream.write
|
||||
"'-javadoc.zip\n" script stream.write
|
||||
"zip -r ../'" script stream.write
|
||||
name script stream.write
|
||||
"'-javadoc.zip *\n" script stream.write
|
||||
"exit $E\n" script stream.write
|
||||
script STREAM.close stream
|
||||
"\n> Running javadoc...\n" puts
|
||||
([ "bash" "javadoc.sh" ] ProcessBuilder°new1)°inheritIO0°start0°waitFor0
|
||||
0 eq not if {
|
||||
": javadoc failed!" puts
|
||||
}
|
||||
}
|
||||
|
||||
func run {
|
||||
def script "run.sh" STREAM.create.file.out stream =script
|
||||
"\n> Generating run command..." puts
|
||||
"java -cp res:build:" script stream.write
|
||||
{
|
||||
with dep ;
|
||||
"'lib/" script stream.write
|
||||
dep script stream.write
|
||||
"':" script stream.write
|
||||
} deps foreach
|
||||
" " script stream.write
|
||||
mainClass script stream.write
|
||||
" " script stream.write
|
||||
"ARGS" System°getenv1 dup if { dup script stream.write } pop
|
||||
"\n" script stream.write
|
||||
"exit $?\n" script stream.write
|
||||
script STREAM.close stream
|
||||
"\n> Running\n" puts
|
||||
([ "bash" "run.sh" ] ProcessBuilder°new1)°inheritIO0°start0°waitFor0
|
||||
0 eq not if {
|
||||
": Run failed!\n" puts
|
||||
1 exit
|
||||
}
|
||||
}
|
||||
|
||||
func jar {
|
||||
def script "jar.sh" STREAM.create.file.out stream =script
|
||||
"\n> Generating jar builder..." puts
|
||||
"rm jar.sh\n" script stream.write
|
||||
"mkdir jar > /dev/null 2>&1\n" script stream.write
|
||||
{
|
||||
with dep ;
|
||||
"cp 'lib/" script stream.write
|
||||
dep script stream.write
|
||||
"' jar\n" script stream.write
|
||||
"cd jar ; unzip -o '" script stream.write
|
||||
dep script stream.write
|
||||
"' ; rm '" script stream.write
|
||||
dep script stream.write
|
||||
"' ; cd ..\n" script stream.write
|
||||
} deps foreach
|
||||
"cp -r build/* jar\n" script stream.write
|
||||
"cp -r res/* jar\n" script stream.write
|
||||
"rm '" script stream.write
|
||||
name script stream.write
|
||||
".jar'\n" script stream.write
|
||||
"cd jar\n" script stream.write
|
||||
"zip -r ../'" script stream.write
|
||||
name script stream.write
|
||||
".jar' *\n" script stream.write
|
||||
"cd .. ; rm -rf jar\n" script stream.write
|
||||
script STREAM.close stream
|
||||
"\n> Building jarfile...\n" puts
|
||||
([ "bash" "jar.sh" ] ProcessBuilder°new1)°inheritIO0°start0°waitFor0 pop
|
||||
}
|
||||
|
||||
func makeManifest {
|
||||
def file "res/META-INF/MANIFEST.MF" STREAM.create.file.out stream =file
|
||||
"\n> Generating manifest..." puts
|
||||
"Manifest-Version: 1.0\n" file stream.write
|
||||
"Main-Class: " file stream.write
|
||||
mainClass file stream.write
|
||||
"\n" file stream.write
|
||||
file STREAM.close stream
|
||||
}
|
||||
|
||||
def extraToClean 0 anew =extraToClean
|
||||
|
||||
func toClean { [
|
||||
"build"
|
||||
"lib"
|
||||
name ".jar" strconcat
|
||||
"run.sh"
|
||||
"javadoc"
|
||||
name "-javadoc.zip" strconcat
|
||||
] extraToClean aadd }
|
||||
|
||||
func clean {
|
||||
def script "clean.sh" STREAM.create.file.out stream =script
|
||||
"\n> Cleaning..." puts
|
||||
"rm clean.sh\n" script stream.write
|
||||
{
|
||||
with file ;
|
||||
"rm -rf '" script stream.write
|
||||
file script stream.write
|
||||
"'\n" script stream.write
|
||||
} toClean foreach
|
||||
script STREAM.close stream
|
||||
([ "bash" "clean.sh" ] ProcessBuilder°new1)°inheritIO0°start0°waitFor0 pop
|
||||
}
|
||||
|
||||
def tasks [ "javadoc" "clean" "build" "makeManifest" "run" "jar" ] =tasks
|
||||
|
||||
func task {
|
||||
[ swap ] tasks aadd =tasks
|
||||
}
|
||||
|
||||
func isATask {
|
||||
task
|
||||
}
|
||||
|
||||
func isToClean {
|
||||
[ swap ] extraToClean aadd =extraToClean
|
||||
}
|
||||
|
||||
"Placeholders begin" #
|
||||
def mainClass "Main" =mainClass
|
||||
def name "placeholder" =name
|
||||
func dependencies { }
|
||||
"Placeholders end" #
|
||||
|
||||
func main {
|
||||
with args ;
|
||||
[ dependencies ] =deps
|
||||
{
|
||||
with arg ;
|
||||
{
|
||||
with task ;
|
||||
arg task eq if {
|
||||
ensureDepsExist
|
||||
task 0 _layer_call
|
||||
}
|
||||
} tasks foreach
|
||||
} args foreach
|
||||
"\n" puts
|
||||
0
|
||||
}
|
2
res/META-INF/MANIFEST.MF
Normal file
2
res/META-INF/MANIFEST.MF
Normal file
|
@ -0,0 +1,2 @@
|
|||
Manifest-Version: 1.0
|
||||
Main-Class: de.tudbut.tryumph.Entry
|
7
res/config.try
Normal file
7
res/config.try
Normal file
|
@ -0,0 +1,7 @@
|
|||
|
||||
example {
|
||||
main class: de.tudbut.tryumph.example.Main
|
||||
defaults {
|
||||
port: 8080
|
||||
}
|
||||
}
|
22
src/de/tudbut/tryumph/Launch.java
Normal file
22
src/de/tudbut/tryumph/Launch.java
Normal file
|
@ -0,0 +1,22 @@
|
|||
package de.tudbut.tryumph;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import de.tudbut.tryumph.config.TryConfig;
|
||||
import de.tudbut.tryumph.err.ProjectException;
|
||||
|
||||
public class Launch {
|
||||
|
||||
public static void main(String[] args) throws ProjectException, InterruptedException {
|
||||
try {
|
||||
TryConfig config = new TryConfig(args, Launch.class.getClassLoader().getResourceAsStream("config.try"));
|
||||
config.getCatchers().then(resp -> {
|
||||
System.out.println(Arrays.toString(resp));
|
||||
}).ok();
|
||||
} catch(Exception e) {
|
||||
throw new ProjectException("Error loading project", e);
|
||||
}
|
||||
Thread.sleep(1000);
|
||||
System.exit(0);
|
||||
}
|
||||
}
|
52
src/de/tudbut/tryumph/config/RequestCatcherConfig.java
Normal file
52
src/de/tudbut/tryumph/config/RequestCatcherConfig.java
Normal file
|
@ -0,0 +1,52 @@
|
|||
package de.tudbut.tryumph.config;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.BufferedReader;
|
||||
|
||||
import tudbut.parsing.TCN;
|
||||
import tudbut.parsing.JSON;
|
||||
import de.tudbut.async.*;
|
||||
import static de.tudbut.async.Async.*;
|
||||
|
||||
import de.tudbut.tryumph.util.Compose;
|
||||
|
||||
public class RequestCatcherConfig {
|
||||
|
||||
private TCN configHolder;
|
||||
private String name;
|
||||
|
||||
private RequestCatcherConfig() {}
|
||||
|
||||
public static Task<RequestCatcherConfig> make(String name, TCN parentConfig) {
|
||||
return Async.<TCN>t((res, rej) -> {
|
||||
res.call(parentConfig);
|
||||
})
|
||||
.compose(Compose.<TCN>tcnGetNonNull(name))
|
||||
.compose((resp, res, rej) -> {
|
||||
RequestCatcherConfig r = new RequestCatcherConfig();
|
||||
r.name = name;
|
||||
r.configHolder = resp;
|
||||
r.build().err(rej).ok().await();
|
||||
res.call(r);
|
||||
});
|
||||
}
|
||||
|
||||
private Task<Void> build() {
|
||||
return t((res, rej) -> {
|
||||
res.call(null);
|
||||
});
|
||||
}
|
||||
|
||||
public Task<String> getName() {
|
||||
return t((res, rej) -> {
|
||||
if(name == null)
|
||||
rej.call(new IllegalStateException("RequestCatcherConfig is not initialized but was used"));
|
||||
res.call(name);
|
||||
});
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "RequestCatcherConfig{name=" + name + ",configHolder=" + JSON.write(configHolder) + "}";
|
||||
}
|
||||
}
|
49
src/de/tudbut/tryumph/config/TryConfig.java
Normal file
49
src/de/tudbut/tryumph/config/TryConfig.java
Normal file
|
@ -0,0 +1,49 @@
|
|||
package de.tudbut.tryumph.config;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
|
||||
import tudbut.parsing.TCN;
|
||||
import de.tudbut.async.*;
|
||||
import static de.tudbut.async.Async.*;
|
||||
|
||||
import de.tudbut.tryumph.err.ProjectException;
|
||||
|
||||
public class TryConfig {
|
||||
|
||||
private TCN configHolder;
|
||||
private String[] arguments;
|
||||
|
||||
public TryConfig(String[] appArguments, InputStream config) throws IOException, ProjectException {
|
||||
String file = "";
|
||||
try {
|
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(config));
|
||||
String line;
|
||||
while((line = reader.readLine()) != null) {
|
||||
file += line + "\n";
|
||||
}
|
||||
} catch(Exception e) {
|
||||
throw new IOException("Error reading config", e);
|
||||
}
|
||||
try {
|
||||
configHolder = TCN.read(file);
|
||||
} catch(Exception e) {
|
||||
throw new ProjectException("Error reading config: Config formatting is invalid", e);
|
||||
}
|
||||
arguments = appArguments;
|
||||
}
|
||||
|
||||
public Task<RequestCatcherConfig[]> getCatchers() {
|
||||
return t((res, rej) -> {
|
||||
String[] catcherNames = configHolder.map.keys().toArray(new String[0]);
|
||||
RequestCatcherConfig[] catchers = new RequestCatcherConfig[catcherNames.length];
|
||||
for(int i = 0; i < catcherNames.length; i++) {
|
||||
catchers[i] = RequestCatcherConfig.make(catcherNames[i], configHolder).err(rej).ok().await();
|
||||
unblockQueue();
|
||||
}
|
||||
res.call(catchers);
|
||||
});
|
||||
}
|
||||
}
|
8
src/de/tudbut/tryumph/err/ProjectException.java
Normal file
8
src/de/tudbut/tryumph/err/ProjectException.java
Normal file
|
@ -0,0 +1,8 @@
|
|||
package de.tudbut.tryumph.err;
|
||||
|
||||
public class ProjectException extends Exception {
|
||||
|
||||
public ProjectException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
}
|
49
src/de/tudbut/tryumph/util/Compose.java
Normal file
49
src/de/tudbut/tryumph/util/Compose.java
Normal file
|
@ -0,0 +1,49 @@
|
|||
package de.tudbut.tryumph.util;
|
||||
|
||||
import de.tudbut.async.ComposeCallback;
|
||||
import tudbut.parsing.TCN;
|
||||
import tudbut.parsing.TCNArray;
|
||||
|
||||
import java.lang.reflect.Array;
|
||||
|
||||
public class Compose {
|
||||
|
||||
public static <T> ComposeCallback<TCNArray, T[]> tcnArrayToArray(Class<T> clazz) {
|
||||
return (resp, res, rej) -> {
|
||||
T[] array = (T[]) Array.newInstance(clazz, resp.size());
|
||||
for (int i = 0 ; i < resp.size() ; i++) {
|
||||
try {
|
||||
array[i] = (T) resp.get(i);
|
||||
} catch (ClassCastException e) {
|
||||
rej.call(new IllegalArgumentException("Element " + i + " of input TCNArray is not of type " + clazz.getName() + " but of type " + resp.get(i).getClass().getName(), e));
|
||||
}
|
||||
}
|
||||
res.call(array);
|
||||
};
|
||||
}
|
||||
|
||||
public static <T> ComposeCallback<TCN, T> tcnGet(String name) {
|
||||
return (resp, res, rej) -> {
|
||||
Object o = resp.get(name);
|
||||
try {
|
||||
res.call((T) o);
|
||||
} catch (ClassCastException e) {
|
||||
rej.call(new IllegalArgumentException(name + " is not of type T but of type " + o.getClass().getName(), e));
|
||||
}
|
||||
};
|
||||
}
|
||||
public static <T> ComposeCallback<TCN, T> tcnGetNonNull(String name) {
|
||||
return (resp, res, rej) -> {
|
||||
Object o = resp.get(name);
|
||||
if(o == null) {
|
||||
rej.call(new NullPointerException(name + " is null but was passed to tcnGetNonNull"));
|
||||
}
|
||||
try {
|
||||
res.call((T) o);
|
||||
} catch (ClassCastException e) {
|
||||
rej.call(new IllegalArgumentException(name + " is not of type T but of type " + o.getClass().getName(), e));
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
Loading…
Add table
Reference in a new issue