diff --git a/.gitignore b/.gitignore index 979f59a01a..463a2dfc03 100644 --- a/.gitignore +++ b/.gitignore @@ -25,5 +25,7 @@ target/ velocity.log tomcat-base -deployment/docker-compose/postgresql-data -deployment/docker-compose/roller-data \ No newline at end of file +docker/postgresql-data +docker/roller-data +assembly-release/release.sh +it-selenium/overlays/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000..53affc43c2 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,84 @@ + +# 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. + + +# Example Dockerfile for containerizing Roller + + +# STAGE 1 - BUILD ------------------------------------------------ + +FROM maven:3.6.0-jdk-11-slim as builder + +COPY . /project/ + +# Build Apache Roller + +WORKDIR /tmp +RUN apt-get update && apt-get install -y git +RUN git clone https://github.com/apache/roller.git +WORKDIR /tmp/roller +RUN git checkout bootstrap-ui; \ +mvn -Duser.home=/builder/home -DskipTests=true -B clean install + + +# STAGE 2 - PACKAGE ------------------------------------------------ + +FROM tomcat:9.0.20-jre11-slim + +# Remove existing Tomcat webapps + +RUN rm -rf /usr/local/tomcat/webapps/* + +# Add Roller configuration to environment + +ARG STORAGE_ROOT=/usr/local/tomcat/data +ARG DATABASE_JDBC_DRIVERCLASS=org.postgresql.Driver +ARG DATABASE_JDBC_CONNECTIONURL=jdbc:postgresql://postgresql/rollerdb +ARG DATABASE_JDBC_USERNAME=scott +ARG DATABASE_JDBC_PASSWORD=tiger +ARG DATABASE_HOST=postgresql:5434 + +ENV STORAGE_ROOT ${STORAGE_ROOT} +ENV DATABASE_JDBC_DRIVERCLASS ${DATABASE_JDBC_DRIVERCLASS} +ENV DATABASE_JDBC_CONNECTIONURL ${DATABASE_JDBC_CONNECTIONURL} +ENV DATABASE_JDBC_USERNAME ${DATABASE_JDBC_USERNAME} +ENV DATABASE_JDBC_PASSWORD ${DATABASE_JDBC_PASSWORD} +ENV DATABASE_HOST ${DATABASE_HOST} + +# install Roller WAR as ROOT.war, create data dirs + +WORKDIR /usr/local/roller +COPY --from=builder /project/app/target/roller.war /usr/local/tomcat/webapps/ROOT.war +RUN mkdir -p data/mediafiles data/searchindex + +# download PostgreSQL and MySQL drivers plus Mail and Activation JARs + +WORKDIR /usr/local/tomcat/lib +RUN apt-get update && apt-get install -y wget +RUN wget -O postgresql.jar https://jdbc.postgresql.org/download/postgresql-9.4-1202.jdbc4.jar +RUN wget http://repo2.maven.org/maven2/javax/mail/mail/1.4.1/mail-1.4.1.jar +RUN wget http://repo2.maven.org/maven2/javax/activation/activation/1.1.1/activation-1.1.1.jar + +# Add Roller entry-point and go! + +COPY --from=builder /project/docker/entry-point.sh /usr/local/tomcat/bin +COPY --from=builder /project/docker/wait-for-it.sh /usr/local/tomcat/bin +RUN chgrp -R 0 /usr/local/tomcat +RUN chmod -R g+rw /usr/local/tomcat + +WORKDIR /usr/local/tomcat +ENTRYPOINT /usr/local/tomcat/bin/entry-point.sh \ No newline at end of file diff --git a/NOTICE.txt b/NOTICE.txt index 490d7b49a3..9ef79e3cad 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -17,13 +17,8 @@ This product includes: * Code written by Dave Johnson for RSS and Atom in Action Copyright 2005 David M Johnson (For RSS and Atom In Action) -* The Xinha WYSIWYG editor, which includes HTMLArea - htmlArea License (based on BSD license) - Copyright (c) 2002-2004, interactivetools.com, inc. - Copyright (c) 2003-2004 dynarch.com - All rights reserved. - http://trac.xinha.org/wiki/Licence - +* The Summernote WYSIWYG editor, MIT license + * Snippets of code from Spring Mobile Copyright (c) 2010-2014 Pivotal, Inc. All Rights Reserved. diff --git a/README.md b/README.md index 095310247b..92ea4cd8ea 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ + # Apache Roller -[Apache Roller](http://roller.apache.org) is a Java-based, full-featured, -multi-user and group-blog server suitable for blog sites large and small. +[Apache Roller](http://roller.apache.org) is a Java-based, full-featured, multi-user and group-blog server suitable for blog sites large and small. Roller is typically run with Apache Tomcat and MySQL. Roller is made up of the following Maven projects: @@ -13,21 +13,21 @@ Roller is made up of the following Maven projects: ## Documentation -The Roller Install, User and Template Guides are available in ODT format -(for OpenOffice or LibraOffice): +The Roller Install, User and Template Guides are available in ODT format (for OpenOffice or LibraOffice): -* https://github.com/apache/roller/tree/master/docs +* ## For more information Hit the Roller Confluence wiki: -* How to build and run Roller: https://cwiki.apache.org/confluence/x/EM4 -* How to contribute to Roller: https://cwiki.apache.org/confluence/x/2hsB -* How to make a release of Roller: https://cwiki.apache.org/confluence/x/gycB -* Other developer resources: https://cwiki.apache.org/confluence/x/D84 +* How to build and run Roller: +* How to contribute to Roller: +* How to make a release of Roller: +* Other developer resources: + -## Quick start +## Quick start: Running via Maven Assuming you've got a UNIX shell, Java, Maven and Git: @@ -45,10 +45,20 @@ Run Roller in Jetty with Derby database: $ cd app $ mvn jetty:run -Browse to http://localhost:8080/roller +Once Jetty is up and running browse to to try to Roller. + +## Quick start: running via Docker +Assuming you've got Docker, here's how you can run Roller for demo purposes. +Get the code: + + $ git clone https://github.com/apache/roller.git +Run Docker Compose to build and launch Roller along with a PostgreSQL database: + $ docker-compose up + +It will take a while to build the Docker image. Once it's done browse to to try Roller. diff --git a/app/pom.xml b/app/pom.xml index afc1db68dd..e382560ff4 100644 --- a/app/pom.xml +++ b/app/pom.xml @@ -33,7 +33,6 @@ limitations under the License. war - 4.0.1 2.2 1.2.0 @@ -181,20 +180,23 @@ limitations under the License. + org.ow2.asm asm - 7.1 + 7.0 + org.ow2.asm asm-commons - 7.1 + 7.0 + org.ow2.asm asm-tree - 7.1 + 7.0 @@ -221,6 +223,36 @@ limitations under the License. ${struts.version} + + org.webjars + bootstrap + 3.3.7 + + + + org.webjars + clipboard.js + 2.0.0 + + + + org.webjars + jquery + 3.3.1 + + + + org.webjars + jquery-ui + 1.12.1 + + + + org.webjars.bower + summernote + 0.8.11 + + org.apache.lucene lucene-analyzers-common @@ -393,6 +425,12 @@ limitations under the License. runtime + + com.jgeppert.struts2.bootstrap + struts2-bootstrap-plugin + 2.5.2 + + com.rometools rome-fetcher @@ -423,12 +461,6 @@ limitations under the License. ${webjars.version} - - org.webjars.npm - angular - ${angular.version} - - net.oauth.core oauth-provider @@ -436,12 +468,11 @@ limitations under the License. ${oauth-core.version} - - junit - junit + org.junit.jupiter + junit-jupiter-engine test @@ -630,7 +661,7 @@ limitations under the License. maven-surefire-plugin - 2.17 + 2.22.0 @@ -638,9 +669,6 @@ limitations under the License. ${basedir}/target - diff --git a/app/src/main/java/org/apache/roller/weblogger/TestUtils.java b/app/src/main/java/org/apache/roller/weblogger/TestUtils.java index b37ad72722..125d3f2222 100644 --- a/app/src/main/java/org/apache/roller/weblogger/TestUtils.java +++ b/app/src/main/java/org/apache/roller/weblogger/TestUtils.java @@ -412,8 +412,7 @@ public static WeblogEntry setupWeblogEntry(String anchor, public static void teardownWeblogEntry(String id) throws Exception { // lookup the entry - WeblogEntryManager mgr = WebloggerFactory.getWeblogger() - .getWeblogEntryManager(); + WeblogEntryManager mgr = WebloggerFactory.getWeblogger().getWeblogEntryManager(); WeblogEntry entry = mgr.getWeblogEntry(id); // remove the entry diff --git a/app/src/main/java/org/apache/roller/weblogger/business/MediaFileManager.java b/app/src/main/java/org/apache/roller/weblogger/business/MediaFileManager.java index 71a7bcd8a7..e345dddfad 100644 --- a/app/src/main/java/org/apache/roller/weblogger/business/MediaFileManager.java +++ b/app/src/main/java/org/apache/roller/weblogger/business/MediaFileManager.java @@ -52,6 +52,13 @@ public interface MediaFileManager { void createMediaFile(Weblog weblog, MediaFile mediaFile, RollerMessages errors) throws WebloggerException; + /** + * Create theme media file. + * Same as createMediaFile() except no checks are done for uploads disabled, etc. + */ + void createThemeMediaFile(Weblog weblog, MediaFile mediaFile, + RollerMessages errors) throws WebloggerException; + /** * Update metadata for a media file */ diff --git a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAMediaFileManagerImpl.java b/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAMediaFileManagerImpl.java index ab3dc7ba00..4ebc0463d7 100644 --- a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAMediaFileManagerImpl.java +++ b/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAMediaFileManagerImpl.java @@ -221,6 +221,27 @@ public void createMediaFile(Weblog weblog, MediaFile mediaFile, } } + public void createThemeMediaFile(Weblog weblog, MediaFile mediaFile, + RollerMessages errors) throws WebloggerException { + + FileContentManager cmgr = WebloggerFactory.getWeblogger().getFileContentManager(); + strategy.store(mediaFile); + + // Refresh associated parent for changes + roller.flush(); + strategy.refresh(mediaFile.getDirectory()); + + // update weblog last modified date. date updated by saveWeblog() + roller.getWeblogManager().saveWeblog(weblog); + + cmgr.saveFileContent(weblog, mediaFile.getId(), + mediaFile.getInputStream()); + + if (mediaFile.isImageFile()) { + updateThumbnail(mediaFile); + } + } + private void updateThumbnail(MediaFile mediaFile) { try { FileContentManager cmgr = WebloggerFactory.getWeblogger() diff --git a/app/src/main/java/org/apache/roller/weblogger/business/themes/SharedThemeFromDir.java b/app/src/main/java/org/apache/roller/weblogger/business/themes/SharedThemeFromDir.java index 061f17bab7..cc872d19a7 100644 --- a/app/src/main/java/org/apache/roller/weblogger/business/themes/SharedThemeFromDir.java +++ b/app/src/main/java/org/apache/roller/weblogger/business/themes/SharedThemeFromDir.java @@ -194,8 +194,7 @@ private void loadThemeFromDisk() throws ThemeInitializationException { setEnabled(true); // load resource representing preview image - File previewFile = new File(this.themeDir + File.separator - + themeMetadata.getPreviewImage()); + File previewFile = new File(this.themeDir + File.separator + themeMetadata.getPreviewImage()); if (!previewFile.exists() || !previewFile.canRead()) { log.warn("Couldn't read theme [" + this.getName() + "] preview image file [" diff --git a/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeManagerImpl.java b/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeManagerImpl.java index ed5f6a9a12..a90ec10689 100644 --- a/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeManagerImpl.java +++ b/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeManagerImpl.java @@ -157,8 +157,7 @@ public WeblogTheme getTheme(Weblog weblog) throws WebloggerException { // otherwise we are returning a WeblogSharedTheme } else { - SharedTheme staticTheme = (SharedTheme) this.themes.get(weblog - .getEditorTheme()); + SharedTheme staticTheme = (SharedTheme) this.themes.get(weblog.getEditorTheme()); if (staticTheme != null) { weblogTheme = new WeblogSharedTheme(weblog, staticTheme); } else { @@ -317,19 +316,15 @@ public void importTheme(Weblog weblog, SharedTheme theme, boolean skipStylesheet justName = resourcePath; } else { - justPath = resourcePath.substring(0, - resourcePath.lastIndexOf('/')); + justPath = resourcePath.substring(0, resourcePath.lastIndexOf('/')); if (!justPath.startsWith("/")) { justPath = "/" + justPath; } - justName = resourcePath.substring(resourcePath - .lastIndexOf('/') + 1); - mdir = fileMgr.getMediaFileDirectoryByName(weblog, - justPath); + justName = resourcePath.substring(resourcePath.lastIndexOf('/') + 1); + mdir = fileMgr.getMediaFileDirectoryByName(weblog, justPath); if (mdir == null) { log.debug(" Creating directory: " + justPath); - mdir = fileMgr.createMediaFileDirectory(weblog, - justPath); + mdir = fileMgr.createMediaFileDirectory(weblog, justPath); roller.flush(); } } @@ -354,7 +349,7 @@ public void importTheme(Weblog weblog, SharedTheme theme, boolean skipStylesheet log.debug(" Saving file: " + justName); log.debug(" Saving in directory = " + mf.getDirectory()); RollerMessages errors = new RollerMessages(); - fileMgr.createMediaFile(weblog, mf, errors); + fileMgr.createThemeMediaFile(weblog, mf, errors); try { resource.getInputStream().close(); } catch (IOException ex) { @@ -398,8 +393,7 @@ public boolean accept(File dir, String name) { // now go through each theme and load it into a Theme object for (String themeName : themenames) { try { - SharedTheme theme = new SharedThemeFromDir(this.themeDir - + File.separator + themeName); + SharedTheme theme = new SharedThemeFromDir(this.themeDir + File.separator + themeName); themeMap.put(theme.getId(), theme); log.info("Loaded theme '" + themeName + "'"); } catch (Exception unexpected) { diff --git a/app/src/main/java/org/apache/roller/weblogger/config/runtime/ConfigDef.java b/app/src/main/java/org/apache/roller/weblogger/config/runtime/ConfigDef.java index 7a19408986..f7b583df3d 100644 --- a/app/src/main/java/org/apache/roller/weblogger/config/runtime/ConfigDef.java +++ b/app/src/main/java/org/apache/roller/weblogger/config/runtime/ConfigDef.java @@ -15,27 +15,27 @@ * copyright in this work, please see the NOTICE file in the top level * directory of this distribution. */ -/* - * ConfigDef.java - * - * Created on June 4, 2005, 1:10 PM - */ - package org.apache.roller.weblogger.config.runtime; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; + /** * Represents a logic grouping of runtime configuration properties. * Each ConfigDef may contain 0 or more DisplayGroups. * + * Created on June 4, 2005, 1:10 PM * @author Allen Gilliland */ public class ConfigDef { private List displayGroups = null; private String name = null; + + Map propertyDefs = null; public ConfigDef() { @@ -53,8 +53,8 @@ public boolean addDisplayGroup(DisplayGroup group) { public boolean removeDisplayGroup(DisplayGroup group) { return this.displayGroups.remove(group); } - - + + public String toString() { return name; } @@ -74,5 +74,16 @@ public String getName() { public void setName(String name) { this.name = name; } - + + public PropertyDef getPropertyDef( String name ) { + if ( propertyDefs == null ) { + propertyDefs = new HashMap<>(); + for (DisplayGroup displayGroup : getDisplayGroups()) { + for (PropertyDef propertyDef : displayGroup.getPropertyDefs()) { + propertyDefs.put( propertyDef.getName(), propertyDef ); + } + } + } + return propertyDefs.get( name ); + } } diff --git a/app/src/main/java/org/apache/roller/weblogger/config/runtime/PropertyDef.java b/app/src/main/java/org/apache/roller/weblogger/config/runtime/PropertyDef.java index 636d754536..032bd1527e 100644 --- a/app/src/main/java/org/apache/roller/weblogger/config/runtime/PropertyDef.java +++ b/app/src/main/java/org/apache/roller/weblogger/config/runtime/PropertyDef.java @@ -52,11 +52,15 @@ public PropertyDef() {} public String toString() { return "["+name+","+key+","+type+","+defaultValue+","+rows+","+cols+"]"; } - + public String getName() { return name; } + public String getNameWithUnderbars() { + return name.replace(".", "_"); + } + public void setName(String name) { this.name = name; } diff --git a/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetConfig.java b/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetConfig.java index afa97cf5ad..d110e694f0 100644 --- a/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetConfig.java +++ b/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetConfig.java @@ -18,9 +18,6 @@ package org.apache.roller.weblogger.planet.ui; -import java.util.Collections; -import java.util.List; -import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.roller.RollerException; @@ -33,9 +30,12 @@ import org.apache.roller.weblogger.config.runtime.RuntimeConfigDefs; import org.apache.roller.weblogger.pojos.GlobalPermission; import org.apache.roller.weblogger.pojos.RuntimeConfigProperty; -import org.apache.struts2.convention.annotation.AllowedMethods; import org.apache.struts2.interceptor.ParameterAware; +import java.util.Collections; +import java.util.List; +import java.util.Map; + /** * Planet Config Action. diff --git a/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroupSubs.java b/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroupSubs.java new file mode 100644 index 0000000000..26586d0f15 --- /dev/null +++ b/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroupSubs.java @@ -0,0 +1,343 @@ +/* + * Copyright 2005 Sun Microsystems, Inc. + * + * Licensed 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.planet.ui; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.roller.RollerException; +import org.apache.roller.planet.business.PlanetManager; +import org.apache.roller.planet.business.fetcher.FeedFetcher; +import org.apache.roller.planet.business.fetcher.FetcherException; +import org.apache.roller.planet.pojos.Planet; +import org.apache.roller.planet.pojos.PlanetGroup; +import org.apache.roller.planet.pojos.Subscription; +import org.apache.roller.weblogger.business.WebloggerFactory; +import org.apache.roller.weblogger.pojos.GlobalPermission; +import org.apache.struts2.interceptor.ServletRequestAware; + +import javax.servlet.http.HttpServletRequest; +import java.util.*; + + +/** + * Manage planet group subscriptions, default group is "all". + */ +// TODO: make this work @AllowedMethods({"execute","saveSubscription","saveGroup","deleteSubscription"}) +public class PlanetGroupSubs extends PlanetUIAction implements ServletRequestAware { + + private static final Log log = LogFactory.getLog(PlanetGroupSubs.class); + + // the planet group we are working in + private PlanetGroup group = null; + + // the subscription to deal with + private String subUrl = null; + + private Boolean createNew = null; + + public PlanetGroupSubs() { + this.actionName = "planetGroupSubs"; + this.desiredMenu = "admin"; + } + + + @Override + public List requiredGlobalPermissionActions() { + return Collections.singletonList(GlobalPermission.ADMIN); + } + + @Override + public boolean isWeblogRequired() { + return false; + } + + + @Override + public void setServletRequest(HttpServletRequest request) { + if (request.getParameter("createNew") != null) { + group = new PlanetGroup(); + } else { + group = getGroupFromRequest(request, getPlanet()); + } + } + + + static PlanetGroup getGroupFromRequest(HttpServletRequest request, Planet planet) { + PlanetManager pmgr = WebloggerFactory.getWeblogger().getPlanetManager(); + PlanetGroup planetGroup = null; + String action = null; + try { + if (request.getParameter("group.id") != null) { + String groupId = request.getParameter("group.id"); + action = "looking up planet group by id: " + groupId; + planetGroup = pmgr.getGroupById(groupId); + + } else if (request.getParameter("group.handle") != null) { + String groupHandle = request.getParameter("group.handle"); + action = "looking up planet group by handle: " + groupHandle; + planetGroup = pmgr.getGroup(planet, groupHandle); + + } else { + action = "getting default group"; + planetGroup = pmgr.getGroup(planet, "all"); + } + } catch (Exception ex) { + log.error("Error " + action, ex); + } + return planetGroup; + } + + /** + * Populate page model and forward to subscription page + */ + public String execute() { + return LIST; + } + + /** + * Save group. + */ + public String saveGroup() { + + validateGroup(); + + if (!hasActionErrors()) { + try { + PlanetManager planetManager = WebloggerFactory.getWeblogger().getPlanetManager(); + + PlanetGroup existingGroup = planetManager.getGroup(getPlanet(), getGroup().getHandle()); + + if (existingGroup == null) { + log.debug("Adding New Group: " + getGroup().getHandle()); + planetManager.saveNewPlanetGroup(getPlanet(), getGroup()); + + } else { + log.debug("Updating Existing Group: " + existingGroup.getHandle()); + existingGroup.setTitle( getGroup().getTitle() ); + existingGroup.setHandle( getGroup().getHandle() ); + planetManager.saveGroup(existingGroup); + } + + WebloggerFactory.getWeblogger().flush(); + addMessage("planetGroups.success.saved"); + + } catch (Exception ex) { + log.error("Error saving planet group", ex); + addError("planetGroups.error.saved"); + } + } + + return LIST; + } + + /** + * Validate posted group + */ + private void validateGroup() { + + if (StringUtils.isEmpty(getGroup().getTitle())) { + addError("planetGroups.error.title"); + } + + if (StringUtils.isEmpty(getGroup().getHandle())) { + addError("planetGroups.error.handle"); + } + + if (getGroup().getHandle() != null && "all".equals(getGroup().getHandle())) { + addError("planetGroups.error.nameReserved"); + } + + // make sure duplicate group handles are prevented + } + + + /** + * Save subscription, add to current group + */ + public String saveSubscription() { + + valudateNewSub(); + + if (!hasActionErrors()) { + try { + PlanetManager pmgr = WebloggerFactory.getWeblogger().getPlanetManager(); + + // check if this subscription already exists before adding it + Subscription sub = pmgr.getSubscription(getSubUrl()); + if (sub == null) { + log.debug("Adding New Subscription - " + getSubUrl()); + + // sub doesn't exist yet, so we need to fetch it + FeedFetcher fetcher = WebloggerFactory.getWeblogger().getFeedFetcher(); + sub = fetcher.fetchSubscription(getSubUrl()); + + // save new sub + pmgr.saveSubscription(sub); + + } else { + // Subscription already exists + log.debug("Adding Existing Subscription - " + getSubUrl()); + } + + // add the sub to the group + group.getSubscriptions().add(sub); + sub.getGroups().add(group); + pmgr.saveGroup(group); + WebloggerFactory.getWeblogger().flush(); + + // clear field after success + setSubUrl(null); + + addMessage("planetSubscription.success.saved"); + + } catch (FetcherException ex) { + addError("planetGroupSubs.error.fetchingFeed", ex.getRootCauseMessage()); + + } catch (RollerException ex) { + log.error("Unexpected error saving subscription", ex); + addError("planetGroupSubs.error.duringSave", ex.getRootCauseMessage()); + } + } + + return LIST; + } + + + /** + * Delete subscription, reset form + */ + public String deleteSubscription() { + + if (getSubUrl() != null) { + try { + + PlanetManager pmgr = WebloggerFactory.getWeblogger().getPlanetManager(); + + Subscription sub = pmgr.getSubscription(getSubUrl()); + + // remove sub from group + getGroup().getSubscriptions().remove(sub); + pmgr.saveGroup(getGroup()); + + // remove group from sub + sub.getGroups().remove(getGroup()); + pmgr.saveSubscription(sub); + + WebloggerFactory.getWeblogger().flush(); + + // clear field after success + setSubUrl(null); + + addMessage("planetSubscription.success.deleted"); + + } catch (RollerException ex) { + log.error("Error removing planet subscription", ex); + addError("planetSubscription.error.deleting"); + } + } + + return LIST; + } + + + /** + * Validate posted subscription + */ + private void valudateNewSub() { + + if (StringUtils.isEmpty(getSubUrl())) { + addError("planetSubscription.error.feedUrl"); + } + } + + + @Override + public String getPageTitle() { + if (pageTitle == null) { + if (getCreateNew()) { + pageTitle = getText("planetGroupSubs.custom.title.new"); + } else if (getGroup().getHandle().equals("all")) { + pageTitle = getText("planetGroupSubs.default.title"); + } else { + pageTitle = getText("planetGroupSubs.custom.title", new String[]{getGroup().getHandle()}); + } + } + return pageTitle; + } + + + public List getSubscriptions() { + + List subs = Collections.emptyList(); + if (getGroup() != null) { + Set subsSet = getGroup().getSubscriptions(); + + // iterate over list and build display list + subs = new ArrayList<>(); + for (Subscription sub : subsSet) { + // only include external subs for display + if (!sub.getFeedURL().startsWith("weblogger:")) { + subs.add(sub); + } + } + } + + return subs; + } + + public PlanetGroup getGroup() { + return group; + } + + public void setGroup(PlanetGroup group) { + this.group = group; + } + + public String getSubUrl() { + return subUrl; + } + + public void setSubUrl(String subUrl) { + this.subUrl = subUrl; + } + + public boolean getCreateNew() { + if (createNew == null) { + PlanetManager pmgr = WebloggerFactory.getWeblogger().getPlanetManager(); + PlanetGroup existingGroup = null; + try { + existingGroup = pmgr.getGroupById(group.getId()); + } catch (RollerException e) { + log.error("Error getting group by ID", e); + } + createNew = (existingGroup == null); + } + return createNew; + } + + public void setCreateNew(boolean createNew) { + // no op + } + + public String getGroupHandle() { + return group.getHandle(); + } + +} + + diff --git a/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroups.java b/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroups.java index f65c4805db..ee3dff9d7f 100644 --- a/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroups.java +++ b/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroups.java @@ -16,192 +16,96 @@ package org.apache.roller.weblogger.planet.ui; -import java.util.ArrayList; -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.planet.business.PlanetManager; -import org.apache.roller.planet.pojos.Planet; import org.apache.roller.planet.pojos.PlanetGroup; -import org.apache.roller.weblogger.business.Weblogger; import org.apache.roller.weblogger.business.WebloggerFactory; -import org.apache.struts2.convention.annotation.AllowedMethods; +import org.apache.struts2.interceptor.ServletRequestAware; + +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.List; /** * Manage planet groups. */ // TODO: make this work @AllowedMethods({"execute","save","delete"}) -public class PlanetGroups extends PlanetUIAction { - +public class PlanetGroups extends PlanetUIAction implements ServletRequestAware { + private static Log log = LogFactory.getLog(PlanetGroups.class); - - // a bean to manage submitted data - private PlanetGroupsBean bean = new PlanetGroupsBean(); - - // the planet group we are working on + + /** Group being deleted */ private PlanetGroup group = null; - - + public PlanetGroups() { this.actionName = "planetGroups"; this.desiredMenu = "admin"; this.pageTitle = "planetGroups.pagetitle"; } - - + @Override public boolean isWeblogRequired() { return false; } - - + @Override - public void myPrepare() { - - if(getPlanet() != null && getBean().getId() != null) { - try { - PlanetManager pmgr = WebloggerFactory.getWeblogger().getPlanetManager(); - setGroup(pmgr.getGroupById(getBean().getId())); - } catch(Exception ex) { - log.error("Error looking up planet group - " + getBean().getId(), ex); - } - } + public void setServletRequest(HttpServletRequest request) { + group = PlanetGroupSubs.getGroupFromRequest(request, getPlanet()); } - - /** + /** * Show planet groups page. */ public String execute() { - - // if we are loading an existing group then populate the bean - if(getGroup() != null) { - getBean().copyFrom(getGroup()); - } - return LIST; } - /** - * Save group. - */ - public String save() { - - myValidate(); - - if (!hasActionErrors()) { - try { - PlanetManager planetManager = WebloggerFactory.getWeblogger().getPlanetManager(); - - Planet planet = getPlanet(); - PlanetGroup planetGroup = getGroup(); - - if (planetGroup == null) { - planetGroup = new PlanetGroup(); - planetGroup.setPlanet(planet); - getBean().copyTo(planetGroup); - - log.debug("Adding New Group: " + planetGroup.getHandle()); - planetManager.saveNewPlanetGroup(getPlanet(), planetGroup); - - } else { - log.debug("Updating Existing Group: " + planetGroup.getHandle()); - getBean().copyTo(planetGroup); - planetManager.saveGroup(planetGroup); - } - - WebloggerFactory.getWeblogger().flush(); - addMessage("planetGroups.success.saved"); - - setGroup(null); - - } catch (Exception ex) { - log.error("Error saving planet group - " + getBean().getId(), ex); - addError("planetGroups.error.saved"); - } - } - - return LIST; - } - - - /** - * Delete group, reset form + * Delete group */ public String delete() { - - if(getGroup() != null) { + + if (getGroup() != null) { try { PlanetManager pmgr = WebloggerFactory.getWeblogger().getPlanetManager(); pmgr.deleteGroup(getGroup()); WebloggerFactory.getWeblogger().flush(); - + addMessage("planetSubscription.success.deleted"); setGroup(null); - } catch(Exception ex) { - log.error("Error deleting planet group - "+getBean().getId()); + } catch (Exception ex) { + log.error("Error deleting planet group - " + getGroup().getId()); addError("Error deleting planet group"); } } - + return LIST; } - - - /** - * Validate posted group - */ - private void myValidate() { - - if(StringUtils.isEmpty(getBean().getTitle())) { - addError("planetGroups.error.title"); - } - - if(StringUtils.isEmpty(getBean().getHandle())) { - addError("planetGroups.error.handle"); - } - - if(getBean().getHandle() != null && "all".equals(getBean().getHandle())) { - addError("planetGroups.error.nameReserved"); - } - - // make sure duplicate group handles are prevented + + public PlanetGroup getGroup() { + return group; } - - + + public void setGroup(PlanetGroup group) { + this.group = group; + } + public List getGroups() { List displayGroups = new ArrayList(); - + for (PlanetGroup planetGroup : getPlanet().getGroups()) { - // The "all" group is considered a special group and cannot be - // managed independently + // The "all" group is considered a special group and cannot be managed independently if (!planetGroup.getHandle().equals("all")) { displayGroups.add(planetGroup); } } return displayGroups; } - - - public PlanetGroupsBean getBean() { - return bean; - } - public void setBean(PlanetGroupsBean bean) { - this.bean = bean; - } - - public PlanetGroup getGroup() { - return group; - } - public void setGroup(PlanetGroup group) { - this.group = group; - } - + } diff --git a/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroupsBean.java b/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroupsBean.java deleted file mode 100644 index 10ef516fb6..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroupsBean.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.planet.ui; - -import org.apache.roller.planet.pojos.PlanetGroup; - - -/** - * A simple bean for managing the form data used by the PlanetGroups. - */ -public class PlanetGroupsBean { - - private String id = null; - private String title = null; - private String handle = null; - - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getHandle() { - return handle; - } - - public void setHandle(String handle) { - this.handle = handle; - } - - - public void copyTo(PlanetGroup dataHolder) { - - dataHolder.setTitle(getTitle()); - dataHolder.setHandle(getHandle()); - } - - - public void copyFrom(PlanetGroup dataHolder) { - - setId(dataHolder.getId()); - setTitle(dataHolder.getTitle()); - setHandle(dataHolder.getHandle()); - } - -} diff --git a/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetSubscriptions.java b/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetSubscriptions.java deleted file mode 100644 index 899eaa2747..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetSubscriptions.java +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Copyright 2005 Sun Microsystems, Inc. - * - * Licensed 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.planet.ui; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Set; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.roller.RollerException; -import org.apache.roller.planet.business.PlanetManager; -import org.apache.roller.planet.business.fetcher.FeedFetcher; -import org.apache.roller.planet.pojos.PlanetGroup; -import org.apache.roller.planet.pojos.Subscription; -import org.apache.roller.weblogger.business.WebloggerFactory; -import org.apache.roller.weblogger.pojos.GlobalPermission; -import org.apache.struts2.convention.annotation.AllowedMethods; - - -/** - * Manage planet group subscriptions, default group is "all". - */ -// TODO: make this work @AllowedMethods({"execute","save","delete"}) -public class PlanetSubscriptions extends PlanetUIAction { - - private static final Log LOGGER = LogFactory.getLog(PlanetSubscriptions.class); - - // id of the group we are working in - private String groupHandle = null; - - // the planet group we are working in - private PlanetGroup group = null; - - // the subscription to deal with - private String subUrl = null; - - - public PlanetSubscriptions() { - this.actionName = "planetSubscriptions"; - this.desiredMenu = "admin"; - this.pageTitle = "planetSubscriptions.title"; - } - - - @Override - public List requiredGlobalPermissionActions() { - return Collections.singletonList(GlobalPermission.ADMIN); - } - - @Override - public boolean isWeblogRequired() { - return false; - } - - - @Override - public void myPrepare() { - - PlanetManager pmgr = WebloggerFactory.getWeblogger().getPlanetManager(); - - // lookup group we are operating on, if none specified then use default - if (getGroupHandle() == null) { - setGroupHandle("all"); - } - - try { - setGroup(pmgr.getGroup(getPlanet(), getGroupHandle())); - } catch (RollerException ex) { - LOGGER.error("Error looking up planet group - " + getGroupHandle(), ex); - } - } - - - /** - * Populate page model and forward to subscription page - */ - public String execute() { - return LIST; - } - - - /** - * Save subscription, add to current group - */ - public String save() { - - myValidate(); - - if(!hasActionErrors()) { - try { - PlanetManager pmgr = WebloggerFactory.getWeblogger().getPlanetManager(); - - // check if this subscription already exists before adding it - Subscription sub = pmgr.getSubscription(getSubUrl()); - if(sub == null) { - LOGGER.debug("Adding New Subscription - " + getSubUrl()); - - // sub doesn't exist yet, so we need to fetch it - FeedFetcher fetcher = WebloggerFactory.getWeblogger().getFeedFetcher(); - sub = fetcher.fetchSubscription(getSubUrl()); - - // save new sub - pmgr.saveSubscription(sub); - } else { - LOGGER.debug("Adding Existing Subscription - " + getSubUrl()); - - // Subscription already exists - addMessage("planetSubscription.foundExisting", sub.getTitle()); - } - - // add the sub to the group - group.getSubscriptions().add(sub); - sub.getGroups().add(group); - pmgr.saveGroup(group); - - // flush changes - WebloggerFactory.getWeblogger().flush(); - - // clear field after success - setSubUrl(null); - - addMessage("planetSubscription.success.saved"); - - } catch (RollerException ex) { - LOGGER.error("Unexpected error saving subscription", ex); - addError("planetSubscriptions.error.duringSave", ex.getRootCauseMessage()); - } - } - - return LIST; - } - - - /** - * Delete subscription, reset form - */ - public String delete() { - - if(getSubUrl() != null) { - try { - - PlanetManager pmgr = WebloggerFactory.getWeblogger().getPlanetManager(); - - // remove subscription - Subscription sub = pmgr.getSubscription(getSubUrl()); - getGroup().getSubscriptions().remove(sub); - sub.getGroups().remove(getGroup()); - pmgr.saveGroup(getGroup()); - WebloggerFactory.getWeblogger().flush(); - - // clear field after success - setSubUrl(null); - - addMessage("planetSubscription.success.deleted"); - - } catch (RollerException ex) { - LOGGER.error("Error removing planet subscription", ex); - addError("planetSubscription.error.deleting"); - } - } - - return LIST; - } - - - /** - * Validate posted subscription - */ - private void myValidate() { - - if(StringUtils.isEmpty(getSubUrl())) { - addError("planetSubscription.error.feedUrl"); - } - } - - - public List getSubscriptions() { - - List subs = Collections.emptyList(); - if(getGroup() != null) { - Set subsSet = getGroup().getSubscriptions(); - - // iterate over list and build display list - subs = new ArrayList(); - for (Subscription sub : subsSet) { - // only include external subs for display - if(!sub.getFeedURL().startsWith("weblogger:")) { - subs.add(sub); - } - } - } - - return subs; - } - - - public String getGroupHandle() { - return groupHandle; - } - - public void setGroupHandle(String groupHandle) { - this.groupHandle = groupHandle; - } - - public PlanetGroup getGroup() { - return group; - } - - public void setGroup(PlanetGroup group) { - this.group = group; - } - - public String getSubUrl() { - return subUrl; - } - - public void setSubUrl(String subUrl) { - this.subUrl = subUrl; - } -} diff --git a/app/src/main/java/org/apache/roller/weblogger/pojos/ThemeTemplate.java b/app/src/main/java/org/apache/roller/weblogger/pojos/ThemeTemplate.java index 82121f3585..c4b8842f74 100644 --- a/app/src/main/java/org/apache/roller/weblogger/pojos/ThemeTemplate.java +++ b/app/src/main/java/org/apache/roller/weblogger/pojos/ThemeTemplate.java @@ -26,7 +26,7 @@ */ public interface ThemeTemplate extends Template { - public enum ComponentType { + enum ComponentType { WEBLOG("Weblog"), PERMALINK("Permalink"), SEARCH("Search"), diff --git a/app/src/main/java/org/apache/roller/weblogger/pojos/WeblogEntryComment.java b/app/src/main/java/org/apache/roller/weblogger/pojos/WeblogEntryComment.java index b28dc521da..1138ae98c3 100644 --- a/app/src/main/java/org/apache/roller/weblogger/pojos/WeblogEntryComment.java +++ b/app/src/main/java/org/apache/roller/weblogger/pojos/WeblogEntryComment.java @@ -50,7 +50,6 @@ public enum ApprovalStatus {APPROVED, DISAPPROVED, SPAM, PENDING} private String plugins = null; private String contentType = "text/plain"; - // associations private WeblogEntry weblogEntry = null; @@ -292,6 +291,10 @@ public Boolean getPending() { public Boolean getApproved() { return ApprovalStatus.APPROVED.equals(getStatus()); } + + public String getEmptyString() { + return ""; + } /** diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/XinhaEditor.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/Summernote.java similarity index 86% rename from app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/XinhaEditor.java rename to app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/Summernote.java index 4d8d8c89e1..cfeb4cb0b0 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/XinhaEditor.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/Summernote.java @@ -18,14 +18,13 @@ package org.apache.roller.weblogger.ui.core.plugins; - /** - * A rich text WYSIWYG editor using Xinha. + * Summernote rich text editor */ -public class XinhaEditor implements WeblogEntryEditor { - - - public XinhaEditor() {} +public class Summernote implements WeblogEntryEditor { + + + public Summernote() {} public String getId() { @@ -33,7 +32,7 @@ public String getId() { } public String getName() { - return "editor.xinha.name"; + return "editor.summernote.name"; } public String getJspPage() { diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/UIPluginManagerImpl.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/UIPluginManagerImpl.java index 6b16009268..0cff8ecba8 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/UIPluginManagerImpl.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/UIPluginManagerImpl.java @@ -39,7 +39,7 @@ public final class UIPluginManagerImpl implements UIPluginManager { private static UIPluginManagerImpl instance = null; // list of configured WeblogEntryEditor classes - Map editors = new LinkedHashMap(); + private Map editors = new LinkedHashMap(); // the default WeblogEntryEditor WeblogEntryEditor defaultEditor = null; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/util/menu/Menu.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/util/menu/Menu.java index 8e9804ead7..dfa330deb5 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/util/menu/Menu.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/util/menu/Menu.java @@ -27,10 +27,10 @@ */ public class Menu { - private List tabs = new ArrayList(); + private List tabs = new ArrayList<>(); - public void addTab(MenuTab tab) { + void addTab(MenuTab tab) { this.tabs.add(tab); } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/util/menu/MenuHelper.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/util/menu/MenuHelper.java index fff06ddb00..e416bf5f9a 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/util/menu/MenuHelper.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/util/menu/MenuHelper.java @@ -67,17 +67,13 @@ private MenuHelper() { // parse menus and cache so we can efficiently reuse them String menu = "editor"; - ParsedMenu editorMenu = unmarshall( - menu, - MenuHelper.class - .getResourceAsStream("/org/apache/roller/weblogger/ui/struts2/editor/editor-menu.xml")); + ParsedMenu editorMenu = unmarshall( menu, + MenuHelper.class.getResourceAsStream("/org/apache/roller/weblogger/ui/struts2/editor/editor-menu.xml")); menus.put(menu, editorMenu); menu = "admin"; - ParsedMenu adminMenu = unmarshall( - menu, - MenuHelper.class - .getResourceAsStream("/org/apache/roller/weblogger/ui/struts2/admin/admin-menu.xml")); + ParsedMenu adminMenu = unmarshall( menu, + MenuHelper.class.getResourceAsStream("/org/apache/roller/weblogger/ui/struts2/admin/admin-menu.xml")); menus.put(menu, adminMenu); } catch (Exception ex) { @@ -112,8 +108,7 @@ public static Menu getMenu(String menuId, String currentAction, User user, ParsedMenu menuConfig = menus.get(menuId); if (menuConfig != null) { try { - menu = buildMenu(menuId, menuConfig, currentAction, user, - weblog); + menu = buildMenu(menuId, menuConfig, currentAction, user, weblog); } catch (WebloggerException ex) { log.error("ERROR: fethcing user roles", ex); } @@ -167,16 +162,14 @@ private static Menu buildMenu(String menuId, ParsedMenu menuConfig, if (configTab.getEnabledProperty() != null) { includeTab = getBooleanProperty(configTab.getEnabledProperty()); } else if (configTab.getDisabledProperty() != null) { - includeTab = !getBooleanProperty(configTab - .getDisabledProperty()); + includeTab = !getBooleanProperty(configTab.getDisabledProperty()); } // user roles check if (includeTab && configTab.getGlobalPermissionActions() != null && !configTab.getGlobalPermissionActions().isEmpty()) { try { - GlobalPermission perm = new GlobalPermission( - configTab.getGlobalPermissionActions()); + GlobalPermission perm = new GlobalPermission( configTab.getGlobalPermissionActions()); if (!umgr.checkPermission(perm, user)) { includeTab = false; } @@ -189,8 +182,7 @@ private static Menu buildMenu(String menuId, ParsedMenu menuConfig, // weblog permissions check if (includeTab && configTab.getWeblogPermissionActions() != null && !configTab.getWeblogPermissionActions().isEmpty()) { - WeblogPermission perm = new WeblogPermission(weblog, - configTab.getWeblogPermissionActions()); + WeblogPermission perm = new WeblogPermission(weblog, configTab.getWeblogPermissionActions()); includeTab = umgr.checkPermission(perm, user); } @@ -211,18 +203,15 @@ private static Menu buildMenu(String menuId, ParsedMenu menuConfig, boolean includeItem = true; if (configTabItem.getEnabledProperty() != null) { - includeItem = getBooleanProperty(configTabItem - .getEnabledProperty()); + includeItem = getBooleanProperty(configTabItem.getEnabledProperty()); } else if (configTabItem.getDisabledProperty() != null) { - includeItem = !getBooleanProperty(configTabItem - .getDisabledProperty()); + includeItem = !getBooleanProperty(configTabItem.getDisabledProperty()); } // user roles check if (includeItem && configTabItem.getGlobalPermissionActions() != null - && !configTabItem.getGlobalPermissionActions() - .isEmpty()) { + && !configTabItem.getGlobalPermissionActions() .isEmpty()) { GlobalPermission perm = new GlobalPermission( configTabItem.getGlobalPermissionActions()); if (!umgr.checkPermission(perm, user)) { @@ -233,10 +222,8 @@ private static Menu buildMenu(String menuId, ParsedMenu menuConfig, // weblog permissions check if (includeItem && configTabItem.getWeblogPermissionActions() != null - && !configTabItem.getWeblogPermissionActions() - .isEmpty()) { - WeblogPermission perm = new WeblogPermission(weblog, - configTabItem.getWeblogPermissionActions()); + && !configTabItem.getWeblogPermissionActions().isEmpty()) { + WeblogPermission perm = new WeblogPermission(weblog, configTabItem.getWeblogPermissionActions()); includeItem = umgr.checkPermission(perm, user); } @@ -461,8 +448,7 @@ private static ParsedTabItem elementToParsedTabItem(Element element) { element.getAttributeValue("globalPerms"), ",")); } tabItem.setEnabledProperty(element.getAttributeValue("enabledProperty")); - tabItem.setDisabledProperty(element - .getAttributeValue("disabledProperty")); + tabItem.setDisabledProperty(element.getAttributeValue("disabledProperty")); return tabItem; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/CreateUserBean.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/CreateUserBean.java index 29df34834c..5a130db0fd 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/CreateUserBean.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/CreateUserBean.java @@ -18,7 +18,10 @@ package org.apache.roller.weblogger.ui.struts2.admin; +import java.util.ArrayList; import java.util.Collections; +import java.util.List; + import org.apache.roller.weblogger.WebloggerException; import org.apache.roller.weblogger.business.WebloggerFactory; import org.apache.roller.weblogger.pojos.GlobalPermission; @@ -42,8 +45,16 @@ public class CreateUserBean { private Boolean enabled = Boolean.TRUE; private String activationCode = null; private boolean administrator = false; - - + private List list = new ArrayList<>(); + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + public String getId() { return id; } @@ -140,7 +151,6 @@ public void setAdministrator(boolean administrator) { this.administrator = administrator; } - public void copyTo(User dataHolder) { dataHolder.setScreenName(this.screenName); diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/GlobalConfig.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/GlobalConfig.java index 0ee3641a57..1efcd8aaa2 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/GlobalConfig.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/GlobalConfig.java @@ -18,11 +18,9 @@ package org.apache.roller.weblogger.ui.struts2.admin; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; import javax.servlet.http.HttpServletRequest; + import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -34,12 +32,13 @@ import org.apache.roller.weblogger.business.plugins.comment.WeblogEntryCommentPlugin; import org.apache.roller.weblogger.config.WebloggerRuntimeConfig; import org.apache.roller.weblogger.config.runtime.ConfigDef; +import org.apache.roller.weblogger.config.runtime.PropertyDef; import org.apache.roller.weblogger.config.runtime.RuntimeConfigDefs; import org.apache.roller.weblogger.pojos.GlobalPermission; import org.apache.roller.weblogger.pojos.RuntimeConfigProperty; import org.apache.roller.weblogger.pojos.Weblog; import org.apache.roller.weblogger.ui.struts2.util.UIAction; -import org.apache.struts2.convention.annotation.AllowedMethods; +import org.apache.roller.weblogger.util.Utilities; import org.apache.struts2.interceptor.ParameterAware; import org.apache.struts2.interceptor.ServletRequestAware; @@ -49,21 +48,21 @@ */ // TODO: make this work @AllowedMethods({"execute","save"}) public class GlobalConfig extends UIAction implements ParameterAware, ServletRequestAware { - + private static Log log = LogFactory.getLog(GlobalConfig.class); - + // the request parameters private Map params = Collections.emptyMap(); - + // map of config properties private Map properties = Collections.emptyMap(); - + // the runtime config def used to populate the display private ConfigDef globalConfigDef = null; - + // list of comment plugins private List pluginsList = Collections.emptyList(); - + // comment plugins that are enabled. this is what the html form submits to private String[] commentPlugins = new String[0]; @@ -71,28 +70,30 @@ public class GlobalConfig extends UIAction implements ParameterAware, ServletReq // GET on the GlobalConfig!save URL and thus sets all checkboxes to false private String httpMethod = "GET"; + private ResourceBundle bundle = ResourceBundle.getBundle("ApplicationResources"); + // weblogs for frontpage blog chooser private Collection weblogs; - + public GlobalConfig() { this.actionName = "globalConfig"; this.desiredMenu = "admin"; this.pageTitle = "configForm.title"; } - - + + @Override public boolean isWeblogRequired() { return false; } - + @Override public List requiredGlobalPermissionActions() { return Collections.singletonList(GlobalPermission.ADMIN); } - - + + /** * Prepare action by loading runtime properties map. */ @@ -106,9 +107,9 @@ public void myPrepare() { log.error("Error getting runtime properties map", ex); addError("Unexpected error accessing Roller properties"); } - + try { - WeblogManager mgr = WebloggerFactory.getWeblogger().getWeblogManager(); + WeblogManager mgr = WebloggerFactory.getWeblogger().getWeblogManager(); setWeblogs(mgr.getWeblogs(true, null, null, null, 0, -1)); } catch (WebloggerException ex) { log.error("Error getting weblogs", ex); @@ -123,28 +124,28 @@ public void myPrepare() { setGlobalConfigDef(configDef); } } - + // load plugins list PluginManager pmgr = WebloggerFactory.getWeblogger().getPluginManager(); setPluginsList(pmgr.getCommentPlugins()); } - - + + /** * Display global properties editor form. */ @Override public String execute() { - + // setup array of configured plugins if (!StringUtils.isEmpty(WebloggerRuntimeConfig.getProperty("users.comments.plugins"))) { setCommentPlugins(StringUtils.split(WebloggerRuntimeConfig.getProperty("users.comments.plugins"), ",")); } - + return SUCCESS; } - - + + /** * Save global properties. */ @@ -152,98 +153,135 @@ public String save() { if (!"POST".equals(httpMethod)) { return ERROR; } - + // only set values for properties that are already defined RuntimeConfigProperty updProp; String incomingProp; for (String propName : getProperties().keySet()) { updProp = getProperties().get(propName); incomingProp = this.getParameter(updProp.getName()); - - log.debug("Checking property ["+propName+"]"); - log.debug("Request value is ["+incomingProp+"]"); - - // some special treatment for booleans - // this is a bit hacky since we are assuming that any prop - // with a value of "true" or "false" is meant to be a boolean - // it may not always be the case, but we should be okay for now - // null check below needed w/Oracle - if( updProp.getValue() != null - && ( updProp.getValue().equals("true") || updProp.getValue().equals("false") - || updProp.getValue().equals("on") || updProp.getValue().equals("off") - )) { - if (incomingProp != null && (incomingProp.equalsIgnoreCase("true") || incomingProp.equalsIgnoreCase("on"))) { - incomingProp = "true"; + + PropertyDef propertyDef = globalConfigDef.getPropertyDef( propName ); + if ( propertyDef == null) { + // we're only processing defined properties, i.e. ones shown in the UI + continue; + } + + if ( propertyDef.getType().equals("boolean") ) { + + try { + if (incomingProp == null) { + updProp.setValue("false"); + } else { + boolean value = Boolean.parseBoolean(incomingProp); + updProp.setValue(Boolean.toString(value)); + } + log.debug("Set boolean " + propName + " = " + incomingProp); + } catch ( Exception nfe ) { + String propDesc = bundle.getString( propertyDef.getKey() ); + addError("ConfigForm.invalidBooleanProperty", + Arrays.asList(propDesc, propName)); } - else { - incomingProp = "false"; + + } else if ( incomingProp != null && propertyDef.getType().equals("integer") ) { + + try { + Integer.parseInt(incomingProp); + updProp.setValue(incomingProp); + log.debug("Set integer " + propName + " = " + incomingProp); + } catch ( NumberFormatException nfe ) { + String propDesc = bundle.getString( propertyDef.getKey() ); + addError("ConfigForm.invalidIntegerProperty", + Arrays.asList(propDesc, propName)); } - } - // only work on props that were submitted with the request - if(incomingProp != null) { - log.debug("Setting new value for ["+propName+"]"); - - // NOTE: the old way had some locale sensitive way to do this?? - updProp.setValue(incomingProp.trim()); + } else if ( incomingProp != null && propertyDef.getType().equals("float") ) { + + try { + Float.parseFloat(incomingProp); + updProp.setValue(incomingProp); + log.debug("Set float " + propName + " = " + incomingProp); + } catch ( NumberFormatException nfe ) { + String propDesc = bundle.getString(propertyDef.getKey()); + addError("ConfigForm.invalidFloatProperty", + Arrays.asList(propDesc, propName)); + } + + } else if ( incomingProp != null ){ + updProp.setValue( incomingProp.trim() ); + log.debug("Set something " + propName + " = " + incomingProp); + + } else if ( propertyDef.getName().equals("users.comments.plugins") ) { + // not a problem + + } else { + addError("ConfigForm.invalidProperty", propName); } + + } + + if ( this.hasActionErrors() ) { + return ERROR; } - + // special handling for comment plugins String enabledPlugins = ""; - if(getCommentPlugins().length > 0) { + if (getCommentPlugins().length > 0) { enabledPlugins = StringUtils.join(getCommentPlugins(), ","); } RuntimeConfigProperty prop = getProperties().get("users.comments.plugins"); prop.setValue(enabledPlugins); - + try { // save 'em and flush PropertiesManager mgr = WebloggerFactory.getWeblogger().getPropertiesManager(); mgr.saveProperties(getProperties()); WebloggerFactory.getWeblogger().flush(); - + // notify user of our success addMessage("generic.changes.saved"); - + } catch (WebloggerException ex) { log.error("Error saving roller properties", ex); addError("generic.error.check.logs"); } - + return SUCCESS; } - - + + public void setParameters(Map parameters) { this.params = parameters; - + if (log.isDebugEnabled()) { log.debug("Parameter map:"); for (Map.Entry entry : parameters.entrySet()) { - log.debug(entry.getKey() + " = " + entry.getValue()); + log.debug(entry.getKey() + " = " + Utilities.stringArrayToString(entry.getValue(),",")); } } } - + // convenience method for getting a single parameter as a String private String getParameter(String key) { - + String[] p = this.params.get(key); - if(p != null && p.length > 0) { + if (p != null && p.length > 0) { return p[0]; } return null; } - - + + public Map getProperties() { return properties; } public void setProperties(Map properties) { this.properties = properties; + for (Map.Entry entry : properties.entrySet()) { + log.debug("Got " + entry.getKey() + " = " + entry.getValue().getValue()); + } } public ConfigDef getGlobalConfigDef() { @@ -253,7 +291,7 @@ public ConfigDef getGlobalConfigDef() { public void setGlobalConfigDef(ConfigDef globalConfigDef) { this.globalConfigDef = globalConfigDef; } - + public List getPluginsList() { return pluginsList; } @@ -261,7 +299,7 @@ public List getPluginsList() { public void setPluginsList(List pluginsList) { this.pluginsList = pluginsList; } - + public String[] getCommentPlugins() { return commentPlugins.clone(); } @@ -273,7 +311,7 @@ public void setCommentPlugins(String[] commentPlugins) { public void setServletRequest(HttpServletRequest req) { httpMethod = req.getMethod(); } - + public Collection getWeblogs() { return weblogs; } 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 index 1b5d13c312..fb7dd4b92d 100644 --- 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 @@ -77,17 +77,10 @@ public void myPrepare() { } } - public String execute() { - if (!isAdd()) { - getBean().copyFrom(pingTarget); - } - return INPUT; - } - /** * Save ping target. */ - public String save() { + public String execute() { myValidate(); if (!hasActionErrors()) { @@ -98,8 +91,7 @@ public String save() { pingTargetMgr.savePingTarget(pingTarget); WebloggerFactory.getWeblogger().flush(); - addMessage(isAdd() ? "pingTarget.created" : "pingTarget.updated", - pingTarget.getName()); + addMessage(isAdd() ? "pingTarget.created" : "pingTarget.updated", pingTarget.getName()); return SUCCESS; } catch (WebloggerException ex) { diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/UserAdmin.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/UserAdmin.java index 63613a5ef0..29b0e2416e 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/UserAdmin.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/UserAdmin.java @@ -18,6 +18,7 @@ package org.apache.roller.weblogger.ui.struts2.admin; +import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -33,7 +34,8 @@ */ // TODO: make this work @AllowedMethods({"execute"}) public class UserAdmin extends UIAction { - + private CreateUserBean bean = new CreateUserBean(); + public UserAdmin() { this.actionName = "userAdmin"; this.desiredMenu = "admin"; @@ -52,15 +54,24 @@ public boolean isWeblogRequired() { return false; } - /** - * Show user admin search page. - */ + // show user admin search page public String execute() { return SUCCESS; } + public String edit() { + return "edit"; + } + public String getAuthMethod() { return authMethod.name(); } + public CreateUserBean getBean() { + return bean; + } + + public void setBean(CreateUserBean bean) { + this.bean = bean; + } } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/UserEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/UserEdit.java index afdc522d94..73d5b012a9 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/UserEdit.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/UserEdit.java @@ -80,20 +80,25 @@ public boolean isWeblogRequired() { // prepare for action by loading user object we are modifying public void myPrepare() { + if (isAdd()) { - // create new User user = new User(); + } else { try { // load the user object we are modifying UserManager mgr = WebloggerFactory.getWeblogger().getUserManager(); - if (bean.getId() != null) { + if ( !StringUtils.isEmpty( getBean().getId() ) ) { + // action came from CreateUser or return from ModifyUser user = mgr.getUser(getBean().getId()); - } else if (bean.getUserName() != null) { + + } else if ( !StringUtils.isEmpty( bean.getUserName())) { + // action came from UserAdmin screen. user = mgr.getUserByUserName(getBean().getUserName(), null); } + } catch (Exception e) { log.error("Error looking up user (id/username) :" + bean.getId() + "/" + bean.getUserName(), e); } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/ajax/ThemeDataServlet.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/ajax/ThemeDataServlet.java index 3c674c9d52..97bff15c67 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/ajax/ThemeDataServlet.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/ajax/ThemeDataServlet.java @@ -57,8 +57,7 @@ public void doGet( themeId = request.getParameter("theme"); - ThemeManager themeMgr = WebloggerFactory.getWeblogger() - .getThemeManager(); + ThemeManager themeMgr = WebloggerFactory.getWeblogger().getThemeManager(); if (themeId == null) { themes = themeMgr.getEnabledThemesList(); } else { diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarkEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarkEdit.java index 852ec726ec..c3e56422b3 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarkEdit.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarkEdit.java @@ -97,15 +97,14 @@ public String execute() { public String save() { myValidate(); - if(!hasActionErrors()) { + if (!hasActionErrors()) { try { getBean().copyTo(bookmark); BookmarkManager bmgr = WebloggerFactory.getWeblogger().getBookmarkManager(); bmgr.saveBookmark(bookmark); WebloggerFactory.getWeblogger().flush(); CacheManager.invalidate(bookmark); - addMessage(isAdd() ? "bookmarkForm.created" : "bookmarkForm.updated", - getBookmark().getName()); + addMessage(isAdd() ? "bookmarkForm.created" : "bookmarkForm.updated", getBookmark().getName()); return SUCCESS; } catch(Exception ex) { @@ -149,4 +148,5 @@ public void setBean(BookmarkBean bean) { public WeblogBookmark getBookmark() { return bookmark; } + } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Bookmarks.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Bookmarks.java index f6950725fc..cc86b44509 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Bookmarks.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Bookmarks.java @@ -69,8 +69,7 @@ public Bookmarks() { public void myPrepare() { try { - BookmarkManager bmgr = WebloggerFactory.getWeblogger() - .getBookmarkManager(); + BookmarkManager bmgr = WebloggerFactory.getWeblogger().getBookmarkManager(); if (!StringUtils.isEmpty(getFolderId())) { setFolder(bmgr.getFolder(getFolderId())); } else { @@ -160,7 +159,13 @@ public String deleteFolder() { try { BookmarkManager bmgr = WebloggerFactory.getWeblogger().getBookmarkManager(); WeblogBookmarkFolder fd = bmgr.getFolder(getFolderId()); + if (fd != null) { + + if ( "default".equals( fd.getName() ) ) { + addError("Cannot delete default bookmark"); + return execute(); + } bmgr.removeFolder(fd); // flush changes @@ -173,6 +178,7 @@ public String deleteFolder() { setFolder(bmgr.getDefaultFolder(getActionWeblog())); setFolderId(getFolder().getId()); } + } catch (WebloggerException ex) { log.error("Error deleting folder", ex); } @@ -210,17 +216,16 @@ public String view() { public String move() { try { - BookmarkManager bmgr = WebloggerFactory.getWeblogger() - .getBookmarkManager(); + BookmarkManager bmgr = WebloggerFactory.getWeblogger().getBookmarkManager(); if (log.isDebugEnabled()) { - log.debug("Moving bookmarks to folder - " - + getTargetFolderId()); + log.debug("Moving bookmarks to folder - " + getTargetFolderId()); } // Move bookmarks to new parent folder. WeblogBookmarkFolder newFolder = bmgr.getFolder(getTargetFolderId()); String bookmarks[] = getSelectedBookmarks(); + if (null != bookmarks && bookmarks.length > 0) { for (int j = 0; j < bookmarks.length; j++) { WeblogBookmark bd = bmgr.getBookmark(bookmarks[j]); @@ -283,6 +288,9 @@ public WeblogBookmarkFolder getFolder() { public void setFolder(WeblogBookmarkFolder folder) { this.folder = folder; + if ( folder != null ) { + this.folderId = folder.getId(); + } } public String getViewFolderId() { diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/CategoryEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/CategoryEdit.java index 9d2c517632..17dc99a758 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/CategoryEdit.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/CategoryEdit.java @@ -30,7 +30,6 @@ import org.apache.roller.weblogger.pojos.WeblogPermission; import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.roller.weblogger.util.cache.CacheManager; -import org.apache.struts2.convention.annotation.AllowedMethods; import org.apache.struts2.interceptor.validation.SkipValidation; @@ -64,10 +63,12 @@ public List requiredWeblogPermissionActions() { public void myPrepare() { - if (StringUtils.isEmpty(bean.getId())) { + + if ( isAdd() ) { // Create and initialize new, not-yet-saved category category = new WeblogCategory(); category.setWeblog(getActionWeblog()); + } else { try { WeblogEntryManager wmgr = WebloggerFactory.getWeblogger().getWeblogEntryManager(); @@ -92,7 +93,7 @@ public String execute() { } private boolean isAdd() { - return actionName.equals("categoryAdd"); + return StringUtils.isEmpty( bean.getId() ); } /** @@ -134,10 +135,16 @@ public String save() { } public void myValidate() { - // make sure new name is not a duplicate of an existing category - if ((isAdd() || !category.getName().equals(bean.getName())) && - category.getWeblog().hasCategory(bean.getName())) { - addError("categoryForm.error.duplicateName", bean.getName()); + + if ( isAdd() ) { + if ( getActionWeblog().hasCategory( bean.getName() ) ) { + addError("categoryForm.error.duplicateName", bean.getName()); + } + } else { + WeblogCategory wc = getActionWeblog().getWeblogCategory(bean.getName()); + if ( wc != null && !wc.getId().equals( bean.getId() )) { + addError("categoryForm.error.duplicateName", bean.getName()); + } } } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Comments.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Comments.java index 10c663a132..3aee5dfc84 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Comments.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Comments.java @@ -105,14 +105,7 @@ public void loadComments() { setQueryEntry(wmgr.getWeblogEntry(getBean().getEntryId())); } - CommentSearchCriteria csc = new CommentSearchCriteria(); - csc.setWeblog(getActionWeblog()); - csc.setEntry(getQueryEntry()); - csc.setSearchText(getBean().getSearchString()); - csc.setStartDate(getBean().getStartDate()); - csc.setEndDate(getBean().getEndDate()); - csc.setStatus(getBean().getStatus()); - csc.setReverseChrono(true); + CommentSearchCriteria csc = getCommentSearchCriteria(); csc.setOffset(getBean().getPage() * COUNT); csc.setMaxResults(COUNT + 1); @@ -162,11 +155,8 @@ private String buildBaseUrl() { params.put("bean.approvedString", getBean().getApprovedString()); } - return WebloggerFactory - .getWeblogger() - .getUrlStrategy() - .getActionURL("comments", "/roller-ui/authoring", - getActionWeblog().getHandle(), params, false); + return WebloggerFactory.getWeblogger().getUrlStrategy() + .getActionURL("comments", "/roller-ui/authoring", getActionWeblog().getHandle(), params, false); } public String execute() { @@ -192,16 +182,9 @@ public String query() { getBean().loadCheckboxes(getPager().getItems()); try { - WeblogEntryManager wmgr = WebloggerFactory.getWeblogger() - .getWeblogEntryManager(); + WeblogEntryManager wmgr = WebloggerFactory.getWeblogger().getWeblogEntryManager(); - CommentSearchCriteria csc = new CommentSearchCriteria(); - csc.setWeblog(getActionWeblog()); - csc.setSearchText(getBean().getSearchString()); - csc.setStartDate(getBean().getStartDate()); - csc.setEndDate(getBean().getEndDate()); - csc.setStatus(getBean().getStatus()); - csc.setReverseChrono(true); + CommentSearchCriteria csc = getCommentSearchCriteria(); List allMatchingComments = wmgr.getComments(csc); if (allMatchingComments.size() > COUNT) { @@ -216,28 +199,33 @@ public String query() { return LIST; } + private CommentSearchCriteria getCommentSearchCriteria() { + CommentSearchCriteria commentSearchCriteria = new CommentSearchCriteria(); + commentSearchCriteria.setWeblog(getActionWeblog()); + commentSearchCriteria.setEntry(getQueryEntry()); + commentSearchCriteria.setSearchText(getBean().getSearchString()); + commentSearchCriteria.setStartDate(getBean().getStartDate()); + commentSearchCriteria.setEndDate(getBean().getEndDate()); + commentSearchCriteria.setStatus(getBean().getStatus()); + commentSearchCriteria.setReverseChrono(true); + return commentSearchCriteria; + } + + /** * Bulk delete all comments matching query criteria. */ public String delete() { try { - WeblogEntryManager wmgr = WebloggerFactory.getWeblogger() - .getWeblogEntryManager(); + WeblogEntryManager wmgr = WebloggerFactory.getWeblogger().getWeblogEntryManager(); // if search is enabled, we will need to re-index all entries with // comments that have been deleted, so build a list of those entries Set reindexEntries = new HashSet(); if (WebloggerConfig.getBooleanProperty("search.enabled")) { - CommentSearchCriteria csc = new CommentSearchCriteria(); - csc.setWeblog(getActionWeblog()); - csc.setEntry(getQueryEntry()); - csc.setSearchText(getBean().getSearchString()); - csc.setStartDate(getBean().getStartDate()); - csc.setEndDate(getBean().getEndDate()); - csc.setStatus(getBean().getStatus()); - csc.setReverseChrono(true); + CommentSearchCriteria csc = getCommentSearchCriteria(); List targetted = wmgr.getComments(csc); for (WeblogEntryComment comment : targetted) { @@ -251,8 +239,7 @@ public String delete() { // if we've got entries to reindex then do so if (!reindexEntries.isEmpty()) { - IndexManager imgr = WebloggerFactory.getWeblogger() - .getIndexManager(); + IndexManager imgr = WebloggerFactory.getWeblogger().getIndexManager(); for (WeblogEntry entry : reindexEntries) { imgr.addEntryReIndexOperation(entry); } @@ -280,8 +267,7 @@ public String delete() { public String update() { try { - WeblogEntryManager wmgr = WebloggerFactory.getWeblogger() - .getWeblogEntryManager(); + WeblogEntryManager wmgr = WebloggerFactory.getWeblogger().getWeblogEntryManager(); List flushList = new ArrayList(); @@ -310,8 +296,7 @@ public String update() { } // loop through IDs of all comments displayed on page - List approvedIds = Arrays.asList(getBean() - .getApprovedComments()); + List approvedIds = Arrays.asList(getBean().getApprovedComments()); List spamIds = Arrays.asList(getBean().getSpamComments()); log.debug(spamIds.size() + " comments marked as spam"); @@ -426,14 +411,10 @@ public List getCommentStatusOptions() { List opts = new ArrayList(); opts.add(new KeyValueObject("ALL", getText("generic.all"))); - opts.add(new KeyValueObject("ONLY_PENDING", - getText("commentManagement.onlyPending"))); - opts.add(new KeyValueObject("ONLY_APPROVED", - getText("commentManagement.onlyApproved"))); - opts.add(new KeyValueObject("ONLY_DISAPPROVED", - getText("commentManagement.onlyDisapproved"))); - opts.add(new KeyValueObject("ONLY_SPAM", - getText("commentManagement.onlySpam"))); + opts.add(new KeyValueObject("ONLY_PENDING", getText("commentManagement.onlyPending"))); + opts.add(new KeyValueObject("ONLY_APPROVED", getText("commentManagement.onlyApproved"))); + opts.add(new KeyValueObject("ONLY_DISAPPROVED", getText("commentManagement.onlyDisapproved"))); + opts.add(new KeyValueObject("ONLY_SPAM", getText("commentManagement.onlySpam"))); return opts; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/EntryBean.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/EntryBean.java index c58d6a7076..6e92898a0b 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/EntryBean.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/EntryBean.java @@ -189,6 +189,9 @@ public Integer getCommentDays() { public void setCommentDays(Integer commentDays) { this.commentDays = commentDays; + if (commentDays == -1) { + allowComments = false; + } } public int getCommentCount() { diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/FolderEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/FolderEdit.java index 141c1c2955..c3658c27ff 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/FolderEdit.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/FolderEdit.java @@ -27,16 +27,19 @@ import org.apache.roller.weblogger.pojos.WeblogBookmarkFolder; import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.roller.weblogger.util.cache.CacheManager; +import org.apache.struts2.interceptor.ServletResponseAware; import org.apache.struts2.convention.annotation.AllowedMethods; import org.apache.struts2.interceptor.validation.SkipValidation; +import javax.servlet.http.HttpServletResponse; + /** * Edit a new or existing folder. */ // TODO: make this work @AllowedMethods({"execute","save"}) -public class FolderEdit extends UIAction { - +public class FolderEdit extends UIAction implements ServletResponseAware { + private static Log log = LogFactory.getLog(FolderEdit.class); // bean for managing form data @@ -48,6 +51,9 @@ public class FolderEdit extends UIAction { // the folder we are adding or editing private WeblogBookmarkFolder folder = null; + private HttpServletResponse httpServletResponse; + + public FolderEdit() { this.desiredMenu = "editor"; } @@ -74,6 +80,11 @@ public void myPrepare() { } } + @Override + public void setServletResponse(HttpServletResponse httpServletResponse) { + this.httpServletResponse = httpServletResponse; + } + /** * Show folder edit page. */ @@ -114,6 +125,8 @@ public String save() { addMessage("folderForm.updated"); } + httpServletResponse.addHeader("folderId", folderId ); + return SUCCESS; } catch(Exception ex) { @@ -127,7 +140,7 @@ public String save() { public void myValidate() { // make sure new name is not a duplicate of an existing folder - if((isAdd() || !folder.getName().equals(getBean().getName()))) { + if ( isAdd() || !getBean().getName().equals(folder.getName()) ) { if (folder.getWeblog().hasBookmarkFolder(getBean().getName())) { addError("folderForm.error.duplicateName", getBean().getName()); } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileAdd.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileAdd.java index dc75df8215..d13247d8eb 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileAdd.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileAdd.java @@ -131,8 +131,7 @@ public String save() { if (!hasActionErrors()) { - MediaFileManager manager = WebloggerFactory.getWeblogger() - .getMediaFileManager(); + MediaFileManager manager = WebloggerFactory.getWeblogger().getMediaFileManager(); RollerMessages errors = new RollerMessages(); List uploaded = new ArrayList(); @@ -176,27 +175,22 @@ public String save() { mediaFile .setContentType(this.uploadedFilesContentType[i]); - // insome cases Struts2 is not able to guess the content + // in some cases Struts2 is not able to guess the content // type correctly and assigns the default, which is // octet-stream. So in cases where we see octet-stream // we double check and see if we can guess the content // type via the Java MIME type facilities. - mediaFile - .setContentType(this.uploadedFilesContentType[i]); + mediaFile.setContentType(this.uploadedFilesContentType[i]); if (mediaFile.getContentType() == null - || mediaFile.getContentType().endsWith( - "/octet-stream")) { + || mediaFile.getContentType().endsWith("/octet-stream")) { - String ctype = Utilities - .getContentTypeFromFileName(mediaFile - .getName()); + String ctype = Utilities.getContentTypeFromFileName(mediaFile.getName()); if (null != ctype) { mediaFile.setContentType(ctype); } } - manager.createMediaFile(getActionWeblog(), mediaFile, - errors); + manager.createMediaFile(getActionWeblog(), mediaFile, errors); WebloggerFactory.getWeblogger().flush(); if (mediaFile.isImageFile()) { diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileBase.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileBase.java index f0102f7aa2..38c4ef9edf 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileBase.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileBase.java @@ -135,7 +135,7 @@ protected void doDeleteSelected() { /** * Move selected media files to a directory. */ - protected void doMoveSelected() { + void doMoveSelected() { String[] fileIds = getSelectedMediaFiles(); String[] dirIds = getSelectedMediaFileDirectories(); try { @@ -175,16 +175,16 @@ protected void doMoveSelected() { /** * Refresh the list of directories. */ - protected void refreshAllDirectories() { + void refreshAllDirectories() { try { - MediaFileManager mgr = WebloggerFactory.getWeblogger() - .getMediaFileManager(); + MediaFileManager mgr = WebloggerFactory.getWeblogger().getMediaFileManager(); + List directories = mgr.getMediaFileDirectories(getActionWeblog()); - List sortedDirList = new ArrayList(); - sortedDirList.addAll(directories); - Collections.sort(sortedDirList, new MediaFileDirectoryComparator( - DirectoryComparatorType.NAME)); + List sortedDirList = new ArrayList<>(directories); + sortedDirList.sort(new MediaFileDirectoryComparator(DirectoryComparatorType.NAME)); + setAllDirectories(sortedDirList); + } catch (WebloggerException ex) { log.error("Error looking up media file directories", ex); } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileEdit.java index f6045d4449..810648ea05 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileEdit.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileEdit.java @@ -64,8 +64,7 @@ public MediaFileEdit() { public void myPrepare() { refreshAllDirectories(); try { - MediaFileManager mgr = WebloggerFactory.getWeblogger() - .getMediaFileManager(); + MediaFileManager mgr = WebloggerFactory.getWeblogger().getMediaFileManager(); if (!StringUtils.isEmpty(bean.getDirectoryId())) { setDirectory(mgr.getMediaFileDirectory(bean.getDirectoryId())); } @@ -79,10 +78,8 @@ public void myPrepare() { * Validates media file metadata to be updated. */ public void myValidate() { - MediaFile fileWithSameName = getDirectory().getMediaFile( - getBean().getName()); - if (fileWithSameName != null - && !fileWithSameName.getId().equals(getMediaFileId())) { + MediaFile fileWithSameName = getDirectory().getMediaFile(getBean().getName()); + if (fileWithSameName != null && !fileWithSameName.getId().equals(getMediaFileId())) { addError("MediaFile.error.duplicateName", getBean().getName()); } } @@ -94,8 +91,7 @@ public void myValidate() { */ @SkipValidation public String execute() { - MediaFileManager manager = WebloggerFactory.getWeblogger() - .getMediaFileManager(); + MediaFileManager manager = WebloggerFactory.getWeblogger().getMediaFileManager(); try { MediaFile mediaFile = manager.getMediaFile(getMediaFileId()); this.bean.copyFrom(mediaFile); @@ -119,8 +115,7 @@ public String execute() { public String save() { myValidate(); if (!hasActionErrors()) { - MediaFileManager manager = WebloggerFactory.getWeblogger() - .getMediaFileManager(); + MediaFileManager manager = WebloggerFactory.getWeblogger().getMediaFileManager(); try { MediaFile mediaFile = manager.getMediaFile(getMediaFileId()); bean.copyTo(mediaFile); diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileImageChooser.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileImageChooser.java index 4e9065464f..399d39ddbf 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileImageChooser.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileImageChooser.java @@ -60,6 +60,7 @@ public MediaFileImageChooser() { * Prepares view action */ public void myPrepare() { + refreshAllDirectories(); } @Override @@ -75,58 +76,44 @@ public List requiredWeblogPermissionActions() { */ @SkipValidation public String execute() { - MediaFileManager manager = WebloggerFactory.getWeblogger() - .getMediaFileManager(); + MediaFileManager manager = WebloggerFactory.getWeblogger().getMediaFileManager(); try { + MediaFileDirectory directory; if (this.directoryId != null) { directory = manager.getMediaFileDirectory(this.directoryId); } else if (this.directoryName != null) { - directory = manager.getMediaFileDirectoryByName( - getActionWeblog(), this.directoryName); + directory = manager.getMediaFileDirectoryByName(getActionWeblog(), this.directoryName); this.directoryId = directory.getId(); } else { - directory = manager - .getDefaultMediaFileDirectory(getActionWeblog()); + directory = manager.getDefaultMediaFileDirectory(getActionWeblog()); this.directoryId = directory.getId(); } - this.childFiles = new ArrayList(); - - for (MediaFile mf : directory.getMediaFiles()) { - this.childFiles.add(mf); - } - - Collections.sort(this.childFiles, new MediaFileComparator( - MediaFileComparatorType.NAME)); - + this.childFiles = new ArrayList<>(); + this.childFiles.addAll(directory.getMediaFiles()); + this.childFiles.sort(new MediaFileComparator( MediaFileComparatorType.NAME)); this.currentDirectory = directory; // List of available directories - List sortedDirList = new ArrayList(); - List directories = manager - .getMediaFileDirectories(getActionWeblog()); + List sortedDirList = new ArrayList<>(); + List directories = manager.getMediaFileDirectories(getActionWeblog()); for (MediaFileDirectory mediaFileDirectory : directories) { - if (!"default".equals(mediaFileDirectory.getName()) - && "default".equals(directory.getName()) - || !"default".equals(directory.getName())) { + if (!"default".equals(mediaFileDirectory.getName()) || !"default".equals(directory.getName())) { sortedDirList.add(mediaFileDirectory); } } - Collections.sort(sortedDirList, new MediaFileDirectoryComparator( - DirectoryComparatorType.NAME)); + sortedDirList.sort(new MediaFileDirectoryComparator( + DirectoryComparatorType.NAME)); setAllDirectories(sortedDirList); return SUCCESS; - } catch (FileIOException ex) { + } catch (Exception ex) { log.error("Error viewing media file directory ", ex); addError("MediaFile.error.view"); - } catch (Exception e) { - log.error("Error viewing media file directory ", e); - addError("MediaFile.error.view"); } return SUCCESS; } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileView.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileView.java index 62644c04ac..f6801f12b8 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileView.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileView.java @@ -194,8 +194,7 @@ public String fetchDirectoryContentLight() { */ @SkipValidation public String execute() { - MediaFileManager manager = WebloggerFactory.getWeblogger() - .getMediaFileManager(); + MediaFileManager manager = WebloggerFactory.getWeblogger().getMediaFileManager(); try { MediaFileDirectory directory; if (StringUtils.isNotEmpty(this.directoryId)) { @@ -206,8 +205,7 @@ public String execute() { getActionWeblog(), this.directoryName); } else { - directory = manager - .getDefaultMediaFileDirectory(getActionWeblog()); + directory = manager.getDefaultMediaFileDirectory(getActionWeblog()); } this.directoryId = directory.getId(); this.directoryName = directory.getName(); @@ -258,8 +256,7 @@ public String view() { .getMediaFileManager(); if (!StringUtils.isEmpty(viewDirectoryId)) { setDirectoryId(viewDirectoryId); - setCurrentDirectory(manager - .getMediaFileDirectory(viewDirectoryId)); + setCurrentDirectory(manager.getMediaFileDirectory(viewDirectoryId)); } } catch (WebloggerException ex) { log.error("Error looking up directory", ex); @@ -279,11 +276,9 @@ public String search() { if (valSuccess) { MediaFileFilter filter = new MediaFileFilter(); bean.copyTo(filter); - MediaFileManager manager = WebloggerFactory.getWeblogger() - .getMediaFileManager(); + MediaFileManager manager = WebloggerFactory.getWeblogger().getMediaFileManager(); try { - List rawResults = manager.searchMediaFiles( - getActionWeblog(), filter); + List rawResults = manager.searchMediaFiles(getActionWeblog(), filter); boolean hasMore = false; List results = new ArrayList(); results.addAll(rawResults); @@ -329,8 +324,7 @@ public String delete() { public String deleteFolder() { try { - MediaFileManager manager = WebloggerFactory.getWeblogger() - .getMediaFileManager(); + MediaFileManager manager = WebloggerFactory.getWeblogger().getMediaFileManager(); if (directoryId != null) { log.debug("Deleting media file folder - " + directoryId + " (" + directoryName + ")"); diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/StylesheetEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/StylesheetEdit.java index a206b0587f..ce7956a4af 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/StylesheetEdit.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/StylesheetEdit.java @@ -18,31 +18,27 @@ package org.apache.roller.weblogger.ui.struts2.editor; -import java.util.Date; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.roller.weblogger.WebloggerException; 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.business.themes.SharedTheme; import org.apache.roller.weblogger.business.themes.ThemeManager; -import org.apache.roller.weblogger.pojos.CustomTemplateRendition; +import org.apache.roller.weblogger.pojos.*; import org.apache.roller.weblogger.pojos.TemplateRendition.RenditionType; -import org.apache.roller.weblogger.pojos.TemplateRendition; -import org.apache.roller.weblogger.pojos.Theme; -import org.apache.roller.weblogger.pojos.ThemeTemplate; import org.apache.roller.weblogger.pojos.ThemeTemplate.ComponentType; -import org.apache.roller.weblogger.pojos.Weblog; -import org.apache.roller.weblogger.pojos.WeblogTemplate; -import org.apache.roller.weblogger.pojos.WeblogTheme; import org.apache.roller.weblogger.ui.struts2.util.UIAction; import org.apache.roller.weblogger.util.cache.CacheManager; import org.apache.struts2.convention.annotation.AllowedMethods; +import java.util.Date; + /** * Action which handles editing for a weblog stylesheet override template. */ -// TODO: make this work @AllowedMethods({"execute","move","delete","revert"}) +// TODO: make this work @AllowedMethods({"execute","copyStylesheet","delete","revert"}) public class StylesheetEdit extends UIAction { private static final long serialVersionUID = 4657591015852311907L; @@ -56,13 +52,8 @@ public class StylesheetEdit extends UIAction { private String contentsStandard = null; private String contentsMobile = null; - private boolean sharedTheme; - - // read by JSP to determine if user just deleted his shared theme customized stylesheet - private boolean sharedStylesheetDeleted; - - // Do we have a custom stylesheet already for a shared theme - private boolean sharedThemeCustomStylesheet = false; + // if shared theme, is a stylesheet supported? + private boolean sharedThemeStylesheet = false; public StylesheetEdit() { this.actionName = "stylesheetEdit"; @@ -72,91 +63,26 @@ public StylesheetEdit() { @Override public void myPrepare() { - sharedTheme = !WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme()); - sharedStylesheetDeleted = false; - ThemeTemplate stylesheet = null; - try { - stylesheet = getActionWeblog().getTheme().getStylesheet(); - } catch (WebloggerException ex) { - log.error("Error looking up stylesheet on weblog - " - + getActionWeblog().getHandle(), ex); - } + sharedThemeStylesheet = false; + + WeblogManager weblogManager = WebloggerFactory.getWeblogger().getWeblogManager(); + ThemeManager themeManager = WebloggerFactory.getWeblogger().getThemeManager(); - if (stylesheet != null) { - log.debug("custom stylesheet path is - " + stylesheet.getLink()); + if ( isSharedTheme() ) { try { - setTemplate(WebloggerFactory.getWeblogger().getWeblogManager() - .getTemplateByLink(getActionWeblog(), stylesheet.getLink())); - - if (getTemplate() == null) { - log.debug("custom stylesheet not found, creating it"); - - // template doesn't exist yet, so create it - WeblogTemplate stylesheetTmpl = new WeblogTemplate(); - stylesheetTmpl.setWeblog(getActionWeblog()); - stylesheetTmpl.setAction(ThemeTemplate.ComponentType.STYLESHEET); - stylesheetTmpl.setName(stylesheet.getName()); - stylesheetTmpl.setDescription(stylesheet.getDescription()); - stylesheetTmpl.setLink(stylesheet.getLink()); - stylesheetTmpl.setHidden(false); - stylesheetTmpl.setNavbar(false); - stylesheetTmpl.setLastModified(new Date()); - - // create renditions for available rendition types - TemplateRendition sCode = stylesheet.getTemplateRendition(RenditionType.STANDARD); - if (sCode != null) { - CustomTemplateRendition standardRendition = new CustomTemplateRendition( - stylesheetTmpl, RenditionType.STANDARD); - standardRendition.setTemplate(sCode.getTemplate()); - standardRendition.setTemplateLanguage(sCode.getTemplateLanguage()); - WebloggerFactory.getWeblogger().getWeblogManager() - .saveTemplateRendition(standardRendition); - } - - TemplateRendition mCode = stylesheet.getTemplateRendition(RenditionType.MOBILE); - if (mCode != null) { - CustomTemplateRendition mobileRendition = new CustomTemplateRendition( - stylesheetTmpl, RenditionType.MOBILE); - mobileRendition.setTemplate(mCode.getTemplate()); - mobileRendition.setTemplateLanguage(mCode - .getTemplateLanguage()); - WebloggerFactory.getWeblogger().getWeblogManager() - .saveTemplateRendition(mobileRendition); - } - - WebloggerFactory.getWeblogger().getWeblogManager() - .saveTemplate(stylesheetTmpl); - setTemplate(stylesheetTmpl); - WebloggerFactory.getWeblogger().flush(); - - - // success message - addMessage("stylesheetEdit.create.success"); - } + SharedTheme themeName = themeManager.getTheme(getActionWeblog().getEditorTheme()); + sharedThemeStylesheet = themeName.getStylesheet() != null; - // See if we're using a shared theme with a custom stylesheet - if (!WeblogTheme.CUSTOM.equals(getActionWeblog() - .getEditorTheme()) - && getActionWeblog().getTheme().getStylesheet() != null) { - - ThemeTemplate override = WebloggerFactory - .getWeblogger() - .getWeblogManager() - .getTemplateByLink( - getActionWeblog(), - getActionWeblog().getTheme() - .getStylesheet().getLink()); - - if (override != null) { - sharedThemeCustomStylesheet = true; - } - } + ThemeTemplate themeStylesheet = themeName.getStylesheet(); + + WeblogTemplate weblogStylesheet = + weblogManager.getTemplateByLink(getActionWeblog(), themeStylesheet.getLink()); + + setTemplate( weblogStylesheet ); } catch (WebloggerException ex) { - log.error( - "Error finding/adding stylesheet template from weblog - " - + getActionWeblog().getHandle(), ex); + log.error("Error looking up shared theme name on weblog - " + getActionWeblog().getHandle(), ex); } } } @@ -165,21 +91,19 @@ && getActionWeblog().getTheme().getStylesheet() != null) { * Show stylesheet edit page. */ public String execute() { + if (template != null) { try { if (getTemplate().getTemplateRendition(RenditionType.STANDARD) != null) { - setContentsStandard(getTemplate().getTemplateRendition( - RenditionType.STANDARD).getTemplate()); + setContentsStandard(getTemplate().getTemplateRendition( RenditionType.STANDARD).getTemplate()); } else { setContentsStandard(""); } if (getTemplate().getTemplateRendition(RenditionType.MOBILE) != null) { - setContentsMobile(getTemplate().getTemplateRendition( - RenditionType.MOBILE).getTemplate()); + setContentsMobile(getTemplate().getTemplateRendition( RenditionType.MOBILE).getTemplate()); } if (log.isDebugEnabled()) { - log.debug("Standard: " + getContentsStandard() + " Mobile: " - + getContentsMobile()); + log.debug("Standard: " + getContentsStandard() + " Mobile: " + getContentsMobile()); } } catch (WebloggerException e) { log.error("Error loading Weblog template codes for stylesheet", e); @@ -188,10 +112,83 @@ public String execute() { return INPUT; } + public String copyStylesheet() { + + WeblogManager weblogManager = WebloggerFactory.getWeblogger().getWeblogManager(); + ThemeManager themeManager = WebloggerFactory.getWeblogger().getThemeManager(); + + ThemeTemplate stylesheet = null; + + try { + SharedTheme themeName = themeManager.getTheme(getActionWeblog().getEditorTheme()); + stylesheet = themeName.getStylesheet(); + + } catch (WebloggerException ex) { + + } + + log.debug("custom stylesheet path is - " + stylesheet.getLink()); + try { + setTemplate( weblogManager.getTemplateByLink(getActionWeblog(), stylesheet.getLink())); + + if (getTemplate() == null) { + log.debug("custom stylesheet not found, creating it"); + + WeblogTemplate stylesheetTmpl = new WeblogTemplate(); + stylesheetTmpl.setWeblog(getActionWeblog()); + stylesheetTmpl.setAction(ComponentType.STYLESHEET); + stylesheetTmpl.setName(stylesheet.getName()); + stylesheetTmpl.setDescription(stylesheet.getDescription()); + stylesheetTmpl.setLink(stylesheet.getLink()); + stylesheetTmpl.setHidden(false); + stylesheetTmpl.setNavbar(false); + stylesheetTmpl.setLastModified(new Date()); + + // create renditions for available rendition types: standard and mobile + + TemplateRendition sCode = stylesheet.getTemplateRendition(RenditionType.STANDARD); + if (sCode != null) { + CustomTemplateRendition standardRendition = new CustomTemplateRendition( + stylesheetTmpl, RenditionType.STANDARD); + standardRendition.setTemplate(sCode.getTemplate()); + standardRendition.setTemplateLanguage(sCode.getTemplateLanguage()); + weblogManager.saveTemplateRendition(standardRendition); + } + + TemplateRendition mCode = stylesheet.getTemplateRendition(RenditionType.MOBILE); + if (mCode != null) { + CustomTemplateRendition mobileRendition = + new CustomTemplateRendition(stylesheetTmpl, RenditionType.MOBILE); + mobileRendition.setTemplate(mCode.getTemplate()); + mobileRendition.setTemplateLanguage(mCode.getTemplateLanguage()); + weblogManager.saveTemplateRendition(mobileRendition); + } + + weblogManager.saveTemplate(stylesheetTmpl); + setTemplate(stylesheetTmpl); + + WebloggerFactory.getWeblogger().flush(); + + // success message + addMessage("stylesheetEdit.create.success"); + } + + } catch (WebloggerException ex) { + log.error("Error finding/adding stylesheet template from weblog - " + + getActionWeblog().getHandle(), ex); + addError("generic.error.check.logs"); + } + + return revert(); + } + /** * Save an existing stylesheet. */ public String save() { + + WeblogManager weblogManager = WebloggerFactory.getWeblogger().getWeblogManager(); + if (!hasActionErrors()) { try { @@ -202,26 +199,21 @@ public String save() { if (stylesheet.getTemplateRendition(RenditionType.STANDARD) != null) { // if we have a template, then set it - CustomTemplateRendition tc = stylesheet - .getTemplateRendition(RenditionType.STANDARD); + CustomTemplateRendition tc = stylesheet.getTemplateRendition(RenditionType.STANDARD); tc.setTemplate(getContentsStandard()); - WebloggerFactory.getWeblogger().getWeblogManager() - .saveTemplateRendition(tc); + weblogManager.saveTemplateRendition(tc); + } else { // otherwise create it, then set it - CustomTemplateRendition tc = new CustomTemplateRendition( - stylesheet, RenditionType.STANDARD); + CustomTemplateRendition tc = new CustomTemplateRendition( stylesheet, RenditionType.STANDARD); tc.setTemplate(""); - WebloggerFactory.getWeblogger().getWeblogManager() - .saveTemplateRendition(tc); + weblogManager.saveTemplateRendition(tc); } if (stylesheet.getTemplateRendition(RenditionType.MOBILE) != null) { - CustomTemplateRendition tc = stylesheet - .getTemplateRendition(RenditionType.MOBILE); + CustomTemplateRendition tc = stylesheet.getTemplateRendition(RenditionType.MOBILE); tc.setTemplate(getContentsMobile()); - WebloggerFactory.getWeblogger().getWeblogManager() - .saveTemplateRendition(tc); + weblogManager.saveTemplateRendition(tc); } // save template and flush @@ -248,53 +240,54 @@ public String save() { * Revert the stylesheet to its original state. UI provides this only for shared themes. */ public String revert() { - if (sharedTheme && !hasActionErrors()) { + + WeblogManager weblogManager = WebloggerFactory.getWeblogger().getWeblogManager(); + + if (isSharedTheme() && !hasActionErrors()) { try { WeblogTemplate stylesheet = getTemplate(); // lookup the theme used by this weblog - ThemeManager tmgr = WebloggerFactory.getWeblogger() - .getThemeManager(); + ThemeManager tmgr = WebloggerFactory.getWeblogger() .getThemeManager(); Theme theme = tmgr.getTheme(getActionWeblog().getEditorTheme()); stylesheet.setLastModified(new Date()); if (stylesheet.getTemplateRendition(RenditionType.STANDARD) != null) { - TemplateRendition templateCode = theme.getStylesheet() - .getTemplateRendition(RenditionType.STANDARD); + + TemplateRendition templateCode = + theme.getStylesheet().getTemplateRendition(RenditionType.STANDARD); + // if we have a template, then set it - CustomTemplateRendition existingTemplateCode = stylesheet - .getTemplateRendition(RenditionType.STANDARD); - existingTemplateCode - .setTemplate(templateCode.getTemplate()); - WebloggerFactory.getWeblogger().getWeblogManager() - .saveTemplateRendition(existingTemplateCode); + CustomTemplateRendition existingTemplateCode = + stylesheet.getTemplateRendition(RenditionType.STANDARD); + + existingTemplateCode.setTemplate(templateCode.getTemplate()); + weblogManager.saveTemplateRendition(existingTemplateCode); } if (stylesheet.getTemplateRendition(RenditionType.MOBILE) != null) { - TemplateRendition templateCode = theme.getStylesheet() - .getTemplateRendition(RenditionType.MOBILE); - CustomTemplateRendition existingTemplateCode = stylesheet - .getTemplateRendition(RenditionType.MOBILE); - existingTemplateCode - .setTemplate(templateCode.getTemplate()); + + TemplateRendition templateCode = + theme.getStylesheet().getTemplateRendition(RenditionType.MOBILE); + CustomTemplateRendition existingTemplateCode = + stylesheet.getTemplateRendition(RenditionType.MOBILE); + + existingTemplateCode.setTemplate(templateCode.getTemplate()); } // save template and flush - WebloggerFactory.getWeblogger().getWeblogManager() - .saveTemplate(stylesheet); + weblogManager.saveTemplate(stylesheet); WebloggerFactory.getWeblogger().flush(); // notify caches CacheManager.invalidate(stylesheet); // success message - addMessage("stylesheetEdit.revert.success", - stylesheet.getName()); + addMessage("stylesheetEdit.revert.success", stylesheet.getName()); } catch (WebloggerException ex) { - log.error("Error updating stylesheet template for weblog - " - + getActionWeblog().getHandle(), ex); + log.error("Error updating stylesheet template for weblog - " + getActionWeblog().getHandle(), ex); addError("generic.error.check.logs"); } } @@ -305,19 +298,18 @@ public String revert() { * set theme to default stylesheet, ie delete it. */ public String delete() { - if (template != null && sharedTheme && !hasActionErrors()) { + if (template != null && isSharedTheme() && !hasActionErrors()) { try { // Delete template and flush - WeblogManager mgr = WebloggerFactory.getWeblogger() - .getWeblogManager(); + WeblogManager weblogManager = WebloggerFactory.getWeblogger().getWeblogManager(); // Remove template and page codes - mgr.removeTemplate(template); + weblogManager.removeTemplate(template); Weblog weblog = getActionWeblog(); // save updated weblog and flush - mgr.saveWeblog(weblog); + weblogManager.saveWeblog(weblog); // notify caches CacheManager.invalidate(template); @@ -326,15 +318,12 @@ public String delete() { WebloggerFactory.getWeblogger().flush(); // success message - addMessage("stylesheetEdit.default.success", - template.getName()); + addMessage("stylesheetEdit.default.success", template.getName()); template = null; - sharedStylesheetDeleted = true; } catch (Exception e) { - log.error("Error deleting stylesheet template for weblog - " - + getActionWeblog().getHandle(), e); + log.error("Error deleting stylesheet template for weblog - " + getActionWeblog().getHandle(), e); addError("generic.error.check.logs"); } } @@ -343,16 +332,26 @@ public String delete() { /** * Checks if is custom theme. - * * @return true, if is custom theme */ public boolean isCustomTheme() { return (WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme())); } + /** + * Checks if is shared theme. + * @return true, if is shared theme + */ + public boolean isSharedTheme() { + return !isCustomTheme(); + } + + public boolean isSharedThemeStylesheet() { + return sharedThemeStylesheet; + } + /** * Gets the template. - * * @return the template */ public WeblogTemplate getTemplate() { @@ -361,9 +360,7 @@ public WeblogTemplate getTemplate() { /** * Sets the template. - * - * @param template - * the new template + * @param template the new template */ public void setTemplate(WeblogTemplate template) { this.template = template; @@ -371,7 +368,6 @@ public void setTemplate(WeblogTemplate template) { /** * Gets the contents standard. - * * @return the contents standard */ public String getContentsStandard() { @@ -380,9 +376,7 @@ public String getContentsStandard() { /** * Sets the contents standard. - * - * @param contents - * the new contents standard + * @param contents the new contents standard */ public void setContentsStandard(String contents) { this.contentsStandard = contents; @@ -390,7 +384,6 @@ public void setContentsStandard(String contents) { /** * Gets the contents mobile. - * * @return the contents mobile */ public String getContentsMobile() { @@ -399,29 +392,9 @@ public String getContentsMobile() { /** * Sets the contents mobile. - * - * @param contents - * the new contents mobile + * @param contents the new contents mobile */ public void setContentsMobile(String contents) { this.contentsMobile = contents; } - - /** - * Checks if using a shared theme with a custom stylesheet. - * - * @return true, if checks if shared theme and custom stylesheet - */ - public boolean isSharedThemeCustomStylesheet() { - return sharedThemeCustomStylesheet; - } - - /** - * Checks if user just deleted his custom shared stylesheet - * - * @return true, if custom shared stylesheet was deleted. - */ - public boolean isSharedStylesheetDeleted() { - return sharedStylesheetDeleted; - } } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplateEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplateEdit.java index 19d34ffd82..4642808211 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplateEdit.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplateEdit.java @@ -114,8 +114,7 @@ public String save() { getBean().copyTo(templateToSave); templateToSave.setLastModified(new Date()); - if (getBean().getAutoContentType() == null || - !getBean().getAutoContentType()) { + if (getBean().getAutoContentType() == null || !getBean().getAutoContentType()) { templateToSave.setOutputContentType(getBean().getManualContentType()); } else { // empty content-type indicates that template uses auto content-type detection @@ -151,7 +150,7 @@ private void myValidate() { if (!getTemplate().getName().equals(getBean().getName())) { try { if (WebloggerFactory.getWeblogger().getWeblogManager() - .getTemplateByName(getActionWeblog(), getBean().getName()) != null) { + .getTemplateByName(getActionWeblog(), getBean().getName()) != null) { addError("pagesForm.error.alreadyExists", getBean().getName()); } } catch (WebloggerException ex) { diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplateRemove.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplateRemove.java index 4f9a82baf8..74468261de 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplateRemove.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplateRemove.java @@ -18,6 +18,7 @@ package org.apache.roller.weblogger.ui.struts2.editor; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.roller.weblogger.WebloggerException; @@ -28,6 +29,7 @@ import org.apache.roller.weblogger.pojos.WeblogTemplate; import org.apache.roller.weblogger.pojos.WeblogTheme; import org.apache.roller.weblogger.ui.struts2.util.UIAction; +import org.apache.roller.weblogger.util.Utilities; import org.apache.roller.weblogger.util.cache.CacheManager; import org.apache.struts2.convention.annotation.AllowedMethods; @@ -37,72 +39,67 @@ // TODO: make this work @AllowedMethods({"execute","remove","cancel"}) public class TemplateRemove extends UIAction { - private static Log log = LogFactory.getLog(TemplateRemove.class); + private static Log log = LogFactory.getLog(TemplateRemove.class); - // id of template to remove - private String removeId = null; + // id of template to remove + private String removeId = null; - // template object that we will remove - private WeblogTemplate template = null; + // template object that we will remove + private WeblogTemplate template = null; - public TemplateRemove() { - this.actionName = "templateRemove"; - this.desiredMenu = "editor"; - this.pageTitle = "editPages.title.removeOK"; - } + public TemplateRemove() { + this.actionName = "templateRemove"; + this.desiredMenu = "editor"; + this.pageTitle = "editPages.title.removeOK"; + } - public void myPrepare() { - if (getRemoveId() != null) { + public void myPrepare() { + if (StringUtils.isNotEmpty(getRemoveId())) { try { - setTemplate(WebloggerFactory.getWeblogger().getWeblogManager() - .getTemplate(getRemoveId())); + setTemplate( + WebloggerFactory.getWeblogger().getWeblogManager().getTemplate(getRemoveId())); } catch (WebloggerException ex) { - log.error("Error looking up template by id - " + getRemoveId(), - ex); + log.error("Error looking up template by id - " + getRemoveId(), ex); addError("editPages.remove.notFound", getRemoveId()); } } - } + } - /** - * Display the remove template confirmation. - */ - public String execute() { - return "confirm"; - } + /** + * Display the remove template confirmation. + */ + public String execute() { + return "confirm"; + } - /** - * Remove a new template. - */ - public String remove() { + /** + * Remove a new template. + */ + public String remove() { - if (getTemplate() != null) { + if (getTemplate() != null) { try { if (!getTemplate().isRequired() - || !WeblogTheme.CUSTOM.equals(getActionWeblog() - .getEditorTheme())) { + || !WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme())) { - WeblogManager mgr = WebloggerFactory.getWeblogger() - .getWeblogManager(); + WeblogManager mgr = WebloggerFactory.getWeblogger().getWeblogManager(); // if weblog template remove custom style sheet also - if (getTemplate().getName().equals( - WeblogTemplate.DEFAULT_PAGE)) { + if (getTemplate().getName().equals(WeblogTemplate.DEFAULT_PAGE)) { Weblog weblog = getActionWeblog(); - ThemeTemplate stylesheet = getActionWeblog().getTheme() - .getStylesheet(); + ThemeTemplate stylesheet = getActionWeblog().getTheme().getStylesheet(); // Delete style sheet if the same name if (stylesheet != null - && getActionWeblog().getTheme().getStylesheet() != null - && stylesheet.getLink().equals( - getActionWeblog().getTheme() - .getStylesheet().getLink())) { + && getActionWeblog().getTheme().getStylesheet() != null + && stylesheet.getLink().equals( + getActionWeblog().getTheme().getStylesheet().getLink())) { + // Same so OK to delete - WeblogTemplate css = mgr.getTemplateByLink( - getActionWeblog(), stylesheet.getLink()); + WeblogTemplate css = + mgr.getTemplateByLink(getActionWeblog(), stylesheet.getLink()); if (css != null) { mgr.removeTemplate(css); @@ -126,32 +123,28 @@ && getActionWeblog().getTheme().getStylesheet() != null } } - return "confirm"; - } - - /** - * Cancel. - * - * @return the string - */ + return "confirm"; + } + + public String cancel() { return CANCEL; } - public String getRemoveId() { - return removeId; - } + public String getRemoveId() { + return removeId; + } - public void setRemoveId(String removeId) { - this.removeId = removeId; - } + public void setRemoveId(String removeId) { + this.removeId = removeId; + } - public WeblogTemplate getTemplate() { - return template; - } + public WeblogTemplate getTemplate() { + return template; + } - public void setTemplate(WeblogTemplate template) { - this.template = template; - } + public void setTemplate(WeblogTemplate template) { + this.template = template; + } } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Templates.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Templates.java index 4793e11d44..2621d2ff14 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Templates.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Templates.java @@ -46,103 +46,99 @@ // TODO: make this work @AllowedMethods({"execute","add"}) public class Templates extends UIAction { - private static Log log = LogFactory.getLog(Templates.class); - - // list of templates to display - private List templates = Collections.emptyList(); - - // list of template action types user is allowed to create - private Map availableActions = Collections.emptyMap(); - - // name and action of new template if we are adding a template - private String newTmplName = null; - private ComponentType newTmplAction = null; - - public Templates() { - this.actionName = "templates"; - this.desiredMenu = "editor"; - this.pageTitle = "pagesForm.title"; - } - - public String execute() { - - // query for templates list - try { - - // get current list of templates, minus custom stylesheet - List raw = WebloggerFactory.getWeblogger() - .getWeblogManager().getTemplates(getActionWeblog()); - List pages = new ArrayList(); - pages.addAll(raw); - // Remove style sheet from list so not to show when theme is - // selected in shared theme mode - if (getActionWeblog().getTheme().getStylesheet() != null) { - pages.remove(WebloggerFactory - .getWeblogger() - .getWeblogManager() - .getTemplateByLink( - getActionWeblog(), - getActionWeblog().getTheme().getStylesheet() - .getLink())); - } - setTemplates(pages); - - // build list of action types that may be added - Map actionsMap = new EnumMap(ComponentType.class); - addComponentTypeToMap(actionsMap, ComponentType.CUSTOM); - - if (WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme())) { - // if the weblog is using a custom theme then determine which - // action templates are still available to be created - addComponentTypeToMap(actionsMap, ComponentType.PERMALINK); - addComponentTypeToMap(actionsMap, ComponentType.SEARCH); - addComponentTypeToMap(actionsMap, ComponentType.WEBLOG); - addComponentTypeToMap(actionsMap, ComponentType.TAGSINDEX); - - for (WeblogTemplate tmpPage : getTemplates()) { - if (!ComponentType.CUSTOM.equals(tmpPage - .getAction())) { - actionsMap.remove(tmpPage.getAction()); - } - } - } else { - // Make sure we have an option for the default web page - addComponentTypeToMap(actionsMap, ComponentType.WEBLOG); - if (getNewTmplAction() == null) { - setNewTmplAction(ComponentType.WEBLOG); - } - for (WeblogTemplate tmpPage : getTemplates()) { - if (ComponentType.WEBLOG.equals(tmpPage.getAction())) { - actionsMap.remove(ComponentType.WEBLOG); - setNewTmplAction(null); - break; - } - } - } - setAvailableActions(actionsMap); - - } catch (WebloggerException ex) { - log.error("Error getting templates for weblog - " - + getActionWeblog().getHandle(), ex); - addError("Error getting template list - check Roller logs"); - } - - return LIST; - } + private static Log log = LogFactory.getLog(Templates.class); + + // list of templates to display + private List templates = Collections.emptyList(); + + // list of template action types user is allowed to create + private Map availableActions = Collections.emptyMap(); + + // name and action of new template if we are adding a template + private String newTmplName = null; + private ComponentType newTmplAction = null; + + public Templates() { + this.actionName = "templates"; + this.desiredMenu = "editor"; + this.pageTitle = "pagesForm.title"; + } + + public String execute() { + + // query for templates list + try { + + // get current list of templates, minus custom stylesheet + List raw = WebloggerFactory.getWeblogger() + .getWeblogManager().getTemplates(getActionWeblog()); + List pages = new ArrayList(); + pages.addAll(raw); + + // Remove style sheet from list so not to show when theme is + // selected in shared theme mode + if (getActionWeblog().getTheme().getStylesheet() != null) { + pages.remove(WebloggerFactory.getWeblogger().getWeblogManager() + .getTemplateByLink(getActionWeblog(), getActionWeblog().getTheme().getStylesheet().getLink())); + } + setTemplates(pages); + + // build list of action types that may be added + Map actionsMap = new EnumMap(ComponentType.class); + addComponentTypeToMap(actionsMap, ComponentType.CUSTOM); + + if (WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme())) { + + // if the weblog is using a custom theme then determine which + // action templates are still available to be created + addComponentTypeToMap(actionsMap, ComponentType.PERMALINK); + addComponentTypeToMap(actionsMap, ComponentType.SEARCH); + addComponentTypeToMap(actionsMap, ComponentType.WEBLOG); + addComponentTypeToMap(actionsMap, ComponentType.TAGSINDEX); + + for (WeblogTemplate tmpPage : getTemplates()) { + if (!ComponentType.CUSTOM.equals(tmpPage.getAction())) { + actionsMap.remove(tmpPage.getAction()); + } + } + } else { + // Make sure we have an option for the default web page + addComponentTypeToMap(actionsMap, ComponentType.WEBLOG); + if (getNewTmplAction() == null) { + setNewTmplAction(ComponentType.WEBLOG); + } + for (WeblogTemplate tmpPage : getTemplates()) { + if (ComponentType.WEBLOG.equals(tmpPage.getAction())) { + actionsMap.remove(ComponentType.WEBLOG); + setNewTmplAction(null); + break; + } + } + } + setAvailableActions(actionsMap); + + } catch (WebloggerException ex) { + log.error("Error getting templates for weblog - " + + getActionWeblog().getHandle(), ex); + addError("Error getting template list - check Roller logs"); + } + + return LIST; + } private void addComponentTypeToMap(Map map, ComponentType component) { map.put(component, component.getReadableName()); } - /** - * Save a new template. - */ - public String add() { + /** + * Save a new template. + */ + public String add() { - // validation - myValidate(); + // validation + myValidate(); - if (!hasActionErrors()) { + if (!hasActionErrors()) { try { WeblogTemplate newTemplate = new WeblogTemplate(); @@ -164,18 +160,16 @@ public String add() { } // save the new Template - WebloggerFactory.getWeblogger().getWeblogManager() - .saveTemplate(newTemplate); + WebloggerFactory.getWeblogger().getWeblogManager().saveTemplate(newTemplate); - // Create weblog template codes for available types. - CustomTemplateRendition standardRendition = new CustomTemplateRendition( - newTemplate, RenditionType.STANDARD); + // Create weblog template renditions for available types. + CustomTemplateRendition standardRendition = + new CustomTemplateRendition( newTemplate, RenditionType.STANDARD); standardRendition.setTemplate(getText("pageForm.newTemplateContent")); standardRendition.setTemplateLanguage(TemplateLanguage.VELOCITY); - WebloggerFactory.getWeblogger().getWeblogManager() - .saveTemplateRendition(standardRendition); + WebloggerFactory.getWeblogger().getWeblogManager().saveTemplateRendition(standardRendition); - /* TBI -- need a way for user to specify dual or single template + /* TODO: need a way for user to specify dual or single template via UI CustomTemplateRendition mobileRendition = new CustomTemplateRendition( newTemplate.getId(), RenditionType.MOBILE); mobileRendition.setTemplate(newTemplate.getContents()); @@ -185,11 +179,9 @@ public String add() { */ // if this person happened to create a Weblog template from - // scratch then make sure and set the defaultPageId. What does - // this do???? + // scratch then make sure and set the defaultPageId. if (WeblogTemplate.DEFAULT_PAGE.equals(newTemplate.getName())) { - WebloggerFactory.getWeblogger().getWeblogManager() - .saveWeblog(getActionWeblog()); + WebloggerFactory.getWeblogger().getWeblogManager().saveWeblog(getActionWeblog()); } // flush results to db @@ -200,83 +192,81 @@ public String add() { setNewTmplAction(null); } catch (WebloggerException ex) { - log.error("Error adding new template for weblog - " - + getActionWeblog().getHandle(), ex); + log.error("Error adding new template for weblog - " + getActionWeblog().getHandle(), ex); addError("Error adding new template - check Roller logs"); } } - return execute(); - } - - // validation when adding a new template - private void myValidate() { - - // make sure name is non-null and within proper size - if (StringUtils.isEmpty(getNewTmplName())) { - addError("Template.error.nameNull"); - } else if (getNewTmplName().length() > RollerConstants.TEXTWIDTH_255) { - addError("Template.error.nameSize"); - } - - // make sure action is a valid - if (getNewTmplAction() == null) { - addError("Template.error.actionNull"); - } - - // check if template by that name already exists - try { - WeblogTemplate existingPage = WebloggerFactory.getWeblogger() - .getWeblogManager() - .getTemplateByName(getActionWeblog(), getNewTmplName()); - if (existingPage != null) { - addError("pagesForm.error.alreadyExists", getNewTmplName()); - } - } catch (WebloggerException ex) { - log.error("Error checking for existing template", ex); - } - - } - - /** - * Checks if is custom theme. - * - * @return true, if is custom theme - */ - public boolean isCustomTheme() { - return (WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme())); - } - - public List getTemplates() { - return templates; - } - - public void setTemplates(List templates) { - this.templates = templates; - } - - public Map getAvailableActions() { - return availableActions; - } - - public void setAvailableActions(Map availableActions) { - this.availableActions = availableActions; - } - - public String getNewTmplName() { - return newTmplName; - } - - public void setNewTmplName(String newTmplName) { - this.newTmplName = newTmplName; - } - - public ComponentType getNewTmplAction() { - return newTmplAction; - } - - public void setNewTmplAction(ComponentType newTmplAction) { - this.newTmplAction = newTmplAction; - } + return execute(); + } + + // validation when adding a new template + private void myValidate() { + + // make sure name is non-null and within proper size + if (StringUtils.isEmpty(getNewTmplName())) { + addError("Template.error.nameNull"); + } else if (getNewTmplName().length() > RollerConstants.TEXTWIDTH_255) { + addError("Template.error.nameSize"); + } + + // make sure action is a valid + if (getNewTmplAction() == null) { + addError("Template.error.actionNull"); + } + + // check if template by that name already exists + try { + WeblogTemplate existingPage = WebloggerFactory.getWeblogger().getWeblogManager() + .getTemplateByName(getActionWeblog(), getNewTmplName()); + if (existingPage != null) { + addError("pagesForm.error.alreadyExists", getNewTmplName()); + } + } catch (WebloggerException ex) { + log.error("Error checking for existing template", ex); + } + + } + + /** + * Checks if is custom theme. + * + * @return true, if is custom theme + */ + public boolean isCustomTheme() { + return (WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme())); + } + + public List getTemplates() { + return templates; + } + + public void setTemplates(List templates) { + this.templates = templates; + } + + public Map getAvailableActions() { + return availableActions; + } + + public void setAvailableActions(Map availableActions) { + this.availableActions = availableActions; + } + + public String getNewTmplName() { + return newTmplName; + } + + public void setNewTmplName(String newTmplName) { + this.newTmplName = newTmplName; + } + + public ComponentType getNewTmplAction() { + return newTmplAction; + } + + public void setNewTmplAction(ComponentType newTmplAction) { + this.newTmplAction = newTmplAction; + } } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplatesRemove.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplatesRemove.java deleted file mode 100644 index 7fd3e2615e..0000000000 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplatesRemove.java +++ /dev/null @@ -1,254 +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 java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.roller.weblogger.business.WeblogManager; -import org.apache.roller.weblogger.business.WebloggerFactory; -import org.apache.roller.weblogger.pojos.ThemeTemplate; -import org.apache.roller.weblogger.pojos.Weblog; -import org.apache.roller.weblogger.pojos.WeblogTemplate; -import org.apache.roller.weblogger.ui.struts2.util.UIAction; -import org.apache.roller.weblogger.util.Utilities; -import org.apache.roller.weblogger.util.cache.CacheManager; -import org.apache.struts2.convention.annotation.AllowedMethods; - -/** - * Remove templates. - */ -// TODO: make this work @AllowedMethods({"execute","remove","cancel"}) -public class TemplatesRemove extends UIAction { - - private static final long serialVersionUID = 895186156151331087L; - private static Log log = LogFactory.getLog(TemplatesRemove.class); - - // Templates to remove - private String[] idSelections = null; - - // Limit updates to just this set of comma-separated IDs - private String ids = null; - - // list of templates to display - private List templates = Collections.emptyList(); - - public TemplatesRemove() { - this.actionName = "templatesRemove"; - this.desiredMenu = "editor"; - this.pageTitle = "editPages.title.removeOK"; - } - - public void myPrepare() { - - if (getIdSelections() != null) { - - // query for templates list - try { - - WeblogManager mgr = WebloggerFactory.getWeblogger() - .getWeblogManager(); - - List pages = new ArrayList(); - WeblogTemplate template = null; - - String[] idsToDelete = getIdSelections(); - if (idsToDelete != null && idsToDelete.length > 0) { - - for (String id : idsToDelete) { - if (!id.equals("")) { - template = mgr.getTemplate(id); - if (template != null) { - pages.add(template); - } - } - } - - } - - // Set page data - setTemplates(pages); - setIds(Utilities.stringArrayToString(idsToDelete, ",")); - - // Flush for operation - WebloggerFactory.getWeblogger().flush(); - - } catch (Exception ex) { - log.error("Error getting templates for weblog - " - + getActionWeblog().getHandle(), ex); - addError("error.unexpected"); - } - - } - } - - /** - * Display the remove template confirmation. - */ - public String execute() { - - if (getIds() != null && getTemplates() != null - && getTemplates().size() > 0) { - return "confirm"; - } else { - return SUCCESS; - } - - } - - /** - * Remove Selected templates - */ - public String remove() { - - if (getIds() != null) { - try { - - String[] idsToDelete = Utilities.stringToStringArray(getIds(), - ","); - if (idsToDelete != null && idsToDelete.length > 0) { - - WeblogManager mgr = WebloggerFactory.getWeblogger() - .getWeblogManager(); - - Weblog weblog = getActionWeblog(); - WeblogTemplate template; - - for (String id : idsToDelete) { - if (!id.equals("")) { - template = mgr.getTemplate(id); - if (!template.isRequired() - || !"custom".equals(getActionWeblog().getEditorTheme())) { - - // if weblog template remove custom style sheet - // also - if (template.getName().equals( - WeblogTemplate.DEFAULT_PAGE)) { - - ThemeTemplate stylesheet = getActionWeblog() - .getTheme().getStylesheet(); - - // Delete style sheet if the same name - if (stylesheet != null - && getActionWeblog().getTheme() - .getStylesheet() != null - && stylesheet.getLink().equals( - getActionWeblog() - .getTheme() - .getStylesheet() - .getLink())) { - // Same so OK to delete - WeblogTemplate css = mgr.getTemplateByLink( - getActionWeblog(), - stylesheet.getLink()); - - if (css != null) { - mgr.removeTemplate(css); - } - } - } - mgr.removeTemplate(template); - } - } - } - - // Save for changes - mgr.saveWeblog(weblog); - - WebloggerFactory.getWeblogger().flush(); - - // notify caches - CacheManager.invalidate(getActionWeblog()); - - } - - return SUCCESS; - - } catch (Exception e) { - log.error("Error deleting templates for weblog - " - + getActionWeblog().getHandle(), e); - - addError("error.unexpected"); - - } - } - - return "confirm"; - } - - /** - * Cancel. - * - * @return the string - */ - public String cancel() { - return CANCEL; - } - - /** - * Gets the templates. - * - * @return the templates - */ - public List getTemplates() { - return templates; - } - - /** - * Sets the templates. - * - * @param templates - * the new templates - */ - public void setTemplates(List templates) { - this.templates = templates; - } - - /** - * Select check boxes for deleting records - */ - public String[] getIdSelections() { - return idSelections; - } - - /** - * Select check boxes for deleting records - */ - public void setIdSelections(String[] idSelections) { - this.idSelections = idSelections; - } - - /** - * Comma separated list if ids to remove - */ - public String getIds() { - return ids; - } - - /** - * Comma separated list if ids to remove - */ - public void setIds(String ids) { - this.ids = ids; - } - -} diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/WeblogConfig.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/WeblogConfig.java index bcc9f57d2f..9a7fde61d8 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/WeblogConfig.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/WeblogConfig.java @@ -66,8 +66,7 @@ public WeblogConfig() { this.desiredMenu = "editor"; this.pageTitle = "websiteSettings.title"; } - - + public void myPrepare() { try { diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UIAction.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UIAction.java index cfafbc2b62..9fdc74e3d9 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UIAction.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UIAction.java @@ -379,8 +379,9 @@ public List getSecondsList() { public List getCommentDaysList() { - List opts = new ArrayList(); - + List opts = new ArrayList<>(); + + opts.add(new KeyValueObject(-1, getText("weblogEdit.commentsNotAllowed"))); opts.add(new KeyValueObject(0, getText("weblogEdit.unlimitedCommentDays"))); opts.add(new KeyValueObject(3, getText("weblogEdit.days3"))); opts.add(new KeyValueObject(7, getText("weblogEdit.days7"))); diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UISecurityInterceptor.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UISecurityInterceptor.java index 7ba142da42..d4c8e8c3dc 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UISecurityInterceptor.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UISecurityInterceptor.java @@ -67,7 +67,7 @@ public String doIntercept(ActionInvocation invocation) throws Exception { if (log.isDebugEnabled()) { log.debug("DENIED: required user not found"); } - return "access-denied"; + return UIAction.DENIED; } // are we also enforcing global permissions? @@ -78,10 +78,9 @@ public String doIntercept(ActionInvocation invocation) throws Exception { theAction.requiredGlobalPermissionActions()); if (!umgr.checkPermission(perm, authenticatedUser)) { if (log.isDebugEnabled()) { - log.debug("DENIED: user does not have permission = " - + perm.toString()); + log.debug("DENIED: user does not have permission = " + perm.toString()); } - return "access-denied"; + return UIAction.DENIED; } } @@ -96,7 +95,7 @@ public String doIntercept(ActionInvocation invocation) throws Exception { " unable to process action \"" + ((UIAction) theAction).getActionName() + "\" because no weblog was defined (Check JSP form provides weblog value.)"); } - return "access-denied"; + return UIAction.DENIED; } // are we also enforcing a specific weblog permission? @@ -112,7 +111,7 @@ public String doIntercept(ActionInvocation invocation) throws Exception { log.debug("DENIED: user does not have required weblog permissions = " + required); } - return "access-denied"; + return UIAction.DENIED; } } } diff --git a/app/src/main/resources/ApplicationResources.properties b/app/src/main/resources/ApplicationResources.properties index 8a68c56ea2..2673f6e701 100644 --- a/app/src/main/resources/ApplicationResources.properties +++ b/app/src/main/resources/ApplicationResources.properties @@ -19,37 +19,46 @@ # # When to use double-apostrophe for an apostrophe in resource strings? If they're being rendered # via Struts s:text or JSTL fmt:message *with* parameters -- see http://tinyurl.com/m5bqn2h -# + + # -- Common terms used to reduce the number of strings that need translation. generic.all=All generic.none=None generic.cancel=Cancel generic.done=Done generic.yes=Yes +generic.yesRemove=Yes Remove generic.no=No generic.name=Name generic.description=Description +generic.action=Action generic.save=Save +generic.rename=Rename generic.edit=Edit generic.delete=Delete generic.tagline=Tagline -generic.error.check.logs=Roller system error - Have administrator check Roller logs for more information. +generic.error.check.logs=System error - check logs for more information. generic.changes.saved=Changes saved generic.toggle=Toggle +generic.success=Success +generic.looksGood=Looks good! +generic.poweredBy=Powered by Apache Roller # ------------------------------------------------------------- BookmarkForm.jsp bookmarkForm.add.title=Add New Bookmark -bookmarkForm.add.subtitle=Adding new bookmark in folder [{0}] +bookmarkForm.add.subtitle=Adding new bookmark in folder: bookmarkForm.edit.title=Edit Bookmark -bookmarkForm.edit.subtitle=Editing bookmark in folder [{0}] +bookmarkForm.edit.subtitle=Editing bookmark in folder: bookmarkForm.image=Image URL bookmarkForm.rssUrl=Newsfeed URL bookmarkForm.url=Bookmark URL bookmarkForm.created=Bookmark "{0}" created bookmarkForm.updated=Bookmark "{0}" updated +bookmarkForm.required=Name and Bookmark URL are required. +bookmarkForm.badUrls=These URLs are invalid: -bookmarkForm.requiredFields=The {0} and {1} fields are required. +bookmarkForm.requiredFields=Name and Bookmark URL are required. # errors from validation Bookmark.error.nameNull=Name is a required field @@ -67,38 +76,44 @@ bookmarkForm.error.duplicateName=Bookmark with that name already exists in folde bookmarksForm.root=root bookmarksForm.rootTitle=Blogroll -bookmarksForm.rootPrompt=\ -This is your blog''s main bookmarks folder. \ -The bookmarks you keep here will appear in the blogroll section of your blog \ -(assuming that you are using one of the default themes). You can create \ -additional bookmark folders, but you will have to add corresponding bookmark display \ -macros to your weblog''s templates if you wish to display their contents. +bookmarksForm.subtitle=Manage blogrolls in weblog {0} -bookmarksForm.subtitle=Manage bookmarks in weblog {0} +bookmarksForm.rootPrompt=This is your blog''s default blogroll. Most blog themes display these links (previously known as bookmarks) in the sidebar of the blog. You can also define new blogroll, but you will have to edit your theme templates if you wish to display them. +bookmarksForm.otherPrompt=This is a custom blogroll. If you wish to display these links on your blog you will have to edit your blog theme templates. -bookmarksForm.addBookmark=Add Bookmark -bookmarksForm.addFolder=New Bookmark Folder +bookmarksForm.path=Blogroll +bookmarksForm.blogrollName=Blogroll name +bookmarksForm.switchTo=Switch to blogroll +bookmarksForm.deleteFolder=Delete current blogroll +bookmarksForm.newBlogroll=New blogroll... + +bookmarksForm.addBookmark=Add blogroll link +bookmarksForm.addFolder=New blogroll bookmarksForm.delete=Delete selected -bookmarksForm.delete.confirm=Delete selected bookmarks? -bookmarksForm.deleteFolder.confirm=Delete entire folder including all its bookmarks? +bookmarksForm.delete.confirm=Confirm Selected Link Delete +bookmarksForm.delete.areYouSure=Are you sure you want to delete the selected blogroll links? bookmarksForm.url=URL bookmarksForm.feedurl=Newsfeed URL -bookmarksForm.folder=Bookmark Folder -bookmarksForm.deleteFolder=Delete folder -bookmarksForm.viewFolder=Switch to Folder -bookmarksForm.edit.tip=Click to modify this bookmark -bookmarksForm.folder.edit.tip=Click to edit folder -bookmarksForm.move=Move selected to: -bookmarksForm.move.confirm=Move selected bookmarks? -bookmarksForm.path=Folder -bookmarksForm.selectAllLabel=Select all bookmarks -bookmarksForm.selectOneLabel=Select bookmark named {0} +bookmarksForm.folder=Blogroll +bookmarksForm.edit.tip=Click to modify this link +bookmarksForm.folder.edit.tip=Click to edit blogroll +bookmarksForm.move=Move selected to +bookmarksForm.move.confirm=Move selected link? +bookmarksForm.selectAllLabel=Select all links +bookmarksForm.selectOneLabel=Select blogroll named {0} bookmarksForm.visitLink=Visit bookmarksForm.visitLink.tip=Click to visit this site bookmarksForm.error.move=Error performing move, parent to child moves not allowed -bookmarksForm.importBookmarks=Import bookmarks via OPML -bookmarksForm.noresults=There are currently no folders or bookmarks +bookmarksForm.importBookmarks=Import Blogroll via OPML +bookmarksForm.noresults=There are currently no Blogroll links + +bookmarksForm.addBlogroll.title=Add New Blogroll +bookmarksForm.editBlogroll.title=Edit Blogroll +bookmarksForm.blogroll.requiredFields=You must specify a blogroll name + +blogrollDeleteOK.removeBlogroll=Confirm Blogroll Delete +blogrollDeleteOK.areYouSure=Are you sure you want to delete blogroll and all of its links? # --------------------------------------------------------- Bookmarks import.jsp @@ -135,11 +150,11 @@ categoryForm.edit.subtitle=Editing category categoryForm.add.title=Add Category categoryForm.add.subtitle=Adding category categoryForm.image=Image URL -categoryForm.created=Category "{0}" created +categoryForm.created=Category created categoryForm.changesSaved=Category "{0}" updated -categoryForm.error.duplicateName=Category name "{0}" already in use, please choose another +categoryForm.error.duplicateName=Category name already in use categoryForm.removed=Category "{0}" deleted -categoryForm.requiredFields={0} is required. +categoryForm.requiredFields=Name is required. # errors from validation Category.error.nameNull=Name is a required field @@ -158,12 +173,13 @@ categoriesForm.rootPrompt=\ These are your top-level weblog categories. Roller requires at least one \ category to be defined. \ Categories are used to organize your weblog entries and your readers can \ -choose to subscribe to separate newsfeeds for each of your categories. +choose to subscribe to separate feeds for each of your categories. categoriesForm.addCategory=Add Category categoriesForm.move=Move categoriesForm.move.confirm=Move selected categories? categoriesForm.remove=Remove categoriesForm.imageUrl=Image URL +categoryForm.badURL=Image URL is invalid # --------------------------------------------------------- CategoryDeleteOK.jsp @@ -296,10 +312,10 @@ commentServlet.email.thereAreErrorMessages=This comment failed validation for th configForm.title=Roller Configuration configForm.subtitle=Change site-wide configuration settings. -configForm.prompt=Changes you make here apply to the entire site. Note that \ -these are runtime properties only. Please refer to the Roller documentation \ -for information on overriding Roller''s startup properties (in the \ -roller.properties file). +configForm.prompt=

Make the changes you wish and then use the Save button below. \ +Changes you make here apply to the entire site.

\ +

Note that there is also a Roller configuration file that contains additional settings. \ +Talk to your systems administrator or refer to the Roller documentation for more information.

configForm.siteSettings=Site Settings configForm.siteName=Site Name (for main page and RSS feed) @@ -326,8 +342,8 @@ configForm.enableXmlRpc=Enable Blogger / MetaWeblog API configForm.weblogSettings=Weblog Rendering Settings configForm.pageMaxEntries=Max number of entries to allow per page -configForm.newsfeedMaxEntries=Number of entries to provide in newsfeeds -configForm.styledFeeds=Display styled newsfeeds for browsers +configForm.newsfeedMaxEntries=Number of entries to provide in feeds +configForm.styledFeeds=Display styled feeds for browsers configForm.commentSettings=Comment and Trackback Settings configForm.enableComments=Allow weblog comments? @@ -335,7 +351,7 @@ configForm.ignoreSpamComments=Don''t save comments thought to be spam configForm.enableTrackbacks=Allow weblog trackbacks? configForm.ignoreSpamTrackbacks=Don''t save trackbacks thought to be spam configForm.commentHtmlAllowed=Allow html in comments? -configForm.commentPlugins=Enabled/Disable comment formatting plugins +configForm.commentPlugins=Enabled comment formatting plugins configForm.emailComments=Allow email notification of comments? configForm.moderationRequired=Require comment moderation for all weblogs configForm.enableTrackbackValidation=Enable verification of trackback links? @@ -364,10 +380,10 @@ you and a group of your friends. createWebsite.tip.name=The name is the title of your weblog, it will be \ displayed at the top of your weblog page, and in the title field of your \ -weblog''s newsfeed. This field should not include HTML. +weblog''s feed. This field should not include HTML. createWebsite.tip.description=The description of your weblog may be displayed \ at the top of your weblog (depending on the theme you choose), and it will be \ -used in description or subtitle field of your newsfeed. This field should not \ +used in description or subtitle field of your feed. This field should not \ include HTML. createWebsite.tip.handle=The handle is a short one-word name for your \ weblog. It will be used in your URL, so please limit it to simple ASCII \ @@ -385,7 +401,7 @@ customize it to your liking. createWebsite.handle=Handle createWebsite.emailAddress=Email Address createWebsite.locale=Locale -createWebsite.timeZone=Timezone +createWebsite.timezone=Timezone createWebsite.theme=Theme createWebsite.weblogUrl=URL createWebsite.button.save=Create Weblog @@ -413,7 +429,7 @@ createWeblog.error.handleExists=A weblog with that handle already exists # --------------------------------------------------------------- Entry editors editor.text.name=Plain HTML -editor.xinha.name=Rich Text Editor (Xinha) +editor.summernote.name=Rich Text Editor (Summernote) # --------------------------------------------------------------- Comment emails @@ -568,7 +584,7 @@ inviteMember.disabled=invitations disabled # ------------------------------------------------------------------- Installer -installer.bannerTitleLeft=Apache Roller Weblogger +installer.bannerTitleLeft=Apache Roller installer.bannerTitleRight=Auto-Installer # database error @@ -640,9 +656,9 @@ issued during the upgrade process: # ----------------------------------------------------------------------- Login loginPage.title=Welcome to Roller -loginPage.prompt=Please enter your username and password to login. -loginPage.openIdPrompt=Please login via OpenID -loginPage.openIdHybridPrompt=Or, login with your username and password +loginPage.prompt=Please login +loginPage.openIdPrompt=Login with OpenID +loginPage.openIdHybridPrompt=Or with username loginPage.userName=Username loginPage.password=Password loginPage.openID=OpenID username @@ -707,8 +723,8 @@ macro.weblog.noEntriesForCategory=No entries found for specified category mainPage.category=Category mainPage.searchWeblogs=Search for blogs mainPage.actions=Actions -mainPage.loggedInAs=logged in as -mainPage.currentWebsite=editing weblog +mainPage.loggedInAs=Logged in as +mainPage.currentWebsite=Editing weblog mainPage.mainMenu=Main Menu # ------------------------------------------------------------------ Maintenance @@ -730,19 +746,14 @@ maintenance.message.reset=Successfully reset the hit count of your Roller weblog # ----------------------------------------------------------- Media file management -mediaFileImageChooser.subtitle=Choose an image -mediaFileImageChooser.rootPageTip=Click to choose an image or click on a \ -directory to enter it. -mediaFileImageChooser.dirPageTip=Click to choose an image or use the Switch to Folder \ -drop-down to move to another directory. - +mediaFileImageChooser.subtitle=Choose a Media File to be inserted +mediaFileImageChooser.pageTip=Select an image and it will be included as a thumbnail, or select a file and it will be included as a link. # -- Media File Add -mediaFileAdd.title=Add new media file(s) -mediaFileAdd.pageTip=Use this page to upload up to five new media files. \ -Form fields that you set below will be applied to all files uploaded. -mediaFileAdd.fileLocation=Choose file to upload +mediaFileAdd.title=Add new media file +mediaFileAdd.pageTip=Use this page to upload up to five new media files. The name, description, tags and other properties will be applied to all files uploaded. +mediaFileAdd.fileLocation=Choose media files to upload mediaFileAdd.tags=Tags (space separated) mediaFileAdd.copyright=Copyright statement mediaFileAdd.directory=Folder @@ -754,21 +765,8 @@ mediaFileAdd.errorUploading=Error uploading file {0} #--- Media File Success mediaFileAddSuccess.title=Media File Upload Complete -mediaFileSuccess.subtitle=Create a new weblog entry? -mediaFileSuccess.pageTip=Your upload was successful. If you would like to \ -create a new weblog entry including your newly uploaded files then use the \ -form below to select the file(s) to be included. For images, we will include \ -them in your post as thumbnails. For other file types you can choose one to \ -be attached to the new post as an enclosure (i.e. a podcast). -mediaFileSuccess.createPost=Create a weblog post using your new upload -mediaFileSuccess.addAnother=Upload another media file -mediaFileSuccess.createPostPrompt=Once you have selected the file(s) you want, \ -click the button to create your new weblog entry. -mediaFileSuccess.noEnclosure=No enclosure -mediaFileSuccess.selectEnclosure=You can select one file (or none) to be \ -included in the weblog entry as an RSS/Atom enclosure (i.e. as a podcast): -mediaFileSuccess.selectImages=Select the the images that you would like to \ -include in your new weblog entry: +mediaFileSuccess.subtitle=Your upload was successful +mediaFileSuccess.pageTip=If you wish, you can now create a new weblog post including images or files you just uploaded. mediaFileSuccess.name=Name: mediaFileSuccess.size=Size: @@ -777,13 +775,19 @@ mediaFileSuccess.link=Link: mediaFileSuccess.pixels=pixels mediaFileSuccess.bytes=bytes -mediaFileSuccess.noThanks=Not interested? Here are some other options: -mediaFileSuccess.mediaFileView=Return to Media File View +mediaFileSuccess.selectImagesTitle=Select images +mediaFileSuccess.selectImages=Select the the images that you would like to include in your new weblog entry as thumbnails. + +mediaFileSuccess.selectEnclosureTitle=Select file enclosure +mediaFileSuccess.selectEnclosure=You can select one file to be included in the new weblog entry as an RSS/Atom enclosure. +mediaFileSuccess.noEnclosure=No enclosure +mediaFileSuccess.createPost=Create new weblog post +mediaFileSuccess.uploadMore=Upload more... # -- Media File Edit -mediaFileEdit.subtitle=Editing media file {0} +mediaFileEdit.subtitle=Editing media file mediaFileEdit.pagetip=You may edit the information stored about this media \ file. Each file must have a name, but all other fields are optional. mediaFileEdit.tags=Tags (space separated) @@ -792,7 +796,7 @@ mediaFileEdit.directory=Folder mediaFileEdit.fileInfo=File info mediaFileEdit.fileTypeSize=Type: {0} Size: {1} bytes mediaFileEdit.fileDimensions=Image: {0} X {1} pixels -mediaFileEdit.includeGallery=Include in Gallery? +mediaFileEdit.includeGallery=Include in Gallery mediaFileEdit.includeGalleryHelp=Check this box if you would like this media \ file included in the new media file RSS and Atom feeds for your weblog. mediaFileEdit.updateFileContents=Update File Contents @@ -814,7 +818,7 @@ to organize your files, and you do not have to worry about "breaking \ URLs" when you move or rename files. mediaFileView.dirPageTip=This is a media file subfolder. -mediaFileView.viewFolder=View Folder +mediaFileView.viewFolder=Folder mediaFileView.sortBy=Sort by @@ -968,7 +972,7 @@ the button below to allow access or simply close this window to deny it. # -------------------------------------------------------------- Page management pagesForm.title=Templates -pagesForm.subtitle=Manage templates that define weblog {0} +pagesForm.subtitle=Manage templates that define weblog {0} pagesForm.tip=You can edit the templates that define the layout, colors and \ fonts of your weblog. You can also create new templates to define entirely \ new pages. This is for advanced users only, if you''re not comfortable \ @@ -1005,11 +1009,13 @@ and code you are allowed to use in a template. This is for advanced \ users only, if you''re not comfortable with HTML, you might want to leave \ your templates alone. NOTE: this is a required weblog template, you cannot \ change the name, link or description. -pageForm.link=Link +pageForm.link=Link (path) +pageForm.resultingUrlWillBe=Resulting URL will be: +pageForm.noUrl=No link! Will be unable to access this new page via the web pageForm.hidden=Hidden -pageForm.hidden.tip=Hidden pages cannot be accessed via a weblog URL -pageForm.navbar=Include in page menu -pageForm.navbar.tip=Include in menu produced by showPageMenu() macro +pageForm.hidden.tip=Hidden pages cannot be accessed via URL +pageForm.navbar=Include in page menu +pageForm.navbar.tip=Include in menu produced by
showPageMenu()
macro pageForm.template=Template pageForm.newTemplateContent= pageForm.save.success=Template updated successfully. @@ -1021,14 +1027,7 @@ scratch or a predefined theme from the Theme tab. pageForm.templateLanguage=Template Language pageForm.outputContentType=Content-Type -pageRemove.subtitle=Confirm removal of page -pageRemoves.subtitle=Confirm removal of pages -pageRemove.youSure=Are you sure you want to remove this page? -pageRemoves.youSure=Are you sure you want to remove these pages? -pageRemoves.youSureWarning=WARNING: This may remove custom html/css design and is NOT REVERSIBLE. \ -You might want to backup your stylesheet if you are not sure. -pageRemove.pageId=Page ID -pageRemove.pageName=Page Name +pageRemove.confirm=Are you sure you want to remove this template: # errors from validation Template.error.nameNull=Name is a required field @@ -1105,18 +1104,16 @@ 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 +# --------------------------------------------------------------- Planet Roller: config planetConfig.title=Planet Configuration -planetConfig.subtitle=Configure Roller''s built-in newsfeed aggregator. -planetConfig.prompt=Set the title, description, email address and site URL \ -to be included in newsfeeds produced by the aggregator. You can also setup a \ -proxy if one is required required by your network. +planetConfig.subtitle=Configure Roller\'s built-in RSS/Atom feed aggregator. +planetConfig.prompt=Roller's Planet feature gives you a way to aggregate all of the weblogs on your site along with feeds from other sites. On this page you can set title, description and email addresses that are to be displayed in the RSS or Atom feeds for your aggregation, and to be used in weblog templates that display your site. You can also configure a proxy if you Roller site requires one. ConfigForm.siteSettings=Planet Settings -ConfigForm.title=Planet title\t -ConfigForm.description=Planet description\t\t -ConfigForm.adminName=Name of Planet administrator \t\t +ConfigForm.title=Planet title +ConfigForm.description=Planet description +ConfigForm.adminName=Name of Planet administrator ConfigForm.adminEmail=Email of Planet administrator ConfigForm.absoluteUrl=Absolute URL to Planet page ConfigForm.proxyHost=Proxy host for feed fetcher @@ -1125,57 +1122,72 @@ ConfigForm.proxyPort=Proxy port for feed fetcher ConfigForm.message.saveSucceeded=Saved Planet configuration ConfigForm.error.saveFailed=Error saving Planet configuration +ConfigForm.invalidBooleanProperty=Property {0} must be a boolean: {1} +ConfigForm.invalidIntegerProperty=Property {0} must be an integer: {1} +ConfigForm.invalidFloatProperty=Property {0} must be a float: {1} +ConfigForm.invalidProperty=Property {0} is null -# ----------------------------------------------------- PlanetSubscriptions.jsp +# ----------------------------------------------------- Planet Roller: group subscriptions -planetSubscriptions.title=Subscriptions +planetGroupSubs.default.title=Default Planet Group Subscriptions +planetGroupSubs.default.subtitle=Manage feed subscriptions for Roller's Default Planet Group +planetGroupSubs.default.desc=By default, Roller's Planet feature includes all weblogs on this Roller site in the aggregation. On this page you can add RSS and Atom feeds from other sites to this aggregation. -planetSubscriptions.subtitle.add=\ -Manage newsfeed subscriptions in group [{0}]. -planetSubscriptions.prompt.add=To add a new subscription simply enter a \ -newsfeed URL then click the Save button. +planetGroupSubs.custom.title=Custom Planet Group {0} +planetGroupSubs.custom.title.new=New Custom Planet Group +planetGroupSubs.custom.subtitle=Manage feed subscriptions for Custom Planet Group {0} +planetGroupSubs.custom.desc=This is a Custom Planet Group. Once you have added one or more RSS/Atom feeds here Roller will create an aggregated feed that containing entries from all of the feeds you add. You can display that aggregated feed in a blog template or access it via URL. -planetSubscriptions.subtitle.addMain=\ -Managing the main list of newsfeed subscriptions. -planetSubscriptions.prompt.addMain=Use this page to add \ -subscriptions to the list of newsfeeds that are to be included on the main \ -Planet aggregator page. To add a new subscription simply enter a \ -newsfeed URL then click the Save button. +planetGroupSubs.custom.subtitle.new=Creating a new Custom Planet Group -planetSubscriptions.existingTitle=Existing Subscriptions -planetSubscriptions.column.title=Title -planetSubscriptions.column.feedUrl=Feed URL -planetSubscription.feedUrl=Newsfeed URL +planetGroupSubs.addFeed=Add a new RSS/Atom feed subscription +planetGroupSubs.creatingNewGroup=Before you can add subscriptions you must set a name and handle for your new Custom Planet Feed. +planetGroupSubs.editingExistingGroup=You can edit the name and handle for the group, but be aware that changing the handle will change the URL of the Planet Group. + +planetGroupSubs.noneDefinedCustom=No feed subscriptions exist for this Custom Planet Group +planetGroupSubs.noneDefinedDefault=No additional feeds have been added to the Default Planet Group + +planetGroupSubs.properties=Properties +planetGroupSubs.subscriptions=Subscriptions +planetGroupSubs.column.title=Title +planetGroupSubs.column.feedUrl=Feed URL +planetSubscription.feedUrl=Feed URL planetSubscription.success.deleted=Subscription successfully deleted planetSubscription.foundExisting=Found existing subscription [{0}], adding it instead planetSubscription.success.saved=Saved subscription -planetSubscription.error=Must specify newfeed URL -planetSubscription.error.feedUrl=Newsfeed URL is required -planetSubscriptions.error.duringSave=Duplicate subscription? - {0} +planetSubscription.error=Must specify feed URL +planetSubscription.error.feedUrl=Feed URL is required +planetGroupSubs.error.duringSave=Unexpected error saving subscription: {0} +planetGroupSubs.error.fetchingFeed=Error fetching subscription: {0} planetSubscription.error.deleting=Error deleting object -# ------------------------------------------------------------ PlanetGroups.jsp +planetGroupSubs.badFeedURL=Invalid URL + +planetGroupSubs.delete.confirm=Are you sure you want to delete this subscription? + +# ------------------------------------------------------------ Planet Roller: groups planetGroups.pagetitle=Custom Planet Groups -planetGroups.subtitle=Add custom aggregation groups, each available as a newsfeed. +planetGroups.subtitle=Manage Custom Planet Groups, each available for use in weblog templates or as a feed. -planetGroups.prompt.add=To create a group, \ -just enter a display name and a unique handle to be used in the newsfeed URL \ -then click Save. -planetGroups.prompt.edit=You are editing a custom aggregation group. Make \ -your changes and then click Save. Or, use click Delete to remove it. +planetGroups.prompt.add=To create a group, just enter a display name and a unique handle to be used in the feed URL then click Save. +planetGroups.prompt.edit=You are editing a custom aggregation group. Make your changes and then click Save. Or, use click Delete to remove it. planetGroups.existingTitle=Existing Custom Aggregation Groups planetGroups.existingPrompt=Select an existing custom aggregation group to edit. +planetGroups.noneDefined=No Custom Planet Groups defined. + planetGroups.column.title=Title planetGroups.column.subscriptions=Subscriptions planetGroups.column.handle=Handle -planetGroups.tip.title=Title of group -planetGroups.tip.handle=Handle of this group +planetGroups.tip.title=Title of the group for display purposes. +planetGroups.tip.handle=Handle of this group. A simple string with no spaces to be used in the group's URL. planetGroups.edit.tip=Edit this group +planetGroupSubs.subscriptionDesc=Add subscriptions to this group via the form on the right. + planetGroups.title=Title planetGroups.handle=Handle @@ -1188,6 +1200,8 @@ planetGroups.error.title=Title is required planetGroups.error.handle=Handle is required planetGroups.error.nameReserved=Can''t use handle ''all'' +planetGroups.delete.confirm=Are you sure you want to remove this group? + # ------------------------------------------------------------------ Statistics statCount.weblogCommentCountType=Weblog comment count @@ -1197,30 +1211,53 @@ statCount.weblogDayHits=Today''s hit count # ------------------------------------------------------------------ Stylesheet Editor stylesheetEdit.title=Stylesheet + stylesheetEdit.subtitle=Edit weblog custom stylesheet -stylesheetEdit.tip=This form allows you to edit the stylesheet for your theme. -stylesheetEdit.revertTip=If you run into any problems you don''t know how to \ -fix you can start over at any time by clicking the restore button. Please backup your stylesheet! -stylesheetEdit.revertTip1=If you have not customized your stylesheet here, \ -please use the Shared Theme default by clicking the delete stylesheet button. \ -This will ensure you are using the latest version and any changes will be picked up. -stylesheetEdit.revert=Restore Stylesheet -stylesheetEdit.delete=Delete Stylesheet +stylesheetEdit.copyStylesheet=Copy Stylesheet +stylesheetEdit.copyStylesheetTip=Copy Shared Theme's stylesheet into your weblog so you can edit it. + +stylesheetEdit.standard=Standard + +stylesheetEdit.mobile=Mobile + +stylesheetEdit.tip=This form allows you to edit the customizable CSS Stylesheet for your theme. + +stylesheetEdit.youCanCustomize=\ +

You can customize! \ + The theme you are using provides a customizable stylesheet. If you make changes to it \ + here you will see those changes reflected in the theme pages that include the stylesheet.

\ +

You can also choose to Revert your copy of the stylesheet so that it matches the default one from \ + the theme. Or you can Delete your copy so that this weblog will use the Shared Theme's stylesheet instead.

+ +stylesheetEdit.sharedThemeWithStylesheet=\ +

The Shared Theme you are using provides a customizable stylesheet.

\ +

Would you like to copy that stylesheet into your weblog so you can edit it?

+ +stylesheetEdit.sharedThemeNoStylesheetSupport=\ +

The Shared Theme you are using does not provide a customizable stylesheet.

\ +

Choose another theme if you want to be able to customize your CSS.

+ +stylesheetEdit.customThemeNoStylesheet=\ + The Custom Theme you are using does not provide a customizable stylesheet, but since \ + you are using a Custom Theme, you can add any stylesheets and new templates that you wish. + +stylesheetEdit.revert=Revert +stylesheetEdit.revertTip=Reverts this weblog's copy to match the Shared Theme's default stylesheet. + +stylesheetEdit.delete=Delete +stylesheetEdit.deleteTip=Delete's this weblog's copy setup weblog to use the Shared Theme's default stylesheet. stylesheetEdit.create.success=Custom stylesheet created successfully. + stylesheetEdit.save.success=Stylesheet updated successfully. + stylesheetEdit.revert.success=Stylesheet reverted successfully. -stylesheetEdit.default.success=Stylesheet deleted successfully. Your theme is now using the Shared Theme default. -stylesheetEdit.noOverridableStylesheetAvailable=\ -The theme you''re using does not define a customizable stylesheet in its descriptor. You can choose another shared theme, or for \ - custom themes, create the stylesheet on the templates tab instead. +stylesheetEdit.default.success=Stylesheet deleted successfully. Your theme is now using the Shared Theme default. -stylesheetEdit.canRecreateStylesheetOverride=Note: clicking the stylesheet tab again will \ -recreate a custom override stylesheet from the theme default. +stylesheetEdit.confirmDelete=Are you sure you want to delete your stylesheet and use the themes default instead? -stylesheetEdit.confirmDelete=Are you sure you want to delete your stylesheet? stylesheetEdit.confirmRevert=Are you sure you want to revert your stylesheet to the theme default? # ------------------------------------------------------------------ Tabbed Menu @@ -1253,7 +1290,7 @@ tabbedmenu.admin.cacheInfo=Cache Info tabbedmenu.planet=Planet Admin tabbedmenu.admin.planetConfig=Configuration -tabbedmenu.admin.planetSubscriptions=Subscriptions +tabbedmenu.admin.planetGroupSubs=Subscriptions tabbedmenu.admin.planetGroups=Custom Groups # ---------------------------------------------------------------------- Search @@ -1266,7 +1303,7 @@ searchSummary.text=Showing {0} - {1} of total {2} search results # ----------------------------------------------------------------------- Theme themeEditor.title=Weblog Theme -themeEditor.subtitle=Select theme for weblog {0} +themeEditor.subtitle=Define the theme for weblog {0}. themeEditor.sharedTheme=Shared Theme themeEditor.sharedThemeDescription=This option is for users who don''t \ @@ -1281,21 +1318,37 @@ Beware though, managing a blog design of your own takes a bit of effort. themeEditor.yourCurrentTheme=Your current theme is themeEditor.yourCustomStylesheet=using custom override stylesheet. themeEditor.yourThemeStyleSheet=using the Shared Theme default stylesheet. -themeEditor.selectTheme=Select a new shared theme for your blog + +themeEditor.youAreUsingACustomTheme=This weblog is using a custom theme. + +themeEditor.thisTheme=This theme: + +themeEditor.proposedChangeToShared=You are proposing to switch from a Custom Theme to a new Shared Theme. + +themeEditor.proposedSharedThemeChange=You are proposing to switch to a new Shared Theme. + +themeEditor.proposedSharedChangeToCustom=You are proposing to switch from a Shared Theme to a Custom Theme. + +themeEditor.selectTheme=Select a new shared theme for your blog: themeEditor.preview=Preview Theme themeEditor.save=Update Theme -themeEditor.previewDescription=Prior to changing your theme, the preview option below \ -can be used to see how your blog''s main front page would look with the new theme. +themeEditor.previewDescription=Before you update your theme you can use Preview Theme \ + to launch a new browser window and see what your blog will look like with the new theme. + +themeEditor.importWarning=WARNING: Updating your custom theme will overwrite \ + some of your existing templates. + +themeEditor.importRequired=Since this is the first time using a custom theme, \ + Roller will copy the templates from your existing Shared Theme so you can edit them. + +themeEditor.importAndOverwriteTemplates=Import the Shared Theme selected above and overwrite \ + existing custom theme. -themeEditor.importWarning=WARNING: Updating your custom theme may overwrite some of your existing templates. -themeEditor.importRequired=Since this is the first time you are going to try a \ -custom theme you must first copy templates from an existing theme. -themeEditor.importAndOverwriteTemplates=Also import a theme into my already existing custom templates, overwriting any with the same name. -themeEditor.importAndOverwriteTemplates.tooltip=This blog already has custom templates defined on the Templates tab. \ - Select this option to import a shared theme's templates, overwriting any of your existing templates that have the same name as the shared theme's \ - templates. Leave this unchecked to just switch to custom with your present templates. +themeEditor.existingTemplatesWarning=This blog already has a custom theme defined so you need to \ + make a choice. Do you want to switch back to using that theme, or do you want to over write that \ + theme with the Shared Theme currently in use? themeEditor.setTheme.success=Theme set to {0} themeEditor.setCustomTheme.success=Shared theme {0} imported into custom templates themeEditor.setCustomTheme.instructions=Use the Stylesheet and Templates tabs above to edit your custom theme. @@ -1326,6 +1379,8 @@ userSettings.tip.username=Usernames can''t be changed. # ----------------------------------------------------------------- Your profile (profile.jsp) yourProfile.title=Your Profile +yourProfile.passwordsNotSame=Password and Password (confirm) do not match +yourProfile.requiredFields=Screen name, full name and email are required # ------------------------------------------------------------------- User admin @@ -1418,7 +1473,8 @@ userRegister.tip.openid.only=This site uses only OpenID for logins, so please \ specify your OpenID identifier below. For more information about OpenID see \ http://openid.net. -userRegister.tip.password=Your password. Fill in only if you wish to change it. +userRegister.tip.password=Your password. +userSettings.tip.password=Your password. Fill-in only if you wish to change it. userRegister.tip.passwordConfirm=Confirm your password. userRegister.tip.openIdUrl=Your OpenID identifier (in the form of a URL). @@ -1495,7 +1551,7 @@ weblogEdit.publishedEntries=Recent Entries weblogEdit.post=Post to Weblog weblogEdit.permaLink=Permalink weblogEdit.published=Published -weblogEdit.pubTime=Pub Time  +weblogEdit.pubTime=Publishing Time weblogEdit.save=Save as Draft weblogEdit.scheduled=Scheduled weblogEdit.scheduledEntries=Scheduled Entries @@ -1511,8 +1567,9 @@ weblogEdit.unsaved=Not saved weblogEdit.updateTime=Last updated weblogEdit.allowComments=Allow comments -weblogEdit.commentDays=for -weblogEdit.unlimitedCommentDays=unlimited days +weblogEdit.commentDays=How long to allow comments +weblogEdit.commentsNotAllowed=Comments not allowed +weblogEdit.unlimitedCommentDays=Unlimited days weblogEdit.days3=3 days weblogEdit.days7=7 days weblogEdit.days14=14 days @@ -1722,7 +1779,7 @@ NOT REVERSIBLE. websiteRemove.title=Confirm Weblog Remove websiteRemove.subtitle=Weblog removal is NOT REVERSIBLE -websiteRemove.youSure=Are you sure you want to remove weblog [{0}]? +websiteRemove.youSure=Are you sure you want to remove the weblog {0}? websiteRemove.websiteId=Weblog ID websiteRemove.websiteName=Weblog Name websiteRemove.success=Successfully removed weblog [{0}] @@ -1751,19 +1808,20 @@ activate your user account by clicking the link that is sent to you via e-mail. # ---------------------------------------------------------------- Your Weblogs -yourWebsites.title=Main Menu - yourWebsites.actions=Actions +yourWebsites.title=Your Weblogs +yourWebsites.actions=Actions -yourWebsites.prompt.noBlog=You''ve got a user account, but no weblog. \ +yourWebsites.prompt.noBlog=You have a user account, but no weblog. \ Would you like to yourWebsites.createOne=create one? -yourWebsites.prompt.hasBlog=Select a weblog to edit, manage, or configure. +yourWebsites.prompt.hasBlog=Access your weblogs here or create a new one. yourWebsites.accept=accept yourWebsites.decline=decline yourWebsites.resign=Resign +yourWebsites.youHave=You have yourWebsites.permission=Permission yourWebsites.confirmResignation=Are you sure you wish to resign from weblog [{0}]? yourWebsites.weblog=Link @@ -1778,8 +1836,8 @@ yourWebsites.createWeblog=Create new weblog yourWebsites.createWeblog.desc=\ Feel like you''ve got more to say? Maybe another weblog is what you need. -yourWebsites.editProfile=Edit user profile -yourWebsites.editProfile.desc=Change user info, locale, timezone. +yourWebsites.editProfile=Your Profile +yourWebsites.editProfile.desc=Change user info, password, timezone yourWebsites.oauthKeys=OAuth Credentials yourWebsites.oauthKeys.desc=Enable other sites and programs to access your \ diff --git a/app/src/main/resources/ApplicationResources_de.properties b/app/src/main/resources/ApplicationResources_de.properties index e5c9cfa71b..a4f150e149 100644 --- a/app/src/main/resources/ApplicationResources_de.properties +++ b/app/src/main/resources/ApplicationResources_de.properties @@ -607,15 +607,15 @@ planetSubscription.feedUrl=Newsfeed-URL planetSubscription.foundExisting=Abonnement [{0}] exisitiert bereits, es wurde aber trotzdem hinzugef\u00FCgt planetSubscription.success.deleted=Abonnement erfolgreich gel\u00F6scht planetSubscription.success.saved=Abonnement gespeichert -planetSubscriptions.column.feedUrl=Feed-URL -planetSubscriptions.column.title=Titel -planetSubscriptions.error.duringSave=Doppeltes Abonnement? - {0} -planetSubscriptions.existingTitle=Existierende Abonnements -planetSubscriptions.prompt.add=Um ein neues Abonnement hinzuzuf\u00FCgen geben Sie bitte die URL des Newsfeed ein und klicken dann auf Speichern. -planetSubscriptions.prompt.addMain=Nutzen Sie diese Seite zum Hinzuf\u00FCgen von Abonnements zu der Liste der Newsfeeds, welche in der Haupt-Planet-Aggregator-Seite enthalten sein sollen. Um ein neues Abonnement hinzuzuf\u00FCgen geben Sie einfach die Adresse des Newsfeed ein und klicken Sie auf Speichern. -planetSubscriptions.subtitle.add=Verwaltung der Newsfeed Abonnements in der Gruppe [{0}]. -planetSubscriptions.subtitle.addMain=Verwalten der Hauptliste der Newsfeed Abonnements. -planetSubscriptions.title=Abonnements +planetGroupSubs.column.feedUrl=Feed-URL +planetGroupSubs.column.title=Titel +planetGroupSubs.error.duringSave=Doppeltes Abonnement? - {0} +planetGroupSubs.existingTitle=Existierende Abonnements +planetGroupSubs.prompt.add=Um ein neues Abonnement hinzuzuf\u00FCgen geben Sie bitte die URL des Newsfeed ein und klicken dann auf Speichern. +planetGroupSubs.prompt.addMain=Nutzen Sie diese Seite zum Hinzuf\u00FCgen von Abonnements zu der Liste der Newsfeeds, welche in der Haupt-Planet-Aggregator-Seite enthalten sein sollen. Um ein neues Abonnement hinzuzuf\u00FCgen geben Sie einfach die Adresse des Newsfeed ein und klicken Sie auf Speichern. +planetGroupSubs.subtitle.add=Verwaltung der Newsfeed Abonnements in der Gruppe [{0}]. +planetGroupSubs.subtitle.addMain=Verwalten der Hauptliste der Newsfeed Abonnements. +planetGroupSubs.title=Abonnements searchPager.home=Startseite searchPager.next=N\u00E4chste Seite searchPager.prev=Vorige Seite @@ -637,7 +637,7 @@ tabbedmenu.admin.config=Konfiguration tabbedmenu.admin.pingTargets=Ping Ziele tabbedmenu.admin.planetConfig=Konfiguration tabbedmenu.admin.planetGroups=Benutzerdefinierte Gruppen -tabbedmenu.admin.planetSubscriptions=Abonnements +tabbedmenu.admin.planetGroupSubs=Abonnements tabbedmenu.admin.userAdmin=Benutzerverwaltung tabbedmenu.bookmarks.allFolders=Blogroll tabbedmenu.design=Design @@ -672,7 +672,7 @@ themeEditor.yourCurrentTheme=Ihre aktuelles Thema ist uploadFiles.error.badPath=Der Pfad [{0}] ist ung\u00FCltig. Pfade d\u00FCrfen keine "/", "", oder ".." enthalten. uploadFiles.error.upload=Hochladen von [{0}] fehlgeschlagen uploadFiles.upload=Hochladen -# ----------------------------------------------------- PlanetSubscriptions.jsp +# ----------------------------------------------------- PlanetGroupSubs.jsp uploadFiles.uploadedFile={0} uploadFiles.uploadedFiles=Hochgeladene Datei(en): user.account.activation.mail.content=

Zum Aktivieren Ihres neuen Roller-Benutzerkontos mit dem Benutzernamen [{1}] klicken Sie bitte auf den folgenden Link:

{2}

diff --git a/app/src/main/resources/ApplicationResources_es.properties b/app/src/main/resources/ApplicationResources_es.properties index bdf6ec7372..7799536088 100644 --- a/app/src/main/resources/ApplicationResources_es.properties +++ b/app/src/main/resources/ApplicationResources_es.properties @@ -338,20 +338,20 @@ 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 -planetSubscriptions.title=Suscripciones -planetSubscriptions.subtitle.add=Administrar suscripciones de noticias en el grupo [{0}]. -planetSubscriptions.prompt.add=Para a\u00F1adir una nueva suscripci\u00F3n simplemente introduzca el t\u00EDtulo, la URL de la suscripci\u00F3n de noticias y la URL del sitio, finalmente haga click en el bot\u00F3n Guardar. -planetSubscriptions.subtitle.addMain=Administrando la lista principal de suscripciones de noticias. -planetSubscriptions.prompt.addMain=Use esta p\u00E1gina para a\u00F1adir y editar suscripciones\: la lista de suscripciones de noticias que se incluye en la p\u00E1gina principal del agregador Planet. Para a\u00F1adir una nueva suscripci\u00F3n simplemente introduzca el t\u00EDtulo, el t\u00EDtulo, la URL de la suscripci\u00F3n de noticias y la URL del sitio, finalmente haga click en el bot\u00F3n Guardar. -planetSubscriptions.existingTitle=Suscripciones existentes -planetSubscriptions.column.title=T\u00EDtulo -planetSubscriptions.column.feedUrl=URL de la suscripci\u00F3n +planetGroupSubs.title=Suscripciones +planetGroupSubs.subtitle.add=Administrar suscripciones de noticias en el grupo [{0}]. +planetGroupSubs.prompt.add=Para a\u00F1adir una nueva suscripci\u00F3n simplemente introduzca el t\u00EDtulo, la URL de la suscripci\u00F3n de noticias y la URL del sitio, finalmente haga click en el bot\u00F3n Guardar. +planetGroupSubs.subtitle.addMain=Administrando la lista principal de suscripciones de noticias. +planetGroupSubs.prompt.addMain=Use esta p\u00E1gina para a\u00F1adir y editar suscripciones\: la lista de suscripciones de noticias que se incluye en la p\u00E1gina principal del agregador Planet. Para a\u00F1adir una nueva suscripci\u00F3n simplemente introduzca el t\u00EDtulo, el t\u00EDtulo, la URL de la suscripci\u00F3n de noticias y la URL del sitio, finalmente haga click en el bot\u00F3n Guardar. +planetGroupSubs.existingTitle=Suscripciones existentes +planetGroupSubs.column.title=T\u00EDtulo +planetGroupSubs.column.feedUrl=URL de la suscripci\u00F3n planetSubscription.feedUrl=URL de la suscripci\u00F3n de noticias planetSubscription.success.deleted=Suscripci\u00F3n eliminada con \u00E9xito planetSubscription.success.saved=Suscripci\u00F3n guardada planetSubscription.error=Debe especificar la URL de la suscripci\u00F3n de noticias planetSubscription.error.feedUrl=La URL de la suscripci\u00F3n de noticias es obligatoria -planetSubscriptions.error.duringSave=\u00BFSuscripci\u00F3n repetida? - {0} +planetGroupSubs.error.duringSave=\u00BFSuscripci\u00F3n repetida? - {0} planetSubscription.error.deleting=Error eliminando objeto planetGroups.pagetitle=Grupos Planet personalizados planetGroups.subtitle=A\u00F1adir agregador personalizado de grupos, disponible en forma de suscripci\u00F3n de noticias. @@ -394,7 +394,7 @@ tabbedmenu.admin.pingTargets=Objetivos ping tabbedmenu.admin.cacheInfo=Informaci\u00F3n de cach\u00E9 tabbedmenu.planet=Administraci\u00F3n de Planet tabbedmenu.admin.planetConfig=Configuraci\u00F3n -tabbedmenu.admin.planetSubscriptions=Suscripciones +tabbedmenu.admin.planetGroupSubs=Suscripciones tabbedmenu.admin.planetGroups=Grupos personalizados themeEditor.title=Tema del weblog themeEditor.subtitle=Seleccionar tema para el weblog {0} diff --git a/app/src/main/resources/ApplicationResources_fr.properties b/app/src/main/resources/ApplicationResources_fr.properties index 32cf84af4a..5332039429 100644 --- a/app/src/main/resources/ApplicationResources_fr.properties +++ b/app/src/main/resources/ApplicationResources_fr.properties @@ -709,26 +709,26 @@ ConfigForm.proxyHost=Nom du serveur Proxy ConfigForm.proxyPort=Port du serveur Proxy #pour la récuperation des fils d'information -# ----------------------------------------------------- PlanetSubscriptions.jsp +# ----------------------------------------------------- PlanetGroupSubs.jsp -planetSubscriptions.title=Souscriptions +planetGroupSubs.title=Souscriptions -planetSubscriptions.subtitle.add=\ +planetGroupSubs.subtitle.add=\ Gestion des souscriptions aux fils d'information dans le groupe [{0}]. -planetSubscriptions.prompt.add=Pour ajouter une nouvelle souscription, entrez son titre, \ +planetGroupSubs.prompt.add=Pour ajouter une nouvelle souscription, entrez son titre, \ l'adresse URL du fil d'information et celle du site, puis cliquez sur 'Enregistrer'. -planetSubscriptions.subtitle.addMain=\ +planetGroupSubs.subtitle.addMain=\ Gérer la liste principale de souscriptions aux fils d'information. -planetSubscriptions.prompt.addMain=Utilisez cette page pour ajouter ou éditer les souscriptions qui \ +planetGroupSubs.prompt.addMain=Utilisez cette page pour ajouter ou éditer les souscriptions qui \ s'ajouterons à la page d'aggrégation de Planet. \ Pour ajouter une nouvelle souscription, entrez son titre, \ l'adresse URL du fil d'information et celle du site, puis cliquez sur 'Enregistrer'. -planetSubscriptions.existingTitle=Souscriptions existantes +planetGroupSubs.existingTitle=Souscriptions existantes -planetSubscriptions.column.title=Titre -planetSubscriptions.column.feedUrl=URL du fil +planetGroupSubs.column.title=Titre +planetGroupSubs.column.feedUrl=URL du fil planetSubscription.feedUrl=URL du fil d'information @@ -739,7 +739,7 @@ planetSubscription.success.saved=Souscription enregistrée planetSubscription.error=Vous devez specifier une adresse URL pour le fil d'information planetSubscription.error.feedUrl=URL du fil requise -planetSubscriptions.error.duringSave=La souscription {0} semble déjà exister +planetGroupSubs.error.duringSave=La souscription {0} semble déjà exister de la souscription. # ------------------------------------------------------------ PlanetGroups.jsp @@ -807,7 +807,7 @@ tabbedmenu.admin.cacheInfo=Cache tabbedmenu.planet=Admin. Planet tabbedmenu.admin.planetConfig=Configuration -tabbedmenu.admin.planetSubscriptions=Souscriptions +tabbedmenu.admin.planetGroupSubs=Souscriptions tabbedmenu.admin.planetGroups=Groupes personnalisés # ---------------------------------------------------------------------- Search diff --git a/app/src/main/resources/ApplicationResources_ja.properties b/app/src/main/resources/ApplicationResources_ja.properties index 03b5a9d0d7..5a210c2a5e 100644 --- a/app/src/main/resources/ApplicationResources_ja.properties +++ b/app/src/main/resources/ApplicationResources_ja.properties @@ -548,7 +548,7 @@ pingTarget.unknownHost=\u3053\u306EURL\u306E\u30DB\u30B9\u30C8\u304C\u898B\u4ED8 planetConfig.subtitle=Roller\u5185\u8535\u306E\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9\u30FB\u30A2\u30B0\u30EA\u30B2\u30FC\u30BF\u3092\u8A2D\u5B9A planetConfig.title=Planet \u8A2D\u5B9A -# ----------------------------------------------------- PlanetSubscriptions.jsp +# ----------------------------------------------------- PlanetGroupSubs.jsp planetSubscription.success.saved=\u8CFC\u8AAD\u304C\u4FDD\u5B58\u3055\u308C\u307E\u3057\u305F @@ -1065,7 +1065,7 @@ weblogEntryQuery.scheduled=\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u6E08 categoryForm.changesSaved=\u30AB\u30C6\u30B4\u30EA "{0}" \u304C\u66F4\u65B0\u3055\u308C\u307E\u3057\u305F mediaFileView.dirPageTip=\u3053\u308C\u306F\u30E1\u30C7\u30A3\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u30B5\u30D6\u30D5\u30A9\u30EB\u30C0\u3067\u3059\u3002 userRegister.heading.identification=\u3069\u306E\u3088\u3046\u306B\u8B58\u5225\u3055\u308C\u305F\u3044\u3067\u3059\u304B? -planetSubscriptions.subtitle.add=\u30B0\u30EB\u30FC\u30D7 [{0}] \u306E\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9\u30FB\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u3092\u7BA1\u7406\u3057\u307E\u3059\u3002 +planetGroupSubs.subtitle.add=\u30B0\u30EB\u30FC\u30D7 [{0}] \u306E\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9\u30FB\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u3092\u7BA1\u7406\u3057\u307E\u3059\u3002 pageForm.launch=\u8868\u793A error.unexpected=\u4E88\u671F\u305B\u306C\u30A8\u30E9\u30FC\u3067\u3059\u3002\u30A8\u30E9\u30FC\u304C\u518D\u767A\u3059\u308B\u5834\u5408\u3001\u7BA1\u7406\u8005\u306B\u9023\u7D61\u3057\u3066\u304F\u3060\u3055\u3044\u3002 mediaFileView.date=\u65E5\u4ED8 @@ -1115,7 +1115,7 @@ 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 -planetSubscriptions.title=\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3 +planetGroupSubs.title=\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3 mediaFileView.size=\u30B5\u30A4\u30BA stylesheetEdit.tip=\u3053\u306E\u30D5\u30A9\u30FC\u30E0\u3092\u4F7F\u3063\u3066\u3001\u3042\u306A\u305F\u306E\u30C6\u30FC\u30DE\u306E\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u3092\u7DE8\u96C6\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002 themeEditor.importAndOverwriteTemplates.tooltip=\u3053\u306E\u30D6\u30ED\u30B0\u306F\u3001\u3059\u3067\u306B\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u30FB\u30BF\u30D6\u3067\u5B9A\u7FA9\u3055\u308C\u305F\u30AB\u30B9\u30BF\u30E0\u30FB\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092\u6301\u3063\u3066\u3044\u307E\u3059\u3002\u5171\u6709\u30C6\u30FC\u30DE\u3068\u540C\u540D\u306E\u65E2\u5B58\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092\u4E0A\u66F8\u304D\u3057\u305F\u3044\u5834\u5408\u306F\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u65E2\u5B58\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092\u4F7F\u3063\u3066\u5358\u306B\u30AB\u30B9\u30BF\u30E0\u30FB\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092\u5207\u308A\u66FF\u3048\u305F\u3044\u5834\u5408\u306F\u9078\u629E\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002 @@ -1157,7 +1157,7 @@ weblogEdit.draftSaved=\u4E0B\u66F8\u304D\u304C\u4FDD\u5B58\u3055\u308C\u307E\u30 maintenance.message.reset=\u30A2\u30AF\u30BB\u30B9\u30AB\u30A6\u30F3\u30BF\u304C\u6B63\u5E38\u306B\u30EA\u30BB\u30C3\u30C8\u3055\u308C\u307E\u3057\u305F email.comment.commenter.email=\u30B3\u30E1\u30F3\u30C8\u6295\u7A3F\u8005\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9 welcome.user.account.not.activated=\u30B7\u30B9\u30C6\u30E0\u306B\u30ED\u30B0\u30A4\u30F3\u3059\u308B\u306B\u306F\u3001\u30E1\u30FC\u30EB\u3067\u9001\u4FE1\u3055\u308C\u305F\u30EA\u30F3\u30AF\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u3042\u306A\u305F\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u3092\u6709\u52B9\u5316\u3057\u306A\u3051\u308C\u3070\u306A\u308A\u307E\u305B\u3093\u3002 -planetSubscriptions.prompt.add=\u65B0\u3057\u3044\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u3092\u8FFD\u52A0\u3059\u308B\u306B\u306F\u3001\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9URL\u3092\u5165\u529B\u3057\u3066\u3001\u4FDD\u5B58\u30DC\u30BF\u30F3\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u304F\u3060\u3055\u3044\u3002 +planetGroupSubs.prompt.add=\u65B0\u3057\u3044\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u3092\u8FFD\u52A0\u3059\u308B\u306B\u306F\u3001\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9URL\u3092\u5165\u529B\u3057\u3066\u3001\u4FDD\u5B58\u30DC\u30BF\u30F3\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u304F\u3060\u3055\u3044\u3002 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 @@ -1188,10 +1188,10 @@ mediaFileView.folderName=\u30D5\u30A9\u30EB\u30C0 weblogEdit.enclosureURL=\u30A8\u30F3\u30AF\u30ED\u30FC\u30B8\u30E3URL userRegister.success.ready=\u30D5\u30A9\u30FC\u30E0\u306F\u554F\u984C\u306A\u304F\u5165\u529B\u3055\u308C\u3066\u3044\u308B\u3088\u3046\u3067\u3059\u3002\u4EE5\u4E0B\u306E\u30DC\u30BF\u30F3\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u304F\u3060\u3055\u3044\u3002 pageForm.tip=\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092\u7DE8\u96C6\u3057\u3066\u3001\u751F\u6210\u3055\u308C\u308B\u30DA\u30FC\u30B8\u3092\u5909\u66F4\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3067\u4F7F\u7528\u3059\u308B\u3053\u3068\u306E\u3067\u304D\u308B\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u304A\u3088\u3073\u30B3\u30FC\u30C9\u306B\u3064\u3044\u3066\u306FRoller\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u30FB\u30AC\u30A4\u30C9\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u3053\u308C\u306F\u4E0A\u7D1A\u30E6\u30FC\u30B6\u30FC\u306E\u305F\u3081\u306E\u3082\u306E\u3067\u3042\u308A\u3001\u3082\u3057\u3042\u306A\u305F\u304CHTML\u306B\u8A73\u3057\u304F\u306A\u3044\u5834\u5408\u306F\u305D\u306E\u307E\u307E\u306B\u3057\u3066\u304A\u3044\u305F\u65B9\u304C\u826F\u3044\u3067\u3057\u3087\u3046\u3002 -planetSubscriptions.column.feedUrl=\u30D5\u30A3\u30FC\u30C9URL +planetGroupSubs.column.feedUrl=\u30D5\u30A3\u30FC\u30C9URL mediaFileSuccess.createPost=\u65B0\u3057\u304F\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u3092\u4F7F\u3063\u3066\u65B0\u3057\u3044\u30A8\u30F3\u30C8\u30EA\u3092\u4F5C\u6210\u3059\u308B bookmarkForm.requiredFields={0}\u3068{1}\u306F\u5FC5\u9808\u3067\u3059\u3002 -planetSubscriptions.column.title=\u30BF\u30A4\u30C8\u30EB +planetGroupSubs.column.title=\u30BF\u30A4\u30C8\u30EB bookmarksForm.deleteFolder.confirm=\u30D5\u30A9\u30EB\u30C0\u3068\u3001\u30D5\u30A9\u30EB\u30C0\u306B\u542B\u307E\u308C\u308B\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u524A\u9664\u3057\u3066\u3088\u308D\u3057\u3044\u3067\u3059\u304B? planetSubscription.error=\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9URL\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044 mediaFile.update.success=\u30E1\u30C7\u30A3\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB\u306F\u6B63\u5E38\u306B\u66F4\u65B0\u3055\u308C\u307E\u3057\u305F\u3002 @@ -1241,7 +1241,7 @@ userRegister.error.missingOpenIDOrPassword=Open ID URL\u304B\u30D1\u30B9\u30EF\u createWebsite.disabled=\u7533\u3057\u8A33\u3042\u308A\u307E\u305B\u3093\u304C\u3001\u65B0\u3057\u3044\u30D6\u30ED\u30B0\u306E\u4F5C\u6210\u306F\u3001\u7BA1\u7406\u8005\u306B\u3088\u3063\u3066\u7121\u52B9\u306B\u3055\u308C\u3066\u3044\u307E\u3059\u3002 macro.weblog.postcomment=\u30B3\u30E1\u30F3\u30C8\u3092\u6295\u7A3F Entry.error.categoryNull=\u30AB\u30C6\u30B4\u30EA\u306F\u5FC5\u9808\u9805\u76EE\u3067\u3059 -planetSubscriptions.prompt.addMain=\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u3092\u3001\u30E1\u30A4\u30F3Planet\u30A2\u30B0\u30EA\u30B2\u30FC\u30BF\u30FC\u30FB\u30DA\u30FC\u30B8\u306B\u542B\u307E\u308C\u308B\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9\u4E00\u89A7\u306B\u8FFD\u52A0\u3059\u308B\u306B\u306F\u3053\u306E\u30DA\u30FC\u30B8\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u65B0\u3057\u3044\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u3092\u8FFD\u52A0\u3059\u308B\u306B\u306F\u3001\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9URL\u3092\u5165\u529B\u3057\u3066\u4FDD\u5B58\u30DC\u30BF\u30F3\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u304F\u3060\u3055\u3044\u3002 +planetGroupSubs.prompt.addMain=\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u3092\u3001\u30E1\u30A4\u30F3Planet\u30A2\u30B0\u30EA\u30B2\u30FC\u30BF\u30FC\u30FB\u30DA\u30FC\u30B8\u306B\u542B\u307E\u308C\u308B\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9\u4E00\u89A7\u306B\u8FFD\u52A0\u3059\u308B\u306B\u306F\u3053\u306E\u30DA\u30FC\u30B8\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u65B0\u3057\u3044\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u3092\u8FFD\u52A0\u3059\u308B\u306B\u306F\u3001\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9URL\u3092\u5165\u529B\u3057\u3066\u4FDD\u5B58\u30DC\u30BF\u30F3\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u304F\u3060\u3055\u3044\u3002 mediaFileView.audio=\u97F3\u58F0 weblogEdit.mediaCastResponseError=\u30A8\u30F3\u30AF\u30ED\u30FC\u30B8\u30E3\u30FB\u30B5\u30FC\u30D0\u306F\u30A8\u30E9\u30FC\u3092\u8FD4\u3057\u307E\u3057\u305F\u3002\u6B63\u3057\u3044URL\u3067\u3059\u304B? themeEditor.importRequired=\u4ECA\u56DE\u304C\u521D\u3081\u3066\u306E\u30AB\u30B9\u30BF\u30E0\u30FB\u30C6\u30FC\u30DE\u306E\u4F7F\u7528\u3067\u3042\u308B\u305F\u3081\u3001\u65E2\u5B58\u306E\u30C6\u30FC\u30DE\u304B\u3089\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092\u30B3\u30D4\u30FC\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 @@ -1262,7 +1262,7 @@ MediaFile.error.copyrightTextSize=\u8457\u4F5C\u6A29\u8868\u793A\u306F1023\u6587 pageForm.templateLanguage=\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u306E\u8A00\u8A9E mediaFile.deleteFolder.success=\u30D5\u30A9\u30EB\u30C0\u306F\u6B63\u5E38\u306B\u524A\u9664\u3055\u308C\u307E\u3057\u305F\u3002 mediaFileEdit.includesEnclosure=\u3053\u306E\u30A8\u30F3\u30C8\u30EA\u306F\u4EE5\u4E0B\u306E\u30E1\u30C7\u30A3\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB\u30FB\u30A8\u30F3\u30AF\u30ED\u30FC\u30B8\u30E3\u3092\u542B\u307F\u307E\u3059\: -planetSubscriptions.error.duringSave=\u91CD\u8907\u3059\u308B\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3? - {0} +planetGroupSubs.error.duringSave=\u91CD\u8907\u3059\u308B\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3? - {0} weblogEntry.pendingEntryContent=\u30E6\u30FC\u30B6\u30FC [{0}] \u306F\u3001\u3042\u306A\u305F\u306E\u30EC\u30D3\u30E5\u30FC\u3092\u53D7\u3051\u308B\u305F\u3081\u306B\u65B0\u3057\u3044\u30A8\u30F3\u30C8\u30EA\u30FC\u3092\u9001\u4FE1\u3057\u307E\u3057\u305F\u3002\u3053\u306E\u6295\u7A3F\u3092\u30EC\u30D3\u30E5\u30FC\u3057\u3001\u516C\u958B\u3059\u308B\u304B\u30E6\u30FC\u30B6\u30FC [{1}] \u304C\u518D\u5EA6\u7DE8\u96C6\u3067\u304D\u308B\u3088\u3046\u306B\u4E0B\u66F8\u304D\u3068\u3057\u3066\u4FDD\u5B58\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u30EC\u30D3\u30E5\u30FC\u5F85\u3061\u306E\u6295\u7A3F\u3092\u7DE8\u96C6\u3059\u308B\u305F\u3081\u306E\u30EA\u30F3\u30AF\u306F\u3053\u3061\u3089\u3067\u3059\:<{2}> websiteSettings.analyticsTrackingCode=\u30C8\u30E9\u30C3\u30AD\u30F3\u30B0\u30FB\u30B3\u30FC\u30C9 mediaFileView.mb=MB @@ -1295,7 +1295,7 @@ weblogEdit.enclosureURL.tooltip=\u3053\u306E\u30D6\u30ED\u30B0\u30FB\u30A8\u30F3 mediaFile.includeInGallery.error=\u30E1\u30C7\u30A3\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB {0} \u3092\u30AE\u30E3\u30E9\u30EA\u30FC\u306B\u8FFD\u52A0\u3059\u308B\u969B\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 WeblogConfig.error.analyticsCodeSize=\u30A2\u30CA\u30EA\u30C6\u30A3\u30AF\u30B9\u30FB\u30C8\u30E9\u30C3\u30AD\u30F3\u30B0\u30FB\u30B3\u30FC\u30C9\u306F1200\u6587\u5B57\u4EE5\u5185\u3067\u306A\u3051\u308C\u3070\u306A\u308A\u307E\u305B\u3093 Entry.error.titleNull=\u30BF\u30A4\u30C8\u30EB\u306F\u5FC5\u9808\u9805\u76EE\u3067\u3059 -planetSubscriptions.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 +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 @@ -1389,7 +1389,7 @@ mediaFileView.searchTitle=\u691C\u7D22\u7D50\u679C weblogEdit.enclosureLength=\u9577\u3055 weblogEntryQuery.label.startDate=\u958B\u59CB\u65E5 mediaFileEdit.pagetip=\u3053\u306E\u30E1\u30C7\u30A3\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u60C5\u5831\u3092\u7DE8\u96C6\u3057\u307E\u3059\u3002\u305D\u308C\u305E\u308C\u306E\u30D5\u30A1\u30A4\u30EB\u306B\u306F\u540D\u524D\u304C\u5FC5\u8981\u3067\u3059\u304C\u3001\u4ED6\u306E\u9805\u76EE\u306F\u7701\u7565\u3067\u304D\u307E\u3059\u3002 -planetSubscriptions.existingTitle=\u65E2\u5B58\u306E\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3 +planetGroupSubs.existingTitle=\u65E2\u5B58\u306E\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3 stylesheetEdit.default.success=\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u304C\u6B63\u5E38\u306B\u524A\u9664\u3055\u308C\u307E\u3057\u305F\u3002\u5171\u6709\u306E\u30C6\u30FC\u30DE\u30FB\u30C7\u30D5\u30A9\u30EB\u30C8\u304C\u6709\u52B9\u306B\u306A\u308A\u307E\u3057\u305F\u3002 pageRemoves.youSure=\u3053\u306E\u30DA\u30FC\u30B8\u3092\u524A\u9664\u3057\u307E\u3059\u304B\uFF1F mediaFileAdd.fileLocation=\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3059\u308B\u30D5\u30A1\u30A4\u30EB\u3092\u9078\u629E @@ -1429,7 +1429,7 @@ mediaFileSuccess.selectEnclosure=RSS/Atom\u30A8\u30F3\u30AF\u30ED\u30FC\u30B8\u3 mediaFileSuccess.bytes=\u30D0\u30A4\u30C8 mediaFileView.moveSelected=\u9078\u629E\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u3092\u30D5\u30A9\u30EB\u30C0\u306B\u79FB\u52D5\: oauthKeys.urls=OAuth\u306EURL -tabbedmenu.admin.planetSubscriptions=\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3 +tabbedmenu.admin.planetGroupSubs=\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3 weblogEdit.submittedForReview=\u30A8\u30F3\u30C8\u30EA\u30FC\u304C\u30EC\u30D3\u30E5\u30FC\u3092\u53D7\u3051\u308B\u305F\u3081\u306B\u9001\u4FE1\u3055\u308C\u307E\u3057\u305F installer.upgradeTables=\u30C6\u30FC\u30D6\u30EB\u3092\u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9\u3057\u307E\u3059\u304B? configForm.none=\u6307\u5B9A\u306A\u3057 diff --git a/app/src/main/resources/ApplicationResources_ko.properties b/app/src/main/resources/ApplicationResources_ko.properties index 5cad3a163a..cc8144a7c6 100644 --- a/app/src/main/resources/ApplicationResources_ko.properties +++ b/app/src/main/resources/ApplicationResources_ko.properties @@ -778,24 +778,24 @@ ConfigForm.proxyPort=\ud53c\ub4dc \ud398\ucc98 \ud504\ub85d\uc2dc \ud3ec\ud2b8 ConfigForm.message.saveSucceeded=\ud50c\ub798\ub2db \ud658\uacbd \uc124\uc815\uc774 \uc800\uc7a5\ub418\uc5c8\uc2b5\ub2c8\ub2e4. ConfigForm.error.saveFailed=\ud50c\ub798\ub2db \ud658\uacbd \uc124\uc815\uc744 \uc800\uc7a5\ud558\ub294 \uc911\uc5d0 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4. -# ----------------------------------------------------- PlanetSubscriptions.jsp +# ----------------------------------------------------- PlanetGroupSubs.jsp -planetSubscriptions.title=\uad6c\ub3c5 +planetGroupSubs.title=\uad6c\ub3c5 -planetSubscriptions.subtitle.add=\ +planetGroupSubs.subtitle.add=\ \uadf8\ub8f9, [{0}] \ub0b4\uc758 \ub274\uc2a4\ud53c\ub4dc \uad6c\ub3c5 \uad00\ub9ac. -planetSubscriptions.prompt.add=\uc0c8\ub85c\uc6b4 \uad6c\ub3c5\uc744 \ucd94\uac00\ud558\ub824\uba74, \ +planetGroupSubs.prompt.add=\uc0c8\ub85c\uc6b4 \uad6c\ub3c5\uc744 \ucd94\uac00\ud558\ub824\uba74, \ \ub274\uc2a4\ud53c\ub4dc URL\uc744 \uc785\ub825\ud558\uc2e0 \ud6c4 \uc800\uc7a5 \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc2ed\uc2dc\uc624. -planetSubscriptions.subtitle.addMain=\ub274\uc2a4\ud53c\ub4dc \uad6c\ub3c5 \uba54\uc778 \ubaa9\ub85d \uad00\ub9ac -planetSubscriptions.prompt.addMain=\uc774 \ud398\uc774\uc9c0\ub97c \uc0ac\uc6a9\ud558\uc5ec \ +planetGroupSubs.subtitle.addMain=\ub274\uc2a4\ud53c\ub4dc \uad6c\ub3c5 \uba54\uc778 \ubaa9\ub85d \uad00\ub9ac +planetGroupSubs.prompt.addMain=\uc774 \ud398\uc774\uc9c0\ub97c \uc0ac\uc6a9\ud558\uc5ec \ \uba54\uc778 \ud50c\ub798\ub2db \ud1b5\ud569 \uae30\ub2a5 \ud398\uc774\uc9c0\uc5d0 \ud3ec\ud568\ub420 \ub274\uc2a4\ud53c\ub4dc \ubaa9\ub85d\uc5d0 \uad6c\ub3c5\uc744 \ucd94\uac00\ud558\uc2ed\uc2dc\uc624. \ \uc0c8\ub85c\uc6b4 \uad6c\ub3c5\uc744 \ucd94\uac00\ud558\uc2dc\ub824\uba74 \ub274\uc2a4\ud53c\ub4dc URL\uc744 \uc785\ub825\ud558\uc2dc\uace0 \uc800\uc7a5 \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc2ed\uc2dc\uc624. -planetSubscriptions.existingTitle=\uae30\uc874 \uad6c\ub3c5 +planetGroupSubs.existingTitle=\uae30\uc874 \uad6c\ub3c5 -planetSubscriptions.column.title=\uc81c\ubaa9 -planetSubscriptions.column.feedUrl=\ud53c\ub4dc URL +planetGroupSubs.column.title=\uc81c\ubaa9 +planetGroupSubs.column.feedUrl=\ud53c\ub4dc URL planetSubscription.feedUrl=\ub274\uc2a4\ud53c\ub4dc URL planetSubscription.success.deleted=\uad6c\ub3c5\uc774 \uc131\uacf5\uc801\uc73c\ub85c \uc0ad\uc81c\ub418\uc5c8\uc2b5\ub2c8\ub2e4. @@ -804,7 +804,7 @@ planetSubscription.success.saved=\uad6c\ub3c5\uc774 \uc800\uc7a5\ub418\uc5c8\uc2 planetSubscription.error=\ub274\uc2a4\ud53c\ub4dc URL\uc744 \uc124\uc815\ud574\uc57c \ud569\ub2c8\ub2e4. planetSubscription.error.feedUrl=\ub274\uc2a4\ud53c\ub4dc URL\uc744 \uc785\ub825\ud558\uc2ed\uc2dc\uc624. -planetSubscriptions.error.duringSave=\uc911\ubcf5\ub41c \uad6c\ub3c5\uc785\ub2c8\ub2e4 - {0}. +planetGroupSubs.error.duringSave=\uc911\ubcf5\ub41c \uad6c\ub3c5\uc785\ub2c8\ub2e4 - {0}. planetSubscription.error.deleting=\uac1d\uccb4 \uc0ad\uc81c \uc624\ub958 # ------------------------------------------------------------ PlanetGroups.jsp @@ -882,7 +882,7 @@ 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 -tabbedmenu.admin.planetSubscriptions=\uad6c\ub3c5 +tabbedmenu.admin.planetGroupSubs=\uad6c\ub3c5 tabbedmenu.admin.planetGroups=\ucee4\uc2a4\ud140 \uadf8\ub8f9 # ---------------------------------------------------------------------- Search diff --git a/app/src/main/resources/ApplicationResources_ru.properties b/app/src/main/resources/ApplicationResources_ru.properties index efa850c551..ce5c69559c 100644 --- a/app/src/main/resources/ApplicationResources_ru.properties +++ b/app/src/main/resources/ApplicationResources_ru.properties @@ -464,19 +464,19 @@ planetConfig.prompt=\u0417\u0430\u0434\u0430\u0439\u0442\u0435 \u043D\u0430\u043 planetConfig.title=\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 Planet planetConfig.tip.description=\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0449\u0435\u0435\u0441\u044F \u0432 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0435 \u043D\u043E\u0432\u043E\u0441\u0442\u043D\u043E\u0439 \u043B\u0435\u043D\u0442\u044B -# ----------------------------------------------------- PlanetSubscriptions.jsp +# ----------------------------------------------------- PlanetGroupSubs.jsp -planetSubscriptions.title=\u041F\u043E\u0434\u043F\u0438\u0441\u043A\u0438 -planetSubscriptions.subtitle.add=\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0430\u043C\u0438 \u043D\u043E\u0432\u043E\u0441\u0442\u043D\u044B\u0445 \u043B\u0435\u043D\u0442 \u0432 \u0433\u0440\u0443\u043F\u043F\u0435 [{0}] -planetSubscriptions.prompt.add=\u0427\u0442\u043E\u0431\u044B \u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043D\u043E\u0432\u0443\u044E \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0443, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435, URL \u043D\u043E\u0432\u043E\u0441\u0442\u043D\u043E\u0439 \u043B\u0435\u043D\u0442\u044B, URL \u0441\u0430\u0439\u0442\u0430 \u0438 \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u043A\u043D\u043E\u043F\u043A\u0443 "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C" +planetGroupSubs.title=\u041F\u043E\u0434\u043F\u0438\u0441\u043A\u0438 +planetGroupSubs.subtitle.add=\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0430\u043C\u0438 \u043D\u043E\u0432\u043E\u0441\u0442\u043D\u044B\u0445 \u043B\u0435\u043D\u0442 \u0432 \u0433\u0440\u0443\u043F\u043F\u0435 [{0}] +planetGroupSubs.prompt.add=\u0427\u0442\u043E\u0431\u044B \u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043D\u043E\u0432\u0443\u044E \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0443, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435, URL \u043D\u043E\u0432\u043E\u0441\u0442\u043D\u043E\u0439 \u043B\u0435\u043D\u0442\u044B, URL \u0441\u0430\u0439\u0442\u0430 \u0438 \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u043A\u043D\u043E\u043F\u043A\u0443 "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C" -planetSubscriptions.subtitle.addMain=\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0433\u043B\u0430\u0432\u043D\u044B\u043C \u0441\u043F\u0438\u0441\u043A\u043E\u043C \u043D\u043E\u0432\u043E\u0441\u0442\u043D\u044B\u0445 \u043F\u043E\u0434\u043F\u0438\u0441\u043E\u043A -planetSubscriptions.prompt.addMain=\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u044D\u0442\u0443 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0434\u043B\u044F \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u043F\u043E\u0434\u043F\u0438\u0441\u043E\u043A: \u0441\u043F\u0438\u0441\u043E\u043A \u043D\u043E\u0432\u043E\u0441\u0442\u043D\u044B\u0445 \u043B\u0435\u043D\u0442 \u043D\u0430 \u0433\u043B\u0430\u0432\u043D\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043E\u0440\u0430 Planet. \u0427\u0442\u043E\u0431\u044B \u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043D\u043E\u0432\u0443\u044E \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0443, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435, URL \u043D\u043E\u0432\u043E\u0441\u0442\u043D\u043E\u0439 \u043B\u0435\u043D\u0442\u044B, URL \u0441\u0430\u0439\u0442\u0430 \u0438 \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u043A\u043D\u043E\u043F\u043A\u0443 "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C" +planetGroupSubs.subtitle.addMain=\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0433\u043B\u0430\u0432\u043D\u044B\u043C \u0441\u043F\u0438\u0441\u043A\u043E\u043C \u043D\u043E\u0432\u043E\u0441\u0442\u043D\u044B\u0445 \u043F\u043E\u0434\u043F\u0438\u0441\u043E\u043A +planetGroupSubs.prompt.addMain=\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u044D\u0442\u0443 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0434\u043B\u044F \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u043F\u043E\u0434\u043F\u0438\u0441\u043E\u043A: \u0441\u043F\u0438\u0441\u043E\u043A \u043D\u043E\u0432\u043E\u0441\u0442\u043D\u044B\u0445 \u043B\u0435\u043D\u0442 \u043D\u0430 \u0433\u043B\u0430\u0432\u043D\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043E\u0440\u0430 Planet. \u0427\u0442\u043E\u0431\u044B \u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043D\u043E\u0432\u0443\u044E \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0443, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435, URL \u043D\u043E\u0432\u043E\u0441\u0442\u043D\u043E\u0439 \u043B\u0435\u043D\u0442\u044B, URL \u0441\u0430\u0439\u0442\u0430 \u0438 \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u043A\u043D\u043E\u043F\u043A\u0443 "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C" -planetSubscriptions.existingTitle=\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0438 +planetGroupSubs.existingTitle=\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0438 -planetSubscriptions.column.title=\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A, \u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 -planetSubscriptions.column.feedUrl=URL \u043B\u0435\u043D\u0442\u044B +planetGroupSubs.column.title=\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A, \u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 +planetGroupSubs.column.feedUrl=URL \u043B\u0435\u043D\u0442\u044B planetSubscription.feedUrl=URL \u043D\u043E\u0432\u043E\u0441\u043D\u043E\u0439 \u043B\u0435\u043D\u0442\u044B planetSubscription.success.deleted=\u041F\u043E\u0434\u043F\u0438\u0441\u043A\u0430 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0443\u0434\u0430\u043B\u0435\u043D\u0430 @@ -484,7 +484,7 @@ planetSubscription.success.saved=\u0421\u043E\u0445\u0440\u0430\u043D\u0435\u043 planetSubscription.error=\u0414\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D URL \u043D\u043E\u0432\u043E\u0441\u0442\u043D\u043E\u0439 \u043B\u0435\u043D\u0442\u044B planetSubscription.error.feedUrl=\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F URL (\u0430\u0434\u0440\u0435\u0441) \u043D\u043E\u0432\u043E\u0441\u0442\u043D\u043E\u0439 \u043B\u0435\u043D\u0442\u044B -planetSubscriptions.error.duringSave=\u041F\u0440\u043E\u0434\u0443\u0431\u043B\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0443? {0} +planetGroupSubs.error.duringSave=\u041F\u0440\u043E\u0434\u0443\u0431\u043B\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0443? {0} planetSubscription.error.deleting=\u041E\u0448\u0438\u0431\u043A\u0430 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F \u043E\u0431\u044A\u0435\u043A\u0442\u0430 # ------------------------------------------------------------ PlanetGroups.jsp @@ -537,7 +537,7 @@ 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.planetSubscriptions=\u041F\u043E\u0434\u043F\u0438\u0441\u043A\u0438 +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 diff --git a/app/src/main/resources/ApplicationResources_zh_CN.properties b/app/src/main/resources/ApplicationResources_zh_CN.properties index 470a468036..77c7ec8262 100644 --- a/app/src/main/resources/ApplicationResources_zh_CN.properties +++ b/app/src/main/resources/ApplicationResources_zh_CN.properties @@ -369,15 +369,15 @@ planetSubscription.feedUrl=\u65B0\u95FB\u79CD\u5B50URL planetSubscription.foundExisting=\u53D1\u73B0\u5DF2\u7ECF\u5B58\u5728\u8BA2\u9605 [{0}] \uFF0C\u66FF\u6362\u5417 planetSubscription.success.deleted=\u8BA2\u9605\u6210\u529F\u5220\u9664 planetSubscription.success.saved=\u8BA2\u9605\u5DF2\u4FDD\u5B58 -planetSubscriptions.column.feedUrl=\u65B0\u95FB\u79CD\u5B50URL -planetSubscriptions.column.title=\u6807\u9898 -planetSubscriptions.error.duringSave=\u590D\u5236\u8BA2\u9605\uFF1F\uFF0D{0} -planetSubscriptions.existingTitle=\u5B58\u5728\u7684\u8BA2\u9605 -planetSubscriptions.prompt.add=\u6DFB\u52A0\u4E00\u4E2A\u65B0\u7684\u8BA2\u9605\u5F88\u7B80\u5355\uFF1A\u8F93\u5165\u6807\u9898\u3001\u65B0\u95FB\u79CD\u5B50URL\u7136\u540E\u4FDD\u5B58\u3002 -planetSubscriptions.prompt.addMain=\u5728\u8FD9\u4E2A\u9875\u9762\u4E2D\u6DFB\u52A0\u3001\u7F16\u8F91\u8BA2\u9605\uFF1A\u65B0\u95FB\u79CD\u5B50\u5217\u8868\u5728\u884C\u661F\u65B0\u95FB\u805A\u5408\u5668\u9875\u9762\u4E4B\u4E2D\u3002\u6DFB\u52A0\u4E00\u4E2A\u65B0\u8BA2\u9605\u5F88\u7B80\u5355\uFF1A\u8F93\u5165\u6807\u9898\u3001\u65B0\u95FB\u79CD\u5B50URL\u7136\u540E\u4FDD\u5B58\u3002 -planetSubscriptions.subtitle.add=\u7BA1\u7406\u7FA4\u7EC4 [{0}] \u7684\u8BA2\u9605\u3002 -planetSubscriptions.subtitle.addMain=\u7BA1\u7406\u4E3B\u65B0\u95FB\u8BA2\u9605\u5217\u8868\u3002 -planetSubscriptions.title=\u8BA2\u9605 +planetGroupSubs.column.feedUrl=\u65B0\u95FB\u79CD\u5B50URL +planetGroupSubs.column.title=\u6807\u9898 +planetGroupSubs.error.duringSave=\u590D\u5236\u8BA2\u9605\uFF1F\uFF0D{0} +planetGroupSubs.existingTitle=\u5B58\u5728\u7684\u8BA2\u9605 +planetGroupSubs.prompt.add=\u6DFB\u52A0\u4E00\u4E2A\u65B0\u7684\u8BA2\u9605\u5F88\u7B80\u5355\uFF1A\u8F93\u5165\u6807\u9898\u3001\u65B0\u95FB\u79CD\u5B50URL\u7136\u540E\u4FDD\u5B58\u3002 +planetGroupSubs.prompt.addMain=\u5728\u8FD9\u4E2A\u9875\u9762\u4E2D\u6DFB\u52A0\u3001\u7F16\u8F91\u8BA2\u9605\uFF1A\u65B0\u95FB\u79CD\u5B50\u5217\u8868\u5728\u884C\u661F\u65B0\u95FB\u805A\u5408\u5668\u9875\u9762\u4E4B\u4E2D\u3002\u6DFB\u52A0\u4E00\u4E2A\u65B0\u8BA2\u9605\u5F88\u7B80\u5355\uFF1A\u8F93\u5165\u6807\u9898\u3001\u65B0\u95FB\u79CD\u5B50URL\u7136\u540E\u4FDD\u5B58\u3002 +planetGroupSubs.subtitle.add=\u7BA1\u7406\u7FA4\u7EC4 [{0}] \u7684\u8BA2\u9605\u3002 +planetGroupSubs.subtitle.addMain=\u7BA1\u7406\u4E3B\u65B0\u95FB\u8BA2\u9605\u5217\u8868\u3002 +planetGroupSubs.title=\u8BA2\u9605 tabbedmenu.admin=\u670D\u52A1\u5668\u7BA1\u7406 tabbedmenu.admin.cacheInfo=\u7F13\u5B58\u4FE1\u606F tabbedmenu.admin.commentManagement=\u8BC4\u8BBA @@ -385,7 +385,7 @@ tabbedmenu.admin.config=\u7BA1\u7406\u914D\u7F6E tabbedmenu.admin.pingTargets=Ping\u76EE\u6807 tabbedmenu.admin.planetConfig=\u914D\u7F6E tabbedmenu.admin.planetGroups=\u5B9A\u5236\u7FA4\u7EC4 -tabbedmenu.admin.planetSubscriptions=\u8BA2\u9605 +tabbedmenu.admin.planetGroupSubs=\u8BA2\u9605 tabbedmenu.admin.userAdmin=\u7528\u6237\u7BA1\u7406 tabbedmenu.bookmarks=\u4E66\u7B7E tabbedmenu.bookmarks.allFolders=\u4E66\u7B7E\u5939 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 64cb222703..1be6b64dac 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 @@ -209,7 +209,7 @@ trackback.allowedURLs= # Set to true to enable the Planet aggregator. You also need to enable the # RefreshRollerPlanetTask task below to get the feed fetcher running. -planet.aggregator.enabled=false +planet.aggregator.enabled=true # Planet backend guice module, customized for use with Weblogger planet.aggregator.guice.module=\ @@ -550,14 +550,14 @@ org.apache.roller.weblogger.business.plugins.entry.ConvertLineBreaksPlugin \ # The list of configured WeblogEntryEditors available to users plugins.weblogEntryEditors=\ org.apache.roller.weblogger.ui.core.plugins.TextEditor,\ -org.apache.roller.weblogger.ui.core.plugins.XinhaEditor +org.apache.roller.weblogger.ui.core.plugins.Summernote # The "id" of the default editor to use. NOT the class name -plugins.defaultEditor=editor-text.jsp +plugins.defaultEditor=editor-summernote.jsp # Default weblog editor # The list of available editors is in rollerRuntimeConfigDefs.xml -newweblog.editor=editor-text.jsp +newweblog.editor=editor-summernote.jsp #----------------------------------------------------------------------------- @@ -624,9 +624,6 @@ username.allowedChars=A-Za-z0-9 # underscores instead. weblogentry.title.useUnderscoreSeparator=false -# editor theme to be used (corresponds to directory name under /theme) -editor.theme=tan - # list of links to include in root bookmark folder of each new blog # format is like so: linktitle2|linkurl2,linktitle2|linkurl2,linktitle3|linkurl3 newuser.blogroll=\ 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 8c84ba640d..d897bcac05 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 @@ -105,7 +105,7 @@ text - editor-text.jsp,editor-xinha.jsp + editor-text.jsp,editor-summernote.jsp 3 40 @@ -136,11 +136,11 @@ - string + integer 30 - string + integer 30 @@ -210,11 +210,11 @@ exe - string + float 2.00 - string + float 20.00 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 d090bdca98..2e18a81894 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 @@ -42,8 +42,8 @@ See comments in editor-menu.xml for info about attributes. name="tabbedmenu.admin.planetConfig" /> - + + @@ -58,7 +75,7 @@ cancel - + input,back,cancel,browse @@ -77,13 +94,6 @@ .denied - - accept, - activate, - decline, - execute - - @@ -102,11 +112,13 @@ class="org.apache.roller.weblogger.ui.struts2.core.Setup"> .Setup home + activate,execute,save .Login + execute .Register .GenericError .Welcome + activate,execute,save .Profile menu - .Profile + .MainMenu + execute,save .OAuthKeys + execute .OAuthAuthorize + execute .CreateWeblog .GenericError menu + cancel,execute,save .MainMenu + accept,decline,execute @@ -169,6 +187,7 @@ home /roller-ui + execute,create,upgrade,bootstrap @@ -177,23 +196,11 @@ - - clear, - disable, - delete, - deleteConfirm, - enable, - execute, - firstSave, - save, - query, - delete, - update - - .GlobalConfig + .GlobalConfig + execute,save .UserAdmin .UserAdmin .UserAdmin + + modifyUser + ${bean.userName} + + edit,execute modifyUser!firstSave ${bean.id} + execute,firstSave,save userAdmin + execute,firstSave,save .GlobalCommentManagement + execute,delete,query,update .PingTargets .PingTargetConfirm + delete,deleteConfirm,disable,enable,execute pingTarget.addTarget .PingTargetEdit commonPingTargets + execute .PingTargetEdit commonPingTargets commonPingTargets + execute .CacheInfo + execute,clear - - + .PlanetConfig + execute,save - - .PlanetSubscriptions + + .PlanetGroupSubs + execute,deleteSubscription,saveGroup,saveSubscription .PlanetGroups + delete,execute @@ -279,37 +300,6 @@ - - add, - cancel, - createNewDirectory, - execute, - delete, - deleteConfirm, - deleteFolder, - deleteSelected, - disable, - enable, - entryAdd, - entryEdit, - firstSave, - folderCreated, - flushCache, - includeInGallery, - moveSelected, - pingNow, - publish, - query, - remove, - revert, - reset, - save, - saveDraft, - search, - update, - view - - .MediaFileAdd @@ -319,12 +309,14 @@ mediaFileView ${weblog} + execute,save .MediaFileEdit .MediaFileEditSuccess + execute,save .MediaFileAddExternalInclude .MediaFileAddExternalInclude .MediaFileAddExternalInclude + execute,save .MediaFileView /WEB-INF/jsps/editor/MediaFileViewLight.jsp + + delete,execute,createNewDirectory,deleteFolder,deleteSelected,fetchDirectoryContentLight,includeInGallery,moveSelected,search,view + .MediaFileImageDimension + execute entryAdd + execute ${weblog} ${bean.id} + execute,firstSave,publish,saveDraft,trackback menu /roller-ui + execute,firstSave,publish,saveDraft,trackback /roller-ui entryAdd + execute,remove - -<#assign itemCount = 0/> -<#if parameters.list??> -<@s.iterator value="parameters.list"> - <#assign itemCount = itemCount + 1/> - <#if parameters.listKey??> - <#assign itemKey = stack.findValue(parameters.listKey)/> - <#else> - <#assign itemKey = stack.findValue('top')/> - - <#if parameters.listValue??> - <#assign itemValue = stack.findString(parameters.listValue)?default("")/> - <#else> - <#assign itemValue = stack.findString('top')/> - - <#if parameters.listCssClass??> - <#if stack.findString(parameters.listCssClass)??> - <#assign itemCssClass= stack.findString(parameters.listCssClass)/> - <#else> - <#assign itemCssClass = ''/> - - - <#if parameters.listCssStyle??> - <#if stack.findString(parameters.listCssStyle)??> - <#assign itemCssStyle= stack.findString(parameters.listCssStyle)/> - <#else> - <#assign itemCssStyle = ''/> - - - <#if parameters.listTitle??> - <#if stack.findString(parameters.listTitle)??> - <#assign itemTitle= stack.findString(parameters.listTitle)/> - <#else> - <#assign itemTitle = ''/> - - - <#assign itemKeyStr=itemKey.toString() /> - - <#if tag.contains(parameters.nameValue, itemKey)> - checked="checked"<#rt/> - - <#if parameters.disabled?default(false)> - disabled="disabled"<#rt/> - - <#if itemCssClass?if_exists != ""> - class="${itemCssClass?html}"<#rt/> - <#else> - <#if parameters.cssClass??> - class="${parameters.cssClass?html}"<#rt/> - - - <#if itemCssStyle?if_exists != ""> - style="${itemCssStyle?html}"<#rt/> - <#else> - <#if parameters.cssStyle??> - style="${parameters.cssStyle?html}"<#rt/> - - - <#if itemTitle?if_exists != ""> - title="${itemTitle?html}"<#rt/> - <#else> - <#if parameters.title??> - title="${parameters.title?html}"<#rt/> - - - <#include "/${parameters.templateDir}/simple/css.ftl" /> - <#include "/${parameters.templateDir}/simple/scripting-events.ftl" /> - <#include "/${parameters.templateDir}/simple/common-attributes.ftl" /> - /> -
<#-- Roller +
--> - - <#else> -   - - -<#if parameters.disabled?default(false)> - disabled="disabled"<#rt/> - - /> \ No newline at end of file diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/CacheInfo.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/CacheInfo.jsp index 634423273b..5e7e2ea5cc 100644 --- a/app/src/main/webapp/WEB-INF/jsps/admin/CacheInfo.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/admin/CacheInfo.jsp @@ -22,7 +22,8 @@ - + +
@@ -39,7 +40,7 @@ - + diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/GlobalConfig.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/GlobalConfig.jsp index 7ec9c39ea8..10a91fceab 100644 --- a/app/src/main/webapp/WEB-INF/jsps/admin/GlobalConfig.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/admin/GlobalConfig.jsp @@ -17,96 +17,152 @@ --%> <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %> -

-

+

+

- - -
- + + + + - - - - - + +

+ - - - - - <%-- special condition for comment plugins --%> - - - - - <%-- special condition for front page blog --%> - - - - - <%-- "string" type means use a simple textbox --%> - - - - - <%-- "text" type means use a full textarea --%> - - - - - <%-- "boolean" type means use a checkbox --%> - - - - - - - - - - <%-- if it's something we don't understand then use textbox --%> - - - - - - - + + <%-- special case for comment plugins --%> + + + + + <%-- special case for front page blog --%> + + + + + <%-- "string" type means use a simple textbox --%> + + + + + <%-- "text" type means use a full textarea --%> + + + + + <%-- "boolean" type means use a checkbox --%> + + + + + + + + + + + + <%-- "integer" use input type number --%> + +
+ +
+ +
+
+ +
+ + <%-- "float" use input type number --%> + +
+ +
+ +
+
+
+ + <%-- if it's something we don't understand then use textbox --%> + + + + - - - - - + + spacer + -

- - - - <%-- --%>
 
- -
- "/> -
- + "/> + + + + + diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/PingTargetEdit.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/PingTargetEdit.jsp deleted file mode 100644 index be84eb7b65..0000000000 --- a/app/src/main/webapp/WEB-INF/jsps/admin/PingTargetEdit.jsp +++ /dev/null @@ -1,59 +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" %> - -<%-- Titling, processing actions different between add and edit --%> - - commonPingTargetEdit - pingTargetEdit.subtitle - - - commonPingTargetAdd - pingTargetAdd.subtitle - - -

- -

- - - - - <%-- bean for add does not have a bean id yet --%> - - - -
- - -
- -
- - -
- -

- -

- - - -
- -
diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/PingTargets.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/PingTargets.jsp index 94c20f6e1b..2fad6cc185 100644 --- a/app/src/main/webapp/WEB-INF/jsps/admin/PingTargets.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/admin/PingTargets.jsp @@ -17,89 +17,287 @@ --%> <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %> -

- -

- -

- - - -<%-- Headings --%> - - - - - - - - -<%-- Listing of current common targets --%> - - - - - - - - - - - - - - - - - - - - - - - +

+ +

+ + +
- -   - - -   - - - - - - - - - - - - - - - - - - - - <s:text name=" /> - - - - - - - <s:text name=" /> - -
+ + <%-- Headings --%> + + + + + + - + + <%-- Listing of current common targets --%> + + + + + + + + + + + + + + + + + +
+ +   + + +   + + + + + + + + + + + + + + + + + + + ', + '', + '' + )"> + + + + ')"> + + +

- + - icon + + + +
+ + +<%-- ================================================================================================ --%> + + + + +<%-- ================================================================================================ --%> + +<%-- add/edit link form: a modal --%> + + <%-- modal --%> + + +<%-- page reload mechanism --%> + + + + + + +<%-- ================================================================================================ --%> + + + diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/PlanetConfig.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/PlanetConfig.jsp index c9a6607bb1..936a42629b 100644 --- a/app/src/main/webapp/WEB-INF/jsps/admin/PlanetConfig.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/admin/PlanetConfig.jsp @@ -19,67 +19,55 @@ <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %> -

-

+

+

- - - - + + + - - - - - + +

+ - - - - - <%-- "string" type means use a simple textbox --%> - - - - - <%-- "text" type means use a full textarea --%> - - - - - <%-- "boolean" type means use a checkbox --%> - - - - - - - - - - <%-- if it's something we don't understand then use textbox --%> - - - - - - - + + <%-- "string" type means use a simple textbox --%> + + + + + <%-- "text" type means use a full textarea --%> + + + + + <%-- "boolean" type means use a checkbox --%> + + + + + + + + + + + + <%-- if it's something we don't understand then use textbox --%> + + + + - - - - - + -

- - <%-- --%>
 
- -
- "/> -
- + "/> +
diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/PingTargetRemove.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/PlanetGroupSidebar.jsp similarity index 56% rename from app/src/main/webapp/WEB-INF/jsps/admin/PingTargetRemove.jsp rename to app/src/main/webapp/WEB-INF/jsps/admin/PlanetGroupSidebar.jsp index 93fb9b7eb0..970ad33b49 100644 --- a/app/src/main/webapp/WEB-INF/jsps/admin/PingTargetRemove.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/admin/PlanetGroupSidebar.jsp @@ -17,26 +17,18 @@ --%> <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %> -

- -

-

- -

+<%-- ================================================================== --%> +<%-- add new custom planet group --%> - - - -
  
  
+

+
-
+ + true + -
- - - - - - -
+ + + Create new Custom Planet Group + diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/PlanetGroupSubs.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/PlanetGroupSubs.jsp new file mode 100644 index 0000000000..be7ee804a4 --- /dev/null +++ b/app/src/main/webapp/WEB-INF/jsps/admin/PlanetGroupSubs.jsp @@ -0,0 +1,164 @@ +<%-- + 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" %> + + +<%-- ================================================================== --%> +<%-- add/edit custom planet group form --%> + + +<%-- title for default planet group --%> + +

+

+
+ +<%-- title for a custom planet group --%> + + +

+ +

+
+ +

+ + + +

+
+

+
+ + +<%-- only show edit form for custom group --%> + + +
+
+

+
+
+ + + + + + + + + + + + + + + + +
+ +
+ + + '"/> + +
+
+ +
+ +
+
+ +
+ + +<%-- ================================================================== --%> +<%-- table of planet group's subscription --%> + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
${fn:substring(feedURL, 0, 100)} + ')"> + + + +
+ + <%-- planet subscription delete logic --%> + + + + + + + +
+ +
+ + +<%-- ================================================================== --%> + + \ No newline at end of file diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/PlanetGroupSubsSidebar.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/PlanetGroupSubsSidebar.jsp new file mode 100644 index 0000000000..a46e1bb90f --- /dev/null +++ b/app/src/main/webapp/WEB-INF/jsps/admin/PlanetGroupSubsSidebar.jsp @@ -0,0 +1,72 @@ +<%-- + 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" %> + + +<%-- ================================================================== --%> +<%-- add new planet feed subscription --%> + + + +

+
+ + + + + + + + + +

+ + + +
+ + + +
+ diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/PlanetGroups.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/PlanetGroups.jsp index f518ac635b..6223ee319d 100644 --- a/app/src/main/webapp/WEB-INF/jsps/admin/PlanetGroups.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/admin/PlanetGroups.jsp @@ -17,109 +17,69 @@ --%> <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %> -

- -

- - - - - - -

- - - - - -
- - - " alt="help" title='' /> -
- -
- - - " alt="help" title='' /> -
- -

- -

- - -   - '"/> - - -    - - - - '" /> - -
- -
- -
- -

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - -
- - - - - - - - icon - - - - - icon -
+

+ + +<%-- ================================================================== --%> +<%-- table of custom planet groups (excluding the default group) --%> + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + ')"> + + + +
+ + <%-- planet group delete logic --%> + + + + + + + + +
+ + + + diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/PlanetSubscriptions.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/PlanetSubscriptions.jsp deleted file mode 100644 index 32b9e41db3..0000000000 --- a/app/src/main/webapp/WEB-INF/jsps/admin/PlanetSubscriptions.jsp +++ /dev/null @@ -1,101 +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" %> - - - - - -

-

-
- -

- - - -

-

-
- - - - - - -
- - -   -
-
- -
- -

- - -  [group: ] - -

- - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - ${fn:substring(feedURL, 0, 100)} - - - ')"> - - -
diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/UserAdmin.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/UserAdmin.jsp index f822594d7c..63109978d7 100644 --- a/app/src/main/webapp/WEB-INF/jsps/admin/UserAdmin.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/admin/UserAdmin.jsp @@ -21,35 +21,38 @@ <%@ include file="/roller-ui/scripts/ajax-user.js" %> -

-

+

+ + +

- + - - - - -
- - + + + + + + +
-<%-- LDAP uses external user creation --%> - -

+ <%-- if we're not doing LDAP we can create new users in Roller --%> + +

"> +
-<%-- this forces focus to the userName field --%> - + diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/UserEdit.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/UserEdit.jsp index 79b08ef066..9478e9c168 100644 --- a/app/src/main/webapp/WEB-INF/jsps/admin/UserEdit.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/admin/UserEdit.jsp @@ -15,16 +15,17 @@ 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" %> +<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %> + <%-- Titling, processing actions different between add and edit --%> - - userAdmin.subtitle.editUser - modifyUser - - + userAdmin.subtitle.createNewUser createUser + + + userAdmin.subtitle.editUser + modifyUser

@@ -38,116 +39,76 @@ -

- -

+

- + <%-- bean for add does not have a bean id yet --%> - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- -
- -
- -
- -
- -

+

:

- +
@@ -192,8 +153,8 @@
- - + +
- + diff --git a/app/src/main/webapp/WEB-INF/jsps/core/CreateDatabase.jsp b/app/src/main/webapp/WEB-INF/jsps/core/CreateDatabase.jsp index 85bf5ede24..66db1ca148 100644 --- a/app/src/main/webapp/WEB-INF/jsps/core/CreateDatabase.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/core/CreateDatabase.jsp @@ -55,7 +55,7 @@ - + diff --git a/app/src/main/webapp/WEB-INF/jsps/core/CreateWeblog.jsp b/app/src/main/webapp/WEB-INF/jsps/core/CreateWeblog.jsp index 2d615e58d3..88ca6f8214 100644 --- a/app/src/main/webapp/WEB-INF/jsps/core/CreateWeblog.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/core/CreateWeblog.jsp @@ -16,109 +16,133 @@ directory of this distribution. --%> <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %> - - - +

-

+
-
+ - - + - + - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- +
+ +
:  - /handle - -
- -
- -
- -
-
-

{{ selectedTheme.description }}

-
- -
- -
- - -" onclick="window.location=''" /> + / + + + + handle +
+ + + + + + + + + +
+ +
+ +

+

+ +
+
+ + + + " + onclick="window.location=''"/>
+<%-- ============================================================================== --%> + + + diff --git a/app/src/main/webapp/WEB-INF/jsps/core/Login-css.jsp b/app/src/main/webapp/WEB-INF/jsps/core/Login-css.jsp new file mode 100644 index 0000000000..a08fc73620 --- /dev/null +++ b/app/src/main/webapp/WEB-INF/jsps/core/Login-css.jsp @@ -0,0 +1,23 @@ +<%-- + 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. +--%> + +.roller-page-title { + margin-top: 0px; + margin-bottom: 2em; + text-align: center; +} diff --git a/app/src/main/webapp/WEB-INF/jsps/core/Login.jsp b/app/src/main/webapp/WEB-INF/jsps/core/Login.jsp index bf9914deda..0a3918e990 100644 --- a/app/src/main/webapp/WEB-INF/jsps/core/Login.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/core/Login.jsp @@ -18,150 +18,137 @@ <%-- Body of the login page, invoked from login.jsp --%> <%@ page import="org.apache.roller.weblogger.config.WebloggerConfig" %> -<%@ page import="org.apache.roller.weblogger.config.AuthMethod" %> <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %> <%! -String securityCheckUrl = null; -boolean cmaEnabled = "CMA".equals(WebloggerConfig.getAuthMethod()); + String securityCheckUrl = null; + boolean cmaEnabled = "CMA".equals( WebloggerConfig.getAuthMethod() ); %> <% -if (cmaEnabled) { - securityCheckUrl = "/j_security_check"; -} else { - securityCheckUrl = "/roller_j_security_check"; -} + if (cmaEnabled) { + securityCheckUrl = "/j_security_check"; + } else { + securityCheckUrl = "/roller_j_security_check"; + } %> - - -

- -
- - - - - - - - - - -
- -
- -
-
-
- - - - -

+ + + +
+ +
+ +
+ +
+ + +
+ + + +
+
- - -

-
- -
"/>" - onsubmit="saveUsername(this)"> - - - - - - - - - - - - + + + + "/>" onsubmit="saveUsername(this)"> + +
+ + + + + + + +
+ +
+ + +
+ +
+ + +
-
- - - +
+ + +
- - - - +
+ -
- -
- -
- - -
- - -
-
-
+ + + + +
\ No newline at end of file diff --git a/app/src/main/webapp/WEB-INF/jsps/core/MainMenu.jsp b/app/src/main/webapp/WEB-INF/jsps/core/MainMenu.jsp index eb565f8914..f042398e9d 100644 --- a/app/src/main/webapp/WEB-INF/jsps/core/MainMenu.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/core/MainMenu.jsp @@ -59,123 +59,113 @@ -
- -   - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
ADMIN - AUTHOR - LIMITED
- -
- - - - - - -
- - <%-- Show Entries link with count for users above LIMITED permission --%> - - - - - - () -
-
- - <%-- Show Comments link with count for users above LIMITED permission --%> - - - - - - () -
-
- - <%-- Only admins get access to theme and config settings --%> - - - <%-- And only show theme option if custom themes are enabled --%> - - - - - - - - - - - - - - -
-
- - - - - - - -
-
- - <%-- don't allow last admin to resign from blog --%> - - - - - - - - - - -
+
+ +

+ +   +

+ +

+

+ +

+ +

You have + ADMIN + AUTHOR + LIMITED +

+
+ + <%-- New entry button --%> + + + + + + + + + + + <%-- Show Entries button with count for users above LIMITED permission --%> + + + + + + + + + + + + + + <%-- Show Comments button with count for users above LIMITED permission --%> + + + + + + + + + + + + + <%-- Only admins get access to theme and config settings --%> + + + <%-- And only show theme option if custom themes are enabled --%> + + + + + + + + + + + + + + + + + + <%-- settings button --%> + + + + + + + + + + + <%-- don't allow last admin to resign from blog --%> + + + + + + +
+
diff --git a/app/src/main/webapp/WEB-INF/jsps/core/MainMenuSidebar.jsp b/app/src/main/webapp/WEB-INF/jsps/core/MainMenuSidebar.jsp index 4aa6ef9807..29cbb23d1b 100644 --- a/app/src/main/webapp/WEB-INF/jsps/core/MainMenuSidebar.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/core/MainMenuSidebar.jsp @@ -22,31 +22,42 @@
-
+ <%-- ============================================================= --%> + <%-- Next / previous links --%> + + + + <%-- ========================================================= --%> + <%-- Save changes and cancel buttons --%> + +
+ + +
+ + + + + - - -<%-- ========================================================= --%> -<%-- Save changes and cancel buttons --%> -<%-- ========================================================= --%> - - -
- - + diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/CommentsSidebar.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/CommentsSidebar.jsp index fe145d7b89..54ccfd94cd 100644 --- a/app/src/main/webapp/WEB-INF/jsps/editor/CommentsSidebar.jsp +++ b/app/src/main/webapp/WEB-INF/jsps/editor/CommentsSidebar.jsp @@ -17,10 +17,6 @@ --%> <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %> - - - - comments @@ -28,85 +24,92 @@ globalCommentManagement -
-