ROOT logo
//-*- Mode: C++ -*-
// $Id$

#ifndef ALIHLTCONFIGURATION_H
#define ALIHLTCONFIGURATION_H
//* This file is property of and copyright by the                          * 
//* ALICE Experiment at CERN, All rights reserved.                         *
//* See cxx source for full Copyright notice                               *

/// @file   AliHLTConfiguration.h
/// @author Matthias Richter
/// @date   
/// @brief  HLT configuration description for a single component.
/// @note   The class is used in Offline (AliRoot) context

#include <vector>
#include <TObject.h>
#include <TList.h>
#include "AliHLTDataTypes.h"
#include "AliHLTLogging.h"
#include "AliHLTDataBuffer.h"

class AliHLTConfigurationHandler;

/**
 * @class AliHLTConfiguration
 * @brief Description of HLT processing chains.
 *
 * This class describes a configuration for an HLT component by means of
 * the following parameters:
 * - configuration id:      a unique id string/name
 * - component id:          id returned by AliHLTComponent::GetComponentID()
 * - parent configuartions: ids of configurations it requires input from
 * - component arguments:   passed to the component when it is initialized
 *
 * The definition of a configuration requires simply the creation of an object
 * of type @ref AliHLTConfiguration. 
 * <pre>
 * AliHLTConfiguration myprocessor("MyProcessor", "Dummy", "publisher", "-output_percentage 80")
 * </pre>
 *
 * The Configuration is automatically registered in the list of available
 * configurations maintained by the @ref AliHLTConfigurationHandler.
 * The list is used to resolve the dependencies on other configurations.
 * Hierarchies can be built up by specifying the configuration id of parent
 * configurations as input in the .
 * A configuration entry is persistent and must be explicitly removed from
 * the AliHLTConfigurationHandler if desired.
 *
 * The registration mechanism requires the HLT system to be available. The
 * global instance of AliHLTSystem is created and retrieved by
 * <pre>
 *   // setup the HLT system
 *   AliHLTSystem* pHLT=AliHLTPluginBase::GetInstance();
 * </pre>
 *
 * A configuration is transformed into a list of AliHLTTask objects by the
 * function AliHLTSystem::BuildTaskList().
 *
 * This class is only used in the HLT offline environment, see @ref alihlt_system
 * for more details.
 *
 * @ingroup alihlt_system
 */
class AliHLTConfiguration : public TObject, public AliHLTLogging {
 public:
  /**
   * standard constructor. The configuration is automatically registered in the
   * global configuration manager
   */
  AliHLTConfiguration();
  /**
   * constructor. The configuration is automatically registered in the
   * global configuration manager
   * @param id         unique id of the configuration
   * @param component  component id
   * @param sources    blank separated list of source configuration ids
   * @param arguments  argument string passed to the component at initialization
   * @param bufsize    size of the output buffer in byte, the string can contain a
   *                   number prepended by a unit, e.g. 1M, allowed units 'k' and 'M'
   */
  AliHLTConfiguration(const char* id, const char* component,
		      const char* sources, const char* arguments,
		      const char* bufsize=NULL);
  /** copy constructor */
  AliHLTConfiguration(const AliHLTConfiguration& src);
  /** assignment op */
  AliHLTConfiguration& operator=(const AliHLTConfiguration& src);
  /** destructor */
  virtual ~AliHLTConfiguration();

  /*****************************************************************************
   * properties of the configuration
   */

  /**
   * Get configuration id, a unique name
   * This is an overridden TObject function in order to return the configuration
   * name instead of the class name. Enables use of TList standard functions.
   * @return configuration id
   */
  const char *GetName() const;

  /**
   * Get id of the component.
   * The id is a unique string.
   * @return id of the component
   */
  const char* GetComponentID() const {return fComponent;}

  /**
   * Return the source string.
   */
  const char* GetSourceSettings() const {return fStringSources;}

  /**
   * Return the argument string.
   */
  const char* GetArgumentSettings() const {return fArguments;}

  /**
   * Print status info.
   * Short summary on id, component, sources and unresolved sources.
   */
  void PrintStatus() const;

  /**
   * overloaded from TObject
   * options:
   *   status  - print status including the resolved sources
   */
  virtual void Print(const char* option="") const;

  /**
   * Get a certain source.
   * @param  id of the source configuration
   * @result pointer to the corresponding configuration descriptor
   */
  AliHLTConfiguration* GetSource(const char* id);

  /**
   * Try to find a dependency recursively in the list of sources.
   * @param id       the source to search for
   * @param pTgtList (optional) target list to receive the dependency tree
   * @return
   *   0 if not found
   *   n found in the n-th level
   *   dependency list in the target list  
   */
  int FollowDependency(const char* id, TList* pTgtList=NULL);

  /**
   * Get the number of resolved sources.
   * @return number of resolved sources
   */
  int GetNofSources() {return fListSources.size();}

  /**
   * Check resolving status.
   * @return 1 if all sources resolved, 0 if not yet extracted or not resolved
   */
  int SourcesResolved() const;

  /**
   * extract the source configurations from the sources string
   * builds up the internal list of source configurations
   * @result 1 if sources resolved, 0 if not
   */
  int ExtractSources(AliHLTConfigurationHandler* pHandler);

  /**
   * Start iteration and get the first source.
   * @result pointer to the first configuration descriptor
   */
  AliHLTConfiguration* GetFirstSource() const;

  /**
   * Continue iteration and get the next source.
   * @result pointer to the next configuration descriptor in the list
   */
  AliHLTConfiguration* GetNextSource() const;

  /**
   * Invalidate a dependency and mark the configuration to be re-evaluted. 
   * @param pConf pointer to configuration descriptor
   */
  int InvalidateSource(AliHLTConfiguration* pConf);

  /**
   * Mark the configuration to be re-evaluted.
   */
  int InvalidateSources() {fNofSources=-1; return 0;}

  /**
   * Get the arguments array.
   * @param pArgv   pointer to receive argument array pointer
   * @return argc if succeeded, neg. error code if failed
   */
  int GetArguments(const char*** pArgv) const;

  /**
   * Get output buffer size.
   * @return size in byte or -1 if not specified
   */
  int GetOutputBufferSize() const {return fBufferSize;}

  /**
   * Two configurations are considered equal if all properties match
   */
  bool operator==(const AliHLTConfiguration& c) const {
    return (fID==c.fID) && (fComponent==c.fComponent) && (fStringSources==c.fStringSources) && (fArguments==c.fArguments);
  }
  bool operator!=(const AliHLTConfiguration& c) const {
    return !(*this==c);
  }

  /**
   * Helper function to build a vector from an argument string.
   * The function allocates memory for each token. The caller is responsible
   * for cleaning the strings recursively.
   * @param arg       pointer to argument string
   * @param argList   target to receive the argument list
   */
  static int InterpreteString(const char* arg, vector<char*>& argList);

 protected:
  

 private:
  /* extract arguments from the argument string
   */
  int ExtractArguments();

  /**
   * Convert buffer size string to number
   */
  int ConvertSizeString(const char* strSize) const;

  /** id of this configuration */
  TString fID;                                                     // see above
  /** component id of this configuration */
  TString fComponent;                                              // see above

  /** the <i>sources</i> string as passed to the constructor */
  TString fStringSources;                                          // see above
  /** number of resolved sources, -1 indicates re-evaluation */
  int fNofSources;                                                 //! transient
  /** list of sources */
  vector<AliHLTConfiguration*> fListSources;                       //! transient
  /** index of the current element in the list of sources */
  int fListSrcElementIdx;                                          //! transient

  /**
   * The argument string as passed to the constructor.
   * Specifies the arguments for the Analysys component. The string will
   * be parsed and the separated arguments stored in the @ref fArgv array
   * and @ref fArgc member.
   */
  TString fArguments;                                              // see above
  /** number of arguments */
  int fArgc;                                                       //! transient
  /** argument array */
  char** fArgv;                                                    //! transient

  /** size of the output buffer */
  int fBufferSize;                                                 // see above

  ClassDef(AliHLTConfiguration, 0);
};

#endif
 AliHLTConfiguration.h:1
 AliHLTConfiguration.h:2
 AliHLTConfiguration.h:3
 AliHLTConfiguration.h:4
 AliHLTConfiguration.h:5
 AliHLTConfiguration.h:6
 AliHLTConfiguration.h:7
 AliHLTConfiguration.h:8
 AliHLTConfiguration.h:9
 AliHLTConfiguration.h:10
 AliHLTConfiguration.h:11
 AliHLTConfiguration.h:12
 AliHLTConfiguration.h:13
 AliHLTConfiguration.h:14
 AliHLTConfiguration.h:15
 AliHLTConfiguration.h:16
 AliHLTConfiguration.h:17
 AliHLTConfiguration.h:18
 AliHLTConfiguration.h:19
 AliHLTConfiguration.h:20
 AliHLTConfiguration.h:21
 AliHLTConfiguration.h:22
 AliHLTConfiguration.h:23
 AliHLTConfiguration.h:24
 AliHLTConfiguration.h:25
 AliHLTConfiguration.h:26
 AliHLTConfiguration.h:27
 AliHLTConfiguration.h:28
 AliHLTConfiguration.h:29
 AliHLTConfiguration.h:30
 AliHLTConfiguration.h:31
 AliHLTConfiguration.h:32
 AliHLTConfiguration.h:33
 AliHLTConfiguration.h:34
 AliHLTConfiguration.h:35
 AliHLTConfiguration.h:36
 AliHLTConfiguration.h:37
 AliHLTConfiguration.h:38
 AliHLTConfiguration.h:39
 AliHLTConfiguration.h:40
 AliHLTConfiguration.h:41
 AliHLTConfiguration.h:42
 AliHLTConfiguration.h:43
 AliHLTConfiguration.h:44
 AliHLTConfiguration.h:45
 AliHLTConfiguration.h:46
 AliHLTConfiguration.h:47
 AliHLTConfiguration.h:48
 AliHLTConfiguration.h:49
 AliHLTConfiguration.h:50
 AliHLTConfiguration.h:51
 AliHLTConfiguration.h:52
 AliHLTConfiguration.h:53
 AliHLTConfiguration.h:54
 AliHLTConfiguration.h:55
 AliHLTConfiguration.h:56
 AliHLTConfiguration.h:57
 AliHLTConfiguration.h:58
 AliHLTConfiguration.h:59
 AliHLTConfiguration.h:60
 AliHLTConfiguration.h:61
 AliHLTConfiguration.h:62
 AliHLTConfiguration.h:63
 AliHLTConfiguration.h:64
 AliHLTConfiguration.h:65
 AliHLTConfiguration.h:66
 AliHLTConfiguration.h:67
 AliHLTConfiguration.h:68
 AliHLTConfiguration.h:69
 AliHLTConfiguration.h:70
 AliHLTConfiguration.h:71
 AliHLTConfiguration.h:72
 AliHLTConfiguration.h:73
 AliHLTConfiguration.h:74
 AliHLTConfiguration.h:75
 AliHLTConfiguration.h:76
 AliHLTConfiguration.h:77
 AliHLTConfiguration.h:78
 AliHLTConfiguration.h:79
 AliHLTConfiguration.h:80
 AliHLTConfiguration.h:81
 AliHLTConfiguration.h:82
 AliHLTConfiguration.h:83
 AliHLTConfiguration.h:84
 AliHLTConfiguration.h:85
 AliHLTConfiguration.h:86
 AliHLTConfiguration.h:87
 AliHLTConfiguration.h:88
 AliHLTConfiguration.h:89
 AliHLTConfiguration.h:90
 AliHLTConfiguration.h:91
 AliHLTConfiguration.h:92
 AliHLTConfiguration.h:93
 AliHLTConfiguration.h:94
 AliHLTConfiguration.h:95
 AliHLTConfiguration.h:96
 AliHLTConfiguration.h:97
 AliHLTConfiguration.h:98
 AliHLTConfiguration.h:99
 AliHLTConfiguration.h:100
 AliHLTConfiguration.h:101
 AliHLTConfiguration.h:102
 AliHLTConfiguration.h:103
 AliHLTConfiguration.h:104
 AliHLTConfiguration.h:105
 AliHLTConfiguration.h:106
 AliHLTConfiguration.h:107
 AliHLTConfiguration.h:108
 AliHLTConfiguration.h:109
 AliHLTConfiguration.h:110
 AliHLTConfiguration.h:111
 AliHLTConfiguration.h:112
 AliHLTConfiguration.h:113
 AliHLTConfiguration.h:114
 AliHLTConfiguration.h:115
 AliHLTConfiguration.h:116
 AliHLTConfiguration.h:117
 AliHLTConfiguration.h:118
 AliHLTConfiguration.h:119
 AliHLTConfiguration.h:120
 AliHLTConfiguration.h:121
 AliHLTConfiguration.h:122
 AliHLTConfiguration.h:123
 AliHLTConfiguration.h:124
 AliHLTConfiguration.h:125
 AliHLTConfiguration.h:126
 AliHLTConfiguration.h:127
 AliHLTConfiguration.h:128
 AliHLTConfiguration.h:129
 AliHLTConfiguration.h:130
 AliHLTConfiguration.h:131
 AliHLTConfiguration.h:132
 AliHLTConfiguration.h:133
 AliHLTConfiguration.h:134
 AliHLTConfiguration.h:135
 AliHLTConfiguration.h:136
 AliHLTConfiguration.h:137
 AliHLTConfiguration.h:138
 AliHLTConfiguration.h:139
 AliHLTConfiguration.h:140
 AliHLTConfiguration.h:141
 AliHLTConfiguration.h:142
 AliHLTConfiguration.h:143
 AliHLTConfiguration.h:144
 AliHLTConfiguration.h:145
 AliHLTConfiguration.h:146
 AliHLTConfiguration.h:147
 AliHLTConfiguration.h:148
 AliHLTConfiguration.h:149
 AliHLTConfiguration.h:150
 AliHLTConfiguration.h:151
 AliHLTConfiguration.h:152
 AliHLTConfiguration.h:153
 AliHLTConfiguration.h:154
 AliHLTConfiguration.h:155
 AliHLTConfiguration.h:156
 AliHLTConfiguration.h:157
 AliHLTConfiguration.h:158
 AliHLTConfiguration.h:159
 AliHLTConfiguration.h:160
 AliHLTConfiguration.h:161
 AliHLTConfiguration.h:162
 AliHLTConfiguration.h:163
 AliHLTConfiguration.h:164
 AliHLTConfiguration.h:165
 AliHLTConfiguration.h:166
 AliHLTConfiguration.h:167
 AliHLTConfiguration.h:168
 AliHLTConfiguration.h:169
 AliHLTConfiguration.h:170
 AliHLTConfiguration.h:171
 AliHLTConfiguration.h:172
 AliHLTConfiguration.h:173
 AliHLTConfiguration.h:174
 AliHLTConfiguration.h:175
 AliHLTConfiguration.h:176
 AliHLTConfiguration.h:177
 AliHLTConfiguration.h:178
 AliHLTConfiguration.h:179
 AliHLTConfiguration.h:180
 AliHLTConfiguration.h:181
 AliHLTConfiguration.h:182
 AliHLTConfiguration.h:183
 AliHLTConfiguration.h:184
 AliHLTConfiguration.h:185
 AliHLTConfiguration.h:186
 AliHLTConfiguration.h:187
 AliHLTConfiguration.h:188
 AliHLTConfiguration.h:189
 AliHLTConfiguration.h:190
 AliHLTConfiguration.h:191
 AliHLTConfiguration.h:192
 AliHLTConfiguration.h:193
 AliHLTConfiguration.h:194
 AliHLTConfiguration.h:195
 AliHLTConfiguration.h:196
 AliHLTConfiguration.h:197
 AliHLTConfiguration.h:198
 AliHLTConfiguration.h:199
 AliHLTConfiguration.h:200
 AliHLTConfiguration.h:201
 AliHLTConfiguration.h:202
 AliHLTConfiguration.h:203
 AliHLTConfiguration.h:204
 AliHLTConfiguration.h:205
 AliHLTConfiguration.h:206
 AliHLTConfiguration.h:207
 AliHLTConfiguration.h:208
 AliHLTConfiguration.h:209
 AliHLTConfiguration.h:210
 AliHLTConfiguration.h:211
 AliHLTConfiguration.h:212
 AliHLTConfiguration.h:213
 AliHLTConfiguration.h:214
 AliHLTConfiguration.h:215
 AliHLTConfiguration.h:216
 AliHLTConfiguration.h:217
 AliHLTConfiguration.h:218
 AliHLTConfiguration.h:219
 AliHLTConfiguration.h:220
 AliHLTConfiguration.h:221
 AliHLTConfiguration.h:222
 AliHLTConfiguration.h:223
 AliHLTConfiguration.h:224
 AliHLTConfiguration.h:225
 AliHLTConfiguration.h:226
 AliHLTConfiguration.h:227
 AliHLTConfiguration.h:228
 AliHLTConfiguration.h:229
 AliHLTConfiguration.h:230
 AliHLTConfiguration.h:231
 AliHLTConfiguration.h:232
 AliHLTConfiguration.h:233
 AliHLTConfiguration.h:234
 AliHLTConfiguration.h:235
 AliHLTConfiguration.h:236
 AliHLTConfiguration.h:237
 AliHLTConfiguration.h:238
 AliHLTConfiguration.h:239
 AliHLTConfiguration.h:240
 AliHLTConfiguration.h:241
 AliHLTConfiguration.h:242
 AliHLTConfiguration.h:243
 AliHLTConfiguration.h:244
 AliHLTConfiguration.h:245
 AliHLTConfiguration.h:246
 AliHLTConfiguration.h:247
 AliHLTConfiguration.h:248
 AliHLTConfiguration.h:249
 AliHLTConfiguration.h:250
 AliHLTConfiguration.h:251
 AliHLTConfiguration.h:252
 AliHLTConfiguration.h:253
 AliHLTConfiguration.h:254
 AliHLTConfiguration.h:255
 AliHLTConfiguration.h:256
 AliHLTConfiguration.h:257
 AliHLTConfiguration.h:258
 AliHLTConfiguration.h:259
 AliHLTConfiguration.h:260
 AliHLTConfiguration.h:261
 AliHLTConfiguration.h:262
 AliHLTConfiguration.h:263
 AliHLTConfiguration.h:264
 AliHLTConfiguration.h:265
 AliHLTConfiguration.h:266
 AliHLTConfiguration.h:267
 AliHLTConfiguration.h:268
 AliHLTConfiguration.h:269
 AliHLTConfiguration.h:270
 AliHLTConfiguration.h:271