Liferay 启动过程分析14-初始化resource code
2012-06-24 09:42
423 查看
在MainServlet中,当初始化resource actions之后,就开始初始化resource code ,这是由以下代码来完成的:
它会去调用initResourceCodes方法:
我们逐行分析:
02行:
02行会发起一个数据库的查询,来获取Liferay实例对应的数据库中存放的所有company的id,这个方法在PortalInstances类中:
04-06行会迭代所有的portlet,对于每一个portlet:
09-11行:
09-11行会根据这个portlet的id来获取这个portlet的model的名字列表,它会调用ResourceActionUtil类的getPortletModelResources方法:
进而最终调用ResourceActionsImpl的getPortletModelResources方法:
从这里我们可以看出,它是从_portletModelResources中获取与portletName对应的Model名字列表,怎么获得呢,见readModelResource方法:
分析第13-15行:
它会遍历每一个companyId,然后调用ResourceCodeLocalServiceUtil的checkResourceCodes方法来检查Resouce codes:
它最终会委托ResouceCodeLocalServiceImpl的checkResourceCodes方法:
它先依然检查user check permission,然后对各个scope (company,group等),分别发起数据库查询(封装在如下的fetchByC_N_S方法中)来获取响应的ResourceCode:
17-19行,最终也是执行数据库查询,这里不再展开。
if (_log.isDebugEnabled()) { _log.debug("Initialize resource codes"); } try { initResourceCodes(portlets); } ..
它会去调用initResourceCodes方法:
protected void initResourceCodes(List<Portlet> portlets) throws Exception { long[] companyIds = PortalInstances.getCompanyIdsBySQL(); Iterator<Portlet> itr = portlets.iterator(); while (itr.hasNext()) { Portlet portlet = itr.next(); List<String> modelNames = ResourceActionsUtil.getPortletModelResources( portlet.getPortletId()); for (long companyId : companyIds) { ResourceCodeLocalServiceUtil.checkResourceCodes( companyId, portlet.getPortletId()); for (String modelName : modelNames) { ResourceCodeLocalServiceUtil.checkResourceCodes( companyId, modelName); } } } }
我们逐行分析:
02行:
02行会发起一个数据库的查询,来获取Liferay实例对应的数据库中存放的所有company的id,这个方法在PortalInstances类中:
private long[] _getCompanyIdsBySQL() throws SQLException { List<Long> companyIds = new ArrayList<Long>(); ... try { con = DataAccess.getConnection(); ps = con.prepareStatement(_GET_COMPANY_IDS); rs = ps.executeQuery(); while (rs.next()) { long companyId = rs.getLong("companyId"); companyIds.add(companyId); } } finally { DataAccess.cleanUp(con, ps, rs); } return ArrayUtil.toArray( companyIds.toArray(new Long[companyIds.size()])); }
04-06行会迭代所有的portlet,对于每一个portlet:
09-11行:
09-11行会根据这个portlet的id来获取这个portlet的model的名字列表,它会调用ResourceActionUtil类的getPortletModelResources方法:
public static List<String> getPortletModelResources(String portletName) { return getResourceActions().getPortletModelResources(portletName); }
进而最终调用ResourceActionsImpl的getPortletModelResources方法:
public List<String> getPortletModelResources(String portletName) { portletName = PortletConstants.getRootPortletId(portletName); Set<String> resources = _portletModelResources.get(portletName); if (resources == null) { return new UniqueList<String>(); } else { return Collections.list(Collections.enumeration(resources)); } }
从这里我们可以看出,它是从_portletModelResources中获取与portletName对应的Model名字列表,怎么获得呢,见readModelResource方法:
protected void readModelResource( String servletContextName, Element modelResourceElement) { String name = modelResourceElement.elementTextTrim("model-name"); Element portletRefElement = modelResourceElement.element("portlet-ref"); for (Element portletNameElement : portletRefElement.elements("portlet-name")) { String portletName = portletNameElement.getTextTrim(); if (servletContextName != null) { portletName = portletName.concat(PortletConstants.WAR_SEPARATOR).concat( servletContextName); } portletName = portal.getJsSafePortletId(portletName); // Reference for a portlet to child models Set<String> modelResources = _portletModelResources.get( portletName); if (modelResources == null) { modelResources = new HashSet<String>(); _portletModelResources.put(portletName, modelResources); } modelResources.add(name); // Reference for a model to parent portlets Set<String> portletResources = _modelPortletResources.get(name); if (portletResources == null) { portletResources = new HashSet<String>(); _modelPortletResources.put(name, portletResources); } portletResources.add(portletName); } List<String> supportsActions = readSupportsActions( modelResourceElement, _modelResourceActions, name); checkModelActions(supportsActions); setActions(_modelResourceActions, name, supportsActions); readGroupDefaultActions( modelResourceElement, _modelResourceGroupDefaultActions, name); List<String> guestDefaultActions = readGuestDefaultActions( modelResourceElement, _modelResourceGuestDefaultActions, name); readGuestUnsupportedActions( modelResourceElement, _modelResourceGuestUnsupportedActions, name, guestDefaultActions); setActions( _modelResourceGuestDefaultActions, name, guestDefaultActions); readOwnerDefaultActions( modelResourceElement, _modelResourceOwnerDefaultActions, name); }
分析第13-15行:
它会遍历每一个companyId,然后调用ResourceCodeLocalServiceUtil的checkResourceCodes方法来检查Resouce codes:
public static void checkResourceCodes(long companyId, java.lang.String name) throws com.liferay.portal.kernel.exception.SystemException { getService().checkResourceCodes(companyId, name); }
它最终会委托ResouceCodeLocalServiceImpl的checkResourceCodes方法:
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) public void checkResourceCodes(long companyId, String name) throws SystemException { if (PropsValues.PERMISSIONS_USER_CHECK_ALGORITHM == 6) { return; } getResourceCode(companyId, name, ResourceConstants.SCOPE_COMPANY); getResourceCode(companyId, name, ResourceConstants.SCOPE_GROUP); getResourceCode( companyId, name, ResourceConstants.SCOPE_GROUP_TEMPLATE); getResourceCode(companyId, name, ResourceConstants.SCOPE_INDIVIDUAL); }
它先依然检查user check permission,然后对各个scope (company,group等),分别发起数据库查询(封装在如下的fetchByC_N_S方法中)来获取响应的ResourceCode:
public ResourceCode getResourceCode(long companyId, String name, int scope) throws SystemException { // Always cache the resource code. This table exists to improve // performance. Create the resource code if one does not exist. if (Validator.isNull(name)) { name = StringPool.BLANK; } String key = encodeKey(companyId, name, scope); ResourceCode resourceCode = _resourceCodes.get(key); if (resourceCode == null) { resourceCode = resourceCodePersistence.fetchByC_N_S( companyId, name, scope); if (resourceCode == null) { resourceCode = resourceCodeLocalService.addResourceCode( companyId, name, scope); } _resourceCodes.put(key, resourceCode); } return resourceCode; }
17-19行,最终也是执行数据库查询,这里不再展开。
相关文章推荐
- Liferay 启动过程分析6-初始化Portlets
- Liferay 启动过程分析8-初始化社交
- Liferay 启动过程分析9-初始化主题
- Liferay 启动过程分析15-初始化公司信息
- Liferay 启动过程分析10-初始化站点设置
- Liferay 启动过程分析16-初始化插件
- Liferay 启动过程分析4-初始化Servlet上下文池
- Liferay 启动过程分析11-初始化扩展环境
- Liferay 启动过程分析5-初始化插件包
- Liferay 启动过程分析7-初始化布局模板
- Liferay 启动过程分析13-初始化Resource Action
- Nginx源码分析-启动初始化过程(二)
- Nginx源码分析---Nginx启动初始化过程(一)
- Nginx源码分析-启动初始化过程(一)
- Liferay 启动过程分析2-进入MainServlet
- Nginx源码分析-启动初始化过程(一)
- Nginx源码分析---Nginx启动初始化过程(二)
- Nginx源码分析-启动初始化过程(二)
- Nginx源码分析-启动初始化过程(二)
- Liferay 启动过程分析3-处理启动事件(第三部分)