Package com.google.enterprise.connector.jcr

Source Code of com.google.enterprise.connector.jcr.JcrDocumentTest

// Copyright 2006-2009 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package com.google.enterprise.connector.jcr;

import com.google.enterprise.connector.common.StringUtils;
import com.google.enterprise.connector.mock.MockRepository;
import com.google.enterprise.connector.mock.MockRepositoryDocument;
import com.google.enterprise.connector.mock.MockRepositoryEventList;
import com.google.enterprise.connector.mock.jcr.MockJcrNode;
import com.google.enterprise.connector.spi.Document;
import com.google.enterprise.connector.spi.Property;
import com.google.enterprise.connector.spi.RepositoryException;
import com.google.enterprise.connector.spi.SpiConstants;
import com.google.enterprise.connector.spi.Value;
import com.google.enterprise.connector.spiimpl.BinaryValue;

import junit.framework.TestCase;

import org.json.JSONException;
import org.json.JSONObject;

import javax.jcr.Node;

public class JcrDocumentTest extends TestCase {
  @Override
  public void tearDown() {
    // Reset the default time zone.
    Value.setFeedTimeZone("");
  }

  public final void testJcrDocument() throws RepositoryException {
    // We're comparing date strings here, so we need a fixed time zone.
    Value.setFeedTimeZone("GMT");

    {
      String json1 =
          "{\"timestamp\":\"10\",\"docid\":\"doc1\","
              + "\"content\":\"now is the time\", "
              + "\"google:displayurl\":\"http://www.sometesturl.com/test\""
              + ", \"google:lastmodified\":\"Tue, 15 Nov 1994 12:45:26 GMT\""
              + "}\r\n" + "";
      String date1 = "1970-01-01T00:00:10.000Z";
      String date2 = "Tue, 15 Nov 1994 12:45:26 GMT";
      Document document = makeDocumentFromJson(json1);

      validateProperty(document, SpiConstants.PROPNAME_LASTMODIFIED, date2);
      validateProperty(document, "jcr:lastModified", date1);
      validateProperty(document, SpiConstants.PROPNAME_CONTENT,
          "now is the time");
      validateProperty(document, SpiConstants.PROPNAME_DISPLAYURL,
          "http://www.sometesturl.com/test");

      int count = countProperties(document);
      assertEquals(5, count);
    }
    {
      String json1 =
          "{\"timestamp\":\"10\",\"docid\":\"doc1\","
              + "\"content\":\"now is the time\", "
              + "\"google:displayurl\":\"http://www.sometesturl.com/test\""
              + "}\r\n" + "";
      String date1 = "1970-01-01T00:00:10.000Z";
      Document document = makeDocumentFromJson(json1);
      validateProperty(document, SpiConstants.PROPNAME_LASTMODIFIED, date1);
      validateProperty(document, SpiConstants.PROPNAME_CONTENT,
          "now is the time");
      validateProperty(document, SpiConstants.PROPNAME_DISPLAYURL,
          "http://www.sometesturl.com/test");

      int count = countProperties(document);
      assertEquals(4, count);
    }
  }

  private void validateProperty(Document document, String name,
      String expectedValue) throws RepositoryException {
    Value v = document.findProperty(name).nextValue();
    if (v instanceof BinaryValue) {
      // Note this won't work for streams that originate as binary files or
      // documents since the call to streamToString() will mangle the
      // characters.  For this test case, all these originate as plain text.
      assertEquals(expectedValue,
          StringUtils.streamToString(((BinaryValue) v).getInputStream()));
    } else {
      assertEquals(expectedValue, v.toString());
    }
  }

  public int countProperties(Document document)
      throws RepositoryException {
    int counter = 0;
    System.out.println();
    for (String name : document.getPropertyNames()) {
      Property property = document.findProperty(name);
      assertNotNull(property);
      Value value = property.nextValue();
      assertNotNull(value);
      System.out.print(name);
      System.out.print("(");
      String type = value.getClass().getName();
      System.out.print(type);
      System.out.print(") ");
      String valueString = value.toString();
      System.out.print(valueString);
      System.out.println();
      counter++;
    }
    return counter;
  }

  public static Document makeDocumentFromJson(String jsonString) {
    JSONObject jo;
    try {
      jo = new JSONObject(jsonString);
    } catch (JSONException e) {
      throw new IllegalArgumentException("test input can not be parsed");
    }
    MockRepositoryDocument mockDocument = new MockRepositoryDocument(jo);
    MockJcrNode node = new MockJcrNode(mockDocument);
    Document document = new JcrDocument(node);
    return document;
  }

  public final void testJcrDocumentFromMockRepo() throws RepositoryException {
    MockRepositoryEventList mrel =
        new MockRepositoryEventList("MockRepositoryEventLog3.txt");
    MockRepository r = new MockRepository(mrel);
    MockRepositoryDocument doc = r.getStore().getDocByID("doc1");
    Node node = new MockJcrNode(doc);
    Document document = new JcrDocument(node);
    countProperties(document);
  }

  public void testNoAcl() throws RepositoryException {
    Document document = extractJcrDocument("MockRepositoryEventLogAcl.txt",
                                           "no_acl");
    // Should not have ACL properties.
    assertNull(document.findProperty(SpiConstants.PROPNAME_ACLUSERS));
    assertNull(document.findProperty(SpiConstants.PROPNAME_ACLGROUPS));
  }

  public void testUserAcl() throws RepositoryException {
    Document document = extractJcrDocument("MockRepositoryEventLogAcl.txt",
                                           "user_acl");
    // ACL=[joe,mary,admin]
    JcrProperty property =
        (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLUSERS);
    assertNotNull(property);
    assertContainsScope("joe", property);
    // Note, have to refresh the property each time since it's nextValue()
    // method is stateful.
    property =
        (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLUSERS);
    assertContainsScope("mary", property);
    property =
        (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLUSERS);
    assertContainsScope("admin", property);
    assertNull(document.findProperty(SpiConstants.PROPNAME_ACLGROUPS));
  }

  public void testUserRoleAcl() throws RepositoryException {
    Document document = extractJcrDocument("MockRepositoryEventLogAcl.txt",
                                           "user_role_acl");
    // ACL=["joe=reader","mary=reader,writer","admin=owner"]
    // joe=reder
    JcrProperty property =
        (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLUSERS);
    assertNotNull(property);
    assertContainsScope("joe", property);
    JcrProperty scopeRoles = (JcrProperty) document.findProperty(
        SpiConstants.USER_ROLES_PROPNAME_PREFIX + "joe");
    assertNotNull(scopeRoles);
    assertContainsRole("reader", scopeRoles);
    // mary=reader,writer
    property =
        (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLUSERS);
    assertContainsScope("mary", property);
    scopeRoles = (JcrProperty) document.findProperty(
        SpiConstants.USER_ROLES_PROPNAME_PREFIX + "mary");
    assertNotNull(scopeRoles);
    assertContainsRole("reader", scopeRoles);
    scopeRoles = (JcrProperty) document.findProperty(
        SpiConstants.USER_ROLES_PROPNAME_PREFIX + "mary");
    assertContainsRole("writer", scopeRoles);
    // admin=owner
    property =
        (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLUSERS);
    assertContainsScope("admin", property);
    scopeRoles = (JcrProperty) document.findProperty(
        SpiConstants.USER_ROLES_PROPNAME_PREFIX + "admin");
    assertNotNull(scopeRoles);
    assertContainsRole("owner", scopeRoles);
    // No groups.
    assertNull(document.findProperty(SpiConstants.PROPNAME_ACLGROUPS));
  }

  public void testScopedRoleAcl() throws RepositoryException {
    Document document = extractJcrDocument("MockRepositoryEventLogAcl.txt",
                                           "user_scoped_role_acl");
    // ACL=["user:joe=reader","user:mary=reader,writer","user:admin=owner"]
    // user:joe=reader
    JcrProperty property =
      (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLUSERS);
    assertNotNull(property);
    assertContainsScope("joe", property);
    JcrProperty scopeRoles = (JcrProperty) document.findProperty(
        SpiConstants.USER_ROLES_PROPNAME_PREFIX + "joe");
    assertNotNull(scopeRoles);
    assertContainsRole("reader", scopeRoles);
    // user:mary=reader,writer
    property =
        (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLUSERS);
    assertContainsScope("mary", property);
    scopeRoles = (JcrProperty) document.findProperty(
        SpiConstants.USER_ROLES_PROPNAME_PREFIX + "mary");
    assertNotNull(scopeRoles);
    assertContainsRole("reader", scopeRoles);
    scopeRoles = (JcrProperty) document.findProperty(
        SpiConstants.USER_ROLES_PROPNAME_PREFIX + "mary");
    assertContainsRole("writer", scopeRoles);
    // user:admin=owner
    property =
        (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLUSERS);
    assertContainsScope("admin", property);
    scopeRoles = (JcrProperty) document.findProperty(
        SpiConstants.USER_ROLES_PROPNAME_PREFIX + "admin");
    assertNotNull(scopeRoles);
    assertContainsRole("owner", scopeRoles);
    // No groups.
    assertNull(document.findProperty(SpiConstants.PROPNAME_ACLGROUPS));
  }

  public void testUserGroupAcl() throws RepositoryException {
    Document document = extractJcrDocument("MockRepositoryEventLogAcl.txt",
                                           "user_group_acl");
    // ACL=["user:joe","user:mary","group:eng"]
    JcrProperty property =
        (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLUSERS);
    assertNotNull(property);
    assertContainsScope("joe", property);
    property =
        (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLUSERS);
    assertContainsScope("mary", property);
    property =
        (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLGROUPS);
    assertNotNull(property);
    assertContainsScope("eng", property);
  }

  public void testUserGroupRoleAcl() throws RepositoryException {
    Document document = extractJcrDocument("MockRepositoryEventLogAcl.txt",
                                           "user_group_role_acl");
    // ACL=["user:joe=reader","user:mary=reader,writer","group:eng=reader"]
    // user:joe=reader
    JcrProperty property =
        (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLUSERS);
    assertNotNull(property);
    assertContainsScope("joe", property);
    JcrProperty scopeRoles = (JcrProperty) document.findProperty(
        SpiConstants.USER_ROLES_PROPNAME_PREFIX + "joe");
    assertNotNull(scopeRoles);
    assertContainsRole("reader", scopeRoles);
    // user:mary=reader,writer
    property =
        (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLUSERS);
    assertContainsScope("mary", property);
    scopeRoles = (JcrProperty) document.findProperty(
        SpiConstants.USER_ROLES_PROPNAME_PREFIX + "mary");
    assertNotNull(scopeRoles);
    assertContainsRole("reader", scopeRoles);
    scopeRoles = (JcrProperty) document.findProperty(
        SpiConstants.USER_ROLES_PROPNAME_PREFIX + "mary");
    assertContainsRole("writer", scopeRoles);
    // group:eng=reader
    property =
        (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLGROUPS);
    assertNotNull(property);
    assertContainsScope("eng", property);
    scopeRoles = (JcrProperty) document.findProperty(
        SpiConstants.GROUP_ROLES_PROPNAME_PREFIX + "eng");
    assertNotNull(scopeRoles);
    assertContainsRole("reader", scopeRoles);
  }

  public void testUserReaderAcl() throws RepositoryException {
    Document document = extractJcrDocument("MockRepositoryEventLogAcl.txt",
                                           "user_reader_acl");
    // ACL=joe
    JcrProperty property =
        (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLUSERS);
    assertNotNull(property);
    assertContainsScope("joe", property);
    assertNull(document.findProperty(SpiConstants.PROPNAME_ACLGROUPS));
  }

  public void testUserOwnerAcl() throws RepositoryException {
    Document document = extractJcrDocument("MockRepositoryEventLogAcl.txt",
                                           "user_owner_acl");
    // ACL = joe=owner
    JcrProperty property =
        (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLUSERS);
    assertNotNull(property);
    assertContainsScope("joe", property);
    JcrProperty scopeRoles = (JcrProperty) document.findProperty(
        SpiConstants.USER_ROLES_PROPNAME_PREFIX + "joe");
    assertNotNull(scopeRoles);
    assertContainsRole("owner", scopeRoles);
    assertNull(document.findProperty(SpiConstants.PROPNAME_ACLGROUPS));
  }

  public void testScopedOwnerAcl() throws RepositoryException {
    Document document = extractJcrDocument("MockRepositoryEventLogAcl.txt",
                                           "user_scoped_owner_acl");
    // ACL = user:joe=owner
    JcrProperty property =
        (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLUSERS);
    assertNotNull(property);
    assertContainsScope("joe", property);
    JcrProperty scopeRoles = (JcrProperty) document.findProperty(
        SpiConstants.USER_ROLES_PROPNAME_PREFIX + "joe");
    assertNotNull(scopeRoles);
    assertContainsRole("owner", scopeRoles);
    assertNull(document.findProperty(SpiConstants.PROPNAME_ACLGROUPS));
  }

  public void testSameUserGroupAcl() throws RepositoryException {
    Document document = extractJcrDocument("MockRepositoryEventLogAcl.txt",
                                           "same_user_group_acl");
    // ACL = ["user:root=owner","group:root=reader,writer"]
    // user:root=owner
    JcrProperty property =
        (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLUSERS);
    assertNotNull(property);
    assertContainsScope("root", property);
    JcrProperty scopeRoles = (JcrProperty) document.findProperty(
        SpiConstants.USER_ROLES_PROPNAME_PREFIX + "root");
    assertNotNull(scopeRoles);
    assertContainsRole("owner", scopeRoles);
    // group:root=reader
    property =
        (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLGROUPS);
    assertNotNull(property);
    assertContainsScope("root", property);
    scopeRoles = (JcrProperty) document.findProperty(
        SpiConstants.GROUP_ROLES_PROPNAME_PREFIX + "root");
    assertNotNull(scopeRoles);
    assertContainsRole("reader", scopeRoles);
  }

  public void testSomeUserRoleAcl() throws RepositoryException {
    Document document = extractJcrDocument("MockRepositoryEventLogAcl.txt",
                                           "some_user_role_acl");
    // ACL = ["user:joe","user:mary=reader,writer","group:eng","group:root"]
    // user:joe
    JcrProperty property =
        (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLUSERS);
    assertNotNull(property);
    assertContainsScope("joe", property);
    assertNull(document.findProperty(
        SpiConstants.USER_ROLES_PROPNAME_PREFIX + "joe"));
    // user:mary=reader,writer
    property =
        (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLUSERS);
    assertContainsScope("mary", property);
    JcrProperty scopeRoles = (JcrProperty) document.findProperty(
        SpiConstants.USER_ROLES_PROPNAME_PREFIX + "mary");
    assertNotNull(scopeRoles);
    assertContainsRole("reader", scopeRoles);
    scopeRoles = (JcrProperty) document.findProperty(
        SpiConstants.USER_ROLES_PROPNAME_PREFIX + "mary");
    assertContainsRole("writer", scopeRoles);
    // group:eng
    property =
        (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLGROUPS);
    assertNotNull(property);
    assertContainsScope("eng", property);
    assertNull(document.findProperty(
        SpiConstants.GROUP_ROLES_PROPNAME_PREFIX + "eng"));
    // group:root
    property =
        (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLGROUPS);
    assertContainsScope("eng", property);
    assertNull(document.findProperty(
        SpiConstants.GROUP_ROLES_PROPNAME_PREFIX + "root"));
  }

  public void testSomeGroupRoleAcl() throws RepositoryException {
    Document document = extractJcrDocument("MockRepositoryEventLogAcl.txt",
                                           "some_group_role_acl");
    // ACL = ["user:joe","user:mary","group:eng=reader,writer","group:root"]
    // user:joe
    JcrProperty property =
        (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLUSERS);
    assertNotNull(property);
    assertContainsScope("joe", property);
    assertNull(document.findProperty(
        SpiConstants.USER_ROLES_PROPNAME_PREFIX + "joe"));
    // user:mary
    property =
        (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLUSERS);
    assertContainsScope("mary", property);
    assertNull(document.findProperty(
        SpiConstants.USER_ROLES_PROPNAME_PREFIX + "mary"));
    // group:eng
    property =
        (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLGROUPS);
    assertNotNull(property);
    assertContainsScope("eng", property);
    JcrProperty scopeRoles = (JcrProperty) document.findProperty(
        SpiConstants.GROUP_ROLES_PROPNAME_PREFIX + "eng");
    assertNotNull(scopeRoles);
    assertContainsRole("reader", scopeRoles);
    scopeRoles = (JcrProperty) document.findProperty(
        SpiConstants.GROUP_ROLES_PROPNAME_PREFIX + "eng");
    assertContainsRole("writer", scopeRoles);
    // group:root
    property =
        (JcrProperty) document.findProperty(SpiConstants.PROPNAME_ACLGROUPS);
    assertContainsScope("eng", property);
    assertNull(document.findProperty(
        SpiConstants.GROUP_ROLES_PROPNAME_PREFIX + "root"));
  }

  private Document extractJcrDocument(String eventLog, String docid) {
    MockRepositoryEventList mrel = new MockRepositoryEventList(eventLog);
    MockRepository r = new MockRepository(mrel);
    MockRepositoryDocument doc = r.getStore().getDocByID(docid);
    Node node = new MockJcrNode(doc);
    return new JcrDocument(node);
  }

  private void assertContainsScope(String scopeId, JcrProperty aclProp)
      throws RepositoryException {
    Value v = null;
    while ((v = aclProp.nextValue()) != null) {
      String aclScopeId = v.toString();
      if (scopeId.equals(aclScopeId)) {
        return;
      }
    }
    fail("aclProp does not contain scope (" + scopeId + ")");
  }

  private void assertContainsRole(String role, JcrProperty rolesProp)
      throws RepositoryException {
    Value v = null;
    // Don't assume any default roles.
    while ((v = rolesProp.nextValue()) != null) {
      String aclRole = v.toString();
      if (role.equals(aclRole)) {
        return;
      }
    }
    fail("rolesProp does not contain role=" + role);
  }
}
TOP

Related Classes of com.google.enterprise.connector.jcr.JcrDocumentTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.