- 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 personsRootFolder;
private Folder projectsRootFolder; private Folder projectsRootFolder;
private Folder publicationsRootFolder; private Folder publicationsRootFolder;
private Folder authors; private Folder authors;
private Folder contacts; private Folder contacts;
private Folder departments; private Folder departments;
private Folder members; private Folder members;
private Folder organization; private Folder organization;
private Folder persons; private Folder persons;
private Folder projects; private Folder projects;
private Folder publications; private Folder publications;
private Folder publishers; private Folder publishers;
private Folder files; private Folder files;
private Map<String, ContentBundle> departmentsMap; private Map<String, ContentBundle> departmentsMap;
private Map<String, ContentBundle> personsMap; private Map<String, ContentBundle> personsMap;
private Map<String, ContentBundle> projectsMap; private Map<String, ContentBundle> projectsMap;
@ -135,7 +135,7 @@ public class DaBInImporter extends Program {
private Address officeAddress; private Address officeAddress;
private Domain termsDomain; private Domain termsDomain;
private Term publicationsTerm; private Term publicationsTerm;
private Term workingPapersTerm; private Term workingPapersTerm;
private Term currentProjectsTerm; private Term currentProjectsTerm;
private Term finishedProjectsTerm; private Term finishedProjectsTerm;
@ -147,13 +147,13 @@ public class DaBInImporter extends Program {
super("DaBInImporter", super("DaBInImporter",
"0.1.0", "0.1.0",
"configFile", "configFile",
startup); startup);
departmentsMap = new HashMap<String, ContentBundle>(); departmentsMap = new HashMap<String, ContentBundle>();
personsMap = new HashMap<String, ContentBundle>(); personsMap = new HashMap<String, ContentBundle>();
projectsMap = new HashMap<String, ContentBundle>(); projectsMap = new HashMap<String, ContentBundle>();
publishersMap = new HashMap<PublisherData, ContentBundle>(); publishersMap = new HashMap<PublisherData, ContentBundle>();
publicationMap = new HashMap<String, ContentBundle>(); publicationMap = new HashMap<String, ContentBundle>();
workingPaperMap = new HashMap<String, ContentBundle>(); workingPaperMap = new HashMap<String, ContentBundle>();
} }
@Override @Override
@ -259,19 +259,19 @@ public class DaBInImporter extends Program {
projectsRootFolder = projectsSection.getRootFolder(); projectsRootFolder = projectsSection.getRootFolder();
publicationsRootFolder = publicationsSection.getRootFolder(); publicationsRootFolder = publicationsSection.getRootFolder();
authors = createFolder(personsRootFolder, "autoren", "Autoren"); authors = createFolder(personsRootFolder, "autoren", "Autoren");
contacts = createFolder(personsRootFolder, "kontaktdaten", contacts = createFolder(personsRootFolder, "kontaktdaten",
"Kontaktdaten"); "Kontaktdaten");
departments = createFolder(root, "abteilungen", "Abteilungen"); departments = createFolder(root, "abteilungen", "Abteilungen");
members = createFolder(personsRootFolder, "mitglieder", "Mitglieder"); members = createFolder(personsRootFolder, "mitglieder", "Mitglieder");
organization = createFolder(root, "organisationen", "Organisation(en)"); organization = createFolder(root, "organisationen", "Organisation(en)");
persons = createFolder(personsRootFolder, "personen", "Personen"); persons = createFolder(personsRootFolder, "personen", "Personen");
projects = createFolder(projectsRootFolder, "projekte", "Projekte"); projects = createFolder(projectsRootFolder, "projekte", "Projekte");
publishers = createFolder(publicationsRootFolder, "verlage", "Verlage"); publishers = createFolder(publicationsRootFolder, "verlage", "Verlage");
@ -293,13 +293,13 @@ public class DaBInImporter extends Program {
System.out.println("Terms for publications..."); System.out.println("Terms for publications...");
String publicationsTermPath = (String) config.get( String publicationsTermPath = (String) config.get(
"terms.publications"); "terms.publications");
publicationsTerm = checkTermPath(publicationsTermPath); publicationsTerm = checkTermPath(publicationsTermPath);
System.out.println("Terms for working papers..."); System.out.println("Terms for working papers...");
String workingPapersTermPath = String workingPapersTermPath =
(String) config.get("terms.workingpapers"); (String) config.get("terms.workingpapers");
workingPapersTerm = checkTermPath(workingPapersTermPath); workingPapersTerm = checkTermPath(workingPapersTermPath);
System.out.println("Term for current projects..."); System.out.println("Term for current projects...");
String currentProjectsTermPath = (String) config.get( String currentProjectsTermPath = (String) config.get(
"terms.projects.current"); "terms.projects.current");
@ -1135,7 +1135,11 @@ public class DaBInImporter extends Program {
System.out.printf("%4d of %4d: %s...\n", counter, number, result. System.out.printf("%4d of %4d: %s...\n", counter, number, result.
getString("name")); getString("name"));
PublicationData data = new PublicationData(); 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.setPublicationDaBInId(result.getString("Publikation_Id"));
data.setName(result.getString("Name")); data.setName(result.getString("Name"));
data.setVerlag(result.getString("Verlag")); data.setVerlag(result.getString("Verlag"));
@ -1493,8 +1497,13 @@ public class DaBInImporter extends Program {
personDe.setTitlePre(personData.getTitlePre()); personDe.setTitlePre(personData.getTitlePre());
personDe.setDescription(String.format("DaBInId={%s}", personDe.setDescription(String.format("DaBInId={%s}",
personData.getDabinId())); personData.getDabinId()));
personDe.setContentSection(section); if (type == PersonType.AUTHOR) {
personDe.setLifecycle(createLifecycle(personsLifecycle)); personDe.setContentSection(publicationsSection);
personDe.setLifecycle(createLifecycle(publicationsLifecycle));
} else {
personDe.setContentSection(personsSection);
personDe.setLifecycle(createLifecycle(personsLifecycle));
}
personDe.save(); personDe.save();
personDe.setLanguage("de"); personDe.setLanguage("de");
@ -1503,8 +1512,13 @@ public class DaBInImporter extends Program {
personEn.setGivenName(personData.getGivenname()); personEn.setGivenName(personData.getGivenname());
personEn.setDescription(String.format("DaBInId={%s}", personEn.setDescription(String.format("DaBInId={%s}",
personData.getDabinId())); personData.getDabinId()));
personEn.setContentSection(section); if (type == PersonType.AUTHOR) {
personEn.setLifecycle(createLifecycle(personsLifecycle)); personEn.setContentSection(publicationsSection);
personEn.setLifecycle(createLifecycle(publicationsLifecycle));
} else {
personEn.setContentSection(personsSection);
personEn.setLifecycle(createLifecycle(personsLifecycle));
}
personEn.save(); personEn.save();
personEn.setLanguage("en"); personEn.setLanguage("en");
@ -1518,9 +1532,9 @@ public class DaBInImporter extends Program {
personDe.setContentSection(section); personDe.setContentSection(section);
personEn.setContentSection(section); personEn.setContentSection(section);
Folder folder = null; Folder folder = null;
switch(type) { switch (type) {
case MEMBER: case MEMBER:
folder = members; folder = members;
break; break;
@ -1638,7 +1652,7 @@ public class DaBInImporter extends Program {
contactBundle.addInstance(contactEn); contactBundle.addInstance(contactEn);
contactBundle.setContentSection(personsSection); contactBundle.setContentSection(personsSection);
contacts.addItem(contactBundle); contacts.addItem(contactBundle);
contactDe.setContentSection(personsSection); contactDe.setContentSection(personsSection);
contactEn.setContentSection(personsSection); contactEn.setContentSection(personsSection);
@ -1682,7 +1696,7 @@ public class DaBInImporter extends Program {
System.out.printf("\tde: %s...", departmentData.getNameDe()); System.out.printf("\tde: %s...", departmentData.getNameDe());
departmentDe = new SciDepartment(); departmentDe = new SciDepartment();
departmentDe.setTitle(departmentData.getNameDe()); departmentDe.setTitle(departmentData.getNameDe());
departmentDe.setName(DaBInImporter.normalizeString(departmentData. departmentDe.setName(DaBInImporter.normalizeString(departmentData.
getNameDe())); getNameDe()));
departmentDe.setLanguage("de"); departmentDe.setLanguage("de");
@ -1694,7 +1708,7 @@ public class DaBInImporter extends Program {
System.out.printf("\ten: %s...", System.out.printf("\ten: %s...",
departmentData.getNameEn()); departmentData.getNameEn());
departmentEn = new SciDepartment(); departmentEn = new SciDepartment();
departmentEn.setTitle(departmentData.getNameEn()); departmentEn.setTitle(departmentData.getNameEn());
departmentEn.setName(DaBInImporter.normalizeString(departmentData. departmentEn.setName(DaBInImporter.normalizeString(departmentData.
getNameDe())); getNameDe()));
departmentEn.setLanguage("en"); departmentEn.setLanguage("en");
@ -1793,7 +1807,7 @@ public class DaBInImporter extends Program {
if ((projectData.getNameDe() != null) if ((projectData.getNameDe() != null)
&& (projectData.getNameDe().length() > 0)) { && (projectData.getNameDe().length() > 0)) {
projectDe = new SciProject(); projectDe = new SciProject();
projectDe.setTitle(projectData.getNameDe()); projectDe.setTitle(projectData.getNameDe());
String projectName = DaBInImporter.normalizeString(projectData. String projectName = DaBInImporter.normalizeString(projectData.
getNameDe()); getNameDe());
if (projectName.length() > 200) { if (projectName.length() > 200) {
@ -1955,7 +1969,7 @@ public class DaBInImporter extends Program {
System.out.println("OK"); System.out.println("OK");
i++; i++;
} }
projects.addItem(project); projects.addItem(project);
//Assign to term/category //Assign to term/category
@ -2514,7 +2528,7 @@ public class DaBInImporter extends Program {
pubLink.save(); pubLink.save();
} }
} }
publications.addItem(publication); publications.addItem(publication);
if (publicationData.getVisiblity() if (publicationData.getVisiblity()
== PublicationVisibility.GLOBAL) { == PublicationVisibility.GLOBAL) {
@ -2631,10 +2645,10 @@ public class DaBInImporter extends Program {
workingPaperEn.setContentSection(publicationsSection); workingPaperEn.setContentSection(publicationsSection);
} }
workingPaperMap.put(workingPaperData.getDabinId(), workingPaper); workingPaperMap.put(workingPaperData.getDabinId(), workingPaper);
publications.addItem(workingPaper); publications.addItem(workingPaper);
WorkingPaper primary = (WorkingPaper) workingPaper. WorkingPaper primary = (WorkingPaper) workingPaper.
getPrimaryInstance(); getPrimaryInstance();
Term term = workingPapersTerm;//s.get(yearStr); Term term = workingPapersTerm;//s.get(yearStr);
term = termsDomain.getTerm(term.getUniqueID()); term = termsDomain.getTerm(term.getUniqueID());
System.out.printf("\tAdding project to term '%s:%s'...\n", term. 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.setTargetType(Link.INTERNAL_LINK);
download.setTargetItem(fsi); download.setTargetItem(fsi);
download.setLinkOwner(workingPaperEn); download.setLinkOwner(workingPaperEn);
files.addItem(bundle); files.addItem(bundle);
} }
} catch (IOException ex) { } catch (IOException ex) {
@ -2856,9 +2870,19 @@ public class DaBInImporter extends Program {
System.out.printf("\tde: %s, %s...", publisherData.getName(), publisherData. System.out.printf("\tde: %s, %s...", publisherData.getName(), publisherData.
getPlace()); getPlace());
publisherDe = new Publisher(); publisherDe = new Publisher();
publisherDe.setTitle(publisherData.getName()); if ((publisherData.getPlace() == null) || publisherData.getPlace().
publisherDe.setName(DaBInImporter.normalizeString(publisherData. isEmpty()) {
getName())); 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.setPlace(publisherData.getPlace());
publisherDe.setLanguage("de"); publisherDe.setLanguage("de");
publisherDe.setLifecycle(createLifecycle(publicationsLifecycle)); publisherDe.setLifecycle(createLifecycle(publicationsLifecycle));
@ -2869,9 +2893,19 @@ public class DaBInImporter extends Program {
System.out.printf("\tEn: %s, %s...", publisherData.getName(), publisherData. System.out.printf("\tEn: %s, %s...", publisherData.getName(), publisherData.
getPlace()); getPlace());
publisherEn = new Publisher(); publisherEn = new Publisher();
publisherEn.setTitle(publisherData.getName()); if ((publisherData.getPlace() == null) || publisherData.getPlace().
publisherEn.setName(DaBInImporter.normalizeString(publisherData. isEmpty()) {
getName())); 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.setPlace(publisherData.getPlace());
publisherEn.setLanguage("en"); publisherEn.setLanguage("en");
publisherEn.setLifecycle(createLifecycle(publicationsLifecycle)); publisherEn.setLifecycle(createLifecycle(publicationsLifecycle));
@ -2887,8 +2921,11 @@ public class DaBInImporter extends Program {
publisherDe.setContentSection(publicationsSection); publisherDe.setContentSection(publicationsSection);
publisherEn.setContentSection(publicationsSection); publisherEn.setContentSection(publicationsSection);
publishers.addItem(publisher); publishers.addItem(publisher);
System.out.printf(
"Putting publisher into publishers map. HashCode: %d",
publisherData.hashCode());
publishersMap.put(publisherData, publisher); publishersMap.put(publisherData, publisher);
System.out.println("OK"); System.out.println("OK");
} }
@ -2975,7 +3012,12 @@ public class DaBInImporter extends Program {
int colonIndex = normalizedData.indexOf(':'); int colonIndex = normalizedData.indexOf(':');
if (colonIndex < 0) { 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("/", ""). replace("/", "").
replaceAll("\\s\\s+", " "). replaceAll("\\s\\s+", " ").
replace(' ', '-').toLowerCase());*/ replace(' ', '-').toLowerCase());*/
@ -3015,11 +3057,19 @@ public class DaBInImporter extends Program {
System.out.printf("\tprevDelimIndex = %d\n", prevDelimIndex); System.out.printf("\tprevDelimIndex = %d\n", prevDelimIndex);
place = normalizedData.substring(prevDelimIndex, colonIndex); place = normalizedData.substring(prevDelimIndex, colonIndex);
publisher.setName(name.trim(). while ((name.length() > 1)
replace(",", ""). && !Character.isLetter(name.charAt(0))) {
replace("/", ""). name = name.substring(1);
replaceAll("\\s\\s+", " "). }
replace(' ', '-').toLowerCase()); 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()); publisher.setPlace(place.trim());
} }
@ -3111,7 +3161,7 @@ public class DaBInImporter extends Program {
publicationData.setPagesFrom(pagesFrom); publicationData.setPagesFrom(pagesFrom);
publicationData.setPagesTo(pagesTo); publicationData.setPagesTo(pagesTo);
} }
private Term checkTermPath(final String path) { private Term checkTermPath(final String path) {
StringTokenizer pathTokenizer = new StringTokenizer(path, "/"); StringTokenizer pathTokenizer = new StringTokenizer(path, "/");
@ -3147,7 +3197,7 @@ public class DaBInImporter extends Program {
return term; return term;
} }
private void createTerm(final String uniqueId, private void createTerm(final String uniqueId,
final String name, final String name,
final Domain domain, final Domain domain,
@ -3191,7 +3241,7 @@ public class DaBInImporter extends Program {
"Ä", "Ae").replace("Ü", "Ue").replace("Ö", "Oe").replace("ß", "Ä", "Ae").replace("Ü", "Ue").replace("Ö", "Oe").replace("ß",
"ss"). "ss").
replace(" ", "-"). replace(" ", "-").
replaceAll("[^a-zA-Z0-9\\-]", "").toLowerCase(); replaceAll("[^a-zA-Z0-9\\-]", "").toLowerCase().trim();
} }
public static void main(String[] args) { 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.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_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.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.save=Speichern
cms.ui.folder.cancel=Abbrechen cms.ui.folder.cancel=Abbrechen
cms.ui.folder.edit=Editieren 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.move=Verschieben
cms.ui.folder.copy=Kopieren cms.ui.folder.copy=Kopieren
cms.ui.folder.go=Los cms.ui.folder.go=Los
@ -16,22 +16,22 @@ cms.ui.folder.unlock=Entsperren
cms.ui.folder.external_lock=Externe Sperrung cms.ui.folder.external_lock=Externe Sperrung
cms.ui.folder.left=Links cms.ui.folder.left=Links
cms.ui.folder.right=Rechts 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.from=von
cms.ui.folder.to=an 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.no_image=Kein Bild
cms.ui.folder.hide_metadata=Metadaten verbergen cms.ui.folder.hide_metadata=Metadaten verbergen
cms.ui.folder.show_metadata=Zeige die Metadaten cms.ui.folder.show_metadata=Zeige die Metadaten
cms.ui.folder.edit_subject_classes=Themenklassen editieren 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_applet=In EoPro editieren
cms.ui.folder.edit_in_browser=Im Browser editieren cms.ui.folder.edit_in_browser=Im Browser editieren
cms.ui.folder.edit_current_folder=Bearbeiten des aktuellen Verzeichnisses cms.ui.folder.edit_current_folder=Bearbeiten des aktuellen Verzeichnisses
cms.ui.folder.preview_current_folder=Vorschau des aktuellen Verzeichnisses cms.ui.folder.preview_current_folder=Vorschau des aktuellen Verzeichnisses
cms.ui.folder.contents_for=Inhalt für cms.ui.folder.contents_for=Inhalt f\u00fcr
cms.ui.folder.choose_target_folder=Zielverzeichnis auswählen cms.ui.folder.choose_target_folder=Zielverzeichnis ausw\u00e4hlen
cms.ui.foldr.new_wcms_doc=Neue WCMS Documente cms.ui.foldr.new_wcms_doc=Neue WCMS Documente
COMMENT.05=INPUTS COMMENT.05=INPUTS
@ -40,26 +40,27 @@ cms.ui.folder.right=Rechts
COMMENT.10=FOLDER METADATA COMMENT.10=FOLDER METADATA
cms.ui.folder.headline=Titelzeile cms.ui.folder.headline=Titelzeile
cms.ui.folder.heading=\u00DCberschrift cms.ui.folder.heading=\u00dcberschrift
cms.ui.folder.body=Hauptbereich 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.replace_image=Ersetze dieses Bild
cms.ui.folder.align=Ausrichten 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.alt=Alt
cms.ui.folder.caption=\u00DCberschrift cms.ui.folder.caption=\u00dcberschrift
COMMENT.20=ERROR MESSAGES COMMENT.20=ERROR MESSAGES
cms.ui.folder.column_index_not_in_table_model=Spaltenindex befindet sich nicht im Datenbankmodell: 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.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.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.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.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.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.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_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.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_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.no_such_item=Die verwendete Eintrags-ID pa\u00dft zu keinem Eintrag.
cms.ui.folder.remove_asset_link=Entfernen 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.cancel=Annuler
cms.ui.folder.edit=Modifier cms.ui.folder.edit=Modifier
cms.ui.folder.delete=Effacer 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.copy=Copier
cms.ui.folder.go=Go cms.ui.folder.go=Go
cms.ui.folder.name=Nom cms.ui.folder.name=Nom
@ -11,26 +11,26 @@ cms.ui.folder.type=Type
cms.ui.folder.action=Action cms.ui.folder.action=Action
cms.ui.folder.title=Titre cms.ui.folder.title=Titre
cms.ui.folder.index=Index 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.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.external_lock=Verrou externe
cms.ui.folder.left=Gauche cms.ui.folder.left=Gauche
cms.ui.folder.right=Droite 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.from=de
cms.ui.folder.to=à cms.ui.folder.to=\u00e0
cms.ui.folder.no_items=Pas d'éléments cms.ui.folder.no_items=Pas d'\u00e9l\u00e9ments
cms.ui.folder.no_image=Pas d'image cms.ui.folder.no_image=Pas d'image
cms.ui.folder.hide_metadata=Cacher les méta-données cms.ui.folder.hide_metadata=Cacher les m\u00e9ta-donn\u00e9es
cms.ui.folder.show_metadata=Montrer les méta-données cms.ui.folder.show_metadata=Montrer les m\u00e9ta-donn\u00e9es
cms.ui.folder.edit_subject_classes=Modifier les classes objet cms.ui.folder.edit_subject_classes=Modifier les classes objet
cms.ui.folder.add_paragraph=Ajouter un paragraphe cms.ui.folder.add_paragraph=Ajouter un paragraphe
cms.ui.folder.edit_in_applet=Modifier dans EoPro cms.ui.folder.edit_in_applet=Modifier dans EoPro
cms.ui.folder.edit_in_browser=Modifier dans un navigateur cms.ui.folder.edit_in_browser=Modifier dans un navigateur
cms.ui.folder.edit_current_folder=Modifier le dossier courant 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.contents_for=Contenu&nbsp;de&nbsp;
cms.ui.folder.choose_target_folder=Choisir le dossier de destination cms.ui.folder.choose_target_folder=Choisir le dossier de destination
cms.ui.foldr.new_wcms_doc=Nouveau document WCMS cms.ui.foldr.new_wcms_doc=Nouveau document WCMS
@ -41,26 +41,27 @@ cms.ui.folder.right=Droite
COMMENT.10=DOSSIER DES META DONNEES 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.heading=Chapeau
cms.ui.folder.body=Corps cms.ui.folder.body=Corps
cms.ui.folder.add_image=Ajouter une image cms.ui.folder.add_image=Ajouter une image
cms.ui.folder.replace_image=Remplacer cette image cms.ui.folder.replace_image=Remplacer cette image
cms.ui.folder.align=Aligner 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.alt=Alt
cms.ui.folder.caption=Légende cms.ui.folder.caption=L\u00e9gende
cms.ui.folder.remove_asset_link=Retirer cms.ui.folder.remove_asset_link=Retirer
COMMENT.20=MESSAGES D'ERREURS 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.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.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'élément source spécifié. 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électionner un dossier dans lequel les éléments seront déplacés ou copiés. 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éplacer ou de copier des éléments à l'intérieur d'un même dossier. 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éer, de copier, ou de déplacer des éléments. 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éjà un élément dans le dossier destination appelé: 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é-publier avant de le déplacer. 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éplacer 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'élément ne correspond pas à un contenu existant. 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 $ * @version $Id: FolderBrowser.java 2017 2009-10-04 09:03:45Z pboy $
*/ */
public class FolderBrowser extends Table { public class FolderBrowser extends Table {
private static final Logger s_log = Logger.getLogger(FolderBrowser.class); private static final Logger s_log = Logger.getLogger(FolderBrowser.class);
private static GlobalizedMessage[] s_headers = { private static GlobalizedMessage[] s_headers = {
globalize("cms.ui.folder.name"), globalize("cms.ui.folder.title"), 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.type"),
globalize("cms.ui.folder.last_modified"), globalize("cms.ui.folder.action"), globalize("cms.ui.folder.creation_date"),
globalize("cms.ui.folder.index") }; globalize("cms.ui.folder.last_modified"), globalize(
"cms.ui.folder.action"),
globalize("cms.ui.folder.index")};
private static GlobalizedMessage[] s_noIndexHeaders = { private static GlobalizedMessage[] s_noIndexHeaders = {
globalize("cms.ui.folder.name"), globalize("cms.ui.folder.title"), 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.type"),
globalize("cms.ui.folder.last_modified"), globalize("cms.ui.folder.action") }; 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_UP = "sortActionUp";
private static final String SORT_ACTION_DOWN = "sortActionDown"; private static final String SORT_ACTION_DOWN = "sortActionDown";
private FolderSelectionModel m_currentFolder; private FolderSelectionModel m_currentFolder;
private TableActionListener m_folderChanger; private TableActionListener m_folderChanger;
private TableActionListener m_deleter; private TableActionListener m_deleter;
private TableActionListener m_indexChanger; private TableActionListener m_indexChanger;
private TableColumn m_nameColumn; private TableColumn m_nameColumn;
private TableColumn m_deleteColumn; private TableColumn m_deleteColumn;
private TableColumn m_indexColumn; private TableColumn m_indexColumn;
private final static String SORT_KEY_NAME = "name"; private final static String SORT_KEY_NAME = "name";
private final static String SORT_KEY_TITLE = "title"; private final static String SORT_KEY_TITLE = "title";
private final static String SORT_KEY_LAST_MODIFIED_DATE = "lastModified"; private final static String SORT_KEY_LAST_MODIFIED_DATE = "lastModified";
private final static String SORT_KEY_CREATION_DATE = "creationDate"; private final static String SORT_KEY_CREATION_DATE = "creationDate";
private StringParameter m_sortType = new StringParameter("sortType"); private StringParameter m_sortType = new StringParameter("sortType");
private StringParameter m_sortDirection = new StringParameter("sortDirn"); 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) { public FolderBrowser(FolderSelectionModel currentFolder) {
//super(new FolderTableModelBuilder(), s_headers); //super(new FolderTableModelBuilder(), s_headers);
super(); super();
m_sortType.setDefaultValue(SORT_KEY_NAME); m_sortType.setDefaultValue(SORT_KEY_NAME);
m_sortDirection.setDefaultValue(SORT_ACTION_UP); m_sortDirection.setDefaultValue(SORT_ACTION_UP);
setModelBuilder(new FolderTableModelBuilder(currentFolder)); setModelBuilder(new FolderTableModelBuilder(currentFolder));
setColumnModel(new DefaultTableColumnModel(hideIndexColumn() ? s_noIndexHeaders : s_headers)); setColumnModel(new DefaultTableColumnModel(hideIndexColumn()
? s_noIndexHeaders
: s_headers));
setHeader(new TableHeader(getColumnModel())); setHeader(new TableHeader(getColumnModel()));
// DEE 1/18/02: the folder table model builder needs to know about // DEE 1/18/02: the folder table model builder needs to know about
// 'this' in order to set visibility, but 'this' isn't available // '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, // so we break the model builder construction up into two parts,
// and pull the foldertablemodelbuilder back with the super class' // and pull the foldertablemodelbuilder back with the super class'
// accessor. // accessor.
((FolderTableModelBuilder)getModelBuilder()).setFolderBrowser(this); ((FolderTableModelBuilder) getModelBuilder()).setFolderBrowser(this);
m_currentFolder = currentFolder; m_currentFolder = currentFolder;
/* /*
This code should be uncommented if the desired behaviour is for a change This code should be uncommented if the desired behaviour is for a change
of folder to cause reversion to default ordering of contained items of folder to cause reversion to default ordering of contained items
(by name ascending). Our feeling is that the user selected ordering (by name ascending). Our feeling is that the user selected ordering
should be retained for the duration of the folder browsing session. If should be retained for the duration of the folder browsing session. If
anyone wants this alternative behaviour it should be brought in under anyone wants this alternative behaviour it should be brought in under
the control of a config parameter. the control of a config parameter.
m_currentFolder.addChangeListener(new ChangeListener() { m_currentFolder.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) { public void stateChanged(ChangeEvent e) {
PageState state = e.getPageState(); PageState state = e.getPageState();
state.setValue(m_sortType, m_sortType.getDefaultValue()); state.setValue(m_sortType, m_sortType.getDefaultValue());
state.setValue(m_sortDirection, m_sortDirection.getDefaultValue()); state.setValue(m_sortDirection, m_sortDirection.getDefaultValue());
}}); }});
*/ */
setClassAttr("dataTable"); 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 = getColumn(0);
m_nameColumn.setCellRenderer(new NameCellRenderer()); m_nameColumn.setCellRenderer(new NameCellRenderer());
m_nameColumn.setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_NAME)); m_nameColumn.setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_NAME));
getColumn(1).setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_TITLE)); getColumn(1).setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_TITLE));
getColumn(3).setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_CREATION_DATE)); getColumn(3).setHeaderRenderer(new HeaderCellRenderer(
getColumn(4).setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_LAST_MODIFIED_DATE)); SORT_KEY_CREATION_DATE));
getColumn(4).setHeaderRenderer(new HeaderCellRenderer(
SORT_KEY_LAST_MODIFIED_DATE));
m_deleteColumn = getColumn(5); m_deleteColumn = getColumn(5);
m_deleteColumn.setCellRenderer(new ActionCellRenderer()); m_deleteColumn.setCellRenderer(new ActionCellRenderer());
m_deleteColumn.setAlign("center"); m_deleteColumn.setAlign("center");
@ -173,59 +175,60 @@ public class FolderBrowser extends Table {
m_indexColumn = getColumn(6); m_indexColumn = getColumn(6);
m_indexColumn.setCellRenderer(new IndexToggleRenderer()); m_indexColumn.setCellRenderer(new IndexToggleRenderer());
m_indexColumn.setAlign("center"); m_indexColumn.setAlign("center");
m_indexChanger = new IndexChanger(m_currentFolder); m_indexChanger = new IndexChanger(m_currentFolder);
addTableActionListener(m_indexChanger); addTableActionListener(m_indexChanger);
} }
m_folderChanger = new FolderChanger(); m_folderChanger = new FolderChanger();
addTableActionListener(m_folderChanger); addTableActionListener(m_folderChanger);
m_deleter = new ItemDeleter(); m_deleter = new ItemDeleter();
addTableActionListener(m_deleter); addTableActionListener(m_deleter);
setEmptyView(new Label(globalize("cms.ui.folder.no_items"))); setEmptyView(new Label(globalize("cms.ui.folder.no_items")));
Assert.exists( m_currentFolder.getStateParameter() ); Assert.exists(m_currentFolder.getStateParameter());
} }
@Override @Override
public void register(Page p) { public void register(Page p) {
super.register(p); super.register(p);
p.addComponentStateParam(this, m_currentFolder.getStateParameter()); p.addComponentStateParam(this, m_currentFolder.getStateParameter());
p.addComponentStateParam(this, m_sortType); p.addComponentStateParam(this, m_sortType);
p.addComponentStateParam(this, m_sortDirection); p.addComponentStateParam(this, m_sortDirection);
p.addActionListener(new ActionListener() { p.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
final PageState state = e.getPageState(); final PageState state = e.getPageState();
if (state.isVisibleOnPage(FolderBrowser.this)) { if (state.isVisibleOnPage(FolderBrowser.this)) {
showHideFolderActions(state); showHideFolderActions(state);
} }
} }
}); });
} }
private void showHideFolderActions(PageState state) { private void showHideFolderActions(PageState state) {
SecurityManager sm = Utilities.getSecurityManager(state); SecurityManager sm = Utilities.getSecurityManager(state);
Folder folder = (Folder) m_currentFolder.getSelectedObject(state); Folder folder = (Folder) m_currentFolder.getSelectedObject(state);
Assert.exists(folder); Assert.exists(folder);
boolean canDelete = boolean canDelete =
sm.canAccess(state.getRequest(), SecurityManager.DELETE_ITEM, folder); sm.canAccess(state.getRequest(), SecurityManager.DELETE_ITEM,
folder);
m_deleteColumn.setVisible(state, canDelete); m_deleteColumn.setVisible(state, canDelete);
} }
@Override @Override
public void respond(PageState state) throws ServletException { public void respond(PageState state) throws ServletException {
String key = state.getControlEventName(); String key = state.getControlEventName();
String value = state.getControlEventValue(); String value = state.getControlEventValue();
if ( SORT_ACTION_UP.equals(key) ) { if (SORT_ACTION_UP.equals(key)) {
state.setValue(m_sortType, value); state.setValue(m_sortType, value);
state.setValue(m_sortDirection, SORT_ACTION_UP); 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_sortType, value);
state.setValue(m_sortDirection, SORT_ACTION_DOWN); state.setValue(m_sortDirection, SORT_ACTION_DOWN);
} else { } else {
@ -233,101 +236,141 @@ public class FolderBrowser extends Table {
//throw new ServletException("Unknown control event: " + key); //throw new ServletException("Unknown control event: " + key);
} }
} }
public FolderSelectionModel getFolderSelectionModel() { public FolderSelectionModel getFolderSelectionModel() {
return m_currentFolder; 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 private class FolderTableModelBuilder
extends AbstractTableModelBuilder implements PaginationModelBuilder { extends AbstractTableModelBuilder implements PaginationModelBuilder {
private FolderSelectionModel m_folder; private FolderSelectionModel m_folder;
private RequestLocal m_size; private RequestLocal m_size;
private RequestLocal m_itemColl; private RequestLocal m_itemColl;
private FolderBrowser m_fb; private FolderBrowser m_fb;
public FolderTableModelBuilder(FolderSelectionModel sel) { public FolderTableModelBuilder(FolderSelectionModel sel) {
this(sel, null); this(sel, null);
} }
public FolderTableModelBuilder(FolderSelectionModel sel, FolderBrowser fb) { public FolderTableModelBuilder(FolderSelectionModel sel,
FolderBrowser fb) {
super(); super();
m_folder = sel; m_folder = sel;
m_size = new RequestLocal(); m_size = new RequestLocal();
m_itemColl = new RequestLocal(); m_itemColl = new RequestLocal();
m_fb = fb; m_fb = fb;
} }
public TableModel makeModel(Table t, PageState s) { public TableModel makeModel(Table t, PageState s) {
FolderSelectionModel sel = ((FolderBrowser) t).getFolderSelectionModel(); FolderSelectionModel sel = ((FolderBrowser) t).
getFolderSelectionModel();
Folder f = (Folder) sel.getSelectedObject(s); Folder f = (Folder) sel.getSelectedObject(s);
if ( f == null ) { if (f == null) {
return Table.EMPTY_MODEL; return Table.EMPTY_MODEL;
} else { } else {
t.getRowSelectionModel().clearSelection(s); t.getRowSelectionModel().clearSelection(s);
return new FolderTableModel s_log.debug(String.format("filter = '%s'", s.getValue(m_filter)));
((FolderBrowser) t, s, (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()));
/*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) { public int getTotalSize(Paginator paginator, PageState state) {
Integer size = (Integer) m_size.get(state); Integer size = (Integer) m_size.get(state);
if (size == null) { if (size == null) {
Folder f = (Folder) m_folder.getSelectedObject(state); Folder f = (Folder) m_folder.getSelectedObject(state);
Folder.ItemCollection itemColl = f.getPrimaryInstances(); Folder.ItemCollection itemColl = f.getPrimaryInstances();
if (itemColl == null) { if (itemColl == null) {
return 0; 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( PermissionService.filterQuery(
itemColl, itemColl,
"id", "id",
PrivilegeDescriptor.READ, PrivilegeDescriptor.READ,
Kernel.getContext().getParty().getOID() Kernel.getContext().getParty().getOID());
);
//size = new Integer((int) f.getPrimaryInstances().size());
size = new Integer( (int) f.getPrimaryInstances().size()); size = new Integer((int) itemColl.size());
itemColl.setRange(new Integer(paginator.getFirst(state)), 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 sortKey = (String) state.getValue(m_sortType);
String direction = "asc"; 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"; direction = "desc";
} }
if ( sortKey.equals(SORT_KEY_TITLE) ) { if (sortKey.equals(SORT_KEY_TITLE)) {
itemColl.setOrder("lower(item." + itemColl.setOrder("lower(item." + ContentItem.DISPLAY_NAME
ContentItem.DISPLAY_NAME + ") " + + ") " + direction);
direction); } else if (sortKey.equals(SORT_KEY_NAME)) {
} else if ( sortKey.equals(SORT_KEY_NAME) ) { itemColl.setOrder("lower(item." + ContentItem.NAME + ") "
itemColl.setOrder("lower(item." + + direction);
ContentItem.NAME + ") " + direction); } else if (sortKey.equals(SORT_KEY_LAST_MODIFIED_DATE)) {
} else if ( sortKey.equals(SORT_KEY_LAST_MODIFIED_DATE)) { itemColl.setOrder("item.auditing.lastModifiedDate "
itemColl.setOrder("item.auditing.lastModifiedDate " + + direction);
direction); } else if (sortKey.equals(SORT_KEY_CREATION_DATE)) {
} else if ( sortKey.equals(SORT_KEY_CREATION_DATE)) { itemColl.setOrder("item.auditing.creationDate " + direction);
itemColl.setOrder("item.auditing.creationDate " +
direction);
} }
m_size.set(state, size); m_size.set(state, size);
m_itemColl.set(state, itemColl); m_itemColl.set(state, itemColl);
} }
return size.intValue(); return size.intValue();
} }
public void setFolderBrowser(FolderBrowser fb) { public void setFolderBrowser(FolderBrowser fb) {
m_fb = fb; m_fb = fb;
} }
/** /**
* Indicates whether the paginator should be visible, * Indicates whether the paginator should be visible,
* based on the visibility of the folder browser itself. * based on the visibility of the folder browser itself.
@ -336,61 +379,62 @@ public class FolderBrowser extends Table {
* associated folder browser is unknown. * associated folder browser is unknown.
*/ */
public boolean isVisible(PageState state) { 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 private class HeaderCellRenderer
extends com.arsdigita.cms.ui.util.DefaultTableCellRenderer { extends com.arsdigita.cms.ui.util.DefaultTableCellRenderer {
private String m_key; private String m_key;
public HeaderCellRenderer(String key) { public HeaderCellRenderer(String key) {
super(true); super(true);
m_key = key; m_key = key;
} }
public Component getComponent(final Table table, final PageState state, public Component getComponent(final Table table, final PageState state,
Object value, Object value,
boolean isSelected, Object key, boolean isSelected, Object key,
int row, int column) { int row, int column) {
String headerName = (String)((GlobalizedMessage)value).localize(); String headerName = (String) ((GlobalizedMessage) value).localize();
String sortKey = (String)state.getValue(m_sortType); String sortKey = (String) state.getValue(m_sortType);
final boolean isCurrentKey = sortKey.equals(m_key); 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; String imageURLStub = null;
if (SORT_ACTION_UP.equals(currentSortDirection)) { if (SORT_ACTION_UP.equals(currentSortDirection)) {
imageURLStub = "gray-triangle-up.gif"; imageURLStub = "gray-triangle-up.gif";
} else { } else {
imageURLStub = "gray-triangle-down.gif"; imageURLStub = "gray-triangle-down.gif";
} }
ControlLink cl = new ControlLink(headerName) { ControlLink cl = new ControlLink(headerName) {
public void setControlEvent(PageState ps) { public void setControlEvent(PageState ps) {
String sortDirectionAction = null; String sortDirectionAction = null;
// by default, everything sorts "up" unless it // by default, everything sorts "up" unless it
// is the current key and it is already pointing up // is the current key and it is already pointing up
if (SORT_ACTION_UP.equals(currentSortDirection) && if (SORT_ACTION_UP.equals(currentSortDirection)
isCurrentKey) { && isCurrentKey) {
sortDirectionAction = SORT_ACTION_DOWN; sortDirectionAction = SORT_ACTION_DOWN;
} else { } else {
sortDirectionAction = SORT_ACTION_UP; sortDirectionAction = SORT_ACTION_UP;
} }
ps.setControlEvent(table, ps.setControlEvent(table,
sortDirectionAction, sortDirectionAction,
m_key); m_key);
} }
}; };
Label l = new Label(); Label l = new Label();
l.setLabel("<font color=\"blue\">" + headerName + "</font>"); l.setLabel("<font color=\"blue\">" + headerName + "</font>");
l.setOutputEscaping(false); l.setOutputEscaping(false);
l.setFontWeight(Label.BOLD); l.setFontWeight(Label.BOLD);
SimpleContainer container = new SimpleContainer(); SimpleContainer container = new SimpleContainer();
container.add(l); container.add(l);
if ( isCurrentKey ) { if (isCurrentKey) {
Image image = new Image("/assets/" + imageURLStub); Image image = new Image("/assets/" + imageURLStub);
image.setBorder("0"); image.setBorder("0");
container.add(image); container.add(image);
@ -399,105 +443,112 @@ public class FolderBrowser extends Table {
return cl; return cl;
} }
} }
/** /**
* Produce links to view an item or control links for folders * Produce links to view an item or control links for folders
* to change into the folder. * to change into the folder.
*/ */
private class NameCellRenderer extends DefaultTableCellRenderer { private class NameCellRenderer extends DefaultTableCellRenderer {
public NameCellRenderer() { public NameCellRenderer() {
super(true); super(true);
} }
@Override @Override
public Component getComponent(Table table, PageState state, Object value, public Component getComponent(Table table, PageState state, Object value,
boolean isSelected, Object key, boolean isSelected, Object key,
int row, int column) { int row, int column) {
Folder.ItemCollection coll = (Folder.ItemCollection) value; Folder.ItemCollection coll = (Folder.ItemCollection) value;
String name = coll.getName(); String name = coll.getName();
if ( coll.isFolder() ) { if (coll.isFolder()) {
return super.getComponent(table, state, name, return super.getComponent(table, state, name,
isSelected, key, row, column); isSelected, key, row, column);
} else { } else {
ContentSection section = CMS.getContext().getContentSection(); ContentSection section = CMS.getContext().getContentSection();
BigDecimal id = coll.getID(); BigDecimal id = coll.getID();
if (section == null) { if (section == null) {
return new Label(name); return new Label(name);
} else { } else {
ItemResolver resolver = section.getItemResolver(); ItemResolver resolver = section.getItemResolver();
return new Link(name, resolver.generateItemURL return new Link(name, resolver.generateItemURL(state, id,
(state, id, name, section, coll.getVersion())); name, section, coll.
getVersion()));
} }
} }
} }
} }
/** /**
* Produce delete links for items and non-empty folders. * Produce delete links for items and non-empty folders.
*/ */
private static class ActionCellRenderer implements TableCellRenderer { private static class ActionCellRenderer implements TableCellRenderer {
private static Label s_noAction; private static Label s_noAction;
private static ControlLink s_link; private static ControlLink s_link;
private static final Logger logger = Logger.getLogger(ActionCellRenderer.class); private static final Logger logger = Logger.getLogger(
ActionCellRenderer.class);
static { static {
logger.debug("Static initializer is starting..."); logger.debug("Static initializer is starting...");
s_noAction = new Label("&nbsp;", false); s_noAction = new Label("&nbsp;", false);
s_noAction.lock(); 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 ? s_link.setConfirmation("Permanently delete this item?"); // XXX G11N ?
logger.debug("Static initializer finished."); logger.debug("Static initializer finished.");
} }
public Component getComponent(Table table, PageState state, Object value, public Component getComponent(Table table, PageState state, Object value,
boolean isSelected, Object key, boolean isSelected, Object key,
int row, int column) { int row, int column) {
if ( ((Boolean) value).booleanValue() ) { if (((Boolean) value).booleanValue()) {
return s_link; return s_link;
} else { } else {
return s_noAction; return s_noAction;
} }
} }
} }
private final class IndexToggleRenderer implements TableCellRenderer { private final class IndexToggleRenderer implements TableCellRenderer {
public Component getComponent(Table table, PageState state, Object value, boolean isSelected, Object key, int row, int column) { public Component getComponent(Table table, PageState state, Object value,
boolean isSelected, Object key, int row,
if ( value == null ) { int column) {
if (value == null) {
return new Label(GlobalizationUtil.globalize("cms.ui.folder.na")); return new Label(GlobalizationUtil.globalize("cms.ui.folder.na"));
} }
ControlLink link = new ControlLink(""); ControlLink link = new ControlLink("");
if (((Boolean) value).booleanValue()) { if (((Boolean) value).booleanValue()) {
link.setClassAttr("checkBoxChecked"); link.setClassAttr("checkBoxChecked");
} else { } else {
link.setClassAttr("checkBoxUnchecked"); link.setClassAttr("checkBoxUnchecked");
} }
return link; return link;
} }
} }
// Deletes an item // Deletes an item
private class ItemDeleter extends TableActionAdapter { private class ItemDeleter extends TableActionAdapter {
public void cellSelected(TableActionEvent e) { public void cellSelected(TableActionEvent e) {
int col = e.getColumn().intValue(); int col = e.getColumn().intValue();
if ( m_deleteColumn != getColumn(col) ) { if (m_deleteColumn != getColumn(col)) {
return; return;
} }
PageState s = e.getPageState(); PageState s = e.getPageState();
BigDecimal id = new BigDecimal(e.getRowKey().toString()); BigDecimal id = new BigDecimal(e.getRowKey().toString());
OID oid = new OID(ContentItem.BASE_DATA_OBJECT_TYPE, id.abs()); OID oid = new OID(ContentItem.BASE_DATA_OBJECT_TYPE, id.abs());
final DomainObject item = DomainObjectFactory.newInstance(oid); final DomainObject item = DomainObjectFactory.newInstance(oid);
if (item != null) { if (item != null) {
if (item instanceof ContentBundle) { if (item instanceof ContentBundle) {
ContentBundle bundle = (ContentBundle) item; ContentBundle bundle = (ContentBundle) item;
@ -508,15 +559,16 @@ public class FolderBrowser extends Table {
} }
item.delete(); item.delete();
} }
((Table) e.getSource()).clearSelection(s); ((Table) e.getSource()).clearSelection(s);
} }
} }
/** /**
* Table model around ItemCollection * Table model around ItemCollection
*/ */
private static class FolderTableModel implements TableModel { private static class FolderTableModel implements TableModel {
private static final int NAME = 0; private static final int NAME = 0;
private static final int TITLE = 1; private static final int TITLE = 1;
private static final int TYPE = 2; 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 LAST_MODIFIED = 4;
private static final int DELETABLE = 5; private static final int DELETABLE = 5;
private static final int IS_INDEX = 6; private static final int IS_INDEX = 6;
private PageState m_state; private PageState m_state;
private FolderBrowser m_table; private FolderBrowser m_table;
private Folder.ItemCollection m_itemColl; private Folder.ItemCollection m_itemColl;
private Folder m_fol; private Folder m_fol;
private BigDecimal m_folIndexID; private BigDecimal m_folIndexID;
//old constructor before using paginator //old constructor before using paginator
//public FolderTableModel(Folder folder) { //public FolderTableModel(Folder folder) {
//m_itemColl = folder.getItems(); //m_itemColl = folder.getItems();
//} //}
public FolderTableModel(FolderBrowser table, PageState state,
public FolderTableModel Folder.ItemCollection itemColl) {
(FolderBrowser table, PageState state, Folder.ItemCollection itemColl) {
m_state = state; m_state = state;
m_table = table; m_table = table;
m_itemColl = itemColl; m_itemColl = itemColl;
m_fol = (Folder) table.getFolderSelectionModel().getSelectedObject(state); m_fol = (Folder) table.getFolderSelectionModel().getSelectedObject(
state);
if (!hideIndexColumn()) { if (!hideIndexColumn()) {
ContentBundle indexItem = m_fol.getIndexItem(); ContentBundle indexItem = m_fol.getIndexItem();
if ( indexItem == null ) { if (indexItem == null) {
m_folIndexID = null; m_folIndexID = null;
} else { } else {
m_folIndexID = indexItem.getID(); m_folIndexID = indexItem.getID();
} }
} }
} }
public int getColumnCount() { public int getColumnCount() {
return hideIndexColumn() ? 6 : 7; return hideIndexColumn() ? 6 : 7;
} }
public boolean nextRow() { public boolean nextRow() {
return m_itemColl.next(); return m_itemColl.next();
} }
public Object getElementAt(int columnIndex) { public Object getElementAt(int columnIndex) {
switch (columnIndex) { switch (columnIndex) {
case NAME: case NAME:
@ -571,14 +622,15 @@ public class FolderBrowser extends Table {
return m_itemColl.getTypeLabel(); return m_itemColl.getTypeLabel();
case CREATION_DATE: { case CREATION_DATE: {
java.util.Date creationDate = m_itemColl.getCreationDate(); java.util.Date creationDate = m_itemColl.getCreationDate();
if ( creationDate == null ) { if (creationDate == null) {
return "--"; return "--";
} }
return FormatStandards.formatDate(creationDate); return FormatStandards.formatDate(creationDate);
} }
case LAST_MODIFIED: { case LAST_MODIFIED: {
java.util.Date lastModified = m_itemColl.getLastModifiedDate(); java.util.Date lastModified =
if ( lastModified == null ) { m_itemColl.getLastModifiedDate();
if (lastModified == null) {
return "--"; return "--";
} }
return FormatStandards.formatDate(lastModified); return FormatStandards.formatDate(lastModified);
@ -587,48 +639,50 @@ public class FolderBrowser extends Table {
return new Boolean(isDeletable()); return new Boolean(isDeletable());
case IS_INDEX: { case IS_INDEX: {
if (hideIndexColumn()) { if (hideIndexColumn()) {
throw new IndexOutOfBoundsException("Column index " + columnIndex + throw new IndexOutOfBoundsException(
" not in table model."); "Column index " + columnIndex
+ " not in table model.");
} }
if ( m_itemColl.isFolder() ) { if (m_itemColl.isFolder()) {
return null; return null;
} }
if ( m_folIndexID == null ) { if (m_folIndexID == null) {
return new Boolean(false); return new Boolean(false);
} }
return new Boolean(m_folIndexID return new Boolean(m_folIndexID.compareTo(m_itemColl.
.compareTo(m_itemColl.getBundleID()) == 0); getBundleID()) == 0);
} }
default: default:
throw new IndexOutOfBoundsException("Column index " + columnIndex + throw new IndexOutOfBoundsException("Column index "
" not in table model."); + columnIndex
+ " not in table model.");
} }
} }
public boolean isDeletable() { public boolean isDeletable() {
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
s_log.debug("Checking to see if " + this + " is deletable"); s_log.debug("Checking to see if " + this + " is deletable");
} }
if (m_itemColl.isLive()) { if (m_itemColl.isLive()) {
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
s_log.debug("The item is live; it cannot be deleted"); s_log.debug("The item is live; it cannot be deleted");
} }
return false; return false;
} }
if (m_itemColl.isFolder()) { if (m_itemColl.isFolder()) {
if (!m_itemColl.hasChildren()) { if (!m_itemColl.hasChildren()) {
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
s_log.debug("The item is an empty folder; it may be " + s_log.debug("The item is an empty folder; it may be "
"deleted"); + "deleted");
} }
return true; return true;
} else { } else {
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
s_log.debug("The folder is not empty; it cannot be " + s_log.debug("The folder is not empty; it cannot be "
"deleted"); + "deleted");
} }
return false; return false;
} }
@ -636,58 +690,62 @@ public class FolderBrowser extends Table {
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
s_log.debug("The item is not a folder; it may be deleted"); s_log.debug("The item is not a folder; it may be deleted");
} }
return true; return true;
} }
} }
public Object getKeyAt(int columnIndex) { public Object getKeyAt(int columnIndex) {
// Mark folders by using their negative ID (dirty, dirty) // Mark folders by using their negative ID (dirty, dirty)
return ( m_itemColl.isFolder() ) ? m_itemColl.getID().negate() return (m_itemColl.isFolder()) ? m_itemColl.getID().negate()
: m_itemColl.getBundleID(); : m_itemColl.getBundleID();
} }
} }
private class FolderChanger extends TableActionAdapter { private class FolderChanger extends TableActionAdapter {
public void cellSelected(TableActionEvent e) { public void cellSelected(TableActionEvent e) {
PageState s = e.getPageState(); PageState s = e.getPageState();
int col = e.getColumn().intValue(); int col = e.getColumn().intValue();
if ( m_nameColumn != getColumn(col) ) { if (m_nameColumn != getColumn(col)) {
return; return;
} }
String key = (String) e.getRowKey(); String key = (String) e.getRowKey();
if ( key.startsWith("-") ) { // XXX dirty dirty if (key.startsWith("-")) { // XXX dirty dirty
clearSelection(s); clearSelection(s);
getFolderSelectionModel().setSelectedKey(s, key.substring(1)); getFolderSelectionModel().setSelectedKey(s, key.substring(1));
} }
} }
} }
private class IndexChanger extends TableActionAdapter { private class IndexChanger extends TableActionAdapter {
private FolderSelectionModel m_fol; private FolderSelectionModel m_fol;
public IndexChanger(FolderSelectionModel fol) { public IndexChanger(FolderSelectionModel fol) {
super(); super();
m_fol = fol; m_fol = fol;
} }
public void cellSelected(TableActionEvent e) { public void cellSelected(TableActionEvent e) {
PageState state = e.getPageState(); PageState state = e.getPageState();
BigDecimal rowkey = new BigDecimal((String)e.getRowKey()); BigDecimal rowkey = new BigDecimal((String) e.getRowKey());
if (rowkey == null){ if (rowkey == null) {
return; return;
} }
try { try {
ContentBundle contentItem = new ContentBundle(rowkey); ContentBundle contentItem = new ContentBundle(rowkey);
Folder folder = (Folder) m_fol.getSelectedObject(state); Folder folder = (Folder) m_fol.getSelectedObject(state);
ContentBundle currentIndexItem = (ContentBundle) folder.getIndexItem(); ContentBundle currentIndexItem = (ContentBundle) folder.
if ( currentIndexItem == null || (currentIndexItem.getID().compareTo(contentItem.getID()) != 0)) { getIndexItem();
if (currentIndexItem == null || (currentIndexItem.getID().
compareTo(contentItem.getID())
!= 0)) {
folder.setIndexItem(contentItem); folder.setIndexItem(contentItem);
} else { } else {
folder.removeIndexItem(); folder.removeIndexItem();
@ -698,7 +756,7 @@ public class FolderBrowser extends Table {
} }
} }
} }
/** /**
* Getting the GlobalizedMessage using a CMS Class targetBundle. * Getting the GlobalizedMessage using a CMS Class targetBundle.
* *
@ -708,7 +766,7 @@ public class FolderBrowser extends Table {
private static GlobalizedMessage globalize(String key) { private static GlobalizedMessage globalize(String key) {
return FolderManipulator.globalize(key); return FolderManipulator.globalize(key);
} }
private static boolean hideIndexColumn() { private static boolean hideIndexColumn() {
return ContentSection.getConfig().getHideFolderIndexCheckbox(); return ContentSection.getConfig().getHideFolderIndexCheckbox();
} }

View File

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

View File

@ -18,6 +18,7 @@
*/ */
package com.arsdigita.cms.ui.folder; package com.arsdigita.cms.ui.folder;
import com.arsdigita.bebop.ActionLink;
import com.arsdigita.bebop.BoxPanel; import com.arsdigita.bebop.BoxPanel;
import com.arsdigita.bebop.Component; import com.arsdigita.bebop.Component;
import com.arsdigita.bebop.Container; import com.arsdigita.bebop.Container;
@ -37,6 +38,9 @@ import com.arsdigita.bebop.SaveCancelSection;
import com.arsdigita.bebop.SimpleContainer; import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.bebop.Table; import com.arsdigita.bebop.Table;
import com.arsdigita.bebop.Tree; 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.FormProcessListener;
import com.arsdigita.bebop.event.FormSectionEvent; import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.bebop.event.FormSubmissionListener; 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.OptionGroup;
import com.arsdigita.bebop.form.SingleSelect; import com.arsdigita.bebop.form.SingleSelect;
import com.arsdigita.bebop.form.Submit; import com.arsdigita.bebop.form.Submit;
import com.arsdigita.bebop.form.TextField;
import com.arsdigita.bebop.parameters.ArrayParameter; import com.arsdigita.bebop.parameters.ArrayParameter;
import com.arsdigita.bebop.parameters.BigDecimalParameter; import com.arsdigita.bebop.parameters.BigDecimalParameter;
import com.arsdigita.bebop.parameters.StringParameter; import com.arsdigita.bebop.parameters.StringParameter;
import com.arsdigita.bebop.table.TableCellRenderer; import com.arsdigita.bebop.table.TableCellRenderer;
import com.arsdigita.bebop.table.TableColumn; import com.arsdigita.bebop.table.TableColumn;
import com.arsdigita.bebop.tree.TreeCellRenderer; import com.arsdigita.bebop.tree.TreeCellRenderer;
import com.arsdigita.cms.CMSGlobalized;
import com.arsdigita.cms.ContentBundle; import com.arsdigita.cms.ContentBundle;
import com.arsdigita.cms.ContentItem; import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.ContentSection; 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 $ * @version $Id: FolderManipulator.java 1940 2009-05-29 07:15:05Z terry $
*/ */
public class FolderManipulator extends SimpleContainer public class FolderManipulator extends SimpleContainer
implements FormProcessListener, FormValidationListener, implements FormProcessListener, FormValidationListener,
FormSubmissionListener, Resettable { FormSubmissionListener, Resettable {
private static Logger s_log = private static Logger s_log =
Logger.getLogger(FolderManipulator.class); Logger.getLogger(FolderManipulator.class);
public static final String RESOURCE_BUNDLE = 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 MOVE = "Move";
private static final String COPY = "Copy"; private static final String COPY = "Copy";
private static final BigDecimal[] EMPTY_ARRAY = new BigDecimal[0]; private static final BigDecimal[] EMPTY_ARRAY = new BigDecimal[0];
private ArrayParameter m_sources; private ArrayParameter m_sources;
private StringParameter m_action; private StringParameter m_action;
// The folder in which the source items live // The folder in which the source items live
private FolderSelectionModel m_srcFolderSel; private FolderSelectionModel m_srcFolderSel;
private ItemView m_itemView; private ItemView m_itemView;
private TargetSelector m_targetSelector; private TargetSelector m_targetSelector;
private FilterForm m_filterForm;
private StringParameter m_filter = new StringParameter("filter");
public FolderManipulator(FolderSelectionModel folderSel) { public FolderManipulator(FolderSelectionModel folderSel) {
m_sources = new ArrayParameter(new BigDecimalParameter("srcs")); m_sources = new ArrayParameter(new BigDecimalParameter("srcs"));
m_action = new StringParameter("act"); m_action = new StringParameter("act");
m_srcFolderSel = folderSel; m_srcFolderSel = folderSel;
s_log.debug("Adding filter form...");
m_filterForm = new FilterForm();
add(m_filterForm);
m_itemView = new ItemView(); m_itemView = new ItemView();
m_itemView.addProcessListener(this); m_itemView.addProcessListener(this);
m_itemView.addValidationListener(this); m_itemView.addValidationListener(this);
@ -133,16 +140,18 @@ public class FolderManipulator extends SimpleContainer
public void register(Page p) { public void register(Page p) {
super.register(p); super.register(p);
p.setVisibleDefault(m_targetSelector, false); p.setVisibleDefault(m_targetSelector, false);
p.setVisibleDefault(m_filterForm, true);
p.addComponentStateParam(this, m_sources); p.addComponentStateParam(this, m_sources);
p.addComponentStateParam(this, m_action); p.addComponentStateParam(this, m_action);
p.addComponentStateParam(this, m_filter);
} }
public final BigDecimal[] getSources(PageState s) { public final BigDecimal[] getSources(PageState s) {
BigDecimal[] result = (BigDecimal[]) s.getValue(m_sources); 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; return m_srcFolderSel;
} }
@ -163,32 +172,31 @@ public class FolderManipulator extends SimpleContainer
} }
protected void moveItems(Folder target, BigDecimal[] items) { protected void moveItems(Folder target, BigDecimal[] items) {
s_log.debug ("moving to folder: " + target + " items: " + items); s_log.debug("moving to folder: " + target + " items: " + items);
for (int i=0; i<items.length; i++ ) { for (int i = 0; i < items.length; i++) {
try { try {
ContentItem item = new ContentItem(items[i]); ContentItem item = new ContentItem(items[i]);
item.setParent(target); item.setParent(target);
item.save(); item.save();
} catch(DataObjectNotFoundException e) { } catch (DataObjectNotFoundException e) {
s_log.warn ("object not found in content move", e); s_log.warn("object not found in content move", e);
throw new IllegalStateException throw new IllegalStateException((String) globalize(
((String) globalize("cms.ui.folder.no_such_item").localize()); "cms.ui.folder.no_such_item").localize());
} }
} }
} }
protected void copyItems(final Folder target, protected void copyItems(final Folder target,
final BigDecimal[] items) { final BigDecimal[] items) {
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
s_log.debug("Copying items " + Arrays.asList(items) + " to " + s_log.debug("Copying items " + Arrays.asList(items) + " to "
target); + target);
} }
for (int i = 0; i < items.length; i++) { for (int i = 0; i < items.length; i++) {
ContentItem item = (ContentItem) DomainObjectFactory.newInstance ContentItem item = (ContentItem) DomainObjectFactory.newInstance(new OID(
(new OID(ContentItem.BASE_DATA_OBJECT_TYPE, items[i])); ContentItem.BASE_DATA_OBJECT_TYPE, items[i]));
Assert.exists(item, ContentItem.class); Assert.exists(item, ContentItem.class);
@ -232,18 +240,18 @@ public class FolderManipulator extends SimpleContainer
@Override @Override
public void process(FormSectionEvent e) { public void process(FormSectionEvent e) {
PageState s = e.getPageState(); PageState s = e.getPageState();
if ( e.getSource() == m_itemView ) { if (e.getSource() == m_itemView) {
m_itemView.setVisible(s, false); m_itemView.setVisible(s, false);
m_targetSelector.setVisible(s, true); m_targetSelector.setVisible(s, true);
m_targetSelector.expose(s); m_targetSelector.expose(s);
} else if ( e.getSource() == m_targetSelector ) { } else if (e.getSource() == m_targetSelector) {
m_itemView.setVisible(s, true); m_itemView.setVisible(s, true);
m_targetSelector.setVisible(s, false); m_targetSelector.setVisible(s, false);
Folder f = m_targetSelector.getTarget(s); Folder f = m_targetSelector.getTarget(s);
BigDecimal[] items = getSources(s); BigDecimal[] items = getSources(s);
if ( isCopy(s) ) { if (isCopy(s)) {
copyItems(f, items); copyItems(f, items);
} else if ( isMove(s) ) { } else if (isMove(s)) {
moveItems(f, items); moveItems(f, items);
} }
reset(s); reset(s);
@ -261,29 +269,31 @@ public class FolderManipulator extends SimpleContainer
boolean hasSources = sources.length > 0; boolean hasSources = sources.length > 0;
SecurityManager sm = Utilities.getSecurityManager(s); SecurityManager sm = Utilities.getSecurityManager(s);
if ( e.getSource() == m_itemView ) { if (e.getSource() == m_itemView) {
if ( ! hasSources ) { if (!hasSources) {
d.addError(globalize("cms.ui.folder.must_select_item")); 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 // The source items must have gotten lost somehow
if ( ! hasSources ) { if (!hasSources) {
throw new IllegalStateException( (String) GlobalizationUtil.globalize("cms.ui.folder.no_source_items_specified").localize()); throw new IllegalStateException((String) GlobalizationUtil.
globalize("cms.ui.folder.no_source_items_specified").
localize());
} }
Folder target = m_targetSelector.getTarget(s); Folder target = m_targetSelector.getTarget(s);
if ( target == null ) { if (target == null) {
d.addError(globalize("cms.ui.folder.need_select_target_folder")); 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")); d.addError(globalize("cms.ui.folder.not_within_same_folder"));
} }
// check create item permission // check create item permission
User user = Web.getContext().getUser(); 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")); d.addError(globalize("cms.ui.folder.no_permission_for_item"));
} }
// Per-item checks // Per-item checks
for (int i=0; i<sources.length; i++ ) { for (int i = 0; i < sources.length; i++) {
try { try {
item = new ContentItem(sources[i]); item = new ContentItem(sources[i]);
name = item.getName(); name = item.getName();
@ -291,20 +301,26 @@ public class FolderManipulator extends SimpleContainer
items.addNameFilter(name); items.addNameFilter(name);
if (items.next()) { if (items.next()) {
// there is an item in the target folder that already has this name // 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(); items.close();
if (item.isLive() && isMove(s)) { 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) ) { if ((!sm.canAccess(user, SecurityManager.DELETE_ITEM, item)) && isMove(
d.addError((String) globalize("cms.ui.folder.no_permission_for_item").localize() + name + "."); s)) {
d.addError((String) globalize(
"cms.ui.folder.no_permission_for_item").localize()
+ name + ".");
} }
} catch(DataObjectNotFoundException exc) { } catch (DataObjectNotFoundException exc) {
s_log.warn ("object not found in validation", exc); s_log.warn("object not found in validation", exc);
throw new IllegalStateException throw new IllegalStateException((String) globalize(
((String) globalize("cms.ui.folder.no_such_item").localize()); "cms.ui.folder.no_such_item").localize());
} }
} }
} }
@ -312,11 +328,12 @@ public class FolderManipulator extends SimpleContainer
@Override @Override
public void submitted(FormSectionEvent e) public void submitted(FormSectionEvent e)
throws FormProcessException { throws FormProcessException {
PageState s = e.getPageState(); PageState s = e.getPageState();
if ( m_targetSelector.isCancelled(s) ) { if (m_targetSelector.isCancelled(s)) {
reset(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 // The form containing the tree to select the target folder from
private class TargetSelector extends Form private class TargetSelector extends Form
implements Resettable { implements Resettable {
private FolderSelectionModel m_targetSel; private FolderSelectionModel m_targetSel;
private FolderTree m_folderTree; private FolderTree m_folderTree;
private Submit m_cancel; private Submit m_cancel;
public TargetSelector() { public TargetSelector() {
@ -343,7 +360,7 @@ public class FolderManipulator extends SimpleContainer
setMethod(GET); setMethod(GET);
m_targetSel = new FolderSelectionModel("target"); m_targetSel = new FolderSelectionModel("target");
m_folderTree = new FolderTree(m_targetSel); m_folderTree = new FolderTree(m_targetSel);
m_folderTree.setCellRenderer (new FolderTreeCellRenderer()); m_folderTree.setCellRenderer(new FolderTreeCellRenderer());
Label l = new Label(new PrintListener() { Label l = new Label(new PrintListener() {
@Override @Override
@ -365,7 +382,8 @@ public class FolderManipulator extends SimpleContainer
"&nbsp;" + msg); "&nbsp;" + msg);
} }
} }
}); }
});
l.setOutputEscaping(false); l.setOutputEscaping(false);
add(l); add(l);
add(m_folderTree); add(m_folderTree);
@ -384,8 +402,8 @@ public class FolderManipulator extends SimpleContainer
// Set things up the first time the selector gets visible // Set things up the first time the selector gets visible
public void expose(PageState s) { public void expose(PageState s) {
Folder f = (Folder) m_srcFolderSel.getSelectedObject(s); Folder f = (Folder) m_srcFolderSel.getSelectedObject(s);
m_targetSel.clearSelection (s); m_targetSel.clearSelection(s);
if ( f != null ) { if (f != null) {
ItemCollection i = f.getPathInfo(true); ItemCollection i = f.getPathInfo(true);
while (i.next()) { while (i.next()) {
m_folderTree.expand(i.getID().toString(), s); 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 // The form containing the browser and the drop down for selecting an
// action // action
private class ItemView extends Form private class ItemView extends Form implements Resettable {
implements Resettable {
private FolderBrowser m_browser; private FolderBrowser m_browser;
private Paginator m_paginator; private Paginator m_paginator;
private OptionGroup m_checkboxGroup; private OptionGroup m_checkboxGroup;
private SingleSelect m_actionSel; private SingleSelect m_actionSel;
private Submit m_submit; private Submit m_submit;
public ItemView() { public ItemView() {
@ -435,9 +451,12 @@ public class FolderManipulator extends SimpleContainer
group.setSubject(panel); group.setSubject(panel);
m_browser = new FolderBrowser(m_srcFolderSel); m_browser = new FolderBrowser(m_srcFolderSel);
m_paginator = new Paginator m_browser.setFilterParameter(m_filter);
((PaginationModelBuilder)m_browser.getModelBuilder(), m_browser.setFilterForm(m_filterForm);
ContentSection.getConfig().getFolderBrowseListSize()); m_paginator = new Paginator((PaginationModelBuilder) m_browser.
getModelBuilder(),
ContentSection.getConfig().
getFolderBrowseListSize());
panel.add(m_paginator); panel.add(m_paginator);
panel.add(m_browser); panel.add(m_browser);
@ -451,8 +470,10 @@ public class FolderManipulator extends SimpleContainer
c.add(new Label(globalize("cms.ui.folder.edit_selection"))); c.add(new Label(globalize("cms.ui.folder.edit_selection")));
m_actionSel = new SingleSelect(m_action); m_actionSel = new SingleSelect(m_action);
m_actionSel.addOption(new Option(COPY, new Label(globalize("cms.ui.folder.copy")))); m_actionSel.addOption(new Option(COPY, new Label(globalize(
m_actionSel.addOption(new Option(MOVE, new Label(globalize("cms.ui.folder.move")))); "cms.ui.folder.copy"))));
m_actionSel.addOption(new Option(MOVE, new Label(globalize(
"cms.ui.folder.move"))));
c.add(m_actionSel); c.add(m_actionSel);
m_submit = new Submit("Go", globalize("cms.ui.folder.go")); m_submit = new Submit("Go", globalize("cms.ui.folder.go"));
c.add(m_submit); c.add(m_submit);
@ -472,6 +493,7 @@ public class FolderManipulator extends SimpleContainer
m_checkboxGroup.setValue(s, null); m_checkboxGroup.setValue(s, null);
m_actionSel.setValue(s, null); m_actionSel.setValue(s, null);
m_paginator.reset(s); m_paginator.reset(s);
s.setValue(m_filter, null);
} }
// The renderer for the first column in the itemView table // The renderer for the first column in the itemView table
@ -481,13 +503,83 @@ public class FolderManipulator extends SimpleContainer
boolean isSelected, Object key, boolean isSelected, Object key,
int row, int column) { int row, int column) {
BigDecimal n = (BigDecimal) key; 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); result.setGroup(m_checkboxGroup);
return result; 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. * Getting the GlobalizedMessage using a CMS Class targetBundle.
* *
@ -498,7 +590,6 @@ public class FolderManipulator extends SimpleContainer
return new GlobalizedMessage(key, RESOURCE_BUNDLE); return new GlobalizedMessage(key, RESOURCE_BUNDLE);
} }
private class FolderTreeCellRenderer implements TreeCellRenderer { private class FolderTreeCellRenderer implements TreeCellRenderer {
private RequestLocal m_invalidFolders = new RequestLocal(); private RequestLocal m_invalidFolders = new RequestLocal();
@ -523,13 +614,13 @@ public class FolderManipulator extends SimpleContainer
invalidFolders = new ArrayList(); invalidFolders = new ArrayList();
DataCollection collection = DataCollection collection =
SessionManager.getSession().retrieve SessionManager.getSession().retrieve(
(ContentItem.BASE_DATA_OBJECT_TYPE); ContentItem.BASE_DATA_OBJECT_TYPE);
CompoundFilter filter = collection.getFilterFactory().or(); CompoundFilter filter = collection.getFilterFactory().or();
// The sources themselves are not valid. // The sources themselves are not valid.
BigDecimal[] sources = getSources(state); BigDecimal[] sources = getSources(state);
for (int i = 0; i < sources.length; i++) { 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); Filter temp = filter.addFilter("id = :id" + i);
temp.set("id" + i, sources[i]); temp.set("id" + i, sources[i]);
@ -537,14 +628,15 @@ public class FolderManipulator extends SimpleContainer
collection.addFilter(filter); collection.addFilter(filter);
DataCollection folders = 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); folders.addEqualsFilter(Folder.IS_DELETED, Boolean.FALSE);
filter = collection.getFilterFactory().or(); filter = collection.getFilterFactory().or();
int count = 0; int count = 0;
while (collection.next()) { while (collection.next()) {
filter.addFilter(Folder.ANCESTORS + " like :ancestors" + filter.addFilter(Folder.ANCESTORS + " like :ancestors"
count + " || '%'"); + count + " || '%'");
filter.set("ancestors" + count, filter.set("ancestors" + count,
collection.get(ContentItem.ANCESTORS)); collection.get(ContentItem.ANCESTORS));
count++; count++;
@ -552,7 +644,7 @@ public class FolderManipulator extends SimpleContainer
folders.addFilter(filter); folders.addFilter(filter);
while (folders.next()) { 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. // 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); dq.setParameter("item_list", invalidFolders);
while (dq.next()) { 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 // The folder from which the sources are being moved/copied is
// not allowed. // not allowed.
invalidFolders invalidFolders.add(
.add(m_srcFolderSel.getSelectedKey(state).toString()); m_srcFolderSel.getSelectedKey(state).toString());
// Save the invalid folder list // Save the invalid folder list
m_invalidFolders.set (state, invalidFolders); m_invalidFolders.set(state, invalidFolders);
} }
Label l = new Label(value.toString()); Label l = new Label(value.toString());
if (invalidFolders.contains (key.toString())) { if (invalidFolders.contains(key.toString())) {
return l; 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 $ * @version $Id: Page.java 1270 2006-07-18 13:34:55Z cgyg9330 $
*/ */
public class Page extends BlockStylable implements Container { public class Page extends BlockStylable implements Container {
/** Class specific logger instance. */ /** Class specific logger instance. */
private static final Logger s_log = Logger.getLogger(Page.class); private static final Logger s_log = Logger.getLogger(Page.class);
/** The delimiter character for components naming */ /** The delimiter character for components naming */
private static final String DELIMITER = "."; private static final String DELIMITER = ".";
/** /**
* The prefix that gets prepended to all state variables. Components must * The prefix that gets prepended to all state variables. Components must
* not use variables starting with this prefix. This guarantees that the * 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. * interfere with each other.
*/ */
private static final String COMPONENT_PREFIX = "bbp" + DELIMITER; private static final String COMPONENT_PREFIX = "bbp" + DELIMITER;
private static final String INTERNAL = COMPONENT_PREFIX; private static final String INTERNAL = COMPONENT_PREFIX;
/** /**
* The name of the special parameter that indicates which component has * The name of the special parameter that indicates which component has
* been selected. * been selected.
@ -116,13 +111,11 @@ public class Page extends BlockStylable implements Container {
CONTROL_EVENT_KEYS.add(CONTROL_VALUE); CONTROL_EVENT_KEYS.add(CONTROL_VALUE);
s_log.debug("Static initalizer finished."); s_log.debug("Static initalizer finished.");
} }
/** /**
* The name of the request parameter used for the visibility state of * The name of the request parameter used for the visibility state of
* components stored in m_invisible. * components stored in m_invisible.
*/ */
static final String INVISIBLE = INTERNAL + "i"; static final String INVISIBLE = INTERNAL + "i";
/** /**
* Map of stateful components (id --> Component) * Map of stateful components (id --> Component)
* SortedMap used because component based hash for page is based on concatenation of * 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 SortedMap m_componentMap;
private List m_components; private List m_components;
/** /**
* Map of component -> owned parameter collection * Map of component -> owned parameter collection
*/ */
private Map m_componentParameterMap = new HashMap(); private Map m_componentParameterMap = new HashMap();
private FormModel m_stateModel; private FormModel m_stateModel;
/** /**
* <code>Container</code> that renders this <code>Page</code>. * <code>Container</code> that renders this <code>Page</code>.
*/ */
protected Container m_panel; protected Container m_panel;
private List m_actionListeners; private List m_actionListeners;
private List m_requestListeners; private List m_requestListeners;
/** /**
* The title of the page to be added in the head of HTML output. The * 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 * title is wrapped in a Label to allow developers to add
* PrintListeners to dynamically change the value of the title. * PrintListeners to dynamically change the value of the title.
*/ */
private Label m_title; private Label m_title;
/** /**
* Stores the actual title for the current request. The title may be * Stores the actual title for the current request. The title may be
* generated with a PrintListener of the m_title Label. * generated with a PrintListener of the m_title Label.
*/ */
private RequestLocal m_currentTitle; private RequestLocal m_currentTitle;
/** /**
* A list of all the client-side stylesheets. The elements of the list * 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. * are of type Page.Stylesheet, defined at the end of this file.
*/ */
private List m_clientStylesheets; private List m_clientStylesheets;
private StringParameter m_selected; private StringParameter m_selected;
private StringParameter m_controlEvent; private StringParameter m_controlEvent;
private StringParameter m_controlValue; private StringParameter m_controlValue;
/** /**
* The default (initial) visibility of components. The encoding is * The default (initial) visibility of components. The encoding is
* identical to that for PageState.m_invisible. * identical to that for PageState.m_invisible.
@ -181,18 +162,15 @@ public class Page extends BlockStylable implements Container {
* PageState. * PageState.
*/ */
protected BitSet m_invisible; protected BitSet m_invisible;
/** /**
* The PageErrorDisplay component that will display page state validation * The PageErrorDisplay component that will display page state validation
* errors on this page * errors on this page
*/ */
private Component m_errorDisplay; private Component m_errorDisplay;
/** /**
* Indicates whether finish() has been called on this Page. * Indicates whether finish() has been called on this Page.
*/ */
private boolean m_finished = false; private boolean m_finished = false;
/** /**
* indicates whether pageState.stateAsURL() should export the * indicates whether pageState.stateAsURL() should export the
* entire state for this page, or whether it should only export * 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 // Initialize the RequestLocal where the title for the current
// request will be kept // request will be kept
m_currentTitle = new RequestLocal() { m_currentTitle = new RequestLocal() {
protected Object initialValue(PageState state) { protected Object initialValue(PageState state) {
return m_title.firePrintEvent(state); return m_title.firePrintEvent(state);
} }
@ -289,7 +268,7 @@ public class Page extends BlockStylable implements Container {
// Set up the visibility tracking parameters // Set up the visibility tracking parameters
m_invisible = new BitSet(32); m_invisible = new BitSet(32);
BitSetParameter p = new BitSetParameter(INVISIBLE, BitSetParameter p = new BitSetParameter(INVISIBLE,
BitSetParameter.ENCODE_DGAP); BitSetParameter.ENCODE_DGAP);
m_stateModel.addFormParam(p); m_stateModel.addFormParam(p);
} }
@ -542,7 +521,6 @@ public class Page extends BlockStylable implements Container {
// Assert.isUnlocked(this); // Assert.isUnlocked(this);
// addClientStylesheet(styleSheetURI, styleSheetType); // addClientStylesheet(styleSheetURI, styleSheetType);
// } // }
/** /**
* Adds a client-side stylesheet that should be used in HTML * Adds a client-side stylesheet that should be used in HTML
* output. Arbitrarily many client-side stylesheets can be added with * 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); m_panel.generateXML(state, page);
} }
if (Kernel.getConfig().isDebugEnabled() && if (Kernel.getConfig().isDebugEnabled() && debugStructure(state.
debugStructure(state.getRequest()) ) { getRequest())) {
Element structure = Element structure =
page.newChildElement("bebop:structure", BEBOP_XML_NS); page.newChildElement("bebop:structure", BEBOP_XML_NS);
showStructure(state, structure); showStructure(state, structure);
} }
@ -687,7 +665,7 @@ public class Page extends BlockStylable implements Container {
*/ */
public PageState process(HttpServletRequest request, public PageState process(HttpServletRequest request,
HttpServletResponse response) HttpServletResponse response)
throws ServletException { throws ServletException {
PageState result = new PageState(this, request, response); PageState result = new PageState(this, request, response);
try { try {
@ -746,7 +724,6 @@ public class Page extends BlockStylable implements Container {
// PageState state = process(req, res); // PageState state = process(req, res);
// return state; // return state;
// } // }
/** /**
* Builds a DOM Document from the current request state by * Builds a DOM Document from the current request state by
* doing a depth-first tree walk on the current set of components * 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, public Document buildDocument(HttpServletRequest req,
HttpServletResponse res) HttpServletResponse res)
throws ServletException { throws ServletException {
try { try {
Document doc = new Document(); Document doc = new Document();
PageState state = process(req, res); PageState state = process(req, res);
@ -797,6 +774,7 @@ public class Page extends BlockStylable implements Container {
Assert.isUnlocked(this); Assert.isUnlocked(this);
Traversal componentRegistrar = new Traversal() { Traversal componentRegistrar = new Traversal() {
protected void act(Component c) { protected void act(Component c) {
addComponent(c); addComponent(c);
c.register(Page.this); c.register(Page.this);
@ -949,7 +927,8 @@ public class Page extends BlockStylable implements Container {
} }
public void generateXML(Element parent) { 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); style.addAttribute("href", m_URI);
if (m_type != null) { if (m_type != null) {
style.addAttribute("type", m_type); style.addAttribute("type", m_type);
@ -977,8 +956,8 @@ public class Page extends BlockStylable implements Container {
} }
if (m_componentMap.get(key) != null) { if (m_componentMap.get(key) != null) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"Component key must not be duplicated. The key " + "Component key must not be duplicated. The key " + key
key + " is shared by more than one component."); + " is shared by more than one component.");
} }
m_componentMap.put(key, c); m_componentMap.put(key, c);
m_components.add(c); m_components.add(c);
@ -1005,15 +984,18 @@ public class Page extends BlockStylable implements Container {
public void addComponentStateParam(Component c, ParameterModel p) { public void addComponentStateParam(Component c, ParameterModel p) {
Assert.isUnlocked(this); Assert.isUnlocked(this);
if ( ! stateContains(c)) { if (!stateContains(c)) {
throw new IllegalArgumentException throw new IllegalArgumentException(
("Component must be registered in Page"); "Component must be registered in Page");
} }
if ( ! m_stateModel.containsFormParam(p) ) { if (!m_stateModel.containsFormParam(p)) {
p.setName(parameterName(c, p.getName())); 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); m_stateModel.addFormParam(p);
Collection params = (Collection)m_componentParameterMap.get(c); Collection params = (Collection) m_componentParameterMap.get(c);
if (params == null) { if (params == null) {
params = new ArrayList(); params = new ArrayList();
m_componentParameterMap.put(c, params); m_componentParameterMap.put(c, params);
@ -1029,7 +1011,6 @@ public class Page extends BlockStylable implements Container {
return (Collection) m_componentParameterMap.get(c); return (Collection) m_componentParameterMap.get(c);
} }
/** /**
* Gets the state index of a component. This is the number assigned * Gets the state index of a component. This is the number assigned
* to the component in the register traveral * to the component in the register traveral
@ -1181,7 +1162,6 @@ public class Page extends BlockStylable implements Container {
resetter.preorder(cmpnt); resetter.preorder(cmpnt);
} }
/** /**
* Return the prefix that is prepended to each component's state * Return the prefix that is prepended to each component's state
* parameters to keep them unique. * parameters to keep them unique.
@ -1193,13 +1173,13 @@ public class Page extends BlockStylable implements Container {
// WRS: preferentially use key if it exists // WRS: preferentially use key if it exists
String key = c.getKey(); String key = c.getKey();
if (key == null) { if (key == null) {
if ( stateContains(c) ) { if (stateContains(c)) {
key = String.valueOf(stateIndex(c)); key = String.valueOf(stateIndex(c));
} else { } else {
throw new IllegalArgumentException throw new IllegalArgumentException(
("Cannot generate prefix for component: key is null " "Cannot generate prefix for component: key is null "
+ "and component " + c.toString() + "/" + c.getKey() + "and component " + c.toString() + "/" + c.getKey()
+ " did not register with page."); + " did not register with page.");
} }
} }
return COMPONENT_PREFIX + key + DELIMITER; return COMPONENT_PREFIX + key + DELIMITER;
@ -1213,7 +1193,7 @@ public class Page extends BlockStylable implements Container {
* @return the unmangled name. * @return the unmangled name.
*/ */
private static final String unmangle(String name) { private static final String unmangle(String name) {
if ( ! name.startsWith(COMPONENT_PREFIX) ) { if (!name.startsWith(COMPONENT_PREFIX)) {
return name; return name;
} }
// Find the second occurence of delimiter // Find the second occurence of delimiter
@ -1223,9 +1203,7 @@ public class Page extends BlockStylable implements Container {
} }
return name; return name;
} }
// Procs for debugging output // Procs for debugging output
private static String NAME = "name"; private static String NAME = "name";
/** /**
@ -1316,25 +1294,26 @@ public class Page extends BlockStylable implements Container {
* by implementations of hashCode & equals * by implementations of hashCode & equals
* @return * @return
*/ */
public String getComponentString () { public String getComponentString() {
Iterator it = m_componentMap.keySet().iterator(); Iterator it = m_componentMap.keySet().iterator();
/*int hash = 0; /*int hash = 0;
while (it.hasNext()) { while (it.hasNext()) {
String componentId = (String)it.next(); String componentId = (String)it.next();
s_log.debug("component id = " + componentId); s_log.debug("component id = " + componentId);
hash = hash | componentId.hashCode(); hash = hash | componentId.hashCode();
s_log.debug("hash so far = " + hash); s_log.debug("hash so far = " + hash);
}*/ }*/
Date start = new Date(); Date start = new Date();
StringBuffer hashString = new StringBuffer(); StringBuffer hashString = new StringBuffer();
while (it.hasNext()) { while (it.hasNext()) {
String componentId = (String)it.next(); String componentId = (String) it.next();
hashString.append(componentId); hashString.append(componentId);
} }
s_log.debug("Time to create hashCode for page: " + (new Date().getTime() - start.getTime())); s_log.debug("Time to create hashCode for page: " + (new Date().getTime() - start.
return hashString.toString(); getTime()));
return hashString.toString();
} }
} }

View File

@ -74,8 +74,8 @@ import com.arsdigita.toolbox.util.GlobalizationUtil;
*/ */
public class DomainObjectPropertySheet extends PropertySheet { 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 List m_props;
private DomainObjectSelectionModel m_objModel; private DomainObjectSelectionModel m_objModel;
private AttributeFormatter m_toStringFormatter; private AttributeFormatter m_toStringFormatter;
@ -102,8 +102,7 @@ public class DomainObjectPropertySheet extends PropertySheet {
* *
*/ */
public DomainObjectPropertySheet( public DomainObjectPropertySheet(
DomainObjectSelectionModel objModel, boolean valueOutputEscape DomainObjectSelectionModel objModel, boolean valueOutputEscape) {
) {
super(new DomainObjectModelBuilder(), valueOutputEscape); super(new DomainObjectModelBuilder(), valueOutputEscape);
m_objModel = objModel; m_objModel = objModel;
@ -142,7 +141,7 @@ public class DomainObjectPropertySheet extends PropertySheet {
public void add(GlobalizedMessage label, String attribute) { public void add(GlobalizedMessage label, String attribute) {
// Determine if we are dealing with a simple string or a complex // Determine if we are dealing with a simple string or a complex
// path // path
if(attribute.indexOf('.') == -1) { if (attribute.indexOf('.') == -1) {
add(label, attribute, m_toStringFormatter); add(label, attribute, m_toStringFormatter);
} else { } else {
add(label, attribute, m_recursiveFormatter); add(label, attribute, m_recursiveFormatter);
@ -172,7 +171,8 @@ public class DomainObjectPropertySheet extends PropertySheet {
* @param attribute The name for the attribute * @param attribute The name for the attribute
* @param formatter An instance of AttributeFormatter * @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)); m_props.add(new Property(label, attribute, f));
} }
@ -225,28 +225,36 @@ public class DomainObjectPropertySheet extends PropertySheet {
/** /**
* @deprecated use getGlobalizedLabel instead * @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 // 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 DomainObject m_obj;
private PageState m_state; private PageState m_state;
private Iterator m_props; private Iterator m_props;
private Property m_current; private Property m_current;
private static String ERROR = 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( public DomainObjectPropertiesModel(
DomainObject obj, Iterator props, PageState state DomainObject obj, Iterator props, PageState state) {
) {
m_obj = obj; m_obj = obj;
m_props = props; m_props = props;
m_state = state; m_state = state;
@ -254,11 +262,11 @@ public class DomainObjectPropertySheet extends PropertySheet {
} }
public boolean nextRow() { public boolean nextRow() {
if(!m_props.hasNext()) { if (!m_props.hasNext()) {
return false; return false;
} }
m_current = (Property)m_props.next(); m_current = (Property) m_props.next();
return true; return true;
} }
@ -270,39 +278,39 @@ public class DomainObjectPropertySheet extends PropertySheet {
} }
public GlobalizedMessage getGlobalizedLabel() { public GlobalizedMessage getGlobalizedLabel() {
if(m_current == null) { if (m_current == null) {
throw new IllegalStateException(ERROR); throw new IllegalStateException(ERROR);
} }
return m_current.getGlobalizedLabel(); return m_current.getGlobalizedLabel();
} }
public String getValue() { public String getValue() {
if(m_current == null) { if (m_current == null) {
throw new IllegalStateException(ERROR); throw new IllegalStateException(ERROR);
} }
return m_current.getFormatter() return m_current.getFormatter().format(m_obj,
.format(m_obj, m_current.getAttribute(), m_state); m_current.getAttribute(),
m_state);
} }
} }
// Builds an DomainObjectPropertiesModel // Builds an DomainObjectPropertiesModel
private static class DomainObjectModelBuilder extends LockableImpl private static class DomainObjectModelBuilder extends LockableImpl
implements PropertySheetModelBuilder { implements PropertySheetModelBuilder {
public PropertySheetModel makeModel(PropertySheet sheet, PageState state) { public PropertySheetModel makeModel(PropertySheet sheet, PageState state) {
DomainObjectPropertySheet s = (DomainObjectPropertySheet)sheet; DomainObjectPropertySheet s = (DomainObjectPropertySheet) sheet;
return new DomainObjectPropertiesModel ( return new DomainObjectPropertiesModel(
s.getObjectSelectionModel().getSelectedObject(state), s.getObjectSelectionModel().getSelectedObject(state),
s.properties(), s.properties(),
state state);
);
} }
} }
// Abstract formatter which maintains a "default" string // Abstract formatter which maintains a "default" string
private static abstract class DefaultAttributeFormatter private static abstract class DefaultAttributeFormatter
extends DomainService extends DomainService
implements AttributeFormatter { implements AttributeFormatter {
private String m_default; 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 // A simple attribute formatter that calls get on the object with the
// specified attribute // specified attribute
private static class SimpleAttributeFormatter private static class SimpleAttributeFormatter
extends DefaultAttributeFormatter { extends DefaultAttributeFormatter {
public SimpleAttributeFormatter() { public SimpleAttributeFormatter() {
super(); super();
@ -333,11 +341,13 @@ public class DomainObjectPropertySheet extends PropertySheet {
} }
public String format(DomainObject obj, String attribute, PageState state) { public String format(DomainObject obj, String attribute, PageState state) {
if(obj == null) return getDefaultString(); if (obj == null) {
return getDefaultString();
}
Object value = get(obj, attribute); Object value = get(obj, attribute);
if(value == null) { if (value == null) {
return getDefaultString(); return getDefaultString();
} else { } else {
return value.toString(); return value.toString();
@ -349,9 +359,8 @@ public class DomainObjectPropertySheet extends PropertySheet {
// by following the names in the attribute string. For example, if // by following the names in the attribute string. For example, if
// the string says "foo.bar.baz", the formatter will attempt to call // the string says "foo.bar.baz", the formatter will attempt to call
// obj.get("foo").get("bar").get("baz"); // obj.get("foo").get("bar").get("baz");
private static class RecursiveAttributeFormatter private static class RecursiveAttributeFormatter
extends DefaultAttributeFormatter { extends DefaultAttributeFormatter {
public RecursiveAttributeFormatter() { public RecursiveAttributeFormatter() {
super(); super();
@ -362,26 +371,31 @@ public class DomainObjectPropertySheet extends PropertySheet {
} }
public String format(DomainObject obj, String attribute, PageState state) { public String format(DomainObject obj, String attribute, PageState state) {
if(obj == null) return getDefaultString(); if (obj == null) {
return getDefaultString();
}
StringTokenizer tokenizer = new StringTokenizer(attribute, "."); StringTokenizer tokenizer = new StringTokenizer(attribute, ".");
String token = null; String token = null;
Object value = getDataObject(obj); Object value = getDataObject(obj);
while(tokenizer.hasMoreTokens()) { while (tokenizer.hasMoreTokens()) {
token = tokenizer.nextToken(); token = tokenizer.nextToken();
// Null check // Null check
value = ((DataObject)value).get(token); value = ((DataObject) value).get(token);
if(value == null) if (value == null) {
return getDefaultString(); return getDefaultString();
}
} }
// Extract leaf value // Extract leaf value
if(token == null || value == null) if (token == null || value == null) {
return getDefaultString(); return getDefaultString();
}
return value.toString(); 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.authoring.BasicPageForm;
import com.arsdigita.cms.ui.workflow.WorkflowLockedComponentAccess; import com.arsdigita.cms.ui.workflow.WorkflowLockedComponentAccess;
import com.arsdigita.domain.DomainObject; import com.arsdigita.domain.DomainObject;
import com.arsdigita.domain.DomainService;
import java.text.DateFormat; import java.text.DateFormat;
/** /**
@ -65,7 +66,7 @@ public class PublicationPropertiesStep extends SimpleEditStep {
sheet.add(PublicationGlobalizationUtil.globalize( sheet.add(PublicationGlobalizationUtil.globalize(
"publications.ui.publication.name"), "publications.ui.publication.name"),
Publication.NAME); Publication.NAME);
sheet.add(PublicationGlobalizationUtil.globalize( sheet.add(PublicationGlobalizationUtil.globalize(
"publications.ui.publication.title"), "publications.ui.publication.title"),
Publication.TITLE); Publication.TITLE);
@ -74,7 +75,8 @@ public class PublicationPropertiesStep extends SimpleEditStep {
Publication.YEAR_OF_PUBLICATION); Publication.YEAR_OF_PUBLICATION);
sheet.add(PublicationGlobalizationUtil.globalize( sheet.add(PublicationGlobalizationUtil.globalize(
"publications.ui.publication.abstract"), "publications.ui.publication.abstract"),
Publication.ABSTRACT); Publication.ABSTRACT,
new PreFormattedTextFormatter());
sheet.add(PublicationGlobalizationUtil.globalize( sheet.add(PublicationGlobalizationUtil.globalize(
"publications.ui.publication.misc"), "publications.ui.publication.misc"),
Publication.MISC); Publication.MISC);
@ -132,7 +134,7 @@ public class PublicationPropertiesStep extends SimpleEditStep {
protected void addSteps(ItemSelectionModel itemModel, protected void addSteps(ItemSelectionModel itemModel,
AuthoringKitWizard parent) { AuthoringKitWizard parent) {
addStep(new PublicationAuthorsPropertyStep(itemModel, parent), addStep(new PublicationAuthorsPropertyStep(itemModel, parent),
"publications.ui.publication.authors"); "publications.ui.publication.authors");
addStep(new PublicationSeriesPropertyStep(itemModel, parent), addStep(new PublicationSeriesPropertyStep(itemModel, parent),
"publications.ui.publication.series"); "publications.ui.publication.series");
} }
@ -143,4 +145,18 @@ public class PublicationPropertiesStep extends SimpleEditStep {
labelKey).localize()), labelKey).localize()),
step); 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));
}
}
} }