Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

baby steps

  • Loading branch information...
commit 0e1a72f0ab396d088c7c1ebbe8037f0fa665e1bd 1 parent 3202687
billy authored

Showing 55 changed files with 16,263 additions and 0 deletions. Show diff stats Hide diff stats

  1. +12 0 components/IDocument.cfc
  2. +9 0 doc/ build_doc.cfm
  3. +436 0 doc/ColdDoc.cfc
  4. +20 0 doc/ColdDoc.cfc.diff
  5. +76 0 doc/UseCase.cfc
  6. BIN  doc/api-uml.zargo
  7. BIN  doc/api-uml.zargo~
  8. +85 0 doc/api/allclasses-frame.html
  9. +289 0 doc/api/cfmongodb/Mongo.html
  10. +353 0 doc/api/cfmongodb/components/-.html
  11. +293 0 doc/api/cfmongodb/components/Collection.html
  12. +303 0 doc/api/cfmongodb/components/Database.html
  13. +367 0 doc/api/cfmongodb/components/Document.html
  14. +1,088 0 doc/api/cfmongodb/components/ExpressionBuilder.html
  15. +1,497 0 doc/api/cfmongodb/components/MongoDB.html
  16. +54 0 doc/api/cfmongodb/components/package-frame.html
  17. +223 0 doc/api/cfmongodb/components/package-summary.html
  18. +1,021 0 doc/api/cfmongodb/doc/ColdDoc.html
  19. +39 0 doc/api/cfmongodb/doc/package-frame.html
  20. +169 0 doc/api/cfmongodb/doc/package-summary.html
  21. +777 0 doc/api/cfmongodb/javaloader/JavaLoader.html
  22. +1,167 0 doc/api/cfmongodb/javaloader/JavaProxy.html
  23. +42 0 doc/api/cfmongodb/javaloader/package-frame.html
  24. +179 0 doc/api/cfmongodb/javaloader/package-summary.html
  25. +39 0 doc/api/cfmongodb/package-frame.html
  26. +169 0 doc/api/cfmongodb/package-summary.html
  27. +752 0 doc/api/cfmongodb/test/BaseTest.html
  28. +793 0 doc/api/cfmongodb/test/DatabaseTest.html
  29. +831 0 doc/api/cfmongodb/test/DocumentTest.html
  30. +1,052 0 doc/api/cfmongodb/test/MongoDBTest.html
  31. +823 0 doc/api/cfmongodb/test/MongoSmokeTest.html
  32. +1,269 0 doc/api/cfmongodb/test/SearchMongoTest.html
  33. +367 0 doc/api/cfmongodb/test/SomeDoc.html
  34. +57 0 doc/api/cfmongodb/test/package-frame.html
  35. +227 0 doc/api/cfmongodb/test/package-summary.html
  36. +42 0 doc/api/index.html
  37. +66 0 doc/api/overview-frame.html
  38. +178 0 doc/api/overview-summary.html
  39. BIN  doc/api/resources/inherit.gif
  40. +29 0 doc/api/stylesheet.css
  41. +39 0 doc/resources/static/index.html
  42. BIN  doc/resources/static/resources/inherit.gif
  43. +29 0 doc/resources/static/stylesheet.css
  44. +35 0 doc/resources/templates/allclasses-frame.html
  45. +548 0 doc/resources/templates/class.html
  46. +65 0 doc/resources/templates/inc/nav.html
  47. +40 0 doc/resources/templates/index.html
  48. +52 0 doc/resources/templates/overview-frame.html
  49. +70 0 doc/resources/templates/overview-summary.html
  50. +37 0 doc/resources/templates/package-frame.html
  51. +75 0 doc/resources/templates/package-summary.html
  52. +13 0 doc/run.cfm
  53. +9 0 test/DatabaseTest.cfc
  54. +36 0 test/DocumentTest.cfc
  55. +22 0 test/SomeDoc.cfc
12 components/IDocument.cfc
... ... @@ -0,0 +1,12 @@
  1 +<cfinterface displayName="IDocument" hint="All MongoDB Documents should implement this interface. Basic ColdFusion structures can also be saved to the datastore. But from an OO design perspective, it's a good practice to implement this interface">
  2 +
  3 +<cffunction name="setCollection" hint="Sets the collection to which this Document instance belongs. This should be called prior to any other operations. If not, the default Collection, if any, will be the container for this Document."></cffunction>
  4 +
  5 +<cffunction name="save" hint="Commits this Document instance to the datastore and returns an ID" returntype="String"></cffunction>
  6 +
  7 +<cffunction name="update" hint="Performs in-place updating - Instead of retrieving and updating every item within a document, this method is more efficient, allowing for 'Cherry Picking' of specific data elements to update. ">
  8 + <cfargument name="field">
  9 +<cfargument name="value">
  10 +</cffunction>
  11 +
  12 +</cfinterface>
9 doc/ build_doc.cfm
... ... @@ -0,0 +1,9 @@
  1 +<cfscript>
  2 +g = createObject('component','ColdDoc').init();
  3 +//src = '/home/billy/software/railo/webroot/cfmongodb/';
  4 +src = expandPath("/cfmongodb");
  5 +//out = "/home/billy/software/railo-3.1.1.000-railo-express-with-jre-linux/webroot/cfmongodb/doc/api";
  6 +out = expandPath("/cfmongodb/doc/api");
  7 +g.generate(src,out,'cfmongodb' , 'CFMongoDB API');
  8 +</cfscript>
  9 +<a href="api/">View results</a>
436 doc/ColdDoc.cfc
... ... @@ -0,0 +1,436 @@
  1 +<cfcomponent hint="generates html file cfc docs" output="false">
  2 +
  3 +<!------------------------------------------- PUBLIC ------------------------------------------->
  4 +
  5 +<cffunction name="init" hint="Constructor" access="public" returntype="ColdDoc" output="false">
  6 + <cfscript>
  7 + variables.instance = {};
  8 +
  9 + return this;
  10 + </cfscript>
  11 +</cffunction>
  12 +
  13 +<cffunction name="generate" hint="generates the docs" access="public" returntype="void" output="true">
  14 + <cfargument name="inputSource" hint="either, the string directory source, OR an array of structs containing inputDir and inputMapping key" type="any" required="yes">
  15 + <cfargument name="outputDir" hint="the output directory" type="string" required="Yes">
  16 + <cfargument name="inputMapping" hint="the base mapping for the folder" type="string" required="false" default="">
  17 + <cfargument name="projectTitle" hint="the title of the project" type="string" required="No" default="Untitled">
  18 + <cfscript>
  19 + var basePath = getDirectoryFromPath(getMetaData(this).path);
  20 + var args = 0;
  21 + var qMetaData = 0;
  22 + var source = 0;
  23 +
  24 + if(isSimpleValue(arguments.inputSource))
  25 + {
  26 + source = [{ inputDir=arguments.inputSource, inputMapping=arguments.inputMapping }];
  27 + }
  28 + else
  29 + {
  30 + source = arguments.inputSource; // buildMetaDataCollection( ) needs array of structs
  31 + }
  32 +
  33 +
  34 + qMetaData = buildMetaDataCollection( source );
  35 + //dump(qMetaData);
  36 +
  37 + recursiveCopy(basePath & "resources/static", arguments.outputDir);
  38 +
  39 + //write the index template
  40 + args = {path=arguments.outputDir & "/index.html", template="index.html", projectTitle=arguments.projectTitle};
  41 + writeTemplate(argumentCollection=args);
  42 +
  43 + writeOverviewSummaryAndFrame(arguments.outputDir, arguments.projectTitle, qMetaData);
  44 +
  45 + writeAllClassesFrame(arguments.outputDir, qMetaData);
  46 +
  47 +
  48 + writePackagePages(arguments.outputDir, arguments.projectTitle, qMetaData);
  49 + </cfscript>
  50 +</cffunction>
  51 +
  52 +<!------------------------------------------- PACKAGE ------------------------------------------->
  53 +
  54 +<!------------------------------------------- PRIVATE ------------------------------------------->
  55 +
  56 +<cffunction name="writePackagePages" hint="writes the package summaries" access="private" returntype="void" output="false">
  57 + <cfargument name="outputDir" hint="the output directory" type="string" required="Yes">
  58 + <cfargument name="projectTitle" hint="the title of the project" type="string" required="yes">
  59 + <cfargument name="qMetadata" hint="the meta data query" type="query" required="Yes">
  60 + <cfscript>
  61 + var currentDir = 0;
  62 + var qPackage = 0;
  63 + </cfscript>
  64 +
  65 + <cfoutput query="arguments.qMetaData" group="package">
  66 + <cfscript>
  67 + currentDir = arguments.outputDir & "/" & replace(package, ".", "/", "all");
  68 + ensureDirectory(currentDir);
  69 + qPackage = getMetaSubquery(arguments.qMetaData, "package = '#package#'", "name asc");
  70 +
  71 + writeTemplate(path=currentDir & "/package-summary.html",
  72 + template="package-summary.html",
  73 + projectTitle = arguments.projectTitle,
  74 + package = package,
  75 + qPackage = qPackage);
  76 +
  77 + writeTemplate(path=currentDir & "/package-frame.html",
  78 + template="package-frame.html",
  79 + projectTitle = arguments.projectTitle,
  80 + package = package,
  81 + qPackage = qPackage);
  82 +
  83 +
  84 + buildClassPages(arguments.outputDir,
  85 + arguments.projectTitle,
  86 + qPackage,
  87 + arguments.qMetadata
  88 + );
  89 + </cfscript>
  90 + </cfoutput>
  91 +</cffunction>
  92 +
  93 +<cffunction name="buildClassPages" hint="builds the class pages" access="private" returntype="void" output="false">
  94 + <cfargument name="outputDir" hint="the output directory" type="string" required="Yes">
  95 + <cfargument name="projectTitle" hint="the title of the project" type="string" required="yes">
  96 + <cfargument name="qPackage" hint="the query for a specific package" type="query" required="Yes">
  97 + <cfargument name="qMetadata" hint="the meta data query" type="query" required="Yes">
  98 + <cfscript>
  99 + var qSubClass = 0;
  100 + var currentDir = 0;
  101 + </cfscript>
  102 + <cfloop query="arguments.qPackage">
  103 + <cfscript>
  104 + currentDir = arguments.outputDir & "/" & replace(package, ".", "/", "all");
  105 + qSubClass = getMetaSubquery(arguments.qMetaData, "extends = '#package#.#name#'", "package asc, name asc");
  106 +
  107 + writeTemplate(path=currentDir & "/#name#.html",
  108 + template="class.html",
  109 + projectTitle = arguments.projectTitle,
  110 + package = package,
  111 + name = name,
  112 + qSubClass = qSubClass,
  113 + qMetadata = qMetaData,
  114 + metadata = metadata
  115 + );
  116 + </cfscript>
  117 + </cfloop>
  118 +</cffunction>
  119 +
  120 +<cffunction name="writeOverviewSummaryAndFrame" hint="writes the overview-summary.html" access="private" returntype="void" output="false">
  121 + <cfargument name="outputDir" hint="the output directory" type="string" required="Yes">
  122 + <cfargument name="projectTitle" hint="the title of the project" type="string" required="yes">
  123 + <cfargument name="qMetadata" hint="the meta data query" type="query" required="Yes">
  124 + <cfscript>
  125 + var qPackages = 0;
  126 + </cfscript>
  127 + <cfquery name="qPackages" dbtype="query" debug="false">
  128 + SELECT DISTINCT
  129 + package
  130 + FROM
  131 + arguments.qMetaData
  132 + ORDER BY
  133 + package
  134 + </cfquery>
  135 +
  136 + <cfscript>
  137 + writeTemplate(path=arguments.outputDir & "/overview-summary.html",
  138 + template="overview-summary.html",
  139 + projectTitle = arguments.projectTitle,
  140 + qPackages = qPackages);
  141 +
  142 +
  143 + //overview frame
  144 + writeTemplate(path=arguments.outputDir & "/overview-frame.html",
  145 + template="overview-frame.html",
  146 + projectTitle=arguments.projectTitle,
  147 + qPackages = qPackages);
  148 + </cfscript>
  149 +
  150 +</cffunction>
  151 +
  152 +
  153 +
  154 +<cffunction name="writeAllClassesFrame" hint="writes the allclasses-frame.html" access="private" returntype="void" output="false">
  155 + <cfargument name="outputDir" hint="the output directory" type="string" required="Yes">
  156 + <cfargument name="qMetadata" hint="the meta data query" type="query" required="Yes">
  157 + <cfscript>
  158 + arguments.qMetadata = getMetaSubquery(query=arguments.qMetaData, orderby="name asc");
  159 +
  160 + writeTemplate(path=arguments.outputDir & "/allclasses-frame.html",
  161 + template="allclasses-frame.html",
  162 + qMetaData = arguments.qMetaData);
  163 + </cfscript>
  164 +
  165 +</cffunction>
  166 +
  167 +<cffunction name="getMetaSubQuery" hint="returns a query on the meta query" access="private" returntype="query" output="false">
  168 + <cfargument name="query" hint="the meta data query" type="query" required="Yes">
  169 + <cfargument name="where" hint="the where string" type="string" required="false">
  170 + <cfargument name="orderby" hint="the order by string" type="string" required="false">
  171 + <cfset qSub = 0 />
  172 + <cfquery name="qSub" dbtype="query" debug="false">
  173 + SELECT *
  174 + from
  175 + arguments.query
  176 + <cfif StructKeyExists(arguments, "where")>
  177 + WHERE
  178 + #PreserveSingleQuotes(arguments.where)#
  179 + </cfif>
  180 + <cfif StructKeyExists(arguments, "orderby")>
  181 + ORDER BY
  182 + #arguments.orderby#
  183 + </cfif>
  184 + </cfquery>
  185 + <cfreturn qSub />
  186 +</cffunction>
  187 +
  188 +<cffunction name="buildMetaDataCollection" hint="builds the searchable meta data collection" access="private" returntype="query" output="true">
  189 + <cfargument name="inputSource" hint="an array of structs containing inputDir and inputMapping" type="array" required="yes"> <!--- of struct --->
  190 +
  191 + <cfscript>
  192 + var qFile = 0;
  193 + var qMetaData = QueryNew("package,name,extends,metadata");
  194 + var cfcPath = 0;
  195 + var packagePath = 0;
  196 + var cfcName = 0;
  197 + var meta = 0;
  198 + var i = 0;
  199 + </cfscript>
  200 +
  201 + <cfloop index="i" from="1" to="#ArrayLen(arguments.inputSource)#">
  202 +
  203 + <cfdirectory action="list" directory="#arguments.inputSource[i].inputDir#" recurse="true" name="qFiles" filter="*.cfc">
  204 +
  205 + <cfloop query="qFiles">
  206 + <cfif qFiles.type == 'File'>
  207 + <cfscript>
  208 + currentPath = replace(directory, arguments.inputSource[i].inputDir, "");
  209 + currentPath = reReplace(currentPath, "[/\\]", "");
  210 + currentPath = reReplace(currentPath, "[/\\]", ".", "all");
  211 + //dump(currentPath);
  212 +/*
  213 + if(len(arguments.inputSource[i].inputMapping))
  214 + {
  215 + packagePath = arguments.inputSource[i].inputMapping;
  216 + // packagePath = ListAppend(arguments.inputSource[i].inputMapping, currentPath, ".");
  217 + }
  218 + else
  219 + {
  220 + //packagePath = arguments.inputSource[i].inputMapping;
  221 + packagePath = ListAppend(arguments.inputSource[i].inputMapping, currentPath, ".");
  222 + }
  223 +*/
  224 +
  225 + if(len(currentPath)) //always going to evaluate to true?
  226 + {
  227 + packagePath = ListAppend(arguments.inputSource[i].inputMapping, currentPath, ".");
  228 + dump(packagePath);
  229 + }
  230 + else
  231 + {
  232 + packagePath = arguments.inputSource[i].inputMapping;
  233 + }
  234 +
  235 + cfcName = ListGetAt(name, 1, ".");
  236 +
  237 + try
  238 + {
  239 + if (Len(packagePath)) {
  240 + meta = getComponentMetaData(packagePath & "." & cfcName);
  241 + }
  242 + else {
  243 + meta = getComponentMetaData(cfcName);
  244 + }
  245 +
  246 + QueryAddRow(qMetaData);
  247 + QuerySetCell(qMetaData, "package", packagePath);
  248 + QuerySetCell(qMetaData, "name", cfcName);
  249 + QuerySetCell(qMetaData, "metadata", meta);
  250 +
  251 + //so we cane easily query direct desendents
  252 + if(StructKeyExists(meta, "extends"))
  253 + {
  254 + QuerySetCell(qMetaData, "extends", meta.extends.name);
  255 + }
  256 + else
  257 + {
  258 + QuerySetCell(qMetaData, "name", "-");
  259 + }
  260 +
  261 + }
  262 + catch(Any exc)
  263 + {
  264 + warnError(packagePath & "." & cfcName, exc);
  265 + }
  266 +
  267 + </cfscript>
  268 + </cfif>
  269 + </cfloop>
  270 +
  271 + </cfloop>
  272 +
  273 + <cfreturn qMetaData />
  274 +</cffunction>
  275 +
  276 +<cffunction name="warnError" hint="Warn the user that there was an error through cftrace" access="private" returntype="void" output="false">
  277 + <cfargument name="cfcName" hint="the name of the cfc" type="string" required="Yes">
  278 + <cfargument name="error" hint="the error struct" type="any" required="Yes">
  279 + <cfset var dump = 0 />
  280 + <!---<cfsavecontent variable="dump">
  281 + <cfdump var="#arguments.error#" >
  282 + </cfsavecontent>--->
  283 + <cftrace category="ColdDoc" inline="true" type="Warning" text="Warning, the following script has errors: #arguments.cfcName#, Type:#toString(arguments.error)#, Message: #arguments.error.message# ">
  284 +</cffunction>
  285 +
  286 +<cffunction name="safeFunctionMeta" hint="sets default values" access="private" returntype="any" output="false">
  287 + <cfargument name="func" hint="the function meta" type="any" required="Yes">
  288 + <cfargument name="metadata" hint="the original meta data" type="struct" required="Yes">
  289 + <cfscript>
  290 + var local = {};
  291 +
  292 + if(NOT StructKeyExists(arguments.func, "returntype"))
  293 + {
  294 + arguments.func.returntype = "any";
  295 + }
  296 +
  297 + if(NOT StructKeyExists(arguments.func, "access"))
  298 + {
  299 + arguments.func.access = "public";
  300 + }
  301 +
  302 + //move the cfproperty hints onto functions
  303 + if(StructKeyExists(arguments.metadata, "properties"))
  304 + {
  305 + if(Lcase(arguments.func.name).startsWith("get") AND NOT StructKeyExists(arguments.func, "hint"))
  306 + {
  307 + local.name = replaceNoCase(arguments.func.name, "get", "");
  308 + local.property = getPropertyMeta(local.name, arguments.metadata.properties);
  309 +
  310 + if(structKeyExists(local.property, "hint"))
  311 + {
  312 + arguments.func.hint = "get: " & local.property.hint;
  313 + }
  314 +
  315 + }
  316 + else if(LCase(arguments.func.name).startsWith("set") AND NOT StructKeyExists(arguments.func, "hint"))
  317 + {
  318 + local.name = replaceNoCase(arguments.func.name, "set", "");
  319 + local.property = getPropertyMeta(local.name, arguments.metadata.properties);
  320 +
  321 + if(structKeyExists(local.property, "hint"))
  322 + {
  323 + arguments.func.hint = "set: " & local.property.hint;
  324 + }
  325 + }
  326 + }
  327 +
  328 + return arguments.func;
  329 + </cfscript>
  330 +</cffunction>
  331 +
  332 +<cffunction name="getPropertyMeta" hint="returns the property meta by a given name" access="private" returntype="struct" output="false">
  333 + <cfargument name="name" hint="the name of the property" type="string" required="Yes">
  334 + <cfargument name="properties" hint="the property meta" type="array" required="Yes">
  335 + <cfscript>
  336 + var local = {};
  337 + </cfscript>
  338 + <cfloop array="#arguments.properties#" index="local.property">
  339 + <cfif local.property.name eq arguments.name>
  340 + <cfreturn local.property />
  341 + </cfif>
  342 + </cfloop>
  343 + <cfreturn StructNew() />
  344 +</cffunction>
  345 +
  346 +<cffunction name="safeParamMeta" hint="sets default values" access="private" returntype="any" output="false">
  347 + <cfargument name="param" hint="the param meta" type="any" required="Yes">
  348 + <cfscript>
  349 + if(NOT StructKeyExists(arguments.param, "type"))
  350 + {
  351 + arguments.param.type = "any";
  352 + }
  353 +
  354 + return arguments.param;
  355 + </cfscript>
  356 +</cffunction>
  357 +
  358 +<cffunction name="writeTemplate" hint="builds a template" access="private" returntype="void" output="false">
  359 + <cfargument name="path" hint="where to write the template" type="string" required="Yes">
  360 + <cfargument name="template" hint="the tempalte to write out" type="string" required="Yes">
  361 + <cfscript>
  362 + var html = 0;
  363 + var local = {}; //for local variables
  364 + </cfscript>
  365 + <cfsavecontent variable="html">
  366 + <cfinclude template="resources/templates/#arguments.template#">
  367 + </cfsavecontent>
  368 + <cfscript>
  369 + fileWrite(arguments.path, html);
  370 + </cfscript>
  371 +</cffunction>
  372 +
  373 +<cffunction name="recursiveCopy" hint="does a recursive copy from one dir to another" access="private" returntype="void" output="false">
  374 + <cfargument name="fromDir" hint="the input directory" type="string" required="Yes">
  375 + <cfargument name="toDir" hint="the output directory" type="string" required="Yes">
  376 + <cfscript>
  377 + var files = 0;
  378 + var currentDir = "";
  379 + var safeDir = "";
  380 +
  381 + arguments.fromDir = replaceNoCase(arguments.fromDir, "\", "/", "all");
  382 + arguments.toDir = replaceNoCase(arguments.toDir, "\", "/", "all");
  383 + </cfscript>
  384 + <cfdirectory action="list" directory="#arguments.fromDir#" recurse="true" name="qFiles">
  385 +
  386 + <cfoutput group="directory" query="qFiles">
  387 +
  388 + <cfset safeDir = replaceNoCase(directory, "\", "/", "all") />
  389 +
  390 + <!--- dodge svn directories --->
  391 + <cfif NOT FindNoCase("/.", directory)>
  392 + <cfscript>
  393 + currentDir = arguments.toDir & replaceNoCase(safeDir & "/", arguments.fromDir, "");
  394 + ensureDirectory(currentDir);
  395 + </cfscript>
  396 + <cfoutput>
  397 + <cfscript>
  398 + if(type neq "dir")
  399 + {
  400 + fileCopy(directory & "/" & name, currentDir & name);
  401 + }
  402 + </cfscript>
  403 + </cfoutput>
  404 + </cfif>
  405 + </cfoutput>
  406 +</cffunction>
  407 +
  408 +<cffunction name="ensureDirectory" hint="if a directory doesn't exist, create it" access="private" returntype="void" output="false">
  409 + <cfargument name="path" hint="" type="string" required="Yes">
  410 + <cfif NOT directoryExists(arguments.path)>
  411 + <cfdirectory action="create" directory="#arguments.path#">
  412 + </cfif>
  413 +</cffunction>
  414 +
  415 +
  416 +<cffunction name="_trace">
  417 + <cfargument name="s">
  418 + <cfset var g = "">
  419 + <cfsetting showdebugoutput="true">
  420 + <cfsavecontent variable="g">
  421 + <cfdump var="#arguments.s#">
  422 + </cfsavecontent>
  423 + <cftrace text="#g#">
  424 +</cffunction>
  425 +
  426 +<cffunction name="_dump">
  427 + <cfargument name="s">
  428 + <cfargument name="abort" default="true">
  429 + <cfset var g = "">
  430 + <cfdump var="#arguments.s#">
  431 + <cfif arguments.abort>
  432 + <cfabort>
  433 + </cfif>
  434 +</cffunction>
  435 +
  436 +</cfcomponent>
20 doc/ColdDoc.cfc.diff
... ... @@ -0,0 +1,20 @@
  1 +7a8
  2 +>
  3 +192c193
  4 +< if(len(inputMapping))
  5 +---
  6 +> if(len(currentPath))
  7 +194,195c195
  8 +< packagePath = arguments.inputMapping;
  9 +<
  10 +---
  11 +> packagePath = ListAppend(arguments.inputMapping, currentPath, ".");
  12 +199c199
  13 +< packagePath = ListAppend(arguments.inputMapping, currentPath, ".");
  14 +---
  15 +> packagePath = arguments.inputMapping;
  16 +333c333
  17 +< </cfcomponent>
  18 +---
  19 +> </cfcomponent>
  20 +\ No newline at end of file
76 doc/UseCase.cfc
... ... @@ -0,0 +1,76 @@
  1 +<cfcomponent output="false">
  2 +<cfscript>
  3 +/*-------------------------------------------------------------------------------------
  4 +
  5 + Create document
  6 + meta data to include strings and dates
  7 + child objects to include other documents and binary data such as images, mp3, video
  8 + Update Document
  9 + Fetch Document
  10 + Delete Document
  11 +
  12 + Search Collection
  13 + Query Database for info about collections ( how many documents )
  14 + Current database
  15 + Current collection
  16 + Port
  17 + Server
  18 +
  19 + List of Collection names in DB
  20 + List of Indexes in Collection
  21 + Number of Documents in Collection
  22 +
  23 +
  24 +
  25 +
  26 +-------------------------------------------------------------------------------------*/
  27 +
  28 + //make sure there's potential for dependency injection for testing
  29 +
  30 + doc = mongo.new_doc(collection='blog');
  31 + doc.title = 'asd';
  32 + doc.body = 'asd';
  33 + doc.tags = ['java','python'];
  34 + doc.mp3 = [binary];
  35 + doc.ensureIndex( list='title,id' );
  36 + id = doc.save(); //create new ... ot create new OR update all
  37 +
  38 + doc = mongo.fetch(id);
  39 + doc.update( 'body' , 'new value' ); //done
  40 + OR
  41 + doc.body = 'new value'
  42 + doc.update(); //can it know what to update and do it intelligently? or could doc.update(); update everything vs. in place?
  43 +
  44 +
  45 +Another option would be to implement IMongoDocument instead of using mongo.new_document():
  46 +
  47 +doc = new MyDocument(); //implements IMongoDocument or inherits from MongoDocument which implements IMongoDocument
  48 +doc.title = 'asd';
  49 +doc.body = 'asd';
  50 +...
  51 +doc.ensureIndex( list='title,id' );
  52 +id = doc.save(); //interface
  53 +
  54 +
  55 +
  56 + //Updates
  57 +
  58 + doc = mongo.collection('blog').$eq('id', '123456789').fetch(); //get's one
  59 + //update comments
  60 + doc.push('array_item', value);
  61 + doc.update('title','new title');
  62 +
  63 +
  64 + results = mongo.collection('blog').startsWith('name','foo').
  65 + endsWith('title','bar').
  66 + exists('field','value').
  67 + regex('field','value').
  68 + before('field', 'value').search( limit=100 );
  69 +
  70 +
  71 + for( item in results ){
  72 + mongo.print( item.title );
  73 + }
  74 +
  75 +</cfscript>
  76 +</cfcomponent>
BIN  doc/api-uml.zargo
Binary file not shown
BIN  doc/api-uml.zargo~
Binary file not shown
85 doc/api/allclasses-frame.html
... ... @@ -0,0 +1,85 @@
  1 +
  2 +
  3 +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4 +<!--NewPage-->
  5 +<HTML>
  6 +<HEAD>
  7 +<!-- Generated by colddoc on {ts '2009-12-12 16:22:53'} -->
  8 +<TITLE>
  9 +All Classes
  10 +</TITLE>
  11 +
  12 +<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
  13 +
  14 +</HEAD>
  15 +
  16 +<BODY BGCOLOR="white">
  17 +<FONT size="+1" CLASS="FrameHeadingFont">
  18 +<B>All Classes</B></FONT>
  19 +
  20 +<BR>
  21 +
  22 +<TABLE BORDER="0" WIDTH="100%" SUMMARY="">
  23 +<TR>
  24 +<TD NOWRAP><FONT CLASS="FrameItemFont">
  25 +
  26 +<A HREF="cfmongodb/components/-.html" title="class in cfmongodb.components" target="classFrame">-</A>
  27 +<BR>
  28 +
  29 +<A HREF="cfmongodb/test/BaseTest.html" title="class in cfmongodb.test" target="classFrame">BaseTest</A>
  30 +<BR>
  31 +
  32 +<A HREF="cfmongodb/doc/ColdDoc.html" title="class in cfmongodb.doc" target="classFrame">ColdDoc</A>
  33 +<BR>
  34 +
  35 +<A HREF="cfmongodb/components/Collection.html" title="class in cfmongodb.components" target="classFrame">Collection</A>
  36 +<BR>
  37 +
  38 +<A HREF="cfmongodb/components/Database.html" title="class in cfmongodb.components" target="classFrame">Database</A>
  39 +<BR>
  40 +
  41 +<A HREF="cfmongodb/test/DatabaseTest.html" title="class in cfmongodb.test" target="classFrame">DatabaseTest</A>
  42 +<BR>
  43 +
  44 +<A HREF="cfmongodb/components/Document.html" title="class in cfmongodb.components" target="classFrame">Document</A>
  45 +<BR>
  46 +
  47 +<A HREF="cfmongodb/test/DocumentTest.html" title="class in cfmongodb.test" target="classFrame">DocumentTest</A>
  48 +<BR>
  49 +
  50 +<A HREF="cfmongodb/components/ExpressionBuilder.html" title="class in cfmongodb.components" target="classFrame">ExpressionBuilder</A>
  51 +<BR>
  52 +
  53 +<A HREF="cfmongodb/javaloader/JavaLoader.html" title="class in cfmongodb.javaloader" target="classFrame">JavaLoader</A>
  54 +<BR>
  55 +
  56 +<A HREF="cfmongodb/javaloader/JavaProxy.html" title="class in cfmongodb.javaloader" target="classFrame">JavaProxy</A>
  57 +<BR>
  58 +
  59 +<A HREF="cfmongodb/Mongo.html" title="class in cfmongodb" target="classFrame">Mongo</A>
  60 +<BR>
  61 +
  62 +<A HREF="cfmongodb/components/MongoDB.html" title="class in cfmongodb.components" target="classFrame">MongoDB</A>
  63 +<BR>
  64 +
  65 +<A HREF="cfmongodb/test/MongoDBTest.html" title="class in cfmongodb.test" target="classFrame">MongoDBTest</A>
  66 +<BR>
  67 +
  68 +<A HREF="cfmongodb/test/MongoSmokeTest.html" title="class in cfmongodb.test" target="classFrame">MongoSmokeTest</A>
  69 +<BR>
  70 +
  71 +<A HREF="cfmongodb/test/SearchMongoTest.html" title="class in cfmongodb.test" target="classFrame">SearchMongoTest</A>
  72 +<BR>
  73 +
  74 +<A HREF="cfmongodb/test/SomeDoc.html" title="class in cfmongodb.test" target="classFrame">SomeDoc</A>
  75 +<BR>
  76 +
  77 +</FONT>
  78 +</TD>
  79 +</TR>
  80 +</TABLE>
  81 +
  82 +</BODY>
  83 +</HTML>
  84 +
  85 +
289 doc/api/cfmongodb/Mongo.html
... ... @@ -0,0 +1,289 @@
  1 +
  2 +
  3 +
  4 +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5 +<!--NewPage-->
  6 +<HTML>
  7 +<HEAD>
  8 +<!-- Generated by colddoc on {ts '2009-12-12 16:22:54'} -->
  9 +<TITLE>
  10 +Callable
  11 +</TITLE>
  12 +
  13 +<META NAME="keywords" CONTENT="cfmongodb.concurrent.Callable interface">
  14 +
  15 +
  16 +
  17 +<LINK REL ="stylesheet" TYPE="text/css" HREF="../stylesheet.css" TITLE="Style">
  18 +
  19 +<SCRIPT type="text/javascript">
  20 +function windowTitle()
  21 +{
  22 + parent.document.title="Mongo";
  23 +}
  24 +</SCRIPT>
  25 +<NOSCRIPT>
  26 +</NOSCRIPT>
  27 +
  28 +</HEAD>
  29 +
  30 +<BODY BGCOLOR="white" onload="windowTitle();">
  31 +
  32 +
  33 +
  34 +
  35 +
  36 +<!-- ========= START OF NAVBAR ======= -->
  37 +<A NAME="navbar_top"><!-- --></A>
  38 +<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
  39 +<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
  40 +<TR>
  41 +<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
  42 +<A NAME="navbar_top_firstrow"><!-- --></A>
  43 +<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
  44 + <TR ALIGN="center" VALIGN="top">
  45 +
  46 +
  47 +
  48 +
  49 + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A>&nbsp;</TD>
  50 +
  51 +
  52 +
  53 +
  54 + <TD BGCOLOR="##EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
  55 +
  56 +
  57 +
  58 + <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
  59 +
  60 +
  61 +
  62 +
  63 + </TR>
  64 +</TABLE>
  65 +</TD>
  66 +<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
  67 +
  68 +CFMongoDB API</EM>
  69 +
  70 +</TD>
  71 +</TR>
  72 +
  73 +<TR>
  74 +
  75 +<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
  76 +
  77 + <A HREF="../index.html?cfmongodb/Mongo.html" target="_top"><B>FRAMES</B></A> &nbsp;
  78 +
  79 +</FONT></TD>
  80 +
  81 +</TR>
  82 +</TABLE>
  83 +<A NAME="skip-navbar_top"></A>
  84 +<!-- ========= END OF NAVBAR ========= -->
  85 +
  86 +<HR>
  87 +<!-- ======== START OF CLASS DATA ======== -->
  88 +<H2>
  89 +<FONT SIZE="-1">
  90 +cfmongodb</FONT>
  91 +<BR>
  92 +Class Mongo</H2>
  93 +
  94 +
  95 +
  96 +
  97 +
  98 +
  99 +
  100 +
  101 +
  102 +
  103 +
  104 +
  105 +
  106 +
  107 +
  108 +
  109 +
  110 +
  111 +
  112 +
  113 +
  114 +<PRE>railo-context.Component
  115 + <IMG SRC="../resources/inherit.gif" ALT="extended by ">cfmongodb.Mongo
  116 +</PRE>
  117 +
  118 +
  119 +
  120 +<HR>
  121 +<DL>
  122 +<DT>
  123 +
  124 +
  125 +
  126 +<PRE>public class <B>Mongo</B>
  127 +<DT>extends railo-context.Component</DT></PRE>
  128 +</DT>
  129 +</DL>
  130 +
  131 +
  132 +<P>
  133 + Convenience wrapper for MongoDB. @see components.MongoDB for wrapper details
  134 +<P>
  135 +
  136 +
  137 +<HR>
  138 +
  139 +<p>
  140 +
  141 +
  142 +
  143 +
  144 +
  145 +
  146 + <!-- ======== CONSTRUCTOR SUMMARY ======== -->
  147 +
  148 + <A NAME="constructor_summary"><!-- --></A>
  149 + <TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
  150 + <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
  151 + <TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
  152 + <B>Constructor Summary</B></FONT></TH>
  153 + </TR>
  154 + <TR BGCOLOR="white" CLASS="TableRowColor">
  155 +
  156 + <TD>
  157 + <CODE><B><A HREF="Mongo.html#init()">init</A></B>()</CODE>
  158 + <BR>
  159 +
  160 + </TD>
  161 + </TR>
  162 + </TABLE>
  163 + &nbsp;
  164 +
  165 +
  166 +
  167 +
  168 +
  169 +
  170 +
  171 +
  172 +
  173 +
  174 +
  175 +
  176 +
  177 + &nbsp;
  178 + <a name="methods_inherited_from_class_railo-context.Component"><!-- --></a>
  179 + <table summary="" border="1" cellpadding="3" cellspacing="0" width="100%">
  180 + <tbody><tr class="TableSubHeadingColor" bgcolor="#eeeeff">
  181 + <th align="left"><b>Methods inherited from class railo-context.Component</b></th>
  182 + </tr>
  183 + <tr class="TableRowColor" bgcolor="white">
  184 + <td>
  185 +
  186 +
  187 +
  188 +
  189 + <code></code>
  190 + </td>
  191 + </tr>
  192 + </tbody></table>
  193 +
  194 +
  195 +&nbsp;
  196 +<P>
  197 +
  198 +
  199 +
  200 +<!-- ========= CONSTRUCTOR DETAIL ======== -->
  201 +
  202 +<a name="constructor_detail"><!-- --></a>
  203 +</p><table summary="" border="1" cellpadding="3" cellspacing="0" width="100%">
  204 +<tbody><tr class="TableHeadingColor" bgcolor="#ccccff">
  205 +<th colspan="1" align="left"><font size="+2">
  206 +<b>Constructor Detail</b></font></th>
  207 +</tr>
  208 +</tbody></table>
  209 +
  210 +<a name="init()"><!-- --></a><h3>
  211 +
  212 +init</h3>
  213 +<CODE>public <B>init</B>()</CODE>
  214 +<dl>
  215 +<dd>
  216 +
  217 +<p>
  218 +</p>
  219 +
  220 +
  221 +</dd></dl>
  222 +
  223 +
  224 +
  225 +
  226 +
  227 +
  228 +
  229 +
  230 +
  231 +
  232 +
  233 +<!-- ========= START OF NAVBAR ======= -->
  234 +<A NAME="navbar_top"><!-- --></A>
  235 +<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
  236 +<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
  237 +<TR>
  238 +<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
  239 +<A NAME="navbar_top_firstrow"><!-- --></A>
  240 +<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
  241 + <TR ALIGN="center" VALIGN="top">
  242 +
  243 +
  244 +
  245 +
  246 + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A>&nbsp;</TD>
  247 +
  248 +
  249 +
  250 +
  251 + <TD BGCOLOR="##EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
  252 +
  253 +
  254 +
  255 + <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
  256 +
  257 +
  258 +
  259 +
  260 + </TR>
  261 +</TABLE>
  262 +</TD>
  263 +<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
  264 +
  265 +CFMongoDB API</EM>
  266 +
  267 +</TD>
  268 +</TR>
  269 +
  270 +<TR>
  271 +
  272 +<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
  273 +
  274 + <A HREF="../index.html?cfmongodb/Mongo.html" target="_top"><B>FRAMES</B></A> &nbsp;
  275 +
  276 +</FONT></TD>
  277 +
  278 +</TR>
  279 +</TABLE>
  280 +<A NAME="skip-navbar_top"></A>
  281 +<!-- ========= END OF NAVBAR ========= -->
  282 +
  283 +<HR>
  284 +
  285 +</BODY>
  286 +</HTML>
  287 +
  288 +
  289 +
353 doc/api/cfmongodb/components/-.html
... ... @@ -0,0 +1,353 @@
  1 +
  2 +
  3 +
  4 +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5 +<!--NewPage-->
  6 +<HTML>
  7 +<HEAD>
  8 +<!-- Generated by colddoc on {ts '2009-12-12 16:22:53'} -->
  9 +<TITLE>
  10 +Callable
  11 +</TITLE>
  12 +
  13 +<META NAME="keywords" CONTENT="cfmongodb.components.concurrent.Callable interface">
  14 +
  15 +
  16 +
  17 +<LINK REL ="stylesheet" TYPE="text/css" HREF="../../stylesheet.css" TITLE="Style">
  18 +
  19 +<SCRIPT type="text/javascript">
  20 +function windowTitle()
  21 +{
  22 + parent.document.title="-";
  23 +}
  24 +</SCRIPT>
  25 +<NOSCRIPT>
  26 +</NOSCRIPT>
  27 +
  28 +</HEAD>
  29 +
  30 +<BODY BGCOLOR="white" onload="windowTitle();">
  31 +
  32 +
  33 +
  34 +
  35 +
  36 +<!-- ========= START OF NAVBAR ======= -->
  37 +<A NAME="navbar_top"><!-- --></A>
  38 +<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
  39 +<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
  40 +<TR>
  41 +<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
  42 +<A NAME="navbar_top_firstrow"><!-- --></A>
  43 +<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
  44 + <TR ALIGN="center" VALIGN="top">
  45 +
  46 +
  47 +
  48 +
  49 + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A>&nbsp;</TD>
  50 +
  51 +
  52 +
  53 +
  54 + <TD BGCOLOR="##EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
  55 +
  56 +
  57 +
  58 + <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
  59 +
  60 +
  61 +
  62 +
  63 + </TR>
  64 +</TABLE>
  65 +</TD>
  66 +<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
  67 +
  68 +CFMongoDB API</EM>
  69 +
  70 +</TD>
  71 +</TR>
  72 +
  73 +<TR>
  74 +
  75 +<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
  76 +
  77 + <A HREF="../../index.html?cfmongodb/components/-.html" target="_top"><B>FRAMES</B></A> &nbsp;
  78 +
  79 +</FONT></TD>
  80 +
  81 +</TR>
  82 +</TABLE>
  83 +<A NAME="skip-navbar_top"></A>
  84 +<!-- ========= END OF NAVBAR ========= -->
  85 +
  86 +<HR>
  87 +<!-- ======== START OF CLASS DATA ======== -->
  88 +<H2>
  89 +<FONT SIZE="-1">
  90 +cfmongodb.components</FONT>
  91 +<BR>
  92 +Class -</H2>
  93 +
  94 +
  95 +
  96 +
  97 +
  98 +
  99 +
  100 +
  101 +
  102 +
  103 +
  104 +
  105 +
  106 +<PRE>cfmongodb.components.IDocument
  107 +</PRE>
  108 +
  109 +
  110 +
  111 +<HR>
  112 +<DL>
  113 +<DT>
  114 +
  115 +
  116 +
  117 +<PRE>public class <B>-</B>
  118 +</PRE>
  119 +</DT>
  120 +</DL>
  121 +
  122 +
  123 +<P>
  124 + All MongoDB Documents should implement this interface. Basic ColdFusion structures can also be saved to the datastore. But from an OO design perspective, it's a good practice to implement this interface
  125 +<P>
  126 +
  127 +
  128 +<HR>
  129 +
  130 +<p>
  131 +
  132 +
  133 +
  134 +
  135 +
  136 +
  137 +
  138 +
  139 +<!-- ========== METHOD SUMMARY =========== -->
  140 +
  141 +<A NAME="method_summary"><!-- --></A>
  142 +<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
  143 +<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
  144 +<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
  145 +<B>Method Summary</B></FONT></TH>
  146 +</TR>
  147 +
  148 +
  149 +
  150 +
  151 +<TR BGCOLOR="white" CLASS="TableRowColor">
  152 +<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
  153 +<CODE>&nbsp;string</CODE></FONT></TD>
  154 +<TD><CODE><B><A HREF="-.html#save()">save</A></B>()</CODE>
  155 +<BR>
  156 +
  157 +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Commits this Document instance to the datastore and returns an ID
  158 +
  159 +</TD>
  160 +</TR>
  161 +
  162 +
  163 +
  164 +<TR BGCOLOR="white" CLASS="TableRowColor">
  165 +<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
  166 +<CODE>&nbsp;any</CODE></FONT></TD>
  167 +<TD><CODE><B><A HREF="-.html#setCollection()">setCollection</A></B>()</CODE>
  168 +<BR>
  169 +
  170 +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sets the collection to which this Document instance belongs. This should be called prior to any other operations. If not, the default Collection, if any, will be the container for this Document.
  171 +
  172 +</TD>
  173 +</TR>
  174 +
  175 +
  176 +
  177 +<TR BGCOLOR="white" CLASS="TableRowColor">
  178 +<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
  179 +<CODE>&nbsp;any</CODE></FONT></TD>
  180 +<TD><CODE><B><A HREF="-.html#update()">update</A></B>([any field], [any value])</CODE>
  181 +<BR>
  182 +
  183 +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Performs in-place updating - Instead of retrieving and updating every item within a document, this method is more efficient, allowing for 'Cherry Picking' of specific data elements to update.
  184 +
  185 +</TD>
  186 +</TR>
  187 +
  188 +</TR>
  189 +</TABLE>
  190 +
  191 +
  192 +
  193 +
  194 +
  195 +
  196 +
  197 +&nbsp;
  198 +<P>
  199 +
  200 +
  201 +
  202 +
  203 +
  204 +
  205 +
  206 +
  207 +<!-- ============ METHOD DETAIL ========== -->
  208 +
  209 +<a name="method_detail"><!-- --></a>
  210 +<table summary="" border="1" cellpadding="3" cellspacing="0" width="100%">
  211 +<tbody><tr class="TableHeadingColor" bgcolor="#ccccff">
  212 +<th colspan="1" align="left"><font size="+2">
  213 +<b>Method Detail</b></font></th>
  214 +</tr>
  215 +</tbody></table>
  216 +
  217 +
  218 + <a name="save()"><!-- --></a><h3>
  219 + save</h3>
  220 + <code>public string <B>save</B>()</code>
  221 +
  222 + <dl>
  223 + <dd>