package com.idega.slide.test; import java.io.InputStream; import java.util.Arrays; import java.util.List; import java.util.Random; import java.util.logging.Level; import java.util.logging.Logger; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import com.idega.core.business.DefaultSpringBean; import com.idega.idegaweb.IWBundle; import com.idega.idegaweb.IWMainSlideStartedEvent; import com.idega.slide.SlideConstants; import com.idega.slide.business.IWSlideService; import com.idega.util.CoreConstants; @Service("slideTestsExecutor") @Scope(BeanDefinition.SCOPE_SINGLETON) public class SlideTests extends DefaultSpringBean implements ApplicationListener { private static final Logger LOGGER = Logger.getLogger(SlideTests.class.getName()); private Random random = new Random(); public void onApplicationEvent(ApplicationEvent event) { if (event instanceof IWMainSlideStartedEvent) { IWMainSlideStartedEvent slideStartedEvent = (IWMainSlideStartedEvent) event; if (slideStartedEvent.getIWMA().getSettings().getBoolean("test_mass_uploads", Boolean.FALSE)) { executeConcurentUploads(50); } } } public boolean executeConcurentUploads(int threads) { final IWSlideService slide = getServiceInstance(IWSlideService.class); final IWBundle bundle = getBundle(SlideConstants.BUNDLE_IDENTIFIER); String mainDir = "/files/public/concurent_uploads/"; String subDir1 = mainDir.concat("t1/"); final List<String> uploadPaths = Arrays.asList(mainDir, subDir1, mainDir.concat("t2/"), subDir1.concat("sub/"), "/files/cms/", "/files/dropbox/", "/files/bpm/", "/files/users/"); final List<String> testFiles = Arrays.asList("resources/images/test.jpg", "resources/test.pdf"); final String fileName = "File_"; for (int i = 0; i < threads; i++) { final int threadNumber = i+1; Thread worker = new Thread(new Runnable() { public void run() { long start = System.currentTimeMillis(); String path = getRandomValue(uploadPaths); String file = getRandomValue(testFiles); String name = fileName.concat(String.valueOf(threadNumber)).concat(CoreConstants.UNDER) .concat(file.substring(file.lastIndexOf(CoreConstants.SLASH) + 1)); boolean deleted = false; try { deleted = slide.deleteAsRootUser(path.concat(name)); if (deleted) { LOGGER.info("Deleted file: " + path + name + ": " + deleted); } } catch (Exception e) { deleted = false; LOGGER.log(Level.WARNING, "Error deleting: ".concat(path).concat(name), e); } try { InputStream stream = bundle.getResourceInputStream(file); boolean useSlideAPI = getRandomValue(2) == 0; boolean uploaded = slide.uploadFileAndCreateFoldersFromStringAsRoot(path, name, stream, null, true, useSlideAPI); LOGGER.info("Thread nr. " + threadNumber + " uploaded file: " + path + name + " successfully=" + uploaded + (useSlideAPI ? " using Slide API" : " using Slide via HTTP")); } catch (Exception e) { LOGGER.log(Level.WARNING, "Error while uploading file: " + path + name, e); } finally { long end = System.currentTimeMillis(); LOGGER.info("Took time to ".concat(deleted ? "DELETE and " : CoreConstants.EMPTY).concat("UPLOAD ").concat(path).concat(name).concat(": ") .concat(String.valueOf(end-start)).concat(" ms")); } } }); worker.start(); LOGGER.info("Thread " + threadNumber + " has started: " + worker); } return Boolean.TRUE; } private String getRandomValue(List<String> values) { return values.get(getRandomValue(values.size())); } private int getRandomValue(int max) { return random.nextInt(max); } }