/* * Copyright (c) 2008, 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.exceptions.RegistryException; import org.wso2.carbon.registry.core.ResourcePath; import org.wso2.carbon.registry.core.config.RegistryContext; import org.wso2.carbon.registry.core.jdbc.Repository; import org.wso2.carbon.registry.core.jdbc.handlers.RequestContext; import org.wso2.carbon.registry.core.Aspect; import org.wso2.carbon.registry.core.*; import java.util.ArrayList; import java.util.List; public class DefaultLifecycle extends Aspect { public static final String PHASE_CREATED = "created"; public static final String PHASE_DEVELOPED = "developed"; public static final String PHASE_TESTED = "tested"; public static final String PHASE_DEPLOYED = "deployed"; private static final String ORIGINAL_PATH = "originalPath"; static final String[] phases = new String[]{ PHASE_CREATED, PHASE_DEVELOPED, PHASE_TESTED, PHASE_DEPLOYED }; // Property to store phase name public static final String PHASE_PROPERTY = "DefaultLifecycle.phase"; // The only action this lifecycle supports is "promote", which moves to the next phase public static final String ACTION = "promote"; public void associate(Resource resource, Registry registry) throws RegistryException { // We start off in the CREATED phase resource.setProperty(PHASE_PROPERTY, PHASE_CREATED); } public void dissociate(RequestContext context) { context.getResource().removeProperty(PHASE_PROPERTY); } /** * Do something (change state) - action names are lifecycle-specific, and it's up to the * implementation to decide if a given transition is allowed, and what to do if so. * * @param context the RequestContext containing all the state about this request * @param action action to perform * @throws org.wso2.carbon.registry.core.exceptions.RegistryException * If the condition is not met or some thing is wrong */ public void invoke(RequestContext context, String action) throws RegistryException { if (!ACTION.equals(action)) { throw new RegistryException("Unsupported lifecycle action '" + action + "'. Only valid action is '" + ACTION + "'"); } RegistryContext registryContext = context.getRegistry().getRegistryContext(); Repository repository = registryContext.getRepository(); Resource resource = context.getResource(); String originalPath = resource.getProperty(ORIGINAL_PATH); if (originalPath == null ) { resource.setProperty(ORIGINAL_PATH , resource.getPath()); originalPath = resource.getPath(); repository.put(originalPath, resource); } String currentPhase = resource.getProperty(PHASE_PROPERTY); if (currentPhase == null) throw new RegistryException("DefaultLifecycle: Resource '" + resource.getPath() + "' has no phase property"); int i = 0; while (i < phases.length) { if (phases[i].equals(currentPhase)) { break; } i++; } if (i == phases.length) { // No such phase! throw new RegistryException("Resource " + resource.getPath() + " is in an invalid lifecycle phase ('" + currentPhase + "')"); } if (i == phases.length - 1) { // We're at the end, no more promoting to do throw new RegistryException( "Promotion disallowed - resource is at the end of the DefaultLifecycle"); } String nextPhase = phases[i + 1]; String newResourcePath = "/" + nextPhase + originalPath; repository.copy(new ResourcePath(resource.getPath()), new ResourcePath(newResourcePath)); Resource newResource = repository.get(newResourcePath); newResource.setProperty(PHASE_PROPERTY, nextPhase); repository.put(newResourcePath, newResource); } private static List<String> promote = new ArrayList<String>(); static { promote.add(ACTION); } public String [] getAvailableActions(RequestContext context) { return promote.toArray(new String[1]); } }