package net.wotonomy.foundation; import java.io.Serializable; import java.util.Objects; public abstract class NSPropertyList implements Serializable { private static final long serialVersionUID = 2671697049722442864L; public static enum Type { ARRAY, DICTIONARY, STRING, DATA, DATE, INTEGER, REAL, BOOL } public final Type type; protected boolean isImmutable; private NSPropertyList(Type type) { this.type = type; } public boolean isImmutable() { return isImmutable; } public void makeImmutable() { this.isImmutable = true; } @Override public int hashCode() { return Objects.hash(type); } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; NSPropertyList other = (NSPropertyList) obj; return type == other.type; } public static final class Array extends NSPropertyList { private static final long serialVersionUID = 7386250174020490701L; private NSArray contents; public Array(NSArray contents) { super(Type.ARRAY); this.contents = contents; } public NSArray getContents() { return contents; } public boolean setContents(NSArray contents) { if (this.isImmutable) return false; this.contents = contents; return true; } @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + Objects.hash(contents); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (!super.equals(obj)) return false; if (getClass() != obj.getClass()) return false; Array other = (Array) obj; return Objects.equals(contents, other.contents); } } public static final class Dictionary extends NSPropertyList { private static final long serialVersionUID = 1979462360377516540L; private NSDictionary contents; public Dictionary(NSDictionary retList) { super(Type.DICTIONARY); this.contents = retList; } public NSDictionary getContents() { return contents; } public boolean setContents(NSDictionary contents) { if (this.isImmutable) return false; this.contents = contents; return true; } @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + Objects.hash(contents); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (!super.equals(obj)) return false; if (getClass() != obj.getClass()) return false; Dictionary other = (Dictionary) obj; return Objects.equals(contents, other.contents); } } public static final class String extends NSPropertyList { private static final long serialVersionUID = -388698351414802814L; private java.lang.String contents; public String(java.lang.String contents) { super(Type.STRING); this.contents = contents; } public java.lang.String getContents() { return contents; } public boolean setContents(java.lang.String contents) { if (this.isImmutable) return false; this.contents = contents; return true; } @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + Objects.hash(contents); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (!super.equals(obj)) return false; if (getClass() != obj.getClass()) return false; String other = (String) obj; return Objects.equals(contents, other.contents); } } public static final class Data extends NSPropertyList { private static final long serialVersionUID = -6866410755763823986L; private NSData contents; public Data(NSData contents) { super(Type.DATA); this.contents = contents; } public NSData getContents() { return contents; } public boolean setContents(NSData contents) { if (this.isImmutable) return false; this.contents = contents; return true; } @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + Objects.hash(contents); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (!super.equals(obj)) return false; if (getClass() != obj.getClass()) return false; Data other = (Data) obj; return Objects.equals(contents, other.contents); } } public static final class Date extends NSPropertyList { private static final long serialVersionUID = 6245107872338103662L; private NSDate contents; public Date(NSDate contents) { super(Type.DATE); this.contents = contents; } public NSDate getContents() { return contents; } public boolean setContents(NSDate contents) { if (this.isImmutable) return false; this.contents = contents; return true; } @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + Objects.hash(contents); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (!super.equals(obj)) return false; if (getClass() != obj.getClass()) return false; Date other = (Date) obj; return Objects.equals(contents, other.contents); } } public static final class Integer extends NSPropertyList { private static final long serialVersionUID = -6375080842293791774L; private int contents; public Integer(int contents) { super(Type.INTEGER); this.contents = contents; } public int getContents() { return contents; } public boolean setContents(int contents) { if (this.isImmutable) return false; this.contents = contents; return true; } @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + Objects.hash(contents); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (!super.equals(obj)) return false; if (getClass() != obj.getClass()) return false; Integer other = (Integer) obj; return contents == other.contents; } } public static final class Real extends NSPropertyList { private static final long serialVersionUID = -4548471713243500294L; private double contents; public Real(double contents) { super(Type.REAL); this.contents = contents; } public double getContents() { return contents; } public boolean setContents(double contents) { if (this.isImmutable) return false; this.contents = contents; return true; } @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + Objects.hash(contents); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (!super.equals(obj)) return false; if (getClass() != obj.getClass()) return false; Real other = (Real) obj; return Double.doubleToLongBits(contents) == Double.doubleToLongBits(other.contents); } } public static final class Bool extends NSPropertyList { private static final long serialVersionUID = 1169221814850684398L; private boolean bool; public Bool(boolean val) { super(Type.BOOL); } public boolean getValue() { return bool; } public boolean setValue(boolean bool) { if (this.isImmutable) return false; this.bool = bool; return true; } } }