Application Start Up Hook for Creating Layout, addingPortlet on Layout , Creating SitePages, Site, CustomField, Roles, Layout on Application StartUp
Step 1-: Create a Hook and it would be an Event Bundle HOOK (application.startup.events )
In portal.properties add this line
application.startup.events=com.test.event.MyPortalStartUpAction
Step 2-: First we need to create a class were we will define pages that we will need in our site
package com.test.pageutil
public class MyPageUtil {
public static Map<String, String> getPrivatePageList() {
Map<String, String> pages = new LinkedHashMap<String, String>();
pages.put("pageOne", "PageOne");
pages.put("pageTwo", "PageTwo");
pages.put("pageThree", "PageThree");
return pages;
}
Step 3-: This hook class will extend SimpleAction
public class MyPortalStartUpAction extends SimpleAction{
@Override
public void run(String[] ids) throws ActionException {
try {
for (int i = 0; i < ids.length; i++) {
_log.info("MyPortalStartUpAction -- comapny id "+ids[i]);
}
doRun(GetterUtil.getLong(ids[0]));
}
catch (Exception e) {
throw new ActionException(e);
}
}
private void doRun(long companyId) throws Exception {
//Create Role and assign permission to it.
setupExpando(companyId);
//create Site and pages for portal using admin user
long userId = 0;
User adminUser = null;
try {
List<User> users = UserLocalServiceUtil.getUsers(0, UserLocalServiceUtil.getUsersCount());
for (User user : users) {
if(!user.isDefaultUser() && user.getStatus()!=5){
List<Role> roles = user.getRoles();
for (Role role : roles) {
if(role.getName().equalsIgnoreCase(RoleConstants.ADMINISTRATOR)){
adminUser = user;
userId = user.getUserId();
}
}
}
}
_log.info("adminUser : "+adminUser.getFullName());
}catch(Exception pe){
_log.info("User doesn't exist.");
}
}
}
/**
* This method is used to create role using name and comanyId on application start-up.
* @param companyId
* @param roleName
* @return Newly added role is return
* @throws SystemException
*/
private Role createRole(long companyId, String roleName) throws SystemException{
long roleClassNameId = ClassNameLocalServiceUtil.getClassNameId(Role.class.getName());
long roleId = CounterLocalServiceUtil.increment(Role.class.getName());
Role role = RoleLocalServiceUtil.createRole(roleId);
role.setClassNameId(roleClassNameId);
role.setClassPK(roleId);
role.setName(roleName);
role.setType(RoleConstants.TYPE_REGULAR);
role.setCompanyId(companyId);
role.setTitle(roleName);
role = RoleLocalServiceUtil.updateRole(role);
return role;
}
/* apply custom theme for MyPortalSite Private pages */
if(userId != 0){
try {
Group group = GroupLocalServiceUtil.getGroup(companyId, MyPortalSite);
//check PRIVATE PAGES with its PORTLET is present or not
checkPrivatePages(group);
}catch(NoSuchGroupException nsge) {
createSite(userId);
}
/* Create Roles on application start-up if there is no role. */
protected void setupExpando(long companyId) throws Exception {
ExpandoTable table = null;
/* Change portal default password policy */
PasswordPolicy passwordPolicy = PasswordPolicyLocalServiceUtil.getDefaultPasswordPolicy(companyId);
if(passwordPolicy != null && passwordPolicy.getChangeRequired())
{
passwordPolicy.setChangeRequired(false);
PasswordPolicyLocalServiceUtil.updatePasswordPolicy(passwordPolicy);
}
/* Create Roles on application start-up if there is no role. */
String[] actionKeys_Aanlytics_RW = {ActionKeys.VIEW, ActionKeys.ADD_ENTRY, ActionKeys.UPDATE, ActionKeys.DELETE};
try {
RoleLocalServiceUtil.getRole(companyId, MYRole_WRITE_ACCESS);
}
catch(NoSuchRoleException nsre){
createRole(companyId, MYRole_WRITE_ACCESS);
}
/*Create Custom-Field for Organization on application start-up */
table = ExpandoTableLocalServiceUtil.addTable(Organization.class.getName(), "CUSTOM_FIELDS");
table = ExpandoTableLocalServiceUtil.getTable(Organization.class.getName(), "CUSTOM_FIELDS");
//Here we are adding column(myOrgId,myOrgType) in custom filed
ExpandoColumnLocalServiceUtil.addColumn(table.getTableId(), myOrgId, ExpandoColumnConstants.LONG);
ExpandoColumn myCol = ExpandoColumnLocalServiceUtil.getColumn(table.getTableId(), myOrgId);
String[] defaultData = {"Select", "Company", "Location"};
ExpandoColumn myColOne = ExpandoColumnLocalServiceUtil.addColumn(table.getTableId(), myOrgType, ExpandoColumnConstants.STRING_ARRAY, defaultData);
myColOne = ExpandoColumnLocalServiceUtil.getColumn(table.getTableId(), myOrgType);
}
}
private void checkPrivatePages(Group group) throws Exception{
Map<String, String> pages = MyPageUtil.getPrivatePageList()
//check layouts and portlet is present on layout or not for Private pages
List<Layout> layouts = LayoutLocalServiceUtil.getLayouts(group.getGroupId(), true);
for (Layout layout : layouts)
{
if(!pages.isEmpty())
{
List<Layout> layoutList = new ArrayList<Layout>();
for (Map.Entry<String, String> page : pages.entrySet())
{
try{
layoutList.add(addLayout(group, page.getValue(), true, "/"+page.getKey(), "2_columns_ii"));
}catch(Exception e)
{
_log.info("Layout is already present.");
}
}
_log.info("Layout is added "+layoutList);
}
if(layout.getFriendlyURL().equalsIgnoreCase("/PageOne"))
{
if(!isPortletOnLayout(layout, portletOne_WAR_PortletOneportlet))
{
addPortletId(layout, portletOne_WAR_PortletOneportlet, Column1 );
}
removeMapElement(pages, "pageOne");
}
}
/**
* Add layout (page) for particular site (Group)
* @param group - site created model
* @param name - page name
* @param privateLayout - false : public page , true : private page
* @param friendlyURL
* @param layouteTemplateId
* @return
* @throws Exception
*/
private Layout addLayout( Group group, String name, boolean privateLayout, String friendlyURL,
String layouteTemplateId) throws Exception {
ServiceContext serviceContext = new ServiceContext();
Layout layout = LayoutLocalServiceUtil.addLayout(group.getCreatorUserId(), group.getGroupId(), privateLayout, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID, name, StringPool.BLANK,
StringPool.BLANK, LayoutConstants.TYPE_PORTLET, false, friendlyURL, serviceContext);
LayoutTypePortlet layoutTypePortlet = (LayoutTypePortlet)layout.getLayoutType();
layoutTypePortlet.setLayoutTemplateId(0, layouteTemplateId, false);
addResources(layout, PortletKeys.DOCKBAR);
return layout;
}
private void addResources(Layout layout, String portletId) throws Exception
{
String rootPortletId = PortletConstants.getRootPortletId(portletId);
String portletPrimaryKey = PortletPermissionUtil.getPrimaryKey(layout.getPlid(), portletId);
ResourceLocalServiceUtil.addResources
(layout.getCompanyId(), layout.getGroupId(),
0, rootPortletId, portletPrimaryKey, true, true, true);
}
/**
* Add portlet on particular layout (page)
* @param layout
* @param portletId
* @param columnId
* @return
* @throws Exception
*/
private String addPortletId(Layout layout, String portletId, String columnId) throws Exception
{
LayoutTypePortlet layoutTypePortlet =(LayoutTypePortlet)layout.getLayoutType();
List<Portlet> list = layoutTypePortlet.getPortlets();
portletId = layoutTypePortlet.addPortletId(0, portletId, columnId, -1, false);
addResources(layout, portletId);
updateLayout(layout);
return portletId;
}
/**
* Update layout after creating layout.
* @param layout
* @throws Exception
*/
private void updateLayout(Layout layout) throws Exception
{
LayoutLocalServiceUtil.updateLayout(layout.getGroupId(), layout.isPrivateLayout(), layout.getLayoutId(),layout.getTypeSettings());
}
/**
* Add custom theme for group.
* @param groupId
* @param privateLayout - set false for public page and true for private page.
* @param themeId - custom theme Id e.g Custom_WAR_Customtheme
* @throws PortalException
* @throws SystemException
*/
private void updateCustomTheme(long groupId, boolean privateLayout, String themeId)
throws PortalException, SystemException
{
LayoutSetLocalServiceUtil.updateLookAndFeel(groupId, privateLayout, themeId, "01", "", false);
}
/**
* Get all actions related to any model
* @param name as model name e.g - This i will update in my next tutorial
On Custom Action class
* @return all actions related to model
*/
private String[] getActionIds (String name) {
String[] actions = null;
//Here's is where I get all the actionIds, and not only the ones I need
List<String> actionsList = ResourceActionsUtil.getResourceActions(name);
for (int i = 0; i < actionsList.size(); i++)
actions = actionsList.toArray(new String[i]);
return actions;
}
/**
* Add permission (like VIEW, UPDATE or DELETE) for the particular role
* @param companyId
* @param roleId
* @param modelName - Resource where u want to permission for it
* @param actionsKeys - permission for user
* @throws PortalException
* @throws SystemException
*/
private void addResource(long companyId, Role role, String modelName, String[]actionsKeys)
throws PortalException, SystemException{
for (String actionKey : actionsKeys) {
if(!ResourcePermissionLocalServiceUtil.hasResourcePermission(companyId,
modelName,
ResourceConstants.SCOPE_COMPANY,
""+companyId,
role.getRoleId(),
actionKey)){
_log.info("Role("+role.getName()+") don't have this permission("+actionKey+") for this model("+modelName+")");
ResourcePermissionLocalServiceUtil.addResourcePermission(
companyId,
modelName,
ResourceConstants.SCOPE_COMPANY,
""+companyId,
role.getRoleId(),
actionKey);
}else{
_log.info("Role("+role.getName()+") already have this permission("+actionKey+") for this model("+modelName+")");
}
}
}
}
In portal.properties add this line
application.startup.events=com.test.event.MyPortalStartUpAction
package com.test.pageutil
public class MyPageUtil {
public static Map<String, String> getPrivatePageList() {
Map<String, String> pages = new LinkedHashMap<String, String>();
pages.put("pageOne", "PageOne");
pages.put("pageTwo", "PageTwo");
pages.put("pageThree", "PageThree");
return pages;
}
Step 3-: This hook class will extend SimpleAction
public class MyPortalStartUpAction extends SimpleAction{
@Override
public void run(String[] ids) throws ActionException {
try {
for (int i = 0; i < ids.length; i++) {
_log.info("MyPortalStartUpAction -- comapny id "+ids[i]);
}
doRun(GetterUtil.getLong(ids[0]));
}
catch (Exception e) {
throw new ActionException(e);
}
}
private void doRun(long companyId) throws Exception {
//Create Role and assign permission to it.
setupExpando(companyId);
//create Site and pages for portal using admin user
long userId = 0;
User adminUser = null;
try {
List<User> users = UserLocalServiceUtil.getUsers(0, UserLocalServiceUtil.getUsersCount());
for (User user : users) {
if(!user.isDefaultUser() && user.getStatus()!=5){
List<Role> roles = user.getRoles();
for (Role role : roles) {
if(role.getName().equalsIgnoreCase(RoleConstants.ADMINISTRATOR)){
adminUser = user;
userId = user.getUserId();
}
}
}
}
_log.info("adminUser : "+adminUser.getFullName());
}catch(Exception pe){
_log.info("User doesn't exist.");
}
}
}
/**
* This method is used to create role using name and comanyId on application start-up.
* @param companyId
* @param roleName
* @return Newly added role is return
* @throws SystemException
*/
private Role createRole(long companyId, String roleName) throws SystemException{
long roleClassNameId = ClassNameLocalServiceUtil.getClassNameId(Role.class.getName());
long roleId = CounterLocalServiceUtil.increment(Role.class.getName());
Role role = RoleLocalServiceUtil.createRole(roleId);
role.setClassNameId(roleClassNameId);
role.setClassPK(roleId);
role.setName(roleName);
role.setType(RoleConstants.TYPE_REGULAR);
role.setCompanyId(companyId);
role.setTitle(roleName);
role = RoleLocalServiceUtil.updateRole(role);
return role;
}
if(userId != 0){
try {
Group group = GroupLocalServiceUtil.getGroup(companyId, MyPortalSite);
//check PRIVATE PAGES with its PORTLET is present or not
checkPrivatePages(group);
}catch(NoSuchGroupException nsge) {
createSite(userId);
}
/* Create Roles on application start-up if there is no role. */
protected void setupExpando(long companyId) throws Exception {
ExpandoTable table = null;
/* Change portal default password policy */
PasswordPolicy passwordPolicy = PasswordPolicyLocalServiceUtil.getDefaultPasswordPolicy(companyId);
if(passwordPolicy != null && passwordPolicy.getChangeRequired())
{
passwordPolicy.setChangeRequired(false);
PasswordPolicyLocalServiceUtil.updatePasswordPolicy(passwordPolicy);
}
/* Create Roles on application start-up if there is no role. */
String[] actionKeys_Aanlytics_RW = {ActionKeys.VIEW, ActionKeys.ADD_ENTRY, ActionKeys.UPDATE, ActionKeys.DELETE};
try {
RoleLocalServiceUtil.getRole(companyId, MYRole_WRITE_ACCESS);
}
catch(NoSuchRoleException nsre){
createRole(companyId, MYRole_WRITE_ACCESS);
}
/*Create Custom-Field for Organization on application start-up */
table = ExpandoTableLocalServiceUtil.addTable(Organization.class.getName(), "CUSTOM_FIELDS");
table = ExpandoTableLocalServiceUtil.getTable(Organization.class.getName(), "CUSTOM_FIELDS");
//Here we are adding column(myOrgId,myOrgType) in custom filed
ExpandoColumnLocalServiceUtil.addColumn(table.getTableId(), myOrgId, ExpandoColumnConstants.LONG);
ExpandoColumn myCol = ExpandoColumnLocalServiceUtil.getColumn(table.getTableId(), myOrgId);
String[] defaultData = {"Select", "Company", "Location"};
ExpandoColumn myColOne = ExpandoColumnLocalServiceUtil.addColumn(table.getTableId(), myOrgType, ExpandoColumnConstants.STRING_ARRAY, defaultData);
myColOne = ExpandoColumnLocalServiceUtil.getColumn(table.getTableId(), myOrgType);
}
}
private void checkPrivatePages(Group group) throws Exception{
Map<String, String> pages = MyPageUtil.getPrivatePageList()
//check layouts and portlet is present on layout or not for Private pages
List<Layout> layouts = LayoutLocalServiceUtil.getLayouts(group.getGroupId(), true);
for (Layout layout : layouts)
{
if(!pages.isEmpty())
{
List<Layout> layoutList = new ArrayList<Layout>();
for (Map.Entry<String, String> page : pages.entrySet())
{
try{
layoutList.add(addLayout(group, page.getValue(), true, "/"+page.getKey(), "2_columns_ii"));
}catch(Exception e)
{
_log.info("Layout is already present.");
}
}
_log.info("Layout is added "+layoutList);
}
if(layout.getFriendlyURL().equalsIgnoreCase("/PageOne"))
{
if(!isPortletOnLayout(layout, portletOne_WAR_PortletOneportlet))
{
addPortletId(layout, portletOne_WAR_PortletOneportlet, Column1 );
}
removeMapElement(pages, "pageOne");
}
}
/**
* Add layout (page) for particular site (Group)
* @param group - site created model
* @param name - page name
* @param privateLayout - false : public page , true : private page
* @param friendlyURL
* @param layouteTemplateId
* @return
* @throws Exception
*/
private Layout addLayout( Group group, String name, boolean privateLayout, String friendlyURL,
String layouteTemplateId) throws Exception {
ServiceContext serviceContext = new ServiceContext();
Layout layout = LayoutLocalServiceUtil.addLayout(group.getCreatorUserId(), group.getGroupId(), privateLayout, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID, name, StringPool.BLANK,
StringPool.BLANK, LayoutConstants.TYPE_PORTLET, false, friendlyURL, serviceContext);
LayoutTypePortlet layoutTypePortlet = (LayoutTypePortlet)layout.getLayoutType();
layoutTypePortlet.setLayoutTemplateId(0, layouteTemplateId, false);
addResources(layout, PortletKeys.DOCKBAR);
return layout;
}
private void addResources(Layout layout, String portletId) throws Exception
{
String rootPortletId = PortletConstants.getRootPortletId(portletId);
String portletPrimaryKey = PortletPermissionUtil.getPrimaryKey(layout.getPlid(), portletId);
ResourceLocalServiceUtil.addResources
(layout.getCompanyId(), layout.getGroupId(),
0, rootPortletId, portletPrimaryKey, true, true, true);
}
/**
* Add portlet on particular layout (page)
* @param layout
* @param portletId
* @param columnId
* @return
* @throws Exception
*/
private String addPortletId(Layout layout, String portletId, String columnId) throws Exception
{
LayoutTypePortlet layoutTypePortlet =(LayoutTypePortlet)layout.getLayoutType();
List<Portlet> list = layoutTypePortlet.getPortlets();
portletId = layoutTypePortlet.addPortletId(0, portletId, columnId, -1, false);
addResources(layout, portletId);
updateLayout(layout);
return portletId;
}
/**
* Update layout after creating layout.
* @param layout
* @throws Exception
*/
private void updateLayout(Layout layout) throws Exception
{
LayoutLocalServiceUtil.updateLayout(layout.getGroupId(), layout.isPrivateLayout(), layout.getLayoutId(),layout.getTypeSettings());
}
/**
* Add custom theme for group.
* @param groupId
* @param privateLayout - set false for public page and true for private page.
* @param themeId - custom theme Id e.g Custom_WAR_Customtheme
* @throws PortalException
* @throws SystemException
*/
private void updateCustomTheme(long groupId, boolean privateLayout, String themeId)
throws PortalException, SystemException
{
LayoutSetLocalServiceUtil.updateLookAndFeel(groupId, privateLayout, themeId, "01", "", false);
}
/**
* Get all actions related to any model
* @param name as model name e.g - This i will update in my next tutorial
On Custom Action class
* @return all actions related to model
*/
private String[] getActionIds (String name) {
String[] actions = null;
//Here's is where I get all the actionIds, and not only the ones I need
List<String> actionsList = ResourceActionsUtil.getResourceActions(name);
for (int i = 0; i < actionsList.size(); i++)
actions = actionsList.toArray(new String[i]);
return actions;
}
/**
* Add permission (like VIEW, UPDATE or DELETE) for the particular role
* @param companyId
* @param roleId
* @param modelName - Resource where u want to permission for it
* @param actionsKeys - permission for user
* @throws PortalException
* @throws SystemException
*/
private void addResource(long companyId, Role role, String modelName, String[]actionsKeys)
throws PortalException, SystemException{
for (String actionKey : actionsKeys) {
if(!ResourcePermissionLocalServiceUtil.hasResourcePermission(companyId,
modelName,
ResourceConstants.SCOPE_COMPANY,
""+companyId,
role.getRoleId(),
actionKey)){
_log.info("Role("+role.getName()+") don't have this permission("+actionKey+") for this model("+modelName+")");
ResourcePermissionLocalServiceUtil.addResourcePermission(
companyId,
modelName,
ResourceConstants.SCOPE_COMPANY,
""+companyId,
role.getRoleId(),
actionKey);
}else{
_log.info("Role("+role.getName()+") already have this permission("+actionKey+") for this model("+modelName+")");
}
}
}
}
Comments
Post a Comment