From 18be8f11c612399af91e7dcfc954a76e03c916ce Mon Sep 17 00:00:00 2001 From: jensp Date: Tue, 20 May 2014 09:56:53 +0000 Subject: [PATCH] - Refactored the FolderManipulator, removing potential NPE etc. - Texts in the select boxes of the subsite admin form are now localised (Ticket #2032). git-svn-id: https://svn.libreccm.org/ccm/trunk@2636 8810af33-2d31-482b-a856-94f89814c4df --- .../cms/ui/ItemSearchFolderBrowser.java | 9 +- .../ui/folder/CMSFolderResources.properties | 16 +- .../folder/CMSFolderResources_de.properties | 16 +- .../folder/CMSFolderResources_fr.properties | 14 +- .../cms/ui/folder/FolderBrowser.java | 123 +- .../cms/ui/folder/FolderManipulator.java | 1094 +++++++++++------ .../cms/ui/lifecycle/PublishLock.java | 14 +- .../arsdigita/toolbox/GlobalisationUtil.java | 76 ++ .../london/terms/TermsResources.properties | 1 + .../london/terms/TermsResources_de.properties | 1 + .../london/terms/ui/RootCategoryPicker.java | 44 +- .../types/SciProject/SciProjectDescTab.xsl | 265 ++-- .../ui/SciDepartmentProjectsTab.java | 1 + .../com/arsdigita/subsite/ui/SiteForm.java | 125 +- .../subsite/ui/SubsiteResources.properties | 2 + .../subsite/ui/SubsiteResources_de.properties | 2 + 16 files changed, 1130 insertions(+), 673 deletions(-) create mode 100644 ccm-core/src/com/arsdigita/toolbox/GlobalisationUtil.java 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