1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 package org.apache.commons.id.uuid.clock;
19
20 /**
21 * <p><code>SystemClockImpl</code> provides a timing mechanism for returning the
22 * current time in 100-nano second intervals since 00:00:00.00, 15 October 1582.
23 * </p>
24 *
25 * @see org.apache.commons.id.uuid.clock.Clock
26 * @author Commons-Id Team
27 * @version $Revision: 480488 $ $Date: 2006-11-29 08:57:26 +0000 (Wed, 29 Nov 2006) $
28 */
29
30 public final class SystemClockImpl implements Clock {
31 /** Counter for the number of calls during the current millisecond */
32 private long generatedThisMilli = 0;
33
34 /** The current time in milliseconds held in this clock thread. */
35 private long currentTimeMillis;
36
37 /**
38 * <p>Public constructor.</p>
39 */
40 public SystemClockImpl() {
41 super();
42 }
43
44 /** @see org.apache.commons.id.uuid.clock.Clock#getUUIDTime() */
45 public long getUUIDTime() throws OverClockedException {
46 return getTimeSynchronized();
47 }
48
49 /**
50 * <p>Object synchronized method returns the current time in 100ns
51 * intervals since the Gregorian change offset.</p>
52 *
53 * @return the current time in 100ns intervals since the Gregorian change
54 * offset.
55 * @throws OverClockedException an exception raised if too many timestamps
56 * have been generated for the system time interval.
57 */
58 private synchronized long getTimeSynchronized()
59 throws OverClockedException {
60 if (currentTimeMillis != System.currentTimeMillis()) {
61 currentTimeMillis = System.currentTimeMillis();
62 generatedThisMilli = 0;
63 }
64 // Set time as current time millis plus offset times 100 ns ticks
65 long currentTime =
66 (currentTimeMillis + GREGORIAN_CHANGE_OFFSET)
67 * INTERVALS_PER_MILLI;
68
69 // Return the same time - generator/client code must check to see if overclocked
70 if (generatedThisMilli + 1 >= INTERVALS_PER_MILLI) {
71 throw new OverClockedException();
72 }
73 // Return the uuid time plus the artifical tick incremented
74 return (currentTime + generatedThisMilli++);
75 }
76 }