private static TransactionContext createLocalTransactionContext(
      final LocalTransactionFactory factory, final TransactionProxy parent) {

    switch (parent.getType()) {
      case READ_ONLY:
        final DOMStoreReadTransaction readOnly =
            factory.newReadOnlyTransaction(parent.getIdentifier());
        return new LocalTransactionContext(readOnly, parent.getIdentifier(), factory) {
          @Override
          protected DOMStoreWriteTransaction getWriteDelegate() {
            throw new UnsupportedOperationException();
          }

          @Override
          protected DOMStoreReadTransaction getReadDelegate() {
            return readOnly;
          }
        };
      case READ_WRITE:
        final DOMStoreReadWriteTransaction readWrite =
            factory.newReadWriteTransaction(parent.getIdentifier());
        return new LocalTransactionContext(readWrite, parent.getIdentifier(), factory) {
          @Override
          protected DOMStoreWriteTransaction getWriteDelegate() {
            return readWrite;
          }

          @Override
          protected DOMStoreReadTransaction getReadDelegate() {
            return readWrite;
          }
        };
      case WRITE_ONLY:
        final DOMStoreWriteTransaction writeOnly =
            factory.newWriteOnlyTransaction(parent.getIdentifier());
        return new LocalTransactionContext(writeOnly, parent.getIdentifier(), factory) {
          @Override
          protected DOMStoreWriteTransaction getWriteDelegate() {
            return writeOnly;
          }

          @Override
          protected DOMStoreReadTransaction getReadDelegate() {
            throw new UnsupportedOperationException();
          }
        };
      default:
        throw new IllegalArgumentException("Invalid transaction type: " + parent.getType());
    }
  }