EXECUTIVE SUMMARY - Metamodel hierarchy refactoring operations for types and properties - Allow complex filters for the right-hand list in browsers (| for OR, ^ for AND-NOT) - Significant time and memory optimizations in browsers - New Object Browser hierarchy method "All Until Subgraph", to prevent recursing through subgraphs - Replace Tool UI improvements, Paste replacement object - New Find Dialog for text: case, words, wildcards, regex, next/previous - Extra popup menu for Lists and Tables when shift is held down, for Find, Copy List as text etc. - Filtering for Changes & Versions window - Tooltip for Version number field, showing the previous version number and details - Symbol Editor can change Z-order of multiple selections and in groups with Send Backward etc. - MERL x and y return role target point for moved dynamic port - MERL x and y etc. return values from a text's Live Code target object etc. - HTML5 for documentation generators and MERL image maps - New API commands for properties, bindings and memory limit - Improved scalability for long, fast sequences of API commands each on its own HTTP connection - Add support for CORS in SOAP APIs, to allow calling from JavaScript in browser - Command line parameter setUser:password:sysadmin:meta: to create/update a user - Command line parameter ip: to select among several IPs in a multihomed machine Global * New: Update version numbers for 5.6 - 5.6 works with the same repository schema as 5.5, so no version update is applied to the repository, and it can be used with 5.5 too. - MXM and MXT files of earlier versions can be read, and files of later versions will warn but the user can continue. - MEC, MET and MEP files are version-specific. * New: Support a distinction between the MetaEdit+ program version and the repository schema version that program version expects. * New: When opening a window, do not use the OS focus mechanism if we are running in batch mode - On Windows, focus makes the task bar entry orange, initially blinking * New: Add Unicode ('wide character') support when calling external programs - particularly in MERL external...read on Windows - NB not all Microsoft command-line programs support this, e.g. the attrib command * New: Find Dialog - Input field for search string, combined with a Combobox remembering entered search strings - Option checkboxes for selecting - case-sensitive/-insensitive search - word search - wildcard match - regular expression search - Find Next / Find Previous - The new FindDialog stays open after as long as the user does not close it with the Cancel button. The user can continue finding occurrences of the search string, while the dialog stays open and makes the underlying text editor track the selection according to found matches. - A special feature is the match lookahead: The dialog automatically searches the next and the previous match, and enables search buttons accordingly. This gives immediate feedback for the user whether it is useful to request a next or previous search. - Recognize double-clicks on buttons as two clicks, to allow moving quickly through the search results * New: Extra popup menu for Lists and Tables, opened with Shift held down - Copy Selection as Text : Copy display text of selected list element(s) into Clipboard - Copy List as Text: Copy display text of all list elements into Clipboard - In Tables, Copy Selection as Text and Copy List as Text include all cells on a row, separating them with tabs. Newlines in a cell value are converted to pilcrow paragraph glyphs - Find... : Find and select a list element matching string requested from the user * New: Support HTTPS URLs, e.g. for External Element properties or manual path in settings * Change: In the error dialog or F8 user interrupt dialog, make Proceed (if shown) or else Terminate the initially selected button, rather than Exit MetaEdit+. - User reports pressing F8 by mistake, from muscle memory for Eclipse debugger Run, then automatically pressing Enter, losing this transaction's work. - Strictly speaking Exit MetaEdit+ is the safer choice: lose one person's work from one transaction, rather than risk corruption after an error to all people's work from all previous transactions. However, practically speaking backups will normally reduce the latter risk, and very few errors (and no user interrupts) actually result in any corruption in the repository anyway. * Fix: Rare bug that could cause fatal out of memory errors in mmScavenge.c when the process could have allocated more memory. * Correction: Show an execute cursor while updating windows even after a single undo or redo Windows * Fix: Better handling of problems in GDI+ memory allocation - If computing a bitmap icon for a symbol using GDI+ (used on Windows 7) throws a GDI+ error, fall back to Cairo (or own code if Cairo is not available) * Optimization: If executing an external program failed (e.g. program not found), about 100 bytes of memory was leaked. Linux * Change: csh dependency removed: MERL external..read now uses bash rather than csh to execute the commands whose output is returned. - runs /bin/bash with first 3 arguments: -norc -- metarun, and 4th argument being the supplied command * Correction: File dialogs on Linux displayed filenames truncated vertically Repository * New: Password for saving edited manager.ab can be that of any system administrator user * New: Modeling Rights dialog shows users sorted by name rather than id number, strikethrough if that user has been deleted * Fix: "Cannot read persistent object when cache is reversed." error when logging out with commit * Fix: Flushing persistent objects from cache was not locking the cache semaphore * Fix: If a repository had multiple system administrators, two could change the set of Metamodellers in overlapping transactions, causing a Write-Write conflict * Fix: Primitive failed when reconstructing persistent object that had been loaded, flushed, and its class structure changed by a change to a superclass. - Happened in the rare combinations of flushing and class structure changes above. * Correction: When a physical area is being accessed and is not found, the error message shown was just the area's ID, a small positive integer. The original error message is now included, e.g. Accessing unaccessible physical area: 15. Dialogs * New: In Info Tool, use read-only text fields rather than labels for "Defined in Project:", "Locked by:" and (for Graph Info) "Explosion info: Locked by", to allow copying of oid etc. * New: When in batch mode, skip success and trivial confirmation dialogs and replace warning or confirmation dialogs with logging * New: Added Paste and Paste Special in the Replace dialog's menu for selecting a given replacement object - can only be an Object, and must be of the same type as the elements to be replaced * New: Replace Tool UI improvements - Open a progress gauge while checking the legality of pressing OK, since this too can take a long time for large replaces. - 'Open' should raise the dialog above the editor window that opens, since the dialog prevents interacting with the editor - Warning texts should mention when the warning is only applicable because of replacing with a given element - Stop the user doing a replace of nothing * New: In property dialogs, make read-only property labels display as disabled (e.g. gray on Windows), and without initial _ underscore * New: Set focus to the first property widget in a multiple property dialog when creating an instance binding. * New: Warning and information dialogs shown with a longer text and just OK button now calculate an optimum size for the dialog * Correction: Return to the original cursor after resizing dialog windows from the bottom-right corner * Correction: Paste Special in property dialog (from menu, or drag and drop with Ctrl+Shift) now creates copies in the target property's project, rather than the default project * Correction: If an error occurred while showing a list dialog that overrides the user's choice for Options | System | Automatically answer dialogs, the overridden setting could remain in force in that session after the error. Changing it again in Options Tool rectified the problem. * Cosmetic: Simple dialogs' maximum size was being unnecessarily limited to 1280x1024 * Cosmetic: When a property value does not fulfil its type's conditions (e.g. regex), the warning message includes the value. For a long value, the dialog could exceed the screen height. Change to use a warning text dialog, so the message can be scrolled and the OK button is always visible. API * New: Improved scalability for long, fast sequences of API commands each on its own HTTP connection - Previously performance suffered if there were tens of thousands of HTTP connections within 20 minutes. - The correct way would be for the API client program to use persistent HTTP connections: HTTP 1.1 without Connection: close, or HTTP 1.0 with Keep-Alive. - With this version's improvement, there is no slowdown even with millions of calls, each on its own connection (persistent connections are of course still recommended). * New: Add support for CORS in SOAP APIs, to allow calling from JavaScript in browser - https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS - Support preflight OPTIONS method for HTTP, sending 204 with keepAlive and: - Access-Control-Allow-Origin: * - Access-Control-Allow-Methods: POST, GET, OPTIONS - Access-Control-Allow-Headers: Content-type, Soapaction - (without this, OPTIONS failed with 501 Not Implemented) - SOAP replies include same allowed origin of anywhere, so the browser XmlHttpRequest does not strip the replied information: - Access-Control-Allow-Origin: * - Tested with https://github.com/doedje/jquery.soap 1.7.3 in Chrome 90 * New: API responds to ?wsdl query - the answer does not include the tag, since the requester must already know that information to ask ?wsdl. (The tag is included in the WSDL saved by the Save WSDL button in the API Tool.) * New: MEAny setPropertyForLocalName (MEOop receiver, string propertyForLocalName, MEOop put) - For the receiver argument, an MEOop representing a NonProperty, set into the first property slot whose local name matches the second argument, a string, the MEOop representing a Property in the third argument. Return an MEAny holding either: the MEOop of the property if successful; or an MENull if the string is not a local name in this type. The legality of the property is not checked. * New: MEAny setValueForLocalName (MEOop receiver, string valueForLocalName, MEAny put) - For the receiver argument, an MEOop representing a NonProperty, set the value of the first property whose local name matches the second argument, a string, to be that in the MEAny in the third argument. Return an MEAny holding either: the MEOop of the property if successful; or an MENull if the string is not a local name in this type. * New: Allow API methods open, refresh and repSet to be sent with a receiver that is a Binding MEOop, as well as NonProperty MEOop * New: If an incoming HTTP message does not correspond to protocol, we want to report a 400 exception to the client. We assume it's trying its best, but we also have to take into account that there may be further errors in responding, e.g. because the client has already gone away (WSAECONNRESET or WSAECONNABORTED). - Earlier these would cause an unhandled exception, which may cause the multi-user server executable to exit. Seen during some penetration testing attacks on MetaEdit+ server SOAP port. - Add basic error handling on sending the response, so any error during reporting simply stops the connection * New: Added API command-line text function vcsParentComment, which returns the full version comment of the parent of the most recent Save Version. - Note the version number, version comment and component comments can be edited later. Similarly if the version number conflicts with another given in an overlapping transaction, it will be changed as will the timestamp (although often quickly enough that the HH:MM format stays the same). This is thus only really reliable for the current user in the transaction immediately after Save Version. * Fix: Creating a project programmatically (through API functionality) did not initialize it, giving errors on commit / open - check new project name and resulting filename, to raise an error early rather than trying to create - log error messages to log.txt * Correction: API Tool's View Entry XML would fail to find the XML and open the window, if a log entry before the desired XML log entry had the same timestamp. * Documentation: Updated order of API operations, improved operation documentation texts - Improved documentation of how rules are checked for API methods that set property values. Command line parameters * New: Add command line parameter setUser:password:sysadmin:meta: - Create or change the named user (mandatory argument) - If another argument is empty (explicit "" on Windows command line), it is take as the default value when creating, or left unchanged when updating. - Default value for password is the user name - Default value booleans is false - boolean arguments expect case-insensitive "true", but currently accept anything with first character T, Y or 1 * New: Add command line parameter ip:, so we can select among possibly several IPs that may exist in a multihomed machine - Argument is a preferred IP address e.g. 192.168.0.10 or a CIDR pattern e.g. 192.168.0.0/24 - The supplied IP or CIDR must be a match for an actual IP of the current hostname - If none is specified or no match is found, the previous default of using the first IP returned by the OS is used. Up to Windows 8 this was workable, as the network interface priority or similar could be used to reorder them; in later Windows versions this reordering no longer works. - Allow unsetting the preferred host info by supplying a CIDR string with a legal IP but a prefix length of 0 - Log to log.txt any failures in getting this host's IPs or setting the desired IP * New: Log unrecognized command-line commands to log.txt - Command not found: foobar - NB this logging also takes place when calling command-line commands from MERL or the API * New: Log to log.txt if too few arguments are supplied for a command-line command - Not enough arguments for command: forAll:run: - expected 2, got 1: 'barfoo' - NB if there are subsequent commands after the insufficient arguments, they will be interpreted as arguments. Most commands take freeform strings as arguments, so there is no real way to distinguish. * New: API command-line parameter setMemoryLimit: - Sets the memory upper bound for the process. Value is in bytes (no thousand separators), optionally multiplied by suffix K, M, G etc. (binary-based, so 1024 etc.). - E.g. setMemoryLimit: 1.5G, setMemoryLimit: 200M - Default value is 512M, as in earlier versions (rarely reached in practice, even in large repositories). Specified values are forced to be between a minimum of 64M (more may be needed), and a maximum of 4G (32-bit process). NB the maximum actually allowed may be limited by the OS to a lower value, e.g. for Windows see https://learn.microsoft.com/en-us/windows/win32/memory/memory-limits-for-windows-releases - Memory will grow up to 60% of the memory limit set, with only incremental garbage collect; above 60%, compacting garbage collect in RAM will be tried first before growing. - NB this setting does not change the user's Options | User | Fine Tuning values, which are stored in each repository. Above the Fine Tuning limits, flushing cached persistent objects to reclaim cache memory will be preferred to growing memory. * Change: In error logging of dbRootName: and dbRootDir: command-line commands, changed 'database roots file' to 'artbase.roo roots file' * Change: forAll:run: and forName:type:run: now accept all matching graph types, not just the first. * Correction: Skip executable and possible image file on command line before passing command-line parameters to be executed * Correction: startAPIHostname:port:logEvents: final boolean argument was accepting a wildcard that matched to "true", e.g. "t*U#". Accept just case-insensitive "true". GOPPRR * New: When deleting the last representation of a connection in a binding, use same setting as for objects and bindings when asking whether to delete that connection from the conceptual binding in the graph. - Options | Preferences | "Automatically delete unused objects" Never / Ask for each / Always (default), saved as tidyDesk=0/1/2 in metaedit.ini * New: More information can be printed on why a lock failed * Change: A batch operation that attempts to set an individual property with an illegal value will now log the error rather than opening a dialog * Change: UI listing of representations of roles and relationships returns to listing all, rather than just the representations in the first graph encountered. - Although roles and relationships cannot be reused via the UI to be in several graphs (they are added there as copies), such role and relationship reuse can exist e.g. after custom importing code via MXM or API. * Change: When setting properties in many objects in batch mode, checking property slot uniqueness constraints could be very time-consuming (it has to calculate the set of all instances of a given type repeatedly, once for each of that type's instances whose property is being set). As the resulting possible multitude of dialogs was also unwanted, turn off this check in batch mode. * Change: If reading a property slot finds it nil, but filling it with a new property with default value fails because the lock cannot be obtained, print to the repository transcript rather than opening a dialog. - Improve the printing to show the oid and information about why the lock failed: type of lock (if not transaction write), user (or dirty lock) * Fix: When deleting a connection in a binding in a Diagram, if "Automatically delete unused objects" was "Never" (or "Ask for each" and the user replied No), the connections were removed from the binding but the binding was left. Graph | Import Graph would then give a division by zero error when trying to create a representation for the unrepresented, empty binding. * Fix: When deleting a binding representation, if the binding has <2 connections, delete the conceptual binding from the graph (regardless of "Automatically delete unused objects" setting) * Fix: If a type was moved from being under one persistent type to being under another, it could end up not being in either's subtypes (and not showing up in Type Browser), or then being in the wrong type's subtypes (and showing up in the wrong place in Type Browser). - The original supertype was not marked as having changed, now corrected. * Correction: Binding creation failure dialog was showing "in that order" for 2 connections and "starting from" for more: the reverse of what we wanted. * Correction: Binding creation failure dialog now lists objects in order they are clicked, if "first object always in first role" is selected (the default). * Correction: Connectivity Constraints could give incorrect results in some rare cases * Cosmetic: Component Selection Tool (single selection) Contents list label became somewhat offset left from list as the window was resized larger. * Cosmetic: When a property value does not fulfil its type's conditions (e.g. regex), the warning message included the value near the start, making the overall message hard to read for long values. Moved the value to the end. * Optimization: Speed up checking whether a property slot is hidden * Optimization: Speed up the time to show the legal bindings by nearly a factor of 2 Generators * New: Made math..evaluate parser able to accept a wider range of formats in input numbers. - Allow decimal with or without digit before and after - Allow scientific with e or E - Allow unary + (and -), handled as operations in the parser in normal parsing (expressions), but as part of signed number when parsing numbers - Fractions are only formed as results, parsing input like '3/4' as operations in an expression; they are not recognized when parsing numbers * New: For a movable dynamic port that has been connected to and moved, return its x and y coordinates as those of the role's target point. If not moved, answer empty. - This is intended for use in a symbol report for a dynamic port. The next element on the stack must be the main object whose port the role connects to, i.e. the object whose template displays the dynamic port. The closest graph on the stack must be the graph whose diagram shows this binding. - Note this requires that the dynamic port object is not also directly in the current graph: in that case the x and y coordinates of that object's representation will be used instead. * New: Support getting representation information like x and y from a text's Live Code target object, relationship or role. * Change: When using filename...print with an open HTML stream and automatically saving an image , make it legal HTML5 - The map id cannot contain spaces, even URL-escaped, so replace them with _ - NB requires a similar update to Graph's _Dictionary in HTML, as in demo55v - The HTML map background area cannot have spaces in coords: removed them - The HTML map background area cannot have percentages like 100% for full width, so replace with actual width and height of image - nohref cannot be used, and href can only be omitted if alt is omitted too * Correction: Avoid rare write-write conflict with multiple metamodelers modifying the same generator when Metamodeling Security Level is set to Type. - When a generator is saved, if the Metamodeling Security Level is Type, the Graph type was locked but only the generator was marked as changed. After commit, another user in a parallel transaction (started before the commit) did not see the Graph type as dirty and could thus obtain a lock to change its generators. If the second user changed the same generator, their commit failed with a write-write conflict since they had not seen the first user's change. Now mark the Graph type as changed in this situation, to ensure the second user can only obtain the lock when there will be no conflict. - When saving a generator in Graph itself (the ancestor of all Graph types), handle locks on the repository's separate collection of generators for Graph itself * Correction: Representation commands could output a Double such as 3.2d-123, e.g. as a result of calculations with more extreme floats, or possibly SVG symbol import. The Double string format would generally not be expected, and math..evaluate only uses Float, so force Doubles to Integers or Floats. - Best not to round Floats that are equal to Integers: this is thus consistent with MXM and SVG export. Generator Tools * Fix: Adding, Editing and Removing Breakpoints did not first obtain the metamodeling lock - this could lead to write-write conflicts on that generator during commit, if the metamodeling lock had not been obtained for another reason. If another user edited the same generator in an overlapping transaction, whoever committed first would succeed, and the second would get a write-write conflict. * Fix: #removeAtIndex: error when saving a new generator after starting its creation with one name then changing its name in the code to another that already exists in that Graph type, then saving it - now correctly asks whether to Rename and Overwrite, or Cancel the save * Correction: In the Generated Files output browser, if the user sorted on a column heading, the sort indicator remained when a new generation run updated the list with new files, despite the new order being the order of generation. * Correction: When writing a file failed because a character could not be written to a file because it was not in the chosen encoding, the position given for the character could be incorrect in two ways: - Firstly, the position stated in the error message and highlighted in the output text was actually the position of the error in the current output buffer. Output is written in buffers of 4 KB by default, so for an error after that the position would be incorrect. - Secondly, for an append, the output text window only shows the appended text, but the highlight position was that of the character in the whole resulting file, so was after the actual problematic character. The position stated in the error message is the position within the whole resulting file. Graph generators * New: Update HTML documentation generators to HTML5 - Change formatting with attributes into CSS in inline stylesheet or style="..." - Add alt="" where necessary - Add : Export graph [hierarchy ] to HTML, _graphs in HTML - URL-escape spaces in src PNG name and href filename - Translate spaces to _ in usemap * New: Metrics collects per-type counts * New: Make Git checkIn cope with near-simultaneous Save Versions - _vcsCheckIn: add @vcsParentComment, pass first line as msg OS var - _vcsCheckIn_git: use msg to look up PARENTVER from git, if not found wait a second for other user and retry - _vcsCheckIn_git: look for (stale info) error and retry once * Fix: Git has a bug on Windows when git repo created shared => no longer use shared - _vcsInit_git: remove --shared - _vcsInitClone_git: remove --config core.sharedRepository=true * Fix: _TOC for HTML: < and > around type in img alt need escaping * Correction: _translators: -> for newline in %xml * Correction: _Relationships in HTML: stop dowhile eating previous on last row * Correction: _javaScript for HTML: Opening Export graph to HTML output in a browser was jumping to show the start of the graph properties table. This could scroll the top of the diagram out of view, if the window was not tall enough. * Optimization: _vcsOutputProperties faster at finding whether an object has already been recursed into during _vcsGraphSnapshot * Cosmetic: HTML hierarchy could have unnecessary scrollbar(s) if ToC is wide and picture or table is wide or tall. XML * New: Update version string for MXM and MXT files to 5.6. As before, files of earlier versions can be read, and files of later versions will warn but the user can continue. * New: When converting numbers for export or import, do not round Floats that are very close to an Integer into that Integer * Fix: Parsing unexpected content in numbers in some places in Diagram representations in MXM could return nil rather than raise an error. This could silently leave the imported Diagram with bad data, which could cause errors later. - ConnectionRepr breakpoints, objTargetOffset; Diagram grid, objectRepr and bindingRepr place and scale - The fix also improves performance and consistency by using a parser, e.g. scientific format numbers like 5e2 are now supported in these places. * Fix: Some XML number decoding errors were not raised but silently swallowed, resulting in nil values and errors later API * Fix: Parsing unexpected content in numbers in MEAny Points in some places in API representation commands could return nil rather than raise an error on parsing. This could cause an error later in the command, or silently leave the representations with bad data, which could cause errors later. - (set)breakpoints MEAnyArray, addPoint MEAny, putPointAtIndex MEAny, removePoint MEAny - The fix also improves performance and consistency by using a parser, e.g. scientific format numbers like 5e2 are now supported in these places. SVG * New: Take transformations into account when setting text font-size and vector stroke-width * New: SVG and