Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  // This software is released into the Public Domain.  See copying.txt for details.
  package org.openstreetmap.osmosis.replicationhttp.v0_6.impl;
  
  import java.util.Arrays;
  import java.util.Queue;
  
A sequence server handler implementation that sends the sequence number itself.

Author(s):
Brett Henderson
 
Creates a new instance.

Parameters:
control Provides the Netty handlers with access to the controller.
 
 		super(control);
 	}
 
 
 	protected void handleRequest(ChannelHandlerContext ctxHttpRequest request) {
 		final String sequenceNumberUri = "sequenceNumber";
 		final String contentType = "text/plain";
 
 		// Split the request Uri into its path elements.
 		String uri = request.getUri();
 		if (!uri.startsWith("/")) {
 			throw new OsmosisRuntimeException("Uri doesn't start with a / character: " + uri);
 		}
 		Queue<StringuriElements = new LinkedList<String>(Arrays.asList(uri.split("/")));
 		
 		// First element is empty due to leading '/', unless there is only a '/'
 		// in which case there will be no elements.
 		if (uriElements.size() > 0) {
 			uriElements.remove();
 		}
 
 		// First element must be the sequence number base uri.
 		if (uriElements.isEmpty() || !sequenceNumberUri.equals(uriElements.remove())) {
 			throw new ResourceNotFoundException();
 		}
 
 		/*
 		 * The next element determines which replication number to start from.
 		 * The request is one of "current" or N where is the last sequence
 		 * number received by the client.
 		 */
 		long nextSequenceNumber;
 		if (uriElements.isEmpty()) {
 			throw new ResourceNotFoundException();
 		}
 		String sequenceStartString = uriElements.remove();
 		if ("current".equals(sequenceStartString)) {
 			nextSequenceNumber = getControl().getLatestSequenceNumber();
 		} else {
 			try {
 				nextSequenceNumber = Long.parseLong(sequenceStartString);
 			} catch (NumberFormatException e) {
 				throw new BadRequestException("Requested sequence number of " + sequenceStartString
 						+ " is not a number.");
 			}
 		}
 
 		// If the next element exists and is "tail" it means that the client
 		// wants to stay connected and receive updated sequences as they become
 		// available.
 		boolean follow;
 		if (!uriElements.isEmpty()) {
 			String tailElement = uriElements.remove();
 			if ("tail".equals(tailElement)) {
 				follow = true;
 			} else {
 				throw new ResourceNotFoundException();
 			}
 		} else {
 			follow = false;
 		}
 		
 		// Validate that that no more URI elements are available.
 		if (!uriElements.isEmpty()) {
 			throw new ResourceNotFoundException();
		}
		// Begin sending replication sequence information to the client.
		initiateSequenceWriting(ctxcontentTypenextSequenceNumberfollow);
	}
	protected void writeSequence(ChannelHandlerContext ctxChannelFuture futurelong sequenceNumber) {
		// Convert the sequence to a string and then a buffer.
		ChannelBuffer buffer = ChannelBuffers.copiedBuffer(Long.toString(sequenceNumber), .);
		// Wrap the buffer in a HTTP chunk.
		DefaultHttpChunk chunk = new DefaultHttpChunk(buffer);
		// Pass the chunk downstream.
		Channels.write(ctxfuturechunk);
	}
New to GrepCode? Check out our FAQ X