blob: be6be1acc2affa20dcf765818c353a56c4e20ee8 [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.business;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.roller.planet.business.PlanetManager;
import org.apache.roller.planet.business.fetcher.FeedFetcher;
import org.apache.roller.weblogger.WebloggerException;
import org.apache.roller.weblogger.business.pings.AutoPingManager;
import org.apache.roller.weblogger.business.pings.PingQueueManager;
import org.apache.roller.weblogger.business.pings.PingTargetManager;
import org.apache.roller.weblogger.business.plugins.PluginManager;
import org.apache.roller.weblogger.business.runnable.ThreadManager;
import org.apache.roller.weblogger.business.search.IndexManager;
import org.apache.roller.weblogger.business.themes.ThemeManager;
import org.apache.roller.weblogger.config.PingConfig;
import org.apache.roller.weblogger.config.WebloggerConfig;
import org.apache.roller.weblogger.config.WebloggerRuntimeConfig;
import org.apache.xmlrpc.util.SAXParsers;
import org.springframework.security.access.method.P;
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXNotSupportedException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import java.io.IOException;
import java.util.Properties;
/**
* The abstract version of the Weblogger implementation.
*
* Here we put code that pertains to *all* implementations of the Weblogger
* interface, regardless of their persistence strategy.
*/
@com.google.inject.Singleton
public abstract class WebloggerImpl implements Weblogger {
private static Log log = LogFactory.getLog(WebloggerImpl.class);
// managers
private final AutoPingManager autoPingManager;
private final BookmarkManager bookmarkManager;
private final IndexManager indexManager;
private final MediaFileManager mediaFileManager;
private final FileContentManager fileContentManager;
private final PingQueueManager pingQueueManager;
private final PingTargetManager pingTargetManager;
private final PluginManager pluginManager;
private final PropertiesManager propertiesManager;
private final ThemeManager themeManager;
private final ThreadManager threadManager;
private final UserManager userManager;
private final WeblogManager weblogManager;
private final WeblogEntryManager weblogEntryManager;
private final OAuthManager oauthManager;
private final FeedFetcher feedFetcher;
private final PlanetManager planetManager;
// url strategy
private final URLStrategy urlStrategy;
private final org.apache.roller.planet.business.PlanetURLStrategy planetUrlStrategy;
// some simple attributes
private final String version;
private final String revision;
private final String buildTime;
private final String buildUser;
protected WebloggerImpl(
AutoPingManager autoPingManager,
BookmarkManager bookmarkManager,
IndexManager indexManager,
MediaFileManager mediaFileManager,
FileContentManager fileContentManager,
PingQueueManager pingQueueManager,
PingTargetManager pingTargetManager,
PluginManager pluginManager,
PropertiesManager propertiesManager,
ThemeManager themeManager,
ThreadManager threadManager,
UserManager userManager,
WeblogManager weblogManager,
WeblogEntryManager weblogEntryManager,
OAuthManager oauthManager,
FeedFetcher feedFetcher,
PlanetManager planetManager,
org.apache.roller.planet.business.PlanetURLStrategy planetUrlStrategy,
URLStrategy urlStrategy) throws WebloggerException {
this.autoPingManager = autoPingManager;
this.bookmarkManager = bookmarkManager;
this.indexManager = indexManager;
this.mediaFileManager = mediaFileManager;
this.fileContentManager = fileContentManager;
this.pingQueueManager = pingQueueManager;
this.pingTargetManager = pingTargetManager;
this.pluginManager = pluginManager;
this.propertiesManager = propertiesManager;
this.themeManager = themeManager;
this.threadManager = threadManager;
this.userManager = userManager;
this.weblogManager = weblogManager;
this.weblogEntryManager = weblogEntryManager;
this.oauthManager = oauthManager;
this.urlStrategy = urlStrategy;
this.feedFetcher = feedFetcher;
this.planetManager = planetManager;
this.planetUrlStrategy = planetUrlStrategy;
Properties props = new Properties();
try {
props.load(getClass().getResourceAsStream("/roller-version.properties"));
} catch (IOException e) {
log.error("roller-version.properties not found", e);
}
version = props.getProperty("ro.version", "UNKNOWN");
revision = props.getProperty("ro.revision", "UNKNOWN");
buildTime = props.getProperty("ro.buildTime", "UNKNOWN");
buildUser = props.getProperty("ro.buildUser", "UNKNOWN");
}
/**
*
*
* @see org.apache.roller.weblogger.business.Weblogger#getThreadManager()
*/
public ThreadManager getThreadManager() {
return threadManager;
}
/**
*
*
* @see org.apache.roller.weblogger.business.Weblogger#getIndexManager()
*/
public IndexManager getIndexManager() {
return indexManager;
}
/**
*
*
* @see org.apache.roller.weblogger.business.Weblogger#getThemeManager()
*/
public ThemeManager getThemeManager() {
return themeManager;
}
/**
*
*
* @see org.apache.roller.weblogger.business.Weblogger#getUserManager()
*/
public UserManager getUserManager() {
return userManager;
}
/**
*
*
* @see org.apache.roller.weblogger.business.Weblogger#getBookmarkManager()
*/
public BookmarkManager getBookmarkManager() {
return bookmarkManager;
}
/**
*
*
* @see org.apache.roller.weblogger.business.Weblogger#getMediaFileManager()
*/
public MediaFileManager getMediaFileManager() {
return mediaFileManager;
}
/**
*
*
* @see org.apache.roller.weblogger.business.Weblogger#getFileContentManager()
*/
public FileContentManager getFileContentManager() {
return fileContentManager;
}
/**
*
*
* @see org.apache.roller.weblogger.business.Weblogger#getWeblogEntryManager()
*/
public WeblogEntryManager getWeblogEntryManager() {
return weblogEntryManager;
}
/**
*
*
* @see org.apache.roller.weblogger.business.Weblogger#getWeblogManager()
*/
public WeblogManager getWeblogManager() {
return weblogManager;
}
/**
*
*
* @see org.apache.roller.weblogger.business.Weblogger#getPropertiesManager()
*/
public PropertiesManager getPropertiesManager() {
return propertiesManager;
}
/**
*
*
* @see org.apache.roller.weblogger.business.Weblogger#getPingTargetManager()
*/
public PingQueueManager getPingQueueManager() {
return pingQueueManager;
}
/**
*
*
* @see org.apache.roller.weblogger.business.Weblogger#getPingTargetManager()
*/
public AutoPingManager getAutopingManager() {
return autoPingManager;
}
/**
*
*
* @see org.apache.roller.weblogger.business.Weblogger#getPingTargetManager()
*/
public PingTargetManager getPingTargetManager() {
return pingTargetManager;
}
/**
*
*
* @see org.apache.roller.weblogger.business.Weblogger#getPluginManager()
*/
public PluginManager getPluginManager() {
return pluginManager;
}
/**
*
*
* @see org.apache.roller.weblogger.business.Weblogger#getOAuthManager()
*/
public OAuthManager getOAuthManager() {
return oauthManager;
}
/**
* @inheritDoc
*/
public URLStrategy getUrlStrategy() {
return urlStrategy;
}
public FeedFetcher getFeedFetcher() {
return feedFetcher;
}
public PlanetManager getPlanetManager() {
return planetManager;
}
public org.apache.roller.planet.business.PlanetURLStrategy getPlanetURLStrategy() {
return planetUrlStrategy;
}
/**
* @inheritDoc
*/
public void release() {
try {
autoPingManager.release();
bookmarkManager.release();
mediaFileManager.release();
fileContentManager.release();
pingTargetManager.release();
pingQueueManager.release();
pluginManager.release();
threadManager.release();
userManager.release();
weblogManager.release();
} catch(Exception e) {
log.error("Error calling Roller.release()", e);
}
}
/**
* @inheritDoc
*/
public void initialize() throws InitializationException {
log.info("Initializing Roller Weblogger business tier");
// TODO: this should probably be done in a more uniform fashion, possibly
// using annotations? biggest issue is controlling ordering
getPropertiesManager().initialize();
getThemeManager().initialize();
getThreadManager().initialize();
getIndexManager().initialize();
getMediaFileManager().initialize();
// Turn off External DTD support in SAXParser to protect Roller from vulnerability.
SAXParserFactory spf = SAXParsers.getSAXParserFactory();
try {
spf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
spf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
} catch (ParserConfigurationException | SAXNotRecognizedException | SAXNotSupportedException e) {
String message = "Unable to turn off External DTD support in SAXParser. XML-RLC is vulnerable";
if ( log.isDebugEnabled() ) {
log.error(message, e);
} else {
log.error(message);
}
}
try {
// Initialize ping systems
// TODO: this should probably be moving inside ping manager initialize() methods?
// Initialize common targets from the configuration
PingConfig.initializeCommonTargets();
// Initialize ping variants
PingConfig.initializePingVariants();
// Remove all autoping configurations if ping usage has been disabled.
if (PingConfig.getDisablePingUsage()) {
log.info("Ping usage has been disabled. Removing any existing auto ping configurations.");
WebloggerFactory.getWeblogger().getAutopingManager().removeAllAutoPings();
}
} catch (Exception e) {
throw new InitializationException("Error initializing ping systems", e);
}
// we always need to do a flush after initialization because it's
// possible that some changes need to be persisted
try {
flush();
} catch(WebloggerException ex) {
throw new InitializationException("Error flushing after initialization", ex);
}
log.info("Roller Weblogger business tier successfully initialized");
}
/**
* @inheritDoc
*/
public void shutdown() {
try {
HitCountQueue.getInstance().shutdown();
if (indexManager != null) {
indexManager.shutdown();
}
if (threadManager != null) {
threadManager.shutdown();
}
} catch(Exception e) {
log.error("Error calling Roller.shutdown()", e);
}
}
/**
* Weblogger version
*/
public String getVersion() {
return version;
}
/**
* Get source code repository revision # used to create build
*/
public String getRevision() {
return revision;
}
/**
* Weblogger build time
*/
public String getBuildTime() {
return buildTime;
}
/**
* Get username that built Weblogger
*/
public String getBuildUser() {
return buildUser;
}
}