<?xml version="1.0" encoding="UTF-8"?>
<state-model xmlns="http://www.itinnovation.soton.ac.uk/uk/ac/soton/itinnovation/grid/pbac2/staticpolicy/types" description="DataService description">
  <!-- Roles are:
	 - owner can do anything
	 - manager can do anything except lock, unlock or finishData
	 - reader can read contents
	 - writer can change contents
	 -->
	<state name="UNINITIALISED-STATE">
		<transition>
			<event name="init"/>
			<to-state name="empty"/>
		</transition>
	</state>
	<state name="empty">
		<operation name="getPolicyRules:owner">
			<process-role name="owner"/>
		</operation>
		<operation name="addPolicyRule:owner">
			<process-role name="owner"/>
		</operation>
		<operation name="removePolicyRule:owner">
			<process-role name="owner"/>
		</operation>

		<operation name="getPolicyRules:manager">
			<process-role name="manager"/>
		</operation>
		<operation name="addPolicyRule:manager">
			<process-role name="manager"/>
		</operation>
		<operation name="removePolicyRule:manager">
			<process-role name="manager"/>
		</operation>

		<operation name="getPolicyRules:reader">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="addPolicyRule:reader">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="removePolicyRule:reader">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="getPolicyRules:writer">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="addPolicyRule:writer">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="removePolicyRule:writer">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>

		<operation name="GetResourceProperty">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="setLabel">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="getEPR">
			<process-role name="owner"/>
			<process-role name="manager"/>
			<process-role name="reader"/>
			<process-role name="writer"/>
		</operation>
		<operation name="checkData">
			<process-role name="owner"/>
			<process-role name="manager"/>
			<process-role name="writer"/>
			<process-role name="reader"/>
		</operation>
		<operation name="copyFrom">
			<process-role name="writer"/>
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="copyFromURL">
			<process-role name="writer"/>
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="save">
			<process-role name="writer"/>
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="enableR">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="enableW">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="disableR">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="disableW">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="getReaderRules">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="getWriterRules">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="getManagerRules">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="getOwnerRules">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="writeProtect">
			<process-role name="owner"/>
		</operation>
		<operation name="removeOwnerRule">
			<process-role name="owner"/>
		</operation>
		<operation name="addOwnerRule">
			<process-role name="owner"/>
		</operation>
		<operation name="checkReadAccess">
			<process-role name="owner"/>
			<process-role name="manager"/>
			<process-role name="reader"/>
		</operation>
		<operation name="checkWriteAccess">
			<process-role name="writer"/>
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="finishData">
			<process-role name="owner"/>
		</operation>
		<operation name="destroy">
			<process-role name="owner"/>
			<process-role name="managing-service"/>
		</operation>
		<operation name="getValidRoles">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<transition>
			<event name="write"/>
			<to-state name="full"/>
		</transition>
		<transition>
			<event name="lock"/>
			<to-state name="empty-locked"/>
		</transition>
		<transition>
			<event name="finish"/>
			<to-state name="DESTROYED-STATE"/>
		</transition>
	</state>
	<state name="empty-locked">
		<operation name="getPolicyRules:owner">
			<process-role name="owner"/>
		</operation>
		<operation name="addPolicyRule:owner">
			<process-role name="owner"/>
		</operation>
		<operation name="removePolicyRule:owner">
			<process-role name="owner"/>
		</operation>

		<operation name="getPolicyRules:manager">
			<process-role name="manager"/>
		</operation>
		<operation name="addPolicyRule:manager">
			<process-role name="manager"/>
		</operation>
		<operation name="removePolicyRule:manager">
			<process-role name="manager"/>
		</operation>

		<operation name="getPolicyRules:reader">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="addPolicyRule:reader">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="removePolicyRule:reader">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="getPolicyRules:writer">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="addPolicyRule:writer">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="removePolicyRule:writer">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>

		<operation name="GetResourceProperty">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="setLabel">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="getEPR">
			<process-role name="owner"/>
			<process-role name="manager"/>
			<process-role name="reader"/>
			<process-role name="writer"/>
		</operation>
		<operation name="checkData">
			<process-role name="owner"/>
			<process-role name="manager"/>
			<process-role name="writer"/>
			<process-role name="reader"/>
		</operation>
		<operation name="enableR">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="enableW">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="disableR">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="disableW">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="getReaderRules">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="getWriterRules">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="getManagerRules">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="getOwnerRules">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="writeEnable">
			<process-role name="owner"/>
		</operation>
		<operation name="checkReadAccess">
			<process-role name="reader"/>
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="checkWriteAccess">
			<process-role name="owner"/>
			<process-role name="manager"/>
			<process-role name="writer"/>
		</operation>
		<operation name="removeOwnerRule">
			<process-role name="owner"/>
		</operation>
		<operation name="addOwnerRule">
			<process-role name="owner"/>
		</operation>
			<operation name="destroy">
			<process-role name="managing-service"/>
		</operation>
		<operation name="getValidRoles">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<transition>
			<event name="unlock"/>
			<to-state name="empty"/>
		</transition>
		<transition>
			<event name="finish"/>
			<to-state name="DESTROYED-STATE"/>
		</transition>
	</state>
	<state name="full">
		<operation name="getPolicyRules:owner">
			<process-role name="owner"/>
		</operation>
		<operation name="addPolicyRule:owner">
			<process-role name="owner"/>
		</operation>
		<operation name="removePolicyRule:owner">
			<process-role name="owner"/>
		</operation>

		<operation name="getPolicyRules:manager">
			<process-role name="manager"/>
		</operation>
		<operation name="addPolicyRule:manager">
			<process-role name="manager"/>
		</operation>
		<operation name="removePolicyRule:manager">
			<process-role name="manager"/>
		</operation>

		<operation name="getPolicyRules:reader">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="addPolicyRule:reader">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="removePolicyRule:reader">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="getPolicyRules:writer">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="addPolicyRule:writer">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="removePolicyRule:writer">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>

		<operation name="GetResourceProperty">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="setLabel">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="getEPR">
			<process-role name="owner"/>
			<process-role name="manager"/>
			<process-role name="reader"/>
			<process-role name="writer"/>
		</operation>
		<operation name="checkData">
			<process-role name="owner"/>
			<process-role name="manager"/>
			<process-role name="writer"/>
			<process-role name="reader"/>
		</operation>
		<operation name="copyTo">
			<process-role name="reader"/>
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="copyFrom">
			<process-role name="writer"/>
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="copyFromURL">
			<process-role name="writer"/>
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="enableR">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="enableW">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="disableR">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="disableW">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="getReaderRules">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="getWriterRules">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="getManagerRules">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="getOwnerRules">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="read">
			<process-role name="reader"/>
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="save">
			<process-role name="writer"/>
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="deleteContents">
			<process-role name="writer"/>
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="writeProtect">
			<process-role name="owner"/>
		</operation>
		<operation name="checkReadAccess">
			<process-role name="reader"/>
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="checkWriteAccess">
			<process-role name="writer"/>
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="removeOwnerRule">
			<process-role name="owner"/>
		</operation>
		<operation name="addOwnerRule">
			<process-role name="owner"/>
		</operation>
		<operation name="finishData">
			<process-role name="owner"/>
		</operation>
		<operation name="destroy">
			<process-role name="owner"/>
			<process-role name="managing-service"/>
		</operation>
		<operation name="getValidRoles">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<transition>
			<event name="lock"/>
			<to-state name="full-locked"/>
		</transition>
		<transition>
			<event name="write"/>
			<to-state name="full"/>
		</transition>
		<transition>
			<event name="delete"/>
			<to-state name="empty"/>
		</transition>
		<transition>
			<event name="finish"/>
			<to-state name="DESTROYED-STATE"/>
		</transition>
	</state>
	<state name="full-locked">
		<operation name="getPolicyRules:owner">
			<process-role name="owner"/>
		</operation>
		<operation name="addPolicyRule:owner">
			<process-role name="owner"/>
		</operation>
		<operation name="removePolicyRule:owner">
			<process-role name="owner"/>
		</operation>

		<operation name="getPolicyRules:manager">
			<process-role name="manager"/>
		</operation>
		<operation name="addPolicyRule:manager">
			<process-role name="manager"/>
		</operation>
		<operation name="removePolicyRule:manager">
			<process-role name="manager"/>
		</operation>

		<operation name="getPolicyRules:reader">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="addPolicyRule:reader">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="removePolicyRule:reader">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="getPolicyRules:writer">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="addPolicyRule:writer">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="removePolicyRule:writer">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>

		<operation name="GetResourceProperty">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="setLabel">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="getEPR">
			<process-role name="owner"/>
			<process-role name="manager"/>
			<process-role name="reader"/>
			<process-role name="writer"/>
		</operation>
		<operation name="checkData">
			<process-role name="owner"/>
			<process-role name="manager"/>
			<process-role name="writer"/>
			<process-role name="reader"/>
		</operation>
		<operation name="copyTo">
			<process-role name="reader"/>
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="enableR">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="enableW">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="disableR">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="disableW">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="getReaderRules">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="getWriterRules">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="getManagerRules">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="getOwnerRules">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="read">
			<process-role name="reader"/>
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="writeEnable">
			<process-role name="owner"/>
		</operation>
		<operation name="checkReadAccess">
			<process-role name="reader"/>
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="checkWriteAccess">
			<process-role name="writer"/>
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<operation name="removeOwnerRule">
			<process-role name="owner"/>
		</operation>
		<operation name="addOwnerRule">
			<process-role name="owner"/>
		</operation>
		<operation name="destroy">
			<process-role name="managing-service"/>
		</operation>
		<operation name="getValidRoles">
			<process-role name="owner"/>
			<process-role name="manager"/>
		</operation>
		<transition>
			<event name="unlock"/>
			<to-state name="full"/>
		</transition>
		<transition>
			<event name="finish"/>
			<to-state name="DESTROYED-STATE"/>
		</transition>
	</state>
	<state name="DESTROYED-STATE"/>
</state-model>

