In my previous blogs we see how to upload a file with metadata. Now its time to fetch all the data Programmatically .Before reading this blog you must know how to create metadata sets and document type for this you can read my previous blog Save Document with Metadata in Liferay.
This can be done in 2 parts:-
- First we have to create indexer Post Processor hook.
- Secondly we create Portlet for fetching the data.
For this blog i am using liferay 6.1.
Before start just create Resume(metadata sets) and Resume Type(Document Types) as describe in my previous blog Save Document with Metadata in Liferay.
So lets start this step by step:-
Step 1:-Create Indexer Hook
For creating indexer post processor hook you may refer my previous blog Indexer Post Processor Hook in Liferay . Here i just created indexer on DLFileEntry Class and apply indexing on experience.
liferay-hook.xml
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0"?> | |
<!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.1.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_1_0.dtd"> | |
<hook> | |
<indexer-post-processor> | |
<indexer-class-name>com.liferay.portlet.documentlibrary.model.DLFileEntry</indexer-class-name> | |
<indexer-post-processor-impl>com.demo.ExperienceIndexer</indexer-post-processor-impl> | |
</indexer-post-processor> | |
</hook> |
ExperienceIndexer.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.demo; | |
import java.util.List; | |
import java.util.Locale; | |
import com.liferay.portal.kernel.search.BaseIndexerPostProcessor; | |
import com.liferay.portal.kernel.search.BooleanQuery; | |
import com.liferay.portal.kernel.search.Document; | |
import com.liferay.portal.kernel.search.SearchContext; | |
import com.liferay.portlet.documentlibrary.model.DLFileEntry; | |
import com.liferay.portlet.documentlibrary.model.DLFileEntryMetadata; | |
import com.liferay.portlet.documentlibrary.model.DLFileEntryType; | |
import com.liferay.portlet.documentlibrary.service.DLFileEntryMetadataLocalServiceUtil; | |
import com.liferay.portlet.documentlibrary.service.DLFileEntryTypeLocalServiceUtil; | |
import com.liferay.portlet.dynamicdatamapping.model.DDMStructure; | |
import com.liferay.portlet.dynamicdatamapping.storage.Fields; | |
import com.liferay.portlet.dynamicdatamapping.storage.StorageEngineUtil; | |
public class ExperienceIndexer extends BaseIndexerPostProcessor { | |
public void postProcessDocument(Document document, Object obj) throws Exception { | |
try { | |
DLFileEntry dLFileEntry = (DLFileEntry) obj; | |
try { | |
long fileEntryTypeId = dLFileEntry.getFileEntryTypeId(); | |
DLFileEntryType dLFileEntryType = DLFileEntryTypeLocalServiceUtil.getDLFileEntryType(fileEntryTypeId); | |
DDMStructure yourStructure = null; | |
List<DDMStructure> structures = dLFileEntryType.getDDMStructures(); | |
for (DDMStructure struct : structures) { | |
if (struct.getName((Locale.ROOT)).equalsIgnoreCase("Resume"))// Pass your meta type here | |
{ | |
yourStructure = struct; | |
break; | |
} | |
} | |
//System.out.println("My Structure=>"+yourStructure.getName(Locale.ROOT));// this is structure of Resume | |
DLFileEntryMetadata dlFileEntryMetadata = DLFileEntryMetadataLocalServiceUtil.getFileEntryMetadata | |
(yourStructure.getStructureId(), dLFileEntry.getFileVersion().getFileVersionId()); | |
Fields fields = StorageEngineUtil.getFields(dlFileEntryMetadata.getDDMStorageId()); | |
String experience = null; | |
try { | |
experience = fields.get("experience").getValue().toString(); | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
if (experience != null) { | |
document.addText("YearOfExperience", experience); | |
//System.out.println("Year of Exp=>"+experience); | |
} | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
} | |
public void postProcessSearchQuery(BooleanQuery fullQuery, SearchContext arg1)throws Exception { | |
String experience = (String) arg1.getAttribute("YearOfExperience"); | |
// System.out.println("Experience in query=>"+experience); | |
if(experience!=null){ | |
fullQuery.addRequiredTerm("YearOfExperience", experience); | |
// System.out.println("Full Query=>"+fullQuery); | |
} | |
} | |
} |
Explanation:-
- In the postProcessDocument method we just fetch the metadata experience and add this as a index with key YearOfExperience.This method is called each time when we add a Resume ie Document Type Resume Type.
- In postProcessSearchQuery method we create a Boolean query and pass experience as a argument.This method is called by our portlet.
Step 2:-Create Portlet that Call Boolean Query
Just create a Liferay Project with MVC portlet in it.Inside the Jsp file paste this content:-
view.jsp
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %> | |
<portlet:defineObjects /> | |
<portlet:actionURL var="searchData" name="searchData"></portlet:actionURL> | |
<br> | |
<b>Enter Number of Years of Experience</b> | |
<form action="<%=searchData%>" method="post"> | |
Experience:-<input type="text" name="experience" id="experience"><br> | |
<input type="Submit" name="Submit"> | |
</form> |
And in your controller paste this content:-
Demo.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.test; | |
import java.util.List; | |
import java.util.Locale; | |
import java.util.Map; | |
import javax.portlet.ActionRequest; | |
import javax.portlet.ActionResponse; | |
import com.liferay.portal.kernel.search.Document; | |
import com.liferay.portal.kernel.search.Field; | |
import com.liferay.portal.kernel.search.Hits; | |
import com.liferay.portal.kernel.search.SearchContext; | |
import com.liferay.portal.kernel.search.SearchContextFactory; | |
import com.liferay.portal.kernel.util.GetterUtil; | |
import com.liferay.portal.kernel.util.ParamUtil; | |
import com.liferay.portal.kernel.util.WebKeys; | |
import com.liferay.portal.theme.ThemeDisplay; | |
import com.liferay.portal.util.PortalUtil; | |
import com.liferay.portlet.documentlibrary.model.DLFileEntry; | |
import com.liferay.portlet.documentlibrary.model.DLFileEntryMetadata; | |
import com.liferay.portlet.documentlibrary.model.DLFileEntryType; | |
import com.liferay.portlet.documentlibrary.service.DLAppServiceUtil; | |
import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil; | |
import com.liferay.portlet.documentlibrary.service.DLFileEntryMetadataLocalServiceUtil; | |
import com.liferay.portlet.documentlibrary.service.DLFileEntryTypeLocalServiceUtil; | |
import com.liferay.portlet.dynamicdatamapping.model.DDMStructure; | |
import com.liferay.portlet.dynamicdatamapping.storage.Fields; | |
import com.liferay.portlet.dynamicdatamapping.storage.StorageEngineUtil; | |
import com.liferay.util.bridges.mvc.MVCPortlet; | |
public class Demo extends MVCPortlet { | |
public void searchData(ActionRequest request,ActionResponse response) | |
{ | |
String experience = ParamUtil.getString(request, "experience"); | |
SearchContext searchContext = SearchContextFactory. getInstance(PortalUtil.getHttpServletRequest(request)); | |
searchContext.setAttribute("YearOfExperience", experience); | |
try { | |
Hits hits =DLAppServiceUtil.search(new Long(10179), searchContext);//Repository Id of Resume Folder | |
List<Document> docList = hits.toList(); | |
for ( Document document : docList ){ | |
Map<String, Field> fieldMap = document.getFields(); | |
//Getting Basic Data | |
String title = fieldMap.get("title").getValue(); | |
String description = fieldMap.get("description").getValue(); | |
long fileEntryId= GetterUtil.getLong(document.get(Field.ENTRY_CLASS_PK)); | |
DLFileEntry dLFileEntry = DLFileEntryLocalServiceUtil.getDLFileEntry(fileEntryId); | |
DLFileEntryType dLFileEntryType = DLFileEntryTypeLocalServiceUtil.getFileEntryType(dLFileEntry.getFileEntryTypeId()); | |
DDMStructure yourStructure = null; | |
List<DDMStructure> structures = dLFileEntryType.getDDMStructures(); | |
for (DDMStructure struct : structures) { | |
if (struct.getName((Locale.ROOT)).equalsIgnoreCase("Resume")) { | |
yourStructure = struct; | |
break; | |
} | |
} | |
DLFileEntryMetadata dlFileEntryMetadata = DLFileEntryMetadataLocalServiceUtil.getFileEntryMetadata (yourStructure.getStructureId(), | |
dLFileEntry.getFileVersion().getFileVersionId()); | |
Fields fields = StorageEngineUtil.getFields(dlFileEntryMetadata.getDDMStorageId()); | |
//Getting all Metadata | |
String outputExperience = fields.get("experience").getValue().toString(); | |
String name = fields.get("cname").getValue().toString();// same name which we use when create metadata sets Candidate Name | |
ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY); | |
String url = themeDisplay.getPortalURL() + themeDisplay.getPathContext() + "/documents/" + themeDisplay.getScopeGroupId() + "/" + | |
dLFileEntry.getFolderId() + "/" +title; | |
System.out.println("Title=>"+title+" , description=>"+description+", Name=>"+name+" ,Experience=>"+outputExperience); | |
System.out.println("Url=>"+url); | |
} | |
} | |
catch (Exception e) { | |
e.printStackTrace(); | |
} | |
} | |
} | |
Explanation:-
Here when we create SearchContext Object and set the attribute experience in it.This will automatically call the postProcessSearchQuery method of indexer and get the result on the basis of Experience.
Step 3:-Check the output
Just create a folder and set the document type as "Resume type" as explained in my previous blog and add some document and provide experience as 4.5 or 3.0 etc.Now deploy your portlet and see the output as:-
When you hit submit see the console :-
Hope this will Help....
You can Download Source code from Fetch a Document with Metadata Programmatically in Liferay.
Related Post:-
No comments:
Post a Comment