package com.github.agiledon.sisyphus; import com.google.common.base.CaseFormat; import com.google.common.base.Joiner; import com.google.common.io.Files; import com.github.agiledon.sisyphus.composer.Composer; import com.github.agiledon.sisyphus.composer.UnknownComposer; import java.util.Map; import static com.google.common.base.CaseFormat.UPPER_CAMEL; import static com.google.common.collect.Maps.newHashMap; public final class Fixture { private Fixture() {} private static Map<String, Composer> composers = newHashMap(); public static Composer from(String resourceName) { String fileExtension = Files.getFileExtension(resourceName); Composer composer = composers.get(fileExtension); if (composer == null) { composer = createComposer(fileExtension); composers.put(fileExtension, composer); } composer.setResourceName(resourceName); return composer; } @SuppressWarnings("unchecked") private static Composer createComposer(String fileExtension) { try { Class<Composer> aClass = (Class<Composer>) Class.forName(getClassFullName(fileExtension)); return aClass.newInstance(); } catch (ClassNotFoundException e) { return new UnknownComposer(); } catch (InstantiationException e) { return new UnknownComposer(); } catch (IllegalAccessException e) { return new UnknownComposer(); } catch (Exception e) { return new UnknownComposer(); } } private static String getClassFullName(String fileExtension) { String fullNamePrefix = "com.github.agiledon.sisyphus.composer."; String classNameSuffix = "Composer"; String classNamePrefix = CaseFormat.LOWER_HYPHEN.to(UPPER_CAMEL, fileExtension); return Joiner.on("").join(fullNamePrefix, classNamePrefix, classNameSuffix); } }