Minerva
A brief history of the little framework that could
Josh Knutson
- Software Developer 3
- @ Imagtrend for 8+ years
- Working in CF, JS, CSS, and some .NET
Minerva
Roman name of Greek goddess Athena -Goddess of wisdom, crafts, and other stuff
Township in NW Minnesota by Bemidji
History
- Started in 2009
- over 100 authors have contributed
- Convention based
Known Projects using Minerva
- Cornerstone(sold)
- Maverick/Firstcomp(sold)
- Patient Registry
- Cat Auctions
- PAR
- Licensure
- Service Bridge
- Service Bridge
- Resource Bridge
- Clickcomplete/Crow River Winery
- Medtronic
- ReportWriter
- Others I forgot....
Architecture
- Service Oriented Architecture
- Model-View-Controller design pattern
Coldspring
-
Open source dependency injection framework for ColdFusion
- Based off the Spring framework for Java
- Manages components (CFCs)
- http://www.coldspringframework.org/
Helpers Scope
-
Utility components used for common methods
- Managing scoped data (request, session)
- Displaying form fields
- Formatting data
- Accessing config settings
-
Created by ColdSpring post-processor
- HelpersScopePostProcessor.cfc
- Available to all singleton beans and views
Helpers Bean Definition
<bean id="helpers"
class="minerva.utils.beans.factory.HelpersScopePostProcessor"
bean-post-processor="true">
<property name="directories">
<list>
<value>/trauma/app/helpers/</value>
<value>/minerva/app/helpers/</value>
</list>
</property>
</bean>
Base Components
- Contain core functionality
- Project components should extend base components
Other Goodies
- Parent environments in environment.xml that can inherit for faster setup of new environments
- Packages in AssetManager
- Display helpers using permissions
-
XML based managers
- AccessManager
- ActionManager
- ActivityManager
- AlertManager
Convenience Methods
-
minerva.base.Component
- getBean()
- getBeans()
- containsBean()
- getBeanFactory()
-
minerva.base.View
- getValue()
- setValue()
- hasValues()
- getValues()
Custom Tags
Tags to call display helpers but look more like html
<c:select name="FacilityID" label="Facility"
options="#local.getHospitals#" value="#local.defaultOffice#"
required="true" message="A facility is required" />
<c:number name="sort_order" value="#TheSortOrder#" />
Layout Manager
- Checks permissions for page access
- injects Helpes scope
- Can use different layouts that a developer can specify, user profile vs list page
Random Utility Functions
- arrayToQuery()
- arrayCombine()
- arraySlice()
- arrayReverse()
- structToArray()
- structToHidden()
- structToQuery()
- structToQueryString()
- structsToQuery()
- csvToQuery()
- getBoolean()
- getNumeric()
- findValue()
- queryStringToStruct()
- xmlToStruct()
- xmlToArray()
- queryToArray()
- queryToCSV()
- queryToList()
- queryToStruct()
- queryToStructs()
What did it solve
Why did we even do it?
- Developers could be use to the same type of "Helper" code to accomplish tasks
- Easy to switch between different projects, have same convention
- Easy to start a new project and have an established base for security, layouts, etc
Problems
What problems arose from the shared framework
Too many cooks
- Any developer can commit
- Most will commit to fix a 'thing'
- they miss the big picture
- Creating branches(forks) and not merging from trunk(master) to get enhancements
- Documentation
Ownership
Original Code Champions moved on to other opportunities
Management saw it as a large monolith code base
Developers blame their problems with it
No real documentation or good example code
If we could turn back time
What would we change
Ownership
Have sense of ownership belonging to leads to a certain extent They should know what other teams have developed that they could leverage
Sample Project with Documentation
Have a Sample Project that would be heavily documented, akin to bootstrap sample page possibly
More Components
Force more developers to add to plugins instead of the Core
Not everyone needs the code for CMS
Minerva
A brief history of the little framework that could