You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@turbine.apache.org by Apache Wiki <wi...@apache.org> on 2016/08/23 13:20:22 UTC

[Turbine Wiki] Update of "Turbine4/Turbine4.0M1/Diff" by GeorgKallidis

Dear Wiki user,

You have subscribed to a wiki page or wiki category on "Turbine Wiki" for change notification.

The "Turbine4/Turbine4.0M1/Diff" page has been changed by GeorgKallidis:
https://wiki.apache.org/turbine/Turbine4/Turbine4.0M1/Diff?action=diff&rev1=9&rev2=10

Comment:
Add HowTo (Draft Mode) for Turbine 4: Data Model Discussion and Extra Column Handling from Dev Mailing List 

  
   * Turbine now supports several annotations to simplify using Turbine services, loaders and configurations in screens, actions, valves etc.
  
+ ----
+ == T U R B I N E 4.0  P R E   R E L E A S E  D R A F T  ==
+ ''' D R A F T'''
+ ----
+ === Discussions and Howtos ===
+ 
+ ==== Turbine 4 Entity User Data Model, Facts and Discussion, Fulcrum Security ====
+ 
+ Updated content from Turbine developer mailing list discussion (Fri, 08 Jul 2016 11:11:50 GMT).
+ 
+ '''Introduction'''
+ 
+ Security/Authentication is now separated and moved into Fulcrum Security. To get a better understanding...
+ 
+ ... I started with a user model as an example and sketching the situations 
+ with some (pseudo) code. User instantiation is the first place, where a 
+ new user model comes into place - may be a good starting point.
+ 
+ To get a new user instance in 
+ 
+  1. Turbine-4-M1 
+  1. Turbine-4-M2, Turbine-4-SNAPSHOT
+ 
+ consider this (pseudocode) examples in 
+  1. {{{ 
+   org.apache.turbine.services.security.TurbineSecurity.getUserInstance()  {
+     return getService().getUserInstance()
+   }
+  }}} where {{{service}}} could be e.g. {{{org.apache.turbine.services.security.BaseSecurityService}}} and  the {{{userInstance}}} looks like 
+  {{{ 
+  return (org.apache.turbine.om.security.User) getUserClass().newInstance(); 
+  }}}
+  
+  The {{{userClass / userInstance}}} is configured in Turbine configuration e.g. setting 
+  {{{  
+  services.SecurityService.user.class= org.apache.turbine.om.security.TurbineUser 
+  }}}
+  which is the default user class.
+  
+  The contract interface is {{{ org.apache.turbine.om.security.User}}}.
+  1. As configured by default 
+  {{{ 
+  services.SecurityService.user.manager = org.apache.turbine.services.security.DefaultUserManager 
+  }}}
+  the method {{{getUserInstance}}} has a wrapped user instance: {{{ 
+    TurbineUser u = umDelegate.getUserInstance(); (1)
+    return wrap(u); (2)
+   }}}
+   
+   (1) umDelegate object implements 
+     {{{org.apache.fulcrum.security.model.turbine.TurbineUserManager}}} (e.g. {{{org.apache.fulcrum.security.torque.turbine.TorqueTurbineUserManagerImpl}}}. Configuration is in Fulcrum ''roleConfiguration.xml''.
+     {{{<role name="org.apache.fulcrum.security.UserManager" default-class="<umDelegate>">}}}.
+   The userInstance  delegates further e.g. in 
+   {{{org.apache.fulcrum.security.spi.AbstractUserManager.getUserInstance()}}} and may look like this 
+   {{{ 
+   return T user = (T) Class.forName(getClassName()).newInstance(); 
+   }}}
+   
+   where the className is configured in Fulcrum XML configuration (''componentConfiguration.xml''.) 
+   
+   {{{ <userManager><className>}}}, which becomes the {{{userDelegate}}} in {{{DefaultUserImpl}}}
+   (2) Since Turbine 4.0 {{{wrap}}} code looks like
+   {{{  
+   return (U) getUserWrapper(user); 
+   }}}
+   
+   It just wraps the user object to keep the contract, by default
+   {{{org.apache.turbine.om.security.DefaultUserImpl}}} is an implementation of 
+   {{{org.apache.turbine.om.security.User}}} and wraps the {{{userDelegate}}}
+   {{{org.apache.fulcrum.security.model.turbine.entity.TurbineUser}}} as configured in Fulcrum ''componentConfiguration.xml''.
+   
+   The contract interface is {{{<T extends org.apache.turbine.om.security.User>}}}.
+ 
+ '''Interfaces'''
+ 
+ This is may be the most interesting part to understand, as the same User interface has been broken up and the semantics changed a little bit.
+ 
+  1. - ({{{ org.apache.turbine.om.security.TurbineUser}}} is a class).
+  
+  {{{org.apache.turbine.om.security.User}}} (properties: {{{password,  email, firstName, lastName, confirmed, createDate, loggedin, accessCounter, perm, temp, updateLastLogin, tempStorage,permStorage}}})
+       -> {{{org.apache.turbine.om.security.SecurityEntity}}} (properties: {{{name, id, idAsObject}}})
+         -> ..
+  2. {{{org.apache.turbine.om.security.User}}} (properties: {{{confirmed, createDate, loggedin, accessCounter, perm, temp, updateLastLogin, tempStorage,permStorage}}})
+     -> {{{org.apache.fulcrum.security.model.turbine.entity.TurbineUser}}} (-)
+         -> {{{org.apache.fulcrum.security.entity.ExtendedUser}}} (properties: {{{email, firstName, lastName, objectData}}}).. 
+             -> {{{org.apache.fulcrum.security.entity.User}}} (property: {{{password}}})
+               -> {{{org.apache.fulcrum.security.entity.SecurityEntity}}} (properties: {{{name,id}}})
+         -> {{{org.apache.fulcrum.security.model.turbine.entity.TurbineUserGroupRoleEntity}}} (properties: {{{userGroupRoleSet, add-/removeUserGroupRoleSet}}})
+     ->  ..
+ 
+ As a result there is now NO {{{TurbineUser}}} ''class'' any more (except occasionally a ORM generated class), but instead a new ''interface'' (in  a different package) with some additional methods (cft. {{{TurbineUserGroupRoleEntity}}}) is present. 
+ This makes sense as the {{{TurbineUser}}} is now a special case in Fulcrum Security.
+ 
+ '''Default classes'''
+  1. {{{org.apache.turbine.om.security.TurbineUser implements org.apache.turbine.om.security.User }}}
+  1. {{{org.apache.turbine.om.security.DefaultUserImpl implements org.apache.turbine.om.security.User }}}
+ 
+ '''More Delegates'''
+ 
+  1. -
+  1. {{{org.apache.fulcrum.security.model.turbine.entity.impl.TurbineUserImpl}}} (properties: {{{email, firstName, lastName, password, objectData}}})
+  
+  Interfaces 
+  -> {{{org.apache.fulcrum.security.model.turbine.entity.TurbineUser}}} 
+   Extended classes
+        -> org.apache.fulcrum.security.model.turbine.entity.impl.AbstractTurbineSecurityEntityImpl 
+           -> {{{org.apache.fulcrum.security.entity.impl.SecurityEntityImpl}}} (properties: {{{equals, hashCode, toString}}})
+           Interfaces
+              -> {{{org.apache.fulcrum.security.entity.SecurityEntity}}} (properties: {{{id, name}}})
+ 
+ '''Caveats'''
+ 
+ ''Moved properties''
+  * {{{Email, FirstName, LastName, Password}}}
+  
+ The getter/setter for {{{email, firstName, lastName, password}}} moved from 
+ {{{org.apache.turbine.om.security.User}}} to the new interface {{{org.apache.fulcrum.security.model.turbine.entity.TurbineUser}}}. 
+ 
+ {{{Password}}} is now in an ''interface'' {{{org.apache.fulcrum.security.entity.User}}} of its own, the other setter/getter methods are in 
+ {{{org.apache.fulcrum.security.entity.ExtendedUser}}}.
+  
+  * {{{Name}}} and {{{Id}}}
+   1. {{{org.apache.turbine.om.security.SecurityEntity}}}
+   1. {{{org.apache.fulcrum.security.entity.SecurityEntity}}}
+  
+  The {{{id}}} getter/setter methods expect now an ''Object'', while in Turbine M1 version an ''int primitive type'' was expected. The old version had a special accessor {{{idAsObject}}}, which is now removed.
+  
+ The new model properties {{{entityId}}} and {{{entityName}}} correspond probably to {{{id}}} and {{{name}}} in some way..
+ 
+ '''Old and New'''
+ 
+  Turbine Interface: {{{org.apache.turbine.om.security.User}}}.
+  
+  Old implementation class: {{{org.apache.turbine.om.security.TurbineUser}}}.
+  
+  New implementation class: {{{org.apache.turbine.om.security.DefaultUserImpl}}}.
+  
+  New extracted Fulcrum interface: {{{org.apache.fulcrum.security.model.turbine.entity.TurbineUser}}}.
+  
+  New (example) implementation class: {{{org.apache.fulcrum.security.model.turbine.entity.impl.TurbineUserImpl}}}. 
+ 
+  Another implementation class is {{{org.apache.fulcrum.security.torque.turbine.TorqueAbstractTurbineUser}}}, 
+  which provides some extra methods ({{{delete, databaseName, entityId, entityName, update, retrieveAttachedObjects}}}, cft. 
+  {{{org.apache.fulcrum.security.torque.TorqueAbstractSecurityEntity}}}).
+  
+ {{{ExtendedUser}}}
+  {{{org.apache.fulcrum.security.entity.ExtendedUser}}} contains {{{org.apache.fulcrum.security.entity.User}}} ({{{password}}} only getter/setter property).
+  
+ '''Torque '''
+ 
+ Building Torque ORM with 
+ {{{
+ <table name="turbine_user" idMethod="native" baseClass="<baseClass>" interface="org.apache.fulcrum.security.model.turbine.entity.TurbineUser">
+ }}}
+ could be done using as base class, but it´s NOT required. Example options for {{{baseClass}}} e.g.: 
+  * {{{org.apache.fulcrum.security.model.turbine.entity.impl.TurbineUserImpl}}}
+  * {{{org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity}}}
+  * {{{org.apache.fulcrum.security.torque.turbine.TorqueAbstractTurbineUser}}}
+ 
+ In this example the generated class in this case is just named TurbineUser by default.
+ 
+ {{{SecurityService, UserManager}}}
+ 
+ Both could be found in Turbine and Fulcrum. As said in 
+ [http://turbine.apache.org/turbine/turbine-4.0-M2/services/security-service.html] Fulcrum Managers are just delegates and should/could only be used from Turbine services in Turbine context. 
+ 
+ '''More Examples'''
+ 
+ {{{org.apache.turbine.services.security.SecurityService}}} ({{{userInstance, getUser..}}})
+ 
+ {{{org.apache.turbine.services.security.UserManager}}} ({{{userInstance, authenticate}}}
+ 
+ {{{org.apache.fulcrum.security.SecurityService}}} ({{{userManager, ..}}})
+ 
+ {{{org.apache.fulcrum.security.UserManager}}} ({{{userInstance, authenticate}}}
+ ----
+ 
+ ==== How to handle extra columns in Turbine user table with Fulcrum Security ====
+ 
+ '''Introduction'''
+ 
+ If you have to map colums other than {{{firstName, lastName, email, password}}} to a table you have to implement your own wrapper and set in ''TR.properties''. {{{PermStorage}}} is by default considered in Fulcrum just "as is", i.e. it is saved only in {{{objectData}}}.
+ 
+ '''Configuration'''
+ 
+ ''Fulcrum user'':
+ Turbine userDelegate:  Fulcrum {{{<userManager><className>}}} ''componentConfiguration.xml''
+ 
+ ''Turbine wrapper'' optional if you have additional columns:
+  
+ Turbine wrapper:  
+ {{{
+ services.SecurityService.wrapper.class= 
+ 
+ }}} in ''TR.properties''.
+ 
+ '''Background'''
+ 
+ Fulcrum security package just saves the {{{permStorage}}} in {{{objectData}}} by default.
+ 
+ '''(Pseudo) Code example'''
+ 
+ Turbine {{{
+ DefaultUserManager store(User user) 
+  user.setObjectdata(ObjectUtils.serializeMap(user.getPermStorage()));
+  umDelegate.saveUser(((TurbineUserDelegate)user).getUserDelegate());
+ }}}
+ 
+ calls Fulcrum e.g. {{{TorqueAbstractUserManager}}}
+ {{{ 
+  saveUser(User user) 
+ }}}
+ 
+ {{{ 
+  TorqueAbstractSecurityEntity u = (TorqueAbstractSecurityEntity)user;
+  u.setNew(false);
+  u.save();
+  }}}
+ 
+ {{{u}}} is the Fulcrum user class, which the user can set (the {{{userDelegate}}}). 
+ 
+ If this user has additional properties they are not set, as {{{permStorage}}} is saved only in {{{objectData}}} by default. 
+ 

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@turbine.apache.org
For additional commands, e-mail: dev-help@turbine.apache.org