<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

 <xsd:annotation>
  <xsd:documentation xml:lang="en">
   Log file schema for SEng 468 at the University of Victoria.
  </xsd:documentation>
 </xsd:annotation>

 <xsd:element name="log" type="LogType"/> 

<!-- The log file created by the students consists of user commands, quote server
 hits, account changes, system events, error messages and debug messages -->
 <xsd:complexType name="LogType">
  <xsd:choice minOccurs="0" maxOccurs="unbounded">
   <xsd:element name="userCommand" type="UserCommandType"/>
   <xsd:element name="quoteServer" type="QuoteServerType"/>
   <xsd:element name="accountTransaction" type="AccountTransactionType"/>
   <xsd:element name="systemEvent" type="SystemEventType"/>
   <xsd:element name="errorEvent" type="ErrorEventType"/>
   <xsd:element name="debugEvent" type="DebugType"/>
  </xsd:choice>
 </xsd:complexType>

<!-- User commands come from the user command files or from manual entries in 
the students' web forms -->
 <xsd:complexType name="UserCommandType">
  <xsd:all>
   <xsd:element name="timestamp" type="unixTimeLimits"/>
   <xsd:element name="server" type="xsd:string"/>
   <xsd:element name="transactionNum" type="xsd:positiveInteger"/>
   <xsd:element name="command" type="commandType"/>
   <xsd:element name="username" type="xsd:string" minOccurs="0"/>
   <xsd:element name="stockSymbol" type="stockSymbolType" minOccurs="0"/>
   <xsd:element name="filename" type="xsd:string" minOccurs="0"/>
   <xsd:element name="funds" type="xsd:decimal" minOccurs="0"/>
  </xsd:all>
 </xsd:complexType>

<!-- Every hit to the quote server requires a log entry with the results. The 
price, symbol, username, timestamp and cryptokey are as returned by the quote server -->
 <xsd:complexType name="QuoteServerType">
  <xsd:all>
   <xsd:element name="timestamp" type="unixTimeLimits"/>
   <xsd:element name="server" type="xsd:string"/>
   <xsd:element name="transactionNum" type="xsd:positiveInteger"/>
   <xsd:element name="price" type="xsd:decimal"/>
   <xsd:element name="stockSymbol" type="stockSymbolType"/>
   <xsd:element name="username" type="xsd:string"/>
   <xsd:element name="quoteServerTime" type="xsd:integer"/>
   <xsd:element name="cryptokey" type="xsd:string"/>
  </xsd:all>
 </xsd:complexType>

<!-- Any time a user's account is touched, an account message is printed.  
Appropriate actions are "add" or "remove". -->
 <xsd:complexType name="AccountTransactionType">
  <xsd:all>
   <xsd:element name="timestamp" type="unixTimeLimits"/>
   <xsd:element name="server" type="xsd:string"/>
   <xsd:element name="transactionNum" type="xsd:positiveInteger"/>
   <xsd:element name="action" type="xsd:string"/>
   <xsd:element name="username" type="xsd:string"/> 
   <xsd:element name="funds" type="xsd:decimal"/>
  </xsd:all>
 </xsd:complexType>

<!-- System events can be current user commands, interserver communications, 
or the execution of previously set triggers -->
 <xsd:complexType name="SystemEventType">
  <xsd:all>
   <xsd:element name="timestamp" type="unixTimeLimits"/>
   <xsd:element name="server" type="xsd:string"/>
   <xsd:element name="transactionNum" type="xsd:positiveInteger"/>
   <xsd:element name="command" type="commandType"/>
   <xsd:element name="username" type="xsd:string" minOccurs="0"/>
   <xsd:element name="stockSymbol" type="stockSymbolType" minOccurs="0"/>
   <xsd:element name="filename" type="xsd:string" minOccurs="0"/>
   <xsd:element name="funds" type="xsd:decimal" minOccurs="0"/>
  </xsd:all>
 </xsd:complexType>

<!-- Error messages contain all the information of user commands, in 
addition to an optional error message -->
 <xsd:complexType name="ErrorEventType">
  <xsd:all>
   <xsd:element name="timestamp" type="unixTimeLimits"/>
   <xsd:element name="server" type="xsd:string"/>
   <xsd:element name="transactionNum" type="xsd:positiveInteger"/>
   <xsd:element name="command" type="commandType"/>
   <xsd:element name="username" type="xsd:string" minOccurs="0"/>
   <xsd:element name="stockSymbol" type="stockSymbolType" minOccurs="0"/>
   <xsd:element name="filename" type="xsd:string" minOccurs="0"/>
   <xsd:element name="funds" type="xsd:decimal" minOccurs="0"/>
   <xsd:element name="errorMessage" type="xsd:string" minOccurs="0"/>
  </xsd:all> 
 </xsd:complexType>

<!-- Debugging messages contain all the information of user commands, in 
addition to an optional debug message -->
 <xsd:complexType name="DebugType">
  <xsd:all>
   <xsd:element name="timestamp" type="unixTimeLimits"/>
   <xsd:element name="server" type="xsd:string"/>
   <xsd:element name="transactionNum" type="xsd:positiveInteger"/>
   <xsd:element name="command" type="commandType"/>
   <xsd:element name="username" type="xsd:string" minOccurs="0"/>
   <xsd:element name="stockSymbol" type="stockSymbolType" minOccurs="0"/>
   <xsd:element name="filename" type="xsd:string" minOccurs="0"/>
   <xsd:element name="funds" type="xsd:decimal" minOccurs="0"/>
   <xsd:element name="debugMessage" type="xsd:string" minOccurs="0"/>
  </xsd:all>
 </xsd:complexType>

<!-- All Unix timestamps provided must be within the current semester -->
 <xsd:simpleType name="unixTimeLimits">
  <xsd:restriction base="xsd:integer">

	 <xsd:minInclusive value="1609459200000"/> <!-- Jan 1, 2021 -->
	 <xsd:maxInclusive value="1619827200000"/><!--May 1, 2021 -->


</xsd:restriction>
 </xsd:simpleType>

<!-- Stock symbols are always three or fewer letters long -->
 <xsd:simpleType name="stockSymbolType">
  <xsd:restriction base="xsd:string">
   <xsd:maxLength value="3"/>
  </xsd:restriction>
 </xsd:simpleType>

<!-- Enumeration of the very specific commands accepted in the system -->
 <xsd:simpleType name="commandType">
  <xsd:restriction base="xsd:string">
   <xsd:enumeration value="ADD"/>
   <xsd:enumeration value="QUOTE"/>
   <xsd:enumeration value="BUY"/>
   <xsd:enumeration value="COMMIT_BUY"/>
   <xsd:enumeration value="CANCEL_BUY"/>
   <xsd:enumeration value="SELL"/>
   <xsd:enumeration value="COMMIT_SELL"/>
   <xsd:enumeration value="CANCEL_SELL"/>
   <xsd:enumeration value="SET_BUY_AMOUNT"/>
   <xsd:enumeration value="CANCEL_SET_BUY"/>
   <xsd:enumeration value="SET_BUY_TRIGGER"/>
   <xsd:enumeration value="SET_SELL_AMOUNT"/>
   <xsd:enumeration value="SET_SELL_TRIGGER"/>
   <xsd:enumeration value="CANCEL_SET_SELL"/>
   <xsd:enumeration value="DUMPLOG"/>
   <xsd:enumeration value="DISPLAY_SUMMARY"/>
  </xsd:restriction>
 </xsd:simpleType>

</xsd:schema>
