How to get rid of the Alfresco Labs default page footer

The web client for the open source Alfresco enterprise content management server ships with a footer that is added to every webpage via a JSP tag. The footer blends marketing and usage tracking with a copyright statement. It can be annoying to see on every page, especially if you are using the web client internally. The web client footer looks like this (from a clipped screen capture):

Alfresco page footer image

The footer says:
Supplied free of charge with no support, no certification, no maintenance,
no warranty and no indemnity by Alfresco or its Certified Partners. Click
here for support. Alfresco Software Inc. © 2005-2009 All rights reserved.
The footer includes Alfresco's logo by reading an image from the Alfresco website. This image is called a web bug, or beacon, and Alfresco can use the image request to their server to help track who is using Alfresco. The footer's underlined text links to pages on the alfresco.com website to provide warnings that the Labs version of Alfresco is not supported by Alfresco Software Inc. The right-side graphic links you to Alfresco's SourceForge download site.

Except for the web beacon image, I don't fault Alfresco Software for adding the footer to its web client. Alfresco Labs is a powerful -- free -- and flexible product. If used within an organization, it is not a bad thing that users are made aware that the product is not the supported Enterprise version. However, since I am using Alfresco on an internal website, and plan to customize the various JSP pages, displaying the warning on every one of my pages seems overkill and unnecessary. And I could do without sending tracking statistics to Alfresco Software.

Removing the global footer isn't a simple process, but it is pretty straightforward. The removal should be as simple as editing a globally included text file. Instead, those clever developers at Alfresco embedded the footer text into a fairly useful JSP tag. This <r:page> JSP tag outputs the skeletal HTML page tags, and includes HTML to pull in global scripts and cascading stylesheets. It also includes code that can log how long it took Alfresco to build the JSP page. To remove the footer from your web pages, you need either to stop using the r:page tag or recompile the page tag to set the text to what you would like, which is what the instructions below cover.

Recompiling the r:page tag that lives in the Alfresco web client JAR file isn't complicated. Assuming you already are using the Alfresco Labs 3 web application, the process should take you a half hour or less, with most of that time spent downloading and compiling code.

Overview

The steps below show you how to obtain the complete source code to Alfresco, make the necessary change to the Java page tag code, rebuild the web client JAR file, then replace the existing JAR file in your Alfresco server with the newly built one.

Prerequisites: You must have a Java compiler, a Subversion client, Apache Ant, and be able to use the command line. For Windows users without Subversion, you can install the SlikSVN client. Others can find a link to download a Subversion client from CollabNet's Tigris.org.

Instructions

Here are the steps to rebuild the Alfresco web client with the altered JSP page tag. (You should be able to cut and paste these lines onto your command line if you remove the prompt character.)
  1. Create an empty directory for the source code
    % mkdir alfresco-labs
    % cd alfresco-labs
    
  2. Use Subversion to download the Alfresco Labs source code
    % svn co svn://svn.alfresco.com/alfresco/HEAD
    
    or use the http protocol if you have internal firewall issues:
    % svn co http://svn.alfresco.com/repos/alfresco-open-mirror/alfresco/HEAD
    
    The svn command will connect to the Alfresco Subversion repository and copy each of the files in the HEAD branch into your local directory. Total download size will be about 734MB. Depending on the speed of your connection, this might be a good time to get coffee, have lunch, check your email. If the Subversion URL doesn't work, check this page to see if Alfresco has changed the repository location.

  3. Edit PageTag.java to change/remove the page footer text
    The PageTag.java file you want to edit is in the directory HEAD/root/projects/web-client/source/java/org/alfresco/web/ui/repo/tag. The commands below will edit the file in Notepad for Windows or vi for Unix/Mac users. But you also can just navigate to the folder and edit the file with any editor.

    For Windows:
    % notepad HEAD\root\projects\web-client\source\java\org\alfresco\web\ui\repo\tag\PageTag.java
    
    For Unix variants:
    $ vi HEAD/root/projects/web-client/source/java/org/alfresco/web/ui/repo/tag/PageTag.java
    
    At this point, you can decide what you want your new page footer text to say. The quickest edit is to completely remove all footer contents by changing line 115:
    private static String alfresco = null;
    
    to:
    private static String alfresco = "";
    
    Why this works is that static alfresco variable holds the contents of the page footer HTML (images and text), which is output by the overridden JSP tag library method doEndTag. If the alfresco variable is null, which it is the first time the code is run, the doEndTag method calls a private helper method, getAlfrescoButton, to populate it.

    If you want to change the footer text to something of your own choosing, or perhaps you want to retain the Alfresco copyright notice because you won't be changing the web client's look and feel, you will want either to set the alfresco variable to the text of your choosing, or edit the getAlfrescoButton method and/or some of the variables it uses to build up the footer text.

    For example, if you want to retain the copyright statement but remove the warning text, edit the ALF_COPY constant on lines 103-112 to remove the text you don't want:
    private final static String ALF_COPY  = "Supplied free of charge with " +
    "<a class='footer' href='http://www.alfresco.com/services/support/communityterms/#support'>no support</a>, " +
    "<a class='footer' href='http://www.alfresco.com/services/support/communityterms/#certification'>no certification</a>, " +
    "<a class='footer' href='http://www.alfresco.com/services/support/communityterms/#maintenance'>no maintenance</a>, " +
    "<a class='footer' href='http://www.alfresco.com/services/support/communityterms/#warranty'>no warranty</a> and " +
    "<a class='footer' href='http://www.alfresco.com/services/support/communityterms/#indemnity'>no indemnity</a> by " +
    "<a class='footer' href='http://www.alfresco.com'>Alfresco</a> or its " +
    "<a class='footer' href='http://www.alfresco.com/partners/'>Certified Partners</a>. " +
    "<a class='footer' href='http://www.alfresco.com/services/support/'>Click here for support</a>. " +
    "Alfresco Software Inc. © 2005-2009 All rights reserved.";
    
    If you want to keep some of the text but remove the web beacon image or SourceForge graphic, you will need to edit the getAlfrescoButton method or set the alfresco variable as discussed previously.

    Fortunately, the getAlfrescoButton method does not add structural HTML text to the footer, so setting the alfresco variable directly with your chosen text is a viable option. If you use HTTPS on your website and you want to use an image in your footer, have a look at the technique used in the getAlfrescoButton method to change the image URL based on the request scheme. It's a handy way to avoid having web browsers complain about an encrypted page using non-encrypted components.

    With the code edited, you are ready to rebuild Alfresco.
  4. Rebuild the web client application
    Here is where you need Ant. Use the build target to rebuild the project modules. The default target will attempt to deploy the rebuilt WAR file, so make sure to use the "build" target.

    For Windows:
    % ant -f HEAD\root\build.xml build
    
    For Unix:
    $ ant -f HEAD/root/build.xml build
    
    You will see several warnings about the use of deprecated methods and the like. But the code should build correctly.

    The Ant task should rebuild the Alfresco JAR files and the WAR file. The rebuilt alfresco-web-client.jar file is the one that contains the repository JSP tag you want to replace. The Ant task creates this JAR file in the directory HEAD/root/projects/web-client/build/dist.
  5. Copy the alfresco-web-client.jar to your Alfresco webapp
    Copy the JAR file to your exploded WAR file directory location under the WEB-INF/lib directory. If you deploy Alfresco as WAR file rather than exploded WAR, you can use the full alfresco.war file that you also will find in the HEAD/root/projects/web-client/build/dist. directory.
You're done. You should now be able to restart your application server and visit your Alfresco website:

Alfresco page without footer

Gone is the footer from this and all Alfresco web client pages.

10 thoughts on “How to get rid of the Alfresco Labs default page footer

  1. Hello
    Excellent post. I follow the exact instructions but I still get the original footer. Any suggestions?
    I’m running Alfresco Labs v3.0.0 (Stable 1526) on Windows 2003 Server with MySQL.

  2. i have follow instructions successfully. the page footer is gone. but when you try to start an advanced workflow on a document, i get an invitation error.
    java.lang.NoClassDefFoundError: org/alfresco/service/cmr/invitation/InvitationService
    caused by:
    java.lang.ClassNotFoundException: org.alfresco.service.cmr.invitation.InvitationService
    Hide Details
    java.lang.NoClassDefFoundError: org/alfresco/service/cmr/invitation/InvitationService
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
    at java.lang.Class.getDeclaredMethods(Class.java:1791)
    at java.beans.Introspector$1.run(Introspector.java:1272)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.beans.Introspector.getPublicDeclaredMethods(Introspector.java:1270)
    at java.beans.Introspector.getTargetMethodInfo(Introspector.java:1136)
    at java.beans.Introspector.getBeanInfo(Introspector.java:387)
    at java.beans.Introspector.getBeanInfo(Introspector.java:159)
    at org.apache.myfaces.el.PropertyResolverImpl.getPropertyDescriptor(PropertyResolverImpl.java:472)
    at org.apache.myfaces.el.PropertyResolverImpl.getType(PropertyResolverImpl.java:325)
    at org.apache.myfaces.config.ManagedBeanBuilder.initializeProperties(ManagedBeanBuilder.java:177)
    at org.apache.myfaces.config.ManagedBeanBuilder.buildManagedBean(ManagedBeanBuilder.java:55)
    at org.apache.myfaces.el.VariableResolverImpl.resolveVariable(VariableResolverImpl.java:314)
    at org.springframework.web.jsf.DelegatingVariableResolver.resolveVariable(DelegatingVariableResolver.java:108)
    at org.alfresco.web.app.AlfrescoVariableResolver.resolveVariable(AlfrescoVariableResolver.java:94)
    at org.apache.myfaces.el.ValueBindingImpl$ELVariableResolver.resolveVariable(ValueBindingImpl.java:570)
    at org.apache.commons.el.NamedValue.evaluate(NamedValue.java:124)
    at org.apache.myfaces.el.ValueBindingImpl.getValue(ValueBindingImpl.java:386)
    at org.alfresco.web.app.servlet.FacesHelper.getManagedBean(FacesHelper.java:168)
    at org.alfresco.web.bean.wizard.WizardManager.setCurrentWizard(WizardManager.java:113)
    at org.alfresco.web.app.AlfrescoNavigationHandler.handleWizardOpen(AlfrescoNavigationHandler.java:667)
    at org.alfresco.web.app.AlfrescoNavigationHandler.handleNavigation(AlfrescoNavigationHandler.java:120)
    at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:82)
    at javax.faces.component.UICommand.broadcast(UICommand.java:109)
    at javax.faces.component.UIViewRoot._broadcastForPhase(UIViewRoot.java:97)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:171)
    at org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:32)
    at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:95)
    at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:70)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:139)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.alfresco.web.app.servlet.AuthenticationFilter.doFilter(AuthenticationFilter.java:81)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:619)
    Caused by: java.lang.ClassNotFoundException: org.alfresco.service.cmr.invitation.InvitationService
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
    … 46 more
    Return to application
    $$return_home$$
    Logout
    kindly assist

  3. Hello Tom,
    I’m trying to apply your nices instructions, but i have a problem as it dont’t work.
    i think it doesn’t work because :
    – I have the Alfresco 3.0 Labs revision 12844 to patch
    – I used subversion to get the source and download the revision 14028
    – I follow your instructions and at the end, copy the .jar in the WEB-INF/lib directory
    – I start the Alfresco server and have several errors that makes stop the server
    Do you think that it’s because the revisions are differents that it doesn’t work
    And if you think so, is there a way to get the rev. 12844 source anywhere ?
    Many thanks
    Fred.

  4. I am using alfresco web client portlet in liferay. Is there any way to get rid of the header in this case?

  5. Hi Tim,
    Presently i am using Alfresco Community Edition 3.3g on Windows XP.
    but by using SVN i am getting source code of 3.4c only but how can i get 3.3g source code and also getting an error when i build using your command ” ant -f HEAD\root\build.xml build “.the error is TOMCAT_HOME was not set.Please help me.
    Thanks,
    Raghu.

  6. Tom,
    Copy the alfresco-web-client.jar to your Alfresco webapp Copy the JAR file to your exploded WAR file directory location under the WEB-INF/lib directory. If you deploy Alfresco as WAR file rather than exploded WAR, you can use the full alfresco.war file that you also will find in the HEAD/root/projects/web-client/build/dist. directory. Sorry not a technical person here.Can u explain to me above steps in detail??
    Regards,
    Gabriel

  7. hello i can’t download the entire source code of alfresco because of the bandwidth. so i would like to know the consequence of stop using the r:page tag and how to do it? can you help me?

  8. Tom,
    Thanks for saving me some time. I found that I also had to compile ClientConfigElement.java in addition to PageTag.java and put them both in alfresco-web-client-3.2.jar to avoid an unresolved method exception (ClientConfigElement:getCheckContextAgainstPath).
    Cheers,
    Guy.

  9. why am i missing the build.xml file
    ant -f head\root\build.xml build
    Buildfile: head\root\build.xml does not exist!
    build failed
    Why is it missing a build file..am i doing something wrong?

Comments are closed.