----------------------------------------------------------------------- CHANGELOG for ArchStudio 3 Builds ----------------------------------------------------------------------- * Note: -DEV builds are released but are not considered to be part of the stable ArchStudio release path. Build 1067: Jie Ren<EMAIL_ADDRESS>- Intiial integration of Secure xADL changes Eric M. Dashofy<EMAIL_ADDRESS>- Added Font Chooser dialog in WidgetUtils from L2FProd.com under license - You can now select a default Archipelago font which will be applied to boxes - Gradients now save with Archipelago PNGs Build 1066: Eric M. Dashofy<EMAIL_ADDRESS>- Fixed a bug related to independent hints being applied to the wrong structures Special thanks to Michael Bailey<EMAIL_ADDRESS>- Made Archipelago more robust against incorrect type links on components/connectors Special thanks to Michael Bailey<EMAIL_ADDRESS>Build 1065: Eric M. Dashofy<EMAIL_ADDRESS>- NotifyDocs mechanism timeout increased to handle longer-running components Scott A. Hendrickson<EMAIL_ADDRESS>- Various and sundry robustness improvements to BNA Build 1064: Eric M. Dashofy<EMAIL_ADDRESS>- Archipelago: Save as PNG now gives you the option to save at a zoom level other than 100%. For including in documents and PowerPoint presentations and such, smaller zoom levels generally look better. Special thanks to Haig F. Krikorian<EMAIL_ADDRESS>- BNA: ThingLogic lifecycle updated. Now, BNAComponent will call setComponent() with a non-null parameter when adding a logic and setComponent() with a null parameter when removing one. ThingLogicAdapter responds to this by calling init() and destroy() methods on the logic, respectively. destroy() is no longer a logic interface method although it remains in ThingLogicAdapter. - AEM: AEM now uses a LookupImplementation to determine the name of the c2.fw interface on a brick that corresponds to a xADL interface, rather than using the BrickID.InterfaceID hack. The hack is still supported for now, but is deprecated. - File Manager: There is now a "NotifyDocs" mechanism for components to detect when a document is being closed or saved and gives them an opportunity to get work done before approving the change. - Archipelago: Archipelago now uses the NotifyDocs mechanism to store hints only when a document is about to be saved or closed, or when the Archipelago window is closed instead of when the window loses focus. Special thanks to Haig F. Krikorian<EMAIL_ADDRESS>- Archipelago: You can now save as PNG in a type view. Special thanks to Haig F. Krikorian<EMAIL_ADDRESS>- File Manager/Archipelago: File Manager and Save as PNG now store the most recently visited directory in file chooser in the preferences repository so you don't have to constantly navigate back to the same directory. Special thanks to Haig F. Krikorian<EMAIL_ADDRESS>Build 1063: Eric M. Dashofy<EMAIL_ADDRESS>- File Manager: There is now an option in Preferences for setting a default editor. If you double-click on a document in the file manager, it will open it with the default editor. - Archipelago: Endpoint labels don't duplicate or hang around when you change structures you're looking at and change back. Special thanks to Haig F. Krikorian<EMAIL_ADDRESS>- Archipelago: Fixes to handling of independent hinted things like endpoint labels. Special thanks to Haig F. Krikorian<EMAIL_ADDRESS>- Archipelago: Interface-Interface mappings now no longer remain when removing a component/connector Special thanks to Haig F. Krikorian<EMAIL_ADDRESS>- BNA: removeThingWithChildren now works properly in DefaultBNAModel for Things that are not in the root node list of a ThingTree Special thanks to Haig F. Krikorian<EMAIL_ADDRESS>- Release builds now include debug info in the .jar file. - BNA: Better drag'n'drop support through a support plugin - Archipelago: Can now drag'n'drop interface types onto signatures to assign types Special thanks to Haig F. Krikorian<EMAIL_ADDRESS>- New Archon interactive scripting shell, not ready for prime time yet though. Build 1062: Eric M. Dashofy<EMAIL_ADDRESS>- Fixed a potential deadlock in the File Manager/Invoker when saving. - File Manager/Invoker no longer loses selection when getting an XArchFileEvent Special thanks to Haig F. Krikorian<EMAIL_ADDRESS>- Tron: Added a duplicate ID test. - Tron: Fixed a bug that could cause new test results not to appear when two test results were identical except for the elements to which they referred. - Tron: Fixed a test that erroneously reported that innerInterface links on subarchitectures did not point to interfaces. - Archipelago: Full support for endpoint name tags - Archipelago: Can now specify node/rank separation for dot layouts - Archipelago: Integrated graph layout via Neato - Archipelago: Support for 'independently' hinted objects - objects that are added to the BNA canvas but don't have associated xArch IDs. - Archipelago: Components/Connectors can now be set to inherit their colors from their types. - Archipelago: If you set the color on a component/connector to be dark, the text will become white automatically for visibility. - BNA: Fixed a timing bug where deselection might not be complete when you context-click on no thing, thus combining context menus. Special thanks to Haig F. Krikorian<EMAIL_ADDRESS>- BNA: New tags and logics to support them. - BNA: New RotaterThing and supporting logics. - BNA: New TextReadabilityLogic Build 1061: Eric M. Dashofy<EMAIL_ADDRESS>- Update for RASDS Build 1060: Eric M. Dashofy<EMAIL_ADDRESS>- GuardTracker now has a slight delay before reparsing documents, so a bunch of requests coming in rapid fire will only result in a small number of reparses. Build 1059: Eric M. Dashofy<EMAIL_ADDRESS>- By popular demand, ArchEdit now clicks the 'apply' button when you hit 'enter' while editing a value. - New architectures are now assigned a default name instead of asking the user. - File Manager now adds ".xml" to saved files if you don't specify an extension. - SelectorDriver renamed to Product Line Selector. - Invoke menu is now hierarchical. - Archipelago: Many, many new options for coloring elements. To distinguish components from connectors, components are now displayed with a double border. - Archipelago: Gradient mode removed from BoxThings because it was stupid for it to be there in the first place; it's now a rendering hint in the BNA component like antialiasing. - Archipelago: Antialiasing and gradient mode are now preferences in the preferences panel. - Archipelago: Variant components/connectors now show up with the variant-stroke border and display individual variants internally as a Thumbnail. - New GuardTracker component tracks the boolean guards that are stored in documents and emit messages when those guards change. - Archipelago: Guard editing widgets are now combo boxes that conveniently display all guards in use in the current document. - Archipelago: Variant components now have a new right-click option that allows you to select a variant immediately; that is; without using the selector. Scott A. Hendrickson<EMAIL_ADDRESS>- Archipelago: Text wrapping is now automatic on components, connectors, and component/connector types. Build 1058: Eric M. Dashofy<EMAIL_ADDRESS>- Fix for MAB2 that mixes in xalan.jar correctly so Schematron will run right. Build 1057: Eric M. Dashofy<EMAIL_ADDRESS>- New Tron system replaces the critics framework; see the website. Scott A. Hendrickson<EMAIL_ADDRESS>- ArchEdit no longer shows metadata operations in right-click menus Build 1056: Eric M. Dashofy<EMAIL_ADDRESS>- Archipelago: fixed an ArrayIndexOutOfBounds exception that could occur when updating types. Special thanks to Haig F. Krikorian<EMAIL_ADDRESS>- File Manager: Made Malformed URL and file not found error reporting friendlier. Special thanks to Haig F. Krikorian<EMAIL_ADDRESS>Build 1055: Eric M. Dashofy<EMAIL_ADDRESS>- Got rid of most deprecation warnings in the source. - Archipelago: Fixed a latent bug in LinkMappingLogic that could cause an infinite loop when moving a link endpoint from one interface to another; symptom was the link endpoint jumping back and forth between the two interfaces. - Added the ability to rename (e.g. change the URI of) an open xArch document. Renaming sends out an XArchFileEvent indicating the rename. This means that components should not rely on the URI of an open document being totally stable; they should either update their code to rely on root-element ObjRefs (which are stable), handle the rename file event properly, or both. - Updated critics, ArchEdit, and other tools to use root- element ObjRefs rather than URIs to refer to open documents. - File Manager: File manager now detects changes to open architecture descriptions and highlights them with an asterisk as in most modern multi-document applications. It also asks the user if they want to save unsaved changes on close document or exit. - Deprecated a few functions that had "URL" in their names xArchADT and replaced them with "URI". Updated calling components to use the non-deprecated functions. - Fixed a latent race condition in the critics framework that could cause wrong issues to be displayed if an issue was removed before a critic artist was able to render it. Build 1054: Scott A. Hendrickson<EMAIL_ADDRESS>- Fixed null pointer bugs in XArchFlatProxy - Added access to xarchlibs metadata through flat interfaces - Consolidated XArchFlatProxyFactory into XArchFlatProxyUtils - Changed Notional AWACS demo to use zipped App-6A images as resources rather than raw .gif images Scott A. Hendrickson<EMAIL_ADDRESS>and Eric M. Dashofy<EMAIL_ADDRESS>- Added a new mechanism for dealing with Java-style event listeners in EBIWrapperUtils; replaced existing state- change message processors in various ArchStudio components with this mechanism. Due to the fact that this mechanism does not throw/catch Exceptions when presented with irrelevant events (like many ArchStudio event processors did), there has been a significant (~18%) speedup to ArchStudio operations that involve sending/receiving a lot of events. Build 1053: Scott A. Hendrickson<EMAIL_ADDRESS>- Added the XArchFlatProxy mechanism that allows component developers to use the type-checked data binding library interfaces for accessing xArchADT rather than the non-checked XArchFlatInterface. See the website for more details. Eric M. Dashofy<EMAIL_ADDRESS>- Updated the LinkCritic to use the bulk query interface for optimization; improvement in speed for link checking is ginormous. - xArchADT: It was possible that a second ObjRef would get created and returned for the same Data Binding Library object if the object was retrieved after add()ing or set()ting it into the document. While both ObjRefs would work, this is a non-desirable behavior for applications that wish to use ObjRef comparison in lieu of wrapper comparison. Now, retrieving an object (via getByID(), for example), should return the same ObjRef as was originally created and put into the document. Special thanks to Kari Nies<EMAIL_ADDRESS>- AEM: AEM will no longer try to suspend/resume bricks that are about to be removed in a reconfiguration, causing an exception. Special thanks to Matthew Wastrodowski<EMAIL_ADDRESS>- xArchADT: isEqual should now properly find the isEqual method on the data binding object. Special thanks to Scott Hendrickson<EMAIL_ADDRESS>Build 1052: Eric M. Dashofy<EMAIL_ADDRESS>- Some changes to OneThreadPerBrickArchitectureEngine to eliminate race conditions on shutdown and hopefully make engine-state changes more stable. - Fixes for Klax to eliminate a latent race condition that was aggravated by a fix in 1051. Special thanks to Chris Trezzo<EMAIL_ADDRESS>and Justin Erenkrantz<EMAIL_ADDRESS>- BNA: Fix for a synchronization bug that can occur when merging spline points, usually on a multiprocessor box. Build 1051: Eric M. Dashofy<EMAIL_ADDRESS>- Fixed a race condition that could cause some bricks to not start up or process messages when using the OneThreadPerBrickArchitectureEngine. Very special thanks to Jeffery von Ronne<EMAIL_ADDRESS>and Justin Erenkrantz<EMAIL_ADDRESS>- Archipelago: Optional interfaces now display dotted border; optional signatures now supported. Special thanks to Christopher van der Westhuizen<EMAIL_ADDRESS>and Ping Chen<EMAIL_ADDRESS>- Archipelago: A stack trace is no longer printed for exceptions that occur when parsing a formula in a boolean guard (though this was just a diagnostic and did not cause a program crash). Special thanks to Christopher van der Westhuizen<EMAIL_ADDRESS>and Ping Chen<EMAIL_ADDRESS>- Type Wrangler: Stamping out an interface/signature now assigns the proper direction. Special thanks to Christopher van der Westhuizen<EMAIL_ADDRESS>and Ping Chen<EMAIL_ADDRESS>- Type Wrangler now creates better names when stamping out new signatures/interfaces. - Bootstrapper should now work properly with URLs instead of filenames. Special thanks to Leonardo Gresta Paulino Murta<EMAIL_ADDRESS>- BNA: Things no longer emit ThingEvents when a property changes its value to the same value it had before. This apparently happens more often than you'd think, so performance should be somewhat snappier, especially on slower machines. - BNA: Fixed several race conditions/synchronization bugs that caused Very Bad Things to happen when using Archipelago on a multiprocessor machine. - GraphLayout: Put in a workaround for a bug in newer (1.16+) versions of DOT that leaves out colons (:) between node and endpoint names in DOT output. Reported the bug to the GraphViz dev team; they report it will be fixed in dot in the near future. - Archipelago: You can now 'q-click' (hold the Q key and click) on various elements to display a property sheet. Q-clicking again hides the sheet. - BNA: Fixed the AbstractThing.replaceSetPropertyValues() function so it uses the copied set of property values. Also added an optimization to AbstractThing.equals() such that it checks for same object (e.g. ==) equality before testing contents. Special thanks to Scott Hendrickson<EMAIL_ADDRESS>Build 1050: Eric M. Dashofy<EMAIL_ADDRESS>- Archipelago: Remove component/connector now works again. Special thanks to Christopher van der Westhuizen<EMAIL_ADDRESS>Build 1049: Eric M. Dashofy<EMAIL_ADDRESS>- Archipelago: First support for xADL 2.0 options and variants. - Archipelago: Can now save a structure diagram as a PNG file. - Archipelago: Archipelago now has browser-style back and forward buttons with the little menus next to them. Code for the widgets is in edu.uci.ics.widgets.navpanel in case you want to have similar buttons for your app. - xArchADT now supports a new bulk query mechanism for retrieving large quantities of data from the xArchADT repository with one call; this reduces communication overhead significantly. AEM, GraphLayout, and Archipelago have all been modified to use this mechanism; major performance gains should be seen (up to 15-20x for viewing an architecture in Archipelago or laying out an architecture using GraphLayout). - FilteringBusConnector now works properly when hooked up to component or connector interfaces that do not have the legacy C2 top and bottom interface IDs. Special thanks to Scott Hendrickson<EMAIL_ADDRESS>- IPreferences in PreferencePanel is now transient to properly allow serialization. Special thanks to Scott Hendrickson<EMAIL_ADDRESS>Build 1048: Eric M. Dashofy<EMAIL_ADDRESS>- Archipelago: Peers are now optionally responsible for determining the local bounding box of their target Things for drawing optimization. Special thanks to Justin Erenkrantz<EMAIL_ADDRESS>- Archipelago: Update to BNAComponent's painting mechanism to use peer bounding boxes along with the clip rectangle to optimize painting to only those regions that have changed. Also changed the way painting is held from a setHoldPainting() method in the component to a pair of (optional) methods in the model: beginBulkChange() and endBulkChange(). This means that bulk change begin/end notifications become part of the event stream from the model and therefore don't get into weird race conditions with the direct calls on the component. Special thanks to Justin Erenkrantz<EMAIL_ADDRESS>- Archipelago: Edit interface-to-signature mapping widget now displays correct title and also displays current interface-to- signature mapping when started. - Archipelago: Glass mode/gradient mode plugins are now somewhat better-behaved. - xArchADT now caches context objects so you don't burn a whole bunch of ObjRefs when you create lots of them. - xArchADT finally emits events in response to transactions the right way: if changes took place inside a transaction, they are emitted as both regular XArchFlatEvents and ALSO grouped up inside an XArchTransactionEvent. If a change took place outside a transaction, it is emitted as a single XArchFlatEvent and ALSO in a 1-item group in an XArchTransactionEvent. This means that components can either listen for XArchFlatEvents or XArchTransactionEvents, and still get all the events only once. - Slightly improved the XadlUtils class to add a couple more methods regarding XLinks, also refactored TypeWrangler and some of Archipelago to use these. - Refactored the BrickSelectorDialog and TypeSelectorDialog into the more generic StructureSelectorDialog and TypeSelectorDialog in the xadlutils package. These provide nice, tree-based dialogs to select a structural element (brick or interface) or a type. NewSIMContextMenuPlugin now uses the StructureSelectorDialog interface rather than rolling its own and is much more compact now. - TypeWrangler is now included in the archstudio.xml file. My bad! Special thanks to Kari Nies<EMAIL_ADDRESS>- Updated AEM and JavaImplementationCritic to support change in cardinality of "implementation" element in xADL 2.0. - Configurator now puts spaces around the whole classpath instead of just individual elements on Windows; apparently this works properly and solves a problem some users were having caused by spaces in their environment classpath. Build 1047: Eric M. Dashofy<EMAIL_ADDRESS>- Archipelago: Update to BNAUtils to work around a bug in the Macintosh JVM that causes box labels to render in the wrong place. Special thanks to Justin Erenkrantz<EMAIL_ADDRESS>Build 1046: Eric M. Dashofy<EMAIL_ADDRESS>- Archipelago: major update this release; first release with: - Support for creating and editing architectural structures; - Support for creating and editing types; - Support for hierarchical architectures. - New Type Wrangler component for managing the mappings between brick instances and types, and matching interfaces to signatures. - Finally added some branding to ArchStudio 3 (Splash Screen, Icons, About Box). Functions for branding are in archstudio.Branding. - Finally set an .xml file filter as the default for Open/Save in the File Manager. - Finally added a Recent Files menu on the File Manager, using the new Preferences component. - Fixed a race condition in NativeProcess.java that could cause native process running to fail with a RuntimeException. This currently affected the DOT/GraphLayout integration. Special thanks to Justin Erenkrantz<EMAIL_ADDRESS>- Fixed a bug in the GraphLayout component that caused NullPointerExceptions when a link had an invalid but present link href. Special thanks to Justin Erenkrantz<EMAIL_ADDRESS>*Build 1046-DEV: Eric M. Dashofy<EMAIL_ADDRESS>- Archipelago: The Great BNA Renaming: renamed all the BNA Thing classes to end in "Thing" and all the tagging/functionality interfaces to be prefaced with I rather than ending in Thing, so Box is now BoxThing and GlassableThing is now IGlassable. Also moved all the logics into their own package. - Archipelago: Added preliminary support for mouse gestures. Now the HHreco package is included in the source for ArchStudio, in package hhreco. Also, two libraries used by HHreco are now rolled into archstudio.jar and must be on the classpath to compile. Very, very special thanks to Hazel Asuncion<EMAIL_ADDRESS>and Fei Hoffman<EMAIL_ADDRESS>- Archipelago: some fixes to MoveIndicatorPointLogic. Special thanks to Ping Chen<EMAIL_ADDRESS>Build 1045: Eric M. Dashofy<EMAIL_ADDRESS>- Archipelago: Logics and BNAComponent now have a destroy() method that can be called to give logics a chance to clean up properly. - Archipelago: Menu options no longer duplicated around after you open a new ArchStructure - Archipelago: Dancing ants animation code completely refactored into a series of plugins; should also use less CPU now. - Archipelago: If you have multiple indicators pointing at a Thing, they are now all updated. Special thanks to Christopher van der Westhuizen<EMAIL_ADDRESS>and Ping Chen<EMAIL_ADDRESS>- Fixed a bug in SimpleClassLoader that could cause classes to not be compatible with each other if part of the application was located in a directory unpacked, part of the application was in an archive on the classpath, and the part of the application in the classpath loaded a class, and the part of the application in the archive loaded the same class using Class.forName(), and the target machine is Windows. Gold medal for obscure bug finding goes to Christopher van der Westhuizen<EMAIL_ADDRESS>and Ping Chen<EMAIL_ADDRESS>Build 1044: Ping Chen<EMAIL_ADDRESS>- Bugfixes for Selector Driver component Build 1043: Eric M. Dashofy<EMAIL_ADDRESS>- Fix to a race condition introduced in either Build 1041 or 1042 that could cause components to operate improperly if they used the EBI wrapper stuff. The behavior was random hanging or event drops. My bad. - Major performance enhancement to repaint in Archipelago - Added ability to hold painting in BNA for Archipelago plugins to better control the appearance of animations and prevent intermediate repaints. Build 1042: Eric M. Dashofy<EMAIL_ADDRESS>- Some fixes to the LinkCritic so it updates properly when certain elements change. Special thanks to Mahboobe Moghaddam<EMAIL_ADDRESS>- Various and sundry Archipelago enhancements. Ping Chen<EMAIL_ADDRESS>- Bugfix & efficiency tweak for PLA Diff Component - New PLA merge component Build 1041: Christopher van der Westhuizen<EMAIL_ADDRESS>and Ping Chen<EMAIL_ADDRESS>- New PLA diff component - New PLA merge component - New PLA diff driver component - New PLA merge driver component See the website for more details on all these. Build 1040: Eric M. Dashofy<EMAIL_ADDRESS>- Fixed a bug in AEM that resulted in classes not being loaded off URLs if they didn't have init parameters. My bad. Special thanks to Scott Hendrickson<EMAIL_ADDRESS>Build 1039: Eric M. Dashofy<EMAIL_ADDRESS>- ClassLoading model changed to allow loading of bricks off URLs as specified in xADL 2.0 URL implementation elements. Beta feature, YMMV. Special thanks to Justin Erenkrantz<EMAIL_ADDRESS>and Eugen Nistor<EMAIL_ADDRESS>- Preferences system should be working but is not documented yet. - First official ArchStudio 3 build to include Archipelago, a new graphical editor for xADL 2.0 documents. This project is not nearly complete, so only a small number of features will work. This build of Archipelago changes the structure of the GUI around significantly such that there is now a tree with pluggable behaviors parked in the left pane rather than using a system of modes and configurations as in previous ArchStudio builds. - Addition of the GraphLayout component that can leverage AT&T GraphViz's DOT to lay out architectures. Documentation coming in a future release when this stabilizes. - Small changes to c2.fw to allow users to plug in new behaviors for the sendToAll function. Special thanks to Roshni Malani<EMAIL_ADDRESS>*Build 1039-DEV: Eric M. Dashofy<EMAIL_ADDRESS>- Changed the ClassLoading model for c2.fw around entirely, to allow class reloading. It seems to work OK now, but YMMV. See README.html for more details. - Moved createAsyncCallMessage function to EBIWrapperUtils. Special thanks to Isabel Muņoz<EMAIL_ADDRESS>- Removed extraneous thread creations in OneThreadPerBrickArchitectureEngine. Special thanks to Isabel Muņoz<EMAIL_ADDRESS>- Fixed SimpleWeld.equals() method. Special thanks to Isabel Muņoz<EMAIL_ADDRESS>- Introduced the ArchStudio 3 Preferences System, to allow components to store and access user and system preferences persistently across ArchStudio 3 invocations. Preferences are retained using a platform-specific store, e.g. Windows JVMs will use the Windows Registry. There is now a unified Edit->Preferences dialog accessible from the File Manager/Invoker. Website docs will be up when this gets officially released. - Changed the .TXT files (changes, license, readme) to .html for better cross-platform usability. Build 1038: Eric M. Dashofy<EMAIL_ADDRESS>- Fixed a bug in the Configurator that caused it to choose an incorrect pathname for the Description file when resolving it from the ISR registry. Special thanks to Kari Nies<EMAIL_ADDRESS>- Fixed a bug in the Configurator that caused it to not generate a script if all the default choices were correct and no options are ever changed. Special thanks to Justin Erenkrantz<EMAIL_ADDRESS>- Configurator will now attempt to exec "chmod u+x [scriptfile]" when it's done if on a UNIX machine. - Configurator now appends environment variable CLASSPATH to command-line classpath when generating script. Special thanks to Justin Erenkrantz<EMAIL_ADDRESS>Jie Ren<EMAIL_ADDRESS>- New visio Integration components Build 1037: Eric M. Dashofy<EMAIL_ADDRESS>- Added the ArchStudio 3 Configurator (see the website). Feedback on the new Configurator is appreciated, especially from those running on exotic platforms. - Integrated the ISR Registry classes, which are a generically useful data structure, to edu.uci.isr.registry. These classes were originally present in the ISR Deployment system. - Migrated many useful system functions (process management, environment exploration) into the new c2.util.SystemUtils class from the ISR Deployment System. - Added a new Widget, the Wizard base class, to edu.uci.isr.widgets. Build 1036: Eric M. Dashofy<EMAIL_ADDRESS>- Added support to File Manager for dragging'n'dropping files from the OS onto the file list instead of using File->Open to open them, 'cause I love y'all so much. Tested it on Windows, should work with other OSes too. Beta feature; YMMV. Build 1035: Eric M. Dashofy<EMAIL_ADDRESS>- Added support to ArchEdit for fixed attribute values and FixedValueExceptions. Beta feature; YMMV. Build 1034: Eric M. Dashofy<EMAIL_ADDRESS>- Fixed a bug in ArchEdit that caused attribute names/values with special characters (<,>,&,') to not print correctly sometimes due to HTML rendering of JLabels. Special thanks to Roshanak Roshandel<EMAIL_ADDRESS>Build 1033: Eric M. Dashofy<EMAIL_ADDRESS>- Fixed a bug in xArch Flat Interface's MethodCache that could cause it to throw a NullPointerException Build 1032: Eric M. Dashofy<EMAIL_ADDRESS>- Fixed a bug in xArchADT/XArchFlatInterface where isEquivalent could sometimes return a false positive when checking equivalence of two xArch objects whose classes have superclasses that are also xArch objects (i.e. are not xArch base types). Special thanks to Ping Chen<EMAIL_ADDRESS>Build 1031: Eric M. Dashofy<EMAIL_ADDRESS>- Fixed a bug in IdTable.java that could cause an exception to be thrown whenever an XMLLink that doesn't point at anything is removed. Special thanks to Roshanak Roshandel<EMAIL_ADDRESS>- Fixed a bug in ArchEdit that caused the edit pane (right pane) to remain even after an element has been removed. Build 1030: Eric M. Dashofy<EMAIL_ADDRESS>- The doc/ directory now has docs in it again; some previous builds were lacking docs because extraneous Java files in the ArchPruner component package were crashing Javadoc; these have now been removed. Build 1029: Eric M. Dashofy<EMAIL_ADDRESS>- Fixed a latent bug in CriticManagerGUI and CriticGUI that could cause issues or critics to disappear mysteriously when the window was closed and then re-opened. Special thanks to Christopher Van der Westhuizen<EMAIL_ADDRESS>Build 1028: Christopher Van der Westhuizen<EMAIL_ADDRESS>- Bugfix for Pruner component - Versions Pruner component added Matt Critchlow<EMAIL_ADDRESS>- New SelectorDriver to work with new Pruner, Versions Pruner Components. Build 1027: Eric M. Dashofy<EMAIL_ADDRESS>- getTagID() in XArchPath now returns tag ID. My bad. Special thanks to Matt Critchlow<EMAIL_ADDRESS>Build 1026: Eric M. Dashofy<EMAIL_ADDRESS>- Fixed Christopher Van der Westhuizen's email address in this changelog. Special thanks to Christopher Van der Westhuizen<EMAIL_ADDRESS>- getTargetPath() in an XArchFlatEvent now returns the correct path. Special thanks to Matt Critchlow<EMAIL_ADDRESS>- ArchEdit can now optionally view IDs or Descriptions of elements in the left (tree) pane. This is facilitated through a new "View" menu, with checkbox-menu-items for viewing IDs, Descriptions, neither, or both. Vaguely tested feature, YMMV. Build 1025: Eric M. Dashofy<EMAIL_ADDRESS>- Actually included the pruner component in archstudio.xml this time. My bad. Special thanks to Christopher Van der Westhuizen<EMAIL_ADDRESS>Build 1024: Eric M. Dashofy<EMAIL_ADDRESS>- Updated Description.java files to reflect changes in xADL 2.0 schemas, also updated shipping XML files generated by these programs. All files are now xADL 2.0-valid again. - New Pruner component integrated into architecture. - Integrated Bootstrapper component into bootstrapper architecture (See below) - Fixed a bug that caused the bootstrapper to hang at "Binding..." when passed a syntactically correct XML file that was not valid for instantiation. Bootstrapper now correctly reports the InvalidArchitectureDescriptionException to System.err. Special Thanks to Akash Garg<EMAIL_ADDRESS>Special Thanks to Jennifer Chen<EMAIL_ADDRESS>- Above bug fix resulted in initialization parameter support for AEM to be deprecated; this will be removed in a future release. If your code depends on passing instantiation parameters to AEM to instantiate an architecture (e.g. you've written your own Bootstrapper), contact Eric. Matt Critchlow<EMAIL_ADDRESS>- Updated SelectorDriver component. Ping Chen<EMAIL_ADDRESS>- Updated Selector component Christopher Van der Westhuizen<EMAIL_ADDRESS>- Added the Pruner component Build 1023: Eric M. Dashofy<EMAIL_ADDRESS>- Fixed a latent deadlock that can occur when starting ArchStudio on a fast machine. - Added keyboard mnemonics for file manager and ArchEdit. Special thanks to Christopher Van der Westhuizen<EMAIL_ADDRESS>- Various and sundry additions of source code that is not yet integrated; these are not the droids you're looking for. Build 1022: Matt Critchlow<EMAIL_ADDRESS>and Lewis Chiang<EMAIL_ADDRESS>- Updated booleaneval, selector, selectordriver components. Build 1021: Eric M. Dashofy<EMAIL_ADDRESS>- Added the files for the "From Architecture to Implementation" tutorial on the ArchStudio 3 website. - Clarified naming of URI vs URL in the file manager; more of this distinction will come in future builds. *Build 1021-DEV: Eric M. Dashofy<EMAIL_ADDRESS>- AEM now instantiates bootstrapped architectures (i.e. those passed in through an initialization parameter) in the same way as it instantiates ones via an event. Special Thanks to Maulik Oza<EMAIL_ADDRESS>- Fixed release note about ArchDiff/ArchMerge interfaces for build 1020, see below. Build 1020: Eric M. Dashofy<EMAIL_ADDRESS>- You can now communicate with the framework that instantiated your architecture using ArchMessages. See the sendArchMessage function in AbstractBrick. AEM handles ArchMessages by wrapping them in WrappedArchMessages and sending them out its bottom interface as notifications. - File Manager now asks you whether you want to overwrite an existing file when doing a Save-As. - IdTable no longer throws a RuntimeException when opening a file with unknown XML stuff (from schemas that have not been compiled into the data binding library, for instance). - Removed deprecated stuff (LJMConnectors, the old EBI stuff) NOTE: If your component code imports c2.legacy.comp.* or c2.pcwrap.comp.*, you may get error messages when compiling. Remove these import statements; they are no longer needed. - Added the -systemlaf option to archstudio.Bootstrap. You can now start applications with the system's Look and Feel instead of the default (Metal) look and feel. YMMV. - Fixed a bug in ArchEdit that threw an exception when adding a child element who was declared in a different context than the parent element. Special thanks to Vijaysundar Srirangam<EMAIL_ADDRESS>and Roshanak Roshandel<EMAIL_ADDRESS>- Added a "copy current value" button in ArchEdit. - ArchDiff and ArchMerge interfaces have changed; they are now completely event-based and the old EPC interfaces are no longer supported. NOTE: This release note was added after the release of 1020. Kari Nies<EMAIL_ADDRESS>- Updated coalition demo sources in c2demo/coalitiondemo. - Added coalition data manager component. - Added archstudio-coalition.xml file to bin/. Build 1019: Eric M. Dashofy<EMAIL_ADDRESS>- Fixed a bug in IdTable.java that caused RuntimeExceptions on some valid set(..., "href", ...) calls or clear(..., "href", ...) calls. - Various and sundry performance enhancements across the board. Put in a serious performance fix for OneThreadPerBrick message handler; now the handler only wakes up threads that are actually affected by a message being sent rather than every thread in the architecture. Approximate speedup for all these enhancements is between 40 and 70%. - For performance reasons, split up XArchADTC2Component and XArchTransactionsC2Component into alternatives, rather than XArchTransactionsC2Component being a "layer in front of" XArchADTC2Component. Now, architects using an architecture ADT should choose *either* XArchTransactionsC2Component (for applications needing transactions) *or* XArchADT (for applications not requiring transactions). Theoretically, this reduces flexibility slightly, as you can no longer add transaction support on the fly, but this functionality is rarely, if ever, needed. Speedup is another 40% or thereabouts. - I got tired of writing boilerplate subclasses of NamedPropertyMessage every time I wanted a new message type, so I wrote a simple generator. Try it. Run: java c2.util.MessageCodeGenerator - AEM has been completely rearchitected. AEM Driver now supports all the new functionality. AEM now responds to changes in bound architecture descriptions (i.e. it monitors transaction events from XArchTrans) and attempts to co-evolve the architecture along with the description. - Several fixes in the c2.fw framework regarding what happens when you remove a brick. Previously, brick removal was broken in several places, mostly because parts of the framework received a brickRemoved event *after* the brick had been removed, at which point there was not enough information left to clean up. Split that event into two events, brickRemoving (before removal) and brickRemoved (after removal), and fixed appropriate parts of the framework to listen for the correct event. Similar fix for weldRemoved->weldRemoving/weldRemoved. - Added an efficient isAttached(...) function to XArchFlatInterface. - Fixed the LinkCritic. - Fixed an error where removed critics didn't properly disappear from the Critic Manager GUI. - Updates to Klax - c2demo.klax.Description will now generate a spelling klax description on request. - You can now evolve Klax into spelling Klax properly, the wrong kinds of tiles in the chutes will disappear when this evolution takes place instead of just sticking around. - Fixed a race condition in AbstractArchitectureEngine that could cause a call to waitState() to wait forever. - Added the Notional AWACS Demo in c2demo.nad. xADL 2.0 descriptions are in bin/adxml. - Fixed a bug in c2.util.UIDGenerator that caused it to generate not-so-unique IDs. - Removed the c2demo.ebi demo, since the old EBI base classes are no longer supported. Ping Chen<EMAIL_ADDRESS>- Updates of ArchMerge, ArchMergeDriver, ArchDiff, and ArchDiffDriver. Special thanks to Christopher Van der Westhuizen<EMAIL_ADDRESS>Build 1018: Eric M. Dashofy<EMAIL_ADDRESS>- Added the ArchStudio Performance Tester component to do back-of-the-envelope performance tests on ArchStudio 3. - Put method caching in xArchADT (Speedup = 3%) - Various small performance/memory tweaks. - Replaced all Bus connectors with Filtering Bus connectors. Note that Filtering Bus connectors only implement Exclusive filters at this time. - Augmented EPC mechanism to send out exclusive filter messages for filtering connectors. (Speedup = 15%) - Finished the xArchADT transaction manager component. Now, xArchADT has full, real transaction support. Also, put a neat hack in the component that passes through non-write call messages to xArchADT directly (except during a commit). Note that this does affect performance of read calls slightly (Slowdown = 18%). - xArch Transaction Manager now sends out XArchTransactionEvents in addition to the regular XArchFlatEvents. Listen for one or the other, not both. - Fixed a regression in ArchEdit introduced in build 1017 when I accidentally left a debug print statement in there that could de-reference a null ObjRef. My bad. - Fixed a bug in IdTable.java that caused a NullPointerException when trying to remove a bad href reference. - Fixed a synchronization bug in ArchEdit that sometimes caused the "wait" cursor (hourglass) to remain active on an ArchEdit window even after an operation had successfully completed. - AEM now supports the JavaInitParams xADL 2.0 extension, which means you can now use the InitializationParameter[] parameter in component constructors and have it work with xADL 2.0 InitializationParameter elements. - Made several non-serializable classes in c2demo.klax serializable. Special thanks to Scott Hendrickson<EMAIL_ADDRESS>- Applied the ThreadInterfaceProxyFactory fix to AEMDriver's "instantiate" button. Special thanks to Scott Hendrickson<EMAIL_ADDRESS>Christopher Van der Westhuizen<EMAIL_ADDRESS>- New ArchDiff component, now included in archstudio.xml Special thanks to Ping Chen<EMAIL_ADDRESS>- New ArchDiffDriver component, also included in archstudio.xml Special thanks to Ping Chen<EMAIL_ADDRESS>Ping Chen<EMAIL_ADDRESS>- Updates of BooleanEval, Selector, SelectorDriver. Build 1017: Eric M. Dashofy<EMAIL_ADDRESS>- ArchEdit no longer throws a NullPointerException when you hit cancel on the "Open Architecture" dialog. Special thanks to Christopher Van der Westhuizen<EMAIL_ADDRESS>- AEM and AEM Driver now have the option of creating an instance model of the software system while instantiating it if you provide a URI for the instance model. Beta feature; YMMV. Christopher Van der Westhuizen<EMAIL_ADDRESS>- Initial integration of ArchDiff component; not included in main archstudio.xml yet. Build 1016: Eric M. Dashofy<EMAIL_ADDRESS>- Added klax.xml xADL 2.0 description of Klax - Added c2demo.klax.Description class to generate klax.xml Kari Nies<EMAIL_ADDRESS>- Updated Coalition Forces Demo sources. Build 1015: Eric M. Dashofy<EMAIL_ADDRESS>- Initial release of the ArchStudio 3 Critics Framework (see online documentation). This adds 11 new components to ArchStudio, 6 of which are design critics. - Added release notes in README.TXT - Implemented fairly reasonable equals() and hashCode() methods in NamedPropertyMessage that do equals-by-content rather than equals-by-reference. - Menu items in Invoke menu of File Manager/Invoker are now sorted by name. - Added the ThreadInterfaceProxyFactory class to c2.fw as a workaround for a deadlock issue involving single-threaded AWT/Swing implementations. See release notes for details. Special thanks to Rob Egelink<EMAIL_ADDRESS>- EPCs no longer throw an exception when the caller receives its own call. Special thanks to Sundararajan Sowrirajan<EMAIL_ADDRESS>and Maulik Oza<EMAIL_ADDRESS>Ping H. Chen<EMAIL_ADDRESS>- Initial release of the ArchStudio 3 BooleanEval, Selector, and SelectorDriver components. See the online documentation for more details. Joachim "Joe" Feise<EMAIL_ADDRESS>- Integrated the Klax demo application in c2demo.klax. *Build 1015-DEV: Eric M. Dashofy<EMAIL_ADDRESS>- Preliminary DEV release of the critic framework. - Closing an architecture no longer makes dead ArchEdit windows pop up. Special thanks to whoever reported that<EMAIL_ADDRESS>- File Manager window now starts at a slightly more reasonable size. - Added an efficient hasAncestor(...) function to XArchFlatInterface. - Fixed several bugs in IdTable.java that caused unnecessary runtime exceptions when dealing with malformed or mistargeted URLs. Special thanks to Ping Chen<EMAIL_ADDRESS>- Made RuntimeExceptions caused by InvocationTargetExceptions coming out of XArchFlatInterface have their target exceptions chained (using JDK1.4 chaining method) rather than just passing the string message in. This means that the stack traces on those exceptions will be much nicer. Build 1014: Eric M. Dashofy<EMAIL_ADDRESS>- Fixed a bug in IdTable.java regarding clearing the href part of an XMLLink. Fixed a bug in IdTable.java regarding resolving IDs and hrefs in cloned documents. Special thanks to Ping Chen<EMAIL_ADDRESS>*Build 1013-DEV: Eric M. Dashofy<EMAIL_ADDRESS>- Brought the reverse-XML-link-resolver functionality through to XArchFlatInterface from IdTable - feature has not been tested thoroughly so YMMV. - Made the 'Invalid Operation' exception in XArchFlatInterface more useful. Special thanks to Ping Chen<EMAIL_ADDRESS>- Significant updates to FredConnector and nameless LJM Build 1012: Eric M. Dashofy<EMAIL_ADDRESS>- Support for new data binding libraries based on the 05/2001 W3C Schema Recommendation. Co-released with new builds of Apigen and the Data Binding Library. Build 1011: Eric M. Dashofy<EMAIL_ADDRESS>- Bug fix for exception in getXArchURL(). Special thanks to Rob Egelink<EMAIL_ADDRESS>Build 1010: Eric M. Dashofy<EMAIL_ADDRESS>- Implemented proper Close/Exit functionality for both File Manger/Invoker and ArchEdit. Special thanks to Roberto Silveira Silva Filho<EMAIL_ADDRESS>Build 1009: Eric M. Dashofy<EMAIL_ADDRESS>- Added Change Log to the ArchStudio 3 Build - Fixed a bug in the Duplicate menu option of ArchEdit - Added the current type name of objects to the context menu in ArchEdit Build 1008: Eric M. Dashofy<EMAIL_ADDRESS>- Fixed a bug in IdTable.java that caused a NullPointerException when encountering an XMLLink with no HREF field, preventing some incomplete documents from parsing. This also fixed subsequent "Bad Mojo" exceptions. Special thanks to Girish Suryanarayana<EMAIL_ADDRESS>Build 1007: Eric M. Dashofy<EMAIL_ADDRESS>- Fixed several bugs in ArchEdit Duplicate functionality. Build 1006: Eric M. Dashofy<EMAIL_ADDRESS>- Initial release of cloneElement() function in xArchADT and ArchEdit Duplicate functionality. Build 1005: [No entries] Build 1004: [No entries] Build 1003: [No entries] Build 1002: [No entries] Build 1001: [No entries] Build 1000: Eric M. Dashofy<EMAIL_ADDRESS>- Initial release of ArchStudio 3 under the ISR Software Deployment system.


As digital marketing has evolved, the ability for businesses to reach potential prospects has increased.
Read MoreAs digital marketing has evolved, the ability for businesses to reach potential prospects has increased.
Read MoreAs digital marketing has evolved, the ability for businesses to reach potential prospects has increased.
Read MoreAs digital marketing has evolved, the ability for businesses to reach potential prospects has increased.
Read MoreAs digital marketing has evolved, the ability for businesses to reach potential prospects has increased.
Read MoreAs digital marketing has evolved, the ability for businesses to reach potential prospects has increased.
Read MoreSed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit.
Jhon Doe,Formera CEO, First Help Financial
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit.
Jhon Doe,Formera CEO, First Help Financial
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit.
Jhon Doe,Formera CEO, First Help Financial
The aim in changing and molding the future is our game plan. As change is important in today’s world to progress, alter , and innovate, we at Inception thrive to make valuable and cutting-edge change for our Clients.
Get in touch


Before Change
x = features[None, :, :]
// For dense matrix, remove batch dimension
A_mat = Lambda(lambda A: K.squeeze(A, 0))(A_t)
out = GraphConvolution(2)([x_t, A_mat])
model = keras.Model(inputs=[x_t, A_t], outputs=out)
preds = model.predict([x, adj], batch_size=1)
After Change
// batch dimension > 1 should work with a dense matrix
x_t = Input(batch_shape=(10,) + features.shape)
A_t = Input(batch_shape=(10, 3, 3))
input_data = [np.broadcast_to(x, x_t.shape), np.broadcast_to(adj, A_t.shape)]
out = GraphConvolution(2)([x_t, A_t])


Luke 11:14
And he was casting out a devil, and it was dumb.


The UK is a maritime nation, coupled with being low in many natural resources, it has depended on trade for centuries as its main form of revenue. The UK joined the EEC in 1973 before it became the EU in a bid to open up new markets for UK trade and help boost the economy. The UK exports globally and being a member of the EU has its drawbacks and advantages for the UK and its trading efforts. Out of all the topics, this one has the largest potential impact (economically at least) on what the UK will look like in the future.
Below are the 3 main headline stats you'll need to know. Keep scrolling to continue.
Picking additional topics will repeat what you've just completed above but with new topics that you select. Return to home will, you know, return you to the home page.
Pick additional topicsReturn to home


Differences from technical report, ECOOP'16 paper and artifact
lchannels
is under development. The Imperial
College technical report and the ECOOP'16 paper
mentioned here are
still accurate, except for the following changes.
Backward-incompatible changes
-
In.receive
and the other input methods now throw an exception if used more than once (similarly toOut.send
).In.future
, instead, can be invoked multiple times, as before. Note, however, that you should never use bothIn.receive
andIn.future
: either use the former (only once), or the latter (similar remarks already applied toOut.send
andOut.promise
).
Backward-compatible changes
-
The implementation is now slightly more complex, and centred
around
In.receive
/Out.send
, instead ofIn.future
/Out.promise
(which are still available, and work as expected). -
The new classes
SocketIn
/SocketOut
, very similar toStreamIn
/StreamOut
, provide a more optimised and direct socket abstraction. - The performance has improved! (New benchmark results coming soon)


The following figure shows examples of components equipped with a support flange (framed flange in the lower center), which can be used to fix components on the ground or on other rotating elements or to combine them with force elements. Via Boolean parameter useSupport, the support torque is enabled or disabled. If it is enabled, it must be connected. If it is disabled, it need not be connected. Enabled support flanges offer, e.g., the possibility to model gearboxes mounted on the ground via spring-damper-systems (cf. example ElasticBearing).
Depending on the setting of useSupport, the icon of the corresponding component is changing, to either show the support flange or a ground mounting. For example, the two implementations in the following figure give identical results.


Fishing Guild Member Hilgendorf:
Welcome, my young friend! Nice to meet you! It's a great day to go fishing!
My family have been members of the fishing guild since my great-grandfather joined. In fact, that's why I was sent here to Rune. Not only is the fishing particularly challenging here, but it's become something of a hobby among the elite.
Ask how to fish.
Fishing Contest
Learn fishing skill.
Buy/Sell/Refund.
Sell fish.
View information about the local lord and tax rate.
Quest


Ivy configuration
In order to work as you want, EasyAnt sometimes need some settings. Actually, EasyAnt can work with no specific settings at all, see the default settings documentation for details about that. Ivy is able to work in very different contexts. You just have to configure it properly. Settings are specified through an xml file, usually called ivysettings.xml. Here is an example of settings file :
Mainly, the settings enable to configure the default cache directory used by ivy and the dependency resolvers that it will use to resolve dependencies.
Note: To work, this settings file needs a property file named ivysettings-file.properties in the same directory as the settings file, with ivy variables you want in it.
If you want to have more details on this settings file we strongly recommend you to read the
reference documentation of settings file
EasyAnt uses two ivy instance :
The project ivy instance is in charge to configure ivy for your project (configure repositories used to retrieve your projects dependencies for example).
EasyAnt ivy instance is in charge to configure ivy for easyant internal use (configure repositories used to retrieve buildtypes/plugins/skeletons for example).
There is a strong separation of context, this means that plugins dependencies will not be polluting your project. Both instance are configurable.
Project ivy instance
can be configured through an ivysettings file defined through properties.
EasyAnt ivy instance
can be configured through an ivysettings file defined in easyant-config.


Hello, Ehcache
Introduction
Ehcache is a cache library introduced in 2003 to improve performance by reducing the load on underlying resources. Ehcache is not for both general-purpose caching and caching Hibernate (second-level cache), data access objects, security credentials, and web pages. It can also be used for SOAP and RESTful server caching, application persistence, and distributed caching.
Definitions
-
cache: Wiktionary defines a cache as “a store of things that will be required in future, and can be retrieved rapidly.” A cache is a collection of temporary data that either duplicates data located elsewhere or is the result of a computation. Data that is already in the cache can be repeatedly accessed with minimal costs in terms of time and resources.
-
cache-hit: When a data element is requested of the cache and the element exists for the given key, it is referrred to as a cache hit (or simply ‘hit’).
-
cache-miss: When a data element is requested of the cache and the element does not exist for the given key, it is referred to as a cache miss (or simply ‘miss’).
-
system-of-record: The authoritative source of truth for the data. This is often referred to as a system-of-record (SOR). The cache acts as a local copy of data retrieved from or stored to the system-of-record. This is often a traditional database, although it might be a specialized file system or some other reliable long-term storage. For the purposes of using Ehcache, the SOR is assumed to be a database.
-
SOR: See system-of-record.
Why caching works
Locality of Reference
While Ehcache concerns itself with Java objects, caching is used throughout computing, from CPU caches to the internet Domain Name System (DNS) system. Why? Because many computer systems exhibit “locality of reference”. Data that is near other data or has recently been used is more likely to be used again.
The Long Tail
Chris Anderson, of Wired Magazine, coined the term “The Long Tail” to refer to e-commerce systems: a small number of items can make up the bulk of sales, a small number of blogs can get the most hits, and there is a long “tail” of less popular ones.
The Long Tail is an example of a Power Law probability distribution, such as the Pareto distribution or 80:20 rule. If 20% of objects are used 80% of the time and a way can be found to reduce the cost of obtaining that 20%, system performance will improve.
Will an Application Benefit from Caching?
Often the answer is yes, especially if the application is I/O bound. If an application is I/O bound and depends on the rate at which data can be obtained. If it is CPU bound, then the time taken principally depends on the speed of the CPU and main memory. Caching can improving performance and also reduce the load on a web server.
Speeding up CPU-bound Applications
CPU bound applications are often sped up by:
- improving algorithm performance
- parallelizing the computations across multiple CPUs (SMP) or multiple machines (clusters).
- upgrading the CPU speed.
A cache can temporarily store computations for reuse, including but not limited to:
- large web pages that have a high rendering cost
- authentication status, where authentication requires cryptographic transforms
Speeding up I/O-bound Applications
Many applications are I/O bound, either by disk or network operations. In the case of databases they can be limited by both.
There is no Moore’s law for hard disks. A 10,000 RPM disk was fast 10 years ago and is still fast. Hard disks are speeding up by using their own caching of blocks into memory.
Network operations can be bound by a number of factors:
- time to set up and tear down connections
- latency, or the minimum round trip time
- throughput limits
- overhead for marshalling and unmarshalling
The caching of data can often help a lot with I/O bound applications. Some examples of Ehcache uses are:
- Data Access Object caching for Hibernate
- Web page caching, for pages generated from databases
Increased Application Scalability
The corrolary to increased performance is increased scalability. Suppose you have a database that can perform up to 100 expensive queries per second. Beyond that threshold, the database backs up and if addition connections occur, the database slowly dies.
In this case, caching is likely to reduce the workload. If caching can cause 90% of that 100 to be cache hits and not impact the database, the database can scale 10 times higher.
How much will an application speed up with Caching?
In applications that are I/O bound, which is most business applications, most of the response time is getting data from a database. In a system where each piece of data is used only one time, there is no benefit. In a system where a high proportion of the data are reused, the speed up is large.
Applying Amdahl’s Law
Amdahl’s law finds the total system speed up from a speed up in part of the system.
1 / ((1 - Proportion Sped Up) + Proportion Sped Up / Speed up)
The following examples show how to apply Amdahl’s law to common situations. In the interests of simplicity, we assume:
- a single server
- a system with a single thing in it, which when cached, gets 100% cache hits and lives forever.
Persistent Object Relational Caching
A Hibernate Session.load()
for a single object is about 1000 times faster from cache than from a database.
A typical Hibernate query will return a list of IDs from the database, and then attempt to load each. If Session.iterate()
is used, Hibernate goes back to the database to load each object.
Imagine a scenario where we execute a query against the database tha returns a hundred IDs and then load each one. The query takes 20% of the time and the roundtrip loading takes the rest (80%). The database query itself is 75% of the time that the operation takes. The proportion being sped up is thus 60% (75% * 80%).
The expected system speedup is thus:
1 / ((1 - .6) + .6 / 1000) = 1 / (.4 + .0006) = 2.5 times system speedup
Web Page Caching
An observed speed up from caching a web page is 1000 times. Ehcache can retrieve a page from its SimplePageCachingFilter
in a few milliseconds.
Because the web page is the result of a computation, it has a proportion of 100%.
The expected system speedup is thus:
1 / ((1 - 1) + 1 / 1000) = 1 / (0 + .0001) = 1000 times system speedup
Web Page Fragment Caching
Caching the entire page is a big win. Sometimes the liveness requirements vary in different parts of the page.
Here the SimplePageFragmentCachingFilter
can be used.
Let’s say we have a 1000 fold improvement on a page fragment that taking 40% of the page render time.
The expected system speedup is thus:
1 / ((1 - .4) + .4 / 1000) = 1 / (.6 + .0004) = 1.6 times system speedup
Cache Efficiency
Cache entrie do not live forever. Some examples that come close are:
- “static” web pages or web page fragments, like page footers
- database reference data, such as the currencies in the world
Factors that affect the efficiency of a cache are:
- liveness—how live the data needs to be. The less live, the more it can be cached
- proportion of data cached—what proportion of the data can fit into the resource limits of the machine. For 32-bit Java systems, there was a hard limit of 2 GB of address space. 64-bit systems do not have that constraint, but garbage collection issues often make it impractical to have the Java heap be large. Various eviction algorithms are used to evict excess entries.
- Shape of the usage distribution—If only 300 out of 3000 entries can be cached, but the Pareto (80/20 rule) distribution applies, it might be that 80% of the time, those 300 will be the ones requested. This drives up the average request lifespan.
- Read/Write ratio—The proportion of times data is read compared with how often it is written. Things such as the number of empty rooms in a hotel change often, and will be written to frequently. However the details of a room, such as number of beds, are immutable, and therefore a maximum write of 1 might have thousands of reads.
Ehcache keeps these statistics for each Cache and each element, so they can be measured directly rather than estimated.
Cluster Efficiency
Assume a round robin load balancer where each hit goes to the next server. The cache has one entry which has a variable lifespan of requests, say caused by a time to live (TTL) setting. The following table shows how that lifespan can affect hits and misses.
Server 1 Server 2 Server 3 Server 4 M M M M H H H H H H H H H H H H H H H H ... ... ... ...
The cache hit ratios for the system as a whole are as follows:
Entry Lifespan Hit Ratio Hit Ratio Hit Ratio Hit Ratio in Hits 1 Server 2 Servers 3 Servers 4 Servers 2 1/2 0/2 0/2 0/2 4 3/4 2/4 1/4 0/4 10 9/10 8/10 7/10 6/10 20 19/20 18/20 17/20 16/10 50 49/50 48/50 47/20 46/50
The efficiency of a cluster of standalone caches is generally:
(Lifespan in requests - Number of Standalone Caches) / Lifespan in requests
Where the lifespan is large relative to the number of standalone caches, cache efficiency is not much affected. However when the lifespan is short, cache efficiency is dramatically affected. (To solve this problem, Ehcache supports distributed caching – available with Terracotta BigMemory Max – where an entry put in a local cache is propagated to other servers in the cluster.)
A cache version of Amdahl’s law
Applying Amdahl’s law to caching, we now have:
1 / ((1 - Proportion Sped Up * effective cache efficiency) + (Proportion Sped Up * effective cache efficiency)/ Speed up) effective cache efficiency = (cache efficiency) * (cluster efficiency)
Web Page example
Applying this formula to the earlier web page cache example where we have cache efficiency of 35% and average request lifespan of 10 requests and two servers:
cache efficiency = .35 cluster efficiency = .(10 - 1) / 10 = .9 effective cache efficiency = .35 * .9 = .315 1 / ((1 - 1 * .315) + 1 * .315 / 1000) = 1 / (.685 + .000315) = 1.45 times system speedup
If the cache efficiency is 70% (two servers):
cache efficiency = .70 cluster efficiency = .(10 - 1) / 10 = .9 effective cache efficiency = .70 * .9 = .63 1 / ((1 - 1 * .63) + 1 * .63 / 1000) = 1 / (.37 + .00063) = 2.69 times system speedup
If the cache efficiency is 90% (two servers):
cache efficiency = .90 cluster efficiency = .(10 - 1) / 10 = .9 effective cache efficiency = .9 * .9 = .81 1 / ((1 - 1 * .81) + 1 * .81 / 1000) = 1 / (.19 + .00081) = 5.24 times system speedup
The benefigt is dramatic because Amdahl’s law is most sensitive to the proportion of the system that is sped up.