Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /* ************************************************************************
  #
  #  DivConq
  #
  #  http://divconq.com/
  #
  #  Copyright:
  #    Copyright 2014 eTimeline, LLC. All rights reserved.
  #
 #  License:
 #    See the license.txt file in the project's top-level directory for details.
 #
 #  Authors:
 #    * Andy White
 #
 ************************************************************************ */
 package divconq.struct.serial;
 
 
 import java.util.List;
 
 
 
 
 public class CompositeToBufferBuilder implements ICompositeBuilder {
 	protected BuilderInfo cstate = null;
 	protected List<BuilderInfobstate = new ArrayList<BuilderInfo>(); 
 	protected boolean complete = false;
 	protected ByteBuf buffer = null;
 	
 	public CompositeToBufferBuilder(ByteBuf buffer) {
 		this. = buffer;
 	}
 	
 	public BuilderState getState() {
 		return (this. != null) ? this.. : (this.) ? . : .;
 	}
 	
 	public void record(Object... propsthrows BuilderStateException {
 		this.startRecord();
 		
 		String name = null;
 		
 		for (Object o : props) {
 			if (name != null) {
 				this.field(nameo);				
 				name = null;
 			}
 			else {
 				if (o == null)
 					throw new BuilderStateException("Null Field Name");
 					
 				name = o.toString();
 			}
 		}
 		
 		this.endRecord();
 	}
 	
 	public void startRecord() throws BuilderStateException {
 		// indicate we are in a record
 		this..add();
 		
 	}
 	
	public void endRecord() throws BuilderStateException {
		// cannot call end rec with being in a record or field
		if ((this. == null) || (this.. == .))
			throw new BuilderStateException("Cannot end record when in list");
		// if in a field, finish it
			this.endField();
		// return to parent
		this.popState();
		// mark the value complete, let parent container know we need commas
	}
	// names may contain only alpha-numerics
	public void field(String nameObject valuethrows BuilderStateException {
		this.field(name);
		this.value(value);
	}
	/*
	 * OK to call if in an unnamed field already (then adds name to the field)
	 * or to call if in a record straight up
	 */
	public void field(String namethrows BuilderStateException {
		// fields cannot occur outside of records
		if ((this. == null) || (this.. == .))
			throw new BuilderStateException("Cannot add field while in list");
		// if in a named field, finish it
		if ((this.. == .) && this..)
			this.endField();
		// if not yet in a field mark as such
			this.field();
		this.value(name);
	}
	public void field() throws BuilderStateException {
		// fields cannot occur outside of records
		if ((this. == null) || (this.. == .))
			throw new BuilderStateException("Cannot add field when in list");
		// if already in field then pop out of it
			this.endField();
		// if pop leaves us hanging or not in record then bad
		if ((this. == null) || (this.. != .))
			throw new BuilderStateException("Cannot end field when not in record");
		// note that we are in a field now, value not completed
	}
	private void endField() throws BuilderStateException {
		// cannot occur outside of field
		if ((this. == null) || (this.. == .) || (this.. == .))
			throw new BuilderStateException("Cannot end field when not in a field");
		// return to the record state
		this.popState();
	}
	public void list(Object... propsthrows BuilderStateException {
		this.startList();
		for (Object o : props)
			this.value(o);
		this.endList();
	}
	public void startList() throws BuilderStateException {
		// mark that we are in a list
	}
	public void endList() throws BuilderStateException {
		// must be in a list
		if ((this. == null) || (this.. != .))
			throw new BuilderStateException("Not in a list, cannot end list");
		// end list
		// return to parent state
		this.popState();
		// mark the value complete, let parent container know we need commas
	}
	public boolean needFieldName() {
		if (this. == null)
			return false;
		return ((this.. == .) && !this..);
	}
	public void value(Object valuethrows BuilderStateException {
		// cannot occur outside of field or list
		if ((this. == null) || (this.. == .))
			throw new BuilderStateException("Cannot add a value unless in a field or in a list");
		if ((this.. == .) && !this..) {
			// TODO check that name is valid
			this.write(value.toString());			
			this.. = true;
			return;
		}
		// TODO handle other object types - reader, etc
		if (value instanceof AnyStruct)
			value = ((AnyStruct)value).getValue();
		// if object can handle it's own ouput then go ahead and use that 
		if (value instanceof ICompositeOutput) {
			return;
		}
		// if not a composite then it is a scalar
		if (value instanceof BooleanStruct)
			value = ((BooleanStruct)value).getValue();
		else if (value instanceof IntegerStruct)
			value = ((IntegerStruct)value).getValue();
		else if (value instanceof BigIntegerStruct)
			value = ((BigIntegerStruct)value).getValue();
		else if (value instanceof DecimalStruct)
			value = ((DecimalStruct)value).getValue();
		else if (value instanceof DateTimeStruct)
			value = ((DateTimeStruct)value).getValue();
		else if (value instanceof BigDateTimeStruct)
			value = ((BigDateTimeStruct)value).getValue();
		else if (value instanceof BinaryStruct
			value = ((BinaryStruct)value).getValue();
		else if (value instanceof StringStruct
			value = ((StringStruct)value).getValue();	
		if ((value == null) || (value instanceof NullStruct))
			this.write("null");
		else if (value instanceof Boolean)
			this.write(value.toString());
		else if ((value instanceof BigDecimal) || (value instanceof Double) || (value instanceof Float)) 
			this.write("(" + value.toString());
		else if (value instanceof Number
			this.write(")" + value.toString());
		else if (value instanceof DateTime)
			this.write("@" + ..print((DateTime)value));
		else if (value instanceof BigDateTime)
			this.write("$" + ((BigDateTime)value).toString());
		else if (value instanceof ByteBuffer
			this.write("%" + Base64.encodeToString(((ByteBuffer)value).array(), false));
		else if (value instanceof ByteBuf
			this.write("%" + Base64.encodeToString(((ByteBuf)value).array(), false));
		else if (value instanceof Memory
			this.write("%" + Base64.encodeToString(((Memory)value).toArray(), false));
		else if (value instanceof byte[]) 
			this.write("%" + Base64.encodeToString(((byte[])value), false));
		else 
			this.writeEscape("`" + value.toString());		// TODO more efficient with memory/builder/etc
	}
	// TODO not supported currently, need some sort of escaping/framing
	public void rawJson(Object valuethrows BuilderStateException {
		// cannot occur outside of field or list
		if ((this. == null) || (this.. == .))
			throw new BuilderStateException("Cannot add JSON when not in field or in list");
		if ((this.. == .) && !this..
			throw new BuilderStateException("Cannot use JSON for field name");
		// TODO handle other object types - reader, etc
		//this.write(value.toString());		// TODO more efficient
		throw new BuilderStateException("Cannot use JSON with this builder at this time");
		// mark the value complete, let parent container know we need commas
		//this.completeValue();
	}
	public void writeEscape(String str) {
		str = str.replace("\\""\\\\").replace("\n""\\n").replace("\t""\\t");		
		this.write(str);
	}
	public void writeEscape(char ch) {
		  switch (ch) {
		    case '\\':
		    	this.write("\\\\");
		    	break;
			case '\n':
				this.write("\\n");
				break;
			case '\t':
				this.write("\\t");
			    break;
		    default:
		    	this.writeChar(ch);
		  }			
	}
	private void completeValue() throws BuilderStateException {
		// if parent, mark it a having a complete value
		if (this. != null) {
			if (this.. == .)		// be sure to pop the state
				this.endField();
		}
	}
	private void popState() throws BuilderStateException {
		if (this. == null)
			throw new BuilderStateException("Cannot pop state when state is null");
		this..remove(this..size() - 1);
		if (this..size() == 0) {
			this. = null;
			this. = true;
		}
		else
			this. = this..get(this..size() - 1);
	}

Write a single character into Memory as UTF-8. Increment position accordingly.

Parameters:
ch character to write
	public void writeChar(int ch) {
		this..writeBytes(Utf8Encoder.encode(ch));
	}

Write a special character into Memory as UTF-8. Increment position accordingly.

Parameters:
ch character to write
	public void write(Special ch) {
		this..writeBytes(Utf8Encoder.encode(ch.getCode()));
	}

Write a string into Memory as UTF-8. Increment position accordingly.

Parameters:
str string to write
	public void write(CharSequence str) {
		// TODO this could be more efficient - encode <= 64 bytes at a time and add
		this..writeBytes(Utf8Encoder.encode(str));
	}
	public Memory toMemory() {
		return new Memory(this..array());
	}
		try {
			parser.parseStruct(this.);
		catch (Exception x) {
		}
		return obj.getRoot();
	}
New to GrepCode? Check out our FAQ X