From: Mathieu Baudier Date: Fri, 18 Sep 2009 18:19:08 +0000 (+0000) Subject: Finish implementing API X-Git-Tag: argeo-commons-2.1.30~1780 X-Git-Url: https://git.argeo.org/?p=lgpl%2Fargeo-commons.git;a=commitdiff_plain;h=f3ff1f46c8a04c4a60bbccd44e16d5880b386229 Finish implementing API git-svn-id: https://svn.argeo.org/commons/trunk@2974 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/security/runtime/org.argeo.security.core/.classpath b/security/runtime/org.argeo.security.core/.classpath index 98f38b674..e2de5961c 100644 --- a/security/runtime/org.argeo.security.core/.classpath +++ b/security/runtime/org.argeo.security.core/.classpath @@ -3,6 +3,7 @@ + diff --git a/security/runtime/org.argeo.security.core/pom.xml b/security/runtime/org.argeo.security.core/pom.xml index 3fd7ae889..374ec77bc 100644 --- a/security/runtime/org.argeo.security.core/pom.xml +++ b/security/runtime/org.argeo.security.core/pom.xml @@ -93,6 +93,12 @@ com.springsource.junit test + + org.argeo.commons.server + org.argeo.server.json + 0.1.1-SNAPSHOT + test + diff --git a/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/ArgeoUser.java b/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/ArgeoUser.java index 5d2eea6ee..44bf7f38a 100644 --- a/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/ArgeoUser.java +++ b/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/ArgeoUser.java @@ -8,4 +8,6 @@ public interface ArgeoUser { public List getUserNatures(); public List getRoles(); + + public String getPassword(); } diff --git a/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/BasicArgeoUser.java b/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/BasicArgeoUser.java index df910d57e..c6b8ce1b8 100644 --- a/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/BasicArgeoUser.java +++ b/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/BasicArgeoUser.java @@ -8,6 +8,7 @@ public class BasicArgeoUser implements ArgeoUser, Serializable { private static final long serialVersionUID = 1L; private String username; + private String password; private List userNatures = new ArrayList(); private List roles = new ArrayList(); @@ -44,4 +45,12 @@ public class BasicArgeoUser implements ArgeoUser, Serializable { public void setRoles(List roles) { this.roles = roles; } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } } diff --git a/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/core/ArgeoUserDetails.java b/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/core/ArgeoUserDetails.java index 1080eb82c..0b8368c6f 100644 --- a/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/core/ArgeoUserDetails.java +++ b/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/core/ArgeoUserDetails.java @@ -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 index 55e22b711..000000000 --- a/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/json/ArgeoUserMapper.java +++ /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 { - 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 clss = (Class) 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); - } - } - - } -} diff --git a/security/runtime/org.argeo.security.core/src/test/java/org/argeo/security/json/ArgeoUserJsonTest.java b/security/runtime/org.argeo.security.core/src/test/java/org/argeo/security/json/ArgeoUserJsonTest.java index 956bc578f..df9dbe95a 100644 --- a/security/runtime/org.argeo.security.core/src/test/java/org/argeo/security/json/ArgeoUserJsonTest.java +++ b/security/runtime/org.argeo.security.core/src/test/java/org/argeo/security/json/ArgeoUserJsonTest.java @@ -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 index 000000000..f841aeaf1 --- /dev/null +++ b/security/runtime/org.argeo.security.core/src/test/java/org/argeo/security/json/JsonServerMapperTest.java @@ -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 index 000000000..b33daa9db --- /dev/null +++ b/security/runtime/org.argeo.security.core/src/test/resources/log4j.properties @@ -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 index 000000000..a7edbf072 --- /dev/null +++ b/security/runtime/org.argeo.security.core/src/test/resources/org/argeo/security/json/gandalf2.json @@ -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 diff --git a/security/runtime/org.argeo.security.mvc/src/main/java/org/argeo/security/mvc/UsersRolesController.java b/security/runtime/org.argeo.security.mvc/src/main/java/org/argeo/security/mvc/UsersRolesController.java index c95d90984..ce6054645 100644 --- a/security/runtime/org.argeo.security.mvc/src/main/java/org/argeo/security/mvc/UsersRolesController.java +++ b/security/runtime/org.argeo.security.mvc/src/main/java/org/argeo/security/mvc/UsersRolesController.java @@ -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") diff --git a/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/GenericJsonDeserializer.java b/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/GenericJsonDeserializer.java index c91f76d36..38a1541b2 100644 --- a/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/GenericJsonDeserializer.java +++ b/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/GenericJsonDeserializer.java @@ -70,4 +70,8 @@ public class GenericJsonDeserializer extends JsonDeserializer { this.objectFactories = objectFactories; } + public List getObjectFactories() { + return objectFactories; + } + } diff --git a/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonObjectFactoryImpl.java b/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonObjectFactoryImpl.java index cd6c00ee4..a38e45ddd 100644 --- a/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonObjectFactoryImpl.java +++ b/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonObjectFactoryImpl.java @@ -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 supportedTypes = new HashMap(); diff --git a/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonServerMapper.java b/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonServerMapper.java index 8fef8e6b2..266ff2eec 100644 --- a/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonServerMapper.java +++ b/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonServerMapper.java @@ -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 deserializers = new HashMap(); + private Map, JsonDeserializer> deserializers = new HashMap, 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 deserializers) { + public void setDeserializers(Map, JsonDeserializer> deserializers) { this.deserializers = deserializers; } + public Class getTargetClass() { + return targetClass; + } + + public Map, 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 index 52846dec2..000000000 --- a/server/runtime/org.argeo.server.json/src/test/java/org/argeo/server/json/JsonServerMapperTest.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.argeo.server.json; - -public class JsonServerMapperTest { - public void testDeserialize() { -// JsonServerMapper mapper = new JsonServerMapper(); - //mapper.setTargetClass(targetClass) - } -}