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