# roaster
**Repository Path**: jy_common/roaster
## Basic Information
- **Project Name**: roaster
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2021-10-11
- **Last Updated**: 2024-06-01
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
Roaster - The only Java source parser library you'll ever need
===============================================================
image:https://img.shields.io/github/actions/workflow/status/forge/roaster/maven.yml?style=for-the-badge&logo=github["Actions Status", link="https://github.com/forge/roaster/actions"]
image:http://img.shields.io/:license-EPL-blue.svg?style=for-the-badge&logo=apache["License", link="https://www.eclipse.org/legal/epl-v10.html"]
image:https://img.shields.io/github/tag/forge/roaster?logo=apache-maven&label=Maven%20Central&style=for-the-badge["Maven Central", link="https://search.maven.org/artifact/org.jboss.forge.roaster/roaster-jdt"]
image:https://img.shields.io/badge/JVM-17-brightgreen.svg?style=for-the-badge&logo=eclipseadoptium["Supported JVM Versions"]
Roaster (formerly known as java-parser) is a library that allows easy parsing and formatting of java source files.
Roaster introduces a fluent interface to manipulate Java source files, like adding fields, methods, annotations and so on.
Installation
============
* If you are using Maven, add the following dependencies to your project:
```xml
2.29.0.Final
org.jboss.forge.roaster
roaster-api
${version.roaster}
org.jboss.forge.roaster
roaster-jdt
${version.roaster}
runtime
```
* Otherwise, download and extract (or build from sources) the most recent http://search.maven.org/#search|ga|1|a%3A%22roaster-distribution%22[distribution] containing the Roaster distribution and command line tools
Usage
=====
CLI
---
Execute roaster by running the following script (add these to your $PATH for convenience):
[source]
----
bin/roaster (Unix/Linux/OSX)
bin/roaster.bat (Windows)
----
Options described here:
[source,cmd]
----
$ roaster -h
Usage: roaster [OPTION]... FILES ...
The fastest way to build applications, share your software, and enjoy doing it.
-c, --config [CONFIG_FILE]
specify the path to the Eclipse code format profile (usually found at '$PROJECT/.settings/org.eclipse.jdt.core.prefs')
-r, --recursive
format files in found sub-directories recursively
FILES...
specify one or more space-separated files or directories to format
-h, --help
display this help and exit
----
Java Parser API
---------------
Example:
```java
Roaster.parse(JavaClassSource.class, "public class HelloWorld {}");
```
Java Source Code Generation API
-------------------------------
Roaster provides a fluent API to generate java classes. Here an example:
```java
final JavaClassSource javaClass = Roaster.create(JavaClassSource.class);
javaClass.setPackage("com.company.example").setName("Person");
javaClass.addInterface(Serializable.class);
javaClass.addField()
.setName("serialVersionUID")
.setType("long")
.setLiteralInitializer("1L")
.setPrivate()
.setStatic(true)
.setFinal(true);
javaClass.addProperty(Integer.class, "id").setMutable(false);
javaClass.addProperty(String.class, "firstName");
javaClass.addProperty("String", "lastName");
javaClass.addMethod()
.setConstructor(true)
.setPublic()
.setBody("this.id = id;")
.addParameter(Integer.class, "id");
```
Will produce:
```java
package com.company.example;
import java.io.Serializable;
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
private final Integer id;
private String firstName;
private String lastName;
public Integer getId() {
return id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Person(Integer id) {
this.id = id;
}
}
```
Java Source Code Modification API
---------------------------------
Of course it is possible to mix both approaches (parser and writer) to modify Java code programmatically:
```java
JavaClassSource javaClass =
Roaster.parse(JavaClassSource.class, "public class SomeClass {}");
javaClass.addMethod()
.setPublic()
.setStatic(true)
.setName("main")
.setReturnTypeVoid()
.setBody("System.out.println(\"Hello World\");")
.addParameter("java.lang.String[]", "args");
System.out.println(javaClass);
```
JavaDoc creation and parsing
----------------------------
Here is an example on how to add JavaDoc to a class:
```java
JavaClassSource javaClass =
Roaster.parse(JavaClassSource.class, "public class SomeClass {}");
JavaDocSource javaDoc = javaClass.getJavaDoc();
javaDoc.setFullText("Full class documentation");
// or
javaDoc.setText("Class documentation text");
javaDoc.addTagValue("@author","George Gastaldi");
System.out.println(javaClass);
```
Formatting the Java Source Code
-------------------------------
Roaster formats the Java Source Code by calling the `format()` method:
```java
String javaCode = "public class MyClass{ private String field;}";
String formattedCode = Roaster.format(javaCode);
System.out.println(formattedCode);
```
Parsing the java unit
----------------------
The link:http://docs.oracle.com/javase/specs/jls/se7/html/jls-7.html#jls-7.3[Java Language Specification] allows you to define multiple classes in the same .java file. Roaster supports parsing the entire unit by calling the parseUnit() method:
```java
String javaCode = "public class MyClass{ private String field;} public class AnotherClass {}";
JavaUnit unit = Roaster.parseUnit(javaCode);
JavaClassSource myClass = unit.getGoverningType();
JavaClassSource anotherClass = (JavaClassSource) unit.getTopLevelTypes().get(1);
```
Validate Code Snippets
----------------------
Roaster validates Java snippets and reports as Problem objects by calling the `validateSnippet()` method:
Example:
```java
List problem = Roaster.validateSnippet("public class HelloWorld {}");
// problem.size() == 0
List problem = Roaster.validateSnippet("public class MyClass {");
// problem.size() == 1 containing a new Problem("Syntax error, insert \"}\" to complete ClassBody", 21, 21, 1)
```
Building from sources
=====================
Just run `mvn clean install` to build the sources
Issue tracker
=============
File an issue in our https://github.com/forge/roaster/issues[GitHub Issue Tracker]
Get in touch
============
Roaster uses the same forum and mailing lists as the http://forge.jboss.org/[JBoss Forge] project. See the http://forge.jboss.org/community[JBoss Forge Community] page.
* https://developer.jboss.org/en/forge[User forums]
* https://developer.jboss.org/en/forge/dev[Developer forums]
Related / Similar projects
==========================
For the writer part:
* https://github.com/square/javapoet[square/javapoet]
License
=======
http://www.eclipse.org/legal/epl-v10.html[Eclipse Public License - v 1.0]