You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-dev@jackrabbit.apache.org by Mike Nimer <mn...@gmail.com> on 2014/12/09 20:08:10 UTC

Adding a File Node

So I know I must be doing something wrong, and I'm sure it's something
simple. Or everyone would notice it.  But I can't seem to add a
NT_File Node to the repository (SegmentNodeStore w/FileStore).

When I try to use a JCR Repository, basic addNode logic or with
JcrUtils, I will get this error
"Uniqueness constraint violated at path [/] for one of the property in
[jcr:uuid]"

When I use the Oak Repository I will not get an error but no node
seems to be created.

I guess the question. What is the right way to add a NT_FILE node in
Oak? Also I've tried different versions of oak, from 1.1.0 to
1.1-SNAPSHOT.

Here is the simple test class I'm using to verify this with 4
different ways to create a file node. Based on what I can find online
and digging through the unit tests.

thanks,
--mike

============================================================

package com.mikenimer.test;

import org.apache.jackrabbit.JcrConstants;
import org.apache.jackrabbit.commons.JcrUtils;
import org.apache.jackrabbit.oak.Oak;
import org.apache.jackrabbit.oak.api.Blob;
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.jcr.Jcr;
import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStore;
import org.apache.jackrabbit.oak.plugins.segment.SegmentStore;
import org.apache.jackrabbit.oak.plugins.segment.file.FileStore;
import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
import org.apache.jackrabbit.oak.util.NodeUtil;
import org.apache.jackrabbit.value.BinaryValue;

import javax.jcr.Node;
import javax.jcr.Repository;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import javax.jcr.Value;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Calendar;

/**
 * JCR Add File Node test
 */
public class App
{
    public static void main(String[] args)
    {
        App app = new App();
    }


    public App()
    {


        try {
            SegmentStore store = getNodeStore();
            Oak oak = getOak(store);


            System.out.println("1. #######################");
            listTree(oak, null);

            System.out.println("2. #######################");
            Session session = getSession(oak);
            ContentSession contentSession = getContentSession(oak);
            addTestFolders(session);
            //addTestFilesJCR(session);
            addTestFilesWithJCRUtils(session);
            //addTestFilesWithBuilder(contentSession, store);
            //addTestFilesWithNodeUtil(contentSession, store);
            listTree(oak, session);
            session.logout();

            System.out.println("3. #######################");
            listTree(oak, null);
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }

    }


    private void listTree(Oak oak, Session session) throws Exception
    {
        if( session == null ) {
            session = getSession(oak);
        }
        Node rootNode = session.getNode("/");
        Iterable<Node> nodes = JcrUtils.getChildNodes(rootNode);
        for (Node node : nodes) {
            if( node.isNodeType("mix:referenceable") ) {
                System.out.println(node.getName() + " | " +
node.getUUID() + " | " + node.getPath());
            }else{
                System.out.println(node.getName() + " | " + node.getPath());
            }

            Iterable<Node> nodes2 = JcrUtils.getChildNodes(node);
            for (Node node2 : nodes2) {
                if( node2.isNodeType("mix:referenceable") ) {
                    System.out.println("---" + node2.getName() + " | "
+ node2.getUUID() + " | " + node2.getPath());
                }else {
                    System.out.println("---" + node2.getName()  + " |
" + node2.getPath());
                }
            }
        }
    }


    private void addTestFolders(Session session) throws Exception
    {
        Node root = session.getNode("/");
        JcrUtils.getOrAddFolder(root, "test1");
        JcrUtils.getOrAddFolder(root, "test1/test1a");
        JcrUtils.getOrAddFolder(root, "test2");
        JcrUtils.getOrAddFolder(root, "test2/test2a");
        session.save();
    }


    private void addTestFilesJCR(Session session) throws Exception
    {
        //InputStream is1 =
this.getClass().getClassLoader().getResourceAsStream("image1.jpg");
        //InputStream is2 =
this.getClass().getClassLoader().getResourceAsStream("image2.jpg");

        File file = new File("/Users/mnimer/Desktop/ScreenShot.png");
        InputStream is1 = new FileInputStream(file);

        Node rootNode = session.getNode("/test1");
        if( !session.nodeExists("/file1") ) {

            //create the file node - see section 6.7.22.6 of the spec
            Node fileNode = rootNode.addNode (file.getName(), "nt:file");
            fileNode.addMixin("mix:referenceable");

            //create the mandatory child node - jcr:content
            Node resNode = fileNode.addNode ("jcr:content", "nt:resource");
            resNode.setProperty ("jcr:mimeType", "image/png");
            resNode.setProperty ("jcr:data", new FileInputStream (file));
            Calendar lastModified = Calendar.getInstance();
            lastModified.setTimeInMillis (file.lastModified ());
            resNode.setProperty ("jcr:lastModified", lastModified);


            //Node img1 = JcrUtils.putFile(rootNode, "file1", "image/png", is1);
            System.out.println(fileNode.getName() +" | "
+fileNode.getUUID() +" | " +fileNode.getPath());
        }

        session.save();
    }



    private void addTestFilesWithJCRUtils(Session session) throws Exception
    {
        session.refresh(true);
        //InputStream is1 =
this.getClass().getClassLoader().getResourceAsStream("image1.jpg");
        //InputStream is2 =
this.getClass().getClassLoader().getResourceAsStream("image2.jpg");

        File file = new File("/Users/mnimer/Desktop/ScreenShot.png");
        InputStream is1 = new FileInputStream(file);

        Node rootNode = session.getNode("/test1");
        if( !session.nodeExists("/file1") ) {

            Node fileNode = JcrUtils.putFile(rootNode, file.getName(),
"image/png", new BufferedInputStream(new FileInputStream(file)) );

            //Node img1 = JcrUtils.putFile(rootNode, "file1", "image/png", is1);
            if( fileNode.hasNode("mix:referenceable") ) {
                System.out.println(fileNode.getName() + " | " +
fileNode.getUUID() + " | " + fileNode.getPath());
            }else{
                System.out.println(fileNode.getName()  + " | " +
fileNode.getPath());
            }
        }

        session.save();
    }


    private void addTestFilesWithBuilder(ContentSession session,
SegmentStore store) throws Exception
    {
        Root root = session.getLatestRoot();
        Tree rootTree = root.getTree("/");

        NodeBuilder builder = store.getHead().builder();

        File file = new File("/Users/mnimer/Desktop/ScreenShot.png");
        //InputStream is1 = new FileInputStream(file);

        String fileName = file.getName();
        NodeBuilder fileNode = null;
        if( builder.hasChildNode(fileName) ) {
            fileNode = builder.getChildNode(fileName);
        }else{
            fileNode = builder.child(fileName);
        }


        fileNode.setProperty(JcrConstants.JCR_PRIMARYTYPE,
JcrConstants.NT_FILE, Type.NAME);
        NodeBuilder contentNode = fileNode.child(JcrConstants.JCR_CONTENT);
        contentNode.setProperty(JcrConstants.JCR_PRIMARYTYPE,
JcrConstants.NT_RESOURCE);

        // set file contents
        //Value[] binaryContent = new Value[1];
        InputStream is = new FileInputStream(file);
        //BinaryValue binaryValue = new BinaryValue(is);
        Blob blob = contentNode.createBlob(is);
        fileNode.setProperty(JcrConstants.JCR_CONTENT, blob, Type.BINARY);

        //content.setProperty(JcrConstants.JCR_DATA, blobId);
        session.getLatestRoot().commit();
        //session.getLatestRoot().commit();

    }


    private void addTestFilesWithNodeUtil(ContentSession session,
SegmentStore store) throws Exception
    {
        Root root = session.getLatestRoot();
        Tree rootTree = root.getTree("/");
        NodeUtil nodeUtil = new NodeUtil(rootTree);

        File file = new File("/Users/mnimer/Desktop/ScreenShot.png");
        //InputStream is = new FileInputStream(file);

        String fileName = file.getName();
        NodeUtil fileNode = nodeUtil.getOrAddChild(fileName,
JcrConstants.NT_FILE);

        fileNode.setString(JcrConstants.JCR_MIMETYPE, "image/png");

        Calendar lastModified = Calendar.getInstance();
        lastModified.setTimeInMillis(file.lastModified());
        fileNode.setDate(JcrConstants.JCR_LASTMODIFIED,
lastModified.getTimeInMillis());


        NodeUtil contentNode =
fileNode.getOrAddChild(JcrConstants.JCR_CONTENT,
JcrConstants.NT_RESOURCE);
        // set file contents
        InputStream is = new FileInputStream(file);
        Value[] binaryContent = new Value[1];
        binaryContent[0] = new BinaryValue(is);
        contentNode.setValues(JcrConstants.JCR_DATA, binaryContent);

        session.getLatestRoot().commit();
    }





    private FileStore getNodeStore() throws Exception
    {
        File directory = new File("jcrTestRepo", "tarmk-"
+System.currentTimeMillis());
        final FileStore fileStore = new FileStore(directory, 1, false);
        Runtime.getRuntime().addShutdownHook(new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                fileStore.close();
            }
        }));

        return fileStore;
    }

    private Oak getOak(SegmentStore store) throws Exception
    {
        return new Oak(new SegmentNodeStore(store));
        //return new Oak(new SegmentNodeStore(memoryStore));
    }

    private Session getSession(Oak oak) throws Exception
    {
        SimpleCredentials credentials = new SimpleCredentials("admin",
"admin".toCharArray());
        Repository repository = new Jcr(oak).createRepository();
        return repository.login(credentials, null);
    }

    private ContentSession getContentSession(Oak oak) throws Exception
    {
        SimpleCredentials credentials = new SimpleCredentials("admin",
"admin".toCharArray());
        ContentRepository repository = oak.createContentRepository();
        return repository.login(credentials, "default");
    }

}

============================================================

Re: Adding a File Node

Posted by Mike Nimer <mn...@gmail.com>.
D'oh, I knew it has to be something simple. Thank you!
--mike

On Wed, Dec 10, 2014 at 3:18 AM, Alex Parvulescu
<al...@gmail.com> wrote:
> Hi Mike,
>
> The issue is in the initialization parts of the code. You need to only
> boostrap 'Jcr' once, in your code snippet you do it for each session login
> call.
>
> So the fix is to change the #getOak(SegmentStore store) and the #getSession(Oak
> oak) methods to [0] and the init parts to [1].
>
> hope this helps!
>
> alex
>
> [0]
>   private Repository getRepository(SegmentStore store) throws Exception {
>     Oak oak = new Oak(new SegmentNodeStore(store));
>     return new Jcr(oak).createRepository();
>   }
>
>   private Session getSession(Repository repository) throws Exception {
>     SimpleCredentials credentials = new SimpleCredentials("admin",
> "admin".toCharArray());
>     return repository.login(credentials, null);
>   }
>
> [1]
> public App() {
>   try {
>     SegmentStore store = getNodeStore();
>     Repository repository = getRepository(store);
>     // System.out.println("1. #######################");
>     // listTree(repository, null);
>     System.out.println("2. #######################");
>     Session session = getSession(repository);
>     addTestFolders(session);
>     addTestFilesWithJCRUtils(session);
>     // ....
>
>
>
>
>
> On Tue, Dec 9, 2014 at 8:08 PM, Mike Nimer <mn...@gmail.com> wrote:
>
>> So I know I must be doing something wrong, and I'm sure it's something
>> simple. Or everyone would notice it.  But I can't seem to add a
>> NT_File Node to the repository (SegmentNodeStore w/FileStore).
>>
>> When I try to use a JCR Repository, basic addNode logic or with
>> JcrUtils, I will get this error
>> "Uniqueness constraint violated at path [/] for one of the property in
>> [jcr:uuid]"
>>
>> When I use the Oak Repository I will not get an error but no node
>> seems to be created.
>>
>> I guess the question. What is the right way to add a NT_FILE node in
>> Oak? Also I've tried different versions of oak, from 1.1.0 to
>> 1.1-SNAPSHOT.
>>
>> Here is the simple test class I'm using to verify this with 4
>> different ways to create a file node. Based on what I can find online
>> and digging through the unit tests.
>>
>> thanks,
>> --mike
>>
>> ============================================================
>>
>> package com.mikenimer.test;
>>
>> import org.apache.jackrabbit.JcrConstants;
>> import org.apache.jackrabbit.commons.JcrUtils;
>> import org.apache.jackrabbit.oak.Oak;
>> import org.apache.jackrabbit.oak.api.Blob;
>> 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.jcr.Jcr;
>> import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStore;
>> import org.apache.jackrabbit.oak.plugins.segment.SegmentStore;
>> import org.apache.jackrabbit.oak.plugins.segment.file.FileStore;
>> import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
>> import org.apache.jackrabbit.oak.util.NodeUtil;
>> import org.apache.jackrabbit.value.BinaryValue;
>>
>> import javax.jcr.Node;
>> import javax.jcr.Repository;
>> import javax.jcr.Session;
>> import javax.jcr.SimpleCredentials;
>> import javax.jcr.Value;
>> import java.io.BufferedInputStream;
>> import java.io.File;
>> import java.io.FileInputStream;
>> import java.io.InputStream;
>> import java.util.Calendar;
>>
>> /**
>>  * JCR Add File Node test
>>  */
>> public class App
>> {
>>     public static void main(String[] args)
>>     {
>>         App app = new App();
>>     }
>>
>>
>>     public App()
>>     {
>>
>>
>>         try {
>>             SegmentStore store = getNodeStore();
>>             Oak oak = getOak(store);
>>
>>
>>             System.out.println("1. #######################");
>>             listTree(oak, null);
>>
>>             System.out.println("2. #######################");
>>             Session session = getSession(oak);
>>             ContentSession contentSession = getContentSession(oak);
>>             addTestFolders(session);
>>             //addTestFilesJCR(session);
>>             addTestFilesWithJCRUtils(session);
>>             //addTestFilesWithBuilder(contentSession, store);
>>             //addTestFilesWithNodeUtil(contentSession, store);
>>             listTree(oak, session);
>>             session.logout();
>>
>>             System.out.println("3. #######################");
>>             listTree(oak, null);
>>         }
>>         catch (Exception ex) {
>>             ex.printStackTrace();
>>         }
>>
>>     }
>>
>>
>>     private void listTree(Oak oak, Session session) throws Exception
>>     {
>>         if( session == null ) {
>>             session = getSession(oak);
>>         }
>>         Node rootNode = session.getNode("/");
>>         Iterable<Node> nodes = JcrUtils.getChildNodes(rootNode);
>>         for (Node node : nodes) {
>>             if( node.isNodeType("mix:referenceable") ) {
>>                 System.out.println(node.getName() + " | " +
>> node.getUUID() + " | " + node.getPath());
>>             }else{
>>                 System.out.println(node.getName() + " | " +
>> node.getPath());
>>             }
>>
>>             Iterable<Node> nodes2 = JcrUtils.getChildNodes(node);
>>             for (Node node2 : nodes2) {
>>                 if( node2.isNodeType("mix:referenceable") ) {
>>                     System.out.println("---" + node2.getName() + " | "
>> + node2.getUUID() + " | " + node2.getPath());
>>                 }else {
>>                     System.out.println("---" + node2.getName()  + " |
>> " + node2.getPath());
>>                 }
>>             }
>>         }
>>     }
>>
>>
>>     private void addTestFolders(Session session) throws Exception
>>     {
>>         Node root = session.getNode("/");
>>         JcrUtils.getOrAddFolder(root, "test1");
>>         JcrUtils.getOrAddFolder(root, "test1/test1a");
>>         JcrUtils.getOrAddFolder(root, "test2");
>>         JcrUtils.getOrAddFolder(root, "test2/test2a");
>>         session.save();
>>     }
>>
>>
>>     private void addTestFilesJCR(Session session) throws Exception
>>     {
>>         //InputStream is1 =
>> this.getClass().getClassLoader().getResourceAsStream("image1.jpg");
>>         //InputStream is2 =
>> this.getClass().getClassLoader().getResourceAsStream("image2.jpg");
>>
>>         File file = new File("/Users/mnimer/Desktop/ScreenShot.png");
>>         InputStream is1 = new FileInputStream(file);
>>
>>         Node rootNode = session.getNode("/test1");
>>         if( !session.nodeExists("/file1") ) {
>>
>>             //create the file node - see section 6.7.22.6 of the spec
>>             Node fileNode = rootNode.addNode (file.getName(), "nt:file");
>>             fileNode.addMixin("mix:referenceable");
>>
>>             //create the mandatory child node - jcr:content
>>             Node resNode = fileNode.addNode ("jcr:content", "nt:resource");
>>             resNode.setProperty ("jcr:mimeType", "image/png");
>>             resNode.setProperty ("jcr:data", new FileInputStream (file));
>>             Calendar lastModified = Calendar.getInstance();
>>             lastModified.setTimeInMillis (file.lastModified ());
>>             resNode.setProperty ("jcr:lastModified", lastModified);
>>
>>
>>             //Node img1 = JcrUtils.putFile(rootNode, "file1", "image/png",
>> is1);
>>             System.out.println(fileNode.getName() +" | "
>> +fileNode.getUUID() +" | " +fileNode.getPath());
>>         }
>>
>>         session.save();
>>     }
>>
>>
>>
>>     private void addTestFilesWithJCRUtils(Session session) throws Exception
>>     {
>>         session.refresh(true);
>>         //InputStream is1 =
>> this.getClass().getClassLoader().getResourceAsStream("image1.jpg");
>>         //InputStream is2 =
>> this.getClass().getClassLoader().getResourceAsStream("image2.jpg");
>>
>>         File file = new File("/Users/mnimer/Desktop/ScreenShot.png");
>>         InputStream is1 = new FileInputStream(file);
>>
>>         Node rootNode = session.getNode("/test1");
>>         if( !session.nodeExists("/file1") ) {
>>
>>             Node fileNode = JcrUtils.putFile(rootNode, file.getName(),
>> "image/png", new BufferedInputStream(new FileInputStream(file)) );
>>
>>             //Node img1 = JcrUtils.putFile(rootNode, "file1", "image/png",
>> is1);
>>             if( fileNode.hasNode("mix:referenceable") ) {
>>                 System.out.println(fileNode.getName() + " | " +
>> fileNode.getUUID() + " | " + fileNode.getPath());
>>             }else{
>>                 System.out.println(fileNode.getName()  + " | " +
>> fileNode.getPath());
>>             }
>>         }
>>
>>         session.save();
>>     }
>>
>>
>>     private void addTestFilesWithBuilder(ContentSession session,
>> SegmentStore store) throws Exception
>>     {
>>         Root root = session.getLatestRoot();
>>         Tree rootTree = root.getTree("/");
>>
>>         NodeBuilder builder = store.getHead().builder();
>>
>>         File file = new File("/Users/mnimer/Desktop/ScreenShot.png");
>>         //InputStream is1 = new FileInputStream(file);
>>
>>         String fileName = file.getName();
>>         NodeBuilder fileNode = null;
>>         if( builder.hasChildNode(fileName) ) {
>>             fileNode = builder.getChildNode(fileName);
>>         }else{
>>             fileNode = builder.child(fileName);
>>         }
>>
>>
>>         fileNode.setProperty(JcrConstants.JCR_PRIMARYTYPE,
>> JcrConstants.NT_FILE, Type.NAME);
>>         NodeBuilder contentNode = fileNode.child(JcrConstants.JCR_CONTENT);
>>         contentNode.setProperty(JcrConstants.JCR_PRIMARYTYPE,
>> JcrConstants.NT_RESOURCE);
>>
>>         // set file contents
>>         //Value[] binaryContent = new Value[1];
>>         InputStream is = new FileInputStream(file);
>>         //BinaryValue binaryValue = new BinaryValue(is);
>>         Blob blob = contentNode.createBlob(is);
>>         fileNode.setProperty(JcrConstants.JCR_CONTENT, blob, Type.BINARY);
>>
>>         //content.setProperty(JcrConstants.JCR_DATA, blobId);
>>         session.getLatestRoot().commit();
>>         //session.getLatestRoot().commit();
>>
>>     }
>>
>>
>>     private void addTestFilesWithNodeUtil(ContentSession session,
>> SegmentStore store) throws Exception
>>     {
>>         Root root = session.getLatestRoot();
>>         Tree rootTree = root.getTree("/");
>>         NodeUtil nodeUtil = new NodeUtil(rootTree);
>>
>>         File file = new File("/Users/mnimer/Desktop/ScreenShot.png");
>>         //InputStream is = new FileInputStream(file);
>>
>>         String fileName = file.getName();
>>         NodeUtil fileNode = nodeUtil.getOrAddChild(fileName,
>> JcrConstants.NT_FILE);
>>
>>         fileNode.setString(JcrConstants.JCR_MIMETYPE, "image/png");
>>
>>         Calendar lastModified = Calendar.getInstance();
>>         lastModified.setTimeInMillis(file.lastModified());
>>         fileNode.setDate(JcrConstants.JCR_LASTMODIFIED,
>> lastModified.getTimeInMillis());
>>
>>
>>         NodeUtil contentNode =
>> fileNode.getOrAddChild(JcrConstants.JCR_CONTENT,
>> JcrConstants.NT_RESOURCE);
>>         // set file contents
>>         InputStream is = new FileInputStream(file);
>>         Value[] binaryContent = new Value[1];
>>         binaryContent[0] = new BinaryValue(is);
>>         contentNode.setValues(JcrConstants.JCR_DATA, binaryContent);
>>
>>         session.getLatestRoot().commit();
>>     }
>>
>>
>>
>>
>>
>>     private FileStore getNodeStore() throws Exception
>>     {
>>         File directory = new File("jcrTestRepo", "tarmk-"
>> +System.currentTimeMillis());
>>         final FileStore fileStore = new FileStore(directory, 1, false);
>>         Runtime.getRuntime().addShutdownHook(new Thread(new Runnable()
>>         {
>>             @Override
>>             public void run()
>>             {
>>                 fileStore.close();
>>             }
>>         }));
>>
>>         return fileStore;
>>     }
>>
>>     private Oak getOak(SegmentStore store) throws Exception
>>     {
>>         return new Oak(new SegmentNodeStore(store));
>>         //return new Oak(new SegmentNodeStore(memoryStore));
>>     }
>>
>>     private Session getSession(Oak oak) throws Exception
>>     {
>>         SimpleCredentials credentials = new SimpleCredentials("admin",
>> "admin".toCharArray());
>>         Repository repository = new Jcr(oak).createRepository();
>>         return repository.login(credentials, null);
>>     }
>>
>>     private ContentSession getContentSession(Oak oak) throws Exception
>>     {
>>         SimpleCredentials credentials = new SimpleCredentials("admin",
>> "admin".toCharArray());
>>         ContentRepository repository = oak.createContentRepository();
>>         return repository.login(credentials, "default");
>>     }
>>
>> }
>>
>> ============================================================
>>

Re: Adding a File Node

Posted by Alex Parvulescu <al...@gmail.com>.
Hi Mike,

The issue is in the initialization parts of the code. You need to only
boostrap 'Jcr' once, in your code snippet you do it for each session login
call.

So the fix is to change the #getOak(SegmentStore store) and the #getSession(Oak
oak) methods to [0] and the init parts to [1].

hope this helps!

alex

[0]
  private Repository getRepository(SegmentStore store) throws Exception {
    Oak oak = new Oak(new SegmentNodeStore(store));
    return new Jcr(oak).createRepository();
  }

  private Session getSession(Repository repository) throws Exception {
    SimpleCredentials credentials = new SimpleCredentials("admin",
"admin".toCharArray());
    return repository.login(credentials, null);
  }

[1]
public App() {
  try {
    SegmentStore store = getNodeStore();
    Repository repository = getRepository(store);
    // System.out.println("1. #######################");
    // listTree(repository, null);
    System.out.println("2. #######################");
    Session session = getSession(repository);
    addTestFolders(session);
    addTestFilesWithJCRUtils(session);
    // ....





On Tue, Dec 9, 2014 at 8:08 PM, Mike Nimer <mn...@gmail.com> wrote:

> So I know I must be doing something wrong, and I'm sure it's something
> simple. Or everyone would notice it.  But I can't seem to add a
> NT_File Node to the repository (SegmentNodeStore w/FileStore).
>
> When I try to use a JCR Repository, basic addNode logic or with
> JcrUtils, I will get this error
> "Uniqueness constraint violated at path [/] for one of the property in
> [jcr:uuid]"
>
> When I use the Oak Repository I will not get an error but no node
> seems to be created.
>
> I guess the question. What is the right way to add a NT_FILE node in
> Oak? Also I've tried different versions of oak, from 1.1.0 to
> 1.1-SNAPSHOT.
>
> Here is the simple test class I'm using to verify this with 4
> different ways to create a file node. Based on what I can find online
> and digging through the unit tests.
>
> thanks,
> --mike
>
> ============================================================
>
> package com.mikenimer.test;
>
> import org.apache.jackrabbit.JcrConstants;
> import org.apache.jackrabbit.commons.JcrUtils;
> import org.apache.jackrabbit.oak.Oak;
> import org.apache.jackrabbit.oak.api.Blob;
> 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.jcr.Jcr;
> import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStore;
> import org.apache.jackrabbit.oak.plugins.segment.SegmentStore;
> import org.apache.jackrabbit.oak.plugins.segment.file.FileStore;
> import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
> import org.apache.jackrabbit.oak.util.NodeUtil;
> import org.apache.jackrabbit.value.BinaryValue;
>
> import javax.jcr.Node;
> import javax.jcr.Repository;
> import javax.jcr.Session;
> import javax.jcr.SimpleCredentials;
> import javax.jcr.Value;
> import java.io.BufferedInputStream;
> import java.io.File;
> import java.io.FileInputStream;
> import java.io.InputStream;
> import java.util.Calendar;
>
> /**
>  * JCR Add File Node test
>  */
> public class App
> {
>     public static void main(String[] args)
>     {
>         App app = new App();
>     }
>
>
>     public App()
>     {
>
>
>         try {
>             SegmentStore store = getNodeStore();
>             Oak oak = getOak(store);
>
>
>             System.out.println("1. #######################");
>             listTree(oak, null);
>
>             System.out.println("2. #######################");
>             Session session = getSession(oak);
>             ContentSession contentSession = getContentSession(oak);
>             addTestFolders(session);
>             //addTestFilesJCR(session);
>             addTestFilesWithJCRUtils(session);
>             //addTestFilesWithBuilder(contentSession, store);
>             //addTestFilesWithNodeUtil(contentSession, store);
>             listTree(oak, session);
>             session.logout();
>
>             System.out.println("3. #######################");
>             listTree(oak, null);
>         }
>         catch (Exception ex) {
>             ex.printStackTrace();
>         }
>
>     }
>
>
>     private void listTree(Oak oak, Session session) throws Exception
>     {
>         if( session == null ) {
>             session = getSession(oak);
>         }
>         Node rootNode = session.getNode("/");
>         Iterable<Node> nodes = JcrUtils.getChildNodes(rootNode);
>         for (Node node : nodes) {
>             if( node.isNodeType("mix:referenceable") ) {
>                 System.out.println(node.getName() + " | " +
> node.getUUID() + " | " + node.getPath());
>             }else{
>                 System.out.println(node.getName() + " | " +
> node.getPath());
>             }
>
>             Iterable<Node> nodes2 = JcrUtils.getChildNodes(node);
>             for (Node node2 : nodes2) {
>                 if( node2.isNodeType("mix:referenceable") ) {
>                     System.out.println("---" + node2.getName() + " | "
> + node2.getUUID() + " | " + node2.getPath());
>                 }else {
>                     System.out.println("---" + node2.getName()  + " |
> " + node2.getPath());
>                 }
>             }
>         }
>     }
>
>
>     private void addTestFolders(Session session) throws Exception
>     {
>         Node root = session.getNode("/");
>         JcrUtils.getOrAddFolder(root, "test1");
>         JcrUtils.getOrAddFolder(root, "test1/test1a");
>         JcrUtils.getOrAddFolder(root, "test2");
>         JcrUtils.getOrAddFolder(root, "test2/test2a");
>         session.save();
>     }
>
>
>     private void addTestFilesJCR(Session session) throws Exception
>     {
>         //InputStream is1 =
> this.getClass().getClassLoader().getResourceAsStream("image1.jpg");
>         //InputStream is2 =
> this.getClass().getClassLoader().getResourceAsStream("image2.jpg");
>
>         File file = new File("/Users/mnimer/Desktop/ScreenShot.png");
>         InputStream is1 = new FileInputStream(file);
>
>         Node rootNode = session.getNode("/test1");
>         if( !session.nodeExists("/file1") ) {
>
>             //create the file node - see section 6.7.22.6 of the spec
>             Node fileNode = rootNode.addNode (file.getName(), "nt:file");
>             fileNode.addMixin("mix:referenceable");
>
>             //create the mandatory child node - jcr:content
>             Node resNode = fileNode.addNode ("jcr:content", "nt:resource");
>             resNode.setProperty ("jcr:mimeType", "image/png");
>             resNode.setProperty ("jcr:data", new FileInputStream (file));
>             Calendar lastModified = Calendar.getInstance();
>             lastModified.setTimeInMillis (file.lastModified ());
>             resNode.setProperty ("jcr:lastModified", lastModified);
>
>
>             //Node img1 = JcrUtils.putFile(rootNode, "file1", "image/png",
> is1);
>             System.out.println(fileNode.getName() +" | "
> +fileNode.getUUID() +" | " +fileNode.getPath());
>         }
>
>         session.save();
>     }
>
>
>
>     private void addTestFilesWithJCRUtils(Session session) throws Exception
>     {
>         session.refresh(true);
>         //InputStream is1 =
> this.getClass().getClassLoader().getResourceAsStream("image1.jpg");
>         //InputStream is2 =
> this.getClass().getClassLoader().getResourceAsStream("image2.jpg");
>
>         File file = new File("/Users/mnimer/Desktop/ScreenShot.png");
>         InputStream is1 = new FileInputStream(file);
>
>         Node rootNode = session.getNode("/test1");
>         if( !session.nodeExists("/file1") ) {
>
>             Node fileNode = JcrUtils.putFile(rootNode, file.getName(),
> "image/png", new BufferedInputStream(new FileInputStream(file)) );
>
>             //Node img1 = JcrUtils.putFile(rootNode, "file1", "image/png",
> is1);
>             if( fileNode.hasNode("mix:referenceable") ) {
>                 System.out.println(fileNode.getName() + " | " +
> fileNode.getUUID() + " | " + fileNode.getPath());
>             }else{
>                 System.out.println(fileNode.getName()  + " | " +
> fileNode.getPath());
>             }
>         }
>
>         session.save();
>     }
>
>
>     private void addTestFilesWithBuilder(ContentSession session,
> SegmentStore store) throws Exception
>     {
>         Root root = session.getLatestRoot();
>         Tree rootTree = root.getTree("/");
>
>         NodeBuilder builder = store.getHead().builder();
>
>         File file = new File("/Users/mnimer/Desktop/ScreenShot.png");
>         //InputStream is1 = new FileInputStream(file);
>
>         String fileName = file.getName();
>         NodeBuilder fileNode = null;
>         if( builder.hasChildNode(fileName) ) {
>             fileNode = builder.getChildNode(fileName);
>         }else{
>             fileNode = builder.child(fileName);
>         }
>
>
>         fileNode.setProperty(JcrConstants.JCR_PRIMARYTYPE,
> JcrConstants.NT_FILE, Type.NAME);
>         NodeBuilder contentNode = fileNode.child(JcrConstants.JCR_CONTENT);
>         contentNode.setProperty(JcrConstants.JCR_PRIMARYTYPE,
> JcrConstants.NT_RESOURCE);
>
>         // set file contents
>         //Value[] binaryContent = new Value[1];
>         InputStream is = new FileInputStream(file);
>         //BinaryValue binaryValue = new BinaryValue(is);
>         Blob blob = contentNode.createBlob(is);
>         fileNode.setProperty(JcrConstants.JCR_CONTENT, blob, Type.BINARY);
>
>         //content.setProperty(JcrConstants.JCR_DATA, blobId);
>         session.getLatestRoot().commit();
>         //session.getLatestRoot().commit();
>
>     }
>
>
>     private void addTestFilesWithNodeUtil(ContentSession session,
> SegmentStore store) throws Exception
>     {
>         Root root = session.getLatestRoot();
>         Tree rootTree = root.getTree("/");
>         NodeUtil nodeUtil = new NodeUtil(rootTree);
>
>         File file = new File("/Users/mnimer/Desktop/ScreenShot.png");
>         //InputStream is = new FileInputStream(file);
>
>         String fileName = file.getName();
>         NodeUtil fileNode = nodeUtil.getOrAddChild(fileName,
> JcrConstants.NT_FILE);
>
>         fileNode.setString(JcrConstants.JCR_MIMETYPE, "image/png");
>
>         Calendar lastModified = Calendar.getInstance();
>         lastModified.setTimeInMillis(file.lastModified());
>         fileNode.setDate(JcrConstants.JCR_LASTMODIFIED,
> lastModified.getTimeInMillis());
>
>
>         NodeUtil contentNode =
> fileNode.getOrAddChild(JcrConstants.JCR_CONTENT,
> JcrConstants.NT_RESOURCE);
>         // set file contents
>         InputStream is = new FileInputStream(file);
>         Value[] binaryContent = new Value[1];
>         binaryContent[0] = new BinaryValue(is);
>         contentNode.setValues(JcrConstants.JCR_DATA, binaryContent);
>
>         session.getLatestRoot().commit();
>     }
>
>
>
>
>
>     private FileStore getNodeStore() throws Exception
>     {
>         File directory = new File("jcrTestRepo", "tarmk-"
> +System.currentTimeMillis());
>         final FileStore fileStore = new FileStore(directory, 1, false);
>         Runtime.getRuntime().addShutdownHook(new Thread(new Runnable()
>         {
>             @Override
>             public void run()
>             {
>                 fileStore.close();
>             }
>         }));
>
>         return fileStore;
>     }
>
>     private Oak getOak(SegmentStore store) throws Exception
>     {
>         return new Oak(new SegmentNodeStore(store));
>         //return new Oak(new SegmentNodeStore(memoryStore));
>     }
>
>     private Session getSession(Oak oak) throws Exception
>     {
>         SimpleCredentials credentials = new SimpleCredentials("admin",
> "admin".toCharArray());
>         Repository repository = new Jcr(oak).createRepository();
>         return repository.login(credentials, null);
>     }
>
>     private ContentSession getContentSession(Oak oak) throws Exception
>     {
>         SimpleCredentials credentials = new SimpleCredentials("admin",
> "admin".toCharArray());
>         ContentRepository repository = oak.createContentRepository();
>         return repository.login(credentials, "default");
>     }
>
> }
>
> ============================================================
>

Re: Adding a File Node

Posted by Davide Giannella <da...@apache.org>.
On 09/12/2014 19:08, Mike Nimer wrote:
> ...
> Here is the simple test class I'm using to verify this with 4
> different ways to create a file node. Based on what I can find online
> and digging through the unit tests.
>
Sorry Mike, didn't look at your class but you can find an example here

https://github.com/apache/jackrabbit-oak/blob/a6798b166514148e31c16153eabbf42d2de60a4b/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/SmallFileWriteTest.java#L53

HTH
Davide