SlideShare a Scribd company logo
1 of 64
Download to read offline
Agenda
Introduction 
http://www.keensoft.es! 
!!!!!!! 
http://orderofthebee.org! 
Addons committee 
CE 
EE 
eSign! 
LTA! 
RM!
Preliminary thoughts 
From a newbie’s point of view
Alfresco is hard to learn
Some new words (for newbies) 
Aikau! Activiti! 
AMP! 
WebScript! Spring Surf! 
FreeMarker! 
CMIS! Content Model!
Is there another life? 
! 
"With even a few lines of code, you can 
easily add useful functionality to Alfresco." 
! 
(April 4, 2014 by Jeff Potts)!
Disclaimer 
! 
Source code based on Alfresco CE 4.2.f ! 
and available at GitHub ! 
! 
WARNING!! 
Code for teaching purposes. ! 
Don’t try to compile it on your head.!
Countdown 
Real questions from real persons
10. Add a download button 
Motivation. "When I get a shared 
document link by email and click on it, the 
result may not be accessible: sometimes 
the preview is not working, sometimes I 
can only see a simple picture, sometimes 
my computer has no Flash Player... How 
can I get the content of a document 
shared with me?"!
10. Add a download button 
Quick Share!
10. Add a download button 
1. 
2. 
<div class="document-download"> 
<a title="Download" class="simple-link" 
download="${displayName?html}" 
href="${url.context}/proxy/alfresco-noauth/api/internal/ 
shared/node/content/${args.shareId}?a=true">Download</a> 
</div> 
web-extension/site-webscripts/org/alfresco/components/quickshare/node-header.get.html.ftl
10. Add a download button 
2 lines! 
Not all browsers supported *! 
! 
Danger zone! 
Alfresco default FTL! 
should not be ! 
overwritten!! 
! 
web-extension 
FTL 
WebScript 
CE 
5.0.a
9. Site creation ability 
Motivation. "I don't want all the users 
creating sites without control, our 
organization is being directed by our own 
Process Map and no one should create 
content out of its limits."!
9. Site creation ability
9. Site creation ability (share) 
1. 
2. 
3. 
var sitesMenu = widgetUtils.findObject(model.jsonModel, "id", 
"HEADER_SITES_MENU"); 
if (sitesMenu) { 
sitesMenu.config.showCreateSite = user.isAdmin; 
} 
web-extension/site-webscripts/es/keensoft/share/header/share-header.get.js 
4. model.showCreateSite = user.isAdmin; 
web-extension/site-webscripts/es/keensoft/components/dashlets/my-sites.get.js
9. Site creation ability (share) 
<extension> 
<modules> 
<module> 
<id>Hide Create Site</id> 
<customizations> 
<customization> 
<targetPackageRoot>org.alfresco</targetPackageRoot> 
<sourcePackageRoot>es.keensoft</sourcePackageRoot> 
</customization> 
</customizations> 
</module> 
</modules> 
</extension> 
web-extension/site-data/extensions/hide-create-site-extensions.xml
9. Site creation ability (share) 
<!-- Required from 5.0.a --> 
<customization> 
<targetPackageRoot>org.alfresco.share.pages 
</targetPackageRoot> 
<sourcePackageRoot>es.keensoft.share.header 
</sourcePackageRoot> 
<alwaysApply> 
<webscript>share-header</webscript> 
</alwaysApply> 
</customization> 
web-extension/site-data/extensions/hide-create-site-extensions.xml 
C 
E 
>= 
5.0.a 
(aikau)!
9. Site creation ability (repo) 
function main(){ 
var user = people.getPerson(person.properties.userName); 
if (!people.isAdmin(user)) { 
status.setCode(status.STATUS_FORBIDDEN, "error.noPermissions"); 
return; 
} 
config/alfresco/extension/templates/webscripts/org/alfresco/repository/site/ 
sites.post.json.js 
5. 
6. 
7. 
8.
9. Site creation ability 
web-extension 
8 lines! 
No Alfresco repository! 
permissions modified *! 
but! 
repo webscript overridden! 
WebScript 
aikau 
Alfresco JS API 
* http://wiki.alfresco.com/wiki/Site_Service#Controlling_who_can_create_sites 
Other dashlets could be extended: dynamic-welcome, my-meeting-workspaces, my-workspaces
8. Changing document extension 
Motivation. "We are elaborating 
documents on Microsoft Word, once the 
document is closed we are uploading a 
final version in PDF. Surprisingly, final 
document has the same extension as 
original (.DOC) although mimetype is right. 
Users can't open PDF document by 
downloading or by editing online because 
local programs are associated by file 
extension."!
8. Changing document extension
8. Changing document extension 
1. 
2. 
3. 
4. 
5. 
6. 
7. 
public class ContentBehaviour implements 
ContentServicePolicies.OnContentPropertyUpdatePolicy { 
@Override 
public void onContentPropertyUpdate(NodeRef nodeRef, QName propertyQName, 
ContentData beforeValue, ContentData afterValue) { 
if (beforeValue != null && 
!beforeValue.getMimetype().equals(afterValue.getMimetype())) { 
String name = (String)nodeService.getProperty(nodeRef, ContentModel.PROP_NAME); 
String nameNoExt = FilenameUtils.getBaseName(name); 
String newExt = mimetypeService.getExtension(afterValue.getMimetype()); 
nodeService.setProperty(nodeRef, ContentModel.PROP_NAME, 
nameNoExt + "." + newExt); 
} 
} 
} 
es.keensoft.alfresco.behaviour.ContentBehaviour.java
8. Changing document extension 
<beans> 
<bean id="${project.artifactId}-ContentBehavior" 
class="es.keensoft.alfresco.behaviour.ContentBehaviour" 
init-method="init"> 
<property name="policyComponent" ref="policyComponent" /> 
<property name="nodeService" ref="NodeService" /> 
<property name="mimetypeService" ref="MimetypeService" /> 
</bean> 
</beans> 
config/alfresco/module/context/service-context.xml
8. Changing document extension 
behavior 
7 lines! 
Alfresco Java 
API
7. Setting create missing person 
Motivation. "I have configured our LDAP 
for identification because I don't want to 
take care of passwords, but I don't want 
everyone on this LDAP to have access to 
Alfresco.!
7. Setting create missing person 
# Some authentication mechanisms may need to create people 
# in the repository on demand. This enables that feature. 
# If disabled an error will be generated for missing 
# people. If enabled then a person will be created and 
# persisted. 
create.missing.people=${server.transaction.allow-writes}! 
! 
From 4.2.d! 
! 
From 4.2! 
CE 
EE
7. Setting create missing person 
1. 
2. 
3. 
4. 
public class CustomSpringBeanPostProcessor implements 
BeanFactoryPostProcessor, ApplicationContextAware { 
@Override 
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) 
throws BeansException { 
BeanDefinition bd = beanFactory.getBeanDefinition(beanName); 
bd.getPropertyValues().add(propertyName, propertyValue); 
} 
} 
es.keensoft.alfresco.behaviour.ContentBehaviour.java 
C 
E 
< 
4.2.d 
E 
E 
< 
4.2
7. Setting create missing person 
<beans> 
<bean id="customSpringBeanPostProcessor" 
class="es.keensoft.repo.CustomSpringBeanPostProcessor"> 
<property name="beanName" value="personService" /> 
<property name="propertyName” 
value="createMissingPeople" /> 
<property name="propertyValue" value="false" /> 
</bean> 
</beans> 
config/alfresco/module/context/service-context.xml
7. Setting create missing person 
Spring bean 
post-processor 
4 lines! 
! 
Updating Alfresco properties 
after Spring initialization 
phase!
6. Custom LDAP identification 
Motivation. "We have several LDAP 
branches, one for each mail subdomain, 
but mail attribute is not bindable. The only 
attribute bindable is an UID which can be 
repeated on every branch. How can I 
identify my users?"!
6. Custom LDAP identification 
o=sales! 
uid=peter 
peter@mkt.mail.com!o=mkt! 
uid=peter 
peter@sales.mail.com!
6. Custom LDAP identification 
1. 
2. 
3. 
4. 
5. 
6. 
7. 
8. 
9. 
public class CustomDNLDAPAuthenticationComponentImpl extends 
LDAPAuthenticationComponentImpl { 
protected void authenticateImpl(String userName, char[] password) 
throws AuthenticationException { 
if (userName.indexOf("@") != -1) { 
String mailDomain = userName.substring(userName.indexOf("@") + 1); 
String patchedUserName = userName.substring(0, userName.indexOf("@")); 
String dnPattern = (mailDomain == null ? null : 
mailDomainLdapMapping.get(mailDomain)); 
if (mailDomain != null && dnPattern != null && 
userNameFormat.indexOf(dnPattern) != -1) { 
userName = patchedUserName; 
} 
} 
super.authenticateImpl(userName, password); 
} 
} 
es.keensoft.repo.security.authentication.ldap. 
CustomDNLDAPAuthenticationComponentImpl
6. Custom LDAP identification 
<beans> 
<bean id="authenticationComponent" 
class="es.keensoft.repo.security.authentication.ldap. 
CustomDNLDAPAuthenticationComponentImpl" 
parent="authenticationComponentBase"> 
... 
<!-- mailDomain, targeted DN pattern --> 
<property name="mailDomainLdapMapping"> 
<map> 
<entry key="sales.mail.com" value="o=sales,o=isp"/> 
<entry key="mkt.mail.com" value="o=mkt,o=isp"/> 
</map> 
</property> 
</bean> 
</beans> 
config/alfresco/module/context/service-context.xml
6. Custom LDAP identification 
Alfresco bean 
override 
9 lines! 
! 
Danger zone! 
Alfresco default beans! 
should not be overridden!!
5. PDF/A transformation 
Motivation. "We are required by law to 
expose all our documents in PDF/A 
format"!
5. PDF/A transformation 
<document-formats> 
<document-format><name>Portable Document Format</name> 
<mime-type>application/pdf</mime-type> 
<file-extension>pdf</file-extension> 
<export-filters> 
<entry><family>Presentation</family> 
<string>impress_pdf_Export</string></entry> 
<entry><family>Spreadsheet</family><string>calc_pdf_Export</string></entry> 
<entry><family>Text</family><string>writer_pdf_Export</string></entry> 
</export-filters> 
<export-options> 
<entry><string>SelectPdfVersion</string><int>1</int></entry> 
</export-options> 
</document-format> 
... 
</document-formats> 
config/alfresco/mimetype/openoffice-document-formats.xml
5. PDF/A transformation 
Properties 
override 
0 lines! 
! 
Some additional development 
would be necessary to have 
both (PDF and PDFA) 
transformers available!
4. Importing original dates 
Motivation. "We have large history before 
Alfresco, how can I preserve the records of 
date for every imported document?”!
4. Importing original dates 
1. 
2. 
3. 
4. 
5. 
<model name="ks:custom-model" xmlns="http://www.alfresco.org/model/dictionary/1.0"> 
<imports> 
<import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d" /> 
</imports> 
<namespaces> 
<namespace uri="http://www.alfresco.com/model/custom-model/1.0" prefix="ks" /> 
</namespaces> 
<aspects> 
<aspect name="ks:importedDoc"> 
<properties> 
<property name="ks:originalCreationDate"> 
<type>d:date</type> 
</property> 
<property name="ks:originalModificationDate"> 
<type>d:date</type> 
</property> 
</properties> 
</aspect> 
</aspects> 
</model> 
config/alfresco/extension/model/custom-model.xml
4. Importing original dates 
<beans> 
<!-- Office 2007+ --> 
<bean id="extracter.Poi” 
class="org.alfresco.repo.content.metadata.PoiMetadataExtracter” 
parent="baseMetadataExtracter"> 
<property name="inheritDefaultMapping"> 
<value>true</value> 
</property> 
<property name="mappingProperties"> 
<props> 
<prop key="namespace.prefix.ks"> 
http://www.alfresco.com/model/custom-model/1.0</prop> 
<prop key="Creation-Date">ks:originalCreationDate</prop> 
<prop key="Last-Modified">ks:originalModificationDate</prop> 
</props> 
</property> 
</bean> 
</beans> 
config/alfresco/extension/custom-model-context.xml
4. Importing original dates 
Content Model 
5 lines! 
! 
Other formats could be 
included (PDF, ODF…)! 
Some other XML config is 
required for Alfresco Share! 
Extracter 
configuration
3. Custom EML node names 
Motivation. "I don't understand Alfresco 
imported mails from IMAP, the names have 
no sense for me."!
3. Custom EML node names 
content 
autoVersionOnUpdateProps, 
autoVersion, initialVersion, versionLabel 
title, author, modified, description 
1 Create node! 
2 Create content! 
3 Create version! 
4 Update props! 
name, node-dbid, store-identifier, 
node-uuid, modified, locale, created, 
store-protocol, creator, modifier 
Properties 
Properties 
Properties 
Properties
3. Custom EML node names 
public class ImapContentBehaviour implements 
NodeServicePolicies.OnUpdatePropertiesPolicy { 
public void onUpdateProperties(NodeRef nodeRef, 
Map<QName, Serializable> before, Map<QName, Serializable> after) { 
if (!before.get(ContentModel.PROP_TITLE).equals( 
after.get(ContentModel.PROP_TITLE))) { 
String intendedName = 
nodeService.getProperty(nodeRef, ContentModel.PROP_TITLE) + ".eml"; 
try { 
fileFolderService.rename(nodeRef, intendedName); 
} catch (Exception e) { // ELM node not renamed... } 
} 
} 
} 
1. 
2. 
3. 
4. 
5. 
6. 
es.keensoft.alfresco.behaviour.ImapContentBehaviour.java
3. Custom EML node names 
<beans> 
<bean id="${project.artifactId}-ContentBehavior" 
class="es.keensoft.alfresco.behaviour.ImapContentBehaviour" 
init-method="init"> 
<property name="policyComponent" ref="policyComponent" /> 
<property name="nodeService" ref="NodeService" /> 
<property name="fileFolderService" ref="FileFolderService"/> 
</bean> 
</beans> 
config/alfresco/module/context/service-context.xml
3. Custom EML node names 
behavior 
6 lines! 
! 
Custom RFC822 transformer 
for HTML could be included ! 
Alfresco Java 
API
2. Site custom properties 
Motivation. "Every site on our company 
belongs to one entity and it’s identified by 
an internal ID, it’s required to set this entity 
on every Alfresco site creation."!
2. Site custom properties (share) 
1. 
2. 
3. 
4. 
<@markup id="custom-properties" target="fields" action="after"> 
<div class="yui-gd"> 
<div class="yui-u first"><label for="${el}-idEntity">Entity:</label></div> 
<div class="yui-u"><input id="${el}-idEntity" type="text" name="idEntity”/></div> 
</div> 
</@markup> 
config/alfresco/web-extension/site-webscripts/es/keensoft/modules/ 
create-site.get.html.ftl
2. Site custom properties (share) 
<extension> 
<modules> 
<module> 
<id>Custom Site Props</id> 
<customizations> 
<customization> 
<targetPackageRoot>org.alfresco</targetPackageRoot> 
<sourcePackageRoot>es.keensoft</sourcePackageRoot> 
</customization> 
</customizations> 
</module> 
</modules> 
</extension> 
web-extension/site-data/extensions/custom-site-prop-extensions.xml
2. Site custom properties (repo) 
5. 
6. 
7. 
8. 
site = siteService.createSite(sitePreset, shortName, title, description, visibility, 
sitetype); 
if (json.has("idEntity")) { 
site.node.properties["stcp:idEntity"] = json.get("idEntity"); 
site.node.save(); 
site.save(); 
} 
model.site = site; 
config/alfresco/extension/templates/webscripts/org/alfresco/repository/site/ 
sites.post.json.js 
2 in a row!
2. Site custom properties 
web-extension 
8 lines! 
! 
Alfresco webscript repo 
extension not available! 
Easy to extend this ! 
sample for site edition! 
FTL 
Alfresco JS API
1. Site templates with folders 
Motivation. "Someone recently asked how 
to create Alfresco Share sites with a 
default folder structure. Currently, out-of-the- 
box, when you create an Alfresco 
Share site, the document library is empty. 
This person instead wanted to define a set 
of folders that would be created in the 
document library when a new Alfresco 
Share site is created."! 
http://ecmarchitect.com/archives/2014/04/04/3687
1. Site templates with folders 
public class ShareDocumentLib implements NodeServicePolicies.OnCreateNodePolicy { 
public void onCreateNode(ChildAssociationRef childAssocRef) { 
String sitePreset = 
nodeService.getProperty(childAssocRef.getChildRef(), PROP_SITE_PRESET); 
String query = "+PATH:"/app:company_home/app:dictionary/app:space_templates/*" + 
@cm:name:"" + sitePreset + """; 
ResultSet rs = 
searchService.query(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, 
SearchService.LANGUAGE_LUCENE, query); 
NodeRef documentLibrary = 
fileFolderService.copy(rs.getNodeRef(0), childAssocRef.getChildRef(), 
"documentLibrary").getNodeRef(); 
Map<QName, Serializable> props = new HashMap<QName, Serializable>(); 
props.put(ContentModel.PROP_DESCRIPTION, "Document Library"); 
props.put(PROP_SITE_COMPONENT_ID, "documentLibrary"); 
nodeService.addAspect(documentLibrary, ASPECT_SITE_CONTAINER, props); 
} 
} 
1. 
2. 
3. 
4. 
5. 
6. 
7. 
8. 
9. 
10. 
com.ecmarchitect.share.behavior. 
ShareDocumentLibraryFromTemplate.java
1. Site templates with folders 
<beans> 
<bean id="${project.artifactId}_siteBehavior” 
class="com.ecmarchitect.share.behavior.ShareDocumentLib” 
init-method="init"> 
<property name="nodeService” ref="NodeService”/> 
<property name="policyComponent” ref="policyComponent”/> 
<property name="fileFolderService” ref="FileFolderService”/> 
<property name="searchService” ref="SearchService”/> 
</bean> 
</beans> 
config/alfresco/module/share-site-space-templates-repo/context/service-context.xml
1. Site templates with folders 
behavior 
10 lines! 
! 
Jeff Potts article and ! 
GitHub sample available! 
Alfresco Java 
API
What we have learned 
As Alfresco developers
Badges earned 
Content Model 
FTL 
Alfresco JS API 
behavior 
Alfresco Java 
API 
Alfresco source 
aikau 
web-extension 
WebScriptoverride
What should I learn? 
XML! 
JS! 
FTL! 
Java! 
Source code lines (percentage)
Keep it SSO 
Extend! 
Override! 
Overwrite! 
! 
Alfresco source code to the rescue! .! 
The less you write, the better you code . 
Alfresco is full of hooks! .! 
! 
[Open]
Resources 
And some contact data
Resources 
! 
http://github.com/keensoft/alfresco-summit-2014! 
[Enhancements 1-9]! 
!! 
! 
http://ecmarchitect.com/archives/2014/04/04/3687! 
[Enhancement 10]!
Contact 
http://www.keensoft.es! 
! 
http://github.com/keensoft! 
! 
@AngelBorroy! 
! 
http://orderofthebee.org! 
! 
http://angelborroy.wordpress.com!
Summit2014 topic 0066 - 10 enhancements that require 10 lines of code

More Related Content

What's hot

Um roadmap do Framework Ruby on Rails, do Rails 1 ao Rails 4 - DevDay 2013
Um roadmap do Framework Ruby on Rails, do Rails 1 ao Rails 4 - DevDay 2013Um roadmap do Framework Ruby on Rails, do Rails 1 ao Rails 4 - DevDay 2013
Um roadmap do Framework Ruby on Rails, do Rails 1 ao Rails 4 - DevDay 2013Joao Lucas Santana
 
Why You Should be Using Web Components Right Now. And How. ForwardJS July 2015
Why You Should be Using Web Components Right Now. And How. ForwardJS July 2015Why You Should be Using Web Components Right Now. And How. ForwardJS July 2015
Why You Should be Using Web Components Right Now. And How. ForwardJS July 2015Phil Leggetter
 
[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVCAlive Kuo
 
Django の認証処理実装パターン / Django Authentication Patterns
Django の認証処理実装パターン / Django Authentication PatternsDjango の認証処理実装パターン / Django Authentication Patterns
Django の認証処理実装パターン / Django Authentication PatternsMasashi Shibata
 
HTML5: where flash isn't needed anymore
HTML5: where flash isn't needed anymoreHTML5: where flash isn't needed anymore
HTML5: where flash isn't needed anymoreRemy Sharp
 
J Query (Complete Course) by Muhammad Ehtisham Siddiqui
J Query (Complete Course) by Muhammad Ehtisham SiddiquiJ Query (Complete Course) by Muhammad Ehtisham Siddiqui
J Query (Complete Course) by Muhammad Ehtisham SiddiquiMuhammad Ehtisham Siddiqui
 
ILUG 2010 - Deploying plug-ins to the enterprise
ILUG 2010 - Deploying plug-ins to the enterpriseILUG 2010 - Deploying plug-ins to the enterprise
ILUG 2010 - Deploying plug-ins to the enterpriseRené Winkelmeyer
 
E2 appspresso hands on lab
E2 appspresso hands on labE2 appspresso hands on lab
E2 appspresso hands on labNAVER D2
 
HTML5 and the dawn of rich mobile web applications pt 1
HTML5 and the dawn of rich mobile web applications pt 1HTML5 and the dawn of rich mobile web applications pt 1
HTML5 and the dawn of rich mobile web applications pt 1James Pearce
 
FamilySearch Reference Client
FamilySearch Reference ClientFamilySearch Reference Client
FamilySearch Reference ClientDallan Quass
 
Practical HTML5: Using It Today
Practical HTML5: Using It TodayPractical HTML5: Using It Today
Practical HTML5: Using It TodayDoris Chen
 
Create a res tful services api in php.
Create a res tful services api in php.Create a res tful services api in php.
Create a res tful services api in php.Adeoye Akintola
 
Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)
Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)
Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)Nicholas Zakas
 
Djangoアプリのデプロイに関するプラクティス / Deploy django application
Djangoアプリのデプロイに関するプラクティス / Deploy django applicationDjangoアプリのデプロイに関するプラクティス / Deploy django application
Djangoアプリのデプロイに関するプラクティス / Deploy django applicationMasashi Shibata
 
HTML5 APIs - Where No Man Has Gone Before! - GothamJS
HTML5 APIs - Where No Man Has Gone Before! - GothamJSHTML5 APIs - Where No Man Has Gone Before! - GothamJS
HTML5 APIs - Where No Man Has Gone Before! - GothamJSRobert Nyman
 

What's hot (20)

Um roadmap do Framework Ruby on Rails, do Rails 1 ao Rails 4 - DevDay 2013
Um roadmap do Framework Ruby on Rails, do Rails 1 ao Rails 4 - DevDay 2013Um roadmap do Framework Ruby on Rails, do Rails 1 ao Rails 4 - DevDay 2013
Um roadmap do Framework Ruby on Rails, do Rails 1 ao Rails 4 - DevDay 2013
 
API Design - 3rd Edition
API Design - 3rd EditionAPI Design - 3rd Edition
API Design - 3rd Edition
 
2. 엔티티 매핑(entity mapping) 2 2 엔티티매핑 2-2-4. 식별자 자동 생성(@generated-value)3
2. 엔티티 매핑(entity mapping) 2 2 엔티티매핑 2-2-4. 식별자 자동 생성(@generated-value)32. 엔티티 매핑(entity mapping) 2 2 엔티티매핑 2-2-4. 식별자 자동 생성(@generated-value)3
2. 엔티티 매핑(entity mapping) 2 2 엔티티매핑 2-2-4. 식별자 자동 생성(@generated-value)3
 
Why You Should be Using Web Components Right Now. And How. ForwardJS July 2015
Why You Should be Using Web Components Right Now. And How. ForwardJS July 2015Why You Should be Using Web Components Right Now. And How. ForwardJS July 2015
Why You Should be Using Web Components Right Now. And How. ForwardJS July 2015
 
The Rails Way
The Rails WayThe Rails Way
The Rails Way
 
18.register login
18.register login18.register login
18.register login
 
[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC
 
Django の認証処理実装パターン / Django Authentication Patterns
Django の認証処理実装パターン / Django Authentication PatternsDjango の認証処理実装パターン / Django Authentication Patterns
Django の認証処理実装パターン / Django Authentication Patterns
 
HTML5: where flash isn't needed anymore
HTML5: where flash isn't needed anymoreHTML5: where flash isn't needed anymore
HTML5: where flash isn't needed anymore
 
J Query (Complete Course) by Muhammad Ehtisham Siddiqui
J Query (Complete Course) by Muhammad Ehtisham SiddiquiJ Query (Complete Course) by Muhammad Ehtisham Siddiqui
J Query (Complete Course) by Muhammad Ehtisham Siddiqui
 
ILUG 2010 - Deploying plug-ins to the enterprise
ILUG 2010 - Deploying plug-ins to the enterpriseILUG 2010 - Deploying plug-ins to the enterprise
ILUG 2010 - Deploying plug-ins to the enterprise
 
E2 appspresso hands on lab
E2 appspresso hands on labE2 appspresso hands on lab
E2 appspresso hands on lab
 
HTML5 and the dawn of rich mobile web applications pt 1
HTML5 and the dawn of rich mobile web applications pt 1HTML5 and the dawn of rich mobile web applications pt 1
HTML5 and the dawn of rich mobile web applications pt 1
 
FamilySearch Reference Client
FamilySearch Reference ClientFamilySearch Reference Client
FamilySearch Reference Client
 
前端概述
前端概述前端概述
前端概述
 
Practical HTML5: Using It Today
Practical HTML5: Using It TodayPractical HTML5: Using It Today
Practical HTML5: Using It Today
 
Create a res tful services api in php.
Create a res tful services api in php.Create a res tful services api in php.
Create a res tful services api in php.
 
Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)
Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)
Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)
 
Djangoアプリのデプロイに関するプラクティス / Deploy django application
Djangoアプリのデプロイに関するプラクティス / Deploy django applicationDjangoアプリのデプロイに関するプラクティス / Deploy django application
Djangoアプリのデプロイに関するプラクティス / Deploy django application
 
HTML5 APIs - Where No Man Has Gone Before! - GothamJS
HTML5 APIs - Where No Man Has Gone Before! - GothamJSHTML5 APIs - Where No Man Has Gone Before! - GothamJS
HTML5 APIs - Where No Man Has Gone Before! - GothamJS
 

Viewers also liked

Social Savvy Business
Social Savvy BusinessSocial Savvy Business
Social Savvy BusinessPaul Hampton
 
Alfresco : Extending The Alfresco Content Model
Alfresco : Extending The Alfresco Content ModelAlfresco : Extending The Alfresco Content Model
Alfresco : Extending The Alfresco Content ModelWildan Maulana
 
Bee con2016 lightning_20160125005_ocr
Bee con2016 lightning_20160125005_ocrBee con2016 lightning_20160125005_ocr
Bee con2016 lightning_20160125005_ocrAngel Borroy López
 
BeeCon 2016 Alfresco Engineering lightning talk
BeeCon 2016 Alfresco Engineering lightning talkBeeCon 2016 Alfresco Engineering lightning talk
BeeCon 2016 Alfresco Engineering lightning talkDavid Webster
 
Summit2014 topic 0153 - Alfresco Maven for shared properties
Summit2014 topic 0153 - Alfresco Maven for shared propertiesSummit2014 topic 0153 - Alfresco Maven for shared properties
Summit2014 topic 0153 - Alfresco Maven for shared propertiesAngel Borroy López
 
Extending Share: Real World Examples
Extending Share: Real World ExamplesExtending Share: Real World Examples
Extending Share: Real World ExamplesDavid Webster
 
Alfresco - Floating on the cloud
Alfresco - Floating on the cloudAlfresco - Floating on the cloud
Alfresco - Floating on the cloudPaul Hampton
 
Extending share: from the outside in
Extending share: from the outside inExtending share: from the outside in
Extending share: from the outside inDavid Webster
 
Bee con2016 presentation_20160125004_installing
Bee con2016 presentation_20160125004_installingBee con2016 presentation_20160125004_installing
Bee con2016 presentation_20160125004_installingAngel Borroy López
 
Getting started with Alfresco in the cloud
Getting started with Alfresco in the cloudGetting started with Alfresco in the cloud
Getting started with Alfresco in the cloudPaul Hampton
 
Desarrollando software para Alfresco (keensoft)
Desarrollando software para Alfresco (keensoft)Desarrollando software para Alfresco (keensoft)
Desarrollando software para Alfresco (keensoft)Angel Borroy López
 
Alfresco scalability and performnce
Alfresco   scalability and performnceAlfresco   scalability and performnce
Alfresco scalability and performncePaul Hampton
 
Lightning barcelona 2-6_synchronizing-activiti-user-tasks
Lightning barcelona 2-6_synchronizing-activiti-user-tasksLightning barcelona 2-6_synchronizing-activiti-user-tasks
Lightning barcelona 2-6_synchronizing-activiti-user-tasksAngel Borroy López
 
Content Intelligence on Alfresco with A.A.A.R. (BeeCon 2016)
Content Intelligence on Alfresco with A.A.A.R. (BeeCon 2016)Content Intelligence on Alfresco with A.A.A.R. (BeeCon 2016)
Content Intelligence on Alfresco with A.A.A.R. (BeeCon 2016)Francesco Corti
 
Could Alfresco Survive a Zombie Attack?
Could Alfresco Survive a Zombie Attack?Could Alfresco Survive a Zombie Attack?
Could Alfresco Survive a Zombie Attack?Jeff Potts
 
Zia Fresh Project demo
Zia   Fresh Project demoZia   Fresh Project demo
Zia Fresh Project demoZia Consulting
 

Viewers also liked (20)

Social Savvy Business
Social Savvy BusinessSocial Savvy Business
Social Savvy Business
 
Alfresco mobile
Alfresco mobileAlfresco mobile
Alfresco mobile
 
Alfresco : Extending The Alfresco Content Model
Alfresco : Extending The Alfresco Content ModelAlfresco : Extending The Alfresco Content Model
Alfresco : Extending The Alfresco Content Model
 
Bee con2016 lightning_20160125005_ocr
Bee con2016 lightning_20160125005_ocrBee con2016 lightning_20160125005_ocr
Bee con2016 lightning_20160125005_ocr
 
BeeCon 2016 Alfresco Engineering lightning talk
BeeCon 2016 Alfresco Engineering lightning talkBeeCon 2016 Alfresco Engineering lightning talk
BeeCon 2016 Alfresco Engineering lightning talk
 
Summit2014 topic 0153 - Alfresco Maven for shared properties
Summit2014 topic 0153 - Alfresco Maven for shared propertiesSummit2014 topic 0153 - Alfresco Maven for shared properties
Summit2014 topic 0153 - Alfresco Maven for shared properties
 
Extending Share: Real World Examples
Extending Share: Real World ExamplesExtending Share: Real World Examples
Extending Share: Real World Examples
 
Alfresco - Floating on the cloud
Alfresco - Floating on the cloudAlfresco - Floating on the cloud
Alfresco - Floating on the cloud
 
Extending share: from the outside in
Extending share: from the outside inExtending share: from the outside in
Extending share: from the outside in
 
Bee con2016 presentation_20160125004_installing
Bee con2016 presentation_20160125004_installingBee con2016 presentation_20160125004_installing
Bee con2016 presentation_20160125004_installing
 
Firma electrónica
Firma electrónicaFirma electrónica
Firma electrónica
 
Getting started with Alfresco in the cloud
Getting started with Alfresco in the cloudGetting started with Alfresco in the cloud
Getting started with Alfresco in the cloud
 
Desarrollando software para Alfresco (keensoft)
Desarrollando software para Alfresco (keensoft)Desarrollando software para Alfresco (keensoft)
Desarrollando software para Alfresco (keensoft)
 
Alfresco scalability and performnce
Alfresco   scalability and performnceAlfresco   scalability and performnce
Alfresco scalability and performnce
 
Lightning barcelona 2-6_synchronizing-activiti-user-tasks
Lightning barcelona 2-6_synchronizing-activiti-user-tasksLightning barcelona 2-6_synchronizing-activiti-user-tasks
Lightning barcelona 2-6_synchronizing-activiti-user-tasks
 
Formación WS
Formación WSFormación WS
Formación WS
 
Alfresco : Planning
Alfresco : PlanningAlfresco : Planning
Alfresco : Planning
 
Content Intelligence on Alfresco with A.A.A.R. (BeeCon 2016)
Content Intelligence on Alfresco with A.A.A.R. (BeeCon 2016)Content Intelligence on Alfresco with A.A.A.R. (BeeCon 2016)
Content Intelligence on Alfresco with A.A.A.R. (BeeCon 2016)
 
Could Alfresco Survive a Zombie Attack?
Could Alfresco Survive a Zombie Attack?Could Alfresco Survive a Zombie Attack?
Could Alfresco Survive a Zombie Attack?
 
Zia Fresh Project demo
Zia   Fresh Project demoZia   Fresh Project demo
Zia Fresh Project demo
 

Similar to Summit2014 topic 0066 - 10 enhancements that require 10 lines of code

BP-6 Repository Customization Best Practices
BP-6 Repository Customization Best PracticesBP-6 Repository Customization Best Practices
BP-6 Repository Customization Best PracticesAlfresco Software
 
Mozilla Web Apps - Super-VanJS
Mozilla Web Apps - Super-VanJSMozilla Web Apps - Super-VanJS
Mozilla Web Apps - Super-VanJSRobert Nyman
 
The Magic Revealed: Four Real-World Examples of Using the Client Object Model...
The Magic Revealed: Four Real-World Examples of Using the Client Object Model...The Magic Revealed: Four Real-World Examples of Using the Client Object Model...
The Magic Revealed: Four Real-World Examples of Using the Client Object Model...SPTechCon
 
Javascript MVC & Backbone Tips & Tricks
Javascript MVC & Backbone Tips & TricksJavascript MVC & Backbone Tips & Tricks
Javascript MVC & Backbone Tips & TricksHjörtur Hilmarsson
 
Restap ito uploadfilessharepoint
Restap ito uploadfilessharepointRestap ito uploadfilessharepoint
Restap ito uploadfilessharepointMAHESH NEELANNAVAR
 
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
 
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
 
Javascript first-class citizenery
Javascript first-class citizeneryJavascript first-class citizenery
Javascript first-class citizenerytoddbr
 
#NewMeetup Performance
#NewMeetup Performance#NewMeetup Performance
#NewMeetup PerformanceJustin Cataldo
 
Introduction to using jQuery with SharePoint
Introduction to using jQuery with SharePointIntroduction to using jQuery with SharePoint
Introduction to using jQuery with SharePointRene Modery
 
Taking Web Apps Offline
Taking Web Apps OfflineTaking Web Apps Offline
Taking Web Apps OfflinePedro Morais
 
Approaches to mobile site development
Approaches to mobile site developmentApproaches to mobile site development
Approaches to mobile site developmentErik Mitchell
 
Rails 3: Dashing to the Finish
Rails 3: Dashing to the FinishRails 3: Dashing to the Finish
Rails 3: Dashing to the FinishYehuda Katz
 
Seguranca em APP Rails
Seguranca em APP RailsSeguranca em APP Rails
Seguranca em APP RailsDaniel Lopes
 
Hdv309 - Real World Sandboxed Solutions
Hdv309 - Real World Sandboxed SolutionsHdv309 - Real World Sandboxed Solutions
Hdv309 - Real World Sandboxed Solutionswoutervugt
 
A 2-2 php on windows azure
A 2-2 php on windows azureA 2-2 php on windows azure
A 2-2 php on windows azureGoAzure
 

Similar to Summit2014 topic 0066 - 10 enhancements that require 10 lines of code (20)

BP-6 Repository Customization Best Practices
BP-6 Repository Customization Best PracticesBP-6 Repository Customization Best Practices
BP-6 Repository Customization Best Practices
 
Mozilla Web Apps - Super-VanJS
Mozilla Web Apps - Super-VanJSMozilla Web Apps - Super-VanJS
Mozilla Web Apps - Super-VanJS
 
RESTAPI_SPHOSTED_APP
RESTAPI_SPHOSTED_APPRESTAPI_SPHOSTED_APP
RESTAPI_SPHOSTED_APP
 
The Magic Revealed: Four Real-World Examples of Using the Client Object Model...
The Magic Revealed: Four Real-World Examples of Using the Client Object Model...The Magic Revealed: Four Real-World Examples of Using the Client Object Model...
The Magic Revealed: Four Real-World Examples of Using the Client Object Model...
 
Javascript MVC & Backbone Tips & Tricks
Javascript MVC & Backbone Tips & TricksJavascript MVC & Backbone Tips & Tricks
Javascript MVC & Backbone Tips & Tricks
 
Restap ito uploadfilessharepoint
Restap ito uploadfilessharepointRestap ito uploadfilessharepoint
Restap ito uploadfilessharepoint
 
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...
 
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
 
Javascript first-class citizenery
Javascript first-class citizeneryJavascript first-class citizenery
Javascript first-class citizenery
 
Taking your Web App for a walk
Taking your Web App for a walkTaking your Web App for a walk
Taking your Web App for a walk
 
#NewMeetup Performance
#NewMeetup Performance#NewMeetup Performance
#NewMeetup Performance
 
Introduction to using jQuery with SharePoint
Introduction to using jQuery with SharePointIntroduction to using jQuery with SharePoint
Introduction to using jQuery with SharePoint
 
Taking Web Apps Offline
Taking Web Apps OfflineTaking Web Apps Offline
Taking Web Apps Offline
 
Approaches to mobile site development
Approaches to mobile site developmentApproaches to mobile site development
Approaches to mobile site development
 
Rails 3: Dashing to the Finish
Rails 3: Dashing to the FinishRails 3: Dashing to the Finish
Rails 3: Dashing to the Finish
 
Webpack
Webpack Webpack
Webpack
 
Seguranca em APP Rails
Seguranca em APP RailsSeguranca em APP Rails
Seguranca em APP Rails
 
Hdv309 - Real World Sandboxed Solutions
Hdv309 - Real World Sandboxed SolutionsHdv309 - Real World Sandboxed Solutions
Hdv309 - Real World Sandboxed Solutions
 
PHP on Windows Azure
PHP on Windows Azure PHP on Windows Azure
PHP on Windows Azure
 
A 2-2 php on windows azure
A 2-2 php on windows azureA 2-2 php on windows azure
A 2-2 php on windows azure
 

More from Angel Borroy López

Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Angel Borroy López
 
Using Generative AI and Content Service Platforms together
Using Generative AI and Content Service Platforms togetherUsing Generative AI and Content Service Platforms together
Using Generative AI and Content Service Platforms togetherAngel Borroy López
 
Enhancing Document-Centric Features with On-Premise Generative AI for Alfresc...
Enhancing Document-Centric Features with On-Premise Generative AI for Alfresc...Enhancing Document-Centric Features with On-Premise Generative AI for Alfresc...
Enhancing Document-Centric Features with On-Premise Generative AI for Alfresc...Angel Borroy López
 
La Guía Definitiva para una Actualización Exitosa a Alfresco 23.1
La Guía Definitiva para una Actualización Exitosa a Alfresco 23.1La Guía Definitiva para una Actualización Exitosa a Alfresco 23.1
La Guía Definitiva para una Actualización Exitosa a Alfresco 23.1Angel Borroy López
 
Docker Init with Templates for Alfresco
Docker Init with Templates for AlfrescoDocker Init with Templates for Alfresco
Docker Init with Templates for AlfrescoAngel Borroy López
 
Alfresco Transform Services 4.0.0
Alfresco Transform Services 4.0.0Alfresco Transform Services 4.0.0
Alfresco Transform Services 4.0.0Angel Borroy López
 
How to migrate from Alfresco Search Services to Alfresco SearchEnterprise
How to migrate from Alfresco Search Services to Alfresco SearchEnterpriseHow to migrate from Alfresco Search Services to Alfresco SearchEnterprise
How to migrate from Alfresco Search Services to Alfresco SearchEnterpriseAngel Borroy López
 
CSP: Evolución de servicios de código abierto en un mundo Cloud Native
CSP: Evolución de servicios de código abierto en un mundo Cloud NativeCSP: Evolución de servicios de código abierto en un mundo Cloud Native
CSP: Evolución de servicios de código abierto en un mundo Cloud NativeAngel Borroy López
 
Alfresco Embedded Activiti Engine
Alfresco Embedded Activiti EngineAlfresco Embedded Activiti Engine
Alfresco Embedded Activiti EngineAngel Borroy López
 
Collaborative Editing Tools for Alfresco
Collaborative Editing Tools for AlfrescoCollaborative Editing Tools for Alfresco
Collaborative Editing Tools for AlfrescoAngel Borroy López
 
Desarrollando una Extensión para Docker
Desarrollando una Extensión para DockerDesarrollando una Extensión para Docker
Desarrollando una Extensión para DockerAngel Borroy López
 
DockerCon 2022 Spanish Room-ONBOARDING.pdf
DockerCon 2022 Spanish Room-ONBOARDING.pdfDockerCon 2022 Spanish Room-ONBOARDING.pdf
DockerCon 2022 Spanish Room-ONBOARDING.pdfAngel Borroy López
 
Deploying Containerised Open-Source CSP Platforms
Deploying Containerised Open-Source CSP PlatformsDeploying Containerised Open-Source CSP Platforms
Deploying Containerised Open-Source CSP PlatformsAngel Borroy López
 
Discovering the 2 in Alfresco Search Services 2.0
Discovering the 2 in Alfresco Search Services 2.0Discovering the 2 in Alfresco Search Services 2.0
Discovering the 2 in Alfresco Search Services 2.0Angel Borroy López
 
(Re)Indexing Large Repositories in Alfresco
(Re)Indexing Large Repositories in Alfresco(Re)Indexing Large Repositories in Alfresco
(Re)Indexing Large Repositories in AlfrescoAngel Borroy López
 

More from Angel Borroy López (20)

Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
 
Using Generative AI and Content Service Platforms together
Using Generative AI and Content Service Platforms togetherUsing Generative AI and Content Service Platforms together
Using Generative AI and Content Service Platforms together
 
Enhancing Document-Centric Features with On-Premise Generative AI for Alfresc...
Enhancing Document-Centric Features with On-Premise Generative AI for Alfresc...Enhancing Document-Centric Features with On-Premise Generative AI for Alfresc...
Enhancing Document-Centric Features with On-Premise Generative AI for Alfresc...
 
La Guía Definitiva para una Actualización Exitosa a Alfresco 23.1
La Guía Definitiva para una Actualización Exitosa a Alfresco 23.1La Guía Definitiva para una Actualización Exitosa a Alfresco 23.1
La Guía Definitiva para una Actualización Exitosa a Alfresco 23.1
 
Docker Init with Templates for Alfresco
Docker Init with Templates for AlfrescoDocker Init with Templates for Alfresco
Docker Init with Templates for Alfresco
 
Before & After Docker Init
Before & After Docker InitBefore & After Docker Init
Before & After Docker Init
 
Alfresco Transform Services 4.0.0
Alfresco Transform Services 4.0.0Alfresco Transform Services 4.0.0
Alfresco Transform Services 4.0.0
 
How to migrate from Alfresco Search Services to Alfresco SearchEnterprise
How to migrate from Alfresco Search Services to Alfresco SearchEnterpriseHow to migrate from Alfresco Search Services to Alfresco SearchEnterprise
How to migrate from Alfresco Search Services to Alfresco SearchEnterprise
 
Using Podman with Alfresco
Using Podman with AlfrescoUsing Podman with Alfresco
Using Podman with Alfresco
 
CSP: Evolución de servicios de código abierto en un mundo Cloud Native
CSP: Evolución de servicios de código abierto en un mundo Cloud NativeCSP: Evolución de servicios de código abierto en un mundo Cloud Native
CSP: Evolución de servicios de código abierto en un mundo Cloud Native
 
Alfresco Embedded Activiti Engine
Alfresco Embedded Activiti EngineAlfresco Embedded Activiti Engine
Alfresco Embedded Activiti Engine
 
Alfresco Transform Core 3.0.0
Alfresco Transform Core 3.0.0Alfresco Transform Core 3.0.0
Alfresco Transform Core 3.0.0
 
Collaborative Editing Tools for Alfresco
Collaborative Editing Tools for AlfrescoCollaborative Editing Tools for Alfresco
Collaborative Editing Tools for Alfresco
 
Desarrollando una Extensión para Docker
Desarrollando una Extensión para DockerDesarrollando una Extensión para Docker
Desarrollando una Extensión para Docker
 
DockerCon 2022 Spanish Room-ONBOARDING.pdf
DockerCon 2022 Spanish Room-ONBOARDING.pdfDockerCon 2022 Spanish Room-ONBOARDING.pdf
DockerCon 2022 Spanish Room-ONBOARDING.pdf
 
Deploying Containerised Open-Source CSP Platforms
Deploying Containerised Open-Source CSP PlatformsDeploying Containerised Open-Source CSP Platforms
Deploying Containerised Open-Source CSP Platforms
 
Introduction to AWS
Introduction to AWSIntroduction to AWS
Introduction to AWS
 
Alfresco Certificates
Alfresco Certificates Alfresco Certificates
Alfresco Certificates
 
Discovering the 2 in Alfresco Search Services 2.0
Discovering the 2 in Alfresco Search Services 2.0Discovering the 2 in Alfresco Search Services 2.0
Discovering the 2 in Alfresco Search Services 2.0
 
(Re)Indexing Large Repositories in Alfresco
(Re)Indexing Large Repositories in Alfresco(Re)Indexing Large Repositories in Alfresco
(Re)Indexing Large Repositories in Alfresco
 

Recently uploaded

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
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
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 Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptxLBM Solutions
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
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
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
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
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
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
 

Recently uploaded (20)

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
 
Vulnerability_Management_GRC_by Sohang Sengupta.pptx
Vulnerability_Management_GRC_by Sohang Sengupta.pptxVulnerability_Management_GRC_by Sohang Sengupta.pptx
Vulnerability_Management_GRC_by Sohang Sengupta.pptx
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
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
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptx
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
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
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
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
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
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
 

Summit2014 topic 0066 - 10 enhancements that require 10 lines of code

  • 1.
  • 3. Introduction http://www.keensoft.es! !!!!!!! http://orderofthebee.org! Addons committee CE EE eSign! LTA! RM!
  • 4. Preliminary thoughts From a newbie’s point of view
  • 5. Alfresco is hard to learn
  • 6. Some new words (for newbies) Aikau! Activiti! AMP! WebScript! Spring Surf! FreeMarker! CMIS! Content Model!
  • 7. Is there another life? ! "With even a few lines of code, you can easily add useful functionality to Alfresco." ! (April 4, 2014 by Jeff Potts)!
  • 8. Disclaimer ! Source code based on Alfresco CE 4.2.f ! and available at GitHub ! ! WARNING!! Code for teaching purposes. ! Don’t try to compile it on your head.!
  • 9. Countdown Real questions from real persons
  • 10. 10. Add a download button Motivation. "When I get a shared document link by email and click on it, the result may not be accessible: sometimes the preview is not working, sometimes I can only see a simple picture, sometimes my computer has no Flash Player... How can I get the content of a document shared with me?"!
  • 11. 10. Add a download button Quick Share!
  • 12. 10. Add a download button 1. 2. <div class="document-download"> <a title="Download" class="simple-link" download="${displayName?html}" href="${url.context}/proxy/alfresco-noauth/api/internal/ shared/node/content/${args.shareId}?a=true">Download</a> </div> web-extension/site-webscripts/org/alfresco/components/quickshare/node-header.get.html.ftl
  • 13. 10. Add a download button 2 lines! Not all browsers supported *! ! Danger zone! Alfresco default FTL! should not be ! overwritten!! ! web-extension FTL WebScript CE 5.0.a
  • 14. 9. Site creation ability Motivation. "I don't want all the users creating sites without control, our organization is being directed by our own Process Map and no one should create content out of its limits."!
  • 15. 9. Site creation ability
  • 16. 9. Site creation ability (share) 1. 2. 3. var sitesMenu = widgetUtils.findObject(model.jsonModel, "id", "HEADER_SITES_MENU"); if (sitesMenu) { sitesMenu.config.showCreateSite = user.isAdmin; } web-extension/site-webscripts/es/keensoft/share/header/share-header.get.js 4. model.showCreateSite = user.isAdmin; web-extension/site-webscripts/es/keensoft/components/dashlets/my-sites.get.js
  • 17. 9. Site creation ability (share) <extension> <modules> <module> <id>Hide Create Site</id> <customizations> <customization> <targetPackageRoot>org.alfresco</targetPackageRoot> <sourcePackageRoot>es.keensoft</sourcePackageRoot> </customization> </customizations> </module> </modules> </extension> web-extension/site-data/extensions/hide-create-site-extensions.xml
  • 18. 9. Site creation ability (share) <!-- Required from 5.0.a --> <customization> <targetPackageRoot>org.alfresco.share.pages </targetPackageRoot> <sourcePackageRoot>es.keensoft.share.header </sourcePackageRoot> <alwaysApply> <webscript>share-header</webscript> </alwaysApply> </customization> web-extension/site-data/extensions/hide-create-site-extensions.xml C E >= 5.0.a (aikau)!
  • 19. 9. Site creation ability (repo) function main(){ var user = people.getPerson(person.properties.userName); if (!people.isAdmin(user)) { status.setCode(status.STATUS_FORBIDDEN, "error.noPermissions"); return; } config/alfresco/extension/templates/webscripts/org/alfresco/repository/site/ sites.post.json.js 5. 6. 7. 8.
  • 20. 9. Site creation ability web-extension 8 lines! No Alfresco repository! permissions modified *! but! repo webscript overridden! WebScript aikau Alfresco JS API * http://wiki.alfresco.com/wiki/Site_Service#Controlling_who_can_create_sites Other dashlets could be extended: dynamic-welcome, my-meeting-workspaces, my-workspaces
  • 21. 8. Changing document extension Motivation. "We are elaborating documents on Microsoft Word, once the document is closed we are uploading a final version in PDF. Surprisingly, final document has the same extension as original (.DOC) although mimetype is right. Users can't open PDF document by downloading or by editing online because local programs are associated by file extension."!
  • 22. 8. Changing document extension
  • 23. 8. Changing document extension 1. 2. 3. 4. 5. 6. 7. public class ContentBehaviour implements ContentServicePolicies.OnContentPropertyUpdatePolicy { @Override public void onContentPropertyUpdate(NodeRef nodeRef, QName propertyQName, ContentData beforeValue, ContentData afterValue) { if (beforeValue != null && !beforeValue.getMimetype().equals(afterValue.getMimetype())) { String name = (String)nodeService.getProperty(nodeRef, ContentModel.PROP_NAME); String nameNoExt = FilenameUtils.getBaseName(name); String newExt = mimetypeService.getExtension(afterValue.getMimetype()); nodeService.setProperty(nodeRef, ContentModel.PROP_NAME, nameNoExt + "." + newExt); } } } es.keensoft.alfresco.behaviour.ContentBehaviour.java
  • 24. 8. Changing document extension <beans> <bean id="${project.artifactId}-ContentBehavior" class="es.keensoft.alfresco.behaviour.ContentBehaviour" init-method="init"> <property name="policyComponent" ref="policyComponent" /> <property name="nodeService" ref="NodeService" /> <property name="mimetypeService" ref="MimetypeService" /> </bean> </beans> config/alfresco/module/context/service-context.xml
  • 25. 8. Changing document extension behavior 7 lines! Alfresco Java API
  • 26. 7. Setting create missing person Motivation. "I have configured our LDAP for identification because I don't want to take care of passwords, but I don't want everyone on this LDAP to have access to Alfresco.!
  • 27. 7. Setting create missing person # Some authentication mechanisms may need to create people # in the repository on demand. This enables that feature. # If disabled an error will be generated for missing # people. If enabled then a person will be created and # persisted. create.missing.people=${server.transaction.allow-writes}! ! From 4.2.d! ! From 4.2! CE EE
  • 28. 7. Setting create missing person 1. 2. 3. 4. public class CustomSpringBeanPostProcessor implements BeanFactoryPostProcessor, ApplicationContextAware { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { BeanDefinition bd = beanFactory.getBeanDefinition(beanName); bd.getPropertyValues().add(propertyName, propertyValue); } } es.keensoft.alfresco.behaviour.ContentBehaviour.java C E < 4.2.d E E < 4.2
  • 29. 7. Setting create missing person <beans> <bean id="customSpringBeanPostProcessor" class="es.keensoft.repo.CustomSpringBeanPostProcessor"> <property name="beanName" value="personService" /> <property name="propertyName” value="createMissingPeople" /> <property name="propertyValue" value="false" /> </bean> </beans> config/alfresco/module/context/service-context.xml
  • 30. 7. Setting create missing person Spring bean post-processor 4 lines! ! Updating Alfresco properties after Spring initialization phase!
  • 31. 6. Custom LDAP identification Motivation. "We have several LDAP branches, one for each mail subdomain, but mail attribute is not bindable. The only attribute bindable is an UID which can be repeated on every branch. How can I identify my users?"!
  • 32. 6. Custom LDAP identification o=sales! uid=peter peter@mkt.mail.com!o=mkt! uid=peter peter@sales.mail.com!
  • 33. 6. Custom LDAP identification 1. 2. 3. 4. 5. 6. 7. 8. 9. public class CustomDNLDAPAuthenticationComponentImpl extends LDAPAuthenticationComponentImpl { protected void authenticateImpl(String userName, char[] password) throws AuthenticationException { if (userName.indexOf("@") != -1) { String mailDomain = userName.substring(userName.indexOf("@") + 1); String patchedUserName = userName.substring(0, userName.indexOf("@")); String dnPattern = (mailDomain == null ? null : mailDomainLdapMapping.get(mailDomain)); if (mailDomain != null && dnPattern != null && userNameFormat.indexOf(dnPattern) != -1) { userName = patchedUserName; } } super.authenticateImpl(userName, password); } } es.keensoft.repo.security.authentication.ldap. CustomDNLDAPAuthenticationComponentImpl
  • 34. 6. Custom LDAP identification <beans> <bean id="authenticationComponent" class="es.keensoft.repo.security.authentication.ldap. CustomDNLDAPAuthenticationComponentImpl" parent="authenticationComponentBase"> ... <!-- mailDomain, targeted DN pattern --> <property name="mailDomainLdapMapping"> <map> <entry key="sales.mail.com" value="o=sales,o=isp"/> <entry key="mkt.mail.com" value="o=mkt,o=isp"/> </map> </property> </bean> </beans> config/alfresco/module/context/service-context.xml
  • 35. 6. Custom LDAP identification Alfresco bean override 9 lines! ! Danger zone! Alfresco default beans! should not be overridden!!
  • 36. 5. PDF/A transformation Motivation. "We are required by law to expose all our documents in PDF/A format"!
  • 37. 5. PDF/A transformation <document-formats> <document-format><name>Portable Document Format</name> <mime-type>application/pdf</mime-type> <file-extension>pdf</file-extension> <export-filters> <entry><family>Presentation</family> <string>impress_pdf_Export</string></entry> <entry><family>Spreadsheet</family><string>calc_pdf_Export</string></entry> <entry><family>Text</family><string>writer_pdf_Export</string></entry> </export-filters> <export-options> <entry><string>SelectPdfVersion</string><int>1</int></entry> </export-options> </document-format> ... </document-formats> config/alfresco/mimetype/openoffice-document-formats.xml
  • 38. 5. PDF/A transformation Properties override 0 lines! ! Some additional development would be necessary to have both (PDF and PDFA) transformers available!
  • 39. 4. Importing original dates Motivation. "We have large history before Alfresco, how can I preserve the records of date for every imported document?”!
  • 40. 4. Importing original dates 1. 2. 3. 4. 5. <model name="ks:custom-model" xmlns="http://www.alfresco.org/model/dictionary/1.0"> <imports> <import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d" /> </imports> <namespaces> <namespace uri="http://www.alfresco.com/model/custom-model/1.0" prefix="ks" /> </namespaces> <aspects> <aspect name="ks:importedDoc"> <properties> <property name="ks:originalCreationDate"> <type>d:date</type> </property> <property name="ks:originalModificationDate"> <type>d:date</type> </property> </properties> </aspect> </aspects> </model> config/alfresco/extension/model/custom-model.xml
  • 41. 4. Importing original dates <beans> <!-- Office 2007+ --> <bean id="extracter.Poi” class="org.alfresco.repo.content.metadata.PoiMetadataExtracter” parent="baseMetadataExtracter"> <property name="inheritDefaultMapping"> <value>true</value> </property> <property name="mappingProperties"> <props> <prop key="namespace.prefix.ks"> http://www.alfresco.com/model/custom-model/1.0</prop> <prop key="Creation-Date">ks:originalCreationDate</prop> <prop key="Last-Modified">ks:originalModificationDate</prop> </props> </property> </bean> </beans> config/alfresco/extension/custom-model-context.xml
  • 42. 4. Importing original dates Content Model 5 lines! ! Other formats could be included (PDF, ODF…)! Some other XML config is required for Alfresco Share! Extracter configuration
  • 43. 3. Custom EML node names Motivation. "I don't understand Alfresco imported mails from IMAP, the names have no sense for me."!
  • 44. 3. Custom EML node names content autoVersionOnUpdateProps, autoVersion, initialVersion, versionLabel title, author, modified, description 1 Create node! 2 Create content! 3 Create version! 4 Update props! name, node-dbid, store-identifier, node-uuid, modified, locale, created, store-protocol, creator, modifier Properties Properties Properties Properties
  • 45. 3. Custom EML node names public class ImapContentBehaviour implements NodeServicePolicies.OnUpdatePropertiesPolicy { public void onUpdateProperties(NodeRef nodeRef, Map<QName, Serializable> before, Map<QName, Serializable> after) { if (!before.get(ContentModel.PROP_TITLE).equals( after.get(ContentModel.PROP_TITLE))) { String intendedName = nodeService.getProperty(nodeRef, ContentModel.PROP_TITLE) + ".eml"; try { fileFolderService.rename(nodeRef, intendedName); } catch (Exception e) { // ELM node not renamed... } } } } 1. 2. 3. 4. 5. 6. es.keensoft.alfresco.behaviour.ImapContentBehaviour.java
  • 46. 3. Custom EML node names <beans> <bean id="${project.artifactId}-ContentBehavior" class="es.keensoft.alfresco.behaviour.ImapContentBehaviour" init-method="init"> <property name="policyComponent" ref="policyComponent" /> <property name="nodeService" ref="NodeService" /> <property name="fileFolderService" ref="FileFolderService"/> </bean> </beans> config/alfresco/module/context/service-context.xml
  • 47. 3. Custom EML node names behavior 6 lines! ! Custom RFC822 transformer for HTML could be included ! Alfresco Java API
  • 48. 2. Site custom properties Motivation. "Every site on our company belongs to one entity and it’s identified by an internal ID, it’s required to set this entity on every Alfresco site creation."!
  • 49. 2. Site custom properties (share) 1. 2. 3. 4. <@markup id="custom-properties" target="fields" action="after"> <div class="yui-gd"> <div class="yui-u first"><label for="${el}-idEntity">Entity:</label></div> <div class="yui-u"><input id="${el}-idEntity" type="text" name="idEntity”/></div> </div> </@markup> config/alfresco/web-extension/site-webscripts/es/keensoft/modules/ create-site.get.html.ftl
  • 50. 2. Site custom properties (share) <extension> <modules> <module> <id>Custom Site Props</id> <customizations> <customization> <targetPackageRoot>org.alfresco</targetPackageRoot> <sourcePackageRoot>es.keensoft</sourcePackageRoot> </customization> </customizations> </module> </modules> </extension> web-extension/site-data/extensions/custom-site-prop-extensions.xml
  • 51. 2. Site custom properties (repo) 5. 6. 7. 8. site = siteService.createSite(sitePreset, shortName, title, description, visibility, sitetype); if (json.has("idEntity")) { site.node.properties["stcp:idEntity"] = json.get("idEntity"); site.node.save(); site.save(); } model.site = site; config/alfresco/extension/templates/webscripts/org/alfresco/repository/site/ sites.post.json.js 2 in a row!
  • 52. 2. Site custom properties web-extension 8 lines! ! Alfresco webscript repo extension not available! Easy to extend this ! sample for site edition! FTL Alfresco JS API
  • 53. 1. Site templates with folders Motivation. "Someone recently asked how to create Alfresco Share sites with a default folder structure. Currently, out-of-the- box, when you create an Alfresco Share site, the document library is empty. This person instead wanted to define a set of folders that would be created in the document library when a new Alfresco Share site is created."! http://ecmarchitect.com/archives/2014/04/04/3687
  • 54. 1. Site templates with folders public class ShareDocumentLib implements NodeServicePolicies.OnCreateNodePolicy { public void onCreateNode(ChildAssociationRef childAssocRef) { String sitePreset = nodeService.getProperty(childAssocRef.getChildRef(), PROP_SITE_PRESET); String query = "+PATH:"/app:company_home/app:dictionary/app:space_templates/*" + @cm:name:"" + sitePreset + """; ResultSet rs = searchService.query(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, SearchService.LANGUAGE_LUCENE, query); NodeRef documentLibrary = fileFolderService.copy(rs.getNodeRef(0), childAssocRef.getChildRef(), "documentLibrary").getNodeRef(); Map<QName, Serializable> props = new HashMap<QName, Serializable>(); props.put(ContentModel.PROP_DESCRIPTION, "Document Library"); props.put(PROP_SITE_COMPONENT_ID, "documentLibrary"); nodeService.addAspect(documentLibrary, ASPECT_SITE_CONTAINER, props); } } 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. com.ecmarchitect.share.behavior. ShareDocumentLibraryFromTemplate.java
  • 55. 1. Site templates with folders <beans> <bean id="${project.artifactId}_siteBehavior” class="com.ecmarchitect.share.behavior.ShareDocumentLib” init-method="init"> <property name="nodeService” ref="NodeService”/> <property name="policyComponent” ref="policyComponent”/> <property name="fileFolderService” ref="FileFolderService”/> <property name="searchService” ref="SearchService”/> </bean> </beans> config/alfresco/module/share-site-space-templates-repo/context/service-context.xml
  • 56. 1. Site templates with folders behavior 10 lines! ! Jeff Potts article and ! GitHub sample available! Alfresco Java API
  • 57. What we have learned As Alfresco developers
  • 58. Badges earned Content Model FTL Alfresco JS API behavior Alfresco Java API Alfresco source aikau web-extension WebScriptoverride
  • 59. What should I learn? XML! JS! FTL! Java! Source code lines (percentage)
  • 60. Keep it SSO Extend! Override! Overwrite! ! Alfresco source code to the rescue! .! The less you write, the better you code . Alfresco is full of hooks! .! ! [Open]
  • 61. Resources And some contact data
  • 62. Resources ! http://github.com/keensoft/alfresco-summit-2014! [Enhancements 1-9]! !! ! http://ecmarchitect.com/archives/2014/04/04/3687! [Enhancement 10]!
  • 63. Contact http://www.keensoft.es! ! http://github.com/keensoft! ! @AngelBorroy! ! http://orderofthebee.org! ! http://angelborroy.wordpress.com!