001: /**
002: * Sequoia: Database clustering technology.
003: * Copyright (C) 2006 Continuent, Inc.
004: * Contact: sequoia@continuent.org
005: *
006: * Licensed under the Apache License, Version 2.0 (the "License");
007: * you may not use this file except in compliance with the License.
008: * You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing, software
013: * distributed under the License is distributed on an "AS IS" BASIS,
014: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015: * See the License for the specific language governing permissions and
016: * limitations under the License.
017: *
018: * Initial developer(s): Emmanuel Cecchet.
019: * Contributor(s): ______________________.
020: */package org.continuent.sequoia.controller.virtualdatabase.management;
021:
022: import org.continuent.sequoia.common.exceptions.NotImplementedException;
023:
024: /**
025: * This class defines an AbstractAdminOperation that is used to account for
026: * currently executing administrative operations on a virtual database. A
027: * virtual database shutdown will not be allowed as long as one of such
028: * operation is pending.
029: *
030: * @author <a href="mailto:emmanuel.cecchet@continuent.com">Emmanuel Cecchet</a>
031: * @version 1.0
032: */
033: public abstract class AbstractAdminOperation {
034: private long startTime;
035: private long endTime;
036: protected int operationStatus;
037:
038: /**
039: * Status of an operation that has not started yet
040: */
041: public static final int STATUS_NOT_STARTED = 0;
042: /**
043: * Status of an operation that is currently executing
044: */
045: public static final int STATUS_EXECUTING = 1;
046: /**
047: * Status of an operation that has successfully completed
048: */
049: public static final int STATUS_SUCCESS = 2;
050: /**
051: * Status of an operation that has failed
052: */
053: public static final int STATUS_FAILED = 3;
054:
055: // Object for status completion synchronization
056: private final Object completionStatus = new Object();
057:
058: /**
059: * Creates a new <code>AbstractAdminOperation</code> object by initializing
060: * its start time to the current time and its status to STATUS_NOT_STARTED
061: */
062: public AbstractAdminOperation() {
063: startTime = System.currentTimeMillis();
064: operationStatus = STATUS_NOT_STARTED;
065: }
066:
067: /**
068: * Cancel the current operation.
069: *
070: * @throws NotImplementedException if the operation is not supported
071: */
072: public abstract void cancel() throws NotImplementedException;
073:
074: /**
075: * Returns a String containing a human readable description of the executing
076: * operation.
077: *
078: * @return operation description
079: */
080: public abstract String getDescription();
081:
082: /**
083: * Returns the operation completion time.
084: *
085: * @return Returns the endTime.
086: */
087: public final long getEndTime() {
088: return endTime;
089: }
090:
091: /**
092: * Sets the operation end time value.
093: *
094: * @param endTime end time in ms.
095: */
096: public final void setEndTime(long endTime) {
097: this .endTime = endTime;
098: }
099:
100: /**
101: * Returns the operation starting time.
102: *
103: * @return Returns the start time.
104: */
105: public final long getStartTime() {
106: return startTime;
107: }
108:
109: /**
110: * Sets the operation starting time value.
111: *
112: * @param startTime start time in ms.
113: */
114: public final void setStartTime(long startTime) {
115: this .startTime = startTime;
116: }
117:
118: /**
119: * Return the current status of the operation.
120: *
121: * @return operation status
122: * @see #STATUS_NOT_STARTED
123: * @see #STATUS_EXECUTING
124: * @see #STATUS_SUCCESS
125: * @see #STATUS_FAILED
126: */
127: public int getStatus() {
128: return operationStatus;
129: }
130:
131: /**
132: * Notify the completion of the operation with success or not. This updates
133: * the operation status and end time.
134: *
135: * @param isSuccess true if the operation was successful
136: */
137: public void notifyCompletion(boolean isSuccess) {
138: synchronized (completionStatus) {
139: endTime = System.currentTimeMillis();
140: if (isSuccess)
141: operationStatus = STATUS_SUCCESS;
142: else
143: operationStatus = STATUS_FAILED;
144: completionStatus.notifyAll();
145: }
146: }
147:
148: /**
149: * Wait for the operation completion. This method blocks until the command has
150: * completed (successfully or not)
151: */
152: public void waitForCompletion() {
153: synchronized (completionStatus) {
154: while ((operationStatus == STATUS_EXECUTING)
155: || (operationStatus == STATUS_NOT_STARTED)) {
156: try {
157: completionStatus.wait();
158: } catch (InterruptedException ignore) {
159: }
160: }
161: }
162: }
163:
164: }
|