public AgentConfig deepClone() { return new Cloner().deepClone(this); }
Cloner cloner=new Cloner(); XX clone = cloner.deepClone(someObjectOfTypeXX);
@Override public CruiseConfig cloneForValidation() { Cloner cloner = new Cloner(); BasicCruiseConfig configForValidation = cloner.deepClone(BasicCruiseConfig.this); // This needs to be done clear the cached fields else the cloned object will all get them. configForValidation.resetAllPipelineConfigsCache(); return configForValidation; }
public static PipelineConfig renamePipeline(PipelineConfig oldConfig, String newPipelineName) { PipelineConfig newConfig = new Cloner().deepClone(oldConfig); HashMap attributes = new HashMap(); attributes.put(PipelineConfig.NAME, newPipelineName); newConfig.setConfigAttributes(attributes); return newConfig; }
ClassLoader classLoader = vm.getClassLoader(); cloner = new Cloner(new ObjenesisInstantiationStrategy()); for (String immutableClass : immutableClasses) {
@Test public void shouldNotUpdateAnythingForNullAttributes() { EnvironmentConfig beforeUpdate = new Cloner().deepClone(environmentConfig); environmentConfig.setConfigAttributes(null); assertThat(environmentConfig, is(beforeUpdate)); }
@Test public void shouldBeAbleToCreateACopyOfItself() { Resource existingResource = new Resource("some-name"); existingResource.setId(2); existingResource.setBuildId(10); assertThat(existingResource, equalTo(new Resource(existingResource))); assertThat(existingResource, equalTo(new Cloner().deepClone(existingResource))); } }
@Test public void shouldCollectPipelineNameConflictErrorsInTheChildren_InMergedConfig_WhenCloned() { //we need this case because cloning has proven to be problematic with complex object graph in merged config BasicCruiseConfig mainCruiseConfig = GoConfigMother.configWithPipelines("pipeline-1"); PartialConfig partialConfig = PartialConfigMother.withPipelineInGroup("pipeline-1", "g2"); partialConfig.setOrigin(new RepoConfigOrigin()); CruiseConfig config = new BasicCruiseConfig(mainCruiseConfig, partialConfig); Cloner CLONER = new Cloner(); CruiseConfig cloned = CLONER.deepClone(config); List<ConfigErrors> allErrors = cloned.validateAfterPreprocess(); assertThat(allErrors.size(), is(2)); assertThat(allErrors.get(0).on("name"), is("You have defined multiple pipelines named 'pipeline-1'. Pipeline names must be unique. Source(s): [http://some.git at 1234fed, cruise-config.xml]")); assertThat(allErrors.get(1).on("name"), is("You have defined multiple pipelines named 'pipeline-1'. Pipeline names must be unique. Source(s): [http://some.git at 1234fed, cruise-config.xml]")); }
private void validateFetchTasksForOtherPipelines(PipelineConfigSaveValidationContext validationContext, PipelineConfig downstreamPipeline) { for (StageConfig stageConfig : downstreamPipeline.getStages()) { for (JobConfig jobConfig : stageConfig.getJobs()) { for (Task task : jobConfig.getTasks()) { if (task instanceof FetchTask) { FetchTask fetchTask = (FetchTask) task; if (fetchTask.getPipelineNamePathFromAncestor() != null && !StringUtils.isBlank(CaseInsensitiveString.str(fetchTask.getPipelineNamePathFromAncestor().getPath())) && fetchTask.getPipelineNamePathFromAncestor().pathIncludingAncestor().contains(pipelineConfig.name())) { fetchTask = new Cloner().deepClone(fetchTask); fetchTask.validateTask(validationContext.withParent(downstreamPipeline).withParent(stageConfig).withParent(jobConfig)); List<String> allErrors = fetchTask.errors().getAll(); for (String error : allErrors) { pipelineConfig.errors().add("base", error); } } } } } } }
private void validateDependencyMaterialsForDownstreams(PipelineConfigSaveValidationContext validationContext, CaseInsensitiveString selected, PipelineConfig downstreamPipeline) { Node dependenciesOfSelectedPipeline = validationContext.getDependencyMaterialsFor(selected); for (Node.DependencyNode dependencyNode : dependenciesOfSelectedPipeline.getDependencies()) { if (dependencyNode.getPipelineName().equals(pipelineConfig.name())) { for (MaterialConfig materialConfig : downstreamPipeline.materialConfigs()) { if (materialConfig instanceof DependencyMaterialConfig) { DependencyMaterialConfig dependencyMaterialConfig = new Cloner().deepClone((DependencyMaterialConfig) materialConfig); dependencyMaterialConfig.validate(validationContext.withParent(downstreamPipeline)); List<String> allErrors = dependencyMaterialConfig.errors().getAll(); for (String error : allErrors) { pipelineConfig.errors().add("base", error); } } } } } }
@Test public void shouldWalkCruiseConfigObjectsParallelly() { CruiseConfig cruiseConfig = GoConfigMother.configWithPipelines("bad pipeline name"); CruiseConfig rawCruiseConfig = new Cloner().deepClone(cruiseConfig); MagicalGoConfigXmlLoader.validate(cruiseConfig); cruiseConfig.copyErrorsTo(rawCruiseConfig); assertThat(rawCruiseConfig.pipelineConfigByName(new CaseInsensitiveString("bad pipeline name")).errors(), is(cruiseConfig.pipelineConfigByName(new CaseInsensitiveString("bad pipeline name")).errors())); }
BasicCruiseConfig preprocessed = new Cloner().deepClone(config); new ConfigParamPreprocessor().process(preprocessed); config.encryptSecureProperties(preprocessed);
Cloner cloner=new Cloner(); XX clone = cloner.deepClone(someObjectOfTypeXX);
@Test public void shouldCopyErrorsForFieldsOnPipelineConfig(){ PipelineConfig pipelineConfig = PipelineConfigMother.pipelineConfig("pipeline", MaterialConfigsMother.defaultMaterialConfigs(), new JobConfigs(JobConfigMother.createJobConfigWithJobNameAndEmptyResources())); pipelineConfig.setVariables(new EnvironmentVariablesConfig(asList(new EnvironmentVariableConfig("name", "value")))); PipelineConfig pipelineWithErrors = new Cloner().deepClone(pipelineConfig); pipelineWithErrors.getVariables().get(0).addError("name", "error on environment variable"); pipelineWithErrors.first().addError("name", "error on stage"); pipelineWithErrors.first().getJobs().first().addError("name", "error on job"); BasicCruiseConfig.copyErrors(pipelineWithErrors, pipelineConfig); assertThat(pipelineConfig.getVariables().get(0).errors().on("name"), is("error on environment variable")); assertThat(pipelineConfig.first().errors().on("name"), is("error on stage")); assertThat(pipelineConfig.first().getJobs().first().errors().on("name"), is("error on job")); }
Cloner cloner = new Cloner(); MyClass clone = cloner.deepClone(o); // clone is a deep-clone of o
public static Cloner newCloner() { Cloner cloner = new Cloner(); //Implement custom cloning for INDArrays (default can have problems with off-heap and pointers) //Sadly: the cloner library does NOT support interfaces here, hence we need to use the actual classes //cloner.registerFastCloner(INDArray.class, new INDArrayFastCloner()); //Does not work due to interface IFastCloner fc = new INDArrayFastCloner(); cloner.registerFastCloner(Nd4j.getBackend().getNDArrayClass(), fc); cloner.registerFastCloner(Nd4j.getBackend().getComplexNDArrayClass(), fc); //Same thing with DataBuffers: off heap -> cloner library chokes on them, but need to know the concrete // buffer classes, not just the interface IFastCloner fc2 = new DataBufferFastCloner(); DataBufferFactory d = Nd4j.getDataBufferFactory(); doReg(cloner, fc2, d.intBufferClass()); doReg(cloner, fc2, d.longBufferClass()); doReg(cloner, fc2, d.halfBufferClass()); doReg(cloner, fc2, d.floatBufferClass()); doReg(cloner, fc2, d.doubleBufferClass()); doReg(cloner, fc2, CompressedDataBuffer.class); return cloner; }
@Test public void shouldAddErrorsToRawCruiseConfigWhenTemplateHasErrors() { CruiseConfig cruiseConfig = GoConfigMother.configWithPipelines("pipeline-1"); cruiseConfig.getTemplates().add( new PipelineTemplateConfig(new CaseInsensitiveString("invalid template name"), new StageConfig(new CaseInsensitiveString("stage-1"), new JobConfigs(new JobConfig("job-1")) ))); PipelineConfig pipelineWithTemplate = new PipelineConfig(new CaseInsensitiveString("pipeline-with-template"), MaterialConfigsMother.defaultMaterialConfigs()); pipelineWithTemplate.setTemplateName(new CaseInsensitiveString("invalid template name")); cruiseConfig.getGroups().get(0).add(pipelineWithTemplate); CruiseConfig rawCruiseConfig = new Cloner().deepClone(cruiseConfig); MagicalGoConfigXmlLoader.validate(cruiseConfig); cruiseConfig.copyErrorsTo(rawCruiseConfig); ConfigErrors templateErrors = rawCruiseConfig.getTemplateByName(new CaseInsensitiveString("invalid template name")).errors(); assertThat(templateErrors.getAll().size(), is(1)); assertThat(templateErrors.getAll().get(0), is("Invalid template name 'invalid template name'. This must be alphanumeric and can contain underscores and periods (however, it cannot start with a period). The maximum allowed length is 255 characters.")); }
@Test public void shouldHandlePipelinesWithTemplates() { CruiseConfig cruiseConfig = GoConfigMother.configWithPipelines("pipeline-1"); cruiseConfig.getTemplates().add( new PipelineTemplateConfig(new CaseInsensitiveString("template-1"), new StageConfig(new CaseInsensitiveString("invalid stage name"), new JobConfigs(new JobConfig("job-1")) ))); PipelineConfig pipelineWithTemplate = new PipelineConfig(new CaseInsensitiveString("pipeline-with-template"), MaterialConfigsMother.defaultMaterialConfigs()); pipelineWithTemplate.setTemplateName(new CaseInsensitiveString("template-1")); cruiseConfig.getGroups().get(0).add(pipelineWithTemplate); CruiseConfig rawCruiseConfig = new Cloner().deepClone(cruiseConfig); MagicalGoConfigXmlLoader.validate(cruiseConfig); cruiseConfig.copyErrorsTo(rawCruiseConfig); assertThat(rawCruiseConfig.pipelineConfigByName(new CaseInsensitiveString("pipeline-with-template")).errors().isEmpty(), is(true)); assertThat(cruiseConfig.pipelineConfigByName(new CaseInsensitiveString("pipeline-with-template")).getStage(new CaseInsensitiveString("invalid stage name")).errors().isEmpty(), is(false)); assertThat(rawCruiseConfig.getTemplateByName(new CaseInsensitiveString("template-1")).errors().isEmpty(), is(true)); }
@Test public void shouldDetectCyclicDependencies() { String pipelineName = "p1"; BasicCruiseConfig cruiseConfig = GoConfigMother.configWithPipelines(pipelineName, "p2", "p3"); PipelineConfig p2 = cruiseConfig.getPipelineConfigByName(new CaseInsensitiveString("p2")); p2.addMaterialConfig(new DependencyMaterialConfig(new CaseInsensitiveString(pipelineName), new CaseInsensitiveString("stage"))); PipelineConfig p3 = cruiseConfig.getPipelineConfigByName(new CaseInsensitiveString("p3")); p3.addMaterialConfig(new DependencyMaterialConfig(new CaseInsensitiveString("p2"), new CaseInsensitiveString("stage"))); PipelineConfig p1 = cruiseConfig.getPipelineConfigByName(new CaseInsensitiveString(pipelineName)); p1 = new Cloner().deepClone(p1); // Do not remove cloning else it changes the underlying cache object defeating the purpose of the test. p1.addMaterialConfig(new DependencyMaterialConfig(new CaseInsensitiveString("p3"), new CaseInsensitiveString("stage"))); p1.validateTree(PipelineConfigSaveValidationContext.forChain(true, cruiseConfig.getGroups().first().getGroup(), cruiseConfig, p1)); assertThat(p1.materialConfigs().errors().isEmpty(), is(false)); assertThat(p1.materialConfigs().errors().on("base"), is("Circular dependency: p1 <- p2 <- p3 <- p1")); }
/** * @return a standard cloner instance, will do for most use cases */ public static Cloner standard() { return new Cloner(); }