/* ############################################################################### # # # Copyright (C) 2011-2016 OpenMEAP, Inc. # # Credits to Jonathan Schang & Rob Thacher # # # # Released under the LGPLv3 # # # # OpenMEAP is free software: you can redistribute it and/or modify # # it under the terms of the GNU Lesser General Public License as published # # by the Free Software Foundation, either version 3 of the License, or # # (at your option) any later version. # # # # OpenMEAP is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU Lesser General Public License for more details. # # # # You should have received a copy of the GNU Lesser General Public License # # along with OpenMEAP. If not, see <http://www.gnu.org/licenses/>. # # # ############################################################################### */ package com.openmeap.model; import java.io.File; import java.util.Map; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.core.io.UrlResource; import com.openmeap.model.dto.Application; import com.openmeap.model.dto.ApplicationInstallation; public class ModelTestUtils { public static String OPENMEAP_TEST_DB = "openmeap_test.db"; private BeanFactory modelBeans = null; static public BeanFactory newModelBeans() { return new XmlBeanFactory(new UrlResource(ModelTestUtils.class.getResource("mock/mockModelBeans.xml")) ); } private static ClassPathXmlApplicationContext persistenceBeans = null; /** * I used this mainly to generate the DDL. * @param argv */ static public void main(String[] argv) { //resetTestDb(); //getPersistenceBean("modelManager"); if( persistenceBeans==null ) { System.setProperty("hibernate.show_sql","true"); System.setProperty("hibernate.hbm2ddl.auto","update"); System.setProperty("hibernate.dialect","org.hibernate.dialect.MySQLDialect"); System.setProperty("hibernate.connection.driver_class","com.mysql.jdbc.Driver"); System.setProperty("hibernate.connection.url","jdbc:mysql://localhost:3306/openmeap"); System.setProperty("hibernate.connection.username","openmeap"); System.setProperty("hibernate.connection.password","password"); persistenceBeans=new ClassPathXmlApplicationContext( new String[]{"/META-INF/persistenceContext.xml", "/META-INF/test/persistenceContext.xml"} ); } createModel(null); } static public synchronized Object getPersistenceBean(String name) { if( persistenceBeans==null ) { System.setProperty("hibernate.show_sql","true"); System.setProperty("hibernate.hbm2ddl.auto","update"); System.setProperty("hibernate.dialect","org.hibernate.dialect.SQLite3Dialect"); System.setProperty("hibernate.connection.driver_class","org.sqlite.JDBC"); System.setProperty("hibernate.connection.url","jdbc:sqlite:"+OPENMEAP_TEST_DB); persistenceBeans=new ClassPathXmlApplicationContext( new String[]{"/META-INF/persistenceContext.xml", "/META-INF/test/persistenceContext.xml"} ); } return persistenceBeans.getBean(name); } static public void resetTestDb() { if( persistenceBeans!=null ) { EntityManagerFactory emf = getEntityManagerFactory(); emf.close(); persistenceBeans.close(); } persistenceBeans=null; File testDbFile = new File(OPENMEAP_TEST_DB); if( testDbFile.exists() && !testDbFile.delete() ) { throw new RuntimeException("Could not delete "+OPENMEAP_TEST_DB); } } static public ModelManager createModelManager() { return (ModelManager)getPersistenceBean("modelManager"); } static public ModelService createModelService() { return (ModelServiceImpl)getPersistenceBean("modelService"); } static public EntityManagerFactory getEntityManagerFactory() { return (EntityManagerFactory)getPersistenceBean("www_entityManagerFactory"); } static public EntityManager createEntityManager() { return (EntityManager)getPersistenceBean("entityManager"); } static public void createModel(EntityManager em) { if( em==null ) { em = createEntityManager(); } try { Map<String,Map<String,? extends ModelEntity>> modelBeans = (Map<String,Map<String,? extends ModelEntity>> )ModelTestUtils.newModelBeans().getBean("mockModel"); // we need to set all (except the Device.uuid) pk's to null, // so the entity manager doesn't flip out, thinking we've passed it // a detached entity for persistence. for( Map.Entry<String,Map<String,? extends ModelEntity>> classes : modelBeans.entrySet() ) for( ModelEntity member : classes.getValue().values() ) if( ! ( member instanceof ApplicationInstallation ) ) member.setPk(null); em.getTransaction().begin(); for( String className : new String[] {"GlobalSettings","Application","ApplicationArchive","ApplicationVersion","Deployment","ApplicationInstallation"} ) { Map<String,? extends ModelEntity> members = modelBeans.get(className); for( ModelEntity member : members.values() ) { if( className.equals("Application") ) { ((Application)member).setDeployments(null); } em.persist(member); em.flush(); } } em.getTransaction().commit(); } catch(Exception e) { throw new RuntimeException(e); } } }