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.schema;
 
 import java.util.List;
 
 
 public class CoreType {
 	protected Schema schema = null;
 	protected RootType root = null;
 	protected XElement def = null;
 	
 	public RootType getType() {
 		return this.;
 	}
 	
 	public CoreType(Schema schema) {
 		this. = schema;
 	}
 
 	public CoreType(RootType root) {
 		this. = root;
 	}
 
 	public RecordStruct toJsonDef() {
 		RecordStruct def = new RecordStruct();
 		
 		def.setField("RootType"this..getCode());
 		
 		if (this..size() > 0) {
 			ListStruct rests = new ListStruct();
 			
 			for (IDataRestriction dr : this.
 				rests.addItem(dr.toJsonDef());
 			
 			def.setField("DataRestrictions"rests);
 		}
 		
 		return def;
 	}
 	
 	public void compile(XElement defOperationResult mr) {
 		this. = def;
 		
 		String name = def.getName();
 		
 		if ("StringType".equals(name)) {
 			this. = .;
 			
 			for (XElement dtel : def.selectAll("StringRestriction")) { 
 				dt.compile(dtelmr);
 				this..add(dt);
 			}
 		}
 		else if ("BinaryType".equals(name)) {
 			this. = .;
 			
 			for (XElement dtel : def.selectAll("BinaryRestriction")) { 
 				dt.compile(dtelmr);
 				this..add(dt);
 			}
		}
		else if ("NumberType".equals(name)) {
			for (XElement dtel : def.selectAll("NumberRestriction")) { 
				dt.compile(dtelmr);
				this..add(dt);
			}
		}
		else if ("BooleanType".equals(name)) {
		}
		else if ("NullType".equals(name)) {
			this. = .;
		}
		else if ("AnyType".equals(name)) {
			this. = .;
		}
	}
	public boolean match(Object dataOperationResult mr) {
		if (this. == null
			return false;
		if (this. == .
			return Struct.objectIsCharsStrict(data);		
		if (this. == .
			return Struct.objectIsNumber(data);		
		if (this. == .
			return Struct.objectIsBinary(data);		
		if (this. == .
			return Struct.objectIsBoolean(data);		
		if (this. == .
			return (data == null);
		if (this. == .
			return true;
		return false;
	}
	public Struct create(OperationResult mr) {
		if (this. == null
			return null;
		if (this. == .
			return new StringStruct();		
		if (this. == .) { 
			for (IDataRestriction dr : this.) {
				if (dr instanceof NumberRestriction) {
					if (ndr.conform == .
						return new IntegerStruct();
					if (ndr.conform == .
						return new BigIntegerStruct();
				}
			}
			return new DecimalStruct();
		}
		if (this. == .
			return new BinaryStruct();		
		if (this. == .
			return new BooleanStruct();		
		if (this. == .
			return new NullStruct(); 	// need to do this because we set type later - could be a custom type
		if (this. == .
			return new AnyStruct();
		return null;
	}
	// don't call this with data == null from a field if field required - required means "not null" so put the error in
	public boolean validate(Object dataOperationResult mr) {
		if (data == null)
			return false;
		if (this. == null) {
			mr.errorTr(407, data);			
			return false;
		}
		if (this. == .) {
			CharSequence x = Struct.objectToCharsStrict(data);		// TODO use this more
			if (x == null) {
				// shouldn't count as error, null is fine if not required - mr.errorTr(408, data);
				return false;
			}
			if (this..size() == 0)
				return true;
			for (IDataRestriction dr : this.) {
				if (dr.pass(x)) 
					return true;
			}
			for (IDataRestriction dr : this.
				dr.fail(xmr);
			return false;
		}
		if (this. == .) {
			Number x = Struct.objectToNumber(data);		
			if (x == null){
				// shouldn't count as error, null is fine if not required - mr.errorTr(409, data);
				return false;
			}
			if (this..size() == 0)
				return true;
			for (IDataRestriction dr : this.) {
				if (dr.pass(x)) 
					return true;
			}
			for (IDataRestriction dr : this.
				dr.fail(xmr);
			return false;
		}
		if (this. == .) {
			Memory x = Struct.objectToBinary(data);		
			if (x == null) {
				// shouldn't count as error, null is fine if not required - mr.errorTr(410, data);
				return false;
			}
			if (this..size() == 0)
				return true;
			for (IDataRestriction dr : this.) {
				if (dr.pass(x)) 
					return true;
			}
			for (IDataRestriction dr : this.
				dr.fail(xmr);
			return false;
		}
		if (this. == .) {
			Boolean x = Struct.objectToBoolean(data);		
			if (x == null) {
				// shouldn't count as error, null is fine if not required - mr.errorTr(411, data);
				return false;
			}
			return true;
		}
		if (this. == .
			return (data == null);
		if (this. == .
			return true;
		mr.errorTr(412, data);			
		return false;
	}
	public Struct wrap(Object dataOperationResult mr) {
		if (this. == null
			return null;
		ScalarStruct ret = null;
		if (this. == .) {
			if ("DateTime".equals(this..getAttribute("Id")))		// TODO maybe generalize this, look at Class? (before this if/else structure)
				ret = new DateTimeStruct();
			else
				ret = new StringStruct();		
		}		
		else if (this. == .) { 
			for (IDataRestriction dr : this.) {
				if (dr instanceof NumberRestriction) {
					if (ndr.conform == .) {
						ret = new IntegerStruct();
						break;
					}
					if (ndr.conform == .) {
						ret = new BigIntegerStruct();
						break;
					}
					if (ndr.conform == .) {
						ret = new DecimalStruct();
						break;
					}
					if (ndr.conform == .) {
						ret = new DecimalStruct();
						break;
					}
				}
			}
		}
		else if (this. == .
			ret = new BinaryStruct();				
		else if (this. == .
			ret = new BooleanStruct();				
		else if (this. == .
			ret = new NullStruct(); 	// need to do this because we set type later - could be a custom type
		else if (this. == .) {
			if (data instanceof Struct)
				return (Struct)data;
			ret = new AnyStruct();
		}
		if (ret != null)
			ret.adaptValue(data);
		return ret;
	}
	interface IDataRestriction {
		void compile(XElement defOperationResult mr);
		boolean pass(Object x);
		void fail(Object xOperationResult mr);
	}
	class StringRestriction implements IDataRestriction {
		String[] enums = null;
		int max = 0;
		int min = 0;
		Pattern pattern = null;
		public void compile(XElement defOperationResult mr) {
			if (def.hasAttribute("Enum")) 
				this. = def.getAttribute("Enum""").split(",");
			if (def.hasAttribute("MaxLength"))
				this. = (int)StringUtil.parseInt(def.getAttribute("MaxLength"), 0);
			if (def.hasAttribute("MinLength"))
				this. = (int)StringUtil.parseInt(def.getAttribute("MinLength"), 0);
			if (def.hasAttribute("Length"))
				this. = this. = (int)StringUtil.parseInt(def.getAttribute("Length"), 0);
			if (def.hasAttribute("Pattern"))
				this. = Pattern.compile("^" + def.getAttribute("Pattern") + "$");
		}
		public boolean pass(Object x) {
			if (x instanceof CharSequence) {
				if ((this. > 0) && (((CharSequence)x).length() > this.))
					return false;
				if ((this. > 0) && (((CharSequence)x).length() < this.))
					return false;
				if (this. != null) {
					boolean fnd = false;
					for (String ev : this.) {
						if (ev.equals(x)) {
							fnd = true;
							break;
						}
					}
					if (!fnd)
						return false;
				}
				if ((this. != null) && !this..matcher((CharSequence)x).matches())
					return false;
				return true;
			}
			return false;
		}
		public void fail(Object xOperationResult mr) {
			if ((this. > 0) && (((CharSequence)x).length() > this.))
				mr.errorTr(404, x);		
			if ((this. > 0) && (((CharSequence)x).length() < this.))
				mr.errorTr(405, x);		
			if (this. != null) {
				boolean fnd = false;
				for (String ev : this.) {
					if (ev.equals(x)) {
						fnd = true;
						break;
					}
				}
				if (!fnd)
					mr.errorTr(406, x);		
			}
			if ((this. != null) && !this..matcher((CharSequence)x).matches())
				mr.errorTr(447, x);		
		}		
		public RecordStruct toJsonDef() {
			RecordStruct def = new RecordStruct();
			if (this. > 0) 
				def.setField("Max"this.);
			if (this. > 0) 
				def.setField("Min"this.);
			if (this. != null
				def.setField("Enums"new ListStruct((Object[])this.));
			if (this. != null
				def.setField("Pattern"this..pattern());
			return def;
		}		
	}
	enum ConformKind {
		Integer,
		BigInteger,
		Decimal,
		BigDecimal
	}
	class NumberRestriction implements IDataRestriction {
		Number min = null;
		Number max = null;
		public void compile(XElement defOperationResult mr) {
			String con = def.getAttribute("Conform");
			if ("Integer".equals(con))
			else if ("BigInteger".equals(con))
			else if ("Decimal".equals(con))
			else if ("BigDecimal".equals(con))
			if (def.hasAttribute("Max"))
				if (this. == .)
					this. = StringUtil.parseInt(def.getAttribute("Max"), 0);
				else if (this. == .)
					this. = new BigInteger(def.getAttribute("Max"));
				else if (this. == .)
					this. = new BigDecimal(def.getAttribute("Max"));
				else if (this. == .)
					this. = new BigDecimal(def.getAttribute("Max"));
			if (def.hasAttribute("Min"))
				if (this. == .)
					this. = StringUtil.parseInt(def.getAttribute("Min"), 0);
				else if (this. == .)
					this. = new BigInteger(def.getAttribute("Min"));
				else if (this. == .)
					this. = new BigDecimal(def.getAttribute("Min"));
				else if (this. == .)
					this. = new BigDecimal(def.getAttribute("Min"));
			// TODO support Digits, Whole and Fraction
		}
		public boolean pass(Object x) {
			if (x instanceof Number) {
				if ((this. == .) && !(x instanceof BigDecimal) && !(x instanceof BigInteger) && !(x instanceof Long))
					return false;
				if ((this. == .) && !(x instanceof BigDecimal) && !(x instanceof Long))
					return false;
				if ((this. == .) && (!(x instanceof BigInteger) && !(x instanceof Long)))
					return false;
				if ((this. == .) && (!(x instanceof Long)))
					return false;
				// TODO support min/max and conform
				/*
				if ((this.max != null) && ())
					return false;
				if ((this.min > 0) && (((Memory)x).getLength() < this.min))
					return false;
				*/
				return true;
			}
			return false;
		}
		public void fail(Object xOperationResult mr) {
			if ((this. == .) && !(x instanceof BigDecimal) && !(x instanceof BigInteger) && !(x instanceof Long))
				mr.errorTr(400, x);		
			if ((this. == .) && !(x instanceof BigDecimal) && !(x instanceof Long))
				mr.errorTr(401, x);		
			if ((this. == .) && (!(x instanceof BigInteger) && !(x instanceof Long)))
				mr.errorTr(402, x);		
			if ((this. == .) && (!(x instanceof Long)))
				mr.errorTr(403, x);		
		}				
		public RecordStruct toJsonDef() {
			RecordStruct def = new RecordStruct();
			if (this. != null
				def.setField("Max"this.);
			if (this. != null
				def.setField("Min"this.);
			if ((this. == .) || (this. == .))
				def.setField("AllowDecimal"false);
			return def;
		}		
	}
	class BinaryRestriction implements IDataRestriction {
		int max = 0;
		int min = 0;
		public void compile(XElement defOperationResult mr) {
			if (def.hasAttribute("MaxLength"))
				this. = (int)StringUtil.parseInt(def.getAttribute("MaxLength"), 0);
			if (def.hasAttribute("MinLength"))
				this. = (int)StringUtil.parseInt(def.getAttribute("MinLength"), 0);
			if (def.hasAttribute("Length"))
				this. = this. = (int)StringUtil.parseInt(def.getAttribute("Length"), 0);
		}
		public boolean pass(Object x) {
			if (x instanceof Memory) {
				if ((this. > 0) && (((Memory)x).getLength() > this.))
					return false;
				if ((this. > 0) && (((Memory)x).getLength() < this.))
					return false;
				return true;
			}
			return false;
		}
		public void fail(Object xOperationResult mr) {
			// TODO Auto-generated method stub
		}				
		public RecordStruct toJsonDef() {
			RecordStruct def = new RecordStruct();
			if (this. > 0) 
				def.setField("Max"this.);
			if (this. > 0) 
				def.setField("Min"this.);
			return def;
		}		
	}
New to GrepCode? Check out our FAQ X