diff --git a/NiHao/release/NiHao-0.8c.jar b/NiHao/release/NiHao-0.8c.jar index f2e9178..35cf35b 100644 --- a/NiHao/release/NiHao-0.8c.jar +++ b/NiHao/release/NiHao-0.8c.jar Binary files differ diff --git a/NiHao/src/nihao/NiHaoConf.java b/NiHao/src/nihao/NiHaoConf.java index 2d2b0c8..8c8445d 100644 --- a/NiHao/src/nihao/NiHaoConf.java +++ b/NiHao/src/nihao/NiHaoConf.java @@ -1,27 +1,32 @@ -package nihao; - -import nihao.login.LoginConf; - -public class NiHaoConf { - private LoginConf loginConf; - private int worksetCacheSize = 2; - private String defaultGroupForUndefinedPage; - - public LoginConf getLoginConf() { - return loginConf; - } - - public int getWorksetCacheSize() { - return worksetCacheSize; - } - - /** - * Retorna el grupo por defecto de las páginas que no se definen en el - * contexto, si no se define un grupo se redirige a forbidden - * - * @return - */ - public String getDefaultGroupForUndefinedPage() { - return defaultGroupForUndefinedPage; - } -} +package nihao; + +import nihao.login.LoginConf; + +public class NiHaoConf { + private LoginConf loginConf; + private int worksetCacheSize = 2; + private String defaultGroupForUndefinedPage; + private boolean autoloadNajaxObjects=true; + + public boolean isAutoloadNajaxObjects() { + return autoloadNajaxObjects; + } + + public LoginConf getLoginConf() { + return loginConf; + } + + public int getWorksetCacheSize() { + return worksetCacheSize; + } + + /** + * Retorna el grupo por defecto de las páginas que no se definen en el + * contexto, si no se define un grupo se redirige a forbidden + * + * @return + */ + public String getDefaultGroupForUndefinedPage() { + return defaultGroupForUndefinedPage; + } +} diff --git a/NiHao/src/nihao/WebCall.java b/NiHao/src/nihao/WebCall.java index 86a1a03..991028e 100644 --- a/NiHao/src/nihao/WebCall.java +++ b/NiHao/src/nihao/WebCall.java @@ -121,6 +121,25 @@ public Object getSession(String key) { return ses.getAttribute(key); } + + /** + * Return the session value as desired type. Null was returned if no object found, or the object type not is the desired one. + * @param key String key + * @param cls Class of returned type + * @return Object + */ + public T getSessionAs(String key,Class cls){ + return Conversor.as(getSession(key),cls); + } + + /** + * Sets a value on the session + * @param key + * @param o + */ + public void setSession(String key, Object o){ + ses.setAttribute(key, o); + } /** * Obtiene un valor con el formato usado en los tags de la web, intenta diff --git a/NiHao/src/nihao/ajax/AjaxObject.java b/NiHao/src/nihao/ajax/AjaxObject.java index e57bc6a..6ea3c4d 100644 --- a/NiHao/src/nihao/ajax/AjaxObject.java +++ b/NiHao/src/nihao/ajax/AjaxObject.java @@ -1,109 +1,111 @@ -package nihao.ajax; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Parameter; -import java.util.HashMap; -import java.util.Set; - -import nihao.NiHaoException; -import nihao.util.Serializer; -import nihao.util.reflection.Classes; - -public class AjaxObject { - private static HashMap objects = new HashMap(); - private Class c; - private Object o; - private HashMap methods; - static { - for (Class c : Classes.getLocalClassesWithAnnotation(AjaxPublished.class)) - Register(c); - } - - public static void Register(Class c) { - String name = c.getSimpleName(); - AjaxObject obj = objects.get(name); - if (obj != null) - throw new NiHaoException("Duplicated object. " + c.getName() + " was also registered with class " + obj.c.getName()); - objects.put(name, new AjaxObject(c)); - } - - static AjaxObject get(String name) { - return objects.get(name); - } - - private AjaxObject(Class c) { - this.c = c; - try { - o = c.newInstance(); - } catch (InstantiationException | IllegalAccessException e) { - throw new NiHaoException("Can't create instance of ajax object " + getName(), e); - } - if (methods == null) { - methods = new HashMap(); - for (Method m : c.getMethods()) - if (m.getAnnotationsByType(AjaxPublished.class).length > 0) - methods.put(m.getName(), m); - } - } - - public String getName() { - return c.getSimpleName(); - } - - /** - * Return the ajax published methods - * - * @return - */ - public String[] getPublicMethods() { - Set keys = methods.keySet(); - return keys.toArray(new String[keys.size()]); - } - - /** - * Return the parameter names of a method - * - * @param key - * String method name - * @return - */ - public String[] getPublicMethodParams(String key) { - Method m = methods.get(key); - if (m == null) - return null; - Parameter[] pars = m.getParameters(); - String[] result = new String[pars.length]; - for (int i = 0; i < pars.length; i++) - result[i] = pars[i].getName(); - return result; - } - - /** - * Invokes a object method - * - * @param name - * String method name - * @param request - * String arguments in JSON object - * @return - */ - public Object invoke(String name, String request) { - Method m = methods.get(name); - if (m == null) - return new NiHaoException("Ajax method not exists"); - HashMap typeMap = new HashMap(); - Parameter[] pars = m.getParameters(); - for (Parameter p : pars) - typeMap.put(p.getName(), p.getParameterizedType()); - HashMap req = Serializer.deserializeFromJSON(request, null, typeMap); - Object[] args = new Object[pars.length]; - for (int i = 0; i < pars.length; i++) - args[i] = req.get(pars[i].getName()); - try { - return m.invoke(o, args); - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { - throw new NiHaoException(e); - } - } -} +package nihao.ajax; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Parameter; +import java.util.HashMap; +import java.util.Set; + +import nihao.NiHao; +import nihao.NiHaoException; +import nihao.util.Serializer; +import nihao.util.reflection.Classes; + +public class AjaxObject { + private static HashMap objects = new HashMap(); + private Class c; + private Object o; + private HashMap methods; + static { + if (NiHao.getConf().isAutoloadNajaxObjects()) + for (Class c : Classes.getLocalClassesWithAnnotation(AjaxPublished.class)) + Register(c); + } + + public static void Register(Class c) { + String name = c.getSimpleName(); + AjaxObject obj = objects.get(name); + if (obj != null) + throw new NiHaoException("Duplicated object. " + c.getName() + " was also registered with class " + obj.c.getName()); + objects.put(name, new AjaxObject(c)); + } + + static AjaxObject get(String name) { + return objects.get(name); + } + + private AjaxObject(Class c) { + this.c = c; + try { + o = c.newInstance(); + } catch (InstantiationException | IllegalAccessException e) { + throw new NiHaoException("Can't create instance of ajax object " + getName(), e); + } + if (methods == null) { + methods = new HashMap(); + for (Method m : c.getMethods()) + if (m.getAnnotationsByType(AjaxPublished.class).length > 0) + methods.put(m.getName(), m); + } + } + + public String getName() { + return c.getSimpleName(); + } + + /** + * Return the ajax published methods + * + * @return + */ + public String[] getPublicMethods() { + Set keys = methods.keySet(); + return keys.toArray(new String[keys.size()]); + } + + /** + * Return the parameter names of a method + * + * @param key + * String method name + * @return + */ + public String[] getPublicMethodParams(String key) { + Method m = methods.get(key); + if (m == null) + return null; + Parameter[] pars = m.getParameters(); + String[] result = new String[pars.length]; + for (int i = 0; i < pars.length; i++) + result[i] = pars[i].getName(); + return result; + } + + /** + * Invokes a object method + * + * @param name + * String method name + * @param request + * String arguments in JSON object + * @return + */ + public Object invoke(String name, String request) { + Method m = methods.get(name); + if (m == null) + return new NiHaoException("Ajax method not exists"); + HashMap typeMap = new HashMap(); + Parameter[] pars = m.getParameters(); + for (Parameter p : pars) + typeMap.put(p.getName(), p.getParameterizedType()); + HashMap req = Serializer.deserializeFromJSON(request, null, typeMap); + Object[] args = new Object[pars.length]; + for (int i = 0; i < pars.length; i++) + args[i] = req.get(pars[i].getName()); + try { + return m.invoke(o, args); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + throw new NiHaoException(e); + } + } +} diff --git a/NiHao/src/nihao/ajax/AjaxServlet.java b/NiHao/src/nihao/ajax/AjaxServlet.java new file mode 100644 index 0000000..5b0df07 --- /dev/null +++ b/NiHao/src/nihao/ajax/AjaxServlet.java @@ -0,0 +1,106 @@ +package nihao.ajax; + +import java.io.IOException; +import java.io.PrintWriter; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import nihao.util.IoUtil; +import nihao.util.Serializer; + +@WebServlet(name = "NiHaoAxaj", urlPatterns = "/ajax/*") +public class AjaxServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + processRequest(request, response); + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + processRequest(request, response); + } + + private void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + String url = request.getPathInfo(); + if (url.endsWith(".js")) { + url = url.substring(1, url.length() - 3); + AjaxObject o = AjaxObject.get(url); + PrintWriter out = response.getWriter(); + if (o != null) + pushObjectJS(out, o, request.getContextPath() + request.getServletPath()); + else + out.print("Error"); + } else if (url.contains(".")) { + int point = url.indexOf('.'); + String method = url.substring(point + 1); + url = url.substring(1, point); + AjaxObject o = AjaxObject.get(url); + if (o == null) + response.getWriter().print("Call Error"); + else + try { + Object result = o.invoke(method, IoUtil.readStringToEnd(request.getReader())); + response.getWriter().write(Serializer.serializeToJSON(result)); + } catch (Throwable t) { + response.getWriter().print("Error " + t.getClass().getName() + ": " + t.getMessage()); + } + } else + response.getWriter().print("Error"); + } + + private void pushObjectJS(PrintWriter out, AjaxObject o, String basepath) throws IOException { + String oname = o.getName(); + out.print("var "); + out.print(oname); + out.println(" = new (function(){"); + out.print("var enc="); + AjaxSerializer.printJavascriptSerializer(out); + out.print(";var dec="); + AjaxSerializer.printJavascriptDeserializer(out); + out.print(";var call=function(mth,args){"); + out.print("xhr = new XMLHttpRequest();"); + out.print("xhr.open('post', '"); + out.print(basepath); + out.print("/"); + out.print(oname); + out.print(".'+mth, false);"); + out.print("xhr.send(enc(args));"); + out.print("return dec(xhr.responseText);"); + out.println("};"); + for (String s : o.getPublicMethods()) { + String[] pars = o.getPublicMethodParams(s); + out.print("this."); + out.print(s); + out.print("=function("); + boolean first = true; + for (String param : pars) { + if (first) + first = false; + else + out.print(", "); + out.print(param); + } + out.print("){return call('"); + out.print(s); + out.print("',{"); + first = true; + for (String param : pars) { + if (first) + first = false; + else + out.print(", "); + out.print(param); + out.print(": "); + out.print(param); + } + out.println("});}"); + } + out.println("})()"); + } +} diff --git a/NiHao/src/nihao/ajax/WebAjax.java b/NiHao/src/nihao/ajax/WebAjax.java deleted file mode 100644 index c7a3c4e..0000000 --- a/NiHao/src/nihao/ajax/WebAjax.java +++ /dev/null @@ -1,106 +0,0 @@ -package nihao.ajax; - -import java.io.IOException; -import java.io.PrintWriter; - -import javax.servlet.ServletException; -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import nihao.util.IoUtil; -import nihao.util.Serializer; - -@WebServlet(name = "NiHao", urlPatterns = "/nihao/*") -public class WebAjax extends HttpServlet { - private static final long serialVersionUID = 1L; - - @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - processRequest(request, response); - } - - @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - processRequest(request, response); - } - - private void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - String url = request.getPathInfo(); - if (url.endsWith(".js")) { - url = url.substring(1, url.length() - 3); - AjaxObject o = AjaxObject.get(url); - PrintWriter out = response.getWriter(); - if (o != null) - pushObjectJS(out, o, request.getContextPath() + request.getServletPath()); - else - out.print("Error"); - } else if (url.contains(".")) { - int point = url.indexOf('.'); - String method = url.substring(point + 1); - url = url.substring(1, point); - AjaxObject o = AjaxObject.get(url); - if (o == null) - response.getWriter().print("Call Error"); - else - try { - Object result = o.invoke(method, IoUtil.readStringToEnd(request.getReader())); - response.getWriter().write(Serializer.serializeToJSON(result)); - } catch (Throwable t) { - response.getWriter().print("Error " + t.getClass().getName() + ": " + t.getMessage()); - } - } else - response.getWriter().print("Error"); - } - - private void pushObjectJS(PrintWriter out, AjaxObject o, String basepath) throws IOException { - String oname = o.getName(); - out.print("var "); - out.print(oname); - out.println(" = new (function(){"); - out.print("var enc="); - AjaxSerializer.printJavascriptSerializer(out); - out.print(";var dec="); - AjaxSerializer.printJavascriptDeserializer(out); - out.print(";var call=function(mth,args){"); - out.print("xhr = new XMLHttpRequest();"); - out.print("xhr.open('post', '"); - out.print(basepath); - out.print("/"); - out.print(oname); - out.print(".'+mth, false);"); - out.print("xhr.send(enc(args));"); - out.print("return dec(xhr.responseText);"); - out.println("};"); - for (String s : o.getPublicMethods()) { - String[] pars = o.getPublicMethodParams(s); - out.print("this."); - out.print(s); - out.print("=function("); - boolean first = true; - for (String param : pars) { - if (first) - first = false; - else - out.print(", "); - out.print(param); - } - out.print("){return call('"); - out.print(s); - out.print("',{"); - first = true; - for (String param : pars) { - if (first) - first = false; - else - out.print(", "); - out.print(param); - out.print(": "); - out.print(param); - } - out.println("});}"); - } - out.println("})()"); - } -}