/*
* Copyright 2017 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.helper;
import java.util.*;
import com.thoughtworks.go.config.CaseInsensitiveString;
import com.thoughtworks.go.config.PipelineConfig;
import com.thoughtworks.go.config.materials.Materials;
import com.thoughtworks.go.config.materials.dependency.DependencyMaterial;
import com.thoughtworks.go.config.materials.svn.SvnMaterial;
import com.thoughtworks.go.domain.MaterialRevision;
import com.thoughtworks.go.domain.MaterialRevisions;
import com.thoughtworks.go.domain.buildcause.BuildCause;
import com.thoughtworks.go.domain.materials.Material;
import com.thoughtworks.go.domain.materials.Modification;
import com.thoughtworks.go.domain.materials.ModifiedAction;
import com.thoughtworks.go.domain.materials.dependency.DependencyMaterialRevision;
import com.thoughtworks.go.server.domain.Username;
import com.thoughtworks.go.server.service.MaterialConfigConverter;
import com.thoughtworks.go.util.GoConstants;
import org.joda.time.DateTime;
public class ModificationsMother {
public static final String MOD_COMMENT = "Fixing the not checked in files";
public static final String MOD_COMMENT_2 = "Added the README file";
public static final String MOD_COMMENT_3 = "Added the README file with <html />";
public static final String MOD_USER = "lgao";
public static final String MOD_USER_COMMITTER = "committer";
public static final String MOD_USER_WITH_HTML_CHAR = "committer <html />";
public static final Date TWO_DAYS_AGO_CHECKIN = new DateTime().minusDays(2).toDate();
public static final Date YESTERDAY_CHECKIN = new DateTime().minusDays(1).toDate();
public static final Date TODAY_CHECKIN = new Date();
public static final ModifiedAction MOD_MODIFIED_ACTION = ModifiedAction.added;
public static final String MOD_TYPE = "svn";
public static final String MOD_FILE_BUILD_XML = "build.xml";
public static final String MOD_FILE_OLD_BUILD_XML = "oldbuild.xml";
public static final String MOD_FILE_READ_ME = "README.txt";
public static final String EMAIL_ADDRESS = "foo@bar.com";
private static int revision = 0;
public static String currentRevision() {
return Integer.toString(revision);
}
protected ModificationsMother() {
}
public static BuildCause modifySomeFiles(PipelineConfig pipelineConfig) {
return modifySomeFilesAndTriggerAs(pipelineConfig, GoConstants.DEFAULT_APPROVED_BY);
}
public static BuildCause modifySomeFilesAndTriggerAs(PipelineConfig pipelineConfig, String approver) {
return BuildCause.createWithModifications(modifyOneFile(pipelineConfig), approver);
}
public static BuildCause modifySomeFiles(PipelineConfig pipelineConfig, String revision) {
return buildCauseForOneModifiedFile(pipelineConfig, revision);
}
public static BuildCause forceBuild(PipelineConfig pipelineConfig) {
return BuildCause.createManualForced(modifyOneFile(pipelineConfig), Username.ANONYMOUS);
}
public static MaterialRevisions modifyOneFile(PipelineConfig pipelineConfig) {
return modifyOneFile(new MaterialConfigConverter().toMaterials(pipelineConfig.materialConfigs()), nextRevision());
}
public static MaterialRevisions modifyOneFile(Materials materials) {
return modifyOneFile(materials, nextRevision());
}
public static String nextRevision() {
revision += 1;
return Integer.toString(revision);
}
public static BuildCause buildCauseForOneModifiedFile(PipelineConfig pipelineConfig, String revision, String comment, String committer) {
return BuildCause.createWithModifications(modifyOneFile(new MaterialConfigConverter().toMaterials(pipelineConfig.materialConfigs()), revision, comment, committer), "");
}
public static BuildCause buildCauseForOneModifiedFile(PipelineConfig pipelineConfig, String revision) {
return BuildCause.createWithModifications(modifyOneFile(new MaterialConfigConverter().toMaterials(pipelineConfig.materialConfigs()), revision), "");
}
public static MaterialRevisions multipleModificationsInHg(PipelineConfig pipelineConfig) {
MaterialRevisions materialRevisions = new MaterialRevisions();
for (Material material : new MaterialConfigConverter().toMaterials(pipelineConfig.materialConfigs())) {
materialRevisions.addRevision(material, multipleModificationsInHg());
}
return materialRevisions;
}
public static MaterialRevisions createHgMaterialRevisions() {
MaterialRevisions materialRevisions = new MaterialRevisions();
materialRevisions.addRevision(MaterialsMother.hgMaterial(), multipleModificationsInHg());
return materialRevisions;
}
public static MaterialRevision createPackageMaterialRevision(String revision) {
return createPackageMaterialRevision(revision, "user", "");
}
public static MaterialRevision createPackageMaterialRevision(String revision, String user, String comment) {
Material material = MaterialsMother.packageMaterial();
List<Modification> modifications = new ArrayList<>();
modifications.add(new Modification(user, comment, null, new Date(), revision));
return new MaterialRevision(material, modifications);
}
public static MaterialRevision createPipelineMaterialRevision(String stageIdentifier) {
Material material = MaterialsMother.dependencyMaterial();
List<Modification> modifications = new ArrayList<>();
modifications.add(new Modification(new Date(), stageIdentifier, "123", 1L));
return new MaterialRevision(material, modifications);
}
public static List<Modification> multipleModificationsInHg() {
final ArrayList<Modification> modifications = new ArrayList<>();
modifications.add(new Modification("user2", "comment2", "email2", TODAY_CHECKIN, "9fdcf27f16eadc362733328dd481d8a2c29915e1"));
modifications.add(new Modification("user1", "comment1", "email1", TWO_DAYS_AGO_CHECKIN, "eef77acd79809fc14ed82b79a312648d4a2801c6"));
return modifications;
}
public static MaterialRevisions modifyOneFile(Materials materials, String revision) {
return modifyOneFile(materials, revision, MOD_COMMENT);
}
public static MaterialRevisions modifyOneFile(Materials materials, String revision, String comment) {
return modifyOneFile(materials, revision, comment, MOD_USER);
}
public static MaterialRevisions modifyOneFile(Materials materials, String revision, String comment, String committer) {
MaterialRevisions materialRevisions = new MaterialRevisions();
Materials expandedMaterials = new Materials();
for (Material material : materials) {
expandedMaterials.add(material);
}
for (Material material : expandedMaterials) {
Modification modification;
if (material instanceof DependencyMaterial) {
DependencyMaterial dependencyMaterial = (DependencyMaterial) material;
modification = oneModifiedFile(committer, dependencyMaterial.getPipelineName() + "/1/" + dependencyMaterial.getStageName() + "/" + revision, TWO_DAYS_AGO_CHECKIN,
dependencyMaterial.getPipelineName() + "-1.2.3");
} else {
modification = oneModifiedFile(committer, revision, comment, TWO_DAYS_AGO_CHECKIN);
}
materialRevisions.addRevision(new MaterialRevision(material, true, modification));
}
return materialRevisions;
}
private static Modification oneModifiedFile(String user, String revision, Date date, String pipelineLabel) {
Modification modification = new Modification(user, MOD_COMMENT, EMAIL_ADDRESS, date, revision);
modification.setPipelineLabel(pipelineLabel);
modification.createModifiedFile(MOD_FILE_BUILD_XML, "\\build", MOD_MODIFIED_ACTION);
return modification;
}
public static MaterialRevision dependencyMaterialRevision(String pipelineName, int pipelineCounter, String pipelineLabel, String stageName, int stageCounter, Date modifiedTime) {
return dependencyMaterialRevision(pipelineCounter, pipelineLabel, stageCounter, new DependencyMaterial(new CaseInsensitiveString(pipelineName), new CaseInsensitiveString(stageName)), modifiedTime);
}
public static MaterialRevision changedDependencyMaterialRevision(String pipelineName, int pipelineCounter, String pipelineLabel, String stageName, int stageCounter, Date modifiedTime) {
MaterialRevision materialRevision = dependencyMaterialRevision(pipelineName, pipelineCounter, pipelineLabel, stageName, stageCounter, modifiedTime);
materialRevision.markAsChanged();
return materialRevision;
}
public static MaterialRevision dependencyMaterialRevision(int pipelineCounter, String pipelineLabel, int stageCounter, DependencyMaterial material, Date modifiedTime) {
return DependencyMaterialRevision.create(CaseInsensitiveString.str(material.getPipelineName()), pipelineCounter, pipelineLabel, CaseInsensitiveString.str(material.getStageName()), stageCounter).convert(material, modifiedTime);
}
public static MaterialRevisions oneUserOneFile() {
MaterialRevisions materialRevisions = new MaterialRevisions();
SvnMaterial material = MaterialsMother.svnMaterial();
material.setName(new CaseInsensitiveString("svnMaterial"));
materialRevisions.addRevision(material, oneModifiedFile(nextRevision()));
return materialRevisions;
}
public static Modification withModifiedFileWhoseNameLengthIsOneK() {
Modification modification = new Modification(MOD_USER, MOD_COMMENT, EMAIL_ADDRESS,
TWO_DAYS_AGO_CHECKIN, "rev_1");
modification.createModifiedFile(generateString(1024), "\\build", MOD_MODIFIED_ACTION);
return modification;
}
public static Modification withModifiedFileWhoseNameLengthIsMoreThanOneK() {
Modification modification = new Modification(MOD_USER, MOD_COMMENT, EMAIL_ADDRESS,
TWO_DAYS_AGO_CHECKIN, "rev_1");
modification.createModifiedFile(generateString(1024 + 1), "\\build", MOD_MODIFIED_ACTION);
return modification;
}
private static String generateString(int length) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < length; i++) {
builder.append('a');
}
return builder.toString();
}
public static Modification oneModifiedFile(String modRevision) {
return oneModifiedFile(MOD_USER, modRevision, TWO_DAYS_AGO_CHECKIN);
}
public static Modification oneModifiedFile(String modRevision, Date date) {
return oneModifiedFile(MOD_USER, modRevision, date);
}
public static Modification oneModifiedFile(String modUser, String modRevision, Date date) {
return oneModifiedFile(modUser, modRevision, MOD_COMMENT, date);
}
public static Modification oneModifiedFile(String modUser, String modRevision, String comment, Date date) {
Modification modification = new Modification(modUser, comment, EMAIL_ADDRESS, date, modRevision);
modification.createModifiedFile(MOD_FILE_BUILD_XML, "\\build", MOD_MODIFIED_ACTION);
return modification;
}
public static MaterialRevisions multipleModifications() {
return multipleModifications("svn-material");
}
public static MaterialRevisions multipleModifications(String name) {
SvnMaterial material = MaterialsMother.svnMaterial("http://foo/bar/baz", "folder", "username", "password", false, "*.txt");
material.setName(new CaseInsensitiveString(name));
return multipleModifications(material);
}
public static MaterialRevisions multipleModifications(Material material) {
MaterialRevisions materialRevisions = new MaterialRevisions();
materialRevisions.addRevision(material, multipleModificationList());
return materialRevisions;
}
public static MaterialRevisions multipleModifications(PipelineConfig pipelineConfig) {
MaterialRevisions materialRevisions = new MaterialRevisions();
for (Material material : new MaterialConfigConverter().toMaterials(pipelineConfig.materialConfigs())) {
materialRevisions.addRevision(material, multipleModificationList());
}
return materialRevisions;
}
public static List<Modification> multipleModificationList() {
return multipleModificationList(new RevisionToUse() {
public String next() {
return nextRevision();
}
});
}
public static List<Modification> multipleModificationList(final int initialRevision) {
return multipleModificationList(new RevisionToUse() {
int revision = initialRevision;
public String next() {
return String.valueOf(revision++);
}
});
}
public static List<Modification> multipleModificationList(RevisionToUse revisionToUse) {
Modification modification1 = new Modification(MOD_USER, MOD_COMMENT, EMAIL_ADDRESS,
TWO_DAYS_AGO_CHECKIN, revisionToUse.next());
modification1.createModifiedFile(MOD_FILE_BUILD_XML, "\\build", MOD_MODIFIED_ACTION);
Modification modification2 = new Modification(MOD_USER_COMMITTER, MOD_COMMENT_2, EMAIL_ADDRESS,
YESTERDAY_CHECKIN, revisionToUse.next());
modification2.createModifiedFile(MOD_FILE_OLD_BUILD_XML, "\\build", MOD_MODIFIED_ACTION);
Modification modification3 = new Modification(MOD_USER_WITH_HTML_CHAR, MOD_COMMENT_3, EMAIL_ADDRESS,
TODAY_CHECKIN, revisionToUse.next());
modification3.createModifiedFile(MOD_FILE_READ_ME, "\\build", MOD_MODIFIED_ACTION);
List<Modification> modifications = new ArrayList<>();
modifications.add(modification3);
modifications.add(modification2);
modifications.add(modification1);
return modifications;
}
public static MaterialRevisions empty() {
return new MaterialRevisions();
}
public static BuildCause modifyNoFiles(PipelineConfig config) {
MaterialRevisions materialRevisions = new MaterialRevisions();
for (Material material : new MaterialConfigConverter().toMaterials(config.materialConfigs())) {
ArrayList<Modification> list = new ArrayList<>();
list.add(new Modification("no-user", "comment", "dummy-email", new Date(), "Dummy Modification"+ UUID.randomUUID().toString()));
materialRevisions.addRevision(material, list);
}
return BuildCause.createWithModifications(materialRevisions, "");
}
public static Modification aCheckIn(String revision, String... files) {
return checkinWithComment(revision, MOD_COMMENT_2, TODAY_CHECKIN, files);
}
public static Modification checkinWithComment(String revision, String comment, Date checkinTime, String... files) {
return checkinWithComment(revision, comment, MOD_USER_COMMITTER, EMAIL_ADDRESS, checkinTime, files);
}
public static Modification checkinWithComment(String revision, String comment, String user, String email, Date checkinTime, String... files) {
Modification modification = new Modification(user, comment, email, checkinTime, revision);
for (String file : files) {
modification.createModifiedFile(file, null, ModifiedAction.added);
}
return modification;
}
public static List<Modification> multipleCheckin(Modification... modifications) {
return Arrays.asList(modifications);
}
public static MaterialRevisions getMaterialRevisions(HashMap<Material, String> checkins) {
MaterialRevisions revisions = new MaterialRevisions();
for (Material material : checkins.keySet()) {
revisions.addRevision(material, aCheckIn(checkins.get(material), "file1.txt"));
}
return revisions;
}
public static MaterialRevisions createSvnMaterialRevisions(Modification modification) {
SvnMaterial svnMaterial = MaterialsMother.svnMaterial();
return createMaterialRevisions(svnMaterial, modification);
}
public static MaterialRevisions createMaterialRevisions(SvnMaterial svnMaterial, Modification modification) {
List<Modification> modifications = new ArrayList<>();
modifications.add(modification);
MaterialRevisions revisions = new MaterialRevisions();
revisions.addRevision(svnMaterial, modifications);
return revisions;
}
public static MaterialRevisions createP4MaterialRevisions(Modification modification) {
List<Modification> modifications = new ArrayList<>();
modifications.add(modification);
Material svnMaterial = MaterialsMother.p4Material();
MaterialRevisions revisions = new MaterialRevisions();
revisions.addRevision(svnMaterial, modifications);
return revisions;
}
public static MaterialRevisions createSvnMaterialWithMultipleRevisions(long id, Modification... modifications) {
return multipleRevisions(MaterialsMother.svnMaterial(), id, modifications);
}
public static MaterialRevisions createHgMaterialWithMultipleRevisions(long id, Modification... modifications) {
return multipleRevisions(MaterialsMother.hgMaterial(), id, modifications);
}
public static MaterialRevisions multipleRevisions(Material material, long id, Modification... modifications) {
material.setId(id);
MaterialRevisions revisions = new MaterialRevisions();
revisions.addRevision(material, modifications);
return revisions;
}
private static interface RevisionToUse {
String next();
}
}