1
votes

How can I make a custom user profile ? I want to add a new field to the users in Alfresco... I try to use this : http://ecmarchitect.com/archives/2012/02/27/1555, the code : http://ecmarchitect.com/images/articles/alfresco-people/someco-people.zip...

Important code:

SignUserFactory.java

package com.someco.share;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Map;

import org.alfresco.web.site.SlingshotUserFactory;
import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.extensions.surf.FrameworkUtil;
import org.springframework.extensions.surf.RequestContext;
import org.springframework.extensions.surf.exception.ConnectorServiceException;
import org.springframework.extensions.surf.exception.UserFactoryException;
import org.springframework.extensions.surf.site.AlfrescoUser;
import org.springframework.extensions.surf.support.ThreadLocalRequestContext;
import org.springframework.extensions.surf.util.StringBuilderWriter;
import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.connector.Connector;
import org.springframework.extensions.webscripts.connector.ConnectorContext;
import org.springframework.extensions.webscripts.connector.HttpMethod;
import org.springframework.extensions.webscripts.connector.Response;
import org.springframework.extensions.webscripts.json.JSONWriter;

public class SomeCoUserFactory extends SlingshotUserFactory {

    public static final String SCP_BIRTH_DATE = "{http://www.someco.com/model/people/1.0}birthDate";
    public static String SCP_SHIRT_SIZE = "{http://www.someco.com/model/people/1.0}shirtSize"; 
    public static String SCP_SIGNIFICANT_OTHER = "{http://www.someco.com/model/people/1.0}significantOther";
    public static String SCP_LIKES_NEIL_DIAMOND = "{http://www.someco.com/model/people/1.0}likesNeilDiamond";
    public static String PROP_SCP_BIRTH_DATE = "birthDate";
    public static String PROP_SCP_SHIRT_SIZE = "shirtSize";
    public static String PROP_SCP_SIGNIFICANT_OTHER = "significantOther";
    public static String PROP_SCP_LIKES_NEIL_DIAMOND = "likesNeilDiamond";


    @Override
    protected AlfrescoUser constructUser(JSONObject properties, Map<String, Boolean> capabilities,
            Map<String, Boolean> immutability) throws JSONException {
        AlfrescoUser user = super.constructUser(properties, capabilities, immutability);
        user.setProperty(PROP_SCP_BIRTH_DATE, properties.has(SCP_BIRTH_DATE) ? properties.getString(SCP_BIRTH_DATE) : null);
        user.setProperty(PROP_SCP_SHIRT_SIZE, properties.has(SCP_SHIRT_SIZE) ? properties.getString(SCP_SHIRT_SIZE) : null);
        user.setProperty(PROP_SCP_SIGNIFICANT_OTHER, properties.has(SCP_SIGNIFICANT_OTHER) ? properties.getString(SCP_SIGNIFICANT_OTHER) : null);
        user.setProperty(PROP_SCP_LIKES_NEIL_DIAMOND, properties.has(SCP_LIKES_NEIL_DIAMOND) ? properties.getString(SCP_LIKES_NEIL_DIAMOND) : null);
        return user;
    }

    @Override
    public void saveUser(AlfrescoUser user) throws UserFactoryException {
        RequestContext context = (RequestContext)ThreadLocalRequestContext.getRequestContext();
        if (!context.getUserId().equals(user.getId())) {
            throw new UserFactoryException("Unable to persist user with different Id that current Id.");
        }

        StringBuilderWriter buf = new StringBuilderWriter(512);
        JSONWriter writer = new JSONWriter(buf);

        try {
            writer.startObject();

            writer.writeValue("username", user.getId());

            writer.startValue("properties");
            writer.startObject();
            writer.writeValue(CM_FIRSTNAME, user.getFirstName());
            writer.writeValue(CM_LASTNAME, user.getLastName());
            writer.writeValue(CM_JOBTITLE, user.getJobTitle());
            writer.writeValue(CM_ORGANIZATION, user.getOrganization());
            writer.writeValue(CM_LOCATION, user.getLocation());
            writer.writeValue(CM_EMAIL, user.getEmail());
            writer.writeValue(CM_TELEPHONE, user.getTelephone());
            writer.writeValue(CM_MOBILE, user.getMobilePhone());
            writer.writeValue(CM_SKYPE, user.getSkype());
            writer.writeValue(CM_INSTANTMSG, user.getInstantMsg());
            writer.writeValue(CM_GOOGLEUSERNAME, user.getGoogleUsername());
            writer.writeValue(CM_COMPANYADDRESS1, user.getCompanyAddress1());
            writer.writeValue(CM_COMPANYADDRESS2, user.getCompanyAddress2());
            writer.writeValue(CM_COMPANYADDRESS3, user.getCompanyAddress3());
            writer.writeValue(CM_COMPANYPOSTCODE, user.getCompanyPostcode());
            writer.writeValue(CM_COMPANYFAX, user.getCompanyFax());
            writer.writeValue(CM_COMPANYEMAIL, user.getCompanyEmail());
            writer.writeValue(CM_COMPANYTELEPHONE, user.getCompanyTelephone());

            // START SomeCo Specific properties
            writer.writeValue(SCP_BIRTH_DATE, user.getStringProperty(PROP_SCP_BIRTH_DATE));
            writer.writeValue(SCP_SHIRT_SIZE, user.getStringProperty(PROP_SCP_SHIRT_SIZE));
            writer.writeValue(SCP_SIGNIFICANT_OTHER, user.getStringProperty(PROP_SCP_SIGNIFICANT_OTHER));
            writer.writeValue(SCP_LIKES_NEIL_DIAMOND, user.getStringProperty(PROP_SCP_LIKES_NEIL_DIAMOND));
            // END SomeCo Specific properties

            writer.endObject();
        writer.endValue();

        writer.startValue("content");
        writer.startObject();
        writer.writeValue(CM_PERSONDESCRIPTION, user.getBiography());
        writer.endObject();
        writer.endValue();

        writer.endObject();

        Connector conn = FrameworkUtil.getConnector(context, ALFRESCO_ENDPOINT_ID);
        ConnectorContext c = new ConnectorContext(HttpMethod.POST);
        c.setContentType("application/json");
        Response res = conn.call("/slingshot/profile/userprofile", c,
                new ByteArrayInputStream(buf.toString().getBytes()));
        if (Status.STATUS_OK != res.getStatus().getCode()) {
            throw new UserFactoryException("Remote error during User save: " + res.getStatus().getMessage());
        }
    } catch (IOException ioErr) {
        throw new UserFactoryException("IO error during User save: " + ioErr.getMessage(), ioErr);
    } catch (ConnectorServiceException cse) {
        throw new UserFactoryException("Configuration error during User save: " + cse.getMessage(), cse);
    }
    }
}

share-config-custom.xml

<config evaluator="string-compare" condition="WebFramework" replace="true">
    <web-framework>
        <defaults>
            <user-factory>webframework.factory.user.someco</user-factory>
        </defaults>
    </web-framework>
</config>

custom-slingshot-application-context.xml

      <bean id="webscripts.resources" class="org.springframework.extensions.surf.util.ResourceBundleBootstrapComponent">
      <property name="resourceBundles">
         <list>
            <value>webscripts.messages.webscripts</value>
            <value>alfresco.messages.common</value>
            <value>alfresco.messages.slingshot</value>
            <value>alfresco.web-extension.messages.somecoPeople</value>
         </list>
      </property>
   </bean>

   <bean id="webframework.factory.user.someco" class="com.someco.share.SomeCoUserFactory" parent="webframework.factory.base" />

It gives me this error, when I try to make login in Alfresco:

SEVERE: Servlet.service() for servlet [Spring Surf Dispatcher Servlet] in context with path [/share] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause java.lang.NullPointerException at org.springframework.extensions.surf.ObjectPersistenceService.getObject(ObjectPersistenceService.java:128) at org.springframework.extensions.surf.ModelObjectService.getObject(ModelObjectService.java:552) at org.springframework.extensions.surf.ModelObjectService.getConfiguration(ModelObjectService.java:157) at org.springframework.extensions.surf.site.SiteUtil.getSiteConfiguration(SiteUtil.java:104) at org.springframework.extensions.surf.site.SiteUtil.getRootPage(SiteUtil.java:53) at org.springframework.extensions.surf.support.AbstractRequestContext.getRootPage(AbstractRequestContext.java:320) at org.springframework.extensions.surf.mvc.PageViewResolver.canHandle(PageViewResolver.java:109) at org.springframework.web.servlet.view.UrlBasedViewResolver.createView(UrlBasedViewResolver.java:386) at org.springframework.extensions.webscripts.servlet.mvc.AbstractWebScriptViewResolver.resolveViewName(AbstractWebScriptViewResolver.java:64) at org.springframework.web.servlet.DispatcherServlet.resolveViewName(DispatcherServlet.java:1240) at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1181) at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:986) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:933) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:851) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:844) at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829) at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176) at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:389) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.alfresco.web.site.servlet.SecurityHeadersFilter.doFilter(SecurityHeadersFilter.java:168) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.alfresco.web.site.servlet.CSRFFilter.doFilter(CSRFFilter.java:322) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.alfresco.web.site.servlet.SSOAuthenticationFilter.doFilter(SSOAuthenticationFilter.java:447) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.alfresco.web.site.servlet.MTAuthenticationFilter.doFilter(MTAuthenticationFilter.java:74) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2466) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2455) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745)

2016-03-09 18:47:06,039 ERROR [alfresco.web.site] [http-apr-8080-exec-2] org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException java.lang.NullPointerException at org.springframework.extensions.surf.ObjectPersistenceService.getObject(ObjectPersistenceService.java:128) at org.springframework.extensions.surf.ModelObjectService.getObject(ModelObjectService.java:552) at org.springframework.extensions.surf.ModelObjectService.getConfiguration(ModelObjectService.java:157) at org.springframework.extensions.surf.site.SiteUtil.getSiteConfiguration(SiteUtil.java:104) at org.springframework.extensions.surf.site.SiteUtil.getRootPage(SiteUtil.java:53) at org.springframework.extensions.surf.support.AbstractRequestContext.getRootPage(AbstractRequestContext.java:320) at org.springframework.extensions.surf.mvc.PageViewResolver.canHandle(PageViewResolver.java:109) at org.springframework.web.servlet.view.UrlBasedViewResolver.createView(UrlBasedViewResolver.java:386) at org.springframework.extensions.webscripts.servlet.mvc.AbstractWebScriptViewResolver.resolveViewName(AbstractWebScriptViewResolver.java:64) at org.springframework.web.servlet.DispatcherServlet.resolveViewName(DispatcherServlet.java:1240) at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1181) at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:986) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:933) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:851) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:844) at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829) at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176) at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:389) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.alfresco.web.site.servlet.SecurityHeadersFilter.doFilter(SecurityHeadersFilter.java:168) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.alfresco.web.site.servlet.CSRFFilter.doFilter(CSRFFilter.java:322) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.alfresco.web.site.servlet.SSOAuthenticationFilter.doFilter(SSOAuthenticationFilter.java:447) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.alfresco.web.site.servlet.MTAuthenticationFilter.doFilter(MTAuthenticationFilter.java:74) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2466) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2455) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745)

Anyone can help me with this? Maybe when I add this to my all-in-one extension, the folders are incorrect. I need help with this!

I'm using Alfresco Community 5

2
Duplicate stackoverflow.com/questions/218384/…user177800
It is a duplicate, every NPE is caused by the exact same thing, a reference is null.user177800

2 Answers

4
votes

The tutorial from Jeff Potts which you are using as reference is for Alfresco 3.4.d and it wouldn't work directly on Alfresco 5.

The error thrown seems due to the reason that you missed deploying the content model i.e. scPeopleModel.xml as referenced in the tutorial.

I have converted the above tutorial to Alfresco 5.1 using Alfresco SDK 2.2 and this project resides here

You may download the code in zip format here

The major change in this project is the omission of file userprofile.get.head.ftl due to the reason that .head.ftl WebScript files has now been deprecated from WebScripts that render Share Components. Dependencies are now loaded through the use of the @script and @link tags in the main .html.ftl file.

So for the above reason you may find the below code section in userprofile.get.html.ftl

<@markup id="css" >
   <#-- CSS Dependencies -->
   <@link href="${url.context}/res/components/profile/profile.css" group="profile"/>
</@>

<@markup id="js">
   <#-- JavaScript Dependencies -->
   <@script src="${url.context}/res/components/profile/profile.js" group="profile"/>
   <@script src="${url.context}/res/modules/simple-dialog.js" group="profile"/>
   <@script src="${url.context}/res/components/profile/sc-profile.js" group="profile"/>
</@>
1
votes

This is a simple NullPointerException, as per the very explicit error message, gives you the class and the exact line:

root cause java.lang.NullPointerException at org.springframework.extensions.surf.ObjectPersistenceService.getObject(ObjectPersistenceService.java:128)

Nothing in the massive code/configuration dump you posted is going to help anyone here diagnose what is wrong, especially since there does not seem to be a single line of code that is yours.

After you look at the source of ObjectPersistenceService.java:128, you need to just step debug through the calls and you need to figure out how to make whatever it is complaining about being null not be.

Every NPE is solved the exact same way, make the reference not null.