From 2dbb8c36966eede39db03c1d0efbb88a650594b2 Mon Sep 17 00:00:00 2001 From: Sandro Grzicic Date: Mon, 7 May 2012 01:42:02 +0200 Subject: [PATCH] =?UTF-8?q?Dora=C4=91en=20rest=20server.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/hr/fer/tel/ops/App.java | 75 +++++++++++++++++++++++++++++--- 1 file changed, 68 insertions(+), 7 deletions(-) diff --git a/src/main/hr/fer/tel/ops/App.java b/src/main/hr/fer/tel/ops/App.java index 3bd4b2a..a799123 100644 --- a/src/main/hr/fer/tel/ops/App.java +++ b/src/main/hr/fer/tel/ops/App.java @@ -8,6 +8,11 @@ import spark.Request; import spark.Response; import spark.Route; +import spark.Spark; +import spark.route.SimpleRouteMatcher; + +import java.lang.reflect.Field; +import java.util.List; import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST; import static spark.Spark.get; @@ -19,10 +24,13 @@ public class App { private static final XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat()); + private static String podržaneRute; + /** Pokreće web aplikaciju. */ public static void main(String[] args) { final Server s = new Server(); + // zahtjev za registracijom get(new Route("/reg/:login/:pass") { @Override @@ -32,7 +40,7 @@ public Object handle(Request request, Response response) { Either odgovor = s.zahtjevZaRegistracijom(korisničkoIme, lozinka); - return either2response(response, odgovor, SC_BAD_REQUEST); + return either2xml(response, odgovor, SC_BAD_REQUEST); } }); @@ -45,25 +53,78 @@ public Object handle(Request request, Response response) { Either odgovor = s.zahtjevZaUkidanjeRegistracije(korisničkoIme, lozinka); - return either2response(response, odgovor, SC_BAD_REQUEST); + return either2xml(response, odgovor, SC_BAD_REQUEST); + } + }); + + // vraća broj registriranih korisnika. + get(new Route("/count") { + @Override + public Object handle(final Request request, final Response response) { + return string2xml(Integer.toString(s.getBrojKorisnika())); + } + }); + + podržaneRute = dohvatiRute(); + + // ispisuje sve podržane rute koristeći Reflection API. + get(new Route("/") { + @Override + public Object handle(final Request request, final Response response) { + return podržaneRute; } }); + } + + /** Vraća sve podržane rute koristeći Reflection. */ + private static String dohvatiRute() { + final StringBuilder sb = new StringBuilder("REST metode: \n\n"); + try { + final Field routeMatcher = Spark.class.getDeclaredField("routeMatcher"); + routeMatcher.setAccessible(true); + final SimpleRouteMatcher simpleRouteMatcher = (SimpleRouteMatcher) routeMatcher.get(null); + + final Field routesField = simpleRouteMatcher.getClass().getDeclaredField("routes"); + routesField.setAccessible(true); + + @SuppressWarnings("unchecked") + final List routes = (List) routesField.get(simpleRouteMatcher); + for (final Object route: routes) { + sb.append(route.toString().split(", ")[1]).append("\n"); + } + return sb.toString(); + } catch (Exception ignored) { + return ignored.getMessage(); + } + } + + /** Generira XML odgovor na temelju zadanog Stringa. */ + private static String string2xml(final String string) { + final Document doc = new Document(); + final Element root = new Element("ops"); + doc.setRootElement(root); + + final Element odgovorEl = new Element("odgovor"); + + odgovorEl.addContent(string); + root.addContent(odgovorEl); + return xmlOut.outputString(doc); } - /** Generira String odgovor na temelju zadanog Eithera. */ - private static String either2response(final Response httpResponse, final Either odgovor, final int greškaKod) { + /** Generira XML odgovor na temelju zadanog Eithera. */ + private static String either2xml(final Response httpResponse, final Either either, final int greškaKod) { final Document doc = new Document(); final Element root = new Element("ops"); doc.setRootElement(root); - final Element odgovorEl = new Element(odgovor.getClass().getSimpleName().toLowerCase()); + final Element odgovorEl = new Element(either.getClass().getSimpleName().toLowerCase()); - if (odgovor.isLeft()) { + if (either.isLeft()) { httpResponse.status(greškaKod); } - odgovorEl.addContent(odgovor.toString()); + odgovorEl.addContent(either.toString()); root.addContent(odgovorEl); return xmlOut.outputString(doc); }