SlideShare una empresa de Scribd logo
1 de 40
Descargar para leer sin conexión
Customizing Share Best Practices!
      Will Abson, Senior Solutions Engineer

                    @wabson!
       Jeff Potts, Chief Community Officer!
                  @jeffpotts01!
“Best Practices” Disclaimer!

•  We’ve done a lot of Share customization
   implementation work
 •  BUT, things are changing quickly!


•  “Best Practice” is more succinct than “things we
   really feel strongly about based on all of the work
   we’ve done so far”

•  It would be great to get community feedback on
   these recommendations and ones we’ve missed
Customizing Share!

Evolution of Alfresco UI customization




         Image: http://en.wikipedia.org/wiki/File:Human_evolution_scheme.svg
What Can I Customize?!
What Can I Customize?!
What Can I Customize?!
High Level Architecture!




                       Web	
  Scripts	
  




                       Web	
  Scripts	
  
Share Architecture!
Share Architecture!
Categories of Recommendations!

•  Methodology
•  Team Structure
•  Project Folder Structure and Build Tools
•  Packaging
•  Namespaces
•  Development Tools and Frameworks
•  Documentation
•  Testing
Rec: Use an Iterative Customization Process!

Lightweight technologies allow rapid iteration
Example: Content Expiration Page!

Sprint 1           Sprint 2            Sprint 3
Repository         Share dashlet and   Share dashlet and
customisations and web script JSON     custom page
HTML web script    template


                                               -click-

                           -click-
Rec: Divide Team by Tier!

•  If new repo tier web scripts are needed
 1.  Agree on a contract (URLs, Responses)!
 2.  Stub out JSON!
 3.  Create tests using the agreed to contract and stubs!
 4.  Work on each tier in parallel!
 5.  Integrate, test, go-live, repeat!
Rec: Divide Team by Tier!

•  Can be tougher to split out Share tier versus “UI
   development” aka YUI expertise
 1.  Designer creates pages!
 2.  UI person translates into markup!
 3.  Share tier developer puts markup in a template!
 4.  Gradually replace static bits with dynamic
     components!
Project Structure Recommendations!

•  Separate your source from your deployment
 •  i.e., Donʼt create your project inside the webapp!!
 •  Choose an appropriate structure!
•  Choose a build tool to deploy your code
 •  Even for simple projects!
 •  Working right from the start!
 •  Project structure may be dictated by your build tool!
•  Consider using an IDE
 •  Though not essential!
Packaging Options!

1. Copy into exploded Share WAR
2. Create a JAR that includes everything, drop into
   WEB-INF/lib OR $TOMCAT_HOME/shared lib
3. Create an AMP

•  Recommendation: Use JAR approach whenever
   possible

•  Shameless plug: addons.alfresco.com
Packaging: JAR vs. AMP!

JAR	
  file	
  format	
                                            AMP	
  file	
  format	
  
Standard	
  file	
  format,	
  based	
  on	
  ZIP	
  format.	
   Same	
  ZIP	
  format,	
  but	
  supports	
  custom	
  
No	
  support	
  for	
  metadata	
  yet,	
  but	
  JAR	
        deployment-­‐Eme	
  file	
  mappings	
  and	
  
supports	
  it	
  via	
  MANIFEST	
  file.	
                     addiEonal	
  module	
  metadata	
  
Deploy	
  by	
  copying	
  into	
  tomcat/shared/lib	
            Deploy	
  directly	
  into	
  the	
  webapp	
  using	
  
or	
  similar	
  or	
  into	
  WEB-­‐INF/lib	
  (Java	
           Alfresco	
  Module	
  Management	
  Tool	
  (MMT)	
  
classloading	
  restricEons)	
  
Same	
  JAR	
  can	
  contain	
  repository	
  and	
  Share	
     Requires	
  one	
  file	
  for	
  Share	
  and	
  another	
  for	
  
customisaEons,	
  or	
  separate	
  JARs	
  can	
  be	
           repository	
  
used	
  
Uninstall	
  by	
  removing	
  the	
  JAR	
  file	
                Uninstall	
  requires	
  a	
  back-­‐up	
  of	
  the	
  original	
  
                                                                  WAR	
  file	
  (created	
  by	
  MMT	
  by	
  default)	
  
Build Tools!

•  Apache Ant
 •  Used by most Alfresco projects and modules and by Share
    Extras (see Sample Dashlet project)!
 •  Pros – lightweight, simple!
 •  Cons – no dependency management, lack of task
    standardization!
•  Apache Maven
 •  Used by Spring Surf!
 •  Pros – Standardized project structures and targets!
 •  Cons – More complex, can be slow, no public Enterprise
    Maven repo!
Example Ant Project Structure!

•  Source folder config
   contains classpath
   resources
•  Source folder source/web
   contains client-side assets
•  Local folder build used for
   compilation, assembly, etc.
 •  Normally not added to revision
    control!
Example Ant Build Script (build.xml)!

•  Suitable for most simple Share add-ons
•  Build packages ready for deployment
 •  By default builds a JAR-file extension!
 •  But also supports other formats!
•  Support for hot-copying exploded files into a local
   webapp for testing
•  Optional tasks (can be commented out if not required)
 •  JS compression using YUI Compressor (requires
    yuicompressor-2.4.2.jar and yui-compressor-ant-task-0.5.jar)!
 •  Web script reloading via HTTP (requires ml-ant-http-1.1.1.jar)!
•  Can be customized by adding additional build scripts
Example Folder Structure: Sample Dashlet!

http://code.google.com/p/share-extras/wiki/SampleProject
Example Maven Project Structure!

•  Source folder src/main/
   resources contains (most)
   classpath resources
 •  Sub-folder META-INF contains
    client-side assets!
 •  Sub-folder webscripts contains
    web script resources!
•  Local folder target used for
   compilation, assembly, etc.
 •  Normally not added to revision
    control!
Namespace Recommendations!

•  Used to ensure your identifiers are unique
•  Namespaces exist everywhere
 •  Web scripts use web script package!
   •  e.g. org/mycompany/share/sample/myscript.get
 •  Client-side assets use folder path and object namespaces!
   •  e.g. mycompany/components/sample/sprite.png,
      MyCompany.dashlet.HelloWorldDashlet!
 •  Spring bean IDs use dot notation!
   •  e.g. mycompany.share.sample.css!
 •  Content models use URLs and prefixes!
 •  AMP module IDs use package structure with underscores!
•  Do not re-use Alfresco namespaces
 •  Even if they are not explicit!
Example Namespaces: Sample Dashlet!
Development Tools!

•  Eclipse used by Alfresco developers
 •  Large collection of plug-ins, e.g.!
   •    Web Developer Tools (JavaScript, CSS, HTML, XML)!
   •    Freemarker!
   •    Spring Surf!
   •    SpringSource tools (part of STS)!
 •  http://code.google.com/p/share-extras/wiki/
    DevelopmentEnvironment!
•  Spring Surf tools
 •  Web scripts index!
 •  JavaScript (Rhino) debugger!                       Rec: Two Tomcats
 •  SurfBug tool – new in 4.0!
   •  http://blogs.alfresco.com/wp/ddraper/2011/08/31/surfbug/!
Development Frameworks – Donʼt reinvent the
wheel!
•  Server-side frameworks
 •    Spring Framework!
 •    Spring Surf!
 •    Spring Web Scripts!
 •    Share mini-frameworks!
      •  Dashlets, Admin Console Components!
      •  Document Library and Data List actions!
•  Client-side frameworks
 •  YUI 2.9.0 (from 4.0, previously 2.8.1)!
 •  JQuery 1.5.2 (from 4.0)!
 •  Alfresco client-side JavaScript!
Rec: Mashup/re-use Whatʼs Already There!
Spring Web Scripts!

•  Share web scripts must be placed on the classpath
•  Core configuration defines multiple container folders
   for web scripts
 •  Like the repository, folders can override each other based on web
    script path!
 •  Use alfresco/site-webscripts for your own scripts!
 •  Use alfresco/web-extension/site-webscripts if you are
    overriding existing scripts!
   •  But remember you donʼt need to override all files!
•  Differently-named from repository web script folders
 •  So repository and Share web scripts can co-exist in the same project
    structure!
Spring Surf Extensibility!

•  New in 4.0 / Spring Surf 1.0
•  Define add-on modules for Spring Surf
 •  Much more flexible than old method of overriding web scripts!
 •  Dynamically enable/disable and update modules!
•  Add, extend or remove page components
•  Implementation via sub-components
 •  Breaking down of Surf page components!
 •  Old component definitions will still work!
   •  Converted internally to new-style components with a single sub-component
      with ID default
•  See http://blogs.alfresco.com/wp/ddraper/
Extending Alfresco JavaScript!

    Use the standard pattern and extend
    Alfresco.component.Base
(function()
{
   ...
   Alfresco.dashlet.SiteTags = function SiteTags_constructor(htmlId)
   {
       return Alfresco.dashlet.SiteTags.superclass.constructor.call(this,
   "Alfresco.dashlet.SiteTags", htmlId);
   };

     YAHOO.extend(Alfresco.dashlet.SiteTags, Alfresco.component.Base,
     {
        options:
        {
            ...
        },
        onReady: function SiteTags_onReady()
        {
            ...
            // This is where the action happens
        },
        ...
     }
}
Extending Alfresco JavaScript!

•  Use Alfresco utility classes and methods
 •  Alfresco.util.Ajax for loading data!
 •  Alfresco.util.Anim for fading and resizing!
 •  Alfresco.module.SimpleDialog for modal dialogs!
 •  Other useful methods!
   •  Alfresco.util.encodeHTML() and Alfresco.util.decodeHTML()
   •  Alfresco.util.createYUIButton()
   •  Alfresco.util.parseJSON()

•  Full docs at http://sharextras.org/jsdoc/
Extending Alfresco JavaScript!
•  Declare your own custom
   JS namespaces
if (typeof MyCompany == "undefined" || !MyCompany)
{
   var MyCompany = {};
}
if (typeof MyCompany.dashlet == "undefined" || !
  MyCompany.dashlet)
{
   MyCompany.dashlet = {};
}
Extending Alfresco JavaScript!

•  Override client-side JS methods using object prototype OR
   (better) using YAHOO.extend(), YAHOO.lang.augmentProto()
   and YAHOO.lang.augmentObject()
// Override "icon" column in My Tasks     MyCompany.component.TaskList = ...
  list                                    YAHOO.extend
Alfresco.component.TaskList.prototype.r     (MyCompany.component.TaskList,
  enderCellTaskInfo = function              Alfresco.component.TaskList, {
  Acme_TL_renderCellTaskInfo(elCell,         renderCellTaskInfo: function
  oRecord, oColumn, oData)                  Acme_TL_renderCellTaskInfo(elCell,
  {                                         oRecord, oColumn, oData)
    elCell.innerHTML = <custom code         {
  goes here>;                                 elCell.innerHTML = <custom code
  };                                        goes here>;
                                            };
                                          });
Examples from Erik Winlöf’s 2010 talk More Ways of Customizing Share and
  RecordsDocumentList component in Share DOD5015.2 Module
Documentation Recommendations!
•  Client-side documentation
 •  Use JSDoc annotations within comments!
 •  JsDoc Toolkit is used by Share Extras to generate HTML
    summaries, with custom ʻAlfrescoʼ template – see
    http://code.google.com/p/share-extras/wiki/JSDoc!
 •  Yahooʼs YUI Doc is another option -
    http://developer.yahoo.com/yui/yuidoc/!
•  Web script documentation
 •  Use <description> element in web script descriptor to
    describe the script itself, plus itʼs parameters and response
    format!
 •  Document all args in <url> element!
 •  Use <family> element, even on repo tier web scripts!
Example JSDoc comments: Sample Dashlet!
Testing Recommendations!

•  Have a repeatable approach, right from the start
•  A framework is provided for testing both Presentation
   and Repository web scripts
 •  Different test harness classes used for each!
•  Testing may be interactive (when developing) or
   automated (unit tests)
 •  Interactive testing avoids the need to do time-consuming build-
    deploy cycles!
 •  Unit tests can use helper methods to test correctness of their output
    – and is recommended for all data web scripts!
   •  Note: Java unit tests required!
•  http://wiki.alfresco.com/wiki/3.0_Web_Scripts_Testing
Other interesting examples!
•  Share Extras
 •    JavaScript Console!
 •    CSV bulk load of users!
 •    Google dashlets!
 •    +34 other useful examples!
•  Dashlet Challenge 2011 Submissions (~12)
 •  See wiki for complete list of all submissions and links!
•  Records Management Module
•  Web Quick Start Share customizations
Help Wanted / Gauge Interest!

•  Metaversant Five Star Ratings Widget
 •  Might refactor using new extensibility features and publish
    the lessons learned as a tutorial!
•  Port of SomeCo Developer Guide Examples
 •  Code mostly done for 3.3/3.4—needs to be cleaned up,
    posted, docʼd!
 •  Needs to be refactored for 4.0!
•  Collaboratively-authored Share Developer Guide
   on wiki or under Creative Commons?
Conclusions!


•  Customization opens up new possibilities, but
•  Understand the frameworks
•  Use an appropriate project structure
•  Consider which packaging format is best for you
•  Don’t forget testing and documentation
will.abson@alfresco.com

        @wabson

jeff.potts@alfresco.com

       @jeffpotts01!

Más contenido relacionado

La actualidad más candente

RESTful Api practices Rails 3
RESTful Api practices Rails 3RESTful Api practices Rails 3
RESTful Api practices Rails 3
Anton Narusberg
 
One drupal to rule them all - Drupalcamp Caceres
One drupal to rule them all - Drupalcamp CaceresOne drupal to rule them all - Drupalcamp Caceres
One drupal to rule them all - Drupalcamp Caceres
hernanibf
 
JavaScript debugging diagnostic web tools and firefox
JavaScript debugging diagnostic web tools and firefoxJavaScript debugging diagnostic web tools and firefox
JavaScript debugging diagnostic web tools and firefox
Gennady Feldman
 
Shiny, Let’s Be Bad Guys: Exploiting and Mitigating the Top 10 Web App Vulner...
Shiny, Let’s Be Bad Guys: Exploiting and Mitigating the Top 10 Web App Vulner...Shiny, Let’s Be Bad Guys: Exploiting and Mitigating the Top 10 Web App Vulner...
Shiny, Let’s Be Bad Guys: Exploiting and Mitigating the Top 10 Web App Vulner...
Michael Pirnat
 
How to start developing your own ExpressionEngine addons
How to start developing your own ExpressionEngine addonsHow to start developing your own ExpressionEngine addons
How to start developing your own ExpressionEngine addons
Leevi Graham
 
Writing great documentation - CodeConf 2011
Writing great documentation - CodeConf 2011Writing great documentation - CodeConf 2011
Writing great documentation - CodeConf 2011
Jacob Kaplan-Moss
 

La actualidad más candente (19)

Modern websites in 2020 and Joomla
Modern websites in 2020 and JoomlaModern websites in 2020 and Joomla
Modern websites in 2020 and Joomla
 
PLAT-7 Spring Web Scripts and Spring Surf
PLAT-7 Spring Web Scripts and Spring SurfPLAT-7 Spring Web Scripts and Spring Surf
PLAT-7 Spring Web Scripts and Spring Surf
 
RESTful Api practices Rails 3
RESTful Api practices Rails 3RESTful Api practices Rails 3
RESTful Api practices Rails 3
 
One drupal to rule them all - Drupalcamp Caceres
One drupal to rule them all - Drupalcamp CaceresOne drupal to rule them all - Drupalcamp Caceres
One drupal to rule them all - Drupalcamp Caceres
 
Padrino - the Godfather of Sinatra
Padrino - the Godfather of SinatraPadrino - the Godfather of Sinatra
Padrino - the Godfather of Sinatra
 
Keep Your Code Organized! WordCamp Montreal 2013 Presentation slides
Keep Your Code Organized! WordCamp Montreal 2013 Presentation slidesKeep Your Code Organized! WordCamp Montreal 2013 Presentation slides
Keep Your Code Organized! WordCamp Montreal 2013 Presentation slides
 
JavaScript debugging diagnostic web tools and firefox
JavaScript debugging diagnostic web tools and firefoxJavaScript debugging diagnostic web tools and firefox
JavaScript debugging diagnostic web tools and firefox
 
DIWD 2011
DIWD 2011DIWD 2011
DIWD 2011
 
Shiny, Let’s Be Bad Guys: Exploiting and Mitigating the Top 10 Web App Vulner...
Shiny, Let’s Be Bad Guys: Exploiting and Mitigating the Top 10 Web App Vulner...Shiny, Let’s Be Bad Guys: Exploiting and Mitigating the Top 10 Web App Vulner...
Shiny, Let’s Be Bad Guys: Exploiting and Mitigating the Top 10 Web App Vulner...
 
Rapidly prototyping web applications using BackPress
Rapidly prototyping web applications using BackPressRapidly prototyping web applications using BackPress
Rapidly prototyping web applications using BackPress
 
PLAT-16 Using Enterprise Content in Grails
PLAT-16 Using Enterprise Content in GrailsPLAT-16 Using Enterprise Content in Grails
PLAT-16 Using Enterprise Content in Grails
 
Add-On Development: EE Expects that Every Developer will do his Duty
Add-On Development: EE Expects that Every Developer will do his DutyAdd-On Development: EE Expects that Every Developer will do his Duty
Add-On Development: EE Expects that Every Developer will do his Duty
 
遇見 Ruby on Rails
遇見 Ruby on Rails遇見 Ruby on Rails
遇見 Ruby on Rails
 
How to start developing your own ExpressionEngine addons
How to start developing your own ExpressionEngine addonsHow to start developing your own ExpressionEngine addons
How to start developing your own ExpressionEngine addons
 
01 spring-intro
01 spring-intro01 spring-intro
01 spring-intro
 
Bootstrap and XPages (DanNotes 2013)
Bootstrap and XPages (DanNotes 2013)Bootstrap and XPages (DanNotes 2013)
Bootstrap and XPages (DanNotes 2013)
 
Writing great documentation - CodeConf 2011
Writing great documentation - CodeConf 2011Writing great documentation - CodeConf 2011
Writing great documentation - CodeConf 2011
 
Creating Web Templates for SharePoint 2010
Creating Web Templates for SharePoint 2010Creating Web Templates for SharePoint 2010
Creating Web Templates for SharePoint 2010
 
44 Slides About 22 Modules
44 Slides About 22 Modules44 Slides About 22 Modules
44 Slides About 22 Modules
 

Similar a BP-9 Share Customization Best Practices

UKLUG 2012 - XPages, Beyond the basics
UKLUG 2012 - XPages, Beyond the basicsUKLUG 2012 - XPages, Beyond the basics
UKLUG 2012 - XPages, Beyond the basics
Ulrich Krause
 
How to start developing apps for Firefox OS
How to start developing apps for Firefox OSHow to start developing apps for Firefox OS
How to start developing apps for Firefox OS
benko
 

Similar a BP-9 Share Customization Best Practices (20)

PLAT-7 Spring Web Scripts and Spring Surf
PLAT-7 Spring Web Scripts and Spring SurfPLAT-7 Spring Web Scripts and Spring Surf
PLAT-7 Spring Web Scripts and Spring Surf
 
PLAT-8 Spring Web Scripts and Spring Surf
PLAT-8 Spring Web Scripts and Spring SurfPLAT-8 Spring Web Scripts and Spring Surf
PLAT-8 Spring Web Scripts and Spring Surf
 
UKLUG 2012 - XPages, Beyond the basics
UKLUG 2012 - XPages, Beyond the basicsUKLUG 2012 - XPages, Beyond the basics
UKLUG 2012 - XPages, Beyond the basics
 
BP-8 Global Federation and Search
BP-8 Global Federation and SearchBP-8 Global Federation and Search
BP-8 Global Federation and Search
 
Tech talk live alfresco add ons
Tech talk live alfresco add onsTech talk live alfresco add ons
Tech talk live alfresco add ons
 
BP-10 Keeping Your Sanity – Rapid Development & Deployment Tools
BP-10 Keeping Your Sanity – Rapid Development & Deployment ToolsBP-10 Keeping Your Sanity – Rapid Development & Deployment Tools
BP-10 Keeping Your Sanity – Rapid Development & Deployment Tools
 
How to start developing apps for Firefox OS
How to start developing apps for Firefox OSHow to start developing apps for Firefox OS
How to start developing apps for Firefox OS
 
SharePoint 2013 Sandbox Solutions for On Premise or Office 365
SharePoint 2013 Sandbox Solutions for On Premise or Office 365SharePoint 2013 Sandbox Solutions for On Premise or Office 365
SharePoint 2013 Sandbox Solutions for On Premise or Office 365
 
Alfresco Coding mit dem Alfresco SDK (auf Englisch) - Julien Bruinaud, Techni...
Alfresco Coding mit dem Alfresco SDK (auf Englisch) - Julien Bruinaud, Techni...Alfresco Coding mit dem Alfresco SDK (auf Englisch) - Julien Bruinaud, Techni...
Alfresco Coding mit dem Alfresco SDK (auf Englisch) - Julien Bruinaud, Techni...
 
Habitat Overview
Habitat OverviewHabitat Overview
Habitat Overview
 
Developer’s intro to the alfresco platform
Developer’s intro to the alfresco platformDeveloper’s intro to the alfresco platform
Developer’s intro to the alfresco platform
 
Learn from my Mistakes - Building Better Solutions in SPFx
Learn from my  Mistakes - Building Better Solutions in SPFxLearn from my  Mistakes - Building Better Solutions in SPFx
Learn from my Mistakes - Building Better Solutions in SPFx
 
Alfresco overview EDM
Alfresco overview EDMAlfresco overview EDM
Alfresco overview EDM
 
ITB_2023_Extend_your_contentbox_apps_with_custom_modules_Javier_Quintero.pdf
ITB_2023_Extend_your_contentbox_apps_with_custom_modules_Javier_Quintero.pdfITB_2023_Extend_your_contentbox_apps_with_custom_modules_Javier_Quintero.pdf
ITB_2023_Extend_your_contentbox_apps_with_custom_modules_Javier_Quintero.pdf
 
Docs as Part of the Product - Open Source Summit North America 2018
Docs as Part of the Product - Open Source Summit North America 2018Docs as Part of the Product - Open Source Summit North America 2018
Docs as Part of the Product - Open Source Summit North America 2018
 
TypeScript for Alfresco and CMIS - Alfresco DevCon 2012 San Jose
TypeScript for Alfresco and CMIS - Alfresco DevCon 2012 San JoseTypeScript for Alfresco and CMIS - Alfresco DevCon 2012 San Jose
TypeScript for Alfresco and CMIS - Alfresco DevCon 2012 San Jose
 
Symfony Live NYC 2014 - Rock Solid Deployment of Symfony Apps
Symfony Live NYC 2014 -  Rock Solid Deployment of Symfony AppsSymfony Live NYC 2014 -  Rock Solid Deployment of Symfony Apps
Symfony Live NYC 2014 - Rock Solid Deployment of Symfony Apps
 
APEX Application Lifecycle and Deployment 20220714.pdf
APEX Application Lifecycle and Deployment 20220714.pdfAPEX Application Lifecycle and Deployment 20220714.pdf
APEX Application Lifecycle and Deployment 20220714.pdf
 
How to Use Selenium, Successfully
How to Use Selenium, SuccessfullyHow to Use Selenium, Successfully
How to Use Selenium, Successfully
 
Extension Library - Viagra for XPages
Extension Library - Viagra for XPagesExtension Library - Viagra for XPages
Extension Library - Viagra for XPages
 

Más de Alfresco Software

Más de Alfresco Software (20)

Alfresco Day Benelux Inholland studentendossier
Alfresco Day Benelux Inholland studentendossierAlfresco Day Benelux Inholland studentendossier
Alfresco Day Benelux Inholland studentendossier
 
Alfresco Day Benelux Hogeschool Inholland Records Management application
Alfresco Day Benelux Hogeschool Inholland Records Management applicationAlfresco Day Benelux Hogeschool Inholland Records Management application
Alfresco Day Benelux Hogeschool Inholland Records Management application
 
Alfresco Day BeNelux: Customer Success Showcase - Saxion Hogescholen
Alfresco Day BeNelux: Customer Success Showcase - Saxion HogescholenAlfresco Day BeNelux: Customer Success Showcase - Saxion Hogescholen
Alfresco Day BeNelux: Customer Success Showcase - Saxion Hogescholen
 
Alfresco Day BeNelux: Customer Success Showcase - Gemeente Amsterdam
Alfresco Day BeNelux: Customer Success Showcase - Gemeente AmsterdamAlfresco Day BeNelux: Customer Success Showcase - Gemeente Amsterdam
Alfresco Day BeNelux: Customer Success Showcase - Gemeente Amsterdam
 
Alfresco Day BeNelux: The success of Alfresco
Alfresco Day BeNelux: The success of AlfrescoAlfresco Day BeNelux: The success of Alfresco
Alfresco Day BeNelux: The success of Alfresco
 
Alfresco Day BeNelux: Customer Success Showcase - Credendo Group
Alfresco Day BeNelux: Customer Success Showcase - Credendo GroupAlfresco Day BeNelux: Customer Success Showcase - Credendo Group
Alfresco Day BeNelux: Customer Success Showcase - Credendo Group
 
Alfresco Day BeNelux: Digital Transformation - It's All About Flow
Alfresco Day BeNelux: Digital Transformation - It's All About FlowAlfresco Day BeNelux: Digital Transformation - It's All About Flow
Alfresco Day BeNelux: Digital Transformation - It's All About Flow
 
Alfresco Day Vienna 2016: Activiti – ein Katalysator für die DMS-Strategie be...
Alfresco Day Vienna 2016: Activiti – ein Katalysator für die DMS-Strategie be...Alfresco Day Vienna 2016: Activiti – ein Katalysator für die DMS-Strategie be...
Alfresco Day Vienna 2016: Activiti – ein Katalysator für die DMS-Strategie be...
 
Alfresco Day Vienna 2016: Elektronische Geschäftsprozesse auf Basis von Alfre...
Alfresco Day Vienna 2016: Elektronische Geschäftsprozesse auf Basis von Alfre...Alfresco Day Vienna 2016: Elektronische Geschäftsprozesse auf Basis von Alfre...
Alfresco Day Vienna 2016: Elektronische Geschäftsprozesse auf Basis von Alfre...
 
Alfresco Day Vienna 2016: Alfrescos neue Rest API
Alfresco Day Vienna 2016: Alfrescos neue Rest APIAlfresco Day Vienna 2016: Alfrescos neue Rest API
Alfresco Day Vienna 2016: Alfrescos neue Rest API
 
Alfresco Day Vienna 2016: Support Tools für die Admin-Konsole
Alfresco Day Vienna 2016: Support Tools für die Admin-KonsoleAlfresco Day Vienna 2016: Support Tools für die Admin-Konsole
Alfresco Day Vienna 2016: Support Tools für die Admin-Konsole
 
Alfresco Day Vienna 2016: Entwickeln mit Alfresco
Alfresco Day Vienna 2016: Entwickeln mit AlfrescoAlfresco Day Vienna 2016: Entwickeln mit Alfresco
Alfresco Day Vienna 2016: Entwickeln mit Alfresco
 
Alfresco Day Vienna 2016: Activiti goes enterprise: Die Evolution der BPM Sui...
Alfresco Day Vienna 2016: Activiti goes enterprise: Die Evolution der BPM Sui...Alfresco Day Vienna 2016: Activiti goes enterprise: Die Evolution der BPM Sui...
Alfresco Day Vienna 2016: Activiti goes enterprise: Die Evolution der BPM Sui...
 
Alfresco Day Vienna 2016: Partner Lightning Talk: Westernacher
Alfresco Day Vienna 2016: Partner Lightning Talk: WesternacherAlfresco Day Vienna 2016: Partner Lightning Talk: Westernacher
Alfresco Day Vienna 2016: Partner Lightning Talk: Westernacher
 
Alfresco Day Vienna 2016: Bringing Content & Process together with the App De...
Alfresco Day Vienna 2016: Bringing Content & Process together with the App De...Alfresco Day Vienna 2016: Bringing Content & Process together with the App De...
Alfresco Day Vienna 2016: Bringing Content & Process together with the App De...
 
Alfresco Day Vienna 2016: Partner Lightning Talk - it-novum
Alfresco Day Vienna 2016: Partner Lightning Talk - it-novumAlfresco Day Vienna 2016: Partner Lightning Talk - it-novum
Alfresco Day Vienna 2016: Partner Lightning Talk - it-novum
 
Alfresco Day Vienna 2016: How to Achieve Digital Flow in the Enterprise - Joh...
Alfresco Day Vienna 2016: How to Achieve Digital Flow in the Enterprise - Joh...Alfresco Day Vienna 2016: How to Achieve Digital Flow in the Enterprise - Joh...
Alfresco Day Vienna 2016: How to Achieve Digital Flow in the Enterprise - Joh...
 
Alfresco Day Warsaw 2016 - Czy możliwe jest spełnienie wszystkich regulacji p...
Alfresco Day Warsaw 2016 - Czy możliwe jest spełnienie wszystkich regulacji p...Alfresco Day Warsaw 2016 - Czy możliwe jest spełnienie wszystkich regulacji p...
Alfresco Day Warsaw 2016 - Czy możliwe jest spełnienie wszystkich regulacji p...
 
Alfresco Day Warsaw 2016: Identyfikacja i podpiselektroniczny - Safran
Alfresco Day Warsaw 2016: Identyfikacja i podpiselektroniczny - SafranAlfresco Day Warsaw 2016: Identyfikacja i podpiselektroniczny - Safran
Alfresco Day Warsaw 2016: Identyfikacja i podpiselektroniczny - Safran
 
Alfresco Day Warsaw 2016: Advancing the Flow of Digital Business
Alfresco Day Warsaw 2016: Advancing the Flow of Digital BusinessAlfresco Day Warsaw 2016: Advancing the Flow of Digital Business
Alfresco Day Warsaw 2016: Advancing the Flow of Digital Business
 

Último

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Último (20)

Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 

BP-9 Share Customization Best Practices

  • 1. Customizing Share Best Practices! Will Abson, Senior Solutions Engineer
 @wabson! Jeff Potts, Chief Community Officer! @jeffpotts01!
  • 2. “Best Practices” Disclaimer! •  We’ve done a lot of Share customization implementation work •  BUT, things are changing quickly! •  “Best Practice” is more succinct than “things we really feel strongly about based on all of the work we’ve done so far” •  It would be great to get community feedback on these recommendations and ones we’ve missed
  • 3. Customizing Share! Evolution of Alfresco UI customization Image: http://en.wikipedia.org/wiki/File:Human_evolution_scheme.svg
  • 4. What Can I Customize?!
  • 5. What Can I Customize?!
  • 6. What Can I Customize?!
  • 7. High Level Architecture! Web  Scripts   Web  Scripts  
  • 10. Categories of Recommendations! •  Methodology •  Team Structure •  Project Folder Structure and Build Tools •  Packaging •  Namespaces •  Development Tools and Frameworks •  Documentation •  Testing
  • 11. Rec: Use an Iterative Customization Process! Lightweight technologies allow rapid iteration
  • 12. Example: Content Expiration Page! Sprint 1 Sprint 2 Sprint 3 Repository Share dashlet and Share dashlet and customisations and web script JSON custom page HTML web script template -click- -click-
  • 13. Rec: Divide Team by Tier! •  If new repo tier web scripts are needed 1.  Agree on a contract (URLs, Responses)! 2.  Stub out JSON! 3.  Create tests using the agreed to contract and stubs! 4.  Work on each tier in parallel! 5.  Integrate, test, go-live, repeat!
  • 14. Rec: Divide Team by Tier! •  Can be tougher to split out Share tier versus “UI development” aka YUI expertise 1.  Designer creates pages! 2.  UI person translates into markup! 3.  Share tier developer puts markup in a template! 4.  Gradually replace static bits with dynamic components!
  • 15. Project Structure Recommendations! •  Separate your source from your deployment •  i.e., Donʼt create your project inside the webapp!! •  Choose an appropriate structure! •  Choose a build tool to deploy your code •  Even for simple projects! •  Working right from the start! •  Project structure may be dictated by your build tool! •  Consider using an IDE •  Though not essential!
  • 16. Packaging Options! 1. Copy into exploded Share WAR 2. Create a JAR that includes everything, drop into WEB-INF/lib OR $TOMCAT_HOME/shared lib 3. Create an AMP •  Recommendation: Use JAR approach whenever possible •  Shameless plug: addons.alfresco.com
  • 17. Packaging: JAR vs. AMP! JAR  file  format   AMP  file  format   Standard  file  format,  based  on  ZIP  format.   Same  ZIP  format,  but  supports  custom   No  support  for  metadata  yet,  but  JAR   deployment-­‐Eme  file  mappings  and   supports  it  via  MANIFEST  file.   addiEonal  module  metadata   Deploy  by  copying  into  tomcat/shared/lib   Deploy  directly  into  the  webapp  using   or  similar  or  into  WEB-­‐INF/lib  (Java   Alfresco  Module  Management  Tool  (MMT)   classloading  restricEons)   Same  JAR  can  contain  repository  and  Share   Requires  one  file  for  Share  and  another  for   customisaEons,  or  separate  JARs  can  be   repository   used   Uninstall  by  removing  the  JAR  file   Uninstall  requires  a  back-­‐up  of  the  original   WAR  file  (created  by  MMT  by  default)  
  • 18. Build Tools! •  Apache Ant •  Used by most Alfresco projects and modules and by Share Extras (see Sample Dashlet project)! •  Pros – lightweight, simple! •  Cons – no dependency management, lack of task standardization! •  Apache Maven •  Used by Spring Surf! •  Pros – Standardized project structures and targets! •  Cons – More complex, can be slow, no public Enterprise Maven repo!
  • 19. Example Ant Project Structure! •  Source folder config contains classpath resources •  Source folder source/web contains client-side assets •  Local folder build used for compilation, assembly, etc. •  Normally not added to revision control!
  • 20. Example Ant Build Script (build.xml)! •  Suitable for most simple Share add-ons •  Build packages ready for deployment •  By default builds a JAR-file extension! •  But also supports other formats! •  Support for hot-copying exploded files into a local webapp for testing •  Optional tasks (can be commented out if not required) •  JS compression using YUI Compressor (requires yuicompressor-2.4.2.jar and yui-compressor-ant-task-0.5.jar)! •  Web script reloading via HTTP (requires ml-ant-http-1.1.1.jar)! •  Can be customized by adding additional build scripts
  • 21. Example Folder Structure: Sample Dashlet! http://code.google.com/p/share-extras/wiki/SampleProject
  • 22. Example Maven Project Structure! •  Source folder src/main/ resources contains (most) classpath resources •  Sub-folder META-INF contains client-side assets! •  Sub-folder webscripts contains web script resources! •  Local folder target used for compilation, assembly, etc. •  Normally not added to revision control!
  • 23. Namespace Recommendations! •  Used to ensure your identifiers are unique •  Namespaces exist everywhere •  Web scripts use web script package! •  e.g. org/mycompany/share/sample/myscript.get •  Client-side assets use folder path and object namespaces! •  e.g. mycompany/components/sample/sprite.png, MyCompany.dashlet.HelloWorldDashlet! •  Spring bean IDs use dot notation! •  e.g. mycompany.share.sample.css! •  Content models use URLs and prefixes! •  AMP module IDs use package structure with underscores! •  Do not re-use Alfresco namespaces •  Even if they are not explicit!
  • 25. Development Tools! •  Eclipse used by Alfresco developers •  Large collection of plug-ins, e.g.! •  Web Developer Tools (JavaScript, CSS, HTML, XML)! •  Freemarker! •  Spring Surf! •  SpringSource tools (part of STS)! •  http://code.google.com/p/share-extras/wiki/ DevelopmentEnvironment! •  Spring Surf tools •  Web scripts index! •  JavaScript (Rhino) debugger! Rec: Two Tomcats •  SurfBug tool – new in 4.0! •  http://blogs.alfresco.com/wp/ddraper/2011/08/31/surfbug/!
  • 26. Development Frameworks – Donʼt reinvent the wheel! •  Server-side frameworks •  Spring Framework! •  Spring Surf! •  Spring Web Scripts! •  Share mini-frameworks! •  Dashlets, Admin Console Components! •  Document Library and Data List actions! •  Client-side frameworks •  YUI 2.9.0 (from 4.0, previously 2.8.1)! •  JQuery 1.5.2 (from 4.0)! •  Alfresco client-side JavaScript!
  • 27. Rec: Mashup/re-use Whatʼs Already There!
  • 28. Spring Web Scripts! •  Share web scripts must be placed on the classpath •  Core configuration defines multiple container folders for web scripts •  Like the repository, folders can override each other based on web script path! •  Use alfresco/site-webscripts for your own scripts! •  Use alfresco/web-extension/site-webscripts if you are overriding existing scripts! •  But remember you donʼt need to override all files! •  Differently-named from repository web script folders •  So repository and Share web scripts can co-exist in the same project structure!
  • 29. Spring Surf Extensibility! •  New in 4.0 / Spring Surf 1.0 •  Define add-on modules for Spring Surf •  Much more flexible than old method of overriding web scripts! •  Dynamically enable/disable and update modules! •  Add, extend or remove page components •  Implementation via sub-components •  Breaking down of Surf page components! •  Old component definitions will still work! •  Converted internally to new-style components with a single sub-component with ID default •  See http://blogs.alfresco.com/wp/ddraper/
  • 30. Extending Alfresco JavaScript! Use the standard pattern and extend Alfresco.component.Base (function() { ... Alfresco.dashlet.SiteTags = function SiteTags_constructor(htmlId) { return Alfresco.dashlet.SiteTags.superclass.constructor.call(this, "Alfresco.dashlet.SiteTags", htmlId); }; YAHOO.extend(Alfresco.dashlet.SiteTags, Alfresco.component.Base, { options: { ... }, onReady: function SiteTags_onReady() { ... // This is where the action happens }, ... } }
  • 31. Extending Alfresco JavaScript! •  Use Alfresco utility classes and methods •  Alfresco.util.Ajax for loading data! •  Alfresco.util.Anim for fading and resizing! •  Alfresco.module.SimpleDialog for modal dialogs! •  Other useful methods! •  Alfresco.util.encodeHTML() and Alfresco.util.decodeHTML() •  Alfresco.util.createYUIButton() •  Alfresco.util.parseJSON() •  Full docs at http://sharextras.org/jsdoc/
  • 32. Extending Alfresco JavaScript! •  Declare your own custom JS namespaces if (typeof MyCompany == "undefined" || !MyCompany) { var MyCompany = {}; } if (typeof MyCompany.dashlet == "undefined" || ! MyCompany.dashlet) { MyCompany.dashlet = {}; }
  • 33. Extending Alfresco JavaScript! •  Override client-side JS methods using object prototype OR (better) using YAHOO.extend(), YAHOO.lang.augmentProto() and YAHOO.lang.augmentObject() // Override "icon" column in My Tasks MyCompany.component.TaskList = ... list YAHOO.extend Alfresco.component.TaskList.prototype.r (MyCompany.component.TaskList, enderCellTaskInfo = function Alfresco.component.TaskList, { Acme_TL_renderCellTaskInfo(elCell, renderCellTaskInfo: function oRecord, oColumn, oData) Acme_TL_renderCellTaskInfo(elCell, { oRecord, oColumn, oData) elCell.innerHTML = <custom code { goes here>; elCell.innerHTML = <custom code }; goes here>; }; }); Examples from Erik Winlöf’s 2010 talk More Ways of Customizing Share and RecordsDocumentList component in Share DOD5015.2 Module
  • 34. Documentation Recommendations! •  Client-side documentation •  Use JSDoc annotations within comments! •  JsDoc Toolkit is used by Share Extras to generate HTML summaries, with custom ʻAlfrescoʼ template – see http://code.google.com/p/share-extras/wiki/JSDoc! •  Yahooʼs YUI Doc is another option - http://developer.yahoo.com/yui/yuidoc/! •  Web script documentation •  Use <description> element in web script descriptor to describe the script itself, plus itʼs parameters and response format! •  Document all args in <url> element! •  Use <family> element, even on repo tier web scripts!
  • 35. Example JSDoc comments: Sample Dashlet!
  • 36. Testing Recommendations! •  Have a repeatable approach, right from the start •  A framework is provided for testing both Presentation and Repository web scripts •  Different test harness classes used for each! •  Testing may be interactive (when developing) or automated (unit tests) •  Interactive testing avoids the need to do time-consuming build- deploy cycles! •  Unit tests can use helper methods to test correctness of their output – and is recommended for all data web scripts! •  Note: Java unit tests required! •  http://wiki.alfresco.com/wiki/3.0_Web_Scripts_Testing
  • 37. Other interesting examples! •  Share Extras •  JavaScript Console! •  CSV bulk load of users! •  Google dashlets! •  +34 other useful examples! •  Dashlet Challenge 2011 Submissions (~12) •  See wiki for complete list of all submissions and links! •  Records Management Module •  Web Quick Start Share customizations
  • 38. Help Wanted / Gauge Interest! •  Metaversant Five Star Ratings Widget •  Might refactor using new extensibility features and publish the lessons learned as a tutorial! •  Port of SomeCo Developer Guide Examples •  Code mostly done for 3.3/3.4—needs to be cleaned up, posted, docʼd! •  Needs to be refactored for 4.0! •  Collaboratively-authored Share Developer Guide on wiki or under Creative Commons?
  • 39. Conclusions! •  Customization opens up new possibilities, but •  Understand the frameworks •  Use an appropriate project structure •  Consider which packaging format is best for you •  Don’t forget testing and documentation
  • 40. will.abson@alfresco.com
 @wabson
 jeff.potts@alfresco.com
 @jeffpotts01!