blob: f8e291510b0fbe90bbbe69386249acf088e0a90f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. The ASF licenses this file to You
* under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License. For additional information regarding
* copyright in this work, please see the NOTICE file in the top level
* directory of this distribution.
*/
package org.apache.roller.weblogger.pojos;
import java.io.Serializable;
import java.util.*;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.roller.weblogger.WebloggerException;
import org.apache.roller.weblogger.business.plugins.entry.WeblogEntryPlugin;
import org.apache.roller.weblogger.business.WebloggerFactory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.roller.weblogger.config.WebloggerRuntimeConfig;
import org.apache.roller.weblogger.business.BookmarkManager;
import org.apache.roller.weblogger.business.plugins.PluginManager;
import org.apache.roller.weblogger.business.Weblogger;
import org.apache.roller.weblogger.business.themes.ThemeManager;
import org.apache.roller.weblogger.business.WeblogEntryManager;
import org.apache.roller.weblogger.pojos.WeblogEntry.PubStatus;
import org.apache.roller.util.UUIDGenerator;
import org.apache.roller.weblogger.business.UserManager;
import org.apache.roller.weblogger.util.I18nUtils;
/**
* Website has many-to-many association with users. Website has one-to-many and
* one-direction associations with weblog entries, weblog categories, folders and
* other objects. Use UserManager to create, fetch, update and retrieve websites.
*
* @author David M Johnson
*/
public class Weblog implements Serializable {
public static final long serialVersionUID = 206437645033737127L;
private static Log log = LogFactory.getLog(Weblog.class);
private static final int MAX_ENTRIES = 100;
// Simple properties
private String id = UUIDGenerator.generateUUID();
private String handle = null;
private String name = null;
private String tagline = null;
private Boolean enableBloggerApi = Boolean.TRUE;
private String editorPage = null;
private String blacklist = null;
private Boolean allowComments = Boolean.TRUE;
private Boolean emailComments = Boolean.FALSE;
private String emailAddress = null;
private String editorTheme = null;
private String locale = null;
private String timeZone = null;
private String defaultPlugins = null;
private Boolean visible = Boolean.TRUE;
private Boolean active = Boolean.TRUE;
private Date dateCreated = new java.util.Date();
private Boolean defaultAllowComments = Boolean.TRUE;
private int defaultCommentDays = 0;
private Boolean moderateComments = Boolean.FALSE;
private int entryDisplayCount = 15;
private Date lastModified = new Date();
private boolean enableMultiLang = false;
private boolean showAllLangs = true;
private String iconPath = null;
private String about = null;
private String creator = null;
private String analyticsCode = null;
// Associated objects
private WeblogCategory bloggerCategory = null;
private Map<String, WeblogEntryPlugin> initializedPlugins = null;
private List<WeblogCategory> weblogCategories = new ArrayList<WeblogCategory>();
private List<WeblogBookmarkFolder> bookmarkFolders = new ArrayList<WeblogBookmarkFolder>();
private List<MediaFileDirectory> mediaFileDirectories = new ArrayList<MediaFileDirectory>();
public Weblog() {
}
public Weblog(
String handle,
String creator,
String name,
String desc,
String email,
String editorTheme,
String locale,
String timeZone) {
this.handle = handle;
this.creator = creator;
this.name = name;
this.tagline = desc;
this.emailAddress = email;
this.editorTheme = editorTheme;
this.locale = locale;
this.timeZone = timeZone;
}
//------------------------------------------------------- Good citizenship
public String toString() {
return "{" + getId() + ", " + getHandle()
+ ", " + getName() + ", " + getEmailAddress()
+ ", " + getLocale() + ", " + getTimeZone() + "}";
}
public boolean equals(Object other) {
if (other == this) {
return true;
}
if (!(other instanceof Weblog)) {
return false;
}
Weblog o = (Weblog)other;
return new EqualsBuilder()
.append(getHandle(), o.getHandle())
.isEquals();
}
public int hashCode() {
return new HashCodeBuilder()
.append(getHandle())
.toHashCode();
}
/**
* Get the Theme object in use by this weblog, or null if no theme selected.
*/
public WeblogTheme getTheme() {
try {
// let the ThemeManager handle it
ThemeManager themeMgr = WebloggerFactory.getWeblogger().getThemeManager();
return themeMgr.getTheme(this);
} catch (WebloggerException ex) {
log.error("Error getting theme for weblog - "+getHandle(), ex);
}
// TODO: maybe we should return a default theme in this case?
return null;
}
/**
* Id of the Website.
*/
public String getId() {
return this.id;
}
public void setId(String id) {
this.id = id;
}
/**
* Short URL safe string that uniquely identifies the website.
*/
public String getHandle() {
return this.handle;
}
public void setHandle(String handle) {
this.handle = handle;
}
/**
* Name of the Website.
*/
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
/**
* Description
*
*/
public String getTagline() {
return this.tagline;
}
public void setTagline(String tagline) {
this.tagline = tagline;
}
/**
* Original creator of website.
*/
public org.apache.roller.weblogger.pojos.User getCreator() {
try {
return WebloggerFactory.getWeblogger().getUserManager().getUserByUserName(creator);
} catch (Exception e) {
log.error("ERROR fetching user object for username: " + creator, e);
}
return null;
}
/**
* Username of original creator of website.
*/
public String getCreatorUserName() {
return creator;
}
public void setCreatorUserName(String creatorUserName) {
creator = creatorUserName;
}
public Boolean getEnableBloggerApi() {
return this.enableBloggerApi;
}
public void setEnableBloggerApi(Boolean enableBloggerApi) {
this.enableBloggerApi = enableBloggerApi;
}
public WeblogCategory getBloggerCategory() { return bloggerCategory; }
public void setBloggerCategory(WeblogCategory bloggerCategory) {
this.bloggerCategory = bloggerCategory;
}
public String getEditorPage() {
return this.editorPage;
}
public void setEditorPage(String editorPage) {
this.editorPage = editorPage;
}
public String getBlacklist() {
return this.blacklist;
}
public void setBlacklist(String blacklist) {
this.blacklist = blacklist;
}
public Boolean getAllowComments() {
return this.allowComments;
}
public void setAllowComments(Boolean allowComments) {
this.allowComments = allowComments;
}
public Boolean getDefaultAllowComments() {
return defaultAllowComments;
}
public void setDefaultAllowComments(Boolean defaultAllowComments) {
this.defaultAllowComments = defaultAllowComments;
}
public int getDefaultCommentDays() {
return defaultCommentDays;
}
public void setDefaultCommentDays(int defaultCommentDays) {
this.defaultCommentDays = defaultCommentDays;
}
public Boolean getModerateComments() {
return moderateComments;
}
public void setModerateComments(Boolean moderateComments) {
this.moderateComments = moderateComments;
}
public Boolean getEmailComments() {
return this.emailComments;
}
public void setEmailComments(Boolean emailComments) {
this.emailComments = emailComments;
}
public String getEmailAddress() {
return this.emailAddress;
}
public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
}
/**
* EditorTheme of the Website.
*/
public String getEditorTheme() {
return this.editorTheme;
}
public void setEditorTheme(String editorTheme) {
this.editorTheme = editorTheme;
}
/**
* Locale of the Website.
*/
public String getLocale() {
return this.locale;
}
public void setLocale(String locale) {
this.locale = locale;
}
/**
* Timezone of the Website.
*/
public String getTimeZone() {
return this.timeZone;
}
public void setTimeZone(String timeZone) {
this.timeZone = timeZone;
}
public Date getDateCreated() {
if (dateCreated == null) {
return null;
} else {
return (Date)dateCreated.clone();
}
}
public void setDateCreated(final Date date) {
if (date != null) {
dateCreated = (Date)date.clone();
} else {
dateCreated = null;
}
}
/**
* Comma-delimited list of user's default Plugins.
*/
public String getDefaultPlugins() {
return defaultPlugins;
}
public void setDefaultPlugins(String string) {
defaultPlugins = string;
}
/**
* Set bean properties based on other bean.
*/
public void setData(Weblog other) {
this.setId(other.getId());
this.setName(other.getName());
this.setHandle(other.getHandle());
this.setTagline(other.getTagline());
this.setCreatorUserName(other.getCreatorUserName());
this.setEnableBloggerApi(other.getEnableBloggerApi());
this.setBloggerCategory(other.getBloggerCategory());
this.setEditorPage(other.getEditorPage());
this.setBlacklist(other.getBlacklist());
this.setAllowComments(other.getAllowComments());
this.setEmailComments(other.getEmailComments());
this.setEmailAddress(other.getEmailAddress());
this.setEditorTheme(other.getEditorTheme());
this.setLocale(other.getLocale());
this.setTimeZone(other.getTimeZone());
this.setVisible(other.getVisible());
this.setDateCreated(other.getDateCreated());
this.setEntryDisplayCount(other.getEntryDisplayCount());
this.setActive(other.getActive());
this.setLastModified(other.getLastModified());
this.setWeblogCategories(other.getWeblogCategories());
}
/**
* Parse locale value and instantiate a Locale object,
* otherwise return default Locale.
*
* @return Locale
*/
public Locale getLocaleInstance() {
return I18nUtils.toLocale(getLocale());
}
/**
* Return TimeZone instance for value of timeZone,
* otherwise return system default instance.
* @return TimeZone
*/
public TimeZone getTimeZoneInstance() {
if (getTimeZone() == null) {
this.setTimeZone( TimeZone.getDefault().getID() );
}
return TimeZone.getTimeZone(getTimeZone());
}
/**
* Returns true if user has all permission action specified.
*/
public boolean hasUserPermission(User user, String action) {
return hasUserPermissions(user, Collections.singletonList(action));
}
/**
* Returns true if user has all permissions actions specified in the weblog.
*/
public boolean hasUserPermissions(User user, List<String> actions) {
try {
// look for user in website's permissions
UserManager umgr = WebloggerFactory.getWeblogger().getUserManager();
WeblogPermission userPerms = new WeblogPermission(this, user, actions);
return umgr.checkPermission(userPerms, user);
} catch (WebloggerException ex) {
// something is going seriously wrong, not much we can do here
log.error("ERROR checking user permssion", ex);
}
return false;
}
public int getEntryDisplayCount() {
return entryDisplayCount;
}
public void setEntryDisplayCount(int entryDisplayCount) {
this.entryDisplayCount = entryDisplayCount;
}
/**
* Set to FALSE to disable and hide this weblog from public view.
*/
public Boolean getVisible() {
return this.visible;
}
public void setVisible(Boolean visible) {
this.visible = visible;
}
/**
* Set to FALSE to exclude this weblog from community areas such as the
* front page and the planet page.
*/
public Boolean getActive() {
return active;
}
public void setActive(Boolean active) {
this.active = active;
}
/**
* Returns true if comment moderation is required by website or config.
*/
public boolean getCommentModerationRequired() {
return (getModerateComments()
|| WebloggerRuntimeConfig.getBooleanProperty("users.moderation.required"));
}
/** No-op */
public void setCommentModerationRequired(boolean modRequired) {}
/**
* The last time any visible part of this weblog was modified.
* This includes a change to weblog settings, entries, themes, templates,
* comments, categories, bookmarks, folders, etc.
*
* Pings are explicitly not included because pings do not
* affect visible changes to a weblog.
*
*/
public Date getLastModified() {
return lastModified;
}
public void setLastModified(Date lastModified) {
this.lastModified = lastModified;
}
/**
* Is multi-language blog support enabled for this weblog?
*
* If false then urls with various locale restrictions should fail.
*/
public boolean isEnableMultiLang() {
return enableMultiLang;
}
public void setEnableMultiLang(boolean enableMultiLang) {
this.enableMultiLang = enableMultiLang;
}
/**
* Should the default weblog view show entries from all languages?
*
* If false then the default weblog view only shows entry from the
* default locale chosen for this weblog.
*/
public boolean isShowAllLangs() {
return showAllLangs;
}
public void setShowAllLangs(boolean showAllLangs) {
this.showAllLangs = showAllLangs;
}
public String getURL() {
return WebloggerFactory.getWeblogger().getUrlStrategy().getWeblogURL(this, null, false);
}
public String getAbsoluteURL() {
return WebloggerFactory.getWeblogger().getUrlStrategy().getWeblogURL(this, null, true);
}
/**
* The path under the weblog's resources to an icon image.
*/
public String getIconPath() {
return iconPath;
}
public void setIconPath(String iconPath) {
this.iconPath = iconPath;
}
public String getAnalyticsCode() {
return analyticsCode;
}
public void setAnalyticsCode(String analyticsCode) {
this.analyticsCode = analyticsCode;
}
/**
* A description for the weblog (its purpose, authors, etc.)
*
* This field is meant to hold a paragraph or two describing the weblog, in contrast
* to the short sentence or two 'description' attribute meant for blog taglines
* and HTML header META description tags.
*
*/
public String getAbout() {
return about;
}
public void setAbout(String about) {
this.about = about;
}
/**
* Get initialized plugins for use during rendering process.
*/
public Map<String, WeblogEntryPlugin> getInitializedPlugins() {
if (initializedPlugins == null) {
try {
Weblogger roller = WebloggerFactory.getWeblogger();
PluginManager ppmgr = roller.getPluginManager();
initializedPlugins = ppmgr.getWeblogEntryPlugins(this);
} catch (Exception e) {
log.error("ERROR: initializing plugins");
}
}
return initializedPlugins;
}
/**
* Get weblog entry specified by anchor or null if no such entry exists.
* @param anchor Weblog entry anchor
* @return Weblog entry specified by anchor
*/
public WeblogEntry getWeblogEntry(String anchor) {
WeblogEntry entry = null;
try {
Weblogger roller = WebloggerFactory.getWeblogger();
WeblogEntryManager wmgr = roller.getWeblogEntryManager();
entry = wmgr.getWeblogEntryByAnchor(this, anchor);
} catch (WebloggerException e) {
log.error("ERROR: getting entry by anchor");
}
return entry;
}
public WeblogCategory getWeblogCategory(String categoryName) {
WeblogCategory category = null;
try {
Weblogger roller = WebloggerFactory.getWeblogger();
WeblogEntryManager wmgr = roller.getWeblogEntryManager();
if (categoryName != null && !categoryName.equals("nil")) {
category = wmgr.getWeblogCategoryByName(this, categoryName);
} else {
category = getWeblogCategories().iterator().next();
}
} catch (WebloggerException e) {
log.error("ERROR: fetching category: " + categoryName, e);
}
return category;
}
/**
* Get up to 100 most recent published entries in weblog.
* @param cat Category name or null for no category restriction
* @param length Max entries to return (1-100)
* @return List of weblog entry objects.
*/
public List<WeblogEntry> getRecentWeblogEntries(String cat, int length) {
if (cat != null && "nil".equals(cat)) {
cat = null;
}
if (length > MAX_ENTRIES) {
length = MAX_ENTRIES;
}
List<WeblogEntry> recentEntries = new ArrayList<WeblogEntry>();
if (length < 1) {
return recentEntries;
}
try {
WeblogEntryManager wmgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
WeblogEntrySearchCriteria wesc = new WeblogEntrySearchCriteria();
wesc.setWeblog(this);
wesc.setCatName(cat);
wesc.setStatus(PubStatus.PUBLISHED);
wesc.setMaxResults(length);
recentEntries = wmgr.getWeblogEntries(wesc);
} catch (WebloggerException e) {
log.error("ERROR: getting recent entries", e);
}
return recentEntries;
}
/**
* Get up to 100 most recent published entries in weblog.
* @param tag Blog entry tag to query by
* @param length Max entries to return (1-100)
* @return List of weblog entry objects.
*/
public List<WeblogEntry> getRecentWeblogEntriesByTag(String tag, int length) {
if (tag != null && "nil".equals(tag)) {
tag = null;
}
if (length > MAX_ENTRIES) {
length = MAX_ENTRIES;
}
List<WeblogEntry> recentEntries = new ArrayList<WeblogEntry>();
List<String> tags = new ArrayList<String>();
if (tag != null) {
tags.add(tag);
}
if (length < 1) {
return recentEntries;
}
try {
WeblogEntryManager wmgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
WeblogEntrySearchCriteria wesc = new WeblogEntrySearchCriteria();
wesc.setWeblog(this);
wesc.setTags(tags);
wesc.setStatus(PubStatus.PUBLISHED);
wesc.setMaxResults(length);
recentEntries = wmgr.getWeblogEntries(wesc);
} catch (WebloggerException e) {
log.error("ERROR: getting recent entries", e);
}
return recentEntries;
}
/**
* Get up to 100 most recent approved and non-spam comments in weblog.
* @param length Max entries to return (1-100)
* @return List of comment objects.
*/
public List<WeblogEntryComment> getRecentComments(int length) {
if (length > MAX_ENTRIES) {
length = MAX_ENTRIES;
}
List<WeblogEntryComment> recentComments = new ArrayList<WeblogEntryComment>();
if (length < 1) {
return recentComments;
}
try {
WeblogEntryManager wmgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
CommentSearchCriteria csc = new CommentSearchCriteria();
csc.setWeblog(this);
csc.setStatus(WeblogEntryComment.ApprovalStatus.APPROVED);
csc.setReverseChrono(true);
csc.setMaxResults(length);
recentComments = wmgr.getComments(csc);
} catch (WebloggerException e) {
log.error("ERROR: getting recent comments", e);
}
return recentComments;
}
/**
* Get bookmark folder by name.
* @param folderName Name or path of bookmark folder to be returned (null for root)
* @return Folder object requested.
*/
public WeblogBookmarkFolder getBookmarkFolder(String folderName) {
try {
Weblogger roller = WebloggerFactory.getWeblogger();
BookmarkManager bmgr = roller.getBookmarkManager();
if (folderName == null || folderName.equals("nil") || folderName.trim().equals("/")) {
return bmgr.getDefaultFolder(this);
} else {
return bmgr.getFolder(this, folderName);
}
} catch (WebloggerException re) {
log.error("ERROR: fetching folder for weblog", re);
}
return null;
}
/**
* Get number of hits counted today.
*/
public int getTodaysHits() {
try {
Weblogger roller = WebloggerFactory.getWeblogger();
WeblogEntryManager mgr = roller.getWeblogEntryManager();
WeblogHitCount hitCount = mgr.getHitCountByWeblog(this);
return (hitCount != null) ? hitCount.getDailyHits() : 0;
} catch (WebloggerException e) {
log.error("Error getting weblog hit count", e);
}
return 0;
}
/**
* Get a list of TagStats objects for the most popular tags
*
* @param sinceDays Number of days into past (or -1 for all days)
* @param length Max number of tags to return.
* @return Collection of WeblogEntryTag objects
*/
public List<TagStat> getPopularTags(int sinceDays, int length) {
List<TagStat> results = new ArrayList<TagStat>();
Date startDate = null;
if(sinceDays > 0) {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
cal.add(Calendar.DATE, -1 * sinceDays);
startDate = cal.getTime();
}
try {
Weblogger roller = WebloggerFactory.getWeblogger();
WeblogEntryManager wmgr = roller.getWeblogEntryManager();
results = wmgr.getPopularTags(this, startDate, 0, length);
} catch (Exception e) {
log.error("ERROR: fetching popular tags for weblog " + this.getName(), e);
}
return results;
}
public long getCommentCount() {
long count = 0;
try {
Weblogger roller = WebloggerFactory.getWeblogger();
WeblogEntryManager mgr = roller.getWeblogEntryManager();
count = mgr.getCommentCount(this);
} catch (WebloggerException e) {
log.error("Error getting comment count for weblog " + this.getName(), e);
}
return count;
}
public long getEntryCount() {
long count = 0;
try {
Weblogger roller = WebloggerFactory.getWeblogger();
WeblogEntryManager mgr = roller.getWeblogEntryManager();
count = mgr.getEntryCount(this);
} catch (WebloggerException e) {
log.error("Error getting entry count for weblog " + this.getName(), e);
}
return count;
}
/**
* Add a category as a child of this category.
*/
public void addCategory(WeblogCategory category) {
// make sure category is not null
if(category == null || category.getName() == null) {
throw new IllegalArgumentException("Category cannot be null and must have a valid name");
}
// make sure we don't already have a category with that name
if(hasCategory(category.getName())) {
throw new IllegalArgumentException("Duplicate category name '"+category.getName()+"'");
}
// add it to our list of child categories
getWeblogCategories().add(category);
}
public List<WeblogCategory> getWeblogCategories() {
return weblogCategories;
}
public void setWeblogCategories(List<WeblogCategory> cats) {
this.weblogCategories = cats;
}
public boolean hasCategory(String name) {
for (WeblogCategory cat : getWeblogCategories()) {
if(name.equals(cat.getName())) {
return true;
}
}
return false;
}
public List<WeblogBookmarkFolder> getBookmarkFolders() {
return bookmarkFolders;
}
public void setBookmarkFolders(List<WeblogBookmarkFolder> bookmarkFolders) {
this.bookmarkFolders = bookmarkFolders;
}
public List<MediaFileDirectory> getMediaFileDirectories() {
return mediaFileDirectories;
}
public void setMediaFileDirectories(List<MediaFileDirectory> mediaFileDirectories) {
this.mediaFileDirectories = mediaFileDirectories;
}
/**
* Add a bookmark folder to this weblog.
*/
public void addBookmarkFolder(WeblogBookmarkFolder folder) {
// make sure folder is not null
if(folder == null || folder.getName() == null) {
throw new IllegalArgumentException("Folder cannot be null and must have a valid name");
}
// make sure we don't already have a folder with that name
if(this.hasBookmarkFolder(folder.getName())) {
throw new IllegalArgumentException("Duplicate folder name '" + folder.getName() + "'");
}
// add it to our list of child folder
getBookmarkFolders().add(folder);
}
/**
* Does this Weblog have a bookmark folder with the specified name?
*
* @param name The name of the folder to check for.
* @return boolean true if exists, false otherwise.
*/
public boolean hasBookmarkFolder(String name) {
for (WeblogBookmarkFolder folder : this.getBookmarkFolders()) {
if(name.toLowerCase().equals(folder.getName().toLowerCase())) {
return true;
}
}
return false;
}
/**
* Indicates whether this weblog contains the specified media file directory
*
* @param name directory name
*
* @return true if directory is present, false otherwise.
*/
public boolean hasMediaFileDirectory(String name) {
for (MediaFileDirectory directory : this.getMediaFileDirectories()) {
if (directory.getName().equals(name)) {
return true;
}
}
return false;
}
public MediaFileDirectory getMediaFileDirectory(String name) {
for (MediaFileDirectory dir : this.getMediaFileDirectories()) {
if (name.equals(dir.getName())) {
return dir;
}
}
return null;
}
}