/* * Eoulsan development code * * This code may be freely distributed and modified under the * terms of the GNU Lesser General Public License version 2.1 or * later and CeCILL-C. This should be distributed with the code. * If you do not have a copy, see: * * http://www.gnu.org/licenses/lgpl-2.1.txt * http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.txt * * Copyright for this code is held jointly by the Genomic platform * of the Institut de Biologie de l'École normale supérieure and * the individual authors. These should be listed in @author doc * comments. * * For more information on the Eoulsan project and its aims, * or to join the Eoulsan Google group, visit the home page * at: * * http://outils.genomique.biologie.ens.fr/eoulsan * */ package fr.ens.biologie.genomique.eoulsan.util.locker; import java.io.Serializable; import java.lang.management.ManagementFactory; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; /** * This class define a ticket for the TicketLocker. * @since 1.1 * @author Laurent Jourdren */ public final class Ticket implements Comparable<Ticket>, Serializable { private static final long serialVersionUID = -7934169474677708526L; private final int pid; private final long threadId; private final long creationTime; private final long nanoCreationTime; private final String description; private long lastActiveTime; private boolean working; // // Getter // public int getPid() { return this.pid; } public long getThreadId() { return this.threadId; } public long getCreationTime() { return this.creationTime; } public String getDescription() { return this.description; } public long getLastActiveTime() { return this.lastActiveTime; } public boolean isWorking() { return this.working; } // // Setter // public void setWorking(final boolean working) { this.working = working; } public void updateLastActiveTime() { this.lastActiveTime = System.currentTimeMillis(); } // // Other methods // @Override public boolean equals(final Object o) { if (o == this) { return true; } if (!(o instanceof Ticket)) { return false; } final Ticket t = (Ticket) o; return this.creationTime == t.creationTime && this.nanoCreationTime == t.nanoCreationTime && this.pid == t.pid && this.threadId == t.threadId; } @Override public int hashCode() { return hashCode(this.creationTime, this.nanoCreationTime, this.pid, this.threadId); } @Override public int compareTo(final Ticket ticket) { if (ticket == null) { return 1; } // Compare creation time final int comp1 = Long.compare(this.creationTime, ticket.creationTime); if (comp1 != 0) { return comp1; } // Compare Nano creation time final int comp2 = Long.valueOf(this.nanoCreationTime).compareTo(ticket.nanoCreationTime); if (comp2 != 0) { return comp2; } // Compare PID final int comp3 = Integer.compare(this.pid, ticket.pid); if (comp3 != 0) { return comp3; } return Long.valueOf(this.threadId).compareTo(ticket.threadId); } @Override public String toString() { final DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss.SSS"); return dateFormat.format(new Date(this.creationTime)) + " " + dateFormat.format(new Date(this.lastActiveTime)) + " " + dateFormat .format(new Date(System.currentTimeMillis() - this.creationTime)) + " " + (this.working ? "WORKING" : "NOT WORKING") + " [" + this.pid + '.' + this.threadId + " " + (this.description != null ? this.description : "") + "]"; } // // Static methods // public static int hashCode(final Object... objects) { return Arrays.hashCode(objects); } private static int getCurrentPid() { final String beanName = ManagementFactory.getRuntimeMXBean().getName(); final int index = beanName.indexOf('@'); return Integer.parseInt(beanName.substring(0, index)); } // // Constructor // public Ticket() { this((String) null); } public Ticket(final String description) { this(getCurrentPid(), Thread.currentThread().getId(), System.currentTimeMillis(), System.nanoTime(), description, -1, false); } public Ticket(final Ticket ticket) { this(ticket.pid, ticket.threadId, ticket.creationTime, ticket.nanoCreationTime, ticket.description, ticket.lastActiveTime, ticket.working); } public Ticket(final int pid, final long threadId, final long creationTime, final long nanoCreationTime, final String description, final long lastActiveTime, final boolean working) { this.pid = pid; this.threadId = threadId; this.creationTime = creationTime; this.nanoCreationTime = nanoCreationTime; this.description = description; this.lastActiveTime = lastActiveTime == -1 ? this.creationTime : lastActiveTime; this.working = working; } }