view src/nabble/view/lib/Test.java @ 0:7ecd1a4ef557

add content
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 21 Mar 2019 19:15:52 -0600
parents
children
line wrap: on
line source

package nabble.view.lib;

import java.io.IOException;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.ArrayList;
import java.util.ListIterator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fschmidt.db.DbDatabase;
import fschmidt.util.java.IoUtils;
import nabble.model.ModelHome;
import nabble.model.Site;
import nabble.model.Db;
import nabble.model.User;
import nabble.model.ModelException;
import nabble.model.Message;
import nabble.model.Node;


public final class Test {
	private Test() {}  // never

	private static final Logger logger = LoggerFactory.getLogger(Test.class);

	public static interface Task {
		public void run(Site site) throws Exception;
	}

	private static final String PREFEX = "test-";
	private static final List<Site> sites = new ArrayList<Site>();
	private static final List<Thread> threads = new ArrayList<Thread>();
/*
	static {
		try {
			Connection con = Db.dbGlobal().getConnection();
			Statement stmt = con.createStatement();
			ResultSet rs = stmt.executeQuery(
				"select site_id from site_global"
			);
			while( rs.next() ) {
				long siteId = rs.getLong("site_id");
				Site site = ModelHome.getSite(siteId);
				String name = name(site);
				if( name.startsWith(PREFEX) )
					sites.add(site);
			}
			rs.close();
			stmt.close();
			con.close();
		} catch(SQLException e) {
			logger.error("init",e);
			System.exit(-1);
		}
	}
*/
	public static void delete() {
		checkThreads();
		for( Site site : sites ) {
			site.getRootNode().deleteRecursively();
		}
		sites.clear();
		logger.info("sites deleted");
	}

	public static void populate(int n,String email) {
		if( !sites.isEmpty() )
			throw new RuntimeException("sites not empty");
		DbDatabase db = Db.dbGlobal();
		for( int i=1; i<=n; i++ ) {
			logger.info("creating site "+i);
			db.beginTransaction();
			try {
				Site site = ModelHome.newSite( "forum", PREFEX+i, "", Message.Format.TEXT, email, "tester" );
				Permissions.addToGroup( (User)site.getRootNode().getOwner(), Permissions.ADMINISTRATORS_GROUP );
				String key = site.newRegistration(email,"tester","tester","/");
				User user = (User)site.getRootNode().getOwner();
				user.setPassword("tester");
				user.register();
				user.update();
				db.commitTransaction();
				site = site.getGoodCopy();
				sites.add(site);
			} catch (ModelException e) {
				throw new RuntimeException(e);
			} finally {
				db.endTransaction();
			}
		}
		logger.info(""+n+" sites populated");
	}

	public static void getGoodCopies() {
		for( ListIterator<Site> iter = sites.listIterator(); iter.hasNext(); ) {
			iter.set( iter.next().getGoodCopy() );
		}
	}

	private static void checkThreads() {
		if( !threads.isEmpty() )
			throw new RuntimeException("tasks running");
	}

	public static void run(final Task task) {
		for( Site site : sites ) {
			final Site taskSite = site;
			Thread thread = new Thread(new Runnable(){public void run(){
				try {
					task.run(taskSite);
				} catch(Exception e) {
					logger.error("task failed for "+taskSite,e);
				}
			}});
			thread.start();
			threads.add(thread);
		}
	}

	public static void waitForThreads() {
		for( Thread thread : threads ) {
			try {
				thread.join();
			} catch(InterruptedException e) {
				throw new RuntimeException(e);
			}
		}
		threads.clear();
		logger.info("threads done");
	}


	// utils

	public static String name(Site site) {
		return site.getRootNode().getSubject();
	}

	public static Node newPost(Node parent,String subject) throws ModelException {
		Node node;
		DbDatabase db = parent.getSite().getDb();
		db.beginTransaction();
		try {
			node = parent.getGoodCopy().getOwner().newChildNode(Node.Kind.POST,subject,"some message",Message.Format.TEXT,parent);
			node.insert(false);
			db.commitTransaction();
		} finally {
			db.endTransaction();
		}
		return node.getGoodCopy();
	}

	public static String readPage(Node node) throws IOException {
		return IoUtils.readPage( Jtp.url(node) );
	}

	public static void clearPageCache() {
		MyJtpServlet.getJtpContext().getHttpCache().clear();
	}

}