diff src/nabble/modules/workgroup/Assignment.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 diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/nabble/modules/workgroup/Assignment.java	Thu Mar 21 19:15:52 2019 -0600
@@ -0,0 +1,123 @@
+package nabble.modules.workgroup;
+
+import java.io.Serializable;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import fschmidt.db.DbDatabase;
+import fschmidt.db.DbNull;
+import fschmidt.db.DbRecord;
+import fschmidt.db.LongKey;
+import nabble.model.Db;
+import nabble.model.ExtensionFactory;
+import nabble.model.ModelHome;
+import nabble.model.Node;
+import nabble.model.User;
+
+
+final class Assignment {
+
+	/** Must be public because XML backups use reflection to create extension objects. */
+	public static final class ExportData implements Serializable {
+		String assigneeEmail;
+		String assigneeName;
+		Integer priority;
+	}
+
+	private static final ExtensionFactory<Node,Assignment> FACTORY = new ExtensionFactory<Node,Assignment>() {
+
+		public String getName() {
+			return WorkgroupModule.INSTANCE.getName();
+		}
+
+		public Class<Assignment> extensionClass() {
+			return Assignment.class;
+		}
+
+		public Assignment construct(Node node) {
+			return null;
+		}
+
+		public Assignment construct(Node node,ResultSet rs)
+			throws SQLException
+		{
+			long assignedUserId = rs.getLong("assigned_user");
+			if( rs.wasNull() )
+				return null;
+			User user = node.getSite().getUser(assignedUserId);
+			int priority = rs.getInt("assigned_priority");
+			return new Assignment(node,user,priority);
+		}
+
+		public Serializable getExportData(Node node) {
+			Assignment assignment = node.getExtension(this);
+			if( assignment == null )
+				return null;
+			ExportData data = new ExportData();
+			data.assigneeEmail = assignment.assignee.getEmail();
+			data.assigneeName = assignment.assignee.getName();
+			data.priority = assignment.priority;
+			return data;
+		}
+
+		public void saveExportData(Node node,Serializable s) {
+			ExportData data = (ExportData)s; 
+			User user = node.getSite().getOrCreateUser(data.assigneeEmail,data.assigneeName);
+			Assignment assignment = new Assignment(node,user,data.priority);
+			assignment.save();
+		}
+	};
+
+	static {
+		ModelHome.addNodeExtensionFactory(FACTORY);
+	}
+
+	static void init() {}
+
+	public static Assignment of(Node node) {
+		return node.getExtension(FACTORY);
+	}
+
+
+
+	private Node node;
+	final User assignee;
+	final int priority;
+
+	Assignment(Node node,User assignee,int priority) {
+		if( priority < 1 || priority > 5 || assignee==null )
+			throw new IllegalArgumentException();
+		this.node = node;
+		this.assignee = assignee;
+		this.priority = priority;
+	}
+
+	void save() {
+		DbDatabase db = node.getSite().getDb();
+		if( !db.isInTransaction() ) {
+			db.beginTransaction();
+			try {
+				node = node.getGoodCopy();
+				save();
+				db.commitTransaction();
+			} finally {
+				db.endTransaction();
+			}
+			return;
+		}
+		if( !assignee.getSite().equals(node.getSite()) )
+			throw new RuntimeException();
+		DbRecord<LongKey,?> record = node.getDbRecord();
+		record.fields().put("assigned_user", assignee.getId());
+		record.fields().put("assigned_priority", priority);
+		node.update();
+	}
+
+	static void unassign(Node node) {
+		if( Assignment.of(node) != null ) {
+			DbRecord<LongKey,?> record = node.getDbRecord();
+			record.fields().put("assigned_user",DbNull.INTEGER);
+			record.fields().put("assigned_priority",DbNull.INTEGER);
+			node.update();
+		}
+	}
+}