Übernahme von categorised forum von Chris Gilbert aus dem contributed Zweig

(wsx - West Sussex)

Damit wird es möglich, ein Forum auch in den Navigationsbaum einzuhängen, 
nicht nur als Adresse unterhalb von /portal/.

Compiliert im Moment noch nicht, da noch Abhängigkeiten zu ccm-ldn-aplaws
aufgelöst werden  müssen.



git-svn-id: https://svn.libreccm.org/ccm/trunk@450 8810af33-2d31-482b-a856-94f89814c4df
master
pb 2010-06-04 07:16:25 +00:00
parent 0cc588cb7f
commit 60bd82ae63
15 changed files with 1067 additions and 0 deletions

View File

@ -0,0 +1,31 @@
<?xml version="1.0"?>
<ccm:application xmlns:ccm="http://ccm.redhat.com/ccm-project"
name="ccm-forum-categorised"
prettyName="Forum Categorised Extension"
version="6.5.0"
release="1"
webapp="ROOT">
<ccm:dependencies>
<ccm:requires name="ccm-core" version="6.6.0" relation="ge"/>
<ccm:requires name="ccm-forum" version="6.4.0" relation="ge"/>
<ccm:requires name="ccm-ldn-navigation" version="6.4.0" relation="ge"/>
<ccm:requires name="ccm-ldn-terms" version="6.4.0" relation="ge"/>
<!-- <ccm:requires name="ccm-ldn-aplaws" version="6.4.0" relation="ge"/> -->
</ccm:dependencies>
<ccm:directories>
<ccm:directory name="src"/>
</ccm:directories>
<ccm:contacts>
<ccm:contact uri="http://www.redhat.com/software/rhea" type="website"/>
<ccm:contact uri="mailto:rhea@redhat.com" type="support"/>
</ccm:contacts>
<ccm:description>
The Red Hat Web Application Framework is a platform for writing
database-backed web applications in Java.
</ccm:description>
</ccm:application>

View File

@ -0,0 +1,10 @@
<load>
<requires>
<table name="inits"/>
<table name="acs_objects"/>
</requires>
<provides>
<initializer class="com.arsdigita.categorisedforum.Initializer"/>
</provides>
</load>

View File

@ -0,0 +1,12 @@
<upgrade>
<version from="1.4.2" to="1.4.3">
<script sql="ccm-forum/upgrade/::database::-1.4.2-1.4.3.sql"/>
</version>
<version from="1.4.3" to="1.4.4">
<script sql="ccm-forum/upgrade/::database::-1.4.3-1.4.4.sql"/>
</version>
<version from="1.4.4" to="1.4.5">
<script sql="ccm-forum/upgrade/::database::-1.4.4-1.4.5.sql"/>
</version>
</upgrade>

View File

@ -0,0 +1,113 @@
/*
* Created on 09-Feb-06
*
* To change the template for this generated file go to
* Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
*/
package com.arsdigita.categorisedforum;
import java.math.BigDecimal;
import org.apache.log4j.Logger;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.SimpleComponent;
import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.bebop.event.ActionEvent;
import com.arsdigita.bebop.event.ActionListener;
import com.arsdigita.bebop.parameters.BigDecimalParameter;
import com.arsdigita.bebop.parameters.StringParameter;
import com.arsdigita.categorization.ui.ACSObjectCategoryForm;
import com.arsdigita.categorization.ui.ACSObjectCategorySummary;
import com.arsdigita.forum.ui.Constants;
import com.arsdigita.web.RedirectSignal;
/**
* @author cgyg9330
*
* To change the template for this generated type comment go to
* Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
*/
public class AssignCategoryView extends SimpleContainer implements Constants {
private ACSObjectCategorySummary m_summary;
private SimpleComponent m_add;
private BigDecimalParameter m_root;
private StringParameter m_mode;
Logger s_log = Logger.getLogger(AssignCategoryView.class);
public AssignCategoryView() {
super();
m_root = new BigDecimalParameter("root");
m_mode = new StringParameter("mode");
m_summary = new ForumCategorySummary();
s_log.debug("m_summary in the constructor is : " + m_summary.toString());
m_summary.registerAction(ACSObjectCategorySummary.ACTION_ADD,
new AddActionListener("plain"));
m_summary.registerAction(ACSObjectCategorySummary.ACTION_ADD_JS,
new AddActionListener("javascript"));
m_add = new ForumTermPicker(m_root, m_mode);
m_add.addCompletionListener(new ResetListener());
add(m_summary);
add(m_add);
}
public void register(Page p) {
super.register(p);
p.setVisibleDefault(m_add, false);
p.addGlobalStateParam(m_root);
p.addGlobalStateParam(m_mode);
}
public void reset(PageState state) {
state.setValue(m_root, null);
state.setValue(m_mode, null);
m_summary.setVisible(state, true);
m_add.setVisible(state, false);
}
private class AddActionListener implements ActionListener {
private String m_mode;
public AddActionListener(String mode) {
m_mode = mode;
}
public void actionPerformed(ActionEvent e) {
PageState state = e.getPageState();
state.setValue(m_root,
new BigDecimal(state.getControlEventValue()));
state.setValue(AssignCategoryView.this.m_mode,
m_mode);
s_log.debug("m_summary in the action perform is : " + m_summary.toString());
m_summary.setVisible(state, false);
m_add.setVisible(state, true);
}
}
private class ResetListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
PageState state = e.getPageState();
reset(state);
throw new RedirectSignal(state.toURL(), true);
}
}/**
*
*/
}

View File

@ -0,0 +1,80 @@
/*
* Created on 09-Feb-06
*
* To change the template for this generated file go to
* Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
*/
package com.arsdigita.categorisedforum;
import javax.servlet.ServletException;
import com.arsdigita.bebop.PageState;
import com.arsdigita.forum.Forum;
import com.arsdigita.forum.ForumContext;
import com.arsdigita.forum.ui.ForumComponent;
import com.arsdigita.kernel.Kernel;
import com.arsdigita.kernel.Party;
import com.arsdigita.kernel.permissions.PermissionDescriptor;
import com.arsdigita.kernel.permissions.PermissionService;
import com.arsdigita.kernel.permissions.PrivilegeDescriptor;
import com.arsdigita.kernel.security.UserContext;
import com.arsdigita.xml.Element;
/**
* @author cgyg9330
*
* To change the template for this generated type comment go to
* Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
*/
public class CategorisedForumComponent extends ForumComponent {
public static final String MODE_CATEGORIES = "categories";
private AssignCategoryView m_categoryView;
/**
*
*/
public CategorisedForumComponent() {
super();
m_categoryView = new AssignCategoryView();
add(m_categoryView);
// TODO Auto-generated constructor stub
}
protected void setVisible(
PageState state,
Party party,
Forum forum,
String mode) {
PermissionDescriptor forumAdmin =
new PermissionDescriptor(PrivilegeDescriptor.ADMIN, forum, party);
if (MODE_CATEGORIES.equals(mode)) {
if (party == null) {
UserContext.redirectToLoginPage(state.getRequest());
}
PermissionService.assertPermission(forumAdmin);
setVisibleComponent(state, m_categoryView);
} else {
super.setVisible(state, party, forum, mode);
}
}
protected void generateModes(
PageState state,
Element content,
Party party,
Forum forum) {
super.generateModes(state, content, party, forum);
PermissionDescriptor permission =
new PermissionDescriptor(PrivilegeDescriptor.ADMIN, forum, party);
if (PermissionService.checkPermission(permission)) {
generateModeXML(state, content, MODE_CATEGORIES);
}
}
}

View File

@ -0,0 +1,46 @@
/*
* Created on 09-Feb-06
*
* To change the template for this generated file go to
* Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
*/
package com.arsdigita.categorisedforum;
import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.parameters.ParameterModel;
import com.arsdigita.forum.Forum;
import com.arsdigita.forum.ForumContext;
import com.arsdigita.forum.ForumPageBuilder;
import com.arsdigita.forum.ui.ForumComponent;
import com.arsdigita.kernel.ACSObject;
import com.arsdigita.london.navigation.ui.category.Menu;
import com.arsdigita.london.navigation.ui.category.Path;
/**
* @author cgyg9330
*
* To change the template for this generated type comment go to
* Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
*/
public class CategorisedForumPageBuilder extends ForumPageBuilder {
public Page buildPage() {
Page page = super.buildPage();
Path path = new Path();
path.setModel(new ForumNavigationModel());
page.add(path);
page.add(new Menu());
return page;
}
protected ForumComponent getForumComponent() {
return new CategorisedForumComponent();
}
}

View File

@ -0,0 +1,38 @@
/*
* Created on 09-Feb-06
*
* To change the template for this generated file go to
* Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
*/
package com.arsdigita.categorisedforum;
import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.parameters.ParameterModel;
import com.arsdigita.forum.ForumPageBuilder;
import com.arsdigita.forum.ThreadPageBuilder;
import com.arsdigita.london.navigation.ui.category.Menu;
import com.arsdigita.london.navigation.ui.category.Path;
/**
* @author cgyg9330
*
* To change the template for this generated type comment go to
* Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
*/
public class CategorisedThreadPageBuilder extends ThreadPageBuilder {
public Page buildPage() {
Page page = super.buildPage();
Path path = new Path();
path.setModel(new ForumNavigationModel());
page.add(path);
page.add(new Menu());
return page;
}
}

View File

@ -0,0 +1,44 @@
/*
* Created on 09-Feb-06
*
* To change the template for this generated file go to
* Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
*/
package com.arsdigita.categorisedforum;
import com.arsdigita.aplaws.ui.CategorySubtree;
import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.parameters.ParameterModel;
import com.arsdigita.cms.ui.authoring.EmptyPage;
import com.arsdigita.forum.ForumPageBuilder;
import com.arsdigita.forum.PageBuilder;
import com.arsdigita.forum.ThreadPageBuilder;
import com.arsdigita.london.navigation.ui.category.Menu;
import com.arsdigita.london.navigation.ui.category.Path;
/**
* @author cgyg9330
*
* Used by Ajax to generate branch of tree
*/
public class CategorySubtreePageBuilder implements PageBuilder {
public Page buildPage() {
//
// the title of the page is important because we use the xsl in ccm-ldn-aplaws
// web/__ccm__/themes/aplaws/category-step.xsl that refers to it. This
// matches the page defined in ccm-ldn-aplaws/web/packages/content-section/www/admin/load-cat.jsp
Page page = new EmptyPage();
page.setTitle("childCategories");
page.add(new CategorySubtree());
return page;
}
}

View File

@ -0,0 +1,60 @@
/*
* Created on 22-Feb-06
*
* To change the template for this generated file go to
* Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
*/
package com.arsdigita.categorisedforum;
import com.arsdigita.bebop.PageState;
import com.arsdigita.categorization.Category;
import com.arsdigita.categorization.RootCategoryCollection;
import com.arsdigita.categorization.ui.ACSObjectCategorySummary;
import com.arsdigita.forum.Forum;
import com.arsdigita.forum.ForumContext;
import com.arsdigita.forum.ui.Constants;
import com.arsdigita.kernel.ACSObject;
/**
* @author cgyg9330
*
* To change the template for this generated type comment go to
* Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
*/
public class ForumCategorySummary extends ACSObjectCategorySummary implements Constants {
protected ACSObject getObject(PageState state) {
return ForumContext.getContext(state).getForum();
}
/* (non-Javadoc)
* @see com.arsdigita.categorization.ui.ACSObjectCategorySummary#getXMLPrefix()
*/
protected String getXMLPrefix() {
return "forum";
}
/* (non-Javadoc)
* @see com.arsdigita.categorization.ui.ACSObjectCategorySummary#getXMLNameSpace()
*/
protected String getXMLNameSpace() {
return FORUM_XML_NS;
}
/**
* retrieve any domains that are mapped to this forum. If there are none,
* retrieve domains mapped to the parent application (eg ccm/portal)
* @see com.arsdigita.categorization.ui.ACSObjectCategorySummary#getRootCategories()
*/
protected RootCategoryCollection getRootCategories(PageState state) {
Forum forum = ForumContext.getContext(state).getForum();
RootCategoryCollection roots = Category.getRootCategories(forum);
if (roots.size() == 0) {
// forum has no domains - check if parent application has, and use those
roots = Category.getRootCategories(forum.getParentApplication());
}
return roots;
}
}

View File

@ -0,0 +1,66 @@
/*
* Created on 04-Aug-05
*
* To change the template for this generated file go to
* Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
*/
package com.arsdigita.categorisedforum;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import com.arsdigita.categorization.CategorizedObject;
import com.arsdigita.categorization.Category;
import com.arsdigita.categorization.CategoryCollection;
import com.arsdigita.domain.DomainCollection;
import com.arsdigita.kernel.ACSObject;
import com.arsdigita.kernel.Kernel;
import com.arsdigita.london.navigation.CookieNavigationModel;
import com.arsdigita.london.navigation.GenericNavigationModel;
import com.arsdigita.london.terms.Domain;
import com.arsdigita.london.terms.Term;
import com.arsdigita.london.terms.Util;
import com.arsdigita.web.Application;
/**
* @author cgyg9330
*
* Navigation model that retrieves the path to one navigation category that the forum is allocated to
* if there is no cookie available
*/
public class ForumNavigationModel extends CookieNavigationModel {
protected ACSObject getCategorisedObject() {
return Kernel.getContext().getResource();
}
protected Category[] getAlternativePath(boolean cookieExists) {
Application forum = (Application)Kernel.getContext().getResource();
//Category defaultCat = new CategorizedObject(forum).getDefaultParentCategory();
Domain navigation = Util.getApplicationDomain(Application.retrieveApplicationForPath("/navigation/"));
DomainCollection forumNavigationTerms = navigation.getDirectTerms(forum);
Category cat = null;
if (forumNavigationTerms.next()) {
cat = ((Term) forumNavigationTerms.getDomainObject()).getModel();
forumNavigationTerms.close();
}
if (cat == null) {
return new Category[]{ getRootCategory() };
}
List path = new ArrayList();
CategoryCollection cats = cat.getDefaultAscendants();
cats.addOrder("defaultAncestors");
while (cats.next()) {
path.add(cats.getDomainObject());
}
return (Category[]) path.toArray(new Category[(int) path.size()]);
}
}

View File

@ -0,0 +1,54 @@
/*
* Copyright (C) 2004 Red Hat Inc. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.categorisedforum;
import org.apache.log4j.Logger;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.form.Widget;
import com.arsdigita.bebop.parameters.BigDecimalParameter;
import com.arsdigita.bebop.parameters.StringParameter;
import com.arsdigita.categorization.ui.ACSObjectCategoryForm;
import com.arsdigita.forum.ForumContext;
import com.arsdigita.kernel.ACSObject;
public class ForumTermForm extends ACSObjectCategoryForm {
private static Logger s_log = Logger.getLogger(ForumTermForm.class);
public ForumTermForm(BigDecimalParameter root, StringParameter mode, Widget widget) {
super(root, mode, widget);
s_log.debug("creating new ForumTerm Form with widget " + widget);
}
/* (non-Javadoc)
* @see com.arsdigita.categorization.ui.ACSObjectCategoryForm#getObject()
*/
protected ACSObject getObject(PageState state) {
return ForumContext.getContext(state).getForum();
}
}

View File

@ -0,0 +1,64 @@
/*
* Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package com.arsdigita.categorisedforum;
import org.apache.log4j.Logger;
import com.arsdigita.aplaws.ui.ACSObjectCategoryPicker;
import com.arsdigita.aplaws.ui.TermWidget;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.parameters.BigDecimalParameter;
import com.arsdigita.bebop.parameters.StringParameter;
import com.arsdigita.categorization.ui.ACSObjectCategoryForm;
import com.arsdigita.forum.ForumContext;
import com.arsdigita.kernel.ACSObject;
public class ForumTermPicker extends ACSObjectCategoryPicker {
private static final Logger s_log = Logger.getLogger(ForumTermPicker.class);
public ForumTermPicker(BigDecimalParameter root,
StringParameter mode) {
super(root, mode);
s_log.debug("instantiating ForumCategoryPicker");
}
/* (non-Javadoc)
* @see com.arsdigita.aplaws.ui.ACSObjectCategoryPicker#getForm(com.arsdigita.bebop.parameters.BigDecimalParameter, com.arsdigita.bebop.parameters.StringParameter)
*/
protected ACSObjectCategoryForm getForm(BigDecimalParameter root, StringParameter mode) {
s_log.debug("getForm");
return new ForumTermForm(root, mode, new TermWidget(mode, this));
}
/* (non-Javadoc)
* @see com.arsdigita.aplaws.ui.ACSObjectCategoryPicker#getObject()
*/
protected ACSObject getObject(PageState state) {
return ForumContext.getContext(state).getForum();
}
}

View File

@ -0,0 +1,62 @@
/*
* Copyright (C) 2003-2004 Red Hat Inc. All Rights Reserved.
*
* The contents of this file are subject to the CCM Public
* License (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.redhat.com/licenses/ccmpl.html.
*
* Software distributed under the License is distributed on an
* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express
* or implied. See the License for the specific language
* governing rights and limitations under the License.
*
*/
package com.arsdigita.categorisedforum;
import org.apache.log4j.Logger;
import com.arsdigita.domain.DataObjectNotFoundException;
import com.arsdigita.domain.DomainObjectFactory;
import com.arsdigita.forum.Forum;
import com.arsdigita.kernel.Kernel;
import com.arsdigita.kernel.NoValidURLException;
import com.arsdigita.kernel.URLFinder;
import com.arsdigita.persistence.OID;
import com.arsdigita.web.Application;
import com.arsdigita.web.URL;
public class ForumURLFinder implements URLFinder {
private static final Logger s_log = Logger.getLogger(ForumURLFinder.class);
public String find(OID oid,String context) throws NoValidURLException {
return find(oid);
}
/* (non-Javadoc)
* @see com.arsdigita.kernel.URLFinder#find(com.arsdigita.persistence.OID)
*/
public String find(OID oid) throws NoValidURLException {
Application forum;
try {
forum = (Forum)DomainObjectFactory.newInstance(oid);
} catch (DataObjectNotFoundException ex) {
throw new NoValidURLException(
"cannot instantiate application " + oid +
" message: " + ex.getMessage()
);
}
return URL.getDispatcherPath() + forum.getPath();
}
}

View File

@ -0,0 +1,89 @@
/*
* Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.categorisedforum;
import com.arsdigita.db.DbHelper;
import com.arsdigita.bebop.RequestLocal;
import com.arsdigita.domain.xml.TraversalHandler;
import com.arsdigita.persistence.pdl.ManifestSource;
import com.arsdigita.persistence.pdl.NameFilter;
import com.arsdigita.runtime.CompoundInitializer;
import com.arsdigita.runtime.LegacyInitEvent;
import com.arsdigita.runtime.RuntimeConfig;
import com.arsdigita.runtime.PDLInitializer;
import com.arsdigita.runtime.DomainInitEvent;
import com.arsdigita.xml.XML;
import com.arsdigita.kernel.Group;
import com.arsdigita.kernel.URLFinder;
import com.arsdigita.kernel.URLService;
import com.arsdigita.kernel.NoValidURLException;
import com.arsdigita.kernel.ACSObjectInstantiator;
import com.arsdigita.kernel.ResourceTypeConfig;
import com.arsdigita.kernel.ResourceType;
import com.arsdigita.kernel.ui.ResourceConfigFormSection;
import com.arsdigita.domain.DomainObject;
import com.arsdigita.domain.DataObjectNotFoundException;
import com.arsdigita.domain.DomainObjectFactory;
import com.arsdigita.persistence.DataCollection;
import com.arsdigita.persistence.DataObject;
import com.arsdigita.persistence.OID;
import com.arsdigita.persistence.SessionManager;
import com.arsdigita.web.Application;
import com.arsdigita.messaging.ThreadedMessage;
import com.arsdigita.forum.Forum;
import com.arsdigita.forum.ForumPageFactory;
import com.arsdigita.forum.portlet.RecentPostingsPortlet;
import com.arsdigita.forum.ui.portlet.RecentPostingsPortletEditor;
import com.arsdigita.web.ui.ApplicationConfigFormSection;
import org.apache.log4j.Logger;
/**
* The forum initializer.
*
* @author Justin Ross &lt;jross@redhat.com&gt;
* @version $Id: Initializer.java,v 1.1 2006/03/03 10:54:45 cgyg9330 Exp $
*/
public class Initializer extends CompoundInitializer {
public final static String versionId =
"$Id: Initializer.java,v 1.1 2006/03/03 10:54:45 cgyg9330 Exp $" +
"$Author: cgyg9330 $" +
"$DateTime: 2004/08/17 23:26:27 $";
private static final Logger s_log = Logger.getLogger(Initializer.class);
public void init(LegacyInitEvent e) {
super.init(e);
ForumPageFactory.registerPageBuilder(ForumPageFactory.FORUM_PAGE, new CategorisedForumPageBuilder());
ForumPageFactory.registerPageBuilder(ForumPageFactory.THREAD_PAGE, new CategorisedThreadPageBuilder());
ForumPageFactory.registerPageBuilder("load-cat.jsp", new CategorySubtreePageBuilder());
URLService.registerFinder(Forum.BASE_DATA_OBJECT_TYPE, new ForumURLFinder());
}
}

View File

@ -0,0 +1,298 @@
ll<xsl:stylesheet xmlns:forum="http://www.arsdigita.com/forum/1.0"
xmlns:bebop="http://www.arsdigita.com/bebop/1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:nav="http://ccm.redhat.com/london/navigation"
xmlns:search="http://rhea.redhat.com/search/1.0"
xmlns:portal="http://www.uk.arsdigita.com/portal/1.0"
xmlns:cms="http://www.arsdigita.com/cms/1.0"
exclude-result-prefixes="xsl bebop nav search portal forum cms"
version="1.0">
<xsl:output method="html" indent="yes"/>
<xsl:import href="../../../../../ROOT/__ccm__/themes/aplaws/category-step.xsl"/>
<xsl:import href="../../../../../ROOT/__ccm__/static/cms/admin/category-step/category-step.xsl"/>
<xsl:template match="forum:categoryStepSummary">
<div class="content">
<h3>Assign Categories</h3>
<br/>
<xsl:for-each select="forum:categoryRoots/forum:categoryRoot">
<xsl:sort select="@name"/>
<xsl:variable name="name">
<xsl:value-of select="@name"/>
</xsl:variable>
<h5><xsl:value-of select="$name"/></h5>
<br/>
<xsl:if test="@addAction">
<script LANGUAGE="JavaScript">
<![CDATA[ <!-- begin script ]]>
<![CDATA[ document.write('<a href="]]><xsl:value-of select="@addJSAction"/><![CDATA["><img src="/assets/action-add.png" border="0"/></a>')]]>
<![CDATA[ document.write("\<!--") ]]>
<![CDATA[ // end script --> ]]>
</script>
<a href="{@addAction}">
<img src="/assets/action-add.png" border="0"/>
</a>
<script LANGUAGE="JavaScript">
<![CDATA[ <!-- begin script ]]>
<![CDATA[ document.write("--\>") ]]>
<![CDATA[ // end script --> ]]>
</script>
<script LANGUAGE="JavaScript">
<![CDATA[ <!-- begin script ]]>
<![CDATA[ document.write('<a href="]]><xsl:value-of select="@addJSAction"/><![CDATA[">Add Categories</a>')]]>
<![CDATA[ document.write("\<!--") ]]>
<![CDATA[ // end script --> ]]>
</script>
<xsl:text>&#160;</xsl:text>
<a href="{@addAction}">
<xsl:text>Add categories</xsl:text>
</a>
<script LANGUAGE="JavaScript">
<![CDATA[ <!-- begin script ]]>
<![CDATA[ document.write("--\>") ]]>
<![CDATA[ // end script --> ]]>
</script>
</xsl:if>
<xsl:choose>
<xsl:when test="count(../../forum:itemCategories/forum:itemCategory[starts-with(@path, $name)]) = 0">
<div>
There are no categories assigned in this context
</div>
</xsl:when>
<xsl:otherwise>
<ul>
<xsl:for-each select="../../forum:itemCategories/forum:itemCategory[starts-with(@path, $name)]">
<xsl:sort select="@path"/>
<li>
<xsl:value-of select="substring(@path, string-length($name) + 5)"/>&#160;
<xsl:if test="@deleteAction">
<a href="{@deleteAction}"><img src="/assets/action-delete.png" border="0"/></a>
<xsl:text>&#160;</xsl:text>
<a href="{@deleteAction}">Remove</a>
</xsl:if>
</li>
</xsl:for-each>
</ul>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</div>
</xsl:template>
<xsl:template match="forum:categoryWidget">
<xsl:choose>
<xsl:when test="@mode = 'javascript'">
<xsl:apply-templates select="." mode="forum:javascript"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="." mode="forum:plain"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="forum:categoryWidget" mode="forum:javascript">
<script language="JavaScript">
<![CDATA[
<!-- Begin hiding
function catToggle(id) {
var elImg = document.getElementById("catTog"+id);
var elChildren = document.getElementById("catCh"+id);
if (elChildren.style.display != "block") {
elChildren.style.display = "block";
elImg.src = "/assets/action-delete.png";
} else {
elChildren.style.display = "none";
elImg.src = "/assets/action-add.png";
}
return true;
}
function catSelect(id, name, node) {
var elWidget = document.getElementById("catWd");
var elWidgetHidden = document.getElementById("catWdHd");
var found = 0;
for (var i = 0 ; i < elWidget.options.length ; i++) {
if (elWidget.options[i].value == id) {
found = 1;
}
}
if (!found) {
var opt = new Option(name, id);
elWidget.options[elWidget.options.length] = opt;
var optHidden = new Option(node, id, false, true);
elWidgetHidden.options[elWidgetHidden.options.length] = optHidden;
}
var elLink = document.getElementById("catLn"+node);
var elName = document.getElementById("catNm"+node);
elLink.style.display="none";
elName.style.display="inline";
return true;
}
function catDeselect() {
var elWidget = document.getElementById("catWd");
var elWidgetHidden = document.getElementById("catWdHd");
var idx = elWidget.selectedIndex;
if (idx != -1) {
//var id = elWidget.options[idx].value;
var node = elWidgetHidden.options[idx].text;
var elLink = document.getElementById("catLn"+node);
var elName = document.getElementById("catNm"+node);
elLink.style.display="inline";
elName.style.display="none";
elWidget.options[idx] = null;
elWidgetHidden.options[idx] = null;
}
return true;
}
// End hiding -->
]]>
</script>
<div>
<xsl:apply-templates select="forum:category[@isEnabled = '1']" mode="forum:javascriptCat">
<xsl:with-param name="expand" select="'block'"/>
</xsl:apply-templates>
</div>
<br/>
<div class="content">
<h4>Selected Categories</h4>
<select id="catWd" size="5" onClick="catDeselect()" style="width: 400px; height=200px">
</select>
<select id="catWdHd" name="{@name}" size="5" multiple="multiple" style="display: none">
</select>
</div>
</xsl:template>
<xsl:template match="forum:category" mode="forum:javascriptCat">
<xsl:param name="expand" select="'none'"/>
<xsl:variable name="linkStyle">
<xsl:choose>
<xsl:when test="@isAbstract != '1' and @isSelected != '1'">
<xsl:value-of select="'inline'"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="'none'"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="nameStyle">
<xsl:choose>
<xsl:when test="@isAbstract != '1' and @isSelected != '1'">
<xsl:value-of select="'none'"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="'inline'"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<div id="catSelf{@pid}">
<div class="content">
<xsl:choose>
<xsl:when test="count(forum:category[@isEnabled = '1']) > 0 and $expand='none'">
<a href="#" onClick="catToggle('{@nodeID}');"><img id="catTog{@nodeID}" src="/assets/action-add.png" width="14" height="14" border="0"/></a>
</xsl:when>
<xsl:when test="count(forum:category[@isEnabled = '1']) > 0 and $expand!='none'">
<a href="#" onClick="catToggle('{@nodeID}');"><img id="catTog{@nodeID}" src="/assets/action-delete.png" width="14" height="14" border="0"/></a>
</xsl:when>
<xsl:otherwise>
<img src="/assets/action-generic.png" width="14" height="14" border="0"/>
</xsl:otherwise>
</xsl:choose>
<a id="catLn{@nodeID}" href="#" style="padding-left: 6px; display: {$linkStyle}">
<xsl:attribute name="onclick">catSelect('<xsl:value-of select="@id"/>', '<xsl:call-template name="escape-apostrophes">
<xsl:with-param name="text" select="@fullname"/>
</xsl:call-template>', '<xsl:value-of select="@nodeID"/>')</xsl:attribute>
<xsl:if test="@description">
<xsl:attribute name="title">
<xsl:value-of select="@description"/>
</xsl:attribute>
</xsl:if>
<xsl:value-of select="@name"/>
</a>
<span id="catNm{@nodeID}" style="padding-left: 6px; display: {$nameStyle}">
<xsl:if test="@description">
<xsl:attribute name="title">
<xsl:value-of select="@description"/>
</xsl:attribute>
</xsl:if>
<xsl:value-of select="@name"/>
</span>
</div>
</div>
<div id="catCh{@nodeID}" style="margin-left: 20px; display: {$expand}">
<xsl:apply-templates select="forum:category[@isEnabled = '1']" mode="forum:javascriptCat">
<xsl:sort data-type="number" select="@sortKey"/>
</xsl:apply-templates>
</div>
</xsl:template>
<xsl:template match="forum:categoryWidget" mode="forum:plain">
<select name="{@name}" size="30" multiple="multiple">
<xsl:apply-templates select="forum:category[position() = 1]/forum:category[@isEnabled = '1' and @isAbstract = '0']" mode="forum:plainCat"/>
</select>
</xsl:template>
<xsl:template match="forum:category" mode="forum:plainCat">
<xsl:if test="@isSelected != '1' and @isAbstract != '1'">
<option value="{@sortKey}"><xsl:value-of select="@fullname"/></option>
</xsl:if>
<xsl:apply-templates select="forum:category[@isEnabled = '1' and @isAbstract = '0']" mode="forum:plainCat">
<xsl:sort data-type="number" select="@sortKey"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template name="escape-apostrophes">
<xsl:param name="text"/>
<xsl:variable name="apostrophe">'</xsl:variable>
<xsl:variable name="escaped-apostrophe">\'</xsl:variable>
<xsl:call-template name="do-replace">
<xsl:with-param name="text" select="$text"/>
<xsl:with-param name="replace" select="$apostrophe"/>
<xsl:with-param name="by" select="$escaped-apostrophe"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="do-replace">
<xsl:param name="text"/>
<xsl:param name="replace"/>
<xsl:param name="by"/>
<xsl:choose>
<xsl:when test="contains($text, $replace)">
<xsl:value-of select="substring-before($text, $replace)"/>
<xsl:value-of select="$by"/>
<xsl:call-template name="do-replace">
<xsl:with-param name="text" select="substring-after($text, $replace)"/>
<xsl:with-param name="replace" select="$replace"/>
<xsl:with-param name="by" select="$by"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!--<xsl:template match="bebop:formAction[@name='category'] ">
<div class="content">
<form action="{@action}" name="{@name}" method="get">
<xsl:apply-templates select="bebop:gridPanel/bebop:formWidget[@type='hidden']" />
<xsl:apply-templates select="bebop:pageState" />
<xsl:apply-templates />
<div class="forumButton">
<xsl:apply-templates select="bebop:boxPanel/bebop:cell/bebop:boxPanel/bebop:cell/bebop:formWidget" />
<br/>
</div>
</form>
</div>
</xsl:template>-->
</xsl:stylesheet>