Hi,

I have try the latest Slide (nightly build) with
Oracle db as descriptor store
(slidestore.reference.JDBCDescriptorsStore) and file
as content store
(slidestore.reference.FileContentStore) for version. I
create a subject /test with several revisions on it. I
also do fork on them. For example, 

/test
1.0->1.1->1.2->1.3 (main)
       \
        \
         1.1.1->1.1.2->1.1.3->1.1.4 (brach2)
                    \
                     \
                      1.1.2.1->1.1.2.2 (branch3)

In the same test, I call
revisionDescriptors.enumerateBranchNames() to get all
latest RevisionNumber for each branches. From the
method name enumerateBranchNames(), it should return
branch names, but it returns the latest branch
revision number. It returns: 1.4, 1.1.4, 1.1.2.2.

Then, I call
revisionDescriptors.enumerateRevisionNumbers() to get
all revisions for /test. It returns: 1.0, 1.1, 1.2,
1.3, 1.4 and 1.1.2. Rest of revisions in the branches
are missing.

I call revisionDescriptors.getSuccessors(revNum) to
pass in the revision to find its successor. It
returns:
1.0 has successors 1.1
1.1 has successors 1.1.1, 1.1.2, 1.1.3, 1.1.2.2, 1.2
1.2 has successors 1.3
1.3 has successors 1.1.4, 1.4

>From above results, it is very hard to figure out the
revision tree structure except basing on the number
like 1.1, 1.1.1, 1.3, etc.

In above test (please see my Test2.java attached in
this mail), creation and retrieving of revisions are
in same program. I comment out the creation part of
test and just run the retrieving part of test. 

The revisionDescriptors.enumerateBranchNames() returns
main branch and 1.4.

The revisionDescriptors.enumerateRevisionNumbers()
returns all the revisions.

The revisionDescriptors.getSuccessors(revNum) just
returns 1.0.

1. It is hard to get revision tree from Slide API.
Please correct me if I do something wrong. 

2. Some info are not stored in the db. For example,
revision successor info only exists at runtime. The
branches table is empty. 

3. Content.fork() method does not save the current
NodeDescriptor's property into db. The implementation
of Content.fork() use the base NodeDescriptor, not the
current NodeDescriptor. So the current
NodeDescriptor's properties are not stored into the
db.

If you have try the revision feature on Slide, please
share your experience. Any comments are welcome.

I enclose my Test2.java for your reference.

Thanks in advance,
Ting 

__________________________________________________
Do You Yahoo!?
Send FREE video emails in Yahoo! Mail!
http://promo.yahoo.com/videomail/
/**
 * Redistribution and use of this software and associated documentation
 * ("Software"), with or without modification, are permitted provided
 * that the following conditions are met:
 *
 * 1. Redistributions of source code must retain copyright
 *    statements and notices.  Redistributions must also contain a
 *    copy of this document.
 *
 * 2. Redistributions in binary form must reproduce the
 *    above copyright notice, this list of conditions and the
 *    following disclaimer in the documentation and/or other
 *    materials provided with the distribution.
 *
 * 3. The name "Exolab" must not be used to endorse or promote
 *    products derived from this Software without prior written
 *    permission of Exoffice Technologies.  For written permission,
 *    please contact [EMAIL PROTECTED]
 *
 * 4. Products derived from this Software may not be called "Exolab"
 *    nor may "Exolab" appear in their names without prior written
 *    permission of Exoffice Technologies. Exolab is a registered
 *    trademark of Exoffice Technologies.
 *
 * 5. Due credit should be given to the Exolab Project
 *    (http://www.exolab.org/).
 *
 * THIS SOFTWARE IS PROVIDED BY EXOFFICE TECHNOLOGIES AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
 * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
 * EXOFFICE TECHNOLOGIES OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * Copyright 1999 (C) Exoffice Technologies Inc. All Rights Reserved.
 *
 * $Id: Test.java,v 1.1 2000/12/04 01:41:49 remm Exp $
 */

import java.util.Enumeration;
import java.util.Vector;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Date;
import org.apache.slide.structure.*;
import org.apache.slide.content.*;
import org.apache.slide.common.*;
import org.apache.slide.lock.*;
import org.apache.slide.security.*;
import org.apache.slide.authenticate.CredentialsToken;
import org.apache.slide.authenticate.SecurityToken;

/**
 * This is a test class for versioning support.
 */
public class Test2 {

    public static void main(String[] args) {
        
        NamespaceAccessToken token = null;
        
        try {
            
            token = Domain.accessNamespace(new SecurityToken(new String()), 
                                           "version");
            
            Structure structure = token.getStructureHelper();
            Security security = token.getSecurityHelper();
            Lock lock = token.getLockHelper();
            Content content = token.getContentHelper();
            
            CredentialsToken credToken = 
                new CredentialsToken(new String("root"));
            SlideToken slideToken = new SlideTokenImpl(credToken);

            NodeRevisionContent rc = new NodeRevisionContent();

            // Test subject
            String subj = "/test.c";

            NodeRevisionDescriptors revisionDescriptors = null;
            NodeRevisionDescriptor revisionDescriptor = null;

            System.out.println("Creating a subject: " + subj);
            token.begin();
            SubjectNode subject = new SubjectNode();
            structure.create(slideToken, subject, subj);
            
            // Creating a versioned revision descriptors
            System.out.println("Creating a versioned revision descriptors");
            content.create(slideToken, subj, true);
            token.commit();

            revisionDescriptors = content.retrieve(slideToken, subj);
            
            // Now creating some revisions
            revisionDescriptor = new NodeRevisionDescriptor(0);
            
            System.out.println("Creating version 1.0");
            token.begin();
            revisionDescriptor.setProperty("revision", "1.0");
            revisionDescriptor.setProperty("home", "1245 Sajak Ave");
            rc.setContent("This is NodeRevisionContent Rev. 1.0".toCharArray());
            content.create(slideToken, subj, revisionDescriptor, rc);
            token.commit();

            System.out.println("Creating version 1.1");
            token.begin();
            revisionDescriptor = content.retrieve
                (slideToken, revisionDescriptors);
            revisionDescriptor.setProperty("revision", "1.1");
            revisionDescriptor.setProperty("phone", "408-453-3331");
            rc.setContent("This is NodeRevisionContent Rev. 1.1".toCharArray());
            content.create(slideToken, subj, revisionDescriptor, rc);
            token.commit();

            System.out.println("Create branch2 on latest revision");
            token.begin();
            revisionDescriptor = content.retrieve
                (slideToken, revisionDescriptors);
            revisionDescriptor.setProperty("revision", "1.1.1");
            content.fork(slideToken, subj, "branch2", revisionDescriptor);
            token.commit();

            System.out.println("Creating revision 1.1.2 on branch2");
            token.begin();
            revisionDescriptor = content.retrieve
                (slideToken, revisionDescriptors, "branch2");
            revisionDescriptor.setProperty("revision", "1.1.2");
            rc.setContent("This is NodeRevisionContent Rev. 1.1.2".toCharArray());
            content.create(slideToken, subj, "branch2", 
                           revisionDescriptor, rc);
            token.commit();

            System.out.println("Create branch3 on branch2");
            token.begin();
            revisionDescriptor = content.retrieve
                (slideToken, revisionDescriptors, "branch2");
            revisionDescriptor.setProperty("revision", "1.1.2.1");
            content.fork(slideToken, subj, "branch3", revisionDescriptor);
            token.commit();

            System.out.println("Creating revision 1.1.3 on branch2");
            token.begin();
            revisionDescriptor = content.retrieve
                (slideToken, revisionDescriptors, "branch2");
            revisionDescriptor.setProperty("revision", "1.1.3");
            rc.setContent("This is NodeRevisionContent Rev. 1.1.3".toCharArray());
            content.create(slideToken, subj, "branch2", revisionDescriptor,
                           rc);
            token.commit();

            System.out.println("Creating revision 1.1.2.2 on branch3");
            token.begin();
            revisionDescriptor = content.retrieve
                (slideToken, revisionDescriptors, "branch3");
            revisionDescriptor.setProperty("revision", "1.1.2.2");
            rc.setContent("This is NodeRevisionContent Rev. 1.1.2.2".toCharArray());
            content.create(slideToken, subj, "branch3", revisionDescriptor,
                           rc);
            token.commit();

            System.out.println("Creating revision 1.2 on main branch");
            token.begin();
            revisionDescriptor = content.retrieve
                (slideToken, revisionDescriptors);
            revisionDescriptor.setProperty("revision", "1.2");
            rc.setContent("This is NodeRevisionContent Rev. 1.2".toCharArray());
            content.create(slideToken, subj, revisionDescriptor, rc);
            token.commit();

            System.out.println("Creating revision 1.3");
            token.begin();
            revisionDescriptor = content.retrieve
                (slideToken, revisionDescriptors);
            revisionDescriptor.setProperty("revision", "1.3");
            rc.setContent("This is NodeRevisionContent Rev. 1.3".toCharArray());
            content.create(slideToken, subj, revisionDescriptor, rc);
            token.commit();

            System.out.println("Creating revision 1.1.4 on branch2");
            token.begin();
            revisionDescriptor = content.retrieve
                (slideToken, revisionDescriptors, "branch2");
            revisionDescriptor.setProperty("revision", "1.1.4");
            rc.setContent("This is NodeRevisionContent Rev. 1.1.4".toCharArray());
            content.create(slideToken, subj, "branch2", revisionDescriptor,
                           rc);
            token.commit();

            System.out.println("Creating revision 1.4");
            token.begin();
            revisionDescriptor = content.retrieve
                (slideToken, revisionDescriptors);
            revisionDescriptor.setProperty("revision", "1.4");
            rc.setContent("This is NodeRevisionContent Rev. 1.4".toCharArray());
            content.create(slideToken, subj, revisionDescriptor, rc);
            token.commit();

            // Retrieving all branches
            System.out.println("\n\nGet all branches");
            revisionDescriptors = content.retrieve(slideToken, subj);
            Enumeration branches = revisionDescriptors.enumerateBranchNames();
            while (branches.hasMoreElements())
            {
              String branch = (String) branches.nextElement();
              revisionDescriptor = 
                content.retrieve(slideToken, revisionDescriptors, branch);
              System.out.println("Branch=" + branch 
                                 + "  RevisionNumber=" 
                                 + revisionDescriptor.getRevisionNumber()
                                 + "  Revision=" 
                                 + revisionDescriptor.getProperty("revision")
                                 .getValue());
            }

            // Retrieving all revision numbers
            System.out.println("\n\nGet all revision numbers");
            Enumeration revisions = 
              revisionDescriptors.enumerateRevisionNumbers();
            if (null != revisions)
              while (revisions.hasMoreElements())
              {
                NodeRevisionNumber revision = 
                  (NodeRevisionNumber) revisions.nextElement();
                revisionDescriptor = 
                  content.retrieve(slideToken, revisionDescriptors, revision);
                System.out.println("RevisionNumber=" 
                                   + revisionDescriptor.getRevisionNumber()
                                   + "  Revision=" 
                                   + revisionDescriptor.getProperty("revision")
                                   .getValue());
              }

            // Build the revision tree
            System.out.println("\n\nGet revision successor tree");
            NodeRevisionNumber initRevNum = 
              revisionDescriptors.getInitialRevision();
            Test2.revTree(slideToken, content, initRevNum, 
                          revisionDescriptors, "");
            
        } catch (Throwable e) {
            e.printStackTrace();
        } finally {
            System.out.println("Closing data sources");
            Domain.closeNamespace(token);
        }
    }    

  public static void revTree(SlideToken slideToken,
                             Content content,
                             NodeRevisionNumber revNum,
                             NodeRevisionDescriptors revisionDescriptors,
                             String space)
  {
    NodeRevisionDescriptor revisionDescriptor = null;
    NodeRevisionContent revCon = null;

    try
    {
      revisionDescriptor =
        content.retrieve(slideToken, revisionDescriptors, revNum);
      revCon =
        content.retrieve(slideToken, revisionDescriptors, revisionDescriptor);
    }
    catch (Exception ex)
    {
      ex.printStackTrace();
    }
    
    String str = new String(revCon.getContent());

    System.out.println(space + "RevisionNumber=" + revNum +
                       "  Revision=" + 
revisionDescriptor.getProperty("revision").getValue());
                       // " Content: " + str);

    Enumeration succ = revisionDescriptors.getSuccessors(revNum);
    if (null != succ)
      while (succ.hasMoreElements())
      {
        NodeRevisionNumber nextRevNum = 
          (NodeRevisionNumber) succ.nextElement();
        /*
        System.out.println(space + "RevisionNumber=" + revNum +
                           "  Successor Revision=" + nextRevNum);
        */
        Test2.revTree(slideToken, content, nextRevNum, 
                      revisionDescriptors, space + "  ");
      }
  }
}





--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to