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; + } + +}