SlideShare ist ein Scribd-Unternehmen logo
1 von 36
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Was ist angesagt?

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 RackDonSchado
 
Choosing a Javascript Framework
Choosing a Javascript FrameworkChoosing a Javascript Framework
Choosing a Javascript FrameworkAll 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 2009Jason 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 DevelopmentAdam Tomat
 
Scalable Django Architecture
Scalable Django ArchitectureScalable Django Architecture
Scalable Django ArchitectureRami Sayar
 
What happens in laravel 4 bootstraping
What happens in laravel 4 bootstrapingWhat happens in laravel 4 bootstraping
What happens in laravel 4 bootstrapingJace Ju
 
Meetup Performance
Meetup PerformanceMeetup Performance
Meetup PerformanceGreg 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 AngularJSShekhar Gulati
 
#NewMeetup Performance
#NewMeetup Performance#NewMeetup Performance
#NewMeetup PerformanceJustin Cataldo
 
Operacion Guinda 2
Operacion Guinda 2Operacion Guinda 2
Operacion Guinda 2Red 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 ToolsRyan Weaver
 
Hacking Adobe Experience Manager sites
Hacking Adobe Experience Manager sitesHacking Adobe Experience Manager sites
Hacking Adobe Experience Manager sitesMikhail 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 RailsDonSchado
 

Was ist angesagt? (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
 

Ähnlich wie 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 codeAngel Borroy López
 
Spring 3 - An Introduction
Spring 3 - An IntroductionSpring 3 - An Introduction
Spring 3 - An IntroductionThorsten Kamann
 
[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVCAlive 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 ChefNathen 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 ScalaKazuhiro Sera
 
Solid and Sustainable Development in Scala
Solid and Sustainable Development in ScalaSolid and Sustainable Development in Scala
Solid and Sustainable Development in Scalascalaconfjp
 
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 updateAlex Pop
 
Spring 3 - Der dritte Frühling
Spring 3 - Der dritte FrühlingSpring 3 - Der dritte Frühling
Spring 3 - Der dritte FrühlingThorsten Kamann
 
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 ScaleIstanbul 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 middlewareAlona Mekhovova
 

Ähnlich wie 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
 

Mehr von Alfresco Software

Alfresco Day Benelux Inholland studentendossier
Alfresco Day Benelux Inholland studentendossierAlfresco Day Benelux Inholland studentendossier
Alfresco Day Benelux Inholland studentendossierAlfresco 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 applicationAlfresco 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 HogescholenAlfresco 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 AmsterdamAlfresco 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 AlfrescoAlfresco 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 GroupAlfresco 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 FlowAlfresco 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 APIAlfresco 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-KonsoleAlfresco 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 AlfrescoAlfresco 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: WesternacherAlfresco 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-novumAlfresco 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 - SafranAlfresco 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 BusinessAlfresco Software
 

Mehr von 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
 

Kürzlich hochgeladen

Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphNeo4j
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
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 organizationRadu Cotescu
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 

Kürzlich hochgeladen (20)

Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
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
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 

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); }