Mail Archive Home | gotm-commits List | December 2005 Index
| <-- Date Index --> | <-- Thread Index --> |
Date: Friday, December 16, 2005 @ 18:21:37
Author: rouvoy
Path: /cvsroot/gotm/gotm/src/java/org/objectweb/gotm/lib
Added: state/Status.java
Modified: coordination/AbortFeature.java coordination/CommitFeature.java
coordination/CoordinationFeatureAbstract.java
coordination/NPCFeature.java coordination/PrepareFeature.java
coordination/ProbeCommitProtocol.java
coordination/TimeoutImpl.java
resource/ResourceManagerAbstract.java stat/EventCounterImpl.java
* Using constants rather dynamic allocated Strings.
-----------------------------------------------+
coordination/AbortFeature.java | 14 ++--
coordination/CommitFeature.java | 13 ++--
coordination/CoordinationFeatureAbstract.java | 6 +-
coordination/NPCFeature.java | 6 +-
coordination/PrepareFeature.java | 17 +++--
coordination/ProbeCommitProtocol.java | 11 ++-
coordination/TimeoutImpl.java | 13 +++-
resource/ResourceManagerAbstract.java | 9 +--
stat/EventCounterImpl.java | 11 ++-
state/Status.java | 69 ++++++++++++++++++++++++
10 files changed, 128 insertions(+), 41 deletions(-)
Index: gotm/src/java/org/objectweb/gotm/lib/coordination/AbortFeature.java
diff -u
gotm/src/java/org/objectweb/gotm/lib/coordination/AbortFeature.java:1.10
gotm/src/java/org/objectweb/gotm/lib/coordination/AbortFeature.java:1.11
--- gotm/src/java/org/objectweb/gotm/lib/coordination/AbortFeature.java:1.10
Fri Dec 16 17:03:22 2005
+++ gotm/src/java/org/objectweb/gotm/lib/coordination/AbortFeature.java Fri
Dec 16 18:21:37 2005
@@ -17,16 +17,18 @@
Initial developer(s): Romain Rouvoy (romain.rouvoy@xxxxxxx)
Contributor(s): .
--------------------------------------------------------------------------------
-$Id: AbortFeature.java,v 1.10 2005/12/16 16:03:22 rouvoy Exp $
+$Id: AbortFeature.java,v 1.11 2005/12/16 17:21:37 rouvoy Exp $
==============================================================================*/
package org.objectweb.gotm.lib.coordination;
import java.util.Map;
+import org.objectweb.gotm.lib.state.Status;
+
/**
* Implementation of the cancel process.
* @author <a href="mailto:Romain.Rouvoy@xxxxxxx">Romain Rouvoy</a>
- * @version $Revision: 1.10 $
+ * @version $Revision: 1.11 $
*/
public class AbortFeature extends CoordinationFeatureAbstract {
/*
@@ -37,10 +39,10 @@
if (this.logger.isLoggable(DEBUG))
this.logger.log(DEBUG, "Processing Abort...");
// System.err.println("Processing Abort...");
- this.beginLog.log("aborting".getBytes());
- this.publish.notify("abort", context);
- this.publish.notify("abort-ack", context);
- this.endLog.log("aborted".getBytes());
+ this.beginLog.log(Status.ABORTING.getBytes());
+ this.publish.notify(Status.ABORT, context);
+ this.publish.notify(Status.ABORT_ACK, context);
+ this.endLog.log(Status.ABORTED.getBytes());
throw new TransactionAbortedException();
}
}
\ No newline at end of file
Index: gotm/src/java/org/objectweb/gotm/lib/coordination/CommitFeature.java
diff -u
gotm/src/java/org/objectweb/gotm/lib/coordination/CommitFeature.java:1.13
gotm/src/java/org/objectweb/gotm/lib/coordination/CommitFeature.java:1.14
--- gotm/src/java/org/objectweb/gotm/lib/coordination/CommitFeature.java:1.13
Fri Dec 16 17:03:22 2005
+++ gotm/src/java/org/objectweb/gotm/lib/coordination/CommitFeature.java
Fri Dec 16 18:21:37 2005
@@ -17,19 +17,20 @@
Initial developer(s): Romain Rouvoy (romain.rouvoy@xxxxxxx)
Contributor(s): .
--------------------------------------------------------------------------------
-$Id: CommitFeature.java,v 1.13 2005/12/16 16:03:22 rouvoy Exp $
+$Id: CommitFeature.java,v 1.14 2005/12/16 17:21:37 rouvoy Exp $
==============================================================================*/
package org.objectweb.gotm.lib.coordination;
import java.util.Map;
import org.objectweb.gotm.GoTMException;
+import org.objectweb.gotm.lib.state.Status;
import org.objectweb.transaction.api.coordination.CoordinationFeature;
/**
* One phase validation process.
* @author <a href="mailto:Romain.Rouvoy@xxxxxxx">Romain Rouvoy</a>
- * @version $Revision: 1.13 $
+ * @version $Revision: 1.14 $
*/
public class CommitFeature extends CoordinationFeatureAbstract {
/**
@@ -46,10 +47,10 @@
this.logger.log(DEBUG, "Processing Commit...");
// System.err.println("Processing Commit...");
try {
- this.beginLog.log("committing".getBytes());
- this.publish.notify("commit", context);
- this.publish.notify("commit-ack", context);
- this.endLog.log("committed".getBytes());
+ this.beginLog.log(Status.COMMITTING.getBytes());
+ this.publish.notify(Status.COMMIT, context);
+ this.publish.notify(Status.COMMIT_ACK, context);
+ this.endLog.log(Status.COMMITTED.getBytes());
} catch (GoTMException e) {
if (this.logger.isLoggable(DEBUG))
this.logger.log(DEBUG, "Commit Failed: " + e.getMessage());
Index:
gotm/src/java/org/objectweb/gotm/lib/coordination/CoordinationFeatureAbstract.java
diff -u
gotm/src/java/org/objectweb/gotm/lib/coordination/CoordinationFeatureAbstract.java:1.4
gotm/src/java/org/objectweb/gotm/lib/coordination/CoordinationFeatureAbstract.java:1.5
---
gotm/src/java/org/objectweb/gotm/lib/coordination/CoordinationFeatureAbstract.java:1.4
Fri Dec 16 17:03:22 2005
+++
gotm/src/java/org/objectweb/gotm/lib/coordination/CoordinationFeatureAbstract.java
Fri Dec 16 18:21:37 2005
@@ -17,7 +17,7 @@
Initial developer(s): Romain Rouvoy (romain.rouvoy@xxxxxxx)
Contributor(s): .
--------------------------------------------------------------------------------
-$Id: CoordinationFeatureAbstract.java,v 1.4 2005/12/16 16:03:22 rouvoy Exp $
+$Id: CoordinationFeatureAbstract.java,v 1.5 2005/12/16 17:21:37 rouvoy Exp $
==============================================================================*/
package org.objectweb.gotm.lib.coordination;
@@ -31,12 +31,14 @@
/**
* Abstract implementation of a validation engine.
* @author <a href="mailto:Romain.Rouvoy@xxxxxxx">Romain Rouvoy</a>
- * @version $Revision: 1.4 $
+ * @version $Revision: 1.5 $
* @fractal.itf name="run" signature="java.lang.Runnable"
*/
public abstract class CoordinationFeatureAbstract
extends ComponentImpl
implements CoordinationFeature, Runnable {
+ protected static final String DECISION = "decision";
+
/**
* @fractal.bc
*/
Index: gotm/src/java/org/objectweb/gotm/lib/coordination/NPCFeature.java
diff -u gotm/src/java/org/objectweb/gotm/lib/coordination/NPCFeature.java:1.1
gotm/src/java/org/objectweb/gotm/lib/coordination/NPCFeature.java:1.2
--- gotm/src/java/org/objectweb/gotm/lib/coordination/NPCFeature.java:1.1
Fri Dec 16 17:03:22 2005
+++ gotm/src/java/org/objectweb/gotm/lib/coordination/NPCFeature.java Fri
Dec 16 18:21:37 2005
@@ -17,7 +17,7 @@
Initial developer(s): Romain Rouvoy (romain.rouvoy@xxxxxxx)
Contributor(s): .
--------------------------------------------------------------------------------
-$Id: NPCFeature.java,v 1.1 2005/12/16 16:03:22 rouvoy Exp $
+$Id: NPCFeature.java,v 1.2 2005/12/16 17:21:37 rouvoy Exp $
==============================================================================*/
package org.objectweb.gotm.lib.coordination;
@@ -32,7 +32,7 @@
/**
* Implementation of a Two-Phase Commit Protocol.
* @author <a href="mailto:Romain.Rouvoy@xxxxxxx">Romain Rouvoy</a>
- * @version $Revision: 1.1 $
+ * @version $Revision: 1.2 $
*/
public class NPCFeature extends ComponentImpl implements CoordinationFeature
{
/**
@@ -60,7 +60,7 @@
// System.err.println("Processing Atomic 2 Phases Validation...");
for (int i = 0; i < phases; i++) {
CoordinationFeature coord ;
- String decision= (String)context.get("decision");
+ String decision=
(String)context.get(CoordinationFeatureAbstract.DECISION);
if (decision==null)
decision=this.status.getStatus();
coord = (CoordinationFeature) this.on.get("on-"+decision);
Index: gotm/src/java/org/objectweb/gotm/lib/coordination/PrepareFeature.java
diff -u
gotm/src/java/org/objectweb/gotm/lib/coordination/PrepareFeature.java:1.4
gotm/src/java/org/objectweb/gotm/lib/coordination/PrepareFeature.java:1.5
--- gotm/src/java/org/objectweb/gotm/lib/coordination/PrepareFeature.java:1.4
Fri Dec 16 17:03:22 2005
+++ gotm/src/java/org/objectweb/gotm/lib/coordination/PrepareFeature.java
Fri Dec 16 18:21:37 2005
@@ -17,7 +17,7 @@
Initial developer(s): Romain Rouvoy (romain.rouvoy@xxxxxxx)
Contributor(s): .
--------------------------------------------------------------------------------
-$Id: PrepareFeature.java,v 1.4 2005/12/16 16:03:22 rouvoy Exp $
+$Id: PrepareFeature.java,v 1.5 2005/12/16 17:21:37 rouvoy Exp $
==============================================================================*/
package org.objectweb.gotm.lib.coordination;
@@ -25,13 +25,14 @@
import java.util.Map;
import java.util.Vector;
+import org.objectweb.gotm.lib.state.Status;
import org.objectweb.transaction.lib.resource.ResourceVoteCommit;
import org.objectweb.transaction.lib.resource.ResourceVoteReadOnly;
import org.objectweb.transaction.lib.resource.ResourceVoteRollback;
/**
* @author <a href="mailto:Romain.Rouvoy@xxxxxxx">Romain Rouvoy</a>
- * @version $Revision: 1.4 $
+ * @version $Revision: 1.5 $
*/
public class PrepareFeature extends CoordinationFeatureAbstract {
/*
@@ -42,17 +43,17 @@
if (this.logger.isLoggable(DEBUG))
this.logger.log(DEBUG, "Processing Prepare...");
// System.err.println("Processing Prepare...");
- this.beginLog.log("preparing".getBytes());
+ this.beginLog.log(Status.PREPARING.getBytes());
context.put(ResourceVoteRollback.vote, new Vector());
context.put(ResourceVoteCommit.vote, new Vector());
context.put(ResourceVoteReadOnly.vote, new Vector());
- this.publish.notify("prepare", context);
+ this.publish.notify(Status.PREPARE, context);
List aborts = (List) context.get(ResourceVoteRollback.vote);
- context.put("decision","commit");
+ context.put(DECISION,Status.COMMIT);
if (aborts.size() != 0) {
- context.put("decision","abort");
+ context.put(DECISION,Status.ABORT);
}
- this.publish.notify("prepare-ack", context);
- // endLog().log("prepared".getBytes());
+ this.publish.notify(Status.PREPARE_ACK, context);
+ // endLog().log(Status.PREPARED.getBytes());
}
}
\ No newline at end of file
Index:
gotm/src/java/org/objectweb/gotm/lib/coordination/ProbeCommitProtocol.java
diff -u
gotm/src/java/org/objectweb/gotm/lib/coordination/ProbeCommitProtocol.java:1.8
gotm/src/java/org/objectweb/gotm/lib/coordination/ProbeCommitProtocol.java:1.9
---
gotm/src/java/org/objectweb/gotm/lib/coordination/ProbeCommitProtocol.java:1.8
Fri Dec 16 17:03:22 2005
+++
gotm/src/java/org/objectweb/gotm/lib/coordination/ProbeCommitProtocol.java
Fri Dec 16 18:21:37 2005
@@ -17,7 +17,7 @@
Initial developer(s): Romain Rouvoy (romain.rouvoy@xxxxxxx)
Contributor(s): .
--------------------------------------------------------------------------------
-$Id: ProbeCommitProtocol.java,v 1.8 2005/12/16 16:03:22 rouvoy Exp $
+$Id: ProbeCommitProtocol.java,v 1.9 2005/12/16 17:21:37 rouvoy Exp $
==============================================================================*/
package org.objectweb.gotm.lib.coordination;
@@ -27,10 +27,11 @@
import org.objectweb.gotm.lib.factory.Configurable;
import org.objectweb.gotm.lib.probe.ProbeAbstract;
+import org.objectweb.gotm.lib.state.Status;
/**
* @author <a href="mailto:Romain.Rouvoy@xxxxxxx">Romain Rouvoy</a>
- * @version $Revision: 1.8 $
+ * @version $Revision: 1.9 $
*/
public class ProbeCommitProtocol
extends ProbeAbstract {
@@ -50,7 +51,7 @@
* @see org.objectweb.gotm.lib.message.SubscribablePrimitive#getEvents()
*/
public String[] messages() {
- return new String[] { "committed", "aborted" };
+ return new String[] { Status.COMMIT_ACK, Status.ABORT_ACK };
}
private int count(List l, String e) {
@@ -74,8 +75,8 @@
+ "]==> No adaptatation during warm up!");
return;
}
- int commit = count(topics, "committed");
- int abort = count(topics, "aborted");
+ int commit = count(topics, Status.COMMITTED);
+ int abort = count(topics, Status.ABORTED);
int dec = (100 * commit) / (commit + abort);
if (dec <= 55
&& !this.configurable.getAttribute("gotm-protocol").equals(
Index: gotm/src/java/org/objectweb/gotm/lib/coordination/TimeoutImpl.java
diff -u
gotm/src/java/org/objectweb/gotm/lib/coordination/TimeoutImpl.java:1.11
gotm/src/java/org/objectweb/gotm/lib/coordination/TimeoutImpl.java:1.12
--- gotm/src/java/org/objectweb/gotm/lib/coordination/TimeoutImpl.java:1.11
Fri Dec 16 17:03:22 2005
+++ gotm/src/java/org/objectweb/gotm/lib/coordination/TimeoutImpl.java Fri
Dec 16 18:21:37 2005
@@ -17,7 +17,7 @@
Initial developer(s): Romain Rouvoy (romain.rouvoy@xxxxxxx)
Contributor(s): .
--------------------------------------------------------------------------------
-$Id: TimeoutImpl.java,v 1.11 2005/12/16 16:03:22 rouvoy Exp $
+$Id: TimeoutImpl.java,v 1.12 2005/12/16 17:21:37 rouvoy Exp $
==============================================================================*/
package org.objectweb.gotm.lib.coordination;
@@ -25,11 +25,12 @@
import org.objectweb.fractal.api.control.CacheController;
import org.objectweb.gotm.lib.message.SubscribablePrimitive;
+import org.objectweb.gotm.lib.state.Status;
import org.objectweb.gotm.lib.timer.Timer;
/**
* @author <a href="mailto:Romain.Rouvoy@xxxxxxx">Romain Rouvoy</a>
- * @version $Revision: 1.11 $
+ * @version $Revision: 1.12 $
*/
public class TimeoutImpl
extends SubscribablePrimitive
@@ -61,7 +62,11 @@
* @see org.objectweb.gotm.lib.SubscribablePrimitive#getEvents()
*/
public String[] messages() {
- return new String[] { "start", "prepare", "commit", "abort" };
+ return new String[] {
+ Status.START,
+ Status.PREPARE,
+ Status.COMMIT,
+ Status.ABORT };
}
/*
@@ -71,7 +76,7 @@
*/
public void notify(String topic, Map context) {
// System.err.println("[TIMEOUT] Notify: "+topic);
- if (topic.equals("start")) {
+ if (topic.equals(Status.START)) {
if (this.timeout != 0) {
// System.err.println("[TIMEOUT] Starting timeout for "
// + this.timeout + " sec.");
Index:
gotm/src/java/org/objectweb/gotm/lib/resource/ResourceManagerAbstract.java
diff -u
gotm/src/java/org/objectweb/gotm/lib/resource/ResourceManagerAbstract.java:1.10
gotm/src/java/org/objectweb/gotm/lib/resource/ResourceManagerAbstract.java:1.11
---
gotm/src/java/org/objectweb/gotm/lib/resource/ResourceManagerAbstract.java:1.10
Fri Dec 16 17:03:22 2005
+++
gotm/src/java/org/objectweb/gotm/lib/resource/ResourceManagerAbstract.java
Fri Dec 16 18:21:37 2005
@@ -17,7 +17,7 @@
Initial developer(s): Romain Rouvoy (romain.rouvoy@xxxxxxx)
Contributor(s): .
--------------------------------------------------------------------------------
-$Id: ResourceManagerAbstract.java,v 1.10 2005/12/16 16:03:22 rouvoy Exp $
+$Id: ResourceManagerAbstract.java,v 1.11 2005/12/16 17:21:37 rouvoy Exp $
==============================================================================*/
package org.objectweb.gotm.lib.resource;
@@ -33,12 +33,13 @@
import org.objectweb.gotm.lib.action.NoActionAvailableException;
import org.objectweb.gotm.lib.message.SubscribablePrimitive;
import org.objectweb.gotm.lib.state.InvalidStateException;
+import org.objectweb.gotm.lib.state.Status;
import org.objectweb.transaction.api.message.PublishFeature;
import org.objectweb.transaction.api.transaction.TransactionStatusFeature;
/**
* @author <a href="mailto:Romain.Rouvoy@xxxxxxx">Romain Rouvoy</a>
- * @version $Revision: 1.10 $
+ * @version $Revision: 1.11 $
*/
public abstract class ResourceManagerAbstract
extends SubscribablePrimitive
@@ -136,7 +137,7 @@
* @see
org.objectweb.gotm.lib.message.Resource#addResource(java.lang.Object)
*/
public void addResource(final Object wrapped) {
- if (this.txState.checkStatus("active")) {
+ if (this.txState.checkStatus(Status.ACTIVE)) {
if (this.logger.isLoggable(DEBUG) && enlist != null)
this.logger.log(DEBUG, "Enlisting a participant with action "
+ enlist);
@@ -153,7 +154,7 @@
* @see
org.objectweb.gotm.lib.resource.ResourceManager#delResource(java.lang.Object)
*/
public void delResource(final Object wrapped) {
- if (this.txState.checkStatus(new String[]
{"active","marked-abort"})) {
+ if (this.txState.checkStatus(new String[]
{Status.ACTIVE,Status.MARKED_ABORT})) {
if (this.logger.isLoggable(DEBUG) && delist != null)
this.logger.log(DEBUG, "Delisting a participant with action "
+ delist);
Index: gotm/src/java/org/objectweb/gotm/lib/stat/EventCounterImpl.java
diff -u gotm/src/java/org/objectweb/gotm/lib/stat/EventCounterImpl.java:1.4
gotm/src/java/org/objectweb/gotm/lib/stat/EventCounterImpl.java:1.5
--- gotm/src/java/org/objectweb/gotm/lib/stat/EventCounterImpl.java:1.4 Fri
Dec 16 17:03:22 2005
+++ gotm/src/java/org/objectweb/gotm/lib/stat/EventCounterImpl.java Fri
Dec 16 18:21:37 2005
@@ -17,7 +17,7 @@
Initial developer(s): Romain Rouvoy (romain.rouvoy@xxxxxxx)
Contributor(s): .
--------------------------------------------------------------------------------
-$Id: EventCounterImpl.java,v 1.4 2005/12/16 16:03:22 rouvoy Exp $
+$Id: EventCounterImpl.java,v 1.5 2005/12/16 17:21:37 rouvoy Exp $
==============================================================================*/
package org.objectweb.gotm.lib.stat;
@@ -26,11 +26,12 @@
import java.util.Map;
import org.objectweb.gotm.ComponentImpl;
+import org.objectweb.gotm.lib.state.Status;
import org.objectweb.transaction.api.message.PublishFeature;
/**
* @author <a href="mailto:Romain.Rouvoy@xxxxxxx">Romain Rouvoy</a>
- * @version $Revision: 1.4 $
+ * @version $Revision: 1.5 $
*/
public class EventCounterImpl
extends ComponentImpl
@@ -42,7 +43,11 @@
* @see org.objectweb.gotm.lib.message.SubscribablePrimitive#events()
*/
public String[] messages() {
- return new String[] { "start", "committed", "aborted" };
+ return new String[] {
+ Status.START,
+ Status.COMMIT_ACK,
+ Status.ABORT_ACK
+ };
}
private void setOccurence(String e, int value) {
Index: gotm/src/java/org/objectweb/gotm/lib/state/Status.java
diff -u /dev/null gotm/src/java/org/objectweb/gotm/lib/state/Status.java:1.1
--- /dev/null Fri Dec 16 18:21:37 2005
+++ gotm/src/java/org/objectweb/gotm/lib/state/Status.java Fri Dec 16
18:21:37 2005
@@ -0,0 +1,69 @@
+/*==============================================================================
+GoTM - Copyright (C) 2000-2006 INRIA & USTL - LIFL - GOAL
+GoTM is an open Transaction Monitor (contact: gotm-team@xxxxxxxxxxxxx)
+
+This library is free software; you can redistribute it and/or modify it
under
+the terms of the GNU Lesser General Public License as published by the Free
+Software Foundation; either version 2.1 of the License, or any later version.
+
+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
+
+Initial developer(s): Romain Rouvoy (romain.rouvoy@xxxxxxx)
+Contributor(s): .
+--------------------------------------------------------------------------------
+$Id: Status.java,v 1.1 2005/12/16 17:21:37 rouvoy Exp $
+==============================================================================*/
+package org.objectweb.gotm.lib.state;
+
+/**
+ * @author <a href="mailto:Romain.Rouvoy@xxxxxxx">Romain Rouvoy</a>
+ * @version $Revision: 1.1 $
+ */
+public class Status {
+
+ /** <code>INACTIVE</code> . */
+ public static final String INACTIVE = "inactive";
+ /** <code>ACTIVE</code> . */
+ public static final String ACTIVE = "active";
+ /** <code>MARKED_ABORT</code> . */
+ public static final String MARKED_ABORT = "marked-abort";
+ /** <code>PREPARING</code> . */
+ public static final String PREPARING = "preparing";
+ /** <code>PREPARED</code> . */
+ public static final String PREPARED = "prepared";
+ /** <code>COMMITTING</code> . */
+ public static final String COMMITTING = "committing";
+ /** <code>COMMITTED</code> . */
+ public static final String COMMITTED = "committed";
+ /** <code>ABORTING</code> . */
+ public static final String ABORTING = "aborting";
+ /** <code>ABORTED</code> . */
+ public static final String ABORTED = "aborted";
+
+ /** <code>START</code> . */
+ public static final String START = "start";
+ /** <code>MARK_ABORT</code> . */
+ public static final String MARK_ABORT = "mark-abort";
+ /** <code>PREPARE</code> . */
+ public static final String PREPARE = "prepare";
+ /** <code>PREPARE_ACK</code> . */
+ public static final String PREPARE_ACK = "prepare-ack";
+ /** <code>COMMIT</code> . */
+ public static final String COMMIT = "commit";
+ /** <code>COMMIT_ACK</code> . */
+ public static final String COMMIT_ACK = "commit-ack";
+ /** <code>ABORT</code> . */
+ public static final String ABORT = "abort";
+ /** <code>ABORT_ACK</code> . */
+ public static final String ABORT_ACK = "abort-ack";
+ /** <code>SUSPEND</code> . */
+ public static final String SUSPEND = "suspend";
+ /** <code>RESUME</code> . */
+ public static final String RESUME = "resume";
+}
| <-- Date Index --> | <-- Thread Index --> |
Powered by MHonArc.
Copyright © 2006-2007, OW2 Consortium | contact | webmaster.