mirror of
https://github.com/moparisthebest/mailiverse
synced 2024-11-22 08:52:14 -05:00
add files
This commit is contained in:
parent
e822c224af
commit
e332e79f6d
44
java/core/src/core/callback/Callback.java
Normal file
44
java/core/src/core/callback/Callback.java
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.callback;
|
||||||
|
|
||||||
|
|
||||||
|
public abstract class Callback implements CallbackInterface
|
||||||
|
{
|
||||||
|
protected Callback callback;
|
||||||
|
|
||||||
|
public Callback ()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void next (Object...arguments)
|
||||||
|
{
|
||||||
|
if (callback!=null)
|
||||||
|
callback.invoke(arguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void call (Callback callback, Object...arguments)
|
||||||
|
{
|
||||||
|
if (callback != null)
|
||||||
|
{
|
||||||
|
callback.setReturn(this.callback);
|
||||||
|
callback.invoke(arguments);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public CallbackChain addCallback (Callback callback)
|
||||||
|
{
|
||||||
|
CallbackChain chain = new CallbackChain();
|
||||||
|
return chain.addCallback(this).addCallback(callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Callback setReturn (Callback callback)
|
||||||
|
{
|
||||||
|
this.callback = callback;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
133
java/core/src/core/callback/CallbackChain.java
Normal file
133
java/core/src/core/callback/CallbackChain.java
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.callback;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import core.util.LogNull;
|
||||||
|
import core.util.LogOut;
|
||||||
|
|
||||||
|
public class CallbackChain extends Callback
|
||||||
|
{
|
||||||
|
static LogNull log = new LogNull(CallbackChain.class);
|
||||||
|
Callback head, tail, execute, next;
|
||||||
|
|
||||||
|
boolean fastFail = true;
|
||||||
|
boolean propagateOriginalArguments = false;
|
||||||
|
|
||||||
|
Object[] originalArguments;
|
||||||
|
|
||||||
|
int index = -1;
|
||||||
|
|
||||||
|
public CallbackChain()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CallbackChain addCallback (Callback callback)
|
||||||
|
{
|
||||||
|
log.debug(this,"adding callback",callback);
|
||||||
|
if (tail != null)
|
||||||
|
tail.callback = callback;
|
||||||
|
|
||||||
|
if (head == null)
|
||||||
|
head = callback;
|
||||||
|
|
||||||
|
if (next == null)
|
||||||
|
next = head;
|
||||||
|
|
||||||
|
tail = callback;
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CallbackChain setPropagateOriginalArguments ()
|
||||||
|
{
|
||||||
|
propagateOriginalArguments = true;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CallbackChain setSlowFail ()
|
||||||
|
{
|
||||||
|
fastFail = false;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void invoke(Object... arguments)
|
||||||
|
{
|
||||||
|
log.debug("invoke");
|
||||||
|
|
||||||
|
if (next == head)
|
||||||
|
originalArguments = arguments;
|
||||||
|
|
||||||
|
// reset the modifications we made during traversal
|
||||||
|
if (execute != null)
|
||||||
|
execute.callback = next;
|
||||||
|
|
||||||
|
if (tail != null && tail.callback != null)
|
||||||
|
log.error(this,"tail callback is not null!",execute,tail);
|
||||||
|
|
||||||
|
boolean hasException =
|
||||||
|
arguments != null &&
|
||||||
|
arguments.length > 0 &&
|
||||||
|
arguments[0] instanceof Exception;
|
||||||
|
|
||||||
|
if (hasException)
|
||||||
|
{
|
||||||
|
log.debug(this,"has exception");
|
||||||
|
log.exception((Exception)arguments[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we should skip to the end, and we haven't already skipped to the end
|
||||||
|
if (hasException && fastFail && execute != tail)
|
||||||
|
{
|
||||||
|
log.debug(this,"advancing to tail",tail);
|
||||||
|
next = tail;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (propagateOriginalArguments)
|
||||||
|
{
|
||||||
|
log.debug(this,"using original arguments");
|
||||||
|
arguments = originalArguments;
|
||||||
|
}
|
||||||
|
|
||||||
|
execute = next;
|
||||||
|
if (execute != null)
|
||||||
|
{
|
||||||
|
next = execute.callback;
|
||||||
|
execute.callback = this;
|
||||||
|
|
||||||
|
log.debug(this, "execute", execute, next);
|
||||||
|
execute.invoke(arguments);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
log.debug(this,"executing self callback");
|
||||||
|
|
||||||
|
// reset
|
||||||
|
next = head;
|
||||||
|
originalArguments = null;
|
||||||
|
next(arguments);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Callback[] toArray ()
|
||||||
|
{
|
||||||
|
ArrayList<Callback> array = new ArrayList<Callback>();
|
||||||
|
|
||||||
|
Callback i = head;
|
||||||
|
while (i!=null)
|
||||||
|
{
|
||||||
|
array.add(i);
|
||||||
|
i = i.callback;
|
||||||
|
}
|
||||||
|
|
||||||
|
return array.toArray(new Callback[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
62
java/core/src/core/callback/CallbackDefault.java
Normal file
62
java/core/src/core/callback/CallbackDefault.java
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.callback;
|
||||||
|
|
||||||
|
import core.util.LogNull;
|
||||||
|
|
||||||
|
public abstract class CallbackDefault extends CallbackWithVariables
|
||||||
|
{
|
||||||
|
static LogNull log = new LogNull(CallbackDefault.class);
|
||||||
|
|
||||||
|
int shouldFireNext=0;
|
||||||
|
|
||||||
|
public CallbackDefault(Object...args)
|
||||||
|
{
|
||||||
|
super(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void invoke(Object... arguments)
|
||||||
|
{
|
||||||
|
shouldFireNext++;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (arguments!=null && arguments.length==1 && arguments[0] instanceof Exception)
|
||||||
|
throw (Exception)arguments[0];
|
||||||
|
|
||||||
|
onSuccess(arguments);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
onFailure(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shouldFireNext!=0)
|
||||||
|
log.debug("**************************** NEXT NEVER CALLED, IS THIS CORRECT? *************************");
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void onSuccess (Object... arguments) throws Exception;
|
||||||
|
|
||||||
|
public void next(Object...arguments)
|
||||||
|
{
|
||||||
|
shouldFireNext--;
|
||||||
|
super.next(arguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void call(Callback callback, Object...arguments)
|
||||||
|
{
|
||||||
|
shouldFireNext--;
|
||||||
|
super.call(callback, arguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onFailure (Exception e)
|
||||||
|
{
|
||||||
|
log.error("propagating", e);
|
||||||
|
log.exception(e);
|
||||||
|
next(e);
|
||||||
|
}
|
||||||
|
}
|
16
java/core/src/core/callback/CallbackEmpty.java
Normal file
16
java/core/src/core/callback/CallbackEmpty.java
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.callback;
|
||||||
|
|
||||||
|
|
||||||
|
public class CallbackEmpty extends CallbackDefault
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void onSuccess(Object... arguments) throws Exception {
|
||||||
|
next(arguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
15
java/core/src/core/callback/CallbackInterface.java
Normal file
15
java/core/src/core/callback/CallbackInterface.java
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.callback;
|
||||||
|
|
||||||
|
import org.timepedia.exporter.client.Export;
|
||||||
|
import org.timepedia.exporter.client.Exportable;
|
||||||
|
|
||||||
|
@Export
|
||||||
|
public interface CallbackInterface extends Exportable
|
||||||
|
{
|
||||||
|
public abstract void invoke (Object ... arguments);
|
||||||
|
}
|
65
java/core/src/core/callback/CallbackSync.java
Normal file
65
java/core/src/core/callback/CallbackSync.java
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.callback;
|
||||||
|
|
||||||
|
|
||||||
|
public class CallbackSync<T>
|
||||||
|
{
|
||||||
|
CallbackChain chain;
|
||||||
|
Object[] results;
|
||||||
|
|
||||||
|
public CallbackSync(Callback callback)
|
||||||
|
{
|
||||||
|
chain = callback.addCallback(setResults_());
|
||||||
|
}
|
||||||
|
|
||||||
|
public CallbackSync<T> invoke (Object...args)
|
||||||
|
{
|
||||||
|
chain.invoke(args);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Callback setResults_()
|
||||||
|
{
|
||||||
|
return new Callback() {
|
||||||
|
public void invoke(Object... arguments) {
|
||||||
|
results = arguments;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public T exportNoException ()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return export();
|
||||||
|
}
|
||||||
|
catch (RuntimeException e)
|
||||||
|
{
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public T export() throws Exception
|
||||||
|
{
|
||||||
|
if (results != null && results.length > 0)
|
||||||
|
{
|
||||||
|
if (results[0] instanceof Exception)
|
||||||
|
{
|
||||||
|
Exception e = (Exception)results[0];
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (T)results[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
28
java/core/src/core/callback/CallbackWithVariables.java
Normal file
28
java/core/src/core/callback/CallbackWithVariables.java
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.callback;
|
||||||
|
|
||||||
|
|
||||||
|
public abstract class CallbackWithVariables extends Callback
|
||||||
|
{
|
||||||
|
protected Object[] v;
|
||||||
|
|
||||||
|
public CallbackWithVariables()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public CallbackWithVariables(Object...v)
|
||||||
|
{
|
||||||
|
this.v = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public <T> T V(int i)
|
||||||
|
{
|
||||||
|
return (T)v[i];
|
||||||
|
}
|
||||||
|
}
|
36
java/core/src/core/callbacks/CountDown.java
Normal file
36
java/core/src/core/callbacks/CountDown.java
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.callbacks;
|
||||||
|
|
||||||
|
import core.callback.Callback;
|
||||||
|
import core.callback.CallbackDefault;
|
||||||
|
import core.util.LogNull;
|
||||||
|
import core.util.LogOut;
|
||||||
|
|
||||||
|
public class CountDown extends CallbackDefault
|
||||||
|
{
|
||||||
|
static LogNull log = new LogNull(CountDown.class);
|
||||||
|
|
||||||
|
int count;
|
||||||
|
Callback onFinished;
|
||||||
|
|
||||||
|
public CountDown (int from, Callback onFinished)
|
||||||
|
{
|
||||||
|
this.count = from;
|
||||||
|
this.onFinished = onFinished;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSuccess(Object... arguments) throws Exception
|
||||||
|
{
|
||||||
|
log.debug("Countdown: ", count);
|
||||||
|
|
||||||
|
if (--count == 0)
|
||||||
|
onFinished.invoke(arguments);
|
||||||
|
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
}
|
27
java/core/src/core/callbacks/IoOnReceive.java
Normal file
27
java/core/src/core/callbacks/IoOnReceive.java
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.callbacks;
|
||||||
|
|
||||||
|
import core.callback.Callback;
|
||||||
|
import core.callback.CallbackDefault;
|
||||||
|
import core.io.IoChain;
|
||||||
|
|
||||||
|
public class IoOnReceive extends CallbackDefault
|
||||||
|
{
|
||||||
|
public IoOnReceive(IoChain chain)
|
||||||
|
{
|
||||||
|
super(chain);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onSuccess (Object... args) throws Exception
|
||||||
|
{
|
||||||
|
IoChain chain = V(0);
|
||||||
|
if (chain != null)
|
||||||
|
chain.receive((byte[])args[0]);
|
||||||
|
|
||||||
|
next(args);
|
||||||
|
}
|
||||||
|
}
|
27
java/core/src/core/callbacks/IoOpen.java
Normal file
27
java/core/src/core/callbacks/IoOpen.java
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.callbacks;
|
||||||
|
|
||||||
|
import core.callback.Callback;
|
||||||
|
import core.callback.CallbackDefault;
|
||||||
|
import core.io.IoChain;
|
||||||
|
|
||||||
|
public class IoOpen extends CallbackDefault
|
||||||
|
{
|
||||||
|
public IoOpen(IoChain chain)
|
||||||
|
{
|
||||||
|
super(chain);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onSuccess (Object... args) throws Exception
|
||||||
|
{
|
||||||
|
IoChain chain = (IoChain)V(0);
|
||||||
|
if (chain != null)
|
||||||
|
chain.open();
|
||||||
|
|
||||||
|
next(args);
|
||||||
|
}
|
||||||
|
}
|
26
java/core/src/core/callbacks/IoSend.java
Normal file
26
java/core/src/core/callbacks/IoSend.java
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.callbacks;
|
||||||
|
|
||||||
|
import core.callback.Callback;
|
||||||
|
import core.callback.CallbackDefault;
|
||||||
|
import core.io.IoChain;
|
||||||
|
|
||||||
|
public class IoSend extends CallbackDefault
|
||||||
|
{
|
||||||
|
public IoSend(IoChain chain)
|
||||||
|
{
|
||||||
|
super(chain);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onSuccess (Object... args) throws Exception
|
||||||
|
{
|
||||||
|
IoChain chain = V(0);
|
||||||
|
chain.send((byte[])args[0]);
|
||||||
|
|
||||||
|
next(args);
|
||||||
|
}
|
||||||
|
}
|
24
java/core/src/core/callbacks/IoStop.java
Normal file
24
java/core/src/core/callbacks/IoStop.java
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.callbacks;
|
||||||
|
|
||||||
|
import core.callback.CallbackDefault;
|
||||||
|
import core.io.IoChain;
|
||||||
|
|
||||||
|
public class IoStop extends CallbackDefault
|
||||||
|
{
|
||||||
|
public IoStop()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onSuccess (Object... arguments) throws Exception
|
||||||
|
{
|
||||||
|
IoChain io = (IoChain)arguments[0];
|
||||||
|
io.stop();
|
||||||
|
|
||||||
|
next(arguments[1]);
|
||||||
|
}
|
||||||
|
}
|
19
java/core/src/core/callbacks/JSONDeserialize.java
Normal file
19
java/core/src/core/callbacks/JSONDeserialize.java
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.callbacks;
|
||||||
|
|
||||||
|
import core.callback.Callback;
|
||||||
|
import core.callback.CallbackDefault;
|
||||||
|
import core.util.JSONSerializer;
|
||||||
|
import core.util.Zip;
|
||||||
|
|
||||||
|
public class JSONDeserialize extends CallbackDefault
|
||||||
|
{
|
||||||
|
public void onSuccess (Object... args) throws Exception
|
||||||
|
{
|
||||||
|
callback.invoke(JSONSerializer.deserialize((byte[])args[0]));
|
||||||
|
}
|
||||||
|
};
|
17
java/core/src/core/callbacks/JSONSerialize.java
Normal file
17
java/core/src/core/callbacks/JSONSerialize.java
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.callbacks;
|
||||||
|
|
||||||
|
import core.callback.CallbackDefault;
|
||||||
|
import core.util.JSONSerializer;
|
||||||
|
|
||||||
|
public class JSONSerialize extends CallbackDefault
|
||||||
|
{
|
||||||
|
public void onSuccess (Object... args) throws Exception
|
||||||
|
{
|
||||||
|
callback.invoke(JSONSerializer.serialize(args[0]));
|
||||||
|
}
|
||||||
|
};
|
67
java/core/src/core/callbacks/Memory.java
Normal file
67
java/core/src/core/callbacks/Memory.java
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.callbacks;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import core.callback.Callback;
|
||||||
|
import core.callback.CallbackDefault;
|
||||||
|
|
||||||
|
public class Memory
|
||||||
|
{
|
||||||
|
public Map<String, Object> memory = new HashMap<String, Object>();
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public <T> T get (String key)
|
||||||
|
{
|
||||||
|
return (T)memory.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void put (String key, Object o)
|
||||||
|
{
|
||||||
|
memory.put(key, o);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Callback store_(Object...keys)
|
||||||
|
{
|
||||||
|
return new CallbackDefault(keys) {
|
||||||
|
@Override
|
||||||
|
public void onSuccess(Object... arguments) throws Exception
|
||||||
|
{
|
||||||
|
for (int i=0; i<v.length; ++i)
|
||||||
|
{
|
||||||
|
memory.put((String)v[i], arguments[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
next(arguments);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public Callback restore_(Object...keys)
|
||||||
|
{
|
||||||
|
return new CallbackDefault(keys) {
|
||||||
|
public void onSuccess(Object...arguments) {
|
||||||
|
Object[] keys = v;
|
||||||
|
Object[] args = new Object[keys.length];
|
||||||
|
|
||||||
|
int j=0;
|
||||||
|
for (Object i : keys)
|
||||||
|
{
|
||||||
|
if (i instanceof Integer)
|
||||||
|
args[j++] = arguments[(Integer)i];
|
||||||
|
else
|
||||||
|
args[j++] = memory.get((String)i);
|
||||||
|
}
|
||||||
|
|
||||||
|
next(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
43
java/core/src/core/callbacks/SaveArguments.java
Normal file
43
java/core/src/core/callbacks/SaveArguments.java
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.callbacks;
|
||||||
|
|
||||||
|
import core.callback.Callback;
|
||||||
|
import core.callback.CallbackDefault;
|
||||||
|
|
||||||
|
public class SaveArguments extends CallbackDefault{
|
||||||
|
|
||||||
|
Object[] saved;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSuccess(Object... save) throws Exception {
|
||||||
|
this.saved = save;
|
||||||
|
next(save);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Callback restore_(int...indexes)
|
||||||
|
{
|
||||||
|
return new CallbackDefault (new Object[] {indexes})
|
||||||
|
{
|
||||||
|
public void onSuccess(Object...arguments) {
|
||||||
|
int[] indexes = V(0);
|
||||||
|
Object[] args = new Object[indexes.length];
|
||||||
|
|
||||||
|
int j=0;
|
||||||
|
for (int i : indexes)
|
||||||
|
{
|
||||||
|
if (i < 100)
|
||||||
|
args[j++] = arguments[i];
|
||||||
|
else
|
||||||
|
args[j++] = saved[i-100];
|
||||||
|
}
|
||||||
|
|
||||||
|
next(args);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
15
java/core/src/core/callbacks/Single.java
Normal file
15
java/core/src/core/callbacks/Single.java
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.callbacks;
|
||||||
|
|
||||||
|
import core.callback.Callback;
|
||||||
|
|
||||||
|
public class Single extends CountDown
|
||||||
|
{
|
||||||
|
public Single(Callback onFinished) {
|
||||||
|
super(1, onFinished);
|
||||||
|
}
|
||||||
|
}
|
26
java/core/src/core/callbacks/Split.java
Normal file
26
java/core/src/core/callbacks/Split.java
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.callbacks;
|
||||||
|
|
||||||
|
import core.callback.Callback;
|
||||||
|
|
||||||
|
public class Split extends Callback {
|
||||||
|
|
||||||
|
Callback split;
|
||||||
|
|
||||||
|
public Split(Callback split)
|
||||||
|
{
|
||||||
|
this.split = split;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void invoke(Object... arguments) {
|
||||||
|
split.invoke(arguments);
|
||||||
|
|
||||||
|
next(arguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
42
java/core/src/core/callbacks/SuccessFailure.java
Normal file
42
java/core/src/core/callbacks/SuccessFailure.java
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.callbacks;
|
||||||
|
|
||||||
|
import core.callback.Callback;
|
||||||
|
import core.callback.CallbackDefault;
|
||||||
|
import core.util.LogNull;
|
||||||
|
import core.util.LogOut;
|
||||||
|
|
||||||
|
public class SuccessFailure extends CallbackDefault
|
||||||
|
{
|
||||||
|
LogNull log = new LogNull(SuccessFailure.class);
|
||||||
|
Callback succeed, fail;
|
||||||
|
|
||||||
|
public SuccessFailure (Callback succeed, Callback fail)
|
||||||
|
{
|
||||||
|
this.succeed = succeed;
|
||||||
|
this.fail = fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSuccess(Object... arguments) throws Exception
|
||||||
|
{
|
||||||
|
log.debug("onSuccess");
|
||||||
|
|
||||||
|
succeed.setReturn(callback);
|
||||||
|
succeed.invoke(arguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(Exception e)
|
||||||
|
{
|
||||||
|
log.debug("onFailure, transmogrifying to string",e);
|
||||||
|
|
||||||
|
fail.setReturn(callback);
|
||||||
|
fail.invoke(e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
74
java/core/src/core/client/ClientCreateSession.java
Normal file
74
java/core/src/core/client/ClientCreateSession.java
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.client;
|
||||||
|
|
||||||
|
import com.jordanzimmerman.SRPVerifier;
|
||||||
|
|
||||||
|
import core.callback.Callback;
|
||||||
|
import core.callbacks.IoSend;
|
||||||
|
import core.callbacks.JSONSerialize;
|
||||||
|
import core.constants.ConstantsVersion;
|
||||||
|
import core.crypt.Cryptor;
|
||||||
|
import core.crypt.KeyPairFromPassword;
|
||||||
|
import core.io.IoChain;
|
||||||
|
import core.srp.SRPPackets;
|
||||||
|
import core.srp.client.SRPClient;
|
||||||
|
import core.util.SimpleSerializer;
|
||||||
|
|
||||||
|
|
||||||
|
public class ClientCreateSession extends IoChain
|
||||||
|
{
|
||||||
|
static { SRPPackets.register(); }
|
||||||
|
|
||||||
|
Cryptor cryptor;
|
||||||
|
Callback callback;
|
||||||
|
String user;
|
||||||
|
KeyPairFromPassword keyPair;
|
||||||
|
byte[] extra;
|
||||||
|
|
||||||
|
public ClientCreateSession (Cryptor cryptor, String user, KeyPairFromPassword keyPair, byte[] extra, Callback callback, IoChain session)
|
||||||
|
{
|
||||||
|
super(session);
|
||||||
|
|
||||||
|
this.user = user;
|
||||||
|
this.keyPair = keyPair;
|
||||||
|
this.callback = callback;
|
||||||
|
this.extra = extra;
|
||||||
|
this.cryptor = cryptor;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void open () throws Exception
|
||||||
|
{
|
||||||
|
SRPVerifier verifier = SRPClient.createVerifierFromKeyPair(keyPair);
|
||||||
|
|
||||||
|
SRPPackets.PacketInit_ClientPreAutheticationInitialization init =
|
||||||
|
new SRPPackets.PacketInit_ClientPreAutheticationInitialization(
|
||||||
|
ConstantsVersion.LOGIN, user, verifier.verifier_v.toByteArray(), verifier.salt_s.toByteArray()
|
||||||
|
);
|
||||||
|
|
||||||
|
init.extra = extra;
|
||||||
|
|
||||||
|
new JSONSerialize()
|
||||||
|
.addCallback(cryptor.encrypt_())
|
||||||
|
.addCallback(SRPPackets.PacketInit_EncryptedPacket.wrap_())
|
||||||
|
.addCallback(new JSONSerialize())
|
||||||
|
.addCallback(new IoSend(sender))
|
||||||
|
.invoke(init);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onReceive (byte[] bytes) throws Exception
|
||||||
|
{
|
||||||
|
callback.invoke(this, bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onException(Exception e)
|
||||||
|
{
|
||||||
|
callback.invoke(this, e);
|
||||||
|
}
|
||||||
|
}
|
61
java/core/src/core/client/ClientTestCreateSession.java
Normal file
61
java/core/src/core/client/ClientTestCreateSession.java
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.client;
|
||||||
|
|
||||||
|
import core.callback.Callback;
|
||||||
|
import core.callbacks.IoSend;
|
||||||
|
import core.callbacks.JSONSerialize;
|
||||||
|
import core.constants.ConstantsVersion;
|
||||||
|
import core.crypt.Cryptor;
|
||||||
|
import core.io.IoChain;
|
||||||
|
import core.srp.SRPPackets;
|
||||||
|
import core.srp.SRPPackets.PacketInit_ClientTestCreate;
|
||||||
|
import core.util.SimpleSerializer;
|
||||||
|
|
||||||
|
|
||||||
|
public class ClientTestCreateSession extends IoChain
|
||||||
|
{
|
||||||
|
static { SRPPackets.register(); }
|
||||||
|
|
||||||
|
Cryptor cryptor;
|
||||||
|
Callback callback;
|
||||||
|
String user;
|
||||||
|
|
||||||
|
public ClientTestCreateSession (Cryptor cryptor, String user, Callback callback, IoChain session)
|
||||||
|
{
|
||||||
|
super(session);
|
||||||
|
|
||||||
|
this.user = user;
|
||||||
|
this.callback = callback;
|
||||||
|
this.cryptor = cryptor;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void open () throws Exception
|
||||||
|
{
|
||||||
|
SRPPackets.PacketInit_ClientTestCreate test =
|
||||||
|
new PacketInit_ClientTestCreate(ConstantsVersion.LOGIN, user);
|
||||||
|
|
||||||
|
new JSONSerialize()
|
||||||
|
.addCallback(cryptor.encrypt_())
|
||||||
|
.addCallback(SRPPackets.PacketInit_EncryptedPacket.wrap_())
|
||||||
|
.addCallback(new JSONSerialize())
|
||||||
|
.addCallback(new IoSend(sender))
|
||||||
|
.invoke(test);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onReceive (byte[] bytes) throws Exception
|
||||||
|
{
|
||||||
|
callback.invoke(this, bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onException(Exception e)
|
||||||
|
{
|
||||||
|
callback.invoke(this, e);
|
||||||
|
}
|
||||||
|
}
|
49
java/core/src/core/client/ClientUserSession.java
Normal file
49
java/core/src/core/client/ClientUserSession.java
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.client;
|
||||||
|
|
||||||
|
import core.callback.Callback;
|
||||||
|
import core.client.messages.ClientMessagesSerializerJSON;
|
||||||
|
import core.client.messages.Message;
|
||||||
|
import core.client.messages.Response;
|
||||||
|
import core.io.IoChain;
|
||||||
|
import core.srp.SRPPackets;
|
||||||
|
import core.util.SimpleSerializer;
|
||||||
|
|
||||||
|
public class ClientUserSession extends IoChain
|
||||||
|
{
|
||||||
|
static { SRPPackets.register(); ClientMessagesSerializerJSON.register(); }
|
||||||
|
|
||||||
|
Callback callback;
|
||||||
|
Message message;
|
||||||
|
|
||||||
|
public ClientUserSession (Message message, Callback callback, IoChain sender)
|
||||||
|
{
|
||||||
|
super(sender);
|
||||||
|
|
||||||
|
this.message = message;
|
||||||
|
this.callback = callback;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void open () throws Exception
|
||||||
|
{
|
||||||
|
sender.send(SimpleSerializer.serialize(message));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onReceive (byte[] bytes) throws Exception
|
||||||
|
{
|
||||||
|
Response message = SimpleSerializer.deserialize(bytes);
|
||||||
|
callback.invoke(this, message.getBlock());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onException(Exception e)
|
||||||
|
{
|
||||||
|
callback.invoke(this, e);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,107 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.client.messages;
|
||||||
|
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import core.util.Base64;
|
||||||
|
import core.util.CallSingle;
|
||||||
|
import core.util.JSONRegistry;
|
||||||
|
|
||||||
|
|
||||||
|
public class ClientMessagesSerializerJSON
|
||||||
|
{
|
||||||
|
static public void register () {}
|
||||||
|
|
||||||
|
static {
|
||||||
|
JSONRegistry.register (
|
||||||
|
"core.client.messages.Get",
|
||||||
|
new CallSingle<JSONObject,Object> () {
|
||||||
|
@Override
|
||||||
|
public JSONObject invoke(Object v) throws Exception
|
||||||
|
{
|
||||||
|
Get get = (Get)v;
|
||||||
|
JSONObject object = new JSONObject();
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new CallSingle<Object,JSONObject> () {
|
||||||
|
@Override
|
||||||
|
public Object invoke(JSONObject v) throws Exception
|
||||||
|
{
|
||||||
|
return new Get();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
JSONRegistry.register (
|
||||||
|
"core.client.messages.Delete",
|
||||||
|
new CallSingle<JSONObject,Object> () {
|
||||||
|
@Override
|
||||||
|
public JSONObject invoke(Object v) throws Exception
|
||||||
|
{
|
||||||
|
JSONObject object = new JSONObject();
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new CallSingle<Object,JSONObject> () {
|
||||||
|
@Override
|
||||||
|
public Object invoke(JSONObject v) throws Exception
|
||||||
|
{
|
||||||
|
return new Delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
JSONRegistry.register (
|
||||||
|
"core.client.messages.Put",
|
||||||
|
new CallSingle<JSONObject,Object> () {
|
||||||
|
@Override
|
||||||
|
public JSONObject invoke(Object v) throws Exception
|
||||||
|
{
|
||||||
|
Put set = (Put)v;
|
||||||
|
JSONObject object = new JSONObject();
|
||||||
|
object.put("block", Base64.encode(set.getBlock()));
|
||||||
|
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new CallSingle<Object,JSONObject> () {
|
||||||
|
@Override
|
||||||
|
public Object invoke(JSONObject v) throws Exception
|
||||||
|
{
|
||||||
|
return new Put(Base64.decode(v.getString("block")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
JSONRegistry.register (
|
||||||
|
"core.client.messages.Response",
|
||||||
|
new CallSingle<JSONObject,Object> () {
|
||||||
|
@Override
|
||||||
|
public JSONObject invoke(Object v) throws Exception
|
||||||
|
{
|
||||||
|
Response response = (Response)v;
|
||||||
|
JSONObject object = new JSONObject();
|
||||||
|
if (response.getBlock() != null)
|
||||||
|
object.put("block", Base64.encode(response.getBlock()));
|
||||||
|
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new CallSingle<Object,JSONObject> () {
|
||||||
|
@Override
|
||||||
|
public Object invoke(JSONObject v) throws Exception
|
||||||
|
{
|
||||||
|
if (v.has("block"))
|
||||||
|
return new Response(Base64.decode(v.getString("block")));
|
||||||
|
else
|
||||||
|
return new Response();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
14
java/core/src/core/client/messages/Delete.java
Normal file
14
java/core/src/core/client/messages/Delete.java
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.client.messages;
|
||||||
|
|
||||||
|
public class Delete extends Message
|
||||||
|
{
|
||||||
|
public Delete ()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
13
java/core/src/core/client/messages/Get.java
Normal file
13
java/core/src/core/client/messages/Get.java
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.client.messages;
|
||||||
|
|
||||||
|
public class Get extends Message
|
||||||
|
{
|
||||||
|
public Get ()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
11
java/core/src/core/client/messages/Message.java
Normal file
11
java/core/src/core/client/messages/Message.java
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.client.messages;
|
||||||
|
|
||||||
|
public class Message
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
21
java/core/src/core/client/messages/Put.java
Normal file
21
java/core/src/core/client/messages/Put.java
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.client.messages;
|
||||||
|
|
||||||
|
public class Put extends Message
|
||||||
|
{
|
||||||
|
byte[] block;
|
||||||
|
|
||||||
|
public Put(byte[] block)
|
||||||
|
{
|
||||||
|
this.block = block;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] getBlock()
|
||||||
|
{
|
||||||
|
return block;
|
||||||
|
}
|
||||||
|
}
|
26
java/core/src/core/client/messages/Response.java
Normal file
26
java/core/src/core/client/messages/Response.java
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
package core.client.messages;
|
||||||
|
|
||||||
|
public class Response extends Message
|
||||||
|
{
|
||||||
|
byte[] block;
|
||||||
|
|
||||||
|
public Response ()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Response (byte[] block)
|
||||||
|
{
|
||||||
|
this.block = block;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] getBlock()
|
||||||
|
{
|
||||||
|
return block;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user