package org.dicadeveloper.weplantaforest.admin.dev; import java.io.File; import java.io.IOException; import java.math.BigDecimal; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.util.Iterator; import java.util.List; import java.util.Random; import javax.transaction.Transactional; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.dicadeveloper.weplantaforest.admin.FileSystemInjector; import org.dicadeveloper.weplantaforest.admin.cart.Cart; import org.dicadeveloper.weplantaforest.admin.cart.CartItem; import org.dicadeveloper.weplantaforest.admin.cart.CartRepository; import org.dicadeveloper.weplantaforest.admin.cart.CartState; import org.dicadeveloper.weplantaforest.admin.project.Price; import org.dicadeveloper.weplantaforest.admin.project.Price.ScontoType; import org.dicadeveloper.weplantaforest.admin.project.PriceRepository; import org.dicadeveloper.weplantaforest.admin.project.Project; import org.dicadeveloper.weplantaforest.admin.project.ProjectArticle; import org.dicadeveloper.weplantaforest.admin.project.ProjectArticleRepository; import org.dicadeveloper.weplantaforest.admin.project.ProjectImage; import org.dicadeveloper.weplantaforest.admin.project.ProjectImageRepository; import org.dicadeveloper.weplantaforest.admin.project.ProjectRepository; import org.dicadeveloper.weplantaforest.admin.slider.MainSliderImage; import org.dicadeveloper.weplantaforest.admin.slider.MainSliderImageRepository; import org.dicadeveloper.weplantaforest.admin.tree.Tree; import org.dicadeveloper.weplantaforest.admin.tree.TreeRepository; import org.dicadeveloper.weplantaforest.admin.treeType.TreeType; import org.dicadeveloper.weplantaforest.admin.treeType.TreeTypeRepository; import org.dicadeveloper.weplantaforest.admin.user.User; import org.dicadeveloper.weplantaforest.admin.user.UserRepository; import org.dicadeveloper.weplantaforest.common.support.TimeConstants; import org.dicadeveloper.weplantaforest.common.user.Role; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.stereotype.Service; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterators; import lombok.NonNull; /** * Provides the functionality to easily populate the database with test data. */ @Service public class DatabasePopulator { protected final Log LOG = LogFactory.getLog(DatabasePopulator.class.getName()); private final static List<String> DEFAULT_TREE_TYPES = ImmutableList.of("<mlpr>GERMAN<equ>Buche<sep>ENGLISH<equ>Beech Tree<sep>ITALIAN<equ>Beech Tree<sep>", "Kiefer", "Birke", "Ahorn", "Eiche", "Esche", "Linde", "Wildapfel", "Robinie", "Espe", "Default"); private final static List<String> DEFAULT_USERS = ImmutableList.of("admin", "Martin", "Sebastian", "Johannes", "Gabür", "Micha", "Christian", "Sven", "Axl", "Philipp", "Adam", "Bert", "Claus", "Django", "Emil", "Mr NoTree"); public final static String DUMMY_IMAGE_FOLDER = "src/test/resources/images/"; private ProjectRepository _projectRepository; private UserRepository _userRepository; private TreeTypeRepository _treeTypeRepository; private TreeRepository _treeRepository; private ProjectArticleRepository _projectArticleRepository; private CartRepository _cartRepository; private PriceRepository _priceRepository; private ProjectImageRepository _projectImageRepository; private MainSliderImageRepository _mainSliderImageRepository; @Autowired private @NonNull Environment _env; @Autowired public DatabasePopulator(ProjectRepository projectRepository, UserRepository userRepository, TreeTypeRepository treeTypeRepository, TreeRepository treeRepository, ProjectArticleRepository projectArticleRepository, PriceRepository priceRepository, CartRepository cartRepository, ProjectImageRepository projectImageRepository, MainSliderImageRepository mainSliderImageRepository) { _projectRepository = projectRepository; _userRepository = userRepository; _treeTypeRepository = treeTypeRepository; _treeRepository = treeRepository; _projectArticleRepository = projectArticleRepository; _cartRepository = cartRepository; _priceRepository = priceRepository; _projectImageRepository = projectImageRepository; _mainSliderImageRepository = mainSliderImageRepository; } public DatabasePopulator insertProjects() { for (int i = 0; i < 10; i++) { String projectName = "Project " + (i + 1) + " von " + DEFAULT_USERS.get(i); Project project = new Project(); project.setName(projectName); project.setManager(_userRepository.findByName(DEFAULT_USERS.get(i))); project.setDescription( "<mlpr>GERMAN<equ><p>Projektbeschreibung</p><sep>ENGLISH<equ><p>project description</p><sep>ITALIAN<equ>projecto descriptiones<sep>"); project.setImageFileName("project" + (i + 1) + ".jpg"); if (i < 5) { project.setShopActive(false); project.setVisible(false); } else { project.setShopActive(true); project.setVisible(true); } switch (i) { case 0: project.setLatitude(52.4626536896816f); project.setLongitude(13.607287460327143f); break; case 1: project.setLatitude(37.235000f); project.setLongitude(-115.811111f); break; case 2: project.setLatitude(52.4626536896816f); project.setLongitude(13.607287460327143f); break; case 3: project.setLatitude(52.4626536896816f); project.setLongitude(13.607287460327143f); break; case 4: project.setLatitude(52.4626536896816f); project.setLongitude(13.607287460327143f); break; case 5: project.setLatitude(52.4626536896816f); project.setLongitude(13.607287460327143f); break; case 6: project.setLatitude(52.4626536896816f); project.setLongitude(13.607287460327143f); break; case 7: project.setLatitude(52.4626536896816f); project.setLongitude(13.607287460327143f); break; case 8: project.setLatitude(52.4626536896816f); project.setLongitude(13.607287460327143f); break; default: project.setLatitude(51.482691f); project.setLongitude(11.969947f); break; } _projectRepository.save(project); } return this; } public DatabasePopulator insertProjectImages() { for (int i = 1; i <= 10; i++) { for (int j = 1; j <= 5; j++) { ProjectImage projectImage = new ProjectImage(); projectImage.setTitle("image " + j); projectImage.setDescription("<mlpr>GERMAN<equ>Bildbeschreibung " + j +"<sep>ENGLISH<equ>image description " + j +"<sep>ITALIAN<equ>projecto descriptiones<sep>"); projectImage.setImageFileName("project" + i + "_" + j + ".jpg"); projectImage.setDate(100000000L * j); projectImage.setProject(_projectRepository.findOne((long) i)); _projectImageRepository.save(projectImage); } } return this; } public DatabasePopulator insertDefaultTreeTypes() { DEFAULT_TREE_TYPES.forEach((treeTypeName) -> { TreeType treeType = _treeTypeRepository.findByName(treeTypeName); if (null == treeType) { final String description = "Die " + treeTypeName + " bilden eine Pflanzengattung in der Unterfamilie der Rosskastaniengewächse (Hippocastanoideae) innerhalb der Familie der Seifenbaumgewächse (Sapindaceae). "; treeType = new TreeType(); treeType.setName(treeTypeName); treeType.setDescription(description); double co2Savings = 0.02; switch (treeTypeName) { case "Robin": case "Wildapfel": co2Savings = 0.01; break; case "Default": co2Savings = 0.011; break; } treeType.setAnnualCo2SavingInTons(co2Savings); treeType.setImageFile(treeTypeName + ".jpeg"); _treeTypeRepository.save(treeType); } }); return this; } public DatabasePopulator insertUsers() { long timeNoew = System.currentTimeMillis(); for (int i = 0; i < DEFAULT_USERS.size(); i++) { User user = new User(); user.setName(DEFAULT_USERS.get(i)); user.setEnabled(true); user.setRegDate(timeNoew - (i + 1) * TimeConstants.YEAR_IN_MILLISECONDS); user.setMail(DEFAULT_USERS.get(i) + "@" + DEFAULT_USERS.get(i) + ".de"); if (i < 5) { user.addRole(Role.ADMIN); }else if(i >=5 && i < 8){ user.addRole(Role.ARTICLE_MANAGER); } user.addRole(Role.USER); _userRepository.save(user); } return this; } public DatabasePopulator insertTrees(int count) { Iterator<ProjectArticle> cyclingProjectArticles = Iterators.cycle(loadProjectArticles()); long timeOfPlant = System.currentTimeMillis(); ProjectArticle articleToPlant = cyclingProjectArticles.next(); for (int i = 0; i < count; i++) { if (i > 0 && i % 15 == 0) { articleToPlant = cyclingProjectArticles.next(); } Tree treeDto = new Tree(); treeDto.setAmount(i % 20 + 1); treeDto.setLatitude(i); treeDto.setLongitude(i); treeDto.setTreeType(articleToPlant.getTreeType()); treeDto.setPlantedOn(timeOfPlant - i * 100000000L); treeDto.setOwner(_userRepository.findByName(DEFAULT_USERS.get(i % 15))); treeDto.setProjectArticle(articleToPlant); _treeRepository.save(treeDto); } return this; } public DatabasePopulator insertProjectArticles() { for (Project project : _projectRepository.findAll()) { for (int i = 0; i < 5; i++) { Price price = createPrice(); ProjectArticle plantArticle = new ProjectArticle(); plantArticle.setTreeType(_treeTypeRepository.findByName(DEFAULT_TREE_TYPES.get(i))); plantArticle.setProject(project); plantArticle.setPrice(price); plantArticle.setAmount(10000L); _projectArticleRepository.save(plantArticle); } } return this; } private Iterable<ProjectArticle> loadProjectArticles() { return _projectArticleRepository.findAll(); } private Price createPrice() { Price price = new Price(); Random random = new Random(); double randomPrice = random.nextDouble() * 6; double randomMarge = randomPrice / 2; price.setAmount(new BigDecimal(randomPrice)); price.setScontoType(ScontoType.NONE); price.setMarge(new BigDecimal(randomMarge)); _priceRepository.save(price); return price; } @Transactional public DatabasePopulator insertCarts() { for (int i = 0; i < 1000; i++) { Cart cart = new Cart(); User buyer = _userRepository.findByName(DEFAULT_USERS.get(i % 10)); cart.setBuyer(buyer); cart.setCartState(CartState.values()[i % 5]); cart.setCallBackVorname(DEFAULT_USERS.get(i % 10)); cart.setCallBackNachname("Nachname"); cart.setCallBackFirma(DEFAULT_USERS.get(i % 10) + " Industries"); Tree tree = new Tree(); ProjectArticle projectArticle = _projectArticleRepository.findOne(1L); tree.setAmount(i % 10 + 1); tree.setProjectArticle(projectArticle); tree.setTreeType(projectArticle.getTreeType()); tree.setOwner(buyer); CartItem cartItem = new CartItem(); cartItem.setTree(tree); cart.addCartItem(cartItem); _cartRepository.save(cart); } return this; } public DatabasePopulator addMainImagesToProjectFolder() { for (int i = 1; i <= _projectRepository.count(); i++) { String mainImageFileName = "project" + i + ".jpg"; Path imageFileSrc = new File(DUMMY_IMAGE_FOLDER + mainImageFileName).toPath(); String imageFileDest = FileSystemInjector.getImageFolderForProjects() + "/" + mainImageFileName; createProjectImageFileAndCopySrcFileIntoIt(imageFileSrc, imageFileDest); } return this; } public DatabasePopulator addProjectImages() { for (int i = 0; i < _projectRepository.count(); i++) { for (int j = 1; j <= 5; j++) { String projectImageName = "project" + i + "_" + j + ".jpg"; String imageSrcName = "project" + j + ".jpg"; Path imageFileSrc = new File(DUMMY_IMAGE_FOLDER + imageSrcName).toPath(); String imageFileDest = FileSystemInjector.getImageFolderForProjects() + "/" + projectImageName; createProjectImageFileAndCopySrcFileIntoIt(imageFileSrc, imageFileDest); } } return this; } public void createMainSliderImages() { for (int i = 1; i <= 4; i++) { MainSliderImage image = new MainSliderImage(); String imageFileName = "main_image" + i + ".jpg"; image.setImageFileName(imageFileName); _mainSliderImageRepository.save(image); Path imageFileSrc = new File(DUMMY_IMAGE_FOLDER + imageFileName).toPath(); String imageFileDest = FileSystemInjector.getMainImageFolder() + "/" + imageFileName; File newImageFile = new File(imageFileDest); try { newImageFile.createNewFile(); Files.copy(imageFileSrc, newImageFile.toPath(), StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { LOG.error("Error occured while copying " + imageFileSrc.toString() + " to " + imageFileDest + "!"); } } } private void createProjectImageFileAndCopySrcFileIntoIt(Path srcPath, String destPath) { try { File newImageFile = new File(destPath); newImageFile.createNewFile(); Files.copy(srcPath, newImageFile.toPath(), StandardCopyOption.REPLACE_EXISTING); } catch (IOException e1) { LOG.error("Error occured while copying " + srcPath.toString() + " to " + destPath + "!"); } } }