- Neue Version des DaBIn-Importers:

- Autoren werden jetzt in der für Publikationen vorgesehen Contentsection angelegt
  - Import der Verlage hoffentlich korrigiert
- A to Z Leiste für Folder im Content-Center. Wird derzeit immer angezeigt, Ausblenden bei unterschreiten einer bestimmten Anzahl von Items funktioniert noch 
  nicht und wahrscheinlich auch nicht ohne größere Umbauten an FolderManipulator und FolderBrowser möglich.
- Abstract bei den Publikationen wird jetzt im Propertysheet mit Zeilenumbrüchen etc. (wie im TextArea eingegeben) angezeigt.


git-svn-id: https://svn.libreccm.org/ccm/trunk@827 8810af33-2d31-482b-a856-94f89814c4df
master
jensp 2011-04-04 17:24:41 +00:00
parent 2279dd49b5
commit 401bb5670c
10 changed files with 694 additions and 482 deletions

View File

@ -112,16 +112,16 @@ public class DaBInImporter extends Program {
private Folder personsRootFolder;
private Folder projectsRootFolder;
private Folder publicationsRootFolder;
private Folder authors;
private Folder contacts;
private Folder authors;
private Folder contacts;
private Folder departments;
private Folder members;
private Folder members;
private Folder organization;
private Folder persons;
private Folder projects;
private Folder publications;
private Folder publishers;
private Folder files;
private Folder persons;
private Folder projects;
private Folder publications;
private Folder publishers;
private Folder files;
private Map<String, ContentBundle> departmentsMap;
private Map<String, ContentBundle> personsMap;
private Map<String, ContentBundle> projectsMap;
@ -135,7 +135,7 @@ public class DaBInImporter extends Program {
private Address officeAddress;
private Domain termsDomain;
private Term publicationsTerm;
private Term workingPapersTerm;
private Term workingPapersTerm;
private Term currentProjectsTerm;
private Term finishedProjectsTerm;
@ -147,13 +147,13 @@ public class DaBInImporter extends Program {
super("DaBInImporter",
"0.1.0",
"configFile",
startup);
startup);
departmentsMap = new HashMap<String, ContentBundle>();
personsMap = new HashMap<String, ContentBundle>();
projectsMap = new HashMap<String, ContentBundle>();
publishersMap = new HashMap<PublisherData, ContentBundle>();
publicationMap = new HashMap<String, ContentBundle>();
workingPaperMap = new HashMap<String, ContentBundle>();
workingPaperMap = new HashMap<String, ContentBundle>();
}
@Override
@ -259,19 +259,19 @@ public class DaBInImporter extends Program {
projectsRootFolder = projectsSection.getRootFolder();
publicationsRootFolder = publicationsSection.getRootFolder();
authors = createFolder(personsRootFolder, "autoren", "Autoren");
authors = createFolder(personsRootFolder, "autoren", "Autoren");
contacts = createFolder(personsRootFolder, "kontaktdaten",
"Kontaktdaten");
"Kontaktdaten");
departments = createFolder(root, "abteilungen", "Abteilungen");
members = createFolder(personsRootFolder, "mitglieder", "Mitglieder");
members = createFolder(personsRootFolder, "mitglieder", "Mitglieder");
organization = createFolder(root, "organisationen", "Organisation(en)");
persons = createFolder(personsRootFolder, "personen", "Personen");
projects = createFolder(projectsRootFolder, "projekte", "Projekte");
publishers = createFolder(publicationsRootFolder, "verlage", "Verlage");
@ -293,13 +293,13 @@ public class DaBInImporter extends Program {
System.out.println("Terms for publications...");
String publicationsTermPath = (String) config.get(
"terms.publications");
publicationsTerm = checkTermPath(publicationsTermPath);
publicationsTerm = checkTermPath(publicationsTermPath);
System.out.println("Terms for working papers...");
String workingPapersTermPath =
(String) config.get("terms.workingpapers");
workingPapersTerm = checkTermPath(workingPapersTermPath);
System.out.println("Term for current projects...");
String currentProjectsTermPath = (String) config.get(
"terms.projects.current");
@ -1135,7 +1135,11 @@ public class DaBInImporter extends Program {
System.out.printf("%4d of %4d: %s...\n", counter, number, result.
getString("name"));
PublicationData data = new PublicationData();
data.setType(PublicationType.ARTICLE_IN_COLLECTED_VOLUME);
//All publications of the DaBIn type "Artikel/Aufsatz" are now
//imported as ArticleInJournal since ArticleInJournal and ArticleInCollectedVolume
//can't be seperated from the information in DaBIn
//data.setType(PublicationType.ARTICLE_IN_COLLECTED_VOLUME);
data.setType(PublicationType.ARTICLE_IN_JOURNAL);
data.setPublicationDaBInId(result.getString("Publikation_Id"));
data.setName(result.getString("Name"));
data.setVerlag(result.getString("Verlag"));
@ -1493,8 +1497,13 @@ public class DaBInImporter extends Program {
personDe.setTitlePre(personData.getTitlePre());
personDe.setDescription(String.format("DaBInId={%s}",
personData.getDabinId()));
personDe.setContentSection(section);
personDe.setLifecycle(createLifecycle(personsLifecycle));
if (type == PersonType.AUTHOR) {
personDe.setContentSection(publicationsSection);
personDe.setLifecycle(createLifecycle(publicationsLifecycle));
} else {
personDe.setContentSection(personsSection);
personDe.setLifecycle(createLifecycle(personsLifecycle));
}
personDe.save();
personDe.setLanguage("de");
@ -1503,8 +1512,13 @@ public class DaBInImporter extends Program {
personEn.setGivenName(personData.getGivenname());
personEn.setDescription(String.format("DaBInId={%s}",
personData.getDabinId()));
personEn.setContentSection(section);
personEn.setLifecycle(createLifecycle(personsLifecycle));
if (type == PersonType.AUTHOR) {
personEn.setContentSection(publicationsSection);
personEn.setLifecycle(createLifecycle(publicationsLifecycle));
} else {
personEn.setContentSection(personsSection);
personEn.setLifecycle(createLifecycle(personsLifecycle));
}
personEn.save();
personEn.setLanguage("en");
@ -1518,9 +1532,9 @@ public class DaBInImporter extends Program {
personDe.setContentSection(section);
personEn.setContentSection(section);
Folder folder = null;
switch(type) {
switch (type) {
case MEMBER:
folder = members;
break;
@ -1638,7 +1652,7 @@ public class DaBInImporter extends Program {
contactBundle.addInstance(contactEn);
contactBundle.setContentSection(personsSection);
contacts.addItem(contactBundle);
contactDe.setContentSection(personsSection);
contactEn.setContentSection(personsSection);
@ -1682,7 +1696,7 @@ public class DaBInImporter extends Program {
System.out.printf("\tde: %s...", departmentData.getNameDe());
departmentDe = new SciDepartment();
departmentDe.setTitle(departmentData.getNameDe());
departmentDe.setTitle(departmentData.getNameDe());
departmentDe.setName(DaBInImporter.normalizeString(departmentData.
getNameDe()));
departmentDe.setLanguage("de");
@ -1694,7 +1708,7 @@ public class DaBInImporter extends Program {
System.out.printf("\ten: %s...",
departmentData.getNameEn());
departmentEn = new SciDepartment();
departmentEn.setTitle(departmentData.getNameEn());
departmentEn.setTitle(departmentData.getNameEn());
departmentEn.setName(DaBInImporter.normalizeString(departmentData.
getNameDe()));
departmentEn.setLanguage("en");
@ -1793,7 +1807,7 @@ public class DaBInImporter extends Program {
if ((projectData.getNameDe() != null)
&& (projectData.getNameDe().length() > 0)) {
projectDe = new SciProject();
projectDe.setTitle(projectData.getNameDe());
projectDe.setTitle(projectData.getNameDe());
String projectName = DaBInImporter.normalizeString(projectData.
getNameDe());
if (projectName.length() > 200) {
@ -1955,7 +1969,7 @@ public class DaBInImporter extends Program {
System.out.println("OK");
i++;
}
projects.addItem(project);
//Assign to term/category
@ -2514,7 +2528,7 @@ public class DaBInImporter extends Program {
pubLink.save();
}
}
publications.addItem(publication);
if (publicationData.getVisiblity()
== PublicationVisibility.GLOBAL) {
@ -2631,10 +2645,10 @@ public class DaBInImporter extends Program {
workingPaperEn.setContentSection(publicationsSection);
}
workingPaperMap.put(workingPaperData.getDabinId(), workingPaper);
workingPaperMap.put(workingPaperData.getDabinId(), workingPaper);
publications.addItem(workingPaper);
WorkingPaper primary = (WorkingPaper) workingPaper.
getPrimaryInstance();
getPrimaryInstance();
Term term = workingPapersTerm;//s.get(yearStr);
term = termsDomain.getTerm(term.getUniqueID());
System.out.printf("\tAdding project to term '%s:%s'...\n", term.
@ -2729,7 +2743,7 @@ public class DaBInImporter extends Program {
download.setTargetType(Link.INTERNAL_LINK);
download.setTargetItem(fsi);
download.setLinkOwner(workingPaperEn);
files.addItem(bundle);
}
} catch (IOException ex) {
@ -2856,9 +2870,19 @@ public class DaBInImporter extends Program {
System.out.printf("\tde: %s, %s...", publisherData.getName(), publisherData.
getPlace());
publisherDe = new Publisher();
publisherDe.setTitle(publisherData.getName());
publisherDe.setName(DaBInImporter.normalizeString(publisherData.
getName()));
if ((publisherData.getPlace() == null) || publisherData.getPlace().
isEmpty()) {
publisherDe.setTitle(publisherData.getName());
publisherDe.setName(DaBInImporter.normalizeString(publisherData.
getName()));
} else {
publisherDe.setTitle(String.format("%s, %s", publisherData.
getName(), publisherData.getPlace()));
publisherDe.setName(DaBInImporter.normalizeString(String.
format(
"%s, %s", publisherData.getName(), publisherData.
getPlace())));
}
publisherDe.setPlace(publisherData.getPlace());
publisherDe.setLanguage("de");
publisherDe.setLifecycle(createLifecycle(publicationsLifecycle));
@ -2869,9 +2893,19 @@ public class DaBInImporter extends Program {
System.out.printf("\tEn: %s, %s...", publisherData.getName(), publisherData.
getPlace());
publisherEn = new Publisher();
publisherEn.setTitle(publisherData.getName());
publisherEn.setName(DaBInImporter.normalizeString(publisherData.
getName()));
if ((publisherData.getPlace() == null) || publisherData.getPlace().
isEmpty()) {
publisherEn.setTitle(publisherData.getName());
publisherEn.setName(DaBInImporter.normalizeString(publisherData.
getName()));
} else {
publisherEn.setTitle(String.format("%s, %s", publisherData.
getName(), publisherData.getPlace()));
publisherEn.setName(DaBInImporter.normalizeString(String.
format(
"%s, %s", publisherData.getName(), publisherData.
getPlace())));
}
publisherEn.setPlace(publisherData.getPlace());
publisherEn.setLanguage("en");
publisherEn.setLifecycle(createLifecycle(publicationsLifecycle));
@ -2887,8 +2921,11 @@ public class DaBInImporter extends Program {
publisherDe.setContentSection(publicationsSection);
publisherEn.setContentSection(publicationsSection);
publishers.addItem(publisher);
System.out.printf(
"Putting publisher into publishers map. HashCode: %d",
publisherData.hashCode());
publishersMap.put(publisherData, publisher);
System.out.println("OK");
}
@ -2975,7 +3012,12 @@ public class DaBInImporter extends Program {
int colonIndex = normalizedData.indexOf(':');
if (colonIndex < 0) {
publisher.setName(normalizedData);/*.replace(",", "").
while ((normalizedData.length() > 1)
&& !Character.isLetter(normalizedData.charAt(0))) {
normalizedData = normalizedData.substring(1);
}
publisher.setName(normalizedData.trim());/*.replace(",", "").
replace("/", "").
replaceAll("\\s\\s+", " ").
replace(' ', '-').toLowerCase());*/
@ -3015,11 +3057,19 @@ public class DaBInImporter extends Program {
System.out.printf("\tprevDelimIndex = %d\n", prevDelimIndex);
place = normalizedData.substring(prevDelimIndex, colonIndex);
publisher.setName(name.trim().
replace(",", "").
replace("/", "").
replaceAll("\\s\\s+", " ").
replace(' ', '-').toLowerCase());
while ((name.length() > 1)
&& !Character.isLetter(name.charAt(0))) {
name = name.substring(1);
}
publisher.setName(name.trim());//.
//replace(",", "").
//replace("/", "").
//replaceAll("\\s\\s+", " ").
//replace(' ', '-').toLowerCase());
while ((place.length() > 1)
&& !Character.isLetter(place.charAt(0))) {
place = place.substring(1);
}
publisher.setPlace(place.trim());
}
@ -3111,7 +3161,7 @@ public class DaBInImporter extends Program {
publicationData.setPagesFrom(pagesFrom);
publicationData.setPagesTo(pagesTo);
}
private Term checkTermPath(final String path) {
StringTokenizer pathTokenizer = new StringTokenizer(path, "/");
@ -3147,7 +3197,7 @@ public class DaBInImporter extends Program {
return term;
}
private void createTerm(final String uniqueId,
final String name,
final Domain domain,
@ -3191,7 +3241,7 @@ public class DaBInImporter extends Program {
"Ä", "Ae").replace("Ü", "Ue").replace("Ö", "Oe").replace("ß",
"ss").
replace(" ", "-").
replaceAll("[^a-zA-Z0-9\\-]", "").toLowerCase();
replaceAll("[^a-zA-Z0-9\\-]", "").toLowerCase().trim();
}
public static void main(String[] args) {

View File

@ -67,3 +67,4 @@ cms.ui.folder.item_already_exists=There is already an item in the target folder
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.no_such_item=Item ID supplied does not match an existing Content Item.
cms.ui.folder.filter.all=All

View File

@ -2,7 +2,7 @@ COMMENT.00=BUTTONS/LINKS/LABELS
cms.ui.folder.save=Speichern
cms.ui.folder.cancel=Abbrechen
cms.ui.folder.edit=Editieren
cms.ui.folder.delete=L\u00F6schen
cms.ui.folder.delete=L\u00f6schen
cms.ui.folder.move=Verschieben
cms.ui.folder.copy=Kopieren
cms.ui.folder.go=Los
@ -16,22 +16,22 @@ cms.ui.folder.unlock=Entsperren
cms.ui.folder.external_lock=Externe Sperrung
cms.ui.folder.left=Links
cms.ui.folder.right=Rechts
cms.ui.folder.items=Eintrag/Eintr\u00E4ge
cms.ui.folder.items=Eintrag/Eintr\u00e4ge
cms.ui.folder.from=von
cms.ui.folder.to=an
cms.ui.folder.no_items=Keine Eintr\u00E4ge
cms.ui.folder.no_items=Keine Eintr\u00e4ge
cms.ui.folder.no_image=Kein Bild
cms.ui.folder.hide_metadata=Metadaten verbergen
cms.ui.folder.show_metadata=Zeige die Metadaten
cms.ui.folder.edit_subject_classes=Themenklassen editieren
cms.ui.folder.add_paragraph=Abschnitt hinzuf\u00FCgen
cms.ui.folder.add_paragraph=Abschnitt hinzuf\u00fcgen
cms.ui.folder.edit_in_applet=In EoPro editieren
cms.ui.folder.edit_in_browser=Im Browser editieren
cms.ui.folder.edit_current_folder=Bearbeiten des aktuellen Verzeichnisses
cms.ui.folder.preview_current_folder=Vorschau des aktuellen Verzeichnisses
cms.ui.folder.contents_for=Inhalt für
cms.ui.folder.choose_target_folder=Zielverzeichnis auswählen
cms.ui.folder.contents_for=Inhalt f\u00fcr
cms.ui.folder.choose_target_folder=Zielverzeichnis ausw\u00e4hlen
cms.ui.foldr.new_wcms_doc=Neue WCMS Documente
COMMENT.05=INPUTS
@ -40,26 +40,27 @@ cms.ui.folder.right=Rechts
COMMENT.10=FOLDER METADATA
cms.ui.folder.headline=Titelzeile
cms.ui.folder.heading=\u00DCberschrift
cms.ui.folder.heading=\u00dcberschrift
cms.ui.folder.body=Hauptbereich
cms.ui.folder.add_image=Bild hinzuf\u00FCgen
cms.ui.folder.add_image=Bild hinzuf\u00fcgen
cms.ui.folder.replace_image=Ersetze dieses Bild
cms.ui.folder.align=Ausrichten
cms.ui.folder.add_download=Download hinzuf\u00FCgen
cms.ui.folder.add_download=Download hinzuf\u00fcgen
cms.ui.folder.alt=Alt
cms.ui.folder.caption=\u00DCberschrift
cms.ui.folder.caption=\u00dcberschrift
COMMENT.20=ERROR MESSAGES
cms.ui.folder.column_index_not_in_table_model=Spaltenindex befindet sich nicht im Datenbankmodell:
cms.ui.folder.cannot_find_root_folder=Oberster Ordner kann nicht gefunden werden.
cms.ui.folder.must_select_item=Es mu\u00DF mindestens ein Eintrag zum Verschieben/Kopieren ausgew\u00E4hlt werden
cms.ui.folder.no_source_items_specified=Es wurden keine Ursprungseintr\u00E4ge gew\u00E4hlt
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.must_select_item=Es mu\u00df mindestens ein Eintrag zum Verschieben/Kopieren ausgew\u00e4hlt werden
cms.ui.folder.no_source_items_specified=Es wurden keine Ursprungseintr\u00e4ge gew\u00e4hlt
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.no_such_item=Die verwendete Eintrags-ID pa\u00DFt zu keinem Eintrag.
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.no_such_item=Die verwendete Eintrags-ID pa\u00dft zu keinem Eintrag.
cms.ui.folder.remove_asset_link=Entfernen
cms.ui.folder.filter.all=Alle

View File

@ -3,7 +3,7 @@ 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éplacer
cms.ui.folder.move=D\u00e9placer
cms.ui.folder.copy=Copier
cms.ui.folder.go=Go
cms.ui.folder.name=Nom
@ -11,26 +11,26 @@ cms.ui.folder.type=Type
cms.ui.folder.action=Action
cms.ui.folder.title=Titre
cms.ui.folder.index=Index
cms.ui.folder.preview=Pré-visualisation
cms.ui.folder.preview=Pr\u00e9-visualisation
cms.ui.folder.lock=Verrouiller
cms.ui.folder.unlock=Dé-vérrouiller
cms.ui.folder.unlock=D\u00e9-v\u00e9rrouiller
cms.ui.folder.external_lock=Verrou externe
cms.ui.folder.left=Gauche
cms.ui.folder.right=Droite
cms.ui.folder.items=élément(s)
cms.ui.folder.items=\u00e9l\u00e9ment(s)
cms.ui.folder.from=de
cms.ui.folder.to=à
cms.ui.folder.no_items=Pas d'éléments
cms.ui.folder.to=\u00e0
cms.ui.folder.no_items=Pas d'\u00e9l\u00e9ments
cms.ui.folder.no_image=Pas d'image
cms.ui.folder.hide_metadata=Cacher les méta-données
cms.ui.folder.show_metadata=Montrer les méta-données
cms.ui.folder.hide_metadata=Cacher les m\u00e9ta-donn\u00e9es
cms.ui.folder.show_metadata=Montrer les m\u00e9ta-donn\u00e9es
cms.ui.folder.edit_subject_classes=Modifier les classes objet
cms.ui.folder.add_paragraph=Ajouter un paragraphe
cms.ui.folder.edit_in_applet=Modifier dans EoPro
cms.ui.folder.edit_in_browser=Modifier dans un navigateur
cms.ui.folder.edit_current_folder=Modifier le dossier courant
cms.ui.folder.preview_current_folder=Pré-visualiser le dossier courant
cms.ui.folder.preview_current_folder=Pr\u00e9-visualiser le dossier courant
cms.ui.folder.contents_for=Contenu&nbsp;de&nbsp;
cms.ui.folder.choose_target_folder=Choisir le dossier de destination
cms.ui.foldr.new_wcms_doc=Nouveau document WCMS
@ -41,26 +41,27 @@ cms.ui.folder.right=Droite
COMMENT.10=DOSSIER DES META DONNEES
cms.ui.folder.headline=Entête
cms.ui.folder.headline=Ent\u00eate
cms.ui.folder.heading=Chapeau
cms.ui.folder.body=Corps
cms.ui.folder.add_image=Ajouter une image
cms.ui.folder.replace_image=Remplacer cette image
cms.ui.folder.align=Aligner
cms.ui.folder.add_download=Ajouter un téléchargement
cms.ui.folder.add_download=Ajouter un t\u00e9l\u00e9chargement
cms.ui.folder.alt=Alt
cms.ui.folder.caption=Légende
cms.ui.folder.caption=L\u00e9gende
cms.ui.folder.remove_asset_link=Retirer
COMMENT.20=MESSAGES D'ERREURS
cms.ui.folder.column_index_not_in_table_model=Index de la colonne absent du modèle de table:
cms.ui.folder.column_index_not_in_table_model=Index de la colonne absent du mod\u00e8le de table:
cms.ui.folder.cannot_find_root_folder=Impossible de trouver le dossier racine.
cms.ui.folder.must_select_item=Vous devez sélectionner au moins élément pour le déplacer ou le copier
cms.ui.folder.no_source_items_specified=Pas d'élément source spécifié.
cms.ui.folder.need_select_target_folder=Vous devez sélectionner un dossier dans lequel les éléments seront déplacés ou copiés.
cms.ui.folder.not_within_same_folder=Impossible de déplacer ou de copier des éléments à l'intérieur d'un même dossier.
cms.ui.folder.no_permission=Vous n'avez pas l'autorisation de créer, de copier, ou de déplacer des éléments.
cms.ui.folder.item_already_exists=Il y a déjà un élément dans le dossier destination appelé:
cms.ui.folder.item_is_live=est en ligne ; Vous devez le dé-publier avant de le déplacer.
cms.ui.folder.no_permission_for_item=Vous n'avez pas l'autorisation de supprimer ou de déplacer
cms.ui.folder.no_such_item=L'identifiant fourni pour l'élément ne correspond pas à un contenu existant.
cms.ui.folder.must_select_item=Vous devez s\u00e9lectionner au moins \u00e9l\u00e9ment pour le d\u00e9placer ou le copier
cms.ui.folder.no_source_items_specified=Pas d'\u00e9l\u00e9ment source sp\u00e9cifi\u00e9.
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.no_such_item=L'identifiant fourni pour l'\u00e9l\u00e9ment ne correspond pas \u00e0 un contenu existant.
cms.ui.folder.filter.all=

View File

@ -79,51 +79,50 @@ import javax.servlet.ServletException;
* @version $Id: FolderBrowser.java 2017 2009-10-04 09:03:45Z pboy $
*/
public class FolderBrowser extends Table {
private static final Logger s_log = Logger.getLogger(FolderBrowser.class);
private static GlobalizedMessage[] s_headers = {
globalize("cms.ui.folder.name"), globalize("cms.ui.folder.title"),
globalize("cms.ui.folder.type"), globalize("cms.ui.folder.creation_date"),
globalize("cms.ui.folder.last_modified"), globalize("cms.ui.folder.action"),
globalize("cms.ui.folder.index") };
globalize("cms.ui.folder.type"),
globalize("cms.ui.folder.creation_date"),
globalize("cms.ui.folder.last_modified"), globalize(
"cms.ui.folder.action"),
globalize("cms.ui.folder.index")};
private static GlobalizedMessage[] s_noIndexHeaders = {
globalize("cms.ui.folder.name"), globalize("cms.ui.folder.title"),
globalize("cms.ui.folder.type"), globalize("cms.ui.folder.creation_date"),
globalize("cms.ui.folder.last_modified"), globalize("cms.ui.folder.action") };
globalize("cms.ui.folder.type"),
globalize("cms.ui.folder.creation_date"),
globalize("cms.ui.folder.last_modified"), globalize(
"cms.ui.folder.action")};
private static final String SORT_ACTION_UP = "sortActionUp";
private static final String SORT_ACTION_DOWN = "sortActionDown";
private FolderSelectionModel m_currentFolder;
private TableActionListener m_folderChanger;
private TableActionListener m_deleter;
private TableActionListener m_indexChanger;
private TableColumn m_nameColumn;
private TableColumn m_deleteColumn;
private TableColumn m_indexColumn;
private final static String SORT_KEY_NAME = "name";
private final static String SORT_KEY_TITLE = "title";
private final static String SORT_KEY_LAST_MODIFIED_DATE = "lastModified";
private final static String SORT_KEY_CREATION_DATE = "creationDate";
private StringParameter m_sortType = new StringParameter("sortType");
private StringParameter m_sortDirection = new StringParameter("sortDirn");
private StringParameter m_filter = null;
private FolderManipulator.FilterForm m_filterForm;
private long m_folderSize;
public FolderBrowser(FolderSelectionModel currentFolder) {
//super(new FolderTableModelBuilder(), s_headers);
super();
m_sortType.setDefaultValue(SORT_KEY_NAME);
m_sortDirection.setDefaultValue(SORT_ACTION_UP);
setModelBuilder(new FolderTableModelBuilder(currentFolder));
setColumnModel(new DefaultTableColumnModel(hideIndexColumn() ? s_noIndexHeaders : s_headers));
setColumnModel(new DefaultTableColumnModel(hideIndexColumn()
? 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
@ -134,38 +133,41 @@ public class FolderBrowser extends Table {
// so we break the model builder construction up into two parts,
// and pull the foldertablemodelbuilder back with the super class'
// accessor.
((FolderTableModelBuilder)getModelBuilder()).setFolderBrowser(this);
((FolderTableModelBuilder) getModelBuilder()).setFolderBrowser(this);
m_currentFolder = currentFolder;
/*
This code should be uncommented if the desired behaviour is for a change
of folder to cause reversion to default ordering of contained items
(by name ascending). Our feeling is that the user selected ordering
should be retained for the duration of the folder browsing session. If
anyone wants this alternative behaviour it should be brought in under
the control of a config parameter.
m_currentFolder.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
PageState state = e.getPageState();
state.setValue(m_sortType, m_sortType.getDefaultValue());
state.setValue(m_sortDirection, m_sortDirection.getDefaultValue());
}});
public void stateChanged(ChangeEvent e) {
PageState state = e.getPageState();
state.setValue(m_sortType, m_sortType.getDefaultValue());
state.setValue(m_sortDirection, m_sortDirection.getDefaultValue());
}});
*/
setClassAttr("dataTable");
getHeader().setDefaultRenderer(new com.arsdigita.cms.ui.util.DefaultTableCellRenderer());
getHeader().setDefaultRenderer(
new com.arsdigita.cms.ui.util.DefaultTableCellRenderer());
m_nameColumn = getColumn(0);
m_nameColumn.setCellRenderer(new NameCellRenderer());
m_nameColumn.setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_NAME));
getColumn(1).setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_TITLE));
getColumn(3).setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_CREATION_DATE));
getColumn(4).setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_LAST_MODIFIED_DATE));
getColumn(3).setHeaderRenderer(new HeaderCellRenderer(
SORT_KEY_CREATION_DATE));
getColumn(4).setHeaderRenderer(new HeaderCellRenderer(
SORT_KEY_LAST_MODIFIED_DATE));
m_deleteColumn = getColumn(5);
m_deleteColumn.setCellRenderer(new ActionCellRenderer());
m_deleteColumn.setAlign("center");
@ -173,59 +175,60 @@ public class FolderBrowser extends Table {
m_indexColumn = getColumn(6);
m_indexColumn.setCellRenderer(new IndexToggleRenderer());
m_indexColumn.setAlign("center");
m_indexChanger = new IndexChanger(m_currentFolder);
addTableActionListener(m_indexChanger);
}
m_folderChanger = new FolderChanger();
addTableActionListener(m_folderChanger);
m_deleter = new ItemDeleter();
addTableActionListener(m_deleter);
setEmptyView(new Label(globalize("cms.ui.folder.no_items")));
Assert.exists( m_currentFolder.getStateParameter() );
Assert.exists(m_currentFolder.getStateParameter());
}
@Override
public void register(Page p) {
super.register(p);
p.addComponentStateParam(this, m_currentFolder.getStateParameter());
p.addComponentStateParam(this, m_sortType);
p.addComponentStateParam(this, m_sortDirection);
p.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
final PageState state = e.getPageState();
if (state.isVisibleOnPage(FolderBrowser.this)) {
showHideFolderActions(state);
}
}
});
}
private void showHideFolderActions(PageState state) {
SecurityManager sm = Utilities.getSecurityManager(state);
Folder folder = (Folder) m_currentFolder.getSelectedObject(state);
Assert.exists(folder);
boolean canDelete =
sm.canAccess(state.getRequest(), SecurityManager.DELETE_ITEM, folder);
sm.canAccess(state.getRequest(), SecurityManager.DELETE_ITEM,
folder);
m_deleteColumn.setVisible(state, canDelete);
}
@Override
public void respond(PageState state) throws ServletException {
String key = state.getControlEventName();
String value = state.getControlEventValue();
if ( SORT_ACTION_UP.equals(key) ) {
if (SORT_ACTION_UP.equals(key)) {
state.setValue(m_sortType, value);
state.setValue(m_sortDirection, SORT_ACTION_UP);
} else if ( SORT_ACTION_DOWN.equals(key) ) {
} else if (SORT_ACTION_DOWN.equals(key)) {
state.setValue(m_sortType, value);
state.setValue(m_sortDirection, SORT_ACTION_DOWN);
} else {
@ -233,101 +236,141 @@ public class FolderBrowser extends Table {
//throw new ServletException("Unknown control event: " + key);
}
}
public FolderSelectionModel getFolderSelectionModel() {
return m_currentFolder;
}
protected void setFilterForm(FolderManipulator.FilterForm filterForm) {
m_filterForm = filterForm;
}
protected void setFilterParameter(StringParameter filter) {
m_filter = filter;
}
protected long getFolderSize() {
return m_folderSize;
}
private class FolderTableModelBuilder
extends AbstractTableModelBuilder implements PaginationModelBuilder {
private FolderSelectionModel m_folder;
private RequestLocal m_size;
private RequestLocal m_itemColl;
private FolderBrowser m_fb;
public FolderTableModelBuilder(FolderSelectionModel sel) {
this(sel, null);
}
public FolderTableModelBuilder(FolderSelectionModel sel, FolderBrowser fb) {
public FolderTableModelBuilder(FolderSelectionModel sel,
FolderBrowser fb) {
super();
m_folder = sel;
m_size = new RequestLocal();
m_itemColl = new RequestLocal();
m_fb = fb;
}
public TableModel makeModel(Table t, PageState s) {
FolderSelectionModel sel = ((FolderBrowser) t).getFolderSelectionModel();
FolderSelectionModel sel = ((FolderBrowser) t).
getFolderSelectionModel();
Folder f = (Folder) sel.getSelectedObject(s);
if ( f == null ) {
if (f == null) {
return Table.EMPTY_MODEL;
} else {
t.getRowSelectionModel().clearSelection(s);
return new FolderTableModel
((FolderBrowser) t, s, (Folder.ItemCollection) m_itemColl.get(s));
s_log.debug(String.format("filter = '%s'", s.getValue(m_filter)));
Folder.ItemCollection itemColl = (Folder.ItemCollection) m_itemColl.
get(s);
s_log.debug(String.format("itemColl.size = %d", itemColl.size()));
/*if (itemColl.size() < 20) {
s_log.debug("Setting filter invisible.");
m_filterForm.setVisible(s, false);
} else {
s_log.debug("Setting filter visible.");
m_filterForm.setVisible(s, true);
}*/
m_folderSize = itemColl.size();
if (s.getValue(m_filter) != null) {
itemColl.addFilter(String.format(
"lower(name) like lower('%s%%') or lower(displayName) like lower('%s%%')",
s.getValue(m_filter),
s.getValue(m_filter)));
}
return new FolderTableModel((FolderBrowser) t, s, itemColl);
//((FolderBrowser) t, s, (Folder.ItemCollection) m_itemColl.get(s));
}
}
public int getTotalSize(Paginator paginator, PageState state) {
Integer size = (Integer) m_size.get(state);
if (size == null) {
Folder f = (Folder) m_folder.getSelectedObject(state);
Folder.ItemCollection itemColl = f.getPrimaryInstances();
if (itemColl == null) {
return 0;
}
if (state.getValue(m_filter) != null) {
itemColl.addFilter(String.format(
"lower(name) like lower('%s%%') or lower(displayName) like lower('%s%%')",
state.getValue(m_filter),
state.getValue(m_filter)));
}
PermissionService.filterQuery(
itemColl,
"id",
PrivilegeDescriptor.READ,
Kernel.getContext().getParty().getOID()
);
size = new Integer( (int) f.getPrimaryInstances().size());
Kernel.getContext().getParty().getOID());
//size = new Integer((int) f.getPrimaryInstances().size());
size = new Integer((int) itemColl.size());
itemColl.setRange(new Integer(paginator.getFirst(state)),
new Integer(paginator.getLast(state) + 1));
String sortKey = (String)state.getValue(m_sortType);
new Integer(paginator.getLast(state) + 1));
String sortKey = (String) state.getValue(m_sortType);
String direction = "asc";
if (SORT_ACTION_DOWN.equals((String)state.getValue(m_sortDirection))) {
if (SORT_ACTION_DOWN.equals((String) state.getValue(
m_sortDirection))) {
direction = "desc";
}
if ( sortKey.equals(SORT_KEY_TITLE) ) {
itemColl.setOrder("lower(item." +
ContentItem.DISPLAY_NAME + ") " +
direction);
} else if ( sortKey.equals(SORT_KEY_NAME) ) {
itemColl.setOrder("lower(item." +
ContentItem.NAME + ") " + direction);
} else if ( sortKey.equals(SORT_KEY_LAST_MODIFIED_DATE)) {
itemColl.setOrder("item.auditing.lastModifiedDate " +
direction);
} else if ( sortKey.equals(SORT_KEY_CREATION_DATE)) {
itemColl.setOrder("item.auditing.creationDate " +
direction);
if (sortKey.equals(SORT_KEY_TITLE)) {
itemColl.setOrder("lower(item." + ContentItem.DISPLAY_NAME
+ ") " + direction);
} else if (sortKey.equals(SORT_KEY_NAME)) {
itemColl.setOrder("lower(item." + ContentItem.NAME + ") "
+ direction);
} else if (sortKey.equals(SORT_KEY_LAST_MODIFIED_DATE)) {
itemColl.setOrder("item.auditing.lastModifiedDate "
+ direction);
} else if (sortKey.equals(SORT_KEY_CREATION_DATE)) {
itemColl.setOrder("item.auditing.creationDate " + direction);
}
m_size.set(state, size);
m_itemColl.set(state, itemColl);
}
return size.intValue();
}
public void setFolderBrowser(FolderBrowser fb) {
m_fb = fb;
}
/**
* Indicates whether the paginator should be visible,
* based on the visibility of the folder browser itself.
@ -336,61 +379,62 @@ public class FolderBrowser extends Table {
* associated folder browser is unknown.
*/
public boolean isVisible(PageState state) {
return (m_fb != null)?m_fb.isVisible(state):true;
return (m_fb != null) ? m_fb.isVisible(state) : true;
}
}
private class HeaderCellRenderer
extends com.arsdigita.cms.ui.util.DefaultTableCellRenderer {
private String m_key;
public HeaderCellRenderer(String key) {
super(true);
m_key = key;
}
public Component getComponent(final Table table, final PageState state,
Object value,
boolean isSelected, Object key,
int row, int column) {
String headerName = (String)((GlobalizedMessage)value).localize();
String sortKey = (String)state.getValue(m_sortType);
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);
final String currentSortDirection = (String)state.getValue(m_sortDirection);
final String currentSortDirection = (String) state.getValue(
m_sortDirection);
String imageURLStub = null;
if (SORT_ACTION_UP.equals(currentSortDirection)) {
imageURLStub = "gray-triangle-up.gif";
} else {
imageURLStub = "gray-triangle-down.gif";
}
ControlLink cl = new ControlLink(headerName) {
ControlLink cl = new ControlLink(headerName) {
public void setControlEvent(PageState ps) {
String sortDirectionAction = null;
// by default, everything sorts "up" unless it
// is the current key and it is already pointing up
if (SORT_ACTION_UP.equals(currentSortDirection) &&
isCurrentKey) {
if (SORT_ACTION_UP.equals(currentSortDirection)
&& isCurrentKey) {
sortDirectionAction = SORT_ACTION_DOWN;
} else {
sortDirectionAction = SORT_ACTION_UP;
}
ps.setControlEvent(table,
sortDirectionAction,
m_key);
sortDirectionAction,
m_key);
}
};
Label l = new Label();
l.setLabel("<font color=\"blue\">" + headerName + "</font>");
l.setOutputEscaping(false);
l.setFontWeight(Label.BOLD);
SimpleContainer container = new SimpleContainer();
container.add(l);
if ( isCurrentKey ) {
if (isCurrentKey) {
Image image = new Image("/assets/" + imageURLStub);
image.setBorder("0");
container.add(image);
@ -399,105 +443,112 @@ public class FolderBrowser extends Table {
return cl;
}
}
/**
* Produce links to view an item or control links for folders
* to change into the folder.
*/
private class NameCellRenderer extends DefaultTableCellRenderer {
public NameCellRenderer() {
super(true);
}
@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() ) {
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();
if (section == null) {
return new Label(name);
} else {
ItemResolver resolver = section.getItemResolver();
return new Link(name, resolver.generateItemURL
(state, id, name, section, coll.getVersion()));
return new Link(name, resolver.generateItemURL(state, id,
name, section, coll.
getVersion()));
}
}
}
}
/**
* Produce delete links for items and non-empty folders.
*/
private static class ActionCellRenderer implements TableCellRenderer {
private static Label s_noAction;
private static ControlLink s_link;
private static final Logger logger = Logger.getLogger(ActionCellRenderer.class);
private static final Logger logger = Logger.getLogger(
ActionCellRenderer.class);
static {
logger.debug("Static initializer is starting...");
s_noAction = new Label("&nbsp;", false);
s_noAction.lock();
s_link = new ControlLink(new Label(globalize("cms.ui.folder.delete")));
s_link = new ControlLink(
new Label(globalize("cms.ui.folder.delete")));
s_link.setConfirmation("Permanently delete this item?"); // XXX G11N ?
logger.debug("Static initializer finished.");
}
public Component getComponent(Table table, PageState state, Object value,
boolean isSelected, Object key,
int row, int column) {
if ( ((Boolean) value).booleanValue() ) {
boolean isSelected, Object key,
int row, int column) {
if (((Boolean) value).booleanValue()) {
return s_link;
} else {
return s_noAction;
}
}
}
private final class IndexToggleRenderer implements TableCellRenderer {
public Component getComponent(Table table, PageState state, Object value, boolean isSelected, Object key, int row, int column) {
if ( value == null ) {
public Component getComponent(Table table, PageState state, Object value,
boolean isSelected, Object key, int row,
int column) {
if (value == null) {
return new Label(GlobalizationUtil.globalize("cms.ui.folder.na"));
}
ControlLink link = new ControlLink("");
if (((Boolean) value).booleanValue()) {
link.setClassAttr("checkBoxChecked");
} else {
link.setClassAttr("checkBoxUnchecked");
}
return link;
}
}
// Deletes an item
private class ItemDeleter extends TableActionAdapter {
public void cellSelected(TableActionEvent e) {
int col = e.getColumn().intValue();
if ( m_deleteColumn != getColumn(col) ) {
if (m_deleteColumn != getColumn(col)) {
return;
}
PageState s = e.getPageState();
BigDecimal id = new BigDecimal(e.getRowKey().toString());
OID oid = new OID(ContentItem.BASE_DATA_OBJECT_TYPE, id.abs());
final DomainObject item = DomainObjectFactory.newInstance(oid);
if (item != null) {
if (item instanceof ContentBundle) {
ContentBundle bundle = (ContentBundle) item;
@ -508,15 +559,16 @@ public class FolderBrowser extends Table {
}
item.delete();
}
((Table) e.getSource()).clearSelection(s);
}
}
/**
* Table model around ItemCollection
*/
private static class FolderTableModel implements TableModel {
private static final int NAME = 0;
private static final int TITLE = 1;
private static final int TYPE = 2;
@ -524,43 +576,42 @@ public class FolderBrowser extends Table {
private static final int LAST_MODIFIED = 4;
private static final int DELETABLE = 5;
private static final int IS_INDEX = 6;
private PageState m_state;
private FolderBrowser m_table;
private Folder.ItemCollection m_itemColl;
private Folder m_fol;
private BigDecimal m_folIndexID;
//old constructor before using paginator
//public FolderTableModel(Folder folder) {
//m_itemColl = folder.getItems();
//}
public FolderTableModel
(FolderBrowser table, PageState state, Folder.ItemCollection itemColl) {
public FolderTableModel(FolderBrowser table, PageState state,
Folder.ItemCollection itemColl) {
m_state = state;
m_table = table;
m_itemColl = itemColl;
m_fol = (Folder) table.getFolderSelectionModel().getSelectedObject(state);
m_fol = (Folder) table.getFolderSelectionModel().getSelectedObject(
state);
if (!hideIndexColumn()) {
ContentBundle indexItem = m_fol.getIndexItem();
if ( indexItem == null ) {
if (indexItem == null) {
m_folIndexID = null;
} else {
m_folIndexID = indexItem.getID();
}
}
}
public int getColumnCount() {
return hideIndexColumn() ? 6 : 7;
}
public boolean nextRow() {
return m_itemColl.next();
}
public Object getElementAt(int columnIndex) {
switch (columnIndex) {
case NAME:
@ -571,14 +622,15 @@ public class FolderBrowser extends Table {
return m_itemColl.getTypeLabel();
case CREATION_DATE: {
java.util.Date creationDate = m_itemColl.getCreationDate();
if ( creationDate == null ) {
if (creationDate == null) {
return "--";
}
return FormatStandards.formatDate(creationDate);
}
case LAST_MODIFIED: {
java.util.Date lastModified = m_itemColl.getLastModifiedDate();
if ( lastModified == null ) {
java.util.Date lastModified =
m_itemColl.getLastModifiedDate();
if (lastModified == null) {
return "--";
}
return FormatStandards.formatDate(lastModified);
@ -587,48 +639,50 @@ public class FolderBrowser extends Table {
return new Boolean(isDeletable());
case IS_INDEX: {
if (hideIndexColumn()) {
throw new IndexOutOfBoundsException("Column index " + columnIndex +
" not in table model.");
throw new IndexOutOfBoundsException(
"Column index " + columnIndex
+ " not in table model.");
}
if ( m_itemColl.isFolder() ) {
if (m_itemColl.isFolder()) {
return null;
}
if ( m_folIndexID == null ) {
if (m_folIndexID == null) {
return new Boolean(false);
}
return new Boolean(m_folIndexID
.compareTo(m_itemColl.getBundleID()) == 0);
return new Boolean(m_folIndexID.compareTo(m_itemColl.
getBundleID()) == 0);
}
default:
throw new IndexOutOfBoundsException("Column index " + columnIndex +
" not in table model.");
throw new IndexOutOfBoundsException("Column index "
+ columnIndex
+ " not in table model.");
}
}
public boolean isDeletable() {
if (s_log.isDebugEnabled()) {
s_log.debug("Checking to see if " + this + " is deletable");
}
if (m_itemColl.isLive()) {
if (s_log.isDebugEnabled()) {
s_log.debug("The item is live; it cannot be deleted");
}
return false;
}
if (m_itemColl.isFolder()) {
if (!m_itemColl.hasChildren()) {
if (s_log.isDebugEnabled()) {
s_log.debug("The item is an empty folder; it may be " +
"deleted");
s_log.debug("The item is an empty folder; it may be "
+ "deleted");
}
return true;
} else {
if (s_log.isDebugEnabled()) {
s_log.debug("The folder is not empty; it cannot be " +
"deleted");
s_log.debug("The folder is not empty; it cannot be "
+ "deleted");
}
return false;
}
@ -636,58 +690,62 @@ public class FolderBrowser extends Table {
if (s_log.isDebugEnabled()) {
s_log.debug("The item is not a folder; it may be deleted");
}
return true;
}
}
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();
return (m_itemColl.isFolder()) ? m_itemColl.getID().negate()
: m_itemColl.getBundleID();
}
}
private class FolderChanger extends TableActionAdapter {
public void cellSelected(TableActionEvent e) {
PageState s = e.getPageState();
int col = e.getColumn().intValue();
if ( m_nameColumn != getColumn(col) ) {
if (m_nameColumn != getColumn(col)) {
return;
}
String key = (String) e.getRowKey();
if ( key.startsWith("-") ) { // XXX dirty dirty
if (key.startsWith("-")) { // XXX dirty dirty
clearSelection(s);
getFolderSelectionModel().setSelectedKey(s, key.substring(1));
}
}
}
private class IndexChanger extends TableActionAdapter {
private FolderSelectionModel m_fol;
public IndexChanger(FolderSelectionModel fol) {
super();
m_fol = fol;
}
public void cellSelected(TableActionEvent e) {
PageState state = e.getPageState();
BigDecimal rowkey = new BigDecimal((String)e.getRowKey());
if (rowkey == null){
BigDecimal rowkey = new BigDecimal((String) e.getRowKey());
if (rowkey == null) {
return;
}
try {
ContentBundle contentItem = new ContentBundle(rowkey);
Folder folder = (Folder) m_fol.getSelectedObject(state);
ContentBundle currentIndexItem = (ContentBundle) folder.getIndexItem();
if ( currentIndexItem == null || (currentIndexItem.getID().compareTo(contentItem.getID()) != 0)) {
ContentBundle currentIndexItem = (ContentBundle) folder.
getIndexItem();
if (currentIndexItem == null || (currentIndexItem.getID().
compareTo(contentItem.getID())
!= 0)) {
folder.setIndexItem(contentItem);
} else {
folder.removeIndexItem();
@ -698,7 +756,7 @@ public class FolderBrowser extends Table {
}
}
}
/**
* Getting the GlobalizedMessage using a CMS Class targetBundle.
*
@ -708,7 +766,7 @@ public class FolderBrowser extends Table {
private static GlobalizedMessage globalize(String key) {
return FolderManipulator.globalize(key);
}
private static boolean hideIndexColumn() {
return ContentSection.getConfig().getHideFolderIndexCheckbox();
}

View File

@ -70,7 +70,7 @@ import java.util.Map;
/**
* Encapsulates a {@link FolderManipulator} in order to create a flat
* item listing. Also contains a new item form.
2 *
*
* @author <a href="mailto:sfreidin@arsdigita.com">Stanislav Freidin</a>
* @version $Revision: #6 $ $DateTime: 2004/08/17 23:15:09 $
* @version Id: FolderItemPane.java 287 2005-02-22 00:29:02Z sskracic $

View File

@ -18,6 +18,7 @@
*/
package com.arsdigita.cms.ui.folder;
import com.arsdigita.bebop.ActionLink;
import com.arsdigita.bebop.BoxPanel;
import com.arsdigita.bebop.Component;
import com.arsdigita.bebop.Container;
@ -37,6 +38,9 @@ import com.arsdigita.bebop.SaveCancelSection;
import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.bebop.Table;
import com.arsdigita.bebop.Tree;
import com.arsdigita.bebop.event.ActionEvent;
import com.arsdigita.bebop.event.ActionListener;
import com.arsdigita.bebop.event.FormInitListener;
import com.arsdigita.bebop.event.FormProcessListener;
import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.bebop.event.FormSubmissionListener;
@ -49,12 +53,14 @@ import com.arsdigita.bebop.form.Option;
import com.arsdigita.bebop.form.OptionGroup;
import com.arsdigita.bebop.form.SingleSelect;
import com.arsdigita.bebop.form.Submit;
import com.arsdigita.bebop.form.TextField;
import com.arsdigita.bebop.parameters.ArrayParameter;
import com.arsdigita.bebop.parameters.BigDecimalParameter;
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.CMSGlobalized;
import com.arsdigita.cms.ContentBundle;
import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.ContentSection;
@ -90,33 +96,34 @@ import java.util.Arrays;
* @version $Id: FolderManipulator.java 1940 2009-05-29 07:15:05Z terry $
*/
public class FolderManipulator extends SimpleContainer
implements FormProcessListener, FormValidationListener,
FormSubmissionListener, Resettable {
implements FormProcessListener, FormValidationListener,
FormSubmissionListener, Resettable {
private static Logger s_log =
Logger.getLogger(FolderManipulator.class);
Logger.getLogger(FolderManipulator.class);
public static final String RESOURCE_BUNDLE =
"com.arsdigita.cms.ui.folder.CMSFolderResources";
"com.arsdigita.cms.ui.folder.CMSFolderResources";
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_filter = new StringParameter("filter");
public FolderManipulator(FolderSelectionModel folderSel) {
m_sources = new ArrayParameter(new BigDecimalParameter("srcs"));
m_action = new StringParameter("act");
m_srcFolderSel = folderSel;
s_log.debug("Adding filter form...");
m_filterForm = new FilterForm();
add(m_filterForm);
m_itemView = new ItemView();
m_itemView.addProcessListener(this);
m_itemView.addValidationListener(this);
@ -133,16 +140,18 @@ public class FolderManipulator extends SimpleContainer
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_filter);
}
public final BigDecimal[] getSources(PageState s) {
BigDecimal[] result = (BigDecimal[]) s.getValue(m_sources);
return (result==null) ? EMPTY_ARRAY : result;
return (result == null) ? EMPTY_ARRAY : result;
}
public final FolderSelectionModel getSrcFolderSel () {
public final FolderSelectionModel getSrcFolderSel() {
return m_srcFolderSel;
}
@ -163,32 +172,31 @@ public class FolderManipulator extends SimpleContainer
}
protected void moveItems(Folder target, BigDecimal[] items) {
s_log.debug ("moving to folder: " + target + " items: " + items);
for (int i=0; i<items.length; i++ ) {
s_log.debug("moving to folder: " + target + " items: " + items);
for (int i = 0; i < items.length; i++) {
try {
ContentItem item = new ContentItem(items[i]);
item.setParent(target);
item.save();
} 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());
} 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());
}
}
}
protected void copyItems(final Folder target,
final BigDecimal[] items) {
if (s_log.isDebugEnabled()) {
s_log.debug("Copying items " + Arrays.asList(items) + " to " +
target);
s_log.debug("Copying items " + Arrays.asList(items) + " to "
+ target);
}
for (int i = 0; i < items.length; i++) {
ContentItem item = (ContentItem) DomainObjectFactory.newInstance
(new OID(ContentItem.BASE_DATA_OBJECT_TYPE, items[i]));
ContentItem item = (ContentItem) DomainObjectFactory.newInstance(new OID(
ContentItem.BASE_DATA_OBJECT_TYPE, items[i]));
Assert.exists(item, ContentItem.class);
@ -232,18 +240,18 @@ public class FolderManipulator extends SimpleContainer
@Override
public void process(FormSectionEvent e) {
PageState s = e.getPageState();
if ( e.getSource() == m_itemView ) {
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 ) {
} 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) ) {
if (isCopy(s)) {
copyItems(f, items);
} else if ( isMove(s) ) {
} else if (isMove(s)) {
moveItems(f, items);
}
reset(s);
@ -261,29 +269,31 @@ public class FolderManipulator extends SimpleContainer
boolean hasSources = sources.length > 0;
SecurityManager sm = Utilities.getSecurityManager(s);
if ( e.getSource() == m_itemView ) {
if ( ! hasSources ) {
if (e.getSource() == m_itemView) {
if (!hasSources) {
d.addError(globalize("cms.ui.folder.must_select_item"));
}
} else if ( e.getSource() == m_targetSelector ) {
} 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());
if (!hasSources) {
throw new IllegalStateException((String) GlobalizationUtil.
globalize("cms.ui.folder.no_source_items_specified").
localize());
}
Folder target = m_targetSelector.getTarget(s);
if ( target == null ) {
if (target == null) {
d.addError(globalize("cms.ui.folder.need_select_target_folder"));
}
if ( target.equals(m_srcFolderSel.getSelectedObject(s)) ) {
if (target.equals(m_srcFolderSel.getSelectedObject(s))) {
d.addError(globalize("cms.ui.folder.not_within_same_folder"));
}
// check create item permission
User user = Web.getContext().getUser();
if ( ! sm.canAccess(user, SecurityManager.NEW_ITEM, target) ) {
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++ ) {
for (int i = 0; i < sources.length; i++) {
try {
item = new ContentItem(sources[i]);
name = item.getName();
@ -291,20 +301,26 @@ public class FolderManipulator extends SimpleContainer
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);
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());
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 + ".");
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());
} catch (DataObjectNotFoundException exc) {
s_log.warn("object not found in validation", exc);
throw new IllegalStateException((String) globalize(
"cms.ui.folder.no_such_item").localize());
}
}
}
@ -312,11 +328,12 @@ public class FolderManipulator extends SimpleContainer
@Override
public void submitted(FormSectionEvent e)
throws FormProcessException {
throws FormProcessException {
PageState s = e.getPageState();
if ( m_targetSelector.isCancelled(s) ) {
if (m_targetSelector.isCancelled(s)) {
reset(s);
throw new FormProcessException( (String) GlobalizationUtil.globalize("cms.ui.folder.cancelled").localize());
throw new FormProcessException((String) GlobalizationUtil.globalize(
"cms.ui.folder.cancelled").localize());
}
}
@ -332,10 +349,10 @@ public class FolderManipulator extends SimpleContainer
// The form containing the tree to select the target folder from
private class TargetSelector extends Form
implements Resettable {
implements Resettable {
private FolderSelectionModel m_targetSel;
private FolderTree m_folderTree;
private Submit m_cancel;
public TargetSelector() {
@ -343,7 +360,7 @@ public class FolderManipulator extends SimpleContainer
setMethod(GET);
m_targetSel = new FolderSelectionModel("target");
m_folderTree = new FolderTree(m_targetSel);
m_folderTree.setCellRenderer (new FolderTreeCellRenderer());
m_folderTree.setCellRenderer(new FolderTreeCellRenderer());
Label l = new Label(new PrintListener() {
@Override
@ -365,7 +382,8 @@ public class FolderManipulator extends SimpleContainer
"&nbsp;" + msg);
}
}
});
}
});
l.setOutputEscaping(false);
add(l);
add(m_folderTree);
@ -384,8 +402,8 @@ public class FolderManipulator extends SimpleContainer
// 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 ) {
m_targetSel.clearSelection(s);
if (f != null) {
ItemCollection i = f.getPathInfo(true);
while (i.next()) {
m_folderTree.expand(i.getID().toString(), s);
@ -414,14 +432,12 @@ public class FolderManipulator extends SimpleContainer
// The form containing the browser and the drop down for selecting an
// action
private class ItemView extends Form
implements Resettable {
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;
public ItemView() {
@ -435,9 +451,12 @@ public class FolderManipulator extends SimpleContainer
group.setSubject(panel);
m_browser = new FolderBrowser(m_srcFolderSel);
m_paginator = new Paginator
((PaginationModelBuilder)m_browser.getModelBuilder(),
ContentSection.getConfig().getFolderBrowseListSize());
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);
@ -451,8 +470,10 @@ public class FolderManipulator extends SimpleContainer
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"))));
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);
@ -472,6 +493,7 @@ public class FolderManipulator extends SimpleContainer
m_checkboxGroup.setValue(s, null);
m_actionSel.setValue(s, null);
m_paginator.reset(s);
s.setValue(m_filter, null);
}
// The renderer for the first column in the itemView table
@ -481,13 +503,83 @@ public class FolderManipulator extends SimpleContainer
boolean isSelected, Object key,
int row, int column) {
BigDecimal n = (BigDecimal) key;
Option result = new Option(m_sources.marshalElement(n.abs()), "");
Option result =
new Option(m_sources.marshalElement(n.abs()), "");
result.setGroup(m_checkboxGroup);
return result;
}
}
}
protected class FilterForm extends Form implements FormProcessListener,
FormInitListener,
FormSubmissionListener {
private SimpleContainer panel;
public FilterForm() {
super("folderFilterForm");
// m_browser = browser;
s_log.debug("Creating filter form...");
addProcessListener(this);
addInitListener(this);
addSubmissionListener(this);
panel = new BoxPanel(BoxPanel.HORIZONTAL);
ActionLink allLink = new ActionLink((String)globalize(
"cms.ui.folder.filter.all").localize());
allLink.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
event.getPageState().setValue(m_filter, "");
}
});
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_filter,
Character.toString(
lowerCaseChar));
}
});
panel.add(link);
}
/*panel.add(new Label("filter"));
panel.add(new TextField(m_filter));
panel.add(new Submit("filterFolderSubmit", "filter"));*/
add(panel);
}
public void process(FormSectionEvent fse) throws FormProcessException {
}
public void init(FormSectionEvent fse) throws FormProcessException {
}
public void submitted(FormSectionEvent fse) throws FormProcessException {
}
@Override
public void setVisible(PageState state, boolean visible) {
s_log.debug("Setting visible to..." + visible);
panel.setVisible(state, visible);
super.setVisible(state, visible);
}
}
/**
* Getting the GlobalizedMessage using a CMS Class targetBundle.
*
@ -498,7 +590,6 @@ public class FolderManipulator extends SimpleContainer
return new GlobalizedMessage(key, RESOURCE_BUNDLE);
}
private class FolderTreeCellRenderer implements TreeCellRenderer {
private RequestLocal m_invalidFolders = new RequestLocal();
@ -523,13 +614,13 @@ public class FolderManipulator extends SimpleContainer
invalidFolders = new ArrayList();
DataCollection collection =
SessionManager.getSession().retrieve
(ContentItem.BASE_DATA_OBJECT_TYPE);
SessionManager.getSession().retrieve(
ContentItem.BASE_DATA_OBJECT_TYPE);
CompoundFilter filter = collection.getFilterFactory().or();
// The sources themselves are not valid.
BigDecimal[] sources = getSources(state);
for (int i = 0; i < sources.length; i++) {
invalidFolders.add (sources[i].toString());
invalidFolders.add(sources[i].toString());
Filter temp = filter.addFilter("id = :id" + i);
temp.set("id" + i, sources[i]);
@ -537,14 +628,15 @@ public class FolderManipulator extends SimpleContainer
collection.addFilter(filter);
DataCollection folders =
SessionManager.getSession().retrieve(Folder.BASE_DATA_OBJECT_TYPE);
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 + " || '%'");
filter.addFilter(Folder.ANCESTORS + " like :ancestors"
+ count + " || '%'");
filter.set("ancestors" + count,
collection.get(ContentItem.ANCESTORS));
count++;
@ -552,7 +644,7 @@ public class FolderManipulator extends SimpleContainer
folders.addFilter(filter);
while (folders.next()) {
invalidFolders.add (folders.get(Folder.ID).toString());
invalidFolders.add(folders.get(Folder.ID).toString());
}
// Get all subfolders of the sources. These are also not valid.
@ -561,22 +653,22 @@ public class FolderManipulator extends SimpleContainer
dq.setParameter("item_list", invalidFolders);
while (dq.next()) {
invalidFolders.add (dq.get("folder_id").toString());
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(
m_srcFolderSel.getSelectedKey(state).toString());
// Save the invalid folder list
m_invalidFolders.set (state, invalidFolders);
m_invalidFolders.set(state, invalidFolders);
}
Label l = new Label(value.toString());
if (invalidFolders.contains (key.toString())) {
if (invalidFolders.contains(key.toString())) {
return l;
}

View File

@ -81,14 +81,11 @@ import org.apache.log4j.Logger;
* @version $Id: Page.java 1270 2006-07-18 13:34:55Z cgyg9330 $
*/
public class Page extends BlockStylable implements Container {
/** Class specific logger instance. */
private static final Logger s_log = Logger.getLogger(Page.class);
/** The delimiter character for components naming */
private static final String DELIMITER = ".";
/**
* The prefix that gets prepended to all state variables. Components must
* not use variables starting with this prefix. This guarantees that the
@ -96,9 +93,7 @@ public class Page extends BlockStylable implements Container {
* interfere with each other.
*/
private static final String COMPONENT_PREFIX = "bbp" + DELIMITER;
private static final String INTERNAL = COMPONENT_PREFIX;
/**
* The name of the special parameter that indicates which component has
* been selected.
@ -116,13 +111,11 @@ public class Page extends BlockStylable implements Container {
CONTROL_EVENT_KEYS.add(CONTROL_VALUE);
s_log.debug("Static initalizer finished.");
}
/**
* The name of the request parameter used for the visibility state of
* components stored in m_invisible.
*/
static final String INVISIBLE = INTERNAL + "i";
/**
* Map of stateful components (id --> Component)
* SortedMap used because component based hash for page is based on concatenation of
@ -131,48 +124,36 @@ public class Page extends BlockStylable implements Container {
*/
private SortedMap m_componentMap;
private List m_components;
/**
* Map of component -> owned parameter collection
*/
private Map m_componentParameterMap = new HashMap();
private FormModel m_stateModel;
/**
* <code>Container</code> that renders this <code>Page</code>.
*/
protected Container m_panel;
private List m_actionListeners;
private List m_requestListeners;
/**
* The title of the page to be added in the head of HTML output. The
* title is wrapped in a Label to allow developers to add
* PrintListeners to dynamically change the value of the title.
*/
private Label m_title;
/**
* Stores the actual title for the current request. The title may be
* generated with a PrintListener of the m_title Label.
*/
private RequestLocal m_currentTitle;
/**
* A list of all the client-side stylesheets. The elements of the list
* are of type Page.Stylesheet, defined at the end of this file.
*/
private List m_clientStylesheets;
private StringParameter m_selected;
private StringParameter m_controlEvent;
private StringParameter m_controlValue;
/**
* The default (initial) visibility of components. The encoding is
* identical to that for PageState.m_invisible.
@ -181,18 +162,15 @@ public class Page extends BlockStylable implements Container {
* PageState.
*/
protected BitSet m_invisible;
/**
* The PageErrorDisplay component that will display page state validation
* errors on this page
*/
private Component m_errorDisplay;
/**
* Indicates whether finish() has been called on this Page.
*/
private boolean m_finished = false;
/**
* indicates whether pageState.stateAsURL() should export the
* entire state for this page, or whether it should only export
@ -270,6 +248,7 @@ public class Page extends BlockStylable implements Container {
// Initialize the RequestLocal where the title for the current
// request will be kept
m_currentTitle = new RequestLocal() {
protected Object initialValue(PageState state) {
return m_title.firePrintEvent(state);
}
@ -289,7 +268,7 @@ public class Page extends BlockStylable implements Container {
// Set up the visibility tracking parameters
m_invisible = new BitSet(32);
BitSetParameter p = new BitSetParameter(INVISIBLE,
BitSetParameter p = new BitSetParameter(INVISIBLE,
BitSetParameter.ENCODE_DGAP);
m_stateModel.addFormParam(p);
}
@ -542,7 +521,6 @@ public class Page extends BlockStylable implements Container {
// Assert.isUnlocked(this);
// addClientStylesheet(styleSheetURI, styleSheetType);
// }
/**
* Adds a client-side stylesheet that should be used in HTML
* output. Arbitrarily many client-side stylesheets can be added with
@ -651,11 +629,11 @@ public class Page extends BlockStylable implements Container {
m_panel.generateXML(state, page);
}
if (Kernel.getConfig().isDebugEnabled() &&
debugStructure(state.getRequest()) ) {
if (Kernel.getConfig().isDebugEnabled() && debugStructure(state.
getRequest())) {
Element structure =
page.newChildElement("bebop:structure", BEBOP_XML_NS);
page.newChildElement("bebop:structure", BEBOP_XML_NS);
showStructure(state, structure);
}
@ -687,7 +665,7 @@ public class Page extends BlockStylable implements Container {
*/
public PageState process(HttpServletRequest request,
HttpServletResponse response)
throws ServletException {
throws ServletException {
PageState result = new PageState(this, request, response);
try {
@ -746,7 +724,6 @@ public class Page extends BlockStylable implements Container {
// PageState state = process(req, res);
// return state;
// }
/**
* Builds a DOM Document from the current request state by
* doing a depth-first tree walk on the current set of components
@ -760,7 +737,7 @@ public class Page extends BlockStylable implements Container {
*/
public Document buildDocument(HttpServletRequest req,
HttpServletResponse res)
throws ServletException {
throws ServletException {
try {
Document doc = new Document();
PageState state = process(req, res);
@ -797,6 +774,7 @@ public class Page extends BlockStylable implements Container {
Assert.isUnlocked(this);
Traversal componentRegistrar = new Traversal() {
protected void act(Component c) {
addComponent(c);
c.register(Page.this);
@ -949,7 +927,8 @@ public class Page extends BlockStylable implements Container {
}
public void generateXML(Element parent) {
Element style = parent.newChildElement("bebop:stylesheet", BEBOP_XML_NS);
Element style = parent.newChildElement("bebop:stylesheet",
BEBOP_XML_NS);
style.addAttribute("href", m_URI);
if (m_type != null) {
style.addAttribute("type", m_type);
@ -977,8 +956,8 @@ public class Page extends BlockStylable implements Container {
}
if (m_componentMap.get(key) != null) {
throw new IllegalArgumentException(
"Component key must not be duplicated. The key " +
key + " is shared by more than one component.");
"Component key must not be duplicated. The key " + key
+ " is shared by more than one component.");
}
m_componentMap.put(key, c);
m_components.add(c);
@ -1005,15 +984,18 @@ public class Page extends BlockStylable implements Container {
public void addComponentStateParam(Component c, ParameterModel p) {
Assert.isUnlocked(this);
if ( ! stateContains(c)) {
throw new IllegalArgumentException
("Component must be registered in Page");
if (!stateContains(c)) {
throw new IllegalArgumentException(
"Component must be registered in Page");
}
if ( ! m_stateModel.containsFormParam(p) ) {
p.setName(parameterName(c, p.getName()));
if (!m_stateModel.containsFormParam(p)) {
String name = parameterName(c, p.getName());
s_log.debug(String.format("Setting name of parameter to add to '%s'",
name));
p.setName(name);
m_stateModel.addFormParam(p);
Collection params = (Collection)m_componentParameterMap.get(c);
Collection params = (Collection) m_componentParameterMap.get(c);
if (params == null) {
params = new ArrayList();
m_componentParameterMap.put(c, params);
@ -1029,7 +1011,6 @@ public class Page extends BlockStylable implements Container {
return (Collection) m_componentParameterMap.get(c);
}
/**
* Gets the state index of a component. This is the number assigned
* to the component in the register traveral
@ -1181,7 +1162,6 @@ public class Page extends BlockStylable implements Container {
resetter.preorder(cmpnt);
}
/**
* Return the prefix that is prepended to each component's state
* parameters to keep them unique.
@ -1193,13 +1173,13 @@ public class Page extends BlockStylable implements Container {
// WRS: preferentially use key if it exists
String key = c.getKey();
if (key == null) {
if ( stateContains(c) ) {
if (stateContains(c)) {
key = String.valueOf(stateIndex(c));
} else {
throw new IllegalArgumentException
("Cannot generate prefix for component: key is null "
+ "and component " + c.toString() + "/" + c.getKey()
+ " did not register with page.");
throw new IllegalArgumentException(
"Cannot generate prefix for component: key is null "
+ "and component " + c.toString() + "/" + c.getKey()
+ " did not register with page.");
}
}
return COMPONENT_PREFIX + key + DELIMITER;
@ -1213,7 +1193,7 @@ public class Page extends BlockStylable implements Container {
* @return the unmangled name.
*/
private static final String unmangle(String name) {
if ( ! name.startsWith(COMPONENT_PREFIX) ) {
if (!name.startsWith(COMPONENT_PREFIX)) {
return name;
}
// Find the second occurence of delimiter
@ -1223,9 +1203,7 @@ public class Page extends BlockStylable implements Container {
}
return name;
}
// Procs for debugging output
private static String NAME = "name";
/**
@ -1316,25 +1294,26 @@ public class Page extends BlockStylable implements Container {
* by implementations of hashCode & equals
* @return
*/
public String getComponentString () {
Iterator it = m_componentMap.keySet().iterator();
/*int hash = 0;
while (it.hasNext()) {
String componentId = (String)it.next();
s_log.debug("component id = " + componentId);
hash = hash | componentId.hashCode();
s_log.debug("hash so far = " + hash);
}*/
Date start = new Date();
StringBuffer hashString = new StringBuffer();
while (it.hasNext()) {
String componentId = (String)it.next();
hashString.append(componentId);
}
s_log.debug("Time to create hashCode for page: " + (new Date().getTime() - start.getTime()));
return hashString.toString();
public String getComponentString() {
Iterator it = m_componentMap.keySet().iterator();
/*int hash = 0;
while (it.hasNext()) {
String componentId = (String)it.next();
s_log.debug("component id = " + componentId);
hash = hash | componentId.hashCode();
s_log.debug("hash so far = " + hash);
}*/
Date start = new Date();
StringBuffer hashString = new StringBuffer();
while (it.hasNext()) {
String componentId = (String) it.next();
hashString.append(componentId);
}
s_log.debug("Time to create hashCode for page: " + (new Date().getTime() - start.
getTime()));
return hashString.toString();
}
}

View File

@ -74,8 +74,8 @@ import com.arsdigita.toolbox.util.GlobalizationUtil;
*/
public class DomainObjectPropertySheet extends PropertySheet {
public static final String versionId = "$Id: DomainObjectPropertySheet.java 287 2005-02-22 00:29:02Z sskracic $ by $Author: sskracic $, $DateTime: 2004/08/16 18:10:38 $";
public static final String versionId =
"$Id: DomainObjectPropertySheet.java 287 2005-02-22 00:29:02Z sskracic $ by $Author: sskracic $, $DateTime: 2004/08/16 18:10:38 $";
private List m_props;
private DomainObjectSelectionModel m_objModel;
private AttributeFormatter m_toStringFormatter;
@ -102,8 +102,7 @@ public class DomainObjectPropertySheet extends PropertySheet {
*
*/
public DomainObjectPropertySheet(
DomainObjectSelectionModel objModel, boolean valueOutputEscape
) {
DomainObjectSelectionModel objModel, boolean valueOutputEscape) {
super(new DomainObjectModelBuilder(), valueOutputEscape);
m_objModel = objModel;
@ -142,7 +141,7 @@ public class DomainObjectPropertySheet extends PropertySheet {
public void add(GlobalizedMessage label, String attribute) {
// Determine if we are dealing with a simple string or a complex
// path
if(attribute.indexOf('.') == -1) {
if (attribute.indexOf('.') == -1) {
add(label, attribute, m_toStringFormatter);
} else {
add(label, attribute, m_recursiveFormatter);
@ -172,7 +171,8 @@ public class DomainObjectPropertySheet extends PropertySheet {
* @param attribute The name for the attribute
* @param formatter An instance of AttributeFormatter
*/
public void add(GlobalizedMessage label, String attribute, AttributeFormatter f) {
public void add(GlobalizedMessage label, String attribute,
AttributeFormatter f) {
m_props.add(new Property(label, attribute, f));
}
@ -225,28 +225,36 @@ public class DomainObjectPropertySheet extends PropertySheet {
/**
* @deprecated use getGlobalizedLabel instead
*/
public String getLabel() { return m_label.getKey(); }
public String getLabel() {
return m_label.getKey();
}
public GlobalizedMessage getGlobalizedLabel() { return m_label; }
public GlobalizedMessage getGlobalizedLabel() {
return m_label;
}
public String getAttribute() { return m_attr; }
public String getAttribute() {
return m_attr;
}
public AttributeFormatter getFormatter() { return m_formatter; }
public AttributeFormatter getFormatter() {
return m_formatter;
}
}
// Build up the object properties model from the iterator over all properties
private static class DomainObjectPropertiesModel implements PropertySheetModel {
private static class DomainObjectPropertiesModel implements
PropertySheetModel {
private DomainObject m_obj;
private PageState m_state;
private Iterator m_props;
private Property m_current;
private static String ERROR =
"No current property. Make sure that nextRow() was called at least once.";
"No current property. Make sure that nextRow() was called at least once.";
public DomainObjectPropertiesModel(
DomainObject obj, Iterator props, PageState state
) {
DomainObject obj, Iterator props, PageState state) {
m_obj = obj;
m_props = props;
m_state = state;
@ -254,11 +262,11 @@ public class DomainObjectPropertySheet extends PropertySheet {
}
public boolean nextRow() {
if(!m_props.hasNext()) {
if (!m_props.hasNext()) {
return false;
}
m_current = (Property)m_props.next();
m_current = (Property) m_props.next();
return true;
}
@ -270,39 +278,39 @@ public class DomainObjectPropertySheet extends PropertySheet {
}
public GlobalizedMessage getGlobalizedLabel() {
if(m_current == null) {
if (m_current == null) {
throw new IllegalStateException(ERROR);
}
return m_current.getGlobalizedLabel();
}
public String getValue() {
if(m_current == null) {
if (m_current == null) {
throw new IllegalStateException(ERROR);
}
return m_current.getFormatter()
.format(m_obj, m_current.getAttribute(), m_state);
return m_current.getFormatter().format(m_obj,
m_current.getAttribute(),
m_state);
}
}
// Builds an DomainObjectPropertiesModel
private static class DomainObjectModelBuilder extends LockableImpl
implements PropertySheetModelBuilder {
implements PropertySheetModelBuilder {
public PropertySheetModel makeModel(PropertySheet sheet, PageState state) {
DomainObjectPropertySheet s = (DomainObjectPropertySheet)sheet;
return new DomainObjectPropertiesModel (
s.getObjectSelectionModel().getSelectedObject(state),
s.properties(),
state
);
DomainObjectPropertySheet s = (DomainObjectPropertySheet) sheet;
return new DomainObjectPropertiesModel(
s.getObjectSelectionModel().getSelectedObject(state),
s.properties(),
state);
}
}
// Abstract formatter which maintains a "default" string
private static abstract class DefaultAttributeFormatter
extends DomainService
implements AttributeFormatter {
extends DomainService
implements AttributeFormatter {
private String m_default;
@ -322,7 +330,7 @@ public class DomainObjectPropertySheet extends PropertySheet {
// A simple attribute formatter that calls get on the object with the
// specified attribute
private static class SimpleAttributeFormatter
extends DefaultAttributeFormatter {
extends DefaultAttributeFormatter {
public SimpleAttributeFormatter() {
super();
@ -333,11 +341,13 @@ public class DomainObjectPropertySheet extends PropertySheet {
}
public String format(DomainObject obj, String attribute, PageState state) {
if(obj == null) return getDefaultString();
if (obj == null) {
return getDefaultString();
}
Object value = get(obj, attribute);
if(value == null) {
if (value == null) {
return getDefaultString();
} else {
return value.toString();
@ -349,9 +359,8 @@ public class DomainObjectPropertySheet extends PropertySheet {
// by following the names in the attribute string. For example, if
// the string says "foo.bar.baz", the formatter will attempt to call
// obj.get("foo").get("bar").get("baz");
private static class RecursiveAttributeFormatter
extends DefaultAttributeFormatter {
extends DefaultAttributeFormatter {
public RecursiveAttributeFormatter() {
super();
@ -362,26 +371,31 @@ public class DomainObjectPropertySheet extends PropertySheet {
}
public String format(DomainObject obj, String attribute, PageState state) {
if(obj == null) return getDefaultString();
if (obj == null) {
return getDefaultString();
}
StringTokenizer tokenizer = new StringTokenizer(attribute, ".");
String token = null;
Object value = getDataObject(obj);
while(tokenizer.hasMoreTokens()) {
while (tokenizer.hasMoreTokens()) {
token = tokenizer.nextToken();
// Null check
value = ((DataObject)value).get(token);
if(value == null)
value = ((DataObject) value).get(token);
if (value == null) {
return getDefaultString();
}
}
// Extract leaf value
if(token == null || value == null)
if (token == null || value == null) {
return getDefaultString();
}
return value.toString();
}
}
}

View File

@ -34,6 +34,7 @@ import com.arsdigita.cms.contenttypes.util.ContenttypesGlobalizationUtil;
import com.arsdigita.cms.ui.authoring.BasicPageForm;
import com.arsdigita.cms.ui.workflow.WorkflowLockedComponentAccess;
import com.arsdigita.domain.DomainObject;
import com.arsdigita.domain.DomainService;
import java.text.DateFormat;
/**
@ -65,7 +66,7 @@ public class PublicationPropertiesStep extends SimpleEditStep {
sheet.add(PublicationGlobalizationUtil.globalize(
"publications.ui.publication.name"),
Publication.NAME);
Publication.NAME);
sheet.add(PublicationGlobalizationUtil.globalize(
"publications.ui.publication.title"),
Publication.TITLE);
@ -74,7 +75,8 @@ public class PublicationPropertiesStep extends SimpleEditStep {
Publication.YEAR_OF_PUBLICATION);
sheet.add(PublicationGlobalizationUtil.globalize(
"publications.ui.publication.abstract"),
Publication.ABSTRACT);
Publication.ABSTRACT,
new PreFormattedTextFormatter());
sheet.add(PublicationGlobalizationUtil.globalize(
"publications.ui.publication.misc"),
Publication.MISC);
@ -132,7 +134,7 @@ public class PublicationPropertiesStep extends SimpleEditStep {
protected void addSteps(ItemSelectionModel itemModel,
AuthoringKitWizard parent) {
addStep(new PublicationAuthorsPropertyStep(itemModel, parent),
"publications.ui.publication.authors");
"publications.ui.publication.authors");
addStep(new PublicationSeriesPropertyStep(itemModel, parent),
"publications.ui.publication.series");
}
@ -143,4 +145,18 @@ public class PublicationPropertiesStep extends SimpleEditStep {
labelKey).localize()),
step);
}
private static class PreFormattedTextFormatter
extends DomainService
implements DomainObjectPropertySheet.AttributeFormatter {
public PreFormattedTextFormatter() {
super();
}
public String format(DomainObject obj, String attribute, PageState state) {
return String.format("<pre>%s</pre>", get(obj, attribute));
}
}
}