Well, i'm really stucked.
I created this code (see attachment) to create respository. It creates
5-leaves tree with depth = 5. (each node has 6 children nodes and 10
properties).

I started this at 5:20 PM and it is 6:30 PM now, but it's still working.
It seem to create complete tree with 30 minutes, and started to write it on
the disk. Previous time it wrote 19300 nodes (or soemthing like this) in 1.5
hour.

Is it normal?
-- 
Eugene N Dzhurinsky
import java.util.Date;
import java.util.Hashtable;

import javax.jcr.ItemExistsException;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.PathNotFoundException;
import javax.jcr.Property;
import javax.jcr.PropertyIterator;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import javax.jcr.UnsupportedRepositoryOperationException;
import javax.jcr.Value;
import javax.jcr.ValueFormatException;
import javax.jcr.lock.LockException;
import javax.jcr.nodetype.ConstraintViolationException;
import javax.jcr.nodetype.NoSuchNodeTypeException;
import javax.jcr.query.Query;
import javax.jcr.query.QueryResult;
import javax.jcr.version.VersionException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import org.apache.jackrabbit.core.jndi.RegistryHelper;
import org.apache.jackrabbit.core.value.BLOBFileValue;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class JCRTest {

    private static final int SAVE_INTERVAL = 20000;

    private static final int PROPERTY_COUNT = 10;

    private static final int CHILD_NODE_COUNT = 5;

    private static final String RANDOM_NODE_NAME = "random";

    private static final String TEST_NODE_TYPE = "nt:unstructured";

    private static final Logger log = Logger.getLogger(JCRTest.class);

    Session session;

    Date d = null;

    long totalNodesCreated = 0;

    long buildTime = 0;

    long traverseTime = 0;

    long searchTime = 0;

    public JCRTest() throws NamingException, RepositoryException {
        PropertyConfigurator.configure("log4j.properties");
        String configFile = "repotest/repository.xml";
        String repHomeDir = "repotest";

        Hashtable env = new Hashtable();
        env
                .put(Context.INITIAL_CONTEXT_FACTORY,
                        "org.apache.jackrabbit.core.jndi.provider.DummyInitialContextFactory");
        env.put(Context.PROVIDER_URL, "localhost");
        InitialContext ctx = new InitialContext(env);

        RegistryHelper.registerRepository(ctx, "repo", configFile, repHomeDir,
                true);
        Repository r = (Repository) ctx.lookup("repo");
        session = r.login(new SimpleCredentials("userid", "".toCharArray()),
                null);
    }

    public void runTest() {
        try {
            Node rn = session.getRootNode();
            log.debug("Creating random node");
            Date start = new Date();
            if (!rn.hasNode(RANDOM_NODE_NAME)) {
                Node root = rn.addNode(RANDOM_NODE_NAME, TEST_NODE_TYPE);
                buildNode(root, 1);
                session.save();
            }
            Date stop = new Date();
            buildTime = (stop.getTime() - start.getTime());
            start = new Date();
            if (rn.hasNode(RANDOM_NODE_NAME)) {
                log.debug("Traversing back");
                Node root = rn.getNode(RANDOM_NODE_NAME);
                log.debug(root.getPath());
                traverseNode(root);
            }
            stop = new Date();
            traverseTime = stop.getTime() - start.getTime();
            start = new Date();
            Node n = rn.getNode(RANDOM_NODE_NAME + "/node1_3/node2_1/node3_3");
            stop = new Date();
            searchTime = stop.getTime() - start.getTime();
            dump(n);
            String query = "//*[jcr:contains(@prop, '3_3_9')]";
            log.debug(query);
            Query q = session.getWorkspace().getQueryManager().createQuery(
                    query, javax.jcr.query.Query.XPATH);
            start = new Date();
            QueryResult queryResult = q.execute();
            stop = new Date();
            NodeIterator nodeIterator = queryResult.getNodes();
            log.debug("Found " + nodeIterator.getSize() + " nodes in "
                    + (stop.getTime() - start.getTime()));
            while (nodeIterator.hasNext()) {
                dump(nodeIterator.nextNode());
            }
            log
                    .debug("Build " + totalNodesCreated + " in " + buildTime
                            + " ms");
            log.debug("Traverse " + totalNodesCreated + " in " + traverseTime
                    + " ms");
            log.debug("node  found in " + searchTime + " ms");
        } catch (Exception e) {
            log.error(e, e);
        } finally {
            session.logout();
        }
    }

    private void traverseNode(Node root) throws RepositoryException {
        if (root.hasNodes()) {
            NodeIterator it = root.getNodes();
            while (it.hasNext()) {
                Node n = it.nextNode();
                log.debug(n.getPath());
                traverseNode(n);
            }
        }
    }

    private void buildNode(Node root, int level) throws ItemExistsException,
            PathNotFoundException, NoSuchNodeTypeException, LockException,
            VersionException, ConstraintViolationException,
            RepositoryException, ValueFormatException,
            UnsupportedRepositoryOperationException {
        for (int i = 1; i <= CHILD_NODE_COUNT; i++) {
            Node n = root.addNode("node" + level + "_" + i, TEST_NODE_TYPE);
            if (++totalNodesCreated % SAVE_INTERVAL == 0) {
                long time = -1;
                if (d != null) {
                    Date current = new Date();
                    time = current.getTime() - d.getTime();
                    d = current;
                } else
                    d = new Date();
                log.debug("Saving session with " + totalNodesCreated
                        + (time > 0 ? " in " + time + " ms" : ""));
                session.save();
                log.debug("Session saved");
            }
            for (int j = 0; j < PROPERTY_COUNT; j++) {
                n.setProperty("prop_blob", new BLOBFileValue((level + "_" + i
                        + "_" + j).getBytes()));
                n.setProperty("prop", session.getValueFactory().createValue(
                        level + "_" + i + "_" + j));
            }
            if (level <= CHILD_NODE_COUNT)
                buildNode(n, level + 1);
        }
    }

    public void dump(Node n) throws RepositoryException {
        log.info(n.getPath());
        PropertyIterator pit = n.getProperties();
        while (pit.hasNext()) {
            Property p = pit.nextProperty();
            StringBuffer b = new StringBuffer(p.getPath() + "=");
            if (p.getDefinition().isMultiple()) {
                Value[] values = p.getValues();
                for (int i = 0; i < values.length; i++) {
                    b.append(values[i].getString());
                    if (i < values.length - 1)
                        b.append(',');
                }
            } else {
                b.append(p.getString());
            }
            log.info(b);
        }
    }

    public static void main(String[] args) throws Exception {
        JCRTest test = new JCRTest();
        test.runTest();
    }

}

Attachment: repository.xml
Description: application/xml

Reply via email to