Emerald (1.5)

Table of contents
No headers
  • ArrayUtil
    • added generalized Diff and MergeDiff functions
    • fixed bug in 'MergeDiff' where overlapping changes might be accepted and yield an invalid document
    • rewrote 'Diff()' method based on the Hirschberg LCS algorithm (O(m + n) space efficient instead of O(mn))
    • added 'Get()' method to read a SINGLE value from a NameValue collection
  • Async
    • BREAKING CHANGE: all async methods now take a Result parameter
    • BREAKING CHANGE: 'WhenAllDone()' now takes a 'Result' parameter
    • BREAKING CHANGE: 'ExecuteProcess()' now takes a 'Result' parameter instead of a 'TimeSpan'
    • BREAKING CHANGE: 'WhenDone()' now expects Result<ResultBase[]> as last argument
    • 'CopyStream()' now reads and writes simultaneously
    • added 'CopyStream()' method that can copy to multiple streams
    • 'ExecuteProcess()' is now non-blocking and closes the input stream
    • added 'ExecuteProces()' which takes output and error stream as parameters
    • 'CopyStream()' now reads and writes simultaneously (again!)
    • 'ExecuteProcess()' is now non-blocking and uses a TaskTimer to abort
    • 'ExecuteProcess()' removed compiler warning messages since it's no longer blocking
    • 'ExecuteProcess()' wait for process to "officially" terminate
    • differentiate b/w dispatch and thread-pool threads
  • AtomService
    • made write features 'internal'
    • automatic deletion of entries is now done without storing as much state
    • use 'Result.Catch()' to make coroutine calls fit on one line
  • ContentDisposition
    • added class to replace built-in .Net/Mono class, which didn't work as expected
  • Coroutine
    • 'Iterate()' now calls 'MoveNext()' until no more states are available or execution is delayed by Result object
    • 'Iterate()' bug fixed where execution of coroutines would unexpectedly halt
    • fixed breaking changes
  • DataCatalog
    • don't require a password to be provided for catalogs
  • DataCommand
    • BREAKING CHANGE: renamed 'CreateObject()' to 'ReadAsObject()' (ditto for 'CreateObjects()')
    • avoid specifying redundant generic type (causes compilation error on mono)
    • allow DataColumnAttribute to work on both properties and fields
    • only assign 'null' to reference and nullable types
    • use SysUtil.ChangeType instead of Convert to handle nullable types
    • cache Type for PropertyInfo and FieldInfo
    • 'MakeSqlSafe()' allow null strings
  • DataColumnAttribute
    • make column name optional (by default it's the same as the property or field name)
  • DataFactory
    • added support for DbProviderFactory to bypass reflection overhead
  • DebugUtil
    • added 'Stopwatch()' method
  • DirectoryService
    • use async methods for creating and destroying services
    • use 'Result.Catch()' to make coroutine calls fit on one line
  • DreamContext
    • removed timing of features (StopWatch has too much overhead and DateTime has not enough precision)
    • use SysUtil.ChangeType instead of Convert to handle nullable types
    • added Culture for execution
    • use Dictionary<string, string[]> instead of NameValueCollection for path-parameters
  • DreamContextCollection
    • use 'Result.Catch()' to make coroutine calls fit on one line
  • DreamFeature
    • removed unused instance fields (Path, MimeType, Signature, _suffixKeys)
    • internalize segment strings
    • 'ExtractArguments()' uses Dictionary<string, string[]> instead of NameValueCollection
  • DreamFeatureChain
    • store name of previous stage (for error reporting)
    • use DreamContext culture for execution
    • don't print password during exceptions
  • DreamFeatureDirectory
    • removed 'SignatureKey' class
  • DreamFeatureEpilogueAttribute
    • BREAKING CHANGE: class removed
  • DreamFeaturePrologueAttribute
    • BREAKING CHANGE: class removed
  • DreamHeaders
    • added class to manage HTTP headers (replaces NameValueCollection)
    • circumvent parsing bug in NameValueCollection for 'Set-Cookie' headers
    • (bug #3314) special-case 'X-Forwarded-Host' header to accept multiple entries
    • added a 'Clear()' method
  • DreamHost
    • new class to create and interact with the Dream host environment
  • DreamHostService
    • BREAKING CHANGE: removed GET:timers, POST:timers, DELETE:timers/{timerid}
    • BREAKING CHANGE: renamed 'DreamHost' to 'DreamHostService'
    • BREAKING CHANGE: moved Dream host instantiation methods into a new class called 'DreamHost'
    • added support for OPTIONS requests
    • some services table was using case-sensitive comparison for removing services (which lead to services not being removed)
    • blueprints are stored inside a Dictionary instead of a DirectoryService (avoid duplication of the blueprints documents)
    • added static 'Create()' method that is used by the console and service hosts to initialize a DreamHost instance
    • added a connection limit to avoid saturating the host (NOTE: internal requests do not count towards this limit)
    • changed 'GET:status' to only include a summary and link for <activities>, <aliases>, <services>, and <features>
    • changed how aliases are memorized; now we only memorize a host alias if we were able to find a matching feature
    • changed how 'SubmitRequest()' works; all pre-processing is done on the thread which submitted the request; only the feature chain is executed on a new thread
    • removed support for prologue/epilogue inheritance
    • allow negative connection limit; corresponds to max threads minus limit
    • decrease counter for NotFound response and OPTION requests
    • show connection counter and limit in GET:status
    • allow <guid> tag in config to set host identity
    • reduce request handling timeout to 2hrs
    • added <activities> back to "GET:status"
    • query param 'dream.in.scheme' used for overriding the scheme used to access dream
    • count total requests processed
    • show info messages in GET:status
    • show request rate in GET:status
    • log internal requests
    • give each feature stage the name of its previous stage (for error reporting)
    • initialize DreamContext with current culture
    • use async methods for creating and destroying services
    • use 'WithTimeout(TimeSpan.MaxVaue)' during shutdown instead of overriding timeout value
    • GET:status added xslt to format XML into HTML
    • SubmitRequestAsync: avoid using XUri.SchemeHostPort
    • merged 'dream.exit' epilogue into 'dream.out.*'
    • fixed IPv6 host bug when enumerating host interfaces
    • default culture for DreamContext is now InvariantCulture
    • use 'Result.Catch()' to make coroutine calls fit on one line
    • don't print password in log
  • DreamMessage
    • BREAKING CHANGE: changed 'Headers' type from 'NameValueCollection' to 'DreamHeaders'
    • BREAKING CHANGE: moved all 'HEADER_*' constants to 'DreamHeaders'
    • added missing standard HTTP header definitions
  • DreamResponseException
    • show http status code in exception string
  • DreamProcessing
    • BREAKING CHANGE: class merged into 'DreamHost'
  • DreamService
    • BREAKING CHANGE: renamed 'ServiceBase' to 'DreamService'
    • 'DetermineAccess()' now prefers query param "apikey" over the api key cookie
    • send 'Set-Cookie' to host and owner to clear service-key cookie
    • added 'uri.log' service config description
    • removed code to destroy logging service automatically (since it's not created by this instance)
    • use SysUtil.ChangeType instead of Convert to handle nullable types
    • added async methods for creating and destroying services
    • made AutoSave asynchronous
    • use 'Result.Catch()' to make coroutine calls fit on one line
  • EventService
    • use 'Result.Catch()' to make coroutine calls fit on one line
  • HttpHandler
    • make call to 'SubmitRequest()' synchronous
    • made handler synchronous (base on community feedback)
    • added fix to startup suggested by namxam (thanks!)
    • better debug info for async operations
    • update host info for each incoming message; distinguish between internal and external messages
  • HttpPlugFactory
    • dispose of http requests more aggressively
    • show exceptions in log
    • 'HttpWebRequest.Timeout' and 'HttpWebRequest.ReadWriteTimeout' to infinite
    • abort http connection only if the exception did not contain a valid response
    • added more detailed information for activity status on outgoing connections for debugging purposes
    • use same mechanism for adding and removing activity notifications
    • don't set activity hint after completion
    • more detailed activity output
    • added even more activity tracking
    • don't show activity messages after completion
    • additional activity update notifications to narrow down what is blocking asynchronous operations
    • only set the 'User-Agent' header when it's not yet set
    • make status reporting thread-safe
    • made the locking for logging activity a bit broader to encompass also the clearing of activities
  • HttpTransport
    • added a connection limit; a '503 Service Unavailable' response will be sent when the limited is exceeded
    • reverted earlier change that added a connection limit
    • show verb with uri in activity description
    • additional activity information on response
    • more detailed activity output
    • avoid reparsing transport prefix
    • added more detailed tracking of async activities
    • join the segments to determine the path prefix (as the .Path property returns a "/" prefix)
    • make status reporting thread-safe
    • made the locking for logging activity a bit broader to encompass also the clearing of activities
  • HttpUtil
    • BREAKING CHANGE: removed 'FetchCookies()' and 'UpdateCookies()'
    • BREAKING CHANGE: removed 'NewContentDisposition()'; create 'ContentDisposition' instance instead
    • determining if a cookie needs to be sent for a given uri is fixed (cookies for path /deki were incorrectly being sent for path /dekidir)
    • use prefetched 'AddWithoutValidate' method instead of fetching it each time
    • only throw exception on unsupported headers for DEBUG binaries
    • renamed parameter for allowing commas in values to something that is less ambiguous
    • fixed 'Set-Cookie' parsing issue (introduced regression in last fix)
  • IDreamEnvironment
    • BREAKING CHANGE: renamed 'SubmitRequest' to 'SubmitRequestAsync' to align it with other similar methods
    • added 'UpdateInfoMessage()' method
  • IYield
    • BREAKING CHANGE: 'Resume()' now returns a boolean to indicate that execution can continue (avoid recursive call to 'Coroutine.Interate()')
    • added 'IsReadyOrWait()' method for avoiding recursive calls
  • LogUtils
    • added 'LogUtils.Enabled' property to disable logging
    • don't take logging lock if the log-level will not log the message anyway
  • MimeType
    • BREAKING CHANGE: changed 'Parameters' type from 'NameValueCollection' to 'Dictionary<string, string>'
    • recognize mime-type for files with .svg extension
    • cache 'ToString()' representation
    •  added HTTP and MULTIPART_MIXED mime-types
  • mindtouch.blueprints
    • updated blueprint application to no longer auto-capitalize column data
  • mindtouch.dream.setup
    • added Windows Host installer (required to register windows service)
    • NOTE: installer only installs files required by Windows Service Host
  • mindtouch.host
    • added 'nolog' command line option to disable logging
    • added 'L' as console command to toggle logging
    • use 'DreamHost.Create()' to initialize environment
    • added 'guid' command line option to set host identity
    • don't print password when enumerating pending operations
  • mindtouch.host.service
    • use 'DreamHost.Create()' to initialize environment
  • Misc
    • BREAKING CHANGE: List<Cookie> was replaced with CookieJar
    • Log service must be provided explicitly (not implicit creation of a log service /@log); use <uri.log> in config to specify location of log service
    • InvariantCulture clean-up for Regex, String.Compare, String.StartsWith, String.EndsWith, String.IndexOf
  • MountService
    • use async methods for creating and destroying services
    • use 'Result.Catch()' to make coroutine calls fit on one line
  • PhpUtil
    • use integers as keys for encoding xml elements
  • RedirectService
    • <timeout> config value is now specified in seconds instead of milliseconds
    • use new plug constructor to set timeout value for redirect plug
  • RendezVousEvent
    • prevent having over 1,000 in-place activation (shouldn't happen, but just in case)
    • added 'IsReadyOrWait()' method for avoiding recursive calls
    • reduced max in-place activation to 100 and added logging in case we hit the limit
    • added 'Abort()' method, which reduces the 'PendingCounter' for canceled synchronization events
    • added null-check for wait handler
  • Result
    • fixed leaked 'TaskTimer' in 'IYield.Resume()'
    • added 'Wait(AutoResetEvent)' method which allows reuse of the synchronization object
    • call 'RendezVoudEvent.Abort()' on timeout
    • added 'Block()' and 'Block(AutoResetEvent)' methods
    • rewrote 'TrySetFinished()' to use 'Monitor.Enter()'
    • rewrote 'AcceptInvoke()' to use 'Monitor.Exit()'
    • wrap async exception so we don't lose the original stack trace
    • made '_status' field volatiles and unnecessary lock() statements
    • added 'Catch()' method to handle asynchronous errors more gracefully (only applicable for yield statements)
    • invoke catch-handler on 'WhenDone()' as well
  • ResultBase
    • 'Resume()' now uses 'IsReadyOrWait()' to avoid recursive calls
    • added 'Block_Helper()' method that makes it easier to set a break-point for debugging (no functional change)
  • Plug
    • BREAKING CHANGE: 'Timeout' is now read-only; use WithTimeout() to create a new plug with a different timeout value
    • BREAKGIN CHANGE: changed 'Headers' type from 'NameValueCollection' to 'DreamHeaders'
    • added OPTIONS verb
    • suppress 'Obsolete' warning when using 'XUri.WithParams(NameValueCollection)'
    • added 'WithTimeout()' method; remove Timeout setter property
    • better error checking in 'InvokeAsync()'
  • PrivateStorageService
    • only store state when folder exists
    • use caching helper functions
    • use 'Result.Catch()' to make coroutine calls fit on one line
  • RedirectService
    • use 'Result.Catch()' to make coroutine calls fit on one line
  • StorageService
    • use caching helper functions
    • use 'Result.Catch()' to make coroutine calls fit on one line
  • StringUtil
    • added 'EmptyArray' static field that represents an empty array of strings
    • added culture invariant methods for Compare, StartsWith, EndsWith, IndexOf, and LastIndexOf
  • SysUtil
    • fixed bug in 'ChangeType()' that caused an exception casting to object
    • optimized 'ChangeType()' function by refactoring slow calls
    • added methods for setting culture only if needed
  • Task
    • removed redundant calls to 'ContainsKey()' when retrieving state
  • TaskBehavior
    • BREAKING CHANGE: removed constructor with 'Result' argument (too confusing in behavior)
    • BREAKING CHANGE: removed simplified constructors; use 'TaskBehavior.NewTaskState()' or 'TaskBehavior.CopyTaskState()'
    • BREAKING CHANGE: renamed 'NewTaskState()' to 'NoTaskState()' for pedagogic reasons
    • added support for carrying culture information across tasks
    • added 'CurrentTaskState()' method to reuse the current task state
  • TaskTimer
    • BREAKING CHANGE: removed simplified constructors; use 'TaskTimer.New() instead'
    • check for TimeSpan.MaxValue when changing timer
    • '_behavior' was not reset when timer was triggered or cleared causing dangling references
    • reduced QUEUE_CUTOFF to 30 seconds; added QUEUE_RESCAN at 25 seconds
    • added 'NextMaintance' property to retrieve when the next timer check will occur
    • suppess warning when passing a volatile field as a ref parameter
  • WindowsHost
    • added Windows Service Host
    • command line arguments are read from 'mindtouch.dream.startup.xml' which must be in the same directory as 'mindtouch.host.service.exe'
  • XDoc
    • BREAKING CHANGE: 'RemoveAll(ICollection)' is now a static method
    • BREAKING CHANGE: renamed 'Transform()' to 'TransformAsText()'
    • added 'RemoveAll()' method to remove all object matched by current xpath expression
    • support 'Parent' operation on attributes
    • avoid extraneous copies of XmlNodeList by using XPathExpression directly
    • properly handle '#text' nodes
    • fixed index error in 'AtPosition()' method
    • don't rebuild node list in 'Start()' and 'End()' methods (major performance boost)
    • use SysUtil.ChangeType instead of Convert to handle nullable types
    • added comparison operation (thx to Brad Langhorst for the code contribution!)
    • added 'TransformAsXml()'
    • copy selection list when enumerating an XDoc (eliminates the enumeration bug for XDoc)
    • documented all public properties and methods
  • XDocCop
    • BREAKING CHANGE: rules now use + to mark elements that need padding (before they used #)
    • added 'AddRules()' to initialize a set of rules at once
  • XDocDiff
    • BREAKING CHANGE: removed XDocDiff class (no longer used)
  • XDocFactory
    • fixed exception when calling 'ToXPathValuePairs()' on an empty XDoc
    • return Empty document instead of null when document cannot be parsed
    • don't log unparsable XML, also consider it a warning, not an error since it's expected to fail from time to time
    • don't report parsing errors as they are expected by the methods
  • XDocUtil
    • added 'Highlight()' method to show addition/deletions between two XDoc documents
    • refactored 'Tuple<XmlNodeType, string, object>' generic into 'Token' class
  • XHtmlTextWriter
    • comment out CDATA sections when they occur within a <script> or <style> tag
  • XriPlugFactory
    • use new plug constructor to set timeout value
  • XUri
    • BREAKING CHANGE: params is now 'KeyValuePair<string, string>[]' instead of a 'NameValueCollection' (much smaller memory footprint)
    • BREAKING CHANGE: make class sealed
    • Fixed bug 'Similarity()' that allowed for partial similarities to succeed
    • storing encoded username/password to allow special symbols like @ and #
    • atomize all strings to avoid repeated allocations of the same values over and over again
    • 'Equals()' method was creating a string and then doing a comparison for equality (dumb!); now it compares the relevant elements without allocating new data
    • 'GetHashCode()' was not case-insensitive (but 'Equals()' is!)
    • 'Similarity()' was also potentially concatenating strings
    • replaces all occurrences of 'new string[0]' with 'StringUtil.EmptyArray'
    • added 'WithoutLastSegments()' and 'WithoutLastSegment()'
    • use SysUtil.ChangeType instead of Convert to handle nullable types
    • displaying original uri that didn't parse
    • use StringComparer instead of CaseInsensitiveHashCodeProvider (the latter is obsolete)
    • removed 'IsDefaultPort()'
    • automatically set 'Port' to have the correct default value based on the scheme used
    • renamed 'HasDefaultPort' to 'UsesDefaultPort'
    • removed 'AtEncode()'
    • renamed 'Truncate()' to 'WithFirstSegments()'
    • 'At()' checks new segments for validity
    • 'GetRalitivePathTo()' avoid using XUri.SchemeHostPort
    • 'ChangePrefix()' re-implemented function to avoid unnecessary re-parsing of the URI
    • added 'WithScheme()', 'WithHost()', and 'WithPort()'
    • fixed error in 'GetHashCode()' to make it case-insensitive
    • optimized 'SchemeHostPortPath' property
    • optimized 'DeterminePort()'
    • disabled NameTable memory optimization (compile with XURI_USE_NAMETABLE to re-enable again)
    • inlined all helper methods/properties for 'ToString()'
    • fixed a regression that made XUri case-sensitive
    • added bool parameter to 'ToString()' to suppress printing of passwords
Tag page
You must login to post a comment.
Powered by MindTouch Deki v.8.08.1a