/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/rwiki/trunk/rwiki-impl/impl/src/java/uk/ac/cam/caret/sakai/rwiki/component/service/impl/RWikiEntityContentProducer.java $ * $Id: RWikiEntityContentProducer.java 71388 2010-01-12 09:46:27Z david.horwitz@uct.ac.za $ *********************************************************************************** * * Copyright (c) 2003, 2004, 2005, 2006 The Sakai Foundation. * * Licensed under the Educational Community License, Version 1.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.opensource.org/licenses/ecl1.php * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **********************************************************************************/ package uk.ac.cam.caret.sakai.rwiki.component.service.impl; import java.io.Reader; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.sakaiproject.component.api.ComponentManager; import org.sakaiproject.component.cover.ServerConfigurationService; import org.sakaiproject.entity.api.Entity; import org.sakaiproject.entity.api.EntityManager; import org.sakaiproject.entity.api.EntityProducer; import org.sakaiproject.entity.api.Reference; import org.sakaiproject.event.api.Event; import org.sakaiproject.search.api.EntityContentProducer; import org.sakaiproject.search.api.SearchIndexBuilder; import org.sakaiproject.search.api.SearchService; import org.sakaiproject.search.api.SearchUtils; import org.sakaiproject.search.model.SearchBuilderItem; import org.sakaiproject.search.util.HTMLParser; import uk.ac.cam.caret.sakai.rwiki.service.api.RWikiObjectService; import uk.ac.cam.caret.sakai.rwiki.service.api.RenderService; import uk.ac.cam.caret.sakai.rwiki.service.api.model.RWikiEntity; import uk.ac.cam.caret.sakai.rwiki.service.api.model.RWikiObject; import uk.ac.cam.caret.sakai.rwiki.utils.NameHelper; public class RWikiEntityContentProducer implements EntityContentProducer { private static Log log = LogFactory.getLog(RWikiEntityContentProducer.class); private RenderService renderService = null; private RWikiObjectService objectService = null; private SearchService searchService = null; private SearchIndexBuilder searchIndexBuilder = null; private EntityManager entityManager = null; public void init() { try { ComponentManager cm = org.sakaiproject.component.cover.ComponentManager .getInstance(); renderService = (RenderService) load(cm, RenderService.class.getName()); objectService = (RWikiObjectService) load(cm, RWikiObjectService.class .getName()); searchService = (SearchService) load(cm, SearchService.class.getName()); searchIndexBuilder = (SearchIndexBuilder) load(cm, SearchIndexBuilder.class .getName()); entityManager = (EntityManager) load(cm, EntityManager.class.getName()); if ( "true".equals(ServerConfigurationService.getString( "search.enable", "false"))) { searchService.registerFunction(RWikiObjectService.EVENT_RESOURCE_ADD); searchService.registerFunction(RWikiObjectService.EVENT_RESOURCE_WRITE); searchIndexBuilder.registerEntityContentProducer(this); } } catch (Throwable t) { log.error("Failed to init ", t); } } private Object load(ComponentManager cm, String name) { Object o = cm.get(name); if (o == null) { log.error("Cant find Spring component named " + name); } return o; } public boolean isContentFromReader(String cr) { return false; } public Reader getContentReader(String reference) { return null; } public String getContent(String reference) { Reference ref = getReference(reference); Entity cr = ref.getEntity(); RWikiEntity rwe = (RWikiEntity) cr; RWikiObject rwo = rwe.getRWikiObject(); String pageName = rwo.getName(); String pageSpace = NameHelper.localizeSpace(pageName, rwo.getRealm()); String renderedPage = renderService.renderPage(rwo, pageSpace, objectService .getComponentPageLinkRender(pageSpace,true)); StringBuilder sb = new StringBuilder(); for (HTMLParser hp = new HTMLParser(renderedPage); hp.hasNext();) { SearchUtils.appendCleanString(hp.next(), sb); } String r = sb.toString(); if (log.isDebugEnabled()) { log.debug("Wiki.getContent:" + reference + ":" + r); } return r; } public String getTitle(String reference) { Reference ref = getReference(reference); Entity cr = ref.getEntity(); RWikiEntity rwe = (RWikiEntity) cr; RWikiObject rwo = rwe.getRWikiObject(); String r = SearchUtils.appendCleanString(rwo.getName(), null).toString(); if (log.isDebugEnabled()) { log.debug("Wiki.getTitle:" + reference + ":" + r); } return r; } public boolean matches(String reference) { try { Reference ref = getReference(reference); EntityProducer ep = ref.getEntityProducer(); return (ep instanceof RWikiObjectService); } catch (Exception ex) { return false; } } public List getAllContent() { List allPages = objectService.findAllPageNames(); List l = new ArrayList(); for (Iterator i = allPages.iterator(); i.hasNext();) { String pageName = (String) i.next(); String reference = objectService.createReference(pageName); l.add(reference); } return l; } public Integer getAction(Event event) { String eventName = event.getEvent(); if (RWikiObjectService.EVENT_RESOURCE_ADD.equals(eventName) || RWikiObjectService.EVENT_RESOURCE_WRITE.equals(eventName)) { return SearchBuilderItem.ACTION_ADD; } if (RWikiObjectService.EVENT_RESOURCE_REMOVE.equals(eventName)) { return SearchBuilderItem.ACTION_DELETE; } return SearchBuilderItem.ACTION_UNKNOWN; } public boolean matches(Event event) { return !SearchBuilderItem.ACTION_UNKNOWN.equals(getAction(event)); } public String getTool() { return "wiki"; } public String getUrl(String reference) { Reference ref = getReference(reference); return ref.getUrl() + "html"; } private String getSiteId(Reference ref) { String context = ref.getContext(); if (context.startsWith("/site/")) { context = context.substring("/site/".length()); } if (context.startsWith("/")) { context = context.substring(1); } int slash = context.indexOf("/"); if (slash > 0) { context = context.substring(0, slash); } if (log.isDebugEnabled()) { log.debug("Wiki.getSiteId" + ref + ":" + context); } return context; } public String getSiteId(String resourceName) { String r = getSiteId(entityManager.newReference(resourceName)); if (log.isDebugEnabled()) { log.debug("Wiki.getSiteId" + resourceName + ":" + r); } return r; } public List getSiteContent(String context) { List allPages = objectService.findRWikiSubPages("/site/" + context); List l = new ArrayList(); for (Iterator i = allPages.iterator(); i.hasNext();) { RWikiObject page = (RWikiObject) i.next(); String reference = objectService.createReference(page.getName()); l.add(reference); } return l; } public Iterator getSiteContentIterator(String context) { List<RWikiObject> allPages = objectService.findRWikiSubPages("/site/" + context); final Iterator<RWikiObject> allPagesIterator = allPages.iterator(); return new Iterator() { public boolean hasNext() { return allPagesIterator.hasNext(); } public Object next() { RWikiObject page = (RWikiObject) allPagesIterator.next(); return objectService.createReference(page.getName()); } public void remove() { throw new UnsupportedOperationException("Remove not supported"); } }; } public boolean isForIndex(String reference) { try { Reference ref = getReference(reference); RWikiEntity rwe = (RWikiEntity) ref.getEntity(); RWikiObject rwo = rwe.getRWikiObject(); String pageName = rwo.getName(); String pageSpace = NameHelper.localizeSpace(pageName, rwo.getRealm()); if (objectService.exists(pageName, pageSpace)) { return true; } } catch (Exception ex) { } return false; } public boolean canRead(String reference) { try { Reference ref = getReference(reference); RWikiEntity rwe = (RWikiEntity) ref.getEntity(); RWikiObject rwo = rwe.getRWikiObject(); return objectService.checkRead(rwo); } catch (Exception ex) { } return false; } public Map getCustomProperties(String ref) { return null; } public String getCustomRDF(String ref) { return null; } private Reference getReference(String reference) { try { Reference r = entityManager.newReference(reference); if (log.isDebugEnabled()) { log.debug("Wiki.getReference:" + reference + ":" + r); } return r; } catch (Exception ex) { } return null; } private EntityProducer getProducer(Reference ref) { try { return ref.getEntityProducer(); } catch (Exception ex) { } return null; } /* * (non-Javadoc) * * @see org.sakaiproject.search.api.EntityContentProducer#getId(java.lang.String) */ public String getId(String reference) { try { String r = getReference(reference).getId(); if (log.isDebugEnabled()) { log.debug("Wiki.getId:" + reference + ":" + r); } return r; } catch (Exception ex) { return ""; } } /* * (non-Javadoc) * * @see org.sakaiproject.search.api.EntityContentProducer#getSubType(java.lang.String) */ public String getSubType(String reference) { try { String r = getReference(reference).getSubType(); if (log.isDebugEnabled()) { log.debug("Wiki.getSubType:" + reference + ":" + r); } return r; } catch (Exception ex) { return ""; } } /* * (non-Javadoc) * * @see org.sakaiproject.search.api.EntityContentProducer#getType(java.lang.String) */ public String getType(String reference) { try { String r = getReference(reference).getType(); if (log.isDebugEnabled()) { log.debug("Wiki.getType:" + reference + ":" + r); } return r; } catch (Exception ex) { return ""; } } /* * (non-Javadoc) * * @see org.sakaiproject.search.api.EntityContentProducer#getType(java.lang.String) */ public String getContainer(String reference) { try { String r = getReference(reference).getContainer(); if (log.isDebugEnabled()) { log.debug("Wiki.getContainer:" + reference + ":" + r); } return r; } catch (Exception ex) { return ""; } } }