<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"/>
<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>
public List<UserNature> getUserNatures();
public List<String> getRoles();
+
+ public String getPassword();
}
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>();
public void setRoles(List<String> roles) {
this.roles = roles;
}
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
}
}
public ArgeoUserDetails(ArgeoUser argeoUser) {
- // TODO: password
- this(argeoUser.getUsername(), argeoUser.getUserNatures(), null,
+ this(argeoUser.getUsername(), argeoUser.getUserNatures(), argeoUser.getPassword(),
rolesToAuthorities(argeoUser.getRoles()));
}
+++ /dev/null
-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);
- }
- }
-
- }
-}
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;
// 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());
--- /dev/null
+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;
+ }
+}
--- /dev/null
+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
--- /dev/null
+{"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
@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);
IOUtils.closeQuietly(reader);
}
userDao.create(user);
- return ServerAnswer.ok("User " + user.getUsername() + " created");
+ return userDao.getUser(user.getUsername());
}
@RequestMapping("/deleteUser.security")
this.objectFactories = objectFactories;
}
+ public List<JsonObjectFactory> getObjectFactories() {
+ return objectFactories;
+ }
+
}
.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>();
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;
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()) {
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;
}
});
}
- 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;
+ }
+
}
+++ /dev/null
-package org.argeo.server.json;
-
-public class JsonServerMapperTest {
- public void testDeserialize() {
-// JsonServerMapper mapper = new JsonServerMapper();
- //mapper.setTargetClass(targetClass)
- }
-}