Skip navigation
All Places > Alfresco Content Services (ECM) > Blog > 2012 > February
2012
In my last blog, Getting to Grips with Alfresco Certification, I reviewed the background to our certification program and the learning resources available to you. In this post, I'm going to take a look at some real questions from the certification exams to give you an idea of the range of questions which face you.



I have chosen questions which demonstrate this range and rather than simply giving you the question and answers I’ve also delved a little bit more behind each question, to explain the correct answers and the distractors, or incorrect answers.



In order to set the pass marks we have used a modified Angoff method which uses subject matter experts to determine the difficulty of each question.  It defines the cutoff score as the lowest score a minimally competent candidate (MCC) is likely to achieve.



Essentially, it works this way:





  1. A panel of experts independently rate the difficulty of each question. This rating is based on what percentage of MCCs they estimate will answer correctly.


  2. As an example, a question that is rated as 60% means that the panel believes that only 60% of the MCCs would answer correctly.  This would be a much harder question, than one that is rated as 80%.


  3. The panel then reviews each test question as a group and comes to a consensus for the rating of each question.


  4. The final pass mark is determined as the average of the ratings for each question in that exam.  By way of an example: an exam that consists of 50 questions with average ratings of 65%, would require at least a score of 65% to be passed.  An easier exam, with a rating of 80% (say), would require a score of at least 80%.




I have described this process because I also want to give you an idea of how these ratings work so that you can gauge how difficult our subject matter experts have determined it to be.



Let's jump right in. Our first question relates to Share and is from the ACE exam.

In order to configure Alfresco Share, best practice dictates that you edit which file?





  1. share-config.xml


  2. share-config-custom.xml.sample


  3. share-config-custom.xml


  4. web-client-config-custom.xml


The correct answer is 3. This is a relatively easy question and shows that there are some knowledge based questions which require you to memorize file names, locations or other items. These are used only in situations where the piece of information is so key that we would expect a competent Alfresco developer to know this without looking it up. Configuring Alfresco Share is covered on the Share Configuration course. Let’s walk through each of the answers in turn...



  1. share-config.xml: This is the systems configuration file for Share, you can edit this and make configuration changes in this file and the changes will work. However if you perform an upgrade at a later stage your changes will be over-written, so best practice dictates that you should not modify this file. Hence this answer is wrong.


  2. share-config-custom.xml.sample: This is the sample file that is supplied with Alfresco and which you would copy to share-config-custom.xml before making your changes. Simply editing this file will have no effect because the system will ignore files with the extension .sample.


  3. share-config-custom.xml: The correct answer! Your changes should be made in this file which can be created by copying the share-config-custom.xml.sample provided.


  4. web-client-config-custom.xml: This file is the file that you should use to make configuration changes to the Alfresco Explorer client, not to Share.


You can see from the answer choices that some options are distractors (or wrong answers), in many cases making them look viable in other circumstances, so it pays to read the questions carefully. This question has a rating of 90%, and so means that we would expect 90% of MCCs to get the answer correct.



Let’s look at another question - again from the ACE exam.

Fill in the blank on the architecture picture.







  1. alf_data


  2. content services


  3. database


  4. file system


  5. repository


  6. Solr


This is a simple question relating to the architecture and is covered in the introductory classes. The right answer of course is #3 – database. Let’s look at the distractors in more detail:



  1. alf_data: This is typically the location where Alfresco will store the content files on the file system.


  2. content services: this is the range of services provided by the server for managing content for instance versioning.


  3. database: the correct answer, Alfresco stores metadata in a relational database.


  4. file system: Alfresco store the metadata in the database (some is also stored in the full-text index, but that is already shown in the diagram)


  5. repository: this is the name given to the collection of database, file system and indexes as a complete and consistent unit.


  6. Solr: This is a simple distractor. Solr is an enterprise indexing server which Alfresco introduces with 4.0.


Now we look at a question from the ACE exam which requires you to have an understanding of Alfresco development best practices. This subject is covered in all the training courses which deal with development. This question has a rating of 88%, hence it is considered slightly more difficult than the first question.

A repository web script is defined in the directory

<TOMCAT_HOME>/webapps/alfresco/WEB-INF/alfresco/templates/webscripts/org/alfresco/test

inside the Alfresco installation. Which of the following procedures should you use to change the default output template, while adhering to best practice?





  1. Copy the output template file into <TOMCAT_HOME>/webapps/alfresco/WEB-INF/alfresco/extension/templates/webscripts/org/alfresco/test, make your changes there, then update the web script descriptor to reference the new file.


  2. Copy the output template file into <TOMCAT_HOME>/shared/classes/alfresco/extension/templates/webscripts/org/alfresco/test and make your changes there.


  3. Copy the output template file into <TOMCAT_HOME>/webapps/alfresco/WEB-INF/alfresco/extension/templates/webscripts/org/alfresco/test and make your changes there.


  4. Create a copy of the output template file in the same directory, then update the web script descriptor to reference the new file.


In this case, #2 is the correct answer. This question is rated at 75% and so is more difficult than the preceding two examples. Let's review the answer choices:







  1. This copies the file to a different directory but it is still in the Alfresco webapp, which is not best practice.


  2. This is the correct answer! The file should be copied to this directory, often referred to as {extensionRoot}, and edited there to ensure that upgrades do not over-write your changes. In fact, this is the only one of these answers which copies the file outside of the webapp and so is the only answer which is correct according to best practices.


  3. This options behaves in the same way as #1 and is also incorrect.


  4. This also keeps the file in the webapp and is therefore incorrect.


This is our final sample question from the ACE exam, and demonstrates the application of knowledge gained through development or by researching the subject.





A RESTful API is called via a POST request to the URL /example/mycontent/item1, relative to the RESTful API base URL. Based on your knowledge of Alfresco's RESTful API and the REST architecture, what will be the logical result of this?





  1. A new resource 'item1' is added.


  2. The content of the resource 'item1' is returned to the user.


  3. The existing resource 'item1' is deleted.


  4. The existing resource 'item1' is updated.


The correct answer is #1. Resource representations have been modeled on Atom & Atom Publishing Protocol. Resources support methods with the primary ones being GET, PUT, POST & DELETE. You will have realised through development and use of technologies such as web scripts, that Alfresco uses GET for information retrieval from the repository, PUT for updates, POST for adding or creating new items and DELETE to destroy or remove items. Therefore in this case using a POST, the correct answer is that item1 will be added. This is the most difficult question we have looked at and is rated at 65%.



I hope that this blog has given you some idea of the types of questions you will face in the Alfresco certification exams and has given you confidence to undertake the tests for yourself.



Good luck and hope to see you in class.



Carlos Miguens

Global Training Director
When you come to Alfresco for the first time you quickly realize that the Alfresco product suite is sophisticated and powerful. Implementing projects with Alfresco, whether document management, web content management or records management is a job for professionals. In the early days, every new person coming to Alfresco was an innovator and expert, helping the product grow and establishing a reputation both for themselves and the product.



Over the years at Alfresco training, we have taught over 2,500 people, yet more people have trained themselves by reading the documentation, using the product and exploring the vast amount of material available in books, blogs and wikis.



As the pool of Alfresco expertise grows, it becomes more difficult for the experts to differentiate their competency from those developers and administrators, who may have a good industry track record but who are new to the Alfresco platform. Because of this, in 2010 we began looking at developing an accreditation program that would allow individuals to prove their competency on the Alfresco platform through a series of tests. Our objective was clear, we wanted to allow bona fide experts in Alfresco to showcase their competency to their peers and their employers, whilst paving the way for a professional accreditation in the product.



These objectives meant that we did not simply want to create a certification exam that would merely test how well someone listened in a training class. We wanted the tests to be more wide-ranging and really gauge comprehension, application and competency. We started out with a self-test which we called the Alfresco Recognized Developer exam, to trial various scenarios, gather data about profiles and scoring, and gain feedback. In October 2011, in conjunction with our partner PearsonVue, we launched our certification program, with two exams: the Alfresco Certified Engineer and the Alfresco Certified Administrator.



Since launching the exams, a number of questions about the tests have repeatedly come up and so I wanted to take the opportunity in my blog to answer these questions and explain a little bit more about the exams.

Certification and training






Certification and training are linked, but distinct, in that there is no requirement to complete any formal training, and training is not a pre-requisite to taking an exam. However, you should ensure that your knowledge corresponds to what you would learn if you attended formal training. Having said that, there is no direct one-to-one correlation between training and certification. A common question we hear is “do you have a course I can take which will allow me to pass certification straight away?” The simple answer is no, because we are testing competency, we are looking for people to have mastered the product over time, gaining practical knowledge along the way.



You will also find that the scope of certification is both broader and deeper than the training we offer for exactly the same reasons.



A learning program



Another common question is 'what revision should I do before I attempt certification?' Everyone is different and the learning path that you embark on will depend on your background, job role, time and goals. One thing you can be sure of is that to pass the exams you will need to use Alfresco and develop the hands-on, real-world skills which will be required on an Alfresco project.



Given that there might be different approaches, one potential training pathway to passing the ACE certification might be the following:



Complete some basic training, I've suggested some courses and provided links to the course descriptions so you can see which topics are covered:


For partners we provide a fast track for the majority of these through our Partner Technical Bootcamp program.



In addition to these you will also want to make sure that you have the background knowledge required to understand and use Alfresco technology, for example developing applications in Java plus a working knowledge of XML and Spring. There are a myriad of courses you can take in these subjects to bring your experience level up and you should consider these before taking Alfresco training if you feel that you are not fully conversant in these topics. If you simply want to review, revise and refresh then there are online tutorials in Java, Spring and indeed XML.



You will also want to ensure that you read-around the more advanced areas. Looking at the ACE blueprint you should explore the more advanced topics like Share Customization and Repository Customization. For these you will want to actually complete a development project. Download the SDK and FDK to explore the examples provided, then make sure that you have looked at the Alfresco Add-Ons and Share Extras site and developed your own dashlet.



More Resources



Alfresco documentation is useful, up-to-date and extensive and you can find it at docs.alfresco.com. At docs.alfresco.com it is easy to download printer friendly PDFs which you can then read on your iPad or Kindle. If you find the documentation too formal and would prefer complete real-world examples, you may want to invest in some of the great books which have been written about Alfresco, or have a read of the blogs and wikis on our Community site, which show practical examples of implementing Alfresco. A good place to start is Jeff Pott’s blog. Jeff is our Chief Community Officer and has been using Alfresco for many years.



In my next blog I'll share a longer list of resources and take a look at some sample questions.



Hope to see you in class.



Carlos Miguens

Global Training Director



So you need to make the options available on your Alfresco Share select form html fields depending on each other? But unfortunately your content model in Alfresco does not allow you to group constraint value options and say 'show these values for this field if user selected the value X for that other field, and change it (without reload) when he selects the value Y”… There's no way right now of configuring that through out of the box Alfresco constraints.  This post shows a simple way of achieving this in a generic way with some customization (just a pair of form controls freemarker templates) allowing for any changes on the dependency configuration for your properties to be immediately recognized by Alfresco Share.



First of all you can check the source code at the Google Code Project (the code on head has been tested for Alfresco Enterprise 4.0.0): http://code.google.com/p/share-form-control-dependency/



This customization allows you to control that only some sets of values are used for a set of dependent properties at the UI (Share) level. This won't be constrained at the repository level even if the dependency control configuration is 'specified' at the content model level (it's really based on a convention that only our Share form controls know about).



In pictures, if you select value A for the main property the conditioned property One should automatically just present the corresponding allowed values. The same for any other conditioned property Two.







The basic idea is to have specific form controls for Alfresco Share aware of the convention used to configure in our content model those dependencies and also have those generic form controls empowered (through client javascript) to update the corresponding form controls according to the updates made by the user on the other associated properties.



So if we define our constraints like (check sample model on our google code project):

<constraints> 


<constraint name='sample:parentConstraint' type='LIST'> 


<parameter name='allowedValues'> 


<list> 


<value></value> <value>1 - VALUE A</value> 


<value>2 - VALUE B</value> 


<value>3 - VALUE C</value>


 </list> 


</parameter> 


</constraint> 


<constraint name='sample:constraintOne' type='LIST'> 


<parameter name='allowedValues'> 


<list> 


<value></value> 


<value>1 - SUBVALUE ONE AX</value> 


<value>1 - SUBVALUE ONE AY</value> 


<value>1 - SUBVALUE ONE AZ</value> 


<value>2 - SUBVALUE ONE BX</value> 


<value>2 - SUBVALUE ONE BY</value> 


<value>3 - SUBVALUE ONE CY</value> 


<value>3 - SUBVALUE ONE CZ</value> 


</list> 


</parameter> 


</constraint> 


<constraint name='sample:constraintTwo' type='LIST'> 


<parameter name='allowedValues'> 


<list> 


<value></value> 


<value>1.2.3 - SUBVALUE TWO ABCX</value> 


<value>2.3 - SUBVALUE TWO BCX</value> 


<value>2.3 - SUBVALUE TWO BCY</value> 


<value>2.3 - SUBVALUE TWO BCZ</value> 


<value>3 - SUBVALUE TWO CX</value> 


<value>3 - SUBVALUE TWO CY</value> 


<value>3 - SUBVALUE TWO CZ</value> 


</list> 


</parameter> 


</constraint> 


</constraints>


What we are trying to say (through convention: our repository really doesn't know about this...) is that some possible values for properties one and two (to which will apply the constraintOne and constraintTwo) just should show if the corresponding group value (the number which starts the value) was selected for the main property. If the value selected for the main property changes we will also want to change the shown values for the other properties one and two.



For cases  like 1.2.3 - SUBVALUE TWO ABCX in the constraintTwo, we will want the value to be available for property two for whatever value (1, 2 or 3) is selected  for the main property. We also don't want the values to be presented with the preceding main property association 1 -, 2 -, etc. And finally we want all updates to happen dynamically as user fulfills the form.



Well that's exactly what our custom form control components do. They are generic and can be used for any equivalent case. Just build the jar, incorporate in your project and finally configure your form for Alfresco Share:

<form> 


<field-visibility> 


<show id='sample:mainProperty' /> 


<show id='sample:propertyOne' /> 


<show id='sample:propertyTwo' /> 


<show id='sample:propertyThree' /> 


</field-visibility> 


<appearance> 


<set id='sample-2col' template='/org/alfresco/components/form/2-column-set.ftl'/> 


<field id='sample:mainProperty' set='sample-2col'> 


<control template='/org/alfresco/components/form/controls/parent-filter-selectone.ftl'> 


<control-param name='filteredProperty'>sample_propertyOne,sample_propertyTwo</control-param> 


</control> 


</field> 


<field id='sample:propertyOne' set='sample-2col'> 


<control template='/org/alfresco/components/form/controls/filtered-selectone.ftl'/> 


</field> 


<field id='sample:propertyTwo' set='sample-2col'> 


<control template='/org/alfresco/components/form/controls/filtered-selectone.ftl'/> 


</field> 


</appearance> 


</form>


As you see we are using the same custom form control filtered-selectone.ftl for both conditioned properties, and another parent-filter-selectone.ftl for the main one (if you import this into your project these two freemarker files are the only ones you should care about, everything else on the google project is for the sake of demonstration). This last one must also receive the list of conditioned properties (separated by comma) as a control-param. As the dependency is defined this way at the form control configuration level this allows for us to have many separated groups of associated properties in the same form.



And with that in place the magic will happen.







Pay attention as besides the dynamic filtering of values we also have the initial numbers who define our dependency convention ripped from the values shown in the form.



The good stuff is that this is fully generic and can be used for any form, type or aspect, including search forms, data-lists types, and so on.



Finally the last advantage is that it allows you to manage the associated dynamic behavior of your properties just by configuring your content model constraints, that can be located in a dynamic model for example and so allow for hot update without server restart.

Filter Blog

By date: By tag: