/*
* ContentTopic.java
*
* This work is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
* by the Free Software Foundation; either version 2 of the License,
* or (at your option) any later version.
*
* This work is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
*
* Copyright (c) 2004 Per Cederberg. All rights reserved.
*/
package org.liquidsite.core.content;
import org.liquidsite.core.data.ContentData;
import org.liquidsite.core.data.DataSource;
/**
* A discussion forum topic.
*
* @author Per Cederberg, <per at percederberg dot net>
* @version 1.0
*/
public class ContentTopic extends Content {
/**
* The subject content attribute.
*/
private static final String SUBJECT_ATTRIBUTE = "SUBJECT";
/**
* The locked content attribute.
*/
private static final String LOCKED_ATTRIBUTE = "LOCKED";
/**
* Creates a new topic with default values.
*
* @param manager the content manager to use
* @param parent the parent content forum
*
* @throws ContentException if the database couldn't be accessed
* properly
*/
public ContentTopic(ContentManager manager, ContentForum parent)
throws ContentException {
super(manager, parent.getDomain(), Content.TOPIC_CATEGORY);
setParent(parent);
setAttribute(SUBJECT_ATTRIBUTE, "");
setAttribute(LOCKED_ATTRIBUTE, "0");
}
/**
* Creates a new topic.
*
* @param manager the content manager to use
* @param data the content data object
* @param src the data source to use
*
* @throws ContentException if the database couldn't be accessed
* properly
*/
protected ContentTopic(ContentManager manager,
ContentData data,
DataSource src)
throws ContentException {
super(manager, data, src);
}
/**
* Sets the topic name. The topic name must be numeric and if
* assigned manually, care must be taken to make sure all topics
* in a forum have assigned names (or errors may occur). If no
* name is set one will be assigned automatically upon insertion
* in the database. Topic names should NEVER be changed.
*
* @param name the new name
*/
public void setName(String name) {
try {
super.setName(String.valueOf(Integer.parseInt(name)));
} catch (NumberFormatException e) {
// Do nothing
}
}
/**
* Returns the topic subject.
*
* @return the topic subject
*/
public String getSubject() {
return getAttribute(SUBJECT_ATTRIBUTE);
}
/**
* Sets the topic subject.
*
* @param subject the new topic subject
*/
public void setSubject(String subject) {
setAttribute(SUBJECT_ATTRIBUTE, subject);
}
/**
* Checks if the topic locked flag is set.
*
* @return true if the topic locked flag is set, or
* false otherwise
*/
public boolean isLocked() {
return getAttribute(LOCKED_ATTRIBUTE).equals("1");
}
/**
* Sets the topic locked flag.
*
* @param locked the new topic locked flag
*/
public void setLocked(boolean locked) {
if (locked) {
setAttribute(LOCKED_ATTRIBUTE, "1");
} else {
setAttribute(LOCKED_ATTRIBUTE, "0");
}
}
/**
* Validates the object data before writing to the database.
*
* @throws ContentException if the object data wasn't valid
*/
protected void doValidate() throws ContentException {
Content parent;
if (getName().equals("")) {
setName(createName());
}
super.doValidate();
parent = getParent();
if (parent == null) {
throw new ContentException("no parent set for topic");
} else if (parent.getCategory() != Content.FORUM_CATEGORY) {
throw new ContentException("topic parent must be forum");
} else if (getSubject().equals("")) {
throw new ContentException("no topic title set");
}
}
/**
* Creates a new name for the topic. The name will be the next
* available number among the parent forum topics.
*
* @return the new name
*
* @throws ContentException if the database couldn't be accessed
* properly
*/
private String createName() throws ContentException {
ContentSelector selector;
Content[] children;
int value;
selector = new ContentSelector(getDomainName());
selector.requireParent(getParent());
selector.requireCategory(getCategory());
selector.sortById(false);
selector.limitResults(0, 1);
children = InternalContent.findBySelector(getContentManager(),
selector);
if (children.length == 0) {
return "1";
} else {
value = Integer.parseInt(children[0].getName());
return String.valueOf(value + 1);
}
}
}