1 /*
2  * Copyright 2006-2008 The FLWOR Foundation.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ZORBA_AUDIT_H
18 #define ZORBA_AUDIT_H
19 
20 #include <iostream>
21 #include <vector>
22 #include <zorba/config.h>
23 #include <zorba/zorba_string.h>
24 
25 namespace zorba {
26 namespace audit {
27 
28   /**
29     * an identifier for a set of pieces of information that can be audited
30     * together.
31     * It is assumed that all instances of PropertyGroup are created statically
32     * and that they exist while a process exists.
33     */
34   class ZORBA_DLL_PUBLIC PropertyGroup {
35   public:
36     virtual size_t      pathLength()       const = 0;
37     virtual const char* getSegment(size_t) const = 0;
38   };
39 
40   /**
41     * an identifier for a specific piece of information that can be audited.
42     * It is assumed that all instances of Property are created statically
43     * and that they exist while a process exists.
44     */
45   class ZORBA_DLL_PUBLIC Property {
46   public:
47     enum Type {
48       INT,
49       STRING
50     };
51 
52     virtual ~Property();
53 
54     virtual const PropertyGroup& group() const = 0;
55     virtual const char*          name()  const = 0;
56     virtual long                 id()    const = 0;
57     virtual Type                 type()  const = 0;
58   };
59 
60   class ZORBA_DLL_PUBLIC Observation {
61   public:
62     virtual const Property&    property()    const = 0;
63     virtual const String& stringValue() const = 0;
64     virtual long long          longValue()   const = 0;
65 
66     virtual ~Observation();
67   };
68 
69   class ZORBA_DLL_PUBLIC Configuration {
70   public:
71     static void            getPropertyNames(std::vector<String>&);
72     static size_t          getPropertyCount();
73     static const Property& getProperty(size_t i);
74     static bool            enableProperty(Configuration*, const std::vector<String>&, const String&);
75 
76     virtual size_t size() const                                         = 0;
77     virtual void   enableAudit(size_t i)                                = 0;
78     virtual void   enableAudit(const String& aPropertyName)        = 0;
79     virtual bool   auditEnabled(size_t i) const                         = 0;
80     virtual bool   auditEnabled(const String& aPropertyName) const = 0;
81 
82     virtual const Property* getDynamicProperty(const String&) const = 0;
83 
84     virtual std::ostream& write(std::ostream&) const = 0;
85 
86     virtual ~Configuration();
87   };
88 
89   class ZORBA_DLL_PUBLIC Record {
90   public:
91     virtual const PropertyGroup& group() const = 0;
92 
93     virtual size_t             size()       const = 0;
94     virtual const Observation& at(size_t i) const = 0;
95 
96     virtual void add(const Property& prop, long long val)          = 0;
97     virtual void add(const Property& prop, const String& val) = 0;
98 
99     virtual ~Record();
100   };
101 
102   class ZORBA_DLL_PUBLIC Event {
103   public:
104     static Event* get();
105 
106     virtual bool audit(const Property&) const = 0;
107     virtual bool audit(const String&) const = 0;
108 
109     virtual const Property* getDynamicProperty(const String&) const = 0;
110 
111     virtual Record* createRecord()        = 0;
112     virtual void    submitRecord(Record*) = 0;
113 
114     virtual size_t        size()     const = 0;
115     virtual const Record* at(size_t) const = 0;
116 
117     virtual std::ostream& write(std::ostream&) const = 0;
118 
119     virtual ~Event();
120   };
121 
122   class ZORBA_DLL_PUBLIC Provider {
123   public:
124     virtual Configuration* createConfiguration(size_t = 0)      = 0;
125     virtual void           destroyConfiguration(Configuration*) = 0;
126 
127     virtual Event* createEvent(const Configuration*) = 0;
128     virtual void   submitEvent(Event*)               = 0;
129 
130     virtual ~Provider();
131   };
132 
133 } /* namespace audit */
134 } /* namespace zorba */
135 
136 inline std::ostream& operator<<(std::ostream& os, const zorba::audit::Configuration& c) {
137   return c.write(os);
138 }
139 
140 inline std::ostream& operator<<(std::ostream& os, const zorba::audit::Event& e) {
141   return e.write(os);
142 }
143 
144 #endif
145 /* vim:set et sw=2 ts=2: */
146