All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.jjYBdx4IL.utils.ci.jenkins.DependencyGraph Maven / Gradle / Ivy

/*
 * Copyright (C) 2016 jjYBdx4IL (https://github.com/jjYBdx4IL)
 *
 * 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 com.github.jjYBdx4IL.utils.ci.jenkins;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.stream.JsonReader;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *
 * @author jjYBdx4IL
 */
public class DependencyGraph {

    private static final Logger log = LoggerFactory.getLogger(DependencyGraph.class);
    public static final String URL_SUFFIX = "/depgraph-view/graph.json";

    private final URL jenkinsInstanceURL;
    private final List edges = new ArrayList<>();
    private final List jobs = new ArrayList<>();

    public DependencyGraph(URL jenkinsInstanceURL) {
        this.jenkinsInstanceURL = jenkinsInstanceURL;
    }

    protected List getParentJobNames() {
        List parentJobNames = new ArrayList<>();

        Set hasParents = new HashSet<>();
        for (Edge edge : edges) {
            hasParents.add(edge.to);
        }
        for (JobNode job : jobs) {
            if (!hasParents.contains(job.name)) {
                parentJobNames.add(job);
            }
        }

        return parentJobNames;
    }

    protected void load() throws IOException {
        edges.clear();
        jobs.clear();
        try (InputStream is = new URL(jenkinsInstanceURL.toExternalForm() + URL_SUFFIX).openStream()) {
            parseStream(is);
        }
    }
    public List queue(String[] prepend, String[] append, boolean dryRun) throws IOException {
        load();
        List queuedBuildJobs = new ArrayList<>();
        if (prepend != null) {
            for (String job : prepend) {
                queueJob(job, dryRun);
                queuedBuildJobs.add(job);
            }
        }
        for (JobNode job : getParentJobNames()) {
            queueJob(job.name, dryRun);
            queuedBuildJobs.add(job.name);
        }
        if (append != null) {
            for (String job : append) {
                queueJob(job, dryRun);
                queuedBuildJobs.add(job);
            }
        }
        
        return queuedBuildJobs;
    }

    private void queueJob(String job, boolean dryRun) throws IOException {
        if (dryRun) {
            return;
        }
        IOUtils.toString(new URL(String.format("%s/job/%s/build", jenkinsInstanceURL.toExternalForm(), job)));
    }


    protected void parseStream(InputStream is) throws IOException {
        final Gson g = new Gson();
        final JsonElement root;
        try (InputStreamReader isr = new InputStreamReader(is)) {
            try (JsonReader reader = new JsonReader(isr)) {
                JsonParser parser = new JsonParser();
                root = parser.parse(reader);
            }
        }

        JsonArray arr = root.getAsJsonObject().get("edges").getAsJsonArray();
        Iterator it = arr.iterator();
        while (it.hasNext()) {
            JsonElement el = it.next();
            Edge edge = g.fromJson(el.toString(), Edge.class);
            if (edge.type.equals("dep")) {
                edges.add(edge);
            }
        }

        arr = root.getAsJsonObject().get("clusters").getAsJsonArray();
        it = arr.iterator();
        while (it.hasNext()) {
            JsonArray nodes = it.next().getAsJsonObject().get("nodes").getAsJsonArray();
            Iterator nodeIt = nodes.iterator();
            while (nodeIt.hasNext()) {
                JsonElement el = nodeIt.next();
                JobNode job = g.fromJson(el.toString(), JobNode.class);
                jobs.add(job);
            }
        }
    }

    class JobNode {
        private String name;
        private String fullName;
        private String url;
        private int x;
        private int y;

        @Override
        public String toString() {
            StringBuilder builder = new StringBuilder();
            builder.append("JobNode [");
            builder.append("fullName=");
            builder.append(fullName);
            builder.append(", name=");
            builder.append(name);
            builder.append(", url=");
            builder.append(url);
            builder.append(", x=");
            builder.append(x);
            builder.append(", y=");
            builder.append(y);
            builder.append("]");
            return builder.toString();
        }
    }

    class Edge {
        private String from;
        private String to;
        private String type;

        @Override
        public String toString() {
            StringBuilder builder = new StringBuilder();
            builder.append("Edge [");
            builder.append("from=");
            builder.append(from);
            builder.append(", to=");
            builder.append(to);
            builder.append(", type=");
            builder.append(type);
            builder.append("]");
            return builder.toString();
        }
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy