// SymboleoAC (Symboleo ontology + Access Control ontology) 

class Contract {
  1 <@>- 2..* LegalPosition legalPositions;
  1 <@>- 2..* Role roles;
  1..* -- 2..* Party parties;
  1 -- 0..* Asset assets;
  0..1 parentContract -- 0..* Contract subContracts;
  0..1 terminated -- 0..* Power terminators;
  
  // Contract state machine
  status {
    Form {
      activated -> InEffect;
    }
    Active {
      InEffect {
        rescinded -> Rescission;
        revokedParty -> Unassign;
        fulfilledActiveObligations -> SuccessfulTermination;
        suspended -> Suspension;
      }
      Suspension {
        resumed -> InEffect;
      }
      Unassign {
        assignedParty -> InEffect;
      }
      final Rescission {}
      terminated -> UnsuccessfulTermination;
    }
    final SuccessfulTermination { }
    final UnsuccessfulTermination { }
  }
  //For Access Control
  isA Resource;
}

class Party { }

class Role {
  1 debtor -- 0..* LegalPosition debt;
  1 creditor -- 0..* LegalPosition credit;
  1..* roles -- 0..1 Party party;
  
  //For Access Control
  isA Resource;

}

class Asset {
  * -- * Party owners;
  0..1 -- 0..* LegalPosition legalPositions;
  
  //For Access Control
  isA Resource;
}

class LegalPosition {
  * performerOf -- * Party performer;
  * liableOf -- * Party liable;
  * rightHolderOf -- * Party rightHolder;
  0..* antecedentOf -- 1 LegalSituation antecedent;
  0..* consequentOf -- 1 LegalSituation consequent;
  // Unidirectional association; the 0..1 does not influence code generation
  0..1 -> 0..1 LegalSituation trigger;
  
  //For Access Control
  isA Resource;
  1..* legalPositionSE   <@>- 0..* Event LegalPositionStateEven;
  1 legalpositionST   <@>- 1 StateTransition stateTransition; 
}

class Situation {
  0..1 postState -- 0..* Event preEvents;
  0..1 preState -- 0..* Event postEvents;
  // Unidirectional association; the 0..1 does not influence code generation
  0..1 -> 1 TimeInterval time;
}

class Event {
  // Unidirectional association; the 0..1 does not influence code generation
  0..1 -> 1 TimePoint time;
  
  //For Access Control 
     isA AbstractEvent;
   *  performedEvent   -- * Role performer;
  
}

class TimeInterval {
  // Unidirectional associations; the 0..1 do not influence code generation
  0..1 -> 1 TimePoint start;
  0..1 -> 1 TimePoint end;
}

class TimePoint { }

class LegalSituation {
  isA Situation;
  
  //For Access Control
   0..1 legalSituationD   <@>- 0..* Data data;
  1 legalSituationA   <@>- 0..* Attribute attributes;
  
}

class Obligation {
  isA LegalPosition;
  Boolean surviving; // true iff this is a surviving obligation.
  
  // Obligation state machine
  status {
    // This Start state was added to cope with an Umple
    // limitation regarding transitions from explicit
    // start pseudostates, which are not supported.
    Start {
      triggeredConditional -> Create;
      trigerredUnconditional -> InEffect;
    }
    Create {
      expired -> Discharge;
      activated -> InEffect;
    }
    Active {
      InEffect {
        fulfilled -> Fulfillment;
        violated -> Violation;
        discharged -> Discharge;
        suspended -> Suspension;
      }
      Suspension {
        resumed -> InEffect;
      }
      terminated -> UnsuccessfulTermination;
    }
    final Violation { }
    final Discharge { }
    final Fulfillment { }
    final UnsuccessfulTermination { }
  }
}

class Power {
  isA LegalPosition;
  // Unidirectional associations; the 0..1 do not influence code generation
  0..1 changeState -> 0..* LegalPosition legalPositions;
  
  // Contract state machine
  status {
    // This Start state was added to cope with an Umple
    // limitation regarding transitions from explicit
    // start pseudostates, which are not supported.  status {
    Start {
      triggeredConditional -> Create;
      trigerredUnconditional -> InEffect;
    }
    Create {
      expired -> UnsuccessfulTermination;
      activated -> InEffect;
    }
    Active {
      InEffect {
        exerted -> SuccessfulTermination;
        expired -> UnsuccessfulTermination;
        suspended -> Suspension;
      }
      Suspension {
        resumed -> InEffect;
      }
      terminated -> UnsuccessfulTermination;
    }
    final SuccessfulTermination { }
    final UnsuccessfulTermination { }
  }
}

//For Access Control
class Resource { 
* controlledResource -- 1..* Role controllers;
}

//For Access Control
class Policy {
  isA Resource; 
  1  <@>- 0..* Rule rules;  
  1 constrainedBy -- * Rule constraints;
}

//For Access Control
class Rule {  
  enum Action{read,write, all, transfer}
  enum Decision{Grant,Revoke}
  Action action;
  Decision decision;
  
  0..1 rule  -- 1 Resource accessedResource; 
  0..1 ruleAccesseor  -- 1 Role accessedRole; 
}

//For Access Control
class Operation{ 
  isA Resource;
  Condition preCondition;
  Condition postCondition;

  * performedOperation   -- * Role performer;  
}

//For Access Control
class Attribute{ 
  isA Resource;
  1..* inputAttributs -- 1..* Operation consumerOperations;
  0..* outputAttributs -- 1 Operation producerOperation;
}

//For Access Control
class Data{
   isA AbstractEvent; 
}

//For Access Control
class StateTransition{
  isA Resource;
}

//For Access Control
class AbstractEvent{
  isA Resource;
  0..1 -- 1..* Attribute attributes;
} 
