This is an automated email from the git hooks/post-receive script. New commit to branch chorem-ng in repository chorem. See http://git.chorem.org/chorem.git commit 03563f001a7ad4ef383c78fc03d1f3c1b6f2ead0 Author: Yannick Martel <yannick.martel@gmail.com> Date: Thu Apr 2 19:59:19 2015 +0200 add 'Simple' Json converter for wikitty and add JsonRender as Default --- .../webmotion/actions/WikittyRestAction.java | 10 +-- .../webmotion/converters/JsonArrayConverter.java | 55 ++++++++++++ .../chorem/webmotion/converters/JsonHelper.java | 98 ++++++++++++++++++++++ .../webmotion/injector/InjectorListener.java | 8 +- .../org/chorem/webmotion/render/JsonRender.java | 40 +++++++++ chorem-webmotion/src/main/resources/mapping | 3 +- 6 files changed, 207 insertions(+), 7 deletions(-) diff --git a/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/WikittyRestAction.java b/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/WikittyRestAction.java index de9cb71..4b20351 100644 --- a/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/WikittyRestAction.java +++ b/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/WikittyRestAction.java @@ -75,6 +75,11 @@ public class WikittyRestAction extends WebMotionController { return result; } + public Wikitty getWikitty(ChoremClient client, String id) { + Wikitty result = client.restore(id); + return result; + } + public Render getWikittiesFromQuery(ChoremClient client, String query) { WikittyQuery q = WikittyQueryParser.parse(query); WikittyQueryResult<Wikitty> qResult = client.findAllByQuery(Wikitty.class, q); @@ -86,11 +91,6 @@ public class WikittyRestAction extends WebMotionController { return new RenderWikitty().setModelWikitty(result); } - public Render getWikitty(ChoremClient client, String id) { - Wikitty result = client.restore(id); - return new RenderWikitty().setModelWikitty(result); - } - public Render getWikittyFieldValue(ChoremClient client, String id, String ext, String field) { RenderWikitty render = new RenderWikitty(); diff --git a/chorem-webmotion/src/main/java/org/chorem/webmotion/converters/JsonArrayConverter.java b/chorem-webmotion/src/main/java/org/chorem/webmotion/converters/JsonArrayConverter.java new file mode 100644 index 0000000..b30f4a9 --- /dev/null +++ b/chorem-webmotion/src/main/java/org/chorem/webmotion/converters/JsonArrayConverter.java @@ -0,0 +1,55 @@ +package org.chorem.webmotion.converters; + +import com.google.common.reflect.TypeParameter; +import com.google.common.reflect.TypeToken; +import org.apache.commons.beanutils.converters.AbstractConverter; + +/** + * @author ymartel <martel@codelutin.com> + */ +public class JsonArrayConverter <O> extends AbstractConverter { + + protected final Class<O[]> arrayType; + + protected final JsonHelper jsonHelper; + + public static <O> JsonArrayConverter<O> newConverter(Class<O> objectType) { + return new JsonArrayConverter<>(objectType); + } + + public JsonArrayConverter(Class<O> entityType) { + + this.arrayType = (Class<O[]>) new TypeToken<O[]>() { + } + .where(new TypeParameter<O>() { + }, entityType) + .getType(); + this.jsonHelper = new JsonHelper(); + } + + @Override + protected <T> T convertToType(Class<T> type, Object value) throws Throwable { + + String stringValue; + + if (value instanceof String) { + + stringValue = (String) value; + + } else { + + stringValue = ((String[]) value)[0]; + + } + + O[] values = jsonHelper.fromJson(stringValue, this.arrayType); + + return (T) values; + + } + + @Override + public Class<?> getDefaultType() { + return arrayType; + } +} \ No newline at end of file diff --git a/chorem-webmotion/src/main/java/org/chorem/webmotion/converters/JsonHelper.java b/chorem-webmotion/src/main/java/org/chorem/webmotion/converters/JsonHelper.java index 024eb15..950625a 100644 --- a/chorem-webmotion/src/main/java/org/chorem/webmotion/converters/JsonHelper.java +++ b/chorem-webmotion/src/main/java/org/chorem/webmotion/converters/JsonHelper.java @@ -24,9 +24,11 @@ package org.chorem.webmotion.converters; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Type; +import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; +import java.util.List; import java.util.Map; import com.google.gson.ExclusionStrategy; @@ -44,6 +46,9 @@ import com.google.gson.JsonSerializer; import org.apache.commons.lang.StringUtils; import org.nuiton.wikitty.WikittyException; import org.nuiton.wikitty.entities.BusinessEntity; +import org.nuiton.wikitty.entities.FieldType; +import org.nuiton.wikitty.entities.Wikitty; +import org.nuiton.wikitty.entities.WikittyTypes; /** * @author ymartel <martel@codelutin.com> @@ -134,6 +139,26 @@ public class JsonHelper { }); + gsonBuilder.registerTypeHierarchyAdapter(Wikitty.class, new JsonSerializer<Wikitty>() { + + @Override + public JsonElement serialize(Wikitty src, Type typeOfSrc, JsonSerializationContext context) { + + JsonElement result; + + if (src == null) { + result = JsonNull.INSTANCE; + + } else { + Map<String, Object> srcAsMap = mapifyWikitty(src); + result = context.serialize(srcAsMap); + } + + return result; + } + + }); + this.gson = gsonBuilder.create(); } @@ -152,5 +177,78 @@ public class JsonHelper { return o; } + protected Map<String, Object> mapifyWikitty(Wikitty src) { + + Map<String, Object> srcAsMap = new HashMap(); + + // First classical element : the id + srcAsMap.put("id", src.getWikittyId()); + + // Get all extension names, we will iterate on them + Collection<String> extensionNames = src.getExtensionNames(); + + for (String extensionName : extensionNames) { + + // for each extension, get fields ! + Collection<String> extensionFields = src.getExtensionFields(extensionName); + Map<String, Object> extension = new HashMap(extensionFields.size()); + + for (String extensionField : extensionFields) { + + // Need to manage collection and type + FieldType fieldType = src.getFieldType(extensionName, extensionField); + + if (fieldType.isCollection() && fieldType.getType() == WikittyTypes.WIKITTY) { + // Collection of wikitties + + try { + // Try to get them as wikitty + List<Wikitty> fieldAsWikittyList = src.getFieldAsWikittyList(extensionName, extensionField, true); + if (fieldAsWikittyList != null) { + List<Map<String, Object>> fields = new ArrayList<>(fieldAsWikittyList.size()); + + for (Wikitty fieldAsWikitty : fieldAsWikittyList) { + if (fieldAsWikitty != null) { + Map<String, Object> fieldAsMap = mapifyWikitty(fieldAsWikitty); + fields.add(fieldAsMap); + } + } + extension.put(extensionField, fields); + + } else { + extension.put(extensionField, null); + } + + + } catch (WikittyException e) { + // If WikittyException, cannot load wikitty : use id + extension.put(extensionField, src.getFieldAsObject(extensionName, extensionField)); + } + + } else if (fieldType.getType() == WikittyTypes.WIKITTY) { + // A simple wikitty : try to get it as Wikitty and mapify it ! + try { + Wikitty fieldAsWikitty = src.getFieldAsWikitty(extensionName, extensionField, true); + if (fieldAsWikitty != null) { + Map<String, Object> fieldAsMap = mapifyWikitty(fieldAsWikitty); + extension.put(extensionField, fieldAsMap); + } else { + extension.put(extensionField, null); + } + + } catch (WikittyException e) { + // If WikittyException, cannot load wikitty : use id + extension.put(extensionField, src.getFieldAsObject(extensionName, extensionField)); + } + + } else { + extension.put(extensionField, src.getFieldAsObject(extensionName, extensionField)); + } + } + srcAsMap.put(extensionName, extension); + } + + return srcAsMap; + } } diff --git a/chorem-webmotion/src/main/java/org/chorem/webmotion/injector/InjectorListener.java b/chorem-webmotion/src/main/java/org/chorem/webmotion/injector/InjectorListener.java index 73c87c8..0388439 100644 --- a/chorem-webmotion/src/main/java/org/chorem/webmotion/injector/InjectorListener.java +++ b/chorem-webmotion/src/main/java/org/chorem/webmotion/injector/InjectorListener.java @@ -35,6 +35,7 @@ import org.chorem.webmotion.ChoremWebMotionUtil; import org.chorem.webmotion.PaginatedResult; import org.chorem.webmotion.bean.financial.ExpenseAccountBean; import org.chorem.webmotion.bean.financial.ExpenseAccountEntryBean; +import org.chorem.webmotion.converters.JsonArrayConverter; import org.chorem.webmotion.converters.JsonConverter; import org.debux.webmotion.server.WebMotionServerListener; import org.debux.webmotion.server.call.Call; @@ -43,6 +44,7 @@ import org.debux.webmotion.server.handler.ExecutorParametersInjectorHandler.Inje import org.debux.webmotion.server.mapping.Mapping; import org.nuiton.wikitty.WikittyUtil; import org.nuiton.wikitty.entities.BusinessEntity; +import org.nuiton.wikitty.entities.Wikitty; /** * @author ymartel <martel@codelutin.com> @@ -53,7 +55,8 @@ public class InjectorListener implements WebMotionServerListener { ExpenseAccountBean.class, ExpenseAccountEntryBean.class, PaginatedResult.class, - BusinessEntity.class + BusinessEntity.class, + Wikitty.class ); @Override @@ -112,6 +115,9 @@ public class InjectorListener implements WebMotionServerListener { for (Class<?> beanType : BEAN_TYPES) { context.addConverter(JsonConverter.newConverter(beanType), beanType); + + JsonArrayConverter<?> converter = JsonArrayConverter.newConverter(beanType); + context.addConverter(converter, converter.getDefaultType()); } } diff --git a/chorem-webmotion/src/main/java/org/chorem/webmotion/render/JsonRender.java b/chorem-webmotion/src/main/java/org/chorem/webmotion/render/JsonRender.java new file mode 100644 index 0000000..f226df3 --- /dev/null +++ b/chorem-webmotion/src/main/java/org/chorem/webmotion/render/JsonRender.java @@ -0,0 +1,40 @@ +package org.chorem.webmotion.render; + +import java.io.IOException; +import java.io.PrintWriter; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; + +import org.chorem.webmotion.converters.JsonHelper; +import org.debux.webmotion.server.call.Call; +import org.debux.webmotion.server.call.HttpContext; +import org.debux.webmotion.server.mapping.Mapping; +import org.debux.webmotion.server.render.Render; + +/** + * @author ymartel <martel@codelutin.com> + */ +public class JsonRender<T> extends Render { + + protected T model; + + public JsonRender(T model) { + this.model = model; + } + + @Override + public void create(Mapping mapping, Call call) throws IOException, ServletException { + + HttpContext context = call.getContext(); + HttpServletResponse response = context.getResponse(); + response.setContentType("application/json"); + + JsonHelper gson = new JsonHelper(); + String json = gson.toJson(model); + + PrintWriter out = context.getOut(); + out.print(json); + + } +} \ No newline at end of file diff --git a/chorem-webmotion/src/main/resources/mapping b/chorem-webmotion/src/main/resources/mapping index 7335f42..f632178 100644 --- a/chorem-webmotion/src/main/resources/mapping +++ b/chorem-webmotion/src/main/resources/mapping @@ -3,7 +3,7 @@ package.views=WEB-INF/jsp package.filters=org.chorem.webmotion.filters package.actions=org.chorem.webmotion.actions server.listener.class=org.chorem.webmotion.injector.InjectorListener -default.render=org.debux.webmotion.server.render.DefaultRender +default.render=org.chorem.webmotion.render.JsonRender [filters] * /* ChoremClientFilter.inject @@ -11,6 +11,7 @@ default.render=org.debux.webmotion.server.render.DefaultRender [actions] GET /services/v1/{extension} action:WikittyRestAction.getWikitties +GET /services/v1/{extension}/{id} action:WikittyRestAction.getWikitty #* /logout action:Ge#nericAction.logout #* /wikitty/{extension}/search action:Ge#nericAction.search -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.