Index: oak-http/src/main/java/org/apache/jackrabbit/oak/http/OakServlet.java =================================================================== --- oak-http/src/main/java/org/apache/jackrabbit/oak/http/OakServlet.java (revision 1855537) +++ oak-http/src/main/java/org/apache/jackrabbit/oak/http/OakServlet.java (working copy) @@ -22,7 +22,9 @@ import javax.jcr.Credentials; import javax.jcr.NoSuchWorkspaceException; +import javax.jcr.RepositoryException; import javax.jcr.SimpleCredentials; +import javax.jcr.nodetype.PropertyDefinition; import javax.security.auth.login.LoginException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; @@ -29,22 +31,33 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.dataformat.smile.SmileFactory; +import org.apache.jackrabbit.JcrConstants; import org.apache.jackrabbit.oak.api.CommitFailedException; import org.apache.jackrabbit.oak.api.ContentRepository; import org.apache.jackrabbit.oak.api.ContentSession; import org.apache.jackrabbit.oak.api.Root; import org.apache.jackrabbit.oak.api.Tree; +import org.apache.jackrabbit.oak.api.Type; import org.apache.jackrabbit.oak.commons.PathUtils; +import org.apache.jackrabbit.oak.namepath.NamePathMapper; +import org.apache.jackrabbit.oak.plugins.nodetype.ReadOnlyNodeTypeManager; +import org.apache.jackrabbit.oak.spi.nodetype.EffectiveNodeType; import org.apache.jackrabbit.util.Base64; import org.apache.tika.mime.MediaType; +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.dataformat.smile.SmileFactory; + public class OakServlet extends HttpServlet { - private static final MediaType JSON = + /** + * + */ + private static final long serialVersionUID = -5074919710885639904L; + + private static final MediaType JSON = MediaType.parse("application/json"); private static final MediaType SMILE = @@ -145,11 +158,11 @@ for (String name : PathUtils.elements(path)) { tree = tree.addChild(name); } - + ObjectMapper mapper = new ObjectMapper(); JsonNode node = mapper.readTree(request.getInputStream()); - if (node.isObject()) { - post(node, tree); + if (node != null && node.isObject()) { + post(node, tree, root); root.commit(); request.setAttribute("path", ""); request.setAttribute("tree", tree); @@ -159,10 +172,12 @@ } } catch (CommitFailedException e) { throw new ServletException(e); + } catch (RepositoryException e) { + throw new ServletException(e); } } - private static void post(JsonNode node, Tree tree) { + private void post(JsonNode node, Tree tree, Root root) throws IllegalArgumentException, RepositoryException { Iterator> iterator = node.fields(); while (iterator.hasNext()) { Entry entry = iterator.next(); @@ -176,7 +191,7 @@ if (!child.exists()) { child = tree.addChild(name); } - post(value, child); + post(value, child, root); } else { Tree child = tree.getChild(name); if (child.exists()) { @@ -186,6 +201,8 @@ tree.removeProperty(name); } else if (value.isBoolean()) { tree.setProperty(name, value.asBoolean()); + } else if (value.isInt()) { + tree.setProperty(name, value.asInt()); } else if (value.isLong()) { tree.setProperty(name, value.asLong()); } else if (value.isDouble()) { @@ -193,11 +210,41 @@ } else if (value.isBigDecimal()) { tree.setProperty(name, value.decimalValue()); } else { - tree.setProperty(name, value.asText()); + tree.setProperty(name, value.asText(), getValidPropertyType(root, tree, name)); } } } } + + private Type getValidPropertyType(Root root, Tree tree, String name) throws RepositoryException { + ReadOnlyNodeTypeManager ntm = ReadOnlyNodeTypeManager.getInstance(root, NamePathMapper.DEFAULT); + EffectiveNodeType ent = getNodeType(ntm, tree); + + Iterator it = ent.getPropertyDefinitions().iterator(); + while(it.hasNext()) { + PropertyDefinition pd = it.next(); + if(pd.getName().equals(name)) { + Type t = Type.fromTag(pd.getRequiredType(), false); + return t; + } + } + + return Type.STRING; + } + + private EffectiveNodeType getNodeType(ReadOnlyNodeTypeManager ntm, Tree tree) throws RepositoryException { + EffectiveNodeType ent = null; + + if(tree.hasProperty(JcrConstants.JCR_PRIMARYTYPE)) { + ent = ntm.getEffectiveNodeType(tree); + } else { + // Node does not have a primary type. + // Must be new node with jcr:primaryType not set yet. Use parent node. + ent = getNodeType(ntm, tree.getParent()); + } + + return ent; + } @Override protected void doDelete(