added the category reference table and some support code to manage it

This commit is contained in:
Eric J. Bowersox 2003-05-26 06:41:46 +00:00
parent 6cf37bfee2
commit 0ffd03e38b
13 changed files with 1486 additions and 0 deletions

View File

@ -165,6 +165,10 @@
<object name="venice-auditor" classname="com.silverwrist.venice.app.StartupShutdownAuditor" priority="100"/>
<object name="categories" classname="com.silverwrist.venice.community.CategoryManager" priority="100"/>
<database connection="data"/>
</object>
<!-- Additional objects for SourceID interface -->
<object name="sso" classname="com.silverwrist.venice.sourceid.FederationManagerObject" priority="20">

View File

@ -164,6 +164,10 @@
<object name="venice-auditor" classname="com.silverwrist.venice.app.StartupShutdownAuditor" priority="100"/>
<object name="categories" classname="com.silverwrist.venice.community.CategoryManager" priority="100"/>
<database connection="data"/>
</object>
<!-- The Venice application layer -->
<application name="venice" classname="com.silverwrist.venice.app.VeniceApplication">
<stylesheet-mappings>

View File

@ -253,6 +253,16 @@ CREATE TABLE menuitems (
PRIMARY KEY (menuid, sequence)
);
# The table mapping category IDs to category names.
CREATE TABLE refcategory (
catid INT NOT NULL PRIMARY KEY,
parent INT NOT NULL,
symlink INT NOT NULL,
name VARCHAR(64) NOT NULL,
dontuse TINYINT DEFAULT 0,
UNIQUE INDEX display (parent, name)
);
##############################################################################
# Set table access rights
##############################################################################
@ -569,6 +579,378 @@ INSERT INTO imagetype (typecode, nsid, name) VALUES
#### following this line is initialization of Venice-specific tables ####
# Populate the Category table.
# Source: Mozilla Open Directory Project categorization system <http://dmoz.org>;
# additional categorization from WebbMe categories
INSERT INTO refcategory (catid, parent, symlink, name) VALUES
(0, -1, -1, 'Unclassified'),
(1, -1, -1, 'Arts'),
(16, 1, -1, 'Animation'),
(17, 1, 181, 'Antiques'),
(18, 1, -1, 'Architecture'),
(19, 1, -1, 'Art History'),
(20, 1, -1, 'Body Art'),
(21, 1, -1, 'Celebrities'),
(22, 1, -1, 'Comics'),
(23, 1, -1, 'Crafts'),
(24, 1, -1, 'Dance'),
(25, 1, -1, 'Design'),
(26, 1, -1, 'Education'),
(27, 1, -1, 'Entertainment'),
(28, 1, -1, 'Graphic Design'),
(29, 1, -1, 'Humanities'),
(30, 1, -1, 'Illustration'),
(31, 1, -1, 'Literature'),
(32, 1, -1, 'Movies'),
(33, 1, -1, 'Music'),
(34, 1, -1, 'Myths and Folktales'),
(35, 1, -1, 'Native and Tribal'),
(36, 1, -1, 'Performing Arts'),
(37, 1, -1, 'Photography'),
(38, 1, -1, 'Radio'),
(39, 1, -1, 'Television'),
(40, 1, -1, 'Theatre'),
(41, 1, -1, 'Typography'),
(42, 1, -1, 'Video'),
(43, 1, -1, 'Visual Arts'),
(44, 1, -1, 'Writing'),
(2, -1, -1, 'Business'),
(45, 2, -1, 'Accounting'),
(46, 2, -1, 'Advertising'),
(47, 2, -1, 'Aerospace'),
(48, 2, -1, 'Agriculture and Forestry'),
(49, 2, -1, 'Apparel'),
(50, 2, -1, 'Arts and Entertainment'),
(51, 2, -1, 'Associations'),
(52, 2, -1, 'Aviation'),
(53, 2, -1, 'Business Services'),
(54, 2, 245, 'Classifieds'),
(55, 2, -1, 'Computers'),
(56, 2, -1, 'Consulting'),
(57, 2, -1, 'Construction and Maintenance'),
(58, 2, -1, 'Electronics'),
(59, 2, -1, 'Employment'),
(60, 2, -1, 'Energy and Utilities'),
(61, 2, -1, 'Environmental and Safety'),
(62, 2, -1, 'Financial Services'),
(63, 2, -1, 'Food and Related Products'),
(64, 2, -1, 'Insurance'),
(65, 2, -1, 'Internet Services'),
(66, 2, -1, 'Investing'),
(67, 2, 290, 'Law'),
(68, 2, -1, 'Management'),
(69, 2, -1, 'Manufacturing'),
(70, 2, -1, 'Marketing'),
(71, 2, -1, 'Mining and Drilling'),
(72, 2, -1, 'Printing'),
(73, 2, -1, 'Publishing'),
(74, 2, -1, 'Real Estate'),
(75, 2, -1, 'Retail'),
(76, 2, -1, 'Security'),
(77, 2, -1, 'Small Business'),
(78, 2, -1, 'Taxes'),
(79, 2, -1, 'Training and Schools'),
(80, 2, -1, 'Telecommunications'),
(81, 2, -1, 'Transportation'),
(82, 2, -1, 'Venture Capital'),
(3, -1, -1, 'Computers'),
(83, 3, -1, 'CAD'),
(84, 3, -1, 'Computer Science'),
(85, 3, -1, 'Consultants'),
(86, 3, -1, 'Data Communications'),
(87, 3, -1, 'Desktop Publishing'),
(88, 3, -1, 'Education'),
(89, 3, -1, 'Ethics'),
(90, 3, -1, 'Fonts'),
(91, 3, 124, 'Games'),
(92, 3, -1, 'Graphics'),
(93, 3, -1, 'Hacking'),
(94, 3, -1, 'Hardware'),
(95, 3, -1, 'History'),
(96, 3, -1, 'Internet'),
(97, 3, -1, 'Multimedia'),
(98, 3, -1, 'Open Source'),
(99, 3, -1, 'Operating Systems'),
(100, 3, -1, 'Programming'),
(101, 3, -1, 'Robotics'),
(102, 3, -1, 'Security'),
(103, 3, -1, 'Shopping'),
(104, 3, -1, 'Software'),
(105, 3, -1, 'Systems'),
(4, -1, -1, 'Games'),
(106, 4, -1, 'Board Games'),
(107, 4, -1, 'Card Games'),
(108, 4, -1, 'Coin-op Games'),
(109, 4, 123, 'Collectible Card Games'),
(110, 4, -1, 'Dice Games'),
(111, 4, 319, 'Fantasy Sports'),
(112, 4, -1, 'Gambling'),
(113, 4, -1, 'Game Creation Systems'),
(114, 4, -1, 'Game Design'),
(115, 4, -1, 'Hand Games'),
(116, 4, -1, 'Internet Games'),
(117, 4, -1, 'Party Games'),
(118, 4, -1, 'Puzzles'),
(119, 4, 270, 'Retailers'),
(120, 4, -1, 'Roleplaying Games'),
(121, 4, 14, 'Sports'),
(122, 4, -1, 'Tile Games'),
(123, 4, -1, 'Trading Cards'),
(124, 4, -1, 'Video Games'),
(125, 4, -1, 'Yard and Deck Games'),
(5, -1, -1, 'Health'),
(126, 5, -1, 'Aging'),
(127, 5, -1, 'Alternative Medicine'),
(128, 5, -1, 'Beauty'),
(129, 5, -1, 'Children''s Health'),
(130, 5, -1, 'Conditions and Diseases'),
(131, 5, -1, 'Dentistry'),
(132, 5, 280, 'Disabilities'),
(133, 5, -1, 'Education'),
(134, 5, -1, 'Fitness'),
(135, 5, 64, 'Health Insurance'),
(136, 5, -1, 'Medicine'),
(137, 5, -1, 'Men''s Health'),
(138, 5, -1, 'Mental Health'),
(139, 5, -1, 'Nursing'),
(140, 5, -1, 'Nutrition'),
(141, 5, -1, 'Occupational Health and Safety'),
(142, 5, -1, 'Pharmacy'),
(143, 5, -1, 'Public Health and Safety'),
(144, 5, -1, 'Reproductive Health'),
(145, 5, -1, 'Seniors'' Health'),
(146, 5, -1, 'Services'),
(147, 5, -1, 'Substance Abuse'),
(148, 5, -1, 'Teen Health'),
(149, 5, -1, 'Women''s Health'),
(6, -1, -1, 'Home'),
(150, 6, -1, 'Apartment Living'),
(151, 6, -1, 'Cooking'),
(152, 6, -1, 'Do-It-Yourself'),
(153, 6, -1, 'Emergency Preparation'),
(154, 6, -1, 'Entertaining'),
(155, 6, -1, 'Family'),
(156, 6, -1, 'Gardens'),
(157, 6, -1, 'Home Improvement'),
(158, 6, -1, 'Homemaking'),
(363, 6, -1, 'Homeowners'),
(159, 6, -1, 'Kids'),
(160, 6, -1, 'Moving and Relocating'),
(161, 6, -1, 'Nursery'),
(162, 6, 207, 'Pets'),
(163, 6, -1, 'Personal Finance'),
(164, 6, -1, 'Personal Organization'),
(165, 6, -1, 'Relatives'),
(166, 6, -1, 'Rural Living'),
(167, 6, 12, 'Shopping'),
(168, 6, -1, 'Urban Living'),
(7, -1, -1, 'News'),
(169, 7, -1, 'Alternative Media'),
(170, 7, -1, 'Columnists'),
(171, 7, -1, 'Current Events'),
(172, 7, -1, 'Magazines'),
(173, 7, -1, 'Media'),
(174, 7, -1, 'Newspapers'),
(175, 7, -1, 'Online'),
(176, 7, -1, 'Politics'),
(177, 7, -1, 'Satire'),
(178, 7, -1, 'Weather'),
(8, -1, -1, 'Recreation'),
(179, 8, -1, 'Air Hockey'),
(180, 8, -1, 'Amateur Radio'),
(181, 8, -1, 'Antiques'),
(182, 8, -1, 'Audio'),
(183, 8, -1, 'Aviation'),
(184, 8, -1, 'Birdwatching'),
(185, 8, -1, 'Boating'),
(186, 8, 310, 'Bowling'),
(187, 8, -1, 'Climbing'),
(188, 8, -1, 'Collecting'),
(189, 8, 23, 'Crafts'),
(190, 8, -1, 'Drugs'),
(191, 8, -1, 'Food and Drink'),
(192, 8, 4, 'Games'),
(193, 8, 156, 'Gardens'),
(194, 8, 285, 'Genealogy'),
(195, 8, -1, 'Guns'),
(196, 8, -1, 'Hot Air Ballooning'),
(197, 8, -1, 'Humor'),
(198, 8, -1, 'Kites'),
(199, 8, -1, 'Knives'),
(200, 8, -1, 'Living History'),
(201, 8, 332, 'Martial Arts'),
(202, 8, -1, 'Models'),
(203, 8, -1, 'Motorcycles'),
(204, 8, -1, 'Nudism'),
(205, 8, -1, 'Outdoors'),
(206, 8, -1, 'Parties'),
(207, 8, -1, 'Pets'),
(208, 8, -1, 'Roads and Highways'),
(209, 8, -1, 'Scouting'),
(210, 8, -1, 'Smoking'),
(211, 8, 14, 'Sports'),
(212, 8, -1, 'Theme Parks'),
(213, 8, -1, 'Trains and Railroads'),
(214, 8, -1, 'Travel'),
(9, -1, -1, 'Reference and Education'),
(215, 9, -1, 'Alumni'),
(216, 9, -1, 'Colleges and Universities'),
(217, 9, -1, 'Continuing Education'),
(218, 9, 79, 'Corporate Training'),
(219, 9, -1, 'Distance Learning'),
(220, 9, -1, 'International'),
(221, 9, -1, 'K through 12'),
(222, 9, -1, 'Libraries'),
(223, 9, -1, 'Museums'),
(224, 9, -1, 'Special Education'),
(225, 9, -1, 'Vocational Education'),
(10, -1, -1, 'Regional'),
(226, 10, -1, 'International'),
(227, 10, -1, 'US'),
(11, -1, -1, 'Science'),
(228, 11, -1, 'Agriculture'),
(229, 11, -1, 'Alternative Science'),
(230, 11, -1, 'Astronomy'),
(231, 11, -1, 'Biology'),
(232, 11, -1, 'Chemistry'),
(233, 11, -1, 'Earth Sciences'),
(234, 11, -1, 'Environment'),
(235, 11, -1, 'Mathematics'),
(236, 11, -1, 'Physics'),
(237, 11, -1, 'Science in Society'),
(238, 11, -1, 'Social Sciences'),
(239, 11, -1, 'Space'),
(240, 11, -1, 'Technology'),
(12, -1, -1, 'Shopping'),
(241, 12, -1, 'Antiques and Collectibles'),
(242, 12, -1, 'Auctions'),
(243, 12, -1, 'Books'),
(244, 12, -1, 'Children'),
(245, 12, -1, 'Classifieds'),
(246, 12, -1, 'Clothing'),
(247, 12, 103, 'Computers'),
(248, 12, -1, 'Consumer Electronics'),
(249, 12, -1, 'Crafts'),
(250, 12, -1, 'Entertainment'),
(251, 12, -1, 'Ethnic and Regional'),
(252, 12, -1, 'Flowers'),
(253, 12, -1, 'Food and Drink'),
(254, 12, -1, 'Furniture'),
(255, 12, -1, 'Gifts'),
(256, 12, -1, 'Health and Beauty'),
(257, 12, -1, 'Holidays'),
(258, 12, -1, 'Home and Garden'),
(259, 12, -1, 'Jewelry'),
(260, 12, -1, 'Music and Video'),
(261, 12, -1, 'Niche'),
(262, 12, -1, 'Office Products'),
(263, 12, -1, 'Pets'),
(264, 12, -1, 'Photography'),
(265, 12, -1, 'Recreation and Hobbies'),
(266, 12, -1, 'Religious'),
(267, 12, -1, 'Sports'),
(268, 12, -1, 'Tobacco'),
(269, 12, -1, 'Tools'),
(270, 12, -1, 'Toys and Games'),
(271, 12, -1, 'Travel'),
(272, 12, -1, 'Vehicles'),
(273, 12, -1, 'Visual Arts'),
(274, 12, -1, 'Weddings'),
(275, 12, -1, 'Wholesale'),
(13, -1, -1, 'Society'),
(276, 13, -1, 'Activism'),
(277, 13, -1, 'Advice'),
(278, 13, -1, 'Crime'),
(279, 13, -1, 'Death'),
(280, 13, -1, 'Disabled'),
(281, 13, -1, 'Ethnicity'),
(282, 13, -1, 'Folklore'),
(283, 13, -1, 'Future'),
(284, 13, -1, 'Gay/Lesbian/Bisexual'),
(285, 13, -1, 'Genealogy'),
(286, 13, -1, 'Government'),
(287, 13, -1, 'History'),
(288, 13, -1, 'Holidays'),
(289, 13, -1, 'Issues'),
(290, 13, -1, 'Law'),
(291, 13, -1, 'Lifestyle Choices'),
(292, 13, -1, 'Military'),
(293, 13, -1, 'Paranormal'),
(294, 13, -1, 'People'),
(295, 13, -1, 'Philosophy'),
(296, 13, -1, 'Politics'),
(297, 13, -1, 'Recovery and Support Groups'),
(298, 13, -1, 'Relationships'),
(299, 13, -1, 'Religion and Spirituality'),
(300, 13, -1, 'Sexuality'),
(301, 13, -1, 'Subcultures'),
(302, 13, -1, 'Transgendered'),
(303, 13, -1, 'Work'),
(14, -1, -1, 'Sports'),
(304, 14, -1, 'Archery'),
(305, 14, -1, 'Badminton'),
(306, 14, -1, 'Baseball'),
(307, 14, -1, 'Basketball'),
(308, 14, -1, 'Billiards'),
(309, 14, -1, 'Boomerang'),
(310, 14, -1, 'Bowling'),
(311, 14, -1, 'Boxing'),
(312, 14, -1, 'Cheerleading'),
(313, 14, -1, 'Cricket'),
(314, 14, -1, 'Croquet'),
(315, 14, -1, 'Cycling'),
(316, 14, -1, 'Darts'),
(317, 14, -1, 'Equestrian'),
(318, 14, -1, 'Extreme Sports'),
(319, 14, -1, 'Fantasy'),
(320, 14, -1, 'Fencing'),
(321, 14, -1, 'Fishing'),
(322, 14, -1, 'Flying Discs'),
(323, 14, -1, 'Football'),
(324, 14, -1, 'Golf'),
(325, 14, -1, 'Greyhound Racing'),
(326, 14, -1, 'Gymnastics'),
(327, 14, -1, 'Handball'),
(328, 14, -1, 'Hockey'),
(329, 14, -1, 'Lacrosse'),
(330, 14, -1, 'Laser Games'),
(331, 14, -1, 'Lumberjack'),
(332, 14, -1, 'Martial Arts'),
(333, 14, -1, 'Motor Sports'),
(334, 14, -1, 'Orienteering'),
(335, 14, -1, 'Paintball'),
(336, 14, -1, 'Racquetball'),
(337, 14, -1, 'Rodeo'),
(338, 14, -1, 'Roller Derby'),
(339, 14, -1, 'Rope Skipping'),
(340, 14, -1, 'Rugby'),
(341, 14, -1, 'Running'),
(342, 14, -1, 'Sailing'),
(343, 14, -1, 'Shooting'),
(344, 14, 267, 'Shopping'),
(345, 14, -1, 'Skateboarding'),
(346, 14, -1, 'Skating'),
(347, 14, -1, 'Skiing'),
(348, 14, -1, 'Sledding'),
(349, 14, -1, 'Sled Dog Racing'),
(350, 14, -1, 'Snowboarding'),
(351, 14, -1, 'Soccer'),
(352, 14, -1, 'Softball'),
(353, 14, -1, 'Squash'),
(354, 14, -1, 'Strength Sports'),
(355, 14, -1, 'Table Tennis'),
(356, 14, -1, 'Tennis'),
(357, 14, -1, 'Track and Field'),
(358, 14, -1, 'Volleyball'),
(359, 14, -1, 'Walking'),
(360, 14, -1, 'Water Sports'),
(361, 14, -1, 'Winter Sports'),
(362, 14, -1, 'Wrestling'),
(15, -1, -1, '***DEPRECATED***');
### -- LAST IS 363 -- ###
UPDATE refcategory SET dontuse = 1 WHERE catid = 15;
# Create the "global" menu. (ID #1)
INSERT INTO menus (menuid, menu_nsid, menu_name, title, subtitle)
VALUES (1, 1, 'fixed.menu', 'About This Site', NULL);

View File

@ -0,0 +1,74 @@
/*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (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.mozilla.org/MPL/>.
*
* 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.
*
* The Original Code is the Venice Web Communities System.
*
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
*
* Contributor(s):
*/
package com.silverwrist.venice;
import java.util.*;
import org.apache.commons.lang.enum.*;
public final class SearchMode extends Enum
{
/*--------------------------------------------------------------------------------
* The actual enumeration values
*--------------------------------------------------------------------------------
*/
public static final SearchMode PREFIX = new SearchMode("PREFIX");
public static final SearchMode SUBSTRING = new SearchMode("SUBSTRING");
public static final SearchMode REGEXP = new SearchMode("REGEXP");
/*--------------------------------------------------------------------------------
* Constructor
*--------------------------------------------------------------------------------
*/
private SearchMode(String name)
{
super(name);
} // end constructor
/*--------------------------------------------------------------------------------
* Standard static method implementations
*--------------------------------------------------------------------------------
*/
public static SearchMode getEnum(String name)
{
return (SearchMode)getEnum(SearchMode.class,name);
} // end getEnum
public static Map getEnumMap()
{
return getEnumMap(SearchMode.class);
} // end getEnumMap
public static List getEnumList()
{
return getEnumList(SearchMode.class);
} // end getEnumList
public static Iterator iterator()
{
return iterator(SearchMode.class);
} // end iterator
} // end class SearchMode

View File

@ -0,0 +1,241 @@
/*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (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.mozilla.org/MPL/>.
*
* 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.
*
* The Original Code is the Venice Web Communities System.
*
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
*
* Contributor(s):
*/
package com.silverwrist.venice.community;
import java.util.*;
import com.silverwrist.dynamo.except.*;
import com.silverwrist.venice.iface.VeniceCategory;
class CategoryImpl implements VeniceCategory
{
/*--------------------------------------------------------------------------------
* Internal class for saving category segments
*--------------------------------------------------------------------------------
*/
private static class Segment
{
/*====================================================================
* Attributes
*====================================================================
*/
private int id; // ID of this category
private String name; // name of this segment
/*====================================================================
* Constructor
*====================================================================
*/
Segment(int id, String name)
{
this.id = id;
this.name = name;
} // end constructor
/*====================================================================
* Public getters
*====================================================================
*/
final int getID()
{
return id;
} // end getID
final String getName()
{
return name;
} // end getName
} // end class Segment
/*--------------------------------------------------------------------------------
* Attributes
*--------------------------------------------------------------------------------
*/
private CategoryManager m_mgr; // pointer to manager object
private LinkedList m_cats; // the actual category segments
private int m_symlink = -1; // if our category is actually a symlink
/*--------------------------------------------------------------------------------
* Constructors
*--------------------------------------------------------------------------------
*/
CategoryImpl(CategoryManager mgr)
{
m_mgr = mgr;
m_cats = new LinkedList();
} // end constructor
CategoryImpl(CategoryManager mgr, int id, int symlink, String name)
{
m_mgr = mgr;
m_cats = new LinkedList();
m_symlink = symlink;
m_cats.add(new Segment(id,name));
} // end constructor
CategoryImpl(CategoryImpl parent, int id, int symlink, String name)
{
m_mgr = parent.m_mgr;
m_cats = (LinkedList)(parent.m_cats.clone());
m_symlink = symlink;
m_cats.add(new Segment(id,name));
} // end constructor
private CategoryImpl(CategoryImpl other, int copy_levels)
{
m_mgr = other.m_mgr;
m_cats = new LinkedList();
m_symlink = ((copy_levels==other.m_cats.size()) ? other.m_symlink : -1);
Iterator it = other.m_cats.iterator();
for (int i=0; i<copy_levels; i++)
m_cats.add(it.next());
} // end constructor
/*--------------------------------------------------------------------------------
* Implementations from interface VeniceCategory
*--------------------------------------------------------------------------------
*/
public int getCategoryID()
{
if (m_cats.size()>0)
return ((Segment)(m_cats.getLast())).getID();
else
return -1;
} // end getCategoryID
public int getNumLevels()
{
return m_cats.size();
} // end getNumLevels
public int getIDAtLevel(int level)
{
return ((Segment)(m_cats.get(level))).getID();
} // end getIDAtLevel
public String getTitleAtLevel(int level)
{
return ((Segment)(m_cats.get(level))).getName();
} // end getTitleAtLevel
public List getSubCategories() throws DatabaseException
{
return m_mgr.getCategorySublist(this.getLinkedCategoryID());
} // end getSubCategories
public VeniceCategory getSuperCategory(int levels)
{
return m_mgr.canonicalize(new CategoryImpl(this,levels));
} // end getSuperCategory
public VeniceCategory getParentCategory()
{
return m_mgr.canonicalize(new CategoryImpl(this,m_cats.size()-1));
} // end getParentCategoryID
public int getLinkedCategoryID()
{
if (m_symlink>=0)
return m_symlink;
else
return this.getCategoryID();
} // end getLinkedCategoryID
public boolean isSymbolicLink()
{
return (m_symlink>=0);
} // end isSymbolicLink
public VeniceCategory getLinkedCategory() throws DatabaseException
{
if (m_symlink<0)
return this;
return (VeniceCategory)(m_mgr.lookup(m_symlink));
} // end getLinkedCategory
public boolean equals(Object obj)
{
if (obj==null)
return false;
if (obj instanceof VeniceCategory)
return (((VeniceCategory)obj).getLinkedCategoryID()==this.getLinkedCategoryID());
return this.toString().equals(obj.toString());
} // end equals
public int hashCode()
{
return this.getLinkedCategoryID();
} // end hashCode
public String toString()
{
StringBuffer buf = new StringBuffer();
Iterator it = m_cats.iterator();
while (it.hasNext())
{ // concatenate all the parts together
Segment seg = (Segment)(it.next());
if (buf.length()>0)
buf.append(": ");
buf.append(seg.getName());
} // end while
return buf.toString();
} // end toString
/*--------------------------------------------------------------------------------
* External operations
*--------------------------------------------------------------------------------
*/
void dispose()
{
m_mgr = null;
m_cats.clear();
m_cats = null;
} // end dispose
} // end class CategoryImpl

View File

@ -0,0 +1,286 @@
/*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (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.mozilla.org/MPL/>.
*
* 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.
*
* The Original Code is the Venice Web Communities System.
*
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
*
* Contributor(s):
*/
package com.silverwrist.venice.community;
import java.util.*;
import org.apache.commons.collections.*;
import org.apache.log4j.Logger;
import org.w3c.dom.*;
import com.silverwrist.util.xml.*;
import com.silverwrist.dynamo.except.*;
import com.silverwrist.dynamo.iface.*;
import com.silverwrist.dynamo.util.*;
import com.silverwrist.venice.SearchMode;
import com.silverwrist.venice.iface.VeniceCategory;
public class CategoryManager implements NamedObject, ComponentInitialize, ComponentShutdown, CategoryService
{
/*--------------------------------------------------------------------------------
* Static data members
*--------------------------------------------------------------------------------
*/
private static Logger logger = Logger.getLogger(CategoryManager.class);
/*--------------------------------------------------------------------------------
* Attributes
*--------------------------------------------------------------------------------
*/
private String m_name; // this object's name
private CategoryOps m_ops; // database operations
private ReferenceMap m_categories; // cached category values
/*--------------------------------------------------------------------------------
* Constructor
*--------------------------------------------------------------------------------
*/
public CategoryManager()
{
m_categories = new ReferenceMap(ReferenceMap.HARD,ReferenceMap.SOFT);
} // end constructor
/*--------------------------------------------------------------------------------
* Internal operations
*--------------------------------------------------------------------------------
*/
private final List convertList(List base) throws DatabaseException
{
if (base.isEmpty())
return Collections.EMPTY_LIST;
ArrayList rc = new ArrayList(base.size());
synchronized (this)
{ // convert the tuples list ont a full category list
Iterator it = base.iterator();
while (it.hasNext())
{ // get the tuple from the list and convert it
CategoryTuple tuple = (CategoryTuple)(it.next());
Integer key = new Integer(tuple.getCategoryID());
VeniceCategory cat = (VeniceCategory)(m_categories.get(key));
if (cat==null)
{ // need to create a new category object and add it
if (tuple.getParentCategoryID()<0)
cat = new CategoryImpl(this,tuple.getCategoryID(),tuple.getSymlink(),tuple.getName());
else
cat = new CategoryImpl(lookup(tuple.getParentCategoryID()),tuple.getCategoryID(),tuple.getSymlink(),
tuple.getName());
m_categories.put(key,cat);
} // end if
rc.add(cat);
} // end while
} // end synchronized block
return Collections.unmodifiableList(rc);
} // end convertList
/*--------------------------------------------------------------------------------
* Implementations from interface NamedObject
*--------------------------------------------------------------------------------
*/
public String getName()
{
return m_name;
} // end getName
/*--------------------------------------------------------------------------------
* Implementations from interface ComponentInitialize
*--------------------------------------------------------------------------------
*/
/**
* Initialize the component.
*
* @param config_root Pointer to the section of the Dynamo XML configuration file that configures this
* particular component. This is to be considered "read-only" by the component.
* @param services An implementation of {@link com.silverwrist.dynamo.iface.ServiceProvider ServiceProvider}
* which provides initialization services to the component. This will include an implementation
* of {@link com.silverwrist.dynamo.iface.ObjectProvider ObjectProvider} which may be used to
* get information about other objects previously initialized by the application.
* @exception com.silverwrist.dynamo.except.ConfigException If an error is encountered in the component
* configuration.
*/
public void initialize(Element config_root, ServiceProvider services) throws ConfigException
{
logger.info("CategoryManager initializing");
XMLLoader loader = XMLLoader.get();
String name_pool = null;
try
{ // verify the right node name
loader.verifyNodeName(config_root,"object");
// get the object's name
m_name = loader.getAttribute(config_root,"name");
// get the name of the database pool
DOMElementHelper config_root_h = new DOMElementHelper(config_root);
Element foo = loader.getSubElement(config_root_h,"database");
name_pool = loader.getAttribute(foo,"connection");
} // end try
catch (XMLLoadException e)
{ // error loading XML config data
logger.fatal("XML loader exception in StandardContentSupplier",e);
throw new ConfigException(e);
} // end catch
// Get the database connection pool.
DBConnectionPool pool = GetObjectUtils.getDatabaseConnection(services,name_pool);
// Get the operations object.
m_ops = CategoryOps.get(pool);
} // end initialize
/*--------------------------------------------------------------------------------
* Implementations from interface ComponentShutdown
*--------------------------------------------------------------------------------
*/
public void shutdown()
{
m_categories.clear();
m_ops = null;
} // end shutdown
/*--------------------------------------------------------------------------------
* Implementations from interface CategoryService
*--------------------------------------------------------------------------------
*/
public boolean isValidCategoryID(int catid)
{
if (catid==-1)
return true; // valid by definition; it means "Top"
if (m_categories.containsKey(new Integer(catid)))
return true; // already present in our category map, it must be OK
try
{ // call down to the database
return m_ops.verifyCategoryID(catid);
} // end try
catch (DatabaseException e)
{ // don't throw this exception!
logger.warn("CategoryManager.isValidCategoryID(): database failure",e);
} // end catch
return false; // default return
} // end isValidCategoryID
public List getRootCategoryList() throws DatabaseException
{
return getCategorySublist(-1);
} // end getRootCategoryList
public VeniceCategory getCategory(int catid) throws DatabaseException
{
return (VeniceCategory)lookup(catid);
} // end getCategory
public List searchForCategories(SearchMode mode, String term, int offset, int count) throws DatabaseException
{
return convertList(m_ops.search(mode,term,offset,count));
} // end searchForCategories
public int getSearchCategoryCount(SearchMode mode, String term) throws DatabaseException
{
return m_ops.getSearchCount(mode,term);
} // end getSearchCategoryCount
/*--------------------------------------------------------------------------------
* External operations
*--------------------------------------------------------------------------------
*/
synchronized CategoryImpl lookup(int catid) throws DatabaseException
{
Integer key = new Integer(catid);
CategoryImpl rc = (CategoryImpl)(m_categories.get(key));
if (rc!=null)
return rc;
if (catid<0)
{ // for "TOP" category, handle specially
rc = new CategoryImpl(this);
m_categories.put(key,rc);
return rc;
} // end if
// look up the tuple for this category
CategoryTuple tuple = m_ops.getCategory(catid);
if (tuple==null)
{ // category not found!
DatabaseException de = new DatabaseException(CategoryManager.class,"CommunityMessages","cat.notfound");
de.setParameter(0,String.valueOf(catid));
throw de;
} // end if
if (tuple.getParentCategoryID()<0)
rc = new CategoryImpl(this,tuple.getCategoryID(),tuple.getSymlink(),tuple.getName());
else // recurse to look up the parent, and so on
rc = new CategoryImpl(lookup(tuple.getParentCategoryID()),tuple.getCategoryID(),tuple.getSymlink(),
tuple.getName());
m_categories.put(key,rc);
return rc;
} // end lookup
List getCategorySublist(int parentid) throws DatabaseException
{
return convertList(m_ops.getCategoriesList(parentid));
} // end getCategorySublist
synchronized VeniceCategory canonicalize(CategoryImpl obj)
{
Integer key = new Integer(obj.getCategoryID());
VeniceCategory rc = (VeniceCategory)(m_categories.get(key));
if (rc==null)
{ // it wasn't in our refmap - it is now!
m_categories.put(key,obj);
rc = obj;
} // end if
else // dispose of the unneeded second copy
obj.dispose();
return rc;
} // end canonicalize
} // end class CategoryManager

View File

@ -0,0 +1,65 @@
/*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (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.mozilla.org/MPL/>.
*
* 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.
*
* The Original Code is the Venice Web Communities System.
*
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
*
* Contributor(s):
*/
package com.silverwrist.venice.community;
import java.util.*;
import com.silverwrist.dynamo.db.OpsBase;
import com.silverwrist.dynamo.except.*;
import com.silverwrist.dynamo.iface.*;
import com.silverwrist.venice.SearchMode;
abstract class CategoryOps extends OpsBase
{
/*--------------------------------------------------------------------------------
* Constructor
*--------------------------------------------------------------------------------
*/
protected CategoryOps(DBConnectionPool pool)
{
super(pool);
} // end constructor
/*--------------------------------------------------------------------------------
* Abstract operations
*--------------------------------------------------------------------------------
*/
abstract boolean verifyCategoryID(int catid) throws DatabaseException;
abstract List getCategoriesList(int parent) throws DatabaseException;
abstract CategoryTuple getCategory(int catid) throws DatabaseException;
abstract List search(SearchMode mode, String term, int offset, int count) throws DatabaseException;
abstract int getSearchCount(SearchMode mode, String term) throws DatabaseException;
/*--------------------------------------------------------------------------------
* External static operations
*--------------------------------------------------------------------------------
*/
static CategoryOps get(DBConnectionPool pool) throws ConfigException
{
return (CategoryOps)get(pool,CategoryOps.class.getClassLoader(),CategoryOps.class.getName() + "_","CategoryOps");
} // end get
} // end class CategoryOps

View File

@ -0,0 +1,242 @@
/*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (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.mozilla.org/MPL/>.
*
* 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.
*
* The Original Code is the Venice Web Communities System.
*
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
*
* Contributor(s):
*/
package com.silverwrist.venice.community;
import java.sql.*;
import java.util.*;
import com.silverwrist.util.*;
import com.silverwrist.dynamo.except.*;
import com.silverwrist.dynamo.iface.*;
import com.silverwrist.venice.SearchMode;
public class CategoryOps_mysql extends CategoryOps
{
/*--------------------------------------------------------------------------------
* Attributes
*--------------------------------------------------------------------------------
*/
private DBUtilities m_utils;
/*--------------------------------------------------------------------------------
* Constructor
*--------------------------------------------------------------------------------
*/
public CategoryOps_mysql(DBConnectionPool pool)
{
super(pool);
m_utils = (DBUtilities)(pool.queryService(DBUtilities.class));
} // end constructor
/*--------------------------------------------------------------------------------
* Abstract implementations from class CategoryOps
*--------------------------------------------------------------------------------
*/
boolean verifyCategoryID(int catid) throws DatabaseException
{
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try
{ // get a connection
conn = getConnection();
// prepare and execute the statement
stmt = conn.prepareStatement("SELECT catid FROM refcategory WHERE catid = ? AND dontuse = 0;");
stmt.setInt(1,catid);
rs = stmt.executeQuery();
return rs.next();
} // end try
catch (SQLException e)
{ // translate to a general DatabaseException
throw generalException(e);
} // end catch
finally
{ // shut everything down
SQLUtils.shutdown(rs);
SQLUtils.shutdown(stmt);
SQLUtils.shutdown(conn);
} // end finally
} // end verifyCategoryID
List getCategoriesList(int parent) throws DatabaseException
{
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try
{ // get a connection
conn = getConnection();
// create and execute the statement
stmt = conn.prepareStatement("SELECT catid, symlink, name FROM refcategory WHERE parent = ? AND dontuse = 0 "
+ "ORDER BY name;");
stmt.setInt(1,parent);
rs = stmt.executeQuery();
// create the return list of CategoryTuple values
ArrayList rc = new ArrayList();
while (rs.next())
rc.add(new CategoryTuple(rs.getInt(1),parent,rs.getInt(2),rs.getString(3)));
return rc;
} // end try
catch (SQLException e)
{ // translate to a general DatabaseException
throw generalException(e);
} // end catch
finally
{ // shut everything down
SQLUtils.shutdown(rs);
SQLUtils.shutdown(stmt);
SQLUtils.shutdown(conn);
} // end finally
} // end getCategoriesList
CategoryTuple getCategory(int catid) throws DatabaseException
{
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try
{ // get a connection
conn = getConnection();
// create and execute the statement
stmt = conn.prepareStatement("SELECT parent, symlink, name FROM refcategory WHERE catid = ? AND dontuse = 0;");
stmt.setInt(1,catid);
rs = stmt.executeQuery();
if (rs.next())
return new CategoryTuple(catid,rs.getInt(1),rs.getInt(2),rs.getString(3));
else
return null;
} // end try
catch (SQLException e)
{ // translate to a general DatabaseException
throw generalException(e);
} // end catch
finally
{ // shut everything down
SQLUtils.shutdown(rs);
SQLUtils.shutdown(stmt);
SQLUtils.shutdown(conn);
} // end finally
} // end getCategory
List search(SearchMode mode, String term, int offset, int count) throws DatabaseException
{
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try
{ // get a connection
conn = getConnection();
// build the SQL statement as a string
StringBuffer sql = new StringBuffer("SELECT catid, parent, symlink, name FROM refcategory WHERE name ");
if (SearchMode.PREFIX.equals(mode))
sql.append("LIKE '").append(m_utils.encodeStringWildcards(term)).append("%'");
else if (SearchMode.SUBSTRING.equals(mode))
sql.append("LIKE '%").append(m_utils.encodeStringWildcards(term)).append("%'");
else if (SearchMode.REGEXP.equals(mode))
sql.append("REGEXP '").append(m_utils.encodeString(term)).append('\'');
sql.append(" AND dontuse = 0 ORDER BY parent, name LIMIT ").append(offset).append(", ").append(count+1);
sql.append(';');
// execute the operation!
stmt = conn.createStatement();
rs = stmt.executeQuery(sql.toString());
// create the return list of CategoryTuple values
ArrayList rc = new ArrayList(count+1);
while (rs.next())
rc.add(new CategoryTuple(rs.getInt(1),rs.getInt(2),rs.getInt(3),rs.getString(4)));
return rc;
} // end try
catch (SQLException e)
{ // translate to a general DatabaseException
throw generalException(e);
} // end catch
finally
{ // shut everything down
SQLUtils.shutdown(rs);
SQLUtils.shutdown(stmt);
SQLUtils.shutdown(conn);
} // end finally
} // end searchForCategories
int getSearchCount(SearchMode mode, String term) throws DatabaseException
{
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try
{ // get a connection
conn = getConnection();
// build the SQL statement as a string
StringBuffer sql = new StringBuffer("SELECT COUNT(*) FROM refcategory WHERE name ");
if (SearchMode.PREFIX.equals(mode))
sql.append("LIKE '").append(m_utils.encodeStringWildcards(term)).append("%'");
else if (SearchMode.SUBSTRING.equals(mode))
sql.append("LIKE '%").append(m_utils.encodeStringWildcards(term)).append("%'");
else if (SearchMode.REGEXP.equals(mode))
sql.append("REGEXP '").append(m_utils.encodeString(term)).append('\'');
sql.append(" AND dontuse = 0;");
// execute the operation!
stmt = conn.createStatement();
rs = stmt.executeQuery(sql.toString());
return SQLUtils.getReturnCountInt(rs,1);
} // end try
catch (SQLException e)
{ // translate to a general DatabaseException
throw generalException(e);
} // end catch
finally
{ // shut everything down
SQLUtils.shutdown(rs);
SQLUtils.shutdown(stmt);
SQLUtils.shutdown(conn);
} // end finally
} // end getSearchCount
} // end class CategoryOps_mysql

View File

@ -0,0 +1,37 @@
/*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (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.mozilla.org/MPL/>.
*
* 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.
*
* The Original Code is the Venice Web Communities System.
*
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
*
* Contributor(s):
*/
package com.silverwrist.venice.community;
import java.util.List;
import com.silverwrist.dynamo.except.DatabaseException;
import com.silverwrist.venice.SearchMode;
import com.silverwrist.venice.iface.VeniceCategory;
public interface CategoryService
{
public boolean isValidCategoryID(int catid);
public List getRootCategoryList() throws DatabaseException;
public VeniceCategory getCategory(int catid) throws DatabaseException;
public List searchForCategories(SearchMode mode, String term, int offset, int count) throws DatabaseException;
public int getSearchCategoryCount(SearchMode mode, String term) throws DatabaseException;
} // end interface CategoryService

View File

@ -0,0 +1,75 @@
/*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (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.mozilla.org/MPL/>.
*
* 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.
*
* The Original Code is the Venice Web Communities System.
*
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
*
* Contributor(s):
*/
package com.silverwrist.venice.community;
class CategoryTuple
{
/*--------------------------------------------------------------------------------
* Attributes
*--------------------------------------------------------------------------------
*/
private int m_catid;
private int m_parent;
private int m_symlink;
private String m_name;
/*--------------------------------------------------------------------------------
* Constructor
*--------------------------------------------------------------------------------
*/
CategoryTuple(int catid, int parent, int symlink, String name)
{
m_catid = catid;
m_parent = parent;
m_symlink = symlink;
m_name = name;
} // end constructor
/*--------------------------------------------------------------------------------
* Public getters
*--------------------------------------------------------------------------------
*/
int getCategoryID()
{
return m_catid;
} // end getCategoryID
int getParentCategoryID()
{
return m_parent;
} // end getParentCategoryID
int getSymlink()
{
return m_symlink;
} // end getSymLink
String getName()
{
return m_name;
} // end getName
} // end class CategoryTuple

View File

@ -0,0 +1,18 @@
# The contents of this file are subject to the Mozilla Public License Version 1.1
# (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.mozilla.org/MPL/>.
#
# 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.
#
# The Original Code is the Venice Web Communities System.
#
# The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
# for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
# Copyright (C) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
#
# Contributor(s):
# ---------------------------------------------------------------------------------
# This file has been localized for the en_US locale
cat.notfound=The category with ID#{0} does not exist in the database.

View File

@ -0,0 +1,51 @@
/*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (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.mozilla.org/MPL/>.
*
* 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.
*
* The Original Code is the Venice Web Communities System.
*
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
*
* Contributor(s):
*/
package com.silverwrist.venice.iface;
import java.util.List;
import com.silverwrist.dynamo.except.DatabaseException;
public interface VeniceCategory
{
public int getCategoryID();
public int getNumLevels();
public int getIDAtLevel(int level);
public String getTitleAtLevel(int level);
public List getSubCategories() throws DatabaseException;
public VeniceCategory getSuperCategory(int levels);
public VeniceCategory getParentCategory();
public int getLinkedCategoryID();
public boolean isSymbolicLink();
public VeniceCategory getLinkedCategory() throws DatabaseException;
public boolean equals(Object obj);
public int hashCode();
public String toString();
} // end interface VeniceCategory

View File

@ -20,6 +20,7 @@ package com.silverwrist.venice.script;
import com.silverwrist.dynamo.Namespaces;
import com.silverwrist.dynamo.except.*;
import com.silverwrist.dynamo.iface.*;
import com.silverwrist.venice.community.CategoryService;
import com.silverwrist.venice.iface.*;
public class LibraryVeniceCast
@ -86,6 +87,12 @@ public class LibraryVeniceCast
} // end queryButtonProvider
public final CategoryService queryCategoryService(Object obj)
{
return (CategoryService)query(obj,CategoryService.class);
} // end queryCategoryService
public final ContentBlockProvider queryContentBlockProvider(Object obj)
{
return (ContentBlockProvider)query(obj,ContentBlockProvider.class);