For Alfresco Community 3.4.a and newer and Enterprise 3.3.5 or 3.4 and newer, please see Doclib Portlet instead.
One of the new features added to Alfresco Enterprise 3.2r is the ability to turn Web Scripts into standalone portlets that run on Liferay or other portals and include support for Single Sign-On (SSO) and generating portal-friendly URLs.
This capability is further enhanced in Alfresco Community 3.4 and later versions as we can now deploy the Alfresco Share Document Library as a portlet.
The DocLib Portlet aims to surface the rich document management capabilities provided by the Share Document Library (DocLib) within a Portal.
For any other requirement there also is an alfresco-demo-portlets project hosted on Google Code that will show how to implement portlets for any portlet-container using the Alfresco Web Services API, WebScriptPortlet, CMIS and Spring Surf: [alfresco-portlets-demo]
The following videos demonstrate the basic features and installation process.
Portals provide a framework for integrating information, applications, people, processes etc. They are designed to aggregate and personalize information through application-specific portlets. They typically offer some basic content management capabilities but do not provide the rich content management services supported by Alfresco.
Portal users want to use Alfresco's document management capabilities within the context of the Portal rather then via a standalone UI.
The Doclib Portet will allow Alfresco's document management capabilities for the repository or Share Sites to surfaced directly within the portal (initially Liferay) via portlets. This will allow all the core document management capabilities to be used within the context of the portal page, without opening in separate tabs/windows.
The DocLib Portlet technically consists of 2 portlets, a Repository Document Library portlet and Sites Document Library portlet.
The following applies to both the Repository Document Library portlet and the Sites Document Library portlet.
The standard Share header will *not* be available i.e. My Dashboard, My Profile etc, site name, page component links.
We assume you've installed the Alfresco and Liferay Tomcat bundles into separate directories. We'll refer to these as <ALFRESCO_HOME> and <LIFERAY_HOME>
Step 1. Configuring Liferay's Tomcat Server to resolve port conflicts by editing <LIFERAY_HOME>/<tomcat>/conf/server.xml:
Change all the port numbers to avoid conflicts with the Alfresco's Tomcat server, here are the changes I made:
...
<Server port="8105" shutdown="SHUTDOWN">
...
<Connector port="9090" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="9443" URIEncoding="UTF-8" />
...
<Connector port="8109" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8" />
...
Step 2. Next, edit <LIFERAY_HOME>/<tomcat>/conf/catalina.properties and locate the "shared.loader" entry and replace it with this:
shared.loader=${catalina.base}/shared/classes,${catalina.base}/shared/lib/*.jar
Step 3. Edit <ALFRESCO_HOME>/tomcat/shared/classes/alfresco-global.properties and add to file
shared/classes/alfresco/alfresco-global.properties
the following lines to the end of the file:
authentication.chain=alfrescoNtlm1:alfrescoNtlm,external1:external
external.authentication.proxyUserName=
NOTE: Yes, the value for proxyUserName needs to be blank.
Step 4. Copy <ALFRESCO_HOME>/tomcat/webapps/share.war to <LIFERAY_HOME>/deploy
Step 5. Copy the entire <ALFRESCO_HOME>/tomcat/shared directory to <LIFERAY_HOME>/<tomcat>/
NOTE: Technically, we only need the shared/classes/alfresco/web-extension/ directory, but copying the whole shared directory is a convenient alternative.
Step 6. Open <LIFERAY_HOME>/<tomcat>hared/classes/alfresco/web-extension/share-config-custom.xml.sample to share-config-custom.xml and edit the file to uncomment the second config block to enable remote authenticator. The comments are on lines 44 and 73. The result should look like this:
Note: Modify endpoint-url parameters to match actual Repository deployment.
<alfresco-config>
<!-- Overriding endpoints to reference a remote Alfresco server -->
<config evaluator="string-compare" condition="Remote">
<remote>
<endpoint>
<id>alfresco-noauth</id>
<name>Alfresco - unauthenticated access</name>
<description>Access to Alfresco Repository WebScripts that do not require authentication</description>
<connector-id>alfresco</connector-id>
<endpoint-url>http://localhost:8080/alfresco/s</endpoint-url>
<identity>none</identity>
</endpoint>
<endpoint>
<id>alfresco-feed</id>
<name>Alfresco Feed</name>
<description>Alfresco Feed - supports basic HTTP authentication</description>
<connector-id>http</connector-id>
<endpoint-url>http://localhost:8080/alfresco/s</endpoint-url>
<basic-auth>true</basic-auth>
<identity>user</identity>
</endpoint>
<connector>
<id>alfrescoCookie</id>
<name>Alfresco Connector</name>
<description>Connects to an Alfresco instance using cookie-based authentication</description>
<class>org.springframework.extensions.webscripts.connector.AlfrescoConnector</class>
</connector>
<endpoint>
<id>alfresco</id>
<name>Alfresco - user access</name>
<description>Access to Alfresco Repository WebScripts that require user authentication</description>
<connector-id>alfrescoCookie</connector-id>
<endpoint-url>http://localhost:8080/alfresco/wcs</endpoint-url>
<identity>user</identity>
<external-auth>true</external-auth>
</endpoint>
</remote>
</config>
</alfresco-config>
NOTE: If you're running Alfresco's Tomcat server on a different host or port, please change the corresponding endpoint.
Step 7. Startup Alfresco, then follow up with starting Liferay.
Step 8. Once Alfresco and Liferay are started, add and try out the basic CMIS Repo Browser portlet. It should appear under the "Alfresco" category.
This integration makes use of an external authenticator that will automatically create an Alfresco user account whenever a new Liferay user accesses an Alfresco portlet.
To create your own custom portlet, I recommend you look at the CMIS Repo code under in the share.war file under WEB-INF/classes/alfresco/webscripts/org/alfresco/test/cmisrepo.* and cmisfolder.*.
In short, you'll need to create a Web Script which can be placed inside the share.war file under WEB-INF/classes/alfresco/webscripts or in<LIFERAY_HOME>/<tomcat>/shared/classes/alfresco/web-extension/webscripts (create the directory if it doesn't already exist.
You'll also need to edit the portlet.xml file in the share.war/WEB-INF directory to add a new entry for your portlet using the Alfresco "ProxyPortlet" as the portlet class.
<portlet>
<description>CMIS Folder Browser</description>
<portlet-name>CMISFolder</portlet-name>
<portlet-class>org.alfresco.web.portlet.ProxyPortlet</portlet-class>
<init-param>
<name>scriptUrl</name>
<value>/share/service/sample/cmis/repo</value>
</init-param>
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>VIEW</portlet-mode>
</supports>
<portlet-info>
<title>CMIS Folder Browser</title>
<short-title>CMIS Folder</short-title>
</portlet-info>
</portlet>
Finally add your portlet to the liferay-display.xml and liferay-portlet.xml files.
To make sure that your URLs are correctly generated, please use the "scripturl()" function in your Freemarker templates to wrap them:
<a href="${scripturl(url.serviceContext + "/sample/cmis/repo", false)}">CMIS Repository</a>