Foren

Ho to uase SitesUtil.applyLayoutSetPrototypes

garima bhandari, geändert vor 11 Jahren.

Ho to uase SitesUtil.applyLayoutSetPrototypes

Junior Member Beiträge: 81 Beitrittsdatum: 02.02.13 Neueste Beiträge
Hi,

I want to apply the site template to an organization using code but when i am using below code:

SitesUtil.applyLayoutSetPrototypes(organization.getGroup(),123, 234,serviceContext);

its gives java.lang.NoClassDefFoundError because SitesUtil.java exist in portal-imp.jar so we can't access it in my portlet.
So I have created the ext and copy SitesUtil.jar in my ext and put that jar in my tomcat/lib/ext now I am not getting class not found error but getting below error.

viceBeanMethodInvocation.java:108)
        at com.liferay.portal.spring.aop.ServiceBeanAopProxy.invoke(ServiceBeanA
opProxy.java:211)
        at $Proxy28.importLayouts(Unknown Source)
        at com.liferay.portal.service.LayoutServiceUtil.importLayouts(LayoutServ
iceUtil.java:469)
        at com.liferay.portlet.sites.util.SitesUtil.copyLayoutSet(SitesUtil.java
:281)
        at com.liferay.portlet.sites.util.SitesUtil.applyLayoutSetPrototypes(Sit
esUtil.java:225)
        at com.eyepegasus.bean.NewUserBB.addOrganization(NewUserBB.java:489)
        at com.eyepegasus.bean.NewUserBB.addUser(NewUserBB.java:325)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.


Can any one help. I have seen many post but didn't found any solution.

My aim is to assign one default site to all organization at the time organization creation. If i will able to access SitesUtil I can directly do
SitesUtil.applyLayoutSetPrototypes(organization.getGroup(),123, 234,serviceContext);

Please help. Thanks in advance.
thumbnail
Peter Schübl, geändert vor 11 Jahren.

RE: Ho to uase SitesUtil.applyLayoutSetPrototypes

New Member Beiträge: 9 Beitrittsdatum: 24.11.11 Neueste Beiträge
Hi,

It is very unfortunate that the SitesUtil is not available as a service.

To use it you have to run it in the context of the portal (liferay core)

MethodKey methodKey = new MethodKey("com.liferay.portlet.sites.util.SitesUtil",
    "applyLayoutSetPrototypes", Group.class, long.class, long.class, ServiceContext.class);
PortalClassInvoker.invoke(false, methodKey, organization.getGroup(), 123, 234, serviceContext);
garima bhandari, geändert vor 11 Jahren.

RE: Ho to uase SitesUtil.applyLayoutSetPrototypes

Junior Member Beiträge: 81 Beitrittsdatum: 02.02.13 Neueste Beiträge
Hi,

I have already used the PortalClassInvoker.invoke() but getting the same above error.

After debugging the code we get to know that it is a permission related issue. So for assigning a site to organization we first need to login then my code will work properly.
So can any on tell me how we can login problematically using my code.

Thanks
thumbnail
Peter Schübl, geändert vor 11 Jahren.

RE: Ho to uase SitesUtil.applyLayoutSetPrototypes

New Member Beiträge: 9 Beitrittsdatum: 24.11.11 Neueste Beiträge
Well, that depends.

Where do you want to trigger the functionality from?

What you need to is a new ServiceContext.

Something like the following - not tested.
ServiceContext serviceContext = new ServiceContext();
serviceContext.setAddGroupPermissions(true);
serviceContext.setAddGuestPermissions(true);
serviceContext.setSignedIn(false);
// set the following to an admin user / company or default user
User user = UserLocalServiceUtil.getDefaultUser(companyId); // or any user that has the permissions
serviceContext.setUserId(user.getUserId());
serviceContext.setCompanyId(companyId);


And most likely you also have to setup the ThreadPermissionChecker
PrincipalThreadLocal.setName(user.getUserId());
PermissionChecker adminPermissionChecker = PermissionCheckerFactoryUtil.create(user, false);
PermissionThreadLocal.setPermissionChecker(adminPermissionChecker);


Don't forget to reset the permission checker in a final block.

That should work. Fingers crossed.
Renchu Koshy, geändert vor 11 Jahren.

RE: Ho to uase SitesUtil.applyLayoutSetPrototypes

New Member Beitrag: 1 Beitrittsdatum: 09.04.13 Neueste Beiträge
Could you tell me the possible values that publicLayoutSetPrototypeId and privateLayoutSetPrototypeId can take and its meaning?
thumbnail
Peter Schübl, geändert vor 11 Jahren.

RE: Ho to uase SitesUtil.applyLayoutSetPrototypes

New Member Beiträge: 9 Beitrittsdatum: 24.11.11 Neueste Beiträge
public/privateLayoutSetPrototypeId are IDs of LayoutSetPrototype instances.

A LayoutSetPrototype is the entity for a Site Template.

Use LayoutSetPrototypeLocalServiceUtil.getLayoutSetPrototypes(-1, -1) to get a list of Site Templates.
Jing Guo, geändert vor 11 Jahren.

RE: Ho to uase SitesUtil.applyLayoutSetPrototypes

New Member Beiträge: 2 Beitrittsdatum: 22.10.12 Neueste Beiträge
Hi,

I think you could probably try to use LayoutSetPrototypeLocalServiceUtil and LayoutSetLocalServiceUtil class, I am attaching some of my code here:


   //following code is based on my requirement, change it to meet yours.
   //get all layout prototype
   List<layoutsetprototype> layouts = LayoutSetPrototypeLocalServiceUtil
					.getLayoutSetPrototypes(-1, -1);
			LayoutSetPrototype publicLayoutSetPrototype = null;
			LayoutSetPrototype privateLayoutSetPrototype = null;
   //find the right prototype
    for (int i = 0; i &lt; layouts.size(); i++) {
				if (layouts.get(i).getNameCurrentValue()
						.equals(publicLayoutName)) {
					publicLayoutSetPrototype = layouts.get(i);
				} else if (layouts.get(i).getNameCurrentValue()
						.equals(privateLayoutName)) {
					privateLayoutSetPrototype = layouts.get(i);

				}

			}
      
    LayoutSet publicLayoutset = LayoutSetLocalServiceUtil.getLayoutSet(
					group.getGroupId(), false);

			LayoutSet privateLayoutset = LayoutSetLocalServiceUtil
					.getLayoutSet(group.getGroupId(), true);

			publicLayoutset.setLayoutSetPrototypeUuid(publicLayoutSetPrototype
					.getUuid());

			privateLayoutset
					.setLayoutSetPrototypeUuid(privateLayoutSetPrototype
							.getUuid());

publicLayoutset.setLayoutSetPrototypeLinkEnabled(true);

			privateLayoutset.setLayoutSetPrototypeLinkEnabled(true);

			LayoutSetLocalServiceUtil.updateLayoutSet(publicLayoutset);

			LayoutSetLocalServiceUtil.updateLayoutSet(privateLayoutset);
     
</layoutsetprototype>


I hope this helps

Jing Guo
Sunil Kulkarni, geändert vor 11 Jahren.

RE: Ho to uase SitesUtil.applyLayoutSetPrototypes

Junior Member Beiträge: 94 Beitrittsdatum: 24.06.11 Neueste Beiträge
I was facing the same problem for assigning the site template for organization site.

http://www.liferay.com/community/forums/-/message_boards/message/18392329

It might be not a valid way.
garima bhandari, geändert vor 11 Jahren.

RE: Ho to uase SitesUtil.applyLayoutSetPrototypes

Junior Member Beiträge: 81 Beitrittsdatum: 02.02.13 Neueste Beiträge
Hi All,

Here is the solution.

To assign site template to an organization you must be logged in so we have created a hook for postlogin and put the below code in postlogin method..
First you need to assign the admin role to user and must initialize permission checker otherwise you will get " permission checker is not initialized" error .

Role adminRole = RoleLocalServiceUtil.getRole(10153,"Administrator");
 List<user> adminUsers = UserLocalServiceUtil.getRoleUsers(adminRole.getRoleId());
		                	 
		                	 PrincipalThreadLocal.setName(adminUsers.get(0).getUserId());
		                	 PermissionChecker permissionChecker =PermissionCheckerFactoryUtil.create(adminUsers.get(0), true);
		                	 PermissionThreadLocal.setPermissionChecker(permissionChecker);
		                	 
		                	
		                
		                	MethodKey key = new MethodKey("com.liferay.portlet.sites.util.SitesUtil", "applyLayoutSetPrototypes",
		                			                          Group.class, long.class, long.class, ServiceContext.class );
		                			                
		                			PortalClassInvoker.invoke(true, key, org.getGroup(), 13825, 13825, serviceContext);</user>