Friday, November 30, 2012

... and letting Alfresco Share know about custom permissions

Again this is Spring magic, i didn't know how to get Spring to update an Array, so I replaced it, but then you must check Alfresco context-xml for each version to check if it changes - dependencies :(


 <!-- adds to script-services-context.xml -->
 <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" depends-on="jsonConversionComponent">
        <property name="targetObject" >
            <ref bean="jsonConversionComponent"/>
        </property>
        <property name="targetMethod" value="setUserPermissions" />
        <property name="arguments">
            <list>
                <array value-type="java.lang.String">
                    <!-- Standard ones -->
                    <value>CancelCheckOut</value>
                    <value>ChangePermissions</value>
                    <value>CreateChildren</value>
                    <value>Delete</value>
                    <value>Write</value>
                    <!-- customised ones -->
                    <value>Finalise</value>
                </array>
            </list>
        </property>
    </bean>


This will let Alfresco Share see the CRUD-permission 'Finalise' defined as 'Permission' in the Alfresco Repository Permission Model (extension). Then you can use this in your share-config-custom.xml where your actions now can be dependant on this permission

            <action id="...
 
                <permissions>
                    <permission allow="true">Finalise</permission>
                </permissions>

              ...
            </action>


About making custom share actions see here http://blogs.alfresco.com/wp/mikeh/2011/09/26/share-document-library-extensions-in-v4-0/ among others

Thursday, November 29, 2012

Adding custom permissions in Alfresco

If your extending the PermssionModel of Alfresco, you might get an Exception when using the new permission groups .. like:

...
Caused by: java.lang.NullPointerException
    at org.alfresco.repo.site.RoleComparatorImpl.compare(RoleComparatorImpl.java:39)
    at org.alfresco.repo.site.RoleComparatorImpl.compare(RoleComparatorImpl.java:24)
    at java.util.TreeMap.put(TreeMap.java:530)
    at java.util.TreeSet.add(TreeSet.java:238)
    at org.alfresco.repo.site.SiteServiceImpl.getMembersRole(SiteServiceImpl.java:1717)

...

This is caused by this RoleComparator not knowing the groups. This can be resolved by some spring magic:

 <!-- adds to script-services-context.xml -->
    <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" depends-on="siteRoleComparator">
        <property name="targetObject">
            <util:property-path path="siteRoleComparator.RolePrecedence" />
        </property>
        <property name="targetMethod" value="putAll" />
        <property name="arguments">
            <list>
                <map key-type="java.lang.String" value-type="java.lang.Integer">
                   <entry key="User" value="10" />
                </map>
            </list>
        </property>
    </bean>


This is an addition to the guides http://keytocontent.blogspot.dk/2011/04/alfresco-share-permissionsroles-part-ii.html and https://wiki.alfresco.com/wiki/Custom_Permissions_in_Share