diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..4e185f6
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,101 @@
+
+
+ 4.0.0
+
+ edu.itu
+ cavabunga-lib
+ 0.0.1-SNAPSHOT
+ jar
+
+ cavabunga-lib
+ Cavabunga calendaring application core object library
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.5.8.RELEASE
+
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ org.springframework.boot
+ spring-boot-starter-data-rest
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.jacoco
+ jacoco-maven-plugin
+ 0.7.9
+
+
+
+ com.tngtech.junit.dataprovider
+ junit4-dataprovider
+ 2.0
+ test
+
+
+
+ org.projectlombok
+ lombok
+ 1.16.20
+ provided
+
+
+ org.apache.commons
+ commons-lang3
+ 3.7
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ org.jacoco
+ jacoco-maven-plugin
+
+
+
+ prepare-agent
+
+
+
+ report
+ test
+
+ report
+
+
+
+
+
+
+
+
+
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/Component.java b/src/main/java/edu/itu/cavabunga/lib/entity/Component.java
new file mode 100644
index 0000000..d2aecb3
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/Component.java
@@ -0,0 +1,146 @@
+package edu.itu.cavabunga.lib.entity;
+
+import com.fasterxml.jackson.annotation.*;
+import edu.itu.cavabunga.lib.entity.component.*;
+import edu.itu.cavabunga.lib.entity.property.PropertyType;
+import edu.itu.cavabunga.lib.exception.Validation;
+import lombok.Data;
+import org.hibernate.annotations.DiscriminatorOptions;
+import org.springframework.data.annotation.CreatedDate;
+
+import javax.persistence.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Entity
+@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
+@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)
+@DiscriminatorOptions(force=true)
+@JsonIgnoreProperties(ignoreUnknown = true)
+@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)
+@JsonSubTypes({
+ @JsonSubTypes.Type(value = Alarm.class, name = "Alarm"),
+ @JsonSubTypes.Type(value = Calendar.class, name = "Calendar"),
+ @JsonSubTypes.Type(value = Daylight.class, name = "Daylight"),
+ @JsonSubTypes.Type(value = Event.class, name = "Event"),
+ @JsonSubTypes.Type(value = Freebusy.class, name = "Freebusy"),
+ @JsonSubTypes.Type(value = Journal.class, name = "Journal"),
+ @JsonSubTypes.Type(value = Standard.class, name = "Standard"),
+ @JsonSubTypes.Type(value = Timezone.class, name = "Timezone"),
+ @JsonSubTypes.Type(value = Todo.class, name = "Todo")
+})
+
+@Data
+public abstract class Component {
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private Long id;
+
+ @ManyToOne(cascade = CascadeType.ALL)
+ @JoinColumn(name="owner_uuid")
+ @JsonBackReference(value = "participantAndComponent")
+ private Participant owner;
+
+ @ManyToOne(cascade = CascadeType.ALL)
+ @JoinColumn(name="parent_id")
+ @JsonBackReference
+ private Component parent;
+
+ @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
+ @JsonManagedReference
+ private List components = new ArrayList<>();
+
+ @OneToMany(mappedBy = "component", cascade = CascadeType.ALL)
+ @JsonManagedReference
+ private List properties = new ArrayList<>();
+
+ @CreatedDate
+ private Date creationDate;
+
+ public void addComponent(Component component){
+ component.setParent(this);
+ component.setOwner(this.owner);
+ components.add(component);
+ }
+
+ public void addProperty(Property property){
+ property.setComponent(this);
+ properties.add(property);
+ }
+
+ public void validate(){
+ if(!components.isEmpty()){
+ for (Component c : components){
+ try {
+ c.validate();
+ }catch (Exception e){
+ throw new Validation(this.getClass().getName() + " component's sub component validation failed: " + e.getMessage());
+ }
+ }
+ }
+
+ if(!properties.isEmpty()){
+ for(Property p : properties){
+ try {
+ p.validate();
+ }catch (Exception e){
+ throw new Validation(this.getClass().getName() + " component property validateion failed " + e.getMessage());
+ }
+ }
+ }
+ }
+
+ public void validateOptionalOneProperties(List propertyTypeList){
+ Integer propertyCount = 0;
+ for(PropertyType pt : propertyTypeList){
+ for(Property p : properties){
+ if(p.getClass().getName().equals(pt.create().getClass().getName())){
+ propertyCount++;
+ }
+
+ if(propertyCount >= 2){
+ throw new Validation("Component validation failed in optional-one properties check: " + p.getClass().getName());
+ }
+ }
+ propertyCount = 0;
+ }
+ }
+
+ public void validateOptionalManyProperties(){
+ //
+ }
+
+ public void validateRequiredOneProperties(List propertyTypeList){
+ Integer propertyCount = 0;
+ for(PropertyType pt : propertyTypeList){
+ for(Property p : properties){
+ if(p.getClass().getName().equals(pt.create().getClass().getName())){
+ propertyCount++;
+ }
+ }
+
+ if(propertyCount != 1){
+ throw new Validation("Component validation failed in required-one properties check. Count " + propertyCount + ": " + pt.create().getClass().getName());
+ }
+
+ propertyCount = 0;
+ }
+ }
+
+ public void validateReqiredManyProperties(List propertyTypeList){
+ Integer propertyCount = 0;
+ for(PropertyType pt : propertyTypeList){
+ for(Property p : properties){
+ if(p.getClass().getName().equals(pt.create().getClass().getName())){
+ propertyCount++;
+ }
+ }
+
+ if(propertyCount == 0){
+ throw new Validation("Component validation failed in required-many properties check: " + pt.create().getClass().getName());
+ }
+
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/Parameter.java b/src/main/java/edu/itu/cavabunga/lib/entity/Parameter.java
new file mode 100644
index 0000000..4c04097
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/Parameter.java
@@ -0,0 +1,62 @@
+package edu.itu.cavabunga.lib.entity;
+
+import com.fasterxml.jackson.annotation.JsonBackReference;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import edu.itu.cavabunga.lib.entity.parameter.*;
+import edu.itu.cavabunga.lib.exception.Validation;
+import lombok.Data;
+import org.hibernate.annotations.DiscriminatorOptions;
+
+import javax.persistence.*;
+
+@Entity
+@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
+@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)
+@DiscriminatorOptions(force=true)
+@JsonIgnoreProperties(ignoreUnknown = true)
+@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)
+@JsonSubTypes({
+ @JsonSubTypes.Type(value = Altrep.class, name = "Altrep"),
+ @JsonSubTypes.Type(value = Cn.class, name = "Cn"),
+ @JsonSubTypes.Type(value = Cutype.class, name = "Cutype"),
+ @JsonSubTypes.Type(value = DelegatedFrom.class, name = "DelegatedFrom"),
+ @JsonSubTypes.Type(value = DelegatedTo.class, name = "DelegatedTo"),
+ @JsonSubTypes.Type(value = Dir.class, name = "Dir"),
+ @JsonSubTypes.Type(value = Encoding.class, name = "Encoding"),
+ @JsonSubTypes.Type(value = Fbtype.class, name = "Fbtype"),
+ @JsonSubTypes.Type(value = Fmttype.class, name = "Fmttype"),
+ @JsonSubTypes.Type(value = Language.class, name = "Language"),
+ @JsonSubTypes.Type(value = Member.class, name = "Member"),
+ @JsonSubTypes.Type(value = Partstat.class, name = "Partstat"),
+ @JsonSubTypes.Type(value = Range.class, name = "Range"),
+ @JsonSubTypes.Type(value = Related.class, name = "Related"),
+ @JsonSubTypes.Type(value = Reltype.class, name = "Reltype"),
+ @JsonSubTypes.Type(value = Role.class, name = "Role"),
+ @JsonSubTypes.Type(value = Rsvp.class, name = "Rsvp"),
+ @JsonSubTypes.Type(value = SentBy.class, name = "SentBy"),
+ @JsonSubTypes.Type(value = Tzid.class, name = "Tzid"),
+ @JsonSubTypes.Type(value = Value.class, name = "Value")
+})
+@Data
+public abstract class Parameter {
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private Long id;
+
+ private String name;
+
+ private String value;
+
+ @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+ @JoinColumn(name = "property_id")
+ @JsonBackReference
+ private Property property;
+
+ public void validate(){
+ if((this.value == null) || (this.value.trim().isEmpty())){
+ throw new Validation(this.getClass().getName() + " parameter cannot be empty");
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/Participant.java b/src/main/java/edu/itu/cavabunga/lib/entity/Participant.java
new file mode 100644
index 0000000..e2611be
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/Participant.java
@@ -0,0 +1,56 @@
+
+package edu.itu.cavabunga.lib.entity;
+
+import com.fasterxml.jackson.annotation.*;
+import edu.itu.cavabunga.lib.entity.participant.Group;
+import edu.itu.cavabunga.lib.entity.participant.Resource;
+import edu.itu.cavabunga.lib.entity.participant.User;
+import lombok.Data;
+import org.hibernate.annotations.DiscriminatorOptions;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+import javax.persistence.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Entity
+@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
+@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)
+@EntityListeners(AuditingEntityListener.class)
+@DiscriminatorOptions(force=true)
+@JsonIgnoreProperties(ignoreUnknown = true, value= {"components"}) //TODO: participants with no component will give error while building JSON
+@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)
+@JsonSubTypes({
+ @JsonSubTypes.Type(value = User.class, name = "User"),
+ @JsonSubTypes.Type(value = Group.class, name = "Group"),
+ @JsonSubTypes.Type(value = Resource.class, name = "Resource"),
+})
+@Data
+public abstract class Participant {
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private Long id;
+
+ @Column(name = "user_name")
+ private String userName;
+
+ @Column(name = "creation_date")
+ @CreatedDate
+ private Date creationDate;
+
+
+ @OneToMany(fetch = FetchType.LAZY, mappedBy = "owner")
+ @JsonManagedReference(value = "participantAndComponent")
+ @JsonIgnore
+ private List components = new ArrayList<>();
+
+ public Participant(){
+
+ }
+
+ public void validate(){
+
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/Property.java b/src/main/java/edu/itu/cavabunga/lib/entity/Property.java
new file mode 100644
index 0000000..68ab23f
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/Property.java
@@ -0,0 +1,235 @@
+package edu.itu.cavabunga.lib.entity;
+
+import com.fasterxml.jackson.annotation.*;
+import edu.itu.cavabunga.lib.entity.property.*;
+import edu.itu.cavabunga.lib.entity.property.Class;
+import edu.itu.cavabunga.lib.exception.Validation;
+import lombok.Data;
+import org.hibernate.annotations.DiscriminatorOptions;
+import org.omg.PortableServer.THREAD_POLICY_ID;
+
+import javax.persistence.*;
+import javax.persistence.Version;
+import java.util.ArrayList;
+import java.util.List;
+
+@Entity
+@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
+@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)
+@DiscriminatorOptions(force=true)
+@JsonIgnoreProperties(ignoreUnknown = true)
+@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)
+@JsonSubTypes({
+ @JsonSubTypes.Type(value = Acknowledged.class, name = "Acknowledged"),
+ @JsonSubTypes.Type(value = Action.class, name = "Action"),
+ @JsonSubTypes.Type(value = Attach.class, name = "Attach"),
+ @JsonSubTypes.Type(value = Calscale.class, name = "Calscale"),
+ @JsonSubTypes.Type(value = Catagories.class, name = "Catagories"),
+ @JsonSubTypes.Type(value = Class.class, name = "Class"),
+ @JsonSubTypes.Type(value = Comment.class, name = "Comment"),
+ @JsonSubTypes.Type(value = Completed.class, name = "Completed"),
+ @JsonSubTypes.Type(value = Contact.class, name = "Contact"),
+ @JsonSubTypes.Type(value = Country.class, name = "Country"),
+ @JsonSubTypes.Type(value = Created.class, name = "Created"),
+ @JsonSubTypes.Type(value = Description.class, name = "Description"),
+ @JsonSubTypes.Type(value = Dtend.class, name = "Dtend"),
+ @JsonSubTypes.Type(value = Dtstamp.class, name = "Dtstamp"),
+ @JsonSubTypes.Type(value = Dtstart.class, name = "Dtstart"),
+ @JsonSubTypes.Type(value = Due.class, name = "Due"),
+ @JsonSubTypes.Type(value = Duration.class, name = "Duration"),
+ @JsonSubTypes.Type(value = Exdate.class, name = "Exdate"),
+ @JsonSubTypes.Type(value = Freebusy.class, name = "Freebusy"),
+ @JsonSubTypes.Type(value = Geo.class, name = "Geo"),
+ @JsonSubTypes.Type(value = Lastmod.class, name = "Lastmod"),
+ @JsonSubTypes.Type(value = Location.class, name = "Location"),
+ @JsonSubTypes.Type(value = Method.class, name = "Method"),
+ @JsonSubTypes.Type(value = Organizer.class, name = "Organizer"),
+ @JsonSubTypes.Type(value = Percent.class, name = "Percent"),
+ @JsonSubTypes.Type(value = Priority.class, name = "Priority"),
+ @JsonSubTypes.Type(value = Prodid.class, name = "Prodid"),
+ @JsonSubTypes.Type(value = Rdate.class, name = "Rdate"),
+ @JsonSubTypes.Type(value = Recurid.class, name = "Recurid"),
+ @JsonSubTypes.Type(value = Related.class, name = "Related"),
+ @JsonSubTypes.Type(value = Repeat.class, name = "Repeat"),
+ @JsonSubTypes.Type(value = Resources.class, name = "Resources"),
+ @JsonSubTypes.Type(value = Rrule.class, name = "Rrule"),
+ @JsonSubTypes.Type(value = Rstatus.class, name = "Rstatus"),
+ @JsonSubTypes.Type(value = Seq.class, name = "Seq"),
+ @JsonSubTypes.Type(value = Status.class, name = "Status"),
+ @JsonSubTypes.Type(value = Summary.class, name = "Summary"),
+ @JsonSubTypes.Type(value = Transp.class, name = "Transp"),
+ @JsonSubTypes.Type(value = Trigger.class, name = "Trigger"),
+ @JsonSubTypes.Type(value = Tzid.class, name = "Tzid"),
+ @JsonSubTypes.Type(value = Tzname.class, name = "Tzname"),
+ @JsonSubTypes.Type(value = Tzoffsetfrom.class, name = "Tzoffsetfrom"),
+ @JsonSubTypes.Type(value = Tzoffsetto.class, name = "Tzoffsetto"),
+ @JsonSubTypes.Type(value = Tzurl.class, name = "Tzurl"),
+ @JsonSubTypes.Type(value = Uid.class, name = "Uid"),
+ @JsonSubTypes.Type(value = Url.class, name = "Url"),
+ @JsonSubTypes.Type(value = Version.class, name = "Version")
+})
+@Data
+public abstract class Property {
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private Long id;
+
+ private String name;
+
+ private String value;
+
+ @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+ @JoinColumn(name = "component_id")
+ @JsonBackReference
+ private Component component;
+
+ @OneToMany(mappedBy = "property", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+ @JsonManagedReference
+ private List parameters = new ArrayList<>();
+
+ public void addParameter(Parameter parameter){
+ parameter.setProperty(this);
+ parameters.add(parameter);
+ }
+
+ public void validate(){
+ if(!this.parameters.isEmpty()){
+ for(Parameter pr : this.parameters){
+ try{
+ pr.validate();
+ }catch (Exception e){
+ throw new Validation(this.getClass().getName() + " property class validation failed: " + e.getMessage());
+ }
+ }
+ }
+ }
+
+ public void validateMustHaveParameters(List parameterList){
+ if(parameterList != null && !parameterList.isEmpty()) {
+ Integer instanceCount = parameterList.size();
+ Integer foundInstance = 0;
+ for (Parameter pr : parameterList) {
+ for (Parameter search : parameters) {
+ if (pr.getClass().getName().equals(search.getClass().getName())) {
+ foundInstance++;
+ }
+ }
+ }
+
+ if (!foundInstance.equals(instanceCount)) {
+ throw new Validation(this.getClass().getName() + "property musthaveList is not valid");
+ }
+ }
+ }
+
+ public void validateCannotHaveParameters(List parameterList){
+ if(parameterList != null && !parameterList.isEmpty()) {
+ for (Parameter pr : parameterList) {
+ for (Parameter search : parameters) {
+ if (pr.getClass().getName().equals(search.getClass().getName())) {
+ throw new Validation(this.getClass().getName() + " property cannot have child parameter of: " + search.getClass().getName());
+ }
+ }
+ }
+ }
+ }
+
+ public void validateValueType(PropertyValueType propertyValueType){
+ if(propertyValueType != null) {
+ if (propertyValueType == PropertyValueType.BINARY) {
+ if (!value.matches("^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$")) {
+ throw new Validation(this.getClass().getName() + " value is not valid BINARY type");
+ }
+ }
+
+ if (propertyValueType == PropertyValueType.BOOLEAN) {
+ if (!value.equals("TRUE") && !value.equals("FALSE")) {
+ throw new Validation(this.getClass().getName() + " value is not valid BOOLEAN type " + value);
+ }
+ }
+
+ if (propertyValueType == PropertyValueType.CALADDRESS) {
+ //TODO: there is a full rfc about it: rfc3986
+ }
+
+ if (propertyValueType == PropertyValueType.DATE) {
+ String[] parts = value.split(",");
+ for (String part : parts) {
+ if (!part.matches("^[0-9]{8}$")) {
+ throw new Validation(this.getClass().getName() + " value is not valid DATE type " + value);
+ }
+ }
+ }
+
+ if (propertyValueType == PropertyValueType.DATETIME) {
+ String[] parts = value.split(",");
+ for (String part : parts) {
+ if (!part.matches("^[0-9]{8}T[0-9]{6}|[0-9]{8}T[0-9]{6}Z")) {
+ throw new Validation(this.getClass().getName() + " value is not valid DATE-TIME type " + value);
+ }
+ }
+ }
+
+ if (propertyValueType == PropertyValueType.DURATION) {
+ //TODO: rfc5545 pg 35
+ }
+
+ if (propertyValueType == PropertyValueType.FLOAT) {
+ String[] parts = value.split(",");
+ for (String part : parts) {
+ try {
+ Float f = Float.parseFloat(value);
+ } catch (NumberFormatException e) {
+ //TODO: GEO property has a value type in 'float;float' format !!
+ throw new Validation(this.getClass().getName() + " value is not valid FLOAT type " + value);
+ }
+ }
+ }
+
+ if (propertyValueType == PropertyValueType.INTEGER) {
+ String[] parts = value.split(",");
+ for (String part : parts) {
+ try {
+ Integer i = Integer.parseInt(value);
+ } catch (NumberFormatException e) {
+ throw new Validation(this.getClass().getName() + " value is not valid INTEGER type" + value);
+ }
+ }
+ }
+
+ if (propertyValueType == PropertyValueType.PERIOD) {
+ //TODO: rfc5545 pg 36
+ }
+
+ if (propertyValueType == PropertyValueType.RECUR) {
+ //TODO: rfc5545 pg 37-45
+ }
+
+ if (propertyValueType == PropertyValueType.TEXT) {
+ //TODO: rfc5545 pg 45
+ }
+
+ if (propertyValueType == PropertyValueType.TIME) {
+ String[] parts = value.split(",");
+ for (String part : parts) {
+ if (!part.matches("^[0-9]{6}$|^[0-9]{6}Z$")) {
+ throw new Validation(this.getClass().getName() + " value is not valid TIME type " + value);
+ }
+ }
+ }
+
+ if (propertyValueType == PropertyValueType.URI) {
+ //TODO: there is a full rfc about it: rfc3986
+ }
+
+ if (propertyValueType == PropertyValueType.UTCOFFSET) {
+ String[] parts = value.split(",");
+ for (String part : parts) {
+ if (!part.matches("^[-+][0-9]{4}$|^[-+][0-9]{4}Z$")) {
+ throw new Validation(this.getClass().getName() + " value is not valid TIME type " + value);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/component/Alarm.java b/src/main/java/edu/itu/cavabunga/lib/entity/component/Alarm.java
new file mode 100644
index 0000000..3a43abb
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/component/Alarm.java
@@ -0,0 +1,31 @@
+package edu.itu.cavabunga.lib.entity.component;
+
+import edu.itu.cavabunga.lib.entity.Component;
+import edu.itu.cavabunga.lib.entity.property.PropertyType;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+import java.util.ArrayList;
+import java.util.List;
+
+@Entity
+public class Alarm extends Component{
+ @Override
+ public void validate(){
+ if(!(this.getParent() instanceof Event) && !(this.getParent() instanceof Todo)){
+ throw new Validation("Alarm component can only be child of Event and Todo, not: " + this.getParent().getClass().getName());
+ }
+
+ super.validate();
+
+ List requireOneList = new ArrayList<>();
+ requireOneList.add(PropertyType.Action);
+ requireOneList.add(PropertyType.Trigger);
+ super.validateRequiredOneProperties(requireOneList);
+
+ List optionalOneList = new ArrayList<>();
+ optionalOneList.add(PropertyType.Due);
+ optionalOneList.add(PropertyType.Repeat);
+ super.validateOptionalOneProperties(optionalOneList);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/component/Calendar.java b/src/main/java/edu/itu/cavabunga/lib/entity/component/Calendar.java
new file mode 100644
index 0000000..45b2749
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/component/Calendar.java
@@ -0,0 +1,31 @@
+package edu.itu.cavabunga.lib.entity.component;
+
+import edu.itu.cavabunga.lib.entity.Component;
+import edu.itu.cavabunga.lib.entity.property.PropertyType;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+import java.util.ArrayList;
+import java.util.List;
+
+@Entity
+public class Calendar extends Component {
+ @Override
+ public void validate(){
+ if(this.getParent() != null){
+ throw new Validation("Calendar component cannot have parent component");
+ }
+
+ super.validate();
+
+ List optionalOneList = new ArrayList<>();
+ optionalOneList.add(PropertyType.Calscale);
+ optionalOneList.add(PropertyType.Method);
+ super.validateOptionalOneProperties(optionalOneList);
+
+ List requiredOneList = new ArrayList<>();
+ requiredOneList.add(PropertyType.Prodid);
+ requiredOneList.add(PropertyType.Version);
+ super.validateRequiredOneProperties(requiredOneList);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/component/ComponentType.java b/src/main/java/edu/itu/cavabunga/lib/entity/component/ComponentType.java
new file mode 100644
index 0000000..c69c1f4
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/component/ComponentType.java
@@ -0,0 +1,56 @@
+package edu.itu.cavabunga.lib.entity.component;
+
+import edu.itu.cavabunga.lib.entity.Component;
+
+public enum ComponentType {
+
+ Calendar {
+ public Component create() {
+ return new Calendar();
+ }
+ },
+ Alarm {
+ public Component create(){
+ return new Alarm();
+ }
+ },
+ Daylight {
+ public Component create(){
+ return new Daylight();
+ }
+ },
+ Event {
+ public Component create() {
+ return new Event();
+ }
+ },
+ Freebusy {
+ public Component create(){
+ return new Freebusy();
+ }
+ },
+ Journal {
+ public Component create(){
+ return new Journal();
+ }
+ },
+ Standard {
+ public Component create(){
+ return new Standard();
+ }
+ },
+ Timezone {
+ public Component create(){
+ return new Timezone();
+ }
+ },
+ Todo {
+ public Component create(){
+ return new Todo();
+ }
+ };
+
+ public Component create() {
+ return null;
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/component/Daylight.java b/src/main/java/edu/itu/cavabunga/lib/entity/component/Daylight.java
new file mode 100644
index 0000000..dd2981e
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/component/Daylight.java
@@ -0,0 +1,27 @@
+package edu.itu.cavabunga.lib.entity.component;
+
+import edu.itu.cavabunga.lib.entity.Component;
+import edu.itu.cavabunga.lib.entity.property.PropertyType;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+import java.util.ArrayList;
+import java.util.List;
+
+@Entity
+public class Daylight extends Component{
+ @Override
+ public void validate(){
+ if(!(this.getParent() instanceof Timezone)){
+ throw new Validation("Daylight component cannot be child of :" + this.getParent().getClass().getName());
+ }
+
+ super.validate();
+
+ List requireOneList = new ArrayList<>();
+ requireOneList.add(PropertyType.Dtstart);
+ requireOneList.add(PropertyType.Tzname);
+ requireOneList.add(PropertyType.Tzoffsetfrom);
+ super.validateRequiredOneProperties(requireOneList);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/component/Event.java b/src/main/java/edu/itu/cavabunga/lib/entity/component/Event.java
new file mode 100644
index 0000000..0259499
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/component/Event.java
@@ -0,0 +1,45 @@
+package edu.itu.cavabunga.lib.entity.component;
+
+import edu.itu.cavabunga.lib.entity.Component;
+import edu.itu.cavabunga.lib.entity.property.PropertyType;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+import java.util.ArrayList;
+import java.util.List;
+
+@Entity
+public class Event extends Component {
+ @Override
+ public void validate(){
+ if(!(this.getParent() instanceof Calendar)){
+ throw new Validation("Event component cannot be child of: " + this.getParent().getClass().getName());
+ }
+
+ super.validate();
+
+ List optionalOneList = new ArrayList<>();
+
+ optionalOneList.add(PropertyType.Created);
+ optionalOneList.add(PropertyType.Description);
+ optionalOneList.add(PropertyType.Dtstamp);
+ optionalOneList.add(PropertyType.Dtstart);
+ optionalOneList.add(PropertyType.Geo);
+ optionalOneList.add(PropertyType.Lastmod);
+ optionalOneList.add(PropertyType.Location);
+ optionalOneList.add(PropertyType.Organizer);
+ optionalOneList.add(PropertyType.Priority);
+ optionalOneList.add(PropertyType.Recurid);
+ optionalOneList.add(PropertyType.Seq);
+ optionalOneList.add(PropertyType.Status);
+ optionalOneList.add(PropertyType.Summary);
+ optionalOneList.add(PropertyType.Transp);
+ optionalOneList.add(PropertyType.Uid);
+ optionalOneList.add(PropertyType.Url);
+ super.validateOptionalOneProperties(optionalOneList);
+
+ List requiredOneList = new ArrayList<>();
+ requiredOneList.add(PropertyType.Dtend);
+ super.validateRequiredOneProperties(requiredOneList);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/component/Freebusy.java b/src/main/java/edu/itu/cavabunga/lib/entity/component/Freebusy.java
new file mode 100644
index 0000000..189032a
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/component/Freebusy.java
@@ -0,0 +1,32 @@
+package edu.itu.cavabunga.lib.entity.component;
+
+import edu.itu.cavabunga.lib.entity.Component;
+import edu.itu.cavabunga.lib.entity.property.PropertyType;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+import java.util.ArrayList;
+import java.util.List;
+
+@Entity
+public class Freebusy extends Component {
+ @Override
+ public void validate(){
+ if(!(this.getParent() instanceof Calendar)){
+ throw new Validation("Freebusy component cannot be child of:" + this.getParent().getClass().getName());
+ }
+
+ super.validate();
+
+ List optionalOneList = new ArrayList<>();
+ optionalOneList.add(PropertyType.Contact);
+ optionalOneList.add(PropertyType.Dtend);
+ optionalOneList.add(PropertyType.Dtstamp);
+ optionalOneList.add(PropertyType.Dtstart);
+ optionalOneList.add(PropertyType.Duration);
+ optionalOneList.add(PropertyType.Organizer);
+ optionalOneList.add(PropertyType.Uid);
+ optionalOneList.add(PropertyType.Url);
+ super.validateOptionalOneProperties(optionalOneList);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/component/Journal.java b/src/main/java/edu/itu/cavabunga/lib/entity/component/Journal.java
new file mode 100644
index 0000000..7f6e3ba
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/component/Journal.java
@@ -0,0 +1,37 @@
+package edu.itu.cavabunga.lib.entity.component;
+
+import edu.itu.cavabunga.lib.entity.Component;
+import edu.itu.cavabunga.lib.entity.property.PropertyType;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+import java.util.ArrayList;
+import java.util.List;
+
+@Entity
+public class Journal extends Component {
+ @Override
+ public void validate(){
+ if(!(this.getParent() instanceof Component)){
+ throw new Validation("Journal component cannot be child of: " + this.getParent().getClass().getName());
+ }
+
+ super.validate();
+
+ List optionalOneList = new ArrayList<>();
+ optionalOneList.add(PropertyType.Class);
+ optionalOneList.add(PropertyType.Created);
+ optionalOneList.add(PropertyType.Description);
+ optionalOneList.add(PropertyType.Dtstamp);
+ optionalOneList.add(PropertyType.Dtstart);
+ optionalOneList.add(PropertyType.Lastmod);
+ optionalOneList.add(PropertyType.Organizer);
+ optionalOneList.add(PropertyType.Recurid);
+ optionalOneList.add(PropertyType.Seq);
+ optionalOneList.add(PropertyType.Status);
+ optionalOneList.add(PropertyType.Summary);
+ optionalOneList.add(PropertyType.Uid);
+ optionalOneList.add(PropertyType.Url);
+ super.validateOptionalOneProperties(optionalOneList);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/component/Standard.java b/src/main/java/edu/itu/cavabunga/lib/entity/component/Standard.java
new file mode 100644
index 0000000..66e6341
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/component/Standard.java
@@ -0,0 +1,26 @@
+package edu.itu.cavabunga.lib.entity.component;
+
+import edu.itu.cavabunga.lib.entity.Component;
+import edu.itu.cavabunga.lib.entity.property.PropertyType;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+import java.util.ArrayList;
+import java.util.List;
+
+@Entity
+public class Standard extends Component {
+ @Override
+ public void validate(){
+ if(!(this.getParent() instanceof Timezone)){
+ throw new Validation("Standard component cannot be child of :" + this.getParent().getClass().getName());
+ }
+
+ super.validate();
+
+ List requireOneList = new ArrayList<>();
+ requireOneList.add(PropertyType.Dtstart);
+ requireOneList.add(PropertyType.Tzname);
+ requireOneList.add(PropertyType.Tzoffsetfrom);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/component/Timezone.java b/src/main/java/edu/itu/cavabunga/lib/entity/component/Timezone.java
new file mode 100644
index 0000000..b41ee8d
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/component/Timezone.java
@@ -0,0 +1,30 @@
+package edu.itu.cavabunga.lib.entity.component;
+
+import edu.itu.cavabunga.lib.entity.Component;
+import edu.itu.cavabunga.lib.entity.property.PropertyType;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+import java.util.ArrayList;
+import java.util.List;
+
+@Entity
+public class Timezone extends Component {
+ @Override
+ public void validate(){
+ if(!(this.getParent() instanceof Calendar)){
+ throw new Validation("Timezone component cannot be child of:" + this.getParent().getClass().getName());
+ }
+
+ super.validate();
+
+ List optionalOneList = new ArrayList<>();
+ optionalOneList.add(PropertyType.Lastmod);
+ optionalOneList.add(PropertyType.Tzurl);
+ super.validateOptionalOneProperties(optionalOneList);
+
+ List requiredOneList = new ArrayList<>();
+ requiredOneList.add(PropertyType.Tzid);
+ super.validateRequiredOneProperties(requiredOneList);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/component/Todo.java b/src/main/java/edu/itu/cavabunga/lib/entity/component/Todo.java
new file mode 100644
index 0000000..a0d97b6
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/component/Todo.java
@@ -0,0 +1,47 @@
+package edu.itu.cavabunga.lib.entity.component;
+
+import edu.itu.cavabunga.lib.entity.Component;
+import edu.itu.cavabunga.lib.entity.property.PropertyType;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+import java.util.ArrayList;
+import java.util.List;
+
+@Entity
+public class Todo extends Component{
+ @Override
+ public void validate(){
+ if(!(this.getParent() instanceof Calendar)){
+ throw new Validation("Todo component cannot be child of:" + this.getParent().getClass().getName());
+ }
+
+ super.validate();
+
+ List optionalOneList = new ArrayList<>();
+ optionalOneList.add(PropertyType.Class);
+ optionalOneList.add(PropertyType.Completed);
+ optionalOneList.add(PropertyType.Created);
+ optionalOneList.add(PropertyType.Description);
+ optionalOneList.add(PropertyType.Dtstamp);
+ optionalOneList.add(PropertyType.Dtstart);
+ optionalOneList.add(PropertyType.Geo);
+ optionalOneList.add(PropertyType.Lastmod);
+ optionalOneList.add(PropertyType.Location);
+ optionalOneList.add(PropertyType.Organizer);
+ optionalOneList.add(PropertyType.Percent);
+ optionalOneList.add(PropertyType.Priority);
+ optionalOneList.add(PropertyType.Recurid);
+ optionalOneList.add(PropertyType.Seq);
+ optionalOneList.add(PropertyType.Status);
+ optionalOneList.add(PropertyType.Summary);
+ optionalOneList.add(PropertyType.Uid);
+ optionalOneList.add(PropertyType.Url);
+ super.validateOptionalOneProperties(optionalOneList);
+
+ List requireOneList = new ArrayList<>();
+ requireOneList.add(PropertyType.Due);
+ requireOneList.add(PropertyType.Duration);
+ super.validateRequiredOneProperties(requireOneList);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Altrep.java b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Altrep.java
new file mode 100644
index 0000000..aed4cbe
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Altrep.java
@@ -0,0 +1,18 @@
+package edu.itu.cavabunga.lib.entity.parameter;
+
+import edu.itu.cavabunga.lib.entity.Parameter;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Altrep extends Parameter {
+ @Override
+ public void validate(){
+ super.validate();
+ if(!this.getValue().substring(0,1).equals("\"") || !this.getValue().substring(this.getValue().length() -1).equals("\"")){
+ throw new Validation("ALTREP parameter must start and end with DQUOTE char.");
+ }
+
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Cn.java b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Cn.java
new file mode 100644
index 0000000..9b3e854
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Cn.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.entity.parameter;
+
+import edu.itu.cavabunga.lib.entity.Parameter;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Cn extends Parameter {
+ @Override
+ public void validate(){
+ //TODO: This parameter can be specified on properties with a CAL-ADDRESS value type
+ super.validate();
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Cutype.java b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Cutype.java
new file mode 100644
index 0000000..46c5abb
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Cutype.java
@@ -0,0 +1,22 @@
+package edu.itu.cavabunga.lib.entity.parameter;
+
+import edu.itu.cavabunga.lib.entity.Parameter;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Cutype extends Parameter {
+ @Override
+ public void validate(){
+ //TODO: This parameter can be specified on properties with a CAL-ADDRESS value type
+ super.validate();
+ if(!this.getValue().equals("INDIVIDUAL") &&
+ !this.getValue().equals("GROUP") &&
+ !this.getValue().equals("RESOURCE") &&
+ !this.getValue().equals("ROOM") &&
+ !this.getValue().equals("UNKNOWN")){
+ throw new Validation("CUTYPE value is different from acceptable value range: " + this.getValue());
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/parameter/DelegatedFrom.java b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/DelegatedFrom.java
new file mode 100644
index 0000000..0785c06
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/DelegatedFrom.java
@@ -0,0 +1,19 @@
+package edu.itu.cavabunga.lib.entity.parameter;
+
+import edu.itu.cavabunga.lib.entity.Parameter;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class DelegatedFrom extends Parameter {
+ @Override
+ public void validate(){
+ //TODO: This parameter can be specified on properties with a CAL-ADDRESS value type
+ super.validate();
+ if(!this.getValue().substring(0,1).equals("\"") || !this.getValue().substring(this.getValue().length() -1).equals("\"")){
+ throw new Validation("DELEGATED-FROM parameter must start and end with DQUOTE char.");
+ }
+
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/parameter/DelegatedTo.java b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/DelegatedTo.java
new file mode 100644
index 0000000..0b6c9c4
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/DelegatedTo.java
@@ -0,0 +1,19 @@
+package edu.itu.cavabunga.lib.entity.parameter;
+
+import edu.itu.cavabunga.lib.entity.Parameter;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class DelegatedTo extends Parameter {
+ @Override
+ public void validate(){
+ //TODO: This parameter can be specified on properties with a CAL-ADDRESS value type
+ super.validate();
+ if(!this.getValue().substring(0,1).equals("\"") || !this.getValue().substring(this.getValue().length() -1).equals("\"")){
+ throw new Validation("DELEGATED-TO parameter must start and end with DQUOTE char.");
+ }
+
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Dir.java b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Dir.java
new file mode 100644
index 0000000..5b13951
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Dir.java
@@ -0,0 +1,18 @@
+package edu.itu.cavabunga.lib.entity.parameter;
+
+import edu.itu.cavabunga.lib.entity.Parameter;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Dir extends Parameter {
+ @Override
+ public void validate(){
+ //TODO: This parameter can be specified on properties with a CAL-ADDRESS value type
+ super.validate();
+ if(!this.getValue().substring(0,1).equals("\"") || !this.getValue().substring(this.getValue().length() -1).equals("\"")){
+ throw new Validation("DIR parameter must start and end with DQUOTE char.");
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Encoding.java b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Encoding.java
new file mode 100644
index 0000000..575edbe
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Encoding.java
@@ -0,0 +1,24 @@
+package edu.itu.cavabunga.lib.entity.parameter;
+
+import edu.itu.cavabunga.lib.entity.Parameter;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Encoding extends Parameter {
+ @Override
+ public void validate(){
+ super.validate();
+
+ if(!this.getValue().equals("BASE64") && !this.getValue().equals("8BIT")){
+ throw new Validation("ENCODING value is different from acceptable value range: " + this.getValue());
+ }
+
+ for(Parameter pr : this.getProperty().getParameters()){
+ if( (pr instanceof Value) && pr.getValue().equals("BINARY") && !this.getValue().equals("BASE64")){
+ throw new Validation("While VALUE parameter described as BINARY, ENCODING parameter MUST set as BASE64");
+ }
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Fbtype.java b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Fbtype.java
new file mode 100644
index 0000000..29c640d
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Fbtype.java
@@ -0,0 +1,20 @@
+package edu.itu.cavabunga.lib.entity.parameter;
+
+import edu.itu.cavabunga.lib.entity.Parameter;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Fbtype extends Parameter {
+ @Override
+ public void validate(){
+ super.validate();
+ if(!this.getValue().equals("FREE") &&
+ !this.getValue().equals("BUSY") &&
+ !this.getValue().equals("BUSY-UNAVAILABLE") &&
+ !this.getValue().equals("BUSY-TENTATIVE")){
+ throw new Validation("FBTYPE value is different from acceptable value range: " + this.getValue());
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Fmttype.java b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Fmttype.java
new file mode 100644
index 0000000..5089652
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Fmttype.java
@@ -0,0 +1,18 @@
+package edu.itu.cavabunga.lib.entity.parameter;
+
+import edu.itu.cavabunga.lib.entity.Parameter;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Fmttype extends Parameter {
+ @Override
+ public void validate(){
+ //TODO: This parameter can be specified on properties that are used to reference an object
+ super.validate();
+ if(this.getValue().matches("(\\w+)/(\\w+)")){
+ throw new Validation("FMTYPE must have valid mime type: " + this.getValue());
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Language.java b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Language.java
new file mode 100644
index 0000000..a922d75
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Language.java
@@ -0,0 +1,20 @@
+package edu.itu.cavabunga.lib.entity.parameter;
+
+import edu.itu.cavabunga.lib.entity.Parameter;
+import edu.itu.cavabunga.lib.exception.Validation;
+import org.apache.commons.lang.LocaleUtils;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Language extends Parameter {
+ @Override
+ public void validate(){
+ super.validate();
+ try {
+ LocaleUtils.toLocale(this.getValue());
+ }catch (IllegalArgumentException e){
+ throw new Validation("Language parameter failed: " + e.getMessage());
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Member.java b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Member.java
new file mode 100644
index 0000000..8a71b56
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Member.java
@@ -0,0 +1,18 @@
+package edu.itu.cavabunga.lib.entity.parameter;
+
+import edu.itu.cavabunga.lib.entity.Parameter;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Member extends Parameter{
+ @Override
+ public void validate(){
+ //TODO: This parameter can be specified on properties with a CAL-ADDRESS value type
+ super.validate();
+ if(!this.getValue().substring(0,1).equals("\"") || !this.getValue().substring(this.getValue().length() -1).equals("\"")){
+ throw new Validation("MEMBER parameter must start and end with DQUOTE char.");
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/parameter/ParameterType.java b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/ParameterType.java
new file mode 100644
index 0000000..979f9b4
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/ParameterType.java
@@ -0,0 +1,110 @@
+package edu.itu.cavabunga.lib.entity.parameter;
+
+import edu.itu.cavabunga.lib.entity.Parameter;
+
+public enum ParameterType {
+ Altrep {
+ public Parameter create() {
+ return new Altrep();
+ }
+ },
+ Cn {
+ public Parameter create() {
+ return new Cn();
+ }
+ },
+ Cutype {
+ public Parameter create() {
+ return new Cutype();
+ }
+ },
+ DelegatedFrom {
+ public Parameter create() {
+ return new DelegatedFrom();
+ }
+ },
+ DelegatedTo {
+ public Parameter create() {
+ return new DelegatedTo();
+ }
+ },
+ Dir {
+ public Parameter create() {
+ return new Dir();
+ }
+ },
+ Encoding {
+ public Parameter create() {
+ return new Encoding();
+ }
+ },
+ Fbtype {
+ public Parameter create() {
+ return new Fbtype();
+ }
+ },
+ Fmttype {
+ public Parameter create() {
+ return new Fmttype();
+ }
+ },
+ Language {
+ public Parameter create() {
+ return new Language();
+ }
+ },
+ Member {
+ public Parameter create() {
+ return new Member();
+ }
+ },
+ Partstat {
+ public Parameter create() {
+ return new Partstat();
+ }
+ },
+ Range {
+ public Parameter create() {
+ return new Range();
+ }
+ },
+ Related {
+ public Parameter create() {
+ return new Related();
+ }
+ },
+ Reltype {
+ public Parameter create() {
+ return new Reltype();
+ }
+ },
+ Role {
+ public Parameter create() {
+ return new Role();
+ }
+ },
+ Rsvp {
+ public Parameter create() {
+ return new Rsvp();
+ }
+ },
+ SentBy {
+ public Parameter create() {
+ return new SentBy();
+ }
+ },
+ Tzid {
+ public Parameter create() {
+ return new Tzid();
+ }
+ },
+ Value {
+ public Parameter create() {
+ return new Value();
+ }
+ };
+
+ public Parameter create() {
+ return null;
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Partstat.java b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Partstat.java
new file mode 100644
index 0000000..04dbeca
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Partstat.java
@@ -0,0 +1,48 @@
+package edu.itu.cavabunga.lib.entity.parameter;
+
+import edu.itu.cavabunga.lib.entity.Parameter;
+import edu.itu.cavabunga.lib.entity.component.Event;
+import edu.itu.cavabunga.lib.entity.component.Journal;
+import edu.itu.cavabunga.lib.entity.component.Todo;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Partstat extends Parameter {
+ @Override
+ public void validate(){
+ //TODO: This parameter can be specified on properties with a CAL-ADDRESS value type
+ super.validate();
+
+ if(this.getProperty().getComponent() instanceof Event){
+ if(!this.getValue().equals("NEEDS-ACTION") &&
+ !this.getValue().equals("ACCEPTED") &&
+ !this.getValue().equals("DECLINED") &&
+ !this.getValue().equals("TENTATIVE") &&
+ !this.getValue().equals("DELEGATED")){
+ throw new Validation("PARTSTAT value is different from acceptable value range in an Event component: " + this.getValue());
+ }
+ }
+
+ if(this.getProperty().getComponent() instanceof Todo){
+ if(!this.getValue().equals("NEEDS-ACTION") &&
+ !this.getValue().equals("ACCEPTED") &&
+ !this.getValue().equals("DECLINED") &&
+ !this.getValue().equals("TENTATIVE") &&
+ !this.getValue().equals("DELEGATED") &&
+ !this.getValue().equals("COMPLETED") &&
+ !this.getValue().equals("IN-PROCESS")){
+ throw new Validation("PARTSTAT value is different from acceptable value range in a Todo component: " + this.getValue());
+ }
+ }
+
+ if(this.getProperty().getComponent() instanceof Journal){
+ if(!this.getValue().equals("NEEDS-ACTION") &&
+ !this.getValue().equals("ACCEPTED") &&
+ !this.getValue().equals("DECLINED")){
+ throw new Validation("PARTSTAT value is different from acceptable value range in a Journal component " + this.getValue());
+ }
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Range.java b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Range.java
new file mode 100644
index 0000000..024dedb
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Range.java
@@ -0,0 +1,20 @@
+package edu.itu.cavabunga.lib.entity.parameter;
+
+import edu.itu.cavabunga.lib.entity.Parameter;
+import edu.itu.cavabunga.lib.exception.Validation;
+import org.omg.PortableServer.THREAD_POLICY_ID;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Range extends Parameter {
+ @Override
+ public void validate(){
+ //TODO: This parameter can be specified on a property that specifies a recurrence identifier.
+ super.validate();
+
+ if(this.getValue().equals("THISANDFUTURE")){
+ throw new Validation("RANGE parameter can only have THISANDFUTURE value: " + this.getValue());
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Related.java b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Related.java
new file mode 100644
index 0000000..3f6675a
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Related.java
@@ -0,0 +1,18 @@
+package edu.itu.cavabunga.lib.entity.parameter;
+
+import edu.itu.cavabunga.lib.entity.Parameter;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Related extends Parameter {
+ @Override
+ public void validate(){
+ //TODO: This parameter can be specified on properties that specify an alarm trigger with a "DURATION" value type.
+ super.validate();
+ if(!this.getValue().equals("START") && !this.getValue().equals("END")){
+ throw new Validation("RELATED value is different from acceptable value range: " + this.getValue());
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Reltype.java b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Reltype.java
new file mode 100644
index 0000000..b2717a3
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Reltype.java
@@ -0,0 +1,20 @@
+package edu.itu.cavabunga.lib.entity.parameter;
+
+import edu.itu.cavabunga.lib.entity.Parameter;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Reltype extends Parameter{
+ @Override
+ public void validate(){
+ //TODO: This parameter can be specified on properties with a CAL-ADDRESS value type
+ super.validate();
+ if(!this.getValue().equals("PARENT") &&
+ !this.getValue().equals("CHILD") &&
+ !this.getValue().equals("SIBLING")){
+ throw new Validation("RELTYPE value is different from acceptable value range: " + this.getValue());
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Role.java b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Role.java
new file mode 100644
index 0000000..a0c915e
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Role.java
@@ -0,0 +1,21 @@
+package edu.itu.cavabunga.lib.entity.parameter;
+
+import edu.itu.cavabunga.lib.entity.Parameter;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Role extends Parameter {
+ @Override
+ public void validate(){
+ //TODO: This parameter can be specified on properties with a CAL-ADDRESS value type.
+ super.validate();
+ if(!this.getValue().equals("CHAIR") &&
+ !this.getValue().equals("REQ-PARTICIPANT") &&
+ !this.getValue().equals("OPT-PARTICIPANT") &&
+ !this.getValue().equals("NON-PARTICIPANT")){
+ throw new Validation("ROLE value is different from acceptable value range: " + this.getValue());
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Rsvp.java b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Rsvp.java
new file mode 100644
index 0000000..3d8da38
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Rsvp.java
@@ -0,0 +1,19 @@
+package edu.itu.cavabunga.lib.entity.parameter;
+
+import edu.itu.cavabunga.lib.entity.Parameter;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Rsvp extends Parameter {
+ @Override
+ public void validate(){
+ //TODO: This parameter can be specified on properties with a CAL-ADDRESS value type.
+ super.validate();
+ if(!this.getValue().equals("TRUE") &&
+ !this.getValue().equals("FALSE")){
+ throw new Validation("RSVP value is different from acceptable value range: " + this.getValue());
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/parameter/SentBy.java b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/SentBy.java
new file mode 100644
index 0000000..22f73fa
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/SentBy.java
@@ -0,0 +1,19 @@
+package edu.itu.cavabunga.lib.entity.parameter;
+
+import edu.itu.cavabunga.lib.entity.Parameter;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class SentBy extends Parameter {
+ @Override
+ public void validate(){
+ //TODO:This parameter can be specified on properties with a CAL-ADDRESS value type
+ super.validate();
+ if(!this.getValue().substring(0,1).equals("\"") || !this.getValue().substring(this.getValue().length() -1).equals("\"")){
+ throw new Validation("SENT-BY parameter must start and end with DQUOTE char.");
+ }
+
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Tzid.java b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Tzid.java
new file mode 100644
index 0000000..321afff
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Tzid.java
@@ -0,0 +1,26 @@
+package edu.itu.cavabunga.lib.entity.parameter;
+
+import edu.itu.cavabunga.lib.entity.Parameter;
+import edu.itu.cavabunga.lib.entity.property.*;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Tzid extends Parameter {
+ @Override
+ public void validate(){
+ super.validate();
+ if(!(this.getProperty() instanceof Dtstart) &&
+ !(this.getProperty() instanceof Dtend) &&
+ !(this.getProperty() instanceof Due) &&
+ !(this.getProperty() instanceof Exdate) &&
+ !(this.getProperty() instanceof Rdate)){
+ throw new Validation("TZID parameter can only be use in Dtstart, Dtend, Due, Exdate and Rdate properties: " + this.getProperty().getClass().getName());
+ }
+
+ //TODO: Validate TZID string matches with the Calendar's VTIMEZONE component's TZID identifier
+
+
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Value.java b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Value.java
new file mode 100644
index 0000000..3809fd4
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/parameter/Value.java
@@ -0,0 +1,30 @@
+package edu.itu.cavabunga.lib.entity.parameter;
+
+import edu.itu.cavabunga.lib.entity.Parameter;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Value extends Parameter{
+ @Override
+ public void validate(){
+ super.validate();
+ if(!this.getValue().equals("BINARY") &&
+ !this.getValue().equals("BOOLEAN") &&
+ !this.getValue().equals("CAL-ADDRESS") &&
+ !this.getValue().equals("DATE-TIME") &&
+ !this.getValue().equals("DATE") &&
+ !this.getValue().equals("DURATION") &&
+ !this.getValue().equals("FLOAT") &&
+ !this.getValue().equals("INTEGER") &&
+ !this.getValue().equals("PERIOD") &&
+ !this.getValue().equals("RECUR") &&
+ !this.getValue().equals("TEXT") &&
+ !this.getValue().equals("TIME") &&
+ !this.getValue().equals("URI") &&
+ !this.getValue().equals("UTC-OFFSET")){
+ throw new Validation("VALUE value is different from acceptable value range: " + this.getValue());
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/participant/Group.java b/src/main/java/edu/itu/cavabunga/lib/entity/participant/Group.java
new file mode 100644
index 0000000..39bc8cf
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/participant/Group.java
@@ -0,0 +1,9 @@
+package edu.itu.cavabunga.lib.entity.participant;
+
+import edu.itu.cavabunga.lib.entity.Participant;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Group extends Participant {
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/participant/ParticipantType.java b/src/main/java/edu/itu/cavabunga/lib/entity/participant/ParticipantType.java
new file mode 100644
index 0000000..58c8052
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/participant/ParticipantType.java
@@ -0,0 +1,22 @@
+package edu.itu.cavabunga.lib.entity.participant;
+
+import edu.itu.cavabunga.lib.entity.Participant;
+
+public enum ParticipantType {
+ User {
+ public Participant create(){
+ return new User();
+ }
+ },
+ Group {
+ public Participant create(){
+ return new Group();
+ }
+ },
+ Resource {
+ public Participant create(){ return new Resource(); }
+ }
+ ;
+
+ public Participant create() { return null; }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/participant/Resource.java b/src/main/java/edu/itu/cavabunga/lib/entity/participant/Resource.java
new file mode 100644
index 0000000..c5708b4
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/participant/Resource.java
@@ -0,0 +1,6 @@
+package edu.itu.cavabunga.lib.entity.participant;
+
+import edu.itu.cavabunga.lib.entity.Participant;
+
+public class Resource extends Participant {
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/participant/User.java b/src/main/java/edu/itu/cavabunga/lib/entity/participant/User.java
new file mode 100644
index 0000000..3c36905
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/participant/User.java
@@ -0,0 +1,9 @@
+package edu.itu.cavabunga.lib.entity.participant;
+
+import edu.itu.cavabunga.lib.entity.Participant;
+
+import javax.persistence.Entity;
+
+@Entity
+public class User extends Participant {
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Acknowledged.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Acknowledged.java
new file mode 100644
index 0000000..b432680
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Acknowledged.java
@@ -0,0 +1,27 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Parameter;
+import edu.itu.cavabunga.lib.entity.Property;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Acknowledged extends Property {
+ @Override
+ public void validate(){
+ if(this.getValue().trim().equals("")){
+ throw new Validation("ACKNOWLEDGED property cannot be empty");
+ }
+
+ if(!this.getParameters().isEmpty()){
+ for(Parameter pr : this.getParameters()){
+ try {
+ pr.validate();
+ }catch (Exception e){
+ throw new Validation("ACKNOWLEDGED parameter validation failed: " + pr.getValue());
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Action.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Action.java
new file mode 100644
index 0000000..b4bce30
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Action.java
@@ -0,0 +1,21 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Action extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.TEXT);
+
+ if(!this.getValue().equals("AUDIO") &&
+ !this.getValue().equals("DISPLAY") &&
+ !this.getValue().equals("EMAIL")){
+ throw new Validation("ACTION value is different from acceptable value range: " + this.getValue());
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Attach.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Attach.java
new file mode 100644
index 0000000..a7d785a
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Attach.java
@@ -0,0 +1,18 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Attach extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ try {
+ super.validateValueType(PropertyValueType.URI);
+ }catch (Exception e){
+ super.validateValueType(PropertyValueType.BINARY);
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Attendee.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Attendee.java
new file mode 100644
index 0000000..e43bed5
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Attendee.java
@@ -0,0 +1,15 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Attendee extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.CALADDRESS);
+ }
+
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Calscale.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Calscale.java
new file mode 100644
index 0000000..199173e
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Calscale.java
@@ -0,0 +1,21 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+import java.util.List;
+
+@Entity
+public class Calscale extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.TEXT);
+
+ //TODO: is cavabunga support only for Gregorian calendar?
+ if(!this.getValue().equals("GREGORIAN")){
+ throw new Validation("CALSCALE value is different from acceptable value range: " + this.getValue());
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Catagories.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Catagories.java
new file mode 100644
index 0000000..59f28dd
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Catagories.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Catagories extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.TEXT);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Class.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Class.java
new file mode 100644
index 0000000..1cc76b1
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Class.java
@@ -0,0 +1,21 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Class extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.TEXT);
+
+ if(!this.getValue().equals("PUBLIC") &&
+ !this.getValue().equals("PRIVATE") &&
+ !this.getValue().equals("CONFIDENTIAL")){
+ throw new Validation("CLASS value is different from acceptable value range: " + this.getValue());
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Comment.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Comment.java
new file mode 100644
index 0000000..4b720cb
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Comment.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Comment extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.TEXT);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Completed.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Completed.java
new file mode 100644
index 0000000..0e63f2c
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Completed.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Completed extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.DATETIME);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Contact.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Contact.java
new file mode 100644
index 0000000..efc0a27
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Contact.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Contact extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.TEXT);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Country.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Country.java
new file mode 100644
index 0000000..f303b6c
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Country.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Country extends Property {
+ //TODO: check rfc5545 to confirm if it exists
+ @Override
+ public void validate(){
+
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Created.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Created.java
new file mode 100644
index 0000000..690bbf3
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Created.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Created extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.DATETIME);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Description.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Description.java
new file mode 100644
index 0000000..5f8a9fc
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Description.java
@@ -0,0 +1,15 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+import java.util.concurrent.ExecutionException;
+
+@Entity
+public class Description extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.TEXT);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Dtend.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Dtend.java
new file mode 100644
index 0000000..9c7199f
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Dtend.java
@@ -0,0 +1,19 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Dtend extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ try {
+ super.validateValueType(PropertyValueType.DATETIME);
+ }catch (Validation e){
+ super.validateValueType(PropertyValueType.DATE);
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Dtstamp.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Dtstamp.java
new file mode 100644
index 0000000..c47c281
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Dtstamp.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Dtstamp extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.DATETIME);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Dtstart.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Dtstart.java
new file mode 100644
index 0000000..e57edc7
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Dtstart.java
@@ -0,0 +1,19 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Dtstart extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ try {
+ super.validateValueType(PropertyValueType.DATETIME);
+ }catch (Validation e){
+ super.validateValueType(PropertyValueType.DATE);
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Due.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Due.java
new file mode 100644
index 0000000..021d1b4
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Due.java
@@ -0,0 +1,19 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Due extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ try {
+ super.validateValueType(PropertyValueType.DATETIME);
+ }catch (Validation e){
+ super.validateValueType(PropertyValueType.DATE);
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Duration.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Duration.java
new file mode 100644
index 0000000..3f83de0
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Duration.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Duration extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.DURATION);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Exdate.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Exdate.java
new file mode 100644
index 0000000..8d49354
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Exdate.java
@@ -0,0 +1,19 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Exdate extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ try {
+ super.validateValueType(PropertyValueType.DATETIME);
+ }catch (Validation e){
+ super.validateValueType(PropertyValueType.DATE);
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Exrule.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Exrule.java
new file mode 100644
index 0000000..cee621e
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Exrule.java
@@ -0,0 +1,9 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Exrule extends Property {
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Freebusy.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Freebusy.java
new file mode 100644
index 0000000..19489eb
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Freebusy.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Freebusy extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.PERIOD);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Geo.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Geo.java
new file mode 100644
index 0000000..c45746b
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Geo.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Geo extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.FLOAT);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Lastmod.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Lastmod.java
new file mode 100644
index 0000000..7a502cd
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Lastmod.java
@@ -0,0 +1,15 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Lastmod extends Property {
+ //TODO: LAST-MODIFIED Class name change
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.DATETIME);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Location.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Location.java
new file mode 100644
index 0000000..2ac6bcb
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Location.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Location extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.TEXT);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Method.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Method.java
new file mode 100644
index 0000000..41be441
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Method.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Method extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.TEXT);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Organizer.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Organizer.java
new file mode 100644
index 0000000..0bdee93
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Organizer.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Organizer extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.CALADDRESS);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Percent.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Percent.java
new file mode 100644
index 0000000..9bcd122
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Percent.java
@@ -0,0 +1,19 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Percent extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.INTEGER);
+
+ if(Integer.parseInt(this.getValue()) > 0 | Integer.parseInt(this.getValue()) < 0){
+ throw new Validation("PERCENT property must be in range of 0 to 100: " + this.getValue());
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Priority.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Priority.java
new file mode 100644
index 0000000..10aaed4
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Priority.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Priority extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.INTEGER);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Prodid.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Prodid.java
new file mode 100644
index 0000000..8bcd9d9
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Prodid.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Prodid extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.TEXT);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/PropertyType.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/PropertyType.java
new file mode 100644
index 0000000..1ce7c43
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/PropertyType.java
@@ -0,0 +1,255 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+public enum PropertyType {
+ Acknowledged {
+ public Property create() {
+ return new Acknowledged();
+ }
+ },
+ Action {
+ public Property create() {
+ return new Action();
+ }
+ },
+ Attach {
+ public Property create() {
+ return new Attach();
+ }
+ },
+ Attendee {
+ public Property create() {
+ return new Attendee();
+ }
+ },
+ Calscale {
+ public Property create() {
+ return new Calscale();
+ }
+ },
+ Catagories {
+ public Property create() {
+ return new Catagories();
+ }
+ },
+ Class {
+ public Property create() {
+ return new Class();
+ }
+ },
+ Comment {
+ public Property create() {
+ return new Comment();
+ }
+ },
+ Completed {
+ public Property create() {
+ return new Completed();
+ }
+ },
+ Contact {
+ public Property create() {
+ return new Contact();
+ }
+ },
+ Country {
+ public Property create() {
+ return new Country();
+ }
+ },
+ Created {
+ public Property create() {
+ return new Created();
+ }
+ },
+ Description {
+ public Property create() {
+ return new Description();
+ }
+ },
+ Dtend {
+ public Property create() {
+ return new Dtend();
+ }
+ },
+ Dtstamp {
+ public Property create() {
+ return new Dtstamp();
+ }
+ },
+ Dtstart {
+ public Property create() {
+ return new Dtstart();
+ }
+ },
+ Due {
+ public Property create() {
+ return new Due();
+ }
+ },
+ Duration {
+ public Property create() {
+ return new Duration();
+ }
+ },
+ Exdate {
+ public Property create() {
+ return new Exdate();
+ }
+ },
+ Exrule {
+ public Property create() {
+ return new Exrule();
+ }
+ },
+ Freebusy {
+ public Property create() {
+ return new Freebusy();
+ }
+ },
+ Geo {
+ public Property create() {
+ return new Geo();
+ }
+ },
+ Lastmod {
+ public Property create() {
+ return new Lastmod();
+ }
+ },
+ Location {
+ public Property create() {
+ return new Location();
+ }
+ },
+ Method {
+ public Property create() {
+ return new Method();
+ }
+ },
+ Organizer {
+ public Property create() {
+ return new Organizer();
+ }
+ },
+ Percent {
+ public Property create() {
+ return new Percent();
+ }
+ },
+ Priority {
+ public Property create() {
+ return new Priority();
+ }
+ },
+ Prodid {
+ public Property create() {
+ return new Prodid();
+ }
+ },
+ Rdate {
+ public Property create() {
+ return new Rdate();
+ }
+ },
+ Recurid {
+ public Property create() {
+ return new Recurid();
+ }
+ },
+ Related {
+ public Property create() {
+ return new Related();
+ }
+ },
+ Repeat {
+ public Property create() {
+ return new Repeat();
+ }
+ },
+ Resources {
+ public Property create() {
+ return new Resources();
+ }
+ },
+ Rrule {
+ public Property create() {
+ return new Rrule();
+ }
+ },
+ Rstatus {
+ public Property create() {
+ return new Rstatus();
+ }
+ },
+ Seq {
+ public Property create() {
+ return new Seq();
+ }
+ },
+ Status {
+ public Property create() {
+ return new Status();
+ }
+ },
+ Summary {
+ public Property create() {
+ return new Summary();
+ }
+ },
+ Transp {
+ public Property create() {
+ return new Transp();
+ }
+ },
+ Trigger {
+ public Property create() {
+ return new Trigger();
+ }
+ },
+ Tzid {
+ public Property create() {
+ return new Tzid();
+ }
+ },
+ Tzname {
+ public Property create() {
+ return new Tzname();
+ }
+ },
+ Tzoffsetfrom {
+ public Property create() {
+ return new Tzoffsetfrom();
+ }
+ },
+ Tzoffsetto {
+ public Property create() {
+ return new Tzoffsetto();
+ }
+ },
+ Tzurl {
+ public Property create() {
+ return new Tzurl();
+ }
+ },
+ Uid {
+ public Property create() {
+ return new Uid();
+ }
+ },
+ Url {
+ public Property create() {
+ return new Url();
+ }
+ },
+ Version {
+ public Property create() {
+ return new Version();
+ }
+ };
+
+ public Property create() {
+ return null;
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/PropertyValueType.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/PropertyValueType.java
new file mode 100644
index 0000000..1005004
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/PropertyValueType.java
@@ -0,0 +1,29 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+public enum PropertyValueType {
+ BINARY("BINARY"),
+ BOOLEAN("BOOLEAN"),
+ CALADDRESS("CAL-ADDRESS"),
+ DATE("DATE"),
+ DATETIME("DATE-TIME"),
+ DURATION("DURATION"),
+ FLOAT("FLOAT"),
+ INTEGER("INTEGER"),
+ PERIOD("PERIOD"),
+ RECUR("RECUR"),
+ TEXT("TEXT"),
+ TIME("TIME"),
+ URI("URI"),
+ UTCOFFSET("UTC-OFFSET");
+
+ private final String value;
+
+ PropertyValueType(final String text){
+ this.value = text;
+ }
+
+ @Override
+ public String toString(){
+ return value;
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Rdate.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Rdate.java
new file mode 100644
index 0000000..4628d03
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Rdate.java
@@ -0,0 +1,19 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Rdate extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ try {
+ super.validateValueType(PropertyValueType.DATETIME);
+ }catch (Validation e){
+ super.validateValueType(PropertyValueType.DATE);
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Recurid.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Recurid.java
new file mode 100644
index 0000000..a0e9830
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Recurid.java
@@ -0,0 +1,19 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Recurid extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ try {
+ super.validateValueType(PropertyValueType.DATETIME);
+ }catch (Validation e){
+ super.validateValueType(PropertyValueType.DATE);
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Related.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Related.java
new file mode 100644
index 0000000..24c3eeb
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Related.java
@@ -0,0 +1,11 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+//TODO: could be RELATED-TO ?? Class name change
+public class Related extends Property {
+ //TODO: implement Related-To
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Repeat.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Repeat.java
new file mode 100644
index 0000000..72a5591
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Repeat.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Repeat extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.INTEGER);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Resources.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Resources.java
new file mode 100644
index 0000000..5a25e84
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Resources.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Resources extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.TEXT);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Rrule.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Rrule.java
new file mode 100644
index 0000000..e687e65
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Rrule.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Rrule extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.RECUR);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Rstatus.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Rstatus.java
new file mode 100644
index 0000000..edc7953
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Rstatus.java
@@ -0,0 +1,9 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Rstatus extends Property {
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Seq.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Seq.java
new file mode 100644
index 0000000..5beaab4
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Seq.java
@@ -0,0 +1,15 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Seq extends Property {
+//TODO: implement SEQUENCE
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.INTEGER);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Status.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Status.java
new file mode 100644
index 0000000..305bc1d
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Status.java
@@ -0,0 +1,27 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Status extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.TEXT);
+
+ if(!this.getValue().equals("TENTATIVE") &&
+ !this.getValue().equals("CONFIRMED") &&
+ !this.getValue().equals("CANCELLED") &&
+ !this.getValue().equals("NEEDS-ACTION") &&
+ !this.getValue().equals("COMPLETED") &&
+ !this.getValue().equals("IN-PROCESS") &&
+ !this.getValue().equals("COMPLETED") &&
+ !this.getValue().equals("DRAFT") &&
+ !this.getValue().equals("FINAL")){
+ throw new Validation("STATUS property is out of acceptable range: " + this.getValue());
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Summary.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Summary.java
new file mode 100644
index 0000000..eba7ee5
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Summary.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Summary extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.TEXT);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Transp.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Transp.java
new file mode 100644
index 0000000..8673157
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Transp.java
@@ -0,0 +1,20 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Transp extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.TEXT);
+
+ if(!this.getValue().equals("OPAQUE") &&
+ !this.getValue().equals("TRANSPARENT")){
+ throw new Validation("TRANSP property value is out of acceptable range: " + this.getValue());
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Trigger.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Trigger.java
new file mode 100644
index 0000000..5d6f1f6
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Trigger.java
@@ -0,0 +1,19 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Trigger extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ try {
+ super.validateValueType(PropertyValueType.DURATION);
+ }catch (Validation e){
+ super.validateValueType(PropertyValueType.DATETIME);
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Tzid.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Tzid.java
new file mode 100644
index 0000000..8f3e8ff
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Tzid.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Tzid extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.TEXT);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Tzname.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Tzname.java
new file mode 100644
index 0000000..5b64b67
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Tzname.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Tzname extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.TEXT);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Tzoffsetfrom.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Tzoffsetfrom.java
new file mode 100644
index 0000000..83dbbc4
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Tzoffsetfrom.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Tzoffsetfrom extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.UTCOFFSET);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Tzoffsetto.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Tzoffsetto.java
new file mode 100644
index 0000000..1da92db
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Tzoffsetto.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Tzoffsetto extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.UTCOFFSET);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Tzurl.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Tzurl.java
new file mode 100644
index 0000000..e86d418
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Tzurl.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Tzurl extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.URI);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Uid.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Uid.java
new file mode 100644
index 0000000..4b9ba8e
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Uid.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Uid extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.TEXT);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Url.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Url.java
new file mode 100644
index 0000000..39f9034
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Url.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Url extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.URI);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/entity/property/Version.java b/src/main/java/edu/itu/cavabunga/lib/entity/property/Version.java
new file mode 100644
index 0000000..2e81b9e
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/entity/property/Version.java
@@ -0,0 +1,20 @@
+package edu.itu.cavabunga.lib.entity.property;
+
+import edu.itu.cavabunga.lib.entity.Property;
+import edu.itu.cavabunga.lib.exception.Validation;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Version extends Property {
+ @Override
+ public void validate(){
+ super.validate();
+ super.validateValueType(PropertyValueType.TEXT);
+
+ //cavabunga will not support ical version other then 2.0
+ if(!this.getValue().equals("2.0")){
+ throw new Validation("Version cannot be other then 2.0");
+ }
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/exception/Conflict.java b/src/main/java/edu/itu/cavabunga/lib/exception/Conflict.java
new file mode 100644
index 0000000..691a02f
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/exception/Conflict.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.exception;
+
+public class Conflict extends RuntimeException {
+ public Conflict(){
+
+ }
+
+ public Conflict(String message){
+ super(message);
+ }
+ public Conflict(Throwable cause){
+ super(cause);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/exception/NotFound.java b/src/main/java/edu/itu/cavabunga/lib/exception/NotFound.java
new file mode 100644
index 0000000..c565468
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/exception/NotFound.java
@@ -0,0 +1,14 @@
+package edu.itu.cavabunga.lib.exception;
+
+public class NotFound extends RuntimeException {
+ public NotFound(){
+
+ }
+
+ public NotFound(String message){
+ super(message);
+ }
+ public NotFound(Throwable cause){
+ super(cause);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/exception/Validation.java b/src/main/java/edu/itu/cavabunga/lib/exception/Validation.java
new file mode 100644
index 0000000..ea3d718
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/exception/Validation.java
@@ -0,0 +1,10 @@
+package edu.itu.cavabunga.lib.exception;
+
+public class Validation extends RuntimeException {
+ public Validation(){
+
+ }
+
+ public Validation(String message) { super(message); }
+ public Validation(Throwable cause) { super(cause); }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/factory/ComponentFactory.java b/src/main/java/edu/itu/cavabunga/lib/factory/ComponentFactory.java
new file mode 100644
index 0000000..7e0d0f9
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/factory/ComponentFactory.java
@@ -0,0 +1,20 @@
+package edu.itu.cavabunga.lib.factory;
+
+import edu.itu.cavabunga.lib.entity.Component;
+import edu.itu.cavabunga.lib.entity.component.ComponentType;
+
+/**
+ * Factory for all property types
+ * @see ComponentType
+ * @see Component
+ */
+public interface ComponentFactory {
+
+ /**
+ * creates component in desired type
+ *
+ * @param componentType type of the component
+ * @return created component object
+ */
+ Component createComponent(ComponentType componentType);
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/factory/ComponentFactoryImpl.java b/src/main/java/edu/itu/cavabunga/lib/factory/ComponentFactoryImpl.java
new file mode 100644
index 0000000..1fb8598
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/factory/ComponentFactoryImpl.java
@@ -0,0 +1,19 @@
+package edu.itu.cavabunga.lib.factory;
+
+import edu.itu.cavabunga.lib.entity.Component;
+import edu.itu.cavabunga.lib.entity.component.ComponentType;
+
+/**
+ * Factory for all property types
+ * @see ComponentType
+ * @see Component
+ */
+@org.springframework.stereotype.Component
+public class ComponentFactoryImpl implements ComponentFactory {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Component createComponent(ComponentType componentType){ return componentType.create(); }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/factory/ParameterFactory.java b/src/main/java/edu/itu/cavabunga/lib/factory/ParameterFactory.java
new file mode 100644
index 0000000..0393d94
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/factory/ParameterFactory.java
@@ -0,0 +1,20 @@
+package edu.itu.cavabunga.lib.factory;
+
+import edu.itu.cavabunga.lib.entity.Parameter;
+import edu.itu.cavabunga.lib.entity.parameter.ParameterType;
+
+/**
+ * Factory interface for all parameter types
+ * @see ParameterType
+ * @see Parameter
+ */
+public interface ParameterFactory {
+
+ /**
+ * creates parameter in desired type
+ *
+ * @param parameterType type of the new parameter
+ * @return created parameter object
+ */
+ Parameter createParameter(ParameterType parameterType);
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/factory/ParameterFactoryImpl.java b/src/main/java/edu/itu/cavabunga/lib/factory/ParameterFactoryImpl.java
new file mode 100644
index 0000000..e446dce
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/factory/ParameterFactoryImpl.java
@@ -0,0 +1,20 @@
+package edu.itu.cavabunga.lib.factory;
+
+import edu.itu.cavabunga.lib.entity.Parameter;
+import edu.itu.cavabunga.lib.entity.parameter.ParameterType;
+import org.springframework.stereotype.Component;
+
+/**
+ * {@inheritDoc}
+ */
+@Component
+public class ParameterFactoryImpl implements ParameterFactory {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Parameter createParameter(ParameterType parameterType) {
+ return parameterType.create();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/edu/itu/cavabunga/lib/factory/ParticipantFactory.java b/src/main/java/edu/itu/cavabunga/lib/factory/ParticipantFactory.java
new file mode 100644
index 0000000..00cba00
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/factory/ParticipantFactory.java
@@ -0,0 +1,20 @@
+package edu.itu.cavabunga.lib.factory;
+
+import edu.itu.cavabunga.lib.entity.Participant;
+import edu.itu.cavabunga.lib.entity.participant.ParticipantType;
+
+/**
+ * Factory interface for all participant types
+ * @see ParticipantType
+ * @see Participant
+ */
+public interface ParticipantFactory {
+
+ /**
+ * creates participant in desired type
+ *
+ * @param participantType type of the new participant
+ * @return created participant object
+ */
+ Participant createParticipant(ParticipantType participantType);
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/factory/ParticipantFactoryImpl.java b/src/main/java/edu/itu/cavabunga/lib/factory/ParticipantFactoryImpl.java
new file mode 100644
index 0000000..9d86d8a
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/factory/ParticipantFactoryImpl.java
@@ -0,0 +1,22 @@
+package edu.itu.cavabunga.lib.factory;
+
+import edu.itu.cavabunga.lib.entity.Participant;
+import edu.itu.cavabunga.lib.entity.participant.ParticipantType;
+import org.springframework.stereotype.Component;
+
+/**
+ * Factory for all participant types
+ * @see ParticipantType
+ * @see Participant
+ */
+@Component
+public class ParticipantFactoryImpl implements ParticipantFactory {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Participant createParticipant(ParticipantType participantType){
+ return participantType.create();
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/factory/PropertyFactory.java b/src/main/java/edu/itu/cavabunga/lib/factory/PropertyFactory.java
new file mode 100644
index 0000000..214cc74
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/factory/PropertyFactory.java
@@ -0,0 +1,20 @@
+package edu.itu.cavabunga.lib.factory;
+
+import edu.itu.cavabunga.lib.entity.Property;
+import edu.itu.cavabunga.lib.entity.property.PropertyType;
+
+/**
+ * Factory interface for all property types
+ * @see PropertyType
+ * @see Property
+ */
+public interface PropertyFactory {
+
+ /**
+ * creates property in desired type
+ *
+ * @param propertyType type of the property
+ * @return created property object
+ */
+ Property createProperty(PropertyType propertyType);
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/factory/PropertyFactoryImpl.java b/src/main/java/edu/itu/cavabunga/lib/factory/PropertyFactoryImpl.java
new file mode 100644
index 0000000..03a2421
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/factory/PropertyFactoryImpl.java
@@ -0,0 +1,22 @@
+package edu.itu.cavabunga.lib.factory;
+
+import edu.itu.cavabunga.lib.entity.Property;
+import edu.itu.cavabunga.lib.entity.property.PropertyType;
+import org.springframework.stereotype.Component;
+
+/**
+ * Factory for all property types
+ * @see PropertyType
+ * @see Property
+ */
+@Component
+public class PropertyFactoryImpl implements PropertyFactory {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Property createProperty(PropertyType propertyType) {
+ return propertyType.create();
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/http/ComponentResponse.java b/src/main/java/edu/itu/cavabunga/lib/http/ComponentResponse.java
new file mode 100644
index 0000000..14383f6
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/http/ComponentResponse.java
@@ -0,0 +1,47 @@
+package edu.itu.cavabunga.lib.http;
+
+import edu.itu.cavabunga.lib.entity.Component;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * Response object that contains requested components in data field
+ * @see Component
+ */
+@Getter
+@Setter
+public class ComponentResponse extends Response {
+
+ /**
+ * list of requested components
+ */
+ private List data = new ArrayList <>();
+
+ /**
+ * Response object constructor that contains multiple components in data field
+ *
+ * @param code application status code
+ * @param message application status message
+ * @param data response components
+ */
+ public ComponentResponse(Integer code, String message, List data) {
+ super(code, message);
+ this.data = data;
+ }
+
+ /**
+ * Response object constructor that contains single component in data field
+ *
+ * @param code application status code
+ * @param message application status message
+ * @param data response component
+ */
+ public ComponentResponse(Integer code, String message, Component data) {
+ super(code, message);
+ this.data.add(data);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/http/ErrorResponse.java b/src/main/java/edu/itu/cavabunga/lib/http/ErrorResponse.java
new file mode 100644
index 0000000..c2a30b4
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/http/ErrorResponse.java
@@ -0,0 +1,29 @@
+package edu.itu.cavabunga.lib.http;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * Response for any kind of error
+ */
+@Getter
+@Setter
+public class ErrorResponse extends Response {
+
+ /**
+ * related error object
+ */
+ private Object data;
+
+ /**
+ * Response object that contains single component in data field
+ *
+ * @param code application status code
+ * @param message application status message
+ * @param data related error data
+ */
+ public ErrorResponse(Integer code, String message, Object data) {
+ super(code, message);
+ this.data = data;
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/http/ParameterResponse.java b/src/main/java/edu/itu/cavabunga/lib/http/ParameterResponse.java
new file mode 100644
index 0000000..9aaac88
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/http/ParameterResponse.java
@@ -0,0 +1,46 @@
+package edu.itu.cavabunga.lib.http;
+
+import edu.itu.cavabunga.lib.entity.Parameter;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Response object that contains requested parameters in data field
+ * @see Parameter
+ */
+@Getter
+@Setter
+public class ParameterResponse extends Response {
+
+ /**
+ * list of requested parameters
+ */
+ private List data = new ArrayList <>();
+
+ /**
+ * Response object constructor that contains multiple parameters in data field
+ *
+ * @param code application status code
+ * @param message application status message
+ * @param data response parameters
+ */
+ public ParameterResponse(Integer code, String message, List data) {
+ super(code, message);
+ this.data = data;
+ }
+
+ /**
+ * Response object constructor that contains single parameter in data field
+ *
+ * @param code application status code
+ * @param message application status message
+ * @param data response parameter
+ */
+ public ParameterResponse(Integer code, String message, Parameter data) {
+ super(code, message);
+ this.data.add(data);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/http/ParticipantResponse.java b/src/main/java/edu/itu/cavabunga/lib/http/ParticipantResponse.java
new file mode 100644
index 0000000..1988426
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/http/ParticipantResponse.java
@@ -0,0 +1,46 @@
+package edu.itu.cavabunga.lib.http;
+
+import edu.itu.cavabunga.lib.entity.Participant;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Response object that contains requested participants in data field
+ * @see Participant
+ */
+@Getter
+@Setter
+public class ParticipantResponse extends Response {
+
+ /**
+ * list of requested participant
+ */
+ private List data = new ArrayList <>();
+
+ /**
+ * Response object constructor that contains multiple participants in data field
+ *
+ * @param code application status code
+ * @param message application status message
+ * @param data response participant
+ */
+ public ParticipantResponse(Integer code, String message, List data) {
+ super(code, message);
+ this.data = data;
+ }
+
+ /**
+ * Response object constructor that contains single participant in data field
+ *
+ * @param code application status code
+ * @param message application status message
+ * @param data response participant
+ */
+ public ParticipantResponse(Integer code, String message, Participant data) {
+ super(code, message);
+ this.data.add(data);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/http/PropertyResponse.java b/src/main/java/edu/itu/cavabunga/lib/http/PropertyResponse.java
new file mode 100644
index 0000000..5db5336
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/http/PropertyResponse.java
@@ -0,0 +1,46 @@
+package edu.itu.cavabunga.lib.http;
+
+import edu.itu.cavabunga.lib.entity.Property;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Response object that contains requested properties in data field
+ * @see Property
+ */
+@Getter
+@Setter
+public class PropertyResponse extends Response {
+
+ /**
+ * list of requested properties
+ */
+ private List data = new ArrayList <>();
+
+ /**
+ * Response object constructor that contains multiple properties in data field
+ *
+ * @param code application status code
+ * @param message application status message
+ * @param data response properties
+ */
+ public PropertyResponse(Integer code, String message, List data) {
+ super(code, message);
+ this.data = data;
+ }
+
+ /**
+ * Response object constructor that contains single property in data field
+ *
+ * @param code application status code
+ * @param message application status message
+ * @param data response property
+ */
+ public PropertyResponse(Integer code, String message, Property data) {
+ super(code, message);
+ this.data.add(data);
+ }
+}
diff --git a/src/main/java/edu/itu/cavabunga/lib/http/Response.java b/src/main/java/edu/itu/cavabunga/lib/http/Response.java
new file mode 100644
index 0000000..fd00b09
--- /dev/null
+++ b/src/main/java/edu/itu/cavabunga/lib/http/Response.java
@@ -0,0 +1,32 @@
+package edu.itu.cavabunga.lib.http;
+
+import lombok.Data;
+
+/**
+ * Generic Response object
+ */
+@Data
+public class Response {
+
+ /**
+ * application status code
+ */
+ private Integer code;
+
+ /**
+ * application status message
+ */
+ private String message;
+
+ /**
+ * Generic Response object constructor
+ *
+ * @param code application status code
+ * @param message application status message
+ */
+ public Response(Integer code, String message){
+ this.code = code;
+ this.message = message;
+ }
+
+}