All Downloads are FREE. Search and download functionalities are using the official Maven repository.

base.jee.api.sql.Setup Maven / Gradle / Ivy

/**
 * Creative commons Attribution-NonCommercial license.
 *
 * http://creativecommons.org/licenses/by-nc/2.5/au/deed.en_GB
 *
 * NO WARRANTY IS GIVEN OR IMPLIED, USE AT YOUR OWN RISK.
 */
package base.jee.api.sql;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Map;

import javax.sql.DataSource;

import base.Command;
import base.jee.Constants;
import base.security.PermissionException;

import static base.jee.api.sql.util.SqlFilter.sqlFilter;

public class Setup extends Command {

	private DataSource ds;

	public Setup(DataSource ds) {
		this.ds = ds;

		if(ds == null) {
			throw new IllegalArgumentException("Invalid parameter: ds");
		}
	}

	@Override
	protected void execute() throws IOException {
		Connection c = null;
		try {
			c = ds.getConnection();
			c.setAutoCommit(false);

			int type = 0;
			DatabaseMetaData m = c.getMetaData();
			if(m.getDatabaseProductName().equalsIgnoreCase("mysql")) {
				type = 1;
			}

			PreparedStatement s;

			s = c.prepareStatement(sqlFilter("create table if not exists email (uuid char(36) primary key, to_address varchar(250), email text, retries integer, attempt_at bigint, in_progress boolean)", type));
			s.execute();
			s.close();
			s = c.prepareStatement(sqlFilter("create table if not exists person (uuid char(36) primary key, first_name varchar(128), last_name varchar(128), email varchar(250), username varchar(100), password text, last_auth bigint, last_auth_ip text, created bigint, updated bigint, expiry bigint)", type));
			s.execute();
			s.close();
			s = c.prepareStatement(sqlFilter("create table if not exists batch_load_info (uuid char(36), requestor char(36), executed bigint, primary key(uuid))", type));
			s.execute();
			s.close();
			s = c.prepareStatement(sqlFilter("create table if not exists batch_load_result (uuid char(36), sort_order int, value text, primary key(uuid, sort_order))", type));
			s.execute();
			s.close();
			s = c.prepareStatement(sqlFilter("create table if not exists base_group (uuid char(36) primary key, name varchar(128), type int)", type));
			s.execute();
			s.close();
			s = c.prepareStatement(sqlFilter("create table if not exists group_member (group_uuid char(36), person_uuid char(36), joined bigint, primary key (group_uuid, person_uuid))", type));
			s.execute();
			s.close();
			s = c.prepareStatement(sqlFilter("create table if not exists token (token char(64) primary key, person_uuid char(36), expiry integer, roles text, created integer)", type));
			s.execute();
			s.close();
			s = c.prepareStatement(sqlFilter("create table if not exists request_token (token varchar(64) primary key, person_uuid char(36), expiry integer, type varchar(64), ip varchar(64), data text)", type));
			s.execute();
			s.close();
			s = c.prepareStatement(sqlFilter("create table if not exists audit_event (uuid char(36) primary key, person_uuid char(36), level varchar(16), message text, event_time bigint, ip text)", type));
			s.execute();
			s.close();
			s = c.prepareStatement(sqlFilter("create table if not exists audit_type (audit_event_uuid char(36), resource_uid varchar(64), resource_type varchar(64))", type));
			s.execute();
			s.close();
			s = c.prepareStatement(sqlFilter("create table if not exists person_setting (uuid char(36), name varchar(64), value text, primary key (uuid, name))", type));
			s.execute();
			s.close();
			s = c.prepareStatement(sqlFilter("create table if not exists role (assignee_uuid char(36), role varchar(64), resource varchar(64), uid varchar(64))", type));
			s.execute();
			s.close();
			s = c.prepareStatement(sqlFilter("create table if not exists setting (name varchar(64) primary key, value text)", type));
			s.execute();
			s.close();
			s = c.prepareStatement(sqlFilter("create table if not exists update_notification (uuid char(36) primary key not null, updator char(36), updated bigint, type varchar(64), action varchar(64), uid varchar(250), delivered boolean)", type));
			s.execute();
			s.close();
			s = c.prepareStatement(sqlFilter("create table if not exists template (name varchar(64) primary key)", type));
			s.execute();
			s.close();
			s = c.prepareStatement(sqlFilter("create table if not exists template_resource (template varchar(64), resource varchar(64), content blob, isbinary boolean)", type));
			s.execute();
			s.close();
			s = c.prepareStatement(sqlFilter("create table if not exists throttle (key_value varchar(64) primary key, attempts int, updated bigint)", type));
			s.execute();
			s.close();
			s = c.prepareStatement(sqlFilter("create table if not exists ip_location (start_ip bigint, end_ip bigint, location bigint, primary key (start_ip))", type));
			s.execute();
			s.close();
			s = c.prepareStatement(sqlFilter("create table if not exists location (id bigint, country text, city text, latitude double, longitude double, primary key(id))", type));
			s.execute();
			s.close();

			try {
				s = c.prepareStatement("CREATE INDEX template_resource_lookup on template_resource (template, resource)");
				s.execute();
			} catch(SQLException e) {
			} finally {
				s.close();
			}

			try {
				s = c.prepareStatement("CREATE INDEX ip_location_start on ip_location (start_ip desc)");
				s.execute();
			} catch(SQLException e) {
			} finally {
				s.close();
			}

			try {
				s = c.prepareStatement("CREATE INDEX batch_load_result_idx on batch_load_result (uuid)");
				s.execute();
			} catch(SQLException e) {
			} finally {
				s.close();
			}

			try {
				s = c.prepareStatement("CREATE INDEX token_idx on token (token)");
				s.execute();
			} catch(SQLException e) {
			} finally {
				s.close();
			}

			try {
				s = c.prepareStatement("create index token_person on token(person_uuid,token);");
				s.execute();
			} catch(SQLException e) {
			} finally {
				s.close();
			}

			try {
				s = c.prepareStatement("CREATE INDEX request_token_idx on request_token (token)");
				s.execute();
			} catch(SQLException e) {
			} finally {
				s.close();
			}

			try {
				s = c.prepareStatement("CREATE INDEX audit_event_person_time on audit_event (person_uuid, event_time desc)");
				s.execute();
			} catch(SQLException e) {
			} finally {
				s.close();
			}

			try {
				s = c.prepareStatement("CREATE INDEX audit_event_ip_time on audit_event (ip, event_time desc)");
				s.execute();
			} catch(SQLException e) {
			} finally {
				s.close();
			}

			try {
				s = c.prepareStatement("CREATE INDEX audit_event_time on audit_event(event_time desc)");
				s.execute();
			} catch(SQLException e) {
			} finally {
				s.close();
			}

			try {
				s = c.prepareStatement("insert into setting (name, value) values('throttle.auth.lockout', '300')");
				s.execute();
			} catch(SQLException e) {
			} finally {
				s.close();
			}

			try {
				s = c.prepareStatement("insert into setting (name, value) values('throttle.auth.window', '60')");
				s.execute();
			} catch(SQLException e) {
			} finally {
				s.close();
			}

			try {
				s = c.prepareStatement("insert into setting (name, value) values('throttle.auth.attempts', '3')");
				s.execute();
			} catch(SQLException e) {
			} finally {
				s.close();
			}

			try {
				s = c.prepareStatement("insert into setting (name, value) values('throttle.ip.lockout', '60')");
				s.execute();
			} catch(SQLException e) {
			} finally {
				s.close();
			}

			try {
				s = c.prepareStatement("insert into setting (name, value) values('throttle.ip.window', '20')");
				s.execute();
			} catch(SQLException e) {
			} finally {
				s.close();
			}

			try {
				s = c.prepareStatement("insert into setting (name, value) values('throttle.ip.attempts', '10')");
				s.execute();
			} catch(SQLException e) {
			} finally {
				s.close();
			}

			try {
				s = c.prepareStatement("insert into base_group (uuid, name, type) values('" + Constants.ALL_USERS_GROUP.toString() + "','All users', 0)");
				s.execute();
			} catch(SQLException e) {
			} finally {
				s.close();
			}

			try {
				s = c.prepareStatement("insert into base_group (uuid, name, type) values('" + Constants.AUTHENTICATED_USERS_GROUP.toString() + "','Authenticated users', 0)");
				s.execute();
			} catch(SQLException e) {
			} finally {
				s.close();
			}

			c.commit();
		} catch(SQLException e) {
			throw new IOException(e);
		} finally {
			if(c != null) {
				try { c.rollback(); } catch (SQLException e) { }
				try { c.close(); } catch (SQLException e) { }
			}
		}
	}

	@Override
	public String getJsonParameters() {
		return "{" +
				"}";
	}

	@Override
	public Command newWithParameters(Map parameters) throws IOException, PermissionException {
		throw new IllegalArgumentException("Setup may not be instantiated with parameter map");
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy