True Object-Oriented Java Web Framework

Overview

Donate via Zerocracy

EO principles respected here Managed by Zerocracy DevOps By Rultor.com We recommend IntelliJ IDEA

Build Status Build status Javadoc codebeat badge Codacy Badge License

jpeek report Test Coverage Hits-of-Code SonarQube Maintainability

Maven Central PDD status

Project architect: @paulodamaso

Takes is a true object-oriented and immutable Java8 web development framework. Its key benefits, comparing to all others, include these four fundamental principles:

  1. Not a single null (why NULL is bad?)
  2. Not a single public static method (why they are bad?)
  3. Not a single mutable class (why they are bad?)
  4. Not a single instanceof keyword, type casting, or reflection (why?)

Of course, there are no configuration files. Besides that, these are more traditional features, out of the box:

This is what is not supported and won't be supported:

These two web systems use Takes, and they are open source: wring.io (sources), jare.io (sources).

Watch these videos to learn more: An Immutable Object-Oriented Web Framework and Takes, Java Web Framework, Intro. This blog post may help you too.

Contents

Quick Start

Create this App.java file:

import org.takes.http.Exit;
import org.takes.http.FtBasic;
import org.takes.facets.fork.FkRegex;
import org.takes.facets.fork.TkFork;
public final class App {
  public static void main(final String... args) throws Exception {
    new FtBasic(
      new TkFork(new FkRegex("/", "hello, world!")), 8080
    ).start(Exit.NEVER);
  }
}

Then, download takes.jar and compile your Java code:

$ javac -cp takes.jar App.java

Now, run it like this:

$ java -Dfile.encoding=UTF-8 -cp takes.jar:. App

Should work :)

This code starts a new HTTP server on port 8080 and renders a plain-text page on all requests at the root URI.

Important: Pay attention that UTF-8 encoding is set on the command line. The entire framework relies on your default Java encoding, which is not necessarily UTF-8 by default. To be sure, always set it on the command line with file.encoding Java argument. We decided not to hard-code "UTF-8" in our code mostly because this would be against the entire idea of Java localization, according to which a user always should have a choice of encoding and language selection. We're using Charset.defaultCharset() everywhere in the code.

Build and Run With Maven

If you're using Maven, this is how your pom.xml should look like:

<project>
  <dependencies>
    <dependency>
      <groupId>org.takes</groupId>
      <artifactId>takes</artifactId>
    </dependency>
  </dependencies>
  <profiles>
    <profile>
      <id>hit-refresh</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.3</version>
            <executions>
              <execution>
                <id>start-server</id>
                <phase>pre-integration-test</phase>
                <goals>
                  <goal>java</goal>
                </goals>
              </execution>
            </executions>
            <configuration>
              <mainClass>foo.App</mainClass> <!-- your main class -->
              <cleanupDaemonThreads>false</cleanupDaemonThreads>
              <arguments>
                <argument>--port=${port}</argument>
              </arguments>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>
</project>

With this configuration you can run it from command line:

$ mvn clean integration-test -Phit-refresh -Dport=8080

Maven will start the server and you can see it at http://localhost:8080.

Using in servlet app

Create a take with constructor accepting ServletContext:

package com.myapp;

public final class TkApp implements Take {
  private final ServletContext ctx;

  public TkApp(final ServletContext context) {
    this.ctx = context;
  }

  @Override
  public Response act(final Request req) throws Exception {
    return new RsText("Hello servlet!");
  }
}

Add org.takes.servlet.SrvTake to your web.xml, don't forget to specify take class as servlet init-param:

  <servlet>
    <servlet-name>takes</servlet-name>
    <servlet-class>org.takes.servlet.SrvTake</servlet-class>
    <init-param>
      <param-name>take</param-name>
      <param-value>com.myapp.TkApp</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>takes</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

Build and Run With Gradle

If you're using Gradle, this is how your build.gradle should look like:

plugins {
    id 'java'
    id 'application'
}

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'org.takes', name: 'takes', version: '1.11.3'
}

mainClassName='foo.App' //your main class

With this configuration you can run it from command line:

$ gradle run -Phit-refresh -Dport=8080

Unit Testing

This is how you can unit test the app, using JUnit 4.x and Hamcrest:

public final class AppTest {
  @Test
  public void returnsHttpResponse() throws Exception {
    MatcherAssert.assertThat(
      new RsPrint(
        new App().act(new RqFake("GET", "/"))
      ).printBody(),
      Matchers.equalsTo("hello, world!")
    );
  }
}

You can create a fake request with form parameters like this:

new RqForm.Fake(
  new RqFake(),
  "foo", "value-1",
  "bar", "value-2"
)

Integration Testing

Here is how you can test the entire server via HTTP, using JUnit and jcabi-http for making HTTP requests:

public final class AppITCase {
  @Test
  public void returnsTextPageOnHttpRequest() throws Exception {
    new FtRemote(new App()).exec(
      new FtRemote.Script() {
        @Override
        public void exec(final URI home) throws IOException {
          new JdkRequest(home)
            .fetch()
            .as(RestResponse.class)
            .assertStatus(HttpURLConnection.HTTP_OK)
            .assertBody(Matchers.equalTo("hello, world!"));
        }
      }
    );
  }
}

More complex integration testing examples you can find in one of the open source projects that are using Take, for example: rultor.com.

A Bigger Example

Let's make it a bit more sophisticated:

public final class App {
  public static void main(final String... args) {
    new FtBasic(
      new TkFork(
        new FkRegex("/robots\\.txt", ""),
        new FkRegex("/", new TkIndex())
      ),
      8080
    ).start(Exit.NEVER);
  }
}

The FtBasic is accepting new incoming sockets on port 8080, parses them according to HTTP 1.1 specification and creates instances of class Request. Then, it gives requests to the instance of TkFork (tk stands for "take") and expects it to return an instance of Take back. As you probably understood already, the first regular expression that matches returns a take. TkIndex is our custom class, let's see how it looks:

public final class TkIndex implements Take {
  @Override
  public Response act(final Request req) {
    return new RsHtml("<html>Hello, world!</html>");
  }
}

It is immutable and must implement a single method act(), which is returning an instance of Response. So far so good, but this class doesn't have an access to an HTTP request. Here is how we solve this:

new TkFork(
  new FkRegex(
    "/file/(?<path>[^/]+)",
    new TkRegex() {
      @Override
      public Response act(final RqRegex request) throws Exception {
        final File file = new File(
          request.matcher().group("path")
        );
        return new RsHTML(
          FileUtils.readFileToString(file, Charsets.UTF_8)
        );
      }
    }
  )
)

We're using TkRegex instead of Take, in order to deal with RqRegex instead of a more generic Request. RqRegex gives an instance of Matcher used by FkRegex for pattern matching.

Here is a more complex and verbose example:

public final class App {
  public static void main(final String... args) {
    new FtBasic(
      new TkFork(
        new FkRegex("/robots.txt", ""),
        new FkRegex("/", new TkIndex()),
        new FkRegex(
          "/xsl/.*",
          new TkWithType(new TkClasspath(), "text/xsl")
        ),
        new FkRegex("/account", new TkAccount(users)),
        new FkRegex("/balance/(?<user>[a-z]+)", new TkBalance())
      )
    ).start(Exit.NEVER);
  }
}

Front interface

Essential part of Bigger Example is Front interface. It's encapsulates server's back-end and used to start an instance, which will accept requests and return results. FtBasic, which is a basic front, implements that interface - you've seen it's usage in above mentioned example.

There are other useful implementations of this interface:

Back interface

Back interface is the back-end that is responsible for IO operations on TCP network level. There are various useful implementations of that interface:

  • The BkBasic class is a basic implementation of the Back interface. It is responsible for accepting the request from Socket, converting the socket's input to the Request, dispatching it to the provided Take instance, getting the result and printing it to the socket's output until all the request is fulfilled.
  • The BkParallel class is a decorator of the Back interface, that is responsible for running the back-end in parallel threads. You can specify the number of threads or try to use the default number, which depends on available processors number in JVM.
  • The BkSafe class is a decorator of the Back interface, that is responsible for running the back-end in a safe mode. That means that it will ignore exception thrown from original Back.
  • The BkTimeable class is a decorator of the Back interface, that is responsible for running the back-end for specified maximum lifetime in milliseconds. It is constantly checking if the thread with original back exceeds provided limit and if so - it's interrupts the thread of that back.
  • The BkWrap class is a convenient wrap over the original Back instance. It's just delegates the accept to that Back and might be useful if you want to add your own decorators of the Back interface. This class is used in BkParallel and BkSafe as a parent class.

Templates

Now let's see how we can render something more complex than an plain text. First, XML+XSLT is a recommended mechanism of HTML rendering. Even though it may be too complex, give it a try, you won't regret. Here is how we render a simple XML page that is transformed to HTML5 on-fly (more about RsXembly read below):

public final class TkAccount implements Take {
  private final Users users;
  public TkAccount(final Users users) {
    this.users = users;
  }
  @Override
  public Response act(final Request req) {
    final User user = this.users.find(new RqCookies(req).get("user"));
    return new RsLogin(
      new RsXSLT(
        new RsXembly(
          new XeStylesheet("/xsl/account.xsl"),
          new XeAppend("page", user)
        )
      ),
      user
    );
  }
}

This is how that User class may look like:

public final class User implements XeSource {
  private final String name;
  private final int balance;
  @Override
  public Iterable<Directive> toXembly() {
    return new Directives().add("user")
      .add("name").set(this.name).up()
      .add("balance").set(Integer.toString(this.balance));
  }
}

Here is how RsLogin may look like:

public final class RsLogin extends RsWrap {
  public RsLogin(final Response response, final User user) {
    super(
      new RsWithCookie(
        response, "user", user.toString()
      )
    );
  }
}

Velocity Templates

Let's say, you want to use Velocity:

public final class TkHelloWorld implements Take {
  @Override
  public Response act(final Request req) {
    return new RsVelocity(
      "hi, ${user.name}! You've got ${user.balance}",
      new RsVelocity.Pair("user", new User())
    );
  }
}

You will need this extra dependency in classpath:

<dependency>
  <groupId>org.apache.velocity</groupId>
  <artifactId>velocity-engine-core</artifactId>
  <scope>runtime</scope>
</dependency>

For Gradle users:

dependencies {
    ...
    runtime group: 'org.apache.velocity', name: 'velocity-engine-core', version: 'x.xx'//put the version here
    ...
}

Static Resources

Very often you need to serve static resources to your web users, like CSS stylesheets, images, JavaScript files, etc. There are a few supplementary classes for that:

new TkFork(
  new FkRegex("/css/.+", new TkWithType(new TkClasspath(), "text/css")),
  new FkRegex("/data/.+", new TkFiles(new File("/usr/local/data"))
)

Class TkClasspath take static part of the request URI and finds a resource with this name in classpath.

TkFiles just looks by file name in the directory configured.

TkWithType sets content type of all responses coming out of the decorated take.

Hit Refresh Debugging

It is a very convenient feature. Once you start the app you want to be able to modify its static resources (CSS, JS, XSL, etc), refresh the page in a browser and immediately see the result. You don't want to re-compile the entire project and restart it. Here is what you need to do to your sources in order to enable that feature:

new TkFork(
  new FkRegex(
    "/css/.+",
    new TkWithType(
      new TkFork(
        new FkHitRefresh(
          "./src/main/resources/foo/scss/**", // what sources to watch
          "mvn sass:compile", // what to run when sources are modified
          new TkFiles("./target/css")
        )
        new FkFixed(new TkClasspath())
      ),
      "text/css"
    )
  )
)

This FkHitRefresh fork is a decorator of take. Once it sees X-Take-Refresh header in the request, it realizes that the server is running in "hit-refresh" mode and passes the request to the encapsulated take. Before it passes the request it tries to understand whether any of the resources are older than compiled files. If they are older, it tries to run compilation tool to build them again.

Request Methods (POST, PUT, HEAD, etc.)

Here is an example:

new TkFork(
  new FkRegex(
    "/user",
    new TkFork(
      new FkMethods("GET", new TkGetUser()),
      new FkMethods("POST,PUT", new TkPostUser()),
      new FkMethods("DELETE", new TkDeleteUser())
    )
  )
)

Request Parsing

Here is how you can parse an instance of Request:

Href href = new RqHref.Base(request).href();
URI uri = href.uri();
Iterable<String> values = href.param("key");

For a more complex parsing try to use Apache Http Client or something similar.

Form Processing

Here is an example:

public final class TkSavePhoto implements Take {
  @Override
  public Response act(final Request req) {
    final String name = new RqForm(req).param("name");
    return new RsWithStatus(HttpURLConnection.HTTP_NO_CONTENT);
  }
}

Exception Handling

By default, TkFork lets all exceptions bubble up. If one of your take crashes, a user will see a default error page. Here is how you can configure this behavior:

public final class App {
  public static void main(final String... args) {
    new FtBasic(
      new TkFallback(
        new TkFork(
          new FkRegex("/robots\\.txt", ""),
          new FkRegex("/", new TkIndex())
        ),
        new FbChain(
          new FbStatus(404, new RsText("sorry, page is absent")),
          new FbStatus(405, new RsText("this method is not allowed here")),
          new Fallback() {
            @Override
            public Iterator<Response> route(final RqFallback req) {
              return Collections.<Response>singleton(
                new RsHTML("oops, something went terribly wrong!")
              ).iterator();
            }
          }
        )
      ),
      8080
    ).start(Exit.NEVER);
  }
}

TkFallback decorates an instance of Take and catches all exceptions any of its take may throw. Once it's thrown, an instance of FbChain will find the most suitable fallback and will fetch a response from there.

Redirects

Sometimes it's very useful to return a redirect response (30x status code), either by a normal return or by throwing an exception. This example illustrates both methods:

public final class TkPostMessage implements Take {
  @Override
  public Response act(final Request req) {
    final String body = new RqPrint(req).printBody();
    if (body.isEmpty()) {
      throw new RsForward(
        new RsFlash("message can't be empty")
      );
    }
    // save the message to the database
    return new RsForward(
      new RsFlash(
        "thanks, the message was posted"
      ),
      "/"
    );
  }
}

Then, you should decorate the entire TkFork with this TkForward and TkFlash:

public final class App {
  public static void main(final String... args) {
    new FtBasic(
      new TkFlash(
        new TkForward(
          new TkFork(new FkRegex("/", new TkPostMessage())
        )
      ),
      8080
    ).start(Exit.NEVER);
  }
}

RsJSON

Here is how we can deal with JSON:

public final class TkBalance extends TkFixed {
  @Override
  public Response act(final RqRegex request) {
    return new RsJSON(
      new User(request.matcher().group("user")))
    );
  }
}

This is the method to add to User:

public final class User implements XeSource, RsJSON.Source {
  @Override
  public JsonObject toJSON() {
    return Json.createObjectBuilder()
      .add("balance", this.balance)
      .build();
  }
}

RsXembly

Here is how you generate an XML page using Xembly:

Response response = new RsXembly(
  new XeAppend("page"),
  new XeDirectives("XPATH '/page'", this.user)
)

This is a complete example, with all possible options:

Response response = new RsXembly(
  new XeStylesheet("/xsl/account.xsl"), // add processing instruction
  new XeAppend(
    "page", // create a DOM document with "page" root element
    new XeMillis(false), // add "millis" attribute to the root, with current time
    user, // add user to the root element
    new XeSource() {
      @Override
      public Iterable<Directive> toXembly() {
        return new Directives().add("status").set("alive");
      }
    },
    new XeMillis(true), // replace "millis" attribute with take building time
  ),
)

This is the output that will be produced:

<?xml version='1.0'?>
<?xsl-stylesheet href='/xsl/account.xsl'?>
<page>
  <millis>5648</millis>
  <user>
    <name>Jeff Lebowski</name>
    <balance>123</balance>
  </user>
  <status>alive</status>
</page>

To avoid duplication of all this scaffolding in every page, you can create your own class, which will be used in every page, for example:

Response response = new RsXembly(
  new XeFoo(user)
)

This is how this XeFoo class would look like:

public final class XeFoo extends XeWrap {
  public XeFoo(final String stylesheet, final XeSource... sources) {
    super(
      new XeAppend(
        "page",
        new XeMillis(false),
        new XeStylesheet(stylesheet),
        new XeChain(sources),
        new XeSource() {
          @Override
          public Iterable<Directive> toXembly() {
            return new Directives().add("status").set("alive");
          }
        },
        new XeMillis(true)
      )
    );
  }
}

You will need this extra dependency in classpath:

<dependency>
  <groupId>com.jcabi.incubator</groupId>
  <artifactId>xembly</artifactId>
</dependency>

More about this mechanism in this blog post: XML Data and XSL Views in Takes Framework.

Cookies

Here is how we drop a cookie to the user:

public final class TkIndex implements Take {
  @Override
  public Response act(final Request req) {
    return new RsWithCookie("auth", "John Doe");
  }
}

An HTTP response will contain this header, which will place a auth cookie into the user's browser:

HTTP/1.1 200 OK
Set-Cookie: auth="John Doe"

This is how you read cookies from a request:

public final class TkIndex implements Take {
  @Override
  public Response act(final Request req) {
    // the list may be empty
    final Iterable<String> cookies = new RqCookies(req).cookie("my-cookie");
  }
}

GZIP Compression

If you want to compress all your responses with GZIP, wrap your take in TkGzip:

new TkGzip(take)

Now, each request that contains Accept-Encoding request header with gzip compression method inside will receive a GZIP-compressed response. Also, you can compress an individual response, using RsGzip decorator.

Content Negotiation

Say, you want to return different content based on Accept header of the request (a.k.a. content negotation):

public final class TkIndex implements Take {
  @Override
  public Response act(final Request req) {
    return new RsFork(
      req,
      new FkTypes("text/*", new RsText("it's a text"))
      new FkTypes("application/json", new RsJSON("{\"a\":1}"))
      new FkTypes("image/png", /* something else */)
    );
  }
}

SSL Configuration

First of all, setup your keystore settings, for example

final String file = this.getClass().getResource("/org/takes/http/keystore").getFile();
final String password = "abc123";
System.setProperty("javax.net.ssl.keyStore", file);
System.setProperty("javax.net.ssl.keyStorePassword", password);
System.setProperty("javax.net.ssl.trustStore", file);
System.setProperty("javax.net.ssl.trustStorePassword", password);

Then simple create exemplar of class FtSecure with socket factory

final ServerSocket skt = SSLServerSocketFactory.getDefault().createServerSocket(0);
new FtRemote(
  new FtSecure(new BkBasic(new TkFixed("hello, world")), skt),
  skt,
  true
);

Authentication

Here is an example of login via Facebook:

new TkAuth(
  new TkFork(
    new FkRegex("/", new TkHTML("hello, check <a href='/acc'>account</a>")),
    new FkRegex("/acc", new TkSecure(new TkAccount()))
  ),
  new PsChain(
    new PsCookie(
      new CcSafe(new CcHex(new CcXOR(new CcCompact(), "secret-code")))
    ),
    new PsByFlag(
      new PsByFlag.Pair(
        PsFacebook.class.getSimpleName(),
        new PsFacebook("facebook-app-id", "facebook-secret")
      ),
      new PsByFlag.Pair(
        PsLogout.class.getSimpleName(),
        new PsLogout()
      )
    )
  )
)

Then, you need to show a login link to the user, which he or she can click and get to the Facebook OAuth authentication page. Here is how you do this with XeResponse:

new RsXembly(
  new XeStylesheet("/xsl/index.xsl"),
  new XeAppend(
    "page",
    new XeFacebookLink(req, "facebook-app-id"),
    // ... other xembly sources
  )
)

The link will be add to the XML page like this:

<page>
  <links>
    <link rel="take:facebook" href="https://www.facebook.com/dialog/oauth..."/>
  </links>
</page>

Similar mechanism can be used for PsGithub, PsGoogle, PsLinkedin, PsTwitter, etc.

This is how you get currently logged in user:

public final class TkAccount implements Take {
  @Override
  public Response act(final Request req) {
    final Identity identity = new RqAuth(req).identity();
    if (this.identity.equals(Identity.ANONYMOUS)) {
      // returns "urn:facebook:1234567" for a user logged in via Facebook
      this.identity().urn();
    }
  }
}

More about it in this blog post: How Cookie-Based Authentication Works in the Takes Framework

Command Line Arguments

There is a convenient class FtCLI that parses command line arguments and starts the necessary Front accordingly.

There are a few command line arguments that should be passed to FtCLI constructor:

--port=1234         Tells the server to listen to TCP port 1234
--lifetime=5000     The server will die in five seconds (useful for integration testing)
--hit-refresh       Run the server in hit-refresh mode
--daemon            Runs the server in Java daemon thread (for integration testing)
--threads=30        Processes incoming HTTP requests in 30 parallel threads
--max-latency=5000  Maximum latency in milliseconds per each request
                    (longer requests will be interrupted)

For example:

public final class App {
  public static void main(final String... args) {
    new FtCLI(
      new TkFork(new FkRegex("/", "hello, world!")),
      args
    ).start(Exit.NEVER);
  }
}

Then, run it like this:

$ java -cp take.jar App.class --port=8080 --hit-refresh

You should see "hello, world!" at http://localhost:8080.

Parameter --port also accepts file name, instead of a number. If the file exists, FtCLI will try to read its content and use it as port number. If the file is absent, FtCLI will allocate a new random port number, use it to start a server, and save it to the file.

Logging

The framework sends all logs to SLF4J logging facility. If you want to see them, configure one of SLF4J bindings.

To make a Take log, wrap it in a TkSlf4j - for example:

 new TkSlf4j(
     new TkFork(...)
 )

Directory Layout

You are free to use any build tool, but we recommend Maven. This is how your project directory layout may/should look like:

/src
  /main
    /java
      /foo
        App.java
    /scss
    /coffeescript
    /resources
      /vtl
      /xsl
      /js
      /css
      robot.txt
      log4j.properties
  /test
    /java
      /foo
        AppTest.java
    /resources
      log4j.properties
pom.xml
LICENSE.txt

Optional dependencies

If you're using Maven and include Takes as a dependency in your own project, you can choose which of the optional dependencies to include in your project. The list of all of the optional dependencies can be seen in the Takes project pom.xml.

For example, to use the Facebook API shown above, simply add a dependency to the restfb API in your project:

<dependency>
  <groupId>com.restfb</groupId>
  <artifactId>restfb</artifactId>
  <version>1.15.0</version>
  <scope>runtime</scope>
</dependency>

For Gradle, you should add the dependencies as usual:

dependencies {
    ...
    runtime group: 'com.restfb', name: 'restfb', version: '1.15.0'
}

Backward compatibility

Version 2.0 is not backward compatible with previous versions.

Version pattern for RESTful API

The URL should NOT contain the versions, but the type requested.

For example:

===>
GET /architect/256 HTTP/1.1
Accept: application/org.takes.architect-v1+xml
<===
HTTP/1.1 200 OK
Content-Type: application/org.takes.architect-v1+xml
<architect>
  <name>Yegor Bugayenko</name>
</architect>

Then clients aware of newer version of this service can call:

===>
GET /architect/256 HTTP/1.1
Accept: application/org.takes.architect-v2+xml
<===
HTTP/1.1 200 OK
Content-Type: application/org.takes.architect-v2+xml

<architect>
  <firstName>Yegor</firstName>
  <lastName>Bugayenko</lastName>
  <salutation>Mr.</salutation>
</architect>

This article explains why itΒ΄s done this way.

How to contribute

Fork repository, make changes, send us a pull request. We will review your changes and apply them to the master branch shortly, provided they don't violate our quality standards. To avoid frustration, before sending us your pull request please run full Maven build:

$ mvn clean install -Pqulice

To avoid build errors use maven 3.2+.

Pay attention that our pom.xml inherits a lot of configuration from jcabi-parent. This article explains why it's done this way.

Got questions?

If you have questions or general suggestions, don't hesitate to submit a new Github issue.

Comments
  • Turning on FindBugs

    Turning on FindBugs

    Fixing the issue (https://github.com/yegor256/takes/issues/517).

    • Changed the java version.
    • Enabled the FindBugs.
    • Fixed the issues find by the FindBugs
    CR 15 mins @mkordas 
    opened by sebing 141
  • Takes in servlet

    Takes in servlet

    #682

    • adapting HttpServletRequest to takes Request
    • writing takes response to HttpServletResponse
    • dispatching requests to Take instance provided in web.xml
    opened by g4s8 79
  • persistent connections

    persistent connections

    At the moment we don't support HTTP persistent connections. Would be great to implement this feature.


    - ~~`306-07904f4e`/#417~~ (by Piotr PrΔ…dzyΕ„ski) - ~~`306-0f8af5fd`/#418~~ (by Hamdi Douss) - ~~`306-b987400a`/#519~~ (by Sebin George) - `519-af7d4687`/#655 (by Nicolas FILOTTO) bug DEV 30 mins @prondzyn 
    opened by yegor256 66
  • Removing the warning suppression(ConstructorOnlyInitializesOrCallOtherConstructors )

    Removing the warning suppression(ConstructorOnlyInitializesOrCallOtherConstructors )

    Refactored the class according to this article:

    http://www.yegor256.com/2015/05/07/ctors-must-be-code-free.htm

    Fixing the issue(https://github.com/yegor256/takes/issues/595).

    CR 15 mins @mkordas 
    opened by sebing 64
  • Cc base64#19

    Cc base64#19

    Open a new pull request due to mess with branches, created branch from incorrect point. Here is the original ticket https://github.com/yegor256/takes/issues/19 and wrong pull request https://github.com/yegor256/takes/pull/95. CcBase64Test has been created and ignored so far due to we need to create our own Base64 algorithm. Puzzle added to CcBase64: @todo #19:30min to implement own simple Base64 encode algorithm without using 3d-party Base64 encode libraries. Tests for this method have been already created, do not forget to remove Ignore annotation on it. @todo #19:30min to implement own simple Base64 decode algorithm without using 3d-party Base64 decode libraries. Tests for this method have been already created, do not forget to remove Ignore annotation on it.

    @pinaf 
    opened by ikhvostenkov 56
  • #506 BkTimeableTest fails intermittently

    #506 BkTimeableTest fails intermittently

    The principal problem was in the RqMultipartTest because the requests are creating temporary files greater than 97mb, those files are now deleted after the junit test.

    But, some files with 1KB stills remains in computer, I believe we need to fix the issue #576.

    - Refactoring notes

    1. Some tests was creating files not using TemporaryFolder.
    2. RqMultipartTest was change to delete the temporary files after the execution of the junit. In order to that, I need the close the body part of the multipart request.

    With these changes, after the execution of the all junits, the temporay files with 97mb are deleted after the junit ends, eliminating the instability of the builds.

    This PR is related with issue #506

    Code changes

    • RqMultipartTest - Lines 106 - 117 Without that changes the code result in two more files created and not deleted after the junit test ends. So we need to close the body of this parts in order to delete them after we used them (#576).
    • BkTimeableTest: add a Custom exit condition, to latch the current thread to continue the process of the junit.
    CR 15 mins @mkordas 
    opened by raphaelln 52
  • 495: Store the content of the stream into a temporary file for reuse

    495: Store the content of the stream into a temporary file for reuse

    Fix for https://github.com/yegor256/takes/issues/495

    this issue is related to the fact that the code in the use case relies on this constructor to build its response so when the InputStream has been consumed once, we get an IOException on the next calls.

    The idea of this PR is to store the content of the input stream into a temporary file in order to be able to read the content as many times as we want and be able to do it securely from concurrent threads which was not the case otherwise as most InputStream implementations have not been designed to be shared which could affect the thread safety of the whole class RsWithBody.

    @krzyk CR 15 mins 
    opened by essobedo 50
  • TkSlf4j can fail for specific request

    TkSlf4j can fail for specific request

    Hi. If TkSlf4j wraps Take that returns empty response (without body), and if POST request with some body has been sent through VerboseWire (from jcabi-http), RqMethod.Base will fail with this exception:

    java.io.IOException: Invalid HTTP method: X-Takes-LocalAddress:
        at org.takes.rq.RqMethod$Base.method(RqMethod.java:127)
        at org.takes.tk.TkSlf4j.act(TkSlf4j.java:105)
        at org.takes.http.BkBasic.print(BkBasic.java:108)
        at org.takes.http.BkBasic.accept(BkBasic.java:84)
        at org.takes.http.BkParallel$1$1.run(BkParallel.java:89)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
    

    Test for reproducing:

        @Test
        public void test() throws IOException {
            new FtRemote(
                new TkSlf4j(
                    req -> new RsEmpty()
                )
            ).exec(
                home ->
                    new JdkRequest(home)
                        .method("POST")
                        .body().set("test").back()
                        .through(VerboseWire.class)
                        .fetch()
                        .as(RestResponse.class)
                        .assertStatus(HttpURLConnection.HTTP_OK)
            );
        }
    

    Environment: java - 1.8.0_102-b14 takes - 1.1 jcabi-http - 1.16

    http:

    POST / HTTP/1.1
    Cache-Control: no-cache
    Pragma: no-cache
    User-Agent: Java/1.8.0_102
    Host: localhost:41997
    Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
    Connection: keep-alive
    Content-type: application/x-www-form-urlencoded
    Content-Length: 4
    
    testHTTP/1.1 200 OK
    
    HTTP/1.1 500 Internal Error
    Content-Length: 538
    Content-Type: text/plain
    
    java.io.IOException: Invalid HTTP method: X-Takes-LocalAddress:
    .at org.takes.rq.RqMethod$Base.method(RqMethod.java:127)
    .at org.takes.tk.TkSlf4j.act(TkSlf4j.java:105)
    .at org.takes.http.BkBasic.print(BkBasic.java:108)
    .at org.takes.http.BkBasic.accept(BkBasic.java:84)
    .at org.takes.http.BkParallel$1$1.run(BkParallel.java:89)
    .at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    .at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    .at java.lang.Thread.run(Thread.java:745)
    
    bug DEV 30 mins @prondzyn 
    opened by g4s8 48
  • TkRetry #430

    TkRetry #430

    Resolving #430. Nearly the same as the last suggested PR. Added an assertion on the last test to ensure expected response is returned after the first fail.

    @pinaf CR 15 mins 
    opened by HDouss 48
  • 11: Pass for Twitter added.

    11: Pass for Twitter added.

    Pass for twitter added. Todo: PsTwitterTest has to be implemented or XeTwitterLink & XeTwitterLinkTest have to be implemented which will test PsTwitter too.

    PR #175 for issue #11.

    @longtimeago 
    opened by popprem 48
  • FtRemoteTest.java:55-59: We can't assert if FtRemote...

    FtRemoteTest.java:55-59: We can't assert if FtRemote...

    The puzzle 800-fe5f523c from #800 has to be resolved:

    https://github.com/yegor256/takes/blob/4ccecced024e64cc5b5efb19db56144b15af03d8/src/test/java/org/takes/http/FtRemoteTest.java#L55-L59

    The puzzle was created by Victor NoΓ«l on 18-Nov-18.

    If you have any technical questions, don't ask me, submit new tickets instead. The task will be "done" when the problem is fixed and the text of the puzzle is removed from the source code. Here is more about PDD and about me.

    bug pdd 
    opened by 0pdd 47
  • Update dependency com.restfb:restfb to v2023

    Update dependency com.restfb:restfb to v2023

    Mend Renovate

    This PR contains the following updates:

    | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | com.restfb:restfb (source) | 2.27.1 -> 2023.1.0 | age | adoption | passing | confidence |


    ⚠ Dependency Lookup Warnings ⚠

    Warnings were logged while processing this repo. Please check the Dependency Dashboard for more information.


    Release Notes

    restfb/restfb

    v2023.1.0

    Compare Source

    • Issue #​1263: removed unsupported graph api versions (breaking change)
    • License headers changed and some junit cleanup

    v2022.11.0

    Compare Source

    v2022.10.0

    Compare Source

    v2022.9.0

    Compare Source

    v2022.8.0

    Compare Source

    v2022.7.0

    Compare Source

    v2022.6.0

    Compare Source

    • Issue #​1213: rtbdynamicpost type is missing
    • Issue #​1218: Make it easier to use parameters in the API calls
    • Issue #​1220: Add Basic Graph API 14 support

    v2022.5.0

    Compare Source

    v2022.4.0

    Compare Source

    v2022.3.1

    Compare Source

    • NoIssue: fix for 1195

    v2022.3.0

    Compare Source

    v2022.2.0

    Compare Source

    v2022.1.0

    Compare Source

    • Issue #​1187: Change License year to 2022
    • Issue #​1185: Add missing permissions type
    • Issue #​1135: Remove "perms" field from Account-object - is no longer supported type
    • Issue #​1143: Remove CategorizedFacebookType type
    • Issue #​1133: Remove deprecated is_verified field from Page object type
    • Issue #​1132: Remove the deprecated manage_pages and publish_pages permissions type
    • Issue #​1131: Remove addComment and removeComment from Video type
    • Issue #​1130: Remove with_tags from Post because it is deprecated with Graph API 3.2 type
    • Issue #​1128: Remove coverId from CoverPhoto type
    • Issue #​1117: Cleanup the Messenger API objects
    • Issue #​1116: Remove deprecated fields from Event type
    • Issue #​1115: Remove the deprecated Location quick reply type
    • Issue #​1114: Remove deprecated permissions type
    • Issue #​1113: Remove deprecated 'Ad' types
    • Issue #​1112: Remove deprecated fields from User type
    • Issue #​1111: WebhookMessagingListener remove deprecated methods type
    • Issue #​1110: Assertj classes - change deprecated Objects.areEqual type
    • Issue #​1109: WebRequestor methods refactoring

    v3.24.0

    Compare Source

    v3.23.0

    Compare Source

    v3.22.0

    Compare Source

    v3.21.0

    Compare Source

    • many internal cleanups and refactorings to prepare a better structure

    v3.20.0

    Compare Source

    v3.19.0

    Compare Source

    v3.18.0

    Compare Source

    v3.17.0

    Compare Source

    v3.16.0

    Compare Source

    • Issue #​1144: Access to the whats app business account of a page
    • Issue #​1145: MediaTemplateElement needs access to AbstractButton
    • Issue #​1141: Add field tagged_time to Post type
    • Issue #​1142: Replace "owner" field in videolist object with the new From object

    v3.15.0

    Compare Source

    • Issue #​1137: Graph API 10 added to version enum
    • Issue #​1138: ChangeValueFactory cannot handle a mention comment
    • Issue #​1139: Add a better from field implementation

    v3.14.0

    Compare Source

    • Issue #​1119: license date changed to 2021
    • Issue #​1120: mark attachment as not accessible due to "privacy rules in Europe".
    • Issue #​1121: remove circleci stuff

    v3.13.0

    Compare Source

    • Issue #​1107: use HTTP header field for access token
      Thanks to @​StephenFlavin for the hint
      Attention: this may be a breaking change if you have a custom WebRequestor implementation
    • Issue #​1105: missing fields to WhatsappMessageTemplate added
    • Issue #​1103: Graph API 9.0: missing fields added to AdCreative

    v3.12.0

    Compare Source

    v3.11.0

    Compare Source

    v3.10.0

    Compare Source

    v3.9.0

    Compare Source

    v3.8.0

    Compare Source

    • Issue #​416: Common methods should be defined via interface
    • Issue #​1079: Remove Graph API 3.0 enum

    v3.7.0

    Compare Source

    • Issue #​946: Use Listener pattern for incoming webhooks
      Thanks to @​eximius313 for the hint and the examples
    • code smells removed

    v3.6.1

    Compare Source

    • many cleanups without special issues

    v3.6.0

    Compare Source

    • Graph API 7.0:
      • Issue #​1071: version added to Version enum
      • Issue #​1072: new permissions added, old ones marked as deprecated
    • Issue #​1070: deprecated version 2.12 remove from Version enum

    v3.5.0

    Compare Source

    v3.4.0

    Compare Source

    v3.3.0

    Compare Source

    v3.2.0

    Compare Source

    • Issue #​1055: Add One-time Notification to messenger API
    • Issue #​1056: Graph API 6.0 added to Version enum

    v3.1.0

    Compare Source

    • Issue #​1263: removed unsupported graph api versions (breaking change)
    • License headers changed and some junit cleanup

    v3.0.0

    Compare Source

    • Final Release - nothing new

    Configuration

    πŸ“… Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    β™» Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    πŸ”• Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

    opened by renovate[bot] 3
  • Update dependency org.hibernate.validator:hibernate-validator to v8

    Update dependency org.hibernate.validator:hibernate-validator to v8

    Mend Renovate

    This PR contains the following updates:

    | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | org.hibernate.validator:hibernate-validator (source) | 7.0.5.Final -> 8.0.0.Final | age | adoption | passing | confidence |


    ⚠ Dependency Lookup Warnings ⚠

    Warnings were logged while processing this repo. Please check the Dependency Dashboard for more information.


    Release Notes

    hibernate/hibernate-validator

    v8.0.0.Final

    Compare Source


    Configuration

    πŸ“… Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    β™» Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    πŸ”• Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

    opened by renovate[bot] 2
  • Update dependency org.glassfish.grizzly:grizzly-http-servlet-server to v4

    Update dependency org.glassfish.grizzly:grizzly-http-servlet-server to v4

    Mend Renovate

    This PR contains the following updates:

    | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | org.glassfish.grizzly:grizzly-http-servlet-server (source) | 2.4.4 -> 4.0.0 | age | adoption | passing | confidence |


    ⚠ Dependency Lookup Warnings ⚠

    Warnings were logged while processing this repo. Please check the Dependency Dashboard for more information.


    Release Notes

    eclipse-ee4j/grizzly

    v4.0.0

    Compare Source

    v3.0.1

    Compare Source


    Configuration

    πŸ“… Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    β™» Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    πŸ”• Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

    opened by renovate[bot] 2
  • Update dependency org.codehaus.mojo:exec-maven-plugin to v3

    Update dependency org.codehaus.mojo:exec-maven-plugin to v3

    Mend Renovate

    This PR contains the following updates:

    | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | org.codehaus.mojo:exec-maven-plugin (source) | 1.3 -> 3.1.0 | age | adoption | passing | confidence |


    ⚠ Dependency Lookup Warnings ⚠

    Warnings were logged while processing this repo. Please check the Dependency Dashboard for more information.


    Configuration

    πŸ“… Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    β™» Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    πŸ”• Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

    opened by renovate[bot] 2
  • Update dependency org.codehaus.mojo:build-helper-maven-plugin to v3

    Update dependency org.codehaus.mojo:build-helper-maven-plugin to v3

    Mend Renovate

    This PR contains the following updates:

    | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | org.codehaus.mojo:build-helper-maven-plugin (source) | 1.12 -> 3.3.0 | age | adoption | passing | confidence |


    ⚠ Dependency Lookup Warnings ⚠

    Warnings were logged while processing this repo. Please check the Dependency Dashboard for more information.


    Configuration

    πŸ“… Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    β™» Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    πŸ”• Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

    opened by renovate[bot] 2
  • Update dependency org.codehaus.mojo:sonar-maven-plugin to v3.9.1.2184

    Update dependency org.codehaus.mojo:sonar-maven-plugin to v3.9.1.2184

    Mend Renovate

    This PR contains the following updates:

    | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | org.codehaus.mojo:sonar-maven-plugin | 3.3.0.603 -> 3.9.1.2184 | age | adoption | passing | confidence |


    ⚠ Dependency Lookup Warnings ⚠

    Warnings were logged while processing this repo. Please check the Dependency Dashboard for more information.


    Release Notes

    SonarSource/sonar-scanner-maven

    v3.9.1.2184

    Compare Source

    v3.9.0.2155

    Compare Source

    v3.8.0.2131

    Compare Source

    v3.7.0.1746

    Compare Source

    v3.6.1.1688

    Compare Source

    v3.6.0.1398

    Compare Source

    v3.5.0.1254

    Compare Source

    v3.4.1.1168

    Compare Source

    v3.4.0.905

    Compare Source


    Configuration

    πŸ“… Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    β™» Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    πŸ”• Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

    opened by renovate[bot] 2
Releases(1.24.4)
  • 1.24.4(Aug 26, 2022)

    See #1146, release log:

    • a339adce4f94cf17a53176b52d0d0ffa7e4a6964 by @yegor256: #1146 versions up
    • 60b84776c32111a1cd301f6a323fe17f06a29d5d by @yegor256: #1146 fresh qulice
    • 139e297d858a3cac6ca974e2ddfd68e32c4fadb6 by @yegor256: #1146 cache XSL factories
    • 3789ae37b07c5412bd97ec5d1a48804541ec8038 by @yegor256: #1071 better explanation

    Released by Rultor 2.0-SNAPSHOT, see build log

    Source code(tar.gz)
    Source code(zip)
  • 1.24.3(Aug 24, 2022)

  • 1.24.2(Aug 23, 2022)

  • 1.24.1(Aug 22, 2022)

    See #1142, release log:

    • 91d020c32348944f146c83957c365a82e6f1c433 by @yegor256: #1142 comments removed from te...
    • dddac7b3b930a5bb6a3f822046638949db171605 by @yegor256: #1142 versions up
    • 0d9bfa054354805e8602e7a4a583e78f0ba7d253 by @yegor256: #1142 detailed error msg
    • 7a4160a9af12de13638b3489c5a4d599c7e0230e by @yegor256: #1142 better exception message...

    Released by Rultor 2.0-SNAPSHOT, see build log

    Source code(tar.gz)
    Source code(zip)
  • 1.24.0(Aug 11, 2022)

  • 1.23.0(Aug 10, 2022)

    See #1139, release log:

    • 5818aba136d86dcad7b39fc44d7f131618e4b8f0 by @yegor256: #1139 xembly 0.27.0
    • e743ff9522d828342a8582351edecbf153627d6f by @yegor256: #1139 LineLength removed
    • 8db41a29d5136ebebe05a5026cc58b6beb5ef23b by @yegor256: #1139 XeTranform.Func is repla...
    • 809094eeaa2943b8b3ef57d75fa767a7fc0f9e35 by @yegor256: #1139 parent up
    • e6d034cf1f34a08e4d9913f129389c2b0d22c37f by @yegor256: #1139 actions
    • d17954a87a27351197df38d0d1956a68bbb2294f by @rultor: Merge branch '__rultor'
    • 14d1d4f6c398a5f8ff08d958fc86f4413dcc7778 by @yegor256: #1136 badges

    Released by Rultor 2.0-SNAPSHOT, see build log

    Source code(tar.gz)
    Source code(zip)
  • 1.22.0(Aug 5, 2022)

    See #1136, release log:

    • b6c88d2cb712b02f9a76fab6fb8667ad8f3bf2dd by @yegor256: #1136 RsStatus
    • b53b64dbbf93c04b76886f317da342b4fd5c5b11 by @yegor256: #1136 qulice clean up
    • aa84268ab3bfc294329069cef2ed8889536d298e by @yegor256: #1136 qulice clean up
    • 51e87fc4c56df41a3ac04701af73de1dd3398143 by @yegor256: #1136 versions fixed
    • 41df45d24458acb82b4043966cc91afd8d03e25e by @yegor256: #1134 extra test

    Released by Rultor 2.0-SNAPSHOT, see build log

    Source code(tar.gz)
    Source code(zip)
  • 1.21.1(Jul 16, 2022)

    See #1134, release log:

    • 79568f67ee521d3643d80bc062857b6859bfa6c0 by @yegor256: #1134 parent up
    • cb8462a32ba94bd953f2ade2c7c7162e946c0d57 by @yegor256: #1134 deps
    • 797db1c750735d37de491be58559252304df9f76 by @yegor256: #1134 fixed
    • d09c484a9764f2a371a1f7a77ea9cf00cc945bf9 by @yegor256: #1134 polishing
    • eb96bd3701c10f212e778768fe004e919edb33b1 by @yegor256: #1134 polishing
    • 6a94a6c447ee309fd44a57091ee8a0a1e3e2caf1 by @yegor256: #1134 extra test
    • 257bab13e28d7f2f9cb940b8d31ef91095ce4bd2 by @yegor256: #1132 est and status-reports r...
    • b3d3e37174a990123acd38bb10d4fa4c15320eda by @yegor256: #1132 longer delay
    • 891873824d6f2cce7bf076a51b2174a346de5dc1 by @yegor256: #1132 disable some tests
    • 7bc123778c1ea66ea4a6422f9651c250ddd9b39a by @yegor256: #1132 jacoco typo
    • 79c277fcea18a497356dd23c06b44b1c85e39fec by @yegor256: #1132 jacoco fi

    Released by Rultor 2.0-SNAPSHOT, see build log

    Source code(tar.gz)
    Source code(zip)
  • 1.21(Jul 11, 2022)

    See #1132, release log:

    • e3042510e86f1f5eef2143f9075e533c8b23a359 by @yegor256: #1132 one dep up
    • f772e5cf06c1325a2a45f71da2ba3901fba6bbcf by @yegor256: #1132 some deps up
    • 881494044f320569ec45df5f604783e948b989c2 by @yegor256: #1132 parent up
    • 712588a2bf1d1e0cd137430cce56c3b8211689d0 by @yegor256: #1132 more time
    • 1b01a552b616f7d0a8f96647a9f7b78c967ba728 by @yegor256: #1132 disable on windows
    • 9d4bcb375d487fb58c4744a51eefe17b7cb07b0f by @yegor256: #1132 del in test
    • 9d8aa2ad5b3875b5e6b7db528b29c0d0e5810395 by @yegor256: #1132 badge
    • e2258d5998c240e5941d81e17522898efa965e7f by @yegor256: #1132 unchecked
    • 92c5d4fefa4f708855869f3760185cdd6f7d1772 by @yegor256: #1132 actions
    • 581f9b53c3d30b1d289cff59cb7aec8958bb7945 by @yegor256: #1132 build is clean
    • 2f4ef1d05d96ae2efe6742c99b466c72ed92fa8f by @yegor256: #1127 lambdas
    • eb270c27f12d29d7ff4242b60794d08148fe4772 by @yegor256: #1127 year up
    • 7627f229adfd3885e7a6d794ea27a97db6e25afc by @yegor256: #1127 diamons
    • 1b871602f986040d4fe681632398d1eae837a457 by @yegor256: #1127 unnecessary exceptions r...
    • 36f2d61cd9080ba15681248283c3befa20c63596 by @yegor256: #1127 polished
    • d4f098f432a3adda972fb2ae60533223b6538579 by @rultor: Merge branch '__rultor'
    • a2e4a1bcfacee56cf16e7dca36a1a1147b1ea79c by @Masynchin: Fix for using InputOf
    • 829a55e588ea97c5bc37c693294b819070e0ac05 by @yegor256: citation
    • 746781833313ced6edd3f1c4fcea154132af73d6 by @yegor256: re
    • a9b4b697560532f5da5d06d5f40f48e87b7f0ced by @yegor256: loc
    • and 1 more...

    Released by Rultor 1.70.6, see build log

    Source code(tar.gz)
    Source code(zip)
  • 1.20(Jun 1, 2022)

    See #1123, release log:

    • 55df438e7d91f5e977881e0bf0eae88e2a871800 by @yegor256: Merge pull request #1125 from ...
    • ae6e7bc17cf4176329c0ac5a9879307cd50bfb23 by @baudoliver7: ci(rultor): include gpg signat...
    • 84acf4795f1562a79c3a7613d02e2e8f0a1a83ab by @yegor256: Merge pull request #1124 from ...
    • b284bada6fc473bf925e395854eea2ce322f9522 by @baudoliver7: ci(rultor): remove sonar check...
    • f74add0177a3e366be830162466e46d886c5cd0d by @baudoliver7: build(dev-deps): set version o...
    • 16ea922df69ebeb8b92f0bf60f91867050952c05 by @rultor: Merge branch '__rultor'
    • e1aed98f5dcf2416100e97c0b7128d621b4b16d8 by @baudoliver7: deps: bump cactoos, cactoos-ma...
    • 0e4b82d2c0b8e205cae17d725ce66a56172bccbd by @baudoliver7: fix(github): fix deprecating a...
    • acedcc490a716b60177766e6354f03d51bbade15 by @baudoliver7: fix(RqFake): fix first request...
    • 90d4ce7648409ba1d16365b25df177a131712d43 by @rultor: Merge branch '__rultor'
    • 2536eb83aecb5b9c176e73c934af19f4b080eeac by @yegor256: Merge pull request #1115 from ...
    • 0dda214521274005ed228ccaebdbeb648ca8568a by @baudoliver7: fix(maven): change maven link ...
    • 72f09dd348a86f566fd627681e7d30489f83c148 by @baudoliver7: Format pom.xml #958
    • c990e9e12f67bcced32f804760cc0fffe4aa3ea3 by @baudoliver7: Fix conflicts #958
    • 2c19b2e8233a96fb64975d9acbb6ccd8e5a38d45 by @baudoliver7: Exclude qulice dependency chec...
    • 809fd5d8fd2c660e967b26a133d4772d5921aa77 by @baudoliver7: Exclude qulice dependencies ch...
    • 8f0123bf61adaebffb35010cf2c0fa33ed2f2287 by @baudoliver7: Trigger checks #1080
    • 7ac0f72f4712d2d6005e559789b13304f53f0e6d by @baudoliver7: Merge branch 'master' of githu...
    • c031d76d6222e80c4edeedc98366302dcc3e8f2c by @rultor: Merge branch '__rultor'
    • ae3c15cf3b52adeb099682085b83eb86ed10df1c by @yegor256: #1094 new parent
    • and 211 more...

    Released by Rultor 1.70.6, see build log

    Source code(tar.gz)
    Source code(zip)
  • 1.19(Dec 5, 2019)

    See #991, release log:

    • d540ade05836b6316a87bce05c8faf1c5719164e by @rultor: Merge branch '__rultor'
    • 5a7041763ed2b59d9ea142c54a25dbea1596a5a2 by @fanifieiev: (#918) Code review fixes, atte...
    • 39a6c7263c29cc410a9de5760178b3e3aa83ccfa by @fanifieiev: (#918) After review fixes, att...
    • b235b60b4f36465028fce06ed67be07ea8841198 by @fanifieiev: (#918) Small refactoring of Rq...
    • 0731751b42e927acc3a1dfc287a895ac58bf34ad by @fanifieiev: (#918) Fixed todo description ...
    • 5db4c9c100f82468b151398e48d26dbd8521d8cc by @fanifieiev: (#918) After review fixes
    • 58ce68a6c5ce7f9eaf7fd8f3b08a4fe96ccfdd6a by @fanifieiev: (#918) Reverted changes to htm...
    • 0c2480589253709e21bd56ec61f4c294832a4f15 by @fanifieiev: (#918) Removed EqualsVerifier ...
    • 3b62d8237dd02f2ae3175d7d47be249ebed92ad6 by @fanifieiev: (#869) Fixed tests with empty ...

    Released by Rultor 2.0-SNAPSHOT, see build log

    Source code(tar.gz)
    Source code(zip)
  • 1.18(Sep 6, 2019)

    See #985, release log:

    • 6e5bf2f50564f4a1c3f1f683760a1120ddfc4f14 by @golszewski86: Merge remote-tracking branch '...
    • 32ed789de753b50862a4eeb7b42c1ad9fd9b1f05 by @piotrkot: #991 Specyfing Trusty image fo...
    • 9a1dd99c46c49b3520cdff429f5a341649ac7d64 by @rultor: Merge branch '__rultor'
    • db3e04478593e910f7f067d91a5db8628ff4a8d2 by @golszewski86: Update cactoos to 0.42
    • 0e7e919a9da2fdf849056071d759a83550d94694 by @golszewski86: Merge remote-tracking branch '...
    • 6dc388fa7c56eafd69e17eab738b786d6ee59489 by @rultor: Merge branch '__rultor'
    • 6c4d034dc40d40f4b17a1a3254bfc93ed743a622 by @mreiche: Autoformatted code to get corr...
    • 2ebc39e9b271f71cc42bed6025f650112a9bedd8 by @mreiche: Fixed javadoc for FkRegexTest
    • 572f12ecf680010959bc7a0ba842ea4ac7b8d416 by @mreiche: Fixed line indentions
    • 75bced89e0b0247cc5c506d1b742e79fd7be2b77 by @mreiche: Tried to fix jcabi-check
    • 750ba49ad0b3bdc14efdbb560409280044e20580 by @mreiche: Fixed default value
    • 1686ab6c14651193c48fc913ca06bf519cf78e59 by @mreiche: Tried to get jcabi-check compl...
    • d8048ef1af63fdb5daaf1bc698eb33645f53c443 by @yegor256: architect
    • 5a0fcad11408e56496a3595fa0417db8d1206d92 by @mreiche: Added support for keeping trai...

    Released by Rultor 1.68.5, see build log

    Source code(tar.gz)
    Source code(zip)
  • 1.17(Jun 21, 2019)

    See #986, release log:

    • 49a235504e36c9a7c8254a0e6eedcac30f98b4b9 by @rultor: Merge branch '__rultor'
    • 60e54d1d38ebe119b47b62e793ab0d9e84d04d06 by @yegor256: xcop and est fixed version in ...
    • 49b7bee8aa469de4412e59cf219ff5cb702aebfb by @yegor256: pdd fixed version in Travis
    • 079feef766fbfd38316ca26a222239d37bbae357 by @yegor256: typos
    • 12eae05d661c5ef765d1a3660d6e25b96077794c by @yegor256: hoc badge
    • 5f38b61caeee4587a08bded4c005a9e1709bdb43 by @piotrkot: #872 Take throws Exception
    • 6a770dd8b9feab1fa480dcd0e90f9874eccc5069 by @rultor: Merge branch '__rultor'
    • f617307e33a2a7b5029bfaf5761429bd8f51eb14 by @zCRUSADERz: #968. Removing Guava and stati...
    • 8e25286b8ed278b8b0de71bf570eaa2f0b03f8ff by @rultor: Merge branch '__rultor'
    • c99341d1859f4d5815bf2de0c16e735188dba00a by @yegor256: elegantobjects.org HTTPS
    • 21fff759e0d54fd303523cb7707c1c112ddfb432 by @yegor256: Sixnines.io HTTPS
    • 18c485c524e225efbf726b5caadfc1c68fa0bdac by @zCRUSADERz: #980. Update ruby version to 2...
    • d2e2c36959bef984f62b453c9adf7d999dffc42c by @zCRUSADERz: #968. Update cactoos-matchers ...
    • b971f47f736149f22b4905b1e181bb42232f3909 by @vzurauskas: (#976) Update maven-compiler-p...
    • a4f4d939c8f8e0af190025716ad7f22b7de40e70 by @rultor: Merge branch '__rultor'
    • 74f73c5a7fc78d02df94288282d31ed0f5cbd030 by @Serranya: #957 update PR guidelines
    • eca4d3c6ae9bba58aa3d30984ce469411d0ca711 by @paulodamaso: Project report - 2019-03-30.
    • e41c34fb4163b60aa7db39f0905be96a4b7830fc by @paulodamaso: Project report - 2019-03-30.
    • a2de7ddac8b0053a01fa10b43990f042112915f8 by @rultor: Merge branch '__rultor'
    • fff314b86632ccd15a66e89adfbf99aafba19093 by @Serranya: Change status code of RsEmpty ...
    • and 17 more...

    Released by Rultor 1.68.4, see build log

    Source code(tar.gz)
    Source code(zip)
  • 1.16(Jan 26, 2019)

    See #956, release log:

    • 3fb3ff79a79e81073698982e2ea8d3eabd57deed by @paulodamaso: Project report - review.
    • 5240f57ccfe50c886fd1cc69ae1c9a8c2412549b by @paulodamaso: Project report - 2019-01-26 - ...
    • af8e6de9294cf32de0bf5dcb8ec0c1444d1fb735 by @paulodamaso: Project report - 2019-01-26.
    • a5a6af3e3bb0790f76ae8329e0dd87ff997a8c35 by @fabriciofx: #953 TkServletApp renamed and ...
    • 5fee57b73d4797eaf621fd44907c2960151c3832 by @fabriciofx: #953 Grizzly updated
    • 29deb3eba5434554360d4a767ee18e63f2c40e72 by @fabriciofx: 953 Mode information to PDD
    • be2fac4327df047199cd1ff1fe3067c687c419a8 by @fabriciofx: #953 SrvTake test and Grizzly ...
    • afd95b0d5c40d0c40ad0fcfa9b21998268a37b87 by @fabriciofx: #865 Javadoc improved
    • ad2d0c77b70752c60665f7e1d2ed7b0238b77859 by @fabriciofx: #865 More fixes as requested b...
    • d847792b496fae8f2869744a0abef3b00284847d by @fabriciofx: #865 Fix tests as requested by...
    • ec5d5d5ffd7a7bfb4fab1a6c3e379a7f3175f1a7 by @fabriciofx: #865 Added RqFromTest and Http...

    Released by Rultor 1.68.1, see build log

    Source code(tar.gz)
    Source code(zip)
  • 1.15(Jan 21, 2019)

    See #951, release log:

    • d5f747d2586acc328d5a427599bc8eeb6e26253c by @rultor: Merge branch '__rultor'
    • 5b0a0bfc8bc4a72794d23d16a0e94f6c9af2db1d by @Serranya: Add reproducer for #577
    • e161aee9ec08955283c5788f1748e00f7f819463 by @rultor: Merge branch '__rultor'
    • 4a39ffbf3c381b0a9050c2934154462ba345ab0f by @Serranya: Use Cactoos from Body and remo...
    • 8c91d479f0ef3133d2580da09677bb59ecaf8ace by @rultor: Merge branch '__rultor'
    • a509cdb2895812d9e06249631e29c78fb6aa6391 by @Iprogrammerr: Removing unnecessary puzzles f...
    • 8b068621f157ff283a44f5c4b44d34e9bf74072c by @rultor: Merge branch '__rultor'

    Released by Rultor 1.68.1, see build log

    Source code(tar.gz)
    Source code(zip)
  • 1.14(Jan 11, 2019)

    See #939, release log:

    • 210c7ef74bcb019883eb1c09bd91eb318a772dcb by @paulodamaso: Merge remote-tracking branch '...
    • 0a85b3812e600246926fa563ec80d46449f0df5a by @paulodamaso: Status report for 11/01/2019 S...
    • 4b112fbaff50a77082166ad689955079851d1e88 by @paulodamaso: Status report for 11/01/2019 S...
    • f76484e5110424d8a51febf083220072978dc3e9 by @paulodamaso: For #925: Copyright update.
    • 7b495e78044afbecd2e17d09f5b5e4560de450f1 by @rultor: Merge branch '__rultor'
    • b9f248eb586b768198598120e4ae3ee4c5770e8b by @marceloamadeu: Continue to remove nulls as re...
    • ab2d8d6f9918a8ce8c969af480edc234f074973c by @fabriciofx: #866 Added more details to puz...
    • 113b8e8dec7aeb1eb8a1c1f0944cc91af73a1e59 by @fabriciofx: #866 ResponseOf unit tests
    • 6e4df632e8b50f26d7468a5d3e5aae4eada84ce6 by @paulodamaso: Project report: 28/12/2018

    Released by Rultor 1.68.1, see build log

    Source code(tar.gz)
    Source code(zip)
  • 1.13(Dec 28, 2018)

    See #921, release log:

    • 48da407645afcc1c04c70cf8155925c552bf242c by @rultor: Merge branch '__rultor'
    • c8ee2a34b4483d707b1bcecac8b667ca204fafc5 by @rultor: Merge branch '__rultor'
    • 49b612f8385de0fe44e2ce45ed4d54ceb4aba2e6 by @fabriciofx: #882 Un-exclude findbugs from ...
    • f691e0b5993dc1ace0a045834a7b153b6337142e by @krzyk: #788 refactored TkFallback
    • 1e04fe7f77afa3ffaa71f9a03cc46a16e5fcfe36 by @krzyk: #863 removed some nulls
    • 7a4efc709fe7c6c76e5d2b2694e95635352ef260 by @Iprogrammerr: continue to refactor Utf8Strin...
    • 02ff86725efd506480ae344d0fe5e748f718d2ba by @Iprogrammerr: continue to refactor Utf8Strin...
    • 33a5f52c5a54485afe59c23273c8264579b77525 by @Iprogrammerr: Fixed badly renamed comments, ...
    • ec5a55e76082a17f483e9340632ff22806e34936 by @Iprogrammerr: Utf8String implements Cactoos ...
    • 990b23211b70df90e4e1a0e898d971a38d96aa40 by @oridan: removed junit-platform-surefir...
    • bdec6c9601b2e13c16633669525e9dde8958bbf5 by @oridan: fixed puzzle description
    • 718e623345e3708f4289cffad9e22bd9cea5aea0 by @oridan: upgraded maven-surefire-plugin...
    • a0cfd324886f13f10f261302a81eb863c9216441 by @oridan: removed dependencies
    • 4f60717b21363fe3367d25664acd6a10fabfca84 by @oridan: fix spaces
    • 832dd6d60c2a2737188102ae2737b075ba8adb16 by @oridan: fixed junit-platform-runner ve...
    • ee596ed36dff90918d9bab0be6048f60de309a63 by @oridan: fixed junit dependencies

    Released by Rultor 1.68.1, see build log

    Source code(tar.gz)
    Source code(zip)
  • 1.12(Dec 13, 2018)

    See #891, release log:

    • cd1e411441fe5408fb938eb3fc08de2a5287caca by @victornoel: Add todo to replace static met...
    • a211201182f3ccfbf6c83bc2f3ad6655394b623f by @victornoel: Bump qulice to 0.18.5 for #880
    • 47ed1e86a31d7f17d2f2c958460283d60a533563 by @rultor: Merge branch '__rultor'
    • 2bf5e1729321bc44c0af9109a2fd051d58d9bf1b by @krzyk: #876 CR
    • 78874a072afc404615ba186952a31d9801ba5159 by @rultor: Merge branch '__rultor'
    • 8025a991fb8825464df50ddc866d926524fea0ce by @rultor: Merge branch '__rultor'
    • f5faabbb4f31c8cd81f658e05315d108b4998d62 by @olenagerasimova: #842 migrated to velocity 2.0
    • 244a3f973cac0304ed41c0862eb49641aea17a5e by @krzyk: Rearranged architects
    • 1d43de35261ec3d5a3ee11ce6f156e35a752131a by @rultor: Merge branch '__rultor'
    • 44ac95745d01ac1137fa174ac963d7a9f6c477cb by @krzyk: #876 corrected test for PsFace...

    Released by Rultor 1.68.1, see build log

    Source code(tar.gz)
    Source code(zip)
  • 1.11.4(Dec 6, 2018)

    See #838, release log:

    • 1a1125650819baf157361fb666fa00ef3c5c4482 by @rultor: Merge branch '__rultor'
    • 9ef766a288f87b25f8ebe9b1ee1d554a13868289 by @olenagerasimova: #838 CR fix
    • 403e55dfabbe6ba7040884ebbf5ef632fd3af6e4 by @olenagerasimova: #838 CR fix
    • 95cd94f4403d279dd427d87ae9a8cac0b08a18a5 by @rultor: Merge branch '__rultor'
    • 977cb115fffd08e58882aa753b6e12765c870d27: #838 close body in RsPrint
    • 4cb2d0b236917a3c3b095dfc3f55058e3b22f86b: #770 removed extra condition c...
    • c8f3ef2740506815b9c6398f50fb968462ee17d4 by @victornoel: Add extra todo for qulice 0.17...
    • 3e53d1278d8a882343b877c5d7d2c04966491478 by @victornoel: Upgrade to qulice 0.17.5 for #...
    • e6fc4cf67614fef972c45bc2ada248085f3375bf by @victornoel: TkMethods now returns 405 on u...
    • 6146d34b4852c5c9282437958bf80e80f0c206aa by @rultor: Merge branch '__rultor'
    • b358fcf50277cbd0c8c9d7f139078f0a7f9db384 by @rultor: Merge branch '__rultor'
    • 01975208775f9840f95ebc0ad3954da68427e478 by @victornoel: Fix flushHeadEvenWhenException...
    • 4ccecced024e64cc5b5efb19db56144b15af03d8 by @victornoel: Replace the todo with a more s...
    • f342d16b3d11f553c95ea42f4fb609352449676d by @olenagerasimova: #819 review fix
    • 5adae2e1a9874782b605c92b4c65568a3c98290b by @olenagerasimova: #819 AbstractHmTextBody descri...
    • 87f8ee3a80cb27136838f640677b1890f5adda79 by @rultor: Merge branch '__rultor'
    • a21276b3598541f2f5af50f023dff734e761b3dd by @g4s8: #682 - todo for servlets API i...
    • f7d4cc499816304a7b945a72d6c32ae29cf53776 by @paulodamaso: For #862: Removing versioneye ...
    • e6d837378e890f44288f75f7faedb7899a67ca9c by @g4s8: Merge branch 'master' into 682
    • 1b59c9b3c7662072d0ab8002a8a6ae69f4ded167 by @paulodamaso: For #826: Review changes.
    • and 51 more...

    Released by Rultor 1.68.1, see build log

    Source code(tar.gz)
    Source code(zip)
  • 1.11.3(Apr 2, 2018)

    See #834, release log:

    • 01cd51b0612c19794295074b5f5584ce05414b15 by @yegor256: #834 extra ctor
    • da47b15aef9a88e6fe266facf754314a38cdad01 by @yegor256: #834 RqHref.Smart fixed
    • 74f4600bcc308f076c7ad0f3f1b743ea7f7587cc by @yegor256: donate badge

    Released by Rultor 1.67.2, see build log

    Source code(tar.gz)
    Source code(zip)
  • 1.11.2(Mar 22, 2018)

    See #821, release log:

    • 688b1a61c0cdf6aa5922b0be74769d3934744fab by @rultor: Merge branch '__rultor'
    • c1368ab5148f129f07487a4355c1238ca31eff9d by @rultor: Merge branch '__rultor'
    • cab1502ad9169eb8c88d31e4b86a52fdbc380472 by @t-izbassar: #795 Implement describeTo and ...
    • 7d179059591e110dbab4b2e2075b22332fc022db by @g4s8: #821 - random IV for CcAes
    • 81818fd751f16a298c698262a12c8fe2694019d9 by @g4s8: #821 - signed codec
    • 170ef2ae0b4045f1fa60e87c885035c4fbc779e7 by @yegor256: #811 fixed

    Released by Rultor 1.67.2, see build log

    Source code(tar.gz)
    Source code(zip)
  • 1.11.1(Mar 13, 2018)

    See #829, release log:

    • ee1797703afecee8fa8fc25f5fc385e8af59f366 by @yegor256: #829 absolute path and expires
    • fe45f96397b6354ae6e44599c343ca17eb56cc54 by @yegor256: #829 encode and decode locatio...
    • 3ee3b2267ed178423bae68fdee50b18c51e4072a by @yegor256: #829 doc
    • 2b91328a844d9506cc6b1d4d203b45af41598e90 by @yegor256: #829 shorter name for TkPrevio...

    Released by Rultor 1.67.2, see build log

    Source code(tar.gz)
    Source code(zip)
  • 1.11(Mar 12, 2018)

    See #828, release log:

    • 7ee96516bc587bbb548e5cfbcef0fee70a4ab82d by @yegor256: #828 TkJoinedCookies
    • e863bb616b9036ddc9bc7750f3d3b31c82fff2a1 by @yegor256: #828 org.takes.facets.cookies

    Released by Rultor 1.67.2, see build log

    Source code(tar.gz)
    Source code(zip)
  • 1.10(Mar 12, 2018)

    See #827, release log:

    • a981208d0e92df7b14204e2cd4e4e2f1dd2036c2 by @yegor256: #827 clean up
    • f72785b757a0b5e7ea3c2f1d46fa4cf8ad56e49a by @yegor256: #827 TkPrevious and RsPrevious

    Released by Rultor 1.67.2, see build log

    Source code(tar.gz)
    Source code(zip)
  • 1.9.2(Mar 9, 2018)

  • 1.9.1(Mar 9, 2018)

  • 1.9(Mar 9, 2018)

  • 1.8.7(Mar 8, 2018)

    See #822, release log:

    • 78d7c58e037753039ceca1eee3562afbb7d74cf4 by @yegor256: #822 polished
    • 3716f4eeb94211a5346e939aa9f7a83774ced97d by @yegor256: #822 extra validation in CcSal...
    • 7fb524155b180e8eb35d63545e10d20ab614eb5e by @rultor: Merge branch '__rultor'
    • f6c48c0dc2b6ac6029380c03e006da30336fd9e0 by @t-izbassar: #794 Modify puzzle to update t...
    • a39db8b07847a9b0ae657cb9dcddfaaad3ae598c by @t-izbassar: #794 Replace containsString wi...

    Released by Rultor 1.67.1, see build log

    Source code(tar.gz)
    Source code(zip)
  • 1.8.6(Mar 1, 2018)

  • 1.8.5(Mar 1, 2018)

Owner
Yegor Bugayenko
Lab director at @huawei; author of "Elegant Objects" book series (buy them on Amazon); founder of @zerocracy; creator of @zold-io
Yegor Bugayenko
An evolving set of open source web components for building mobile and desktop web applications in modern browsers.

Vaadin components Vaadin components is an evolving set of high-quality user interface web components commonly needed in modern mobile and desktop busi

Vaadin 519 Dec 31, 2022
Vaadin 6, 7, 8 is a Java framework for modern Java web applications.

Vaadin Framework Vaadin allows you to build modern web apps efficiently in plain Java, without touching low level web technologies. This repository co

Vaadin 1.7k Jan 5, 2023
Ninja is a full stack web framework for Java. Rock solid, fast and super productive.

_______ .___ _______ ____. _____ \ \ | |\ \ | | / _ \ / | \| |/ | \ | |/ /_\ \ / | \

Ninja Web Framework 1.9k Jan 5, 2023
The modular web framework for Java and Kotlin

∞ do more, more easily Jooby is a modern, performant and easy to use web framework for Java and Kotlin built on top of your favorite web server. Java:

jooby 1.5k Dec 16, 2022
Apache Wicket - Component-based Java web framework

What is Apache Wicket? Apache Wicket is an open source, java, component based, web application framework. With proper mark-up/logic separation, a POJO

The Apache Software Foundation 657 Dec 31, 2022
Micro Java Web Framework

Micro Java Web Framework It's an open source (Apache License) micro web framework in Java, with minimal dependencies and a quick learning curve. The g

Pippo 769 Dec 19, 2022
ZK is a highly productive Java framework for building amazing enterprise web and mobile applications

ZK ZK is a highly productive Java framework for building amazing enterprise web and mobile applications. Resources Documentation Tutorial ZK Essential

ZK 375 Dec 23, 2022
An Intuitive, Lightweight, High Performance Full Stack Java Web Framework.

mangoo I/O mangoo I/O is a Modern, Intuitive, Lightweight, High Performance Full Stack Java Web Framework. It is a classic MVC-Framework. The foundati

Sven Kubiak 52 Oct 31, 2022
A simple expressive web framework for java. Spark has a kotlin DSL https://github.com/perwendel/spark-kotlin

Spark - a tiny web framework for Java 8 Spark 2.9.3 is out!! Changeset <dependency> <groupId>com.sparkjava</groupId> <artifactId>spark-core</a

Per Wendel 9.4k Dec 29, 2022
A web MVC action-based framework, on top of CDI, for fast and maintainable Java development.

A web MVC action-based framework, on top of CDI, for fast and maintainable Java development. Downloading For a quick start, you can use this snippet i

Caelum 347 Nov 15, 2022
A server-state reactive Java web framework for building real-time user interfaces and UI components.

RSP About Maven Code examples HTTP requests routing HTML markup Java DSL Page state model Single-page application Navigation bar URL path UI Component

Vadim Vashkevich 33 Jul 13, 2022
Javalin - A simple web framework for Java and Kotlin

Javalin is a very lightweight web framework for Kotlin and Java which supports WebSockets, HTTP2 and async requests. Javalin’s main goals are simplicity, a great developer experience, and first class interoperability between Kotlin and Java.

David (javalin.io) 6.2k Jan 6, 2023
The Grails Web Application Framework

Build Status Slack Signup Slack Signup Grails Grails is a framework used to build web applications with the Groovy programming language. The core fram

grails 2.7k Jan 5, 2023
jetbrick web mvc framework

jetbrick-webmvc Web MVC framework for jetbrick. Documentation http://subchen.github.io/jetbrick-webmvc/ Dependency <dependency> <groupId>com.githu

Guoqiang Chen 25 Nov 15, 2022
πŸš€ The best rbac web framework. base on Spring Boot 2.4、 Spring Cloud 2020、 OAuth2 . Thx Give a star

?? The best rbac web framework. base on Spring Boot 2.4、 Spring Cloud 2020、 OAuth2 . Thx Give a star

pig-mesh 4.3k Jan 8, 2023
Java Web Toolkit

What is JWt ? JWt is a Java library for developing web applications. It provides a pure Java component-driven approach to building web applications, a

null 48 Jul 16, 2022
RESTEasy is a JBoss project that provides various frameworks to help you build RESTful Web Services and RESTful Java applications

RESTEasy RESTEasy is a JBoss.org project aimed at providing productivity frameworks for developing client and server RESTful applications and services

RESTEasy 1k Dec 23, 2022
This is a Playwright Java Framework written in POM

Playwright Java Framework Main Objective of this Framework is to Build an Automation Framework that can be scalable, Easily Configurable and Ready to

AutoInfra 11 Oct 17, 2022
A Java Framework for Building Bots on Facebook's Messenger Platform.

Racter A Java Framework for Building Bots on Facebook's Messenger Platform. Documentation Installation To add a dependency using Maven, use the follow

Ahmed 18 Dec 19, 2022