OGoProject
==========

  This library wraps project commands and associated functionality. It provides
  a datasource to fetch project 'documents'. Note that the document object
  representing the project itself is termed 'SkyProject' while the
  'SkyProjectDocument' is a document (BLOB) stored inside the project document
  storage.

  Note: do not mix up the project *type* (like common, private, archived) with
        the project *kind*. The first is a derived attribute while the second
        is a field stored in the database to identify 'special' projects.
        
        A 'regular' OGo database does not fill the 'kind' field.
        
        Note that a project also has a field 'isFake' which is for projects
        attached to a company record. Fake projects are not shown in the
        project desktop.

Defaults
========

  SkyProjectFileManagerErrorLogEnabled - BOOL
  SkyProjectFileManagerAbortOnErrors   - BOOL
  SkyProjectFileManagerUseSessionCache - BOOL
  SkyProjectFileManagerFlushTimeout    - seconds
  SkyProjectFileManagerClickTimeout    - seconds
  
  SkyProjectFileManager_show_unknown_files  - BOOL

  SkyProjectDocumentDebug              - BOOL

  hiddenprojectkinds - array of strings

Supported Default-Attributes on Documents:
==========================================

  NSFileType
    Folder-Dokumente     -> NSFileTypeDirectory
    ObjectLink-Dokumente -> NSFileTypeSymbolicLink
    Dokumente            -> NSFileTypeRegular

  NSFileSize
  
  NSFileAccountNumber    -> Primary-Key of 'current-owner'
  NSFileOwnerAccountName -> 'login' of 'current-owner'
  NSFileModificationDate, SkyLastModifiedDate
  
  SkyFirstOwnerId        -> Global-Id of 'first-owner'
  SkyOwnerId             -> Global-Id of 'current-owner'
  
  SkyIsRootDirectory [bool]
  SkyTitle
  SkyCreationDate
  SkyStatus
  SkyVersionCount


Classes
=======
  <NSObject>
    NGFileManagerProcessingTool
      NGFileManagerCopyTool
    NGFileManagerCopyToolHandler
    OGoFileManagerFactory
    NSFileManagerBlobHandler      <SkyBlobHandler> 
    NSEmptyFileManagerBlobHandler <SkyBlobHandler>
    <SkyDocument>
      SkyProject
      SkyProjectHistoryDocument
    <SkyDocumentType>
      SkyProjectDocType
    <SkyAccessHandler>
      SkyProjectAccessHandler
    <EODataSource>
      SkyProjectDataSource
      SkyProjectTeamDataSource
    SkyProjectDocumentGlobalIDResolver
    <NSURLHandle>
      SkyProjectURLHandle

Categories
==========
  NSString(XMLNamespaces)


SkyProjectFileManager Cache Config (TODO: translate to English)
==================================
JR:

Defaults fuer die SkyProjectFileManager Cache Verwaltung

Nach jeder Schreiboperation oder wenn ein Fehler aufgetreten ist, wird 
der Cache geleert.

+ SkyProjectFileManagerUseSessionCache (BOOL YES/NO Default YES)

Wenn diese Option gesetzt ist, wird der Cache mit dem Cache des 
Commandcontextes syncronisiert. D.h. jedesmal wenn der Commandcontextcache 
geleert wird, wird auch der Filemanagercache gegeleert. 
Der Commandcontextcache wird bei einer Webapplikation nach jedem Request 
geleert.
Das heist, dass pro Request alle FileManagerdaten _einmal_ komplett gefetcht 
werden.
Das hat zwar einen gewissen Overhead, aber Inkonsistenzen werden dadurch 
weitestgehend vermieden.

Falls SkyProjectFileManagerUseSessionCache auf NO gesetzt ist, werden die 
folgenden Defaults ausgewertet.

+ SkyProjectFileManagerFlushTimeout (int Default 0)

Alle n Sekunden wird der Cache geleert.

+ SkyProjectFileManagerClickTimeout (int Default 0)

Alle n Sekunden nach der letzten Akitvitaet (LSWSessionAwake/Sleep 
Notification) wird der Cache geleert.

+ SkyProjectFileManagerCacheTimeout (int Default 0)

n Sekunden nachdem der letzte FileManager released wurde, wird der Cache 
geleert.
(Pro Projekt gibt es instanzweit einen FileManagerCache auf dem die 
 entsprechenden Filemanager zugreifen)

+ MaxInQualifierCount

 Max number of entries in 'IN'-Qualifier


Basic Example
=============
(pasted from sample.m, by JR)

    self->fm =
      [[SkyProjectFileManager alloc]
                              initWithContext:[[self session] commandContext]
                              projectGlobalID:[project globalID]];
    NSLog(@"filemanager: %@", fm);
    NSLog(@" dir-contents at '/': %@", [fm directoryContentsAtPath:@"/"]);
    NSLog(@" dir-contents at '.': %@", [fm directoryContentsAtPath:@"."]);
    NSLog(@" dir-contents at '/types': %@",
          [fm directoryContentsAtPath:@"/types"]);
    NSLog(@" attrs at '/types': %@",
          [fm fileAttributesAtPath:@"/types" traverseLink:NO]);
    
    NSLog(@" contents at '/types/text.txt': %@",
          [[NSString alloc] initWithData:[fm contentsAtPath:@"/types/text.txt"]
                            encoding:[NSString defaultCStringEncoding]]);
    NSLog(@" attrs at '/types/text.txt': %@",
          [fm fileAttributesAtPath:@"/types/text.txt" traverseLink:NO]);
    NSLog(@" fs-attrs at '/types/text.txt': %@",
          [fm fileSystemAttributesAtPath:@"/types/text.txt"]);
    {
      // new link
      NSString *path;
      
      path = [NSString stringWithFormat:@"%d", (unsigned)time(NULL)];

#if 0
      if (![fm createSymbolicLinkAtPath:path pathContent:@"/types/text.txt"]) {
        NSLog(@"couldn't create link '%@'", path);
      }
#endif
#if 0
      if (![fm createDirectoryAtPath:path attributes:nil]) {
        NSLog(@"couldn't create directory '%@'", path);
      }
#endif
