InfoGrid 2.9.5 Released
It’s been a while since the last release, but why change if users are been generally happy with it
… Here’s what’s new:
Highlights:
- Native support for currency values (e.g. $1.23 USD)
- Even simpler JSON generation
- StringDataTypes can now carry a regular expression, which is checked before assignment (e.g. makes it impossible to assign a String that isn’t to a property that must contain an e-mail address)
- Support for cascading delete
- InfoGrid compilation is now reported to work on Windows
- Multi-tenancy support for LID
- More flexible handling of HTTP status codes in Probe framework (e.g. what should happen upon a redirect)
- Extensions to custom JEE tags and HttpShell to make JSP programming with InfoGrid even simpler, e.g. simple tags to create Javascript-based overlay forms
- Improved error reporting
- Additional tests
- Lots of small usability improvements and bug fixes
Here are the gory details:
Core:
- ModuleAdvertisementSerializer to generate relative paths to JARs
- more types of MeshObjectSelector
- added getLocalId to NetMeshObjectIdentifier
- added guessFromExternalForm to IdentifierFactory
- use “” not null for localId of home object
- Augmented set of pre-defined BlobDataTypes
- Improved BlobDataType to check for MIME compatibility with regexes
- added CurrencyValue and CurrencyDataType to represent money as a primitive type
- added convenience method to MeshObject: determine whether the relationship to a neighbor MeshObject is blessed with a certain RoleType
- Moved OnDemandTransaction from HttpShell into utils
- implemented cascading delete support
- added TimeStampValue.earlierOf and TimeStampValue.laterOf for convenience
- Special value NOW for TimeStampValue parsing
- regex can be be specified for StringDataTypes
- added AbstractDelegatingLocalizedRuntimeException for symmetry and completeness
- better error reporting for TransactionActionExceptions
- Explicitly set latin1 character set in MySQL store to avoid key size error when the default character set is multi-byte.
- TransactionAction.execute() now does not take a Transaction parameter any more, but provides it as a member variable
- check raw id even when guessing MeshObjectIdentifier
- when there’s a ParseException during parsing of store content, don’t return null but throw NoSuchElementException
- Added MeshObjectHelper for simpler JSP programming with TypedMeshObjectFacades
- Carry specify exceptions keyed by failed MeshObjectIdentifiers in MeshObjectAccessException, instead of swallowing all exceptions other than the first
- MeshObjectsNotFoundException is not a subclass of MeshObjectAccessException any more
- Correct singular/plural error messages for MeshObjectAccessException and MeshObjectsNotFoundException
- NetMeshObjectAccessException now carries redirect NetMeshObjectAccessSpecifications
- NetMeshObjectAccessSpecification is now an Identifier
- Migrated sweeping functionality from the various MeshBase implementations into Sweeper. The policy functionality of Sweeper became SweepPolicy.
- Better pingpong debugging support
- created MeshObjectSet.hasSameContent
- upgrade to warn if MySQL database cannot be detected/created
- Id column in MySQL needs to be case-sensitive
- don’t report exception in rollback that isn’t an error
- default expiration for UnnecessaryReplicasSweepPolicy
- Allow the sweep of a single MeshObject
- MeshObject.delete and sub-methods have no business to throw NotPermittedException
- Non-semantic “kill” of a ShadowMeshBase
- Kill button in ShadowAwareAllMeshBasesViewlet
- No need for public method initiateCeaseCommunications on Proxy
- Don’t try to talk to Proxies when NetMeshBase is dead
- Tolerate some IsDeadExceptions when dead (duh)
- Use default mime type for BlobValue when none is given when parsing StringRepresentation
- Avoid that IsDeadException kills meaningful error message
- support typefield XML attribute for StringDataTypes as well
- added StringDataType for e-mail
- fixed automatic merge problem
- allow MeshObject.equals( TypedMeshObjectFacade ) for simplicity
- use get_XXX pattern in TypedMeshObjectFacade for non-Properties/non-pseudo-Properties to avoid name clashes with code-generated setters
- use get_XXX pattern in TypedMeshObjectFacade for non-Properties/non-pseudo-Properties to avoid name clashes with code-generated setters
- renamed Rfc3339Util to DateTimeUtil and expanded to W3C timestamps
- DefaultNetMeshBaseIdentifierFactory now uses pluggable “Scheme”s to support identifiers of various protocols, including http, https, file, xri, acct
- renamed UnknownProtocolParseException to UnknownSchemeParseException
- added ability to specify Maps in Resource files
- When parsing NetMeshBaseIdentifiers, turn each String into canonical form as well, e.g. hTTp: and http:
- added toColloquialExternalForm() to Identifier; more sane
- removed IdentifierStringifier.toColloquialIdentifier()
- use guessFromExternalForm in more places for more tolerance (e.g. when reading from Store to be more tolerant of Scheme changes)
- be more tolerant of Exceptions when restarting MeshBases; try best-effort
- Better logging of start / die of InfoGridWebApps
- when resetting PingPong, only increment token by 1
- more defensive programming if Storage layer is corrupt
- refactor message sending framework to always deliver all received messages together instead of singly
- merge two XprisoMessages before processing if possible
- added ByPropertyValueSelector and PropertyComparisonOperator
- NotRelatedException not thrown any more when testing whether two MeshObjects are related by a given RoleType; was counter-intuitive and pedantic
- StringRepresentationParameters must always be given.
- Make it easier to generate MeshObjectIdentifiers with different lengths
- upgraded Postgresql JDBC for 64bit support
- Netbeans 7 support
- Make sure Threadpool is always cleanly shut down. Now Tomcat won’t hang occasionally after undeploy.
- support custom regex violation error messages for PropertyTypes that specify regular expressions
- refactored L10Map into L10PropertyValueMap and L10StringMap, moved to utils package
- more HTML class declarations in BlobValue HTML
- added invert method to most MeshObjectSelectors
- added MeshObjectSet.subset convenience method
- Don’t include dead MeshObjects in MeshObjectSets
- factored out ExternalCommand so invoking an external process becomes simpler
- default MeshObjectIdentifier to contain _ instead of ~
Identity-related:
- AccountManager needs a site parameter for determining account to support multi-tenancy
- generate login event even if only the session gets renewed
- XrdsProbe to cache the XRDS file
- added content and content type as parameters to XmlProbe interface; enables XrdsProbe to cache the XRDS file
- added getGroupNames to LidAccount
- check group membership by group identifier as well as group name
- also check group membership by groups set as request attribute
- factored out some symbolic OpenID parameter names
- fix when associations expire
- Better integrated AccessManager and ThreadIdentityManager
- root may do anything in AclBasedAccessManager
- Split AclBasedSecurity into two: an ACL-based AccessManager implementation that does not rely on Guards, and an AccessManager implementation that evaluates Guards but is independent on a particular model (such as the AclBasedSecurity model)
- Eliminated org.infogrid.model.AclBasedSecurity, and instead introduced org.infogrid.meshbase.security.aclbased, which also includes a model
- DelegatingAccessManager now supports delegating to multiple other AccessManagers, all of which must agree
- added ThreadIdentityManager.suExec
- When there isn’t a ProtectionDomain, it’s free for all in AclBasedAccessManager
- moved org.infogrid.model.SecurityTest into the attic; currently not used
- added expiring credentials to AuthenticationStatus
- expired OpenID associations throw OpenIdAssociationExpiredException
- OpenID dumb mode fixes
- Added getCarriedExpiredCredentialTypes to LidClientAuthenticationStatus
- added org.infogrid.lid.model.account/Account_LastLoggedIn which can come in handy
- Removed Account Status value CREATED — not particularly useful and would have needed update logic
- credential values are now separate from LidAccount, e.g. the StoreLidPasswordCredentialType knows where to look for the password
- don’t need LidCredentialType.isRemote any more
- allow password change from StoreLidPasswordCredentialType
- removed realm from LID; never quite used
- better support for multi-tenancy / virtual hosts in LID: carry siteIdentifier around in more places
- distinguish one-time-tokens from other types of credentials in LID
- more methods for setting, checking, resetting password credentials
- support that MeshObject can own itself in AclUtils
- A little helper utility to generate secret keys
Model-related:
- Code-generate an entry for the SubjectArea itself, too
- exactly one SubjectArea element is expected in each model element in the model XML
- Added HTTP status code and location properties to WebResource
- minor rename of SubjectArea user-visible name
Probe-related:
- Handle HTTP redirects better when encountered by Probes; existing behavior should be unchanged however
- Do not throw FactoryException as a direct cause of NetMeshObjectAccessException but its cause instead
- Introduced ProbeException.HttpRedirectResponse
- Added NetMeshBaseRedirectException, so ProbeException.HttpRedirectResponse does not need to be moved up to module org.infogrid.kernel.net
- Introduced HttpMappingPolicy that enables different policies for mapping HTTP non-OK status codes into InfoGrid; default remains the same behavior
- Change in API to set up ProbeManagers etc.: ProbeDirectory passed to ProbeManager instead of ShadowMeshBaseFactory, then ShadowMeshBaseFactory is notified where ProbeManager can be found
- ProbeException.HttpErrorResponse not needed any more
- Support HTTP redirects that give relative URLs as Location, against the HTTP spec (I’m looking at you, Google)
- HttpMappingPolicy has moved from ProbeManager to ProbeDirectory
- Fixes issue where wrong HttpMappingPolicy was set upon restore of Shadow from disk
- Throw exception if ProbeManager is configured without a ProbeDirectory
- added basic XRD support to InfoGrid
- added acct: as one of the basic protocols supported by NetMeshBaseIdentifier
- added Webfinger support
- Don’t throw ProbeException.DontHaveNonXmlStreamProbe if the found content is of length zero
Viewlet/GUI-related:
- Renamed NotIfViewletState to NotIfViewletStateTag for consistency
- throw correct error message if no subject
- fix status in AbstractSetIterateTag
- colloquial=true by default
- by default, sort alphabetically in TreeIterateTag
- fix display of <HOME> for home object broken in last checkin
- added potentiallyShorten to WebContextAwareMeshObjectIdentifierStringifier
- instrument to track HTTP client-side calls
- trim strings first to deal with sloppy JSP writing
- added request property to JeeMeshObjectsToView
- change default app server to Tomcat6
- pass SaneUrl through to ViewletFactory, so it can access request attributes
- created org.infogrid.jee.security.aclbased tag library for AclBasedSecurity Subject Area
- added TextStructuredResponseSection.containsContent
- replaced ViewletAlternativesTag.js with more general-purpose ToggleCssClass.js
- support redirect to newly created object in HttpShell
- Created BracketTags, which allow conditional generation of, say, <ul> and </ul> tags depending on whether or not the content tag has any non-whitespace content.
- factored out AbstractSaneRequest.urlWithoutMatchingArguments for easier reusability
- trim entered identifiers before trying to resolve them in HttpShellFilter
- Better error reporting for HttpShell
- IncludeViewletTag more robust if path not specified
- Removed the List<Throwable> in request attribute for collecting processing exceptions; now abstracted into new interface ProblemReporter
- Allow null identifiers for create access verb in HttpShell again
- hyperlink on UnsafePostException’s message
- TitleTag to use a separate section in the StructuredResponse
- default mechanism for TitleTag with Viewlet name and app name, can be overridden with TitleTag
- <tmpl:title> tag prints <title> tags itself
- fixed userVisibleName on Viewlet
- JeeViewlets’ default POST URL used to sometimes leave out reached MeshObjects, which would list all found-by-traversal MeshObjects after post, which was very confusing. Removed traversal spec in case there are no reached MeshObjects
- Pass subject’s userVisibleString into default Viewlet title construction.
- Created InvalidViewletActionException.
- enable logging of when InfoGridWebApps start and stop
- added HttpShellHandler to HttpShell
- rollback Transaction if there is an exception during execution by HttpShell
- support for radiobox-driven “which MeshObject should I be related to” relate/unrelate from the HttpShell
- Added sweep and accessLocally to HttpShell HTML
- Created ProxyTag in analogy to emitting other objects like MeshObjects etc.
- Sweep support for the HttpShell
- Added limit parameter to SetIterateTags in analogy to SQL limit
- Added MeshObjectSetIterateBeyondLimitTag that gets invoked when a MeshObjectSet iteration stops due to a limit parameter so the JSP can display a “more” link or something like that
- display trailing slash on URLs even if isColloquial; if not, user cannot distinguish URLs with and without trailing slashes
- added IfNullTag and NotIfNull tag
- allow to set properties via the HttpShell at the same time the MeshObject is only being created
- working on allowing to set properties via the HttpShell at the same time the MeshObject is only being created
- added allowNull attribute to PropertyTag to remove “remove” label for optional properties when so needed
- fix ignore=”true” bug in MeshObjectTag
- implemented a “JSP subroutine” set of custom tags
- allow TypedMeshObjectFacade in place of any MeshObject for JSP custom tags; makes life simpler
- use ‘block’ instead of ‘inline’ for create label in PropertyTags, so CSS can be used to move label vertically
- added the just-completed Transactions to the invocation of HttpShellHandler, so implementations have a chance to understand what happened
- added deleted MeshObjects to variable map passed to HttpShellHandler
- tag to easily report a problem into the error log
- tags to safeguard JSPs against inadvertent invocation by the wrong user or with the group user groups
- support AccountStatus APPLIEDFOR and REFUSED
- change default HTML title if Viewlet reports error; that way we don’t accidentially leak information if there is an access control problem
- Re-implemented CSRF remedy: now match cookie and form instead of issuing form tokens
- use lowercase cookie names
- Added NotIfErrorsTag and NotIfInfoMessagesTag
- Use StringRepresentation framework to format the label String for null PropertyValues
- augmented HttpShellHandler to have invocable method before, after, at the beginning and at the end of Transactions
- MeshType may be given directly in PropertyIterateTag
- Change where <HOME> special identifier is defined. Stringifying MeshObjectIdentifier for HomeObject now produces “”, while stringifying MeshObject produces <HOME>
- HttpShell now recognizes “not set” value because “” is now a valid value for a MeshObjectIdentifier
- added JspoXXXTags
- removed now unnecessary org.infogrid.jee.store project
- carry incoming request in DefaultJeeNetMeshObjectsToView
- Allow both bean and identifiers in AbstractRelatedTag and subclasses
- always use multi-part encoding for Jspo forms so file uploads are always possible
- make JSP tags more consistent that use MeshObjects: can now specify MeshObject directly, MeshObjectIdentifier (direct and as String), or name of bean
- added MeshObjectBlessedByTag
- allow optional parameters on Jspo and Jspf tags
- Support $1.23 in addition to 1.23 USD for CurrencyValue
- support different capitalizations for MeshObjectBlessedByTag
- SingleMemberTraversalTag for convenience
- additional keywords for HttpShell
- allow HttpShell to override/specify direction of a redirect after shell execution
- additional callback afterAccess for HttpShell
- allow immediate activation of called JspoTag through property on call
- Added Json viewlet. New viewlet that will write a direct acyclic object graph in Json to level n.
- added custom tag that makes it easy to iterate over the intersection of two traversal sets
- allow MeshObjectBlessedByTag to write to a variable instead of to stdout
- rollback transaction when HttpShellHandler throws HttpShellException
- added MissingArgumentException that turns out to be generally useful
- Created custom tags to help matching URL arguments easily
- fixed incorrect processing of RuntimeException in HttpShell (particularly from HttpShellHandlers)
- DataType would sometimes invalidly truncate HTML output with maxLength specified. Hope this implementation is better.
- slight refactoring of JeeViewlet-internal API to make it easier to remove URL parameters from Viewlet’s default Post URL
MeshWorld/NetMeshWorld-related:
- Show number of MeshObjects in the MeshBase in AllMeshObjectsViewlet
- round borders for webkit-based browsers too
- NetMeshWorld has no business depending on AclBasedSecurity at this time
- introduced property AnetMeshBase.ALLOW_NON_LOCAL_MESHOBJECT_CREATION to allow non-local NetMeshObject creation — useful for test instrumentation, for example
- created ModuleInventoryViewlet
- added app resource file to MeshWorld and NetMeshWorld
- Added Sweeping button into NetMeshWorld.
- Added ability to filter MeshBase content in AllMeshObjectsViewlet
- Enable AllMeshObjectsViewlet to view empty sets.
- Added properties file for Log4jConfigurationViewlet
- add direct link to PropertySheetViewlet from AllMeshObjectsViewlet
- Added filtering by home proxy to AllNetMeshObjectsViewlet
- NetMeshWorld uses AllNetMeshObjectsViewlet, not AllMeshObjectsViewlet now
- added “requires Javascript” via <noscript> to templates in example and test apps
- Sort EntityTypes alphabetically in AllMeshObjectsViewlet
