01: // Space4J(TM) - Object Persistence in RAM
02: // Copyright (C) 2003 Sergio Oliveira Junior
03: // This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
04:
05: package org.space4j;
06:
07: import java.util.*;
08: import org.space4j.Space;
09: import java.io.*;
10: import java.sql.*;
11:
12: /**
13: * A command representing an update to the Space4J database of objects in RAM.<br>
14: * All clients must alter the Space through a Command, so they can be logged and reapplied later.
15: */
16: public abstract class Command implements Serializable {
17:
18: private long lognumber = -1;
19: private long replica_id = 0;
20:
21: /**
22: * This method accesses the Space and its objects to do any modifications it wants.<br>
23: * @param space The Space where the objects are stored.
24: * @return An int with the number of objects altered by this operation.
25: * @throws CommandException If there was an error executing this command.
26: */
27: public abstract int execute(Space space) throws CommandException;
28:
29: /**
30: * This method will let you replicate your data in a relational database,<br>
31: * so you can continue creating your reports and using data data warehousing tools with SQL.<br>
32: * Doing this with Space4J and Commands is possible, but not recommended at all.<br>
33: * Note that this method is not abstract, therefore it is not required. <br>
34: * It is up to the system to replicate its data in a relational database.<br>
35: * <i>Rodolfo de Paula was the first one to raise this issue! Why not have the best of both worlds?</i>
36: * @param conn A connection to the database where this command will be executed through SQL.
37: * @throws SQLException If there was an error executing the SQL.
38: */
39: public void executeSQL(Connection conn) throws SQLException {
40: }
41:
42: /**
43: * This method is important when Space4J is replicated.<br>
44: * It tells the replicas in what log this command is stored.<br>
45: * This will be very important when a replica wants to take a snapshot. It will need to know this number.<br>
46: * @return The number of the log where this command is stored.
47: */
48: public long getLogNumber() {
49: return lognumber;
50: }
51:
52: /**
53: * Sets the log number where this command is stored.<br>
54: * @param lognumber The log number where this command is stored.<br>
55: */
56: public void setLogNumber(long lognumber) {
57: this .lognumber = lognumber;
58: }
59:
60: /**
61: * This method is important when Space4J is replicated.<br>
62: * It tells from which replica this command came from.<br>
63: * This will be very important when a replica has to wait for a command to return from the main replica.<br>
64: * @return The unique id of the replica.
65: */
66: public long getReplicaId() {
67: return replica_id;
68: }
69:
70: /**
71: * Sets the number of the replica this commands belongs to.<br>
72: * @param replica_id The unique id of the replica.<br>
73: */
74: public void setReplicaId(long replica_id) {
75: this.replica_id = replica_id;
76: }
77: }
|