Skip to content

Instantly share code, notes, and snippets.

@vmassol
Created October 31, 2011 18:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vmassol/1328284 to your computer and use it in GitHub Desktop.
Save vmassol/1328284 to your computer and use it in GitHub Desktop.
JSON Generation for External Links
{{velocity}}
#if("$!{request.xpage}" == 'plain')
$response.setContentType('application/json')
#end
##==============================
## Offset = item # at which to start displaying data
##==============================
#set($offset = $util.parseInt($request.get('offset')))
## offset starts from 0 in velocity and 1 in javascript
#set($offset = $offset - 1)
#if($offset < 0)
#set($offset = 0)
#end
##==================
## Limit = # of items to display
##==================
#set($limit = $util.parseInt($request.get('limit')))
##==================
## Tag = one parameter per tag
##==================
#if($request.tag)
#foreach($tag in $request.getParameterValues('tag'))
## TODO: Add code to filter items based on the selected tags
#end
#end
##==========
## Sort direction
##==========
#set($order = "$!request.sort")
#if($order != '')
#set($orderDirection = "$!{request.get('dir').toLowerCase()}")
#if("$!orderDirection" != '' && "$!orderDirection" != 'asc')
#set($orderDirection = 'desc')
#end
#end
## ===========
## Filter Data here...
## ===========
## TODO: Add code to filter data
## Each column can be filtered and the filter for a column can be retrieved with:
## #set($filterValue = "$!{request.get(<columnname>)}")
#set ($states = $services.linkchecker.getLinkStates())
##====================================
## Step1: Transform Map into list, one list item per link/page
##====================================
#set ($stateList = [])
#foreach ($link in $states.keySet())
#set ($pages = $states.get($link))
#foreach ($page in $pages.keySet())
#set ($tmpMap = {})
#set ($dummy = $tmpMap.put("link", $link))
#set ($dummy = $tmpMap.put("page", $page))
#set ($dummy = $tmpMap.put("code", $pages.get($page).getResponseCode()))
#set ($dummy = $tmpMap.put("date", $datetool.format($pages.get($page).getLastCheckedTime())))
#set ($dummy = $stateList.add($tmpMap))
#end
#end
##============
## Step2: Filter the list
##============
#set ($filteredList = [])
#set ($linkFilter = "$!{request.get('link')}")
#set ($pageFilter = "$!{request.get('page')}")
#set ($codeFilter = "$!{request.get('code')}")
#set ($dateFilter = "$!{request.get('date')}")
#foreach ($entry in $stateList)
#set ($codeString = "$entry.get('code')")
#if ($codeFilter.startsWith("!") && $codeFilter.length() > 1)
#set ($codeMatch = !$codeString.contains($codeFilter.substring(1)))
#else
#set ($codeMatch = $codeString.contains($codeFilter))
#end
#if ($entry.get("link").contains($linkFilter) && $entry.get("page").contains($pageFilter) && $codeMatch && $entry.get("date").contains($dateFilter))
#set ($dummy = $filteredList.add($entry))
#end
#end
##===================
## Step3: Handle offset and limit
##===================
#set ($added = 0)
#set ($resultList = [])
#if ($offset < $filteredList.size())
#set ($toIndex = $mathtool.min($mathtool.add($offset, $limit), $filteredList.size()))
#set ($resultList = $filteredList.subList($offset, $toIndex))
#end
## ===
## JSON
## ===
{
"totalrows": $filteredList.size(),
"matchingtags": {},
"tags" : [],
"returnedrows": ${resultList.size()},
"offset": $mathtool.add($offset, 1),
"reqNo": $util.parseInt($request.reqNo),
"rows": [
#foreach ($entry in $resultList)
#if($velocityCount > 1) , #end
{
"doc_viewable" : true,
#set ($url = $entry.get('link'))
#set ($linkHTML = "<a href='$url'>$entry.get('link')</a>")
"link" : "$escapetool.javascript($linkHTML)",
#set ($url = $xwiki.getURL($entry.get('page')))
#set ($pageHTML = "<a href='$url'>$entry.get('page')</a>")
"page" : "$escapetool.javascript($pageHTML)",
"code" : "$escapetool.javascript($entry.get("code"))",
"date" : "$escapetool.javascript($entry.get("date"))"
}
#end
]
}
{{/velocity}}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment