Added person search through opensearch

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@7518 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Paul Holmes-Higgin
2007-12-04 10:47:04 +00:00
parent bdcf178b6f
commit 1a594cd190
11 changed files with 258 additions and 0 deletions

View File

@@ -1609,6 +1609,7 @@ opensearch_desc=Provides ability to search across multiple OpenSearch supported
search_in=Search In
no_engines_registered=Failed to find any registered OpenSearch engines!
current_repo=Current Alfresco Repository
current_repo_people=Current Alfresco People
toggle_options=Toggle Options
no_results=No results
of=of

View File

@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:relevance="http://a9.com/-/opensearch/extensions/relevance/1.0/" xmlns:alf="http://www.alfresco.org/opensearch/1.0/">
<generator version="${server.version}">Alfresco (${server.edition})</generator>
<title>Alfresco Person Search: ${search.searchTerms}</title>
<updated>${xmldate(date)}</updated>
<icon>${absurl(url.context)}/images/logo/AlfrescoLogo16.ico</icon>
<author>
<name><#if person??>${person.properties.userName}<#else>unknown</#if></name>
</author>
<id>urn:uuid:${search.id}</id>
<opensearch:totalResults>${search.totalResults}</opensearch:totalResults>
<opensearch:startIndex>${search.startIndex}</opensearch:startIndex>
<opensearch:itemsPerPage>${search.itemsPerPage}</opensearch:itemsPerPage>
<opensearch:Query role="request" searchTerms="${search.searchTerms}" startPage="${search.startPage}" count="${search.itemsPerPage}" language="${search.localeId}"/>
<link rel="alternate" href="${absurl(scripturl("?q=${search.searchTerms?url}&p=${search.startPage}&c=${search.itemsPerPage}&l=${search.localeId}")?xml)}" type="text/html"/>
<link rel="self" href="${absurl(scripturl("?q=${search.searchTerms?url}&p=${search.startPage}&c=${search.itemsPerPage}&l=${search.localeId}")?xml)}" type="application/atom+xml"/>
<#if search.startPage &gt; 1>
<link rel="first" href="${absurl(scripturl("?q=${search.searchTerms?url}&p=1&c=${search.itemsPerPage}&l=${search.localeId}")?xml)}" type="application/atom+xml"/>
<link rel="previous" href="${absurl(scripturl("?q=${search.searchTerms?url}&p=${search.startPage - 1}&c=${search.itemsPerPage}&l=${search.localeId}")?xml)}" type="application/atom+xml"/>
</#if>
<#if search.startPage &lt; search.totalPages>
<link rel="next" href="${absurl(scripturl("?q=${search.searchTerms?url}&p=${search.startPage + 1}&c=${search.itemsPerPage}&l=${search.localeId}")?xml)}" type="application/atom+xml"/>
<link rel="last" href="${absurl(scripturl("?q=${search.searchTerms?url}&p=${search.totalPages}&c=${search.itemsPerPage}&l=${search.localeId}")?xml)}" type="application/atom+xml"/>
</#if>
<link rel="search" type="application/opensearchdescription+xml" href="${absurl(url.serviceContext)}/api/search/person/description.xml"/>
<#list search.results as row>
<entry>
<title>${row.properties.firstName} ${row.properties.lastName}</title>
<link rel="alternate" href="${absurl(url.serviceContext)}"/>
<#if row.assocs["cm:avatar"]?exists>
<icon>${absurl(url.context)}${row.assocs["cm:avatar"][0].url}</icon>
<#else>
<icon>${absurl(url.context)}/images/icons/user_large.gif</icon>
</#if>
<id>urn:uuid:${row.id}</id>
<updated>${xmldate(row.properties.modified)}</updated>
<summary>
<#if row.properties.jobtitle??>${row.properties.jobtitle},</#if>
<#if row.properties.organization??>${row.properties.organization},</#if>
<#if row.properties.location??>${row.properties.location},</#if>
<#--
<#if row.properties.persondescription??>${row.properties.persondescription.content}</#if>
-->
</summary>
<relevance:score>${row.score}</relevance:score>
</entry>
</#list>
</feed>

View File

@@ -0,0 +1,12 @@
<webscript>
<shortname>Alfresco Person Search (OpenSearch Enabled)</shortname>
<description>Execute Person Search against Alfresco Repository</description>
<url>/api/search/person.html?q={searchTerms}&amp;p={startPage?}&amp;c={count?}&amp;l={language?}</url>
<url>/search/person.html?q={searchTerms}&amp;p={startPage?}&amp;c={count?}&amp;l={language?}</url>
<url>/api/search/person.atom?q={searchTerms}&amp;p={startPage?}&amp;c={count?}&amp;l={language?}</url>
<url>/search/person.atom?q={searchTerms}&amp;p={startPage?}&amp;c={count?}&amp;l={language?}</url>
<url>/api/search/person.rss?q={searchTerms}&amp;p={startPage?}&amp;c={count?}&amp;l={language?}</url>
<url>/search/person.rss?q={searchTerms}&amp;p={startPage?}&amp;c={count?}&amp;l={language?}</url>
<url>/api/search/person.portlet?q={searchTerms}&amp;p={startPage?}&amp;c={count?}&amp;l={language?}</url>
<authentication>guest</authentication>
</webscript>

View File

@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head profile="http://a9.com/-/spec/opensearch/1.1/">
<title>Alfresco Person Search: ${search.searchTerms}</title>
<link rel="stylesheet" href="/alfresco/css/main.css" TYPE="text/css">
<link rel="search" type="application/opensearchdescription+xml" href="${url.serviceContext}/api/search/person/description.xml" title="Alfresco Person Search"/>
<meta name="totalResults" content="${search.totalResults}"/>
<meta name="startIndex" content="${search.startIndex}"/>
<meta name="itemsPerPage" content="${search.itemsPerPage}"/>
</head>
<body>
<table>
<tr>
<td><img src="${url.context}/images/logo/AlfrescoLogo32.png" alt="Alfresco" /></td>
<td><nobr><span class="mainTitle">Alfresco Person Search</span></nobr></td>
</tr>
</table>
<br>
<table>
<tr>
<td>Results <b>${search.startIndex}</b> - <b><#if search.startIndex == 0>0<#else>${search.startIndex + search.totalPageItems - 1}</#if></b> of <b>${search.totalResults}</b> for <b>${search.searchTerms}</b> visible to user <b><#if person??>${person.properties.userName}<#else>unknown</#if>.</b></td>
</tr>
</table>
<br>
<table>
<#list search.results as row>
<tr>
<td><img src="${url.context}${row.assocs[\"cm:avatar\"][0].url}"/></td><td>${row.firstName} ${row.lastName}</td>
</tr>
<tr>
<td></td>
<td><#if row.properties.jobtitle??>${row.properties.jobtitle},</#if>
<#if row.properties.organization??>${row.properties.organization},</#if>
<#if row.properties.location??>${row.properties.location},</#if>
<#--
<#if row.properties.persondescription??>${row.properties.persondescription.content}</#if>
-->
</td>
</tr>
</#list>
</table>
<br>
<table>
<tr>
<td><a href="${scripturl("?q=${search.searchTerms?url}&p=1&c=${search.itemsPerPage}&l=${search.localeId}")}">first</a></td>
<#if search.startPage &gt; 1>
<td><a href="${scripturl("?q=${search.searchTerms?url}&p=${search.startPage - 1}&c=${search.itemsPerPage}&l=${search.localeId}")}">previous</a></td>
</#if>
<td><a href="${scripturl("?q=${search.searchTerms?url}&p=${search.startPage}&c=${search.itemsPerPage}&l=${search.localeId}")}">${search.startPage}</a></td>
<#if search.startPage &lt; search.totalPages>
<td><a href="${scripturl("?q=${search.searchTerms?url}&p=${search.startPage + 1}&c=${search.itemsPerPage}&l=${search.localeId}")}">next</a></td>
</#if>
<td><a href="${scripturl("?q=${search.searchTerms?url}&p=${search.totalPages}&c=${search.itemsPerPage}&l=${search.localeId}")}">last</a></td>
</tr>
</table>
</body>
</html>

View File

@@ -0,0 +1,37 @@
<table>
<tr>
<td>Results <b>${search.startIndex}</b> - <b>${search.startIndex + search.totalPageItems - 1}</b> of <b>${search.totalResults}</b> for <b>${search.searchTerms}</b> visible to user <b><#if person??>${person.properties.userName}<#else>unknown</#if>.</b></td>
</tr>
</table>
<br>
<table>
<#list search.results as row>
<tr>
<td><img src="${url.context}${row.assocs[\"cm:avatar\"][0].url}"/></td><td>${row.firstName} ${row.lastName}</td>
</tr>
<tr>
<td></td>
<td><#if row.properties.jobtitle??>${row.properties.jobtitle},</#if>
<#if row.properties.organization??>${row.properties.organization},</#if>
<#if row.properties.location??>${row.properties.location},</#if>
<#--
<#if row.properties.persondescription??>${row.properties.persondescription.content}</#if>
-->
</td>
</tr>
</#list>
</table>
<br>
<table>
<tr>
<td><a href="${scripturl("?q=${search.searchTerms?url}&p=1&c=${search.itemsPerPage}&l=${search.localeId}")}">first</a></td>
<#if search.startPage &gt; 1>
<td><a href="${scripturl("?q=${search.searchTerms?url}&p=${search.startPage - 1}&c=${search.itemsPerPage}&l=${search.localeId}")}">previous</a></td>
</#if>
<td><a href="${scripturl("?q=${search.searchTerms?url}&p=${search.startPage}&c=${search.itemsPerPage}&l=${search.localeId}")}">${search.startPage}</a></td>
<#if search.startPage &lt; search.totalPages>
<td><a href="${scripturl("?q=${search.searchTerms?url}&p=${search.startPage + 1}&c=${search.itemsPerPage}&l=${search.localeId}")}">next</a></td>
</#if>
<td><a href="${scripturl("?q=${search.searchTerms?url}&p=${search.totalPages}&c=${search.itemsPerPage}&l=${search.localeId}")}">last</a></td>
</tr>
</table>

View File

@@ -0,0 +1,15 @@
(
TYPE:"{http://www.alfresco.org/model/content/1.0}person" AND
(
(
<#list 1..terms?size as i>
d\:content:${terms[i - 1]} <#if (i < terms?size)> OR </#if>
</#list>
)
(
<#list 1..terms?size as i>
d\:text:${terms[i - 1]} <#if (i < terms?size)> OR </#if>
</#list>
)
)
)

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Alfresco Person Search: ${search.searchTerms}</title>
<link>${absurl(scripturl("?q=${search.searchTerms?url}&p=${search.startPage}&c=${search.itemsPerPage}&l=${search.localeId}")?xml)}"</link>
<description>Alfresco Person Search: ${search.searchTerms}</description>
<language>${search.localeId}</language>
<lastBuildDate>${xmldate(date)}</lastBuildDate>
<pubDate>${xmldate(date)}</pubDate>
<generator>Alfresco ${server.edition} v${server.version}</generator>
<image>
<title>Alfresco Search: ${search.searchTerms}</title>
<width>16</width>
<height>16</height>
<url>${absurl(url.context)}/images/logo/AlfrescoLogo16.ico)}</url>
</image>
<opensearch:totalResults>${search.totalResults}</opensearch:totalResults>
<opensearch:startIndex>${search.startIndex}</opensearch:startIndex>
<opensearch:itemsPerPage>${search.itemsPerPage}</opensearch:itemsPerPage>
<opensearch:Query role="request" searchTerms="${search.searchTerms}" startPage="${search.startPage}" count="${search.itemsPerPage}" language="${search.localeId}"/>
<atom:link rel="self" href="${absurl(scripturl("?q=${search.searchTerms?url}&p=${search.startPage}&c=${search.itemsPerPage}&l=${search.localeId}")?xml)}" type="application/atom+xml"/>
<#if search.startPage &gt; 1>
<atom:link rel="first" href="${absurl(scripturl("?q=${search.searchTerms?url}&p=1&c=${search.itemsPerPage}&l=${search.localeId}")?xml)}" type="application/atom+xml"/>
<atom:link rel="previous" href="${absurl(scripturl("?q=${search.searchTerms?url}&p=${search.startPage - 1}&c=${search.itemsPerPage}&l=${search.localeId}")?xml)}" type="application/atom+xml"/>
</#if>
<#if search.startPage &lt; search.totalPages>
<atom:link rel="next" href="${absurl(scripturl("?q=${search.searchTerms?url}&p=${search.startPage + 1}&c=${search.itemsPerPage}&l=${search.localeId}")?xml)}" type="application/atom+xml"/>
<atom:link rel="last" href="${absurl(scripturl("?q=${search.searchTerms?url}&p=${search.totalPages}&c=${search.itemsPerPage}&l=${search.localeId}")?xml)}" type="application/atom+xml"/>
</#if>
<atom:link rel="search" type="application/opensearchdescription+xml" href="${absurl(url.serviceContext)}/api/search/person/description.xml"/>
<#list search.results as row>
<item>
<title>${row.firstName} ${row.lastName}</title>
<link>${absurl(url.serviceContext)}</link>
<description><#if row.properties.jobtitle??>${row.properties.jobtitle},</#if>
<#if row.properties.organization??>${row.properties.organization},</#if>
<#if row.properties.location??>${row.properties.location},</#if>
<#--
<#if row.properties.persondescription??>${row.properties.persondescription.content}</#if>
-->
</description>
<pubDate>${xmldate(row.properties.modified)}</pubDate>
<guid isPermaLink="false">${row.id}</guid>
</item>
</#list>
</channel>
</rss>

View File

@@ -0,0 +1,7 @@
<webscript>
<shortname>Person Search Description</shortname>
<description>OpenSearch description document for Alfresco Repository person search</description>
<url>/api/search/person/description.xml</url>
<url>/search/person/description.xml</url>
<format default="opensearchdescription">argument</format>
</webscript>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/" xmlns:alf="http://www.alfresco.org">
<ShortName>Alfresco Person Search</ShortName>
<LongName>Alfresco ${server.edition} Person Search ${server.version}</LongName>
<Description>Search Alfresco People using keywords</Description>
<#comment>IE takes first template from list, thus html response is listed first</#comment>
<Url type="text/html" template="${absurl(url.serviceContext)}/api/search/person?q={searchTerms}&amp;p={startPage?}&amp;c={count?}&amp;l={language?}&amp;guest={alf:guest?}"/>
<Url type="application/atom+xml" template="${absurl(url.serviceContext)}/api/search/person.atom?q={searchTerms}&amp;p={startPage?}&amp;c={count?}&amp;l={language?}&amp;guest={alf:guest?}"/>
<Url type="application/rss+xml" template="${absurl(url.serviceContext)}/api/search/person.rss?q={searchTerms}&amp;p={startPage?}&amp;c={count?}&amp;l={language?}&amp;guest={alf:guest?}"/>
<Image height="16" width="16" type="image/x-icon">${absurl(url.context)}/images/logo/AlfrescoLogo16.ico</Image>
</OpenSearchDescription>

View File

@@ -178,6 +178,13 @@
<property name="repositoryImageResolver" ref="webscripts.repo.imageresolver" />
</bean>
<!-- Alfresco Web Client Person Search (OpenSearch) -->
<bean id="webscript.org.alfresco.repository.search.personsearch.get" class="org.alfresco.repo.web.scripts.bean.KeywordSearch" parent="webscript">
<property name="searchService" ref="SearchService" />
<property name="serviceRegistry" ref="ServiceRegistry" />
<property name="repositoryImageResolver" ref="webscripts.repo.imageresolver" />
</bean>
<!-- Alfresco (OpenSearch) Proxy -->
<bean id="webscript.org.alfresco.repository.search.searchproxy.get" class="org.alfresco.repo.web.scripts.bean.SearchProxy" parent="webscript">
<property name="configService" ref="webscripts.config" />

View File

@@ -39,6 +39,21 @@
</url>
</engine>
<engine label-id="current_repo_people" label="Alfresco Person Search">
<url type="application/opensearchdescription+xml">
/api/search/person/description.xml
</url>
<url type="application/atom+xml">
/api/search/person.atom?q={searchTerms}&amp;p={startPage?}&amp;c={count?}&amp;l={language?}&amp;guest={alf:guest?}
</url>
<url type="application/rss+xml">
/api/search/person.rss?q={searchTerms}&amp;p={startPage?}&amp;c={count?}&amp;l={language?}&amp;guest={alf:guest?}
</url>
<url type="text/html">
/api/search/person?q={searchTerms}&amp;p={startPage?}&amp;c={count?}&amp;l={language?}&amp;guest={alf:guest?}
</url>
</engine>
</engines>
<proxy>