public MaterialInstance findMaterialInstance(MaterialConfig materialConfig) { String cacheKey = materialKey(materialConfig.getFingerprint()); MaterialInstance materialInstance = (MaterialInstance) goCache.get(cacheKey); if (materialInstance == null) { synchronized (cacheKey) { materialInstance = (MaterialInstance) goCache.get(cacheKey); if (materialInstance == null) { DetachedCriteria hibernateCriteria = DetachedCriteria.forClass(materialConfigConverter.getInstanceType(materialConfig)); for (Map.Entry<String, Object> property : materialConfig.getSqlCriteria().entrySet()) { if (!property.getKey().equals(AbstractMaterial.SQL_CRITERIA_TYPE)) { //type is polymorphic mapping discriminator if (property.getValue() == null) { hibernateCriteria.add(isNull(property.getKey())); } else { hibernateCriteria.add(eq(property.getKey(), property.getValue())); } } } materialInstance = (MaterialInstance) firstResult(hibernateCriteria); if (materialInstance != null) { goCache.put(cacheKey, materialInstance); } } } } return materialInstance;//TODO: clone me, caller may mutate }
@Test public void shouldFindTheMaterialInstanceTypeGivenAMaterialConfig() throws Exception { MaterialConfigConverter converter = new MaterialConfigConverter(); assertEquals(SvnMaterialInstance.class, converter.getInstanceType(MaterialConfigsMother.svnMaterialConfig())); assertEquals(GitMaterialInstance.class, converter.getInstanceType(new GitMaterialConfig("abc"))); assertEquals(HgMaterialInstance.class, converter.getInstanceType(MaterialConfigsMother.hgMaterialConfig())); assertEquals(P4MaterialInstance.class, converter.getInstanceType(MaterialConfigsMother.p4MaterialConfig())); assertEquals(TfsMaterialInstance.class, converter.getInstanceType(new TfsMaterialConfig(null))); assertEquals(DependencyMaterialInstance.class, converter.getInstanceType(MaterialConfigsMother.dependencyMaterialConfig())); assertEquals(PackageMaterialInstance.class, converter.getInstanceType(MaterialConfigsMother.packageMaterialConfig())); assertEquals(PluggableSCMMaterialInstance.class, converter.getInstanceType(MaterialConfigsMother.pluggableSCMMaterialConfig())); }
@Test public void shouldThrowIfYouTryToFindTheInstanceTypeOfSomeRandomConfigType() throws Exception { MaterialConfigConverter converter = new MaterialConfigConverter(); try { converter.getInstanceType(new TestingMaterialConfig()); fail("Should have thrown up"); } catch (Exception e) { assertEquals("Unexpected type: TestingMaterialConfig", e.getMessage()); } } }