# FatJar
FatJar simple API to quick prototyping and portable web services. See **Main::main** sample class for examples.
For scripting examples, see the main.js and main.py files under resources, building for scripting instructions can be found under "Building FatJar".
Build and coverage status:
[![Build Status](https://travis-ci.org/canmogol/FatJar.svg?branch=master)](https://travis-ci.org/canmogol/FatJar) [![codecov](https://codecov.io/gh/canmogol/FatJar/branch/master/graph/badge.svg)](https://codecov.io/gh/canmogol/FatJar) [![gitter](https://badges.gitter.im/canmogol/FatJar.svg)](https://gitter.im/FatJar/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![could not deploy][2]][1] [](http://search.maven.org/#search|ga|1|FatJar)
[1]: https://fatjar-travis.herokuapp.com/
[2]: https://fatjar-travis.herokuapp.com/badgeFlat (FatJar Heroku Deployment Status)
Please check the interfaces like **HttpClient**, **JSON**, **Server** under **fatjar** package,
added sample **MyEntity** and **MyPOJO** classes under sample package for DB and JSON operations examples
Please find the swagger.yaml file as an example for service documentation,
you can edit yaml files with [Online Swagger Editor](http://editor.swagger.io/#/)
and you can convert yaml files to json to use with swagger-ui [Yaml to JSON Transformer](https://apimatic.io/transformer)
###Building FatJar
Building from source:
```sh
git clone https://github.com/canmogol/FatJar.git
cd FatJar
mvn clean install
```
if you want to use scripting engines, you should run the scripting profile, instead of "mvn clean install".
Please note that jython implementation adds around 40MB of code to code base.
```sh
mvn clean install -P scripting
```
You may run other language examples as;
##### Javascript
since javascript engine "nashorn" build in to jvm, javascript example should run without scripting profile enabled.
```sh
cd FatJar
java -jar target/FatJar-Example.jar src/main/resources/main.js
```
##### Python
python example needs the FarJar build with "scripting" profile enabled,
```sh
cd FatJar
java -jar target/FatJar-Example.jar src/main/resources/main.py
```
##### Scala
scala example needs sample-scala profile enabled, and after compilation you may run as
```sh
cd FatJar
java -jar target/FatJar-Example.jar
```
### Dependency
maven
```xml
com.fererlab
FatJar
1.3.0
```
grails
```json
compile 'com.fererlab:FatJar:1.3.0'
```
sbt
```scala
libraryDependencies += "com.fererlab" % "FatJar" % "1.3.0"
```
### Usage Examples
to create and start the server
```javascript
Server.create().listen(80, "0.0.0.0").start();
```
Listen to an http method on a path;
java
```java
Server.create()
.listen(80, "0.0.0.0")
.get("/", (req, res) -> {
res.setContent("Welcome");
res.write();
})
.start();
```
javascript
```javascript
Server.create()
.listen(8080, "0.0.0.0")
.get("/", function (req, res) {
res.setContent("Welcome");
res.write();
})
.start();
```
python
```python
Server.create()
.listen(8080, "0.0.0.0") \
.get("/", lambda req, res: (res.setContent("Welcome"), res.write())) \
.start()
```
To JSON and from JSON example
```javascript
Server.create()
.listen(80, "0.0.0.0")
.get("/toJSON", (req, res) -> {
res.setContent(JSON.toJson(new MyPOJO("john", 101)));
res.write();
})
.post("/fromJSON", (req, res) -> {
MyPOJO myPOJO = JSON.fromJson(new String(req.getBody()), MyPOJO.class);
res.setContent(JSON.toJson(myPOJO));
res.write();
})
.start();
```
To make an Http request
```javascript
Server.create()
.listen(80, "0.0.0.0")
.get("/httpClient", (req, res) -> {
try {
String content = HttpClient.create()
.url("http://ip.jsontest.com/")
.method(HttpMethod.GET)
.send()
.getContentAsString();
res.setContent("got content: " + content);
} catch (HttpClient.HttpClientException e) {
res.setContent("error: " + e);
}
res.write();
})
.start();
```
### Sample Test Request
After Main::main start
```
request : GET http://localhost:80/
response: Welcome
```
```
request : GET http://localhost:80/Hi
response: type "http://localhost:80/Hi?name=john" in your browser
```
```
request : GET http://localhost:80/Hi?name=john
response: Hello john
```
```
request : GET http://localhost:80/toJSON
response: {"age":101,"name":"john"}
```
```
request : GET http://localhost:80/toXML?name=john
response:
2147483647
john
```
Below example creates key value pairs in cache and increments 'number'
value by one on every request
```
request : GET http://localhost:80/cache
response: {"number":1,"key":"value"}
```
Below example creates and writes to a file under tmp directory
```
request : GET http://localhost:80/file
response: file content here!
```
```
request : POST http://localhost:80/fromJSON
BODY {"age":101,"name":"john"}
response: {"age":101,"name":"john"}
```
```
request : POST http://localhost:80/fromXML
BODY john27
response:
27
john
```
A database method added, you may find the count, find, insert, update and delete methods under "/db" handler.
Please find the persistence.xml file under resources/META-INF for database connection parameters
```
request : GET http://localhost:80/db
response: {"id":2,"name":"johnny"}
```
A mongodb method added, you may find the count, find, insert, update and delete methods under "/dbMongo" handler
Please find the mongodb.properties file under resources for database connection parameters
```
request : GET http://localhost:80/dbMongo
response: {"address":"Elm Street","name":"john","objectId":{"counter":15787905,"date":1479883525000,"machineIdentifier":14269665,"processIdentifier":29177,"time":1479883525000,"timeSecond":1479883525,"timestamp":1479883525},"phone":"555-4343"}
```
Example exception throw method
```
request : GET http://localhost:80/throwException
response: {"error": "fatjar.Server$ServerException: tojsonexception", "request": {...}, "status": "500"}
```
Below example will make a request to a uri that is not handled
```
request : GET http://localhost:80/notfound
response: {"error":"fatjar.Server$ServerException","status":"500"}
```
/badRequest will return html content,
this content is created by the Status.STATUS_BAD_REQUEST handler,
registered with the .register(Status.STATUS_BAD_REQUEST, ...) method
```
request : GET http://localhost:80/badRequest
response:
BAD REQUEST!
```
```
request : GET http://localhost:80/httpClient
response: got content: {"ip": "123.123.123.123"}
```
TEA and AES encryption example
```
request : GET http://localhost:80/encrypt
response: got content: TEA( clear: 123456 encrypted/decrypted: 123456)
AES (clear: 123456 encrypted/decrypted: 123456)
```
Encrypted and encoded set cookie example
```
request : GET http://localhost:80/setCookie
response: got content: cookie set
check cookie: FAT_JAR_EXAMPLE_APP, it is encoded, signed
you may find COOKIE_CONTENT as the content of the cookie
and COOKIE_SIGN_KEY as the signed part of the cookie.
Decoded COOKIE_CONTENT contains EncodedKey which is clear
EncryptedKey_COOKIE_ENCRYPTED is encrypted.
```
Encrypted and encoded get cookie example
```
request : GET http://localhost:80/getCookie
response: got content: EncodedKey:EncodedValue1111 - EncryptedKey:EncryptedValue2222
these two are the decoded and decrypted values
which set at the /setCookie call
```
Metrics example
```
request : GET http://localhost:80/metrics
response: got content: {"LastRequestTimes":[1480449981544],"ServerCreated":1480449737690,"ServerHostname":"0.0.0.0","ServerPort":58071,"ServerServices":"/login,/toJSON,/logout,/cache,/toXML,/file,/db,/httpClient,/badgeFlat,/,/Hi,/fromXML,/dbMongo,/throwException,/getCookie,/fromJSON,/aa/logged,/metrics,/encrypt,/badRequest,/setCookie","ServerStarted":1480449738287,"ServerType":"UndertowServer"}
```