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

base.jee.api.cassandra.CreateTemplate 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.cassandra;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.LinkedList;
import java.util.List;

import base.Command;
import base.jee.Constants;
import base.json.Json;
import base.security.ResourceUid;
import base.security.User;
import base.template.Resource;
import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Row;
import com.datastax.driver.core.Session;

import static base.jee.api.cassandra.util.Log.log;

public class CreateTemplate extends Command {

	private CassandraAPI c;
	private User user;
	private String basedOn;
	private String name;

	public CreateTemplate(CassandraAPI c, User user, String basedOn, String name) {
		this.c = c;
		this.name = name;
		this.user = user;
		this.basedOn = basedOn;

		if(c == null) {
			throw new IllegalArgumentException("Invalid parameter: c");
		}
		if(user == null || !user.isAuthenticated()) {
			throw new IllegalArgumentException("Invalid parameter: user");
		}
		if(name == null || name.length() == 0) {
			throw new IllegalArgumentException("Invalid parameter: name");
		}
		if(name.equalsIgnoreCase("default")) {
			throw new IllegalArgumentException("A template already exists with this name.");
		}
		if(basedOn == null || basedOn.length() == 0) {
			throw new IllegalArgumentException("Invalid parameter: basedOn");
		}
		if(name.contains(" ")) {
			throw new IllegalArgumentException("template name must not contain whitespace");
		}
	}

	@Override
	protected void execute() throws IOException {

		Session s = c.getCassandraSession();

		if(!user.hasRole(Constants.TEMPLATE_MANAGE_ROLE)) {
			log(s, "WARN", user, "Permission denied invoking: " + CreateTemplate.class.getSimpleName() + " " + getJsonParameters());
			throw new IllegalStateException("You do not have permission to manage templates.");
		}

		// Check template name does not already exist
		PreparedStatement p = s.prepare("select name from template where name=?");
		ResultSet r = s.execute(p.bind(name));
		if(r.iterator().hasNext()) {
			throw new IllegalArgumentException("A template already exists with this name.");
		}

		List resources = new LinkedList<>();
		if(!basedOn.equalsIgnoreCase("default")) {
			p = s.prepare("select name from template where name=?");
			r = s.execute(p.bind(basedOn));
			if(!r.iterator().hasNext()) {
				throw new IllegalArgumentException("Based on template name is not a template.");
			}
			PreparedStatement q = s.prepare("select resource, content, isbinary from template_resource where template=?");
			for(Row row : s.execute(q.bind(basedOn))) {
				Resource i = new Resource(row.getString(0), row.getBytes(1).array(), row.getBool(2));
				resources.add(i);
			}
		}

		// Persist the template details
		p = s.prepare("insert into template (name) values(?)");
		s.execute(p.bind(name));

		p = s.prepare("insert into template_resource (template, resource, content, isbinary) values(?,?,?,?)");
		for(Resource i : resources) {
			s.execute(p.bind(name, i.getName(), ByteBuffer.wrap(i.getData()), i.isBinary()));
		}

		log(s, "INFO", user, "Created new template: " + name + " based on " + basedOn, new ResourceUid("Template", name));

	}

	@Override
	public String getJsonParameters() {
		return "{" +
				"\"name\":\"" + Json.escape(name)+ "\"," +
				"\"based_on\":\"" + Json.escape(basedOn)+ "\"" +
				"}";
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy