Giter Site home page Giter Site logo

outr / youi Goto Github PK

View Code? Open in Web Editor NEW
209.0 16.0 28.0 101.03 MB

Next generation user interface and application development in Scala and Scala.js for web, mobile, and desktop.

Home Page: http://youi.io

License: MIT License

Scala 96.83% HTML 0.19% CSS 0.02% Shell 0.01% JavaScript 2.95%
scala undertow communication dom ui scala-js mobile android ios desktop

youi's Introduction

youi

Build Status Codacy Badge Codacy Badge Stories in Ready Gitter Maven Central Latest version Javadocs

Next generation user interface and application development in Scala and Scala.js for web, mobile, and desktop.

Status

There is heavy development going on toward 1.0, but YouI releases are stable and used in several production systems.

Modules

YouI is divided into modules of functionality to minimize the dependencies required for your specific usage:

  • app - unification of client and server to write complete applications (Scala and Scala.js)
  • canvas - User Interface implementation on HTML Canvas for greater power and flexibility than HTML provides
  • client - HTTP client for asynchronous request/response and restful support (Scala)
  • communication - communication framework to provide type-safe communication between a client / server (Scala and Scala.js)
  • core - core features generally useful for web and HTTP (Scala and Scala.js)
  • dom - features and functionality related to working with the browser's DOM (Scala.js)
  • example - example and test functionality for applications using youi
  • hypertext - extension functionality for working with HTML in a more powerful way
  • macros - internal macros for various internal uses
  • optimizer - HTML, JavaScript, and Image optimizations to reduce extra overhead from your application
  • server - base functionality for a web server (Scala)
  • server-undertow - implementation of server using Undertow (Scala)
  • spatial - Spatial and math related functionality for Matrix and other operations
  • stream - streaming functionality for on-the-fly processing and modification of any XML or HTML content (Scala)
  • utilities - internal utilities to support the infrastructure of youi

External Projects

Though this project has several sub-modules, where possible, external projects exist to add optional functionality.

  • youi-plugin - An SBT plugin to simplify setting up your youi project.
  • youi-template - Stand-alone server instance to help designers work with HTML templates locally and support integration for developers.
  • youi-designer - User interface designer tool to create, edit, import, export, and generate user interfaces for youi.
  • youi-example - An example project showing the basic usage of youi.

Tutorials

Though YouI provides many modules to accomplish many things, the primary goal of YouI is application development for web, mobile, and desktop. Take a look at the app module for a great getting started tutorial.

Examples

More examples are located in the example directory. Run them with sbt

exampleJS/fastOptJS 
exampleJVM/reStart 

then load http://localhost:8080/ui-examples.html or search with def path: for URLs.

Roadmap

https://github.com/outr/youi/wiki/Roadmap

youi's People

Contributors

darkfrog26 avatar davidgbiggs avatar freddiesanchez avatar hrj avatar jmcardon avatar lolgab avatar mmynsted avatar tindzk avatar zoosky avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

youi's Issues

Avoid Trying to Stream Directories

In #56 it was pointed out that an error occurs when attempting to access / on the examples. This is due to a problem where no other page is mapped to a path, but a registered path is found, but pointing to a directory, not a file. We need to better handle this.

Cannot run example app on 0.9.0-M8

I am trying to use the example folder of youi to understand it. I get the error below when running

sbt:youi> ;exampleJS/fastOptJS;exampleJVM/run

and accessing in browser http://localhost:8080/

2018.04.14 13:31:13 [run-main-0] INFO io.youi.server.Server.start:68 - Server started on HTTP 192.168.2.136:8080 2018.04.14 13:31:27 [XNIO-1 I/O-3] ERROR io.youi.ErrorSupport.defaultHandler:27 - java.lang.AssertionError: assertion failed: Cannot send back /Users/rva/wc/github/youi/file:/var/folders/cj/5lyfrhc94zjfsr3b501m8qzm0000gn/T/sbt_a4bf7c5a/job-1/target/1671b480/youi-example_2.12-0.9.0-M8.jar!/content as it is a directory or does not exist! at scala.Predef$.assert(Predef.scala:219) at io.youi.http.FileContent.<init>(Content.scala:30) at io.youi.http.Content$.file(Content.scala:122) at io.youi.server.dsl.package$ClassLoaderPath.$anonfun$filter$3(package.scala:85) at scala.Option.map(Option.scala:146) at io.youi.server.dsl.package$ClassLoaderPath.filter(package.scala:84) at io.youi.server.dsl.CombinedConnectionFilter.filter(CombinedConnectionFilter.scala:7) at io.youi.server.dsl.ListConnectionFilter.$anonfun$filter$1(ListConnectionFilter.scala:7) at scala.collection.immutable.Stream.flatMap(Stream.scala:490) at io.youi.server.dsl.ListConnectionFilter.filter(ListConnectionFilter.scala:7) at io.youi.server.dsl.ConnectionFilter.handle(ConnectionFilter.scala:24) at io.youi.server.dsl.ConnectionFilter.handle$(ConnectionFilter.scala:24) at io.youi.server.dsl.ListConnectionFilter.handle(ListConnectionFilter.scala:5) at io.youi.server.handler.HttpHandlerBuilder$$anon$2.handle(HttpHandlerBuilder.scala:161) at io.youi.server.Server.handleRecursive(Server.scala:110) at io.youi.server.Server.handle(Server.scala:87) at io.youi.server.Server.handle$(Server.scala:85) at io.youi.example.ServerExampleApplication$.handle(ServerExampleApplication.scala:9) at io.youi.server.UndertowServerImplementation.$anonfun$requestHandler$1(UndertowServerImplementation.scala:104) at io.youi.server.UndertowServerImplementation.$anonfun$requestHandler$1$adapted(UndertowServerImplementation.scala:102) at io.youi.server.UndertowServerImplementation$.handle$1(UndertowServerImplementation.scala:131) at io.youi.server.UndertowServerImplementation$.processRequest(UndertowServerImplementation.scala:167) at io.youi.server.UndertowServerImplementation.requestHandler(UndertowServerImplementation.scala:102) at io.youi.server.UndertowServerImplementation.$anonfun$handleRequest$1(UndertowServerImplementation.scala:91) at io.youi.ErrorSupport.errorSupport(ErrorSupport.scala:11) at io.youi.ErrorSupport.errorSupport$(ErrorSupport.scala:10) at io.youi.example.ServerExampleApplication$.errorSupport(ServerExampleApplication.scala:9) at io.youi.server.UndertowServerImplementation.handleRequest(UndertowServerImplementation.scala:74) at io.undertow.server.handlers.encoding.EncodingHandler.handleRequest(EncodingHandler.java:72) at io.undertow.server.Connectors.executeRootHandler(Connectors.java:360) at io.undertow.server.protocol.http.HttpReadListener.handleEventWithNoRunningRequest(HttpReadListener.java:255) at io.undertow.server.protocol.http.HttpReadListener.handleEvent(HttpReadListener.java:136) at io.undertow.server.protocol.http.HttpReadListener.handleEvent(HttpReadListener.java:59) at org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92) at org.xnio.conduits.ReadReadyHandler$ChannelListenerHandler.readReady(ReadReadyHandler.java:66) at org.xnio.nio.NioSocketConduit.handleReady(NioSocketConduit.java:88) at org.xnio.nio.WorkerThread.run(WorkerThread.java:561)

dependency not found

Using the giter8 template, after sbt reStart i get this:

.
[info] Resolving org.scala-lang#scala-library;2.11.5 ...

�M[info] Resolving org.hyperscala#hyperscala-ui_2.11;0.9.3 ...

�M[info] Resolving org.hyperscala#hyperscala-web_2.11;0.9.3 ...

�M[info] Resolving org.hyperscala#hyperscala-html_2.11;0.9.3 ...

�M[info] Resolving org.hyperscala#hyperscala-core_2.11;0.9.3 ...

�M[info] Resolving org.powerscala#powerscala-reflect_2.11;1.6.7 ...

�M[info] Resolving org.ow2.asm#asm-all;5.0.3 ...

�M[info] Resolving io.argonaut#argonaut_2.11;6.0.4 ...

�M[info] Resolving org.scalaz#scalaz-core_2.11;7.0.6 ...

�M[info] Resolving org.scala-lang.modules#scala-parser-combinators_2.11;1.0.1 ...

�M[info] Resolving org.scala-lang.modules#scala-xml_2.11;1.0.1 ...

�M[info] Resolving org.reflections#reflections;0.9.9 ...

�M[info] Resolving com.google.guava#guava;15.0 ...

�M[info] Resolving org.javassist#javassist;3.18.2-GA ...

�M[info] Resolving com.google.code.findbugs#annotations;2.0.1 ...

�M[info] Resolving org.scala-lang#scala-reflect;2.11.4 ...

�M[info] Resolving org.powerscala#powerscala-hierarchy_2.11;1.6.7 ...

�M[info] Resolving org.powerscala#powerscala-core_2.11;1.6.7 ...

�M[info] Resolving com.typesafe.akka#akka-actor_2.11;2.3.6 ...

�M[info] Resolving com.typesafe#config;1.2.1 ...

�M[info] Resolving org.powerscala#powerscala-event_2.11;1.6.7 ...

�M[info] Resolving org.powerscala#powerscala-concurrent_2.11;1.6.7 ...

�M[info] Resolving org.powerscala#powerscala-property_2.11;1.6.7 ...

�M[info] Resolving org.powerscala#powerscala-log_2.11;1.6.7 ...

�M[info] Resolving org.jdom#jdom2;2.0.5 ...

�M[info] Resolving jaxen#jaxen;1.1.6 ...

�M[info] Resolving net.sourceforge.htmlcleaner#htmlcleaner;2.10 ...

�M[info] Resolving org.json4s#muster-codec-jawn_2.11;0.3.0 ...

�M[info] Resolving org.json4s#muster-core_2.11;0.3.0 ...

�M[info] Resolving org.json4s#muster-codec-json_2.11;0.3.0 ...

�M[info] Resolving org.jsawn#jawn-parser_2.11;0.5.4 ...

�M[info] Resolving org.jsawn#jawn-parser_2.11;0.5.4 ...
[warn] module not found: org.jsawn#jawn-parser_2.11;0.5.4
[warn] ==== local: tried
[warn] C:\Users\xxx.ivy2\local\org.jsawn\jawn-parser_2.11\0.5.4\ivys\ivy.xml
[warn] ==== public: tried
[warn] https://repo1.maven.org/maven2/org/jsawn/jawn-parser_2.11/0.5.4/jawn-parser_2.11-0.5.4.pom
[info] Resolving org.json4s#muster-codec-jackson_2.11;0.3.0 ...

�M[info] Resolving com.fasterxml.jackson.core#jackson-core;2.4.1.1 ...

�M[info] Resolving com.fasterxml.jackson.core#jackson-databind;2.4.1.3 ...

�M[info] Resolving com.fasterxml.jackson.core#jackson-annotations;2.4.0 ...

�M[info] Resolving com.outr.net#outrnet-core_2.11;1.1.3 ...

�M[info] Resolving javax.servlet#javax.servlet-api;3.1.0 ...

�M[info] Resolving commons-fileupload#commons-fileupload;1.3.1 ...

�M[info] Resolving commons-io#commons-io;2.2 ...

�M[info] Resolving org.apache.httpcomponents#httpclient;4.3.5 ...

�M[info] Resolving org.apache.httpcomponents#httpcore;4.3.2 ...

�M[info] Resolving commons-logging#commons-logging;1.1.3 ...

�M[info] Resolving commons-codec#commons-codec;1.6 ...

�M[info] Resolving org.hyperscala#hyperscala-javascript_2.11;0.9.3 ...

�M[info] Resolving org.hyperscala#hyperscala-svg_2.11;0.9.3 ...

�M[info] Resolving net.sf.uadetector#uadetector-resources;2014.09 ...

�M[info] Resolving net.sf.uadetector#uadetector-core;0.9.21 ...

�M[info] Resolving net.sf.qualitycheck#quality-check;1.3 ...

�M[info] Resolving com.google.code.findbugs#jsr305;2.0.3 ...

�M[info] Resolving javax.annotation#jsr250-api;1.0 ...

�M[info] Resolving org.slf4j#slf4j-api;1.7.7 ...

�M[info] Resolving org.scala-lang.modules#scala-swing_2.11;1.0.1 ...

�M[info] Resolving commons-codec#commons-codec;1.9 ...

�M[info] Resolving org.hyperscala#hyperscala-realtime_2.11;0.9.3 ...

�M[info] Resolving org.hyperscala#hyperscala-jquery_2.11;0.9.3 ...

�M[info] Resolving org.hyperscala#hyperscala-connect_2.11;0.9.3 ...

�M[info] Resolving com.outr.net#outrnet-jetty_2.11;1.1.3 ...

�M[info] Resolving com.outr.net#outrnet-servlet_2.11;1.1.3 ...

�M[info] Resolving org.eclipse.jetty#jetty-server;9.2.5.v20141112 ...

�M[info] Resolving org.eclipse.jetty#jetty-http;9.2.5.v20141112 ...

�M[info] Resolving org.eclipse.jetty#jetty-util;9.2.5.v20141112 ...

�M[info] Resolving org.eclipse.jetty#jetty-io;9.2.5.v20141112 ...

�M[info] Resolving org.scala-lang#scala-compiler;2.11.5 ...

�M[info] Resolving org.scala-lang#scala-reflect;2.11.5 ...

�M[info] Resolving org.scala-lang.modules#scala-xml_2.11;1.0.3 ...

�M[info] Resolving org.scala-lang.modules#scala-parser-combinators_2.11;1.0.3 ...

�M[info] Resolving jline#jline;2.12 ...
[warn] ::::::::::::::::::::::::::::::::::::::::::::::
[warn] :: UNRESOLVED DEPENDENCIES ::
[warn] ::::::::::::::::::::::::::::::::::::::::::::::
[warn] :: org.jsawn#jawn-parser_2.11;0.5.4: not found
[warn] ::::::::::::::::::::::::::::::::::::::::::::::
[warn]
[warn] Note: Unresolved dependencies path:
[warn] org.jsawn:jawn-parser_2.11:0.5.4
[warn] +- org.json4s:muster-codec-jawn_2.11:0.3.0
[warn] +- org.hyperscala:hyperscala-core_2.11:0.9.3
[warn] +- org.hyperscala:hyperscala-html_2.11:0.9.3
[warn] +- org.hyperscala:hyperscala-svg_2.11:0.9.3
[warn] +- org.hyperscala:hyperscala-web_2.11:0.9.3
[warn] +- org.hyperscala:hyperscala-jquery_2.11:0.9.3
[warn] +- org.hyperscala:hyperscala-connect_2.11:0.9.3
[warn] +- org.hyperscala:hyperscala-realtime_2.11:0.9.3
[warn] +- org.hyperscala:hyperscala-ui_2.11:0.9.3 (F:\Projects\temp\hypertest\build.sbt#L13-14)
[warn] +- com.home:hypertest_2.11:0.1-SNAPSHOT
sbt.ResolveException: unresolved dependency: org.jsawn#jawn-parser_2.11;0.5.4: not found
at sbt.IvyActions$.sbt$IvyActions$$resolve(IvyActions.scala:243)
at sbt.IvyActions$$anonfun$updateEither$1.apply(IvyActions.scala:158)
at sbt.IvyActions$$anonfun$updateEither$1.apply(IvyActions.scala:156)
at sbt.IvySbt$Module$$anonfun$withModule$1.apply(Ivy.scala:147)
at sbt.IvySbt$Module$$anonfun$withModule$1.apply(Ivy.scala:147)
at sbt.IvySbt$$anonfun$withIvy$1.apply(Ivy.scala:124)
at sbt.IvySbt.sbt$IvySbt$$action$1(Ivy.scala:56)
at sbt.IvySbt$$anon$3.call(Ivy.scala:64)
at xsbt.boot.Locks$GlobalLock.withChannel$1(Locks.scala:93)
at xsbt.boot.Locks$GlobalLock.xsbt$boot$Locks$GlobalLock$$withChannelRetries$1(Locks.scala:78)
at xsbt.boot.Locks$GlobalLock$$anonfun$withFileLock$1.apply(Locks.scala:97)
at xsbt.boot.Using$.withResource(Using.scala:10)
at xsbt.boot.Using$.apply(Using.scala:9)
at xsbt.boot.Locks$GlobalLock.ignoringDeadlockAvoided(Locks.scala:58)
at xsbt.boot.Locks$GlobalLock.withLock(Locks.scala:48)
at xsbt.boot.Locks$.apply0(Locks.scala:31)
at xsbt.boot.Locks$.apply(Locks.scala:28)
at sbt.IvySbt.withDefaultLogger(Ivy.scala:64)
at sbt.IvySbt.withIvy(Ivy.scala:119)
at sbt.IvySbt.withIvy(Ivy.scala:116)
at sbt.IvySbt$Module.withModule(Ivy.scala:147)
at sbt.IvyActions$.updateEither(IvyActions.scala:156)
at sbt.Classpaths$$anonfun$sbt$Classpaths$$work$1$1.apply(Defaults.scala:1282)
at sbt.Classpaths$$anonfun$sbt$Classpaths$$work$1$1.apply(Defaults.scala:1279)
at sbt.Classpaths$$anonfun$doWork$1$1$$anonfun$84.apply(Defaults.scala:1309)
at sbt.Classpaths$$anonfun$doWork$1$1$$anonfun$84.apply(Defaults.scala:1307)
at sbt.Tracked$$anonfun$lastOutput$1.apply(Tracked.scala:35)
at sbt.Classpaths$$anonfun$doWork$1$1.apply(Defaults.scala:1312)
at sbt.Classpaths$$anonfun$doWork$1$1.apply(Defaults.scala:1306)
at sbt.Tracked$$anonfun$inputChanged$1.apply(Tracked.scala:45)
at sbt.Classpaths$.cachedUpdate(Defaults.scala:1324)
at sbt.Classpaths$$anonfun$updateTask$1.apply(Defaults.scala:1264)
at sbt.Classpaths$$anonfun$updateTask$1.apply(Defaults.scala:1242)
at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:40)
at sbt.std.Transform$$anon$4.work(System.scala:63)
at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
at sbt.Execute.work(Execute.scala:235)
at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:159)
at sbt.CompletionService$$anon$2.call(CompletionService.scala:28)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
error sbt.ResolveException: unresolved dependency: org.jsawn#jawn-parser_2.11;0.5.4: not found
[error] Total time: 2 s, completed

Matrix Updates

The world matrix isn't properly updating itself when content changes sometimes which creates hit detection problems.

Reload a Screen

Currently, there is no way to force reloading of just one screen. This would be beneficial for more advanced screens that may need to be refreshed.

Communication Generation Safety

When messages are sent to a communication instance if the binding isn't exactly right (ex. the package is different) the message is received, but not routed. This should be changed to throw an error as well as properly support different packages for implementation traits (rely on the shared trait's package).

Better ScreenState support

The Screen.state is very useful, but currently overly complicated to use effectively.

A few useful features:

  • Comparison support (>, <, etc.)
  • isLoaded on Screen

Convenient "origin IP" support

When a connection is proxied, it adds a custom header specifying the origin IP, but it's a pain to determine the origin IP of a proxied connection now. Adding a originalIP field to HttpRequest would help make that much easier to work with.

Undertow server implementation does not support BytesContent

scala.MatchError: BytesContent([B@78a9621a, contentType: application/json) (of class io.youi.http.content.BytesContent)
	at io.youi.server.UndertowServerImplementation$.handleStandard(UndertowServerImplementation.scala:277)
	at io.youi.server.UndertowServerImplementation$.response(UndertowServerImplementation.scala:190)
	at io.youi.server.UndertowServerImplementation.$anonfun$requestHandler$2(UndertowServerImplementation.scala:116)
	at io.youi.server.UndertowServerImplementation.$anonfun$requestHandler$2$adapted(UndertowServerImplementation.scala:115)

Code to reproduce

Error in Todo MVC example when adding a new TODO

After entering a new TODO, I see this error in the browser console:

Realtime (Tue Feb 17 2015 13:10:00 GMT+0530 (IST)): Unable to find element by id: a6480e48e45523600a0e3b6dedb23193 to set attribute onchange = return realtime.event(event, null, false, false, 0);

and also on the sbt console.

Simplify drawing to Drawable

Component is a very complex class right now and should be simplified to allow lighter weight graphical elements to exist easily. Everything should build on Drawable and provide mix-ins with Component being a higher level representation with most mix-ins already included.

Auto complete clears input

Hi,

Not 100% sure if this is an error, or if I'm just doing it incorrectly. I have the following page:

class TestPage extends Webpage( Finance ) {
    this.require( Autocomplete )
    body.contents += new Autocomplete {
        autocomplete.search := (
            ( query : String ) => Seq( "aaa", "aab" ).map( s => AutocompleteResult( s, s ))
        )
    }
}

If I type "a" in the input, the right options come up. If I select one the input is filled in. But if I click anywhere on the page the input is cleared.

The same thing happens on the examples site: http://www.hyperscala.org/example/ui/autocomplete.html

If this is expected behaviour, how do I get it to stay put?

Cheers,

Hugh.

Errors when compiling hyperscala-web

I just cloned the project and the last commit is 7fb90c3b7ba3ef6ee63bcafbcaa55cccfceff567.

I got this error when compiling on the SBT console:

[info] Compiling 33 Scala sources to /home/sen/projects/hyperscala/web/target/scala-2.10/classes...
[error] /home/sen/projects/hyperscala/web/src/main/scala/org/hyperscala/web/LoggedWebpage.scala:29: value elapsedReturn is not a member of object org.powerscala.concurrent.Time
[error]     val (result, time) = Time.elapsedReturn {
[error]                               ^
[error] /home/sen/projects/hyperscala/web/src/main/scala/org/hyperscala/web/LoggedWebpage.scala:32: type mismatch;
[error]  found   : Any
[error]  required: Double
[error]     logAccess(time)
[error]               ^
[error] /home/sen/projects/hyperscala/web/src/main/scala/org/hyperscala/web/LoggedWebpage.scala:33: type mismatch;
[error]  found   : Any
[error]  required: com.outr.net.http.response.HttpResponse
[error]     result
[error]     ^
[error] three errors found
[error] (web/compile:compile) Compilation failed

Errors when running "hello" example from local clones

Cloned and published locally these projects:

  • hyperscala
  • powerscala
  • outrnet
  • outrquery

When starting, and invoking, the hello example I get these stack-trace:

[info] 2014.05.03 11:25:07:610 [qtp1991410176-19] ERROR o.h.h.HelloSite$ - java.lang.IllegalArgumentException: Unable to invoke org.hyperscala.hello.HelloSite$.index(): org.hyperscala.hello.HelloPage with args Map()
[info]  at org.powerscala.reflect.EnhancedMethod.apply(EnhancedMethod.scala:158)
[info]  at org.hyperscala.web.StaticWebsite$$anonfun$org$hyperscala$web$StaticWebsite$$registerMethod$1.apply(StaticWebsite.scala:30)
[info]  at org.hyperscala.web.StaticWebsite$$anonfun$org$hyperscala$web$StaticWebsite$$registerMethod$1.apply(StaticWebsite.scala:30)
[info]  at org.hyperscala.web.WebpageHandler.handle(WebpageHandler.scala:47)
[info]  at org.hyperscala.web.WebpageHandler.onReceive(WebpageHandler.scala:32)
[info]  at com.outr.net.http.handler.PathMappingHandler.onReceive(PathMappingHandler.scala:16)
[info]  at com.outr.net.http.handler.HandlerProcessor$$anonfun$add$1.apply(HandlerProcessor.scala:28)
[info]  at com.outr.net.http.handler.HandlerProcessor$$anonfun$add$1.apply(HandlerProcessor.scala:27)
[info]  at org.powerscala.event.FunctionalListener.receive(FunctionalListener.scala:16)
[info]  at org.powerscala.event.processor.EventProcessor$class.fireRecursive(EventProcessor.scala:142)
[info]  at org.powerscala.event.processor.EventProcessor$class.fireInternal(EventProcessor.scala:120)
[info]  at com.outr.net.http.handler.HandlerProcessor.fireInternal(HandlerProcessor.scala:15)
[info]  at org.powerscala.event.processor.EventProcessor$class.fire(EventProcessor.scala:106)
[info]  at com.outr.net.http.handler.HandlerProcessor.fire(HandlerProcessor.scala:15)
[info]  at com.outr.net.http.handler.HandlerApplication$$anonfun$onReceive$1.apply(HandlerApplication.scala:15)
[info]  at com.outr.net.http.handler.HandlerApplication$$anonfun$onReceive$1.apply(HandlerApplication.scala:14)
[info]  at com.outr.net.http.HttpApplication$class.contextualize(HttpApplication.scala:29)
[info]  at com.outr.net.http.WebApplication.contextualize(WebApplication.scala:13)
[info]  at com.outr.net.http.handler.HandlerApplication$class.onReceive(HandlerApplication.scala:14)
[info]  at com.outr.net.http.WebApplication.com$outr$net$http$NotFoundApplication$$super$onReceive(WebApplication.scala:13)
[info]  at com.outr.net.http.NotFoundApplication$class.onReceive(NotFoundApplication.scala:14)
[info]  at com.outr.net.http.WebApplication.onReceive(WebApplication.scala:13)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$$anonfun$handle$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(OUTRNetServlet.scala:62)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$$anonfun$handle$1$$anonfun$apply$mcV$sp$1.apply(OUTRNetServlet.scala:61)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$$anonfun$handle$1$$anonfun$apply$mcV$sp$1.apply(OUTRNetServlet.scala:61)
[info]  at org.powerscala.LocalStack.context(LocalStack.scala:69)
[info]  at com.outr.net.http.HttpApplication$class.contextualize(HttpApplication.scala:31)
[info]  at com.outr.net.http.WebApplication.contextualize(WebApplication.scala:13)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$$anonfun$handle$1.apply$mcV$sp(OUTRNetServlet.scala:61)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$$anonfun$handle$1.apply(OUTRNetServlet.scala:50)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$$anonfun$handle$1.apply(OUTRNetServlet.scala:50)
[info]  at com.outr.net.http.HttpApplication$class.around(HttpApplication.scala:78)
[info]  at com.outr.net.http.WebApplication.around(WebApplication.scala:13)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$.handle(OUTRNetServlet.scala:50)
[info]  at com.outr.net.http.jetty.JettyHandler.handle(JettyHandler.scala:15)
[info]  at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
[info]  at org.eclipse.jetty.server.Server.handle(Server.java:445)
[info]  at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:269)
[info]  at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:229)
[info]  at org.eclipse.jetty.io.AbstractConnection$ReadCallback.run(AbstractConnection.java:358)
[info]  at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:601)
[info]  at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:532)
[info]  at java.lang.Thread.run(Thread.java:745)
[info] Caused by: java.lang.RuntimeException: Error(InvocationTargetException) attempting to invoke org.hyperscala.hello.HelloSite$.index(): org.hyperscala.hello.HelloPage on org.hyperscala.hello.HelloSite$@3eae389d with arguments: List()
[info]  at org.powerscala.reflect.EnhancedMethod.invoke(EnhancedMethod.scala:107)
[info]  at org.powerscala.reflect.EnhancedMethod.apply(EnhancedMethod.scala:159)
[info]  at org.hyperscala.web.StaticWebsite$$anonfun$org$hyperscala$web$StaticWebsite$$registerMethod$1.apply(StaticWebsite.scala:30)
[info]  at org.hyperscala.web.StaticWebsite$$anonfun$org$hyperscala$web$StaticWebsite$$registerMethod$1.apply(StaticWebsite.scala:30)
[info]  at org.hyperscala.web.WebpageHandler.handle(WebpageHandler.scala:47)
[info]  at org.hyperscala.web.WebpageHandler.onReceive(WebpageHandler.scala:32)
[info]  at com.outr.net.http.handler.PathMappingHandler.onReceive(PathMappingHandler.scala:16)
[info]  at com.outr.net.http.handler.HandlerProcessor$$anonfun$add$1.apply(HandlerProcessor.scala:28)
[info]  at com.outr.net.http.handler.HandlerProcessor$$anonfun$add$1.apply(HandlerProcessor.scala:27)
[info]  at org.powerscala.event.FunctionalListener.receive(FunctionalListener.scala:16)
[info]  at org.powerscala.event.processor.EventProcessor$class.fireRecursive(EventProcessor.scala:142)
[info]  at org.powerscala.event.processor.EventProcessor$class.fireInternal(EventProcessor.scala:120)
[info]  at com.outr.net.http.handler.HandlerProcessor.fireInternal(HandlerProcessor.scala:15)
[info]  at org.powerscala.event.processor.EventProcessor$class.fire(EventProcessor.scala:106)
[info]  at com.outr.net.http.handler.HandlerProcessor.fire(HandlerProcessor.scala:15)
[info]  at com.outr.net.http.handler.HandlerApplication$$anonfun$onReceive$1.apply(HandlerApplication.scala:15)
[info]  at com.outr.net.http.handler.HandlerApplication$$anonfun$onReceive$1.apply(HandlerApplication.scala:14)
[info]  at com.outr.net.http.HttpApplication$class.contextualize(HttpApplication.scala:29)
[info]  at com.outr.net.http.WebApplication.contextualize(WebApplication.scala:13)
[info]  at com.outr.net.http.handler.HandlerApplication$class.onReceive(HandlerApplication.scala:14)
[info]  at com.outr.net.http.WebApplication.com$outr$net$http$NotFoundApplication$$super$onReceive(WebApplication.scala:13)
[info]  at com.outr.net.http.NotFoundApplication$class.onReceive(NotFoundApplication.scala:14)
[info]  at com.outr.net.http.WebApplication.onReceive(WebApplication.scala:13)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$$anonfun$handle$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(OUTRNetServlet.scala:62)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$$anonfun$handle$1$$anonfun$apply$mcV$sp$1.apply(OUTRNetServlet.scala:61)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$$anonfun$handle$1$$anonfun$apply$mcV$sp$1.apply(OUTRNetServlet.scala:61)
[info]  at org.powerscala.LocalStack.context(LocalStack.scala:69)
[info]  at com.outr.net.http.HttpApplication$class.contextualize(HttpApplication.scala:31)
[info]  at com.outr.net.http.WebApplication.contextualize(WebApplication.scala:13)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$$anonfun$handle$1.apply$mcV$sp(OUTRNetServlet.scala:61)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$$anonfun$handle$1.apply(OUTRNetServlet.scala:50)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$$anonfun$handle$1.apply(OUTRNetServlet.scala:50)
[info]  at com.outr.net.http.HttpApplication$class.around(HttpApplication.scala:78)
[info]  at com.outr.net.http.WebApplication.around(WebApplication.scala:13)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$.handle(OUTRNetServlet.scala:50)
[info]  at com.outr.net.http.jetty.JettyHandler.handle(JettyHandler.scala:15)
[info]  at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
[info]  at org.eclipse.jetty.server.Server.handle(Server.java:445)
[info]  at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:269)
[info]  at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:229)
[info]  at org.eclipse.jetty.io.AbstractConnection$ReadCallback.run(AbstractConnection.java:358)
[info]  at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:601)
[info]  at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:532)
[info]  at java.lang.Thread.run(Thread.java:745)
[info] Caused by: java.lang.reflect.InvocationTargetException
[info]  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[info]  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
[info]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[info]  at java.lang.reflect.Method.invoke(Method.java:606)
[info]  at org.powerscala.reflect.EnhancedMethod.invoke(EnhancedMethod.scala:108)
[info]  at org.powerscala.reflect.EnhancedMethod.apply(EnhancedMethod.scala:159)
[info]  at org.hyperscala.web.StaticWebsite$$anonfun$org$hyperscala$web$StaticWebsite$$registerMethod$1.apply(StaticWebsite.scala:30)
[info]  at org.hyperscala.web.StaticWebsite$$anonfun$org$hyperscala$web$StaticWebsite$$registerMethod$1.apply(StaticWebsite.scala:30)
[info]  at org.hyperscala.web.WebpageHandler.handle(WebpageHandler.scala:47)
[info]  at org.hyperscala.web.WebpageHandler.onReceive(WebpageHandler.scala:32)
[info]  at com.outr.net.http.handler.PathMappingHandler.onReceive(PathMappingHandler.scala:16)
[info]  at com.outr.net.http.handler.HandlerProcessor$$anonfun$add$1.apply(HandlerProcessor.scala:28)
[info]  at com.outr.net.http.handler.HandlerProcessor$$anonfun$add$1.apply(HandlerProcessor.scala:27)
[info]  at org.powerscala.event.FunctionalListener.receive(FunctionalListener.scala:16)
[info]  at org.powerscala.event.processor.EventProcessor$class.fireRecursive(EventProcessor.scala:142)
[info]  at org.powerscala.event.processor.EventProcessor$class.fireInternal(EventProcessor.scala:120)
[info]  at com.outr.net.http.handler.HandlerProcessor.fireInternal(HandlerProcessor.scala:15)
[info]  at org.powerscala.event.processor.EventProcessor$class.fire(EventProcessor.scala:106)
[info]  at com.outr.net.http.handler.HandlerProcessor.fire(HandlerProcessor.scala:15)
[info]  at com.outr.net.http.handler.HandlerApplication$$anonfun$onReceive$1.apply(HandlerApplication.scala:15)
[info]  at com.outr.net.http.handler.HandlerApplication$$anonfun$onReceive$1.apply(HandlerApplication.scala:14)
[info]  at com.outr.net.http.HttpApplication$class.contextualize(HttpApplication.scala:29)
[info]  at com.outr.net.http.WebApplication.contextualize(WebApplication.scala:13)
[info]  at com.outr.net.http.handler.HandlerApplication$class.onReceive(HandlerApplication.scala:14)
[info]  at com.outr.net.http.WebApplication.com$outr$net$http$NotFoundApplication$$super$onReceive(WebApplication.scala:13)
[info]  at com.outr.net.http.NotFoundApplication$class.onReceive(NotFoundApplication.scala:14)
[info]  at com.outr.net.http.WebApplication.onReceive(WebApplication.scala:13)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$$anonfun$handle$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(OUTRNetServlet.scala:62)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$$anonfun$handle$1$$anonfun$apply$mcV$sp$1.apply(OUTRNetServlet.scala:61)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$$anonfun$handle$1$$anonfun$apply$mcV$sp$1.apply(OUTRNetServlet.scala:61)
[info]  at org.powerscala.LocalStack.context(LocalStack.scala:69)
[info]  at com.outr.net.http.HttpApplication$class.contextualize(HttpApplication.scala:31)
[info]  at com.outr.net.http.WebApplication.contextualize(WebApplication.scala:13)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$$anonfun$handle$1.apply$mcV$sp(OUTRNetServlet.scala:61)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$$anonfun$handle$1.apply(OUTRNetServlet.scala:50)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$$anonfun$handle$1.apply(OUTRNetServlet.scala:50)
[info]  at com.outr.net.http.HttpApplication$class.around(HttpApplication.scala:78)
[info]  at com.outr.net.http.WebApplication.around(WebApplication.scala:13)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$.handle(OUTRNetServlet.scala:50)
[info]  at com.outr.net.http.jetty.JettyHandler.handle(JettyHandler.scala:15)
[info]  at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
[info]  at org.eclipse.jetty.server.Server.handle(Server.java:445)
[info]  at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:269)
[info]  at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:229)
[info]  at org.eclipse.jetty.io.AbstractConnection$ReadCallback.run(AbstractConnection.java:358)
[info]  at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:601)
[info]  at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:532)
[info]  at java.lang.Thread.run(Thread.java:745)
[info] Caused by: java.lang.NullPointerException
[info]  at org.powerscala.Storage$.get(Storage.scala:87)
[info]  at org.powerscala.MappedStorage$class.get(Storage.scala:71)
[info]  at org.powerscala.event.EventState.get(EventState.scala:8)
[info]  at org.powerscala.Storage$class.getOrElse(Storage.scala:41)
[info]  at org.powerscala.event.EventState.getOrElse(EventState.scala:8)
[info]  at org.powerscala.event.EventState.isStopPropagation(EventState.scala:17)
[info]  at org.powerscala.event.processor.ModifiableOptionProcessor.responseFor(ModifiableOptionProcessor.scala:17)
[info]  at org.powerscala.event.processor.ModifiableOptionProcessor.responseFor(ModifiableOptionProcessor.scala:10)
[info]  at org.powerscala.event.processor.EventProcessor$class.fire(EventProcessor.scala:107)
[info]  at org.powerscala.event.processor.ModifiableOptionProcessor.fire(ModifiableOptionProcessor.scala:10)
[info]  at org.powerscala.property.Property.propertyChanging(Property.scala:61)
[info]  at org.powerscala.property.Property.apply(Property.scala:45)
[info]  at org.powerscala.property.Property.apply(Property.scala:40)
[info]  at org.powerscala.property.Property.apply(Property.scala:15)
[info]  at org.powerscala.property.PropertyLike$class.$colon$eq(PropertyLike.scala:7)
[info]  at org.powerscala.property.Property.$colon$eq(Property.scala:15)
[info]  at org.powerscala.property.Property.<init>(Property.scala:29)
[info]  at org.powerscala.property.Property.<init>(Property.scala:22)
[info]  at org.hyperscala.PropertyAttribute.<init>(PropertyAttribute.scala:11)
[info]  at org.hyperscala.PropertyAttribute$.apply(PropertyAttribute.scala:61)
[info]  at org.hyperscala.IdentifiableTag$class.$init$(IdentifiableTag.scala:16)
[info]  at org.hyperscala.html.tag.Title.<init>(Title.scala:13)
[info]  at org.hyperscala.html.tag.Head.title(Head.scala:47)
[info]  at org.hyperscala.web.Webpage.title(Webpage.scala:49)
[info]  at org.hyperscala.web.Webpage.<init>(Webpage.scala:51)
[info]  at org.hyperscala.hello.HelloPage.<init>(HelloPage.scala:9)
[info]  at org.hyperscala.hello.HelloSite$.index(HelloSite.scala:15)
[info]  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[info]  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
[info]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[info]  at java.lang.reflect.Method.invoke(Method.java:606)
[info]  at org.powerscala.reflect.EnhancedMethod.invoke(EnhancedMethod.scala:108)
[info]  at org.powerscala.reflect.EnhancedMethod.apply(EnhancedMethod.scala:159)
[info]  at org.hyperscala.web.StaticWebsite$$anonfun$org$hyperscala$web$StaticWebsite$$registerMethod$1.apply(StaticWebsite.scala:30)
[info]  at org.hyperscala.web.StaticWebsite$$anonfun$org$hyperscala$web$StaticWebsite$$registerMethod$1.apply(StaticWebsite.scala:30)
[info]  at org.hyperscala.web.WebpageHandler.handle(WebpageHandler.scala:47)
[info]  at org.hyperscala.web.WebpageHandler.onReceive(WebpageHandler.scala:32)
[info]  at com.outr.net.http.handler.PathMappingHandler.onReceive(PathMappingHandler.scala:16)
[info]  at com.outr.net.http.handler.HandlerProcessor$$anonfun$add$1.apply(HandlerProcessor.scala:28)
[info]  at com.outr.net.http.handler.HandlerProcessor$$anonfun$add$1.apply(HandlerProcessor.scala:27)
[info]  at org.powerscala.event.FunctionalListener.receive(FunctionalListener.scala:16)
[info]  at org.powerscala.event.processor.EventProcessor$class.fireRecursive(EventProcessor.scala:142)
[info]  at org.powerscala.event.processor.EventProcessor$class.fireInternal(EventProcessor.scala:120)
[info]  at com.outr.net.http.handler.HandlerProcessor.fireInternal(HandlerProcessor.scala:15)
[info]  at org.powerscala.event.processor.EventProcessor$class.fire(EventProcessor.scala:106)
[info]  at com.outr.net.http.handler.HandlerProcessor.fire(HandlerProcessor.scala:15)
[info]  at com.outr.net.http.handler.HandlerApplication$$anonfun$onReceive$1.apply(HandlerApplication.scala:15)
[info]  at com.outr.net.http.handler.HandlerApplication$$anonfun$onReceive$1.apply(HandlerApplication.scala:14)
[info]  at com.outr.net.http.HttpApplication$class.contextualize(HttpApplication.scala:29)
[info]  at com.outr.net.http.WebApplication.contextualize(WebApplication.scala:13)
[info]  at com.outr.net.http.handler.HandlerApplication$class.onReceive(HandlerApplication.scala:14)
[info]  at com.outr.net.http.WebApplication.com$outr$net$http$NotFoundApplication$$super$onReceive(WebApplication.scala:13)
[info]  at com.outr.net.http.NotFoundApplication$class.onReceive(NotFoundApplication.scala:14)
[info]  at com.outr.net.http.WebApplication.onReceive(WebApplication.scala:13)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$$anonfun$handle$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(OUTRNetServlet.scala:62)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$$anonfun$handle$1$$anonfun$apply$mcV$sp$1.apply(OUTRNetServlet.scala:61)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$$anonfun$handle$1$$anonfun$apply$mcV$sp$1.apply(OUTRNetServlet.scala:61)
[info]  at org.powerscala.LocalStack.context(LocalStack.scala:69)
[info]  at com.outr.net.http.HttpApplication$class.contextualize(HttpApplication.scala:31)
[info]  at com.outr.net.http.WebApplication.contextualize(WebApplication.scala:13)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$$anonfun$handle$1.apply$mcV$sp(OUTRNetServlet.scala:61)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$$anonfun$handle$1.apply(OUTRNetServlet.scala:50)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$$anonfun$handle$1.apply(OUTRNetServlet.scala:50)
[info]  at com.outr.net.http.HttpApplication$class.around(HttpApplication.scala:78)
[info]  at com.outr.net.http.WebApplication.around(WebApplication.scala:13)
[info]  at com.outr.net.http.servlet.OUTRNetServlet$.handle(OUTRNetServlet.scala:50)
[info]  at com.outr.net.http.jetty.JettyHandler.handle(JettyHandler.scala:15)
[info]  at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
[info]  at org.eclipse.jetty.server.Server.handle(Server.java:445)
[info]  at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:269)
[info]  at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:229)
[info]  at org.eclipse.jetty.io.AbstractConnection$ReadCallback.run(AbstractConnection.java:358)
[info]  at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:601)
[info]  at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:532)
[info]  at java.lang.Thread.run(Thread.java:745)
[info] 

Consistent text height

Currently Text measuring is based on the actual height of the content, so depending on the characters used the height will change. This causes flow issues and should be consistent based on the font and size always.

Unresolved dependency: com.outr.net:outrnet-communicate_2.11:1.1.4-SNAPSHOT

When running test from latest master:

[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::          UNRESOLVED DEPENDENCIES         ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: com.outr.net#outrnet-communicate_2.11;1.1.4-SNAPSHOT: not found
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn] 
[warn]  Note: Unresolved dependencies path:
[warn]      com.outr.net:outrnet-communicate_2.11:1.1.4-SNAPSHOT (/outr/hyperscala/project/HyperScalaBuild.scala#L83)
[warn]        +- org.hyperscala:hyperscala-web_2.11:0.10.0-SNAPSHOT

Dropzone events may interleave

It may happen that the events addedFileEvent and fileReceived are called at the same time. This lead to data dependency issues in my case. As a workaround I had to use locks, but a better solution would be if Dropzone events were not called from different threads in the first place.

val lock = new ReentrantLock()

dropzone.addedFileEvent.on { event =>
  lock.lock()
  try {
    // ...
  } finally {
    lock.unlock()
  }
}

dropzone.fileReceived.on { case (filename, file) =>
  lock.lock()
  try {
    // ...
  } finally {
    lock.unlock()
  }
}

Hard for beginners

I'm interested in learning Hyperscala, but I find it difficult to start. I think this is due to the combination of the following:
-Scala is much harder to learn/master compared to Java. Since Hyperscala heavily uses Scala, this makes it difficult to understand Hyperscala.
-SBT is difficult compared to Maven, making it difficult for beginners to setup infrastructure.
-Hyperscala has dependencies to other libraries (Netty, Powerscala, Webcommunicator), which makes code harder to read. (Maybe a facade pattern would improve this?)
-And maybe most important, component based frameworks, such as Hyperscala and Wicket, require a much higher degree of documentation than plain MVC frameworks.
Learning Play by example is easier because most programmers already understand MVC and MVC is a simple pattern. Component based frameworks usually have an unknown structure for outsiders and much more concepts to learn because the framework can be used understandably. And component based frameworks often have a larger API.

How are Scala code fragments generated (i.e. HTML=>Scala)?

Hi,
This is not an issue per se, just interested.

How exactly are you generating your Scala fragments, from HTML?

I'm assuming an HTML=>XML-DOM 'tidying' parser (like Neko) but it's the actual Scala code generation I'm interested in (TreeHugger or just static code fragments?).

Thanks

Rich

Update - after writing this, I found your 'org.hyperscala.io' package. I'll take a further look, later.

Numberguess example results in error

Tried to run the numberguess example with

> project numberguess
> run

Multiple main classes detected, select one to run:

 [1] org.hyperscala.numberguess.NumberGuessSite
 [2] org.hyperscala.numberguess.NumberGuessClientPage

Enter number: 1

However when I go to http://localhost:8080/, I get an:

An error occurred!

I see no output / error on the SBT console for this.

Am I doing something wrong?

Name not respected in chat demo (after navigating back & forward)

Steps:

  • Load the chat demo
  • Change the name (to "Sebastian")
  • Write a message

Result:

  • Message with given name written

Now:

  • Press the "back" button on the browser
  • Press "forward"
  • You should be in the same page, with the name given in the text-field
  • Type a new message and press "Send"

Expected:

  • The message is sent with the name as given in the text-field

Result:

  • The message is sent as "guest"

Deleting the last letter of the name, as to trigger on-change events, and writing it again has no effect.

Only after re-loading the page it works as normal.

Screen Transaction Support

Add support to use Reactify's transaction functionality to "apply" and "revert" upon activate and deactivate.

Periodic page update not working before realtimeEvent

I have a page which I want to periodically update with job progress information. If I change the content of some div, it does not register until a realtime event has occurred first. I'm very likely doing it incorrectly, but I can't see how to fix it. Can you help me understand?

Below is small test case. The update methods on HelloSite and HelloPage should increment a counter and have that shown in the msg div on the page. After the button is pushed, that is exactly what happens. Before the button is pressed, the updates are not propagated to the page.

FILE: site.scala
package com.hjl.hyperscala.test

import org.hyperscala.web.{StaticWebsite, BasicWebsite}
import com.outr.net.http.jetty.JettyApplication
import com.outr.net.http.session.MapSession
import org.hyperscala.web.Webpage
import org.hyperscala.html._
import org.hyperscala.realtime.{RealtimeEvent, Realtime, RealtimePage}


object HelloSite extends BasicWebsite with StaticWebsite[ MapSession ] with JettyApplication {
    def index = new HelloPage
    def helloPages = pages.collect{ case p : HelloPage => p }

    var count = 0
    override def update( delta : Double ) {
        println( "update" )
        count += 1
        super.update( delta )
    }
}

class HelloPage extends Webpage( HelloSite ) {
    this.require( Realtime )

    body.contents += new tag.H1( content = "Hello, World!" )
    val button = new tag.Button( content = "Push me!" ) {
        var count = 0
        clickEvent := RealtimeEvent()
        clickEvent.on {
            case evt => {
                count += 1
                contents replaceWith "I got pushed! " + count 
            }
        }
    }
    body.contents += button
    val msg = new tag.Div( content = HelloSite.count.toString )
    body.contents += msg

    override def update( delta : Double ) = {
        println( "update" + HelloSite.count )
        msg.contents replaceWith HelloSite.count.toString
        super.update( delta )
    }
} 

FILE: build.sbt
libraryDependencies += "org.hyperscala" %% "hyperscala-web" % "latest.release"

libraryDependencies += "org.hyperscala" %% "hyperscala-realtime" % "latest.release"

libraryDependencies += "org.powerscala" %% "powerscala-property" % "latest.release"

libraryDependencies += "com.outr.net" %% "outrnet-jetty" % "latest.release"

SETUP:
Chrome Version 36.0.1985.125
Java Version 1.8.0_11

WebSocket Client Auto-Reconnect

Support reconnecting on disconnect for WebSocket clients. This might also be a good time to add "auto-connect" support to avoid the all-too-often forgetting to connect.

Group and Container

Group will offer the ability to contain multiple elements within it, and Container will offer a much more robust implementation building on Group to provide positional adjustment, clipping, etc.

Self-hosted JS?

It would be good if HyperScala had an option to use self-hosted JS instead of referring to third-party hosts:

  • netdna.bootstrapcdn.com
  • cdnjs.cloudflare.com
  • code.createjs.com
  • code.jquery.com

Unable to access ServerImplementation before main method

In a ServerApplication instance, trying to reference the ServerImplementation results in a "No server implementation available" because the configuration has not loaded yet. This should be addressed either avoiding referencing the implementation until it's available or loading the default configuration first.

exampleJVM: No server implementation available

I want to run the example. It worked for some previous version, but after downloading a new copy I get this error after issuing sbt exampleJVM/reStart

java.lang.RuntimeException: No server implementation available.
at io.youi.server.Server.implementation(Server.scala:44)
at io.youi.server.Server.implementation$(Server.scala:31)
at io.youi.example.ServerExampleApplication$.implementation$lzycompute(ServerExampleApplication.scala:8)
at io.youi.example.ServerExampleApplication$.implementation(ServerExampleApplication.scala:8)
at io.youi.server.Server.start(Server.scala:67)
at io.youi.server.Server.start$(Server.scala:61)
at io.youi.example.ServerExampleApplication$.start(ServerExampleApplication.scala:29)
at io.youi.app.ServerApplication.main(ServerApplication.scala:283)
at io.youi.app.ServerApplication.main$(ServerApplication.scala:281)
at io.youi.example.ServerExampleApplication$.main(ServerExampleApplication.scala:8)
at io.youi.example.ServerExampleApplication.main(ServerExampleApplication.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)

Communication auto-implementation

Add support for Communication implementation generation without a Client or Server trait if there are no annotations that are required for that implementation.

Cannot set exact headers

I need to set following headers:

< Server: youi
< Content-Type: application/json
< Content-Length: 27
< Date: Sat, 02 Feb 2019 13:11:50 GMT

But youi server sends a response with these headers:

< Connection: keep-alive
< Transfer-Encoding: chunked
< Date: Sat, 02 Feb 2019 13:14:17 GMT

How it can be coded for the most efficiency in runtime?
A branch with the sample code is here.

Fix Bug with Padding

Currently, padding on a Container is not being properly applied to child positions.

No Pages Load from Example Server

Simple setup:

sbt exampleJVM/run

Then visiting any URI (e.g., http://localhost:8080/login.html) yields errors like:

2017.06.03 13:56:24:862 [XNIO-1 I/O-6] ERROR i.y.E.defaultHandler:23 - java.io.FileNotFoundException: src/main/web/login.html (No such file or directory)
	at java.io.FileInputStream.open0(Native Method)
	at java.io.FileInputStream.open(FileInputStream.java:195)
	at java.io.FileInputStream.<init>(FileInputStream.java:138)
	at io.youi.stream.HTMLParser$$anon$1.buildCache(HTMLParser.scala:55)
	at io.youi.stream.StreamableHTML.<init>(StreamableHTML.scala:8)
	at io.youi.stream.HTMLParser$.apply(HTMLParser.scala:87)
	at io.youi.stream.HTMLParser$.$anonfun$cache$1(HTMLParser.scala:32)
	at scala.collection.concurrent.Map.getOrElseUpdate(Map.scala:93)
	at scala.collection.concurrent.Map.getOrElseUpdate$(Map.scala:90)
	at scala.collection.convert.Wrappers$JConcurrentMapWrapper.getOrElseUpdate(Wrappers.scala:320)
	at io.youi.stream.HTMLParser$.cache(HTMLParser.scala:32)
	at io.youi.app.Page.process(Page.scala:33)
	at io.youi.app.Page.process$(Page.scala:32)
	at io.youi.example.GeneralPages$.process(GeneralPages.scala:9)
	at io.youi.example.GeneralPages$.process(GeneralPages.scala:9)
	at io.youi.server.handler.HttpProcessor.$anonfun$handle$1(HttpProcessor.scala:23)
	at io.youi.server.handler.HttpProcessor.$anonfun$handle$1$adapted(HttpProcessor.scala:20)
	at scala.Option.foreach(Option.scala:257)
	at io.youi.server.handler.HttpProcessor.handle(HttpProcessor.scala:20)
	at io.youi.server.handler.HttpProcessor.handle$(HttpProcessor.scala:19)
	at io.youi.example.GeneralPages$.handle(GeneralPages.scala:9)
	at io.youi.server.Server.handleRecursive(Server.scala:89)
	at io.youi.server.Server.handle(Server.scala:66)
	at io.youi.server.Server.handle$(Server.scala:64)
	at io.youi.server.UndertowServer.handle(UndertowServer.scala:3)
	at io.youi.server.UndertowServerImplementation$$anon$2.handleRequest(UndertowServerImplementation.scala:84)
	at io.youi.server.UndertowServerImplementation.$anonfun$handleRequest$1(UndertowServerImplementation.scala:76)
	at io.youi.ErrorSupport.errorSupport(ErrorSupport.scala:9)
	at io.youi.ErrorSupport.errorSupport$(ErrorSupport.scala:8)
	at io.youi.server.UndertowServer.errorSupport(UndertowServer.scala:3)
	at io.youi.server.UndertowServerImplementation.handleRequest(UndertowServerImplementation.scala:66)
	at io.undertow.server.handlers.encoding.EncodingHandler.handleRequest(EncodingHandler.java:72)
	at io.undertow.server.Connectors.executeRootHandler(Connectors.java:211)
	at io.undertow.server.protocol.http.HttpReadListener.handleEventWithNoRunningRequest(HttpReadListener.java:244)
	at io.undertow.server.protocol.http.HttpReadListener.handleEvent(HttpReadListener.java:135)
	at io.undertow.server.protocol.http.HttpReadListener.handleEvent(HttpReadListener.java:58)
	at org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92)
	at org.xnio.conduits.ReadReadyHandler$ChannelListenerHandler.readReady(ReadReadyHandler.java:66)
	at org.xnio.nio.NioSocketConduit.handleReady(NioSocketConduit.java:88)
	at org.xnio.nio.WorkerThread.run(WorkerThread.java:559)

At revision 162af13.

Abstract POST Data

Add support to parse POST data as query, XML, or JSON and then fire a bus event that can be received by children. This will allow LivePage to listen for such events.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.