Package org.wso2.carbon.registry.extensions.aspects

Source Code of org.wso2.carbon.registry.extensions.aspects.ReviewLifecycle

/*
* Copyright (c) 2007, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.wso2.carbon.registry.extensions.aspects;

import org.wso2.carbon.registry.core.Resource;
import org.wso2.carbon.registry.core.Registry;
import org.wso2.carbon.registry.core.Association;
import org.wso2.carbon.registry.core.session.CurrentSession;
import org.wso2.carbon.registry.core.jdbc.handlers.RequestContext;
import org.wso2.carbon.registry.core.exceptions.RegistryException;
import org.wso2.carbon.user.core.UserRealm;
import org.wso2.carbon.user.core.UserStoreException;

/**
* An example "review and approval" lifecycle which demonstrates how property settings can
* affect the behavior of Aspects.  Once this lifecycle has been associated with a resource,
* only the user specified in the "reviewer" property will see the available "approve" and
* "deny" actions.
*/
public class ReviewLifecycle extends Lifecycle {
    public static final String REVIEWER = "reviewer";
    protected final String ORIGINAL_PATH = "registry.originalPath";

    public void associate(Resource resource, Registry registry) throws RegistryException {
        // Might be interesting to do this as follows:
        //  check for "reviewer" property and fail if not present, or if it doesn't match
        //    an existing registry user
        //  allow the reviewer user to have write permission (required for them to update)
        //  copy the resource into "/people/{reviewer}/to-review/..." (this lets them subscribe
        //    to the feed to get notified of new items in their queue)
        //  set the "approval" property to "in review"
        //
        // If we do it that way, then we need to make sure that we also set an "originalPath"
        // property on the copied resource so that when the reviewer selects approve/reject,
        // we can record the status on the "real" object (and then maybe delete the copy?)
        //
        // We really need symbolic links, which would solve this in a nicer way.
        String reviewer = resource.getProperty(REVIEWER);
        if (reviewer == null) {
            throw new RegistryException("No " + REVIEWER + " property");
        }

        try {
            UserRealm userRealm = CurrentSession.getUserRealm();
            if (!userRealm.getUserStoreManager().isExistingUser(reviewer)) {
                throw new RegistryException("No such user '" + reviewer + "'");
            }
        } catch (UserStoreException e) {
            throw new RegistryException("User Store Exception", e);
        }

        final String path = resource.getPath();
        String name = path;
        int idx = name.lastIndexOf("/");
        name = name.substring(idx + 1, name.length());
        if (name.length() == 0) {
            throw new RegistryException("Can't associate Review to root resource");
        }

        final String newPath = "/people/" + reviewer + "/to-review/" + name;
        registry.copy(path, newPath);
        Resource r = registry.get(newPath);
        registry.addAssociation(newPath, path, "original");

        // Need a better way for this to work
        r.setProperty("registry.Aspects", "Review");

        registry.put(newPath, r);
    }

    public void invoke(RequestContext context, String action) throws RegistryException {
        String value;
        if ("approve".equals(action)) {
            value = "approved";
        } else if ("reject".equals(action)) {
            value = "rejected";
        } else {
            throw new RegistryException("Not a valid action");
        }
        Registry registry = context.getRegistry();
        Association[] associations =
                registry.getAssociations(context.getResourcePath().getPath(), "original");
        if (associations == null) {
            throw new RegistryException("No original resource to approve");
        }
        final Resource resource = context.getRepository().get(associations[0].getDestinationPath());
        resource.setProperty("approval", value);
        context.getRepository().put(resource.getPath(), resource);
    }

    public String[] getAvailableActions(RequestContext context) {
        String reviewer = context.getResource().getProperty(REVIEWER);
        if (CurrentSession.getUser().equals(reviewer)) {
            return new String [] { "approve", "reject" };
        }
        return new String[0];
    }
}
TOP

Related Classes of org.wso2.carbon.registry.extensions.aspects.ReviewLifecycle

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.