Author: erodriguez
Date: Fri Jan  7 20:48:33 2005
New Revision: 124622

URL: http://svn.apache.org/viewcvs?view=rev&rev=124622
Log:
Working NTP PDU encoding and decoding.
Added:
   
incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/io/NtpMessageEncoder.java
Modified:
   
incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/io/NtpMessageDecoder.java
   
incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessage.java
   
incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessageModifier.java
   
incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/service/NtpServiceImpl.java
   
incubator/directory/ntp/trunk/core/src/test/org/apache/ntp/NtpMessageEncoderTest.java

Modified: 
incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/io/NtpMessageDecoder.java
Url: 
http://svn.apache.org/viewcvs/incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/io/NtpMessageDecoder.java?view=diff&rev=124622&p1=incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/io/NtpMessageDecoder.java&r1=124621&p2=incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/io/NtpMessageDecoder.java&r2=124622
==============================================================================
--- 
incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/io/NtpMessageDecoder.java
        (original)
+++ 
incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/io/NtpMessageDecoder.java
        Fri Jan  7 20:48:33 2005
@@ -39,34 +39,28 @@
                modifier.setVersionNumber( parseVersionNumber( header ) );
                modifier.setMode( parseMode( header ) );
                
-               modifier.setStratum( StratumType.getTypeByOrdinal( 
request.get() ) );
+               modifier.setStratum( parseStratum( request ) );
                
-               int pollInterval = (int)Math.round( Math.pow( 2, request.get() 
) );
-               modifier.setPollInterval( pollInterval );
-               
-               double precision = 1000 * Math.pow( 2, request.get() );
-               modifier.setPrecision( precision );
+               modifier.setPollInterval( parsePollInterval( request ) );
                
+               modifier.setPrecision( parsePrecision( request ) );
                
                modifier.setRootDelay( parseRootDelay( request ) );
                
                modifier.setRootDispersion( parseRootDispersion( request ) );
                
-               byte[] nextFourBytes = new byte[ 4 ];
-               request.get( nextFourBytes );
-               modifier.setReferenceIdentifier( parseReferenceIdentifier( 
nextFourBytes ) );
-               
+               modifier.setReferenceIdentifier( parseReferenceIdentifier( 
request ) );
                
                modifier.setReferenceTimestamp( new NtpTimeStamp( request ) );
                modifier.setOriginateTimestamp( new NtpTimeStamp( request ) );
                
                byte[] unneededBytes = new byte[ 8 ];
                request.get( unneededBytes );
+               
                modifier.setReceiveTimestamp( new NtpTimeStamp() );
                
                modifier.setTransmitTimestamp( new NtpTimeStamp( request ) );
                
-               
                return modifier.getNtpMessage();
        }
        
@@ -85,21 +79,38 @@
            return ModeType.getTypeByOrdinal( header & 0x07 );
        }
        
-       private ReferenceIdentifier parseReferenceIdentifier( byte[] bytes )
+       private StratumType parseStratum( ByteBuffer request )
+       {
+               return StratumType.getTypeByOrdinal( request.get() );
+       }
+       
+       private byte parsePollInterval( ByteBuffer bytes )
        {
-               return ReferenceIdentifier.getTypeByName( new String( bytes ) );
+               return (byte)Math.round( Math.pow( 2, bytes.get() ) );
        }
        
-    private double parseRootDelay( ByteBuffer bytes )
+       private byte parsePrecision( ByteBuffer bytes )
+       {
+               return (byte)( 1000 * Math.pow( 2, bytes.get() ) );
+       }
+       
+       private ReferenceIdentifier parseReferenceIdentifier( ByteBuffer 
request )
+       {
+               byte[] nextFourBytes = new byte[ 4 ];
+               request.get( nextFourBytes );
+               return ReferenceIdentifier.getTypeByName( new String( 
nextFourBytes ) );
+       }
+       
+    private int parseRootDelay( ByteBuffer bytes )
     {
         int temp = 256 * ( 256 * ( 256 * bytes.get() + bytes.get() ) + 
bytes.get() ) + bytes.get();
-        return 1000 * ( ( (double)temp ) / 0x10000 );
+        return 1000 * ( temp / 0x10000 );
     }
 
-    private double parseRootDispersion( ByteBuffer bytes )
+    private int parseRootDispersion( ByteBuffer bytes )
     {
-        long temp = 256 * ( 256 * ( 256 * bytes.get() + bytes.get() ) + 
bytes.get() ) + bytes.get();
-        return 1000 * ( ( (double)temp ) / 0x10000 );
+        int temp = 256 * ( 256 * ( 256 * bytes.get() + bytes.get() ) + 
bytes.get() ) + bytes.get();
+        return 1000 * ( temp / 0x10000 );
     }
 }
 

Added: 
incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/io/NtpMessageEncoder.java
Url: 
http://svn.apache.org/viewcvs/incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/io/NtpMessageEncoder.java?view=auto&rev=124622
==============================================================================
--- (empty file)
+++ 
incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/io/NtpMessageEncoder.java
        Fri Jan  7 20:48:33 2005
@@ -0,0 +1,70 @@
+/*
+ *   Copyright 2005 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+
+package org.apache.ntp.io;
+
+import java.nio.ByteBuffer;
+
+import org.apache.ntp.message.LeapIndicatorType;
+import org.apache.ntp.message.ModeType;
+import org.apache.ntp.message.NtpMessage;
+
+
+public class NtpMessageEncoder
+{
+       public ByteBuffer encode( NtpMessage message )
+       {
+               ByteBuffer buffer = ByteBuffer.allocate( 576 );
+               
+               byte header = 0x00;
+               header = encodeLeapIndicator( message.getLeapIndicator(), 
header );
+               header = encodeVersionNumber( message.getVersionNumber(), 
header );
+               header = encodeMode( message.getMode(), header );
+               buffer.put( header );
+               
+               buffer.put( (byte)( message.getStratum().getOrdinal() & 0xFF ) 
);
+               buffer.put( (byte)( message.getPollInterval() & 0xFF ) );
+               buffer.put( (byte)( message.getPrecision() & 0xFF ) );
+               
+               buffer.putInt( message.getRootDelay() );
+               buffer.putInt( message.getRootDispersion() );
+               buffer.putInt( message.getReferenceIdentifier().getOrdinal() );
+               
+               buffer.rewind();
+               
+               return buffer;
+       }
+       
+       private byte encodeLeapIndicator( LeapIndicatorType leapIndicator, byte 
header )
+       {
+               byte twoBits = (byte)(leapIndicator.getOrdinal() & 0x03);
+               return (byte)( ( twoBits << 6 ) | header);
+       }
+       
+       private byte encodeVersionNumber( int versionNumber, byte header )
+       {
+               byte threeBits = (byte)( versionNumber & 0x07 );
+               return (byte)( ( threeBits << 3 ) | header );
+       }
+       
+       private byte encodeMode( ModeType mode, byte header )
+       {
+               byte threeBits = (byte)( mode.getOrdinal() & 0x07 );
+               return (byte)( threeBits | header );
+       }
+}
+

Modified: 
incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessage.java
Url: 
http://svn.apache.org/viewcvs/incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessage.java?view=diff&rev=124622&p1=incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessage.java&r1=124621&p2=incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessage.java&r2=124622
==============================================================================
--- 
incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessage.java
  (original)
+++ 
incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessage.java
  Fri Jan  7 20:48:33 2005
@@ -24,11 +24,10 @@
        private int               versionNumber;
        private ModeType          mode;
        private StratumType       stratumType;
-       private int               pollInterval;
-       private double            precision;
-       
-       private double rootDelay;
-       private double rootDispersion;
+       private byte              pollInterval;
+       private byte              precision;
+       private int               rootDelay;
+       private int               rootDispersion;
        
        private ReferenceIdentifier referenceIdentifier;
        
@@ -39,8 +38,8 @@
        
        
        public NtpMessage( LeapIndicatorType leapIndicator, int versionNumber,
-                       ModeType mode, StratumType stratumType, int 
pollInterval,
-                       double precision, double rootDelay, double 
rootDispersion,
+                       ModeType mode, StratumType stratumType, byte 
pollInterval,
+                       byte precision, int rootDelay, int rootDispersion,
                        ReferenceIdentifier referenceIdentifier, NtpTimeStamp 
referenceTimestamp,
                        NtpTimeStamp originateTimestamp, NtpTimeStamp 
receiveTimestamp,
                        NtpTimeStamp transmitTimestamp )
@@ -88,7 +87,7 @@
        /**
         * @return Returns the Poll Interval.
         */
-       public int getPollInterval()
+       public byte getPollInterval()
        {
                return pollInterval;
        }
@@ -96,7 +95,7 @@
        /**
         * @return Returns the Precision.
         */
-       public double getPrecision()
+       public byte getPrecision()
        {
                return precision;
        }
@@ -128,7 +127,7 @@
        /**
         * @return Returns the Root Delay.
         */
-       public double getRootDelay()
+       public int getRootDelay()
        {
                return rootDelay;
        }
@@ -136,7 +135,7 @@
        /**
         * @return Returns the Root Dispersion.
         */
-       public double getRootDispersion()
+       public int getRootDispersion()
        {
                return rootDispersion;
        }

Modified: 
incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessageModifier.java
Url: 
http://svn.apache.org/viewcvs/incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessageModifier.java?view=diff&rev=124622&p1=incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessageModifier.java&r1=124621&p2=incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessageModifier.java&r2=124622
==============================================================================
--- 
incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessageModifier.java
  (original)
+++ 
incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/message/NtpMessageModifier.java
  Fri Jan  7 20:48:33 2005
@@ -24,11 +24,10 @@
        private int               versionNumber;
        private ModeType          mode;
        private StratumType       stratumType;
-       private int               pollInterval;
-       private double            precision;
-       
-       private double rootDelay;
-       private double rootDispersion;
+       private byte              pollInterval;
+       private byte              precision;
+       private int               rootDelay;
+       private int               rootDispersion;
        
        private ReferenceIdentifier referenceIdentifier;
        
@@ -74,7 +73,7 @@
        /**
         * @param pollInterval The Poll Interval to set.
         */
-       public void setPollInterval(int pollInterval)
+       public void setPollInterval(byte pollInterval)
        {
                this.pollInterval = pollInterval;
        }
@@ -82,7 +81,7 @@
        /**
         * @param precision The Precision to set.
         */
-       public void setPrecision(double precision)
+       public void setPrecision(byte precision)
        {
                this.precision = precision;
        }
@@ -114,7 +113,7 @@
        /**
         * @param rootDelay The Root Delay to set.
         */
-       public void setRootDelay(double rootDelay)
+       public void setRootDelay(int rootDelay)
        {
                this.rootDelay = rootDelay;
        }
@@ -122,7 +121,7 @@
        /**
         * @param rootDispersion The Root Dispersion to set.
         */
-       public void setRootDispersion(double rootDispersion)
+       public void setRootDispersion(int rootDispersion)
        {
                this.rootDispersion = rootDispersion;
        }

Modified: 
incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/service/NtpServiceImpl.java
Url: 
http://svn.apache.org/viewcvs/incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/service/NtpServiceImpl.java?view=diff&rev=124622&p1=incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/service/NtpServiceImpl.java&r1=124621&p2=incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/service/NtpServiceImpl.java&r2=124622
==============================================================================
--- 
incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/service/NtpServiceImpl.java
      (original)
+++ 
incubator/directory/ntp/trunk/core/src/java/org/apache/ntp/service/NtpServiceImpl.java
      Fri Jan  7 20:48:33 2005
@@ -37,8 +37,8 @@
                modifier.setVersionNumber( 4 );
                modifier.setMode( ModeType.SERVER );
                modifier.setStratum( StratumType.SECONDARY_REFERENCE );
-               modifier.setPollInterval( 64 );
-               modifier.setPrecision( -20 );
+               modifier.setPollInterval( (byte)0x40 );
+               modifier.setPrecision( (byte)0xEC );
                modifier.setRootDelay( 0 );
                modifier.setRootDispersion( 0 );
                modifier.setReferenceIdentifier( ReferenceIdentifier.LOCL );

Modified: 
incubator/directory/ntp/trunk/core/src/test/org/apache/ntp/NtpMessageEncoderTest.java
Url: 
http://svn.apache.org/viewcvs/incubator/directory/ntp/trunk/core/src/test/org/apache/ntp/NtpMessageEncoderTest.java?view=diff&rev=124622&p1=incubator/directory/ntp/trunk/core/src/test/org/apache/ntp/NtpMessageEncoderTest.java&r1=124621&p2=incubator/directory/ntp/trunk/core/src/test/org/apache/ntp/NtpMessageEncoderTest.java&r2=124622
==============================================================================
--- 
incubator/directory/ntp/trunk/core/src/test/org/apache/ntp/NtpMessageEncoderTest.java
       (original)
+++ 
incubator/directory/ntp/trunk/core/src/test/org/apache/ntp/NtpMessageEncoderTest.java
       Fri Jan  7 20:48:33 2005
@@ -19,9 +19,11 @@
 
 import java.nio.ByteBuffer;
 
+import org.apache.ntp.io.NtpMessageDecoder;
 import org.apache.ntp.io.NtpMessageEncoder;
 import org.apache.ntp.message.LeapIndicatorType;
 import org.apache.ntp.message.ModeType;
+import org.apache.ntp.message.NtpMessage;
 import org.apache.ntp.message.NtpMessageModifier;
 import org.apache.ntp.message.NtpTimeStamp;
 import org.apache.ntp.message.ReferenceIdentifier;
@@ -39,10 +41,10 @@
                modifier.setVersionNumber( 4 );
                modifier.setMode( ModeType.SERVER );
                modifier.setStratum( StratumType.PRIMARY_REFERENCE );
-               modifier.setPollInterval( 6 );
-               modifier.setPrecision( 0.000015 );
-               modifier.setRootDelay( 0.0 );
-               modifier.setRootDispersion( 0.0006 );
+               modifier.setPollInterval( (byte)0x06 ); // 6
+               modifier.setPrecision( (byte)0xFA );    // -6
+               modifier.setRootDelay( 0 );
+               modifier.setRootDispersion( 0 );
                modifier.setReferenceIdentifier( ReferenceIdentifier.LOCL );
                
                NtpTimeStamp now = new NtpTimeStamp();
@@ -52,11 +54,17 @@
                modifier.setReceiveTimestamp( now );
                modifier.setTransmitTimestamp( now );
                
+               NtpMessage message = modifier.getNtpMessage();
+               
                NtpMessageEncoder encoder = new NtpMessageEncoder();
-               replyByteBuffer = encoder.encode( modifier.getNtpMessage() );
-               replyByteBuffer.flip();
+               replyByteBuffer = encoder.encode( message );
+               
+               print( message );
+               
+               NtpMessageDecoder decoder = new NtpMessageDecoder();
+               NtpMessage reply          = decoder.decode( replyByteBuffer );
                
-               print( modifier.getNtpMessage() );
+               print( reply );
        }
 }
 

Reply via email to