diff --git a/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchFolderBrowser.java b/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchFolderBrowser.java
index 0dc53fecf..0f650c811 100755
--- a/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchFolderBrowser.java
+++ b/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchFolderBrowser.java
@@ -49,15 +49,14 @@ import com.arsdigita.cms.ContentType;
import com.arsdigita.cms.Folder;
import com.arsdigita.cms.SecurityManager;
import com.arsdigita.cms.dispatcher.Utilities;
-import com.arsdigita.cms.ui.folder.FolderManipulator;
import com.arsdigita.cms.ui.folder.FolderSelectionModel;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.persistence.CompoundFilter;
import com.arsdigita.persistence.FilterFactory;
+import com.arsdigita.toolbox.GlobalisationUtil;
import com.arsdigita.util.Assert;
import java.math.BigDecimal;
-import java.util.StringTokenizer;
/**
* Browse folders and items. If the user clicks on a folder, the folder
@@ -483,7 +482,11 @@ public class ItemSearchFolderBrowser extends Table {
* @pre ( key != null )
*/
private static GlobalizedMessage globalize(String key) {
- return FolderManipulator.globalize(key);
+ //return FolderManipulator.globalize(key);
+ final GlobalisationUtil util = new GlobalisationUtil(
+ "com.arsdigita.cms."
+ + "ui.folder.CMSFolderResources");
+ return util.globalise(key);
}
}
diff --git a/ccm-cms/src/com/arsdigita/cms/ui/folder/CMSFolderResources.properties b/ccm-cms/src/com/arsdigita/cms/ui/folder/CMSFolderResources.properties
index 5557f5cea..3889c119a 100755
--- a/ccm-cms/src/com/arsdigita/cms/ui/folder/CMSFolderResources.properties
+++ b/ccm-cms/src/com/arsdigita/cms/ui/folder/CMSFolderResources.properties
@@ -1,11 +1,11 @@
COMMENT.00=BUTTONS/LINKS/LABELS
-cms.ui.folder.edit_selection=Copy or move checked items:
+cms.ui.folder.edit_selection=What to do with checked items
cms.ui.folder.save=Save
cms.ui.folder.cancel=Cancel
cms.ui.folder.edit=Edit
cms.ui.folder.delete=Delete
-cms.ui.folder.move=Move
-cms.ui.folder.copy=Copy
+cms.ui.folder.move=Move {0} items from {1} to {2}.
+cms.ui.folder.copy=Copy {0} items from {1}
cms.ui.folder.go=Go
cms.ui.folder.name=Name
cms.ui.folder.type=Type
@@ -63,9 +63,9 @@ cms.ui.folder.no_source_items_specified=No source items specified.
cms.ui.folder.need_select_target_folder=You need to select a folder to which the items should be copied/moved.
cms.ui.folder.not_within_same_folder=Cannot move/copy items within the same folder.
cms.ui.folder.no_permission=You do not have permission to create, copy, or move items.
-cms.ui.folder.item_already_exists=There is already an item in the target folder named:
-cms.ui.folder.item_is_live= is live; you must unpublish it before moving it.
-cms.ui.folder.no_permission_for_item=You do not have permission to delete or move
+cms.ui.folder.item_already_exists=There is already an item in the target folder named: {0}
+cms.ui.folder.item_is_live= {0} is live; you must unpublish it before moving it.
+cms.ui.folder.no_permission_for_item=You do not have permission to delete or move {0}.
cms.ui.folder.no_such_item=Item ID supplied does not match an existing Content Item.
cms.ui.folder.filter.all=All
cms.ui.folder.filter=Filter for work
@@ -73,3 +73,7 @@ cms.ui.folder.filter_do=Filter
cms.ui.folder.languages=Languages
cms.ui.folder.delete_confirmation=Permanently delete this item?
cms.ui.folder.additionalInfo=Info
+cms.ui.folder.move.action=Move
+cms.ui.folder.copy.action=Copy
+cms.ui.folder.publish.action=(Re-)publish
+cms.ui.folder.unpublish.action=Unpublish
diff --git a/ccm-cms/src/com/arsdigita/cms/ui/folder/CMSFolderResources_de.properties b/ccm-cms/src/com/arsdigita/cms/ui/folder/CMSFolderResources_de.properties
index e7d5c34cc..28ee56db9 100755
--- a/ccm-cms/src/com/arsdigita/cms/ui/folder/CMSFolderResources_de.properties
+++ b/ccm-cms/src/com/arsdigita/cms/ui/folder/CMSFolderResources_de.properties
@@ -3,8 +3,8 @@ cms.ui.folder.save=Speichern
cms.ui.folder.cancel=Abbrechen
cms.ui.folder.edit=Editieren
cms.ui.folder.delete=L\u00f6schen
-cms.ui.folder.move=Verschieben
-cms.ui.folder.copy=Kopieren
+cms.ui.folder.move=Verschiebe {0} Dokumente von {1} nach {2}.
+cms.ui.folder.copy=Kopiere {0} Dokumente von {1} nach
cms.ui.folder.go=Los
cms.ui.folder.name=Name
cms.ui.folder.type=Typ
@@ -57,9 +57,9 @@ cms.ui.folder.no_source_items_specified=Es wurden keine Ursprungseintr\u00e4ge g
cms.ui.folder.need_select_target_folder=Es mu\u00df ein Ordner ausgew\u00e4hlt werden, in den die Eintr\u00e4ge verschoben oder kopiert werden sollen.
cms.ui.folder.not_within_same_folder=Kopieren/Verschieben im gleichen Ordner nicht m\u00f6glich
cms.ui.folder.no_permission=Sie haben nicht die Berechtigung Eintr\u00e4ge zu erzeugen, zu kopieren oder zu verschieben.
-cms.ui.folder.item_already_exists=Es gibt schon einen Eintrag im Zielordner mit Namen:
-cms.ui.folder.item_is_live=ist ver\u00f6ffentlicht. Sie m\u00fcssen ihn zum Verschieben zur\u00fcckholen
-cms.ui.folder.no_permission_for_item=Sie haben nicht die Berechtigung zum L\u00f6schen oder Verschieben.
+cms.ui.folder.item_already_exists=Es gibt schon einen Eintrag im Zielordner mit Namen: {0}
+cms.ui.folder.item_is_live={0} ist ver\u00f6ffentlicht. Sie m\u00fcssen ihn zum Verschieben depublizieren.
+cms.ui.folder.no_permission_for_item=Sie haben nicht die Berechtigung {0} zum L\u00f6schen oder Verschieben.
cms.ui.folder.no_such_item=Die verwendete Eintrags-ID pa\u00dft zu keinem Eintrag.
cms.ui.folder.remove_asset_link=Entfernen
@@ -68,8 +68,12 @@ cms.ui.folder.filter=Nach Begriff filtern
cms.ui.folder.filter_do=Filtern
cms.ui.folder.languages=Sprachen
cms.ui.folder.delete_confirmation=Wollen Sie dieses Content-Item l\u00f6schen?
-cms.ui.folder.edit_selection=Ausgew\u00e4hlte Items kopieren oder verschieben:
+cms.ui.folder.edit_selection=Ausgew\u00e4hlte Items
cms.ui.folder.creation_date=Erstellungsdatum
cms.ui.folder.last_modified=Letzte \u00c4nderung
cms.ui.folder.index=Index
cms.ui.folder.additionalInfo=Info
+cms.ui.folder.move.action=Verschieben
+cms.ui.folder.copy.action=Kopieren
+cms.ui.folder.publish.action=(Re-)Publizieren
+cms.ui.folder.unpublish.action=Depublizieren
diff --git a/ccm-cms/src/com/arsdigita/cms/ui/folder/CMSFolderResources_fr.properties b/ccm-cms/src/com/arsdigita/cms/ui/folder/CMSFolderResources_fr.properties
index bdf11782c..094cf3b85 100755
--- a/ccm-cms/src/com/arsdigita/cms/ui/folder/CMSFolderResources_fr.properties
+++ b/ccm-cms/src/com/arsdigita/cms/ui/folder/CMSFolderResources_fr.properties
@@ -3,8 +3,8 @@ cms.ui.folder.save=Sauver
cms.ui.folder.cancel=Annuler
cms.ui.folder.edit=Modifier
cms.ui.folder.delete=Effacer
-cms.ui.folder.move=D\u00e9placer
-cms.ui.folder.copy=Copier
+cms.ui.folder.move=
+cms.ui.folder.copy=
cms.ui.folder.go=Go
cms.ui.folder.name=Nom
cms.ui.folder.type=Type
@@ -60,11 +60,15 @@ cms.ui.folder.no_source_items_specified=Pas d'\u00e9l\u00e9ment source sp\u00e9c
cms.ui.folder.need_select_target_folder=Vous devez s\u00e9lectionner un dossier dans lequel les \u00e9l\u00e9ments seront d\u00e9plac\u00e9s ou copi\u00e9s.
cms.ui.folder.not_within_same_folder=Impossible de d\u00e9placer ou de copier des \u00e9l\u00e9ments \u00e0 l'int\u00e9rieur d'un m\u00eame dossier.
cms.ui.folder.no_permission=Vous n'avez pas l'autorisation de cr\u00e9er, de copier, ou de d\u00e9placer des \u00e9l\u00e9ments.
-cms.ui.folder.item_already_exists=Il y a d\u00e9j\u00e0 un \u00e9l\u00e9ment dans le dossier destination appel\u00e9:
-cms.ui.folder.item_is_live=est en ligne ; Vous devez le d\u00e9-publier avant de le d\u00e9placer.
-cms.ui.folder.no_permission_for_item=Vous n'avez pas l'autorisation de supprimer ou de d\u00e9placer
+cms.ui.folder.item_already_exists=Il y a d\u00e9j\u00e0 un \u00e9l\u00e9ment dans le dossier destination appel\u00e9: {0}
+cms.ui.folder.item_is_live={0} est en ligne ; Vous devez le d\u00e9-publier avant de le d\u00e9placer.
+cms.ui.folder.no_permission_for_item=Vous n'avez pas l'autorisation de supprimer ou de d\u00e9placer {0}.
cms.ui.folder.no_such_item=L'identifiant fourni pour l'\u00e9l\u00e9ment ne correspond pas \u00e0 un contenu existant.
cms.ui.folder.filter.all=
cms.ui.folder.languages=
cms.ui.folder.delete_confirmation=
cms.ui.folder.additionalInfo=
+cms.ui.folder.move.action=
+cms.ui.folder.copy.action=
+cms.ui.folder.publish.action=
+cms.ui.folder.unpublish.action=
diff --git a/ccm-cms/src/com/arsdigita/cms/ui/folder/FolderBrowser.java b/ccm-cms/src/com/arsdigita/cms/ui/folder/FolderBrowser.java
index 19930c878..4a8a963f1 100755
--- a/ccm-cms/src/com/arsdigita/cms/ui/folder/FolderBrowser.java
+++ b/ccm-cms/src/com/arsdigita/cms/ui/folder/FolderBrowser.java
@@ -56,6 +56,7 @@ import com.arsdigita.kernel.Kernel;
import com.arsdigita.kernel.permissions.PermissionService;
import com.arsdigita.kernel.permissions.PrivilegeDescriptor;
import com.arsdigita.persistence.OID;
+import com.arsdigita.toolbox.GlobalisationUtil;
import com.arsdigita.toolbox.ui.FormatStandards;
import com.arsdigita.util.Assert;
import org.apache.log4j.Logger;
@@ -65,9 +66,8 @@ import java.util.Iterator;
import javax.servlet.ServletException;
/**
- * Browse folders and items. If the user clicks on a folder, the folder
- * selection model is updated. If the user clicks on any other item, an separate
- * item selection model is updated.
+ * Browse folders and items. If the user clicks on a folder, the folder selection model is updated.
+ * If the user clicks on any other item, an separate item selection model is updated.
*
* @author David Lutterkort
* @author Sören Bernstein
@@ -123,8 +123,8 @@ public class FolderBrowser extends Table {
setModelBuilder(new FolderTableModelBuilder(currentFolder));
setColumnModel(new DefaultTableColumnModel(hideIndexColumn()
- ? s_noIndexHeaders
- : s_headers));
+ ? s_noIndexHeaders
+ : s_headers));
setHeader(new TableHeader(getColumnModel()));
// DEE 1/18/02: the folder table model builder needs to know about
// 'this' in order to set visibility, but 'this' isn't available
@@ -166,7 +166,7 @@ public class FolderBrowser extends Table {
m_nameColumn.setCellRenderer(new NameCellRenderer());
m_nameColumn.setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_NAME));
getColumn(1).setCellRenderer(new LanguagesCellRenderer());
- getColumn(2).setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_TITLE));
+ getColumn(2).setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_TITLE));
getColumn(5).setHeaderRenderer(new HeaderCellRenderer(
SORT_KEY_CREATION_DATE));
getColumn(6).setHeaderRenderer(new HeaderCellRenderer(
@@ -217,9 +217,9 @@ public class FolderBrowser extends Table {
Folder folder = (Folder) m_currentFolder.getSelectedObject(state);
Assert.exists(folder);
- boolean canDelete =
- sm.canAccess(state.getRequest(), SecurityManager.DELETE_ITEM,
- folder);
+ boolean canDelete
+ = sm.canAccess(state.getRequest(), SecurityManager.DELETE_ITEM,
+ folder);
m_deleteColumn.setVisible(state, canDelete);
}
@@ -263,7 +263,7 @@ public class FolderBrowser extends Table {
private class FolderTableModelBuilder
extends AbstractTableModelBuilder
implements PaginationModelBuilder,
- FolderManipulator.FilterFormModelBuilder {
+ FolderManipulator.FilterFormModelBuilder {
private FolderSelectionModel m_folder;
private RequestLocal m_size;
@@ -275,7 +275,7 @@ public class FolderBrowser extends Table {
}
public FolderTableModelBuilder(FolderSelectionModel sel,
- FolderBrowser fb) {
+ FolderBrowser fb) {
super();
m_folder = sel;
m_size = new RequestLocal();
@@ -291,8 +291,8 @@ public class FolderBrowser extends Table {
} else {
t.getRowSelectionModel().clearSelection(s);
s_log.debug(String.format("filter = '%s'", s.getValue(m_filter)));
- Folder.ItemCollection itemColl =
- (Folder.ItemCollection) m_itemColl.get(s);
+ Folder.ItemCollection itemColl
+ = (Folder.ItemCollection) m_itemColl.get(s);
s_log.debug(String.format("itemColl.size = %d", itemColl.size()));
m_folderSize = itemColl.size();
@@ -364,7 +364,7 @@ public class FolderBrowser extends Table {
size = new Integer((int) itemColl.size());
itemColl.setRange(new Integer(paginator.getFirst(state)),
- new Integer(paginator.getLast(state) + 1));
+ new Integer(paginator.getLast(state) + 1));
String sortKey = (String) state.getValue(m_sortType);
String direction = "asc";
@@ -375,13 +375,13 @@ public class FolderBrowser extends Table {
if (sortKey.equals(SORT_KEY_TITLE)) {
itemColl.setOrder("lower(item." + ContentItem.DISPLAY_NAME
- + ") " + direction);
+ + ") " + direction);
} else if (sortKey.equals(SORT_KEY_NAME)) {
itemColl.setOrder("lower(item." + ContentItem.NAME + ") "
- + direction);
+ + direction);
} else if (sortKey.equals(SORT_KEY_LAST_MODIFIED_DATE)) {
itemColl.setOrder("item.auditing.lastModifiedDate "
- + direction);
+ + direction);
} else if (sortKey.equals(SORT_KEY_CREATION_DATE)) {
itemColl.setOrder("item.auditing.creationDate " + direction);
}
@@ -398,11 +398,11 @@ public class FolderBrowser extends Table {
}
/**
- * Indicates whether the paginator should be visible, based on the
- * visibility of the folder browser itself.
+ * Indicates whether the paginator should be visible, based on the visibility of the folder
+ * browser itself.
*
- * @return true if folder browser is visible, or if the associated
- * folder browser is unknown.
+ * @return true if folder browser is visible, or if the associated folder browser is
+ * unknown.
*/
public boolean isVisible(PageState state) {
return (m_fb != null) ? m_fb.isVisible(state) : true;
@@ -421,9 +421,9 @@ public class FolderBrowser extends Table {
@Override
public Component getComponent(final Table table, final PageState state,
- Object value,
- boolean isSelected, Object key,
- int row, int column) {
+ Object value,
+ boolean isSelected, Object key,
+ int row, int column) {
String headerName = (String) ((GlobalizedMessage) value).localize();
String sortKey = (String) state.getValue(m_sortType);
final boolean isCurrentKey = sortKey.equals(m_key);
@@ -445,14 +445,14 @@ public class FolderBrowser extends Table {
// by default, everything sorts "up" unless it
// is the current key and it is already pointing up
if (SORT_ACTION_UP.equals(currentSortDirection)
- && isCurrentKey) {
+ && isCurrentKey) {
sortDirectionAction = SORT_ACTION_DOWN;
} else {
sortDirectionAction = SORT_ACTION_UP;
}
ps.setControlEvent(table,
- sortDirectionAction,
- m_key);
+ sortDirectionAction,
+ m_key);
}
};
Label l = new Label();
@@ -474,8 +474,7 @@ public class FolderBrowser extends Table {
}
/**
- * Produce links to view an item or control links for folders to change into
- * the folder.
+ * Produce links to view an item or control links for folders to change into the folder.
*/
private class NameCellRenderer extends DefaultTableCellRenderer {
@@ -485,14 +484,14 @@ public class FolderBrowser extends Table {
@Override
public Component getComponent(Table table, PageState state, Object value,
- boolean isSelected, Object key,
- int row, int column) {
+ boolean isSelected, Object key,
+ int row, int column) {
Folder.ItemCollection coll = (Folder.ItemCollection) value;
String name = coll.getName();
if (coll.isFolder()) {
return super.getComponent(table, state, name,
- isSelected, key, row, column);
+ isSelected, key, row, column);
} else {
ContentSection section = CMS.getContext().getContentSection();
BigDecimal id = coll.getID();
@@ -502,7 +501,7 @@ public class FolderBrowser extends Table {
} else {
ItemResolver resolver = section.getItemResolver();
return new Link(name, resolver.generateItemURL(state, id,
- name, section, coll.getVersion()));
+ name, section, coll.getVersion()));
}
}
}
@@ -511,8 +510,8 @@ public class FolderBrowser extends Table {
/**
* Added by: Sören Bernstein
*
- * Produce links to view an item in a specific language and show all
- * existing language version and the live status in the folder browser.
+ * Produce links to view an item in a specific language and show all existing language version
+ * and the live status in the folder browser.
*/
private class LanguagesCellRenderer extends DefaultTableCellRenderer {
@@ -522,8 +521,8 @@ public class FolderBrowser extends Table {
@Override
public Component getComponent(Table table, PageState state, Object value,
- boolean isSelected, Object key,
- int row, int column) {
+ boolean isSelected, Object key,
+ int row, int column) {
Folder.ItemCollection coll = (Folder.ItemCollection) value;
String name = coll.getName();
@@ -544,15 +543,12 @@ public class FolderBrowser extends Table {
ContentBundle bundle = cp.getContentBundle();
ContentSection section = CMS.getContext().getContentSection();
-
if (bundle != null
- && !(cp instanceof LanguageInvariantContentItem
- && ((LanguageInvariantContentItem) cp).isLanguageInvariant())) {
+ && !(cp instanceof LanguageInvariantContentItem
+ && ((LanguageInvariantContentItem) cp).isLanguageInvariant())) {
Iterator languages = bundle.getLanguages().iterator();
-
-
StringBuilder temp = new StringBuilder(20);
SimpleContainer container = new SimpleContainer();
@@ -582,11 +578,11 @@ public class FolderBrowser extends Table {
ItemResolver resolver = section.getItemResolver();
container.add(
new Link(langLabel,
- resolver.generateItemURL(state,
- ci.getID(),
- name,
- section,
- coll.getVersion())));
+ resolver.generateItemURL(state,
+ ci.getID(),
+ name,
+ section,
+ coll.getVersion())));
}
if (languages.hasNext()) {
container.add(new Label(" ", false));
@@ -623,8 +619,8 @@ public class FolderBrowser extends Table {
}
public Component getComponent(Table table, PageState state, Object value,
- boolean isSelected, Object key,
- int row, int column) {
+ boolean isSelected, Object key,
+ int row, int column) {
if (((Boolean) value).booleanValue()) {
return s_link;
} else {
@@ -636,8 +632,8 @@ public class FolderBrowser extends Table {
private final class IndexToggleRenderer implements TableCellRenderer {
public Component getComponent(Table table, PageState state, Object value,
- boolean isSelected, Object key, int row,
- int column) {
+ boolean isSelected, Object key, int row,
+ int column) {
if (value == null) {
return new Label(GlobalizationUtil.globalize("cms.ui.folder.na"));
@@ -712,7 +708,7 @@ public class FolderBrowser extends Table {
//m_itemColl = folder.getItems();
//}
public FolderTableModel(FolderBrowser table, PageState state,
- Folder.ItemCollection itemColl) {
+ Folder.ItemCollection itemColl) {
m_state = state;
m_table = table;
m_itemColl = itemColl;
@@ -757,8 +753,8 @@ public class FolderBrowser extends Table {
return FormatStandards.formatDate(creationDate);
}
case LAST_MODIFIED: {
- java.util.Date lastModified =
- m_itemColl.getLastModifiedDate();
+ java.util.Date lastModified
+ = m_itemColl.getLastModifiedDate();
if (lastModified == null) {
return "--";
}
@@ -782,8 +778,8 @@ public class FolderBrowser extends Table {
}
default:
throw new IndexOutOfBoundsException("Column index "
- + columnIndex
- + " not in table model.");
+ + columnIndex
+ + " not in table model.");
}
}
@@ -820,7 +816,8 @@ public class FolderBrowser extends Table {
}
if (s_log.isDebugEnabled()) {
- s_log.debug("The item is not a folder and doesn't have a live instance; it may be deleted");
+ s_log.debug(
+ "The item is not a folder and doesn't have a live instance; it may be deleted");
}
return true;
}
@@ -828,7 +825,7 @@ public class FolderBrowser extends Table {
public Object getKeyAt(int columnIndex) {
// Mark folders by using their negative ID (dirty, dirty)
return (m_itemColl.isFolder()) ? m_itemColl.getID().negate()
- : m_itemColl.getBundleID();
+ : m_itemColl.getBundleID();
}
}
@@ -875,8 +872,8 @@ public class FolderBrowser extends Table {
ContentBundle currentIndexItem = (ContentBundle) folder.getIndexItem();
if (currentIndexItem == null || (currentIndexItem.getID().
- compareTo(contentItem.getID())
- != 0)) {
+ compareTo(contentItem.getID())
+ != 0)) {
folder.setIndexItem(contentItem);
} else {
folder.removeIndexItem();
@@ -894,7 +891,11 @@ public class FolderBrowser extends Table {
* @param key The resource key @pre ( key != null )
*/
private static GlobalizedMessage globalize(String key) {
- return FolderManipulator.globalize(key);
+ //return FolderManipulator.globalize(key);
+ final GlobalisationUtil util = new GlobalisationUtil(
+ "com.arsdigita.cms.ui.folder.CMSFolderResources");
+ return util.globalise(key);
+
}
private static boolean hideIndexColumn() {
diff --git a/ccm-cms/src/com/arsdigita/cms/ui/folder/FolderManipulator.java b/ccm-cms/src/com/arsdigita/cms/ui/folder/FolderManipulator.java
index 8ed4044e9..1ba26d5df 100755
--- a/ccm-cms/src/com/arsdigita/cms/ui/folder/FolderManipulator.java
+++ b/ccm-cms/src/com/arsdigita/cms/ui/folder/FolderManipulator.java
@@ -60,28 +60,39 @@ import com.arsdigita.bebop.parameters.StringParameter;
import com.arsdigita.bebop.table.TableCellRenderer;
import com.arsdigita.bebop.table.TableColumn;
import com.arsdigita.bebop.tree.TreeCellRenderer;
+import com.arsdigita.cms.CMS;
import com.arsdigita.cms.CMSConfig;
import com.arsdigita.cms.ContentBundle;
import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.ContentSection;
+import com.arsdigita.cms.ContentTypeLifecycleDefinition;
import com.arsdigita.cms.Folder;
import com.arsdigita.cms.ItemCollection;
import com.arsdigita.cms.SecurityManager;
-import com.arsdigita.cms.dispatcher.Utilities;
-import com.arsdigita.cms.util.GlobalizationUtil;
+import com.arsdigita.cms.lifecycle.LifecycleDefinition;
+import com.arsdigita.cms.ui.lifecycle.PublishLock;
import com.arsdigita.domain.DataObjectNotFoundException;
import com.arsdigita.domain.DomainObjectFactory;
-import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.kernel.ACSObject;
+import com.arsdigita.kernel.Party;
+import com.arsdigita.kernel.PartyCollection;
import com.arsdigita.kernel.User;
+import com.arsdigita.notification.Notification;
import com.arsdigita.persistence.CompoundFilter;
import com.arsdigita.persistence.DataCollection;
import com.arsdigita.persistence.Filter;
import com.arsdigita.persistence.OID;
import com.arsdigita.persistence.SessionManager;
+import com.arsdigita.toolbox.GlobalisationUtil;
import com.arsdigita.toolbox.ui.ActionGroup;
import com.arsdigita.util.Assert;
+import com.arsdigita.util.UncheckedWrapperException;
import com.arsdigita.web.Web;
+import com.arsdigita.workflow.simple.TaskException;
+import com.arsdigita.workflow.simple.Workflow;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.io.Writer;
import org.apache.log4j.Logger;
import java.math.BigDecimal;
@@ -89,367 +100,690 @@ import java.util.ArrayList;
import java.util.Arrays;
/**
- * Browse folders and manipulate them with various actions
- * (move/copy/delete).
+ * Browse folders and manipulate them with various actions (move/copy/delete).
*
* @author David Lutterkort
* @version $Id: FolderManipulator.java 1940 2009-05-29 07:15:05Z terry $
*/
-public class FolderManipulator extends SimpleContainer
- implements FormProcessListener, FormValidationListener,
- FormSubmissionListener, Resettable {
+@SuppressWarnings("PMD.BeanMembersShouldSerialize")
+public class FolderManipulator extends SimpleContainer implements
+ //FormProcessListener,
+ //FormValidationListener,
+ //FormSubmissionListener,
+ Resettable {
- private static Logger s_log =
- Logger.getLogger(FolderManipulator.class);
- public static final String RESOURCE_BUNDLE =
- "com.arsdigita.cms.ui.folder.CMSFolderResources";
+ //public static final String RESOURCE_BUNDLE = "com.arsdigita.cms.ui.folder.CMSFolderResources";
+ private final GlobalisationUtil globalizationUtil = new com.arsdigita.toolbox.GlobalisationUtil(
+ "com.arsdigita.cms.ui.folder.CMSFolderResources");
+ private static final Logger LOGGER = Logger.getLogger(FolderManipulator.class);
+ private static final String ATOZ_FILTER_PARAM = "aToZfilter";
+ private static final String ACTION_PARAM = "act";
+ private static final String FILTER_PARAM = "filter";
+
+ private static final String SOURCES_PARAM = "srcs";
private static final String MOVE = "Move";
private static final String COPY = "Copy";
- private static final BigDecimal[] EMPTY_ARRAY = new BigDecimal[0];
- private ArrayParameter m_sources;
- private StringParameter m_action;
- // The folder in which the source items live
- private FolderSelectionModel m_srcFolderSel;
- private ItemView m_itemView;
- private TargetSelector m_targetSelector;
- private FilterForm m_filterForm;
- private StringParameter m_aToZfilter = new StringParameter("aToZfilter");
- private StringParameter m_filter = new StringParameter("filter");
+ //private static final String PUBLISH = "Publish";
+ //private static final String UNPUBLISH = "UnPublish";
- public FolderManipulator(FolderSelectionModel folderSel) {
- m_sources = new ArrayParameter(new BigDecimalParameter("srcs"));
- m_action = new StringParameter("act");
- m_srcFolderSel = folderSel;
+ private final ArrayParameter sourcesParam = new ArrayParameter(
+ new BigDecimalParameter(SOURCES_PARAM));
+ private final StringParameter actionParam = new StringParameter(ACTION_PARAM);
+ ;
+ /**
+ * The folder in which the source items live.
+ */
+ private final FolderSelectionModel sourceFolderModel;
+ private final ItemView itemView;
+ private final TargetSelector targetSelector = new TargetSelector();
+ //private final PublishDialog publishDialog = new PublishDialog();
+
+ private FilterForm filterForm;
+ private final StringParameter atozFilterParam = new StringParameter(ATOZ_FILTER_PARAM);
+ private final StringParameter filterParam = new StringParameter(FILTER_PARAM);
- //s_log.debug("Adding filter form...");
- //m_filterForm = new FilterForm();
- //add(m_filterForm);
+ public FolderManipulator(final FolderSelectionModel folderModel) {
- m_itemView = new ItemView();
- m_itemView.addProcessListener(this);
- m_itemView.addValidationListener(this);
- add(m_itemView);
+ super();
+
+ sourceFolderModel = folderModel;
+ itemView = new ItemView();
+ itemView.addProcessListener(new ItemViewProcessListener());
+ itemView.addValidationListener(new ItemViewValidationListener());
+ add(itemView);
+
+ targetSelector.addProcessListener(new TargetSelectorProcessListener());
+ targetSelector.addValidationListener(new TargetSelectorValidationListener());
+ targetSelector.addSubmissionListener(new TargetSelectorSubmissionListener());
+ add(targetSelector);
+
+ //publishDialog.addProcessListener(new PublishDialogProcessListener());
- m_targetSelector = new TargetSelector();
- add(m_targetSelector);
- m_targetSelector.addProcessListener(this);
- m_targetSelector.addValidationListener(this);
- m_targetSelector.addSubmissionListener(this);
-
}
@Override
- public void register(Page p) {
- super.register(p);
- p.setVisibleDefault(m_targetSelector, false);
- p.setVisibleDefault(m_filterForm, true);
- p.addComponentStateParam(this, m_sources);
- p.addComponentStateParam(this, m_action);
- p.addComponentStateParam(this, m_aToZfilter);
- p.addComponentStateParam(this, m_filter);
+ public void register(final Page page) {
+
+ super.register(page);
+ page.setVisibleDefault(targetSelector, false);
+ page.setVisibleDefault(filterForm, true);
+ page.addComponentStateParam(this, sourcesParam);
+ page.addComponentStateParam(this, actionParam);
+ page.addComponentStateParam(this, atozFilterParam);
+ page.addComponentStateParam(this, filterParam);
+
}
- public final BigDecimal[] getSources(PageState s) {
- BigDecimal[] result = (BigDecimal[]) s.getValue(m_sources);
- return (result == null) ? EMPTY_ARRAY : result;
+ public final BigDecimal[] getSources(final PageState state) {
+
+ final BigDecimal[] result = (BigDecimal[]) state.getValue(sourcesParam);
+
+ //Return empty array instead of null.
+ if (result == null) {
+ return new BigDecimal[0];
+ } else {
+ return result;
+ }
}
- public final FolderSelectionModel getSrcFolderSel() {
- return m_srcFolderSel;
+ public final FolderSelectionModel getSourceFolderModel() {
+ return sourceFolderModel;
}
- public final Folder getTarget(PageState s) {
- return m_targetSelector.getTarget(s);
+ public final Folder getTarget(final PageState state) {
+ return targetSelector.getTarget(state);
}
- protected final boolean isMove(PageState s) {
- return MOVE.equals(getAction(s));
+ protected final boolean isMove(final PageState state) {
+ return MOVE.equals(getAction(state));
}
- protected final boolean isCopy(PageState s) {
- return COPY.equals(getAction(s));
+ protected final boolean isCopy(final PageState state) {
+ return COPY.equals(getAction(state));
}
- private String getAction(PageState s) {
- return (String) s.getValue(m_action);
+// protected final boolean isPublish(final PageState state) {
+// return PUBLISH.equals(getAction(state));
+// }
+//
+// protected final boolean isUnPublish(final PageState state) {
+// return UNPUBLISH.equals(getAction(state));
+// }
+
+ private String getAction(final PageState state) {
+ return (String) state.getValue(actionParam);
}
- protected void moveItems(Folder target, BigDecimal[] items) {
- s_log.debug("moving to folder: " + target + " items: " + items);
- for (int i = 0; i < items.length; i++) {
+ protected void moveItems(final Folder target, final BigDecimal[] itemIds) {
+
+ for (BigDecimal itemId : itemIds) {
try {
- ContentItem item = new ContentItem(items[i]);
- item.setParent(target);
- item.save();
+ changeItemParent(itemId, target);
} catch (DataObjectNotFoundException e) {
- s_log.warn("object not found in content move", e);
- throw new IllegalStateException((String) globalize(
- "cms.ui.folder.no_such_item").localize());
+ LOGGER.warn("object not found in content move", e);
+ throw new IllegalStateException(String.format("Item '%s' to move not found.",
+ itemId.toString()));
+
}
}
+
+ }
+
+ private void changeItemParent(final BigDecimal itemId, final Folder newParent)
+ throws DataObjectNotFoundException {
+
+ final ContentItem item = new ContentItem(itemId);
+ item.setParent(newParent);
+ item.save();
+
}
protected void copyItems(final Folder target,
- final BigDecimal[] items) {
- if (s_log.isDebugEnabled()) {
- s_log.debug("Copying items " + Arrays.asList(items) + " to "
- + target);
+ final BigDecimal[] itemIds) {
+
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("Copying items " + Arrays.asList(itemIds) + " to " + target);
}
+ for (BigDecimal itemId : itemIds) {
+// ContentItem source = (ContentItem) DomainObjectFactory.newInstance(
+// new OID(ContentItem.BASE_DATA_OBJECT_TYPE, itemId));
+// Assert.exists(source, ContentItem.class);
+//
+// final ACSObject parent = source.getParent();
+// if (parent instanceof ContentBundle) {
+// source = (ContentBundle) parent;
+// }
+//
+// if (LOGGER.isDebugEnabled()) {
+// LOGGER.debug("Copying item " + source);
+// }
+ final ContentItem source = retrieveSourceItem(itemId);
- for (int i = 0; i < items.length; i++) {
- ContentItem item =
- (ContentItem) DomainObjectFactory.newInstance(new OID(
- ContentItem.BASE_DATA_OBJECT_TYPE, items[i]));
-
- Assert.exists(item, ContentItem.class);
-
- final ACSObject parent = item.getParent();
-
- if (parent instanceof ContentBundle) {
- item = (ContentBundle) parent;
- }
-
- if (s_log.isDebugEnabled()) {
- s_log.debug("Copying item " + item);
- }
-
- final ContentItem newItem = item.copy(target, true);
+ final ContentItem newItem = source.copy(target, true);
Assert.isEqual(target, newItem.getParent());
+
}
}
+// protected void publishItems(final BigDecimal[] itemIds) {
+//
+// if (LOGGER.isDebugEnabled()) {
+// LOGGER.debug("(Re-)Publishing items " + Arrays.asList(itemIds));
+// }
+//
+// for (BigDecimal itemId : itemIds) {
+//
+// final ContentItem item = retrieveSourceItem(itemId);
+//
+// if (item.isLive()) {
+// //Republish
+// //Ensure that we have the draft version
+// //final ContentItem draftItem = item.getDraftVersion();
+// republish(itemId);
+// } else {
+// publish(itemId);
+// }
+//
+// final LifecycleDefinition lifecycleDef = ContentTypeLifecycleDefinition
+// .getLifecycleDefinition(item.getContentSection(), item.getContentType());
+//
+// }
+// }
+
+// private void publish(final BigDecimal itemId) {
+//
+// }
+//
+// private void republish(final BigDecimal itemId) {
+//
+// final User user = Web.getWebContext().getUser();
+//
+// final Thread thread = new Thread(new Runnable() {
+//
+// @Override
+// public void run() {
+// final ContentItem item = retrieveSourceItem(itemId);
+//
+// PublishLock.getInstance().lock(item);
+// item.republish(false);
+// Workflow workflow = Workflow.getObjectWorkflow(item);
+// ItemLifecycleSelectForm.finish(workflow, item, user);
+// PublishLock.getInstance().unlock(item);
+// }
+//
+// });
+// thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
+//
+// @Override
+// public void uncaughtException(final Thread thread,
+// final Throwable ex) {
+// final StringWriter strWriter = new StringWriter();
+// final PrintWriter writer = new PrintWriter(strWriter);
+// ex.printStackTrace(writer);
+// final ContentItem item = retrieveSourceItem(itemId);
+//
+// PublishLock.getInstance().setError(item, strWriter.toString());
+// LOGGER.error(String.format(
+// "An error occurred while "
+// + "publishing the item '%s': ",
+// item.getOID().toString()),
+// ex);
+//
+// if ((CMSConfig.getInstanceOf().
+// getPublicationFailureSender()
+// == null)
+// && (CMSConfig.getInstanceOf().
+// getPublicationFailureReceiver() == null)) {
+// return;
+// }
+//
+// final PartyCollection receiverParties = Party.retrieveAllParties();
+// Party receiver = null;
+// receiverParties.addEqualsFilter("primaryEmail",
+// CMSConfig.getInstanceOf().
+// getPublicationFailureReceiver());
+// if (receiverParties.next()) {
+// receiver = receiverParties.getParty();
+// }
+// receiverParties.close();
+//
+// final PartyCollection senderParties = Party.retrieveAllParties();
+// Party sender = null;
+// senderParties.addEqualsFilter("primaryEmail",
+// CMSConfig.getInstanceOf().
+// getPublicationFailureReceiver());
+// if (senderParties.next()) {
+// sender = senderParties.getParty();
+// }
+// senderParties.close();
+//
+// if ((sender != null) && (receiver != null)) {
+// final Writer traceWriter = new StringWriter();
+// final PrintWriter printWriter = new PrintWriter(
+// traceWriter);
+// ex.printStackTrace(printWriter);
+//
+// final Notification notification = new Notification(
+// sender,
+// receiver,
+// String.format(
+// "Failed to publish item '%s'",
+// item.getOID().toString()),
+// String.format("Publishing item '%s' failed "
+// + "with error message: %s.\n\n"
+// + "Stacktrace:\n%s",
+// item.getOID().toString(),
+// ex.getMessage(),
+// traceWriter.toString()));
+// notification.save();
+// }
+// }
+//
+// });
+//
+// thread.start();
+// }
+
+ private ContentItem retrieveSourceItem(final BigDecimal itemToCopyId) {
+
+ ContentItem source = (ContentItem) DomainObjectFactory.newInstance(
+ new OID(ContentItem.BASE_DATA_OBJECT_TYPE, itemToCopyId));
+ Assert.exists(source, ContentItem.class);
+
+ final ACSObject parent = source.getParent();
+ if (parent instanceof ContentBundle) {
+ source = (ContentBundle) parent;
+ }
+
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("Copying item " + source);
+ }
+
+ return source;
+ }
+
/**
- * Returns the form that contains the folder browser and the move/copy
- * dropdown.
+ * Returns the form that contains the folder browser and the move/copy dropdown.
+ *
+ * @return The form containing the folder browser and dropdown menu
*/
public final Form getItemView() {
- return m_itemView;
+ return itemView;
}
/**
* Returns the form to choose the target folder for move/copy
+ *
+ * @return
*/
public final Form getTargetSelector() {
- return m_targetSelector;
+ return targetSelector;
}
/**
* Return the browser contained in the ItemView form
+ *
+ * @return
*/
public final FolderBrowser getBrowser() {
- return m_itemView.getBrowser();
+ return itemView.getBrowser();
}
- @Override
- public void process(FormSectionEvent e) {
- PageState s = e.getPageState();
- if (e.getSource() == m_itemView) {
- m_itemView.setVisible(s, false);
- m_targetSelector.setVisible(s, true);
- m_targetSelector.expose(s);
- } else if (e.getSource() == m_targetSelector) {
- m_itemView.setVisible(s, true);
- m_targetSelector.setVisible(s, false);
- Folder f = m_targetSelector.getTarget(s);
- BigDecimal[] items = getSources(s);
- if (isCopy(s)) {
- copyItems(f, items);
- } else if (isMove(s)) {
- moveItems(f, items);
- }
- reset(s);
+ private class ItemViewProcessListener implements FormProcessListener {
+
+ public ItemViewProcessListener() {
+ //Nothing
}
+
+ @Override
+ public void process(final FormSectionEvent event) throws FormProcessException {
+ final PageState state = event.getPageState();
+
+ itemView.setVisible(state, false);
+ targetSelector.setVisible(state, true);
+ targetSelector.expose(state);
+ }
+
}
- @Override
- public void validate(FormSectionEvent e) {
- ContentItem item;
- String name;
- ItemCollection items;
- PageState s = e.getPageState();
- FormData d = e.getFormData();
- BigDecimal[] sources = getSources(s);
- boolean hasSources = sources.length > 0;
- SecurityManager sm = Utilities.getSecurityManager(s);
+ private class TargetSelectorProcessListener implements FormProcessListener {
- if (e.getSource() == m_itemView) {
- if (!hasSources) {
- d.addError(globalize("cms.ui.folder.must_select_item"));
+ public TargetSelectorProcessListener() {
+ //Nothing
+ }
+
+ @Override
+ public void process(final FormSectionEvent event) throws FormProcessException {
+
+ final PageState state = event.getPageState();
+
+ itemView.setVisible(state, true);
+ targetSelector.setVisible(state, false);
+
+ final Folder folder = targetSelector.getTarget(state);
+ final BigDecimal[] itemIds = getSources(state);
+
+ if (isCopy(state)) {
+ copyItems(folder, itemIds);
+ } else if (isMove(state)) {
+ moveItems(folder, itemIds);
}
- } else if (e.getSource() == m_targetSelector) {
- // The source items must have gotten lost somehow
- if (!hasSources) {
- throw new IllegalStateException((String) GlobalizationUtil.
- globalize("cms.ui.folder.no_source_items_specified").
- localize());
+
+ reset(state);
+
+ }
+
+ }
+
+// private class PublishDialogProcessListener implements FormProcessListener {
+//
+// public PublishDialogProcessListener() {
+// //Nothing
+// }
+//
+// @Override
+// public void process(final FormSectionEvent event) throws FormProcessException {
+//
+// final PageState state = event.getPageState();
+//
+// itemView.setVisible(state, true);
+// publishDialog.setVisible(state, false);
+//
+// final BigDecimal[] itemIds = getSources(state);
+//
+// if (isPublish(state)) {
+// publishItems(itemIds);
+// } else if (isUnPublish(state)) {
+// unpublishItems(itemIds);
+// }
+//
+// reset(state);
+// }
+//
+// }
+
+ private class ItemViewValidationListener implements FormValidationListener {
+
+ public ItemViewValidationListener() {
+ //Nothing
+ }
+
+ @Override
+ public void validate(final FormSectionEvent event) throws FormProcessException {
+
+ final PageState state = event.getPageState();
+ final FormData data = event.getFormData();
+
+ if (getSources(state).length <= 0) {
+ data.addError(globalizationUtil.globalise("cms.ui.folder.must_select_item"));
}
- Folder target = m_targetSelector.getTarget(s);
+ }
+
+ }
+
+ private class TargetSelectorValidationListener implements FormValidationListener {
+
+ public TargetSelectorValidationListener() {
+ //Nothing
+ }
+
+ @Override
+ public void validate(final FormSectionEvent event) throws FormProcessException {
+
+ final PageState state = event.getPageState();
+
+ if (getSources(state).length <= 0) {
+ throw new IllegalStateException("No source items specified");
+ }
+
+ final Folder target = targetSelector.getTarget(state);
+ final FormData data = event.getFormData();
if (target == null) {
- d.addError(globalize("cms.ui.folder.need_select_target_folder"));
+ data.addError(globalizationUtil.globalise(
+ "cms.ui.folder.need_select_target_folder"));
+ //If the target is null, we can skip the rest of the checks
+ return;
}
- if (target.equals(m_srcFolderSel.getSelectedObject(s))) {
- d.addError(globalize("cms.ui.folder.not_within_same_folder"));
- }
- // check create item permission
- User user = Web.getWebContext().getUser();
- if (!sm.canAccess(user, SecurityManager.NEW_ITEM, target)) {
- d.addError(globalize("cms.ui.folder.no_permission_for_item"));
- }
- // Per-item checks
- for (int i = 0; i < sources.length; i++) {
- try {
- item = new ContentItem(sources[i]);
- name = item.getName();
- items = target.getItems();
- items.addNameFilter(name);
- if (items.next()) {
- // there is an item in the target folder that already has this name
- d.addError((String) globalize(
- "cms.ui.folder.item_already_exists").localize()
- + name);
- }
- items.close();
- if (item.isLive() && isMove(s)) {
- d.addError(name + (String) globalize(
- "cms.ui.folder.item_is_live").localize());
- }
- if ((!sm.canAccess(user, SecurityManager.DELETE_ITEM, item))
- && isMove(
- s)) {
- d.addError((String) globalize(
- "cms.ui.folder.no_permission_for_item").localize()
- + name + ".");
- }
- } catch (DataObjectNotFoundException exc) {
- s_log.warn("object not found in validation", exc);
- throw new IllegalStateException((String) globalize(
- "cms.ui.folder.no_such_item").localize());
+ if (target.equals(sourceFolderModel.getSelectedObject(state))) {
+ data.addError(globalizationUtil.globalise("cms.ui.folder.not_within_same_folder"));
+ }
+
+ // check create item permission
+ final User user = Web.getWebContext().getUser();
+ final SecurityManager securityManager = CMS.getSecurityManager(state);
+ if (!securityManager.canAccess(user, SecurityManager.NEW_ITEM, target)) {
+ data.addError(globalizationUtil.globalise("cms.ui.folder.no_permission_for_item"));
+ }
+
+ for (BigDecimal source : getSources(state)) {
+ try {
+ validateItem(source, target, state, data);
+ } catch (DataObjectNotFoundException ex) {
+ LOGGER.warn("Object not found in validation", ex);
+ throw new IllegalStateException(String.format(
+ "There is no item with the id '%s'", source.toString()));
}
}
+
}
+
+ private void validateItem(final BigDecimal itemId,
+ final Folder target,
+ final PageState state,
+ final FormData data) {
+
+ final ContentItem item = new ContentItem(itemId);
+ final String name = item.getName();
+
+ final ItemCollection items = target.getItems();
+ items.addNameFilter(name);
+ if (items.next()) {
+ // there is an item in the target folder that already has this name
+ addErrorMessage(data, "cms.ui.folder.item_already_exists", name);
+ }
+ items.close();
+
+ if (item.isLive() && isMove(state)) {
+ addErrorMessage(data, "cms.ui.folder.item_is_live", name);
+ }
+
+ final SecurityManager securityManager = CMS.getSecurityManager(state);
+ final User user = Web.getWebContext().getUser();
+ if ((!securityManager.canAccess(user, SecurityManager.DELETE_ITEM, item))
+ && isMove(state)) {
+ addErrorMessage(data, "cms.ui.folder.no_permission_for_item", name);
+ }
+ }
+
+ }
+
+ private void addErrorMessage(final FormData data, final String message, final String itemName) {
+ data.addError(globalizationUtil.globalise(message, new Object[]{itemName}));
+ }
+
+// @Override
+// public void submitted(final FormSectionEvent event) throws FormProcessException {
+//
+// final PageState state = event.getPageState();
+//
+// if (targetSelector.isCancelled(state)) {
+// reset(state);
+// throw new FormProcessException("cms.ui.folder.cancelled");
+//
+// }
+// }
+ private class TargetSelectorSubmissionListener implements FormSubmissionListener {
+
+ public TargetSelectorSubmissionListener() {
+ //Nothing
+ }
+
+ @Override
+ public void submitted(final FormSectionEvent event) throws FormProcessException {
+
+ final PageState state = event.getPageState();
+
+ if (targetSelector.isCancelled(state)) {
+ reset(state);
+ throw new FormProcessException("cms.ui.folder.cancelled");
+ }
+
+ }
+
}
@Override
- public void submitted(FormSectionEvent e)
- throws FormProcessException {
- PageState s = e.getPageState();
- if (m_targetSelector.isCancelled(s)) {
- reset(s);
- throw new FormProcessException((String) GlobalizationUtil.globalize(
- "cms.ui.folder.cancelled").localize());
- }
- }
+ public void reset(final PageState state) {
+
+ itemView.setVisible(state, true);
+ itemView.reset(state);
+ targetSelector.setVisible(state, false);
+ targetSelector.reset(state);
+ //publishDialog.setVisible(state, false);
+ state.setValue(actionParam, null);
+ state.setValue(sourcesParam, null);
+ //s.setValue(m_aToZfilter, null);
+ state.setValue(filterParam, null);
- @Override
- public void reset(PageState s) {
- m_itemView.setVisible(s, true);
- m_itemView.reset(s);
- m_targetSelector.setVisible(s, false);
- m_targetSelector.reset(s);
- s.setValue(m_action, null);
- s.setValue(m_sources, null);
- s.setValue(m_aToZfilter, null);
- s.setValue(m_filter, null);
}
// The form containing the tree to select the target folder from
- private class TargetSelector extends Form
- implements Resettable {
+ private class TargetSelector extends Form implements Resettable {
- private FolderSelectionModel m_targetSel;
- private FolderTree m_folderTree;
- private Submit m_cancel;
+ private final FolderSelectionModel targetModel;
+ private final FolderTree folderTree;
+ private final Submit cancelButton;
public TargetSelector() {
super("targetSel", new BoxPanel());
setMethod(GET);
- m_targetSel = new FolderSelectionModel("target");
- m_folderTree = new FolderTree(m_targetSel);
- m_folderTree.setCellRenderer(new FolderTreeCellRenderer());
+ targetModel = new FolderSelectionModel("target");
+ folderTree = new FolderTree(targetModel);
+ folderTree.setCellRenderer(new FolderTreeCellRenderer());
- Label l = new Label(new PrintListener() {
+ final Label label = new Label(new PrintListener() {
@Override
- public void prepare(PrintEvent e) {
- PageState s = e.getPageState();
- Label t = (Label) e.getTarget();
- int n = getSources(s).length;
- Folder f = (Folder) m_srcFolderSel.getSelectedObject(s);
- String msg = n + " " + (String) globalize(
- "cms.ui.folder.items").localize() + " "
- + (String) globalize(
- "cms.ui.folder.from").localize() + " /" + f.
- getPathNoJsp() + " " + (String) globalize(
- "cms.ui.folder.to").localize();
- if (isMove(s)) {
- t.setLabel((String) globalize("cms.ui.folder.move").
- localize() + " " + msg);
- } else if (isCopy(s)) {
- t.setLabel((String) globalize("cms.ui.folder.copy").
- localize() + " " + msg);
+ public void prepare(final PrintEvent event) {
+ final PageState state = event.getPageState();
+ final Label label = (Label) event.getTarget();
+ final int numberOfItems = getSources(state).length;
+ final Folder folder = (Folder) sourceFolderModel.getSelectedObject(state);
+ if (isMove(state)) {
+ label.setLabel(globalizationUtil.globalise(
+ "cms.ui.folder.move", new Object[]{numberOfItems,
+ folder.getPathNoJsp()}));
+ } else if (isCopy(state)) {
+ label.setLabel(globalizationUtil.globalise(
+ "cms.ui.folder.copy", new Object[]{numberOfItems,
+ folder.getPathNoJsp()}));
}
}
+
});
- l.setOutputEscaping(false);
- add(l);
- add(m_folderTree);
+
+ label.setOutputEscaping(false);
+ add(label);
+ add(folderTree);
add(new FormErrorDisplay(this));
- SaveCancelSection scs = new SaveCancelSection();
- m_cancel = scs.getCancelButton();
- add(scs);
+ final SaveCancelSection saveCancelSection = new SaveCancelSection();
+ cancelButton = saveCancelSection.getCancelButton();
+ add(saveCancelSection);
}
@Override
- public void register(Page p) {
- super.register(p);
- p.addComponentStateParam(this, m_targetSel.getStateParameter());
+ public void register(final Page page) {
+ super.register(page);
+ page.addComponentStateParam(this, targetModel.getStateParameter());
}
// Set things up the first time the selector gets visible
- public void expose(PageState s) {
- Folder f = (Folder) m_srcFolderSel.getSelectedObject(s);
- m_targetSel.clearSelection(s);
- if (f != null) {
- ItemCollection i = f.getPathInfo(true);
- while (i.next()) {
- m_folderTree.expand(i.getID().toString(), s);
+ public void expose(final PageState state) {
+ final Folder folder = (Folder) sourceFolderModel.getSelectedObject(state);
+ targetModel.clearSelection(state);
+ if (folder != null) {
+ final ItemCollection items = folder.getPathInfo(true);
+ while (items.next()) {
+ folderTree.expand(items.getID().toString(), state);
}
- i.close();
+ items.close();
}
}
@Override
- public void reset(PageState s) {
- m_folderTree.clearSelection(s);
+ public void reset(final PageState state) {
+ folderTree.clearSelection(state);
// FIXME: add a reset method to Tree and call that instead of this
// hack
- s.setValue(m_folderTree.getSelectionModel().getStateParameter(),
- null);
+ state.setValue(folderTree.getSelectionModel().getStateParameter(), null);
}
- public Folder getTarget(PageState s) {
- return (Folder) m_targetSel.getSelectedObject(s);
+ public Folder getTarget(final PageState state) {
+ return (Folder) targetModel.getSelectedObject(state);
}
- public boolean isCancelled(PageState s) {
- return m_cancel.isSelected(s);
+ public boolean isCancelled(final PageState state) {
+ return cancelButton.isSelected(state);
}
+
}
+ //The form which is show for the publish and unpublish action
+// private class PublishDialog extends Form {
+//
+// public PublishDialog() {
+// super("PublishDialog", new BoxPanel());
+//
+// final Label label = new Label(new PrintListener() {
+//
+// @Override
+// public void prepare(final PrintEvent event) {
+//
+// final PageState state = event.getPageState();
+// final Label target = (Label) event.getTarget();
+// final int numberOfItems = getSources(state).length;
+// final Folder folder = (Folder) sourceFolderModel.getSelectedObject(state);
+//
+// if (isPublish(state)) {
+// target.setLabel(globalizationUtil.globalise(
+// "cms.ui.folder.publish",
+// new Object[]{numberOfItems,
+// folder.getPathNoJsp()}));
+// } else if (isUnPublish(state)) {
+// target.setLabel(globalizationUtil.globalise(
+// "cms.ui.folder.publish",
+// new Object[]{numberOfItems,
+// folder.getPathNoJsp()}));
+// }
+// }
+//
+// });
+//
+// label.setOutputEscaping(false);
+// add(label);
+// add(new FormErrorDisplay(this));
+// add(new SaveCancelSection());
+// }
+//
+// }
+
// The form containing the browser and the drop down for selecting an
// action
private class ItemView extends Form implements Resettable {
- private FolderBrowser m_browser;
- private Paginator m_paginator;
- private OptionGroup m_checkboxGroup;
- private SingleSelect m_actionSel;
- private Submit m_submit;
+ private static final String ITEM_VIEW = "itemView";
+
+ private final FolderBrowser folderBrowser;
+ private final Paginator paginator;
+ private final OptionGroup checkboxGroup;
+ private final SingleSelect actionSelect;
+ private final Submit submit;
public ItemView() {
- super("itemView", new SimpleContainer());
+
+ super(ITEM_VIEW, new SimpleContainer());
setMethod(GET);
final ActionGroup group = new ActionGroup();
@@ -458,131 +792,147 @@ public class FolderManipulator extends SimpleContainer
final GridPanel panel = new GridPanel(1);
group.setSubject(panel);
- m_browser = new FolderBrowser(m_srcFolderSel);
- m_browser.setAtoZfilterParameter(m_aToZfilter);
- m_browser.setFilterParameter(m_filter);
- m_browser.setFilterForm(m_filterForm);
- m_paginator = new Paginator((PaginationModelBuilder) m_browser.
- getModelBuilder(),
- ContentSection.getConfig().
- getFolderBrowseListSize());
- panel.add(m_paginator);
- panel.add(m_browser);
+ folderBrowser = new FolderBrowser(sourceFolderModel);
+ folderBrowser.setAtoZfilterParameter(atozFilterParam);
+ folderBrowser.setFilterParameter(filterParam);
+ folderBrowser.setFilterForm(filterForm);
+ paginator = new Paginator((PaginationModelBuilder) folderBrowser.getModelBuilder(),
+ ContentSection.getConfig().getFolderBrowseListSize());
+ panel.add(paginator);
+ panel.add(folderBrowser);
- s_log.debug("Adding filter form...");
- m_filterForm = new FilterForm((FilterFormModelBuilder) m_browser.
- getModelBuilder());
- FolderManipulator.this.add(m_filterForm);
+ LOGGER.debug("Adding filter form...");
+ filterForm = new FilterForm((FilterFormModelBuilder) folderBrowser.getModelBuilder());
+ FolderManipulator.this.add(filterForm);
- m_checkboxGroup = new CheckboxGroup(m_sources);
- panel.add(m_checkboxGroup);
+ checkboxGroup = new CheckboxGroup(sourcesParam);
+ panel.add(checkboxGroup);
panel.add(new FormErrorDisplay(this));
- final Container c = new SimpleContainer();
- group.addAction(c);
+ final Container container = new SimpleContainer();
+ group.addAction(container);
- c.add(new Label(globalize("cms.ui.folder.edit_selection")));
- m_actionSel = new SingleSelect(m_action);
- m_actionSel.addOption(new Option(COPY, new Label(globalize(
- "cms.ui.folder.copy"))));
- m_actionSel.addOption(new Option(MOVE, new Label(globalize(
- "cms.ui.folder.move"))));
- c.add(m_actionSel);
- m_submit = new Submit("Go", globalize("cms.ui.folder.go"));
- c.add(m_submit);
+ container.add(new Label(globalizationUtil.globalise("cms.ui.folder.edit_selection")));
+ actionSelect = new SingleSelect(actionParam);
+ actionSelect.addOption(new Option(COPY,
+ new Label(globalizationUtil.globalise(
+ "cms.ui.folder.copy.action"))));
+ actionSelect.addOption(new Option(MOVE,
+ new Label(globalizationUtil.globalise(
+ "cms.ui.folder.move.action"))));
+ //Publishing in the folder browser only works if threaded publishing is active
+// if (CMSConfig.getInstanceOf().getThreadedPublishing()) {
+// actionSelect.addOption(new Option(PUBLISH,
+// new Label(globalizationUtil.globalise(
+// "cms.ui.folder.publish.action"))));
+// actionSelect.addOption(new Option(UNPUBLISH,
+// new Label(globalizationUtil.globalise(
+// "cms.ui.folder.unpublish.action"))));
+// }
+ container.add(actionSelect);
+ submit = new Submit("Go", globalizationUtil.globalise("cms.ui.folder.go"));
+ container.add(submit);
// Add a new first column to the table
- TableColumn tc = new TableColumn();
- tc.setCellRenderer(new CheckboxRenderer());
- m_browser.getColumnModel().add(0, tc);
+ final TableColumn column = new TableColumn();
+ column.setCellRenderer(new CheckboxRenderer());
+ folderBrowser.getColumnModel().add(0, column);
}
public final FolderBrowser getBrowser() {
- return m_browser;
+ return folderBrowser;
}
@Override
- public void reset(PageState s) {
- m_checkboxGroup.setValue(s, null);
- m_actionSel.setValue(s, null);
- m_paginator.reset(s);
- s.setValue(m_aToZfilter, null);
- s.setValue(m_filter, null);
- m_filterForm.getFilterField().setValue(s, null);
+ public void reset(final PageState state) {
+
+ checkboxGroup.setValue(state, null);
+ actionSelect.setValue(state, null);
+ paginator.reset(state);
+ //state.setValue(m_aToZfilter, null);
+ state.setValue(filterParam, null);
+ filterForm.getFilterField().setValue(state, null);
}
// The renderer for the first column in the itemView table
private class CheckboxRenderer implements TableCellRenderer {
+ public CheckboxRenderer() {
+ //Nothing to do
+ }
+
@Override
- public Component getComponent(Table table, PageState state,
- Object value,
- boolean isSelected, Object key,
- int row, int column) {
- BigDecimal n = (BigDecimal) key;
- Option result =
- new Option(m_sources.marshalElement(n.abs()), "");
- result.setGroup(m_checkboxGroup);
+ public Component getComponent(final Table table,
+ final PageState state,
+ final Object value,
+ final boolean isSelected,
+ final Object key,
+ final int row,
+ final int column) {
+ final BigDecimal n = (BigDecimal) key;
+ Option result = new Option(sourcesParam.marshalElement(n.abs()), "");
+ result.setGroup(checkboxGroup);
return result;
}
+
}
+
}
protected class FilterForm extends Form implements FormProcessListener,
FormInitListener,
FormSubmissionListener {
- private SimpleContainer panel;
+ private final SimpleContainer panel;
private boolean visible;
- private FilterFormModelBuilder modelBuilder;
- private TextField filterField;
+ private final FilterFormModelBuilder modelBuilder;
+ private final TextField filterField;
- public FilterForm(FilterFormModelBuilder modelBuilder) {
+ public FilterForm(final FilterFormModelBuilder modelBuilder) {
super("folderFilterForm");
- s_log.debug("Creating filter form...");
+ LOGGER.debug("Creating filter form...");
this.modelBuilder = modelBuilder;
addProcessListener(this);
- addInitListener(this);
+ addInitListener(this);
addSubmissionListener(this);
panel = new BoxPanel(BoxPanel.HORIZONTAL);
- ActionLink allLink = new ActionLink((String) globalize(
- "cms.ui.folder.filter.all").localize());
+ final ActionLink allLink = new ActionLink(
+ globalizationUtil.globalise("cms.ui.folder.filter.all"));
allLink.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent event) {
- event.getPageState().setValue(m_aToZfilter, "");
- event.getPageState().setValue(m_filter, "");
+ @Override
+ public void actionPerformed(final ActionEvent event) {
+ //event.getPageState().setValue(m_aToZfilter, "");
+ event.getPageState().setValue(filterParam, "");
}
+
});
panel.add(allLink);
- for (char c = 'A';
- c <= 'Z'; c++) {
- final char lowerCaseChar = Character.toLowerCase(c);
- ActionLink link = new ActionLink(Character.toString(c));
- link.addActionListener(new ActionListener() {
-
- public void actionPerformed(ActionEvent event) {
- event.getPageState().setValue(m_aToZfilter,
- Character.toString(
- lowerCaseChar));
- }
- });
- panel.add(link);
- }
-
- panel.add(new Label((String) globalize("cms.ui.folder.filter").localize()));
- filterField = new TextField(m_filter);
+// for (char c = 'A'; c <= 'Z'; c++) {
+// final char lowerCaseChar = Character.toLowerCase(c);
+// final ActionLink link = new ActionLink(Character.toString(c));
+// link.addActionListener(new ActionListener() {
+//
+// @Override
+// public void actionPerformed(final ActionEvent event) {
+// event.getPageState().setValue(m_aToZfilter,
+// Character.toString(lowerCaseChar));
+// }
+// });
+// panel.add(link);
+// }
+ panel.add(new Label(globalizationUtil.globalise("cms.ui.folder.filter")));
+ filterField = new TextField(filterParam);
panel.add(filterField);
- panel.add(
- new Submit("filterFolderSubmit",
- (String) globalize("cms.ui.folder.filter_do").localize()));
+ panel.add(new Submit("filterFolderSubmit",
+ globalizationUtil.globalise("cms.ui.folder.filter_do")));
add(panel);
@@ -591,59 +941,72 @@ public class FolderManipulator extends SimpleContainer
public TextField getFilterField() {
return filterField;
}
-
- public void process(FormSectionEvent fse) throws FormProcessException {
+
+ @Override
+ public void process(final FormSectionEvent event) throws FormProcessException {
+ //Nothing
}
- public void init(FormSectionEvent fse) throws FormProcessException {
+ @Override
+ public void init(final FormSectionEvent event) throws FormProcessException {
//fse.getPageState().setValue(FolderManipulator.this.m_filter, null);
//filterField.setValue(fse.getPageState(), null);
}
- public void submitted(FormSectionEvent fse) throws FormProcessException {
+ @Override
+ public void submitted(final FormSectionEvent event) throws FormProcessException {
}
@Override
public boolean isVisible(PageState state) {
if (super.isVisible(state)
- && (modelBuilder.getFolderSize(state) >= CMSConfig.getInstanceOf().
- getFolderAtoZShowLimit())) {
+ && (modelBuilder.getFolderSize(state)
+ >= CMSConfig.getInstanceOf().getFolderAtoZShowLimit())) {
return true;
} else {
return false;
}
}
+
}
protected interface FilterFormModelBuilder {
public long getFolderSize(PageState state);
+
}
/**
* Getting the GlobalizedMessage using a CMS Class targetBundle.
*
- * @param key The resource key
- * @pre ( key != null )
+ * @param key The resource key. May not null.
+ *
+ * @return The globalised message
*/
- public static GlobalizedMessage globalize(String key) {
- return new GlobalizedMessage(key, RESOURCE_BUNDLE);
- }
-
+// public static GlobalizedMessage globalize(final String key) {
+// return new GlobalizedMessage(key, RESOURCE_BUNDLE);
+// }
+//
+// public static GlobalizedMessage globalize(final String key, final Object[] args) {
+// return new GlobalizedMessage(key, RESOURCE_BUNDLE, args);
+// }
private class FolderTreeCellRenderer implements TreeCellRenderer {
private RequestLocal m_invalidFolders = new RequestLocal();
/**
- * Render the folders appropriately. The selected folder is a bold
- * label. Invalid folders are plain labels. Unselected, valid folders
- * are control links. Invalid folders are: the parent folder of the
- * sources, any of the sources, and any subfolders of the sources.
+ * Render the folders appropriately. The selected folder is a bold label. Invalid folders
+ * are plain labels. Unselected, valid folders are control links. Invalid folders are: the
+ * parent folder of the sources, any of the sources, and any subfolders of the sources.
*/
@Override
- public Component getComponent(Tree tree, PageState state, Object value,
- boolean isSelected, boolean isExpanded,
- boolean isLeaf, Object key) {
+ public Component getComponent(final Tree tree,
+ final PageState state,
+ final Object value,
+ final boolean isSelected,
+ final boolean isExpanded,
+ final boolean isLeaf,
+ final Object key) {
// Get the list of invalid folders once per request.
ArrayList invalidFolders = (ArrayList) m_invalidFolders.get(state);
@@ -653,30 +1016,29 @@ public class FolderManipulator extends SimpleContainer
// request. Setting now.
invalidFolders = new ArrayList();
- DataCollection collection =
- SessionManager.getSession().retrieve(
- ContentItem.BASE_DATA_OBJECT_TYPE);
+ final DataCollection collection = SessionManager.getSession().retrieve(
+ ContentItem.BASE_DATA_OBJECT_TYPE);
CompoundFilter filter = collection.getFilterFactory().or();
// The sources themselves are not valid.
- BigDecimal[] sources = getSources(state);
+ final BigDecimal[] sources = getSources(state);
+
for (int i = 0; i < sources.length; i++) {
invalidFolders.add(sources[i].toString());
- Filter temp = filter.addFilter("id = :id" + i);
+ final Filter temp = filter.addFilter("id = :id" + i);
temp.set("id" + i, sources[i]);
}
collection.addFilter(filter);
- DataCollection folders =
- SessionManager.getSession().retrieve(
- Folder.BASE_DATA_OBJECT_TYPE);
+ final DataCollection folders = SessionManager.getSession().retrieve(
+ Folder.BASE_DATA_OBJECT_TYPE);
folders.addEqualsFilter(Folder.IS_DELETED, Boolean.FALSE);
filter = collection.getFilterFactory().or();
int count = 0;
while (collection.next()) {
filter.addFilter(Folder.ANCESTORS + " like :ancestors"
- + count + " || '%'");
+ + count + " || '%'");
filter.set("ancestors" + count,
collection.get(ContentItem.ANCESTORS));
count++;
@@ -689,36 +1051,36 @@ public class FolderManipulator extends SimpleContainer
// Get all subfolders of the sources. These are also not valid.
/*
- DataQuery dq = SessionManager.getSession().retrieveQuery("com.arsdigita.cms.FoldersAndAllSubFolders");
- dq.setParameter("item_list", invalidFolders);
+ DataQuery dq = SessionManager.getSession().retrieveQuery("com.arsdigita.cms.FoldersAndAllSubFolders");
+ dq.setParameter("item_list", invalidFolders);
- while (dq.next()) {
- invalidFolders.add (dq.get("folder_id").toString());
- }
+ while (dq.next()) {
+ invalidFolders.add (dq.get("folder_id").toString());
+ }
*/
-
// The folder from which the sources are being moved/copied is
// not allowed.
- invalidFolders.add(
- m_srcFolderSel.getSelectedKey(state).toString());
+ invalidFolders.add(sourceFolderModel.getSelectedKey(state).toString());
// Save the invalid folder list
m_invalidFolders.set(state, invalidFolders);
}
- Label l = new Label(value.toString());
+ final Label label = new Label(value.toString());
if (invalidFolders.contains(key.toString())) {
- return l;
+ return label;
}
// Bold if selected
if (isSelected) {
- l.setFontWeight(Label.BOLD);
- return l;
+ label.setFontWeight(Label.BOLD);
+ return label;
}
- return new ControlLink(l);
+ return new ControlLink(label);
}
+
}
+
}
diff --git a/ccm-cms/src/com/arsdigita/cms/ui/lifecycle/PublishLock.java b/ccm-cms/src/com/arsdigita/cms/ui/lifecycle/PublishLock.java
index cf2361404..29761ab63 100644
--- a/ccm-cms/src/com/arsdigita/cms/ui/lifecycle/PublishLock.java
+++ b/ccm-cms/src/com/arsdigita/cms/ui/lifecycle/PublishLock.java
@@ -28,15 +28,15 @@ public class PublishLock {
private PublishLock() {
}
- protected static synchronized PublishLock getInstance() {
+ public static synchronized PublishLock getInstance() {
return instance;
}
- protected synchronized void lock(final ContentItem item) {
+ public synchronized void lock(final ContentItem item) {
lock(item, "publish");
}
- protected synchronized void lock(final ContentItem item,
+ public synchronized void lock(final ContentItem item,
final String action) {
SessionManager.getSession().getTransactionContext().beginTxn();
final DataObject lock = SessionManager.getSession().create(
@@ -49,7 +49,7 @@ public class PublishLock {
SessionManager.getSession().getTransactionContext().commitTxn();
}
- protected synchronized void unlock(final ContentItem item) {
+ public synchronized void unlock(final ContentItem item) {
SessionManager.getSession().getTransactionContext().beginTxn();
final DataCollection collection = SessionManager.getSession().retrieve(
LOCK_OBJECT_TYPE);
@@ -66,7 +66,7 @@ public class PublishLock {
SessionManager.getSession().getTransactionContext().commitTxn();
}
- protected synchronized boolean isLocked(final ContentItem item) {
+ public synchronized boolean isLocked(final ContentItem item) {
final DataCollection collection = SessionManager.getSession().retrieve(
LOCK_OBJECT_TYPE);
collection.addFilter(String.format("%s = '%s'", LOCKED_OID,
@@ -80,7 +80,7 @@ public class PublishLock {
}
}
- protected synchronized void setError(final ContentItem item, final String stacktrace) {
+ public synchronized void setError(final ContentItem item, final String stacktrace) {
SessionManager.getSession().getTransactionContext().beginTxn();
final DataCollection collection = SessionManager.getSession().retrieve(
LOCK_OBJECT_TYPE);
@@ -99,7 +99,7 @@ public class PublishLock {
SessionManager.getSession().getTransactionContext().commitTxn();
}
- protected synchronized boolean hasError(final ContentItem item) {
+ public synchronized boolean hasError(final ContentItem item) {
final DataCollection collection = SessionManager.getSession().retrieve(
LOCK_OBJECT_TYPE);
collection.addFilter(String.format("%s = '%s'", LOCKED_OID,
diff --git a/ccm-core/src/com/arsdigita/toolbox/GlobalisationUtil.java b/ccm-core/src/com/arsdigita/toolbox/GlobalisationUtil.java
new file mode 100644
index 000000000..fabfa3a20
--- /dev/null
+++ b/ccm-core/src/com/arsdigita/toolbox/GlobalisationUtil.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2002-2004 Red Hat Inc. All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+package com.arsdigita.toolbox;
+
+import com.arsdigita.globalization.GlobalizedMessage;
+
+/**
+ * Utility class for simplify the handling of {@link GlobalizedMessage}. This class is intended as a
+ more object orientated replacement for the numerous GlobalisationUtil classes with static
+ methods.
+
+ This class should not used directly. Instead create a subclass of this class with a parameter
+ less constructor which calls the constructor of this class providing the name of the bundle.
+ *
+ * @see GlobalizedMessage
+ *
+ * @author Jens Pelzetter
+ * @version $Id$
+ */
+public class GlobalisationUtil {
+
+ private final transient String bundleName;
+
+ /**
+ * Constructor for a new {@link GlobalisationUtil} instance. For normal use cases don't use this
+ * constructor directly to create an instance of this class. Instead a subclass should be
+ * created which provides a parameterless constructor which class this constructor with the
+ * fully qualified name of the appropriate bundle. For some use cases, for example a resource
+ * bundle which is only used in a single class may be used by simply using this constructor.
+ *
+ * @param bundleName Name of the bundle to be used by this {@code GlobalisationUtil} instance.
+ */
+ public GlobalisationUtil(final String bundleName) {
+ this.bundleName = bundleName;
+ }
+
+ /**
+ * Lookup the globalised message identified by the provided key in the resource bundle.
+ *
+ * @param key Message key
+ * @return The globalised message.
+ */
+ public GlobalizedMessage globalise(final String key) {
+ return new GlobalizedMessage(key, bundleName);
+ }
+
+ /**
+ * Lookup the globalised message identified by the provided key in the resource bundle and
+ * replace the placeholders in the message with the provided arguments.
+ *
+ * @param key The key of the message to lookup.
+ * @param args Arguments for the placeholders in the message.
+ * @return The globalised message.
+ */
+ public GlobalizedMessage globalise(final String key,
+ final Object[] args) {
+ return new GlobalizedMessage(key, bundleName, args);
+ }
+
+}
diff --git a/ccm-ldn-terms/src/com/arsdigita/london/terms/TermsResources.properties b/ccm-ldn-terms/src/com/arsdigita/london/terms/TermsResources.properties
index 43dbf9cc4..841a67b30 100644
--- a/ccm-ldn-terms/src/com/arsdigita/london/terms/TermsResources.properties
+++ b/ccm-ldn-terms/src/com/arsdigita/london/terms/TermsResources.properties
@@ -26,3 +26,4 @@ terms.domain.ui.url_hint=The unique URL defining the current version of the doma
terms.domain.ui.description_hint=The long description of the domain
terms.domain.ui.version_hint=The current version number, eg 1.00
terms.domain.ui.released_hint=The release date of the current version
+terms.ui.pick_one=-- pick one --
diff --git a/ccm-ldn-terms/src/com/arsdigita/london/terms/TermsResources_de.properties b/ccm-ldn-terms/src/com/arsdigita/london/terms/TermsResources_de.properties
index 64837c0cb..b4e98469b 100644
--- a/ccm-ldn-terms/src/com/arsdigita/london/terms/TermsResources_de.properties
+++ b/ccm-ldn-terms/src/com/arsdigita/london/terms/TermsResources_de.properties
@@ -26,3 +26,4 @@ terms.domain.ui.url_hint=Eine eindeutige URL, die die aktuelle Version definiert
terms.domain.ui.description_hint=Eine ausf\u00fchrlichere Beschreibung der Domain
terms.domain.ui.version_hint=Die aktuelle Version, z.B. 1.00
terms.domain.ui.released_hint=Das Ver\u00f6ffentlichungsdatum der aktuellen Version.
+terms.ui.pick_one=-- Ausw\u00e4hlen --
diff --git a/ccm-ldn-terms/src/com/arsdigita/london/terms/ui/RootCategoryPicker.java b/ccm-ldn-terms/src/com/arsdigita/london/terms/ui/RootCategoryPicker.java
index b83fe3560..65bf2537d 100755
--- a/ccm-ldn-terms/src/com/arsdigita/london/terms/ui/RootCategoryPicker.java
+++ b/ccm-ldn-terms/src/com/arsdigita/london/terms/ui/RootCategoryPicker.java
@@ -15,7 +15,6 @@
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-
package com.arsdigita.london.terms.ui;
import com.arsdigita.bebop.PageState;
@@ -24,49 +23,52 @@ import com.arsdigita.bebop.form.SingleSelect;
import com.arsdigita.domain.DomainObjectFactory;
import com.arsdigita.london.terms.Domain;
import com.arsdigita.categorization.ui.AbstractCategoryPicker;
+import com.arsdigita.london.terms.util.TermsGlobalizationUtil;
import com.arsdigita.persistence.DataCollection;
import com.arsdigita.persistence.OID;
import com.arsdigita.persistence.SessionManager;
-
-/**
- *
- *
+/**
+ *
+ *
*/
public class RootCategoryPicker extends AbstractCategoryPicker {
-
+
/**
- *
- * @param name
+ *
+ * @param name
*/
public RootCategoryPicker(String name) {
super(name);
}
-
+
/**
- *
+ *
* @param state
- * @param target
+ * @param target
*/
- protected void addOptions( PageState state,
- SingleSelect target) {
+ protected void addOptions(PageState state,
+ SingleSelect target) {
DataCollection domains = SessionManager
- .getSession()
- .retrieve(Domain.BASE_DATA_OBJECT_TYPE);
+ .getSession()
+ .retrieve(Domain.BASE_DATA_OBJECT_TYPE);
domains.addPath("model.id");
domains.addPath("model.objectType");
domains.addOrder("title");
-
- target.addOption(new Option(null, "-- pick one --"));
+
+ target.addOption(new Option(null,
+ (String) TermsGlobalizationUtil.globalize("terms.ui.pick_one")
+ .localize()));
while (domains.next()) {
Domain domain = (Domain) DomainObjectFactory
- .newInstance(domains.getDataObject());
-
+ .newInstance(domains.getDataObject());
+
target.addOption(
- new Option(new OID((String)domains.get("model.objectType"),
+ new Option(new OID((String) domains.get("model.objectType"),
domains.get("model.id")).toString(),
domain.getTitle()));
}
- }
+ }
+
}
diff --git a/ccm-sci-bundle/web/themes/mandalay/user/includes/types/SciProject/SciProjectDescTab.xsl b/ccm-sci-bundle/web/themes/mandalay/user/includes/types/SciProject/SciProjectDescTab.xsl
index 1a318d46f..5ca7bc9be 100644
--- a/ccm-sci-bundle/web/themes/mandalay/user/includes/types/SciProject/SciProjectDescTab.xsl
+++ b/ccm-sci-bundle/web/themes/mandalay/user/includes/types/SciProject/SciProjectDescTab.xsl
@@ -22,156 +22,145 @@
-->
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:bebop="http://www.arsdigita.com/bebop/1.0"
+ xmlns:nav="http://ccm.redhat.com/navigation"
+ xmlns:cms="http://www.arsdigita.com/cms/1.0"
+ xmlns:mandalay="http://mandalay.quasiweb.de"
+ exclude-result-prefixes="xsl bebop cms nav mandalay"
+ version="1.0"
+>
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
-
-
+
+
-
+
diff --git a/ccm-sci-types-department/src/com/arsdigita/cms/contenttypes/ui/SciDepartmentProjectsTab.java b/ccm-sci-types-department/src/com/arsdigita/cms/contenttypes/ui/SciDepartmentProjectsTab.java
index ee11c6080..8133df7ce 100644
--- a/ccm-sci-types-department/src/com/arsdigita/cms/contenttypes/ui/SciDepartmentProjectsTab.java
+++ b/ccm-sci-types-department/src/com/arsdigita/cms/contenttypes/ui/SciDepartmentProjectsTab.java
@@ -130,6 +130,7 @@ public class SciDepartmentProjectsTab implements GenericOrgaUnitTab {
return result;
}
+ @Override
public void generateXml(final GenericOrganizationalUnit orgaunit,
final Element parent,
final PageState state) {
diff --git a/ccm-subsite/src/com/arsdigita/subsite/ui/SiteForm.java b/ccm-subsite/src/com/arsdigita/subsite/ui/SiteForm.java
index fd8127140..17743afb1 100755
--- a/ccm-subsite/src/com/arsdigita/subsite/ui/SiteForm.java
+++ b/ccm-subsite/src/com/arsdigita/subsite/ui/SiteForm.java
@@ -64,17 +64,21 @@ import org.apache.log4j.Logger;
/**
* Class creates the administration input form.
- *
- * Used by ControlCenterPanel to construct the 'create new site' and
- * 'edit existing site' input forms.
+ *
+ * Used by ControlCenterPanel to construct the 'create new site' and 'edit existing site' input
+ * forms.
*/
public class SiteForm extends Form {
- /** A logger instance. */
+ /**
+ * A logger instance.
+ */
private static final Logger s_log = Logger.getLogger(SiteForm.class);
private SiteSelectionModel m_site;
private BigDecimal siteDefaultRootPageID;
- /** Input field subsite title */
+ /**
+ * Input field subsite title
+ */
private TextField m_title;
private TextField m_hostname;
private TextArea m_description;
@@ -84,17 +88,17 @@ public class SiteForm extends Form {
private SingleSelect m_themes;
private SaveCancelSection m_buttons;
private final static String DEFAULT_APP = "DEFAULT_APP";
- private final static String DEFAULT_APP_LABEL = "Site Wide Default ";
+ private final static String DEFAULT_APP_LABEL = "subsite.ui.default_app_label";
private final static String DEFAULT_STYLE = "DEFAULT_STYLE";
- private final static String DEFAULT_STYLE_LABEL = "Site Wide Default ";
+ private final static String DEFAULT_STYLE_LABEL = "subsite.ui.default_style_label";
private final static String OTHER_STYLE = "OTHER_STYLE";
private final static String OTHER_STYLE_LABEL = "Other (type in box below)";
/**
* Constructor create input widgets and adds them to form.
- *
+ *
* @param name
- * @param site
+ * @param site
*/
public SiteForm(String name, SiteSelectionModel site) {
@@ -113,7 +117,7 @@ public class SiteForm extends Form {
m_title.addValidationListener(new NotNullValidationListener());
m_title.setMetaDataAttribute("title", "Title");
m_title.setHint((String) SubsiteGlobalizationUtil.globalize("subsite.ui.title.hint").
- localize());
+ localize());
m_title.setSize(40);
add(new Label(SubsiteGlobalizationUtil.globalize("subsite.ui.title.label")));
add(m_title); // adds title input field to form
@@ -126,7 +130,7 @@ public class SiteForm extends Form {
m_hostname.setMetaDataAttribute("title", "Hostname");
m_hostname.setSize(40);
m_hostname.setHint((String) SubsiteGlobalizationUtil.globalize("subsite.ui.hostname.hint").
- localize());
+ localize());
add(new Label(SubsiteGlobalizationUtil.globalize("subsite.ui.hostname.label")));
add(m_hostname); // adds hostname input field to form
@@ -138,7 +142,7 @@ public class SiteForm extends Form {
m_description.setCols(45);
m_description.setRows(4);
m_description.setHint((String) SubsiteGlobalizationUtil.globalize(
- "subsite.ui.description.hint").localize());
+ "subsite.ui.description.hint").localize());
add(new Label(SubsiteGlobalizationUtil.globalize("subsite.ui.description.label")));
add(m_description); // adds description input field to form
@@ -146,12 +150,12 @@ public class SiteForm extends Form {
/* Setup selection box for subsite start page (front page) Application
* by URL */
m_customFrontpageApp = new SingleSelect(
- new StringParameter("customFrontpageApp"));
+ new StringParameter("customFrontpageApp"));
m_customFrontpageApp.setMetaDataAttribute("title", "Front Page (url)");
// m_customFrontpageApp.setSize(40);
m_customFrontpageApp.setHint((String) SubsiteGlobalizationUtil.globalize(
- "subsite.ui.customfrontpage.hint").
- localize());
+ "subsite.ui.customfrontpage.hint").
+ localize());
try {
m_customFrontpageApp.addPrintListener(new FrontpageAppListener());
} catch (TooManyListenersException ex) {
@@ -165,7 +169,7 @@ public class SiteForm extends Form {
m_themes = new SingleSelect(new StringParameter("selectStyleDir"));
m_themes.setMetaDataAttribute("title", "XSLT Directory");
m_themes.setHint((String) SubsiteGlobalizationUtil.globalize("subsite.ui.theme.hint").
- localize());
+ localize());
try {
m_themes.addPrintListener(new ThemesListener());
} catch (TooManyListenersException ex) {
@@ -180,48 +184,46 @@ public class SiteForm extends Form {
m_styleDir.setMetaDataAttribute("title", "XSLT Directory (Other)");
m_styleDir.setSize(40);
m_styleDir.setHint(
- "Enter the directory for the custom XSLT styles, or leave blank for the default styling.");
+ "Enter the directory for the custom XSLT styles, or leave blank for the default styling.");
add(new Label(SubsiteGlobalizationUtil.globalize("subsite.ui.styledir.label")));
add(m_styleDir); // adds inputfield style dir to form
/* Setup selection box for cagtegory domain */
m_rootCategory = (CategoryPicker) Classes.newInstance(
- Subsite.getConfig().getRootCategoryPicker(),
- new Class[]{String.class},
- new Object[]{"rootCategory"});
+ Subsite.getConfig().getRootCategoryPicker(),
+ new Class[]{String.class},
+ new Object[]{"rootCategory"});
if (m_rootCategory instanceof Widget) {
((Widget) m_rootCategory).setMetaDataAttribute("title", "Root category");
((Widget) m_rootCategory).setHint((String) SubsiteGlobalizationUtil.globalize(
- "subsite.ui.root_category.hint").localize());
+ "subsite.ui.root_category.hint").localize());
}
add(new Label(SubsiteGlobalizationUtil.globalize("subsite.ui.root_category.label")));
add(m_rootCategory); // adds domain category selection box to form
-
m_buttons = new SaveCancelSection();
m_buttons.getSaveButton().setButtonLabel(SubsiteGlobalizationUtil.globalize(
- "subsite.ui.save"));
+ "subsite.ui.save"));
m_buttons.getSaveButton().setHint("Save the details in the form");
m_buttons.getCancelButton().setButtonLabel(SubsiteGlobalizationUtil.globalize(
- "subsite.ui.cancel"));
+ "subsite.ui.cancel"));
m_buttons.getCancelButton().setHint("Abort changes & reset the form");
add(m_buttons);
-
addSubmissionListener(new SiteSubmissionListener());
addProcessListener(new SiteProcessListener());
addInitListener(new SiteInitListener());
addValidationListener(new SiteValidationListener());
}
- /**
- *
+ /**
+ *
*/
private class SiteSubmissionListener implements FormSubmissionListener {
public void submitted(FormSectionEvent e)
- throws FormProcessException {
+ throws FormProcessException {
PageState state = e.getPageState();
if (m_buttons.getCancelButton().isSelected(state)) {
@@ -255,14 +257,14 @@ public class SiteForm extends Form {
if (OTHER_STYLE.equals(themeDir)) {
if (StringUtils.emptyString(styleDir)) {
data.addError(SubsiteGlobalizationUtil.globalize(
- "subsite.ui.other_style_missing",
- new String[]{OTHER_STYLE_LABEL}));
+ "subsite.ui.other_style_missing",
+ new String[]{OTHER_STYLE_LABEL}));
}
} else {
if (!StringUtils.emptyString(styleDir)) {
data.addError(SubsiteGlobalizationUtil.globalize(
- "subsite.ui.other_style_invalid",
- new String[]{OTHER_STYLE_LABEL}));
+ "subsite.ui.other_style_invalid",
+ new String[]{OTHER_STYLE_LABEL}));
}
}
@@ -274,7 +276,7 @@ public class SiteForm extends Form {
String test = testExist.getDefaultDomainClass();
} catch (Exception ex) {
data.addError(SubsiteGlobalizationUtil.globalize(
- "subsite.ui.root_category_missing"));
+ "subsite.ui.root_category_missing"));
}
} // End if (!m_buttons ...)
@@ -282,7 +284,7 @@ public class SiteForm extends Form {
}
- /**
+ /**
* Checks whether hostname is alreafy in use.
*/
private class HostNameValidationListener implements ParameterListener {
@@ -294,7 +296,7 @@ public class SiteForm extends Form {
Site site = m_site.getSelectedSite(e.getPageState());
if (hostname != null && hostname.toString().length() > 0) {
DataCollection sites = SessionManager.getSession()
- .retrieve(Site.BASE_DATA_OBJECT_TYPE);
+ .retrieve(Site.BASE_DATA_OBJECT_TYPE);
sites.addEqualsFilter("lower(" + Site.HOSTNAME + ")",
hostname.toLowerCase());
if (site != null) {
@@ -302,7 +304,7 @@ public class SiteForm extends Form {
}
if (sites.size() > 0) {
data.addError(SubsiteGlobalizationUtil.globalize(
- "subsite.ui.hostname_already_in_use"));
+ "subsite.ui.hostname_already_in_use"));
}
}
@@ -310,20 +312,18 @@ public class SiteForm extends Form {
}
- /**
- * Initializes the form.
- * (when a new input form is requested by user either by editing an
+ /**
+ * Initializes the form. (when a new input form is requested by user either by editing an
* existing subsite or by creating a new one).
*/
private class SiteInitListener implements FormInitListener {
public void init(FormSectionEvent e)
- throws FormProcessException {
+ throws FormProcessException {
PageState state = e.getPageState();
Site site = m_site.getSelectedSite(state);
-
if (site == null) {
m_title.setValue(state, null);
m_hostname.setValue(state, null);
@@ -340,10 +340,10 @@ public class SiteForm extends Form {
// BigDecimal siteDefaultRootPageID
BigDecimal currentFrontpageID = site.getFrontPage().getID();
s_log.debug(" Site default frontpage is: " + siteDefaultRootPageID
- + ", Current frontpage is: " + currentFrontpageID);
+ + ", Current frontpage is: " + currentFrontpageID);
m_customFrontpageApp.setValue(
- state,
- currentFrontpageID == siteDefaultRootPageID ? DEFAULT_APP
+ state,
+ currentFrontpageID == siteDefaultRootPageID ? DEFAULT_APP
: currentFrontpageID.toString());
String styleURL = site.getStyleDirectory();
@@ -376,12 +376,12 @@ public class SiteForm extends Form {
}
/**
- *
+ *
*/
private class SiteProcessListener implements FormProcessListener {
public void process(FormSectionEvent e)
- throws FormProcessException {
+ throws FormProcessException {
PageState state = e.getPageState();
@@ -403,20 +403,20 @@ public class SiteForm extends Form {
/* Pre-process selected frontpage application: retrieve application */
String subsiteSelectedFrontpage = (String) m_customFrontpageApp
- .getValue(state);
+ .getValue(state);
s_log.debug(" Site default frontpage ID is: " + siteDefaultRootPageID
- + ", selected frontpage Value is: "
- + subsiteSelectedFrontpage);
+ + ", selected frontpage Value is: "
+ + subsiteSelectedFrontpage);
Application frontpageApp;
if (subsiteSelectedFrontpage.equals(DEFAULT_APP)) {
s_log.debug("About to create frontpage app ID: " + DEFAULT_APP);
frontpageApp = Application
- .retrieveApplication(siteDefaultRootPageID);
+ .retrieveApplication(siteDefaultRootPageID);
} else {
s_log.debug("About to create frontpage app ID: "
- + subsiteSelectedFrontpage);
+ + subsiteSelectedFrontpage);
frontpageApp = Application
- .retrieveApplication(new BigDecimal(subsiteSelectedFrontpage));
+ .retrieveApplication(new BigDecimal(subsiteSelectedFrontpage));
}
Assert.exists(frontpageApp, Application.class);
s_log.debug("Created frontpage app ID: " + frontpageApp.getID());
@@ -431,7 +431,7 @@ public class SiteForm extends Form {
// subsite with an added comment:
// "NB, explicitly don't set cat on shared front page!"
s_log.debug("Front page application ID: "
- + frontpageApp.getID());
+ + frontpageApp.getID());
s_log.debug("About to set cat on dedicated front page.");
Category.setRootForObject(frontpageApp, root);
@@ -461,7 +461,7 @@ public class SiteForm extends Form {
m_site.clearSelection(state);
Application app = Application
- .retrieveApplicationForPath("/navigation/");
+ .retrieveApplicationForPath("/navigation/");
Category.setRootForObject(app,
root,
site.getTemplateContext().getContext());
@@ -471,7 +471,7 @@ public class SiteForm extends Form {
}
/**
- *
+ *
*/
private class FrontpageAppListener implements PrintListener {
@@ -481,14 +481,16 @@ public class SiteForm extends Form {
ApplicationCollection customApps;
// target.addOption(new Option(SELECT_APP, SELECT_APP_LABEL));
- target.addOption(new Option(DEFAULT_APP, DEFAULT_APP_LABEL));
+ target.addOption(new Option(DEFAULT_APP,
+ (String) SubsiteGlobalizationUtil
+ .globalize(DEFAULT_APP_LABEL).localize()));
String[] customAppTypes = (String[]) Subsite.getConfig()
- .getFrontPageApplicationTypes();
+ .getFrontPageApplicationTypes();
if (customAppTypes != null) {
for (int i = 0; i < customAppTypes.length; i++) {
customApps = Application.retrieveAllApplications(
- customAppTypes[i]);
+ customAppTypes[i]);
while (customApps.next()) {
/* Create an entry for each application, consisting
* of the (BigDecimal) ID as value and the URL as
@@ -507,7 +509,7 @@ public class SiteForm extends Form {
}
/**
- *
+ *
*/
private class ThemesListener implements PrintListener {
@@ -516,7 +518,9 @@ public class SiteForm extends Form {
PageState state = e.getPageState();
Map themes = Subsite.getConfig().getThemes();
Set entrySet = themes.entrySet();
- target.addOption(new Option(DEFAULT_STYLE, DEFAULT_STYLE_LABEL));
+ target.addOption(new Option(DEFAULT_STYLE,
+ (String) SubsiteGlobalizationUtil.globalize(
+ DEFAULT_STYLE_LABEL).localize()));
if (entrySet != null) {
Iterator entries = entrySet.iterator();
while (entries.hasNext()) {
@@ -530,4 +534,5 @@ public class SiteForm extends Form {
}
}
+
}
diff --git a/ccm-subsite/src/com/arsdigita/subsite/ui/SubsiteResources.properties b/ccm-subsite/src/com/arsdigita/subsite/ui/SubsiteResources.properties
index 848822168..00bc3456c 100644
--- a/ccm-subsite/src/com/arsdigita/subsite/ui/SubsiteResources.properties
+++ b/ccm-subsite/src/com/arsdigita/subsite/ui/SubsiteResources.properties
@@ -25,3 +25,5 @@ subsite.ui.edit=Edit
subsite.ui.delete=Delete
subsite.ui.delete.confirm=Are you sure to delete the subsite {0}?
subsite.ui.no_subsites=No subites defined
+subsite.ui.default_app_label=Site Wide Default
+subsite.ui.default_style_label=Site Wide Default
diff --git a/ccm-subsite/src/com/arsdigita/subsite/ui/SubsiteResources_de.properties b/ccm-subsite/src/com/arsdigita/subsite/ui/SubsiteResources_de.properties
index c03bcff78..983c91b3b 100644
--- a/ccm-subsite/src/com/arsdigita/subsite/ui/SubsiteResources_de.properties
+++ b/ccm-subsite/src/com/arsdigita/subsite/ui/SubsiteResources_de.properties
@@ -25,3 +25,5 @@ subsite.ui.edit=Bearbeiten
subsite.ui.delete=L\u00f6schen
subsite.ui.delete.confirm=Sind Sie sicher, dass Sie die Subsite {0} l\u00f6schen wollen?
subsite.ui.no_subsites=Es sind keine Subsites eingerichtet.
+subsite.ui.default_app_label=Standard f\u00fcr diese Installation
+subsite.ui.default_style_label=Standard f\u00fcr diese Installation