4 Replies Latest reply on Apr 12, 2012 7:11 PM by VFinet

    Connection to CRX via RMI and getting WeakReference value..... with an exception!

    VFinet

      Hi there,

       

       

      I have the following problem.

       

       

      I opened a ticket in Day Care Support system, about CRX users/group membership that got lost while synchronization with our LDAP server.

      Although when the user and the group had been created (and therefore taken from that same LDAP server), the membership was good.... but after some time the membership got lost......

       

       

      So what i am trying to do now is a Java program that connects to CRX via RMI.

      And gets the list of all the users from a group (aka membership).

      The idea is to monitor the membership each seconds.

       

       

      But when trying to get the property "rep:members" of the group, I have the following exception :

      javax.jcr.ValueFormatException: Unknown value type 10

                at org.apache.jackrabbit.rmi.server.ServerObject.getRepositoryException(ServerObject.java:13 9)

                at org.apache.jackrabbit.rmi.server.ServerProperty.getValues(ServerProperty.java:71)

                at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

                at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)

                at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)

                at java.lang.reflect.Method.invoke(Method.java:611)

                at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322)"

                ....

       

       

      I searched a little bit and found that "10" is the number for type WeakReference.

      That's normal to me because memberships are stored in the group as a list reference to users linked to that group....

       

       

      Anyways, what's not normal to me is that when the type is "10" the API does not let me get the Value (cf. ServerProperty.getValues() method)

       

       

      Here is the program:

      import java.util.HashMap;

       

       

      import java.util.Iterator;

      import java.util.Map;

       

       

      import javax.imageio.spi.ServiceRegistry;

      import javax.jcr.Node;

      import javax.jcr.NodeIterator;

      import javax.jcr.Property;

      import javax.jcr.PropertyIterator;

      import javax.jcr.Repository;

      import javax.jcr.RepositoryException;

      import javax.jcr.RepositoryFactory;

      import javax.jcr.Session;

      import javax.jcr.SimpleCredentials;

      import javax.jcr.Value;

       

       

      public class Test {

       

       

                public static void main(String[] args) {

       

                          String uri = "rmi://sma11c02.............:1234/crx";

                          String username = "admin";

                          char[] password = {....................};

                          String workspace = "crx.default";

                          String nodePath = "/home/groups/a";

       

                          Repository repository = null;

                          Session session = null;

                          try {

       

       

                                    // ---------------------------------------------------

                                    // Connection to repository via RMI

                                    // ---------------------------------------------------

                                    {

                                              Map<String, String> jcrParameters = new HashMap<String, String>();

                                              jcrParameters.put("org.apache.jackrabbit.repository.uri", uri);

                                              Iterator<RepositoryFactory> iterator = ServiceRegistry.lookupProviders(RepositoryFactory.class);

                                              while (null == repository && iterator.hasNext()) {

                                                        repository = iterator.next().getRepository(jcrParameters);

                                              }

                                    }

                                    if (repository == null) {

                                              throw new IllegalStateException("Problem with connection to the repository...");

                                    }

       

       

                                    // ---------------------------------------------------

                                    // Creation of a session to the workspace

                                    // ---------------------------------------------------

                                    session = repository.login(new SimpleCredentials(username, password), workspace);

                                    if (session == null) {

                                              throw new IllegalStateException("Problem with creation of session to the workspace...");

                                    }

       

                                    // ---------------------------------------------------

                                    // Get the targetted node

                                    // ---------------------------------------------------

                                    Node node = session.getNode(nodePath);

                                    System.out.println("Node : " + node.getName());

                                    System.out.println();

       

                                    PropertyIterator properties = node.getProperties();

                                    System.out.println("List of properties for this node :");

                                    while (properties.hasNext()) {

                                              Property property = properties.nextProperty();

                                              System.out.print("\t"+property.getName() + " : ");

                                              if (property.isMultiple()) {

                                                        Value[] values = property.getValues();

                                                        for (int i = 0; i < values.length; i++) {

                                                                  System.out.print(values[i]);

                                                                  if (i+1 != values.length) {

                                                                            System.out.print(", ");

                                                                  }

                                                        }

                                                        System.out.println();

                                              } else {

                                                        Value value = property.getValue();

                                                        System.out.println(value);

                                              }

                                    }

                                    System.out.println();

       

                                    NodeIterator kids = node.getNodes();

                                    System.out.println("List of children nodes for this node :");

                                    while (kids.hasNext()) {

                                              Node kid = kids.nextNode();

                                              System.out.println("\tChild node : "+kid.getName());

       

       

                                              PropertyIterator kidProperties = kid.getProperties();

                                              System.out.println("List of properties for this child :");

                                              while (kidProperties.hasNext()) {

                                                        Property property = kidProperties.nextProperty();

                                                        System.out.print("\t"+property.getName() + " : ");

                                                        if (property.isMultiple()) {

                                                                  Value[] values = property.getValues();

                                                                  for (int i = 0; i < values.length; i++) {

                                                                            System.out.print(values[i]);

                                                                            if (i+1 != values.length) {

                                                                                      System.out.print(", ");

                                                                            }

                                                                  }

                                                                  System.out.println();

                                                        } else {

                                                                  Value value = property.getValue();

                                                                  System.out.println(value);

                                                        }

                                              }

                                              System.out.println();

                                    }

                          } catch (RepositoryException e) {

                                    e.printStackTrace();

                          } finally {

                                    if (session != null) {

                                              session.logout();

                                    }

                          }

                }

      }

       

       

      Here is the output of the below program:

       

       

      Node : a

       

       

      List of properties for this node :

                jcr:createdBy : admin

                jcr:mixinTypes : mix:lockable

                jcr:created : 2011-10-25T16:58:48.140+02:00

                jcr:primaryType : rep:AuthorizableFolder

       

       

      List of children nodes for this node :

                Child node : administrators

      List of properties for this child :

                jcr:createdBy : admin

                rep:principalName : administrators

                rep:members : javax.jcr.ValueFormatException: Unknown value type 10

                at org.apache.jackrabbit.rmi.server.ServerObject.getRepositoryException(ServerObject.java:13 9)

                at org.apache.jackrabbit.rmi.server.ServerProperty.getValues(ServerProperty.java:71)

                at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

                at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)

                at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)

                at java.lang.reflect.Method.invoke(Method.java:611)

                at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322)

                at sun.rmi.transport.Transport$1.run(Transport.java:171)

                at java.security.AccessController.doPrivileged(AccessController.java:284)

                at sun.rmi.transport.Transport.serviceCall(Transport.java:167)

                at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:547)

                at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:802)

                at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:661)

                at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:897)

                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:919)

                at java.lang.Thread.run(Thread.java:736)

                at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)

                at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)

                at sun.rmi.server.UnicastRef.invoke(Unknown Source)

                at org.apache.jackrabbit.rmi.server.ServerProperty_Stub.getValues(Unknown Source)

                at org.apache.jackrabbit.rmi.client.ClientProperty.getValues(ClientProperty.java:173)

                at Test.main(Test.java:96)

       

       

      Here is the list of jar files i'm using with this program:

                2862818581          61388           crx-rmi-2.2.0.jar

                732434195           335603           jackrabbit-jcr-commons-2.4.0.jar

                1107929681           411330           jackrabbit-jcr-rmi-2.4.0.jar

                3096295771           69246           jcr-2.0.jar

                1206850944           367444           log4j-1.2.14.jar

                685167282           25962           slf4j-api-1.6.4.jar

                2025068856           9748           slf4j-log4j12-1.6.4.jar

       

       

      Finally, we are using CQ 5.4 (CRX 2.2) with the latest hotfix and under Websphere 7.0

       

       

      Best regards,

      Vincent FINET