docs: public WorkspaceCache createWorkspace( String name ) {
          if (!workspaceNames.contains(name)) {
              if (!configuration.isCreatingWorkspacesAllowed()) {
                  throw new UnsupportedOperationException(JcrI18n.creatingWorkspacesIsNotAllowedInRepository.text(getName()));
              }
              // Otherwise, create the workspace and persist it ...
              this.workspaceNames.add(name);
              refreshRepositoryMetadata(true);
  
              // Now make sure that the "/jcr:system" node is a child of the root node ...
              SessionCache session = createSession(context, name, false);
              MutableCachedNode root = session.mutable(session.getRootKey());
              ChildReference ref = root.getChildReferences(session).getChild(JcrLexicon.SYSTEM);
              if (ref == null) {
                  root.linkChild(session, systemKey, JcrLexicon.SYSTEM);
                  session.save();
              }
  
              // And notify the others ...
              String userId = context.getSecurityContext().getUserName();
              Map<String, String> userData = context.getData();
              DateTime timestamp = context.getValueFactories().getDateFactory().create();
              RecordingChanges changes = new RecordingChanges(context.getId(), context.getProcessId(), this.getKey(), null,
                                                              repositoryEnvironment.journalId());
              changes.workspaceAdded(name);
              changes.freeze(userId, userData, timestamp);
              this.changeBus.notify(changes);
          }
          return workspace(name);
      }