Liferay研究之廿七:一些有用的API分析

 
  • com.liferay.portal.util.PropsUtil

在Portal.properties中設置的每個屬性,都有一個類的屬性與之對應,這個類就是:PropsUtil,每個屬性都是靜態的。

對應的還有一個類是:PropsValues可以直接獲取屬性對應的值。

如果想擴展portal.properties,在其中加上自己的值,那麼就需要修改這兩個類。

 

  • com.liferay.portal.util.WebAppPool.java

描述這樣一個數據結構<companyId, key, value>

用來存儲所有Company可以使用的所有應用列表。

WebAppPool.get(companyId, WebKeys.PORTLET_CATEGORY)就是獲取某個company的應用分類;

獲取之後先緩存,如果後來有了新的變化,還可以新舊一起merge。

  • com.liferay.portal.util.PortalInstances.java

用來描述Portal上所有的實例,也就是與服務器管理中相關的那些,每個Company會有一個portal instance。

  • com.liferay.portal.util.Portal.java, PortalImpl.java

描述了一個Portal Server, 通過這個類,在Portal加載後可以獲知服務器的相關信息,比如portal的lib路徑,Server Name,系統角色,系統組,組織,保留參數關鍵字等等。

(通過分析該類,還知道了,系統可以不部署在/ROOT目錄下面,可以部署在任何路徑下,只需對應的改變portal.properites中的portal.ctx屬性即可)

該類不但具有名詞屬性,還具有動詞屬性,比如renderPortlet方法。具體的邏輯是:在獲取了portlet對象,及其位置屬性(columnPos, columnId)之後,將其放到request中,然後include render_portlet.jsp來顯示一個Portlet.

  • com.liferay.portal.model.Portlet.java, model.impl.PortletImpl.java

描述了一個Portlet的所有屬性。其值的設置都來源於liferay-portlet.xml中的定義,比如這個portlet是否是system portlet(用戶不能操作)

  • com.liferay.portal.velocity.VelocityVariables.java

所有Velocity模板template中引用的對象變量,均在此處進行定義。

並且,該類定義了一個特殊的變量$init,這個變量對應一個公用的init.vm,也就是_unstyled/template/init.vm,這個模板中定義了各種Velocity的變量(比如是否顯示my_place),類似init.jsp,被其他所有的模板來引用,比如在portal_normal.vm中,第一行一般就是:#parse($init)

一個例外:在template中$theme並不是在VelocityVariables中定義的Theme類型,而是通過ThemeUtil.includeVM,替換爲了VelocityTagLib對象。

  • com.liferay.portal.servlet.taglib.portlet.DefineObjectsTagUtil.java

根據pageContext可以獲取Portal相關的變量有:

lifecycle = (String)req.getAttribute(PortletRequest.LIFECYCLE_PHASE); 有幾個可能的值:

PortletRequest.ACTION_PHASE

PortletRequest.EVENT_PHASE

PortletRequest.RENDER_PHASE

PortletRequest.RESOURCE_PHASE

portletConfig = (PortletConfigImpl)req.getAttribute(JavaConstants.JAVAX_PORTLET_CONFIG);

portletRequest = (PortletRequest)req.getAttribute(JavaConstants.JAVAX_PORTLET_REQUEST); 在不同階段其在Request中的屬性名也不同,分別是:

actionRequest, eventRequest, renderRequest, resourceRequest

portletPreferences = (PortletPreferences)pageContext.getAttribute("portletPreferences");

portletSession = (PortletSession)pageContext.setAttribute("portletSession");

portletResponse = (PortletResponse)pageContext.setAttribute(portletResponseAttrName); 其中portletResponseAttrName在不同的Lifecycle階段值也不同,分別是:

actionResponse, eventResponse, renderResponse, resourceResponse

  • com.liferay.portal.model.LayoutTypePortlet.java, model.impl.LayoutTypePortletImpl.java

生成portlet instance id的方法:portletId + getFullInstanceSeparator()

處理typeSettings的方法:先通過LayoutTypeImpl調用Layout.getTypeSettingsProperties(),將數據庫中存儲的typeSettings內容轉換爲Properties類型。然後就可以根據LayoutTypePortletImpl中所定義的各個屬性來取typeSettings的值了。

setLayoutTemplateId(long userId, String newLayoutTemplateId, boolean checkPermission)的邏輯

重新設定一個layout的template時,可能涉及到column的變化,以及再oldTempate column上的portlet位置的變化。

因此,重新設定一個templateId之後,還需要更新其上面的portlet. reorganizePortlets(newColumns, oldColumns);

重新設定的邏輯就是:如果新模板中的列數比舊模板的少,就將舊模板中多出來的列中的portlets全部放到新模板的最後一列。

  • com.liferay.portlet.layoutconfiguration.util.xml.RuntimeLogic, (PortletLogic, ActionURLLogic [ RenderURLLogic])

PortletLogic:

在文章中可以動態的嵌入Portlet.具體的做法是,在文章編輯中,源代碼中,插入下面代碼:

<runtime-portlet name="3" instance="" queryString="" />

具體參數說明:name→Portlet的ID,可以參考liferay-custom.xml中定義;instance→如果portlet是可以instancable的,那麼這裏需要指明其instanceId的後4位,如果不清楚最好到數據庫中進行查找一下。比如從portletPreferences表中;queryString是附帶的參數。

這樣,文章中就可以動態的嵌入一個查詢了。

ActionURLLogic:

<runtime-action-url portlet-name="" param-name-1="" param-value-1="" param-name-2="" param-value-2="" .... />

RenderURLLogic:

<runtime-render-url portlet-name="" param-name-1="" param-value-1="" param-name-2="" param-value-2="" .... />

  • com.liferay.portal.kernal.search.Indexer

該接口有兩個方法:

DocumentSummary getDocumentSummary(Document, PortletURL)

void reindex(String[] ids)

DocumentSummary是一個簡要檢索結果的描述,也就是標題是什麼,什麼內容,鏈接到什麼地方;

getDocumentSummary的過程,也就是從Lucene Document中獲取title, content以及entityId三個對應的域內容,並構造DocumentSummary, 其中entityId用來構造顯示該document的鏈接地址,一般是調用一個renderURL。

要想開發自己的Indexer,那麼首先需要繼承kernal.search.Indexer,實現上面的兩個方法。

並添加addEntity, updateEntity, deleteEntity等方法。用來實現對全文檢索內容的增加,更新及刪除。

以構造過程爲例,主要就是先新建一個lucene Document對象,並插入不同keywords的content(類似一個Map),然後用LuceneUtil.getWriter(companyId)獲取IndexerWriter, 將doc寫如索引。

  • com.liferay.portal.theme.ThemeDisplay

這個類描述了界面顯示的絕大部分資源;

包括:layout, group, user, theme,colorScheme, locale, language, path, logo, URL, showIcon等等;

發佈了112 篇原創文章 · 獲贊 10 · 訪問量 52萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章