//
//  Licensed to the Apache Software Foundation (ASF) under one
//  or more contributor license agreements.  See the NOTICE file
//  distributed with this work for additional information
//  regarding copyright ownership.  The ASF licenses this file
//  to you under the Apache License, Version 2.0 (the
//  "License"); you may not use this file except in compliance
//  with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
//  Unless required by applicable law or agreed to in writing,
//  software distributed under the License is distributed on an
//  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//  KIND, either express or implied.  See the License for the
//  specific language governing permissions and limitations
//  under the License.
//

<slingevent='http://sling.apache.org/jcr/event/1.0'>
<nt='http://www.jcp.org/jcr/nt/1.0'>
<mix='http://www.jcp.org/jcr/mix/1.0'>

[slingevent:Event] > nt:unstructured, nt:hierarchyNode
  - slingevent:topic (string)
  - slingevent:application (string)
  - slingevent:created (date)
  - slingevent:properties (binary)
  
[slingevent:Job] > slingevent:Event, mix:lockable
  - slingevent:processor (string)
  - slingevent:id (string)
  - slingevent:finished (date)
 
[slingevent:TimedEvent] > slingevent:Event, mix:lockable
  - slingevent:processor (string)
  - slingevent:id (string)
  - slingevent:expression (string)
  - slingevent:date (date)
  - slingevent:period (long)

  
