Advertisement
Guest User

Untitled

a guest
Jul 13th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 8.86 KB | None | 0 0
  1. package ex09
  2.  
  3. import java.time.LocalDateTime
  4. import java.time.ZoneOffset
  5. import java.time.format.DateTimeFormatter
  6. import java.time.Duration
  7. import java.time.Instant
  8. import java.time.temporal.ChronoUnit
  9.  
  10. import de.tudarmstadt.stg.sedc.annotations.builder.ConcreteBuilder
  11. import de.tudarmstadt.stg.sedc.annotations.composite.{ChildManagement, Composite, Leaf}
  12. import de.tudarmstadt.stg.sedc.annotations.decorator.{ConcreteComponent, ConcreteDecorator}
  13. import de.tudarmstadt.stg.sedc.annotations.visitor.{ConcreteElement, ConcreteVisitor, Element}
  14.  
  15. @Element
  16. trait Visitable {
  17.     def accept(visitor: Visitor)
  18. }
  19.  
  20. @Visitor
  21. trait Visitor {
  22.     def visit(simpleTask: SimpleTask)
  23.     def visit(dependentTask: DependentTask)
  24.     def visit(billableTask: BillableTask)
  25.     def visit(project: Project)
  26. }
  27.  
  28. @ConcreteVisitor
  29. class InvoiceVisitor extends Visitor {
  30.     override def visit(simpleTask: SimpleTask): Unit = {}
  31.  
  32.     override def visit(dependentTask: DependentTask): Unit = {}
  33.  
  34.     override def visit(billableTask: BillableTask): Unit = {}
  35.  
  36.     override def visit(project: Project): Unit = {}
  37.  
  38.     def getInvoice: String = {""}
  39. }
  40.  
  41. @ConcreteVisitor
  42. class ValidationVisitor extends Visitor {
  43.     override def visit(simpleTask: SimpleTask): Unit = {}
  44.  
  45.     override def visit(dependentTask: DependentTask): Unit = {}
  46.  
  47.     override def visit(billableTask: BillableTask): Unit = {}
  48.  
  49.     override def visit(project: Project): Unit = {}
  50.  
  51.     def isConsistent: Boolean = {false}
  52. }
  53.  
  54. @ConcreteVisitor
  55. class NextDeadlineVisitor extends Visitor {
  56.     override def visit(simpleTask: SimpleTask): Unit = {}
  57.  
  58.     override def visit(dependentTask: DependentTask): Unit = {}
  59.  
  60.     override def visit(billableTask: BillableTask): Unit = {}
  61.  
  62.     override def visit(project: Project): Unit = {}
  63.  
  64.     def getNextDeadline: Instant = new Instant()
  65. }
  66.  
  67. trait Task extends Visitable{
  68.     def description: String
  69.  
  70.     def duration: Duration
  71.  
  72.     def dueDate: Option[Instant]
  73.  
  74.     def completionDate: Option[Instant]
  75.  
  76.     def startDate: Option[Instant]
  77.  
  78.     def context: Option[String]
  79.  
  80.     def priority: Option[Char]
  81.  
  82.     def markDone(): Unit
  83.  
  84.     def addTime(duration: Duration): Unit
  85. }
  86.  
  87.  
  88. trait OutputFormat {
  89.  
  90.     def format(visitables: List[Visitable]): String
  91.  
  92.     protected def printInstantAsDate(instant: Instant): String = {
  93.         val datetime = LocalDateTime.ofInstant(instant, ZoneOffset.UTC)
  94.         DateTimeFormatter.ofPattern("yyyy-MM-dd").format(datetime)
  95.     }
  96. }
  97.  
  98. trait Export[T] {
  99.     def result: T
  100. }
  101.  
  102. @ConcreteComponent
  103. @Leaf
  104. @ConcreteElement
  105. case class SimpleTask(description: String, dueDate: Option[Instant], context: Option[String], priority: Option[Char], startDate: Option[Instant]) extends Task {
  106.     var _completeDate: Option[Instant] = None
  107.  
  108.     override def duration: Duration = new Duration()
  109.  
  110.     override def completionDate: Option[Instant] = _completeDate
  111.  
  112.     override def markDone(): Unit = _completeDate = Some(new Instant())
  113.  
  114.     override def addTime(duration: Duration): Unit = this.duration.plus(duration)
  115.  
  116.     override def accept(visitor: Visitor): Unit = visitor.visit(this)
  117. }
  118.  
  119. @ConcreteDecorator
  120. @Leaf
  121. @ConcreteElement
  122. case class DependentTask(aTask: Task, anotherTask: Task) extends Task {
  123.     override def description: String = aTask.description
  124.  
  125.     override def duration: Duration = aTask.duration
  126.  
  127.     override def dueDate: Option[Instant] = aTask.dueDate
  128.  
  129.     override def completionDate: Option[Instant] = aTask.completionDate
  130.  
  131.     override def startDate: Option[Instant] = aTask.startDate
  132.  
  133.     override def context: Option[String] = aTask.context
  134.  
  135.     override def priority: Option[Char] = aTask.priority
  136.  
  137.     override def markDone(): Unit = aTask.markDone()
  138.  
  139.     override def addTime(duration: Duration): Unit = aTask.addTime(duration)
  140.  
  141.     override def accept(visitor: Visitor): Unit = visitor.visit(this)
  142. }
  143.  
  144. @ConcreteDecorator
  145. @Leaf
  146. @ConcreteElement
  147. case class BillableTask(aTask: Task, rate: Double) extends Task {
  148.     override def description: String = aTask.description
  149.  
  150.     override def duration: Duration = aTask.duration
  151.  
  152.     override def dueDate: Option[Instant] = aTask.dueDate
  153.  
  154.     override def completionDate: Option[Instant] = aTask.completionDate
  155.  
  156.     override def startDate: Option[Instant] = aTask.startDate
  157.  
  158.     override def context: Option[String] = aTask.context
  159.  
  160.     override def priority: Option[Char] = aTask.priority
  161.  
  162.     override def markDone(): Unit = aTask.markDone()
  163.  
  164.     override def addTime(duration: Duration): Unit = aTask.addTime(duration)
  165.  
  166.     override def accept(visitor: Visitor): Unit = visitor.visit(this)
  167. }
  168.  
  169.  
  170. @ConcreteBuilder
  171. class TaskBuilder(private var description: String) {
  172.     private var dueDate: Option[Instant] = None
  173.     private var context: Option[String] = None
  174.     private var priority: Option[Char] = None
  175.     private var dependence: Option[Task] = None
  176.     private var rate: Option[Double] = None
  177.     private var startDate: Option[Instant] = None
  178.  
  179.     def addDueDate(instant: Instant): TaskBuilder = {
  180.         require(this.dueDate.isEmpty)
  181.         dueDate = Some(instant)
  182.         this
  183.     }
  184.  
  185.     def addContext(context: String): TaskBuilder = {
  186.         require(this.context.isEmpty)
  187.         this.context = Some(context)
  188.         this
  189.     }
  190.  
  191.     def addPriority(prio: Char): TaskBuilder = {
  192.         require(priority.isEmpty)
  193.         require(prio >= 'A' && prio <= 'Z')
  194.         this.priority = Some(prio)
  195.         this
  196.     }
  197.  
  198.     def addDependency(task: Task): TaskBuilder = {
  199.         require(dependence.isEmpty)
  200.         dependence = Some(task)
  201.         this
  202.     }
  203.  
  204.     def addRate(rate: Double): TaskBuilder = {
  205.         require(this.rate.isEmpty)
  206.         this.rate = Some(rate)
  207.         this
  208.     }
  209.  
  210.     def addStartDate(startDate:Instant): TaskBuilder = {
  211.         require(this.startDate.isEmpty)
  212.         this.startDate = Some(startDate)
  213.         this
  214.     }
  215.  
  216.     def build(): Task =  {
  217.         if(this.startDate.isEmpty)
  218.             this.startDate = Some(Instant.now)
  219.  
  220.         if(this.dependence.isDefined)
  221.             DependentTask(SimpleTask(description, dueDate, context, priority, startDate), this.dependence.get)
  222.         else if (this.rate.isDefined)
  223.             BillableTask(SimpleTask(description, dueDate, context, priority, startDate), this.rate.get)
  224.         else
  225.             SimpleTask(description, dueDate, context, priority, startDate)
  226.     }
  227. }
  228.  
  229. @Composite
  230. @ConcreteElement
  231. class Project private(val name: String) extends Visitable {
  232.     var list: Seq[Task] = Nil
  233.  
  234.     def initialize(tasks: Seq[Task]) = list = tasks
  235.    
  236.     @ChildManagement
  237.     def add(task: Task): Unit = list = list :+ task
  238.    
  239.     @ChildManagement
  240.     def remove(index: Int): Unit = list.patch(index, Nil, 1)
  241.  
  242.     override def accept(visitor: Visitor): Unit = visitor.visit(this)
  243. }
  244.  
  245.  
  246.  
  247. object Project {
  248.     def create(name: String, tasks: Task*): Project = {
  249.         val aProject: Project = Project(name)
  250.         aProject.initialize(tasks)
  251.         aProject
  252.     }
  253. }
  254.  
  255. class TaskList(t: List[Visitable], val f: OutputFormat) extends Export[String] {
  256.     def result: String = ???
  257. }
  258.  
  259. case object TodoTXT
  260.  
  261. case object CSV
  262.  
  263. object Runner {
  264.  
  265.     def main(args: Array[String]): Unit = {
  266.         var list = new TaskBuilder("task1").build() :: Nil
  267.         list = new TaskBuilder("task2").addDependency(list.head).addDueDate(Instant.now().plus(6,
  268.             ChronoUnit.DAYS)).build() :: list
  269.         list = new TaskBuilder("task3").addContext("phone").addDueDate(Instant.now().plus(5,
  270.             ChronoUnit.DAYS)).build() :: list
  271.         list = new TaskBuilder("task4").addPriority('A').addRate(10.0).build() :: list
  272.         list = new TaskBuilder("task5").addContext("phone").addRate(10.0).addPriority('B')
  273.             .addDueDate(Instant.now().plus(5, ChronoUnit.DAYS)).addDependency(list(1)).build() :: list
  274.         list.head.addTime(Duration.of(8L, ChronoUnit.HOURS))
  275.         list.head.markDone()
  276.         list = list.reverse
  277.         val project = Project.create("all", list: _*)
  278.  
  279.         var visitableList:List[Visitable] = new TaskBuilder("task6").addContext("phone").addRate(10.0)
  280.             .addPriority('B')
  281.             .addDueDate(Instant.now().plus(5, ChronoUnit.DAYS))
  282.             .addDependency(list(4)).build() :: Nil
  283.         visitableList = project :: visitableList
  284.  
  285. //        println(new TaskList(visitableList, CSV).result)
  286. //        println(new TaskList(visitableList, TodoTXT).result)
  287.  
  288.         val invoiceVisitor = new InvoiceVisitor
  289.         val deadlineVisitor = new NextDeadlineVisitor
  290.         val validationVisitor = new ValidationVisitor
  291.  
  292.  
  293.         project.accept(invoiceVisitor)
  294.         project.accept(deadlineVisitor)
  295.         project.accept(validationVisitor)
  296.  
  297.         println(invoiceVisitor.getInvoice)
  298.         println(deadlineVisitor.getNextDeadline)
  299.         println(validationVisitor.isConsistent)
  300.     }
  301.  
  302. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement