Skip to content
Snippets Groups Projects
Commit dced4d83 authored by Eike Cochu's avatar Eike Cochu
Browse files

moved rest api classes to subpackages

added working example implementation of the rest api articles resource, excluding update support
modified data.json, removed initial ids to use automatic ids instead
parent 5c9e76f5
No related branches found
No related tags found
No related merge requests found
Showing
with 253 additions and 116 deletions
......@@ -451,11 +451,15 @@
[
"/home/eike/Repositories/fu/ss15/ma/impl",
"/home/eike/Repositories/fu/ss15/ma/impl/vm",
"/home/eike/Repositories/fu/ss15/ma/impl/vm/config"
"/home/eike/Repositories/fu/ss15/ma/impl/vm/config",
"/home/eike/Repositories/fu/ss15/ma/impl/vm/data"
],
"file_history":
[
"/home/eike/Repositories/fu/ss15/ma/impl/vm/data/data.json",
"/home/eike/Repositories/fu/ss15/ma/impl/vm/bootstrap.sh",
"/home/eike/Repositories/fu/ss15/ma/impl/vm/config/environment",
"/home/eike/Repositories/fu/ss15/ma/impl/vm/config/disable-transparent-hugepages",
"/home/eike/Repositories/fu/ss15/ma/impl/Vagrantfile",
"/home/eike/Repositories/fu/ss15/ma/impl/vm/config/spark-env.sh",
"/home/eike/Repositories/fu/ss15/ma/impl/vm/rc.sh",
......@@ -463,7 +467,6 @@
"/home/eike/Repositories/fu/ss15/ma/impl/vm/env.sh",
"/home/eike/Repositories/fu/ss15/ma/impl/ui/backend/pom.xml",
"/home/eike/Repositories/fu/ss15/ma/impl/vm/config/mongo-express.config.js",
"/home/eike/Repositories/fu/ss15/ma/impl/vm/config/disable-transparent-hugepages",
"/home/eike/Repositories/fu/ss15/ma/impl/data/data.json",
"/home/eike/Repositories/fu/ss15/ma/impl/vm/Vagrantfile",
"/home/eike/Repositories/fu/ss15/ma/impl/data/data.sql",
......@@ -564,6 +567,9 @@
"case_sensitive": false,
"find_history":
[
"\"id\":.*?\\n ",
"\"id\":.*?\\n",
"\"_id\":",
"000+00\"",
"\\$date\": ([^,]+),",
"\"id\"",
......@@ -688,17 +694,16 @@
"images",
"url(\"../images/",
"fa-var",
"account.name",
"category.name",
"t('",
".name"
"account.name"
],
"highlight": true,
"in_selection": false,
"preserve_case": false,
"regex": false,
"regex": true,
"replace_history":
[
"",
"\"id\":",
"000+0000\"",
"date\": { \"\\$date\": $1 },",
"\"_id\"",
......@@ -824,9 +829,7 @@
"/assets",
"Config::get",
"Lang::t",
"@__",
"@T",
"'"
"@__"
],
"reverse": false,
"show_context": true,
......
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="target/classes" path="src/main/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" path="src/main/java"/>
<classpathentry kind="src" path="src/main/resources"/>
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
<attributes>
<attribute name="maven.pomderived" value="true"/>
......@@ -19,7 +10,7 @@
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
<attributes>
<attribute name="maven.pomderived" value="true"/>
<attribute name="owner.project.facets" value="java"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/classes"/>
......
......@@ -5,6 +5,6 @@
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
<property name="java-output-path" value="/tmbs-rest-backend/target/classes"/>
<property name="context-root" value="tmbs-rest-backend"/>
<property name="context-root" value="tmbs"/>
</wb-module>
</project-modules>
......@@ -2,7 +2,7 @@
<faceted-project>
<fixed facet="wst.jsdt.web"/>
<installed facet="wst.jsdt.web" version="1.0"/>
<installed facet="java" version="1.8"/>
<installed facet="jst.jaxrs" version="2.0"/>
<installed facet="jst.web" version="3.1"/>
<installed facet="java" version="1.8"/>
</faceted-project>
......@@ -31,5 +31,10 @@
<artifactId>log4j-core</artifactId>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.0.4</version>
</dependency>
</dependencies>
</project>
package de.cochu.backend;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Path("/")
public class Test {
static Logger log = LogManager.getLogger(Test.class);
@GET
@Path("/test")
@Produces(MediaType.TEXT_PLAIN)
public String test() {
return "hello world!";
}
@GET
@Path("/test2")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public TestModel test2() {
TestModel tm = new TestModel();
tm.setName("Testname");
return tm;
}
}
package de.cochu.backend;
public class TestModel {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package de.cochu.backend;
package de.cochu.backend.rest;
import org.glassfish.jersey.filter.LoggingFilter;
import org.glassfish.jersey.server.ResourceConfig;
public class Application extends ResourceConfig {
public Application() {
packages("de.cochu.backend");
//register(LoggingFilter.class);
packages("de.cochu.backend.rest");
}
}
package de.cochu.backend;
package de.cochu.backend.rest;
import java.io.IOException;
......
package de.cochu.backend.rest.domain;
import java.util.ArrayList;
import java.util.Date;
import javax.xml.bind.annotation.XmlRootElement;
import org.bson.Document;
import org.bson.types.ObjectId;
@XmlRootElement
public class Article extends Domain {
private String title;
private String text;
private String url;
private Date date;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public Document toDocument() {
Document doc = new Document("title", title).append("text", text).append("url", url).append("date", date);
if (id != null) {
doc.append("_id", new ObjectId(id));
}
return doc;
}
public static Article fromDocument(final Document doc) {
Article article = new Article();
article.id = doc.getObjectId("_id").toString();
article.title = doc.getString("title");
article.text = doc.getString("text");
article.url = doc.getString("url");
article.date = doc.getDate("date");
return article;
}
public static ArrayList<Article> fromDocuments(final ArrayList<Document> docs) {
ArrayList<Article> articles = new ArrayList<Article>(docs.size());
for (Document doc : docs) {
articles.add(fromDocument(doc));
}
return articles;
}
}
package de.cochu.backend.rest.domain;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import javax.xml.bind.annotation.XmlRootElement;
import org.bson.Document;
@XmlRootElement
public abstract class Domain {
protected String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public URI getURI(URI base) throws URISyntaxException, MalformedURLException {
return new URI(base.toString() + "/" + id);
}
public abstract Document toDocument();
}
package de.cochu.backend.rest.resource;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.core.GenericEntity;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.bson.Document;
import org.bson.types.ObjectId;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import static com.mongodb.client.model.Sorts.*;
import de.cochu.backend.rest.domain.Article;
@Path("articles")
public class Articles {
static Logger log = LogManager.getLogger(Articles.class);
@Context
UriInfo uri;
MongoClient mongo = new MongoClient();
MongoDatabase db = mongo.getDatabase("test");
MongoCollection<Document> articles = db.getCollection("articles");
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getArticles(@QueryParam("skip") @DefaultValue("0") int skip,
@QueryParam("limit") @DefaultValue("0") int limit,
@QueryParam("sortby") @DefaultValue("date") String sortBy,
@QueryParam("order") @DefaultValue("desc") String order) {
ArrayList<Document> result = articles.find().skip(skip).limit(limit)
.sort(order.equals("desc") ? descending(sortBy) : ascending(sortBy)).into(new ArrayList<Document>());
ArrayList<Article> articles = Article.fromDocuments(result);
return Response.ok(new GenericEntity<List<Article>>(articles) {
}).build();
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("{id}")
public Response getArticle(@PathParam("id") String id) {
if (id == null || id.trim().length() == 0) {
return Response.status(Response.Status.BAD_REQUEST)
.entity(String.format(Messages.BAD_REQUEST, "id cannot be empty")).build();
}
ObjectId objectId = new ObjectId(id);
ArrayList<Document> result = articles.find(Filters.eq("_id", objectId)).into(new ArrayList<Document>());
if (result.size() == 1) {
Article article = Article.fromDocument(result.get(0));
return Response.ok(article).build();
}
return Response.status(Response.Status.NOT_FOUND).entity(String.format(Messages.NOT_FOUND, id)).build();
}
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response createArticle(Article article) throws MalformedURLException, URISyntaxException {
Document doc = new Document(article.toDocument());
articles.insertOne(doc);
article = Article.fromDocument(doc);
return Response.created(article.getURI(uri.getAbsolutePath())).entity(article).build();
}
@DELETE
@Path("{id}")
public Response deleteArticle(@PathParam("id") String id) {
ObjectId objectId = new ObjectId(id);
articles.deleteOne(Filters.eq("_id", objectId));
return Response.noContent().build();
}
}
package de.cochu.backend.rest.resource;
public class Messages {
public static final String NOT_FOUND = "Entity not found for id %1";
public static final String BAD_REQUEST = "Bad request: %1";
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:web="http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee">
<servlet>
<servlet-name>jersey</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>de.cochu.backend.Application</param-value>
<param-value>de.cochu.backend.rest.Application</param-value>
</init-param>
</servlet>
<servlet-mapping>
......
#Generated by Maven Integration for Eclipse
#Sat Dec 05 14:53:18 CET 2015
version=0.0.1-SNAPSHOT
groupId=de.cochu
m2e.projectName=tmbs-rest-backend
m2e.projectLocation=/home/eike/Repositories/fu/ss15/ma/impl/ui/backend
artifactId=backend
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>de.cochu</groupId>
<artifactId>backend</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>backend Maven Webapp</name>
<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
</properties>
<dependencies>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.22.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
<version>2.22.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.4.1</version>
</dependency>
</dependencies>
</project>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment