001 package com.khubla.pragmatach.framework.router;
002
003 import java.lang.reflect.Method;
004 import java.util.ArrayList;
005 import java.util.Collections;
006 import java.util.List;
007 import java.util.Set;
008
009 import com.khubla.pragmatach.framework.annotation.Route;
010 import com.khubla.pragmatach.framework.api.PragmatachException;
011 import com.khubla.pragmatach.framework.controller.ControllerClasses;
012
013 /**
014 * all routes, both GET and POST, sorted.
015 *
016 * @author tome
017 */
018 public class PragmatachRoutes {
019 /**
020 * singleton
021 */
022 private static PragmatachRoutes instance = null;
023
024 /**
025 * getter
026 */
027 public static PragmatachRoutes getInstance() throws PragmatachException {
028 try {
029 if (null == instance) {
030 instance = new PragmatachRoutes();
031 }
032 return instance;
033 } catch (final Exception e) {
034 throw new PragmatachException(e);
035 }
036 }
037
038 /**
039 * GET routes
040 */
041 private final List<PragmatachRoute> GETRoutes = new ArrayList<PragmatachRoute>();
042 /**
043 * POST routes
044 */
045 private final List<PragmatachRoute> POSTRoutes = new ArrayList<PragmatachRoute>();
046
047 /**
048 * ctor
049 */
050 private PragmatachRoutes() throws PragmatachException {
051 readRoutes();
052 }
053
054 /**
055 * get all known routes for all HTTP methods
056 */
057 public List<PragmatachRoute> getAllRoutes() {
058 final List<PragmatachRoute> ret = new ArrayList<PragmatachRoute>();
059 ret.addAll(GETRoutes);
060 ret.addAll(POSTRoutes);
061 return ret;
062 }
063
064 /**
065 * get all GET routes
066 */
067 public List<PragmatachRoute> getGETRoutes() {
068 return GETRoutes;
069 }
070
071 /**
072 * get all POST routes
073 */
074 public List<PragmatachRoute> getPOSTRoutes() {
075 return POSTRoutes;
076 }
077
078 /**
079 * read the routes
080 */
081 private void readRoutes() throws PragmatachException {
082 try {
083 /*
084 * get the routes
085 */
086 final Set<Method> routerMethods = ControllerClasses.getRouterMethods();
087 if (null != routerMethods) {
088 for (final Method method : routerMethods) {
089 final Route route = method.getAnnotation(Route.class);
090 final Route.HttpMethod httpMethod = route.method();
091 if (httpMethod == com.khubla.pragmatach.framework.annotation.Route.HttpMethod.get) {
092 GETRoutes.add(new PragmatachRoute(method));
093 } else {
094 POSTRoutes.add(new PragmatachRoute(method));
095 }
096 }
097 /*
098 * sort the routes
099 */
100 Collections.sort(GETRoutes);
101 Collections.sort(POSTRoutes);
102 }
103 } catch (final Exception e) {
104 throw new PragmatachException("Exception in readRoutes", e);
105 }
106 }
107 }