public Diff reduced(String[] reducedFields) { ArrayList<Pair<String,Object>> newDiff = new ArrayList(); for (int i = 0; i < changedFields.length; i++) { String changedField = changedFields[i]; for (int j = 0; j < reducedFields.length; j++) { String reducedField = reducedFields[j]; if ( changedField.equals(reducedField) ) { newDiff.add(new Pair(reducedField,oldValues[i])); } } } String newChanged[] = new String[newDiff.size()]; Object newVals[] = new Object[newDiff.size()]; for (int i = 0; i < newDiff.size(); i++) { Pair<String, Object> stringObjectPair = newDiff.get(i); newChanged[i] = stringObjectPair.car(); newVals[i] = stringObjectPair.cdr(); } return new Diff(newChanged,newVals); }
protected Pair<Runnable,KHttpExchange> createLongPollTask(KHttpExchange exchange, HttpObjectSocket httpObjectSocket ) { return new Pair<>( () -> { Pair<byte[], Integer> nextQueuedMessage = httpObjectSocket.getNextQueuedMessage(); byte response[] = nextQueuedMessage.getFirst(); exchange.setResponseContentLength(response.length); if (response.length == 0) { exchange.endExchange(); } else { httpObjectSocket.storeLPMessage(nextQueuedMessage.getSecond(), response); try { exchange.send(new String(response,"UTF-8")); //FIXME: performance } catch (UnsupportedEncodingException ex) { Log.Error(this,ex); } exchange.endExchange(); } }, exchange ); }
public Http4K unPublishHandler(String urlPath, int port) { Pair<PathHandler, Undertow> server = serverMap.get(port); if (server!=null) { server.car().removePrefixPath(urlPath); } return this; } }
/** * return wether field is in changedfieldlist and old value of this field * @param fieldId * @return */ public Pair<Boolean,Object> hasValueChanged(String fieldId) { for (int i = 0; i < changedFields.length; i++) { String changedField = changedFields[i]; if ( fieldId.equals(changedField) ) { return new Pair<>(true,oldValues[i]); } } return new Pair<>(false,null); }
public void cancelLongPoll() { synchronized (this) { if (longPollTask!=null) { longPollTask.cdr().endExchange(); longPollTask = null; } } }
@Override public void connect(Actor facade, Function<ObjectSocket, ObjectSink> factory) throws Exception { PathHandler server = getServer(port).getFirst(); server.addExactPath( path,
@Override public IPromise closeServer() { getServer(port).getSecond().stop(); return new Promise(null); }
protected Pair<Runnable,KHttpExchange> createLongPollTask(KHttpExchange exchange, HttpObjectSocket httpObjectSocket, StreamSinkChannel sinkchannel) { return new Pair<>( () -> { if ( ! sinkchannel.isOpen() ) return; Pair<byte[], Integer> nextQueuedMessage = httpObjectSocket.getNextQueuedMessage(); byte response[] = nextQueuedMessage.getFirst(); exchange.setResponseContentLength(response.length); if (response.length == 0) { exchange.endExchange(); } else { httpObjectSocket.storeLPMessage(nextQueuedMessage.getSecond(), response);
public void triggerLongPoll() { synchronized (this) { if (longPollTask!=null) { if ( LP_DEBUG ) System.out.println("SEND PENDING "+triggerPending); if (triggerPending.get() > 0) // fixme: concurrency bug triggerPending.decrementAndGet(); Runnable car = longPollTask.car(); longPollTask = null; car.run(); } else { if ( LP_DEBUG ) System.out.println("INC PENDING "+triggerPending); triggerPending.incrementAndGet(); } } }
public Pair<byte[],Integer> getNextQueuedMessage() { synchronized (this) { // if ( queue.available() < 8 ) { try { flush(); } catch (Exception e) { FSTUtil.rethrow(e); } } if (queue.available() > 8) { int seq = queue.readInt(); int len = queue.readInt(); if (len > 0 && queue.available() >= len) return new Pair(queue.readByteArray(len), seq); else return new Pair(new byte[0], 0); } else { return new Pair(new byte[0], 0); } } }
@Override public IPromise<ActorServer> publish(Consumer<Actor> disconnectCallback) { ActorServer actorServer; try { Pair<PathHandler, Undertow> serverPair = Http4K.get().getServer(port, hostName); UndertowHttpServerConnector con = new UndertowHttpServerConnector(facade); con.setConnectionVerifier(connectionVerifier); con.setSessionTimeout(sessionTimeout); actorServer = new ActorServer( con, facade, coding == null ? new Coding(SerializerType.FSTSer) : coding ); con.setActorServer(actorServer); actorServer.start(disconnectCallback); serverPair.getFirst().addPrefixPath(urlPath, con); } catch (Exception e) { Log.Warn(null, e); return new Promise<>(null,e); } return new Promise<>(actorServer); }
public Http4K publishHandler(String hostName, String urlPath, int port, HttpHandler handler) { Pair<PathHandler, Undertow> server = getServer(port, hostName); server.car().addPrefixPath( urlPath, handler); return this; }
public synchronized Pair<PathHandler, Undertow> getServer(int port, String hostName, SSLContext context) { Pair<PathHandler, Undertow> pair = serverMap.get(port); if (pair == null) { PathHandler pathHandler = new PathHandler(); Undertow.Builder builder = Undertow.builder() .setIoThreads(UNDERTOW_IO_THREADS) .setWorkerThreads(UNDERTOW_WORKER_THREADS); Undertow server = customize(builder,pathHandler,port,hostName,context).build(); server.start(); pair = new Pair<>(pathHandler,server); serverMap.put(port,pair); } return pair; }
public Http4K publishFileSystem( String hostName, String urlPath, int port, FileResourceManager man ) { if ( ! man.getBase().isDirectory() ) { throw new RuntimeException("root must be an existing direcory:"+man.getBase().getAbsolutePath()); } Pair<PathHandler, Undertow> server = getServer(port, hostName); server.car().addPrefixPath(urlPath, new ResourceHandler(man )); return this; } public Http4K publishResourcePath( String hostName, String urlPath, int port, DynamicResourceManager man, boolean compress ) {
/** * publishes given file root * @param hostName * @param urlPath - prefixPath (e.g. /myapp/resource) * @param port * @param root - directory to be published */ public Http4K publishFileSystem( String hostName, String urlPath, int port, File root ) { if ( ! root.exists() ) root.mkdirs(); if ( ! root.isDirectory() ) { throw new RuntimeException("root must be an existing direcory:"+root.getAbsolutePath()); } Pair<PathHandler, Undertow> server = getServer(port, hostName); server.car().addPrefixPath(urlPath, new ResourceHandler(new FileResourceManager(root,100))); return this; }