From 7e89a378fadfdbcaf3c8597535dc5a94f415a830 Mon Sep 17 00:00:00 2001 From: quasi Date: Wed, 26 May 2010 06:32:29 +0000 Subject: [PATCH] BaseTypes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * XML-Dateien hinzugefügt, damit die BaseTypes in die Tabelle content_types geladen werden und als interne Typen gekennzeichnet sind * Euinige Fehlerkorrekturen an den UIs ContentTypes * Klasse ContentType und Tabelle content_types erweitert um Felder für ancestors und siblings um die Vererbungshierachie speichern zu können * AbstractContentTypeLoader um Methode createPedigree erweitert, die aus der Verebungsstruktur der Klassen die Hierarchie ableitet und in der Datenbank speichert * ItemSerachWidget angepaßt, so daß es nun auch abgeleitete Contenttypen akzeptiert. Es werden nun z.B. auch CT's von Type contenttypes.Member angezeigt und als Zuweisung akzeptiert, wenn nach dem Vaterobject basetypes.Person verlangt wird. git-svn-id: https://svn.libreccm.org/ccm/trunk@438 8810af33-2d31-482b-a856-94f89814c4df --- .../arsdigita/content-section/ContentType.pdl | 18 +- .../content-section/table-content_types.sql | 2 + ccm-cms/src/WEB-INF/basetypes/Address.xml | 29 ++ ccm-cms/src/WEB-INF/basetypes/Article.xml | 15 + ccm-cms/src/WEB-INF/basetypes/Contact.xml | 29 ++ ccm-cms/src/WEB-INF/basetypes/Person.xml | 29 ++ .../WEB-INF/resources/cms-item-adapters.xml | 428 +++++++++--------- .../src/com/arsdigita/cms/ContentItem.java | 22 +- .../src/com/arsdigita/cms/ContentType.java | 286 ++++++++++-- .../basetypes/ui/AddressPropertiesStep.java | 4 +- .../ui/ContactAddressPropertiesStep.java | 10 +- .../ui/ContactAttachAddressPropertyForm.java | 2 +- .../ui/ContactEditAddressPropertyForm.java | 125 ++--- .../ui/ContactEditPersonPropertyForm.java | 106 ++--- .../basetypes/ui/ContactPropertiesStep.java | 4 +- .../AbstractContentTypeLoader.java | 137 ++++-- ccm-cms/src/com/arsdigita/cms/enterprise.init | 4 + .../cms/ui/ItemSearchFolderBrowser.java | 311 +++++++------ .../arsdigita/cms/ui/ItemSearchParameter.java | 10 +- .../arsdigita/cms/ui/ItemSearchWidget.java | 160 +++---- 20 files changed, 1067 insertions(+), 664 deletions(-) create mode 100644 ccm-cms/src/WEB-INF/basetypes/Address.xml create mode 100644 ccm-cms/src/WEB-INF/basetypes/Article.xml create mode 100644 ccm-cms/src/WEB-INF/basetypes/Contact.xml create mode 100644 ccm-cms/src/WEB-INF/basetypes/Person.xml diff --git a/ccm-cms/pdl/com/arsdigita/content-section/ContentType.pdl b/ccm-cms/pdl/com/arsdigita/content-section/ContentType.pdl index c104a00eb..8a771c4c0 100755 --- a/ccm-cms/pdl/com/arsdigita/content-section/ContentType.pdl +++ b/ccm-cms/pdl/com/arsdigita/content-section/ContentType.pdl @@ -27,6 +27,11 @@ object type ContentType extends ACSObject { String[1..1] label = content_types.label VARCHAR(1000); String[0..1] description = content_types.description VARCHAR(4000); String[0..1] className = content_types.classname VARCHAR(200); + // Quasimodo: Store the information about ancenstors and siblings, so we + // can make use of extending content types + String[0..1] ancestors = content_types.ancestors VARCHAR(2000); + String[0..1] siblings = content_types.siblings VARCHAR(2000); + Boolean[1..1] isInternal = content_types.is_internal CHAR(1); BigDecimal[0..1] itemFormID = content_types.item_form_id INTEGER; AuthoringKit[0..1] authoringKit = join content_types.type_id @@ -59,7 +64,7 @@ association { do { select t.type_id, t.object_type, t.label, t.description, t.classname, - t.is_internal, t.item_form_id + t.ancestors, t.siblings, t.is_internal, t.item_form_id from content_types t, content_section_type_map m, authoring_kits a where @@ -73,6 +78,8 @@ association { creatableContentTypes.label = t.label; creatableContentTypes.description = t.description; creatableContentTypes.className = t.classname; + creatableContentTypes.ancestors = t.ancestors; + creatableContentTypes.siblings = t.siblings; creatableContentTypes.isInternal = t.is_internal; creatableContentTypes.itemFormID = t.item_form_id; } @@ -105,7 +112,7 @@ association { do { select t.type_id, t.object_type, t.label, t.description, t.classname, - t.is_internal, t.item_form_id + t.ancestors, t.siblings, t.is_internal, t.item_form_id from content_types t where @@ -119,6 +126,8 @@ association { notAssociatedContentTypes.label = t.label; notAssociatedContentTypes.description = t.description; notAssociatedContentTypes.className = t.classname; + notAssociatedContentTypes.ancestors = t.ancestors; + notAssociatedContentTypes.siblings = t.siblings; notAssociatedContentTypes.isInternal = t.is_internal; notAssociatedContentTypes.itemFormID = t.item_form_id; } @@ -147,7 +156,8 @@ query registeredContentTypes { do { select t.type_id, t.object_type, t.label, - t.description, t.classname, t.is_internal, t.item_form_id + t.description, t.classname, t.ancestors, t.siblings, + t.is_internal, t.item_form_id from content_types t where t.is_internal = '0' and exists (select 1 from content_section_type_map @@ -158,6 +168,8 @@ query registeredContentTypes { type.label = t.label; type.description = t.description; type.className = t.classname; + type.ancestors = t.ancestors; + type.siblings = t.siblings; type.isInternal = t.is_internal; type.itemFormID = t.item_form_id; } diff --git a/ccm-cms/sql/ccm-cms/default/content-section/table-content_types.sql b/ccm-cms/sql/ccm-cms/default/content-section/table-content_types.sql index 1d306f0c4..2bbc3edd4 100755 --- a/ccm-cms/sql/ccm-cms/default/content-section/table-content_types.sql +++ b/ccm-cms/sql/ccm-cms/default/content-section/table-content_types.sql @@ -29,6 +29,8 @@ create table content_types ( label varchar(1000) not null, description varchar(4000), classname varchar(200), + ancestors varchar(2000), + siblings varchar(2000), is_internal char(1) default '0' not null constraint content_types_is_internal_ck check ( is_internal in ('0', '1') ), diff --git a/ccm-cms/src/WEB-INF/basetypes/Address.xml b/ccm-cms/src/WEB-INF/basetypes/Address.xml new file mode 100644 index 000000000..6f7a301f0 --- /dev/null +++ b/ccm-cms/src/WEB-INF/basetypes/Address.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + diff --git a/ccm-cms/src/WEB-INF/basetypes/Article.xml b/ccm-cms/src/WEB-INF/basetypes/Article.xml new file mode 100644 index 000000000..f84a382eb --- /dev/null +++ b/ccm-cms/src/WEB-INF/basetypes/Article.xml @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/ccm-cms/src/WEB-INF/basetypes/Contact.xml b/ccm-cms/src/WEB-INF/basetypes/Contact.xml new file mode 100644 index 000000000..8467b8a66 --- /dev/null +++ b/ccm-cms/src/WEB-INF/basetypes/Contact.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + diff --git a/ccm-cms/src/WEB-INF/basetypes/Person.xml b/ccm-cms/src/WEB-INF/basetypes/Person.xml new file mode 100644 index 000000000..d63c27553 --- /dev/null +++ b/ccm-cms/src/WEB-INF/basetypes/Person.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + diff --git a/ccm-cms/src/WEB-INF/resources/cms-item-adapters.xml b/ccm-cms/src/WEB-INF/resources/cms-item-adapters.xml index 77c93d0d6..1a3920aeb 100755 --- a/ccm-cms/src/WEB-INF/resources/cms-item-adapters.xml +++ b/ccm-cms/src/WEB-INF/resources/cms-item-adapters.xml @@ -1,235 +1,235 @@ - - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ccm-cms/src/com/arsdigita/cms/ContentItem.java b/ccm-cms/src/com/arsdigita/cms/ContentItem.java index 750dc4aea..6f0e486c3 100755 --- a/ccm-cms/src/com/arsdigita/cms/ContentItem.java +++ b/ccm-cms/src/com/arsdigita/cms/ContentItem.java @@ -387,7 +387,7 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { * override this method to return the correct value */ public String getBaseDataObjectType() { - return BASE_DATA_OBJECT_TYPE; + return this.BASE_DATA_OBJECT_TYPE; } /** @@ -553,6 +553,18 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { m_reporter.mutated("contentType"); } + public boolean isContentType(ContentType type) { + + try { + // Try to cast this contentItem to the desired content type + // This will succeed if this ci is of the type or a subclass + Class.forName(type.getClassName()).cast(this); + return true; + } catch (Exception ex) { + return false; + } + } + /** * Returns the content section to which this item belongs. * Fetches the denormalized content section of an item. If one is @@ -684,14 +696,6 @@ public class ContentItem extends VersionedACSObject implements CustomCopy { } } - //add filter for ancestor check - int iLength; - if (includeSelf) { - iLength = ids.length(); - } else { - iLength = ids.length() - 1; - } - //add list of ancestors split by "/" character ArrayList ancestors = new ArrayList(); int iIndex = 0; diff --git a/ccm-cms/src/com/arsdigita/cms/ContentType.java b/ccm-cms/src/com/arsdigita/cms/ContentType.java index 209eed469..ffaeb06ee 100755 --- a/ccm-cms/src/com/arsdigita/cms/ContentType.java +++ b/ccm-cms/src/com/arsdigita/cms/ContentType.java @@ -57,16 +57,17 @@ import java.net.MalformedURLException; public class ContentType extends ACSObject { public static final String BASE_DATA_OBJECT_TYPE = - "com.arsdigita.cms.ContentType"; - - public static final String OBJECT_TYPE = "associatedObjectType"; - public static final String LABEL = "label"; - public static final String DESCRIPTION = "description"; - public static final String CLASSNAME = "className"; - public static final String IS_INTERNAL = "isInternal"; - public static final String AUTHORING_KIT = "authoringKit"; - public static final String ITEM_FORM_ID = "itemFormID"; - public static final String ITEM_FORM = "itemForm"; + "com.arsdigita.cms.ContentType"; + public static final String OBJECT_TYPE = "associatedObjectType"; + public static final String LABEL = "label"; + public static final String DESCRIPTION = "description"; + public static final String CLASSNAME = "className"; + public static final String IS_INTERNAL = "isInternal"; + public static final String AUTHORING_KIT = "authoringKit"; + public static final String ITEM_FORM_ID = "itemFormID"; + public static final String ITEM_FORM = "itemForm"; + public static final String ANCESTORS = "ancestors"; + public static final String SIBLINGS = "siblings"; /** * Default constructor. This creates a new folder. @@ -112,12 +113,14 @@ public class ContentType extends ACSObject { * @return the base PDL object type for this item. Child classes should * override this method to return the correct value */ + @Override public String getBaseDataObjectType() { return BASE_DATA_OBJECT_TYPE; } + @Override protected void beforeSave() { - if ( isInternal() == null ) { + if (isInternal() == null) { setInternal(false); } super.beforeSave(); @@ -144,7 +147,6 @@ public class ContentType extends ACSObject { set(OBJECT_TYPE, objType); } - /** * Fetches the label for the content type. * @@ -229,7 +231,7 @@ public class ContentType extends ACSObject { * false otherwise */ public void setInternal(boolean isInternal) { - set(IS_INTERNAL, ( isInternal ? Boolean.TRUE : Boolean.FALSE )); + set(IS_INTERNAL, (isInternal ? Boolean.TRUE : Boolean.FALSE)); } /** @@ -265,16 +267,16 @@ public class ContentType extends ACSObject { */ public AuthoringKit createAuthoringKit(String createComponent) { - if ( getAuthoringKit() == null ) { + if (getAuthoringKit() == null) { AuthoringKit kit = new AuthoringKit(); kit.setContentType(this); - if ( createComponent != null ) { + if (createComponent != null) { kit.setCreateComponent(createComponent); } return kit; } else { throw new RuntimeException( - "An AuthorigKit exists for this ContentType."); + "An AuthorigKit exists for this ContentType."); } } @@ -317,12 +319,132 @@ public class ContentType extends ACSObject { } + /** + * Add an ancestor to the list of siblings, if not already in the list + * @param newAncestor ID of the ancestor to add + */ + public void addAncestor(BigDecimal newAncestor) { + // Get the list of siblings from db + String ancestors = (String) get(ANCESTORS); + + // Only add if the newSibling in not yet in the list + if (ancestors == null) { + ancestors = newAncestor.toString(); + } else if (!ancestors.contains(newAncestor.toString())) { + if (ancestors.length() == 0) { + // First entry in list + ancestors = newAncestor.toString(); + } else { + // Additional entry in the list + ancestors += "/" + newAncestor.toString(); + } + } + + // Write new data back to db + set(ANCESTORS, ancestors); + } + + /** + * Remove an ancestor id from the list of siblings + * @param ancestor ID to be removed + */ + public void delAncestor(BigDecimal ancestor) { + // Get the list of siblings from db + String ancestors = (String) get(ANCESTORS); + + // Only try to remove from a non-empty string + if (ancestors != null && ancestors.length() > 0) { + + // Remove ancestor ID from list + ancestors.replace(ancestor.toString(), ""); + // Delete the additional slash + ancestors.replace("//", "/"); + + // If the list only contains a single slash, + // we have just removed the last list entry, so the list is empty + if (ancestors.equals("/")) { + ancestors = ""; + } + } + + // Write new data back to db + set(ANCESTORS, ancestors); + } + + /** + * Get the list of ancestors + * @return + */ + public String getAncestors() { + return (String) get(ANCESTORS); + } + + /** + * Add a sibling to the list of siblings, if not already in list + * @param newSibling ID of the sibling to add + */ + public void addSiblings(BigDecimal newSibling) { + + // Get the list of siblings from db + String siblings = (String) get(SIBLINGS); + + // Only add if the newSibling in not yet in the list + if (siblings == null) { + siblings = newSibling.toString(); + } else if (!siblings.contains(newSibling.toString())) { + + if (siblings.length() == 0) { + // First entry in list + siblings = newSibling.toString(); + } else { + // Additional entry in the list + siblings += "/" + newSibling.toString(); + } + } + + // Write new data back to db + set(SIBLINGS, siblings); + } + + /** + * Get the list of siblings + * @return + */ + public String getSiblings() { + return (String) get(SIBLINGS); + } + + /** + * Remove a sibling from the list of siblings + * @param sibling ID to be removed + */ + public void delSiblings(BigDecimal sibling) { + // Get the list of siblings from db + String siblings = (String) get(SIBLINGS); + + // Only try to remove from a non-empty string + if (siblings != null && siblings.length() > 0) { + + // Remove ancestor ID from list + siblings.replace(sibling.toString(), ""); + // Delete the additional slash + siblings.replace("//", "/"); + + // If the list only contains a single slash, + // we have just removed the last list entry, so the list is empty + if (siblings.equals("/")) { + siblings = ""; + } + } + + // Write new data back to db + set(SIBLINGS, siblings); + } ////////////////////////////////////// // // Fetching/Finding content types. // - /** * Find the content type with the associated with the object type. * @@ -330,20 +452,40 @@ public class ContentType extends ACSObject { * @return The content type associated with the object type */ public static ContentType findByAssociatedObjectType(String objType) - throws DataObjectNotFoundException { + throws DataObjectNotFoundException { ContentTypeCollection types = getAllContentTypes(); types.addFilter("associatedObjectType = :type").set("type", objType); - if ( types.next() ) { + + + + + if (types.next()) { ContentType type = types.getContentType(); types.close(); + + + + return type; + + + + } else { // no match types.close(); + + + + throw new DataObjectNotFoundException( - "No matching content type for object type " + objType); + "No matching content type for object type " + objType); + + + + } } @@ -355,6 +497,10 @@ public class ContentType extends ACSObject { */ public static ContentTypeCollection getAllContentTypes() { return getAllContentTypes(true); + + + + } /** @@ -364,6 +510,10 @@ public class ContentType extends ACSObject { */ public static ContentTypeCollection getUserDefinedContentTypes() { return getAllContentTypes(false); + + + + } /** @@ -371,13 +521,24 @@ public class ContentType extends ACSObject { * content types. If false, only fetch all user-defined content types. */ private static ContentTypeCollection getAllContentTypes(boolean internal) { - DataCollection da = SessionManager.getSession().retrieve - (BASE_DATA_OBJECT_TYPE); + DataCollection da = SessionManager.getSession().retrieve(BASE_DATA_OBJECT_TYPE); ContentTypeCollection types = new ContentTypeCollection(da); - if ( !internal ) { + + + + + if (!internal) { types.addFilter("isInternal = '0'"); + + + + } return types; + + + + } /** @@ -390,13 +551,18 @@ public class ContentType extends ACSObject { final String query = "com.arsdigita.cms.registeredContentTypes"; DataQuery dq = SessionManager.getSession().retrieveQuery(query); DataCollection dc = new DataQueryDataCollectionAdapter(dq, "type"); + + + + return new ContentTypeCollection(dc); + + + + } - - private static List s_xsl = new ArrayList(); - - + /** * NB this interface is liable to change. * @@ -405,8 +571,12 @@ public class ContentType extends ACSObject { * @param path the path relative to the server root */ public static void registerXSLFile(ContentType type, - String path) { + String path) { s_xsl.add(new XSLEntry(type, path)); + + + + } /** @@ -417,19 +587,40 @@ public class ContentType extends ACSObject { * @param path the path relative to the server root */ public static void unregisterXSLFile(ContentType type, - String path) { + String path) { s_xsl.remove(new XSLEntry(type, path)); + + + + } - + /** * Gets an iterator of java.net.URL objects for * all registered XSL files */ public static Iterator getXSLFileURLs() { return new EntryIterator(s_xsl.iterator()); + + + + + + + + + + + + + + + + } private static class EntryIterator implements Iterator { + private Iterator m_inner; public EntryIterator(Iterator inner) { @@ -439,53 +630,56 @@ public class ContentType extends ACSObject { public boolean hasNext() { return m_inner.hasNext(); } - + public Object next() { - XSLEntry entry = (XSLEntry)m_inner.next(); + XSLEntry entry = (XSLEntry) m_inner.next(); String path = entry.getPath(); - + try { return new URL(Web.getConfig().getDefaultScheme(), - Web.getConfig().getHost().getName(), - Web.getConfig().getHost().getPort(), - path); + Web.getConfig().getHost().getName(), + Web.getConfig().getHost().getPort(), + path); } catch (MalformedURLException ex) { throw new UncheckedWrapperException("path malformed" + path, ex); } } - + public void remove() { m_inner.remove(); } } private static class XSLEntry { + private ContentType m_type; private String m_path; - + public XSLEntry(ContentType type, - String path) { + String path) { m_type = type; m_path = path; } - - public ContentType getType(){ + + public ContentType getType() { return m_type; } public String getPath() { return m_path; } - + + @Override public boolean equals(Object o) { if (!(o instanceof XSLEntry)) { return false; } - XSLEntry e = (XSLEntry)o; - return m_path.equals(e.m_path) && - m_type.equals(e.m_type); + XSLEntry e = (XSLEntry) o; + return m_path.equals(e.m_path) + && m_type.equals(e.m_type); } - + + @Override public int hashCode() { return m_path.hashCode() + m_type.hashCode(); } diff --git a/ccm-cms/src/com/arsdigita/cms/basetypes/ui/AddressPropertiesStep.java b/ccm-cms/src/com/arsdigita/cms/basetypes/ui/AddressPropertiesStep.java index 3061a08d6..64cc0f8cd 100644 --- a/ccm-cms/src/com/arsdigita/cms/basetypes/ui/AddressPropertiesStep.java +++ b/ccm-cms/src/com/arsdigita/cms/basetypes/ui/AddressPropertiesStep.java @@ -58,8 +58,8 @@ public class AddressPropertiesStep extends SimpleEditStep { public static Component getAddressPropertySheet(ItemSelectionModel itemModel) { DomainObjectPropertySheet sheet = new DomainObjectPropertySheet(itemModel); - sheet.add((String) BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.name").localize(), Address.NAME); - sheet.add((String) BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.title").localize(), Address.TITLE); + sheet.add((String) GlobalizationUtil.globalize("cms.contenttypes.ui.name").localize(), Address.NAME); + sheet.add((String) GlobalizationUtil.globalize("cms.contenttypes.ui.title").localize(), Address.TITLE); sheet.add((String) BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.address.address").localize(), Address.ADDRESS); sheet.add((String) BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.address.postal_code").localize(), Address.POSTAL_CODE); sheet.add((String) BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.address.city").localize(), Address.CITY); diff --git a/ccm-cms/src/com/arsdigita/cms/basetypes/ui/ContactAddressPropertiesStep.java b/ccm-cms/src/com/arsdigita/cms/basetypes/ui/ContactAddressPropertiesStep.java index 6c7421928..94cad95e3 100644 --- a/ccm-cms/src/com/arsdigita/cms/basetypes/ui/ContactAddressPropertiesStep.java +++ b/ccm-cms/src/com/arsdigita/cms/basetypes/ui/ContactAddressPropertiesStep.java @@ -73,17 +73,17 @@ public class ContactAddressPropertiesStep extends SimpleEditStep { DomainObjectPropertySheet sheet = new DomainObjectPropertySheet(itemModel); - sheet.add((String) BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.baseAddress.address").localize(), "address." + Address.ADDRESS); + sheet.add((String) BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.address.address").localize(), "address." + Address.ADDRESS); if (!Contact.getConfig().getHideAddressPostalCode()) { - sheet.add((String) BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.baseAddress.postal_code").localize(), "address." + Address.POSTAL_CODE); + sheet.add((String) BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.address.postal_code").localize(), "address." + Address.POSTAL_CODE); } - sheet.add((String) BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.baseAddress.city").localize(), "address." + Address.CITY); + sheet.add((String) BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.address.city").localize(), "address." + Address.CITY); if (!Contact.getConfig().getHideAddressState()) { - sheet.add((String) BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.baseAddress.state").localize(), "address." + Address.STATE); + sheet.add((String) BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.address.state").localize(), "address." + Address.STATE); } if (!Contact.getConfig().getHideAddressCountry()) { - sheet.add((String) BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.baseAddress.iso_country_code").localize(), + sheet.add((String) BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.address.iso_country_code").localize(), "address." + Address.ISO_COUNTRY_CODE, new DomainObjectPropertySheet.AttributeFormatter() { diff --git a/ccm-cms/src/com/arsdigita/cms/basetypes/ui/ContactAttachAddressPropertyForm.java b/ccm-cms/src/com/arsdigita/cms/basetypes/ui/ContactAttachAddressPropertyForm.java index a06b19d6d..4e66a130d 100644 --- a/ccm-cms/src/com/arsdigita/cms/basetypes/ui/ContactAttachAddressPropertyForm.java +++ b/ccm-cms/src/com/arsdigita/cms/basetypes/ui/ContactAttachAddressPropertyForm.java @@ -79,7 +79,7 @@ public class ContactAttachAddressPropertyForm extends BasicPageForm implements F @Override public void addWidgets() { add(new Label((String)BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.contact.select_address").localize())); - this.m_itemSearch = new ItemSearchWidget(ITEM_SEARCH, ContentType.findByAssociatedObjectType("com.arsdigita.cms.basetypes.BaseAddress")); + this.m_itemSearch = new ItemSearchWidget(ITEM_SEARCH, ContentType.findByAssociatedObjectType("com.arsdigita.cms.basetypes.Address")); add(this.m_itemSearch); } diff --git a/ccm-cms/src/com/arsdigita/cms/basetypes/ui/ContactEditAddressPropertyForm.java b/ccm-cms/src/com/arsdigita/cms/basetypes/ui/ContactEditAddressPropertyForm.java index 487697f54..f25c3e305 100644 --- a/ccm-cms/src/com/arsdigita/cms/basetypes/ui/ContactEditAddressPropertyForm.java +++ b/ccm-cms/src/com/arsdigita/cms/basetypes/ui/ContactEditAddressPropertyForm.java @@ -6,7 +6,6 @@ * To change this template, choose Tools | Template Manager * and open the template in the editor. */ - package com.arsdigita.cms.basetypes.ui; import com.arsdigita.bebop.FormData; @@ -43,17 +42,14 @@ import org.apache.log4j.Logger; * @author quasi */ public class ContactEditAddressPropertyForm extends BasicPageForm implements FormProcessListener, FormInitListener, FormSubmissionListener { - + private static final Logger logger = Logger.getLogger(ContactPropertyForm.class); - private ContactAddressPropertiesStep m_step; - public static final String ADDRESS = Address.ADDRESS; public static final String POSTAL_CODE = Address.POSTAL_CODE; public static final String CITY = Address.CITY; public static final String STATE = Address.STATE; public static final String ISO_COUNTRY_CODE = Address.ISO_COUNTRY_CODE; - /** * ID of the form */ @@ -64,7 +60,7 @@ public class ContactEditAddressPropertyForm extends BasicPageForm implements For * * @param itemModel */ - public ContactEditAddressPropertyForm(ItemSelectionModel itemModel) { + public ContactEditAddressPropertyForm(ItemSelectionModel itemModel) { this(itemModel, null); } @@ -82,61 +78,61 @@ public class ContactEditAddressPropertyForm extends BasicPageForm implements For @Override public void addWidgets() { - add(new Label((String)BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.baseAddress.address").localize())); - ParameterModel addressParam = new StringParameter(ADDRESS); - addressParam.addParameterListener( new NotNullValidationListener( ) ); - addressParam.addParameterListener( new StringInRangeValidationListener(0, 1000) ); - TextArea address = new TextArea(addressParam); + add(new Label((String) BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.baseAddress.address").localize())); + ParameterModel addressParam = new StringParameter(ADDRESS); + addressParam.addParameterListener(new NotNullValidationListener()); + addressParam.addParameterListener(new StringInRangeValidationListener(0, 1000)); + TextArea address = new TextArea(addressParam); address.setRows(5); address.setCols(30); - add(address); + add(address); - if(!Contact.getConfig().getHideAddressPostalCode()) { - add(new Label((String)BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.baseAddress.postal_code").localize())); + if (!Contact.getConfig().getHideAddressPostalCode()) { + add(new Label((String) BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.baseAddress.postal_code").localize())); ParameterModel postalCodeParam = new StringParameter(POSTAL_CODE); TextField postalCode = new TextField(postalCodeParam); /* XXX NumberListener ?*/ add(postalCode); } - add(new Label((String)BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.baseAddress.city").localize())); - ParameterModel cityParam = new StringParameter(CITY); - TextField city = new TextField(cityParam); - add(city); + add(new Label((String) BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.baseAddress.city").localize())); + ParameterModel cityParam = new StringParameter(CITY); + TextField city = new TextField(cityParam); + add(city); - if(!Contact.getConfig().getHideAddressState()) { - add(new Label((String)BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.baseAddress.state").localize())); + if (!Contact.getConfig().getHideAddressState()) { + add(new Label((String) BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.baseAddress.state").localize())); ParameterModel stateParam = new StringParameter(STATE); TextField state = new TextField(stateParam); add(state); } - + if (!Contact.getConfig().getHideAddressCountry()) { - add(new Label((String)BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.baseAddress.iso_country_code").localize())); + add(new Label((String) BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.baseAddress.iso_country_code").localize())); ParameterModel countryParam = new StringParameter(ISO_COUNTRY_CODE); countryParam.addParameterListener(new StringInRangeValidationListener(0, 2)); - + SingleSelect country = new SingleSelect(countryParam); - country.addOption(new Option("", new Label((String)BasetypesGlobalizationUtil.globalize("cms.ui.select_one" ).localize()))); + country.addOption(new Option("", new Label((String) BasetypesGlobalizationUtil.globalize("cms.ui.select_one").localize()))); Iterator countries = Address.getSortedListOfCountries(null).entrySet().iterator(); - while(countries.hasNext()) { - Map.Entry elem = (Map.Entry)countries.next(); + while (countries.hasNext()) { + Map.Entry elem = (Map.Entry) countries.next(); country.addOption(new Option(elem.getValue().toString(), elem.getKey().toString())); } - + country.addValidationListener( - new ParameterListener() { - public void validate(ParameterEvent e) throws FormProcessException { - ParameterData data = e.getParameterData(); - String isoCode = (String) data.getValue() ; - if (isoCode == null || isoCode.length() == 0) { - data.addError((String)BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.address.error_iso_country").localize()); + new ParameterListener() { + + public void validate(ParameterEvent e) throws FormProcessException { + ParameterData data = e.getParameterData(); + String isoCode = (String) data.getValue(); + if (isoCode == null || isoCode.length() == 0) { + data.addError((String) BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.address.error_iso_country").localize()); + } } - } - } - ); + }); add(country); } @@ -144,46 +140,51 @@ public class ContactEditAddressPropertyForm extends BasicPageForm implements For } public void init(FormSectionEvent fse) { - FormData data = fse.getFormData(); + FormData data = fse.getFormData(); PageState state = fse.getPageState(); - Contact contact = (Contact)getItemSelectionModel().getSelectedObject(state); - - if(contact.getAddress() != null) { + Contact contact = (Contact) getItemSelectionModel().getSelectedObject(state); + + if (contact.getAddress() != null) { data.put(ADDRESS, contact.getAddress().getAddress()); data.put(POSTAL_CODE, contact.getAddress().getPostalCode()); data.put(CITY, contact.getAddress().getCity()); data.put(STATE, contact.getAddress().getState()); - if(!Address.getConfig().getHideCountryCodeSelection()) { + if (!Address.getConfig().getHideCountryCodeSelection()) { data.put(ISO_COUNTRY_CODE, contact.getAddress().getIsoCountryCode()); } } } public void submitted(FormSectionEvent fse) { - if (m_step != null && - getSaveCancelSection().getCancelButton().isSelected(fse.getPageState())) { - m_step.cancelStreamlinedCreation(fse.getPageState()); - } + if (m_step != null + && getSaveCancelSection().getCancelButton().isSelected(fse.getPageState())) { + m_step.cancelStreamlinedCreation(fse.getPageState()); + } } public void process(FormSectionEvent fse) { - FormData data = fse.getFormData(); + FormData data = fse.getFormData(); PageState state = fse.getPageState(); - Contact contact = (Contact)getItemSelectionModel().getSelectedObject(state); + Contact contact = (Contact) getItemSelectionModel().getSelectedObject(state); - if (contact.getAddress() != null && - getSaveCancelSection().getSaveButton().isSelected(fse.getPageState())) { - contact.getAddress().setAddress((String)data.get(ADDRESS)); - contact.getAddress().setPostalCode((String)data.get(POSTAL_CODE)); - contact.getAddress().setCity((String)data.get(CITY)); - contact.getAddress().setState((String)data.get(STATE)); - contact.getAddress().setIsoCountryCode((String)data.get(ISO_COUNTRY_CODE)); - - contact.getAddress().save(); - } - - if (m_step != null) { - m_step.maybeForwardToNextStep(fse.getPageState()); - } + if (getSaveCancelSection().getSaveButton().isSelected(fse.getPageState())) { + if (contact.getAddress() == null) { + contact.setAddress(new Address()); + contact.getAddress().setName("Address for " + contact.getName() + "(" + contact.getID() + ")"); + contact.getAddress().setTitle("Address for " + contact.getName() + "(" + contact.getID() + ")"); + } + + contact.getAddress().setAddress((String) data.get(ADDRESS)); + contact.getAddress().setPostalCode((String) data.get(POSTAL_CODE)); + contact.getAddress().setCity((String) data.get(CITY)); + contact.getAddress().setState((String) data.get(STATE)); + contact.getAddress().setIsoCountryCode((String) data.get(ISO_COUNTRY_CODE)); + + contact.getAddress().save(); + } + + if (m_step != null) { + m_step.maybeForwardToNextStep(fse.getPageState()); + } } -} \ No newline at end of file +} diff --git a/ccm-cms/src/com/arsdigita/cms/basetypes/ui/ContactEditPersonPropertyForm.java b/ccm-cms/src/com/arsdigita/cms/basetypes/ui/ContactEditPersonPropertyForm.java index 8afee36d3..81bad7f3a 100644 --- a/ccm-cms/src/com/arsdigita/cms/basetypes/ui/ContactEditPersonPropertyForm.java +++ b/ccm-cms/src/com/arsdigita/cms/basetypes/ui/ContactEditPersonPropertyForm.java @@ -6,7 +6,6 @@ * To change this template, choose Tools | Template Manager * and open the template in the editor. */ - package com.arsdigita.cms.basetypes.ui; import com.arsdigita.bebop.FormData; @@ -34,16 +33,13 @@ import org.apache.log4j.Logger; * @author quasi */ public class ContactEditPersonPropertyForm extends BasicPageForm implements FormProcessListener, FormInitListener, FormSubmissionListener { - + private static final Logger logger = Logger.getLogger(ContactPropertyForm.class); - private ContactPersonPropertiesStep m_step; - public static final String SURNAME = Person.SURNAME; public static final String GIVENNAME = Person.GIVENNAME; public static final String TITLEPRE = Person.TITLEPRE; public static final String TITLEPOST = Person.TITLEPOST; - /** * ID of the form */ @@ -54,7 +50,7 @@ public class ContactEditPersonPropertyForm extends BasicPageForm implements Form * * @param itemModel */ - public ContactEditPersonPropertyForm(ItemSelectionModel itemModel) { + public ContactEditPersonPropertyForm(ItemSelectionModel itemModel) { this(itemModel, null); } @@ -72,39 +68,39 @@ public class ContactEditPersonPropertyForm extends BasicPageForm implements Form @Override public void addWidgets() { - add(new Label((String)BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.person.surname").localize())); - ParameterModel surnameParam = new StringParameter(SURNAME); - surnameParam.addParameterListener( new NotNullValidationListener( ) ); - surnameParam.addParameterListener( new StringInRangeValidationListener(0, 1000) ); - TextField surname = new TextField(surnameParam); - add(surname); + add(new Label((String) BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.person.surname").localize())); + ParameterModel surnameParam = new StringParameter(SURNAME); + surnameParam.addParameterListener(new NotNullValidationListener()); + surnameParam.addParameterListener(new StringInRangeValidationListener(0, 1000)); + TextField surname = new TextField(surnameParam); + add(surname); - add(new Label((String)BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.person.givenname").localize())); - ParameterModel givennameParam = new StringParameter(GIVENNAME); - givennameParam.addParameterListener( new NotNullValidationListener( ) ); - givennameParam.addParameterListener( new StringInRangeValidationListener(0, 1000) ); - TextField givenname = new TextField(givennameParam); - add(givenname); + add(new Label((String) BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.person.givenname").localize())); + ParameterModel givennameParam = new StringParameter(GIVENNAME); + givennameParam.addParameterListener(new NotNullValidationListener()); + givennameParam.addParameterListener(new StringInRangeValidationListener(0, 1000)); + TextField givenname = new TextField(givennameParam); + add(givenname); - add(new Label((String)BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.person.titlepre").localize())); - ParameterModel titlepreParam = new StringParameter(TITLEPRE); - titlepreParam.addParameterListener( new StringInRangeValidationListener(0, 1000) ); - TextField titlepre = new TextField(titlepreParam); - add(titlepre); + add(new Label((String) BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.person.titlepre").localize())); + ParameterModel titlepreParam = new StringParameter(TITLEPRE); + titlepreParam.addParameterListener(new StringInRangeValidationListener(0, 1000)); + TextField titlepre = new TextField(titlepreParam); + add(titlepre); - add(new Label((String)BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.person.titlepost").localize())); - ParameterModel titlepostParam = new StringParameter(TITLEPOST); - titlepostParam.addParameterListener( new StringInRangeValidationListener(0, 1000) ); - TextField titlepost = new TextField(titlepostParam); - add(titlepost); + add(new Label((String) BasetypesGlobalizationUtil.globalize("cms.basetypes.ui.person.titlepost").localize())); + ParameterModel titlepostParam = new StringParameter(TITLEPOST); + titlepostParam.addParameterListener(new StringInRangeValidationListener(0, 1000)); + TextField titlepost = new TextField(titlepostParam); + add(titlepost); } public void init(FormSectionEvent fse) { - FormData data = fse.getFormData(); + FormData data = fse.getFormData(); PageState state = fse.getPageState(); - Contact contact = (Contact)getItemSelectionModel().getSelectedObject(state); - - if(contact.getPerson() != null) { + Contact contact = (Contact) getItemSelectionModel().getSelectedObject(state); + + if (contact.getPerson() != null) { data.put(SURNAME, contact.getPerson().getSurname()); data.put(GIVENNAME, contact.getPerson().getGivenName()); data.put(TITLEPRE, contact.getPerson().getTitlePre()); @@ -113,29 +109,35 @@ public class ContactEditPersonPropertyForm extends BasicPageForm implements Form } public void submitted(FormSectionEvent fse) { - if (m_step != null && - getSaveCancelSection().getCancelButton().isSelected(fse.getPageState())) { - m_step.cancelStreamlinedCreation(fse.getPageState()); - } + if (m_step != null + && getSaveCancelSection().getCancelButton().isSelected(fse.getPageState())) { + m_step.cancelStreamlinedCreation(fse.getPageState()); + } } public void process(FormSectionEvent fse) { - FormData data = fse.getFormData(); + FormData data = fse.getFormData(); PageState state = fse.getPageState(); - Contact contact = (Contact)getItemSelectionModel().getSelectedObject(state); + Contact contact = (Contact) getItemSelectionModel().getSelectedObject(state); - if (contact.getPerson() != null && - getSaveCancelSection().getSaveButton().isSelected(fse.getPageState())) { - contact.getPerson().setSurname((String)data.get(SURNAME)); - contact.getPerson().setGivenName((String)data.get(GIVENNAME)); - contact.getPerson().setTitlePre((String)data.get(TITLEPRE)); - contact.getPerson().setTitlePost((String)data.get(TITLEPOST)); - - contact.getPerson().save(); - } - - if (m_step != null) { - m_step.maybeForwardToNextStep(fse.getPageState()); - } + if (getSaveCancelSection().getSaveButton().isSelected(fse.getPageState())) { + + if (contact.getPerson() == null) { + contact.setPerson(new Person()); + contact.getPerson().setName("Person for " + contact.getName() + "(" + contact.getID() + ")"); + contact.getPerson().setTitle("Person for " + contact.getName() + "(" + contact.getID() + ")"); + } + + contact.getPerson().setSurname((String) data.get(SURNAME)); + contact.getPerson().setGivenName((String) data.get(GIVENNAME)); + contact.getPerson().setTitlePre((String) data.get(TITLEPRE)); + contact.getPerson().setTitlePost((String) data.get(TITLEPOST)); + + contact.getPerson().save(); + } + + if (m_step != null) { + m_step.maybeForwardToNextStep(fse.getPageState()); + } } -} \ No newline at end of file +} diff --git a/ccm-cms/src/com/arsdigita/cms/basetypes/ui/ContactPropertiesStep.java b/ccm-cms/src/com/arsdigita/cms/basetypes/ui/ContactPropertiesStep.java index 94c16f3b3..e42a82025 100644 --- a/ccm-cms/src/com/arsdigita/cms/basetypes/ui/ContactPropertiesStep.java +++ b/ccm-cms/src/com/arsdigita/cms/basetypes/ui/ContactPropertiesStep.java @@ -101,8 +101,8 @@ public class ContactPropertiesStep extends SimpleEditStep { /* The DisplayComponent for the Basic Properties */ DomainObjectPropertySheet sheet = new DomainObjectPropertySheet(itemModel); - sheet.add(GlobalizationUtil.globalize("cms.basetypes.ui.name"), "name"); - sheet.add(GlobalizationUtil.globalize("cms.basetypes.ui.title"), "title"); + sheet.add(GlobalizationUtil.globalize("cms.contenttypes.ui.name"), "name"); + sheet.add(GlobalizationUtil.globalize("cms.contenttypes.ui.title"), "title"); if (!ContentSection.getConfig().getHideLaunchDate()) { sheet.add(GlobalizationUtil.globalize("cms.ui.authoring.page_launch_date"), ContentPage.LAUNCH_DATE, new DomainObjectPropertySheet.AttributeFormatter() { diff --git a/ccm-cms/src/com/arsdigita/cms/contenttypes/AbstractContentTypeLoader.java b/ccm-cms/src/com/arsdigita/cms/contenttypes/AbstractContentTypeLoader.java index c7bf0dda1..fd0832187 100755 --- a/ccm-cms/src/com/arsdigita/cms/contenttypes/AbstractContentTypeLoader.java +++ b/ccm-cms/src/com/arsdigita/cms/contenttypes/AbstractContentTypeLoader.java @@ -20,6 +20,7 @@ package com.arsdigita.cms.contenttypes; import com.arsdigita.cms.ContentSection; import com.arsdigita.cms.ContentType; +import com.arsdigita.cms.ContentTypeCollection; import com.arsdigita.cms.ContentTypeLifecycleDefinition; import com.arsdigita.cms.ContentTypeWorkflowTemplate; import com.arsdigita.cms.Template; @@ -44,10 +45,12 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.math.BigDecimal; import java.util.Date; import java.util.Iterator; import java.util.List; +import java.util.StringTokenizer; /** * This is the base loader that can be used by individual content types. @@ -57,11 +60,11 @@ import java.util.List; * @author Rafael H. Schloming <rhs@mit.edu> * @version $Revision: #754 $ $Date: 2005/09/02 $ $Author: sskracic $ **/ - public abstract class AbstractContentTypeLoader extends PackageLoader { public void run(final ScriptContext ctx) { new KernelExcursion() { + protected void excurse() { setEffectiveParty(Kernel.getSystemParty()); createTypes(ctx); @@ -81,12 +84,13 @@ public abstract class AbstractContentTypeLoader extends PackageLoader { DataCollection sections = ssn.retrieve(ContentSection.BASE_DATA_OBJECT_TYPE); while (sections.next()) { - ContentSection section = (ContentSection) - DomainObjectFactory.newInstance(sections.getDataObject()); - if ( !isLoadableInto(section) ) { continue; } + ContentSection section = (ContentSection) DomainObjectFactory.newInstance(sections.getDataObject()); + if (!isLoadableInto(section)) { + continue; + } LifecycleDefinitionCollection ldc = - section.getLifecycleDefinitions(); + section.getLifecycleDefinitions(); LifecycleDefinition ld = null; if (ldc.next()) { ld = ldc.getLifecycleDefinition(); @@ -100,9 +104,12 @@ public abstract class AbstractContentTypeLoader extends PackageLoader { tc.close(); } - for (Iterator it = types.iterator(); it.hasNext(); ) { + for (Iterator it = types.iterator(); it.hasNext();) { final ContentType type = (ContentType) it.next(); + // Save the ancestors for this content type + createPedigree(type); + section.addContentType(type); prepareSection(section, type, ld, wf); @@ -111,26 +118,26 @@ public abstract class AbstractContentTypeLoader extends PackageLoader { } protected void prepareSection(final ContentSection section, - final ContentType type, - final LifecycleDefinition ld, - final WorkflowTemplate wf) { - ContentTypeLifecycleDefinition.updateLifecycleDefinition - (section, type, ld); + final ContentType type, + final LifecycleDefinition ld, + final WorkflowTemplate wf) { + ContentTypeLifecycleDefinition.updateLifecycleDefinition(section, type, ld); - ContentTypeWorkflowTemplate.updateWorkflowTemplate - (section, type, wf); + ContentTypeWorkflowTemplate.updateWorkflowTemplate(section, type, wf); } protected abstract String[] getTypes(); private boolean isLoadableInto(ContentSection section) { - if ( section == null ) { throw new NullPointerException("section"); } + if (section == null) { + throw new NullPointerException("section"); + } - if ( getContentSections().size() > 0 ) { + if (getContentSections().size() > 0) { return getContentSections().contains(section.getName()); } else { return ContentSection.getConfig().getDefaultContentSection(). - equals(section.getName()); + equals(section.getName()); } } @@ -150,19 +157,18 @@ public abstract class AbstractContentTypeLoader extends PackageLoader { return java.util.Collections.EMPTY_LIST; } - /** * This provides an easy way to subtypes to register default * templates during the loading. When this is used, it should * be called by the loader class by overriding prepareSection */ protected Template setDefaultTemplate(final String name, - final String label, - final InputStream templateIs, - final ContentSection section, - final ContentType type, - final LifecycleDefinition ld, - final WorkflowTemplate wf) { + final String label, + final InputStream templateIs, + final ContentSection section, + final ContentType type, + final LifecycleDefinition ld, + final WorkflowTemplate wf) { final Template template = new Template(); template.setName(name); template.setLabel(label); @@ -170,12 +176,11 @@ public abstract class AbstractContentTypeLoader extends PackageLoader { template.setParent(section.getTemplatesFolder()); Assert.isTrue(templateIs != null, "Template not found"); - - final BufferedReader input = new BufferedReader - (new InputStreamReader(templateIs)); - + + final BufferedReader input = new BufferedReader(new InputStreamReader(templateIs)); + final StringBuffer body = new StringBuffer(); - + try { String line; @@ -184,16 +189,84 @@ public abstract class AbstractContentTypeLoader extends PackageLoader { body.append("\n"); } } catch (IOException ioe) { - throw new UncheckedWrapperException - ("Template cannot be read", ioe); + throw new UncheckedWrapperException("Template cannot be read", ioe); } template.setText(body.toString()); - TemplateManagerFactory.getInstance().addTemplate - (section, type, template, TemplateManager.PUBLIC_CONTEXT); + TemplateManagerFactory.getInstance().addTemplate(section, type, template, TemplateManager.PUBLIC_CONTEXT); template.publish(ld, new Date()); return template; } + + /** + * Generates the pedigree for this content type + * @param type The new content type + */ + private void createPedigree(ContentType type) { + + // The parent content type + ContentType parent = null; + + // Get all content types + ContentTypeCollection cts = ContentType.getAllContentTypes(); + + // This is a brute force method, but I can't come up with something + // better atm without changing either all Loader or the xml-files. + while (cts.next()) { + ContentType ct = cts.getContentType(); + + try { + Class.forName(type.getClassName()).asSubclass(Class.forName(ct.getClassName())); + } catch (Exception ex) { + // This cast is not valid so type is not a sublacss of ct + continue; + } + + // Save the current ct as possible parent if we haven't found any parent yet + // or if the current ancestor list is longer than that one from the possible + // parent earlier found + if (parent == null + || (parent.getAncestors() != null + && ct.getAncestors() != null + && parent.getAncestors().length() < ct.getAncestors().length())) { + parent = ct; + } + } + + // If there is a valid parent content type create the pedigree + if (parent != null && !parent.getClassName().equals(type.getClassName())) { + if (parent.getAncestors() != null) { + String parentAncestors = parent.getAncestors(); + + StringTokenizer strTok = new StringTokenizer(parentAncestors, "/"); + + // Add parent ancestors to this content types ancestor list + // Also while we iterate through the list, we also need to add + // this content type as sibling to all entries in the ancestor list + while (strTok.hasMoreElements()) { + + BigDecimal ctID = (BigDecimal) strTok.nextElement(); + + // Get the current content type + try { + ContentType ct = new ContentType(ctID); + ct.addSiblings(ctID); + } catch (Exception ex) { + // The db is broken. There is no content type for this ID + } + + // Add parent ancestor + type.addAncestor(ctID); + } + } + + // Add parent to ancestor list + type.addAncestor(parent.getID()); + + // Add this to parent siblings + parent.addSiblings(type.getID()); + } + } } diff --git a/ccm-cms/src/com/arsdigita/cms/enterprise.init b/ccm-cms/src/com/arsdigita/cms/enterprise.init index 883cf6af7..2e5547336 100755 --- a/ccm-cms/src/com/arsdigita/cms/enterprise.init +++ b/ccm-cms/src/com/arsdigita/cms/enterprise.init @@ -11,6 +11,10 @@ init com.arsdigita.cms.installer.Initializer { init com.arsdigita.cms.installer.xml.ContentTypeInitializer { contentTypes = { + "/WEB-INF/basetypes/Address.xml", + "/WEB-INF/basetypes/Article.xml", + "/WEB-INF/basetypes/Contact.xml", + "/WEB-INF/basetypes/Person.xml", "/WEB-INF/content-types/Template.xml" }; } diff --git a/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchFolderBrowser.java b/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchFolderBrowser.java index 571097cb2..294de21c5 100755 --- a/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchFolderBrowser.java +++ b/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchFolderBrowser.java @@ -18,7 +18,6 @@ */ package com.arsdigita.cms.ui; - import com.arsdigita.bebop.Bebop; import com.arsdigita.bebop.Component; import com.arsdigita.bebop.Label; @@ -52,10 +51,14 @@ import com.arsdigita.cms.dispatcher.Utilities; import com.arsdigita.cms.ui.folder.FolderManipulator; import com.arsdigita.cms.ui.folder.FolderSelectionModel; import com.arsdigita.globalization.GlobalizedMessage; +import com.arsdigita.persistence.CompoundFilter; +import com.arsdigita.persistence.FilterFactory; import com.arsdigita.util.Assert; import java.math.BigDecimal; - +import java.util.HashSet; +import java.util.Iterator; +import java.util.StringTokenizer; /** * Browse folders and items. If the user clicks on a folder, the folder @@ -67,42 +70,34 @@ import java.math.BigDecimal; */ public class ItemSearchFolderBrowser extends Table { - private static final org.apache.log4j.Logger s_log = - org.apache.log4j.Logger.getLogger(ItemSearchFolderBrowser.class); - + private static final org.apache.log4j.Logger s_log = + org.apache.log4j.Logger.getLogger(ItemSearchFolderBrowser.class); public static final int MAX_ROWS = 15; - private static GlobalizedMessage[] s_headers = { globalize("cms.ui.folder.name"), globalize("cms.ui.folder.title"), - globalize("cms.ui.folder.type") }; - + globalize("cms.ui.folder.type")}; private FolderSelectionModel m_currentFolder; - private TableActionListener m_folderChanger; - private TableActionListener m_deleter; - private TableActionListener m_indexChanger; - private TableColumn m_nameColumn; - private Paginator m_paginator; public ItemSearchFolderBrowser(FolderSelectionModel currentFolder) { - super((FolderTableModelBuilder)null, s_headers); + super((FolderTableModelBuilder) null, s_headers); FolderTableModelBuilder builder = new FolderTableModelBuilder(); - setModelBuilder( builder ); + setModelBuilder(builder); - m_paginator = new Paginator( builder, MAX_ROWS ); + m_paginator = new Paginator(builder, MAX_ROWS); m_currentFolder = currentFolder; setClassAttr("dataTable"); getHeader().setDefaultRenderer( - new com.arsdigita.cms.ui.util.DefaultTableCellRenderer()); + new com.arsdigita.cms.ui.util.DefaultTableCellRenderer()); m_nameColumn = getColumn(0); m_nameColumn.setCellRenderer(new NameCellRenderer()); @@ -111,60 +106,66 @@ public class ItemSearchFolderBrowser extends Table { setEmptyView(new Label(globalize("cms.ui.folder.no_items"))); - Assert.exists( m_currentFolder.getStateParameter() ); + Assert.exists(m_currentFolder.getStateParameter()); } public Paginator getPaginator() { return m_paginator; } + @Override public void register(Page p) { super.register(p); p.addComponentStateParam(this, m_currentFolder.getStateParameter()); p.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent event) { - // MP: This action listener should only be called when the - // folder browser is visible. - showHideFolderActions(event.getPageState()); - } - }); + + public void actionPerformed(ActionEvent event) { + // MP: This action listener should only be called when the + // folder browser is visible. + showHideFolderActions(event.getPageState()); + } + }); } - private Folder getCurrentFolder( PageState state ) { - return (Folder) m_currentFolder.getSelectedObject( state ); + private Folder getCurrentFolder(PageState state) { + return (Folder) m_currentFolder.getSelectedObject(state); } private void showHideFolderActions(PageState state) { SecurityManager sm = Utilities.getSecurityManager(state); - Folder folder = getCurrentFolder( state ); + Folder folder = getCurrentFolder(state); Assert.exists(folder); } - public FolderSelectionModel getFolderSelectionModel() { return m_currentFolder; } private class FolderTableModelBuilder - extends AbstractTableModelBuilder implements PaginationModelBuilder { + extends AbstractTableModelBuilder implements PaginationModelBuilder { private RequestLocal m_size = new RequestLocal() { - protected Object initialValue( PageState state ) { - Folder.ItemCollection itemColl = getItemCollection( state ); - if( null == itemColl ) return new Integer( 0 ); - return new Integer( (int) itemColl.size() ); + @Override + protected Object initialValue(PageState state) { + Folder.ItemCollection itemColl = getItemCollection(state); + + if (null == itemColl) { + return new Integer(0); + } + return new Integer((int) itemColl.size()); } }; - private RequestLocal m_itemColl = new RequestLocal() { - protected Object initialValue( PageState state ) { - Folder.ItemCollection itemColl = getItemCollection( state ); + + @Override + protected Object initialValue(PageState state) { + Folder.ItemCollection itemColl = getItemCollection(state); itemColl.addOrder("item.name"); itemColl.setRange(new Integer(m_paginator.getFirst(state)), - new Integer(m_paginator.getLast(state) + 1)); + new Integer(m_paginator.getLast(state) + 1)); return itemColl; } @@ -172,17 +173,17 @@ public class ItemSearchFolderBrowser extends Table { public TableModel makeModel(Table t, PageState s) { FolderSelectionModel sel = ((ItemSearchFolderBrowser) t).getFolderSelectionModel(); - Folder f = getCurrentFolder( s ); + Folder f = getCurrentFolder(s); - if( s_log.isDebugEnabled() ) { - if( null == f ) - s_log.debug( "Selected folder is null" ); - else - s_log.debug( "Selected folder: " + f.getLabel() + " " + - f.getOID().toString() ); + if (s_log.isDebugEnabled()) { + if (null == f) { + s_log.debug("Selected folder is null"); + } else { + s_log.debug("Selected folder: " + f.getLabel() + " " + f.getOID().toString()); + } } - if ( f == null ) { + if (f == null) { return Table.EMPTY_MODEL; } else { t.getRowSelectionModel().clearSelection(s); @@ -190,23 +191,46 @@ public class ItemSearchFolderBrowser extends Table { } } - private Folder.ItemCollection getItemCollection( PageState state ) { - Folder f = getCurrentFolder( state ); + private Folder.ItemCollection getItemCollection(PageState state) { + Folder f = getCurrentFolder(state); Folder.ItemCollection itemColl = f.getPrimaryInstances(); - if( null == itemColl ) return null; + if (null == itemColl) { + return null; + } BigDecimal singleTypeID = - (BigDecimal) state.getValue (new BigDecimalParameter - (ItemSearch.SINGLE_TYPE_PARAM)); - - if (singleTypeID != null) - itemColl.addEqualsFilter (ContentItem.CONTENT_TYPE + - "." + ContentType.ID, singleTypeID); + (BigDecimal) state.getValue(new BigDecimalParameter(ItemSearch.SINGLE_TYPE_PARAM)); + + if (singleTypeID != null) { + + // The Filter Factory + FilterFactory ff = itemColl.getFilterFactory(); + + // Create an or-filter + CompoundFilter or = ff.or(); + + // The content type must be either of the requested type + or.addFilter(ff.equals(ContentItem.CONTENT_TYPE + "." + ContentType.ID, singleTypeID)); + + // Or must be a sibling of the requested type + try { + ContentType ct = new ContentType(singleTypeID); + + StringTokenizer strTok = new StringTokenizer(ct.getSiblings(), "/"); + while (strTok.hasMoreElements()) { + or.addFilter(ff.equals(ContentItem.CONTENT_TYPE + "." + ContentType.ID, (String) strTok.nextElement())); + } + } catch (Exception ex) { + // WTF? The selected content type does not exist in the table??? + } + + itemColl.addFilter(or); + } itemColl.addOrder("isFolder desc"); - itemColl.addOrder("lower(item." + - ContentItem.NAME + ") "); + itemColl.addOrder("lower(item." + + ContentItem.NAME + ") "); return itemColl; } @@ -225,10 +249,10 @@ public class ItemSearchFolderBrowser extends Table { * than 1 page of items, false otherwise */ public boolean isVisible(PageState state) { - int size = ((Integer) m_size.get( state )).intValue(); - - return ItemSearchFolderBrowser.this.isVisible(state) && - ( size > MAX_ROWS ); + int size = ((Integer) m_size.get(state)).intValue(); + + return ItemSearchFolderBrowser.this.isVisible(state) + && (size > MAX_ROWS); } } @@ -236,90 +260,83 @@ public class ItemSearchFolderBrowser extends Table { * Produce links to view an item or control links for folders * to change into the folder. */ - private class NameCellRenderer extends DefaultTableCellRenderer - { - public NameCellRenderer() - { + private class NameCellRenderer extends DefaultTableCellRenderer { + + public NameCellRenderer() { super(true); } - public Component getComponent (Table table, PageState state, - Object value, boolean isSelected, - Object key, int row, int column) - { + @Override + public Component getComponent(Table table, PageState state, + Object value, boolean isSelected, + Object key, int row, int column) { Folder.ItemCollection coll = (Folder.ItemCollection) value; String name = coll.getName(); - if ( coll.isFolder() ) - return super.getComponent(table, state, name, - isSelected, key, row, column); - else - { - ContentSection section = CMS.getContext().getContentSection(); - BigDecimal id = (BigDecimal) key; + if (coll.isFolder()) { + return super.getComponent(table, state, name, isSelected, key, row, column); + } else { + ContentSection section = CMS.getContext().getContentSection(); + BigDecimal id = (BigDecimal) key; - if (section == null) - return new Label (name); - else - { - //ItemResolver resolver = section.getItemResolver(); + if (section == null) { + return new Label(name); + } else { + //ItemResolver resolver = section.getItemResolver(); - //String url = - //resolver.generateItemURL - //(state, id, name, section, coll.getVersion())); + //String url = + //resolver.generateItemURL + //(state, id, name, section, coll.getVersion())); - SimpleContainer container = new SimpleContainer (); + SimpleContainer container = new SimpleContainer(); - String widget = - (String) state.getValue (new StringParameter - (ItemSearchPopup.WIDGET_PARAM)); - boolean useURL = "true".equals - (state.getValue(new StringParameter(ItemSearchPopup.URL_PARAM))); + String widget = + (String) state.getValue(new StringParameter(ItemSearchPopup.WIDGET_PARAM)); + boolean useURL = "true".equals(state.getValue(new StringParameter(ItemSearchPopup.URL_PARAM))); - String fillString = useURL ? - ItemSearchPopup.getItemURL(state.getRequest(), - coll.getDomainObject().getOID()) : - id + - " (" + name + ")"; - - Label js = new Label (generateJSLabel (id, widget, - fillString), - false); - container.add (js); + String fillString = useURL + ? ItemSearchPopup.getItemURL(state.getRequest(), + coll.getDomainObject().getOID()) + : id + + " (" + name + ")"; - String url = "#"; + Label js = new Label(generateJSLabel(id, widget, + fillString), + false); + container.add(js); - Link link = new Link (name, url); - link.setClassAttr ("title"); - link.setOnClick ("return fillItem" + id + "()"); + String url = "#"; - container.add (link); + Link link = new Link(name, url); + link.setClassAttr("title"); + link.setOnClick("return fillItem" + id + "()"); - return container; - } + container.add(link); + + return container; } + } } - private String generateJSLabel(BigDecimal id, String widget, String fill) - { - StringBuffer buffer = new StringBuffer(); - buffer.append(" "); - + private String generateJSLabel(BigDecimal id, String widget, String fill) { + StringBuffer buffer = new StringBuffer(); + buffer.append(" "); + return buffer.toString(); } } @@ -327,33 +344,27 @@ public class ItemSearchFolderBrowser extends Table { /** * 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 TITLE = 1; private static final int TYPE = 2; - private Folder.ItemCollection m_itemColl; - public FolderTableModel(Folder.ItemCollection itemColl) - { + public FolderTableModel(Folder.ItemCollection itemColl) { m_itemColl = itemColl; } - public int getColumnCount() - { + public int getColumnCount() { return 3; } - public boolean nextRow() - { + public boolean nextRow() { return m_itemColl != null ? m_itemColl.next() : false; } - public Object getElementAt(int columnIndex) - { - switch (columnIndex) - { + public Object getElementAt(int columnIndex) { + switch (columnIndex) { case NAME: return m_itemColl; case TITLE: @@ -361,30 +372,29 @@ public class ItemSearchFolderBrowser extends Table { case TYPE: return m_itemColl.getTypeLabel(); default: - throw new - IndexOutOfBoundsException ("Column index " + columnIndex + - " not in table model."); - } + throw new IndexOutOfBoundsException("Column index " + columnIndex + + " not in table model."); + } } - public Object getKeyAt(int columnIndex) - { + public Object getKeyAt(int columnIndex) { // Mark folders by using their negative ID (dirty, dirty) - return ( m_itemColl.isFolder() ) ? m_itemColl.getID().negate() - : m_itemColl.getID(); + return (m_itemColl.isFolder()) ? m_itemColl.getID().negate() + : m_itemColl.getID(); } } private class FolderChanger extends TableActionAdapter { + public void cellSelected(TableActionEvent e) { PageState s = e.getPageState(); int col = e.getColumn().intValue(); - if ( m_nameColumn != getColumn(col) ) { + if (m_nameColumn != getColumn(col)) { return; } String key = (String) e.getRowKey(); - if ( key.startsWith("-") ) { + if (key.startsWith("-")) { clearSelection(s); getFolderSelectionModel().setSelectedKey(s, key.substring(1)); m_paginator.reset(s); @@ -401,5 +411,4 @@ public class ItemSearchFolderBrowser extends Table { private static GlobalizedMessage globalize(String key) { return FolderManipulator.globalize(key); } - } diff --git a/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchParameter.java b/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchParameter.java index 557f27de9..f2775b455 100755 --- a/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchParameter.java +++ b/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchParameter.java @@ -78,6 +78,7 @@ public class ItemSearchParameter extends StringParameter { * @throws IllegalArgumentException if the request parameter does not * look like a valid email address. */ + @Override public Object transformValue(HttpServletRequest request) throws IllegalArgumentException { @@ -86,6 +87,7 @@ public class ItemSearchParameter extends StringParameter { return unmarshal(itemStr); } + @Override public Object unmarshal(String encoded) throws IllegalArgumentException { @@ -113,16 +115,13 @@ public class ItemSearchParameter extends StringParameter { } if (m_contentType != null && - !contentItem.getContentType().equals(m_contentType)) { + !contentItem.isContentType(m_contentType)) { return null; - /* - throw new IllegalArgumentException - (encoded + " is not a valid " + m_contentType.getLabel()); - */ } return contentItem; } + @Override public String marshal(Object value) { if (value == null) { return null; @@ -132,6 +131,7 @@ public class ItemSearchParameter extends StringParameter { } } + @Override public Class getValueClass() { return ContentPage.class; } diff --git a/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchWidget.java b/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchWidget.java index ca092dc30..3c182441e 100755 --- a/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchWidget.java +++ b/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchWidget.java @@ -44,35 +44,32 @@ import com.arsdigita.web.ParameterMap; import com.arsdigita.web.URL; import org.apache.log4j.Logger; - /** * A class representing a content item search field in an HTML form. * * @author Scott Seago (sseago@redhat.com) * @version $Id: ItemSearchWidget.java 1166 2006-06-14 11:45:15Z fabrice $ */ -public class ItemSearchWidget extends FormSection - implements BebopConstants, FormSubmissionListener, FormInitListener { +public class ItemSearchWidget extends FormSection + implements BebopConstants, FormSubmissionListener, FormInitListener { private static final Logger s_log = Logger.getLogger(ItemSearchWidget.class); private TextField m_item; private Submit m_search; private Submit m_clear; - private Label m_jsLabel; - private Label m_topHR; - private Label m_bottomHR; + private Label m_jsLabel; + private Label m_topHR; + private Label m_bottomHR; private ContentType m_contentType; private ItemSearchSectionInline m_searchComponent; - private String m_name; private String m_searchName; private String m_clearName; private ParameterModel m_model; - public static final String BEBOP_ITEM_SEARCH = "bebop:itemSearch"; - + private class ItemFragment extends TextField { - + private ItemSearchWidget parent; public ItemFragment(ParameterModel parameter, ItemSearchWidget parent) { @@ -82,31 +79,31 @@ public class ItemSearchWidget extends FormSection this.setSize(35); } } + private class SearchFragment extends Submit { - + private ItemSearchWidget parent; private ContentType contentType; - public SearchFragment(String name, - ItemSearchWidget parent, - ContentType contentType) { + public SearchFragment(String name, + ItemSearchWidget parent, + ContentType contentType) { super(name, "Search"); this.parent = parent; this.contentType = contentType; - this.setAttribute("onClick", "return " + parent.m_item.getName().replace('.','_') + "Popup(this.form)"); + this.setAttribute("onClick", "return " + parent.m_item.getName().replace('.', '_') + "Popup(this.form)"); this.setAttribute("value", "Search"); } public boolean isVisible(PageState ps) { - return (!(parent.m_search.isSelected(ps) || - parent.m_searchComponent.hasQuery(ps)) && - super.isVisible(ps)); + return (!(parent.m_search.isSelected(ps) + || parent.m_searchComponent.hasQuery(ps)) + && super.isVisible(ps)); } - } private class ClearFragment extends Submit { - + private ItemSearchWidget parent; public ClearFragment(String name, ItemSearchWidget parent) { @@ -118,18 +115,17 @@ public class ItemSearchWidget extends FormSection } private class LabelFragment extends Label { - + private ItemSearchWidget parent; public LabelFragment(String name, boolean escaping, ItemSearchWidget parent) { super(name, escaping); this.parent = parent; } - } private class ItemSearchFragment extends ItemSearchSectionInline { - + private ItemSearchWidget parent; public ItemSearchFragment(String name, String context, ItemSearchWidget parent) { @@ -139,52 +135,51 @@ public class ItemSearchWidget extends FormSection @Override public boolean isVisible(PageState ps) { - return ((m_search.isSelected(ps) || - hasQuery(ps)) && - super.isVisible(ps)); + return ((m_search.isSelected(ps) + || hasQuery(ps)) + && super.isVisible(ps)); } - } private class HRLabel extends Label { - + public HRLabel() { super("
", false); } @Override public boolean isVisible(PageState ps) { - return ((m_search.isSelected(ps) || - m_searchComponent.hasQuery(ps)) && - super.isVisible(ps)); + return ((m_search.isSelected(ps) + || m_searchComponent.hasQuery(ps)) + && super.isVisible(ps)); } - } + /** * Construct a new ItemSearchWidget. The model must be an ItemSearchParameter */ public ItemSearchWidget(ParameterModel model) { - this(model,null); + this(model, null); } /** * Construct a new ItemSearchWidget. The model must be an ItemSearchParameter */ public ItemSearchWidget(ParameterModel model, - ContentType contentType) { + ContentType contentType) { super(new BoxPanel(BoxPanel.VERTICAL)); - if ( ! (model instanceof ItemSearchParameter)) { + if (!(model instanceof ItemSearchParameter)) { throw new IllegalArgumentException( - "The ItemSearch widget " + model.getName() + - " must be backed by a ItemSearchParameter parmeter model"); + "The ItemSearch widget " + model.getName() + + " must be backed by a ItemSearchParameter parmeter model"); } m_name = model.getName(); m_searchName = m_name + "_search"; m_clearName = m_name + "_clear"; m_model = model; - + final String typeURLFrag; if (contentType != null) { typeURLFrag = contentType.getID().toString(); @@ -196,44 +191,45 @@ public class ItemSearchWidget extends FormSection m_item = new ItemFragment(model, this); m_search = new SearchFragment(m_searchName, this, m_contentType); m_clear = new ClearFragment(m_clearName, this); - m_jsLabel = new LabelFragment("",false, this); - m_jsLabel.addPrintListener( new PrintListener() { - public void prepare(PrintEvent event) { - PageState state = event.getPageState(); - Label t = (Label) event.getTarget(); - String formName = ((LabelFragment) t).parent.getSearchButton().getForm().getName(); - ParameterMap params = new ParameterMap(); - params.setParameter ("section_id", - CMS.getContext().getContentSection().getID()); - params.setParameter("widget", formName + ".elements['" + m_item.getName() + "']"); - if (typeURLFrag != null) { - params.setParameter("single_type", typeURLFrag); - } + m_jsLabel = new LabelFragment("", false, this); + m_jsLabel.addPrintListener(new PrintListener() { - - String searchURL = ContentCenterDispatcher.getURLStubForClass( + public void prepare(PrintEvent event) { + PageState state = event.getPageState(); + Label t = (Label) event.getTarget(); + String formName = ((LabelFragment) t).parent.getSearchButton().getForm().getName(); + ParameterMap params = new ParameterMap(); + params.setParameter("section_id", + CMS.getContext().getContentSection().getID()); + params.setParameter("widget", formName + ".elements['" + m_item.getName() + "']"); + if (typeURLFrag != null) { + params.setParameter("single_type", typeURLFrag); + } + + + String searchURL = ContentCenterDispatcher.getURLStubForClass( ItemSearchPage.class.getName()); - s_log.debug("Search URL stub is: " + searchURL); + s_log.debug("Search URL stub is: " + searchURL); - searchURL = com.arsdigita.cms.dispatcher.Utilities.getWorkspaceURL() + searchURL = com.arsdigita.cms.dispatcher.Utilities.getWorkspaceURL() + searchURL; - // TODO Not sure what to do when you get a null here + // TODO Not sure what to do when you get a null here - URL url = URL.there(state.getRequest(), searchURL,params); - - t.setLabel(" "); - } - }); + URL url = URL.there(state.getRequest(), searchURL, params); + + t.setLabel(" "); + } + }); m_topHR = new HRLabel(); add(m_topHR); FormSection searchSection = new FormSection(new BoxPanel(BoxPanel.HORIZONTAL)); @@ -250,7 +246,8 @@ public class ItemSearchWidget extends FormSection add(m_bottomHR); } - + + @Override public void register(Page p) { super.register(p); p.setVisibleDefault(m_topHR, false); @@ -261,24 +258,28 @@ public class ItemSearchWidget extends FormSection public ItemSearchWidget(String name) { this(new ItemSearchParameter(name)); } + public ItemSearchWidget(String name, - String objectType) - throws DataObjectNotFoundException { - this(name, (objectType == null || objectType.length()==0 ? - null : - ContentType.findByAssociatedObjectType(objectType))); + String objectType) + throws DataObjectNotFoundException { + this(name, (objectType == null || objectType.length() == 0 + ? null + : ContentType.findByAssociatedObjectType(objectType))); } + public ItemSearchWidget(String name, - ContentType contentType) { + ContentType contentType) { this(new ItemSearchParameter(name, contentType), contentType); } public Submit getSearchButton() { return m_search; } + public Submit getClearButton() { return m_clear; } + public TextField getItemField() { return m_item; } @@ -315,7 +316,7 @@ public class ItemSearchWidget extends FormSection } throw new FormProcessException("item search FormSection submit"); - + } else if (m_searchComponent.hasQuery(s)) { s_log.debug("Has query"); try { @@ -354,7 +355,7 @@ public class ItemSearchWidget extends FormSection throw new FormProcessException("item search FormSection submit"); } else if (m_clear.isSelected(s)) { s_log.debug("Clear selected"); - m_item.setValue(s,null); + m_item.setValue(s, null); try { m_searchComponent.setVisible(s, false); m_topHR.setVisible(s, false); @@ -376,5 +377,4 @@ public class ItemSearchWidget extends FormSection } } } - }