Finish implementing API
authorMathieu Baudier <mbaudier@argeo.org>
Fri, 18 Sep 2009 18:19:08 +0000 (18:19 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Fri, 18 Sep 2009 18:19:08 +0000 (18:19 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@2974 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

15 files changed:
security/runtime/org.argeo.security.core/.classpath
security/runtime/org.argeo.security.core/pom.xml
security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/ArgeoUser.java
security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/BasicArgeoUser.java
security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/core/ArgeoUserDetails.java
security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/json/ArgeoUserMapper.java [deleted file]
security/runtime/org.argeo.security.core/src/test/java/org/argeo/security/json/ArgeoUserJsonTest.java
security/runtime/org.argeo.security.core/src/test/java/org/argeo/security/json/JsonServerMapperTest.java [new file with mode: 0644]
security/runtime/org.argeo.security.core/src/test/resources/log4j.properties [new file with mode: 0644]
security/runtime/org.argeo.security.core/src/test/resources/org/argeo/security/json/gandalf2.json [new file with mode: 0644]
security/runtime/org.argeo.security.mvc/src/main/java/org/argeo/security/mvc/UsersRolesController.java
server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/GenericJsonDeserializer.java
server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonObjectFactoryImpl.java
server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonServerMapper.java
server/runtime/org.argeo.server.json/src/test/java/org/argeo/server/json/JsonServerMapperTest.java [deleted file]

index 98f38b674654ac1df29fe62bc57ba707b6bb7ac9..e2de5961c7f120f78cc335ffdddfaf0c28ef297e 100644 (file)
@@ -3,6 +3,7 @@
        <classpathentry kind="src" output="target/classes" path="src/main/java"/>
        <classpathentry kind="src" output="target/classes" path="src/main/resources"/>
        <classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
+       <classpathentry kind="src" path="src/test/resources"/>
        <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
        <classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
        <classpathentry kind="output" path="target/classes"/>
index 3fd7ae8890994d3638d2a57c6981dfd396516059..374ec77bc074b055acfd746b856082ee25ee1484 100644 (file)
                        <artifactId>com.springsource.junit</artifactId>
                        <scope>test</scope>
                </dependency>
+               <dependency>
+                       <groupId>org.argeo.commons.server</groupId>
+                       <artifactId>org.argeo.server.json</artifactId>
+                       <version>0.1.1-SNAPSHOT</version>
+                       <scope>test</scope>
+               </dependency>
 
        </dependencies>
 </project>
index 5d2eea6ee9a23956db2c7b4e4b8c40e2e933a980..44bf7f38a91205e5486ebb67e31cafa775a0dee4 100644 (file)
@@ -8,4 +8,6 @@ public interface ArgeoUser {
        public List<UserNature> getUserNatures();
 
        public List<String> getRoles();
+       
+       public String getPassword();
 }
index df910d57eabe4c6bde432caba5bb149398d5b99e..c6b8ce1b8fa4bec6c1c8574007ccbcd4f5f2d31b 100644 (file)
@@ -8,6 +8,7 @@ public class BasicArgeoUser implements ArgeoUser, Serializable {
        private static final long serialVersionUID = 1L;
 
        private String username;
+       private String password;
        private List<UserNature> userNatures = new ArrayList<UserNature>();
        private List<String> roles = new ArrayList<String>();
 
@@ -44,4 +45,12 @@ public class BasicArgeoUser implements ArgeoUser, Serializable {
        public void setRoles(List<String> roles) {
                this.roles = roles;
        }
+
+       public String getPassword() {
+               return password;
+       }
+
+       public void setPassword(String password) {
+               this.password = password;
+       }
 }
index 1080eb82c016c909a37f7c476588628bbc353c6a..0b8368c6f8de29354850336aa82131b9d762bd4b 100644 (file)
@@ -31,8 +31,7 @@ public class ArgeoUserDetails extends User implements ArgeoUser {
        }
 
        public ArgeoUserDetails(ArgeoUser argeoUser) {
-               // TODO: password
-               this(argeoUser.getUsername(), argeoUser.getUserNatures(), null,
+               this(argeoUser.getUsername(), argeoUser.getUserNatures(), argeoUser.getPassword(),
                                rolesToAuthorities(argeoUser.getRoles()));
        }
 
diff --git a/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/json/ArgeoUserMapper.java b/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/json/ArgeoUserMapper.java
deleted file mode 100644 (file)
index 55e22b7..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.argeo.security.json;
-
-import java.io.IOException;
-import java.io.StringWriter;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.security.ArgeoUser;
-import org.argeo.security.BasicArgeoUser;
-import org.argeo.security.UserNature;
-import org.codehaus.jackson.JsonFactory;
-import org.codehaus.jackson.JsonGenerator;
-import org.codehaus.jackson.JsonNode;
-import org.codehaus.jackson.JsonParseException;
-import org.codehaus.jackson.JsonParser;
-import org.codehaus.jackson.JsonProcessingException;
-import org.codehaus.jackson.map.DeserializationContext;
-import org.codehaus.jackson.map.JsonDeserializer;
-import org.codehaus.jackson.map.JsonMappingException;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.map.deser.CustomDeserializerFactory;
-import org.codehaus.jackson.map.deser.StdDeserializerProvider;
-
-public class ArgeoUserMapper {
-       private final static Log log = LogFactory.getLog(ArgeoUserMapper.class);
-
-       private String userNatureTypeField = "type";
-
-       private ObjectMapper mapper = new ObjectMapper();
-
-       public ArgeoUserMapper() {
-               CustomDeserializerFactory dsf = new CustomDeserializerFactory();
-               dsf.addSpecificMapping(UserNature.class, new UserNatureDeserializer());
-               StdDeserializerProvider sdp = new StdDeserializerProvider(dsf);
-               mapper.setDeserializerProvider(sdp);
-       }
-
-       public ArgeoUser parse(String content) throws JsonMappingException,
-                       JsonParseException, IOException {
-
-               return mapper.readValue(content, BasicArgeoUser.class);
-       }
-
-       private class UserNatureDeserializer extends JsonDeserializer<UserNature> {
-               private JsonFactory jsonFactory = new JsonFactory();
-
-               @Override
-               public UserNature deserialize(JsonParser parser,
-                               DeserializationContext dc) throws IOException,
-                               JsonProcessingException {
-                       try {
-                               // first read as Json DOM in order to extract the type
-                               // TODO: optimize with streaming API
-                               JsonNode root = parser.readValueAsTree();
-                               String type = root.get(userNatureTypeField).getTextValue();
-
-                               // Write it back as a string
-                               StringWriter writer = new StringWriter();
-                               JsonGenerator generator = jsonFactory
-                                               .createJsonGenerator(writer);
-                               generator.setCodec(mapper);
-                               generator.writeTree(root);
-                               String str = writer.toString();
-
-                               log.info("type=" + type + ", str=" + str);
-
-                               // TODO: use context classloader (in OSGi)
-                               // TODO: externalize type/classes mapping
-                               Class<UserNature> clss = (Class<UserNature>) Class
-                                               .forName(type);
-                               UserNature result = mapper.readValue(str, clss);
-
-                               // JavaType javaType = TypeFactory.fromClass(clss);
-                               // BeanDeserializer bd = new BeanDeserializer(javaType);
-                               // JsonParser parser2 = jsonFactory.createJsonParser(str);
-
-                               return result;
-                       } catch (ClassNotFoundException e) {
-                               throw new RuntimeException("Cannot deserialize", e);
-                       }
-               }
-
-       }
-}
index 956bc578f24c8244ec66dc1f361da686eb9086e4..df9dbe95aa8cf64db551ec72367a95887d4d7b40 100644 (file)
@@ -14,6 +14,7 @@ import org.argeo.security.UserNature;
 import org.argeo.security.core.ArgeoUserDetails;
 import org.argeo.security.nature.CoworkerNature;
 import org.argeo.security.nature.SimpleUserNature;
+import org.argeo.server.json.JsonServerMapper;
 import org.codehaus.jackson.JsonFactory;
 import org.codehaus.jackson.JsonGenerator;
 import org.codehaus.jackson.map.ObjectMapper;
@@ -61,8 +62,8 @@ public class ArgeoUserJsonTest extends TestCase {
                // BasicArgeoUser aud = objectMapper.readValue(audJo,
                // BasicArgeoUser.class);
 
-               ArgeoUserMapper aum = new ArgeoUserMapper();
-               ArgeoUser aud = aum.parse(audJo);
+               JsonServerMapper mapper = JsonServerMapperTest.createJsonServerMapper();
+               ArgeoUser aud = (ArgeoUser) mapper.deserialize(audJo);
 
                assertEquals(argeoUser.getUsername(), aud.getUsername());
                assertEquals(argeoUser.getRoles().size(), aud.getRoles().size());
diff --git a/security/runtime/org.argeo.security.core/src/test/java/org/argeo/security/json/JsonServerMapperTest.java b/security/runtime/org.argeo.security.core/src/test/java/org/argeo/security/json/JsonServerMapperTest.java
new file mode 100644 (file)
index 0000000..f841aea
--- /dev/null
@@ -0,0 +1,46 @@
+package org.argeo.security.json;
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.io.IOUtils;
+import org.argeo.security.ArgeoUser;
+import org.argeo.security.BasicArgeoUser;
+import org.argeo.security.UserNature;
+import org.argeo.server.json.GenericJsonDeserializer;
+import org.argeo.server.json.JsonObjectFactoryImpl;
+import org.argeo.server.json.JsonServerMapper;
+
+public class JsonServerMapperTest extends TestCase {
+       public void testDeserialize() throws Exception {
+               JsonServerMapper mapper = createJsonServerMapper();
+
+               Reader reader = null;
+               try {
+                       InputStream in = getClass().getResource(
+                                       "/org/argeo/security/json/gandalf2.json").openStream();
+                       reader = new InputStreamReader(in);
+
+                       ArgeoUser user = (ArgeoUser) mapper.deserialize(reader);
+                       assertEquals("gandalf2", user.getUsername());
+                       assertEquals(2, user.getRoles().size());
+                       assertEquals(2, user.getUserNatures().size());
+               } finally {
+                       IOUtils.closeQuietly(reader);
+               }
+       }
+
+       @SuppressWarnings("unchecked")
+       public static JsonServerMapper createJsonServerMapper() throws Exception {
+               JsonServerMapper mapper = new JsonServerMapper();
+               mapper.setTargetClass(BasicArgeoUser.class);
+               GenericJsonDeserializer jsonDeserializer = new GenericJsonDeserializer();
+               jsonDeserializer.getObjectFactories().add(new JsonObjectFactoryImpl());
+               mapper.getDeserializers().put(UserNature.class, jsonDeserializer);
+               mapper.afterPropertiesSet();
+               return mapper;
+       }
+}
diff --git a/security/runtime/org.argeo.security.core/src/test/resources/log4j.properties b/security/runtime/org.argeo.security.core/src/test/resources/log4j.properties
new file mode 100644 (file)
index 0000000..b33daa9
--- /dev/null
@@ -0,0 +1,28 @@
+log4j.rootLogger=WARN, console
+
+## Levels
+log4j.logger.org.argeo=DEBUG
+
+log4j.logger.org.hibernate=WARN
+
+log4j.logger.org.springframework=WARN
+#log4j.logger.org.springframework.web=DEBUG
+#log4j.logger.org.springframework.jms=WARN
+#log4j.logger.org.springframework.security=WARN
+
+log4j.logger.org.apache.activemq=WARN
+log4j.logger.org.apache.activemq.transport=WARN
+log4j.logger.org.apache.activemq.ActiveMQMessageConsumer=INFO
+log4j.logger.org.apache.activemq.ActiveMQMessageProducer=INFO
+
+log4j.logger.org.apache.catalina=INFO
+log4j.logger.org.apache.coyote=INFO
+log4j.logger.org.apache.tomcat=INFO
+
+## Appenders
+# console is set to be a ConsoleAppender.
+log4j.appender.console=org.apache.log4j.ConsoleAppender
+
+# console uses PatternLayout.
+log4j.appender.console.layout=org.apache.log4j.PatternLayout
+log4j.appender.console.layout.ConversionPattern= %-5p %d{ISO8601} %m - %c%n
diff --git a/security/runtime/org.argeo.security.core/src/test/resources/org/argeo/security/json/gandalf2.json b/security/runtime/org.argeo.security.core/src/test/resources/org/argeo/security/json/gandalf2.json
new file mode 100644 (file)
index 0000000..a7edbf0
--- /dev/null
@@ -0,0 +1 @@
+{"roles":["ROLE_ADMIN","ROLE_USER"],"userNatures":[{"email":"admin@localhost","firstName":"Gandalf","lastName":"User","type":"org.argeo.security.nature.SimpleUserNature","uuid":null},{"description":"Superuser","mobile":null,"telephoneNumber":null,"type":"org.argeo.security.nature.CoworkerNature","uuid":null}],"username":"gandalf2","enabled":true,"password":"{SHA}ieSV55Qc+eQOaYDRSha/AjzNTJE=","authorities":[{"authority":"ROLE_ADMIN"},{"authority":"ROLE_USER"}],"accountNonExpired":true,"accountNonLocked":true,"credentialsNonExpired":true}
\ No newline at end of file
index c95d909841ced8b24d83a6828c3efe949303a317..ce6054645a084af0d875335c075972532230132a 100644 (file)
@@ -66,23 +66,23 @@ public class UsersRolesController implements MvcConstants {
 
        @RequestMapping("/createUser.security")
        @ModelAttribute(ANSWER_MODEL_KEY)
-       public ServerAnswer createUser(Reader reader) {
+       public ArgeoUser createUser(Reader reader) {
                ArgeoUser user = (ArgeoUser) userDeserializer.deserialize(reader);
                userDao.create(user);
-               return ServerAnswer.ok("User " + user.getUsername() + " created");
+               return userDao.getUser(user.getUsername());
        }
 
        @RequestMapping("/updateUser.security")
        @ModelAttribute(ANSWER_MODEL_KEY)
-       public ServerAnswer updateUser(Reader reader) {
+       public ArgeoUser updateUser(Reader reader) {
                ArgeoUser user = (ArgeoUser) userDeserializer.deserialize(reader);
                userDao.update(user);
-               return ServerAnswer.ok("User " + user.getUsername() + " updated");
+               return userDao.getUser(user.getUsername());
        }
 
        @RequestMapping("/createUser2.security")
        @ModelAttribute(ANSWER_MODEL_KEY)
-       public ServerAnswer createUser(@RequestParam("body") String body) {
+       public ArgeoUser createUser(@RequestParam("body") String body) {
                if (log.isDebugEnabled())
                        log.debug("body:\n" + body);
                StringReader reader = new StringReader(body);
@@ -93,7 +93,7 @@ public class UsersRolesController implements MvcConstants {
                        IOUtils.closeQuietly(reader);
                }
                userDao.create(user);
-               return ServerAnswer.ok("User " + user.getUsername() + " created");
+               return userDao.getUser(user.getUsername());
        }
 
        @RequestMapping("/deleteUser.security")
index c91f76d3675a244212eb607cda01633abeb77b30..38a1541b20e4021cefb595d0e4216288493cc11a 100644 (file)
@@ -70,4 +70,8 @@ public class GenericJsonDeserializer<T> extends JsonDeserializer<T> {
                this.objectFactories = objectFactories;
        }
 
+       public List<JsonObjectFactory> getObjectFactories() {
+               return objectFactories;
+       }
+
 }
index cd6c00ee41c05317e0af0022b5174bf0e7d1389a..a38e45ddd486da063efea624a97b19c972705377 100644 (file)
@@ -18,7 +18,7 @@ public class JsonObjectFactoryImpl implements JsonObjectFactory,
                        .getLog(JsonObjectFactoryImpl.class);
 
        private BundleContext bundleContext;
-       private BundleDelegatingClassLoader classLoader;
+       private ClassLoader classLoader = getClass().getClassLoader();
 
        private ObjectMapper objectMapper = new ObjectMapper();
        private Map<String, Class> supportedTypes = new HashMap<String, Class>();
index 8fef8e6b2fa7772638bbcdae89280d0c218cc201..266ff2eec3f041ec37f1908b4c18c86456aa7660 100644 (file)
@@ -2,9 +2,11 @@ package org.argeo.server.json;
 
 import java.io.IOException;
 import java.io.Reader;
+import java.io.StringReader;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.commons.io.IOUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.server.ArgeoServerException;
@@ -21,10 +23,11 @@ public class JsonServerMapper extends JsonServerSerializer implements
                ServerDeserializer, InitializingBean {
        private final static Log log = LogFactory.getLog(JsonServerMapper.class);
 
-       private Class targetClass;
+       private Class<?> targetClass;
 
-       private Map<Class, JsonDeserializer> deserializers = new HashMap<Class, JsonDeserializer>();
+       private Map<Class<?>, JsonDeserializer<?>> deserializers = new HashMap<Class<?>, JsonDeserializer<?>>();
 
+       @SuppressWarnings("unchecked")
        public void afterPropertiesSet() throws Exception {
                CustomDeserializerFactory dsf = new CustomDeserializerFactory();
                for (Class clss : deserializers.keySet()) {
@@ -40,8 +43,9 @@ public class JsonServerMapper extends JsonServerSerializer implements
                                                        JsonDeserializer<?> deserializer, Object bean,
                                                        String propertyName) throws IOException,
                                                        JsonProcessingException {
-                                               if (log.isDebugEnabled())
+                                               if (log.isTraceEnabled())
                                                        log.debug("Ignore property " + propertyName);
+                                               ctxt.getParser().skipChildren();
                                                return true;
                                        }
                                });
@@ -67,12 +71,29 @@ public class JsonServerMapper extends JsonServerSerializer implements
 
        }
 
-       public void setTargetClass(Class targetClass) {
+       public Object deserialize(String content) {
+               StringReader reader = new StringReader(content);
+               try {
+                       return deserialize(reader);
+               } finally {
+                       IOUtils.closeQuietly(reader);
+               }
+       }
+
+       public void setTargetClass(Class<?> targetClass) {
                this.targetClass = targetClass;
        }
 
-       public void setDeserializers(Map<Class, JsonDeserializer> deserializers) {
+       public void setDeserializers(Map<Class<?>, JsonDeserializer<?>> deserializers) {
                this.deserializers = deserializers;
        }
 
+       public Class<?> getTargetClass() {
+               return targetClass;
+       }
+
+       public Map<Class<?>, JsonDeserializer<?>> getDeserializers() {
+               return deserializers;
+       }
+
 }
diff --git a/server/runtime/org.argeo.server.json/src/test/java/org/argeo/server/json/JsonServerMapperTest.java b/server/runtime/org.argeo.server.json/src/test/java/org/argeo/server/json/JsonServerMapperTest.java
deleted file mode 100644 (file)
index 52846de..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-package org.argeo.server.json;
-
-public class JsonServerMapperTest {
-       public void testDeserialize() {
-//             JsonServerMapper mapper = new JsonServerMapper();
-               //mapper.setTargetClass(targetClass)
-       }
-}