diff --git a/CHANGES.md b/CHANGES.md index fa53dc8836..8e6a56dcd0 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -44,6 +44,14 @@ ### Behaviour changes worth reading before upgrading +- **The obsolete weblog update ping feature is removed.** Public ping services + have largely shut down following years of ping spam. The 7.0 database upgrade + drops the three ping tables and removes their settings and task lock. Remove + `PingQueueTask` from `tasks.enabled`, and remove any `tasks.PingQueueTask.*` + and `pings.*` settings from `roller-custom.properties` before upgrading. + If the removed task class is still configured, Roller logs a task-loading + error and continues startup. + - **Roller now runs on Jakarta EE** ([ROL-2183](https://issues.apache.org/jira/browse/ROL-2183)). It needs Java 17 or later and a Servlet 6.1 container such as Tomcat 11. Tomcat 9 and other diff --git a/app/src/main/java/org/apache/roller/weblogger/business/Weblogger.java b/app/src/main/java/org/apache/roller/weblogger/business/Weblogger.java index 62f498efbc..85924bebf3 100644 --- a/app/src/main/java/org/apache/roller/weblogger/business/Weblogger.java +++ b/app/src/main/java/org/apache/roller/weblogger/business/Weblogger.java @@ -22,9 +22,6 @@ import org.apache.roller.planet.business.fetcher.FeedFetcher; import org.apache.roller.weblogger.WebloggerException; import org.apache.roller.weblogger.business.plugins.PluginManager; -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.runnable.ThreadManager; import org.apache.roller.weblogger.business.search.IndexManager; import org.apache.roller.weblogger.business.themes.ThemeManager; @@ -63,24 +60,6 @@ public interface Weblogger { WeblogEntryManager getWeblogEntryManager(); - /** - * Get the AutoPingManager associated with this Weblogger instance. - */ - AutoPingManager getAutopingManager(); - - - /** - * Get the PingTargetManager associated with this Weblogger instance. - */ - PingTargetManager getPingTargetManager(); - - - /** - * Get the PingQueueManager associated with this Weblogger instance. - */ - PingQueueManager getPingQueueManager(); - - /** * * Get PropertiesManager associated with this Weblogger instance. diff --git a/app/src/main/java/org/apache/roller/weblogger/business/WebloggerImpl.java b/app/src/main/java/org/apache/roller/weblogger/business/WebloggerImpl.java index a7e4977359..9696295f0e 100644 --- a/app/src/main/java/org/apache/roller/weblogger/business/WebloggerImpl.java +++ b/app/src/main/java/org/apache/roller/weblogger/business/WebloggerImpl.java @@ -23,14 +23,10 @@ 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.util.SecureXmlParsers; @@ -50,13 +46,10 @@ public abstract class WebloggerImpl implements Weblogger { private static final 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; @@ -79,13 +72,10 @@ public abstract class WebloggerImpl implements Weblogger { protected WebloggerImpl( - AutoPingManager autoPingManager, BookmarkManager bookmarkManager, IndexManager indexManager, MediaFileManager mediaFileManager, FileContentManager fileContentManager, - PingQueueManager pingQueueManager, - PingTargetManager pingTargetManager, PluginManager pluginManager, PropertiesManager propertiesManager, ThemeManager themeManager, @@ -98,13 +88,10 @@ protected WebloggerImpl( 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; @@ -240,39 +227,6 @@ public PropertiesManager getPropertiesManager() { } - /** - * - * - * @see org.apache.roller.weblogger.business.Weblogger#getPingTargetManager() - */ - @Override - public PingQueueManager getPingQueueManager() { - return pingQueueManager; - } - - - /** - * - * - * @see org.apache.roller.weblogger.business.Weblogger#getPingTargetManager() - */ - @Override - public AutoPingManager getAutopingManager() { - return autoPingManager; - } - - - /** - * - * - * @see org.apache.roller.weblogger.business.Weblogger#getPingTargetManager() - */ - @Override - public PingTargetManager getPingTargetManager() { - return pingTargetManager; - } - - /** * * @@ -313,12 +267,9 @@ public org.apache.roller.planet.business.PlanetURLStrategy getPlanetURLStrategy( @Override public void release() { try { - autoPingManager.release(); bookmarkManager.release(); mediaFileManager.release(); fileContentManager.release(); - pingTargetManager.release(); - pingQueueManager.release(); pluginManager.release(); threadManager.release(); userManager.release(); @@ -349,25 +300,6 @@ public void initialize() throws InitializationException { // configuration. If it cannot be applied, startup fails. SecureXmlParsers.installForXmlRpc(); - 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 { diff --git a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAAutoPingManagerImpl.java b/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAAutoPingManagerImpl.java deleted file mode 100644 index 627557be6e..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAAutoPingManagerImpl.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * 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.jpa; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -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.config.PingConfig; -import org.apache.roller.weblogger.pojos.AutoPing; -import org.apache.roller.weblogger.pojos.PingTarget; -import org.apache.roller.weblogger.pojos.WeblogEntry; -import org.apache.roller.weblogger.pojos.Weblog; -import java.util.Collection; -import java.util.List; -import jakarta.persistence.Query; -import jakarta.persistence.TypedQuery; -import org.apache.roller.weblogger.business.Weblogger; - -/* - * JPAAutoPingManagerImpl.java - * - * Created on May 29, 2006, 11:29 AM - * - */ -@com.google.inject.Singleton -public class JPAAutoPingManagerImpl implements AutoPingManager { - - private final Weblogger roller; - private final JPAPersistenceStrategy strategy; - /** - * The logger instance for this class. - */ - private static final Log logger = LogFactory.getFactory().getInstance(JPAAutoPingManagerImpl.class); - - /** - * Creates a new instance of JPAAutoPingManagerImpl - */ - @com.google.inject.Inject - protected JPAAutoPingManagerImpl(Weblogger roller, JPAPersistenceStrategy strategy) { - this.roller = roller; - this.strategy = strategy; - } - - @Override - public AutoPing getAutoPing(String id) throws WebloggerException { - return (AutoPing) strategy.load(AutoPing.class, id); - } - - @Override - public void saveAutoPing(AutoPing autoPing) throws WebloggerException { - strategy.store(autoPing); - } - - @Override - public void removeAutoPing(AutoPing autoPing) throws WebloggerException { - strategy.remove(autoPing); - } - - @Override - public void removeAutoPing(PingTarget pingTarget, Weblog website) throws WebloggerException { - Query q = strategy.getNamedUpdate("AutoPing.removeByPingTarget&Website"); - q.setParameter(1, pingTarget); - q.setParameter(2, website); - q.executeUpdate(); - } - - @Override - public void removeAutoPings(Collection autopings) throws WebloggerException { - strategy.removeAll(autopings); - } - - @Override - public void removeAllAutoPings() throws WebloggerException { - TypedQuery q = strategy.getNamedQueryCommitFirst("AutoPing.getAll", AutoPing.class); - removeAutoPings(q.getResultList()); - } - - @Override - public void queueApplicableAutoPings(WeblogEntry changedWeblogEntry) throws WebloggerException { - if (PingConfig.getSuspendPingProcessing()) { - if (logger.isDebugEnabled()) { - logger.debug("Ping processing is suspended." + " No auto pings will be queued."); - } - return; - } - - PingQueueManager pingQueueMgr = roller.getPingQueueManager(); - List applicableAutopings = getApplicableAutoPings(changedWeblogEntry); - for (AutoPing autoPing : applicableAutopings) { - pingQueueMgr.addQueueEntry(autoPing); - } - } - - @Override - public List getAutoPingsByWebsite(Weblog website) throws WebloggerException { - TypedQuery q = strategy.getNamedQuery("AutoPing.getByWebsite", AutoPing.class); - q.setParameter(1, website); - return q.getResultList(); - } - - @Override - public List getAutoPingsByTarget(PingTarget pingTarget) throws WebloggerException { - TypedQuery q = strategy.getNamedQuery("AutoPing.getByPingTarget", AutoPing.class); - q.setParameter(1, pingTarget); - return q.getResultList(); - } - - @Override - public List getApplicableAutoPings(WeblogEntry changedWeblogEntry) throws WebloggerException { - return getAutoPingsByWebsite(changedWeblogEntry.getWebsite()); - } - - @Override - public void release() { - } -} \ No newline at end of file diff --git a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAPingQueueManagerImpl.java b/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAPingQueueManagerImpl.java deleted file mode 100644 index fd651d8409..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAPingQueueManagerImpl.java +++ /dev/null @@ -1,122 +0,0 @@ - -/* - * 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.jpa; - -import java.sql.Timestamp; -import java.util.List; -import jakarta.persistence.TypedQuery; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.roller.weblogger.WebloggerException; -import org.apache.roller.weblogger.business.pings.PingQueueManager; -import org.apache.roller.weblogger.pojos.AutoPing; -import org.apache.roller.weblogger.pojos.PingQueueEntry; - -/* - * JPAPingQueueManagerImpl.java - * - * Created on May 28, 2006, 4:11 PM - * - */ -@com.google.inject.Singleton -public class JPAPingQueueManagerImpl implements PingQueueManager { - - private static final Log log = LogFactory.getLog(JPAPingQueueManagerImpl.class); - - /** The strategy for this manager. */ - private final JPAPersistenceStrategy strategy; - - - /** - * Creates a new instance of JPAPingQueueManagerImpl - */ - @com.google.inject.Inject - protected JPAPingQueueManagerImpl(JPAPersistenceStrategy strategy) { - this.strategy = strategy; - } - - - @Override - public PingQueueEntry getQueueEntry(String id) - throws WebloggerException { - return (PingQueueEntry)strategy.load( - PingQueueEntry.class, id); - } - - @Override - public void saveQueueEntry(PingQueueEntry pingQueueEntry) - throws WebloggerException { - log.debug("Storing ping queue entry: " + pingQueueEntry); - strategy.store(pingQueueEntry); - } - - @Override - public void removeQueueEntry(PingQueueEntry pingQueueEntry) - throws WebloggerException { - log.debug("Removing ping queue entry: " + pingQueueEntry); - strategy.remove(pingQueueEntry); - } - - - @Override - public void addQueueEntry(AutoPing autoPing) throws WebloggerException { - log.debug("Creating new ping queue entry for auto ping configuration: " - + autoPing); - - // First check if there is an existing ping queue entry - // for the same target and website - if (isAlreadyQueued(autoPing)) { - log.debug("A ping queue entry is already present" + - " for this ping target and website: " + autoPing); - return; - } - - Timestamp now = new Timestamp(System.currentTimeMillis()); - PingQueueEntry pingQueueEntry = - new PingQueueEntry( - null, now, autoPing.getPingTarget(), - autoPing.getWebsite(), 0); - this.saveQueueEntry(pingQueueEntry); - } - - @Override - public List getAllQueueEntries() - throws WebloggerException { - return strategy.getNamedQuery("PingQueueEntry.getAllOrderByEntryTime", - PingQueueEntry.class).getResultList(); - } - - // private helper to determine if an has already been queued - // for the same website and ping target. - private boolean isAlreadyQueued(AutoPing autoPing) - throws WebloggerException { - // first, determine if an entry already exists - TypedQuery q = strategy.getNamedQuery("PingQueueEntry.getByPingTarget&Website", - PingQueueEntry.class); - q.setParameter(1, autoPing.getPingTarget()); - q.setParameter(2, autoPing.getWebsite()); - return !q.getResultList().isEmpty(); - } - - @Override - public void release() {} - - -} diff --git a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAPingTargetManagerImpl.java b/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAPingTargetManagerImpl.java deleted file mode 100644 index 0112278719..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAPingTargetManagerImpl.java +++ /dev/null @@ -1,156 +0,0 @@ - -/* - * 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.jpa; - -import java.net.InetAddress; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.UnknownHostException; -import java.util.List; -import jakarta.persistence.Query; -import jakarta.persistence.TypedQuery; - -import org.apache.roller.weblogger.WebloggerException; -import org.apache.roller.weblogger.business.pings.PingTargetManager; -import org.apache.roller.weblogger.pojos.PingTarget; - -/* - * JPAPingTargetManagerImpl.java - * - * Created on May 29, 2006, 2:24 PM - * - */ -@com.google.inject.Singleton -public class JPAPingTargetManagerImpl implements PingTargetManager { - - private final JPAPersistenceStrategy strategy; - - @com.google.inject.Inject - protected JPAPingTargetManagerImpl(JPAPersistenceStrategy strategy) { - this.strategy = strategy; - } - - - @Override - public void removePingTarget(PingTarget pingTarget) - throws WebloggerException { - // remove contents and then target - this.removePingTargetContents(pingTarget); - this.strategy.remove(pingTarget); - } - - /** - * Convenience method which removes any queued pings or auto pings that - * reference the given ping target. - */ - private void removePingTargetContents(PingTarget ping) - throws WebloggerException { - // Remove the website's ping queue entries - Query q = strategy.getNamedUpdate("PingQueueEntry.removeByPingTarget"); - q.setParameter(1, ping); - q.executeUpdate(); - - // Remove the website's auto ping configurations - q = strategy.getNamedUpdate("AutoPing.removeByPingTarget"); - q.setParameter(1, ping); - q.executeUpdate(); - } - - @Override - public void savePingTarget(PingTarget pingTarget) - throws WebloggerException { - strategy.store(pingTarget); - } - - @Override - public PingTarget getPingTarget(String id) - throws WebloggerException { - return (PingTarget)strategy.load(PingTarget.class, id); - } - - @Override - public boolean targetNameExists(String pingTargetName) - throws WebloggerException { - - // Within that set of targets, fail if there is a target - // with the same name and that target doesn't - // have the same id. - for (PingTarget pt : getCommonPingTargets()) { - if (pt.getName().equals(pingTargetName)) { - return true; - } - } - // No conflict found - return false; - } - - - @Override - public boolean isUrlWellFormed(String url) - throws WebloggerException { - - if (url == null || url.isBlank()) { - return false; - } - try { - URL parsedUrl = new URL(url); - // OK. If we get here, it parses ok. Now just check - // that the protocol is http and there is a host portion. - boolean isHttp = parsedUrl.getProtocol().equals("http"); - boolean hasHost = parsedUrl.getHost() != null && !parsedUrl.getHost().isBlank(); - return isHttp && hasHost; - } catch (MalformedURLException e) { - return false; - } - } - - - @Override - public boolean isHostnameKnown(String url) - throws WebloggerException { - if (url == null || url.isBlank()) { - return false; - } - try { - URL parsedUrl = new URL(url); - String host = parsedUrl.getHost(); - if (host == null || host.isBlank()) { - return false; - } - InetAddress addr = InetAddress.getByName(host); - return true; - } catch (MalformedURLException e) { - return false; - } catch (UnknownHostException e) { - return false; - } - } - - @Override - public List getCommonPingTargets() - throws WebloggerException { - TypedQuery q = strategy.getNamedQuery( - "PingTarget.getPingTargetsOrderByName", PingTarget.class); - return q.getResultList(); - } - - @Override - public void release() {} - -} diff --git a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWeblogEntryManagerImpl.java b/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWeblogEntryManagerImpl.java index 93a478a9ed..0d50b3bb2b 100644 --- a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWeblogEntryManagerImpl.java +++ b/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWeblogEntryManagerImpl.java @@ -178,7 +178,7 @@ public void removeComment(WeblogEntryComment comment) throws WebloggerException /** * @inheritDoc */ - // TODO: perhaps the createAnchor() and queuePings() items should go outside this method? + // TODO: perhaps createAnchor() should go outside this method? @Override public void saveWeblogEntry(WeblogEntry entry) throws WebloggerException { @@ -246,10 +246,6 @@ public void saveWeblogEntry(WeblogEntry entry) throws WebloggerException { roller.getWeblogManager().saveWeblog(entry.getWebsite()); } - if(entry.isPublished()) { - // Queue applicable pings for this update. - roller.getAutopingManager().queueApplicableAutoPings(entry); - } } /** diff --git a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWeblogManagerImpl.java b/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWeblogManagerImpl.java index 50e96eef75..0fdc386694 100644 --- a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWeblogManagerImpl.java +++ b/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWeblogManagerImpl.java @@ -22,8 +22,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.roller.weblogger.WebloggerException; -import org.apache.roller.weblogger.business.pings.AutoPingManager; -import org.apache.roller.weblogger.business.pings.PingTargetManager; import org.apache.roller.weblogger.config.WebloggerConfig; import jakarta.persistence.NoResultException; @@ -45,10 +43,7 @@ import org.apache.roller.weblogger.business.WeblogManager; import org.apache.roller.weblogger.business.Weblogger; import org.apache.roller.weblogger.business.WebloggerFactory; -import org.apache.roller.weblogger.pojos.AutoPing; import org.apache.roller.weblogger.pojos.CustomTemplateRendition; -import org.apache.roller.weblogger.pojos.PingQueueEntry; -import org.apache.roller.weblogger.pojos.PingTarget; import org.apache.roller.weblogger.pojos.StatCount; import org.apache.roller.weblogger.pojos.StatCountCountComparator; import org.apache.roller.weblogger.pojos.TagStat; @@ -156,21 +151,6 @@ private void removeWeblogContents(Weblog weblog) removeCounts.setParameter(1, 0); removeCounts.executeUpdate(); - // Remove the weblog's ping queue entries - TypedQuery q = strategy.getNamedQuery("PingQueueEntry.getByWebsite", PingQueueEntry.class); - q.setParameter(1, weblog); - List queueEntries = q.getResultList(); - for (Object obj : queueEntries) { - this.strategy.remove(obj); - } - - // Remove the weblog's auto ping configurations - AutoPingManager autoPingMgr = roller.getAutopingManager(); - List autopings = autoPingMgr.getAutoPingsByWebsite(weblog); - for (AutoPing autoPing : autopings) { - this.strategy.remove(autoPing); - } - // remove associated templates TypedQuery templateQuery = strategy.getNamedQuery("WeblogTemplate.getByWeblog", WeblogTemplate.class); @@ -347,19 +327,6 @@ private void addWeblogContents(Weblog newWeblog) // flush so that all data up to this point can be available in db this.strategy.flush(); - - // add any auto enabled ping targets - PingTargetManager pingTargetMgr = roller.getPingTargetManager(); - AutoPingManager autoPingMgr = roller.getAutopingManager(); - - for (PingTarget pingTarget : pingTargetMgr.getCommonPingTargets()) { - if(pingTarget.isAutoEnabled()) { - AutoPing autoPing = new AutoPing( - null, pingTarget, newWeblog); - autoPingMgr.saveAutoPing(autoPing); - } - } - } @Override diff --git a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerImpl.java b/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerImpl.java index 91597ca10e..38933ec92c 100644 --- a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerImpl.java +++ b/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerImpl.java @@ -22,9 +22,6 @@ import org.apache.roller.planet.business.fetcher.FeedFetcher; import org.apache.roller.weblogger.WebloggerException; import org.apache.roller.weblogger.business.*; -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; @@ -47,13 +44,10 @@ public class JPAWebloggerImpl extends WebloggerImpl { @com.google.inject.Inject protected JPAWebloggerImpl( JPAPersistenceStrategy strategy, - AutoPingManager autoPingManager, BookmarkManager bookmarkManager, IndexManager indexManager, MediaFileManager mediaFileManager, FileContentManager fileContentManager, - PingQueueManager pingQueueManager, - PingTargetManager pingTargetManager, PluginManager pluginManager, PropertiesManager propertiesManager, ThemeManager themeManager, @@ -67,13 +61,10 @@ protected JPAWebloggerImpl( URLStrategy urlStrategy) throws WebloggerException { super( - autoPingManager, bookmarkManager, indexManager, mediaFileManager, fileContentManager, - pingQueueManager, - pingTargetManager, pluginManager, propertiesManager, themeManager, diff --git a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerModule.java b/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerModule.java index f3e392862a..2906d6f63f 100644 --- a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerModule.java +++ b/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerModule.java @@ -38,9 +38,6 @@ import org.apache.roller.weblogger.business.UserManager; import org.apache.roller.weblogger.business.WeblogEntryManager; import org.apache.roller.weblogger.business.WeblogManager; -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.plugins.PluginManagerImpl; import org.apache.roller.weblogger.business.runnable.ThreadManager; @@ -63,10 +60,7 @@ public void configure(Binder binder) { binder.bind(JPAPersistenceStrategy.class); - binder.bind(AutoPingManager.class).to( JPAAutoPingManagerImpl.class); binder.bind(BookmarkManager.class).to( JPABookmarkManagerImpl.class); - binder.bind(PingQueueManager.class).to( JPAPingQueueManagerImpl.class); - binder.bind(PingTargetManager.class).to( JPAPingTargetManagerImpl.class); binder.bind(PropertiesManager.class).to( JPAPropertiesManagerImpl.class); binder.bind(ThreadManager.class).to( JPAThreadManagerImpl.class); binder.bind(UserManager.class).to( JPAUserManagerImpl.class); diff --git a/app/src/main/java/org/apache/roller/weblogger/business/pings/AutoPingManager.java b/app/src/main/java/org/apache/roller/weblogger/business/pings/AutoPingManager.java deleted file mode 100644 index 7a8b4312db..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/business/pings/AutoPingManager.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * 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.pings; - -import java.util.Collection; -import java.util.List; -import org.apache.roller.weblogger.WebloggerException; -import org.apache.roller.weblogger.pojos.AutoPing; -import org.apache.roller.weblogger.pojos.PingTarget; -import org.apache.roller.weblogger.pojos.WeblogEntry; -import org.apache.roller.weblogger.pojos.Weblog; - - -/** - * Manages autoping storage/retrieval, queries and queue. - */ -public interface AutoPingManager { - - - /** - * Store an auto ping configuration. - * - * @param autoPing the auto ping configuration - * @throws WebloggerException - */ - void saveAutoPing(AutoPing autoPing) throws WebloggerException; - - - /** - * Remove the auto ping configuration with given id. - * - * @param autoPing the auto ping configuration to remove - * @throws WebloggerException - */ - void removeAutoPing(AutoPing autoPing) throws WebloggerException; - - - /** - * Remove the auto ping configuration for the given ping target and website, if one exists. Returns silently if it - * doesn't exist. - * - * @param pingTarget the ping target - * @param website the website - * @throws WebloggerException - */ - void removeAutoPing(PingTarget pingTarget, Weblog website) throws WebloggerException; - - - /** - * Remove a collection of auto ping configurations. - * - * @param autopings a Collection of AAutoPing/code> objects - * @throws WebloggerException - */ - void removeAutoPings(Collection autopings) throws WebloggerException; - - - /** - * Remove all auto ping configurations for all websites. - * - * @throws WebloggerException - */ - void removeAllAutoPings() throws WebloggerException; - - - /** - * Retrieve an auto ping configuration by id. - * - * @param id the id of the auto ping configuration to retrieve. - * @return the auto ping configuration with specified id or null if not found - * @throws WebloggerException - */ - AutoPing getAutoPing(String id) throws WebloggerException; - - - /** - * Get all of the auto ping configurations for the given website. - * - * @param website - * @return a list of auto ping configurations for the given website as AuAutoPingcode> objects. - */ - List getAutoPingsByWebsite(Weblog website) throws WebloggerException; - - - /** - * Get all of the auto ping configurations for a given target (across all websites). - * - * @param pingTarget - * @return a list of auto ping configurations for the given target as AuAutoPingcode> objects. - */ - List getAutoPingsByTarget(PingTarget pingTarget) throws WebloggerException; - - - /** - * Get the auto ping configurations that should be pinged upon creation/change of the given weblog entry. - * - * @param changedWeblogEntry the entry that has been created or changed - * @return a list of the ping configurations that should be applied due to this change - */ - List getApplicableAutoPings(WeblogEntry changedWeblogEntry) throws WebloggerException; - - - /** - * Queue the auto ping configurations that should be pinged upon change to the given weblog entry. This calls the - * {@link PingQueueManager} to queue ping requests for each ping configuration that should be applied on change to - * the given weblog entry. If ping processing is suspended, this returns without doing anything. - * - * @param changedWeblogEntry the entry that has been created or changed - */ - void queueApplicableAutoPings(WeblogEntry changedWeblogEntry) throws WebloggerException; - - /** - * Release all resources associated with Roller session. - */ - void release(); - -} diff --git a/app/src/main/java/org/apache/roller/weblogger/business/pings/PingQueueManager.java b/app/src/main/java/org/apache/roller/weblogger/business/pings/PingQueueManager.java deleted file mode 100644 index 67fb4aecb1..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/business/pings/PingQueueManager.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * 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.pings; - -import java.util.List; -import org.apache.roller.weblogger.WebloggerException; -import org.apache.roller.weblogger.pojos.AutoPing; -import org.apache.roller.weblogger.pojos.PingQueueEntry; - - -/** - * PingQueueManager. This interface describes the manager for the weblog update ping request queue. The queue is - * processed by the PingQueueProcesssor and PingQueueTask components in the application - * layer. - */ -public interface PingQueueManager { - - - /** - * Add a new persistent entry to the queue. If the queue already contains an entry for the ping target and website - * specified by this auto ping configuration, a new one will not be added. - * - * @param autoPing auto ping configuration for the ping request to be queued. - */ - void addQueueEntry(AutoPing autoPing) throws WebloggerException; - - - /** - * Store the given queue entry. - * - * @param pingQueueEntry update the given queue entry - * @throws WebloggerException - */ - void saveQueueEntry(PingQueueEntry pingQueueEntry) throws WebloggerException; - - - /** - * Remove a queue entry. - * - * @param pingQueueEntry the entry to be removed. - * @throws WebloggerException - */ - void removeQueueEntry(PingQueueEntry pingQueueEntry) throws WebloggerException; - - - /** - * Retrieve an entry from the queue. - * - * @param id the unique id of the entry. - * @return the queue entry with the specified id. - * @throws WebloggerException - */ - PingQueueEntry getQueueEntry(String id) throws WebloggerException; - - - /** - * Get all of the queue entries. - * - * @return the queue as a List of {@link PingQueueEntry objects. - * @throws WebloggerException - */ - List getAllQueueEntries() throws WebloggerException; - - - /** - * Release all resources associated with Roller session. - */ - void release(); - -} diff --git a/app/src/main/java/org/apache/roller/weblogger/business/pings/PingQueueProcessor.java b/app/src/main/java/org/apache/roller/weblogger/business/pings/PingQueueProcessor.java deleted file mode 100644 index 69a08aceae..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/business/pings/PingQueueProcessor.java +++ /dev/null @@ -1,184 +0,0 @@ -/* - * 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.pings; - -import java.util.List; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.roller.weblogger.WebloggerException; -import org.apache.roller.weblogger.business.WebloggerFactory; -import org.apache.roller.weblogger.config.PingConfig; -import org.apache.roller.weblogger.config.WebloggerRuntimeConfig; -import org.apache.roller.weblogger.pojos.PingQueueEntry; -import org.apache.roller.weblogger.pojos.PingTarget; -import org.apache.roller.weblogger.pojos.Weblog; - - -/** - * Ping Queue Processor. Singleton encapsulating logic for processing the weblog update ping queue. - * - * @author Anil Gangolli - */ -public final class PingQueueProcessor { - - private static final Log LOGGER = LogFactory.getLog(PingQueueProcessor.class); - - private static PingQueueProcessor theInstance; - - private PingQueueManager pingQueueMgr; - - - public static PingQueueProcessor getInstance() { - return theInstance; - } - - - private PingQueueProcessor() throws WebloggerException { - pingQueueMgr = WebloggerFactory.getWeblogger().getPingQueueManager(); - } - - - /** - * Initialize the singleton. This is called during RollerContext initialization. - * - * @throws WebloggerException - */ - public static synchronized void init() throws WebloggerException { - if (theInstance != null) { - LOGGER.warn("Ignoring duplicate initialization of PingQueueProcessor!"); - return; - } - theInstance = new PingQueueProcessor(); - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Ping queue processor initialized."); - } - } - - - /** - * Process the ping queue. Performs one pass through the ping queue, processing every entry once. On ping failure - * an entry is requeued for processing on subsequent passes until the configured maximum number of attempts is - * reached. - */ - public synchronized void processQueue() { - if (PingConfig.getSuspendPingProcessing()) { - LOGGER.info("Ping processing has been suspended. Skipping current round of ping queue processing."); - return; - } - - String absoluteContextUrl = WebloggerRuntimeConfig.getAbsoluteContextURL(); - if (absoluteContextUrl == null) { - LOGGER.warn("WARNING: Skipping current ping queue processing round because we cannot yet determine the site's absolute context url."); - return; - } - - // TODO: Group by ping target and ping all sites for that target? - // We're currently not taking advantage of grouping by ping target site and then sending - // all of the pings for that target at once. If it becomes an efficiency issue, we should do - // that. - - try { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Started processing ping queue."); - } - // Get all of the entries - List entries = pingQueueMgr.getAllQueueEntries(); - - // Process each entry - for (PingQueueEntry pingQueueEntry : entries) { - processQueueEntry(pingQueueEntry); - } - - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Finished processing ping queue."); - } - } catch (Exception ex) { - LOGGER.error("Unexpected exception processing ping queue! Aborting this pass of ping queue processing.", ex); - } - } - - - /** - * Process an individual ping queue entry. - * - * @param pingQueueEntry the ping queue entry - * @throws WebloggerException only if there are problems processing the queue. Exceptions from sending pings are - * handled, not thrown. - */ - private void processQueueEntry(PingQueueEntry pingQueueEntry) throws WebloggerException { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Processing ping queue entry: " + pingQueueEntry); - } - - PingTarget pingTarget = pingQueueEntry.getPingTarget(); - Weblog website = pingQueueEntry.getWebsite(); - boolean pingSucceeded = false; - if (PingConfig.getLogPingsOnly()) { - // Just log the ping and pretend it succeeded. - LOGGER.info("Logging simulated ping for ping queue entry " + pingQueueEntry); - pingSucceeded = true; - } else { - // Actually process the ping - try { - // Send the ping - WeblogUpdatePinger.sendPing(pingTarget, website); - // Consider successful ping transmission if we didn't get an exception. We don't care here - // about the result of the ping if it was transmitted. - pingSucceeded = true; - } catch (Exception ex) { - // Handle the ping error, either removing or requeuing the ping queue entry. - handlePingError(pingQueueEntry, ex); - } - } - // We do this outside of the previous try-catch because we don't want an exception here to be considered a ping error. - if (pingSucceeded) { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Processed ping: " + pingQueueEntry); - } - pingQueueMgr.removeQueueEntry(pingQueueEntry); - } - } - - - /** - * Handle any ping error. - * - * @param pingQueueEntry the ping queue entry - * @param ex the exception that occurred on the ping attempt - * @throws WebloggerException - */ - private void handlePingError(PingQueueEntry pingQueueEntry, Exception ex) - throws WebloggerException { - - if ((pingQueueEntry.incrementAttempts() < PingConfig.getMaxPingAttempts()) && WeblogUpdatePinger.shouldRetry(ex)) { - // We have attempts remaining, and it looks like we should retry, - // so requeue the entry for processing on subsequent rounds - LOGGER.debug("Error on ping attempt (" + pingQueueEntry.getAttempts() + ") for " + pingQueueEntry + ": [" + ex.getMessage() + "]. Will re-queue for later attempts."); - LOGGER.debug("Error on last ping attempt was: ", ex); - pingQueueMgr.saveQueueEntry(pingQueueEntry); - } else { - // Remove the entry - LOGGER.warn("Error on ping attempt (" + pingQueueEntry.getAttempts() + ") for " + pingQueueEntry + ": [" + ex.getMessage() + "]. Entry will be REMOVED from ping queue."); - LOGGER.debug("Error on last ping attempt was: ", ex); - pingQueueMgr.removeQueueEntry(pingQueueEntry); - // TODO: mark ping target invalid? - } - } - -} diff --git a/app/src/main/java/org/apache/roller/weblogger/business/pings/PingQueueTask.java b/app/src/main/java/org/apache/roller/weblogger/business/pings/PingQueueTask.java deleted file mode 100644 index 58ae0f1dc8..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/business/pings/PingQueueTask.java +++ /dev/null @@ -1,171 +0,0 @@ -/* - * 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.pings; - -import java.util.Date; -import java.util.Properties; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.roller.weblogger.WebloggerException; -import org.apache.roller.weblogger.business.runnable.RollerTaskWithLeasing; -import org.apache.roller.weblogger.business.WebloggerFactory; - - -/** - * Task for processing the ping queue at fixed intervals. This is set up during context initialization by {@link - * org.apache.roller.weblogger.ui.core.RollerContext}. The queue processing interval is currently set from the configuration {@link - * org.apache.roller.weblogger.config.PingConfig} at startup time only. - * - * @author Anil Gangolli - */ -public class PingQueueTask extends RollerTaskWithLeasing { - private static Log log = LogFactory.getLog(PingQueueTask.class); - - public static final String NAME = "PingQueueTask"; - - // a unique id for this specific task instance - // this is meant to be unique for each client in a clustered environment - private String clientId = null; - - // a String description of when to start this task - private String startTimeDesc = "immediate"; - - // interval at which the task is run, default is 5 minutes - private int interval = 5; - - // lease time given to task lock - private int leaseTime = RollerTaskWithLeasing.DEFAULT_LEASE_MINS; - - - @Override - public String getClientId() { - return clientId; - } - - @Override - public Date getStartTime(Date currentTime) { - return getAdjustedTime(currentTime, startTimeDesc); - } - - @Override - public String getStartTimeDesc() { - return startTimeDesc; - } - - @Override - public int getInterval() { - return this.interval; - } - - @Override - public int getLeaseTime() { - return this.leaseTime; - } - - - public void init() throws WebloggerException { - this.init(PingQueueTask.NAME); - } - - @Override - public void init(String name) throws WebloggerException { - super.init(name); - - // get relevant props - Properties props = this.getTaskProperties(); - - // extract clientId - String client = props.getProperty("clientId"); - if(client != null) { - this.clientId = client; - } - - // extract start time - String startTimeStr = props.getProperty("startTime"); - if(startTimeStr != null) { - this.startTimeDesc = startTimeStr; - } - - // extract interval - String intervalStr = props.getProperty("interval"); - if(intervalStr != null) { - try { - this.interval = Integer.parseInt(intervalStr); - } catch (NumberFormatException ex) { - log.warn("Invalid interval: "+intervalStr); - } - } - - // extract lease time - String leaseTimeStr = props.getProperty("leaseTime"); - if(leaseTimeStr != null) { - try { - this.leaseTime = Integer.parseInt(leaseTimeStr); - } catch (NumberFormatException ex) { - log.warn("Invalid leaseTime: "+leaseTimeStr); - } - } - - // initialize queue processor - PingQueueProcessor.init(); - } - - - /** - * Run the task once. - */ - @Override - public void runTask() { - - try { - log.debug("task started"); - - PingQueueProcessor.getInstance().processQueue(); - WebloggerFactory.getWeblogger().flush(); - - log.debug("task completed"); - - } catch (WebloggerException e) { - log.error("Error while processing ping queue", e); - } catch (Exception ee) { - log.error("unexpected exception", ee); - } finally { - // always release - WebloggerFactory.getWeblogger().release(); - } - - } - - - /** - * Main method so that this task may be run from outside the webapp. - */ - public static void main(String[] args) throws Exception { - try { - PingQueueTask task = new PingQueueTask(); - task.init(); - task.run(); - System.exit(0); - } catch (WebloggerException ex) { - ex.printStackTrace(); - System.exit(-1); - } - } - -} diff --git a/app/src/main/java/org/apache/roller/weblogger/business/pings/PingTargetManager.java b/app/src/main/java/org/apache/roller/weblogger/business/pings/PingTargetManager.java deleted file mode 100644 index 8438f87e91..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/business/pings/PingTargetManager.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * 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.pings; - -import java.util.List; -import org.apache.roller.weblogger.WebloggerException; -import org.apache.roller.weblogger.pojos.PingTarget; - - -/** - * Manages ping targets. - * - * @author Anil Gangolli - */ -public interface PingTargetManager { - - - /** - * Store a ping target. - * - * @param pingTarget ping target data object. - * @throws WebloggerException - */ - void savePingTarget(PingTarget pingTarget) throws WebloggerException; - - - /** - * Remove a ping target. - * - * @throws WebloggerException - */ - void removePingTarget(PingTarget pingTarget) throws WebloggerException; - - - /** - * Retrieve a specific ping target by id. - * - * @param id id of the ping target to be retrieved. - * @return the ping target whose id is specified. - * @throws WebloggerException - */ - PingTarget getPingTarget(String id) throws WebloggerException; - - - /** - * Get a list of the common (shared) ping targets. - * - * @return the list of common ping targets as a List of {@link PingTarget objects - * @throws WebloggerException - */ - List getCommonPingTargets() throws WebloggerException; - - /** - * Check if the ping target name already exists in Roller. - * - * @param pingTargetName ping target name to check - * @return true if there is already a ping target with this name, false otherwise - * @throws WebloggerException - */ - boolean targetNameExists(String pingTargetName) throws WebloggerException; - - /** - * Check if the url of a ping target is well-formed. For this test, it must parse as a java.net.URL, - * with protocol http and a non-empty host portion. - * - * @param pingTargetUrl url to check. - * @return true if the pingTargetUrl property of the ping target is a well-formed url. - * @throws WebloggerException - */ - boolean isUrlWellFormed(String pingTargetUrl) throws WebloggerException; - - - /** - * Check if the host portion of the url of a ping target is known, meaning it is either a well-formed IP address - * or a hostname that resolves from the server. The ping target url must parse as a java.net.URL in - * order for the hostname to be extracted for this test. This will return false if that parsing fails. - * - * @param pingTargetUrl url to check. - * @return true if the pingTargetUrl (is well-formed and) the host portion of the url of the - * ping target is a valid IP address or a hostname that can be resolved on the server. - * @throws WebloggerException - */ - boolean isHostnameKnown(String pingTargetUrl) throws WebloggerException; - - - /** - * Release all resources associated with Roller session. - */ - void release(); - -} diff --git a/app/src/main/java/org/apache/roller/weblogger/business/pings/WeblogUpdatePinger.java b/app/src/main/java/org/apache/roller/weblogger/business/pings/WeblogUpdatePinger.java deleted file mode 100644 index 98919792a7..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/business/pings/WeblogUpdatePinger.java +++ /dev/null @@ -1,401 +0,0 @@ -/* - * 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.pings; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.roller.weblogger.config.PingConfig; -import org.apache.roller.weblogger.pojos.PingTarget; -import org.apache.roller.weblogger.pojos.Weblog; -import org.apache.roller.weblogger.util.SecureXmlParsers; -import org.apache.xmlrpc.XmlRpcException; -import org.xml.sax.Attributes; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.xml.sax.helpers.DefaultHandler; - -import javax.xml.parsers.SAXParser; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLConnection; -import java.net.UnknownHostException; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - * Utility for sending a weblog update ping. - * - *

This implements the weblogUpdates.ping XML-RPC call described - * at www.xmlrpc.com, as well as - * some variants required to interoperate with certain buggy but popular ping - * targets. - * - *

Roller builds the request and reads the response itself rather than through - * an XML-RPC client library. The response is parsed with {@link SecureXmlParsers}, - * which refuses document type declarations and resolves nothing the document - * names, and only the flerror and message fields the - * protocol defines are read; any other content is ignored. - * - * @author Anil Gangolli - * @author llavandowska (for code refactored from the now-defunct RollerXmlRpcClient) - */ -public final class WeblogUpdatePinger { - public static final Log LOGGER = LogFactory.getLog(WeblogUpdatePinger.class); - - private static final String PING_METHOD_NAME = "weblogUpdates.ping"; - - /** How long to wait to open a connection to a ping target, in milliseconds. */ - private static final int CONNECT_TIMEOUT_MS = 15000; - - /** How long to wait for a ping target's response, in milliseconds. */ - private static final int READ_TIMEOUT_MS = 30000; - - /** Upper bound on the response we will read from a ping target, in bytes. */ - private static final int MAX_RESPONSE_BYTES = 1024 * 1024; - - /** - * Conveys a ping result. - */ - public static class PingResult { - boolean error; - String message; - - public PingResult(Boolean error, String message) { - this.error = error != null && error; - this.message = message != null ? message : ""; - } - - public boolean isError() { - return error; - } - - public void setError(boolean error) { - this.error = error; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - @Override - public String toString() { - return "PingResult{" + "error=" + error + ", message='" + message + "'" + "}"; - } - } - - // Inhibit construction - private WeblogUpdatePinger() { - } - - /** - * Send a weblog update ping. - * - * @param pingTarget the target site to ping - * @param website the website that changed (from which the ping originates) - * @return the result message string sent by the server. - * @throws IOException if an IOException occurs during the ping - * @throws XmlRpcException if the ping target reports a fault - */ - public static PingResult sendPing(PingTarget pingTarget, Weblog website) throws IOException, XmlRpcException { - String websiteUrl = website.getAbsoluteURL(); - String pingTargetUrl = pingTarget.getPingUrl(); - Set variantOptions = PingConfig.getVariantOptions(pingTargetUrl); - - // Set up the ping parameters. - List params = new ArrayList<>(); - if (!variantOptions.contains("noname")) { - // ping variant for icerocket and anyone with similar bug, where we must omit the blog name. - params.add(website.getName()); - } - params.add(websiteUrl); - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Executing ping to '" + pingTargetUrl + "' for website '" + websiteUrl + "' (" + website.getName() + ")" + (variantOptions.isEmpty() ? "" : " with variant options " + variantOptions)); - } - - // Send the ping and read the response. - byte[] response = exchange(pingTargetUrl, buildRequest(params)); - PingResult pingResult = parseResponse(response); - - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Ping result is: " + pingResult); - } - return pingResult; - } - - /** - * Build the XML-RPC weblogUpdates.ping request body for the - * given string parameters. - */ - static String buildRequest(List params) { - StringBuilder sb = new StringBuilder(256); - sb.append(""); - sb.append("").append(PING_METHOD_NAME).append(""); - sb.append(""); - for (String param : params) { - sb.append(""); - xmlEscape(sb, param); - sb.append(""); - } - sb.append(""); - return sb.toString(); - } - - /** - * POST the request body to the ping target and return the response bytes, - * capped at {@link #MAX_RESPONSE_BYTES}. - */ - static byte[] exchange(String pingTargetUrl, String requestBody) throws IOException { - URL url = new URL(pingTargetUrl); - URLConnection connection = url.openConnection(); - if (!(connection instanceof HttpURLConnection)) { - // Ping targets are HTTP(S) XML-RPC endpoints. Refuse anything else - // (for example file: or ftp:) with an IOException rather than failing - // with a ClassCastException that callers do not handle. - throw new IOException("Ping target URL is not an HTTP URL: " + pingTargetUrl); - } - HttpURLConnection conn = (HttpURLConnection) connection; - try { - conn.setRequestMethod("POST"); - conn.setConnectTimeout(CONNECT_TIMEOUT_MS); - conn.setReadTimeout(READ_TIMEOUT_MS); - conn.setDoOutput(true); - conn.setRequestProperty("Content-Type", "text/xml; charset=UTF-8"); - conn.setRequestProperty("User-Agent", "Apache Roller"); - - byte[] body = requestBody.getBytes(StandardCharsets.UTF_8); - conn.setFixedLengthStreamingMode(body.length); - try (OutputStream out = conn.getOutputStream()) { - out.write(body); - } - - int status = conn.getResponseCode(); - if (status < 200 || status >= 300) { - // A non-2xx status is a transport-level failure, not a ping - // result. Surface it so the ping is treated as failed (and - // retried by the queue processor), as the old client did. - throw new IOException("Ping target returned HTTP status " + status); - } - return readCapped(conn.getInputStream()); - } finally { - conn.disconnect(); - } - } - - /** Read at most {@link #MAX_RESPONSE_BYTES} bytes from the stream. */ - private static byte[] readCapped(InputStream in) throws IOException { - if (in == null) { - return new byte[0]; - } - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - byte[] chunk = new byte[8192]; - int total = 0; - int read; - while ((read = in.read(chunk)) != -1) { - total += read; - if (total > MAX_RESPONSE_BYTES) { - throw new IOException("Ping target response exceeded " + MAX_RESPONSE_BYTES + " bytes"); - } - buffer.write(chunk, 0, read); - } - return buffer.toByteArray(); - } - - /** - * Parse an XML-RPC ping response. Only flerror and - * message are read from a normal response; a fault is turned - * into an {@link XmlRpcException}. - * - * @throws XmlRpcException if the response is a fault - */ - static PingResult parseResponse(byte[] response) throws IOException, XmlRpcException { - if (response == null || response.length == 0) { - return new PingResult(null, null); - } - PingResponseHandler handler = new PingResponseHandler(); - try { - SAXParser parser = SecureXmlParsers.newSAXParserFactory().newSAXParser(); - parser.parse(new InputSource(new ByteArrayInputStream(response)), handler); - } catch (SAXException | javax.xml.parsers.ParserConfigurationException ex) { - // The target responded with something that is not a well-formed, safe - // XML-RPC response. Treat it as a non-error transmission, mirroring the - // prior lenient handling of buggy targets, without exposing the body. - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Could not parse ping response as XML-RPC; proceeding.", ex); - } - return new PingResult(null, null); - } - - if (handler.isFault()) { - throw new XmlRpcException(handler.getFaultCode(), handler.getFaultString()); - } - return new PingResult(handler.getFlerror(), handler.getMessage()); - } - - private static void xmlEscape(StringBuilder sb, String value) { - if (value == null) { - return; - } - for (int i = 0; i < value.length(); i++) { - char c = value.charAt(i); - switch (c) { - case '&': sb.append("&"); break; - case '<': sb.append("<"); break; - case '>': sb.append(">"); break; - case '"': sb.append("""); break; - case '\'': sb.append("'"); break; - default: sb.append(c); - } - } - } - - /** - * Collects just the fields Roller needs from an XML-RPC ping response. - * Scalar values, including any {@code }, are read only as text. - */ - private static final class PingResponseHandler extends DefaultHandler { - private final StringBuilder text = new StringBuilder(); - private final Map members = new HashMap<>(); - private boolean inFault; - private boolean inStruct; - private String memberName; - private String scalar; - - @Override - public void startElement(String uri, String localName, String qName, Attributes attributes) { - text.setLength(0); - if ("fault".equals(qName)) { - inFault = true; - } else if ("struct".equals(qName)) { - inStruct = true; - } else if ("member".equals(qName)) { - memberName = null; - scalar = null; - } - } - - @Override - public void characters(char[] ch, int start, int length) { - text.append(ch, start, length); - } - - @Override - public void endElement(String uri, String localName, String qName) { - switch (qName) { - case "name": - memberName = text.toString().trim(); - break; - case "string": - case "boolean": - case "int": - case "i4": - case "double": - case "dateTime.iso8601": - case "base64": - // Record the raw text only; base64 is not decoded. - scalar = text.toString(); - break; - case "value": - if (scalar == null) { - // An XML-RPC with no type child is a string. - scalar = text.toString(); - } - break; - case "member": - if (memberName != null && inStruct) { - members.put(memberName, scalar != null ? scalar : ""); - } - scalar = null; - break; - case "struct": - inStruct = false; - break; - default: - break; - } - } - - boolean isFault() { - return inFault; - } - - int getFaultCode() { - String code = members.get("faultCode"); - if (code != null) { - try { - return Integer.parseInt(code.trim()); - } catch (NumberFormatException ignored) { - // fall through to default - } - } - return 0; - } - - String getFaultString() { - return members.get("faultString"); - } - - Boolean getFlerror() { - String value = members.get("flerror"); - if (value == null) { - return null; - } - value = value.trim(); - return "1".equals(value) || "true".equalsIgnoreCase(value); - } - - String getMessage() { - return members.get("message"); - } - } - - /** - * Decide if the given exception appears to warrant later retrial attempts. - * - * @param ex an exception thrown by the sendPing operation - * @return true if the error warrants retrial - */ - public static boolean shouldRetry(Exception ex) { - // Determine if error appears transient (warranting retrial) - // We give most errors the "benefit of the doubt" by considering them transient - // This picks out a few that we consider non-transient - if (ex instanceof UnknownHostException) { - // User probably mistyped the url in the custom target. - return false; - } else if (ex instanceof MalformedURLException) { - // This should never happen due to validations but if we get here, retrial won't fix it. - return false; - } - return true; - } - -} diff --git a/app/src/main/java/org/apache/roller/weblogger/business/pings/package-info.java b/app/src/main/java/org/apache/roller/weblogger/business/pings/package-info.java deleted file mode 100644 index 3c7e54733e..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/business/pings/package-info.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * 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. - */ - -/** - * Ping-queue manager and processor. - */ -package org.apache.roller.weblogger.business.pings; \ No newline at end of file diff --git a/app/src/main/java/org/apache/roller/weblogger/business/startup/DatabaseInstaller.java b/app/src/main/java/org/apache/roller/weblogger/business/startup/DatabaseInstaller.java index 7b2a71765b..391899f9e8 100644 --- a/app/src/main/java/org/apache/roller/weblogger/business/startup/DatabaseInstaller.java +++ b/app/src/main/java/org/apache/roller/weblogger/business/startup/DatabaseInstaller.java @@ -49,7 +49,7 @@ public class DatabaseInstaller { private static final String DBVERSION_PROP = "roller.database.version"; // Update this when adding a database or data migration step below. - private static final int LATEST_DATABASE_UPGRADE_VERSION = 610; + private static final int LATEST_DATABASE_UPGRADE_VERSION = 700; public DatabaseInstaller(DatabaseProvider dbProvider, DatabaseScriptProvider scriptProvider) { @@ -268,6 +268,12 @@ public void upgradeDatabase(boolean runScripts) throws StartupException { schemaUpgraded = true; } + if (dbversion < 700) { + upgradeTo700(con, runScripts); + dbversion = 700; + schemaUpgraded = true; + } + // make sure the database version is the exact version // we are upgrading too. updateDatabaseVersion(con, myVersion); @@ -758,6 +764,13 @@ private void upgradeTo610(Connection con, boolean runScripts) throws StartupExce simpleUpgrade(con, 520, 610, runScripts); } + /** + * Upgrade database to Roller 7.0. + */ + private void upgradeTo700(Connection con, boolean runScripts) throws StartupException { + simpleUpgrade(con, 610, 700, runScripts); + } + /** * Simple upgrade using single SQL migration script. */ diff --git a/app/src/main/java/org/apache/roller/weblogger/config/PingConfig.java b/app/src/main/java/org/apache/roller/weblogger/config/PingConfig.java deleted file mode 100644 index efbc443b90..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/config/PingConfig.java +++ /dev/null @@ -1,328 +0,0 @@ -/* - * 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.config; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.roller.weblogger.WebloggerException; -import org.apache.roller.weblogger.business.pings.PingTargetManager; -import org.apache.roller.weblogger.business.WebloggerFactory; -import org.apache.roller.weblogger.pojos.PingTarget; - -import java.util.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -// This may need to move to a different package, but it seems appropriate here in the current structure. -// Previous placement in the presentation.pings package introduced the undesirable dependency of the -// business package on the presentation package. - -/** - * Thin wrapper around WebloggerConfig and WebloggerRuntimeConfig for centralizing access to the many configurable - * settings for pings. - * - * @author Anil Gangolli - */ -public final class PingConfig { - private static final Log LOGGER = LogFactory.getLog(PingConfig.class); - - - // Config property for maximum ping attempts. - static final String MAX_PING_ATTEMPTS_PROP = "pings.maxPingAttempts"; - private static final int MAX_PING_ATTEMPTS_DEFAULT = 3; - private static final int MAX_PING_ATTEMPTS_MIN = 1; - private static final int MAX_PING_ATTEMPTS_MAX = 10; - - // Config property for queue processing interval - private static final String QUEUE_PROCESSING_INTERVAL_PROP = "pings.queueProcessingIntervalMins"; - private static final int QUEUE_PROCESSING_INTERVAL_DEFAULT = 5; - private static final int QUEUE_PROCESSING_INTERVAL_MIN = 0; - private static final int QUEUE_PROCESSING_INTERVAL_MAX = 120; - - // PingConfig property for logging pings (not actually performing them). Used for debugging. - private static final String PINGS_LOG_ONLY_PROP = "pings.logOnly"; - private static final boolean PINGS_LOG_ONLY_DEFAULT = false; - - // PingConfig property for controlling whether or not to allow usage of pings - // ("Weblog:Pings" page and actions). If absent, this defaults to false - // NOTE: If this property name is changed, editor-menu.xml must also be adjusted. - private static final String PINGS_DISABLE_PING_USAGE_PROP = "pings.disablePingUsage"; - private static final boolean PINGS_DISABLE_PING_USAGE_DEFAULT = false; - - // PingConfig property for controlling suspending the processing of pings. If true, - // new auto ping requests are not queued, any existing queued requests are not processed, - // and sending a manual ping results in a message saying pings have been disabled. - // NOTE: This is a "runtime" property settable on the Admin:PingConfig page, default is false. - private static final String PINGS_SUSPEND_PING_PROCESSING_PROP = "pings.suspendPingProcessing"; - - // PingConfig property determining the initial common ping targets. If the list of common - // ping targets is empty on startup, the value of this property is used to populate initial values. - // The value takes the form of comma-separated ping targets where each ping target is specified in - // the form {{name}{pingurl}}. If an administrator wants to disable this initialization, in order to - // maintain an empty list of common targets, the administrator can disable the initialization by - // commenting out this property in the config file. - private static final String PINGS_INITIAL_COMMON_TARGETS_PROP = "pings.initialCommonTargets"; - - // PingConfig property determining the known WeblogUpdates.ping variants/bugs - // in popular ping targets, which we are used when invoking pings on those targets. - // The value takes the form of a comma separated list of ping target urls and - // variant options, where each one is in the form {{pingurl}{option[[,option]...]}}. - private static final String PINGS_VARIANT_OPTIONS_PROP = "pings.variantOptions"; - - // Map of configured ping variants. Maps a ping target hostname to a set of - // Strings representing variant options to be used when pinging this target. - // This was introduced in order to support certain buggy (but popular) ping - // targets that implement minor variants of the WeblogUpdates.ping call. - // This is initialized once at startup, and referenced when pings are made. - private static final Map> CONFIGURED_VARIANTS = new HashMap<>(); - - // Pattern used to parse common ping targets as well as ping variants. - // Each initial commmon ping target is specified in the format {{name}{url}} - // Ping variants are also specified in a nested brace format {{url}{options}} - private static final Pattern NESTED_BRACE_PAIR = Pattern.compile("\\{\\{(.*?)\\}\\{(.*?)\\}\\}"); - - - // Inhibit construction - private PingConfig() { - } - - /** - * Get the maximum number of ping attempts that should be made for each ping queue entry before we give up. If we - * get apparently transient failures while trying to perform the ping, the entry is requeued for processing on later - * passes through the queue until this number of attempts has been reached. - * - * @return the configured (or default) maximum number of ping attempts - */ - public static int getMaxPingAttempts() { - return getIntegerProperty(MAX_PING_ATTEMPTS_PROP, MAX_PING_ATTEMPTS_DEFAULT, - MAX_PING_ATTEMPTS_MIN, MAX_PING_ATTEMPTS_MAX); - } - - /** - * Get the ping queue processing interval in minutes. - * - * @return the configured (or default) queue processing interval in minutes. - */ - public static int getQueueProcessingIntervalMins() { - return getIntegerProperty(QUEUE_PROCESSING_INTERVAL_PROP, QUEUE_PROCESSING_INTERVAL_DEFAULT, - QUEUE_PROCESSING_INTERVAL_MIN, QUEUE_PROCESSING_INTERVAL_MAX); - } - - - /** - * Get the logs only setting. Get configuration value determining whether pings are to be logged only (not sent). - * This configuration setting is used for development and debugging. - * - * @return the configured (or default) value of the logs only setting. - */ - public static boolean getLogPingsOnly() { - return getBooleanProperty(PINGS_LOG_ONLY_PROP, PINGS_LOG_ONLY_DEFAULT); - } - - /** - * Determine whether the configuration disables ping usage (configuration of auto pings and sending of manual - * pings). If this is true, all auto ping configus are removed at startup, the Weblog:Pings UI and the associated - * actions are disabled. - * - * @return the configured (or default) value of the enable ping usage setting. - */ - public static boolean getDisablePingUsage() { - return getBooleanProperty(PINGS_DISABLE_PING_USAGE_PROP, PINGS_DISABLE_PING_USAGE_DEFAULT); - } - - /** - * Determine whether ping processing is suspended. If this is true, new auto ping requests are not - * queued, any existing queued requests are not processed, and sending a manual ping results in a message saying - * pings have been disabled. - * - * @return the configured (or default) value of the suspend ping processing setting. - */ - public static boolean getSuspendPingProcessing() { - return WebloggerRuntimeConfig.getBooleanProperty(PINGS_SUSPEND_PING_PROCESSING_PROP); - } - - /** - * Initialize the common ping targets from the configuration properties. If the current list of common ping targets - * is empty, and the PINGS_INITIAL_COMMON_TARGETS_PROP property is present in the configuration then, - * this method will use that value to initialize the common targets. This is called on each server startup. - *

- * Note: this is expected to be called during initialization with transaction demarcation being handled by the - * caller. - * - * @see org.apache.roller.weblogger.ui.core.RollerContext#contextInitialized(javax.servlet.ServletContextEvent) - */ - public static void initializeCommonTargets() throws WebloggerException { - String configuredVal = WebloggerConfig.getProperty(PINGS_INITIAL_COMMON_TARGETS_PROP); - if (configuredVal == null || configuredVal.isBlank()) { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("No (or empty) value of " + PINGS_INITIAL_COMMON_TARGETS_PROP + " present in the configuration. Skipping initialization of commmon targets."); - } - return; - } - PingTargetManager pingTargetMgr = WebloggerFactory.getWeblogger().getPingTargetManager(); - if (!pingTargetMgr.getCommonPingTargets().isEmpty()) { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Some common ping targets are present in the database already. Skipping initialization."); - } - return; - } - - String[] configuredTargets = configuredVal.trim().split(","); - for (int i = 0; i < configuredTargets.length; i++) { - // Trim space around the target spec - String thisTarget = configuredTargets[i].trim(); - // skip empty ones - if (thisTarget.length() == 0) { - continue; - } - // parse the ith target and store it - Matcher m = NESTED_BRACE_PAIR.matcher(thisTarget); - if (m.matches() && m.groupCount() == 2) { - String name = m.group(1).trim(); - String url = m.group(2).trim(); - LOGGER.info("Creating common ping target '" + name + "' from configuration properties."); - PingTarget pingTarget = new PingTarget(null, name, url, false); - pingTargetMgr.savePingTarget(pingTarget); - } else { - LOGGER.error("Unable to parse configured initial ping target '" + thisTarget + "'. Skipping this target. Check your setting of the property " + PINGS_INITIAL_COMMON_TARGETS_PROP); - } - } - } - - /** - * Initialize known ping variants from the configuration. - */ - public static void initializePingVariants() { - String configuredVal = WebloggerConfig.getProperty(PINGS_VARIANT_OPTIONS_PROP); - if (configuredVal == null || configuredVal.isBlank()) { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("No (or empty) value of " + PINGS_VARIANT_OPTIONS_PROP + " present in the configuration. Skipping initialization of ping variants."); - } - return; - } - String[] variants = configuredVal.trim().split(","); - for (int i = 0; i < variants.length; i++) { - String thisVariant = variants[i].trim(); - if (thisVariant.length() == 0) { - continue; - } - Matcher m = NESTED_BRACE_PAIR.matcher(thisVariant); - if (m.matches() && m.groupCount() == 2) { - String url = m.group(1).trim(); - String optionsList = m.group(2).trim(); - Set variantOptions = new HashSet<>(); - String[] options = optionsList.split(","); - for (int j = 0; j < options.length; j++) { - String option = options[j].trim().toLowerCase(); - if (option.length() > 0) { - variantOptions.add(option); - } - } - if (!variantOptions.isEmpty()) { - CONFIGURED_VARIANTS.put(url, variantOptions); - } else { - LOGGER.warn("Ping variant entry for url '" + url - + "' has an empty variant options list. Ignored."); - } - } else { - LOGGER.error("Unable to parse configured ping variant '" - + thisVariant + "'. Skipping this variant. Check your setting of the property " - + PINGS_VARIANT_OPTIONS_PROP); - } - } - } - - /** - * Get the set of variant options configured for the given ping target url. - * - * @param pingTargetUrl - * @return the set of variant options configured for the given ping target url, or - * the empty set if there are no variants configured. - */ - public static Set getVariantOptions(String pingTargetUrl) { - Set variantOptions = CONFIGURED_VARIANTS.get(pingTargetUrl); - if (variantOptions == null) { - variantOptions = Collections.emptySet(); - } - return variantOptions; - } - - - // TODO: Refactor functionality below to WebloggerConfig? - - /** - * Get the value of an integer configuration property. - * - * @param propName the property name - * @param defaultValue the default value if the property is not present - * @param min the minimum allowed value - * @param max the maximum allowed value - * @return the value as an integer; the default value if no configured value is present or if the configured value - * is out of the specified range. - */ - private static int getIntegerProperty(String propName, int defaultValue, int min, int max) { - String configuredVal = WebloggerConfig.getProperty(propName); - if (configuredVal == null) { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("PingConfig property '" + propName - + "' is not present in the configuration. Using default value: " + defaultValue); - } - return defaultValue; - } - - int val; - try { - val = Integer.parseInt(configuredVal); - } catch (NumberFormatException ex) { - LOGGER.error("ERROR: PingConfig property '" + propName - + "' is not an integer value. Using default value: " + defaultValue); - return defaultValue; - } - - if (val < min || val > max) { - LOGGER.error("ERROR: PingConfig property '" + propName - + "' is outside the required range (" - + min + ", " + max + "). Using default value: " + defaultValue); - return defaultValue; - } - - return val; - } - - /** - * Get the value of a boolean property with specified default. - * - * @param propName the property name - * @param defaultValue the default value if the property is not present - * @return the configured value or the default if it the configured value is not present. - */ - private static boolean getBooleanProperty(String propName, boolean defaultValue) { - String configuredVal = WebloggerConfig.getProperty(propName); - if (configuredVal == null) { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("PingConfig property '" + propName - + "' is not present in the configuration. Using default value: " + defaultValue); - } - return defaultValue; - } - return Boolean.valueOf(configuredVal); - } - - -} diff --git a/app/src/main/java/org/apache/roller/weblogger/pojos/AutoPing.java b/app/src/main/java/org/apache/roller/weblogger/pojos/AutoPing.java deleted file mode 100644 index aded88d125..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/pojos/AutoPing.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * 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 org.apache.commons.lang3.builder.EqualsBuilder; -import org.apache.commons.lang3.builder.HashCodeBuilder; -import org.apache.roller.util.UUIDGenerator; - - -/** - * Automatic ping configuration. An instance of this class relates a website - * and ping target; it indicates that the specified ping target should be pinged - * when the corresponding website is changed. - * - * @author Anil Gangolli - */ -public class AutoPing implements Serializable { - - private String id = UUIDGenerator.generateUUID(); - private PingTarget pingTarget = null; - private Weblog website = null; - - public static final long serialVersionUID = -9105985454111986435L; - - - /** - * Default constructor leaves all fields null. Required for bean compliance. - */ - public AutoPing() { - } - - /** - * Constructor. - * @param id unique id (primary key) for this instance - * @param pingtarget ping target that should be pinged - * @param website website to which this configuration applies - */ - public AutoPing(String id, PingTarget pingtarget, Weblog website) { - //this.id = id; - this.website = website; - this.pingTarget = pingtarget; - } - - /** - * Get the unique id (primary key) of this object. - * @return the unique id of this object. - */ - public String getId() { - return id; - } - - /** - * Set the unique id (primary key) of this object - * @param id - */ - public void setId(String id) { - // Form bean workaround: empty string is never a valid id - if (id != null && id.isBlank()) { - return; - } - this.id = id; - } - - /** - * Get the website. Get the website whose changes should result in a ping - * to the ping target specified by this object. - * @return the website. - */ - public Weblog getWebsite() { - return website; - } - - /** - * Set the website. Set the website whose changes should result in a ping - * to the ping target specified by this object. - * @param website the website. - */ - public void setWebsite(Weblog website) { - this.website = website; - } - - /** - * Get the ping target. Get the target to be pinged when the - * corresponding website changes. - * @return the target to be pinged. - */ - public PingTarget getPingTarget() { - return pingTarget; - } - - /** - * Set the ping target. Set the target to be pinged when the - * corresponding website changes. - * @param pingtarget the target to be pinged. - */ - public void setPingTarget(PingTarget pingtarget) { - this.pingTarget = pingtarget; - } - - //------------------------------------------------------- Good citizenship - - @Override - public String toString() { - StringBuilder buf = new StringBuilder(); - buf.append("{"); - buf.append(getId()); - buf.append("}"); - return buf.toString(); - } - - @Override - public boolean equals(Object other) { - if (other == this) { - return true; - } - if (!(other instanceof AutoPing)) { - return false; - } - AutoPing o = (AutoPing)other; - return new EqualsBuilder() - .append(getId(), o.getId()) - .append(getPingTarget(), o.getPingTarget()) - .append(getWebsite(), o.getWebsite()) - .isEquals(); - } - - @Override - public int hashCode() { - return new HashCodeBuilder().append(getId()).toHashCode(); - } - -} diff --git a/app/src/main/java/org/apache/roller/weblogger/pojos/PingQueueEntry.java b/app/src/main/java/org/apache/roller/weblogger/pojos/PingQueueEntry.java deleted file mode 100644 index 309c0bfc3b..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/pojos/PingQueueEntry.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * 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.sql.Timestamp; -import org.apache.commons.lang3.builder.EqualsBuilder; -import org.apache.commons.lang3.builder.HashCodeBuilder; -import org.apache.roller.util.UUIDGenerator; - - -/** - * Ping queue entry. Each instance of this class represents an entry on the ping queue. The entry indicates when it was - * added to the queue, which configuration to apply for the ping, and the number of ping attempts that have been made - * for this entry so far. - * - * @author Anil Gangolli - */ -public class PingQueueEntry implements Serializable { - - private String id = UUIDGenerator.generateUUID(); - private Timestamp entryTime = null; - private PingTarget pingTarget = null; - private Weblog website = null; - private int attempts = 0; - - public static final long serialVersionUID = -1468021030819538243L; - - - /** - * Default constructor. Leaves all fields at Java-specified default values. - */ - public PingQueueEntry() { - } - - /** - * Construct with all members - * - * @param id unique id of this entry - * @param entryTime timestamp of first entry onto queue - * @param pingTarget target site to ping - * @param website website originating the ping - * @param attempts number of prior ping attempts - */ - public PingQueueEntry(String id, Timestamp entryTime, PingTarget pingTarget, Weblog website, int attempts) { - //this.id = id; - this.entryTime = entryTime; - this.pingTarget = pingTarget; - this.website = website; - this.attempts = attempts; - } - - /** - * Get the unique id (primary key) of this object. - * - * @return the unique id of this object. - */ - public String getId() { - return id; - } - - /** - * Set the unique id (primary key) of this object. - * - * @param id - */ - public void setId(String id) { - this.id = id; - } - - /** - * Get the entry time. Get the time this entry was first added to the queue. - * - * @return the time the entry was first added to the queue. - */ - public Timestamp getEntryTime() { - return entryTime; - } - - /** - * Set the entry time. - * - * @param entryTime the time the entry was first added to the queue. - */ - public void setEntryTime(Timestamp entryTime) { - this.entryTime = entryTime; - } - - /** - * Get the ping target. Get the target to ping. - * - * @return the ping target to ping. - */ - public PingTarget getPingTarget() { - return pingTarget; - } - - /** - * Set the ping target. - * - * @param pingTarget target to ping. - */ - public void setPingTarget(PingTarget pingTarget) { - this.pingTarget = pingTarget; - } - - /** - * Get the website originating the ping. - * - * @return the website originating the ping. - */ - public Weblog getWebsite() { - return website; - } - - /** - * Set the website originating the ping. - * - * @param website the website originating the ping. - */ - public void setWebsite(Weblog website) { - this.website = website; - } - - /** - * Get the number of ping attempts that have been made for this queue entry. - * - * @return the number of ping attempts that have been made for this queue entry. - */ - public int getAttempts() { - return attempts; - } - - /** - * Set the number of failures that have occurred for this queue entry. - * - * @param attempts - */ - public void setAttempts(int attempts) { - this.attempts = attempts; - } - - /** - * Increment the number of failures for this queue entry. - * - * @return the new value. - */ - public int incrementAttempts() { - int newAttempts = getAttempts() + 1; - setAttempts(newAttempts); - return newAttempts; - } - - //------------------------------------------------------- Good citizenship - - @Override - public String toString() { - StringBuilder buf = new StringBuilder(); - buf.append("{"); - buf.append(getId()); - buf.append(", ").append(getEntryTime()); - buf.append(", ").append(getAttempts()); - buf.append("}"); - return buf.toString(); - } - - @Override - public boolean equals(Object other) { - if (other == this) { - return true; - } - if (!(other instanceof PingQueueEntry)) { - return false; - } - PingQueueEntry o = (PingQueueEntry)other; - return new EqualsBuilder() - .append(getEntryTime(), o.getEntryTime()) - .append(getWebsite(), o.getWebsite()) - .isEquals(); - } - - @Override - public int hashCode() { - return new HashCodeBuilder() - .append(getEntryTime()) - .append(getWebsite()) - .toHashCode(); - } - -} diff --git a/app/src/main/java/org/apache/roller/weblogger/pojos/PingTarget.java b/app/src/main/java/org/apache/roller/weblogger/pojos/PingTarget.java deleted file mode 100644 index af2b1c3ef7..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/pojos/PingTarget.java +++ /dev/null @@ -1,236 +0,0 @@ -/* - * 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.sql.Timestamp; -import org.apache.commons.lang3.builder.EqualsBuilder; -import org.apache.commons.lang3.builder.HashCodeBuilder; -import org.apache.roller.util.UUIDGenerator; - - -/** - * Ping target. Each instance represents a possible target of a weblog update ping that we send. - * - * @author Anil Gangolli - */ -public class PingTarget implements Serializable { - - public static final long serialVersionUID = -6354583200913127874L; - - // last use (after possible retrials) was successful - public static final int CONDITION_OK = 0; - // last use failed after retrials - public static final int CONDITION_FAILING = 1; - // disabled by failure policy after failures - editing resets - public static final int CONDITION_DISABLED = 2; - - private String id = UUIDGenerator.generateUUID(); - private String name = null; - private String pingUrl = null; - private int conditionCode = -1; - private Timestamp lastSuccess = null; - private boolean autoEnabled = false; - - - /** - * Default empty constructor. - */ - public PingTarget() { - } - - - /** - * Constructor. - * - * @param id the id (primary key) of this target - * @param name the descriptive name of this target - * @param pingUrl the URL to which to send the ping - * @param autoEnable if true, pings sent to target by default - */ - public PingTarget(String id, String name, String pingUrl, boolean autoEnable) { - //this.id = id; - this.name = name; - this.pingUrl = pingUrl; - this.conditionCode = CONDITION_OK; - this.lastSuccess = null; - this.autoEnabled = autoEnable; - } - - - /** - * Get the unique id of this ping target. - * - * @return the unique id of this ping target. - */ - public String getId() { - return this.id; - } - - - /** - * Set the unique id of this ping target - * - * @param id - */ - public void setId(String id) { - this.id = id; - } - - - /** - * get the name of this ping target. This is a name assigned by the administrator or a user (for custom) targets. - * It is descriptive and is not necessarily unique. - * - * @return the name of this ping target - */ - public String getName() { - return this.name; - } - - - /** - * Set the name of this ping target. - * - * @param name the name of this ping target - */ - public void setName(String name) { - this.name = name; - } - - - /** - * Get the URL to ping. - * - * @return the URL to ping. - */ - public String getPingUrl() { - return pingUrl; - } - - - /** - * Set the URL to ping. - * - * @param pingUrl - */ - public void setPingUrl(String pingUrl) { - this.pingUrl = pingUrl; - } - - /** - * Get the condition code value. This code, in combination with the last success timestamp, provides a status - * indicator on the ping target based on its usage by the ping queue processor. It can be used to implement a - * failure-based disabling policy. - * - * @return one of the condition codes {@link #CONDITION_OK}, {@link #CONDITION_FAILING}, {@link - * #CONDITION_DISABLED}. - */ - public int getConditionCode() { - return conditionCode; - } - - /** - * Set the condition code value. - * - * @param conditionCode the condition code value to set - */ - public void setConditionCode(int conditionCode) { - this.conditionCode = conditionCode; - } - - - /** - * Get the timestamp of the last successful ping (UTC/GMT). - * - * @return the timestamp of the last successful ping; null if the target has not yet been used. - */ - public Timestamp getLastSuccess() { - return lastSuccess; - } - - - /** - * Set the timestamp of the last successful ping. - * - * @param lastSuccess the timestamp of the last successful ping. - */ - public void setLastSuccess(Timestamp lastSuccess) { - this.lastSuccess = lastSuccess; - } - - - /** - * Is this ping target enabled by default for new weblogs? - * - * @return true if ping target is auto enabled. false otherwise. - */ - public boolean isAutoEnabled() { - return autoEnabled; - } - - - /** - * Set the auto enabled status for this ping target. This field only - * applies for common ping targets. - * - * @param autoEnabled true if the ping target should be auto enabled. - */ - public void setAutoEnabled(boolean autoEnabled) { - this.autoEnabled = autoEnabled; - } - - - //------------------------------------------------------- Good citizenship - - @Override - public String toString() { - StringBuilder buf = new StringBuilder(); - buf.append("{"); - buf.append(getId()); - buf.append(", ").append(getName()); - buf.append(", ").append(getPingUrl()); - buf.append(", ").append(getLastSuccess()); - buf.append(", ").append(isAutoEnabled()); - buf.append("}"); - return buf.toString(); - } - - @Override - public boolean equals(Object other) { - if (other == this) { - return true; - } - if (!(other instanceof PingTarget)) { - return false; - } - PingTarget o = (PingTarget)other; - return new EqualsBuilder() - .append(getId(), o.getId()) - .isEquals(); - } - - @Override - public int hashCode() { - return new HashCodeBuilder() - .append(getId()) - .toHashCode(); - } - -} diff --git a/app/src/main/java/org/apache/roller/weblogger/pojos/Weblog.java b/app/src/main/java/org/apache/roller/weblogger/pojos/Weblog.java index 46904f1b71..b19957fd7b 100644 --- a/app/src/main/java/org/apache/roller/weblogger/pojos/Weblog.java +++ b/app/src/main/java/org/apache/roller/weblogger/pojos/Weblog.java @@ -497,9 +497,6 @@ public void setCommentModerationRequired(boolean modRequired) {} * 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; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/PingTargetBean.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/PingTargetBean.java deleted file mode 100644 index ee89d37510..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/PingTargetBean.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * 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.ui.struts2.admin; - -import org.apache.roller.weblogger.pojos.PingTarget; - - -/** - * Form bean used by ping target actions. - */ -public class PingTargetBean { - - private String id = null; - private String name = null; - private String pingUrl = null; - - - public String getId() { - return this.id; - } - - public void setId( String id ) { - this.id = id; - } - - public String getName() { - return this.name; - } - - public void setName( String name ) { - this.name = name; - } - - public String getPingUrl() { - return this.pingUrl; - } - - public void setPingUrl( String pingUrl ) { - this.pingUrl = pingUrl; - } - - - public void copyTo(PingTarget dataHolder) { - - dataHolder.setName(this.name); - dataHolder.setPingUrl(this.pingUrl); - } - - - public void copyFrom(PingTarget dataHolder) { - - this.id = dataHolder.getId(); - this.name = dataHolder.getName(); - this.pingUrl = dataHolder.getPingUrl(); - } - -} diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/PingTargetEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/PingTargetEdit.java deleted file mode 100644 index f267bcf285..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/PingTargetEdit.java +++ /dev/null @@ -1,166 +0,0 @@ -/* - * 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.ui.struts2.admin; - -import jakarta.servlet.http.HttpServletRequest; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.roller.weblogger.WebloggerException; -import org.apache.roller.weblogger.business.WebloggerFactory; -import org.apache.roller.weblogger.business.pings.PingTargetManager; -import org.apache.roller.weblogger.pojos.PingTarget; -import org.apache.roller.weblogger.ui.struts2.util.UIAction; -import org.apache.struts2.convention.annotation.AllowedMethods; -import org.apache.struts2.interceptor.parameter.StrutsParameter; - -/** - * Add or modify a common ping target. - */ -// TODO: make this work @AllowedMethods({"execute","save"}) -public class PingTargetEdit extends UIAction { - - private static Log log = LogFactory.getLog(PingTargetEdit.class); - - // a bean for managing submitted data - private PingTargetBean bean = new PingTargetBean(); - - // ping target we are working on, if any - private PingTarget pingTarget = null; - - private String httpMethod = "GET"; - - public PingTargetEdit() { - this.desiredMenu = "admin"; - } - - @Override - public void setPageTitle(String pageTitle) { - this.pageTitle = pageTitle; - } - - // no weblog required - @Override - public boolean isWeblogRequired() { - return false; - } - - @Override - public void myPrepare() { - PingTargetManager pingTargetMgr = WebloggerFactory.getWeblogger().getPingTargetManager(); - - if (!StringUtils.isEmpty(getBean().getId())) { - // edit case - try { - pingTarget = pingTargetMgr.getPingTarget(getBean().getId()); - } catch (WebloggerException ex) { - log.error("Error looking up ping target - " + getBean().getId()); - } - if (pingTarget == null) { - addError("pingTarget.notFound", getBean().getId()); - } - } else { - // add case - pingTarget = new PingTarget(); - pingTarget.setConditionCode(PingTarget.CONDITION_OK); - pingTarget.setAutoEnabled(false); - } - } - - /** - * Save ping target. - */ - @Override - public String execute() { - if (!"POST".equals(httpMethod)) { - return INPUT; - } - - myValidate(); - - if (!hasActionErrors()) { - try { - // copy data from form into ping target - getBean().copyTo(pingTarget); - PingTargetManager pingTargetMgr = WebloggerFactory.getWeblogger().getPingTargetManager(); - pingTargetMgr.savePingTarget(pingTarget); - WebloggerFactory.getWeblogger().flush(); - - addMessage(isAdd() ? "pingTarget.created" : "pingTarget.updated", pingTarget.getName()); - - return SUCCESS; - } catch (WebloggerException ex) { - log.error("Error adding/editing ping target", ex); - addError("generic.error.check.logs"); - } - } - - return INPUT; - } - - /** - * Private helper to validate a ping target. - */ - protected void myValidate() { - try { - PingTargetManager pingTargetMgr = WebloggerFactory.getWeblogger().getPingTargetManager(); - if (StringUtils.isEmpty(bean.getName())) { - addError("pingTarget.nameMissing"); - } else { - if (isAdd() || !pingTarget.getName().equals(bean.getName())) { - if (pingTargetMgr.targetNameExists(bean.getName())) { - addError("pingTarget.nameNotUnique"); - } - } - } - if (StringUtils.isEmpty(bean.getPingUrl())) { - addError("pingTarget.pingUrlMissing"); - } else { - if (!pingTargetMgr.isUrlWellFormed(bean.getPingUrl())) { - addError("pingTarget.malformedUrl"); - } else if (!pingTargetMgr.isHostnameKnown(bean.getPingUrl())) { - addError("pingTarget.unknownHost"); - } - } - } catch (WebloggerException ex) { - log.error("Error validating ping target", ex); - addError("generic.error.check.logs"); - } - } - - private boolean isAdd() { - return actionName.equals("commonPingTargetAdd"); - } - - @StrutsParameter(depth = 1) - public PingTargetBean getBean() { - return bean; - } - - public void setBean(PingTargetBean bean) { - this.bean = bean; - } - - @Override - public void withServletRequest(HttpServletRequest req) { - super.withServletRequest(req); - httpMethod = req.getMethod(); - } -} diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/PingTargets.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/PingTargets.java deleted file mode 100644 index 574845df59..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/PingTargets.java +++ /dev/null @@ -1,214 +0,0 @@ -/* - * 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.ui.struts2.admin; - -import java.util.Collections; -import java.util.List; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.roller.weblogger.WebloggerException; -import org.apache.roller.weblogger.business.WebloggerFactory; -import org.apache.roller.weblogger.business.pings.PingTargetManager; -import org.apache.roller.weblogger.pojos.PingTarget; -import org.apache.roller.weblogger.ui.struts2.util.UIAction; -import org.apache.struts2.convention.annotation.AllowedMethods; -import org.apache.struts2.interceptor.parameter.StrutsParameter; - -/** - * Admin action for managing global ping targets. - */ -// TODO: make this work @AllowedMethods({"execute","enable","disable","delete","deleteConfirm"}) -public class PingTargets extends UIAction { - - private static Log log = LogFactory.getLog(PingTargets.class); - - public PingTargets() { - this.actionName = "commonPingTargets"; - this.desiredMenu = "admin"; - this.pageTitle = "commonPingTargets.commonPingTargets"; - } - - // list of available ping targets - private List pingTargets = Collections.emptyList(); - - // ping target we are working on, if any - private PingTarget pingTarget = null; - - // id of the ping target to work on - private String pingTargetId = null; - - // no weblog required - @Override - public boolean isWeblogRequired() { - return false; - } - - public void loadPingTargets() { - try { - PingTargetManager pingTargetMgr = WebloggerFactory.getWeblogger().getPingTargetManager(); - setPingTargets(pingTargetMgr.getCommonPingTargets()); - } catch (WebloggerException ex) { - log.error("Error loading common ping targets", ex); - addError("commonPingTargets.error.loading"); - } - } - - // prepare method needs to set ping targets list - @Override - public void myPrepare() { - - // load list of ping targets - loadPingTargets(); - - // The ping target always comes from the stored targets, by id. - pingTarget = null; - - // load specified ping target if possible - if(!StringUtils.isEmpty(getPingTargetId())) { - try { - PingTargetManager pingTargetMgr = WebloggerFactory.getWeblogger().getPingTargetManager(); - setPingTarget(pingTargetMgr.getPingTarget(getPingTargetId())); - } catch (WebloggerException ex) { - log.error("Error looking up ping target - " + getPingTargetId(), ex); - } - } - } - - /** - * Display the ping targets. - */ - @Override - public String execute() { - return LIST; - } - - /** - * Set a ping target auto enabled to true. - */ - public String enable() { - - if(getPingTarget() != null) { - try { - getPingTarget().setAutoEnabled(true); - - PingTargetManager pingTargetMgr = WebloggerFactory.getWeblogger().getPingTargetManager(); - pingTargetMgr.savePingTarget(getPingTarget()); - WebloggerFactory.getWeblogger().flush(); - } catch (Exception ex) { - log.error("Error saving ping target", ex); - addError("commonPingTargets.error.saving"); - } - } else { - addError("commonPingTargets.error.enabling"); - } - - return DONE; - } - - - /** - * Set a ping target auto-enable to false. - */ - public String disable() { - - if(getPingTarget() != null) { - try { - getPingTarget().setAutoEnabled(false); - - PingTargetManager pingTargetMgr = WebloggerFactory.getWeblogger().getPingTargetManager(); - pingTargetMgr.savePingTarget(getPingTarget()); - WebloggerFactory.getWeblogger().flush(); - } catch (Exception ex) { - log.error("Error saving ping target", ex); - addError("commonPingTargets.error.saving"); - } - } else { - addError("commonPingTargets.error.disabling"); - } - - return DONE; - } - - /** - * Delete a ping target (load delete confirmation view). - */ - public String deleteConfirm() { - - if(getPingTarget() != null) { - setPageTitle("pingTarget.confirmRemoveTitle"); - - return "confirm"; - } else { - addError("pingTarget.notFound",getPingTargetId()); - } - - return LIST; - } - - - /** - * Delete a ping target. - */ - public String delete() { - if(getPingTarget() != null) { - try { - PingTargetManager pingTargetMgr = WebloggerFactory.getWeblogger().getPingTargetManager(); - pingTargetMgr.removePingTarget(getPingTarget()); - WebloggerFactory.getWeblogger().flush(); - - // remove deleted target from list - getPingTargets().remove(getPingTarget()); - addMessage("pingTarget.deleted", getPingTarget().getName()); - } catch (WebloggerException ex) { - log.error("Error deleting ping target - " + getPingTargetId(), ex); - addError("generic.error.check.logs", getPingTargetId()); - } - } else { - addError("pingTarget.notFound", getPingTargetId()); - } - return LIST; - } - - public List getPingTargets() { - return pingTargets; - } - - public void setPingTargets(List pingTargets) { - this.pingTargets = pingTargets; - } - - public PingTarget getPingTarget() { - return pingTarget; - } - - private void setPingTarget(PingTarget pingTarget) { - this.pingTarget = pingTarget; - } - - public String getPingTargetId() { - return pingTargetId; - } - - @StrutsParameter - public void setPingTargetId(String pingTargetId) { - this.pingTargetId = pingTargetId; - } -} diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/EntryEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/EntryEdit.java index a3e1ae7cb1..329d065ce2 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/EntryEdit.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/EntryEdit.java @@ -314,11 +314,6 @@ String save() { // notify caches CacheManager.invalidate(weblogEntry); - // Queue applicable pings for this update. - if (weblogEntry.isPublished()) { - WebloggerFactory.getWeblogger().getAutopingManager() - .queueApplicableAutoPings(weblogEntry); - } if (weblogEntry.isPending() && MailUtil.isMailConfigured()) { MailUtil.sendPendingEntryNotice(weblogEntry); diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Pings.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Pings.java deleted file mode 100644 index 15600788bd..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Pings.java +++ /dev/null @@ -1,277 +0,0 @@ -/* - * 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.ui.struts2.editor; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.roller.weblogger.WebloggerException; -import org.apache.roller.weblogger.config.PingConfig; -import org.apache.roller.weblogger.business.pings.AutoPingManager; -import org.apache.roller.weblogger.business.pings.PingTargetManager; -import org.apache.roller.weblogger.business.WebloggerFactory; -import org.apache.roller.weblogger.pojos.AutoPing; -import org.apache.roller.weblogger.pojos.PingTarget; -import org.apache.roller.weblogger.business.pings.WeblogUpdatePinger; -import org.apache.struts2.convention.annotation.AllowedMethods; -import org.apache.struts2.interceptor.parameter.StrutsParameter; -import org.apache.xmlrpc.XmlRpcException; -import java.io.IOException; -import java.net.SocketException; -import java.net.UnknownHostException; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import org.apache.roller.weblogger.pojos.WeblogPermission; -import org.apache.roller.weblogger.ui.struts2.util.UIAction; - - -/** - * Actions for setting up automatic ping configuration for a weblog. - */ -// TODO: make this work @AllowedMethods({"execute","enable","disable","pingNow"}) -public class Pings extends UIAction { - - private static final Log log = LogFactory.getLog(Pings.class); - - // ping target id to work on - private String pingTargetId = null; - - // ping target object we are working on, if available - private PingTarget pingTarget = null; - - // commong ping targets list - private List commonPingTargets = Collections.emptyList(); - - // track the enabled/disabled status for pings - private Map pingStatus = Collections.emptyMap(); - - - public Pings() { - this.actionName = "pings"; - this.desiredMenu = "editor"; - this.pageTitle = "pings.title"; - } - - - // admin perms required - public String requireWeblogPermissions() { - return WeblogPermission.ADMIN; - } - - - @Override - public void myPrepare() { - - PingTargetManager pingTargetMgr = WebloggerFactory.getWeblogger().getPingTargetManager(); - - // The ping target always comes from the stored ping targets, by id. - pingTarget = null; - - // load selected ping target, if possible - if(getPingTargetId() != null) { - try { - setPingTarget(pingTargetMgr.getPingTarget(getPingTargetId())); - } catch (WebloggerException ex) { - log.error("Error looking up ping target - "+getPingTargetId(), ex); - } - } - - try { - // load common ping targets list - setCommonPingTargets(pingTargetMgr.getCommonPingTargets()); - } catch (WebloggerException ex) { - log.error("Error loading ping target lists for weblog - "+getActionWeblog().getHandle(), ex); - addError("Error loading ping targets"); - } - } - - - /* - * Display the common ping targets with page - */ - @Override - public String execute() { - - // load map of enabled auto pings - buildIsEnabledMap(); - - return LIST; - } - - - /** - * Enable a ping target. - */ - public String enable() { - - if(getPingTarget() != null) { - try { - AutoPingManager autoPingMgr = WebloggerFactory.getWeblogger().getAutopingManager(); - AutoPing autoPing = new AutoPing(null, getPingTarget(), getActionWeblog()); - autoPingMgr.saveAutoPing(autoPing); - WebloggerFactory.getWeblogger().flush(); - } catch(Exception ex) { - log.error("Error saving auto ping for target - "+getPingTargetId(), ex); - addError("Error enabling auto ping"); - } - } - - return DONE; - } - - - /** - * Disable a ping target. - */ - public String disable() { - - if(getPingTarget() != null) { - try { - AutoPingManager autoPingMgr = WebloggerFactory.getWeblogger().getAutopingManager(); - autoPingMgr.removeAutoPing(getPingTarget(), getActionWeblog()); - WebloggerFactory.getWeblogger().flush(); - } catch (Exception ex) { - log.error("Error removing auto ping for target - "+getPingTargetId(), ex); - addError("Error disabling auto ping"); - } - } - - return DONE; - } - - - /** - * Ping the selected target now. - */ - public String pingNow() { - - if(getPingTarget() != null) { - try { - if (PingConfig.getSuspendPingProcessing()) { - log.debug("Ping processing is disabled."); - addError("ping.pingProcessingIsSuspended"); - } else { - WeblogUpdatePinger.PingResult pingResult = WeblogUpdatePinger.sendPing(getPingTarget(), getActionWeblog()); - if (pingResult.isError()) { - log.debug("Ping Result: " + pingResult); - if (pingResult.getMessage() != null && !pingResult.getMessage().isBlank()) { - addError("ping.transmittedButError"); - addError(pingResult.getMessage()); - } else { - addError("ping.transmissionFailed"); - } - } else { - addMessage("ping.successful"); - } - } - } catch (IOException ex) { - log.debug(ex); - addError("ping.transmissionFailed"); - addSpecificMessages(ex); - } catch (XmlRpcException ex) { - log.debug(ex); - addError("ping.transmissionFailed"); - addSpecificMessages(ex); - } - } - - return DONE; - } - - - // some extra error messaging - private void addSpecificMessages(Exception ex) { - if (ex instanceof UnknownHostException) { - addError("ping.unknownHost"); - } else if (ex instanceof SocketException) { - addError("ping.networkConnectionFailed"); - } - } - - - /** - * Private helper to build a map indexed by ping target id with values Boolean.TRUE and Boolean.FALSE - * based on whether the ping target is enabled (has a corresponding auto ping configuration). - */ - private void buildIsEnabledMap() { - - AutoPingManager autoPingMgr = WebloggerFactory.getWeblogger().getAutopingManager(); - - // Build isEnabled map (keyed by ping target id and values Boolean.TRUE/Boolean.FALSE) - Map isEnabled = new HashMap<>(); - - List autoPings = Collections.emptyList(); - try { - autoPings = autoPingMgr.getAutoPingsByWebsite(getActionWeblog()); - } catch (WebloggerException ex) { - log.error("Error looking up auto pings for weblog - "+getActionWeblog().getHandle(), ex); - } - - // Add the enabled auto ping configs with TRUE - for (AutoPing autoPing : autoPings) { - isEnabled.put(autoPing.getPingTarget().getId(), Boolean.TRUE); - } - - // Add disabled ping targets ones with FALSE - for (PingTarget inPingTarget : getCommonPingTargets()) { - if (isEnabled.get(inPingTarget.getId()) == null) { - isEnabled.put(inPingTarget.getId(), Boolean.FALSE); - } - } - - if (!isEnabled.isEmpty()) { - setPingStatus(isEnabled); - } - } - - - public String getPingTargetId() { - return pingTargetId; - } - - @StrutsParameter - public void setPingTargetId(String pingTargetId) { - this.pingTargetId = pingTargetId; - } - - public PingTarget getPingTarget() { - return pingTarget; - } - - private void setPingTarget(PingTarget pingTarget) { - this.pingTarget = pingTarget; - } - - public List getCommonPingTargets() { - return commonPingTargets; - } - - public void setCommonPingTargets(List commonPingTargets) { - this.commonPingTargets = commonPingTargets; - } - - public Map getPingStatus() { - return pingStatus; - } - - public void setPingStatus(Map pingStatus) { - this.pingStatus = pingStatus; - } -} diff --git a/app/src/main/resources/ApplicationResources.properties b/app/src/main/resources/ApplicationResources.properties index 888f3f87f2..d2b681ea8b 100644 --- a/app/src/main/resources/ApplicationResources.properties +++ b/app/src/main/resources/ApplicationResources.properties @@ -338,7 +338,6 @@ configForm.frontpageWeblogHandle=Weblog to serve as frontpage blog configForm.frontpageWeblogAggregated=Enable aggregated site-wide frontpage configForm.siteAdminEmail=Site Administrator''s email address configForm.absoluteUrl=Absolute URL to site (if required) -configForm.suspendPingProcessing=Suspend all ping processing? configForm.allowUserWeblogCreation=Allow users to create new weblogs? configForm.none=None specified @@ -1100,73 +1099,6 @@ Template.error.descriptionSize=Description cannot be more than 255 characters Template.error.actionNull=The Action is a required field Template.error.actionNotAvailable=A {0} template cannot be added to this weblog -# ---------------------------------------------------- Ping Target Admin/Editing - - - -commonPingTargets.subtitle=Ping target management -commonPingTargets.commonPingTargets=Weblog Ping Targets -commonPingTargets.explanation=These target sites are available to all weblogs \ -for weblog update pings. -commonPingTargets.error.loading=Error loading common ping targets -commonPingTargets.error.saving=Error saving common ping targets -commonPingTargets.error.enabling=Error enabling ping target -commonPingTargets.error.disabling=Error disabling ping target - -pings.title=Configure Automatic Weblog Pings -pings.subtitle=Setup automatic pings for weblog {0} -pings.explanation=Pings allow you to notify sites that your weblog has changed \ -so that the sites can read your feed to retrieve updates. \ -You can enable automatic pings for sites that you wish to notify whenever \ -your weblog changes. You can also trigger pings manually \ -to specific sites from this page. Note: Normally, you are \ -expected to register your weblog with a site before starting \ -to send that site pings. -pings.commonPingTargets=Common Ping Targets -pings.commonPingTargetsExplanation=These ping targets have been configured by the \ -site administrator for use by all users. \ -You can send pings to any of these well-known sites. - -ping.successful=The ping was successful. -ping.transmittedButError=The ping was transmitted but the server \ -responded with the following error message. -ping.transmissionFailed=The ping transmission failed. Check to make sure the \ -ping target URL is correct. -ping.unknownHost=The hostname in the ping target URL is unknown. -ping.networkConnectionFailed=There were network connection problems reaching the \ -ping target site. -ping.pingProcessingIsSuspended=Ping processing has been suspended temporarily by \ -a site administrator. - -pingTarget.addTarget=Add Ping Target -pingTarget.editTarget=Edit Ping Target - -pingTargetEdit.subtitle=Edit ping target -pingTargetAdd.subtitle=Add ping target - -pingTarget.pingUrl=Ping URL -pingTarget.autoEnabled=Auto Ping? -pingTarget.remove=Remove -pingTarget.confirmRemoveTitle=Remove Ping Target Confirmation -pingTarget.confirmCommonRemove=Removing this target will also remove all user''s \ -automatic ping configurations that use this target. Are you sure? -pingTarget.enable=Enable -pingTarget.enabled=ON -pingTarget.disable=Disable -pingTarget.disabled=OFF -pingTarget.auto=Automatic -pingTarget.manual=Manual -pingTarget.sendPingNow=Send Ping Now -pingTarget.updated=Ping target "{0}" updated -pingTarget.created=Ping target "{0}" created -pingTarget.deleted=Ping target "{0}" deleted - -pingTarget.nameNotUnique=Target name already exists, please choose another. -pingTarget.nameMissing=Name is required -pingTarget.pingUrlMissing=Ping URL is required -pingTarget.malformedUrl=The URL is not properly formed. -pingTarget.unknownHost=The hostname in this URL doesn''t seem to exist. -pingTarget.notFound=Ping target id {0} was not found # --------------------------------------------------------------- Planet Roller: config @@ -1342,7 +1274,6 @@ tabbedmenu.website.themes=Theme tabbedmenu.website.pages=Templates tabbedmenu.website.members=Members tabbedmenu.website.maintenance=Maintenance -tabbedmenu.weblog.pingSetup=Pings tabbedmenu.weblog.mediaFiles=Media Files @@ -1350,7 +1281,6 @@ tabbedmenu.admin=Server Admin tabbedmenu.admin.config=Configuration tabbedmenu.admin.userAdmin=User Admin tabbedmenu.admin.commentManagement=Comments -tabbedmenu.admin.pingTargets=Ping Targets tabbedmenu.admin.cacheInfo=Cache Info tabbedmenu.planet=Planet Admin diff --git a/app/src/main/resources/ApplicationResources_de.properties b/app/src/main/resources/ApplicationResources_de.properties index 35d9ca6734..05c3c67edf 100644 --- a/app/src/main/resources/ApplicationResources_de.properties +++ b/app/src/main/resources/ApplicationResources_de.properties @@ -238,12 +238,6 @@ comments.htmlenabled=Erlaubt comments.mathAuthenticatorQuestion=Bitte beantworten Sie diese kleine Mathematik-Frage # ------------------------------------------------------------- comments.jsp comments.title=Kommentar -# -------------------------------------------------------------- Ping Target Admin/Editing -commonPingTargets.commonPingTargets=Allgemeine Weblog Ping Ziele -commonPingTargets.explanation=Diese Zielwebsites sind in allen Weblogs verf\u00FCgbar f\u00FCr Update Pings. -# ---------------------------------------------------- Ping Target Admin/Editing -commonPingTargets.subtitle=Management der allgemeinen Ping Ziele f\u00FCr alle Weblogs. -# ---------------------------------------------------- Ping Target Admin/Editing configForm.absoluteUrl=Absolute URL zur Site (falls notwendig) configForm.requireEmailActivation=Neue Benutzer m\u00FCssen Ihren Zugang per E-Mail aktivieren configForm.allowNewUsers=Erlaube das Anlegen neuer Benutzer? @@ -275,7 +269,6 @@ configForm.siteName=Name der Website (f\u00FCr den allgemeinen RSS Feed) configForm.siteSettings=Website Einstellungen configForm.styledFeeds=Zeige formatierte Newsfeeds f\u00FCr Webbrowser configForm.subtitle=\u00C4ndere Konfigurationseinstellungen f\u00FCr die gesamte Website -configForm.suspendPingProcessing=Alle Ping Prozesse stoppen? configForm.themeSettings=Themeneinstellungen # --------------------------------------------------------- Configuration configForm.title=Roller Konfiguration @@ -544,34 +537,7 @@ pagesForm.subtitle=Schablonen f\u00FCr den Weblog {0} verwalten. pagesForm.themesReminder=Erinnerung: Sie verwenden gegenw\u00E4rtig das {0} gemeinsame Thema. Daher k\u00F6nnten manche Schablonenanpassungen nicht das Aussehen Ihres Blogs ver\u00E4ndern. pagesForm.tip=Sie k\u00F6nnen die Schablonen, welche das Layout, die Farben und die Schriftart Ihres Weblogs definiert, anpassen. Sie k\u00F6nnen auch neue Schablonen erstellen, um komplett neue Seiten zu definieren. Dies sollten Sie jedoch nur tun, wenn Sie sich mit HTML auskennen. Ansonsten sollten Sie die Schablonen nicht ver\u00E4ndern. pagesForm.title=Seiten Schablonen -ping.networkConnectionFailed=Es gab Netzwerk Verbindungsprobleme beim Versuch die Ping Ziel Site zu erreichen. # ------------------------------------------------------------ Page management -ping.pingProcessingIsSuspended=Das versenden von Pings wurde vor\u00FCbergehend vom Administrator unterdr\u00FCckt. -ping.successful=Der Ping war erfogreich. -ping.transmissionFailed=Die Ping \u00DCbertragung ist fehlgeschlagen. Bitte pr\u00FCfen Sie, ob die Ping Ziel URL korrekt ist. -ping.transmittedButError=Der Ping wurde \u00FCbertragen, jedoch antwortete der Server mit der folgenden Fehlermeldung. -ping.unknownHost=Der Hostname in der Ping Ziel URL ist unbekannt. -pingTarget.auto=Automatisch -pingTarget.autoEnabled=Auto Ping? -pingTarget.confirmCommonRemove=Das L\u00F6schen dieses Ziels l\u00F6scht auch alle automatischen Benutzer Ping Konfigurationen, die dies Ziel benutzen. Sind Sie sicher? -pingTarget.confirmRemoveTitle=L\u00F6sche Ping Ziel Best\u00E4tigung -pingTarget.disable=Ausschalten -pingTarget.disabled=AUS -pingTarget.enable=Einschalten -pingTarget.enabled=AN -pingTarget.malformedUrl=Die URL ist nicht korrekt aufgebaut. -pingTarget.manual=Manuell -pingTarget.nameNotUnique=Der Name dieses Ziels steht in Konflikt mit einem anderen Namen in der gleichen Zielmenge. -pingTarget.pingUrl=Ping URL -pingTarget.remove=L\u00F6schen -pingTarget.updated=Ping-Ziel "{0}" gespeichert -pingTarget.sendPingNow=Sende jetzt ein Ping -pingTarget.unknownHost=Der Hostname in der URL scheint nicht zu existieren. -pings.commonPingTargets=Allgemeine Ping Ziele -pings.commonPingTargetsExplanation=Diese Ping Ziele wurden vom Administrator f\u00FCr alle Benutzer vorkonfiguriert. Sie k\u00F6nnen Pings zu diesen bekannten Sites senden. -pings.explanation=Pings erlauben es Ihnen Websites zu informieren, dass Ihr Weblog sich ge\u00E4ndert hat. Dadurch kann die Seite Ihren Newsfeed lesen um Updates bekanntzugeben. Sie k\u00F6nnen automatische Pings einschalten f\u00FCr Sites die informiert werden sollen, wenn sich Ihr Weblog \u00E4ndert. Ebenso k\u00F6nnen Pings manuell angesto\u00DFen werden. Hinweis: Normalerweise m\u00FCssen Sie zuerst Ihren Weblog auf eine Site registrieren lassen, bevor Sie ein ihr Pings senden k\u00F6nnen. -pings.subtitle=Automatische Pings erstellen f\u00FCr den Weblog {0} -pings.title=Konfiguriere Automatische Weblog Pings planetConfig.prompt=konfiguriere Planet Roller planetConfig.subtitle=Konfiguration des integrierten Newsfeed-Aggregators von Roller. planetConfig.title=Titel @@ -627,7 +593,6 @@ tabbedmenu.admin=Administration tabbedmenu.admin.cacheInfo=Cache Info tabbedmenu.admin.commentManagement=Kommentare tabbedmenu.admin.config=Konfiguration -tabbedmenu.admin.pingTargets=Ping Ziele tabbedmenu.admin.planetConfig=Konfiguration tabbedmenu.admin.planetGroups=Benutzerdefinierte Gruppen tabbedmenu.admin.planetGroupSubs=Abonnements @@ -640,7 +605,6 @@ tabbedmenu.weblog=Weblog tabbedmenu.weblog.archives=Archiv tabbedmenu.weblog.categories=Kategorien tabbedmenu.weblog.newEntry=Neuer Eintrag -tabbedmenu.weblog.pingSetup=Pings tabbedmenu.website=Webseite tabbedmenu.website.maintenance=Wartung tabbedmenu.website.members=Mitglieder diff --git a/app/src/main/resources/ApplicationResources_es.properties b/app/src/main/resources/ApplicationResources_es.properties index e8e795526a..5093202f05 100644 --- a/app/src/main/resources/ApplicationResources_es.properties +++ b/app/src/main/resources/ApplicationResources_es.properties @@ -132,7 +132,6 @@ configForm.shortName=Nombre corto (mostrado en la pancarta del sitio) configForm.siteDescription=Descripci\u00F3n del sitio (para la p\u00E1gina principal y las suscripciones RSS) configForm.siteAdminEmail=Correo electr\u00F3nico del administrador del sitio configForm.absoluteUrl=URL absoluta del sitio (en caso necesario) -configForm.suspendPingProcessing=\u00BFSuspender todo el procesamiento ping? configForm.userSettings=Configuraci\u00F3n de usuario configForm.allowNewUsers=\u00BFPermitir nuevos usuarios? configForm.registrationUrl=URL de registro externo @@ -302,35 +301,6 @@ pageRemove.subtitle=Confirmar la eliminaci\u00F3n de la p\u00E1gina. pageRemove.youSure=\u00BFEst\u00E1 seguro de que desea eliminar esta p\u00E1gina? pageRemove.pageId=ID de p\u00E1gina pageRemove.pageName=Nombre de p\u00E1gina -commonPingTargets.subtitle=Administrar objetivos ping comunes para todos los weblogs. -commonPingTargets.commonPingTargets=Objetivos ping comunes -commonPingTargets.explanation=Estos objetivos est\u00E1n disponibles para los pings de actualizaci\u00F3n de todos los weblogs. -pings.title=Configurar pings autom\u00E1ticos -pings.subtitle=Configurar pings atom\u00E1ticos para el weblog {0} -pings.explanation=Los ping le permiten anunciar a otros sitios que su weblog ha cambiado, de modo que esos sitios puedan obtener las actualizaciones. Puede habilitar pings autom\u00E1ticos para sitios a los que desee informar cuando su weblog cambie. Puede tambi\u00E9n lanzar pings manualmente a sitios espec\u00EDficos de esta p\u00E1gina. Nota\: Normalmente, se espera que registre su weblog con un sitio antes de empezar a enviar los pings. -pings.commonPingTargets=Objetivos ping comunes -pings.commonPingTargetsExplanation=Estos objetivos ping han sido configurados por el administrador del sitio para uso de todos los usuarios. Puede enviar pings a cualquiera de estos sitios. -ping.successful=El ping se hizo con \u00E9xito. -ping.transmittedButError=El ping se transmiti\u00F3 pero el servidor respondi\u00F3 con el siguiente mensaje de error. -ping.transmissionFailed=La transmisi\u00F3n del ping fall\u00F3. Compruebe que la URL del objetivo ping es correcta. -ping.unknownHost=El nombre del host del objetivo ping es desconocido. -ping.networkConnectionFailed=Hay problemas de conexi\u00F3n para alcanzar el sitio del objetivo ping. -ping.pingProcessingIsSuspended=El proceso ping se ha suspendido temporalmente por un administrador de sitio. -pingTarget.pingUrl=URL para ping -pingTarget.remove=Eliminar -pingTarget.confirmRemoveTitle=Eliminar confirmaci\u00F3n de objetivo ping -pingTarget.confirmCommonRemove=Eliminando este objetivo tambi\u00E9n eliminar\u00E1 la configuraci\u00F3n de pings atom\u00E1ticos de todos los usuarios que usan este objetivo. \u00BFEst\u00E1 seguro? -pingTarget.enable=Habilitar -pingTarget.enabled=ACTIVADO -pingTarget.disable=Deshabilitar -pingTarget.disabled=DESACTIVADO -pingTarget.auto=Autom\u00E1tico -pingTarget.manual=Manual -pingTarget.sendPingNow=Enviar ping ahora -pingTarget.updated=Objetivo ping "{0}" guardado. -pingTarget.nameNotUnique=El nombre de este objetivo est\u00E1 en conflicto con otro en el mismo conjunto de objetivos. -pingTarget.malformedUrl=La URL no est\u00E1 formada correctamente. -pingTarget.unknownHost=El nombre de host de esta URL no parece existir. planetConfig.subtitle=Configurar agregador de noticias de Roller planetConfig.prompt=Establecer el t\u00EDtulo, direcci\u00F3n de email y URL del sitio que se incluir\u00E1n en la suscripci\u00F3n de noticias poducida por el agregador. Puede tambi\u00E9n configurar un proxy si es necesario para su red. planetConfig.title=Configuraci\u00F3n de Planet @@ -381,12 +351,10 @@ tabbedmenu.website.themes=Tema tabbedmenu.website.pages=Plantilla tabbedmenu.website.members=Miembros tabbedmenu.website.maintenance=Mantenimiento -tabbedmenu.weblog.pingSetup=Pings tabbedmenu.admin=Administraci\u00F3n global tabbedmenu.admin.config=Configuraci\u00F3n tabbedmenu.admin.userAdmin=Administraci\u00F3n de usuarios tabbedmenu.admin.commentManagement=Comentarios -tabbedmenu.admin.pingTargets=Objetivos ping tabbedmenu.admin.cacheInfo=Informaci\u00F3n de cach\u00E9 tabbedmenu.planet=Administraci\u00F3n de Planet tabbedmenu.admin.planetConfig=Configuraci\u00F3n diff --git a/app/src/main/resources/ApplicationResources_fr.properties b/app/src/main/resources/ApplicationResources_fr.properties index 8c7f4c3624..f9fca84994 100644 --- a/app/src/main/resources/ApplicationResources_fr.properties +++ b/app/src/main/resources/ApplicationResources_fr.properties @@ -253,7 +253,6 @@ configForm.frontpageWeblogHandle=Identifiant du blog utilisé pour la page princ configForm.frontpageWeblogAggregated=Enable aggregated site-wide frontpage configForm.siteAdminEmail=Courriel de l'administrateur du site configForm.absoluteUrl=URL absolue du site (si nécessaire) -configForm.suspendPingProcessing=Suspendre les notifications configForm.userSettings=Paramètres utilisateur configForm.requireEmailActivation=Les nouveaux utilisateurs doivent activer leur compte par courriel @@ -626,58 +625,6 @@ pageRemove.youSure=Etes vous certain de vouloir effacer cette page ? pageRemove.pageId=Identifiant de page pageRemove.pageName=Nom de page -# ---------------------------------------------------- Ping Target Admin/Editing - -commonPingTargets.subtitle=Gestion des adresses de notification communes à tous les blogs. -commonPingTargets.commonPingTargets=Adresses de notification communes - -pings.title=Notifications automatiques -pings.subtitle=Gestion des notifications automatiques pour le blog {0} -pings.explanation=Les notifications vous permettent d'avertir d'autres sites \ -que le contenu de votre blog a changé de façon à ce que ceux-ci puissent lire \ -vos fils d'information et recevoir des mises à jour. \ -Vous pouvez autoriser les notifications automatiques pour autant de sites que vous le désirez, \ -et aussi notifier manuellement les sites spécifiés sur cette page. \ -Notez qu'habituellement vous devez enregistrer votre blog auprés de ces sites \ -avant de pouvoir leur envoyer vos notifications. - -pings.commonPingTargets=Adresses de notification communes -pings.commonPingTargetsExplanation=Ces adresses de notification ont été configurées \ -par l'administrateur de ce site pour tous les utilisateurs. Vous pouvez envoyer \ -des notifications à tous ces sites. - -ping.successful=La notification a réussie. -ping.transmittedButError=La notification à été envoyée au site distant mais celui-ci a renvoyé \ -le message d'erreur suivant : - -ping.transmissionFailed=La transmission de la notification a échouée. \ -Veuillez vous assurer que l'adresse URL que vous utilisez est correcte. - -ping.unknownHost=Le serveur specifié par cette adresse URL est introuvable. -ping.networkConnectionFailed=Incident réseau durant la notification de ce site. \ -Le site distant est injoignable. -ping.pingProcessingIsSuspended=Les notifications ont été provisoirement suspendues par \ -l'administrateur de ce site. - -pingTarget.pingUrl=Adresse URL -pingTarget.autoEnabled=Ping Automatique -pingTarget.remove=Effacer -pingTarget.confirmRemoveTitle=Confirmation d'effacement de l'adresse de notification -pingTarget.confirmCommonRemove=Effacer cette adresse affectera tous les blogs l'utilisant. \ -Etes vous certain de vouloir effacer celle-ci ? - -pingTarget.enable=Activer -pingTarget.enabled=Actif -pingTarget.disable=Désactivé -pingTarget.disabled=Inactif -pingTarget.auto=Automatique -pingTarget.manual=Manuel -pingTarget.sendPingNow=Notifier -pingTarget.updated=Adresse de notification "{0}" enregistrée. - -pingTarget.nameNotUnique=Le nom utilisé existe déjà ou fait partie d'un nom existant. -pingTarget.malformedUrl=L'URL utilisée est incorrecte. -pingTarget.unknownHost=Le serveur specifié par cette adresse URL est introuvable. # --------------------------------------------------------------- Planet Roller @@ -785,13 +732,11 @@ tabbedmenu.website.themes=Thème tabbedmenu.website.pages=Modèles tabbedmenu.website.members=Membres tabbedmenu.website.maintenance=Maintenance -tabbedmenu.weblog.pingSetup=Notifications tabbedmenu.admin=Admin. Serveur tabbedmenu.admin.config=Configuration tabbedmenu.admin.userAdmin=Admin. Utilisateur tabbedmenu.admin.commentManagement=Commentaires -tabbedmenu.admin.pingTargets=Notifications tabbedmenu.admin.cacheInfo=Cache tabbedmenu.planet=Admin. Planet diff --git a/app/src/main/resources/ApplicationResources_ja.properties b/app/src/main/resources/ApplicationResources_ja.properties index f6ca6b5561..1400360ac9 100644 --- a/app/src/main/resources/ApplicationResources_ja.properties +++ b/app/src/main/resources/ApplicationResources_ja.properties @@ -202,7 +202,6 @@ configForm.shortName=\u77ED\u7E2E\u540D(\u30B5\u30A4\u30C8\u30D0\u30CA\u30FC\u30 configForm.siteDescription=\u30B5\u30A4\u30C8\u8A73\u7D30(\u30E1\u30A4\u30F3\u30DA\u30FC\u30B8\u3068RSS\u30D5\u30A3\u30FC\u30C9\u306B\u53CD\u6620\u3055\u308C\u307E\u3059) configForm.siteAdminEmail=\u7BA1\u7406\u8005\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9 configForm.absoluteUrl=\u30B5\u30A4\u30C8\u306E\u7D76\u5BFEURL\uFF08\u5FC5\u8981\u306A\u5834\u5408\uFF09 -configForm.suspendPingProcessing=Ping\u51E6\u7406\u3092\u4E00\u6642\u7684\u306B\u505C\u6B62\u3059\u308B configForm.userSettings=\u30E6\u30FC\u30B6\u8A2D\u5B9A configForm.allowNewUsers=\u65B0\u898F\u30E6\u30FC\u30B6\u3092\u8A31\u53EF @@ -502,41 +501,6 @@ pageRemove.youSure=\u3053\u306E\u30DA\u30FC\u30B8\u3092\u524A\u9664\u3057\u307E\ pageRemove.pageId=\u30DA\u30FC\u30B8ID pageRemove.pageName=\u30DA\u30FC\u30B8\u540D -# ---------------------------------------------------- Ping Target Admin/Editing - -commonPingTargets.subtitle=Ping\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u7BA1\u7406 -commonPingTargets.commonPingTargets=\u30D6\u30ED\u30B0Ping\u30BF\u30FC\u30B2\u30C3\u30C8 -commonPingTargets.explanation=\u3053\u308C\u3089\u306E\u30BF\u30FC\u30B2\u30C3\u30C8\u30FB\u30B5\u30A4\u30C8\u306F\u3001Ping\u9001\u4FE1\u306E\u305F\u3081\u306B\u5168\u3066\u306E\u30D6\u30ED\u30B0\u304B\u3089\u5229\u7528\u3067\u304D\u307E\u3059\u3002 - -pings.title=Ping\u8A2D\u5B9A -pings.subtitle={0}\u306EPing\u8A2D\u5B9A\u3092\u884C\u3044\u307E\u3059 - -pings.explanation=Ping\u306F\u3001\u3042\u306A\u305F\u306E\u30D6\u30ED\u30B0\u304C\u66F4\u65B0\u3055\u308C\u305F\u3053\u3068\u3092\u4ED6\u306E\u30B5\u30A4\u30C8\u306B\u901A\u77E5\u3057\u3001\u4ED6\u306E\u30B5\u30A4\u30C8\u304C\u3042\u306A\u305F\u306E\u30D6\u30ED\u30B0\u306E\u66F4\u65B0\u5185\u5BB9\u3092\u30D5\u30A3\u30FC\u30C9\u3092\u7D4C\u7531\u3057\u3066\u53D7\u4FE1\u3067\u304D\u308B\u3088\u3046\u306B\u3057\u307E\u3059\u3002\u30D6\u30ED\u30B0\u3092\u66F4\u65B0\u3059\u308B\u5EA6\u306B\u4ED6\u306E\u30B5\u30A4\u30C8\u306B\u5BFE\u3057\u3066\u81EA\u52D5\u7684\u306BPing\u3092\u9001\u4FE1\u3059\u308B\u3088\u3046\u306B\u8A2D\u5B9A\u3067\u304D\u307E\u3059\u3002\u3053\u306E\u30DA\u30FC\u30B8\u304B\u3089\u624B\u52D5\u3067\u7279\u5B9A\u306E\u30B5\u30A4\u30C8\u306B\u5BFE\u3057\u3066Ping\u3092\u9001\u4FE1\u3059\u308B\u3053\u3068\u3082\u3067\u304D\u307E\u3059\u3002\u30E1\u30E2: \u901A\u5E38\u3001Ping\u9001\u4FE1\u3092\u59CB\u3081\u308B\u524D\u306B\u9001\u4FE1\u5148\u30B5\u30A4\u30C8\u306B\u3042\u306A\u305F\u306E\u30D6\u30ED\u30B0\u3092\u767B\u9332\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 - -pings.commonPingTargets=Ping\u30BF\u30FC\u30B2\u30C3\u30C8\u30EA\u30B9\u30C8 -pings.commonPingTargetsExplanation=\u4EE5\u4E0B\u306EPing\u30BF\u30FC\u30B2\u30C3\u30C8\u306F\u5168\u3066\u306E\u30E6\u30FC\u30B6\u304B\u3089\u4F7F\u3048\u308B\u3088\u3046\u306B\u30B5\u30A4\u30C8\u7BA1\u7406\u8005\u306B\u3088\u3063\u3066\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u3053\u308C\u3089\u306E\u5468\u77E5\u306E\u30B5\u30A4\u30C8\u306E\u4E2D\u304B\u3089\u597D\u304D\u306A\u30B5\u30A4\u30C8\u306BPing\u3092\u9001\u4FE1\u3067\u304D\u307E\u3059\u3002 - -ping.successful=Ping\u306F\u6B63\u5E38\u306B\u767A\u4FE1\u3055\u308C\u307E\u3057\u305F -ping.transmittedButError=Ping\u767A\u4FE1\u5148\u304B\u3089\u4EE5\u4E0B\u306E\u30A8\u30E9\u30FC\u304C\u8FD4\u3063\u3066\u304D\u307E\u3057\u305F -ping.transmissionFailed=Ping\u304C\u6307\u5B9A\u3055\u308C\u305FURL\u306B\u767A\u4FE1\u3067\u304D\u307E\u305B\u3093\u3002URL\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002 -ping.unknownHost=Ping\u30DB\u30B9\u30C8\u540D\u304C\u4E0D\u660E\u3067\u3059 -ping.networkConnectionFailed=\u5BFE\u8C61\u30DB\u30B9\u30C8\u3068\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093 -ping.pingProcessingIsSuspended=Ping\u51E6\u7406\u306F\u30B5\u30A4\u30C8\u7BA1\u7406\u8005\u306B\u3088\u3063\u3066\u4E00\u6642\u7684\u306B\u505C\u6B62\u3055\u308C\u3066\u3044\u307E\u3059\u3002 -pingTarget.pingUrl=Ping URL -pingTarget.autoEnabled=\u81EA\u52D5Ping\u8A2D\u5B9A -pingTarget.remove=\u524A\u9664 -pingTarget.confirmRemoveTitle=Ping\u30BF\u30FC\u30B2\u30C3\u30C8\u524A\u9664 -pingTarget.confirmCommonRemove=\u30BF\u30FC\u30B2\u30C3\u30C8\u3092\u524A\u9664\u3059\u308B\u3068\u3001\u3053\u306E\u30BF\u30FC\u30B2\u30C3\u30C8\u306B\u5BFE\u3059\u308B\u5168\u3066\u306E\u30E6\u30FC\u30B6\u306E\u81EA\u52D5Ping\u8A2D\u5B9A\u3082\u524A\u9664\u3055\u308C\u307E\u3059\u3002\u3088\u308D\u3057\u3044\u3067\u3059\u304B\uFF1F -pingTarget.enable=\u30AA\u30F3\u306B\u3059\u308B -pingTarget.enabled=\u30AA\u30F3 -pingTarget.disable=\u30AA\u30D5\u306B\u3059\u308B -pingTarget.disabled=\u30AA\u30D5 -pingTarget.auto=\u81EA\u52D5 -pingTarget.manual=\u624B\u52D5 -pingTarget.sendPingNow=\u4ECA\u3059\u3050Ping\u3092\u6253\u3064 - -pingTarget.nameNotUnique=\u540C\u3058\u540D\u524D\u306E\u30B5\u30A4\u30C8\u540D\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u4ED6\u306E\u540D\u524D\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002 -pingTarget.unknownHost=\u3053\u306EURL\u306E\u30DB\u30B9\u30C8\u304C\u898B\u4ED8\u304B\u308A\u307E\u305B\u3093 # --------------------------------------------------------------- Planet Roller @@ -581,7 +545,6 @@ tabbedmenu.admin=\u30B5\u30FC\u30D0\u7BA1\u7406 tabbedmenu.admin.config=\u30B5\u30A4\u30C8\u8A2D\u5B9A tabbedmenu.admin.userAdmin=\u30E6\u30FC\u30B6\u7BA1\u7406 tabbedmenu.admin.commentManagement=\u30B3\u30E1\u30F3\u30C8\u7BA1\u7406 -tabbedmenu.admin.pingTargets=Ping\u30BF\u30FC\u30B2\u30C3\u30C8 tabbedmenu.admin.cacheInfo=\u30AD\u30E3\u30C3\u30B7\u30E5\u60C5\u5831 tabbedmenu.admin.planetConfig=\u8A2D\u5B9A @@ -1071,7 +1034,6 @@ userRegister.tip.screenName=\u5E0C\u671B\u3059\u308B\u30B9\u30AF\u30EA\u30FC\u30 error.activate.user.invalidActivationCode=\u30A2\u30AF\u30C6\u30A3\u30D9\u30FC\u30B7\u30E7\u30F3\u30B3\u30FC\u30C9\u304C\u4E0D\u6B63\u3067\u3059\u3002\u3042\u306A\u305F\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u306F\u3001\u3059\u3067\u306B\u6709\u52B9\u5316\u3055\u308C\u3066\u3044\u308B\u306F\u305A\u3067\u3059\u3002\u6709\u52B9\u5316\u3055\u308C\u3066\u3044\u306A\u3051\u308C\u3070\u3001\u7BA1\u7406\u8005\u306B\u9023\u7D61\u3057\u3066\u304F\u3060\u3055\u3044\u3002 stylesheetEdit.delete=\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u3092\u524A\u9664 mediaFileView.subtitle=\u30D6\u30ED\u30B0 {0} \u306E\u30E1\u30C7\u30A3\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB -commonPingTargets.error.saving=\u5171\u901APing\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u4FDD\u5B58\u306B\u5931\u6557\u3057\u307E\u3057\u305F planetGroups.tip.title=\u30B0\u30EB\u30FC\u30D7\u306E\u30BF\u30A4\u30C8\u30EB themeEditor.setTheme.success=\u30C6\u30FC\u30DE\u304C {0} \u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3057\u305F planetGroups.existingPrompt=\u65E2\u5B58\u306E\u7DE8\u96C6\u3057\u305F\u3044\u30AB\u30B9\u30BF\u30E0\u30FB\u30A2\u30B0\u30EA\u30B2\u30FC\u30B7\u30E7\u30F3\u30FB\u30B0\u30EB\u30FC\u30D7\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002 @@ -1099,7 +1061,6 @@ mediaFileEdit.clickToView=\u30AF\u30EA\u30C3\u30AF\u3059\u308B\u3068\u65B0\u3057 mediaFileEdit.includeGalleryHelp=\u3053\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u3042\u306A\u305F\u306E\u30D6\u30ED\u30B0\u306E\u65B0\u3057\u3044\u30E1\u30C7\u30A3\u30A2\u30FB\u30D5\u30A1\u30A4\u30EBRSS/Atom\u30D5\u30A3\u30FC\u30C9\u306B\u542B\u3081\u305F\u3044\u5834\u5408\u306F\u3001\u3053\u306E\u30DC\u30C3\u30AF\u30B9\u3092\u30C1\u30A7\u30C3\u30AF\u3057\u3066\u304F\u3060\u3055\u3044\u3002 mediaFileView.reset=\u30EA\u30BB\u30C3\u30C8 userRegister.tip.openIdUrl=Open ID\u8B58\u5225\u5B50(URL\u5F62\u5F0F)\u3002 -pingTarget.editTarget=Ping\u30BF\u30FC\u30B2\u30C3\u30C8\u3092\u7DE8\u96C6\u3059\u308B mediaFileAdd.directory=\u30D5\u30A9\u30EB\u30C0 planetGroupSubs.title=\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3 mediaFileView.size=\u30B5\u30A4\u30BA @@ -1131,7 +1092,6 @@ mediaFileView.sortBy=\u3053\u306E\u5C5E\u6027\u3067\u30BD\u30FC\u30C8\: MediaFile.error.nameNull=\u540D\u524D\u306F\u5FC5\u9808\u9805\u76EE\u3067\u3059 pagesForm.error.alreadyExists=\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8 {0} \u306F\u3001\u3059\u3067\u306B\u5B58\u5728\u3057\u307E\u3059\u3002 email.comment.management.link=\u30B3\u30E1\u30F3\u30C8\u7BA1\u7406\u30DA\u30FC\u30B8\u3078\u306E\u30EA\u30F3\u30AF -pingTarget.nameMissing=\u540D\u524D\u306F\u5FC5\u9808\u9805\u76EE\u3067\u3059 mediaFileEdit.fileDimensions=\u753B\u50CF\: {0} X {1} \u30D4\u30AF\u30BB\u30EB mediaFileEdit.originalPath=\u30AA\u30EA\u30B8\u30CA\u30EB\u30FB\u30D1\u30B9 (\u30D5\u30A1\u30A4\u30EB\u3078\u306E\u4EE3\u66FF\u30D5\u30EB\u30D1\u30B9) mediaFileAdd.upload=\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9 @@ -1143,11 +1103,9 @@ planetGroupSubs.prompt.add=\u65B0\u3057\u3044\u30B5\u30D6\u30B9\u30AF\u30EA\u30D MediaFile.error.view=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u8868\u793A\u3059\u308B\u969B\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 mediaFileAdd.multipleNames=(\u8907\u6570\u306E\u540D\u524D) macro.bookmark.urlFeed=\u30B5\u30A4\u30C8\u306ERSS\u30D5\u30A3\u30FC\u30C9\u306EURL -commonPingTargets.error.enabling=Ping\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u6709\u52B9\u5316\u306B\u5931\u6557\u3057\u307E\u3057\u305F inviteMember.notificationContent=\u3042\u306A\u305F\u306F\u3001\u30D6\u30ED\u30B0 "{0}" ({1}) \u3078\u306E\u53C2\u52A0\u3092\u62DB\u5F85\u3055\u308C\u307E\u3057\u305F\u3002\u4EE5\u4E0B\u306E\u30EA\u30F3\u30AF\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u30E6\u30FC\u30B6 [{2}] \u3068\u3057\u3066\u30ED\u30B0\u30A4\u30F3\u3057\u3001\u3053\u306E\u62DB\u5F85 <{3}> \u3092\u627F\u8AFE\u3059\u308B\u304B\u62D2\u5426\u3057\u3066\u304F\u3060\u3055\u3044\u3002 mediaFileView.addDirectory=\u65B0\u3057\u3044\u30D5\u30A9\u30EB\u30C0\u3092\u8FFD\u52A0 installer.whatHappened=\u4F55\u304C\u8D77\u3053\u3063\u305F\u306E\u3067\u3057\u3087\u3046? -pingTargetEdit.subtitle=Ping\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u7DE8\u96C6 installer.errorUpgradingTables=\u30C6\u30FC\u30D6\u30EB\u306E\u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9\u306B\u5931\u6557 folderForm.updated=\u30D5\u30A9\u30EB\u30C0\u540D\u304C\u66F4\u65B0\u3055\u308C\u307E\u3057\u305F frontpageConfig.frontpageAggregated=\u30B5\u30A4\u30C8\u5168\u4F53\u304C\u96C6\u7D04\u3055\u308C\u305F\u30D5\u30ED\u30F3\u30C8\u30FB\u30DA\u30FC\u30B8\u3092\u6709\u52B9\u306B\u3059\u308B @@ -1183,9 +1141,7 @@ error.commentPostFailedEmailAddress=\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u ConfigForm.title=Planet \u30BF\u30A4\u30C8\u30EB\t mediaFileView.viewFolder=\u3053\u306E\u30D5\u30A9\u30EB\u30C0\u3092\u8868\u793A\: mediaFile.move.confirm=\u9078\u629E\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u3092\u79FB\u52D5\u3057\u3066\u3088\u308D\u3057\u3044\u3067\u3059\u304B? -pingTarget.updated=Ping\u30BF\u30FC\u30B2\u30C3\u30C8 "{0}" \u304C\u66F4\u65B0\u3055\u308C\u307E\u3057\u305F generic.name=\u540D\u524D -pingTarget.malformedUrl=URL\u304C\u4E0D\u6B63\u306A\u5F62\u5F0F\u3067\u3059\u3002 mediaFileView.filesTagged=\u30BF\u30B0\u304C {0} \u306E\u30D5\u30A1\u30A4\u30EB weblogEdit.hasComments=\u30B3\u30E1\u30F3\u30C8 [{1}] categoryDeleteOK.title=\u30AB\u30C6\u30B4\u30EA\u306E\u524A\u9664 @@ -1271,7 +1227,6 @@ Entry.error.titleNull=\u30BF\u30A4\u30C8\u30EB\u306F\u5FC5\u9808\u9805\u76EE\u30 planetGroupSubs.subtitle.addMain=\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9\u30FB\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u306E\u30E1\u30A4\u30F3\u30FB\u30EA\u30B9\u30C8\u3092\u7BA1\u7406\u3057\u307E\u3059\u3002 mediaFile.move.errors=\u30E1\u30C7\u30A3\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u79FB\u52D5\u3059\u308B\u969B\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 mediaFileSuccess.addAnother=\u4ED6\u306E\u30E1\u30C7\u30A3\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3059\u308B -pingTarget.pingUrlMissing=Ping URL\u306F\u5FC5\u9808\u9805\u76EE\u3067\u3059 mediaFileEdit.permalink=\u30EA\u30F3\u30AF(URL) stylesheetEdit.save.success=\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u304C\u6B63\u5E38\u306B\u66F4\u65B0\u3055\u308C\u307E\u3057\u305F\u3002 bookmarksForm.selectOneLabel=\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF {0} \u3092\u9078\u629E @@ -1302,10 +1257,8 @@ statCount.weblogCommentCountType=\u30D6\u30ED\u30B0\u306E\u30B3\u30E1\u30F3\u30C mediaFileSuccess.subtitle=\u65B0\u3057\u3044\u30A8\u30F3\u30C8\u30EA\u3092\u4F5C\u6210\u3057\u307E\u3059\u304B? categoriesForm.noresults=\u73FE\u5728\u3001\u30AB\u30C6\u30B4\u30EA\u306F\u3042\u308A\u307E\u305B\u3093 installer.errorCreatingTablesExplanation=\u30C6\u30FC\u30D6\u30EB\u306E\u4F5C\u6210\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u4F5C\u6210\u30B9\u30AF\u30EA\u30D7\u30C8\u306B\u554F\u984C\u304C\u3042\u308B\u304B\u3001\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u306A\u3044\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304C\u4F7F\u7528\u3055\u308C\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\u3042\u306A\u305F\u306F\u3001\u3053\u306E\u554F\u984C\u3092\u89E3\u6C7A\u3057\u3066Roller\u3092\u518D\u8D77\u52D5\u307E\u305F\u306F\u518D\u30C7\u30D7\u30ED\u30A4\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002\u4F5C\u6210\u51E6\u7406\u4E2D\u306E\u6210\u529F/\u30A8\u30E9\u30FC\u30E1\u30C3\u30BB\u30FC\u30B8\u306F\u4EE5\u4E0B\u3067\u3059\: -commonPingTargets.error.loading=\u5171\u901APing\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F mediaFileImageChooser.dirPageTip=\u753B\u50CF\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u9078\u629E\u3059\u308B\u304B\u3001\u30D5\u30A9\u30EB\u30C0\u30FB\u30C9\u30ED\u30C3\u30D7\u30C0\u30A6\u30F3\u3078\u306E\u30B9\u30A4\u30C3\u30C1\u3092\u4F7F\u3063\u3066\u4ED6\u306E\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306B\u79FB\u52D5\u3057\u3066\u304F\u3060\u3055\u3044\u3002 mediaFileView.others=\u305D\u306E\u4ED6 -commonPingTargets.error.disabling=Ping\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u7121\u52B9\u5316\u306B\u5931\u6557\u3057\u307E\u3057\u305F stylesheetEdit.revert=\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u3092\u5FA9\u5143 weblogEdit.submitForReview=\u30EC\u30D3\u30E5\u30FC\u4F9D\u983C\u3092\u9001\u4FE1 mediaFileView.filesOfType=\u30BF\u30A4\u30D7\u304C {0} \u306E\u30D5\u30A1\u30A4\u30EB @@ -1328,14 +1281,11 @@ websiteSettings.error.processingBannedwordslist=\u30D6\u30E9\u30C3\u30AF\u30EA\u mediaFileView.ge=>\= stylesheetEdit.revert.success=\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u306F\u6B63\u5E38\u306B\u5FA9\u5143\u3055\u308C\u307E\u3057\u305F\u3002 mediaFileImageChooser.rootPageTip=\u753B\u50CF\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u9078\u629E\u3059\u308B\u304B\u3001\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u9078\u629E\u3057\u3066\u5185\u5BB9\u3092\u8868\u793A\u3057\u3066\u304F\u3060\u3055\u3044 -pingTarget.notFound=Ping\u30BF\u30FC\u30B2\u30C3\u30C8ID {0} \u306F\u3001\u5B58\u5728\u3057\u307E\u305B\u3093 mediaFileSuccess.noThanks=\u65B0\u3057\u3044\u30A8\u30F3\u30C8\u30EA\u306E\u4F5C\u6210\u306F\u5FC5\u8981\u3042\u308A\u307E\u305B\u3093\u304B? \u3053\u3061\u3089\u304B\u3089\u95A2\u9023\u3059\u308B\u4ED6\u306E\u64CD\u4F5C\u304C\u3067\u304D\u307E\u3059\: -pingTarget.addTarget=Ping\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u8FFD\u52A0 configForm.webAnalytics=Web\u30A2\u30CA\u30EA\u30C6\u30A3\u30AF\u30B9 pageForm.outputContentType=Content-Type folderForm.created=\u30D5\u30A9\u30EB\u30C0\u304C\u4F5C\u6210\u3055\u308C\u307E\u3057\u305F weblogEdit.insertMediaFile=\u30E1\u30C7\u30A3\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u633F\u5165 -pingTarget.deleted=Ping\u30BF\u30FC\u30B2\u30C3\u30C8 "{0}" \u304C\u524A\u9664\u3055\u308C\u307E\u3057\u305F configForm.webServicesSettings=Web\u30B5\u30FC\u30D3\u30B9\u8A2D\u5B9A stylesheetEdit.revertTip1=\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u3092\u3053\u3053\u3067\u30AB\u30B9\u30BF\u30DE\u30A4\u30BA\u3057\u3066\u3044\u306A\u3044\u5834\u5408\u306F\u3001\u300C\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u3092\u524A\u9664\u300D\u30DC\u30BF\u30F3\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u3001\u5171\u6709\u30C6\u30FC\u30DE\u306E\u30C7\u30D5\u30A9\u30EB\u30C8\u3092\u4F7F\u7528\u3059\u308B\u3088\u3046\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u3053\u3046\u3059\u308B\u3053\u3068\u3067\u3001\u5E38\u306B\u6700\u65B0\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u4F7F\u7528\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002 tabbedmenu.design.stylesheet=\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8 @@ -1346,7 +1296,6 @@ mediaFileView.directoryName=\u540D\u524D\: mediaFileSuccess.pixels=\u30D4\u30AF\u30BB\u30EB stylesheetEdit.revertTip=\u89E3\u6C7A\u3067\u304D\u306A\u3044\u554F\u984C\u304C\u8D77\u304D\u305F\u5834\u5408\u306F\u300C\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u3092\u5FA9\u5143\u300D\u30DC\u30BF\u30F3\u3092\u62BC\u3059\u3053\u3068\u3067\u3084\u308A\u76F4\u3059\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002\u5FF5\u306E\u305F\u3081\u3001\u3042\u306A\u305F\u306E\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u3092\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3059\u308B\u3088\u3046\u306B\u3057\u3066\u304F\u3060\u3055\u3044\! planetGroups.column.title=\u30BF\u30A4\u30C8\u30EB -pingTargetAdd.subtitle=Ping\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u8FFD\u52A0 planetSubscription.feedUrl=\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9URL mediaFileSuccess.noEnclosure=\u30A8\u30F3\u30AF\u30ED\u30FC\u30B8\u30E3\u306A\u3057 userRegister.tip.ready=\u3088\u308D\u3057\u3051\u308C\u3070\u3001\u4EE5\u4E0B\u306E\u30DC\u30BF\u30F3\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u304F\u3060\u3055\u3044\u3002 @@ -1376,9 +1325,7 @@ user.account.activation.mail.subject=Roller\: \u3042\u306A\u305F\u306E\u30A2\u30 generic.error.check.logs=Roller\u30B7\u30B9\u30C6\u30E0\u30FB\u30A8\u30E9\u30FC - \u7BA1\u7406\u8005\u306BRoller\u306E\u30ED\u30B0\u306E\u78BA\u8A8D\u3092\u4F9D\u983C\u3057\u3066\u304F\u3060\u3055\u3044\u3002 weblogEdit.scheduledEntry=\u30A8\u30F3\u30C8\u30EA\u30FC\u306E\u516C\u958B\u304C {0} \u306B\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u3055\u308C\u307E\u3057\u305F frontpageConfig.weblogs.error=\u30D6\u30ED\u30B0\u3078\u306E\u30A2\u30AF\u30BB\u30B9\u4E2D\u306B\u4E88\u671F\u305B\u306C\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F -pingTarget.created=Ping\u30BF\u30FC\u30B2\u30C3\u30C8 "{0}" \u304C\u8FFD\u52A0\u3055\u308C\u307E\u3057\u305F themeEditor.yourCustomStylesheet=\u30AB\u30B9\u30BF\u30E0\u30FB\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u30FB\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u3092\u4F7F\u7528\u3057\u3066\u3044\u307E\u3059\u3002 -tabbedmenu.weblog.pingSetup=Pings mediaFileAdd.copyright=\u8457\u4F5C\u6A29\u8868\u793A bookmarksForm.folder.edit.tip=\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u7DE8\u96C6 installer.aboutTheException=\u4EE5\u4E0A\u306E\u60C5\u5831\u3067\u554F\u984C\u304C\u7279\u5B9A\u3067\u304D\u306A\u3044\u5834\u5408\u3001\u3082\u3046\u5C11\u3057\u8A73\u7D30\u306A\u60C5\u5831\u306F\u3053\u3061\u3089\u3067\u3059\u3002\u6839\u672C\u306E\u539F\u56E0\u306F\u3001\u3053\u306E\u30BF\u30A4\u30D7\u306E\u4F8B\u5916\u3067\u3059 diff --git a/app/src/main/resources/ApplicationResources_ko.properties b/app/src/main/resources/ApplicationResources_ko.properties index 3adb9a1a46..423e8f03b7 100644 --- a/app/src/main/resources/ApplicationResources_ko.properties +++ b/app/src/main/resources/ApplicationResources_ko.properties @@ -264,7 +264,6 @@ configForm.frontpageWeblogHandle=\ud504\ub860\ud2b8\ud398\uc774\uc9c0 \ube14\ub8 configForm.frontpageWeblogAggregated=\ubcd1\ud569\ub41c \uc0ac\uc774\ud2b8 \ud504\ub860\ud2b8\ud398\uc774\uc9c0 \ud65c\uc131\ud654 configForm.siteAdminEmail=\uc0ac\uc774\ud2b8 \uad00\ub9ac\uc790 \uc804\uc790\uc6b0\ud3b8 \uc8fc\uc18c configForm.absoluteUrl=\uc0ac\uc774\ud2b8\uc758 \uc808\ub300 \uc8fc\uc18c URL (\ud544\uc694 \uc2dc) -configForm.suspendPingProcessing=\ubaa8\ub4e0 \uc5f0\uacb0\ud655\uc778(ping) \ucc98\ub9ac\ub97c \uc911\uc9c0\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? configForm.userSettings=\uc0ac\uc6a9\uc790 \ud658\uacbd \uc124\uc815 \uc815\ubcf4 configForm.requireEmailActivation=\uc0c8 \uc0ac\uc6a9\uc790\uac00 \uc804\uc790\uc6b0\ud3b8\uc744 \ud1b5\ud574 \uacc4\uc815 \ud65c\uc131\ud654 \ud544\uc694 @@ -706,50 +705,6 @@ Template.error.linkSize=\ub9c1\ud06c\ub294 255\uc790\ub97c \ucd08\uacfc\ud560 \u Template.error.descriptionSize=\uc124\uba85\uc740 255\uc790\ub97c \ucd08\uacfc\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. -# ---------------------------------------------------- Ping Target Admin/Editing - -commonPingTargets.subtitle=\ubaa8\ub4e0 \uc6f9\ub85c\uadf8\ub4e4\uc5d0 \ub300\ud55c \uacf5\ud1b5 \uc6f9\ub85c\uadf8 \uc5f0\uacb0\ud655\uc778(ping) \ub300\uc0c1 \uad00\ub9ac -commonPingTargets.commonPingTargets=\uacf5\ud1b5 \uc6f9\ub85c\uadf8 \uc5f0\uacb0\ud655\uc778(ping) \ub300\uc0c1\ub4e4 -commonPingTargets.explanation=\uc774 \ub300\uc0c1 \uc0ac\uc774\ud2b8\ub294 \ubaa8\ub4e0 \uc6f9\ub85c\uadf8\ub4e4\uc5d0 \ub300\ud574 \uc0ac\uc6a9 \uac00\ub2a5\ud55c \uc5f0\uacb0\ud655\uc778(ping) \ub300\uc0c1\uc785\ub2c8\ub2e4. - -pings.title=\uc790\ub3d9 \uc6f9\ub85c\uadf8 \uc5f0\uacb0\ud655\uc778(ping) \uc124\uc815 -pings.subtitle=\uc6f9\ub85c\uadf8, {0}\uc744(\ub97c) \uc704\ud55c \uc5f0\uacb0\ud655\uc778(ping) \uc124\uc815 -pings.explanation=\uc5f0\uacb0\ud655\uc778(ping)\ub294 \uadc0\ud558\uc758 \uc6f9\ub85c\uadf8\uac00 \ubcc0\uacbd\ub418\uc5c8\uc74c\uc744 \uc0ac\uc774\ud2b8\uc5d0 \uacf5\uc9c0\ud560 \uc218 \uc788\uac8c \ud569\ub2c8\ub2e4. \ -\ub530\ub77c\uc11c \uc0ac\uc774\ud2b8\ub4e4\uc740 \uadc0\ud558\uc758 \ud53c\ub4dc\ub85c\ubd80\ud130 \ubcc0\uacbd\uc0ac\ud56d\ub4e4\uc744 \uc77d\uc5b4\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ -\uadc0\ud558\uc758 \uc6f9\ub85c\uadf8\uac00 \ubcc0\uacbd\ub420 \ub54c\ub9c8\ub2e4 \uc790\ub3d9\uc73c\ub85c \uc0ac\uc774\ud2b8\uc5d0 \uacf5\uc9c0\ud558\uace0\uc790 \ud55c\ub2e4\uba74 \uc790\ub3d9 \uc5f0\uacb0\ud655\uc778\uc744 \ud65c\uc131\ud654\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ -\ub610\ud55c \uc774 \ud398\uc774\uc9c0\uc5d0\uc11c \uc218\ub3d9\uc73c\ub85c \uc5f0\uacb0\ud655\uc778\uc744 \uc218\ud589\ud560 \ud2b9\uc815 \uc0ac\uc774\ud2b8\ub97c \uc124\uc815\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \ -\uc8fc\uc758: \uc77c\ubc18\uc801\uc73c\ub85c, \uc0ac\uc774\ud2b8 \uc5f0\uacb0\ud655\uc778\uc744 \uc2dc\uc791\ud558\uae30 \uc804\uc5d0 \ -\ud574\ub2f9 \uc0ac\uc774\ud2b8\uc5d0 \uadc0\ud558\uc758 \uc6f9\ub85c\uadf8\ub97c \ub4f1\ub85d\ud574\uc57c \ud569\ub2c8\ub2e4. -pings.commonPingTargets=\uacf5\ud1b5 \uc5f0\uacb0\ud655\uc778 \ub300\uc0c1 -pings.commonPingTargetsExplanation=\uc774 \uc5f0\uacb0\ud655\uc778 \ub300\uc0c1\ub4e4\uc740 \uc0ac\uc774\ud2b8 \uad00\ub9ac\uc790\uc5d0 \uc758\ud574 \uc124\uc815\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ -\uc774 \uc798 \uc54c\ub824\uc9c4 \uc0ac\uc774\ud2b8\ub4e4 \uc911\uc5d0 \uc5b4\ub290 \uacf3\uc774\ub4e0 \uc5f0\uacb0\ud655\uc778\uc744 \ubcf4\ub0bc \uc218 \uc788\uc2b5\ub2c8\ub2e4. - -ping.successful=\uc5f0\uacb0\ud655\uc778\uc774 \uc131\uacf5\ud588\uc2b5\ub2c8\ub2e4. -ping.transmittedButError=\uc5f0\uacb0\ud655\uc778\uc774 \uc804\uc1a1\ub418\uc5c8\uc73c\ub098, \uc11c\ubc84\uac00 \ub2e4\uc74c \uc624\ub958 \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0c8\uc2b5\ub2c8\ub2e4. -ping.transmissionFailed=\uc5f0\uacb0\ud655\uc778 \uc804\uc1a1\uc774 \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4. \ -\uc5f0\uacb0\ud655\uc778 \ub300\uc0c1 URL\uc774 \ub9de\ub294\uc9c0 \ud655\uc778\ud574 \uc8fc\uc2ed\uc2dc\uc624. -ping.unknownHost=\uc5f0\uacb0\ud655\uc778 \ub300\uc0c1 URL\uc758 \ud638\uc2a4\ud2b8\uba85\uc774 \uc54c\ub824\uc9c0\uc9c0 \uc54a\uc740 \uc774\ub984\uc785\ub2c8\ub2e4. -ping.networkConnectionFailed=\uc5f0\uacb0\ud655\uc778 \ub300\uc0c1 \uc0ac\uc774\ud2b8\uc5d0 \ub3c4\ub2ec\ud558\ub294 \ub370\uc5d0 \ub124\ud2b8\uc6cc\ud06c \uc5f0\uacb0 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4. -ping.pingProcessingIsSuspended=\uc5f0\uacb0\ud655\uc778 \ucc98\ub9ac\uac00 \uc0ac\uc774\ud2b8 \uad00\ub9ac\uc790\uc5d0 \uc758\ud574 \uc77c\uc2dc\uc801\uc73c\ub85c \uc911\uc9c0\ub418\uc5c8\uc2b5\ub2c8\ub2e4. - -pingTarget.pingUrl=\uc5f0\uacb0\ud655\uc778 URL -pingTarget.autoEnabled=\uc790\ub3d9 \uc5f0\uacb0\ud655\uc778? -pingTarget.remove=\uc0ad\uc81c -pingTarget.confirmRemoveTitle=\uc5f0\uacb0\ud655\uc778 \ub300\uc0c1 \uc0ad\uc81c \ud655\uc778 -pingTarget.confirmCommonRemove=\uc774 \uc5f0\uacb0\ud655\uc778 \ub300\uc0c1\uc744 \uc0ad\uc81c\ud558\uac8c \ub418\uba74, \ -\uc774 \uc5f0\uacb0\ud655\uc778 \ub300\uc0c1\uc744 \uc0ac\uc6a9\ud558\ub294 \ubaa8\ub4e0 \uc0ac\uc6a9\uc790\ub4e4\uc758 \uc790\ub3d9 \uc5f0\uacb0\ud655\uc778 \uc124\uc815\ub4e4\ub3c4 \ud568\uaed8 \uc0ad\uc81c\ub429\ub2c8\ub2e4. -pingTarget.enable=\ud65c\uc131\ud654 -pingTarget.enabled=\ud65c\uc131 -pingTarget.disable=\ube44\ud65c\uc131\ud654 -pingTarget.disabled=\ube44\ud65c\uc131 -pingTarget.auto=\uc790\ub3d9 -pingTarget.manual=\uc218\ub3d9 -pingTarget.sendPingNow=\uc5f0\uacb0\ud655\uc778 \uc9c0\uae08 \uc804\uc1a1 - -pingTarget.nameNotUnique=\uc774 \uc5f0\uacb0\ud655\uc778 \ub300\uc0c1\uc758 \uc774\ub984\uc774 \ub2e4\ub978 \ub300\uc0c1\uc758 \uc774\ub984\uacfc \ucda9\ub3cc\ud569\ub2c8\ub2e4. -pingTarget.malformedUrl=URL\uc774 \uc801\uc808\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. -pingTarget.unknownHost=\uc774 URL\uc758 \ud638\uc2a4\ud2b8\uba85\uc774 \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294 \uac83 \uac19\uc2b5\ub2c8\ub2e4. - # --------------------------------------------------------------- Planet Roller planetConfig.title=\ud50c\ub798\ub2db \ud658\uacbd \uc124\uc815 @@ -865,12 +820,10 @@ tabbedmenu.website.themes=\ud14c\ub9c8 tabbedmenu.website.pages=\ud15c\ud50c\ub9bf tabbedmenu.website.members=\uba64\ubc84 tabbedmenu.website.maintenance=\uc720\uc9c0\ubcf4\uc218 -tabbedmenu.weblog.pingSetup=\uc5f0\uacb0\ud655\uc778 tabbedmenu.admin=\uc11c\ubc84 \uad00\ub9ac\uc790 tabbedmenu.admin.config=\ud658\uacbd \uc124\uc815 tabbedmenu.admin.userAdmin=\uc0ac\uc6a9\uc790 \uad00\ub9ac\uc790 tabbedmenu.admin.commentManagement=\uc758\uacac -tabbedmenu.admin.pingTargets=\uc5f0\uacb0\ud655\uc778 \ub300\uc0c1 tabbedmenu.admin.cacheInfo=\uce90\uc2dc \uc815\ubcf4 tabbedmenu.planet=\ud50c\ub798\ub2db \uad00\ub9ac\uc790 tabbedmenu.admin.planetConfig=\ud658\uacbd\uc124\uc815 diff --git a/app/src/main/resources/ApplicationResources_ru.properties b/app/src/main/resources/ApplicationResources_ru.properties index 78aa084ca6..7689a1f938 100644 --- a/app/src/main/resources/ApplicationResources_ru.properties +++ b/app/src/main/resources/ApplicationResources_ru.properties @@ -35,7 +35,6 @@ generic.save=\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C generic.edit=\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C generic.delete=\u0423\u0434\u0430\u043B\u0438\u0442\u044C - # ------------------------------------------------------------- BookmarkForm.jsp bookmarkForm.add.title=\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443 @@ -95,7 +94,6 @@ categoryForm.add.subtitle=\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438 categoryForm.image=\u043A\u0430\u0440\u0442\u0438\u043D\u043A\u0430 - # ----------------------------------------------------------- CategoriesForm.jsp categoriesForm.subtitle=\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u044F\u043C\u0438 \u0432 \u0434\u043D\u0435\u0432\u043D\u0438\u043A\u0435 {0} @@ -151,7 +149,6 @@ configForm.shortName=\u041A\u0440\u0430\u0442\u043A\u043E\u0435 \u0438\u043C\u04 configForm.siteDescription=\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 \u0441\u0430\u0439\u0442\u0430 (\u0434\u043B\u044F \u0433\u043B\u0430\u0432\u043D\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B \u0438 \u043A\u0430\u043D\u0430\u043B\u043E\u0432 RSS) configForm.siteAdminEmail=Email \u0430\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440\u0430 configForm.absoluteUrl=\u0410\u0431\u0441\u043E\u043B\u044E\u0442\u043D\u044B\u0439 URL \u0441\u0430\u0439\u0442\u0430 (\u0435\u0441\u043B\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F) -configForm.suspendPingProcessing=\u041F\u0440\u0438\u043E\u0441\u0442\u0430\u043D\u043E\u0430\u0432\u0438\u0442\u044C \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0443 \u043F\u0438\u043D\u0433\u043E\u0432? configForm.userSettings=\u041D\u0430\u0441\u0440\u043E\u0439\u043A\u0438 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439 configForm.allowNewUsers=\u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044C \u043D\u043E\u0432\u044B\u0445? @@ -235,11 +232,9 @@ error.upload.forbiddenFile=\u041C\u043E\u0436\u043D\u043E \u0437\u0430\u0433\u04 error.general=\u041E\u0448\u0438\u0431\u043A\u0430: \u0417\u0430\u0444\u0438\u043A\u0441\u0438\u0440\u043E\u0432\u0430\u043D\u043E \u043D\u0435\u0432\u0435\u0440\u043D\u043E\u0435 \u0438\u0441\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 [{0}] error.password.mismatch=\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u043A\u043E\u043C\u0431\u0438\u043D\u0430\u0446\u0438\u044F \u0438\u043C\u0435\u043D\u0438 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F \u0438 \u043F\u0430\u0440\u043E\u043B\u044F - error.title.403=\u0414\u043E\u0441\u0442\u0443\u043F \u0437\u0430\u043F\u0440\u0435\u0449\u0435\u043D (403) error.text.403=\u0423 \u0432\u0430\u0441 \u043D\u0435\u0442 \u043F\u0440\u0430\u0432 \u0434\u043E\u0441\u0442\u0443\u043F\u0430 \u043A \u044D\u0442\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0435 \ \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u043E\u0439 \u0412\u0430\u043C\u0438 - error.title.404= \u0418\u0437\u0432\u0438\u043D\u0438\u0442\u0435! \u041C\u044B \u043D\u0435 \u043C\u043E\u0436\u0435\u043C \u043D\u0430\u0439\u0442\u0438 \u0432\u0430\u0448 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 (404) error.text.404=\u0424\u0430\u0439\u043B, \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044B\u0439 \u0412\u0430\u043C\u0438 \u043D\u0430 \u044D\u0442\u043E\u043C \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D. @@ -378,7 +373,6 @@ memberPermissions.permissionHelp= \u0410\u0432\u0442\u043E\u0440 - \u043C\u043E\u0436\u0435\u0442 \u0432\u0435\u0441\u0442\u0438 \u0437\u0430\u043F\u0438\u0441\u0438, \u043D\u043E \u043D\u0435 \u0443\u043F\u0440\u0430\u0432\u043B\u044F\u0442\u044C \u0434\u043D\u0435\u0432\u043D\u0438\u043A\u043E\u043C \u041E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u043D\u044B\u0439 - \u043C\u043E\u0436\u0435\u0442 \u0442\u043E\u043B\u044C\u043A\u043E \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0442\u044C \u0447\u0435\u0440\u043D\u043E\u0432\u044B\u0435 \u0437\u0430\u043F\u0438\u0441\u0438 - # --------------------------------------------------------- New user registation newUser.addNewUser=\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044F \u043D\u043E\u0432\u043E\u0433\u043E \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F @@ -404,7 +398,6 @@ pagesForm.add=Add - \u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C pagesForm.themesReminder=\u041D\u0430\u043F\u043E\u043C\u0438\u043D\u0430\u043D\u0438\u0435: \u0432\u044B \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0435 {0} \u043E\u0431\u0449\u0443\u044E \u0442\u0435\u043C\u0443, \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0448\u0430\u0431\u043B\u043E\u043D\u0430 \u043D\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043C\u0435\u0442\u043D\u044B \u0432 \u0412\u0430\u0448\u0435\u043C \u0434\u043D\u0435\u0432\u043D\u0438\u043A\u0435. editPages.title.removeOK=\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u0435 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0435 \u0448\u0430\u0431\u043B\u043E\u043D\u0430. - # -------------------------------------------------------------------- Page edit pageForm.link=\u0421\u0441\u044B\u043B\u043A\u0430 @@ -417,41 +410,6 @@ pageRemove.pageId=\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u pageRemove.pageName=\u0418\u043C\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B -# ---------------------------------------------------- Ping Target Admin/Editing - -commonPingTargets.subtitle=\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043E\u0431\u0449\u0438\u043C\u0438 \u0430\u0434\u0440\u0435\u0441\u0430\u043C\u0438 \u043F\u0438\u043D\u0433\u0430 \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0434\u043D\u0435\u0432\u043D\u0438\u043A\u043E\u0432 -commonPingTargets.commonPingTargets=\u041E\u0431\u0449\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u043F\u0438\u043D\u0433\u0430 -commonPingTargets.explanation=\u042D\u0442\u0438 \u0441\u0430\u0439\u0442\u044B \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B \u0441\u043E \u0432\u0441\u0435\u0445 \u0434\u043D\u0435\u0432\u043D\u0438\u043A\u043E\u0432 \u0434\u043B\u044F \u043F\u0438\u043D\u0433\u0430 \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u044F - -pings.title=\u041D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u043F\u0438\u043D\u0433 \u0434\u043D\u0435\u0432\u043D\u0438\u043A\u0430 -pings.subtitle=\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u043F\u0438\u043D\u0433\u0430 \u0434\u043D\u0435\u0432\u043D\u0438\u043A\u0430 {0} -pings.explanation=\u041F\u0438\u043D\u0433 \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u0412\u0430\u043C \u00AB\u0443\u0432\u0435\u0434\u043E\u043C\u0438\u0442\u044C\u00BB \u0441\u0430\u0439\u0442\u044B \u043E \u0442\u043E\u043C, \u0447\u0442\u043E \u0412\u0430\u0448 \u0434\u043D\u0435\u0432\u043D\u0438\u043A \u0438\u0437\u043C\u0435\u043D\u0438\u043B\u0441\u044F, \u0441 \u0442\u0435\u043C, \u0447\u0442\u043E\u0431\u044B \u0441\u0430\u0439\u0442\u044B \u043C\u043E\u0433\u043B\u0438 \u043F\u0440\u043E\u0447\u0435\u0441\u0442\u044C \u0412\u0430\u0448\u0443 \u043B\u0435\u043D\u0442\u0443 \u0438 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0435. \u0412\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u043F\u0438\u043D\u0433 \u0442\u0435\u0445 \u0441\u0430\u0439\u0442\u043E\u0432, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0445\u043E\u0442\u0435\u043B\u0438 \u0431\u044B \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u044F\u0442\u044C \u043E \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0438 \u0434\u043D\u0435\u0432\u043D\u0438\u043A\u0430 \u043F\u043E\u0441\u0442\u043E\u044F\u043D\u043D\u043E. \u0422\u0430\u043A\u0436\u0435 \u0412\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u0432\u0440\u0443\u0447\u043D\u0443\u044E \u0432\u044B\u0437\u0432\u0430\u0442\u044C \u043F\u0438\u043D\u0433 \u0434\u043B\u044F \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0445 \u0441\u0430\u0439\u0442\u043E\u0432 \u0441 \u044D\u0442\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B. \u041F\u0440\u0438\u043C\u0435\u0447\u0430\u043D\u0438\u0435: \u043E\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044F, \u0447\u0442\u043E \u0412\u044B \u0437\u0430\u0440\u0435\u0433\u0435\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0435 \u0434\u043D\u0435\u0432\u043D\u0438\u043A \u043D\u0430 \u0441\u0430\u0439\u0442\u0435 \u043F\u0435\u0440\u0435\u0434 \u0442\u0435\u043C, \u043A\u0430\u043A \u043F\u043E\u0441\u044B\u043B\u0430\u0442\u044C \u043F\u0438\u043D\u0433. -pings.commonPingTargets=\u041E\u0431\u0449\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u043F\u0438\u043D\u0433\u0430 -pings.commonPingTargetsExplanation=\u042D\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u0430 \u043F\u0438\u043D\u0433\u0430 \u0431\u044B\u043B\u0438 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043D\u044B \u0430\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440\u043E\u043C \u0441\u0430\u0439\u0442\u0430 \u0434\u043B\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F\u043C\u0438. \u0412\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u043E\u0441\u043B\u0430\u0442\u044C \u043F\u0438\u043D\u0433 \u043D\u0430 \u043B\u044E\u0431\u043E\u0439 \u0438\u0437 \u044D\u0442\u0438\u0445 \u0437\u043D\u0430\u043A\u043E\u043C\u044B\u0445 \u0441\u0430\u0439\u0442\u043E\u0432. - -ping.successful=\u041F\u0438\u043D\u0433 \u043F\u0440\u043E\u0448\u0435\u043B \u0443\u0441\u043F\u0435\u0448\u043D\u043E -ping.transmittedButError=\u041F\u0438\u043D\u0433 \u0431\u044B\u043B \u043F\u0435\u0440\u0435\u0434\u0430\u043D, \u043D\u043E \u0441\u0435\u0440\u0432\u0435\u0440 \u043E\u0442\u0432\u0435\u0442\u0438\u043B \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u043C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u043E\u0431 \u043E\u0448\u0438\u0431\u043A\u0435 -ping.transmissionFailed=\u041F\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043F\u0438\u043D\u0433\u0430 \u043F\u043E\u0442\u0435\u0440\u044F\u043D\u0430. \u041F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E\u0441\u0442\u044C URL \u0430\u0434\u0440\u0435\u0441\u0430 \u043F\u0438\u043D\u0433\u0430 -ping.unknownHost=\u0418\u043C\u044F \u0445\u043E\u0441\u0442\u0430 \u0432 URL \u0430\u0434\u0440\u0435\u0441\u0430 \u043F\u0438\u043D\u0433\u0430 \u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u043E -ping.networkConnectionFailed=\u041F\u0440\u0438 \u043F\u0440\u043E\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u0438 \u043F\u0438\u043D\u0433\u0430 \u0432\u043E\u0437\u043D\u0438\u043A\u043B\u0438 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u044B \u0441\u0435\u0442\u0438 -ping.pingProcessingIsSuspended=\u0412\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044C \u043F\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043F\u0438\u043D\u0433\u0430 \u0431\u044B\u043B\u0430 \u0432\u0440\u0435\u043C\u0435\u043D\u043D\u043E \u043F\u0440\u0438\u043E\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0430 \u0430\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440\u043E\u043C \u0441\u0430\u0439\u0442\u0430 - -pingTarget.pingUrl=URL \u043F\u0438\u043D\u0433\u0430 -pingTarget.remove=\u0423\u0434\u0430\u043B\u0438\u0442\u044C -pingTarget.confirmRemoveTitle=\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u043F\u0438\u043D\u0433\u0430 -pingTarget.confirmCommonRemove=\u0423\u0434\u0430\u043B\u0435\u043D\u0438\u0435 \u044D\u0442\u043E\u0433\u043E \u0430\u0434\u0440\u0435\u0441\u0430 \u043F\u043E\u0432\u043B\u0435\u0447\u0435\u0442 \u0437\u0430 \u0441\u043E\u0431\u043E\u0439 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0435 \u0432\u0441\u0435\u0445 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0445 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A \u043F\u0438\u043D\u0433\u0430, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0449\u0438\u0445 \u044D\u0442\u043E\u0442 \u0430\u0434\u0440\u0435\u0441. \u0412\u044B \u0443\u0432\u0435\u0440\u0435\u043D\u044B? -pingTarget.enable=Enable -pingTarget.enabled=ON -pingTarget.disable=Disable -pingTarget.disabled=OFF -pingTarget.auto=\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 -pingTarget.manual=\u0412\u0440\u0443\u0447\u043D\u0443\u044E -pingTarget.sendPingNow=\u041F\u043E\u0441\u043B\u0430\u0442\u044C \u043F\u0438\u043D\u0433 - -pingTarget.nameNotUnique=\u0418\u043C\u044F \u044D\u0442\u043E\u0439 \u0446\u0435\u043B\u0438 \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u0443\u0435\u0442 \u0441 \u0434\u0440\u0443\u0433\u0438\u043C \u0432 \u0442\u043E\u043C \u0436\u0435 \u043D\u0430\u0431\u043E\u0440\u0435 \u0446\u0435\u043B\u0435\u0439. -pingTarget.malformedUrl=URL \u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E \u0441\u0444\u043E\u0440\u043C\u0438\u0440\u043E\u0432\u0430\u043D. -pingTarget.unknownHost=\u0418\u043C\u044F \u0445\u043E\u0441\u0442\u0430 \u0432 \u0437\u0430\u0434\u0430\u043D\u043D\u043E\u043C URL \u043D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, - # --------------------------------------------------------------- Planet Roller planetConfig.subtitle=\u041D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C Roller'\u0441\u043A\u0438\u0439 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0439 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043E\u0440 \u043D\u043E\u0432\u043E\u0441\u0442\u043D\u044B\u0445 \u043B\u0435\u043D\u0442 @@ -525,17 +483,14 @@ tabbedmenu.website.themes=\u0422\u0435\u043C\u0430 tabbedmenu.website.pages=\u0428\u0430\u0431\u043B\u043E\u043D\u044B tabbedmenu.website.members=\u0423\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0438 tabbedmenu.website.maintenance=\u041E\u0431\u0441\u043B\u0443\u0436\u0438\u0432\u0430\u043D\u0438\u0435 -tabbedmenu.weblog.pingSetup=\u041F\u0438\u043D\u0433\u0438 tabbedmenu.admin=Global Admin tabbedmenu.admin.config=\u041A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044F tabbedmenu.admin.userAdmin=User Admin -tabbedmenu.admin.pingTargets=\u0410\u0434\u0440\u0435\u0441\u0430\u0442\u044B \u043F\u0438\u043D\u0433\u0430 tabbedmenu.planet=Planet Admin tabbedmenu.admin.planetConfig=\u041A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044F tabbedmenu.admin.planetGroupSubs=\u041F\u043E\u0434\u043F\u0438\u0441\u043A\u0438 tabbedmenu.admin.planetGroups=\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0435 \u0433\u0440\u0443\u043F\u043F\u044B - # ----------------------------------------------------------------------- Theme themeEditor.title=\u0422\u0435\u043C\u0430 \u0434\u043D\u0435\u0432\u043D\u0438\u043A\u0430 @@ -666,7 +621,6 @@ weblogEdit.pending = \u041E\u0436\u0438\u0434\u0430\u043D\u0438\u0435 weblogEdit.publishedEntries = \u041F\u043E\u0441\u043B\u0435\u0434\u043D\u044F\u044F \u0437\u0430\u043F\u0438\u0441\u044C weblogEdit.previewMode = \u041F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 weblogEdit.post = \u041F\u043E\u0441\u0442 \u0432 \u0434\u043D\u0435\u0432\u043D\u0438\u043A -weblogEdit.ping = \u041F\u0438\u043D\u0433 \u043D\u0430 Weblogs.com weblogEdit.permaLink = \u0441\u0441\u044B\u043B\u043A\u0430 \u043D\u0430 \u0437\u0430\u043F\u0438\u0441\u044C weblogEdit.published = \u041E\u043F\u0443\u0431\u043B\u0438\u043A\u043E\u0432\u0430\u043D weblogEdit.pubTime = \u0412\u0440\u0435\u043C\u044F \u043F\u0443\u0431\u043B\u0438\u043A\u0430\u0446\u0438\u0438 @@ -682,7 +636,6 @@ weblogEdit.title = \u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A weblogEdit.unsaved = \u041D\u0435 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u043E weblogEdit.updateTime = \u041F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0435 \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0435 - weblogEdit.allowComments = \u0412\u0441\u0435 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 weblogEdit.commentDays = \u0434\u043B\u044F weblogEdit.unlimitedCommentDays = \u043D\u0435\u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u043D\u044B\u0435 \u0434\u043D\u0435\u0439 @@ -693,20 +646,16 @@ weblogEdit.days30=30 \u0434\u043D\u0435\u0439 weblogEdit.days60=60 \u0434\u043D\u0435\u0439 weblogEdit.days90=90 \u0434\u043D\u0435\u0439 - weblogEdit.pluginsToApply = \u041C\u043E\u0434\u0443\u043B\u0438 \u0434\u043B\u044F \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F weblogEdit.miscSettings = \u0420\u0430\u0437\u043D\u044B\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 weblogEdit.rightToLeft = \u0422\u0435\u043A\u0441\u0442 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044F \u0441\u043F\u0440\u0430\u0432\u0430 \u043D\u0430\u043B\u0435\u0432\u043E weblogEdit.pinnedToMain = \u041F\u0440\u0438\u043A\u0440\u0435\u043F\u043B\u044F\u0435\u0442\u0441\u044F \u043A \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u043C\u0443 - - weblogEdit.comment=\u041A\u043E\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 weblogEdit.error.incompleteEntry = \u0417\u0430\u043F\u0438\u0441\u044C \u0434\u043E\u043B\u0436\u043D\u0430 \u0438\u043C\u0435\u0442\u044C \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A - # ---------------------------------------------------------- Weblog Entry Remove weblogEntryRemove.removeweblogEntry = \u0423\u0434\u0430\u043B\u0435\u043D\u0438\u0435 \u0437\u0430\u043F\u0438\u0441\u0438 \u0438\u0437 \u0434\u043D\u0435\u0432\u043D\u0438\u043A\u0430 weblogEntryRemove.yes = \u0414\u0430 @@ -834,7 +783,6 @@ websiteRemove.youSure = \u0412\u044B \u0443\u0432\u0435\u0440\u0435\u043D\u044B, websiteRemove.websiteId = \u0434\u043D\u0435\u0432\u043D\u0438\u043A ID websiteRemove.websiteName = \u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0434\u043D\u0435\u0432\u043D\u0438\u043A\u0430 - # ------------------------------------------------------------- Welcome new user welcome.title = \u0414\u043E\u0431\u0440\u043E \u043F\u043E\u0436\u0430\u043B\u043E\u0432\u0430\u0442\u044C \u0432 Roller welcome.accountCreated = \u0412\u0430\u0448\u0430 \u043D\u043E\u0432\u044B\u0430\u044F \u0443\u0447\u0435\u0442\u043D\u0430\u044F \u0437\u0430\u043F\u0438\u0441\u044C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F \u0431\u044B\u043B\u0430 \u0441\u043E\u0437\u0434\u0430\u043D\u0430. @@ -870,7 +818,6 @@ yourWebsites.invited = \u0412\u044B \u0431\u044B\u043B\u0438 \u043F\u0440\u0438\ yourWebsites.accept = \u043F\u0440\u0438\u043D\u044F\u0442\u044C yourWebsites.decline = \u043E\u0442\u043A\u043B\u043E\u043D\u0438\u0442\u044C - yourWebsites.tableTitle = \u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A yourWebsites.tableDescription = \u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 yourWebsites.select = \u0412\u044B\u0431\u043E\u0440 @@ -889,7 +836,6 @@ yourWebsites.createWeblog = \u041D\u043E\u0432\u0430\u044F \u0437\u0430\u043F\u0 yourWebsites.createWeblog.desc = \ \u0421\u043A\u0430\u0436\u0438\u0442\u0435 \u0431\u043E\u043B\u044C\u0448\u0435? \u0412\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0434\u0440\u0443\u0433\u043E\u0439 \u0434\u043D\u0435\u0432\u043D\u0438\u043A- \u0442\u043E, \u0432 \u0447\u0435\u043C \u0412\u044B \u043D\u0443\u0436\u0434\u0430\u0435\u0442\u0435\u0441\u044C. - yourWebsites.editProfile=\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u043F\u0440\u0444\u0438\u043B\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F yourWebsites.editProfile.desc=\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435 \u043F\u0430\u0440\u043E\u043B\u044F, \u043A\u043E\u043D\u0442\u0430\u043A\u0442\u043D\u043E\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438, \u0432\u044B\u0431\u043E\u0440 \u044F\u0437\u044B\u043A\u0430 @@ -900,7 +846,6 @@ yourWebsites.planetAdmin=\u041F\u043B\u0430\u043D\u0435\u0442\u0430 \u0430\u0434 yourWebsites.planetAdmin.desc=\ \u041C\u0435\u043D\u0435\u0434\u0436\u0435\u0440 \u043F\u043B\u0430\u043D\u0435\u0442\u044B \u0430\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F. \u041E\u0440\u0433\u0430\u043D\u0438\u0437\u0443\u0439\u0442\u0435 \u0433\u0440\u0443\u043F\u044B, \u0443\u0430\u043D\u043E\u0432\u0438\u0442\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 - yourWebsites.invitations=\u041F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u044F \u0432 \u0434\u043D\u0435\u0432\u043D\u0438\u043A yourWebsites.invitationsPrompt=\u0412\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u043E\u0434\u043D\u043E \u0438 \u0431\u043E\u043B\u0435\u0435 \u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0439 \u043F\u0440\u0438\u043D\u044F\u0442\u044C \u0438\u043B\u0438 \ \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C: diff --git a/app/src/main/resources/ApplicationResources_zh_CN.properties b/app/src/main/resources/ApplicationResources_zh_CN.properties index 03792b4a7a..a3a77a0299 100644 --- a/app/src/main/resources/ApplicationResources_zh_CN.properties +++ b/app/src/main/resources/ApplicationResources_zh_CN.properties @@ -122,7 +122,6 @@ bookmarksImport.subtitle=\u5BFC\u5165OPML\u683C\u5F0F\u4E66\u7B7E\u5230\u535A\u5 bookmarksImport.prompt=\u4E0A\u4F20\u6807\u51C6OPML\u683C\u5F0F\u7684\u4E66\u7B7E\u6587\u4EF6\u3002\u8FD9\u4E9B\u4E66\u7B7E\u5C06\u4F1A\u5BFC\u5165\u5230\u4E00\u4E2A\u65B0\u7684\u4E66\u7B7E\u5939\uFF08\u4E66\u7B7E\u5939\u7684\u540D\u5B57\u4F7F\u7528\u9ED8\u8BA4\u7684\u65F6\u95F4\u6233\uFF09\u3002\u5BFC\u5165\u4E4B\u540E\u4F60\u53EF\u4EE5\u8FDB\u884C\u7F16\u8F91\u6216\u8005\u79FB\u52A8\u5230\u5176\u5B83\u4E66\u7B7E\u5939\u3002 - bookmarksImport.imported=\u5BFC\u5165OPML\u683C\u5F0F\u4E66\u7B7E\u5230\u4E66\u7B7E\u5939 [{0}] bookmarksImport.error=\u5BFC\u5165\u4E66\u7B7E\u9519\u8BEF: {0} bookmarksImport.import=\u5BFC\u5165 @@ -172,8 +171,6 @@ categoriesForm.rootTitle=\u5206\u7C7B categoriesForm.rootPrompt=\u8FD9\u91CC\u662F\u4F60\u7684\u9876\u7EA7\u5206\u7C7B\uFF0C\u535A\u5BA2\u81F3\u5C11\u8981\u6709\u4E00\u4E2A\u5206\u7C7B\u3002\u5206\u7C7B\u662F\u7528\u6765\u7EC4\u7EC7\u4F60\u7684\u6587\u7AE0\uFF0C\u4F60\u7684\u8BFB\u8005\u4E5F\u53EF\u4EE5\u901A\u8FC7\u9009\u62E9\u67D0\u4E00\u4E2A\u5206\u7C7B\u6765\u8BA2\u9605\u4ED6\u611F\u5174\u8DA3\u7684\u4E13\u9898\u3002 - - categoriesForm.addCategory=\u6DFB\u52A0\u5206\u7C7B categoriesForm.move=\u79FB\u52A8 categoriesForm.move.confirm=\u786E\u5B9A\u8981\u79FB\u52A8\u9009\u4E2D\u7684\u5206\u7C7B\u5417\uFF1F @@ -238,14 +235,9 @@ commentManagement.website.subtitle=\u7BA1\u7406\u535A\u5BA2 {0} \u4 commentManagement.tip=\u6709\u8BC4\u8BBA\u3002\u4F60\u53EF\u4EE5\u901A\u8FC7\u4E0B\u9762\u7684\u9009\u62E9\u6846\u6539\u53D8\u6838\u51C6\u72B6\u6001\uFF0C\u5783\u573E\u8BC4\u8BBA\u72B6\u6001\u548C\u5220\u9664\u8BC4\u8BBA\u3002\u5982\u679C\u4F60\u505A\u4E86\u4EFB\u4F55\u66F4\u6539\uFF0C\u8BB0\u5F97\u70B9\u51FB\u9876\u90E8\u7684 \u4FDD\u5B58\u66F4\u6539\u6309\u94AE\u3002 - - commentManagement.globalTip=\u4F5C\u4E3A\u8D85\u7EA7\u7BA1\u7406\u5458\uFF0C\u4F60\u53EF\u4EE5\u66F4\u6539\u5783\u573E\u8BC4\u8BBA\u72B6\u6001\uFF0C\u53EF\u4EE5\u901A\u8FC7\u9009\u4E2D\u4E0B\u9762\u7684\u9009\u62E9\u6846\u5220\u9664\u8BC4\u8BBA\u3002\u4F46\u662F\u4F60\u4E0D\u80FD\u66F4\u6539\u5904\u4E8E\u7B49\u5F85\u548C\u6838\u51C6\u72B6\u6001\u7684\u8BC4\u8BBA\uFF0C\u4E5F\u5C31\u662F\u8BF4\u4F60\u4E0D\u80FD\u4ECB\u5165\u5E72\u6270\u4EFB\u4F55\u4EBA\u6838\u51C6\u8BC4\u8BBA\u7684\u5DE5\u4F5C\u6D41\u7A0B\u3002\u5982\u679C\u4F60\u505A\u4E86\u4EFB\u4F55\u66F4\u6539\uFF0C\u4E0D\u8981\u5FD8\u4E86\u70B9\u51FB\u9876\u90E8\u7684 \u4FDD\u5B58\u66F4\u6539 \u6765\u4F7F\u5176\u751F\u6548\u3002 - - - commentManagement.nowShowing=\u663E\u793A {0} \u8BC4\u8BBA commentManagement.noCommentsFound=\u6CA1\u6709\u8BC4\u8BBA @@ -313,8 +305,6 @@ configForm.subtitle=\u66F4\u6539\u5168\u7F51\u7AD9\u8303\u56F4\u7684\u914D\u7F6E configForm.prompt=\u4F60\u5728\u8FD9\u91CC\u505A\u7684\u4FEE\u6539\u5BF9\u6240\u6709\u535A\u5BA2\u751F\u6548\u3002\u6CE8\u610F\u8FD9\u4EC5\u4EC5\u662Fruntime\u5C5E\u6027\u3002\u5177\u4F53\u64CD\u4F5C\u8BF7\u67E5\u8BE2\u7CFB\u7EDF\u6587\u6863\u5173\u4E8E\u8986\u76D6\u521D\u59CB\u5C5E\u6027\u90E8\u5206\uFF08\u5728roller.proerties\u6587\u4EF6\u4E2D\uFF09\u3002 - - configForm.siteSettings=\u7AD9\u70B9\u8BBE\u7F6E configForm.siteName=\u7AD9\u70B9\u540D\u79F0\uFF08\u7528\u4E8E\u4E3B\u9875\u548C\u65B0\u95FB\u6E90\uFF09 configForm.shortName=\u7B80\u79F0\uFF08\u663E\u793A\u5728\u7AD9\u70B9\u6A2A\u5E45\u4E2D\uFF09 @@ -323,7 +313,6 @@ configForm.frontpageWeblogHandle=\u4F5C\u4E3A\u7AD9\u70B9\u9996\u9875\u7684\u535 configForm.frontpageWeblogAggregated=\u542F\u7528\u5168\u7AD9\u805A\u5408\u9996\u9875 configForm.siteAdminEmail=\u7BA1\u7406\u5458\u7535\u5B50\u90AE\u7BB1 configForm.absoluteUrl=\u7AD9\u70B9\u7684\u7EDD\u5BF9URL\uFF08\u5982\u9700\u8BBE\u7F6E\uFF09 -configForm.suspendPingProcessing=\u662F\u5426\u6682\u505C\u6240\u6709\u63A8\u9001\u5904\u7406\uFF1F configForm.allowUserWeblogCreation=\u662F\u5426\u5141\u8BB8\u7528\u6237\u65B0\u5EFA\u535A\u5BA2\uFF1F configForm.none=\u672A\u6307\u5B9A @@ -379,7 +368,6 @@ createWebsite.tip.name=\u8FD9\u4E2A\u540D\u5B57\u662F\u4F60\u7684\u535A\u5BA2\u7 createWebsite.tip.description=\u4F60\u5BF9\u535A\u5BA2\u7684\u63CF\u8FF0\u5C06\u4F1A\u5728\u4F60\u7684\u535A\u5BA2\u4E0A\u90E8\u663E\u793A\uFF08\u53D6\u51B3\u4E8E\u4F60\u9009\u62E9\u7684\u4E3B\u9898\u662F\u5426\u652F\u6301\uFF09\uFF0C\u800C\u4E14\u8FD8\u4F1A\u5728\u4F60\u7684\u7AD9\u70B9\u65B0\u95FB\u6E90\u4E2D\u51FA\u73B0\u3002\u8FD9\u4E2A\u533A\u57DF\u4E0D\u652F\u6301\u8D85\u6587\u672C\u6807\u8BB0\u8BED\u8A00\uFF08HTML\uFF09\u3002 - createWebsite.tip.handle=\u535A\u5BA2\u4EE3\u53F7\u662F\u4E00\u4E2A\u5BF9\u4F60\u7684\u535A\u5BA2\u8FDB\u884C\u7B80\u77ED\u63CF\u8FF0\u7684\u8BCD\u3002\u5B83\u5C06\u4F1A\u4F5C\u4E3A\u4F60\u7684\u535A\u5BA2URL\uFF0C\u6240\u4EE5\u8BF7\u4F60\u5728ASCII\u5B57\u7B26\uFF08a\uFF0Dz\uFF0CA\uFF0DZ\u548C0\uFF0D9\uFF09\u4E2D\u9009\u62E9\u800C\u4E0D\u8981\u4F7F\u7528\u8D85\u6587\u672C\u6807\u8BB0\u8BED\u8A00\uFF08HTML\uFF09\u3002 @@ -392,7 +380,6 @@ createWebsite.tip.locale=\u9ED8\u8BA4\u7684\u533A\u57DF\u8BED\u8A00\u8BBE\u7F6E\ createWebsite.tip.theme=\u4E3B\u9898\u7528\u6765\u786E\u5B9A\u4F60\u7684\u535A\u5BA2\u663E\u793A\u5177\u4F53\u91C7\u7528\u54EA\u79CD\u98CE\u683C\u6765\u663E\u793A\u3002\u4EE5\u540E\uFF0C\u4F60\u4E5F\u53EF\u4EE5\u65B9\u4FBF\u7684\u4ECE\u4E00\u79CD\u4E3B\u9898\u8F6C\u6362\u4E3A\u53E6\u4E00\u79CD\u4E3B\u9898\uFF0C\u8FD8\u53EF\u4EE5\u4F7F\u7528\u5B9A\u5236\u529F\u80FD\u6765\u4E2A\u6027\u5316\u3002 - createWebsite.handle=\u4EE3\u53F7 createWebsite.emailAddress=\u7535\u5B50\u90AE\u7BB1 createWebsite.locale=\u533A\u57DF\u8BED\u8A00 @@ -514,8 +501,6 @@ index.createUserDone=\u5B8C\u6210\uFF1A\u76EE\u524D\u6709{0}\u4E2A\u7528\u6237 index.createUserHelp=\u5728\u5F00\u59CB\u4F7F\u7528\u535A\u5BA2\u524D\uFF0C\u4F60\u9700\u8981\u521B\u5EFA\u4E00\u4E2A\u65B0\u7528\u6237\u4EE5\u8FDB\u884C\u7BA1\u7406\u64CD\u4F5C\u3002\u8BF7\u6CE8\u610F\uFF1A\u4F60\u521B\u5EFA\u7684\u7B2C\u4E00\u4E2A\u7528\u6237\u5C06\u62E5\u6709\u8D85\u7EA7\u7BA1\u7406\u5458\u6743\u9650\uFF0C\u53EF\u4EE5\u7BA1\u7406\u666E\u901A\u7528\u6237\u548C\u5176\u4ED6\u7BA1\u7406\u5458\u3002 - - index.createUserBy=\u521B\u5EFA\u7B2C\u4E00\u4E2A\u7528\u6237\uFF1A index.createUserPage=\u65B0\u7528\u6237\u6CE8\u518C\u9875 @@ -524,8 +509,6 @@ index.createWeblogDone=\u5B8C\u6210\uFF1A\u76EE\u524D\u6709{0}\u4E2A\u535A\u5BA2 index.createWeblogHelp=\u5728\u5F00\u59CB\u64B0\u5199\u6587\u7AE0\u524D\uFF0C\u4F60\u9700\u8981\u521B\u5EFA\u81F3\u5C11\u4E00\u4E2A\u535A\u5BA2\u3002\u4F60\u53EF\u4EE5\u521B\u5EFA\u4EFB\u610F\u6570\u91CF\u7684\u535A\u5BA2\u3002\u6BCF\u4E2A\u7528\u6237\u53EF\u4EE5\u62E5\u6709\u591A\u4E2A\u535A\u5BA2\uFF0C\u6BCF\u4E2A\u535A\u5BA2\u53EF\u4EE5\u62E5\u6709\u591A\u4E2A\u4F5C\u8005\u3002 - - index.createWeblogBy=\u521B\u5EFA\u7B2C\u4E00\u4E2A\u535A\u5BA2\uFF1A index.createWeblogPage=\u65B0\u535A\u5BA2\u521B\u5EFA\u9875 @@ -533,8 +516,6 @@ index.setFrontpage=\u6307\u5B9A\u4E00\u4E2A\u9996\u9875\u535A\u5BA2 index.setFrontpageHelp=\u4F60\u9700\u8981\u6307\u5B9A\u4E00\u4E2A\u535A\u5BA2\u4F5C\u4E3A\u9996\u9875\u535A\u5BA2\uFF0C\u4F60\u53EF\u4EE5\u901A\u8FC7\u7CFB\u7EDF\u7BA1\u7406->\u53C2\u6570\u8BBE\u7F6E\u9875\u6307\u5B9A\u9996\u9875\u535A\u5BA2\u3002\u5982\u679C\u4F60\u5DF2\u521B\u5EFA\u81F3\u5C11\u4E00\u4E2A\u535A\u5BA2\uFF0C\u4E5F\u53EF\u4EE5\u76F4\u63A5\u5728\u6B64\u5904\u6307\u5B9A\u3002 - - frontpageConfig.frontpageBlogName=\u4F5C\u4E3A\u9996\u9875\u535A\u5BA2\u7684\u535A\u5BA2\u540D\u79F0 frontpageConfig.frontpageAggregated=\u542F\u7528\u5168\u7AD9\u5185\u5BB9\u805A\u5408\u9996\u9875 frontpageConfig.values.saved=\u5C5E\u6027\u4FDD\u5B58\u6210\u529F @@ -550,8 +531,6 @@ inviteMember.subtitle=\u9080\u8BF7\u4E00\u4E2A\u65B0\u7528\u6237\u52A0\u5165\u8F inviteMember.prompt=\u901A\u8FC7\u7535\u5B50\u90AE\u4EF6\u9080\u8BF7\u4E00\u4E2A\u7528\u6237\u52A0\u5165\u8FD9\u4E2A\u535A\u5BA2\uFF0C\u9009\u62E9\u4E00\u79CD\u8BB8\u53EF\uFF0C\u7136\u540E\u70B9\u51FB\u53D1\u51FA\u9080\u8BF7\u6309\u94AE\u3002\u5982\u679C\u7528\u6237\u672A\u5728\u4E0B\u9762\u663E\u793A\uFF0C\u53EF\u4EE5\u952E\u5165\u4E00\u4E24\u4E2A\u5B57\u6BCD\u6765\u627E\u5230\u76F8\u5339\u914D\u7684\u7528\u6237\u3002 - - inviteMember.userName=\u7528\u6237\u540D inviteMember.administrator=\u7BA1\u7406\u5458 inviteMember.author=\u4F5C\u8005 @@ -570,7 +549,6 @@ inviteMember.notificationSubject=Roller\u9080\u8BF7\u4F60\u52A0\u5165\u535A\u5BA inviteMember.notificationContent=\u4F60\u5DF2\u88AB\u9080\u8BF7\u52A0\u5165\u535A\u5BA2\u201C{0}\u201D({1})\u3002\u8BF7\u70B9\u51FB\u4E0B\u9762\u7684\u94FE\u63A5\u4EE5[{2}]\u8D26\u53F7\u767B\u5F55\uFF0C\u9009\u62E9\u63A5\u53D7\u6216\u8005\u62D2\u7EDD\u8FD9\u4E2A\u9080\u8BF7<{3}>\u3002 - inviteMember.disabled=\u9080\u8BF7\u529F\u80FD\u5DF2\u7981\u7528 # ----------------------------------------------------------------------- Login @@ -585,8 +563,6 @@ installer.whatHappened=\u53D1\u751F\u4E86\u4EC0\u4E48\uFF1F installer.whatHappenedDatabaseConnectionError=\u53D1\u751F\u4E86\u4E00\u4E2A\u6570\u636E\u5E93\u9519\u8BEF\uFF0C\u53EF\u80FD\u662F\u56E0\u4E3A\u4F60\u7684\u6570\u636E\u5E93\u8FDE\u63A5\u914D\u7F6E\u4E0D\u6B63\u786E\u3002\u4F60\u5FC5\u987B\u4FEE\u590D\u6B64\u95EE\u9898\u518D\u91CD\u65B0\u542F\u52A8\u6216\u90E8\u7F72Roller\u624D\u80FD\u7EE7\u7EED\u3002\u4EE5\u4E0B\u662F\u5F53Roller\u5C1D\u8BD5\u5EFA\u7ACB\u8FDE\u63A5\u65F6\u6240\u53D1\u751F\u7684\u95EE\u9898\u8BB0\u5F55\uFF1A - - installer.whyDidThatHappen=\u95EE\u9898\u4E3A\u4EC0\u4E48\u53D1\u751F\uFF1F installer.aboutTheException=\u5982\u679C\u4E0A\u9762\u7684\u7EBF\u7D22\u8FD8\u4E0D\u8DB3\u4EE5\u5E2E\u52A9\u4F60\u627E\u51FA\u539F\u56E0\u6240\u5728\uFF0C\u8FD9\u91CC\u8FD8\u6709\u4E00\u4E9B\u66F4\u591A\u7EC6\u8282\u3002\u6B64\u95EE\u9898\u7684\u6839\u6E90\u662F\u4E00\u4E2A\u4EE5\u4E0B\u7C7B\u578B\u7684\u5F02\u5E38 @@ -600,11 +576,6 @@ installer.unknownError=\u53D1\u751F\u4E86\u4E00\u4E2A\u672A\u77E5\u9519\u8BEF installer.whatHappenedUnknown=\u5F53 Roller \u5C1D\u8BD5\u68C0\u67E5\u6570\u636E\u5E93\u72B6\u6001\u6216\u5F15\u5BFC\u4FE1\u606F\u65F6\u53D1\u751F\u4E86\u672A\u77E5\u7684\u610F\u5916\u9519\u8BEF\u3002Roller \u65E0\u6CD5\u786E\u5B9A\u53D1\u751F\u4E86\u4EC0\u4E48\uFF0C\u6240\u4EE5\u4F60\u5FC5\u987B\u67E5\u770B\u4F60\u7684\u670D\u52A1\u5668\u7684\u65E5\u5FD7\u6587\u4EF6\u5E76\u81EA\u884C\u8BCA\u65AD\u9519\u8BEF\u3002\u8BF7\u53C2\u7167 Roller wiki \u4E0A\u7684\u6307\u5BFC\u5E76\u5728 Roller \u7528\u6237\u90AE\u4EF6\u5217\u8868 \u5BFB\u6C42\u5E2E\u52A9\u3002 - - - - - # create tables installer.database.creation.pageTitle=\u521B\u5EFA\u6570\u636E\u5E93\u8868 installer.noDatabaseTablesFound=\u672A\u627E\u5230\u6570\u636E\u5E93\u8868 @@ -622,9 +593,6 @@ installer.errorCreatingTables=\u8868\u521B\u5EFA\u5931\u8D25 installer.errorCreatingTablesExplanation=\u521B\u5EFA\u8868\u65F6\u53D1\u751F\u9519\u8BEF\uFF0C\u53EF\u80FD\u662F\u7531\u4E8E\u6570\u636E\u5E93\u521B\u5EFA\u811A\u672C\u4E2D\u7684\u9519\u8BEF\u6216\u662F\u56E0\u4E3A\u4F60\u4F7F\u7528\u4E86\u4E0D\u53D7\u652F\u6301\u7684\u6570\u636E\u5E93\u3002\u4F60\u5FC5\u987B\u4FEE\u590D\u6B64\u95EE\u9898\u7136\u540E\u91CD\u65B0\u542F\u52A8\u6216\u91CD\u65B0\u90E8\u7F72 Roller \u624D\u80FD\u7EE7\u7EED\u4E0B\u4E00\u6B65\u3002 \u4EE5\u4E0B\u662F\u5728\u521B\u5EFA\u8FC7\u7A0B\u4E2D\u4EA7\u751F\u7684\u6210\u529F/\u5931\u8D25\u6D88\u606F\uFF1A - - - # upgrade tables installer.database.upgrade.pageTitle=\u5347\u7EA7\u6570\u636E\u5E93\u8868 installer.databaseUpgradeNeeded=\u6570\u636E\u5E93\u8868\u9700\u8981\u5347\u7EA7 @@ -641,10 +609,6 @@ installer.errorUpgradingTables=\u8868\u5347\u7EA7\u51FA\u9519 installer.errorUpgradingTablesExplanation=\u5347\u7EA7\u8868\u65F6\u53D1\u751F\u9519\u8BEF\uFF0C\u53EF\u80FD\u662F\u7531\u4E8E\u6570\u636E\u5E93\u521B\u5EFA\u811A\u672C\u4E2D\u7684\u9519\u8BEF\u6216\u662F\u56E0\u4E3A\u4F60\u4F7F\u7528\u4E86\u4E0D\u53D7\u652F\u6301\u7684\u6570\u636E\u5E93\u3002\u4F60\u5FC5\u987B\u4FEE\u590D\u6B64\u95EE\u9898\u7136\u540E\u91CD\u65B0\u542F\u52A8\u6216\u91CD\u65B0\u90E8\u7F72 Roller \u624D\u80FD\u7EE7\u7EED\u4E0B\u4E00\u6B65\u3002 \u4EE5\u4E0B\u662F\u5728\u5347\u7EA7\u8FC7\u7A0B\u4E2D\u4EA7\u751F\u7684\u6210\u529F/\u5931\u8D25\u6D88\u606F\uFF1A - - - - # ----------------------------------------------------------------------- Login loginPage.title=\u6B22\u8FCE\u4F7F\u7528Roller @@ -807,7 +771,6 @@ mediaFileView.subtitle=\u535A\u5BA2 {0} \u4E2D\u7684\u5A92\u4F53\u6587\u4EF6 mediaFileView.rootPageTip=\u672C\u9875\u9762\u663E\u793A\u4F60\u6240\u4E0A\u4F20\u6216\u662F\u5728\u81EA\u5B9A\u4E49\u4E3B\u9898\u65F6\u6240\u590D\u5236\u7684\u5A92\u4F53\u6587\u4EF6\u3002\u4F60\u53EF\u4EE5\u4F7F\u7528\u76EE\u5F55\u6765\u7EC4\u7EC7\u6587\u4EF6\uFF0C\u79FB\u52A8\u548C\u91CD\u547D\u540D\u6587\u4EF6\u4E0D\u4F1A\u7834\u574F\u73B0\u6709\u7684\u6587\u4EF6\u94FE\u63A5\u3002 - mediaFileView.dirPageTip=\u8FD9\u662F\u4E00\u4E2A\u5A92\u4F53\u6587\u4EF6\u76EE\u5F55\u3002\u4F60\u53EF\u4EE5\u70B9\u51FB\u4E0A\u65B9\u7684\u5BFC\u822A\u94FE\u63A5\u8FD4\u56DE\u6839\u76EE\u5F55\u3002 mediaFileView.viewFolder=Folder @@ -891,8 +854,6 @@ memberPermissions.subtitle=\u7BA1\u7406\u535A\u5BA2\u6210\u5458\u7684\u6743\u965 memberPermissions.description=\u4F60\u53EF\u4EE5\u4F7F\u7528\u4EE5\u4E0B\u8868\u683C\u4E2D\u7684\u63A7\u4EF6\u66F4\u6539\u535A\u5BA2\u6210\u5458\u7684\u6743\u9650\uFF0C\u6216\u8005\u5F7B\u5E95\u79FB\u9664\u5176\u6210\u5458\u8D44\u683C\u3002\u6CE8\u610F\uFF0C\u4F60\u4E0D\u80FD\u66F4\u6539\u6216\u8005\u79FB\u9664\u81EA\u5DF1\u3002 - - memberPermissions.userName=\u7528\u6237\u540D memberPermissions.administrator=\u7BA1\u7406\u5458 memberPermissions.author=\u4F5C\u8005 @@ -916,8 +877,6 @@ memberPermissions.permissionsHelpTitle=\u4EC0\u4E48\u662F\u6743\u9650\uFF1F memberPermissions.permissionHelp=\u7BA1\u7406\u5458\u6743\u9650\u5141\u8BB8\u7528\u6237\u53D1\u5E03\u6587\u7AE0\u3001\u7BA1\u7406\u535A\u5BA2\u53CA\u5176\u6210\u5458\u7528\u6237
\u4F5C\u8005\u6743\u9650\u5141\u8BB8\u7528\u6237\u53D1\u5E03\u6587\u7AE0\uFF0C\u4F46\u4E0D\u80FD\u7BA1\u7406\u535A\u5BA2
\u53D7\u9650\u6743\u9650\u53EA\u5141\u8BB8\u7528\u6237\u4FDD\u5B58\u6587\u7AE0\u8349\u7A3F - - # --------------------------------------------------------- New user registation newUser.addNewUser=\u65B0\u7528\u6237\u6CE8\u518C @@ -937,8 +896,6 @@ pagesForm.subtitle=\u7BA1\u7406\u535A\u5BA2\u7684\u9875\u9762\u6A21\u677F pagesForm.tip=\u4F60\u53EF\u4EE5\u7F16\u8F91\u6A21\u677F\u6765\u5B9A\u4E49\u535A\u5BA2\u9875\u9762\u7684\u5E03\u5C40\u3001\u8272\u5F69\u548C\u5B57\u4F53\u3002\u4F60\u4E5F\u53EF\u4EE5\u65B0\u5EFA\u6A21\u677F\u6765\u5B9A\u4E49\u65B0\u7684\u9875\u9762\u3002\u6B64\u529F\u80FD\u662F\u9488\u5BF9\u9AD8\u7EA7\u7528\u6237\u7684\uFF0C\u5982\u679C\u4F60\u4E0D\u719F\u6089HTML\uFF0C\u5219\u65E0\u987B\u5173\u6CE8\u8FD9\u4E9B\u5185\u5BB9\u3002\u7F16\u8F91\u6A21\u677F\u524D\u8BF7\u6CE8\u610F\u5907\u4EFD\uFF01 - - pageForm.advancedSettings=\u9AD8\u7EA7\u8BBE\u7F6E pagesForm.action=\u64CD\u4F5C pagesForm.remove=\u79FB\u9664 @@ -962,14 +919,6 @@ pageForm.subtitle=\u7F16\u8F91\u6A21\u677F {0} (\u6240\u5C5E\u535A\ pageForm.tip=\u4F60\u53EF\u4EE5\u7F16\u8F91\u6B64\u6A21\u677F\u4EE5\u6539\u53D8\u5176\u751F\u6210\u7684\u9875\u9762\u5916\u89C2\u3002\u76F8\u5173\u7684\u6307\u4EE4\u4EE3\u7801\u8BF7\u53C2\u770B\u6A21\u677F\u7F16\u8F91\u6307\u5357\u3002\u6B64\u529F\u80FD\u662F\u9488\u5BF9\u9AD8\u7EA7\u7528\u6237\u7684\uFF0C\u5982\u679C\u4F60\u4E0D\u719F\u6089HTML\uFF0C\u5219\u65E0\u987B\u5173\u6CE8\u8FD9\u4E9B\u5185\u5BB9\u3002 - - - - - - - - pageForm.link=\u94FE\u63A5 pageForm.resultingUrlWillBe=\u7ED3\u679CURL\u5C06\u4E3A: pageForm.noUrl=\u6CA1\u6709\u94FE\u63A5\uFF01\u5C06\u65E0\u6CD5\u901A\u8FC7\u7F51\u7EDC\u8BBF\u95EE\u8FD9\u4E2A\u65B0\u9875\u9762 @@ -997,73 +946,6 @@ Template.error.linkSize=\u94FE\u63A5\u4E0D\u80FD\u8D85\u8FC7255\u4E2A\u5B57\u7B2 Template.error.descriptionSize=\u63CF\u8FF0\u4E0D\u80FD\u8D85\u8FC7255\u4E2A\u5B57\u7B26 Template.error.actionNull=\u529F\u80FD\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A -# ---------------------------------------------------- Ping Target Admin/Editing - - - -commonPingTargets.subtitle=\u4E3A\u6240\u6709\u535A\u5BA2\u7BA1\u7406\u901A\u7528\u5185\u5BB9\u63A8\u9001\u76EE\u6807\u3002 -commonPingTargets.commonPingTargets=\u901A\u7528\u5185\u5BB9\u63A8\u9001\u76EE\u6807 -commonPingTargets.explanation=\u8FD9\u4E9B\u76EE\u6807\u7AD9\u70B9\u5BF9\u6240\u6709\u535A\u5BA2\u7684\u5185\u5BB9\u66F4\u65B0\u9002\u7528\u3002 - -commonPingTargets.error.loading=\u8F7D\u5165\u901A\u7528\u63A8\u9001\u76EE\u6807\u65F6\u51FA\u9519 -commonPingTargets.error.saving=\u4FDD\u5B58\u901A\u7528\u63A8\u9001\u76EE\u6807\u65F6\u51FA\u9519 -commonPingTargets.error.enabling=\u542F\u7528\u63A8\u9001\u76EE\u6807\u65F6\u51FA\u9519 -commonPingTargets.error.disabling=\u7981\u7528\u63A8\u9001\u76EE\u6807\u65F6\u51FA\u9519 - -pings.title=\u914D\u7F6E\u81EA\u52A8\u535A\u5BA2\u63A8\u9001 -pings.subtitle=\u4E3A\u535A\u5BA2\u914D\u7F6E\u81EA\u52A8\u5185\u5BB9\u63A8\u9001 {0} -pings.explanation=\u63A8\u9001(Pings)\u5141\u8BB8\u4F60\u7684\u535A\u5BA2\u5728\u66F4\u65B0\u65F6\u901A\u77E5\u76EE\u6807\u7AD9\u70B9\u4EE5\u4FBF\u5BF9\u65B9\u8BFB\u53D6\u66F4\u65B0\u7684\u5185\u5BB9\u3002\u4F60\u53EF\u4EE5\u4E3A\u60F3\u8981\u901A\u77E5\u7684\u7AD9\u70B9\u542F\u7528\u535A\u5BA2\u66F4\u65B0\u7684\u81EA\u52A8\u63A8\u9001\u3002\u4F60\u4E5F\u53EF\u4EE5\u624B\u52A8\u5411\u6307\u5B9A\u7684\u7AD9\u70B9\u53D1\u51FA\u63A8\u9001\u901A\u77E5\u3002\u6CE8\u610F\uFF1A\u4F60\u901A\u5E38\u9700\u8981\u5728\u76EE\u6807\u7AD9\u70B9\u767B\u8BB0\u4F60\u7684\u535A\u5BA2\u624D\u80FD\u5411\u5176\u63A8\u9001\u5185\u5BB9\u3002 - - - - - - -pings.commonPingTargets=\u901A\u7528\u63A8\u9001\u76EE\u6807 -pings.commonPingTargetsExplanation=\u8FD9\u4E9B\u63A8\u9001\u76EE\u6807\u662F\u7531\u7CFB\u7EDF\u7BA1\u7406\u5458\u9884\u5148\u914D\u7F6E\u4F9B\u6240\u6709\u7528\u6237\u4F7F\u7528\u7684\u3002\u4F60\u53EF\u4EE5\u4EFB\u610F\u5411\u8FD9\u4E9B\u77E5\u540D\u7AD9\u70B9\u63A8\u9001\u5185\u5BB9\u3002 - - - -ping.successful=\u63A8\u9001\u6210\u529F\uFF01 -ping.transmittedButError=\u63A8\u9001\u901A\u77E5\u5DF2\u53D1\u51FA\uFF0C\u4F46\u5BF9\u65B9\u670D\u52A1\u5668\u8FD4\u56DE\u4E86\u4EE5\u4E0B\u9519\u8BEF\u4FE1\u606F\u3002 - -ping.transmissionFailed=\u63A8\u9001\u5931\u8D25\u3002\u8BF7\u68C0\u67E5\u63A8\u9001\u76EE\u6807URL\u662F\u5426\u6B63\u786E\u3002 - -ping.unknownHost=\u63A8\u9001\u76EE\u6807URL\u7684\u4E3B\u673A\u540D\u672A\u77E5\u3002 -ping.networkConnectionFailed=\u901A\u5411\u63A8\u9001\u76EE\u6807\u7AD9\u70B9\u7684\u7F51\u7EDC\u8FDE\u63A5\u51FA\u73B0\u95EE\u9898\u3002 - -ping.pingProcessingIsSuspended=\u63A8\u9001\u5904\u7406\u88AB\u7CFB\u7EDF\u7BA1\u7406\u5458\u4E34\u65F6\u4E2D\u6B62\u3002 -pingResult.OK=\u6210\u529F - -pingTarget.addTarget=\u6DFB\u52A0\u63A8\u9001\u76EE\u6807 -pingTarget.editTarget=\u7F16\u8F91\u63A8\u9001\u76EE\u6807 - -pingTargetEdit.subtitle=\u7F16\u8F91\u63A8\u9001\u76EE\u6807 -pingTargetAdd.subtitle=\u6DFB\u52A0\u63A8\u9001\u76EE\u6807 - -pingTarget.pingUrl=\u63A8\u9001URL -pingTarget.autoEnabled=\u81EA\u52A8\u63A8\u9001\uFF1F -pingTarget.remove=\u79FB\u9664 -pingTarget.confirmRemoveTitle=\u786E\u8BA4\u79FB\u9664\u63A8\u9001\u76EE\u6807 -pingTarget.confirmCommonRemove=\u79FB\u9664\u6B64\u76EE\u6807\u5C06\u540C\u65F6\u64A4\u9500\u6240\u6709\u7528\u6237\u5BF9\u6B64\u76EE\u6807\u7684\u81EA\u52A8\u63A8\u9001\u914D\u7F6E\u3002\u4F60\u786E\u5B9A\u5417\uFF1F - -pingTarget.enable=\u542F\u7528 -pingTarget.enabled=\u5F00\u542F -pingTarget.disable=\u7981\u7528 -pingTarget.disabled=\u5173\u95ED -pingTarget.auto=\u81EA\u52A8 -pingTarget.manual=\u624B\u52A8 -pingTarget.sendPingNow=\u7ACB\u5373\u63A8\u9001 -pingTarget.updated=\u63A8\u9001\u76EE\u6807 "{0}" \u5DF2\u66F4\u65B0 -pingTarget.created=\u63A8\u9001\u76EE\u6807 "{0}" \u5DF2\u521B\u5EFA -pingTarget.deleted=\u63A8\u9001\u76EE\u6807 "{0}" \u5DF2\u5220\u9664 - -pingTarget.nameNotUnique=\u8FD9\u4E2A\u63A8\u9001\u76EE\u6807\u7684\u540D\u5B57\u4E0E\u5176\u4ED6\u76EE\u6807\u7684\u540D\u5B57\u5B58\u5728\u51B2\u7A81\u3002 -pingTarget.nameMissing=\u8981\u6C42\u8F93\u5165\u540D\u5B57 -pingTarget.pingUrlMissing=\u8981\u6C42\u8F93\u5165\u63A8\u9001URL -pingTarget.malformedUrl=\u63A8\u9001URL\u7684\u683C\u5F0F\u4E0D\u6B63\u786E\u3002 -pingTarget.unknownHost=\u63A8\u9001URL\u6307\u5B9A\u7684\u4E3B\u673A\u4E0D\u5B58\u5728\u3002 -pingTarget.notFound=\u672A\u627E\u5230\u63A8\u9001\u76EE\u6807ID {0} # --------------------------------------------------------------- Planet Roller: config @@ -1238,7 +1120,6 @@ tabbedmenu.website.themes=\u4E3B\u9898 tabbedmenu.website.pages=\u6A21\u677F tabbedmenu.website.members=\u6210\u5458 tabbedmenu.website.maintenance=\u7EF4\u62A4 -tabbedmenu.weblog.pingSetup=\u63A8\u9001(Ping) tabbedmenu.weblog.mediaFiles=\u5A92\u4F53\u6587\u4EF6 @@ -1246,7 +1127,6 @@ tabbedmenu.admin=\u7CFB\u7EDF\u7BA1\u7406 tabbedmenu.admin.config=\u7BA1\u7406\u914D\u7F6E tabbedmenu.admin.userAdmin=\u7528\u6237\u7BA1\u7406 tabbedmenu.admin.commentManagement=\u8BC4\u8BBA\u7BA1\u7406 -tabbedmenu.admin.pingTargets=\u63A8\u9001\u76EE\u6807 tabbedmenu.admin.cacheInfo=\u7F13\u5B58\u4FE1\u606F tabbedmenu.planet=\u793E\u533A\u7BA1\u7406 @@ -1270,12 +1150,10 @@ themeEditor.sharedTheme=\u5171\u4EAB\u4E3B\u9898 themeEditor.sharedThemeDescription=\u4F7F\u7528\u9884\u5B9A\u4E49\u7684\u5171\u4EAB\u4E3B\u9898\uFF0C\u6B64\u9009\u9879\u9002\u5408\u4E0D\u60F3\u989D\u5916\u8D39\u5FC3\u8BBE\u8BA1\u535A\u5BA2\u5916\u89C2\u7684\u7528\u6237\u3002 - themeEditor.customTheme=\u81EA\u5B9A\u4E49\u4E3B\u9898 themeEditor.customThemeDescription=\u6B64\u9009\u9879\u9488\u5BF9\u60F3\u8981\u81EA\u5DF2\u8BBE\u8BA1\u535A\u5BA2\u5916\u89C2\u7684\u7528\u6237\u3002\u6CE8\u610F\uFF1A\u81EA\u5B9A\u4E49\u4E3B\u9898\u9700\u8981\u989D\u5916\u82B1\u8D39\u4E00\u4E9B\u5FC3\u529B\u3002 - themeEditor.yourCurrentTheme=\u4F60\u5F53\u524D\u4F7F\u7528\u7684\u4E3B\u9898\u662F themeEditor.yourCustomStylesheet=\u4F7F\u7528\u81EA\u5B9A\u4E49\u6837\u5F0F\u8868\u3002 themeEditor.yourThemeStyleSheet=\u4F7F\u7528\u9ED8\u8BA4\u7684\u5171\u4EAB\u4E3B\u9898\u6837\u5F0F\u8868\u3002 @@ -1350,7 +1228,6 @@ userAdmin.subtitle.searchUser=\u9009\u62E9\u8981\u7BA1\u7406\u7684\u7528\u6237 userAdmin.prompt.searchUser=\u901A\u8FC7\u952E\u5165\u7528\u6237\u540D\u7B2C\u4E00\u4E2A\u5B57\u6BCD\u67E5\u627E\u7528\u6237\u3002\u9009\u5B9A\u7528\u6237\u540E\u70B9\u51FB\u7F16\u8F91\u6309\u94AE\u4EE5\u7F16\u8F91\u7528\u6237\u4FE1\u606F\u548C\u7528\u6237\u7684\u535A\u5BA2\u3002 - userAdmin.title.editUser=\u7F16\u8F91\u7528\u6237\u4FE1\u606F userAdmin.subtitle.editUser=\u7F16\u8F91\u7528\u6237\u4FE1\u606F\u548C\u6743\u9650 {0} @@ -1398,11 +1275,9 @@ userAdmin.error.userNotFound=\u627E\u4E0D\u5230\u6307\u5B9A\u7528\u6237 userRegister.prompt=\u6B22\u8FCE\uFF01Roller\u9080\u8BF7\u4F60\u521B\u5EFA\u4E00\u4E2A\u7528\u6237\u8D26\u53F7\u3002\u8BF7\u4F7F\u7528\u6B64\u8868\u5355\u6CE8\u518C\u7528\u6237\u8D26\u53F7\u3002\u4EE5\u4E0B\u5185\u5BB9\u5747\u4E3A\u5FC5\u586B\u9879\u3002 - Register.disabled=\u7CFB\u7EDF\u7BA1\u7406\u5458\u76EE\u524D\u505C\u7528\u4E86\u7528\u6237\u6CE8\u518C\u3002 - userRegister.heading.identification=\u4F60\u8981\u4F7F\u7528\u7684\u7528\u6237\u540D\uFF1F userRegister.tip.identification=\u8BF7\u8F93\u5165\u4F60\u8981\u4F7F\u7528\u7684\u7528\u6237\u540D\u548C\u7535\u5B50\u90AE\u7BB1\u4EE5\u6FC0\u6D3B\u4F60\u7684\u8D26\u53F7\u3002 @@ -1410,8 +1285,6 @@ userRegister.tip.identification=\u8BF7\u8F93\u5165\u4F60\u8981\u4F7F\u7528\u7684 userRegister.tip.userName=\u4F5C\u4E3A\u7528\u6237\u8D26\u53F7\u7684\u7B80\u77ED\u540D\u5B57\u3002\u8BF7\u4F7F\u7528\u6807\u51C6ASCII\u5B57\u7B26(a-z\uFF0CA-Z\uFF0C0-9)\u5E76\u4E14\u4E0D\u8981\u4F7F\u7528HTML\u3002\u7528\u6237\u540D\u4E0D\u80FD\u4FEE\u6539\uFF0C\u5E76\u4E14\u53EF\u4EE5\u9009\u62E9\u4E0D\u516C\u5F00\u663E\u793A\u3002 - - userRegister.tip.screenName=\u4F60\u8981\u4F7F\u7528\u7684\u6635\u79F0(\u4E0D\u53EF\u4F7F\u7528HTML)\u3002\u6635\u79F0\u5C06\u5728\u4F60\u7684\u535A\u5BA2\u4E3B\u9875\u548C\u6587\u7AE0\u9875\u9762\u4E2D\u663E\u793A\u3002 @@ -1429,11 +1302,9 @@ userRegister.tip.openid.disabled=\u8BF7\u8F93\u5165\u4F60\u8981\u4F7F\u7528\u768 userRegister.tip.openid.hybrid=\u4F60\u53EF\u4EE5\u9009\u62E9\u4F7F\u7528\u672C\u7AD9\u8D26\u53F7\u6216OpenID\u767B\u5F55\u3002\u6709\u5173OpenID\u7684\u8BE6\u60C5\u53EF\u53C2\u770Bhttp://openid.net\u3002 - userRegister.tip.openid.only=\u672C\u7AD9\u53EA\u5141\u8BB8\u4F7F\u7528OpenID\u767B\u5F55\uFF0C\u8BF7\u6307\u5B9A\u4F60\u7684OpenID\u6807\u8BC6\u3002\u6709\u5173OpenID\u7684\u8BE6\u60C5\u53EF\u53C2\u770Bhttp://openid.net\u3002 - userRegister.tip.password=\u4F60\u7684\u5BC6\u7801\u3002 userSettings.tip.password=\u4F60\u7684\u5BC6\u7801\u3002 \u4EC5\u5728\u60F3\u8981\u4FEE\u6539\u5BC6\u7801\u65F6\u624D\u9700\u586B\u5199\u3002 userRegister.tip.passwordConfirm=\u786E\u8BA4\u4F60\u7684\u5BC6\u7801\u3002 @@ -1444,7 +1315,6 @@ userRegister.heading.locale=\u4F60\u8981\u9009\u62E9\u7684\u533A\u57DF\u8BED\u8A userRegister.tip.localeAndTimeZone=\u6211\u4EEC\u5C1D\u8BD5\u4E3A\u4F60\u9884\u8BBE\u4E86\u533A\u57DF\u8BED\u8A00\u548C\u65F6\u533A\u8BBE\u7F6E\u3002\u4F60\u4E5F\u53EF\u4EE5\u53E6\u884C\u4FEE\u6539\uFF0C\u8FD9\u4E9B\u8BBE\u7F6E\u5C06\u5E94\u7528\u4E8E\u4F60\u7684\u535A\u5BA2\u6587\u7AE0\u3002 - userRegister.tip.timeZone=\u4F60\u6240\u5728\u7684\u65F6\u533A\u3002 userRegister.tip.locale=\u4F60\u9009\u7528\u7684\u533A\u57DF\u8BED\u8A00\u3002 @@ -1487,10 +1357,6 @@ weblogEntry.pendingEntrySubject=Roller\uFF1A\u5BA1\u6838\u5F85\u53D1\u5E03\u7684 weblogEntry.pendingEntryContent=\u7528\u6237[{0}]\u6240\u63D0\u4EA4\u7684\u6587\u7AE0\u6B63\u7B49\u5F85\u4F60\u7684\u5BA1\u6838\u3002\u8BF7\u9009\u62E9\u53D1\u5E03\u6216\u662F\u4FDD\u5B58\u4E3A\u8349\u7A3F\u4F9B\u7528\u6237[{1}]\u7EE7\u7EED\u4FEE\u6539\u3002\u94FE\u63A5\u5230\u5F85\u53D1\u5E03\u6587\u7AE0\u7F16\u8F91\u9875\uFF1A<{2}> - - - - weblogEntry.notFound=\u627E\u4E0D\u5230\u6307\u5B9A\u7684\u535A\u5BA2\u6587\u7AE0 weblogEdit.summary=\u6458\u8981\uFF08\u53EF\u9009\uFF09 @@ -1607,7 +1473,6 @@ weblogEntryQuery.subtitle=\u5728\u535A\u5BA2{0}\u4E2D\u67E5\u627E\u weblogEntryQuery.tip=\u4F60\u53EF\u4EE5\u5728\u4E0B\u9762\u7684\u5217\u8868\u4E2D\u9009\u62E9\u6587\u7AE0\u8FDB\u884C\u7F16\u8F91\uFF0C\u6216\u8005\u4F7F\u7528\u7B5B\u9009\u63A7\u4EF6\u6765\u67E5\u627E\u7279\u5B9A\u5206\u7C7B\u3001\u65E5\u671F\u6216\u72B6\u6001\u7684\u6587\u7AE0\u3002 - weblogEntryQuery.sidebarTitle=\u6587\u7AE0\u7B5B\u9009 weblogEntryQuery.sidebarDescription=\u6309\u5206\u7C7B\u3001\u65E5\u671F\u548C\u72B6\u6001\u6765\u7B5B\u9009\u535A\u5BA2\u6587\u7AE0\u3002 @@ -1722,8 +1587,6 @@ websiteSettings.removeWebsite=\u4F60\u662F\u6B64\u535A\u5BA2\u7684\u6700\u540E\u websiteSettings.removeWebsiteWarning=\u8B66\u544A\uFF1A\u79FB\u9664\u535A\u5BA2\u5C06\u4F1A\u5220\u6389\u5176\u4E2D\u7684\u6240\u6709\u6587\u7AE0\u3001
\u8BC4\u8BBA\u3001\u6536\u85CF\u548C\u8BBE\u7F6E\u4FE1\u606F\u3002\u79FB\u9664\u535A\u5BA2\u64CD\u4F5C\u662F\u4E0D\u53EF\u6062\u590D\u7684\u3002. - - websiteRemove.title=\u786E\u8BA4\u535A\u5BA2\u79FB\u9664 websiteRemove.subtitle=\u79FB\u9664\u535A\u5BA2\u64CD\u4F5C\u662F\u4E0D\u53EF\u6062\u590D\u7684 websiteRemove.youSure=\u4F60\u786E\u5B9A\u8981\u5220\u9664\u535A\u5BA2[{0}]\u5417\uFF1F @@ -1793,7 +1656,6 @@ yourWebsites.planetAdmin=\u793E\u533A\u7BA1\u7406 yourWebsites.planetAdmin.desc=\u7BA1\u7406\u793E\u533A\u5185\u5BB9\u805A\u5408\u3002\u6DFB\u52A0\u65B0\u95FB\u6E90\uFF0C\u7BA1\u7406\u7FA4\u7EC4\u548C\u8BBE\u7F6E\u53C2\u6570\u3002 - yourWebsites.invitations=\u535A\u5BA2\u9080\u8BF7 yourWebsites.invitationsPrompt=\u4F60\u6709\u535A\u5BA2\u9080\u8BF7\u7B49\u5F85\u63A5\u53D7\u6216\u62D2\u7EDD: @@ -1814,6 +1676,5 @@ error.activate.user.missingActivationCode=\u6FC0\u6D3B\u7801\u4E22\u5931\u3002 error.activate.user.invalidActivationCode=\u6FC0\u6D3B\u7801\u65E0\u6548\u3002\u4F60\u5E94\u8BE5\u5DF2\u7ECF\u6FC0\u6D3B\u8FC7\u4F60\u7684\u8D26\u53F7\u4E86\u3002\u5982\u679C\u5C1A\u672A\u6FC0\u6D3B\u8D26\u53F7\uFF0C\u8BF7\u5411Roller\u7CFB\u7EDF\u7BA1\u7406\u5458\u5BFB\u6C42\u5E2E\u52A9\u3002 - user.account.activation.mail.subject=Roller\uFF1A\u4F60\u7684\u8D26\u53F7\u6FC0\u6D3B\u7801 user.account.activation.mail.content=

\u8981\u6FC0\u6D3B\u4F60\u7684Roller\u8D26\u6237[{1}]\uFF0C\u8BF7\u70B9\u51FB\u4EE5\u4E0B\u94FE\u63A5\uFF1A

{2}

diff --git a/app/src/main/resources/META-INF/persistence.xml b/app/src/main/resources/META-INF/persistence.xml index 2af30b8c56..b4f17e728c 100644 --- a/app/src/main/resources/META-INF/persistence.xml +++ b/app/src/main/resources/META-INF/persistence.xml @@ -33,8 +33,6 @@ org/apache/roller/weblogger/pojos/WeblogEntryAttribute.orm.xml org/apache/roller/weblogger/pojos/WeblogBookmarkFolder.orm.xml org/apache/roller/weblogger/pojos/WeblogHitCount.orm.xml - org/apache/roller/weblogger/pojos/PingQueueEntry.orm.xml - org/apache/roller/weblogger/pojos/PingTarget.orm.xml org/apache/roller/weblogger/pojos/UserRole.orm.xml org/apache/roller/weblogger/pojos/RuntimeConfigProperty.orm.xml org/apache/roller/weblogger/pojos/TaskLock.orm.xml @@ -50,7 +48,6 @@ org/apache/roller/weblogger/pojos/MediaFile.orm.xml org/apache/roller/weblogger/pojos/MediaFileTag.orm.xml org/apache/roller/weblogger/pojos/MediaFileDirectory.orm.xml - org/apache/roller/weblogger/pojos/AutoPing.orm.xml org/apache/roller/weblogger/pojos/CustomTemplateRendition.orm.xml org/apache/roller/planet/pojos/Planet.orm.xml diff --git a/app/src/main/resources/org/apache/roller/weblogger/config/roller.properties b/app/src/main/resources/org/apache/roller/weblogger/config/roller.properties index 5a758a8791..0e157f05f2 100644 --- a/app/src/main/resources/org/apache/roller/weblogger/config/roller.properties +++ b/app/src/main/resources/org/apache/roller/weblogger/config/roller.properties @@ -52,7 +52,6 @@ # -- Cache configuration # -- User management and security settings # -- Rendering system -# -- Weblog ping system # -- Pluggable backend, page and editor plugins # -- Log4j2 logging settings # -- Other settings @@ -227,7 +226,7 @@ cache.dir=${user.home}/roller_data/planet-cache # The *enabled* tasks are defined by tasks.enabled=[,] # Tasks which are enabled. Only tasks listed here will be run. -tasks.enabled=ScheduledEntriesTask,ResetHitCountsTask,PingQueueTask +tasks.enabled=ScheduledEntriesTask,ResetHitCountsTask # client identifier. should be unique for each instance in a cluster. tasks.clientId=defaultClientId @@ -244,11 +243,6 @@ tasks.ResetHitCountsTask.startTime=startOfDay tasks.ResetHitCountsTask.interval=1440 tasks.ResetHitCountsTask.leaseTime=30 -# Ping processor, does sending of pings -tasks.PingQueueTask.class=org.apache.roller.weblogger.business.pings.PingQueueTask -tasks.PingQueueTask.startTime=immediate -tasks.PingQueueTask.interval=5 -tasks.PingQueueTask.leaseTime=30 # Sync Roller weblogs with planet tasks.SyncWebsitesTask.class=org.apache.roller.weblogger.planet.tasks.SyncWebsitesTask @@ -509,59 +503,6 @@ org.apache.roller.weblogger.ui.rendering.model.PlanetModel # Velocity settings velocity.properties=/WEB-INF/velocity.properties -#----------------------------------------------------------------------------- -# Weblog ping system -#----------------------------------------------------------------------------- - -# The number of attempts to try to reach a ping target before refusing to -# requeue it for further retrials. If absent, this defaults to 3. -pings.maxPingAttempts=3 - -# The interval between ping queue processing runs in minutes. Must be between -# 0 and 120. If set to 0, ping queue processing is disabled on this server; -# this is for clustered environments. Make sure it is nonzero on one host in -# a cluster. Don't use the value 0 here to disable ping functionality, you -# will instead get an infinitely growing ping queue. See the documentation on -# the properties below to disable ping functionality if you need to. -# If absent, this defaults to 5. -pings.queueProcessingIntervalMins=5 - -# The set of initial common ping targets. This is used to initialize the -# database if there are no common ping targets at startup. Ping targets are -# specified as a comma-separated list, each target in the form {{name}{url}}. -# To disable initialization of common ping targets, comment this out, or set it -# to the empty value. Common targets can be edited in the UI; this is just -# used to set up some typical ones. -pings.initialCommonTargets=\ -{{Technorati}{http://rpc.technorati.com/rpc/ping}}\ -,{{Weblogs.com}{http://rpc.weblogs.com/RPC2}}\ -,{{blo.gs}{http://ping.blo.gs/}}\ -,{{IceRocket}{http://rpc.icerocket.com:10080/}} - -# Specify variant options for known buggy ping targets. -pings.variantOptions={{http://rpc.icerocket.com:10080/}{noname}} - -# This controls whether the Weblog:Pings menu item and its associated actions -# are enabled. Set this to false to disallow users from configuring autopings -# and doing manual pings. If absent, this defaults to true. -# NOTE: There is a separate runtime property (configurable from the -# Admin:Configuration page, that can be used to suspend ping processing without -# disabling the UI. -# CAUTION: Setting this to true will cause the server to remove all users' -# existing autoping configurations on startup. Leave this false or commented -# for normal behavior. -pings.disablePingUsage=false - -# Setting both pings.disallowCustomTarget=true and pings.disablePingUsage=true -# will effectively disable the ping functionality. - -# This is used for debugging the ping mechanism in Roller. If this is set -# to true, pings that would normally be sent will cause log messages to be sent -# but will NOT actually result in real pings being sent. Leave this false or -# commented for normal behavior. -pings.logOnly=false - - #----------------------------------------------------------------------------- # Pluggable backend, page and editor plugins #----------------------------------------------------------------------------- diff --git a/app/src/main/resources/org/apache/roller/weblogger/config/runtimeConfigDefs.xml b/app/src/main/resources/org/apache/roller/weblogger/config/runtimeConfigDefs.xml index 5ac86d35af..bbfed7cadf 100644 --- a/app/src/main/resources/org/apache/roller/weblogger/config/runtimeConfigDefs.xml +++ b/app/src/main/resources/org/apache/roller/weblogger/config/runtimeConfigDefs.xml @@ -78,10 +78,6 @@ string - - boolean - false - diff --git a/app/src/main/resources/org/apache/roller/weblogger/pojos/AutoPing.orm.xml b/app/src/main/resources/org/apache/roller/weblogger/pojos/AutoPing.orm.xml deleted file mode 100644 index 8cc088c6a9..0000000000 --- a/app/src/main/resources/org/apache/roller/weblogger/pojos/AutoPing.orm.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - org.apache.roller.weblogger.pojos - - - - SELECT a FROM AutoPing a - - - SELECT a FROM AutoPing a WHERE a.pingTarget = ?1 - - - SELECT a FROM AutoPing a WHERE a.website = ?1 - - - DELETE FROM AutoPing a WHERE a.pingTarget = ?1 - - - DELETE FROM AutoPing a WHERE a.pingTarget = ?1 AND a.website = ?2 - - - DELETE FROM AutoPing a - - - - - - - - - - - - - - diff --git a/app/src/main/resources/org/apache/roller/weblogger/pojos/PingQueueEntry.orm.xml b/app/src/main/resources/org/apache/roller/weblogger/pojos/PingQueueEntry.orm.xml deleted file mode 100644 index 764d534181..0000000000 --- a/app/src/main/resources/org/apache/roller/weblogger/pojos/PingQueueEntry.orm.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - org.apache.roller.weblogger.pojos - -
- - SELECT p FROM PingQueueEntry p ORDER BY p.entryTime - - - SELECT p FROM PingQueueEntry p WHERE p.pingTarget = ?1 AND p.website = ?2 - - - - SELECT p FROM PingQueueEntry p WHERE p.website = ?1 - - - DELETE FROM PingQueueEntry p WHERE p.pingTarget = ?1 - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/resources/org/apache/roller/weblogger/pojos/PingTarget.orm.xml b/app/src/main/resources/org/apache/roller/weblogger/pojos/PingTarget.orm.xml deleted file mode 100644 index 3ec2e42a78..0000000000 --- a/app/src/main/resources/org/apache/roller/weblogger/pojos/PingTarget.orm.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - org.apache.roller.weblogger.pojos - -
- - SELECT p FROM PingTarget p ORDER BY p.name - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/resources/org/apache/roller/weblogger/ui/struts2/admin/admin-menu.xml b/app/src/main/resources/org/apache/roller/weblogger/ui/struts2/admin/admin-menu.xml index cdf9cca237..7619f39a6c 100644 --- a/app/src/main/resources/org/apache/roller/weblogger/ui/struts2/admin/admin-menu.xml +++ b/app/src/main/resources/org/apache/roller/weblogger/ui/struts2/admin/admin-menu.xml @@ -41,9 +41,6 @@ See comments in editor-menu.xml for info about attributes. name="tabbedmenu.admin.commentManagement" /> - - execute,delete,query,update - - .PingTargets - - - - AUTOMATIC - - .PingTargetConfirm - commonPingTargets - delete,deleteConfirm,disable,enable,execute - - - commonPingTargetAdd - pingTarget.addTarget - .PingTargetEdit - commonPingTargets - execute - - - commonPingTargetEdit - pingTarget.editTarget - .PingTargetEdit - commonPingTargets - commonPingTargets - execute - @@ -647,20 +618,6 @@ execute,resign - - - - - AUTOMATIC - - .Pings - - pings - ${actionWeblog.handle} - - disable,enable,execute,pingNow - diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/PingTargets.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/PingTargets.jsp deleted file mode 100644 index 5f541d806a..0000000000 --- a/app/src/main/webapp/WEB-INF/jsps/admin/PingTargets.jsp +++ /dev/null @@ -1,301 +0,0 @@ -<%-- - 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. ---%> -<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %> - -

- -

- - -
- - <%-- Headings --%> - - - - - - - - - <%-- Listing of current common targets --%> - - - - - - - - - - - - - - - - - - - -
- -   - - -   - - - - - - - - - - -
" method="post" style="display: inline;"> - " /> - " /> - -
-
- ', - '', - '' - )"> - - - - ')"> - - -
- -
- - - - - - - -
- - -<%-- ================================================================================================ --%> - - - - -<%-- ================================================================================================ --%> - -<%-- add/edit link form: a modal --%> - - <%-- modal --%> - - -<%-- page reload mechanism --%> - - - - - - -<%-- ================================================================================================ --%> - - - diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/Pings.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/Pings.jsp deleted file mode 100644 index 3591df1151..0000000000 --- a/app/src/main/webapp/WEB-INF/jsps/editor/Pings.jsp +++ /dev/null @@ -1,100 +0,0 @@ -<%-- - 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. ---%> -<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %> - -

- - - -

-

- -

- -

- - - -<%-- Headings --%> - - - - - - - -<%-- Table of current common targets with actions --%> - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -   - - -   - - - - - - - - - - -
" method="post" style="display: inline;"> - " /> - " /> - " /> - -
-
- -
" method="post" style="display: inline;"> - " /> - " /> - " /> - -
-
- -
diff --git a/app/src/main/webapp/WEB-INF/tiles.xml b/app/src/main/webapp/WEB-INF/tiles.xml index 113d48ece6..8008a5b2d4 100644 --- a/app/src/main/webapp/WEB-INF/tiles.xml +++ b/app/src/main/webapp/WEB-INF/tiles.xml @@ -193,13 +193,7 @@ - - - - - - @@ -378,9 +372,6 @@ - - - diff --git a/app/src/test/java/org/apache/roller/weblogger/TestUtils.java b/app/src/test/java/org/apache/roller/weblogger/TestUtils.java index 6dc96796ad..1f24d0f4e6 100644 --- a/app/src/test/java/org/apache/roller/weblogger/TestUtils.java +++ b/app/src/test/java/org/apache/roller/weblogger/TestUtils.java @@ -39,14 +39,10 @@ import org.apache.roller.weblogger.business.WeblogEntryManager; import org.apache.roller.weblogger.business.WeblogManager; import org.apache.roller.weblogger.business.WebloggerFactory; -import org.apache.roller.weblogger.business.pings.AutoPingManager; -import org.apache.roller.weblogger.business.pings.PingTargetManager; import org.apache.roller.weblogger.business.startup.ClasspathDatabaseScriptProvider; import org.apache.roller.weblogger.business.startup.SQLScriptRunner; import org.apache.roller.weblogger.business.startup.WebloggerStartup; import org.apache.roller.weblogger.config.WebloggerConfig; -import org.apache.roller.weblogger.pojos.AutoPing; -import org.apache.roller.weblogger.pojos.PingTarget; import org.apache.roller.weblogger.pojos.User; import org.apache.roller.weblogger.pojos.Weblog; import org.apache.roller.weblogger.pojos.WeblogBookmarkFolder; @@ -485,94 +481,6 @@ public static void teardownComment(String id) throws Exception { WebloggerFactory.getWeblogger().flush(); } - /** - * Convenience method for creating a ping target. - */ - public static PingTarget setupPingTarget(String name, String url) - throws Exception { - - PingTarget testPing = new PingTarget(); - testPing.setName("testCommonPing"); - testPing.setPingUrl("http://localhost/testCommonPing"); - - // store ping - PingTargetManager pingMgr = WebloggerFactory.getWeblogger() - .getPingTargetManager(); - pingMgr.savePingTarget(testPing); - - // flush to db - WebloggerFactory.getWeblogger().flush(); - - // query for it - PingTarget ping = pingMgr.getPingTarget(testPing.getId()); - - if (ping == null) { - throw new WebloggerException("error setting up ping target"); - } - - return ping; - } - - /** - * Convenience method for removing a ping target. - */ - public static void teardownPingTarget(String id) throws Exception { - - // query for it - PingTargetManager pingMgr = WebloggerFactory.getWeblogger() - .getPingTargetManager(); - PingTarget ping = pingMgr.getPingTarget(id); - - // remove the ping - pingMgr.removePingTarget(ping); - - // flush to db - WebloggerFactory.getWeblogger().flush(); - } - - /** - * Convenience method for creating an auto ping. - */ - public static AutoPing setupAutoPing(PingTarget ping, Weblog weblog) - throws Exception { - - AutoPingManager mgr = WebloggerFactory.getWeblogger() - .getAutopingManager(); - - // store auto ping - AutoPing autoPing = new AutoPing(null, ping, getManagedWebsite(weblog)); - mgr.saveAutoPing(autoPing); - - // flush to db - WebloggerFactory.getWeblogger().flush(); - - // query for it - autoPing = mgr.getAutoPing(autoPing.getId()); - - if (autoPing == null) { - throw new WebloggerException("error setting up auto ping"); - } - - return autoPing; - } - - /** - * Convenience method for removing an auto ping. - */ - public static void teardownAutoPing(String id) throws Exception { - - // query for it - AutoPingManager mgr = WebloggerFactory.getWeblogger() - .getAutopingManager(); - AutoPing autoPing = mgr.getAutoPing(id); - - // remove the auto ping - mgr.removeAutoPing(autoPing); - - // flush to db - WebloggerFactory.getWeblogger().flush(); - } - /** * Convenience method for creating a hit count. */ diff --git a/app/src/test/java/org/apache/roller/weblogger/business/PingsTest.java b/app/src/test/java/org/apache/roller/weblogger/business/PingsTest.java deleted file mode 100644 index 72c4335790..0000000000 --- a/app/src/test/java/org/apache/roller/weblogger/business/PingsTest.java +++ /dev/null @@ -1,355 +0,0 @@ -/* -* 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. -*/ -/* - * PingsTest.java - * - * Created on April 9, 2006, 1:27 PM - */ - -package org.apache.roller.weblogger.business; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.roller.weblogger.TestUtils; -import org.apache.roller.weblogger.business.pings.AutoPingManager; -import org.apache.roller.weblogger.business.pings.PingTargetManager; -import org.apache.roller.weblogger.pojos.AutoPing; -import org.apache.roller.weblogger.pojos.PingTarget; -import org.apache.roller.weblogger.pojos.User; -import org.apache.roller.weblogger.pojos.Weblog; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; - -/** - * Test Pings related business operations. - */ -public class PingsTest { - - public static Log log = LogFactory.getLog(PingsTest.class); - - User testUser = null; - Weblog testWeblog = null; - PingTarget testCommonPing = null; - - - /** - * All tests in this suite require a user and a weblog. - */ - @BeforeEach - public void setUp() throws Exception { - - // setup weblogger - TestUtils.setupWeblogger(); - - try { - testUser = TestUtils.setupUser("wtTestUser"); - testWeblog = TestUtils.setupWeblog("wtTestWeblog", testUser); - TestUtils.endSession(true); - } catch (Exception ex) { - log.error(ex); - throw new Exception("Test setup failed", ex); - } - - testCommonPing = new PingTarget(); - testCommonPing.setName("testCommonPing"); - testCommonPing.setPingUrl("http://localhost/testCommonPing"); - } - - @AfterEach - public void tearDown() throws Exception { - - try { - TestUtils.teardownWeblog(testWeblog.getId()); - TestUtils.teardownUser(testUser.getUserName()); - TestUtils.endSession(true); - } catch (Exception ex) { - log.error(ex); - throw new Exception("Test teardown failed", ex); - } - - testCommonPing = null; - } - - - /** - * Test basic persistence operations ... Create, Update, Delete - */ - @Test - public void testPingTargetCRUD() throws Exception { - - PingTargetManager mgr = WebloggerFactory.getWeblogger().getPingTargetManager(); - PingTarget ping = null; - - // create common ping - mgr.savePingTarget(testCommonPing); - String commonId = testCommonPing.getId(); - TestUtils.endSession(true); - - // make sure common ping was stored - ping = null; - ping = mgr.getPingTarget(commonId); - assertNotNull(ping); - assertEquals(testCommonPing.getPingUrl(), ping.getPingUrl()); - - // update common ping - ping = null; - ping = mgr.getPingTarget(commonId); - ping.setName("testtestCommon"); - mgr.savePingTarget(ping); - TestUtils.endSession(true); - - // make sure common ping was updated - ping = null; - ping = mgr.getPingTarget(commonId); - assertNotNull(ping); - assertEquals("testtestCommon", ping.getName()); - - // delete common ping - ping = null; - ping = mgr.getPingTarget(commonId); - mgr.removePingTarget(ping); - TestUtils.endSession(true); - - // make sure common ping was deleted - ping = null; - ping = mgr.getPingTarget(commonId); - assertNull(ping); - } - - - /** - * Test lookup mechanisms ... id, all common for weblog - */ - @Test - public void testPingTargetLookups() throws Exception { - - PingTargetManager mgr = WebloggerFactory.getWeblogger().getPingTargetManager(); - PingTarget ping = null; - - // create common ping - mgr.savePingTarget(testCommonPing); - String commonId = testCommonPing.getId(); - TestUtils.endSession(true); - - // lookup by id - ping = null; - ping = mgr.getPingTarget(commonId); - assertNotNull(ping); - assertEquals(testCommonPing.getName(), ping.getName()); - - // lookup all common pings - List commonPings = mgr.getCommonPingTargets(); - assertNotNull(commonPings); - // correct answer is: 4 pings in config + 1 new one = 5 - assertEquals(5, commonPings.size()); - - // delete common ping - ping = null; - ping = mgr.getPingTarget(commonId); - mgr.removePingTarget(ping); - TestUtils.endSession(true); - } - - - /** - * Test basic persistence operations ... Create, Update, Delete - */ - @Test - public void testAutoPingCRUD() throws Exception { - - AutoPingManager mgr = WebloggerFactory.getWeblogger().getAutopingManager(); - PingTargetManager pingMgr = WebloggerFactory.getWeblogger().getPingTargetManager(); - AutoPing autoPing = null; - - // create ping target to use for tests - PingTarget pingTarget = TestUtils.setupPingTarget("fooPing", "http://foo/null"); - PingTarget pingTarget2 = TestUtils.setupPingTarget("blahPing", "http://blah/null"); - TestUtils.endSession(true); - - // create autoPing - autoPing = new AutoPing(null, pingTarget, testWeblog); - mgr.saveAutoPing(autoPing); - String id = autoPing.getId(); - TestUtils.endSession(true); - - // make sure autoPing was stored - autoPing = null; - autoPing = mgr.getAutoPing(id); - assertNotNull(autoPing); - assertEquals(pingTarget, autoPing.getPingTarget()); - - // update autoPing - autoPing.setPingTarget(pingMgr.getPingTarget(pingTarget2.getId())); - mgr.saveAutoPing(autoPing); - TestUtils.endSession(true); - - // make sure autoPing was updated - autoPing = null; - autoPing = mgr.getAutoPing(id); - assertNotNull(autoPing); - assertEquals(pingTarget2, autoPing.getPingTarget()); - - // delete autoPing - mgr.removeAutoPing(autoPing); - TestUtils.endSession(true); - - // make sure common autoPing was deleted - autoPing = null; - autoPing = mgr.getAutoPing(id); - assertNull(autoPing); - - // teardown test ping target - TestUtils.teardownPingTarget(pingTarget.getId()); - TestUtils.teardownPingTarget(pingTarget2.getId()); - TestUtils.endSession(true); - } - - - /** - * Test special ping target removal methods ... by weblog/target, collection, all - */ - @Test - public void testPingTargetRemovals() throws Exception { - - AutoPingManager mgr = WebloggerFactory.getWeblogger().getAutopingManager(); - PingTargetManager ptmgr = WebloggerFactory.getWeblogger().getPingTargetManager(); - AutoPing testAutoPing = null; - - // create ping target to use for tests - PingTarget pingTarget = TestUtils.setupPingTarget("fooPing", "http://foo/null"); - PingTarget pingTarget2 = TestUtils.setupPingTarget("blahPing", "http://blah/null"); - PingTarget pingTarget3 = TestUtils.setupPingTarget("gahPing", "http://gah/null"); - - try { - - // create auto pings for test - testWeblog = TestUtils.getManagedWebsite(testWeblog); - AutoPing autoPing = TestUtils.setupAutoPing(pingTarget, testWeblog); - AutoPing autoPing2 = TestUtils.setupAutoPing(pingTarget2, testWeblog); - AutoPing autoPing3 = TestUtils.setupAutoPing(pingTarget3, testWeblog); - TestUtils.endSession(true); - - // remove by weblog/target - testWeblog = TestUtils.getManagedWebsite(testWeblog); - pingTarget = ptmgr.getPingTarget(pingTarget.getId()); - mgr.removeAutoPing(pingTarget, testWeblog); - TestUtils.endSession(true); - - // make sure remove succeeded - testAutoPing = null; - testAutoPing = mgr.getAutoPing(autoPing.getId()); - assertNull(testAutoPing); - - // remove a collection - List autoPings = new ArrayList<>(); - autoPing2 = mgr.getAutoPing(autoPing2.getId()); //Get managed version of autoPing2 - autoPings.add(autoPing2); - autoPing3 = mgr.getAutoPing(autoPing3.getId()); //Get managed version of autoPing2 - autoPings.add(autoPing3); - mgr.removeAutoPings(autoPings); - TestUtils.endSession(true); - - // make sure delete was successful - testWeblog = TestUtils.getManagedWebsite(testWeblog); - autoPings = mgr.getAutoPingsByWebsite(testWeblog); - assertNotNull(autoPings); - assertEquals(0, autoPings.size()); - - // need to create more test pings - autoPing = TestUtils.setupAutoPing(pingTarget, testWeblog); - autoPing2 = TestUtils.setupAutoPing(pingTarget2, testWeblog); - autoPing3 = TestUtils.setupAutoPing(pingTarget3, testWeblog); - TestUtils.endSession(true); - - // remove all - mgr.removeAllAutoPings(); - TestUtils.endSession(true); - - // make sure remove succeeded - testWeblog = TestUtils.getManagedWebsite(testWeblog); - autoPings = mgr.getAutoPingsByWebsite(testWeblog); - assertNotNull(autoPings); - assertEquals(0, autoPings.size()); - - } finally { - // teardown test ping target - TestUtils.teardownPingTarget(pingTarget.getId()); - TestUtils.teardownPingTarget(pingTarget2.getId()); - TestUtils.endSession(true); - } - } - - - /** - * Test lookup mechanisms ... id, ping target, weblog - */ - @Test - public void testAutoPingLookups() throws Exception { - - AutoPingManager mgr = WebloggerFactory.getWeblogger().getAutopingManager(); - PingTargetManager ptmgr = WebloggerFactory.getWeblogger().getPingTargetManager(); - AutoPing autoPing = null; - - // create autoPing target to use for tests - PingTarget pingTarget = TestUtils.setupPingTarget("fooPing", "http://foo/null"); - TestUtils.endSession(true); - - // create autoPing - testWeblog = TestUtils.getManagedWebsite(testWeblog); - pingTarget = ptmgr.getPingTarget(pingTarget.getId()); - autoPing = new AutoPing(null, pingTarget, testWeblog); - mgr.saveAutoPing(autoPing); - String id = autoPing.getId(); - TestUtils.endSession(true); - - // lookup by id - autoPing = null; - autoPing = mgr.getAutoPing(id); - assertNotNull(autoPing); - assertEquals(pingTarget, autoPing.getPingTarget()); - - // lookup by ping target - pingTarget = ptmgr.getPingTarget(pingTarget.getId()); - List autoPings = mgr.getAutoPingsByTarget(pingTarget); - assertNotNull(autoPings); - assertEquals(1, autoPings.size()); - - // lookup by weblog - autoPings = null; - testWeblog = TestUtils.getManagedWebsite(testWeblog); - autoPings = mgr.getAutoPingsByWebsite(testWeblog); - assertNotNull(autoPing); - assertEquals(1, autoPings.size()); - - // delete autoPing - autoPing = mgr.getAutoPing(autoPing.getId()); - mgr.removeAutoPing(autoPing); - TestUtils.endSession(true); - - // teardown test ping target - TestUtils.teardownPingTarget(pingTarget.getId()); - TestUtils.endSession(true); - } - -} diff --git a/app/src/test/java/org/apache/roller/weblogger/business/pings/WeblogUpdatePingerTest.java b/app/src/test/java/org/apache/roller/weblogger/business/pings/WeblogUpdatePingerTest.java deleted file mode 100644 index 1f037e7865..0000000000 --- a/app/src/test/java/org/apache/roller/weblogger/business/pings/WeblogUpdatePingerTest.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * 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.pings; - -import com.sun.net.httpserver.HttpServer; -import org.apache.roller.weblogger.business.pings.WeblogUpdatePinger.PingResult; -import org.apache.xmlrpc.XmlRpcException; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.OutputStream; -import java.io.Serializable; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.Base64; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - -/** - * Tests for {@link WeblogUpdatePinger}, covering how it builds the - * {@code weblogUpdates.ping} request and reads the response. - * - *

The response reader extracts only the {@code flerror} and {@code message} - * fields the protocol defines, reads every scalar as text, ignores response - * content it does not use, and refuses document type declarations. - */ -public class WeblogUpdatePingerTest { - - /** Set true if {@link Probe} is ever reconstructed from bytes. */ - private static volatile boolean probeReconstructed; - - @BeforeEach - public void reset() { - probeReconstructed = false; - } - - /** A serializable object whose reconstruction from bytes is observable. */ - static final class Probe implements Serializable { - private static final long serialVersionUID = 1L; - - private void readObject(ObjectInputStream in) throws java.io.IOException, ClassNotFoundException { - in.defaultReadObject(); - probeReconstructed = true; - } - } - - private static byte[] serialize(Serializable object) throws Exception { - ByteArrayOutputStream bytes = new ByteArrayOutputStream(); - try (ObjectOutputStream out = new ObjectOutputStream(bytes)) { - out.writeObject(object); - } - return bytes.toByteArray(); - } - - @Test - public void readsFlerrorAndMessageFromNormalResponse() throws Exception { - String response = "" - + "" - + "flerror0" - + "messageThanks for the ping." - + ""; - - PingResult result = WeblogUpdatePinger.parseResponse(response.getBytes(StandardCharsets.UTF_8)); - assertFalse(result.isError()); - assertEquals("Thanks for the ping.", result.getMessage()); - } - - @Test - public void readsErrorFlagFromResponse() throws Exception { - String response = "" - + "" - + "flerror1" - + "messageUnknown blog." - + ""; - - PingResult result = WeblogUpdatePinger.parseResponse(response.getBytes(StandardCharsets.UTF_8)); - assertTrue(result.isError()); - assertEquals("Unknown blog.", result.getMessage()); - } - - @Test - public void faultResponseBecomesException() throws Exception { - String response = "" - + "" - + "faultCode4" - + "faultStringboom" - + ""; - - XmlRpcException thrown = assertThrows(XmlRpcException.class, - () -> WeblogUpdatePinger.parseResponse(response.getBytes(StandardCharsets.UTF_8))); - assertEquals(4, thrown.code); - assertEquals("boom", thrown.getMessage()); - } - - @Test - public void controlProbeIsReconstructedByAnObjectStream() throws Exception { - // Control: reading the probe through an ObjectInputStream reconstructs it. - byte[] serialized = serialize(new Probe()); - try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(serialized))) { - in.readObject(); - } - assertTrue(probeReconstructed); - } - - @Test - public void base64ResponseMemberIsReadAsTextOnly() throws Exception { - // A base64 member is read as text; the reader does not turn it into an object. - String embedded = Base64.getEncoder().encodeToString(serialize(new Probe())); - String response = "" - + "" - + "faultCode4" - + "faultStringboom" - + "payload" + embedded + "" - + ""; - - assertThrows(XmlRpcException.class, - () -> WeblogUpdatePinger.parseResponse(response.getBytes(StandardCharsets.UTF_8))); - assertFalse(probeReconstructed, "a base64 response member must be read as text, not reconstructed"); - } - - @Test - public void doctypeInResponseIsRefused() { - // A response that declares a DTD is refused, and nothing it names is resolved. - String response = "" - + "]>" - + "" - + "flerror0" - + "message&x;" - + ""; - - PingResult result = parse(response); - assertFalse(result.isError()); - } - - @Test - public void buildsWellFormedEscapedRequest() { - String request = WeblogUpdatePinger.buildRequest(Arrays.asList("A & B ", "http://example.test/")); - assertTrue(request.contains("weblogUpdates.ping")); - assertTrue(request.contains("A & B <blog>"), "parameters must be XML-escaped"); - assertTrue(request.contains("http://example.test/")); - assertFalse(request.contains(""), "raw markup must not leak into the request"); - } - - @Test - public void nonSuccessHttpStatusThrows() throws Exception { - // A non-2xx response is a transport failure, not a successful ping. - HttpServer server = startServer(500, "error"); - try { - String url = "http://127.0.0.1:" + server.getAddress().getPort() + "/"; - assertThrows(IOException.class, () -> WeblogUpdatePinger.exchange(url, "")); - } finally { - server.stop(0); - } - } - - @Test - public void successHttpStatusReturnsBody() throws Exception { - String body = "" - + "ok"; - HttpServer server = startServer(200, body); - try { - String url = "http://127.0.0.1:" + server.getAddress().getPort() + "/"; - byte[] bytes = WeblogUpdatePinger.exchange(url, ""); - assertEquals(body, new String(bytes, StandardCharsets.UTF_8)); - } finally { - server.stop(0); - } - } - - @Test - public void nonHttpTargetThrowsIoException() { - // A file:/ftp: target must not escape as a ClassCastException. - assertThrows(IOException.class, - () -> WeblogUpdatePinger.exchange("file:///no/such/file", "")); - } - - private static HttpServer startServer(int status, String body) throws IOException { - HttpServer server = HttpServer.create(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0), 0); - server.createContext("/", exchange -> { - exchange.getRequestBody().readAllBytes(); - byte[] out = body.getBytes(StandardCharsets.UTF_8); - exchange.sendResponseHeaders(status, out.length); - try (OutputStream os = exchange.getResponseBody()) { - os.write(out); - } - }); - server.start(); - return server; - } - - private static PingResult parse(String response) { - try { - return WeblogUpdatePinger.parseResponse(response.getBytes(StandardCharsets.UTF_8)); - } catch (Exception ex) { - throw new AssertionError("parsing should not throw for this response", ex); - } - } -} diff --git a/app/src/test/java/org/apache/roller/weblogger/business/startup/DatabaseInstallerUpgradeTest.java b/app/src/test/java/org/apache/roller/weblogger/business/startup/DatabaseInstallerUpgradeTest.java index 31ef278a6d..febe896082 100644 --- a/app/src/test/java/org/apache/roller/weblogger/business/startup/DatabaseInstallerUpgradeTest.java +++ b/app/src/test/java/org/apache/roller/weblogger/business/startup/DatabaseInstallerUpgradeTest.java @@ -20,6 +20,7 @@ import java.sql.*; import java.util.Properties; +import java.util.UUID; import org.apache.roller.weblogger.business.DatabaseProvider; import org.junit.jupiter.api.Test; import static org.mockito.Mockito.*; @@ -28,24 +29,105 @@ class DatabaseInstallerUpgradeTest { @Test - void patchReleaseWithoutDatabaseChangesDoesNotRequireUpgrade() throws Exception { + void upgradeFrom610RemovesObsoleteTablesAndSettings() throws Exception { + assertUpgradeRemovesObsoleteTablesAndSettings(610); + } + + @Test + void upgradeFrom615RemovesObsoleteTablesAndSettings() throws Exception { + assertUpgradeRemovesObsoleteTablesAndSettings(615); + } + + @Test + void upgradeFrom617RemovesObsoleteTablesAndSettings() throws Exception { + assertUpgradeRemovesObsoleteTablesAndSettings(617); + } + + private void assertUpgradeRemovesObsoleteTablesAndSettings(int oldVersion) throws Exception { + String url = "jdbc:derby:memory:upgrade" + UUID.randomUUID() + ";create=true"; DatabaseProvider db = mock(DatabaseProvider.class); - Connection con = mock(Connection.class); - Statement query = mock(Statement.class); - ResultSet rows = mock(ResultSet.class); - when(db.getConnection()).thenReturn(con); - when(con.createStatement()).thenReturn(query); - when(query.executeQuery(anyString())).thenReturn(rows); - when(rows.next()).thenReturn(true); - when(rows.getString(1)).thenReturn("615"); + when(db.getConnection()).thenAnswer(invocation -> DriverManager.getConnection(url)); + DatabaseScriptProvider scripts = path -> getClass().getResourceAsStream("/dbscripts/" + path); + + try (Connection con = DriverManager.getConnection(url); Statement stmt = con.createStatement()) { + stmt.executeUpdate("create table weblog (id varchar(48) primary key)"); + stmt.executeUpdate("create table pingtarget (id varchar(48) primary key)"); + stmt.executeUpdate("create table autoping (id varchar(48) primary key, " + + "websiteid varchar(48) references weblog(id), " + + "pingtargetid varchar(48) references pingtarget(id))"); + stmt.executeUpdate("create table pingqueueentry (id varchar(48) primary key)"); + stmt.executeUpdate("create table roller_properties (name varchar(255) primary key, value varchar(255))"); + stmt.executeUpdate("create table roller_tasklock (id varchar(48) primary key, name varchar(255))"); + stmt.executeUpdate("insert into weblog values ('weblog')"); + stmt.executeUpdate("insert into pingtarget values ('target')"); + stmt.executeUpdate("insert into autoping values ('auto', 'weblog', 'target')"); + stmt.executeUpdate("insert into pingqueueentry values ('queued')"); + stmt.executeUpdate("insert into roller_properties values ('roller.database.version', '" + oldVersion + "')"); + stmt.executeUpdate("insert into roller_properties values ('pings.suspendPingProcessing', 'false')"); + stmt.executeUpdate("insert into roller_properties values ('pings.logOnly', 'true')"); + stmt.executeUpdate("insert into roller_properties values ('site.name', 'Keep this site')"); + stmt.executeUpdate("insert into roller_tasklock values ('old', 'PingQueueTask')"); + stmt.executeUpdate("insert into roller_tasklock values ('keep', 'ScheduledEntriesTask')"); + + DatabaseInstaller installer = new DatabaseInstaller(db, scripts); + assertTrue(installer.isUpgradeRequired()); + installer.upgradeDatabase(true); + + assertNoObsoleteTables(con); + assertEquals(0, count(stmt, "select count(*) from roller_properties where name like 'pings.%'")); + assertEquals(0, count(stmt, "select count(*) from roller_tasklock where name = 'PingQueueTask'")); + assertEquals(1, count(stmt, "select count(*) from roller_tasklock where name = 'ScheduledEntriesTask'")); + assertEquals(1, count(stmt, "select count(*) from roller_properties where name = 'site.name' and value = 'Keep this site'")); + assertVersion700(stmt); + assertEquals(1, count(stmt, "select count(*) from weblog")); + assertFalse(installer.isUpgradeRequired()); + assertFalse(installer.getMessages().stream().anyMatch(m -> m.contains("No table changes were required."))); + } + } - DatabaseInstaller installer = new DatabaseInstaller(db, mock(DatabaseScriptProvider.class)); + @Test + void freshInstallOmitsObsoleteTables() throws Exception { + String url = "jdbc:derby:memory:fresh" + UUID.randomUUID() + ";create=true"; + DatabaseProvider db = mock(DatabaseProvider.class); + when(db.getConnection()).thenAnswer(invocation -> DriverManager.getConnection(url)); + DatabaseScriptProvider scripts = path -> getClass().getResourceAsStream("/dbscripts/" + path); + DatabaseInstaller installer = new DatabaseInstaller(db, scripts); - assertFalse(installer.isUpgradeRequired()); + installer.createDatabase(); + + try (Connection con = DriverManager.getConnection(url); Statement stmt = con.createStatement()) { + assertNoObsoleteTables(con); + assertVersion700(stmt); + assertEquals(0, count(stmt, "select count(*) from weblogentry")); + assertFalse(installer.isCreationRequired()); + assertFalse(installer.isUpgradeRequired()); + } + } + + private void assertNoObsoleteTables(Connection con) throws SQLException { + for (String name : new String[] {"AUTOPING", "PINGQUEUEENTRY", "PINGTARGET"}) { + try (ResultSet tables = con.getMetaData().getTables(null, "APP", name, new String[] {"TABLE"})) { + assertFalse(tables.next(), name + " should be absent"); + } + } + } + + private int count(Statement stmt, String sql) throws SQLException { + try (ResultSet rows = stmt.executeQuery(sql)) { + assertTrue(rows.next()); + return rows.getInt(1); + } + } + + private void assertVersion700(Statement stmt) throws SQLException { + try (ResultSet rows = stmt.executeQuery("select value from roller_properties where name = 'roller.database.version'")) { + assertTrue(rows.next()); + assertEquals("700", rows.getString(1)); + } } @Test - void pendingDatabaseMigrationRequiresUpgrade() throws Exception { + void currentSchemaDoesNotRequireUpgrade() throws Exception { DatabaseProvider db = mock(DatabaseProvider.class); Connection con = mock(Connection.class); Statement query = mock(Statement.class); @@ -54,42 +136,28 @@ void pendingDatabaseMigrationRequiresUpgrade() throws Exception { when(con.createStatement()).thenReturn(query); when(query.executeQuery(anyString())).thenReturn(rows); when(rows.next()).thenReturn(true); - when(rows.getString(1)).thenReturn("520"); + when(rows.getString(1)).thenReturn("700"); DatabaseInstaller installer = new DatabaseInstaller(db, mock(DatabaseScriptProvider.class)); - assertTrue(installer.isUpgradeRequired()); + assertFalse(installer.isUpgradeRequired()); } @Test - void versionOnlyUpgradeReportsCompletion() throws Exception { + void pendingDatabaseMigrationRequiresUpgrade() throws Exception { DatabaseProvider db = mock(DatabaseProvider.class); - DatabaseScriptProvider scripts = mock(DatabaseScriptProvider.class); Connection con = mock(Connection.class); Statement query = mock(Statement.class); ResultSet rows = mock(ResultSet.class); - PreparedStatement update = mock(PreparedStatement.class); when(db.getConnection()).thenReturn(con); when(con.createStatement()).thenReturn(query); when(query.executeQuery(anyString())).thenReturn(rows); when(rows.next()).thenReturn(true); - when(rows.getString(1)).thenReturn("610"); - when(con.prepareStatement(anyString())).thenReturn(update); - DatabaseInstaller installer = new DatabaseInstaller(db, scripts); + when(rows.getString(1)).thenReturn("615"); - // the version the installer writes is the one it reads from - // /roller-version.properties, so derive the expectation from the - // same source and parser instead of pinning a release constant - Properties props = new Properties(); - props.load(getClass().getResourceAsStream("/roller-version.properties")); - int expectedVersion = DatabaseInstaller.parseVersionString(props.getProperty("ro.version", "UNKNOWN")); + DatabaseInstaller installer = new DatabaseInstaller(db, mock(DatabaseScriptProvider.class)); - installer.upgradeDatabase(true); - verify(update).setString(1, String.valueOf(expectedVersion)); - verify(update).executeUpdate(); - verifyNoInteractions(scripts); - assertTrue(installer.getMessages().stream().anyMatch(m -> m.contains("No table changes were required."))); - assertTrue(installer.getMessages().stream().anyMatch(m -> m.contains("Database version updated to " + expectedVersion + "."))); + assertTrue(installer.isUpgradeRequired()); } @Test @@ -112,7 +180,7 @@ void schemaUpgradeSuppressesNoChangesMessage() throws Exception { props.load(getClass().getResourceAsStream("/roller-version.properties")); int expectedVersion = DatabaseInstaller.parseVersionString(props.getProperty("ro.version", "UNKNOWN")); - // a 520 database upgrades through the 520->610 schema step; run with + // A 520 database upgrades through the 610 and 700 schema steps; run with // runScripts=false so the step does its bookkeeping without executing a // migration script. Because a schema step ran, the "no table changes" // message must be suppressed. diff --git a/app/src/test/java/org/apache/roller/weblogger/ui/struts2/admin/PingTargetEditTest.java b/app/src/test/java/org/apache/roller/weblogger/ui/struts2/admin/PingTargetEditTest.java deleted file mode 100644 index 59174430a4..0000000000 --- a/app/src/test/java/org/apache/roller/weblogger/ui/struts2/admin/PingTargetEditTest.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * 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. - */ -package org.apache.roller.weblogger.ui.struts2.admin; - -import jakarta.servlet.http.HttpServletRequest; - -import org.apache.roller.weblogger.business.Weblogger; -import org.apache.roller.weblogger.business.WebloggerFactory; -import org.apache.roller.weblogger.business.pings.PingTargetManager; -import org.apache.roller.weblogger.pojos.PingTarget; -import org.junit.jupiter.api.Test; -import org.mockito.MockedStatic; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.mockStatic; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -class PingTargetEditTest { - - @Test - void getDoesNotSave() throws Exception { - PingTargetManager pingTargets = pingTargetManager(); - try (MockedStatic factory = mockStatic(WebloggerFactory.class)) { - Weblogger weblogger = weblogger(factory, pingTargets); - PingTargetEdit action = action("GET"); - - assertEquals(PingTargetEdit.INPUT, action.execute()); - verify(pingTargets, never()).savePingTarget(any()); - verify(weblogger, never()).flush(); - } - } - - @Test - void postSaves() throws Exception { - PingTargetManager pingTargets = pingTargetManager(); - try (MockedStatic factory = mockStatic(WebloggerFactory.class)) { - Weblogger weblogger = weblogger(factory, pingTargets); - PingTargetEdit action = action("POST"); - - assertEquals(PingTargetEdit.SUCCESS, action.execute()); - verify(pingTargets).savePingTarget(any(PingTarget.class)); - verify(weblogger).flush(); - } - } - - private static PingTargetManager pingTargetManager() throws Exception { - PingTargetManager pingTargets = mock(PingTargetManager.class); - when(pingTargets.isUrlWellFormed(anyString())).thenReturn(true); - when(pingTargets.isHostnameKnown(anyString())).thenReturn(true); - return pingTargets; - } - - private static Weblogger weblogger(MockedStatic factory, - PingTargetManager pingTargets) { - Weblogger weblogger = mock(Weblogger.class); - when(weblogger.getPingTargetManager()).thenReturn(pingTargets); - factory.when(WebloggerFactory::getWeblogger).thenReturn(weblogger); - return weblogger; - } - - private static PingTargetEdit action(String method) { - PingTargetEdit action = spy(new PingTargetEdit()); - doAnswer(call -> call.getArgument(0)).when(action).getText(anyString(), anyString(), anyString()); - action.setActionName("commonPingTargetAdd"); - action.getBean().setName("example"); - action.getBean().setPingUrl("http://ping.example.com/rpc"); - HttpServletRequest request = mock(HttpServletRequest.class); - when(request.getMethod()).thenReturn(method); - action.withServletRequest(request); - action.myPrepare(); - return action; - } -} diff --git a/app/src/test/java/org/apache/roller/weblogger/ui/struts2/editor/EditorActionTargetBindingTest.java b/app/src/test/java/org/apache/roller/weblogger/ui/struts2/editor/EditorActionTargetBindingTest.java index b44f5e08ea..b37b8b77d5 100644 --- a/app/src/test/java/org/apache/roller/weblogger/ui/struts2/editor/EditorActionTargetBindingTest.java +++ b/app/src/test/java/org/apache/roller/weblogger/ui/struts2/editor/EditorActionTargetBindingTest.java @@ -25,7 +25,6 @@ import org.apache.struts2.util.ValueStack; import org.apache.struts2.util.ValueStackFactory; import org.apache.struts2.util.reflection.ReflectionContextState; -import org.apache.roller.weblogger.ui.struts2.admin.PingTargets; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DynamicTest; import org.junit.jupiter.api.TestFactory; @@ -37,7 +36,7 @@ import static org.junit.jupiter.api.Assertions.assertNull; /** - * No editor or ping-target action lets a request parameter create the domain + * No editor action lets a request parameter create the domain * object it works on. Those objects are loaded only by the action, from the * weblog, by id. */ @@ -79,10 +78,6 @@ private static class Case { private List cases() { return Arrays.asList( - new Case("Pings.pingTarget", Pings::new, "pingTarget.pingUrl", - a -> ((Pings) a).getPingTarget()), - new Case("PingTargets.pingTarget", PingTargets::new, "pingTarget.pingUrl", - a -> ((PingTargets) a).getPingTarget()), new Case("CategoryRemove.category", CategoryRemove::new, "category.name", a -> ((CategoryRemove) a).getCategory()), new Case("EntryRemove.removeEntry", EntryRemove::new, "removeEntry.anchor", diff --git a/app/src/test/java/org/apache/roller/weblogger/ui/struts2/editor/PingsTargetBindingTest.java b/app/src/test/java/org/apache/roller/weblogger/ui/struts2/editor/PingsTargetBindingTest.java deleted file mode 100644 index 3f96520dd8..0000000000 --- a/app/src/test/java/org/apache/roller/weblogger/ui/struts2/editor/PingsTargetBindingTest.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * 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. - */ -package org.apache.roller.weblogger.ui.struts2.editor; - -import java.util.Collections; - -import org.apache.struts2.config.ConfigurationManager; -import org.apache.struts2.config.providers.StrutsDefaultConfigurationProvider; -import org.apache.struts2.inject.Container; -import org.apache.struts2.util.ValueStackFactory; -import org.apache.struts2.util.ValueStack; -import org.apache.struts2.util.reflection.ReflectionContextState; -import org.apache.roller.weblogger.business.WebloggerFactory; -import org.apache.roller.weblogger.business.Weblogger; -import org.apache.roller.weblogger.business.pings.PingTargetManager; -import org.apache.roller.weblogger.pojos.PingTarget; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.MockedStatic; - -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertSame; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.mockStatic; -import static org.mockito.Mockito.when; - -/** - * The ping target that the Pings action works on must be one of the stored - * ping targets, selected by id. - */ -class PingsTargetBindingTest { - - private MockedStatic factory; - private PingTargetManager pingTargets; - private ValueStack stack; - - @BeforeEach - void setUp() throws Exception { - factory = mockStatic(WebloggerFactory.class); - pingTargets = mock(PingTargetManager.class); - when(pingTargets.getCommonPingTargets()).thenReturn(Collections.emptyList()); - Weblogger weblogger = mock(Weblogger.class); - when(weblogger.getPingTargetManager()).thenReturn(pingTargets); - factory.when(WebloggerFactory::getWeblogger).thenReturn(weblogger); - - ConfigurationManager configurationManager = new ConfigurationManager("xwork"); - configurationManager.addContainerProvider(new StrutsDefaultConfigurationProvider()); - Container container = configurationManager.getConfiguration().getContainer(); - stack = container.getInstance(ValueStackFactory.class).createValueStack(); - } - - @AfterEach - void tearDown() { - factory.close(); - } - - /** Set request parameters on the action the way the params interceptor does. */ - private void bind(Pings action, String name, String value) { - stack.push(action); - ReflectionContextState.setCreatingNullObjects(stack.getContext(), true); - ReflectionContextState.setDenyMethodExecution(stack.getContext(), true); - try { - stack.setParameter(name, value); - } finally { - ReflectionContextState.setCreatingNullObjects(stack.getContext(), false); - stack.pop(); - } - } - - @Test - void pingTargetFieldsInTheRequestDoNotMakeATarget() throws Exception { - Pings action = new Pings(); - bind(action, "pingTarget.pingUrl", "http://localhost:1/"); - action.myPrepare(); - - assertNull(action.getPingTarget()); - } - - @Test - void pingTargetIdSelectsAStoredTarget() throws Exception { - PingTarget stored = new PingTarget("target-1", "Stored", "http://ping.example.com/", false); - when(pingTargets.getPingTarget("target-1")).thenReturn(stored); - - Pings action = new Pings(); - bind(action, "pingTargetId", "target-1"); - bind(action, "pingTarget.pingUrl", "http://localhost:1/"); - action.myPrepare(); - - assertSame(stored, action.getPingTarget()); - assertSame("http://ping.example.com/", action.getPingTarget().getPingUrl()); - } -} diff --git a/app/src/test/java/org/apache/roller/weblogger/ui/struts2/util/StrutsParameterAnnotationTest.java b/app/src/test/java/org/apache/roller/weblogger/ui/struts2/util/StrutsParameterAnnotationTest.java index 72b5a65bfb..896795efab 100644 --- a/app/src/test/java/org/apache/roller/weblogger/ui/struts2/util/StrutsParameterAnnotationTest.java +++ b/app/src/test/java/org/apache/roller/weblogger/ui/struts2/util/StrutsParameterAnnotationTest.java @@ -63,7 +63,6 @@ public class StrutsParameterAnnotationTest { */ private static final Set NOT_BOUND = Set.of( // set from the static of the action mapping in struts.xml - "PingTargetEdit.actionName", "FolderEdit.actionName", // no such property; the hidden fields are leftovers in the JSPs "Categories.categoryId", @@ -74,9 +73,6 @@ public class StrutsParameterAnnotationTest { * form id. An empty list skips the form. */ private static final Map> FORM_TARGETS = Map.of( - // posted by JavaScript to actionName + ".rol" - "admin/PingTargets.jsp#pingTargetEditForm", - List.of("commonPingTargetAdd", "commonPingTargetEdit"), // popup that is not reachable from any page "editor/MediaFileAddExternalInclude.jsp#entry", List.of()); diff --git a/app/src/test/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomManagementTest.java b/app/src/test/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomManagementTest.java index b99d64575b..0fa1760505 100644 --- a/app/src/test/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomManagementTest.java +++ b/app/src/test/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomManagementTest.java @@ -70,6 +70,14 @@ public void setUp() throws Exception { TestUtils.setupWeblogger(); owner = TestUtils.setupUser("atommgmtowner"); author = TestUtils.setupUser("atommgmtauthor"); + // Exercise weblog permissions without the first-user site-admin role. + var userManager = WebloggerFactory.getWeblogger().getUserManager(); + for (User user : List.of(owner, author)) { + if (userManager.hasRole("admin", user)) { + userManager.revokeRole("admin", user); + } + } + TestUtils.endSession(true); weblog = TestUtils.setupWeblog(HANDLE, owner); otherWeblog = TestUtils.setupWeblog(OTHER_HANDLE, owner); WebloggerFactory.getWeblogger().getUserManager().grantWeblogPermission( diff --git a/app/src/test/resources/roller-custom.properties b/app/src/test/resources/roller-custom.properties index bae645bdf0..ab8e57f9bb 100644 --- a/app/src/test/resources/roller-custom.properties +++ b/app/src/test/resources/roller-custom.properties @@ -51,7 +51,7 @@ cache.dir=${project.build.testOutputDirectory}/planet-cache uploads.migrate.auto=false # override tasks.enabled so we can add a test task -tasks.enabled=ScheduledEntriesTask,ResetHitCountsTask,PingQueueTask,TestTask +tasks.enabled=ScheduledEntriesTask,ResetHitCountsTask,TestTask # test task tasks.TestTask.class=org.apache.roller.weblogger.business.TestTask diff --git a/app/src/test/resources/roller-jettyrun.properties b/app/src/test/resources/roller-jettyrun.properties index 9543cbf74f..42562fbcec 100644 --- a/app/src/test/resources/roller-jettyrun.properties +++ b/app/src/test/resources/roller-jettyrun.properties @@ -50,7 +50,7 @@ mediafiles.storage.dir =${project.build.directory}/work/mediafiles uploads.migrate.auto=false # override tasks.enabled so we can add a test task -tasks.enabled=ScheduledEntriesTask,ResetHitCountsTask,PingQueueTask,TestTask +tasks.enabled=ScheduledEntriesTask,ResetHitCountsTask,TestTask # test task tasks.TestTask.class=org.apache.roller.weblogger.business.TestTask diff --git a/docs/images/user-guide-23-ping.png b/docs/images/user-guide-23-ping.png deleted file mode 100644 index dec1d524e2..0000000000 Binary files a/docs/images/user-guide-23-ping.png and /dev/null differ diff --git a/docs/images/user-guide-30-ping.png b/docs/images/user-guide-30-ping.png deleted file mode 100644 index 7cb9e69260..0000000000 Binary files a/docs/images/user-guide-30-ping.png and /dev/null differ diff --git a/docs/roller-install-guide.adoc b/docs/roller-install-guide.adoc index 6fef43b853..40f99d1dc2 100644 --- a/docs/roller-install-guide.adoc +++ b/docs/roller-install-guide.adoc @@ -933,7 +933,7 @@ planet.aggregator.enabled=true # Tasks which are enabled. Only tasks listed here will be run. tasks.enabled=ScheduledEntriesTask,ResetHitCountsTask,\ -PingQueueTask,RefreshRollerPlanetTask,SyncWebsitesTask +RefreshRollerPlanetTask,SyncWebsitesTask # Set of page models specifically for site-wide rendering rendering.siteModels=\ diff --git a/docs/roller-user-guide.adoc b/docs/roller-user-guide.adoc index b79d2c6935..c81430f241 100644 --- a/docs/roller-user-guide.adoc +++ b/docs/roller-user-guide.adoc @@ -37,7 +37,7 @@ You’ll learn how to register as a new user. You’ll learn how to create one or more weblogs for yourself or a group of your friends. You’ll learn how to create, edit and post weblog entries. We will also cover more advanced topics such as adjusting your weblog’s settings, how to -customize your blogroller, how to manage weblog pings and more. +customize your blogroll and more. First, let’s get some terminology out of the way because there’s a lot of jargon in weblogging. Here’s a list of some of the terms we use in @@ -1083,120 +1083,6 @@ are participating in and what privileges you have on each weblog. To resign from a group blog, login, on the Main Menu page, navigate to the blog information for which you wish to resign. Select 'Resign'. -== Using weblog pings - -Weblog update pings provide a means for you to notify aggregation and -indexing sites (for example Weblogs.com, Technorati and javablogs.com) -that your weblog has changed so that they will pick up your latest -content from your RSS feed. - -Roller supports the conventional XML-RPC weblog update ping mechanism -used by many sites for such notifications. - -=== Registering with an Aggregator - -Generally speaking, aggregation sites first require you to register your -weblog with their site. During this registration process you normally -provide both the HTTP URL and the RSS feed URL for your weblog. This is -important because the ping message conveys only the normal HTTP URL of -your site, and the site will use that to lookup the registered RSS feed -URL to fetch from. - -Aggregation sites that accept ping notifications generally publish the -ping URL to use to ping their site on their (human-readable) web site. -Once you have registered your site with an aggregator, you can set up -your weblog to deliver pings to that site. - -=== Ping Targets, Common and Custom - -You can set up the Roller server to ping sites of your choice -automatically whenever you post published updates to your weblog. - -Roller uses the term *ping target* to refer to a site, such as an -aggregator, that accepts weblog update ping notifications. A ping target -is configured with a (display) name and the ping URL needed to reach the -site. Before you can send a ping to a site, you must configure a ping -target in Roller for the site. Roller comes pre-shipped with multiple -ping targets and the Roller administrator can configure additional ones -as desired. - -=== Setting up Automated Pings - -Once a ping target has been configured for the site that you wish to -ping, you can use the *Weblog:Pings* page (shown below) to enable -automatic pings and send manual pings. - -image::user-guide-23-ping.png[] - -To enable automatic pings to a ping target, find the ping target on the -page and click the *Enable* link in the Automatic column. The status -indicator turns to *ON* and the link changes to *Disable* (as shown for -some sites in the screenshot above). To disable automatic pings to a -ping target click the *Disable* link in the Automatic column. The status -indicator turns to *OFF* and the link changes to *Enable*. - -When you have enabled automatic pinging for a ping target, Roller will -automatically send a ping to that site whenever you publish a new weblog -entry or update a published weblog entry. - -NOTE: In actuality, Roller queues a request to send the ping and -processes this request in the background, so that you can get on with -your blogging. The ping queue is processed at an interval configured by -the site administrator; this interval is 5 minutes in a default -configuration. In case the aggregator site is temporarily unreachable, -Roller will requeue your ping request and retry on subsequent passes -through the queue; in a default configuration the ping is requeued for -up to 3 ping attempts._ - -=== Sending a Manual Ping - -You can also send a manual ping to a ping target using the *Send Ping -Now* link listed for the target on the *Weblog:Pings* page. When you -send a manual ping the ping is not queued, it is sent immediately and -attempted only once. Roller shows you the response status (success or a -failure message) that results from the ping. - -You do not need to enable automatic pinging in order to send manual -pings. You can send a manual ping whether or not you have enabled -automatic pinging for that target. - -You can use manual pings if you ping a site very rarely, or if you are -feeling a bit impatient, and you don’t want to wait for the next queue -processing interval. - -If you don’t find a ping target listed for the site you wish to ping, -you can request that your administrator add a a new one for all blogs to -have available. See Chapter 10 for more information on adding ping -targets. - -=== More on Registering with an Aggregator - -When you register with an aggregator, you will usually need to provide -two pieces of information as part of the registration, your blog’s base -(HTML) url and your RSS feed (XML) URL. Make sure to read the -aggregator’s documentation and help on registering. - -For Roller weblogs, you get your weblog’s base URL by viewing your -weblog and taking the URL to the point just following your weblog’s -handle. (In other words it should end with _page_/_handlenamehere_). - -The RSS feed URL for your whole feed can be obtained by substituting -_page_ in your weblog’s URL with _RSS_. Most browsers will display this -link in the status bar when you place your mouse over RSS badge (the -little orange XML box) on your weblog page. - -You also have category-specific feeds, which are useful for registering -with topical aggregators like *java.blogs*. To get a category-specific -feed URL, just append _?catname=/categoryname_ substituting _name_ for -the category name. The "basic" theme has some category RSS feeds just -below the RSS badge in the right-hand vertical bar. - -Some aggregators can also scrape (read and parse the HTML of your -weblog) to discover the feed URL automatically when provided with the -HTML URL. The default Roller theme template pages include hints in the -form of tags that many sites can use to determine the feed URL -automatically. - == Roller administration This section of the Roller user guide is for users with the global admin @@ -1205,9 +1091,8 @@ system gets that role and then can grant it to other users via the *Global Admin->User Admin* page, which just happens to be the first topic we’ll cover in the section. -We’ll also describe how to configure Roller via the **Global -Admin->Configuration **page and how to configure Roller’s custom ping -facility via the *Global Admin->Ping Targets* page. +We’ll also describe how to configure Roller via the *Global +Admin->Configuration* page. === Managing users @@ -1273,8 +1158,6 @@ like the frontpage weblog’s RSS and Atom feeds to be an aggregation of all weblogs on the Roller site. * *Absolute URL to this site*: to be used as basis for creating absolute URLs. Required for Roller’s Planet aggregator feature. -* *Suspend all ping processing*: Allows you to turn off all (outgoing) -weblogs pings for all weblogs in the system. * *Enable debug mode*: currently not used. image::user-guide-27-comments.png[] @@ -1340,182 +1223,6 @@ can still place their own tracking code within their blog templates if you enable custom themes (in the "Theme Settings" section on this configuration page.) -== Weblog update ping administration - -This section, intended for Roller administrators, describes how the -Roller weblog update ping feature works and how to configure and -administer it. - -=== Creating and editing common ping targets - -Common ping targets are ping targets that are shared by all users. You -can create and edit common ping targets using the *Global Admin->Ping -Targets* page. - -image::user-guide-30-ping.png[] - -You can create and edit common ping in the same way that regular users -create and edit custom ping targets, but keep in mind that common ping -targets are shared amongst all users, and that your changes affect all -users using the ping target. Administrators should make sure to test new -common ping targets after creating them. - -Before adding a ping target, the administrator must determine the proper -ping URL for the site that you wish to ping. This information can be -obtained from the aggregator’s web site or from another knowledgeable -source. - -It can be hard to find the aggregator’s documentation for the specific -ping URL to use to notify their site. Commonly aggregators list this on -their web site under a topic providing help about registering your feed, -or under a topic providing information for developers. Keep in mind that -some aggregators only use periodic polling and do not accept ping -notifications at all. If you can’t find any information about pinging on -the aggregator’s web site, the site may not support pinging. - -Click the *Add New* button to add a new ping target. This will bring up -a form with a *Name* field and a *Ping URL* field. Fill in both fields, -and click the *Save* button. - -image::user-guide-31-add-ping.png[] - -Once the new ping target has been created, it will be listed for all -blogs on their *Weblog:Pings* page with the default activation status -defined by the administrator. From this page, individual users can -override the ping target’s enable status for their own blog as well as -send manual pings to the new target. - -=== How Roller Processes Weblog Update Pings - -Roller processes weblog update pings in the background. When a user -updates his or her weblog, Roller automatically queues any required -automated pings on a queue. Roller only keeps one ping queue entry for a -given user weblog and ping target. Subsequent updates to a weblog -occurring before the ping is processed will not cause additional pings -to be queued. - -Roller makes a full pass through the ping queue at regular intervals. -(Configuration of this interval is discussed below) In each pass, Roller -will attempt to send every queued ping request once. If any send fails -(and provided the failure appears to be a transient one), the ping -request will be re-queued, until the ping succeeds or a configured -number of attempts has been made. Note that when a ping request fails -and is re-queued, it is processed again only on subsequent ping passes. -If the number of attempts to reach a given ping target reaches the -maximum without succeeding, then an error message is logged and the ping -request is dropped. - -There is currently no mechanism for alerting users of failing ping -targets (though we plan some improvements in subsequent releases to -provide condition information on the weblog *Preferences->Pings* page, -as well as a failure policy to deactivate persistently failing ping -targets). - -=== Configuration Properties Controlling Ping Processing - -These properties control processing of the ping queue. They are -configured in the __roller.properties __file. - -**pings.queueProcessingIntervalMins **The interval in minutes between -ping queue processing runs. This must be a value in the range 0 to 120. -The default value is 5 minutes. We think the default value should work -for most sites, and is tolerable for most users. The number of users -publishing or updating entries in a given interval determines the length -of the queue, and Roller requires enough time in an interval to process -the queue once. We think that for all but the largest and most active -sites, it can probably be lowered as low as 1 minute if desired. -*IMPORTANT*: The value 0 (zero) has a special meaning. If the processing -interval is set to 0, ping queue processing is disabled on the server. -This can be used to exclude all but one host from sending pings in a -clustered environment where multiple Roller servers are sharing one -database schema. *Make sure to retain one host in the cluster that does -process the ping queue!* If multiple hosts in a cluster process the ping -queue, you may send duplicate pings and failing ping requests may drop -out of the queue sooner than the expected maximum (configured by the -next parameter). If no hosts in a cluster process the ping queue, auto -ping requests will accumulate in the queue and this will eventually -cause the database to run out of space, so don’t try to use this as a -way to disable ping features. You can use the properties described in -the following sections to disable ping features. - -**pings.maxPingAttempts **The maximum number of ping attempts made -before the ping request will no longer be requeued and will instead be -dropped from the queue. The default value is 3. We think this value is -fine for most sites. - -=== Suspending all ping processing - -Administrators can suspend all ping processing at runtime by checking -the *Suspend ping processing?* checkbox under the *Site Settings* -heading on the *Global Admin->Configuration* page and saving that form. - -When this checkbox is set, all ping processing is suspended. New -automatic ping requests are not added to the queue, and existing entries -on the queue are not processed. Manual pings are not sent either; they -result in a message telling the user that ping processing has been -suspended. Suspending ping processing is appropriate to temporarily stop -all ping processing if problems are encountered. - -Unchecking the checkbox and saving allows normal ping processing to -resume. Note, however, that autopings for weblogs that are updated while -ping processing is suspended will never be queued and hence never sent, -but pings queued before the suspension are sent once the suspension is -lifted. - -=== Controlling and disabling ping usage - -Since use of a ping target causes an outbound network connection to the -ping site, some administrators may not want to allow users to create -their own custom ping targets. It is possible to enable or disable the -use of custom ping targets across the whole site and also to disable all -ping usage. The following two properties are used to control this. - -**pings.disallowCustomTargets. **This property controls whether users -are allowed to create custom ping targets. If set to true, all existing -custom ping targets are _removed_, and the *Weblog:Custom Ping Targets* -page and the associated actions are disabled preventing any -configuration of custom ping targets. *Note:* __Setting this to true -this will cause the Roller server to __remove _any custom ping targets -that users have created when Roller is next started._ - -Administrators may also wish to disable ping functionality entirely. The -following property, used in conjunction with the above property, can be -used to do this. - -**pings.disablePingUsage. **This property controls whether users are -allowed to set up automatic pings or send manual pings. If set to true, -all existing autoping configurations are removed (i.e. disabled), the -weblog *Preferences->Pings* page and associated actions are disabled, -preventing any use of the ping features by regular users. *Note:* -__Setting this to true will cause the Roller server to __remove _any -autopings that users have configured when Roller is next started._ - -If both of the above properties are set to true, all ping functionality -is effectively disabled for regular users. The *Global Admin:Ping -Targets* page is still accessible (to administrators); you can use that -page to clear out any common targets if you wish. No user (including -administrators) will be able to configure automatic pings or send pings. -Ping queue processing continues but the queue will always be empty; you -can safely disable ping queue processing (by setting the processing -interval to zero) in this situation. - -=== Initialization of common ping targets - -The initial set of common ping targets is determined by the following -configuration property. - -**pings.initialCommonTargets. **This value is used to initialize the set -of common ping targets. The value consists of a comma-separated list of -ping targets, where each ping target is specified in the form - -{{name}{url}} - -This value is used every time Roller starts _and finds an empty list of -common ping targets._ Normally, this is only the first time Roller is -started on a fresh or upgraded database; note, however, that if you -really want to maintain an empty list of common ping targets, you will -need to comment out this value or set it to an empty string. - == Weblog Export Roller includes an optional weblog export feature that allows you to diff --git a/docs/security-model.md b/docs/security-model.md index 7f3d3e0362..35915ddaec 100644 --- a/docs/security-model.md +++ b/docs/security-model.md @@ -71,7 +71,6 @@ flowchart TB subgraph Admins["Global admins"] AD["Admin UI
(/roller-ui/admin)"] PL["Planet feed aggregator"] - PG["Ping targets"] end subgraph Setup["First run only"] IN["Installer + setup token"] @@ -86,7 +85,6 @@ flowchart TB AD --> DB IN --> DB PL -->|fetches| NET(("Network")) - PG -->|pings| NET ``` Everything in the Roller WAR is in scope, including the bundled themes. Build @@ -133,9 +131,9 @@ do everything a Limited member can. | **Anonymous visitor** | Read published entries, feeds and search; post comments; register, when registration is on | See drafts, settings or anything unpublished; change anything | No | | **Registered user** (global `editor`) | Log in; edit own profile; comment; create weblogs, when the site allows it | Act in a weblog where they hold no role | No | | **Limited** (`edit_draft`) | Create and edit draft entries in that weblog | Publish; manage comments, categories or media; act in other weblogs | No | -| **Author** (`post`) | Everything Limited can do; publish entries; manage comments and categories; manage media, when uploads are on | Change weblog settings, members, bookmarks, pings or design | No | -| **Admin** (`admin`) | Everything Author can do; weblog settings, members, bookmarks (including OPML import), pings, maintenance; theme and templates, when custom themes are on | Touch other weblogs; read server files; run Java code; read other users' private data; run script in other users' browsers | **No** | -| **Global admin** (global `admin`) | Everything in every weblog; users; site settings; Planet feeds; ping targets | Get shell or file access on the host | Yes | +| **Author** (`post`) | Everything Limited can do; publish entries; manage comments and categories; manage media, when uploads are on | Change weblog settings, members, bookmarks or design | No | +| **Admin** (`admin`) | Everything Author can do; weblog settings, members, bookmarks (including OPML import), maintenance; theme and templates, when custom themes are on | Touch other weblogs; read server files; run Java code; read other users' private data; run script in other users' browsers | **No** | +| **Global admin** (global `admin`) | Everything in every weblog; users; site settings; Planet feeds | Get shell or file access on the host | Yes | | **Network attacker** | Read or change traffic when the site runs over plain HTTP | Anything, once the site runs over HTTPS | No | | **Operator** | Owns the container, JVM, database, configuration files and logs | — | Yes, out of scope | @@ -164,7 +162,6 @@ attack by an anonymous visitor, not by that user. | OPML bookmark import | Weblog Admins | | Remote API requests (XML-RPC, AtomPub) | Anyone, before authentication | | Feeds fetched by Planet | Whoever runs the feed's host | -| Responses from ping targets | Whoever runs the ping target | | Installer forms | Anyone, until setup is complete | Only the operator controls `roller-custom.properties`, JNDI resources and the @@ -202,7 +199,7 @@ flowchart LR - Uploaded files are never served as active content (see below). 4. **Server → network.** Users below global admin cannot make the server fetch a URL of their choice. Entry enclosure URLs are stored, not fetched. Global - admins can point the server at any URL through Planet feeds and ping targets. + admins can point the server at any URL through Planet feeds. That is by design. Two more rules protect the whole site: @@ -333,7 +330,7 @@ Roller does not protect against: installation and upgrades. - Keep the database, data directories and `roller-custom.properties` private. - If the server can reach internal services, put egress rules on Roller's - outbound traffic (Planet, pings). + outbound traffic (Planet). - Run the current release. Older releases are not patched. ## Common mistakes diff --git a/it-playwright/src/test/java/org/apache/roller/playwright/NewUserJourneyIT.java b/it-playwright/src/test/java/org/apache/roller/playwright/NewUserJourneyIT.java index 0a69101ffd..6fbb5693fe 100644 --- a/it-playwright/src/test/java/org/apache/roller/playwright/NewUserJourneyIT.java +++ b/it-playwright/src/test/java/org/apache/roller/playwright/NewUserJourneyIT.java @@ -119,6 +119,7 @@ void firstUserCanRegisterAndPublish() { register(); signIn(); createWeblog(); + assertRetiredPingPagesAreUnavailable(); publishEntry(BLOG_HANDLE, ENTRY_TITLE, ENTRY_TEXT); assertEntryOnBlog(BLOG_HANDLE, ENTRY_TITLE, ENTRY_TEXT); enableUploads(); @@ -130,6 +131,21 @@ void firstUserCanRegisterAndPublish() { assertPublishingTimeOnOneLine(); } + private void assertRetiredPingPagesAreUnavailable() { + goTo(GLOBAL_CONFIG_PAGE); + assertThat(page.locator("a[href*='commonPingTarget']")).hasCount(0); + goTo("roller-ui/authoring/entries.rol?weblog=" + BLOG_HANDLE); + assertThat(page.locator("a[href*='pings.rol']")).hasCount(0); + for (String url : new String[] { + "roller-ui/admin/commonPingTargets.rol", + "roller-ui/admin/commonPingTargetAdd.rol", + "roller-ui/admin/commonPingTargetEdit.rol", + "roller-ui/authoring/pings.rol?weblog=" + BLOG_HANDLE}) { + APIResponse response = page.request().get(baseUrl + url); + Assertions.assertEquals(404, response.status(), "Retired page should be absent: " + url); + } + } + private void register() { goTo(REGISTER_PAGE); assertThat(page).hasTitle(Pattern.compile("New User Registration")); diff --git a/it-playwright/src/test/resources/roller-jettyrun.properties b/it-playwright/src/test/resources/roller-jettyrun.properties index c91cf5d85e..a67d19984d 100644 --- a/it-playwright/src/test/resources/roller-jettyrun.properties +++ b/it-playwright/src/test/resources/roller-jettyrun.properties @@ -51,7 +51,7 @@ log4j.appender.roller.File=${project.build.directory}/work/roller.log uploads.migrate.auto=false # override tasks.enabled so we can add a test task -tasks.enabled=ScheduledEntriesTask,ResetHitCountsTask,TurnoverReferersTask,PingQueueTask,TestTask +tasks.enabled=ScheduledEntriesTask,ResetHitCountsTask,TurnoverReferersTask,TestTask # test task tasks.TestTask.class=org.apache.roller.weblogger.business.TestTask