SlideShare a Scribd company logo
Best Practices – Extending the Platform!
             Jared and Rich!
Pre - Install!



Environment Validation Tool or EVT
• Available on Google Code !
  • (http://code.google.com/p/alfresco-environment-validation/)!

• Currently targets version 3.3 (though mostly still
applicable)!
• Maintained by Support!
Zero Day Config Guide or ZDC
• Enterprise Only!
• Available in the KB section of support site!
Donʼt Query if Donʼt Have to Query!

Know you nodes
JavaScript!

 !search.findNode()!

Java!

 !new NodeRef()!
There is a cost!




 Web Scripts in the Repo? For Shame!
  • Extra IO!
   • To both the DB and the File System!
  • Lightly used vs High usage!
Content Models!
Do you really need a type?


Important questions to ask!
• Is it likely to change frequently!
• Is it a fixed state!
But I really need to change that type!?!

Adding is OK
Subtraction is Not
If you must remove!
• Hide it from the users in the client!
• Mark Java references deprecated!
• NEVER modify the DB directly!
Donʼt Force It!

• Donʼt force your model to fit the UI!
• Sometimes the best approach is a
simple custom UI!
• The repository has capabilities
beyond what Explorer and Share!
We Enforce the Law!!

There was a bug the allowed you to work
incorrectly across models. We’ve fixed the
bug. This may result in broken models
when upgrading from earlier versions.
Take care to thoroughly test your models
before upgrading. You may need to not
only fix your model, but massage the data,
                       !
or fix your custom code.
Have you
                                            tried
Turn It Off!                              turning it
                                            off…
When Possible Turn off unneeded
 Services
   •  File interfaces!
   •  Indexing (Less important in 4.0)!
   •  Quota Calculations!
   •  Subsystems!
Youʼre Using Web Services!?!

 SOAP just makes me feel dirty
  •                                    	
  •                                !




*Though creating your own SOAP Client won’t be as easy as just using
                        Apache Chemistry
Bulk File System Import Tool!
Available on Google Code, not      BFSIT!?!
official supported by Alfresco.
Maintained by Alfresco
Employees.!
Single purpose import:!
Read content (metadata and
versions supported) from the
Filesystem!
http://code.google.com/p/
alfresco-bulk-filesystem-import/!
Test!




        Production != Test!
Know What You are Doing!

Training and Certification!
Engage Consulting or a Partner!
Forums and Blogs!
Wiki!
Attend Devcon!
Backup!
  Pre 4.0
        4.0

  Indexes
     Indexes *
  Database
     Database
 Filesystem
   Filesystem
Can We Build It!?!

What is possible with Alfresco?!
You tell us.!
Can We Fix It!?!

Not Always!
Engage SI partner or Alfresco consulting early!
Weigh the costs: Effort to fix vs. Starting over!
Test. Test. Test.!
Packaging!

AMPs are not the best and lack some features
But….
…They provide process and encapsulation of customizations!
Outline!

A few things learned
Permissions
JavaScript API
AttributeService
A few things learned!

Echo --- having a build process that includes deployment
 early on, is very useful.
 – Building an AMP file is not as much trouble as it may seem.!
 – Many folks already have an Ant or Maven build config around that
  you can use (do not re-invent the wheel)!
Naming Conventions are important.
 – If you plan on having multiple customizations in a single repository,
  this will help avoid conflicts!
 – Enterprise customers who have a mix of internal development teams
  and partners must think about this from Day 1.!
Some Ant examples – Package Amp!

 <target name="package-amp" depends="mkdirs, package-jar" >
        <zip destfile="${amp.file}" >
             <fileset dir="${build.dir}" includes="lib/*.jar" />
             <fileset dir="${project.dir}" includes="lib/*.jar" />
             <fileset dir="${project.dir}/source"
      includes="config/**/*.*, jsp/**/*.*, css/**/*.*" />
             <fileset dir="${project.dir}/source/config/alfresco/module/$
{module.id}"
      includes="*.properties" excludes="log4j.properties" />
        </zip>
    </target>
Some Ant examples – Update War!
  <target name="update-war" depends="package-amp"
    <echo>Installing AMP into WAR</echo>
    <java dir="." fork="true" classname=
         "org.alfresco.repo.module.tool.ModuleManagementTool">
         <classpath refid="class.path" />
         <arg line="install ${amp.file} ${war.file} -force -nobackup -verbose"/>
    </java>
        <delete dir="${alfresco.dir}/tomcat/webapps/alfresco" />
        <delete dir="${alfresco.dir}/tomcat/temp/Alfresco" />
        <delete dir="${alfresco.dir}/tomcat/work/Catalina/localhost/alfresco" />
</target>
Some Ant examples – Start/Stop Alfresco!
<target name="start-alfresco"
          description="Start the Alfresco Repository">
          <exec executable="/bin/sh">
            <arg line='-c "${alfresco.dir}/alfresco.sh start"'/>
          </exec>
     </target>


    <target name="stop-alfresco“
    description="Stop the Alfresco Repository">
         <exec executable="/bin/sh">
           <arg line='-c "${alfresco.dir}/alfresco.sh stop"'/>
         </exec>
    </target>
About The Example!

This example implements a simple customization that allows
 documents to be tagged as sendable.
Each document has a status and a document ID
 – The document ID does not have to be the object ID and is guaranteed
   to be unique in the repository.!
 – The valid statuses are staged, effective and retired.!
Users must have ManageSendable Permission to change the
 sendable status.
Extending Permissions!

Why Extend Permissions
  –  Allows Developers to Secure new functionality with ACLs!
  –  Allows Developers to Expose new combinations of low level
     permissions a new role.!
Examples of Extended Permissions
  –  Share!
  –  Records Management!
Caveats and Gotchas
  –  If you create new permissions you will have some extra work
     around security.!
Steps!

Create Permissions Model File
 – The Records Management and Share Permissions files are good
  examples!
 – The DTD is another good source of documentation -- http://
  wiki.alfresco.com/wiki/PermissionModelDTD!
Wire in the bean
 – Add the permissionModelBootstrap bean!
 – Wire in any additional permissions using Security Interceptors (if
  needed)!
 – Add any needed permissions to the
  slingshotDocLibCustomResponse bean!
Permission Model Code Snippet!

<permissions>

   <!-- Namespaces used in type references -->
    ….

   <permissionSet type="senddoc:content" expose="all">
         <permissionGroup name="ManageSendable" expose="true"
allowFullControl="false"/>

       <!-- The low level permission to control setting the owner of a node -->
      <permission name="_ManageSendable" expose="false" requiresType="false">
        <grantedToGroup permissionGroup="ManageSendable" />
        <requiredPermission on="node" type="sys:base" name="_ReadProperties" />
      </permission>

    </permissionSet>


</permissions>
Security Interceptor Code Snippet!

<bean id="SendableService_security"
 class="org.alfresco.repo.security.permissions.impl.acegi.MethodS
 ecurityInterceptor">
   <!– Manager Beans Here 
   <property name="objectDefinitionSource">
      <value>
 com.oldschooltechie.sendable.SendableService.makeNodeEffective=
    ACL_NODE.1.senddoc:content.ManageSendable
 com.oldschooltechie.sendable.SendableService.retireNode=
    ACL_NODE.1.senddoc:content.ManageSendable
 com.oldschooltechie.sendable.SendableService.*=
    ACL_ALLOW
     </value>
   </property>
</bean>
Creating JavaScript APIs!

Why Create JavaScript APIs
 – Exposes key functionality to JavaScript!
 – Allows for the encapsulation of the “heavy lifting” functionality!
Some examples of how Custom Javascript APIs are used
 – Called from Javascript Based webscripts!
 – Unit testing underlying Java Functionality from JavaScript Scripts that
  can be run with the Execute Script Action!
Steps!

Create the Java Class that will provide the API
  – Extend the
   org.alfresco.repo.jscript.BaseScopableProcessorExtension class!
  – All public methods that are not setters and getters will be exposed as
   JavaScript methods.!
  – Make sure that you convert NodeRefs into ScriptNodes and visa
   versa.!
  – Make sure that arguments passed and returned are Scalars,
   Scriptables, Arrays or Maps.!
Wire in the bean
  – Extend the baseJavaScriptExtension bean!
  – Set the extensionName property!
Code Snippet!

public class SendableScriptAPI extends
BaseScopableProcessorExtension {
// Code Omitted
     public ScriptNode getNodeRefById(String docId) {
          NodeRef result = sendableService.getNodeRefById(docId);
          return new
       ScriptNode(result, this.serviceRegistry, getScope());
     }

    public void makeSendable(ScriptNode nodeRef,String docId) {
         sendableService.makeSendable(nodeRef.getNodeRef(), docId);
    }
}
Bean Definition!

 <bean id="SendableScriptAPI"
  parent="baseJavaScriptExtension" class=
"com.oldschooltechie.sendable.jscript.SendableScriptAPI">
        <property name="extensionName">
            <value>sendable</value>
        </property>
        <property name="sendableService">
            <ref bean="SendableService"/>
        </property>
        <property name="serviceRegistry">
            <ref bean="ServiceRegistry"/>
        </property>
    </bean>
Attribute Service!

What is the Attribute Service
  – Allows for the storage of arbitrary key value pairs!
  – Each key can have up to 3 segments.!
  – The key segments and values are all Serializables (i.e. can be
   anything).!
Why Use Atrribute Service
  – There are a number of use cases…..!
  – Our use case – properties that must have a unique value across
   nodes.!
    •  Allows making associations between values and nodes via the Database!
    •  Allows for Enforcing Uniqueness of certain Values!
  – AttributeService also allowed for retrieving nodes (immediately across
   all nodes in a cluster) by a property value. (This is less of an issue in
   swift).!
Steps For Using the Attribute Server!

Determine how you will plan on using it.
  – Think about the Key space – use the fact that the key is segmented.!
  – Think about the core operations!
  – Wrap it all in a component.!
Example Code Snippet…!
public static final String SENDABLE_ATTR_NAME = "..SENDABLE_ID..";
public static final String SENDABLE_DOC_ID_ATTR_NAME = "..DOC_ID..";
public void storeDocId(String doc_id,NodeRef nodeRef) {
   if (attributeService.exists(SENDABLE_ATTR_NAME,
          SENDABLE_DOC_ID_ATTR_NAME,doc_id)) {
      // Check to see if this node has already been registered
      if (!attributeService.getAttribute(SENDABLE_ATTR_NAME,
         SENDABLE_DOC_ID_ATTR_NAME,doc_id).equals(nodeRef)) {
         throw new SendableRuntimeException("Duplicate entry
  id:"+doc_id);
      }
   }
   attributeService.setAttribute(nodeRef,SENDABLE_ATTR_NAME,
      SENDABLE_DOC_ID_ATTR_NAME,doc_id);
  }
Contact Information!


Richard McKnight
Richard.McKnight@alfresco.com
@rmknightstar
http://www.oldschooltechie.com

Jared Ottley
Jared.ottley@alfresco.com
@jottley
http://jared.ottleys.net

More Related Content

What's hot

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
 
Build Your Own CMS with Apache Sling
Build Your Own CMS with Apache SlingBuild Your Own CMS with Apache Sling
Build Your Own CMS with Apache SlingBob Paulin
 
Ruby MVC from scratch with Rack
Ruby MVC from scratch with RackRuby MVC from scratch with Rack
Ruby MVC from scratch with Rack
DonSchado
 
Assetic (Zendcon)
Assetic (Zendcon)Assetic (Zendcon)
Assetic (Zendcon)
Kris Wallsmith
 
Choosing a Javascript Framework
Choosing a Javascript FrameworkChoosing a Javascript Framework
Choosing a Javascript Framework
All Things Open
 
CouchDB for Web Applications - Erlang Factory London 2009
CouchDB for Web Applications - Erlang Factory London 2009CouchDB for Web Applications - Erlang Factory London 2009
CouchDB for Web Applications - Erlang Factory London 2009
Jason Davies
 
Devoxx France 2013 Cloud Best Practices
Devoxx France 2013 Cloud Best PracticesDevoxx France 2013 Cloud Best Practices
Devoxx France 2013 Cloud Best PracticesEric Bottard
 
[Bristol WordPress] Supercharging WordPress Development
[Bristol WordPress] Supercharging WordPress Development[Bristol WordPress] Supercharging WordPress Development
[Bristol WordPress] Supercharging WordPress Development
Adam Tomat
 
Scalable Django Architecture
Scalable Django ArchitectureScalable Django Architecture
Scalable Django Architecture
Rami Sayar
 
What happens in laravel 4 bootstraping
What happens in laravel 4 bootstrapingWhat happens in laravel 4 bootstraping
What happens in laravel 4 bootstraping
Jace Ju
 
Django Heresies
Django HeresiesDjango Heresies
Django Heresies
Simon Willison
 
Meetup Performance
Meetup PerformanceMeetup Performance
Meetup Performance
Greg Whalin
 
Developing Modern Java Web Applications with Java EE 7 and AngularJS
Developing Modern Java Web Applications with Java EE 7 and AngularJSDeveloping Modern Java Web Applications with Java EE 7 and AngularJS
Developing Modern Java Web Applications with Java EE 7 and AngularJS
Shekhar Gulati
 
#NewMeetup Performance
#NewMeetup Performance#NewMeetup Performance
#NewMeetup PerformanceJustin Cataldo
 
Nodejs.meetup
Nodejs.meetupNodejs.meetup
Nodejs.meetup
Vivian S. Zhang
 
Sanjeev ghai 12
Sanjeev ghai 12Sanjeev ghai 12
Sanjeev ghai 12
Praveen kumar
 
Operacion Guinda 2
Operacion Guinda 2Operacion Guinda 2
Operacion Guinda 2
Red RADAR
 
Cool like a Frontend Developer: Grunt, RequireJS, Bower and other Tools
Cool like a Frontend Developer: Grunt, RequireJS, Bower and other ToolsCool like a Frontend Developer: Grunt, RequireJS, Bower and other Tools
Cool like a Frontend Developer: Grunt, RequireJS, Bower and other Tools
Ryan Weaver
 
Hacking Adobe Experience Manager sites
Hacking Adobe Experience Manager sitesHacking Adobe Experience Manager sites
Hacking Adobe Experience Manager sites
Mikhail Egorov
 
Rails Girls: Programming, Web Applications and Ruby on Rails
Rails Girls: Programming, Web Applications and Ruby on RailsRails Girls: Programming, Web Applications and Ruby on Rails
Rails Girls: Programming, Web Applications and Ruby on Rails
DonSchado
 

What's hot (20)

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...
 
Build Your Own CMS with Apache Sling
Build Your Own CMS with Apache SlingBuild Your Own CMS with Apache Sling
Build Your Own CMS with Apache Sling
 
Ruby MVC from scratch with Rack
Ruby MVC from scratch with RackRuby MVC from scratch with Rack
Ruby MVC from scratch with Rack
 
Assetic (Zendcon)
Assetic (Zendcon)Assetic (Zendcon)
Assetic (Zendcon)
 
Choosing a Javascript Framework
Choosing a Javascript FrameworkChoosing a Javascript Framework
Choosing a Javascript Framework
 
CouchDB for Web Applications - Erlang Factory London 2009
CouchDB for Web Applications - Erlang Factory London 2009CouchDB for Web Applications - Erlang Factory London 2009
CouchDB for Web Applications - Erlang Factory London 2009
 
Devoxx France 2013 Cloud Best Practices
Devoxx France 2013 Cloud Best PracticesDevoxx France 2013 Cloud Best Practices
Devoxx France 2013 Cloud Best Practices
 
[Bristol WordPress] Supercharging WordPress Development
[Bristol WordPress] Supercharging WordPress Development[Bristol WordPress] Supercharging WordPress Development
[Bristol WordPress] Supercharging WordPress Development
 
Scalable Django Architecture
Scalable Django ArchitectureScalable Django Architecture
Scalable Django Architecture
 
What happens in laravel 4 bootstraping
What happens in laravel 4 bootstrapingWhat happens in laravel 4 bootstraping
What happens in laravel 4 bootstraping
 
Django Heresies
Django HeresiesDjango Heresies
Django Heresies
 
Meetup Performance
Meetup PerformanceMeetup Performance
Meetup Performance
 
Developing Modern Java Web Applications with Java EE 7 and AngularJS
Developing Modern Java Web Applications with Java EE 7 and AngularJSDeveloping Modern Java Web Applications with Java EE 7 and AngularJS
Developing Modern Java Web Applications with Java EE 7 and AngularJS
 
#NewMeetup Performance
#NewMeetup Performance#NewMeetup Performance
#NewMeetup Performance
 
Nodejs.meetup
Nodejs.meetupNodejs.meetup
Nodejs.meetup
 
Sanjeev ghai 12
Sanjeev ghai 12Sanjeev ghai 12
Sanjeev ghai 12
 
Operacion Guinda 2
Operacion Guinda 2Operacion Guinda 2
Operacion Guinda 2
 
Cool like a Frontend Developer: Grunt, RequireJS, Bower and other Tools
Cool like a Frontend Developer: Grunt, RequireJS, Bower and other ToolsCool like a Frontend Developer: Grunt, RequireJS, Bower and other Tools
Cool like a Frontend Developer: Grunt, RequireJS, Bower and other Tools
 
Hacking Adobe Experience Manager sites
Hacking Adobe Experience Manager sitesHacking Adobe Experience Manager sites
Hacking Adobe Experience Manager sites
 
Rails Girls: Programming, Web Applications and Ruby on Rails
Rails Girls: Programming, Web Applications and Ruby on RailsRails Girls: Programming, Web Applications and Ruby on Rails
Rails Girls: Programming, Web Applications and Ruby on Rails
 

Similar to BP-6 Repository Customization Best Practices

Deep Dive: Alfresco Core Repository (... embedded in a micro-services style a...
Deep Dive: Alfresco Core Repository (... embedded in a micro-services style a...Deep Dive: Alfresco Core Repository (... embedded in a micro-services style a...
Deep Dive: Alfresco Core Repository (... embedded in a micro-services style a...
J V
 
Summit2014 topic 0066 - 10 enhancements that require 10 lines of code
Summit2014 topic 0066 - 10 enhancements that require 10 lines of codeSummit2014 topic 0066 - 10 enhancements that require 10 lines of code
Summit2014 topic 0066 - 10 enhancements that require 10 lines of code
Angel Borroy López
 
Phing
PhingPhing
Phing
mdekrijger
 
Spring 3 - An Introduction
Spring 3 - An IntroductionSpring 3 - An Introduction
Spring 3 - An Introduction
Thorsten Kamann
 
[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC
Alive Kuo
 
"I have a framework idea" - Repeat less, share more.
"I have a framework idea" - Repeat less, share more."I have a framework idea" - Repeat less, share more.
"I have a framework idea" - Repeat less, share more.
Fabio Milano
 
Introduction to Infrastructure as Code & Automation / Introduction to Chef
Introduction to Infrastructure as Code & Automation / Introduction to ChefIntroduction to Infrastructure as Code & Automation / Introduction to Chef
Introduction to Infrastructure as Code & Automation / Introduction to Chef
Nathen Harvey
 
OSGi Feature Model - Where Art Thou - David Bosschaert (Adobe)
OSGi Feature Model - Where Art Thou - David Bosschaert (Adobe)OSGi Feature Model - Where Art Thou - David Bosschaert (Adobe)
OSGi Feature Model - Where Art Thou - David Bosschaert (Adobe)
mfrancis
 
Solid And Sustainable Development in Scala
Solid And Sustainable Development in ScalaSolid And Sustainable Development in Scala
Solid And Sustainable Development in Scala
Kazuhiro Sera
 
Solid and Sustainable Development in Scala
Solid and Sustainable Development in ScalaSolid and Sustainable Development in Scala
Solid and Sustainable Development in Scala
scalaconfjp
 
An Introduction to Tornado
An Introduction to TornadoAn Introduction to Tornado
An Introduction to TornadoGavin Roy
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...Fabio Franzini
 
Introduction to InSpec and 1.0 release update
Introduction to InSpec and 1.0 release updateIntroduction to InSpec and 1.0 release update
Introduction to InSpec and 1.0 release update
Alex Pop
 
Spring 3 - Der dritte Frühling
Spring 3 - Der dritte FrühlingSpring 3 - Der dritte Frühling
Spring 3 - Der dritte Frühling
Thorsten Kamann
 
Configuration management with Chef
Configuration management with ChefConfiguration management with Chef
Configuration management with Chef
Juan Vicente Herrera Ruiz de Alejo
 
ITB2017 - Keynote
ITB2017 - KeynoteITB2017 - Keynote
ITB2017 - Keynote
Ortus Solutions, Corp
 
ITT 2015 - Simon Stewart - Building Android Apps at Speed and Scale
ITT 2015 - Simon Stewart - Building Android Apps at Speed and ScaleITT 2015 - Simon Stewart - Building Android Apps at Speed and Scale
ITT 2015 - Simon Stewart - Building Android Apps at Speed and Scale
Istanbul Tech Talks
 
Using and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middlewareUsing and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middleware
Alona Mekhovova
 

Similar to BP-6 Repository Customization Best Practices (20)

Deep Dive: Alfresco Core Repository (... embedded in a micro-services style a...
Deep Dive: Alfresco Core Repository (... embedded in a micro-services style a...Deep Dive: Alfresco Core Repository (... embedded in a micro-services style a...
Deep Dive: Alfresco Core Repository (... embedded in a micro-services style a...
 
Summit2014 topic 0066 - 10 enhancements that require 10 lines of code
Summit2014 topic 0066 - 10 enhancements that require 10 lines of codeSummit2014 topic 0066 - 10 enhancements that require 10 lines of code
Summit2014 topic 0066 - 10 enhancements that require 10 lines of code
 
Phing
PhingPhing
Phing
 
Spring 3 - An Introduction
Spring 3 - An IntroductionSpring 3 - An Introduction
Spring 3 - An Introduction
 
[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC
 
"I have a framework idea" - Repeat less, share more.
"I have a framework idea" - Repeat less, share more."I have a framework idea" - Repeat less, share more.
"I have a framework idea" - Repeat less, share more.
 
Introduction to Infrastructure as Code & Automation / Introduction to Chef
Introduction to Infrastructure as Code & Automation / Introduction to ChefIntroduction to Infrastructure as Code & Automation / Introduction to Chef
Introduction to Infrastructure as Code & Automation / Introduction to Chef
 
OSGi Feature Model - Where Art Thou - David Bosschaert (Adobe)
OSGi Feature Model - Where Art Thou - David Bosschaert (Adobe)OSGi Feature Model - Where Art Thou - David Bosschaert (Adobe)
OSGi Feature Model - Where Art Thou - David Bosschaert (Adobe)
 
Solid And Sustainable Development in Scala
Solid And Sustainable Development in ScalaSolid And Sustainable Development in Scala
Solid And Sustainable Development in Scala
 
Solid and Sustainable Development in Scala
Solid and Sustainable Development in ScalaSolid and Sustainable Development in Scala
Solid and Sustainable Development in Scala
 
An Introduction to Tornado
An Introduction to TornadoAn Introduction to Tornado
An Introduction to Tornado
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...
 
Introduction to InSpec and 1.0 release update
Introduction to InSpec and 1.0 release updateIntroduction to InSpec and 1.0 release update
Introduction to InSpec and 1.0 release update
 
infra-as-code
infra-as-codeinfra-as-code
infra-as-code
 
Spring 3 - Der dritte Frühling
Spring 3 - Der dritte FrühlingSpring 3 - Der dritte Frühling
Spring 3 - Der dritte Frühling
 
Configuration management with Chef
Configuration management with ChefConfiguration management with Chef
Configuration management with Chef
 
ITB2017 - Keynote
ITB2017 - KeynoteITB2017 - Keynote
ITB2017 - Keynote
 
Write php deploy everywhere tek11
Write php deploy everywhere   tek11Write php deploy everywhere   tek11
Write php deploy everywhere tek11
 
ITT 2015 - Simon Stewart - Building Android Apps at Speed and Scale
ITT 2015 - Simon Stewart - Building Android Apps at Speed and ScaleITT 2015 - Simon Stewart - Building Android Apps at Speed and Scale
ITT 2015 - Simon Stewart - Building Android Apps at Speed and Scale
 
Using and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middlewareUsing and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middleware
 

More from Alfresco Software

Alfresco Day Benelux Inholland studentendossier
Alfresco Day Benelux Inholland studentendossierAlfresco Day Benelux Inholland studentendossier
Alfresco Day Benelux Inholland studentendossier
Alfresco Software
 
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 Software
 
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 Software
 
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 Software
 
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 Software
 
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 Software
 
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 Software
 
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 Software
 
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 Software
 
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 Software
 
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 Software
 
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 Software
 
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 Software
 
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 Software
 
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 Software
 
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 Software
 
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 Software
 
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 Software
 
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 Software
 
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
Alfresco Software
 

More from 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
 

Recently uploaded

UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
DianaGray10
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
Product School
 
Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........
Alison B. Lowndes
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
Product School
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
BookNet Canada
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
Cheryl Hung
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Product School
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
Elena Simperl
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
Kari Kakkonen
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
James Anderson
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
Jemma Hussein Allen
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
Guy Korland
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Jeffrey Haguewood
 
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
DanBrown980551
 
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
Product School
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
Product School
 
Generating a custom Ruby SDK for your web service or Rails API using Smithy
Generating a custom Ruby SDK for your web service or Rails API using SmithyGenerating a custom Ruby SDK for your web service or Rails API using Smithy
Generating a custom Ruby SDK for your web service or Rails API using Smithy
g2nightmarescribd
 
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Ramesh Iyer
 

Recently uploaded (20)

UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
 
Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
 
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
 
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
 
Generating a custom Ruby SDK for your web service or Rails API using Smithy
Generating a custom Ruby SDK for your web service or Rails API using SmithyGenerating a custom Ruby SDK for your web service or Rails API using Smithy
Generating a custom Ruby SDK for your web service or Rails API using Smithy
 
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
 

BP-6 Repository Customization Best Practices

  • 1. Best Practices – Extending the Platform! Jared and Rich!
  • 2. Pre - Install! Environment Validation Tool or EVT • Available on Google Code ! • (http://code.google.com/p/alfresco-environment-validation/)! • Currently targets version 3.3 (though mostly still applicable)! • Maintained by Support! Zero Day Config Guide or ZDC • Enterprise Only! • Available in the KB section of support site!
  • 3. Donʼt Query if Donʼt Have to Query! Know you nodes JavaScript! !search.findNode()! Java! !new NodeRef()!
  • 4. There is a cost! Web Scripts in the Repo? For Shame! • Extra IO! • To both the DB and the File System! • Lightly used vs High usage!
  • 6. Do you really need a type?
 Important questions to ask! • Is it likely to change frequently! • Is it a fixed state!
  • 7. But I really need to change that type!?! Adding is OK Subtraction is Not If you must remove! • Hide it from the users in the client! • Mark Java references deprecated! • NEVER modify the DB directly!
  • 8. Donʼt Force It! • Donʼt force your model to fit the UI! • Sometimes the best approach is a simple custom UI! • The repository has capabilities beyond what Explorer and Share!
  • 9. We Enforce the Law!! There was a bug the allowed you to work incorrectly across models. We’ve fixed the bug. This may result in broken models when upgrading from earlier versions. Take care to thoroughly test your models before upgrading. You may need to not only fix your model, but massage the data, ! or fix your custom code.
  • 10. Have you tried Turn It Off! turning it off… When Possible Turn off unneeded Services •  File interfaces! •  Indexing (Less important in 4.0)! •  Quota Calculations! •  Subsystems!
  • 11. Youʼre Using Web Services!?! SOAP just makes me feel dirty •  •  ! *Though creating your own SOAP Client won’t be as easy as just using Apache Chemistry
  • 12. Bulk File System Import Tool! Available on Google Code, not BFSIT!?! official supported by Alfresco. Maintained by Alfresco Employees.! Single purpose import:! Read content (metadata and versions supported) from the Filesystem! http://code.google.com/p/ alfresco-bulk-filesystem-import/!
  • 13. Test! Production != Test!
  • 14. Know What You are Doing! Training and Certification! Engage Consulting or a Partner! Forums and Blogs! Wiki! Attend Devcon!
  • 15. Backup! Pre 4.0 4.0 Indexes Indexes * Database Database Filesystem Filesystem
  • 16. Can We Build It!?! What is possible with Alfresco?! You tell us.!
  • 17. Can We Fix It!?! Not Always! Engage SI partner or Alfresco consulting early! Weigh the costs: Effort to fix vs. Starting over! Test. Test. Test.!
  • 18. Packaging! AMPs are not the best and lack some features But…. …They provide process and encapsulation of customizations!
  • 19. Outline! A few things learned Permissions JavaScript API AttributeService
  • 20. A few things learned! Echo --- having a build process that includes deployment early on, is very useful. – Building an AMP file is not as much trouble as it may seem.! – Many folks already have an Ant or Maven build config around that you can use (do not re-invent the wheel)! Naming Conventions are important. – If you plan on having multiple customizations in a single repository, this will help avoid conflicts! – Enterprise customers who have a mix of internal development teams and partners must think about this from Day 1.!
  • 21. Some Ant examples – Package Amp! <target name="package-amp" depends="mkdirs, package-jar" > <zip destfile="${amp.file}" > <fileset dir="${build.dir}" includes="lib/*.jar" /> <fileset dir="${project.dir}" includes="lib/*.jar" /> <fileset dir="${project.dir}/source" includes="config/**/*.*, jsp/**/*.*, css/**/*.*" /> <fileset dir="${project.dir}/source/config/alfresco/module/$ {module.id}" includes="*.properties" excludes="log4j.properties" /> </zip> </target>
  • 22. Some Ant examples – Update War! <target name="update-war" depends="package-amp" <echo>Installing AMP into WAR</echo> <java dir="." fork="true" classname= "org.alfresco.repo.module.tool.ModuleManagementTool"> <classpath refid="class.path" /> <arg line="install ${amp.file} ${war.file} -force -nobackup -verbose"/> </java> <delete dir="${alfresco.dir}/tomcat/webapps/alfresco" /> <delete dir="${alfresco.dir}/tomcat/temp/Alfresco" /> <delete dir="${alfresco.dir}/tomcat/work/Catalina/localhost/alfresco" /> </target>
  • 23. Some Ant examples – Start/Stop Alfresco! <target name="start-alfresco" description="Start the Alfresco Repository"> <exec executable="/bin/sh"> <arg line='-c "${alfresco.dir}/alfresco.sh start"'/> </exec> </target> <target name="stop-alfresco“ description="Stop the Alfresco Repository"> <exec executable="/bin/sh"> <arg line='-c "${alfresco.dir}/alfresco.sh stop"'/> </exec> </target>
  • 24. About The Example! This example implements a simple customization that allows documents to be tagged as sendable. Each document has a status and a document ID – The document ID does not have to be the object ID and is guaranteed to be unique in the repository.! – The valid statuses are staged, effective and retired.! Users must have ManageSendable Permission to change the sendable status.
  • 25. Extending Permissions! Why Extend Permissions –  Allows Developers to Secure new functionality with ACLs! –  Allows Developers to Expose new combinations of low level permissions a new role.! Examples of Extended Permissions –  Share! –  Records Management! Caveats and Gotchas –  If you create new permissions you will have some extra work around security.!
  • 26. Steps! Create Permissions Model File – The Records Management and Share Permissions files are good examples! – The DTD is another good source of documentation -- http:// wiki.alfresco.com/wiki/PermissionModelDTD! Wire in the bean – Add the permissionModelBootstrap bean! – Wire in any additional permissions using Security Interceptors (if needed)! – Add any needed permissions to the slingshotDocLibCustomResponse bean!
  • 27. Permission Model Code Snippet! <permissions> <!-- Namespaces used in type references --> …. <permissionSet type="senddoc:content" expose="all"> <permissionGroup name="ManageSendable" expose="true" allowFullControl="false"/> <!-- The low level permission to control setting the owner of a node --> <permission name="_ManageSendable" expose="false" requiresType="false"> <grantedToGroup permissionGroup="ManageSendable" /> <requiredPermission on="node" type="sys:base" name="_ReadProperties" /> </permission> </permissionSet> </permissions>
  • 28. Security Interceptor Code Snippet! <bean id="SendableService_security" class="org.alfresco.repo.security.permissions.impl.acegi.MethodS ecurityInterceptor"> <!– Manager Beans Here  <property name="objectDefinitionSource"> <value> com.oldschooltechie.sendable.SendableService.makeNodeEffective= ACL_NODE.1.senddoc:content.ManageSendable com.oldschooltechie.sendable.SendableService.retireNode= ACL_NODE.1.senddoc:content.ManageSendable com.oldschooltechie.sendable.SendableService.*= ACL_ALLOW </value> </property> </bean>
  • 29. Creating JavaScript APIs! Why Create JavaScript APIs – Exposes key functionality to JavaScript! – Allows for the encapsulation of the “heavy lifting” functionality! Some examples of how Custom Javascript APIs are used – Called from Javascript Based webscripts! – Unit testing underlying Java Functionality from JavaScript Scripts that can be run with the Execute Script Action!
  • 30. Steps! Create the Java Class that will provide the API – Extend the org.alfresco.repo.jscript.BaseScopableProcessorExtension class! – All public methods that are not setters and getters will be exposed as JavaScript methods.! – Make sure that you convert NodeRefs into ScriptNodes and visa versa.! – Make sure that arguments passed and returned are Scalars, Scriptables, Arrays or Maps.! Wire in the bean – Extend the baseJavaScriptExtension bean! – Set the extensionName property!
  • 31. Code Snippet! public class SendableScriptAPI extends BaseScopableProcessorExtension { // Code Omitted public ScriptNode getNodeRefById(String docId) { NodeRef result = sendableService.getNodeRefById(docId); return new ScriptNode(result, this.serviceRegistry, getScope()); } public void makeSendable(ScriptNode nodeRef,String docId) { sendableService.makeSendable(nodeRef.getNodeRef(), docId); } }
  • 32. Bean Definition! <bean id="SendableScriptAPI" parent="baseJavaScriptExtension" class= "com.oldschooltechie.sendable.jscript.SendableScriptAPI"> <property name="extensionName"> <value>sendable</value> </property> <property name="sendableService"> <ref bean="SendableService"/> </property> <property name="serviceRegistry"> <ref bean="ServiceRegistry"/> </property> </bean>
  • 33. Attribute Service! What is the Attribute Service – Allows for the storage of arbitrary key value pairs! – Each key can have up to 3 segments.! – The key segments and values are all Serializables (i.e. can be anything).! Why Use Atrribute Service – There are a number of use cases…..! – Our use case – properties that must have a unique value across nodes.! •  Allows making associations between values and nodes via the Database! •  Allows for Enforcing Uniqueness of certain Values! – AttributeService also allowed for retrieving nodes (immediately across all nodes in a cluster) by a property value. (This is less of an issue in swift).!
  • 34. Steps For Using the Attribute Server! Determine how you will plan on using it. – Think about the Key space – use the fact that the key is segmented.! – Think about the core operations! – Wrap it all in a component.!
  • 35. Example Code Snippet…! public static final String SENDABLE_ATTR_NAME = "..SENDABLE_ID.."; public static final String SENDABLE_DOC_ID_ATTR_NAME = "..DOC_ID.."; public void storeDocId(String doc_id,NodeRef nodeRef) { if (attributeService.exists(SENDABLE_ATTR_NAME, SENDABLE_DOC_ID_ATTR_NAME,doc_id)) { // Check to see if this node has already been registered if (!attributeService.getAttribute(SENDABLE_ATTR_NAME, SENDABLE_DOC_ID_ATTR_NAME,doc_id).equals(nodeRef)) { throw new SendableRuntimeException("Duplicate entry id:"+doc_id); } } attributeService.setAttribute(nodeRef,SENDABLE_ATTR_NAME, SENDABLE_DOC_ID_ATTR_NAME,doc_id); }