class CacheableWorkspaceDataManager extends WorkspacePersistentDataManager implements Suspendable, Startable,
   WorkspaceStorageCacheListener {

   @Override
   public List<PropertyData> listChildPropertiesData(NodeData nodeData) throws RepositoryException
   {
      return listChildPropertiesData(nodeData, false);
   }

}

class TestCacheableWorkspaceDataManager {

   private static final int TOTAL_THREADS;
   private static final int TIMES;
   private static final int TOTAL_TIMES;
   private JcrImplBaseTest test;
   @Rule
   public ContiPerfRule rule;
   private final AtomicInteger step;
   private CyclicBarrier startSignal;
   private CacheableWorkspaceDataManager cwdm;
   private WorkspaceDataContainer wdc;
   private MyWorkspaceStorageConnection con;
   private NodeData nodeData;

   @Test
   @PerfTest(invocations = TOTAL_THREADS, threads = TOTAL_THREADS)
   public void testListChildPropertiesData() throws Exception
   {

      if (step.compareAndSet(0, 1))
      {
         nodeData = new PersistedNodeData("listChildPropertiesData", null, null, 0, 1, null, null, null);
      }
      assertEquals(0, con.listChildPropertiesDataCalls.get());
      startSignal.await();
      for (int i = 0; i < TIMES; i++)
      {
         List<PropertyData> properties = cwdm.listChildPropertiesData(nodeData);
         assertNotNull(properties);
         assertFalse(properties.isEmpty());
      }
      assertEquals(1, con.listChildPropertiesDataCalls.get());
      startSignal.await();
      for (int i = 0; i < TIMES; i++)
      {
         List<PropertyData> properties = cwdm.listChildPropertiesData(nodeData, true);
         assertNotNull(properties);
         assertFalse(properties.isEmpty());
      }
      startSignal.await();
      assertEquals(1 + TOTAL_TIMES, con.listChildPropertiesDataCalls.get());
   }

}