package br.com.geraldoferraz.testyourquery.config; import static br.com.geraldoferraz.scanyourpath.searches.filters.arguments.SearchArguments.annotatedWith; import static br.com.geraldoferraz.scanyourpath.searches.loaders.ClassPathLoaderTypes.full; import static java.util.Arrays.asList; import java.util.HashSet; import java.util.Set; import javax.persistence.Entity; import br.com.geraldoferraz.scanyourpath.Scanner; import br.com.geraldoferraz.testyourquery.config.provider.PersistenceUnitProvider; public class ConfigurationFactory { private String schema; private String showSQL = "false"; private SessionMode sessionMode = SessionMode.PER_TEST_CASE; private String basePackage; private Set<Class<?>> entities = new HashSet<Class<?>>(); private EntityManagerProvider entityManagerProvider; private String persistenceUnit; private String script; public ConfigurationFactory withSchema(String schema) { this.schema = schema; return this; } public ConfigurationFactory shouldShowSQL() { this.showSQL = "true"; return this; } public ConfigurationFactory addEntity(Class<?>... entities) { this.entities.addAll(asList(entities)); return this; } public ConfigurationFactory withSessionPerTestMode() { sessionMode = SessionMode.PER_TEST; return this; } public ConfigurationFactory withSessionPerTestCaseMode() { sessionMode = SessionMode.PER_TEST_CASE; return this; } public ConfigurationFactory searchEntitiesAt(String basePackage) { this.basePackage = basePackage; return this; } public ConfigurationFactory withProvider(EntityManagerProvider provider){ this.entityManagerProvider = provider; return this; } public ConfigurationFactory persistenceUnit(String persistenceUnit) { this.persistenceUnit = persistenceUnit; return this; } public ConfigurationFactory runScript(String script) { this.script = script; return this; } public Configuration build() { Configuration configuration = new Configuration(); configuration.setSessionMode(sessionMode); configuration.setEntityManagerProvider(getProvider()); configuration.setScript(script); return configuration; } private EntityManagerProvider getProvider() { if(entityManagerProvider == null){ if(persistenceUnit != null && !(persistenceUnit.length() == 0)){ entityManagerProvider = new PersistenceUnitProvider(persistenceUnit); }else{ HSQLDBProvider hsqldbProvider = new HSQLDBProvider(); hsqldbProvider.setSchema(schema); hsqldbProvider.setEntities(getEntities()); hsqldbProvider.setShowSQL(showSQL); entityManagerProvider = hsqldbProvider; } } return entityManagerProvider; } private Set<Class<?>> getEntities() { Set<Class<?>> entities = new HashSet<Class<?>>(); entities.addAll(this.entities); if (basePackage != null && !(basePackage.length() == 0)) { Scanner scan = new Scanner(); scan.limitSearchingPathTo(full()); Set<Class<?>> entitiesFound = scan.allClasses(annotatedWith(Entity.class)).startingIn(basePackage); entities.addAll(entitiesFound); } return entities; } }