diff --git a/conf-sso/sp/dynamo.xml b/conf-sso/sp/dynamo.xml
index a046b24..b037d1e 100644
--- a/conf-sso/sp/dynamo.xml
+++ b/conf-sso/sp/dynamo.xml
@@ -165,6 +165,10 @@
+
+
+
+
+
diff --git a/conf/venice-db-init-mysql.sql b/conf/venice-db-init-mysql.sql
index f71e8ca..4563f03 100644
--- a/conf/venice-db-init-mysql.sql
+++ b/conf/venice-db-init-mysql.sql
@@ -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 ;
+# 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);
diff --git a/src/venice-base/com/silverwrist/venice/SearchMode.java b/src/venice-base/com/silverwrist/venice/SearchMode.java
new file mode 100644
index 0000000..7bb9add
--- /dev/null
+++ b/src/venice-base/com/silverwrist/venice/SearchMode.java
@@ -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 .
+ *
+ * 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 ,
+ * 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
diff --git a/src/venice-base/com/silverwrist/venice/community/CategoryImpl.java b/src/venice-base/com/silverwrist/venice/community/CategoryImpl.java
new file mode 100644
index 0000000..61d8704
--- /dev/null
+++ b/src/venice-base/com/silverwrist/venice/community/CategoryImpl.java
@@ -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 .
+ *
+ * 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 ,
+ * 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; i0)
+ 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
diff --git a/src/venice-base/com/silverwrist/venice/community/CategoryManager.java b/src/venice-base/com/silverwrist/venice/community/CategoryManager.java
new file mode 100644
index 0000000..836b168
--- /dev/null
+++ b/src/venice-base/com/silverwrist/venice/community/CategoryManager.java
@@ -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 .
+ *
+ * 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 ,
+ * 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
diff --git a/src/venice-base/com/silverwrist/venice/community/CategoryOps.java b/src/venice-base/com/silverwrist/venice/community/CategoryOps.java
new file mode 100644
index 0000000..2cce28a
--- /dev/null
+++ b/src/venice-base/com/silverwrist/venice/community/CategoryOps.java
@@ -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 .
+ *
+ * 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 ,
+ * 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
diff --git a/src/venice-base/com/silverwrist/venice/community/CategoryOps_mysql.java b/src/venice-base/com/silverwrist/venice/community/CategoryOps_mysql.java
new file mode 100644
index 0000000..8b95d40
--- /dev/null
+++ b/src/venice-base/com/silverwrist/venice/community/CategoryOps_mysql.java
@@ -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 .
+ *
+ * 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 ,
+ * 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
diff --git a/src/venice-base/com/silverwrist/venice/community/CategoryService.java b/src/venice-base/com/silverwrist/venice/community/CategoryService.java
new file mode 100644
index 0000000..2e42be5
--- /dev/null
+++ b/src/venice-base/com/silverwrist/venice/community/CategoryService.java
@@ -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 .
+ *
+ * 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 ,
+ * 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
diff --git a/src/venice-base/com/silverwrist/venice/community/CategoryTuple.java b/src/venice-base/com/silverwrist/venice/community/CategoryTuple.java
new file mode 100644
index 0000000..27cbe8e
--- /dev/null
+++ b/src/venice-base/com/silverwrist/venice/community/CategoryTuple.java
@@ -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 .
+ *
+ * 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 ,
+ * 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
diff --git a/src/venice-base/com/silverwrist/venice/community/CommunityMessages.properties b/src/venice-base/com/silverwrist/venice/community/CommunityMessages.properties
new file mode 100644
index 0000000..61e4490
--- /dev/null
+++ b/src/venice-base/com/silverwrist/venice/community/CommunityMessages.properties
@@ -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 .
+#
+# 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 ,
+# 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.
diff --git a/src/venice-base/com/silverwrist/venice/iface/VeniceCategory.java b/src/venice-base/com/silverwrist/venice/iface/VeniceCategory.java
new file mode 100644
index 0000000..ac01887
--- /dev/null
+++ b/src/venice-base/com/silverwrist/venice/iface/VeniceCategory.java
@@ -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 .
+ *
+ * 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 ,
+ * 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
diff --git a/src/venice-base/com/silverwrist/venice/script/LibraryVeniceCast.java b/src/venice-base/com/silverwrist/venice/script/LibraryVeniceCast.java
index db3773d..c1c2292 100644
--- a/src/venice-base/com/silverwrist/venice/script/LibraryVeniceCast.java
+++ b/src/venice-base/com/silverwrist/venice/script/LibraryVeniceCast.java
@@ -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);