eu.scape_project.planning.plato.wf.ValidatePlan.java Source code

Java tutorial

Introduction

Here is the source code for eu.scape_project.planning.plato.wf.ValidatePlan.java

Source

/*******************************************************************************
 * Copyright 2006 - 2012 Vienna University of Technology,
 * Department of Software Technology and Interactive Systems, IFS
 * 
 * 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 eu.scape_project.planning.plato.wf;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateful;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import javax.ws.rs.core.MediaType;

import org.apache.commons.configuration.Configuration;
import org.codehaus.jackson.jaxrs.JacksonJsonProvider;
import org.slf4j.Logger;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
import com.sun.jersey.api.client.filter.LoggingFilter;

import eu.scape_project.planning.exception.PlanningException;
import eu.scape_project.planning.model.Plan;
import eu.scape_project.planning.model.PlanState;
import eu.scape_project.planning.model.tree.Leaf;
import eu.scape_project.planning.repository.SCAPEPlanManagementClient;
import eu.scape_project.planning.sla.TriggerGenerator;
import eu.scape_project.planning.utils.ConfigurationLoader;
import eu.scape_project.planning.utils.OS;
import eu.scape_project.planning.validation.ValidationError;
import eu.scape_project.planning.xml.ProjectExportAction;
import eu.scape_project.watch.domain.AsyncRequest;
import eu.scape_project.watch.domain.Trigger;
import eu.scape_project.watch.utils.KBUtils;

/**
 * @author Michael Kraxner
 * 
 */
@Stateful
@ConversationScoped
public class ValidatePlan extends AbstractWorkflowStep {
    private static final long serialVersionUID = 7862746302624511130L;

    @Inject
    private Logger log;

    @Inject
    private ProjectExportAction projectExport;

    public ValidatePlan() {
        requiredPlanState = PlanState.PLAN_DEFINED;
        correspondingPlanState = PlanState.PLAN_VALIDATED;
    }

    public void init(Plan p) {
        super.init(p);
        for (Leaf l : plan.getTree().getRoot().getAllLeaves()) {
            l.initTransformer();
        }
    }

    /**
     * Method responsible for approving the current plan.
     */
    public void approvePlan() {
        List<ValidationError> validationErrors = new ArrayList<ValidationError>();
        // proceed planstate to PLAN_VALIDATED
        boolean success = proceed(validationErrors);

        if (success) {
            log.info("Approved plan with id " + plan.getId());
        } else {
            log.warn("Approvement of plan with id " + plan.getId() + " failed");
        }
    }

    /**
     * Method responsible for revising the current approved plan.
     */
    public void revisePlan() {
        // save does the reset of planstate to PLAN_DEFINED for us
        save();
        log.info("Revised plan with id " + plan.getId());
    }

    @Override
    protected void saveStepSpecific() {
        // no custom save operation is needed here
    }

    public void deployPlan(String endpoint, String user, String password) throws PlanningException {

        SCAPEPlanManagementClient planManagement = new SCAPEPlanManagementClient(endpoint, user, password);

        String planIdentifier;
        try {
            planIdentifier = planManagement.reservePlanIdentifier();
        } catch (Exception e) {
            throw new PlanningException("Could not reserve Identifier.", e);
        } catch (Throwable e) {
            throw new PlanningException("Could not reserve Identifier.", e);
        }
        this.plan.getPlanProperties().setRepositoryIdentifier(planIdentifier);
        saveWithoutModifyingPlanState();

        String binarydataTempPath = OS.getTmpPath() + planIdentifier + "/";
        File binarydataTempDir = new File(binarydataTempPath);
        binarydataTempDir.mkdirs();
        File planFile = new File(binarydataTempPath + "plan.xml");
        try {
            try {
                BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(planFile));
                projectExport.exportComplete(plan.getPlanProperties().getId(), out, binarydataTempPath);
                out.flush();
                out.close();

                planManagement.deployPlan(planIdentifier, new FileInputStream(planFile));
            } catch (Exception e) {
                throw new PlanningException("Failed to generate plan.", e);
            }
        } finally {
            OS.deleteDirectory(binarydataTempDir);
        }
    }

    public void deployTriggers() throws PlanningException {

        TriggerGenerator triggerGen = new TriggerGenerator();
        List<Trigger> triggers = triggerGen.generateTriggers(user.getEmail(), 24 * 3600 * 1000, plan);

        if (triggers.size() > 0) {
            try {
                ConfigurationLoader configurationLoader = new ConfigurationLoader();
                Configuration config = configurationLoader.load();
                String watchEndpoint = config.getString("watch.rest.uri");
                String watchUser = config.getString("watch.rest.user");
                String watchPassword = config.getString("watch.rest.password");

                final ClientConfig cc = new DefaultClientConfig();
                cc.getClasses().add(JacksonJsonProvider.class);
                final Client clientWithJacksonSerializer = Client.create(cc);
                clientWithJacksonSerializer.addFilter(new LoggingFilter());
                clientWithJacksonSerializer.addFilter(new HTTPBasicAuthFilter(watchUser, watchPassword));
                WebResource resource = clientWithJacksonSerializer.resource(watchEndpoint);

                final AsyncRequest areq = new AsyncRequest("monitor plan: " + plan.getPlanProperties().getName(),
                        triggers);
                final AsyncRequest areq2 = resource.path(KBUtils.ASYNC_REQUEST + ".json/new")
                        .accept(MediaType.APPLICATION_JSON).post(AsyncRequest.class, areq);
            } catch (Exception e) {
                throw new PlanningException("Failed to access endpoint.", e);
            }
        } else {
            throw new PlanningException("No triggers to deploy.");
        }
    }
}