Search in sources :

Example 1 with UnsupportedRepositoryOperationException

use of javax.jcr.UnsupportedRepositoryOperationException in project jackrabbit by apache.

the class VersionManagerImpl method setActivity.

/**
     * {@inheritDoc}
     */
public Node setActivity(Node activity) throws RepositoryException {
    Node oldActivity = getActivity();
    if (activity == null) {
        currentActivity = null;
    } else {
        NodeImpl actNode = (NodeImpl) activity;
        if (!actNode.isNodeType(NameConstants.NT_ACTIVITY)) {
            String msg = "Given node is not an activity: " + actNode.safeGetJCRPath();
            log.error(msg);
            throw new UnsupportedRepositoryOperationException(msg);
        }
        currentActivity = actNode.getNodeId();
    }
    return oldActivity;
}
Also used : UnsupportedRepositoryOperationException(javax.jcr.UnsupportedRepositoryOperationException) Node(javax.jcr.Node)

Example 2 with UnsupportedRepositoryOperationException

use of javax.jcr.UnsupportedRepositoryOperationException in project jackrabbit by apache.

the class VersionManagerImpl method removeActivity.

/**
     * {@inheritDoc}
     */
public void removeActivity(Node node) throws RepositoryException {
    NodeImpl actNode = (NodeImpl) node;
    if (!actNode.isNodeType(NameConstants.NT_ACTIVITY)) {
        String msg = "Given node is not an activity: " + actNode.safeGetJCRPath();
        log.error(msg);
        throw new UnsupportedRepositoryOperationException(msg);
    }
    NodeId actId = actNode.getNodeId();
    vMgr.removeActivity(session, actId);
    if (actId.equals(currentActivity)) {
        currentActivity = null;
    }
}
Also used : UnsupportedRepositoryOperationException(javax.jcr.UnsupportedRepositoryOperationException) NodeId(org.apache.jackrabbit.core.id.NodeId)

Example 3 with UnsupportedRepositoryOperationException

use of javax.jcr.UnsupportedRepositoryOperationException in project jackrabbit by apache.

the class VersionManagerImpl method createConfiguration.

/**
     * {@inheritDoc}
     */
public Node createConfiguration(String absPath) throws RepositoryException {
    if (session.nodeExists(absPath)) {
        NodeStateEx state = getNodeState(absPath, ItemValidator.CHECK_LOCK | ItemValidator.CHECK_PENDING_CHANGES_ON_NODE | ItemValidator.CHECK_HOLD, Permission.VERSION_MNGMT);
        // check versionable
        if (!checkVersionable(state)) {
            throw new UnsupportedRepositoryOperationException("Node not full versionable: " + absPath);
        }
        if (state.getPropertyValue(NameConstants.JCR_CONFIGURATION) != null) {
            String msg = "Node is already a configuration root: " + absPath;
            log.error(msg);
            throw new UnsupportedRepositoryOperationException(msg);
        }
        NodeId configId = createConfiguration(state);
        return session.getNodeById(configId);
    } else {
        String msg = "Create configuration node must exist: " + absPath;
        log.error(msg);
        throw new UnsupportedRepositoryOperationException(msg);
    }
}
Also used : UnsupportedRepositoryOperationException(javax.jcr.UnsupportedRepositoryOperationException) NodeId(org.apache.jackrabbit.core.id.NodeId) NodeStateEx(org.apache.jackrabbit.core.version.NodeStateEx)

Example 4 with UnsupportedRepositoryOperationException

use of javax.jcr.UnsupportedRepositoryOperationException in project jackrabbit by apache.

the class VersionManagerImplRestore method internalRestoreFrozen.

/**
     * Restores the properties and child nodes from the frozen state.
     *
     * @param state state to restore
     * @param freeze the frozen node
     * @param vsel version selector
     * @param restored set of restored versions
     * @param removeExisting remove existing flag
     * @param copy if <code>true</code> a pure copy is performed
     * @throws RepositoryException if an error occurs
     * @throws ItemStateException if an error occurs
     */
protected void internalRestoreFrozen(NodeStateEx state, InternalFrozenNode freeze, VersionSelector vsel, Set<InternalVersion> restored, boolean removeExisting, boolean copy) throws RepositoryException, ItemStateException {
    // check uuid
    if (state.getEffectiveNodeType().includesNodeType(NameConstants.MIX_REFERENCEABLE)) {
        if (!state.getNodeId().equals(freeze.getFrozenId())) {
            String msg = "Unable to restore version of " + safeGetJCRPath(state) + ". UUID changed.";
            log.error(msg);
            throw new ItemExistsException(msg);
        }
    }
    // check primary type
    if (!freeze.getFrozenPrimaryType().equals(state.getState().getNodeTypeName())) {
        // todo: implement
        String msg = "Unable to restore version of " + safeGetJCRPath(state) + ". PrimaryType change not supported yet.";
        log.error(msg);
        throw new UnsupportedRepositoryOperationException(msg);
    }
    // adjust mixins
    state.setMixins(freeze.getFrozenMixinTypes());
    // For each property P present on F (other than jcr:frozenPrimaryType,
    // jcr:frozenMixinTypes and jcr:frozenUuid): 
    // - If P has an OPV of COPY or VERSION then F/P is copied to N/P,
    //   replacing any existing N/P.
    // - F will never have a property with an OPV of IGNORE, INITIALIZE, COMPUTE
    //   or ABORT (see 15.2 Check-In: Creating a Version).
    Set<Name> propNames = new HashSet<Name>();
    PropertyState[] props = freeze.getFrozenProperties();
    for (PropertyState prop : props) {
        // don't restore jcr:activity
        Name name = prop.getName();
        if (!name.equals(NameConstants.JCR_ACTIVITY)) {
            state.copyFrom(prop);
            propNames.add(name);
        }
    }
    // remove properties that do not exist in the frozen representation
    for (PropertyState prop : state.getProperties()) {
        Name propName = prop.getName();
        if (!propNames.contains(propName)) {
            int opv = state.getDefinition(prop).getOnParentVersion();
            if (opv == OnParentVersionAction.COPY || opv == OnParentVersionAction.VERSION || opv == OnParentVersionAction.ABORT) {
                state.removeProperty(propName);
            } else if (opv == OnParentVersionAction.INITIALIZE) {
                InternalValue[] values = computeAutoValues(state, state.getDefinition(prop), true);
                if (values != null) {
                    state.setPropertyValues(propName, prop.getType(), values, prop.isMultiValued());
                }
            } else if (opv == OnParentVersionAction.COMPUTE) {
                InternalValue[] values = computeAutoValues(state, state.getDefinition(prop), false);
                if (values != null) {
                    state.setPropertyValues(propName, prop.getType(), values, prop.isMultiValued());
                }
            }
        }
    }
    // add 'auto-create' properties that do not exist yet
    for (QPropertyDefinition def : state.getEffectiveNodeType().getAutoCreatePropDefs()) {
        if (!state.hasProperty(def.getName())) {
            InternalValue[] values = computeAutoValues(state, def, true);
            if (values != null) {
                state.setPropertyValues(def.getName(), def.getRequiredType(), values, def.isMultiple());
            }
        }
    }
    // For each child node C present on N but not on F:
    // - If C has an OPV of COPY, VERSION or ABORT then N/C is removed.
    //   Note that while a node with a child item of OPV ABORT cannot be
    //   versioned, it is legal for a previously versioned node to have such
    //   a child item added to it and then for it to be restored to the state
    //   that it had before that item was added, as this step indicates.
    // - If C has an OPV of IGNORE then no change is made to N/C.
    // - If C has an OPV of INITIALIZE then N/C is re-initialized as if it
    //   were newly created, as defined in its node type.
    // - If C has an OPV of COMPUTE then N/C may be re-initialized according
    //   to an implementation-specific mechanism.
    LinkedList<ChildNodeEntry> toDelete = new LinkedList<ChildNodeEntry>();
    for (ChildNodeEntry entry : state.getState().getChildNodeEntries()) {
        if (!freeze.hasFrozenChildNode(entry.getName(), entry.getIndex())) {
            NodeStateEx child = state.getNode(entry.getName(), entry.getIndex());
            int opv = child.getDefinition().getOnParentVersion();
            if (copy || opv == OnParentVersionAction.COPY || opv == OnParentVersionAction.VERSION || opv == OnParentVersionAction.ABORT) {
                toDelete.addFirst(entry);
            } else if (opv == OnParentVersionAction.INITIALIZE) {
                log.warn("OPV.INITIALIZE not supported yet on restore of existing child nodes: " + safeGetJCRPath(child));
            } else if (opv == OnParentVersionAction.COMPUTE) {
                log.warn("OPV.COMPUTE not supported yet on restore of existing child nodes: " + safeGetJCRPath(child));
            }
        }
    }
    for (ChildNodeEntry entry : toDelete) {
        state.removeNode(entry.getName(), entry.getIndex());
    }
    // need to sync with state manager
    state.store();
    // create a map that contains a int->NodeStateEx mapping for each child name
    Map<Name, Map<Integer, NodeStateEx>> entryToNodeStateExMapping = new HashMap<Name, Map<Integer, NodeStateEx>>();
    for (ChildNodeEntry entry : state.getState().getChildNodeEntries()) {
        Map<Integer, NodeStateEx> id2stateMap = entryToNodeStateExMapping.get(entry.getName());
        if (id2stateMap == null) {
            id2stateMap = new HashMap<Integer, NodeStateEx>();
        }
        id2stateMap.put(entry.getIndex(), state.getNode(entry.getName(), entry.getIndex()));
        entryToNodeStateExMapping.put(entry.getName(), id2stateMap);
    }
    //   COMPUTE or ABORT (see 15.2 Check-In: Creating a Version).
    for (ChildNodeEntry entry : freeze.getFrozenChildNodes()) {
        InternalFreeze child = freeze.getFrozenChildNode(entry.getName(), entry.getIndex());
        NodeStateEx restoredChild = null;
        if (child instanceof InternalFrozenNode) {
            // - If C has an OPV of COPY or VERSION:
            //   - B is true, then F/C and its subgraph is copied to N/C, replacing
            //     any existing N/C and its subgraph and any node in the workspace
            //     with the same identifier as C or a node in the subgraph of C is
            //     removed.
            //   - B is false, then F/C and its subgraph is copied to N/C, replacing
            //     any existing N/C and its subgraph unless there exists a node in the
            //     workspace with the same identifier as C, or a node in the subgraph
            //     of C, in which case an ItemExistsException is thrown , all
            //     changes made by the restore are rolled back leaving N unchanged.
            InternalFrozenNode f = (InternalFrozenNode) child;
            // if node is present, remove it
            Map<Integer, NodeStateEx> id2stateMap = entryToNodeStateExMapping.get(entry.getName());
            if (id2stateMap != null && id2stateMap.containsKey(entry.getIndex())) {
                state.removeNode(id2stateMap.get(entry.getIndex()));
            }
            // check for existing
            if (f.getFrozenId() != null) {
                if (stateMgr.hasItemState(f.getFrozenId())) {
                    NodeStateEx existing = state.getNode(f.getFrozenId());
                    if (removeExisting) {
                        NodeStateEx parent = existing.getParent();
                        parent.removeNode(existing);
                        parent.store();
                    } else if (existing.getState().isShareable()) {
                        // if existing node is shareable, then clone it
                        restoredChild = state.moveFrom(existing, existing.getName(), true);
                    } else if (!existing.hasAncestor(state.getNodeId())) {
                        String msg = "Unable to restore node, item already exists " + "outside of restored tree: " + safeGetJCRPath(existing);
                        log.error(msg);
                        throw new ItemExistsException(msg);
                    }
                }
            }
            if (restoredChild == null) {
                restoredChild = state.addNode(f.getName(), f.getFrozenPrimaryType(), f.getFrozenId());
                restoredChild.setMixins(f.getFrozenMixinTypes());
            }
            internalRestoreFrozen(restoredChild, f, vsel, restored, removeExisting, true);
        } else if (child instanceof InternalFrozenVersionHistory) {
            //   Each child node C of N where C has an OPV of VERSION and C is
            //   mix:versionable, is represented in F not as a copy of N/C but as
            //   special node containing a reference to the version history of
            //   C. On restore, the following occurs:
            //   - If the workspace currently has an already existing node corresponding
            //     to C's version history and the removeExisting flag of the restore is
            //     set to true, then that instance of C becomes the child of the restored N.
            //   - If the workspace currently has an already existing node corresponding
            //     to C's version history and the removeExisting flag of the restore is
            //     set to false then an ItemExistsException is thrown.
            //   - If the workspace does not have an instance of C then one is restored from
            //     C's version history:
            //     - If the restore was initiated through a restoreByLabel where L is
            //       the specified label and there is a version of C with the label L then
            //       that version is restored.
            //     - If the version history of C does not contain a version with the label
            //       L or the restore was initiated by a method call that does not specify
            //       a label then the workspace in which the restore is being performed
            //       will determine which particular version of C will be restored. This
            //       determination depends on the configuration of the workspace and
            //       is outside the scope of this specification.
            InternalFrozenVersionHistory fh = (InternalFrozenVersionHistory) child;
            InternalVersionHistory vh = vMgr.getVersionHistory(fh.getVersionHistoryId());
            // get desired version from version selector
            InternalVersion v = vsel.select(vh);
            Name oldVersion = null;
            // check if representing versionable already exists somewhere
            NodeId nodeId = vh.getVersionableId();
            if (stateMgr.hasItemState(nodeId)) {
                restoredChild = state.getNode(nodeId);
                if (restoredChild.getParentId().equals(state.getNodeId())) {
                // if same parent, ignore
                } else if (removeExisting) {
                    NodeStateEx parent = restoredChild.getNode(restoredChild.getParentId());
                    state.moveFrom(restoredChild, fh.getName(), false);
                    parent.store();
                    // get old version name
                    oldVersion = getBaseVersion(restoredChild).getName();
                } else {
                    // since we delete the OPV=Copy children beforehand, all
                    // found nodes must be outside of this tree
                    String msg = "Unable to restore node, item already exists " + "outside of restored tree: " + safeGetJCRPath(restoredChild);
                    log.error(msg);
                    throw new ItemExistsException(msg);
                }
            }
            // check existing version of item exists
            if (restoredChild == null) {
                if (v == null) {
                    // if version selector was unable to select version,
                    // choose the initial one
                    List<InternalVersion> vs = vh.getRootVersion().getSuccessors();
                    if (vs.isEmpty()) {
                        String msg = "Unable to select appropriate version for " + child.getName() + " using " + vsel;
                        log.error(msg);
                        throw new VersionException(msg);
                    }
                    v = vs.get(0);
                }
                InternalFrozenNode f = v.getFrozenNode();
                restoredChild = state.addNode(fh.getName(), f.getFrozenPrimaryType(), f.getFrozenId());
                restoredChild.setMixins(f.getFrozenMixinTypes());
            } else {
                if (v == null || oldVersion == null || v.getName().equals(oldVersion)) {
                    v = null;
                }
            }
            if (v != null) {
                try {
                    internalRestore(restoredChild, v, vsel, removeExisting);
                } catch (RepositoryException e) {
                    log.error("Error while restoring node: " + e);
                    log.error("  child path: " + restoredChild);
                    log.error("  selected version: " + v.getName());
                    StringBuilder avail = new StringBuilder();
                    for (Name name : vh.getVersionNames()) {
                        avail.append(name);
                        avail.append(", ");
                    }
                    log.error("  available versions: " + avail);
                    log.error("  versionselector: " + vsel);
                    throw e;
                }
                // add this version to set
                restored.add(v);
            }
        }
        if (restoredChild != null && state.getEffectiveNodeType().hasOrderableChildNodes()) {
            //   In a repository that supports orderable child nodes, the relative
            //   ordering of the set of child nodes C that are copied from F is
            //   preserved.
            // order at end
            ArrayList<ChildNodeEntry> list = new ArrayList<ChildNodeEntry>(state.getState().getChildNodeEntries());
            ChildNodeEntry toReorder = null;
            boolean isLast = true;
            for (ChildNodeEntry e : list) {
                if (e.getId().equals(restoredChild.getNodeId())) {
                    toReorder = e;
                } else if (toReorder != null) {
                    isLast = false;
                }
            }
            if (toReorder != null && !isLast) {
                list.remove(toReorder);
                list.add(toReorder);
                state.getState().setChildNodeEntries(list);
            }
        }
    }
}
Also used : UnsupportedRepositoryOperationException(javax.jcr.UnsupportedRepositoryOperationException) Name(org.apache.jackrabbit.spi.Name) QPropertyDefinition(org.apache.jackrabbit.spi.QPropertyDefinition) ChildNodeEntry(org.apache.jackrabbit.core.state.ChildNodeEntry) RepositoryException(javax.jcr.RepositoryException) InternalValue(org.apache.jackrabbit.core.value.InternalValue) PropertyState(org.apache.jackrabbit.core.state.PropertyState) ItemExistsException(javax.jcr.ItemExistsException) NodeId(org.apache.jackrabbit.core.id.NodeId) VersionException(javax.jcr.version.VersionException)

Example 5 with UnsupportedRepositoryOperationException

use of javax.jcr.UnsupportedRepositoryOperationException in project jackrabbit by apache.

the class WorkspaceTest method testCreateWorkspace.

public void testCreateWorkspace() throws Exception {
    Session s = null;
    try {
        Workspace wsp = superuser.getWorkspace();
        String name = getNewWorkspaceName(wsp);
        wsp.createWorkspace(name);
        List<String> wsps = Arrays.asList(wsp.getAccessibleWorkspaceNames());
        assertTrue(wsps.contains(name));
        s = getHelper().getSuperuserSession(name);
        Workspace newW = s.getWorkspace();
        assertEquals(name, newW.getName());
    } catch (UnsupportedRepositoryOperationException e) {
        throw new NotExecutableException();
    } catch (UnsupportedOperationException e) {
        throw new NotExecutableException();
    } finally {
        if (s != null) {
            s.logout();
        }
    }
}
Also used : UnsupportedRepositoryOperationException(javax.jcr.UnsupportedRepositoryOperationException) NotExecutableException(org.apache.jackrabbit.test.NotExecutableException) Session(javax.jcr.Session) Workspace(javax.jcr.Workspace)

Aggregations

UnsupportedRepositoryOperationException (javax.jcr.UnsupportedRepositoryOperationException)57 RepositoryException (javax.jcr.RepositoryException)17 Node (javax.jcr.Node)14 NotExecutableException (org.apache.jackrabbit.test.NotExecutableException)12 NodeId (org.apache.jackrabbit.core.id.NodeId)8 ArrayList (java.util.ArrayList)7 Workspace (javax.jcr.Workspace)5 ConstraintViolationException (javax.jcr.nodetype.ConstraintViolationException)5 Session (javax.jcr.Session)4 VersionManager (javax.jcr.version.VersionManager)4 NodeState (org.apache.jackrabbit.core.state.NodeState)4 Name (org.apache.jackrabbit.spi.Name)4 Path (org.apache.jackrabbit.spi.Path)4 IOException (java.io.IOException)3 ItemExistsException (javax.jcr.ItemExistsException)3 ItemNotFoundException (javax.jcr.ItemNotFoundException)3 NodeType (javax.jcr.nodetype.NodeType)3 HashMap (java.util.HashMap)2 Map (java.util.Map)2 AccessDeniedException (javax.jcr.AccessDeniedException)2