com.thoughtworks.go.apiv7.admin.pipelineconfig.representers.materials.MaterialsRepresenter.java Source code

Java tutorial

Introduction

Here is the source code for com.thoughtworks.go.apiv7.admin.pipelineconfig.representers.materials.MaterialsRepresenter.java

Source

/*
 * Copyright 2019 ThoughtWorks, Inc.
 *
 * 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.thoughtworks.go.apiv7.admin.pipelineconfig.representers.materials;

import com.thoughtworks.go.api.base.OutputListWriter;
import com.thoughtworks.go.api.base.OutputWriter;
import com.thoughtworks.go.api.representers.ErrorGetter;
import com.thoughtworks.go.api.representers.JsonReader;
import com.thoughtworks.go.apiv7.admin.shared.representers.stages.ConfigHelperOptions;
import com.thoughtworks.go.config.exceptions.UnprocessableEntityException;
import com.thoughtworks.go.config.materials.MaterialConfigs;
import com.thoughtworks.go.config.materials.PackageMaterialConfig;
import com.thoughtworks.go.config.materials.PluggableSCMMaterialConfig;
import com.thoughtworks.go.config.materials.dependency.DependencyMaterialConfig;
import com.thoughtworks.go.config.materials.git.GitMaterialConfig;
import com.thoughtworks.go.config.materials.mercurial.HgMaterialConfig;
import com.thoughtworks.go.config.materials.perforce.P4MaterialConfig;
import com.thoughtworks.go.config.materials.svn.SvnMaterialConfig;
import com.thoughtworks.go.config.materials.tfs.TfsMaterialConfig;
import com.thoughtworks.go.domain.materials.MaterialConfig;

import java.util.HashMap;

import static java.util.Arrays.stream;
import static org.apache.commons.lang3.StringUtils.equalsIgnoreCase;

public class MaterialsRepresenter {
    enum Materials {
        GIT(GitMaterialConfig.class, new GitMaterialRepresenter()), HG(HgMaterialConfig.class,
                new HgMaterialRepresenter()), SVN(SvnMaterialConfig.class, new SvnMaterialRepresenter()), P4(
                        P4MaterialConfig.class, new PerforceMaterialRepresenter()), TFS(TfsMaterialConfig.class,
                                new TfsMaterialRepresenter()), DEPENDENCY(DependencyMaterialConfig.class,
                                        new DependencyMaterialRepresenter()), PACKAGE(PackageMaterialConfig.class,
                                                new PackageMaterialRepresenter()), PLUGIN(
                                                        PluggableSCMMaterialConfig.class,
                                                        new PluggableScmMaterialRepresenter());

        private final Class<? extends MaterialConfig> type;
        private final MaterialRepresenter representer;

        Materials(Class<? extends MaterialConfig> type, MaterialRepresenter representer) {
            this.type = type;
            this.representer = representer;
        }
    }

    public static void toJSONArray(OutputListWriter materialsWriter, MaterialConfigs materialConfigs) {
        materialConfigs.forEach(materialConfig -> materialsWriter
                .addChild(materialWriter -> toJSON(materialWriter, materialConfig)));
    }

    public static void toJSON(OutputWriter jsonWriter, MaterialConfig materialConfig) {
        if (!materialConfig.errors().isEmpty()) {
            jsonWriter.addChild("errors", errorWriter -> {
                HashMap<String, String> errorMapping = new HashMap<>();
                errorMapping.put("materialName", "name");
                errorMapping.put("folder", "destination");
                errorMapping.put("autoUpdate", "auto_update");
                errorMapping.put("filterAsString", "filter");
                errorMapping.put("checkexternals", "check_externals");
                errorMapping.put("serverAndPort", "port");
                errorMapping.put("useTickets", "use_tickets");
                errorMapping.put("pipelineName", "pipeline");
                errorMapping.put("stageName", "stage");
                errorMapping.put("pipelineStageName", "pipeline");
                errorMapping.put("packageId", "ref");
                errorMapping.put("scmId", "ref");
                errorMapping.put("encryptedPassword", "encrypted_password");

                new ErrorGetter(errorMapping).toJSON(errorWriter, materialConfig);
            });

        }

        stream(Materials.values()).filter(material -> material.type == materialConfig.getClass()).findFirst()
                .ifPresent(material -> {
                    jsonWriter.add("type", material.name().toLowerCase());
                    jsonWriter.addChild("attributes",
                            attributeWriter -> material.representer.toJSON(attributeWriter, materialConfig));
                });

    }

    public static MaterialConfigs fromJSONArray(JsonReader jsonReader, ConfigHelperOptions options) {
        MaterialConfigs materialConfigs = new MaterialConfigs();
        jsonReader.readArrayIfPresent("materials", materials -> {
            materials.forEach(material -> materialConfigs
                    .add(MaterialsRepresenter.fromJSON(new JsonReader(material.getAsJsonObject()), options)));
        });
        return materialConfigs;
    }

    public static MaterialConfig fromJSON(JsonReader jsonReader, ConfigHelperOptions options) {
        String type = jsonReader.getString("type");
        JsonReader attributes = jsonReader.readJsonObject("attributes");

        return stream(Materials.values()).filter(material -> equalsIgnoreCase(type, material.name())).findFirst()
                .map(material -> material.representer.fromJSON(attributes, options))
                .orElseThrow(() -> new UnprocessableEntityException(String.format(
                        "Invalid material type %s. It has to be one of 'git, svn, hg, p4, tfs, dependency, package, plugin'.",
                        type)));
    }
}