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

added linked iface + generic service impl

added log files to gitignore
added log file appender to cmd log4j config
set proper context root for rest project via maven
added linked interface for rest model classes
added generic request service for rest project that sets base uri automatically
renamed topic to topicdefinition in rest project
added motd to vm bootstrap for login info
removed mongod.conf configuration
added ui topic routes and template stubs
parent 133acea2
Branches
No related tags found
No related merge requests found
Showing
with 167 additions and 118 deletions
*.log
.vagrant/
vm/webapps/
\ No newline at end of file
vm/webapps/
......@@ -275,14 +275,6 @@
},
"buffers":
[
{
"file": "vm/bootstrap.sh",
"settings":
{
"buffer_size": 3519,
"line_ending": "Unix"
}
}
],
"build_system": "",
"build_system_choices":
......@@ -462,15 +454,24 @@
"expanded_folders":
[
"/home/eike/repos/master/ma-impl",
"/home/eike/repos/master/ma-impl/vm"
"/home/eike/repos/master/ma-impl/vipra-cmd"
],
"file_history":
[
"/usr/share/applications/defaults.list",
"/home/eike/repos/master/ma-impl/vipra-cmd.sh",
"/home/eike/repos/master/ma-impl/vipra-cmd/build2.xml",
"/home/eike/repos/master/ma-impl/vipra-ui/README.md",
"/home/eike/repos/master/ma-impl/vipra-ui/bower.json",
"/home/eike/repos/testasd/bower.json",
"/home/eike/repos/master/ma-impl/vipra-ui2/package.json",
"/home/eike/repos/master/ma-impl/vipra-ui/app/components/dynamic-high-charts.js",
"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/articles/list.js",
"/home/eike/repos/master/ma-impl/vipra-ui/package.json",
"/home/eike/repos/master/ma-impl/vipra-ui/node_modules/ember-highcharts/package.json",
"/home/eike/repos/master/ma-impl/vm/bootstrap.sh",
"/home/eike/repos/master/ma-impl/vm/config/initd-mongod",
"/home/eike/repos/master/ma-impl/vm/webapps/vipra-rest/WEB-INF/web.xml",
"/core",
"/home/eike/repos/master/ma-impl/vm/bootstrap.sh",
"/home/eike/repos/master/ma-impl/vm/config/environment",
"/home/eike/repos/master/ma-impl/Vagrantfile",
"/home/eike/repos/master/ma-impl/vm/config/initd-tomcat",
......@@ -584,16 +585,7 @@
"/home/eike/.duplicity-exclude",
"/home/eike/Repositories/fu/ss15/ki/exercise-08/task2a.pl",
"/home/eike/Repositories/fu/ss15/ki/exercise-08/games.nkb",
"/home/eike/Repositories/fu/ss15/ki/exercise-08/exercise-08.tex",
"/home/eike/Repositories/fu/ss15/ki/exercise-08/task01.pl",
"/home/eike/Repositories/latex-templates/invoice.tex",
"/home/eike/Repositories/niels_website/Rechnungen/exercise-01.tex",
"/home/eike/OwnCloud/NiELS/todo-2015-06-13.txt",
"/home/eike/Repositories/fu/ss15/bfm/exercise-06/ex06.txt",
"/home/eike/Repositories/fu/ss15/bfm/exercise-04/ex04.txt",
"/home/eike/Repositories/fu/ss15/bfm/exercise-05/ex05.txt",
"/home/eike/Repositories/fu/ss15/ki/exercise-08/native.pl",
"/home/eike/Repositories/fu/ss15/ki/exercise-08/birds.nkb"
"/home/eike/Repositories/fu/ss15/ki/exercise-08/exercise-08.tex"
],
"find":
{
......@@ -642,7 +634,6 @@
"case_sensitive": false,
"find_history":
[
"gedit.desktop",
"00:00Z\" },",
"{ \"$date\": ",
".000+0000",
......@@ -769,7 +760,8 @@
"intended",
"redirect_intended",
"amount-in",
"'"
"'",
"!important"
],
"highlight": true,
"in_selection": false,
......@@ -777,7 +769,6 @@
"regex": false,
"replace_history":
[
"sublime_text.desktop",
"00:00Z\",",
"",
"Z",
......@@ -904,7 +895,8 @@
"@append$1",
"survey",
"SurveysController",
""
"",
"/assets"
],
"reverse": false,
"show_context": true,
......@@ -915,37 +907,8 @@
"groups":
[
{
"selected": 0,
"sheets":
[
{
"buffer": 0,
"file": "vm/bootstrap.sh",
"semi_transient": false,
"settings":
{
"buffer_size": 3519,
"regions":
{
},
"selection":
[
[
933,
933
]
],
"settings":
{
"syntax": "Packages/ShellScript/Shell-Unix-Generic.tmLanguage"
},
"translation.x": 0.0,
"translation.y": 0.0,
"zoom_level": 1.0
},
"stack_index": 0,
"type": "text"
}
]
}
],
......@@ -996,7 +959,7 @@
"project": "ma-impl.sublime-project",
"replace":
{
"height": 66.0
"height": 46.0
},
"save_all_on_build": true,
"select_file":
......
......@@ -4,10 +4,19 @@
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%highlight{%-5level - %msg%n}{FATAL=red,ERROR=red,WARN=red,INFO=normal,DEBUG=normal,TRACE=normal}" />
</Console>
<File name="File" fileName="vipra-cmd.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n" />
<Filters>
<ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="DEBUG" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="TRACE" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
</File>
</Appenders>
<Loggers>
<Root level="ERROR">
<AppenderRef ref="Console" />
<AppenderRef ref="File" />
</Root>
<Logger name="shellout" level="INFO" />
</Loggers>
......
......@@ -22,5 +22,11 @@
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/classes"/>
</classpath>
......@@ -8,6 +8,6 @@
<dependency-type>uses</dependency-type>
</dependent-module>
<property name="java-output-path" value="/vipra-rest/target/classes"/>
<property name="context-root" value="rest"/>
<property name="context-root" value="vipra-rest"/>
</wb-module>
</project-modules>
......@@ -20,6 +20,10 @@
<log4jVersion>2.4.1</log4jVersion>
</properties>
<build>
<finalName>vipra-rest</finalName>
</build>
<dependencies>
<!-- Jersey REST -->
<dependency>
......
......@@ -4,7 +4,7 @@ import java.net.URI;
import java.util.HashMap;
import java.util.Map;
public class Article extends de.vipra.util.model.Article {
public class Article extends de.vipra.util.model.Article implements Linked {
private Map<String, String> links;
......
......@@ -3,9 +3,7 @@ package de.vipra.rest.model;
import java.net.URI;
import java.util.Map;
import de.vipra.util.model.Model;
public abstract class Linked extends Model {
public interface Linked {
public abstract Map<String, String> getLinks();
......
......@@ -4,7 +4,7 @@ import java.net.URI;
import java.util.HashMap;
import java.util.Map;
public class Topic extends de.vipra.util.model.TopicDefinition {
public class TopicDefinition extends de.vipra.util.model.TopicDefinition implements Linked {
private Map<String, String> links;
......
package de.vipra.rest.resource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletContext;
import javax.ws.rs.Consumes;
......@@ -48,8 +48,8 @@ public class ArticleResource {
public Response getArticles(@QueryParam("skip") @DefaultValue("0") int skip,
@QueryParam("limit") @DefaultValue("0") int limit,
@QueryParam("sort") @DefaultValue("date") String sortBy) {
ArrayList<Article> articles = service.getArticles(uri.getAbsolutePath(), skip, limit, sortBy);
ResponseWrapper<ArrayList<Article>> res = new ResponseWrapper<>(articles);
List<Article> articles = service.getMultiple(uri.getAbsolutePath(), skip, limit, sortBy);
ResponseWrapper<List<Article>> res = new ResponseWrapper<>(articles);
res.addLink("self", uri.getAbsolutePath().toString());
return Response.ok().entity(res).build();
}
......@@ -65,7 +65,7 @@ public class ArticleResource {
String.format(Messages.BAD_REQUEST, "id cannot be empty")));
return Response.status(Response.Status.BAD_REQUEST).entity(res).build();
}
Article article = service.getArticle(uri.getAbsolutePath(), id);
Article article = service.getSingle(uri.getAbsolutePath(), id);
if (article != null) {
res.setData(article);
return Response.ok().entity(res).build();
......@@ -82,7 +82,7 @@ public class ArticleResource {
public Response createArticle(Article article) {
ResponseWrapper<Article> res;
try {
article = service.createArticle(uri.getAbsolutePath(), article);
article = service.createSingle(uri.getAbsolutePath(), article);
res = new ResponseWrapper<>(article);
return Response.created(article.uri(uri.getAbsolutePath())).entity(res).build();
} catch (DatabaseException e) {
......@@ -98,7 +98,7 @@ public class ArticleResource {
ResponseWrapper<Article> res = new ResponseWrapper<>();
long deleted;
try {
deleted = service.deleteArticle(id);
deleted = service.deleteSingle(id);
} catch (DatabaseException e) {
res = new ResponseWrapper<>(new APIError(Response.Status.INTERNAL_SERVER_ERROR, "item could not be deleted",
"item could not be created due to an internal server error"));
......@@ -124,7 +124,7 @@ public class ArticleResource {
public Response updateArticle(@PathParam("id") String id, Article article) {
ResponseWrapper<Article> res = new ResponseWrapper<>();
try {
long updated = service.updateArticle(uri.getAbsolutePath(), article);
long updated = service.updateSingle(uri.getAbsolutePath(), article);
int updatedInt = updated > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) updated;
switch (updatedInt) {
case 0:
......
package de.vipra.rest.resource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletContext;
import javax.ws.rs.Consumes;
......@@ -20,12 +20,12 @@ import de.vipra.rest.APIMediaType;
import de.vipra.rest.Messages;
import de.vipra.rest.model.APIError;
import de.vipra.rest.model.ResponseWrapper;
import de.vipra.rest.model.Topic;
import de.vipra.rest.model.TopicDefinition;
import de.vipra.rest.service.TopicService;
import de.vipra.util.Config;
import de.vipra.util.Constants;
import de.vipra.util.Mongo;
import de.vipra.util.ex.ConfigException;
import de.vipra.util.ex.DatabaseException;
import de.vipra.util.service.DatabaseService;
@Path("topics")
public class TopicResource {
......@@ -33,19 +33,20 @@ public class TopicResource {
@Context
UriInfo uri;
DatabaseService<Topic> service;
TopicService service;
public TopicResource(@Context ServletContext servletContext) throws ConfigException, IOException {
Config config = Config.getConfig();
service = DatabaseService.getDatabaseService(config, Constants.Collection.TOPICS, Topic.class);
Mongo mongo = Mongo.getInstance(config);
service = new TopicService(mongo);
}
@GET
@Produces(APIMediaType.APPLICATION_JSONAPI)
public Response getTopics(@QueryParam("skip") @DefaultValue("0") int skip,
@QueryParam("limit") @DefaultValue("0") int limit) {
ArrayList<Topic> topics = service.getMultiple(skip, limit, null);
ResponseWrapper<ArrayList<Topic>> res = new ResponseWrapper<>(topics);
List<TopicDefinition> topics = service.getMultiple(uri.getAbsolutePath(), skip, limit, null);
ResponseWrapper<List<TopicDefinition>> res = new ResponseWrapper<>(topics);
res.addLink("self", uri.getAbsolutePath().toString());
return Response.ok().entity(res).build();
}
......@@ -55,15 +56,14 @@ public class TopicResource {
@Consumes(APIMediaType.APPLICATION_JSONAPI)
@Path("{id}")
public Response getTopic(@PathParam("id") String id) {
ResponseWrapper<Topic> res = new ResponseWrapper<>();
ResponseWrapper<TopicDefinition> res = new ResponseWrapper<>();
if (id == null || id.trim().length() == 0) {
res.addError(new APIError(Response.Status.BAD_REQUEST, "ID is empty",
String.format(Messages.BAD_REQUEST, "id cannot be empty")));
return Response.status(Response.Status.BAD_REQUEST).entity(res).build();
}
Topic topic = service.getSingle(id);
TopicDefinition topic = service.getSingle(uri.getAbsolutePath(), id);
if (topic != null) {
topic.setBase(uri.getAbsolutePath());
res.setData(topic);
return Response.ok().entity(res).build();
} else {
......@@ -77,8 +77,8 @@ public class TopicResource {
@Consumes(APIMediaType.APPLICATION_JSONAPI)
@Produces(APIMediaType.APPLICATION_JSONAPI)
@Path("{id}")
public Response updateTopic(@PathParam("id") String id, Topic topic) {
ResponseWrapper<Topic> res = new ResponseWrapper<>();
public Response updateTopic(@PathParam("id") String id, TopicDefinition topic) {
ResponseWrapper<TopicDefinition> res = new ResponseWrapper<>();
try {
long updated = service.updateSingle(topic);
int updatedInt = updated > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) updated;
......
package de.vipra.rest.service;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import de.vipra.rest.model.Article;
import de.vipra.util.Constants;
import de.vipra.util.Mongo;
import de.vipra.util.ex.DatabaseException;
import de.vipra.util.service.DatabaseService;
public class ArticleService extends DatabaseService<Article> {
public class ArticleService extends Service<Article> {
public ArticleService(Mongo mongo) {
super(mongo, Constants.Collection.ARTICLES, Article.class);
}
public Article getArticle(URI base, String id) {
Article article = super.getSingle(id);
if (article != null) {
article.setBase(base);
}
return article;
}
public ArrayList<Article> getArticles(URI base, int skip, int limit, String sortBy) {
ArrayList<Article> articles = super.getMultiple(skip, limit, sortBy);
public List<Article> getMultiple(URI base, int skip, int limit, String sortBy) {
List<Article> articles = super.getMultiple(skip, limit, sortBy);
for (Article article : articles) {
// delete data for listing
article.setText(null);
article.setStats(null);
article.setBase(base);
}
return articles;
}
public Article createArticle(URI base, Article article) throws DatabaseException {
article = super.createSingle(article);
if (article != null) {
article.setBase(base);
}
return article;
}
public long deleteArticle(String id) throws DatabaseException {
return super.deleteSingle(id);
}
public long updateArticle(URI base, Article article) throws DatabaseException {
long updated = super.updateSingle(article);
article.setBase(base);
return updated;
}
}
package de.vipra.rest.service;
import java.net.URI;
import java.util.List;
import de.vipra.rest.model.Linked;
import de.vipra.util.Constants.Collection;
import de.vipra.util.ex.DatabaseException;
import de.vipra.util.Mongo;
import de.vipra.util.model.Model;
import de.vipra.util.service.DatabaseService;
public class Service<T extends Model & Linked> extends DatabaseService<T> {
public Service(Mongo mongo, Collection collection, Class<T> clazz) {
super(mongo, collection, clazz);
}
public T getSingle(URI base, String id) {
T t = super.getSingle(id);
if (t != null) {
t.setBase(base);
}
return t;
}
public List<T> getMultiple(URI base, int skip, int limit, String sortBy) {
List<T> ts = super.getMultiple(skip, limit, sortBy);
for (T t : ts) {
t.setBase(base);
}
return ts;
}
public T createSingle(URI base, T t) throws DatabaseException {
t = super.createSingle(t);
if (t != null) {
t.setBase(base);
}
return t;
}
public long deleteSingle(String id) throws DatabaseException {
return super.deleteSingle(id);
}
public long updateSingle(URI base, T t) throws DatabaseException {
long updated = super.updateSingle(t);
t.setBase(base);
return updated;
}
}
package de.vipra.rest.service;
import java.net.URI;
import java.util.List;
import de.vipra.rest.model.TopicDefinition;
import de.vipra.util.Constants;
import de.vipra.util.Mongo;
public class TopicService extends Service<TopicDefinition> {
public TopicService(Mongo mongo) {
super(mongo, Constants.Collection.TOPICS, TopicDefinition.class);
}
public List<TopicDefinition> getMultiple(URI base, int skip, int limit, String sortBy) {
List<TopicDefinition> topics = super.getMultiple(skip, limit, sortBy);
for (TopicDefinition topic : topics) {
topic.setWords(null);
}
return topics;
}
}
import Ember from 'ember';
import EmberHighChartsComponent from 'ember-highcharts/components/high-charts';
export default EmberHighChartsComponent.extend({
......
import DS from 'ember-data';
export default DS.Model.extend({
});
......@@ -10,6 +10,10 @@ Router.map(function() {
this.route('list', { path: '/' });
this.route('show', { path: '/:article_id' });
});
this.route('topics', function() {
this.route('list', { path: '/' });
this.route('show', { path: '/:topic_id' });
});
this.route('not-found', { path: '/*:' });
});
......
import Ember from 'ember';
export default Ember.Route.extend({
model() {
return Ember.RSVP.hash({
topics: this.store.findAll('topic')
});
}
});
\ No newline at end of file
<h2>New article</h2>
\ No newline at end of file
<h1>Vipra</h1>
\ No newline at end of file
<h1>Vipra</h1>
{{#link-to 'articles.list'}}Articles{{/link-to}}
{{#link-to 'topics.list'}}Topics{{/link-to}}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment