Weiterer Schritt Ausbau alter Initialisierungscode aus ccm-cms: Umgestellt auf content-section Initializer, alten Code entfernt, Starten und Stopppen des Background Thread eingebaut. Es fehlt noch: Erstellen einer zusätzlichen content section.

git-svn-id: https://svn.libreccm.org/ccm/trunk@587 8810af33-2d31-482b-a856-94f89814c4df
master
pb 2010-10-27 23:28:15 +00:00
parent 8680391734
commit efa88c40a7
29 changed files with 2263 additions and 665 deletions

View File

@ -2,6 +2,10 @@
<registry>
<config class="com.arsdigita.cms.CMSConfig"
storage="ccm-cms/cms.properties"/>
<config class="com.arsdigita.cms.contentsection.ContentSectionConfig"
storage="ccm-cms/contentsection.properties"/>
<config class="com.arsdigita.cms.LoaderConfig"
storage="ccm-cms/loader.properties"/>
<config class="com.arsdigita.cms.lifecycle.LifecycleConfig"
storage="ccm-cms/lifecycle.properties"/>
<config class="com.arsdigita.cms.publishToFile.PublishToFileConfig"

View File

@ -33,20 +33,46 @@ import org.apache.log4j.Logger;
*/
public abstract class CMS {
private static final Logger s_log = Logger.getLogger(CMS.class);
/**
* The CMS XML namespace.
*/
public final static String CMS_XML_NS = "http://www.arsdigita.com/cms/1.0";
private static final Logger s_log = Logger.getLogger(CMS.class);
/**
* Constant string used as key for creating Workspace (content-center) as a
* legacy application.
*/
public static final String WORKSPACE_PACKAGE_KEY = "content-center";
/**
* Constant string used as key for creating service package as a
* legacy application.
*/
public final static String SERVICE_PACKAGE_KEY = "cms-service";
static final CMSContext s_initialContext = new CMSContext();
private static final ThreadLocal s_context = new ThreadLocal() {
@Override
public Object initialValue() {
return s_initialContext;
}
};
private static final CMSConfig s_config = new CMSConfig();
static {
s_config.load();
}
/**
*
* @return
*/
public static CMSConfig getConfig() {
return s_config;
}
/**
* Get the context record of the current thread.

View File

@ -96,121 +96,71 @@ import org.apache.log4j.Logger;
public final class CMSConfig extends AbstractConfig {
private static final Logger s_log = Logger.getLogger(CMSConfig.class);
private static Map s_skipAssetSteps = null;
private final Parameter m_templateRootPath;
private final Parameter m_categoryAuthoringAddForm;
private final Parameter m_defaultItemTemplatePath;
private final Parameter m_defaultFolderTemplatePath;
private final Parameter m_defaultSection;
private final Parameter m_defaultItemResolverClass;
private final Parameter m_defaultTemplateResolverClass;
private final Parameter m_useSectionCategories;
private final Parameter m_itemAdapters;
private final Parameter m_useStreamlinedCreation;
private final Parameter m_dhtmlEditorConfig;
private final Parameter m_dhtmlEditorPlugins;
private final Parameter m_dhtmlEditorHiddenButtons;
private final Parameter m_hideTemplatesTab;
private final Parameter m_hideAdminTabs;
private final Parameter m_hideTimezone;
private final Parameter m_hideLaunchDate;
private final Parameter m_hideUDCTUI;
private final Parameter m_hideFolderIndexCheckbox;
private final Parameter m_defaultNotificationTime;
private final Parameter m_notifyAuthorOnLifecycle;
private final Parameter m_publishLifecycleListenerClass;
private final Parameter m_requireLaunchDate;
private final Parameter m_saveTextCleansWordTags;
private final Parameter m_hideAdditionalResourceFields;
private final Parameter m_disableFileAssetExtraction;
private final Parameter m_deleteWorkflowAfterPublication;
private final Parameter m_soonExpiredTimespanMonths;
private final Parameter m_soonExpiredTimespanDays;
private final Parameter m_defaultTaskAlerts;
private final Parameter m_unpublishedNotFound;
private final Parameter m_linksOnlyInSameSubsite;
private final Parameter m_categoryAuthoringExtension;
private final Parameter m_hideResetLifecycleLink;
private final Parameter m_scoreTitleAndKeywords;
private final Parameter m_titleWeight;
private final Parameter m_keywordWeight;
private final Parameter m_skipAssetSteps;
private final Parameter m_mandatoryDescriptions;
private final Parameter m_deleteLifecycleWhenComplete;
private final Parameter m_deleteExpiryNotificationsWhenSent;
private final Parameter m_deleteWorkflowNotificationsWhenSent;
private final Parameter m_hasContactsAuthoringStep;
private final Parameter m_categoryTreeOrdering;
private final Parameter m_hideTextAssetUploadFile;
private final Parameter m_allowContentCreateInSectionListing;
// ///////////////////////////////////////////
// publishToFile package related parameter
// ///////////////////////////////////////////
// Moved to publishToFile.PublishToFileConfig as of version 6.0.2
// private final Parameter m_disableItemPfs;
// private final Parameter m_publishToFileClass;
/** Private Object to hold one's own instance to return to users. */
private static CMSConfig s_config;
/**
* Do not instantiate this class directly.
* Returns the singleton configuration record for the content section
* environment.
*
* @see ContentSection#getConfig()
**/
public CMSConfig() {
* @return The <code>ContentSectionConfig</code> record; it cannot be null
*/
public static final synchronized CMSConfig getInstance() {
if (s_config == null) {
s_config = new CMSConfig();
// deprecated
// s_config.require("ccm-core/runtime.properties");
// use instead:
// read values from the persistent storage
s_config.load();
}
m_defaultItemTemplatePath = new StringParameter
("com.arsdigita.cms.default_item_template_path",
Parameter.REQUIRED, "/default/item.jsp");
m_defaultFolderTemplatePath = new StringParameter
("com.arsdigita.cms.default_folder_template_path",
Parameter.REQUIRED, "/default/folder.jsp");
return s_config;
}
m_linksOnlyInSameSubsite = new BooleanParameter
("com.arsdigita.cms.browse_links_in_same_subsite_only",
Parameter.REQUIRED, new Boolean(false));
m_defaultTaskAlerts = new StringArrayParameter
("com.arsdigita.cms.default_task_alerts",
Parameter.REQUIRED, new String[] {
"Authoring:enable:finish:rollback",
"Approval:enable:finish:rollback",
"Deploy:enable:finish:rollback" }
);
// XXX these are probably temporary parameters, as the
// item/template resolvers will be determined by the successor
// to SectionInitializer. However, it still may be useful to
// keep these for the default values.
m_defaultItemResolverClass = new SpecificClassParameter
("com.arsdigita.cms.default_item_resolver_class",
Parameter.REQUIRED,
MultilingualItemResolver.class,
ItemResolver.class);
m_defaultTemplateResolverClass = new SpecificClassParameter
("com.arsdigita.cms.default_template_resolver_class",
Parameter.REQUIRED,
DefaultTemplateResolver.class,
TemplateResolver.class);
/**
* Storage (map) for method getAssetStepsToSkip(ContentType type) to store
* mapping of steps that are deemed irrelevant for the passid in type.
*/
private static Map s_skipAssetSteps = null;
/**
* Item category add form speciofies Subclass of ItemCategoryForm
* to use for the assign categories step.
* Used in c.ad.cms.ui.authoring.ItemCategoryStep
*/
private final Parameter
m_categoryAuthoringAddForm = new SpecificClassParameter
("com.arsdigita.cms.category_authoring_add_form",
Parameter.REQUIRED,
ItemCategoryForm.class,
SimpleComponent.class);
/**
* Path for the default item template. Path is relative to the
* Template Root path.
*/
private final Parameter
m_defaultItemTemplatePath = new StringParameter
("com.arsdigita.cms.default_item_template_path",
Parameter.REQUIRED, "/default/item.jsp");
/**
* Path for the default folder template. Path is relative to the
* Template Root path.
*/
private final Parameter
m_defaultFolderTemplatePath = new StringParameter
("com.arsdigita.cms.default_folder_template_path",
Parameter.REQUIRED, "/default/folder.jsp");
/**
* Path for the default template folder. Path is relative to webapp root
*/
private final Parameter
m_templateRootPath = new StringParameter
("com.arsdigita.cms.template_root_path",
Parameter.REQUIRED, "/packages/content-section/templates");
// XXX: temporary parameter. will be removed when
// SectionInitializer is replaced with a separate Section
// loader app.
m_useSectionCategories = new BooleanParameter
("com.arsdigita.cms.use_section_categories",
Parameter.REQUIRED, new Boolean(true));
// URL resource: protocol handler removal: START
// remove:
@ -223,20 +173,31 @@ public final class CMSConfig extends AbstractConfig {
// throw new UncheckedWrapperException("Cannot parse URL", ex);
// }
// ADD:
/**
* Item Adapters File, path to an XML resource containing adapter
* specifications. Path is relative to webapp root.
*/
private final Parameter
m_itemAdapters = new ResourceParameter
("com.arsdigita.cms.item_adapters",
Parameter.REQUIRED,
"/WEB-INF/resources/cms-item-adapters.xml");
// URL resource: protocol handler removal: END
m_defaultSection = new StringParameter
("com.arsdigita.cms.default_content_section",
Parameter.REQUIRED, "content");
/**
* Use streamlined content creation: upon item creation,
* automatically open authoring steps and forward to the next step
*/
private final Parameter
m_useStreamlinedCreation = new BooleanParameter
("com.arsdigita.cms.use_streamlined_creation",
Parameter.REQUIRED, new Boolean(false));
Parameter.REQUIRED, new Boolean(true));
/**
* DHTML Editor Configuration for use in CMS module, lists the
* config object name and Javascript source location for its definition.
*/
private final Parameter
m_dhtmlEditorConfig = new DHTMLEditorConfigParameter
("com.arsdigita.cms.dhtml_editor_config",
Parameter.REQUIRED,
@ -253,190 +214,397 @@ public final class CMSConfig extends AbstractConfig {
// be accessable by other modules which use DHTMLeditor.
// Would be bad style to configure a cms specific parameter in core.
/**
* Defines which plugins to use, e.g.TableOperations,CSS
* Format: [string,string,string]
*/
private final Parameter
m_dhtmlEditorPlugins = new StringArrayParameter
("com.arsdigita.cms.dhtml_editor_plugins",
Parameter.OPTIONAL,
null);
/**
* Prevent undesirable functions from being made available,
* eg images should only be added through the cms methods.
*/
private final Parameter
m_dhtmlEditorHiddenButtons = new StringArrayParameter
("com.arsdigita.cms.dhtml_editor_hidden_buttons",
Parameter.OPTIONAL,
null);
m_hideTemplatesTab = new BooleanParameter
("com.arsdigita.cms.hide_templates_tab",
Parameter.REQUIRED, new Boolean(false));
/**
* Hide section admin tabs from users without administrative rights.
*/
private final Parameter
m_hideAdminTabs = new BooleanParameter
("com.arsdigita.cms.hide_admin_tabs",
Parameter.REQUIRED, new Boolean(false));
m_hideTimezone = new BooleanParameter
("com.arsdigita.cms.hide_timezone",
Parameter.REQUIRED, new Boolean(false));
m_hideLaunchDate = new BooleanParameter
("com.arsdigita.cms.hide_launch_date",
Parameter.REQUIRED, new Boolean(true));
m_requireLaunchDate = new BooleanParameter
("com.arsdigita.cms.require_launch_date",
Parameter.REQUIRED, new Boolean(false));
m_hideUDCTUI = new BooleanParameter
("com.arsdigita.cms.hide_udct_ui",
Parameter.REQUIRED, new Boolean(false));
/**
* Hide Folder Index Checkbox from folder view
*/
private final Parameter
m_hideFolderIndexCheckbox = new BooleanParameter
("com.arsdigita.cms.hide_folder_index_checkbox",
Parameter.REQUIRED, new Boolean(false));
m_defaultNotificationTime = new IntegerParameter
("com.arsdigita.cms.default_notification_time",
Parameter.REQUIRED, new Integer(0));
/**
* Hide launch date parameter on all forms and displays where it's used.
*/
private final Parameter
m_hideLaunchDate = new BooleanParameter
("com.arsdigita.cms.hide_launch_date",
Parameter.REQUIRED, new Boolean(true));
/**
* Require the launch date parameter to be set by the content author.
*/
private final Parameter
m_requireLaunchDate = new BooleanParameter
("com.arsdigita.cms.require_launch_date",
Parameter.REQUIRED, new Boolean(false));
/**
* Hide the templates tab on the item admin page.
*/
private final Parameter
m_hideTemplatesTab = new BooleanParameter
("com.arsdigita.cms.hide_templates_tab",
Parameter.REQUIRED, new Boolean(false));
/**
* Hide the upload file link in the editing of a text asset.
*/
private final Parameter
m_hideTextAssetUploadFile = new BooleanParameter
("com.arsdigita.cms.hide_text_asset_upload_file",
Parameter.REQUIRED,
new Boolean(false));
/**
* Hide timezone labels (if, for example, all users will be in the
* same timezone and such information would be unnecessary)
*/
private final Parameter
m_hideTimezone = new BooleanParameter
("com.arsdigita.cms.hide_timezone",
Parameter.REQUIRED, new Boolean(false));
/**
* Hide User Defined Content Types UI
*/
private final Parameter
m_hideUDCTUI = new BooleanParameter
("com.arsdigita.cms.hide_udct_ui",
Parameter.REQUIRED, new Boolean(false));
/**
* Specifies the name of the class to use as a PublishLifecycleListener
*/
private final Parameter
m_publishLifecycleListenerClass = new StringParameter
("com.arsdigita.cms.publish_lifecycle_listener_class",
Parameter.OPTIONAL, PublishLifecycleListener.class.getName());
m_notifyAuthorOnLifecycle = new BooleanParameter
("com.arsdigita.cms.notify_author_on_lifecycle",
Parameter.OPTIONAL, new Boolean(true));
/**
* Wether the Wysiwyg editor should clear the text of MSWord tags,
* everytime the user clicks on 'Save'
*/
private final Parameter
m_saveTextCleansWordTags = new BooleanParameter
("com.arsdigita.cms.save_text_cleans_word_tags",
Parameter.OPTIONAL, new Boolean(false));
/**
* Hide Additional Resource Fields on RelatedLinkPropertyForm
*/
private final Parameter
m_hideAdditionalResourceFields = new BooleanParameter
("com.arsdigita.cms.contentassets.ui."+
"RelatedLinkPropertyForm.hideAdditionalResourceFields",
Parameter.REQUIRED, new Boolean(false));
/**
* Get the search indexing not to process FileAssets,
* eg to avoid PDF slowdowns
*/
private final Parameter
m_disableFileAssetExtraction = new BooleanParameter
("com.arsdigita.cms.search.disableFileAssetExtraction",
Parameter.REQUIRED, new Boolean(false));
/**
* Whether an item's workflow should be deleted, once the item
* has been (re)published
*/
private final Parameter
m_deleteWorkflowAfterPublication = new BooleanParameter
("com.arsdigita.cms.delete_workflow_after_publication",
Parameter.REQUIRED, new Boolean(true));
/**
* Defines the number of days ahead that are covered in the
* 'Soon Expired' tab
*/
private final Parameter
m_soonExpiredTimespanDays = new IntegerParameter
("com.arsdigita.cms.soon_expired_timespan_days",
Parameter.REQUIRED, new Integer(1));
Parameter.REQUIRED, new Integer(14));
/**
* Defines the number of months ahead that are covered in the
* 'Soon Expired' tab
*/
private final Parameter
m_soonExpiredTimespanMonths = new IntegerParameter
("com.arsdigita.cms.soon_expired_timespan_months",
Parameter.REQUIRED, new Integer(0));
Parameter.REQUIRED, new Integer(1));
/**
* Does a redirect to the unpublished item generate not found error?
*/
private final Parameter
m_unpublishedNotFound = new BooleanParameter
("com.arsdigita.cms.unpublished_not_found",
Parameter.REQUIRED, new Boolean(true));
/**
* Links created through browse interfaces should only be within the
* same subsite
*/
private final Parameter
m_linksOnlyInSameSubsite = new BooleanParameter
("com.arsdigita.cms.browse_links_in_same_subsite_only",
Parameter.REQUIRED, new Boolean(false));
/**
* Item category step extension hook: Subclass of ItemCategoryExtension
* which adds extension actions for the category authoring step
*/
private final Parameter
m_categoryAuthoringExtension = new SpecificClassParameter
("com.arsdigita.cms.category_authoring_extension",
Parameter.REQUIRED,
ItemCategoryExtension.class,
ItemCategoryExtension.class);
/**
* Link available to reset lifecycle on republish. If false don't display
* the link otherwise display.
*/
private final Parameter
m_hideResetLifecycleLink = new BooleanParameter
("com.arsdigita.cms.hide_reset_lifecycle_link",
Parameter.OPTIONAL, new Boolean(true));
m_keywordWeight = new IntegerParameter
("com.arsdigita.cms.search.intermedia.keyword_weight",
Parameter.OPTIONAL,
new Integer(1));
m_titleWeight = new IntegerParameter
("com.arsdigita.cms.search.intermedia.title_weight",
Parameter.OPTIONAL,
new Integer(1));
/**
* Whether to include INPATH operators to contains clause in intermedia search
*/
private final Parameter
m_scoreTitleAndKeywords = new BooleanParameter
("com.arsdigita.cms.search.score_title_and_keywords",
Parameter.OPTIONAL,
Boolean.FALSE);
/**
* each entry in the list is a : separated pair. The first string
* is the className for the type (refer to classname column in contenttypes table
* eg com.arsdigita.cms.contenttypes.MultiPartArticle
* Title Weight, the relative weight given to title element within
* cms:item when ranking search results (only used by interMedia)
*/
private final Parameter
m_titleWeight = new IntegerParameter
("com.arsdigita.cms.search.intermedia.title_weight",
Parameter.OPTIONAL,
new Integer(1));
/**
* Keyword Weight, the relative weight given to the dcKeywords element
* within dublinCore element within cms:item element when ranking
* search results (only used by interMedia)
*/
private final Parameter
m_keywordWeight = new IntegerParameter
("com.arsdigita.cms.search.intermedia.keyword_weight",
Parameter.OPTIONAL,
new Integer(1));
/**
* Asset steps to skip, specify asset steps that are not relevant for
* specific content types.
* Each entry in the list is a : separated pair. The first string
* is the className for the type (refer to classname column in contenttypes
* table eg com.arsdigita.cms.contenttypes.MultiPartArticle
* Second string is the name of the bebop step component
* eg com.arsdigita.cms.contenttypes.ui.ImageStep
*/
private final Parameter
m_skipAssetSteps = new StringArrayParameter
("com.arsdigita.cms.skip_asset_steps",
Parameter.OPTIONAL,
null);
/**
* Mandatory Descriptions Content types may refer to this to decide
* whether to validate against empty descriptions
*/
private final Parameter
m_mandatoryDescriptions = new BooleanParameter
("com.arsdigita.cms.mandatory_descriptions",
Parameter.OPTIONAL, new Boolean(false));
m_deleteExpiryNotificationsWhenSent = new BooleanParameter
("com.arsdigita.cms.delete_expiry_notification_when_sent",
/**
* Delete Finished Lifecycles. Decide whether lifecycles and their phases
* should be deleted from the system when finished.
*/
private final Parameter
m_deleteLifecycleWhenComplete = new BooleanParameter
("com.arsdigita.cms.delete_lifecycle_when_complete",
Parameter.OPTIONAL, new Boolean(false));
m_deleteWorkflowNotificationsWhenSent = new BooleanParameter
("com.arsdigita.cms.delete_workflow_notification_when_sent",
Parameter.OPTIONAL, new Boolean(false));
m_categoryTreeOrdering = new EnumerationParameter
("com.arsdigita.cms.category_tree_order",
Parameter.OPTIONAL, Category.SORT_KEY );
// 2 valid values at the moment - enumeration used rather than boolean
// in case other possible orders are deemed valid
((EnumerationParameter)m_categoryTreeOrdering).put("SortKey", Category.SORT_KEY );
((EnumerationParameter)m_categoryTreeOrdering).put("Alphabetical", Category.NAME);
/**
* Contacts for content items. Allows you to add a Contact authoring step
* to all items
*/
private final Parameter
m_hasContactsAuthoringStep = new BooleanParameter
("com.arsdigita.cms.has_contacts_authoring_step",
Parameter.REQUIRED, new Boolean(false));
m_hideTextAssetUploadFile = new BooleanParameter
("com.arsdigita.cms.hide_text_asset_upload_file",
Parameter.REQUIRED,
new Boolean(false));
/**
* Ordering for nodes in assign category tree. Decide whether entries
* should be ordered alphabetically or according to sort key
* (maintained in category admin tab in content centre)
* SortKey|Alphabetical is initialized in constructor! See below.
*/
private final Parameter
m_categoryTreeOrdering = new EnumerationParameter
("com.arsdigita.cms.category_tree_order",
Parameter.OPTIONAL, Category.SORT_KEY );
/**
* Allow content creation in section listing. Allows you to turn off
* the ability to create content in the section listing
*/
private final Parameter
m_allowContentCreateInSectionListing = new BooleanParameter
("com.arsdigita.cms.allow_content_create_in_section_listing",
Parameter.REQUIRED,
new Boolean(true));
// Lifecycle package
m_deleteLifecycleWhenComplete = new BooleanParameter
("com.arsdigita.cms.delete_lifecycle_when_complete",
// ///////////////////////////////////////////
// Notification related parameters
// ///////////////////////////////////////////
/**
* Delete Sent Workflow Notifications. Decide whether successfully sent
* notifications and messages should be deleted from the system
*/
private final Parameter
m_deleteWorkflowNotificationsWhenSent = new BooleanParameter
("com.arsdigita.cms.delete_workflow_notification_when_sent",
Parameter.OPTIONAL, new Boolean(false));
/**
* Decide whether successfully sent notifications and messages
* should be deleted from the system
*/
private final Parameter
m_deleteExpiryNotificationsWhenSent = new BooleanParameter
("com.arsdigita.cms.delete_expiry_notification_when_sent",
Parameter.OPTIONAL, new Boolean(false));
/**
* Amount of time (in hours) before the expiration of a content item
* that users in the Alert Recipient role are alerted via email
*/
private final Parameter
m_defaultNotificationTime = new IntegerParameter
("com.arsdigita.cms.default_notification_time",
Parameter.REQUIRED, new Integer(0));
/**
* Wether a content item's author should be notified
* by the item's LifecycleListener; defaults to true
*/
private final Parameter
m_notifyAuthorOnLifecycle = new BooleanParameter
("com.arsdigita.cms.notify_author_on_lifecycle",
Parameter.OPTIONAL, new Boolean(true));
// ////////////////////////////////////////////////////
// Content Center (Workspace) config related parameters
// ////////////////////////////////////////////////////
/**
* XML Mapping of the content center tabs to URLs, see
* {@link ContentCenterDispatcher}
*/
private final StringParameter
m_contentCenterMap = new StringParameter(
"com.arsdigita.cms.loader.content_center_map",
Parameter.REQUIRED,
"/WEB-INF/resources/content-center-map.xml");
// ///////////////////////////////////////////
// Content Section config related parameters
// ///////////////////////////////////////////
private final Parameter
m_defaultSection = new StringParameter
("com.arsdigita.cms.default_content_section",
Parameter.REQUIRED, "content");
// ///////////////////////////////////////////
// Content Section creation parameters
// XXX these are probably temporary parameters, as the
// item/template resolvers will be determined by the successor
// to SectionInitializer. However, it still may be useful to
// keep these for the default values.
// ///////////////////////////////////////////
private final Parameter
m_defaultItemResolverClass = new SpecificClassParameter
("com.arsdigita.cms.default_item_resolver_class",
Parameter.REQUIRED,
MultilingualItemResolver.class,
ItemResolver.class);
private final Parameter
m_defaultTemplateResolverClass = new SpecificClassParameter
("com.arsdigita.cms.default_template_resolver_class",
Parameter.REQUIRED,
DefaultTemplateResolver.class,
TemplateResolver.class);
// ///////////////////////////////////////////
// publishToFile package related parameter
// ///////////////////////////////////////////
// XXX: temporary parameter. will be removed when MapParameter
// works and the p2fs initializer is converted away from the
// legacy init
// Moved to publishToFile.PublishToFileConfig as of version 6.0.2
// m_disableItemPfs = new BooleanParameter
// ("com.arsdigita.cms.disable_item_pfs",
// Parameter.REQUIRED, new Boolean(false));
//
// m_publishToFileClass = new SpecificClassParameter
// ("com.arsdigita.cms.publish_to_file_class",
// Parameter.REQUIRED,
// PublishToFile.class,
// PublishToFileListener.class);
// private final Parameter m_disableItemPfs;
// private final Parameter m_publishToFileClass;
/**
* Constructor, but do NOT instantiate this class directly.
*
* @see ContentSection#getConfig()
**/
public CMSConfig() {
// Initialize m_categoryTreeOrdering parameter here!
// 2 valid values at the moment - enumeration used rather than boolean
// in case other possible orders are deemed valid
((EnumerationParameter)m_categoryTreeOrdering).put("SortKey", Category.SORT_KEY );
((EnumerationParameter)m_categoryTreeOrdering).put("Alphabetical", Category.NAME);
register(m_templateRootPath);
register(m_defaultItemTemplatePath);
register(m_defaultFolderTemplatePath);
register(m_defaultItemResolverClass);
register(m_defaultTemplateResolverClass);
register(m_categoryAuthoringAddForm);
register(m_useSectionCategories);
register(m_itemAdapters);
register(m_defaultSection);
register(m_useStreamlinedCreation);
register(m_dhtmlEditorConfig);
register(m_dhtmlEditorPlugins);
@ -457,7 +625,6 @@ public final class CMSConfig extends AbstractConfig {
register(m_deleteWorkflowAfterPublication);
register(m_soonExpiredTimespanMonths);
register(m_soonExpiredTimespanDays);
register(m_defaultTaskAlerts);
register(m_unpublishedNotFound);
register(m_linksOnlyInSameSubsite);
register(m_categoryAuthoringExtension);
@ -475,6 +642,17 @@ public final class CMSConfig extends AbstractConfig {
register(m_hideTextAssetUploadFile);
register(m_allowContentCreateInSectionListing);
// Content Center (Workspace) config related parameters
register(m_contentCenterMap);
// Content Section config related parameters
register(m_defaultSection);
// Content Section creation parameters
register(m_defaultItemResolverClass);
register(m_defaultTemplateResolverClass);
// publishToFile package related parameter
// Moved to publishToFile.PublishToFileConfig as of version 6.0.2
// register(m_disableItemPfs);
// register(m_publishToFileClass);
@ -506,10 +684,6 @@ public final class CMSConfig extends AbstractConfig {
return (Class) get(m_categoryAuthoringAddForm);
}
public final boolean getUseSectionCategories() {
return ((Boolean) get(m_useSectionCategories)).booleanValue();
}
public final InputStream getItemAdapters() {
// URL resource: protocol handler removal: START
// remove:
@ -610,10 +784,6 @@ public final class CMSConfig extends AbstractConfig {
return ((Integer) get(m_soonExpiredTimespanDays)).intValue();
}
public final String[] getDefaultTaskAlerts() {
return (String[]) get(m_defaultTaskAlerts);
}
public final boolean isUnpublishedNotFound() {
return ((Boolean) get(m_unpublishedNotFound)).booleanValue();
}
@ -639,6 +809,15 @@ public final class CMSConfig extends AbstractConfig {
}
/**
* Fetch the file name contaning XML Mapping of the content center tabs
* to URLs
* @return String containig file name including path component.
*/
public String getContentCenterMap() {
return (String) get(m_contentCenterMap);
}
/**
* Internal class representing a DHTMLEditor configuration parameter. It

View File

@ -1,8 +1,3 @@
com.arsdigita.cms.template_root_path.title=Template Root Path
com.arsdigita.cms.template_root_path.purpose=Path for the default template folder. Path is relative to webapp root
com.arsdigita.cms.template_root_path.example=/packages/content-section/templates
com.arsdigita.cms.template_root_path.format=[string]
com.arsdigita.cms.default_item_template_path.title=Default Item Template Path
com.arsdigita.cms.default_item_template_path.purpose=Path for the default item template. Path is relative to the Template Root path.
com.arsdigita.cms.default_item_template_path.example=/default/item.jsp
@ -13,6 +8,11 @@ com.arsdigita.cms.default_folder_template_path.purpose=Path for the default fold
com.arsdigita.cms.default_folder_template_path.example=/default/folder.jsp
com.arsdigita.cms.default_folder_template_path.format=[string]
com.arsdigita.cms.template_root_path.title=Template Root Path
com.arsdigita.cms.template_root_path.purpose=Path for the default template folder. Path is relative to webapp root
com.arsdigita.cms.template_root_path.example=/packages/content-section/templates
com.arsdigita.cms.template_root_path.format=[string]
com.arsdigita.cms.default_item_resolver_class.title=Item resolver class
com.arsdigita.cms.default_item_resolver_class.purpose=Default item resolver class will be used for any content section which does not override in SectionInitializer enterprise.init section. This class must implement com.arsdigita.cms.dispatcher.ItemResolver.
com.arsdigita.cms.default_item_resolver_class.example=com.arsdigita.cms.dispatcher.MultilingualItemResolver
@ -48,16 +48,21 @@ com.arsdigita.cms.use_streamlined_creation.purpose=Use streamlined content creat
com.arsdigita.cms.use_streamlined_creation.example=false
com.arsdigita.cms.use_streamlined_creation.format=[boolean]
com.arsdigita.cms.hide_templates_tab.title=Hide Templates Tab
com.arsdigita.cms.hide_templates_tab.purpose=Hide the templates tab on the item admin page.
com.arsdigita.cms.hide_templates_tab.example=false
com.arsdigita.cms.hide_templates_tab.format=[boolean]
com.arsdigita.cms.hide_admin_tabs.title=Hide Admin Tabs
com.arsdigita.cms.hide_admin_tabs.purpose=Hide section admin tabs from users without administrative rights.
com.arsdigita.cms.hide_admin_tabs.example=false
com.arsdigita.cms.hide_admin_tabs.format=[boolean]
com.arsdigita.cms.hide_folder_index_checkbox.title=Hide Folder Index Checkbox
com.arsdigita.cms.hide_folder_index_checkbox.purpose=Hide Folder Index Checkbox from folder view
com.arsdigita.cms.hide_folder_index_checkbox.example=false
com.arsdigita.cms.hide_folder_index_checkbox.format=[boolean]
com.arsdigita.cms.hide_templates_tab.title=Hide Templates Tab
com.arsdigita.cms.hide_templates_tab.purpose=Hide the templates tab on the item admin page.
com.arsdigita.cms.hide_templates_tab.example=false
com.arsdigita.cms.hide_templates_tab.format=[boolean]
com.arsdigita.cms.hide_timezone.title=Hide timezone labels
com.arsdigita.cms.hide_timezone.purpose=Hide timezone labels (if, for example, all users will be in the same timezone and such information would be unnecessary)
com.arsdigita.cms.hide_timezone.example=false
@ -78,11 +83,6 @@ com.arsdigita.cms.hide_udct_ui.purpose=Hide User Defined Content Types UI
com.arsdigita.cms.hide_udct_ui.example=false
com.arsdigita.cms.hide_udct_ui.format=[boolean]
com.arsdigita.cms.hide_folder_index_checkbox.title=Hide Folder Index Checkbox
com.arsdigita.cms.hide_folder_index_checkbox.purpose=Hide Folder Index Checkbox from folder view
com.arsdigita.cms.hide_folder_index_checkbox.example=false
com.arsdigita.cms.hide_folder_index_checkbox.format=[boolean]
com.arsdigita.cms.dhtml_editor_config.title=DHTML Editor Configuration
com.arsdigita.cms.dhtml_editor_config.purpose=LIsts the config object name and Javascript source location for its definition
com.arsdigita.cms.dhtml_editor_config.example=HTMLArea.Config.CMSStyled,/assets/htmlarea/config/Styled.js

View File

@ -144,27 +144,44 @@ public class ContentSection extends Application {
// super(BASE_DATA_OBJECT_TYPE);
// }
//
// public ContentSection(String type) {
// super(type);
// }
/**
* Constructor re-creating a content section object by retrieving its data
* object by OID
*
* @param oid
* @throws DataObjectNotFoundException
*/
public ContentSection(OID oid) throws DataObjectNotFoundException {
super(oid);
}
/**
* Constructor re-creating a content section object from its data object.
*
* @param oid
* @throws DataObjectNotFoundException
*/
public ContentSection(DataObject obj) {
super(obj);
}
/**
* Constructor re-creating a content section object by retrieving its data
* Object by ID
*
* @param oid
* @throws DataObjectNotFoundException
*/
public ContentSection(BigDecimal id) throws DataObjectNotFoundException {
super(new OID(BASE_DATA_OBJECT_TYPE, id));
}
public static CMSConfig getConfig() {
return s_config;
}
/**
* @return the base PDL object type for this section. Child classes should
* override this method to return the correct value
@ -234,38 +251,42 @@ public class ContentSection extends Application {
set(NAME, name);
}
/**
* Get the package instance for this content section. Each section is
* associated with exactly one package instance.
*
* @return the package instance associated with this content section.
* @post return != null
*/
// Left-over from content section as old-style application based on kernel
// PackageType and Sitenode instead on new style web.Application.
// Retained for reference purpose until the packages Workspace and Service are
// migrated to new style application as well.
// /**
// * Get the package instance for this content section. Each section is
// * associated with exactly one package instance.
// *
// * @return the package instance associated with this content section.
// * @post return != null
// */
// public PackageInstance getPackageInstance() {
// DataObject pkg = (DataObject) get(PACKAGE);
// Assert.exists(pkg, "package instance");
// return new PackageInstance(pkg);
// }
/**
* Set the package instance for this content section.
*
* @param pkg The package instance
* @pre ( pkg != null )
*/
//
// /**
// * Set the package instance for this content section.
// *
// * @param pkg The package instance
// * @pre ( pkg != null )
// */
// protected void setPackageInstance(PackageInstance pkg) {
// Assert.exists(pkg, "package instance");
// setAssociation(PACKAGE, pkg);
// }
/**
* Fetch the site node on which the content section is mounted.
* A content section should be mounted on exactly one site node. If it
* is mounted on more than one site node, only the first site node will
* be returned.
*
* @return The site node
*/
//
// /**
// * Fetch the site node on which the content section is mounted.
// * A content section should be mounted on exactly one site node. If it
// * is mounted on more than one site node, only the first site node will
// * be returned.
// *
// * @return The site node
// */
// public SiteNode getSiteNode() {
// return getPackageInstance().getDefaultMountPoint();
// }
@ -306,6 +327,7 @@ public class ContentSection extends Application {
return URL.getDispatcherPath() + getPath();
}
// Left over, see above
// public final String getPath() {
// final String path = getSiteNode().getURL();
//
@ -467,7 +489,7 @@ public class ContentSection extends Application {
* @return The class name
* @post ( return != null )
*/
public String getPageResolverClass() {
public String getPageResolverClassName() {
String prc = (String) get(PAGE_RESOLVER_CLASS);
Assert.exists(prc, "Page Resolver class");
return prc;
@ -489,7 +511,7 @@ public class ContentSection extends Application {
}
try {
final Class prc = Class.forName(getPageResolverClass());
final Class prc = Class.forName(getPageResolverClassName());
m_pageResolver = (PageResolver) prc.newInstance();
m_pageResolver.setContentSectionID(getID());
} catch (ClassNotFoundException cnfe) {
@ -513,7 +535,7 @@ public class ContentSection extends Application {
*
* @param className The class name
*/
public void setPageResolverClass(String className) {
public void setPageResolverClassName(String className) {
set(PAGE_RESOLVER_CLASS, className);
m_pageResolver = null;
}
@ -524,7 +546,7 @@ public class ContentSection extends Application {
* @return The class name
* @post ( return != null )
*/
public String getItemResolverClass() {
public String getItemResolverClassName() {
String irc = (String) get(ITEM_RESOLVER_CLASS);
Assert.exists(irc, "Content Item Resolver class");
s_log.debug("Content Item Resolver Class is " + irc);
@ -541,7 +563,7 @@ public class ContentSection extends Application {
public ItemResolver getItemResolver() {
if (m_itemResolver == null) {
try {
final Class irc = Class.forName(getItemResolverClass());
final Class irc = Class.forName(getItemResolverClassName());
m_itemResolver = (ItemResolver) irc.newInstance();
} catch (ClassNotFoundException cnfe) {
throw new UncheckedWrapperException(cnfe);
@ -571,7 +593,7 @@ public class ContentSection extends Application {
* @return The class name
* @post ( return != null )
*/
public String getTemplateResolverClass() {
public String getTemplateResolverClassName() {
String trc = (String) get(TEMPLATE_RESOLVER_CLASS);
Assert.exists(trc, "Template Resolver class");
return trc;
@ -586,7 +608,7 @@ public class ContentSection extends Application {
public TemplateResolver getTemplateResolver() {
if (m_templateResolver == null) {
try {
Class trc = Class.forName(getTemplateResolverClass());
Class trc = Class.forName(getTemplateResolverClassName());
m_templateResolver = (TemplateResolver) trc.newInstance();
} catch (ClassNotFoundException cnfe) {
throw new UncheckedWrapperException(cnfe);
@ -616,7 +638,7 @@ public class ContentSection extends Application {
*
* @return The class name
*/
public String getXMLGeneratorClass() {
public String getXMLGeneratorClassName() {
String xgc = (String) get(XML_GENERATOR_CLASS);
Assert.exists(xgc, "XML Generator class");
return xgc;
@ -631,7 +653,7 @@ public class ContentSection extends Application {
public XMLGenerator getXMLGenerator() {
if (m_xmlGenerator == null) {
try {
Class xgc = Class.forName(getXMLGeneratorClass());
Class xgc = Class.forName(getXMLGeneratorClassName());
m_xmlGenerator = (XMLGenerator) xgc.newInstance();
} catch (ClassNotFoundException cnfe) {
throw new UncheckedWrapperException(cnfe);
@ -940,14 +962,14 @@ public class ContentSection extends Application {
// return getSectionFromPackage(pkg);
}
/**
* Looks up the section given the PackageInstance.
*
* @param pkg The package instance
* @return The content section ID
* @pre ( pkg != null )
* @post ( return != null )
*/
// /**
// * Looks up the section given the PackageInstance.
// *
// * @param pkg The package instance
// * @return The content section ID
// * @pre ( pkg != null )
// * @post ( return != null )
// */
// public static ContentSection getSectionFromPackage(PackageInstance pkg)
// throws DataObjectNotFoundException {
//
@ -1014,6 +1036,48 @@ public class ContentSection extends Application {
/**
* Creates a content section of the given name using default values and
* returns it.
*
* @param name Name of the content section
* @return ContentSection
*/
public static ContentSection create(final String name) {
Folder folder = createRootFolder(name);
Category category = createRootCategory(name);
Group staff = createStaffGroup(name);
// Some default classes for a content section.
String prc = "com.arsdigita.cms.dispatcher.SimplePageResolver";
String irc = "com.arsdigita.cms.dispatcher.MultilingualItemResolver";
String xgc = "com.arsdigita.cms.dispatcher.SimpleXMLGenerator";
String trc = "com.arsdigita.cms.dispatcher.DefaultTemplateResolver";
ContentSection section = ContentSection.create( name,
folder,
category,
staff,
prc,
irc,
xgc,
trc);
// Set the default context on the root folder to
// the content section
PermissionService.setContext(folder.getOID(), section.getOID());
createDefaultResources(section);
// Left over, see above
// }
// };
// rootExcursion.run();
//
// //now retrieve the created content section and return it
// return (ContentSection) Application.retrieveApplicationForPath("/" + name + "/");
return section;
}
/**
* Create a new content section. This method is called automatically when a
@ -1086,8 +1150,7 @@ public class ContentSection extends Application {
//create and initialize the content section application
ContentSection section = (ContentSection) Application.createApplication
(BASE_DATA_OBJECT_TYPE, name, name, null );
section.initialize(
name,
section.initialize( name,
folder,
category,
staff,
@ -1102,46 +1165,6 @@ public class ContentSection extends Application {
}
/**
* Method create. Creates a default content section and returns it
* @param name Name of the content section
* @return ContentSection
*/
public static ContentSection create(final String name) {
Group staff = createStaffGroup(name);
Folder folder = createRootFolder(name);
Category category = createRootCategory(name);
// Some default classes for a content section.
String prc = "com.arsdigita.cms.dispatcher.SimplePageResolver";
String irc = "com.arsdigita.cms.dispatcher.MultilingualItemResolver";
String xgc = "com.arsdigita.cms.dispatcher.SimpleXMLGenerator";
String trc = "com.arsdigita.cms.dispatcher.DefaultTemplateResolver";
ContentSection section = ContentSection.create(
name,
folder,
category,
staff,
prc,
irc,
xgc,
trc);
// Set the default context on the root folder to
// the content section
PermissionService.setContext(folder.getOID(), section.getOID());
createDefaultResources(section);
// }
// };
// rootExcursion.run();
//now retrieve the created content section and return it
// return (ContentSection) Application.retrieveApplicationForPath("/" + name + "/");
return section;
}
/**
* Creates and maps default resources to the content section.
*
@ -1155,8 +1178,7 @@ public class ContentSection extends Application {
// XML resources
ResourceType rt = ResourceType.findResourceType("xml");
Resource r =
rt.createInstance("com.arsdigita.cms.ui.ContentSectionPage");
Resource r = rt.createInstance("com.arsdigita.cms.ui.ContentSectionPage");
r.save();
ResourceMapping rm = r.createInstance(section, "admin");
rm.save();
@ -1176,20 +1198,6 @@ public class ContentSection extends Application {
}
/**
* Creates default staff group and associated default roles for a
* content section.
*
* @param name The name of the content section
* @return The staff group
*/
private static Group createStaffGroup(String name) {
Group staff = new Group();
staff.setName(name + " Administration");
staff.save();
return staff;
}
/**
* Creates the root folder for a content section.
*
@ -1217,6 +1225,20 @@ public class ContentSection extends Application {
return root;
}
/**
* Creates default staff group and associated default roles for a
* content section.
*
* @param name The name of the content section
* @return The staff group
*/
private static Group createStaffGroup(String name) {
Group staff = new Group();
staff.setName(name + " Administration");
staff.save();
return staff;
}
/**
* Initialize a newly created content section.
@ -1245,15 +1267,15 @@ public class ContentSection extends Application {
setName(name);
//setPackageInstance(pkg);
setStaffGroup(staff);
setViewersGroup(viewers);
setRootFolder(folder);
setRootCategory(category);
setPageResolverClass(prc);
setStaffGroup(staff);
setPageResolverClassName(prc);
setItemResolverClass(irc);
setXMLGeneratorClass(xgc);
setTemplatesFolder(templates);
setTemplateResolverClass(trc);
setTemplatesFolder(templates);
setViewersGroup(viewers);
save();
return this;
@ -1273,10 +1295,12 @@ public class ContentSection extends Application {
return new Folder.ItemCollection(dq);
}
@Override
public String getServletPath() {
return URL.SERVLET_DIR + "/content-section";
}
@Override
public String getStylesheetPath() {
return STYLESHEET;
}

View File

@ -23,7 +23,8 @@ import com.arsdigita.cms.dispatcher.AssetURLFinder;
import com.arsdigita.cms.dispatcher.ItemDelegatedURLPatternGenerator;
import com.arsdigita.cms.dispatcher.ItemTemplatePatternGenerator;
import com.arsdigita.cms.dispatcher.ItemURLFinder;
import com.arsdigita.cms.installer.WorkspaceInstaller;
// import com.arsdigita.cms.installer.WorkspaceInstaller;
// import com.arsdigita.cms.installer.ContentCenterSetup;
import com.arsdigita.cms.publishToFile.PublishToFileListener;
import com.arsdigita.cms.publishToFile.QueueManager;
import com.arsdigita.cms.search.AssetMetadataProvider;
@ -49,10 +50,10 @@ import com.arsdigita.domain.DomainObjectInstantiator;
import com.arsdigita.domain.xml.TraversalHandler;
import com.arsdigita.kernel.ACSObjectInstantiator;
import com.arsdigita.kernel.NoValidURLException;
import com.arsdigita.kernel.PackageInstance;
import com.arsdigita.kernel.PackageInstanceCollection;
import com.arsdigita.kernel.PackageType;
import com.arsdigita.kernel.SiteNode;
// import com.arsdigita.kernel.PackageInstance;
// import com.arsdigita.kernel.PackageInstanceCollection;
// import com.arsdigita.kernel.PackageType;
// import com.arsdigita.kernel.SiteNode;
import com.arsdigita.kernel.URLFinder;
import com.arsdigita.kernel.URLFinderNotFoundException;
import com.arsdigita.kernel.URLService;
@ -62,7 +63,7 @@ import com.arsdigita.persistence.OID;
import com.arsdigita.persistence.pdl.ManifestSource;
import com.arsdigita.persistence.pdl.NameFilter;
import com.arsdigita.runtime.CompoundInitializer;
import com.arsdigita.runtime.ConfigError;
// import com.arsdigita.runtime.ConfigError;
import com.arsdigita.runtime.DomainInitEvent;
import com.arsdigita.runtime.LegacyInitializer;
import com.arsdigita.runtime.PDLInitializer;
@ -87,14 +88,15 @@ import com.arsdigita.cms.util.LanguageUtil;
import com.arsdigita.kernel.Kernel;
// For Id.
import java.math.BigDecimal;
// import java.math.BigDecimal;
import org.apache.log4j.Logger;
/**
* The main CMS initializer.
* The main CMS initializer, executed recurringly at each system startup.
*
* @author Justin Ross &lt;jross@redhat.com&gt;
* @author Peter Boy &lt;pboy@barkhof.uni-bremen.de&gt;
* @version $Id: Initializer.java 2070 2010-01-28 08:47:41Z pboy $
*/
public class Initializer extends CompoundInitializer {
@ -103,8 +105,17 @@ public class Initializer extends CompoundInitializer {
/** Creates a s_logging category with name = to the full name of class */
private static Logger s_log = Logger.getLogger(Initializer.class);
/** Configuration object for the CMS module */
private static final CMSConfig s_conf = CMSConfig.getInstance();
// Verursacht aktuell eine Exception "no such context"
// Vermutliche Lösung: in config.xml eintragen.
// static { // requirred to actually read the config file!
// s_conf.load();
// }
/**
* Constructor
* Constructor, adds db connection information and various sub-initializers
* for subpackages in the CMS module.
*/
public Initializer() {
final String url = RuntimeConfig.getConfig().getJDBCURL();
@ -127,7 +138,7 @@ public class Initializer extends CompoundInitializer {
//
// Invokes ContentCenterSetup (without any LegacyInitializer)
// performs mainly loader tasks and should be migrated to Loader.
add(new com.arsdigita.cms.installer.Initializer());
// add(new com.arsdigita.cms.installer.Initializer());
// Step 2:
// Old type initializer "com.arsdigita.cms.installer.xml.ContentTypeInitializer"
@ -145,7 +156,7 @@ public class Initializer extends CompoundInitializer {
// Initializer for content section, needed when LegacyInitializer in step 4
// has been moved to c.ad.Loader in order to register the application and
// optionally to install additional content sections.
// add(new com.arsdigita.cms.contentsection.Initializer());
add(new com.arsdigita.cms.contentsection.Initializer());
// Used to be step 3 in old enterprise.init migrated to loader/new init.
add(new com.arsdigita.cms.publishToFile.Initializer());
@ -231,9 +242,15 @@ public class Initializer extends CompoundInitializer {
registerPatternGenerators();
// cg - register Task Retrieval engine
Engine.registerEngine(CMSEngine.CMS_ENGINE_TYPE, new CMSEngine());
// Setup Workspace tab to URL mapping
final String workspaceURL = CMS.WORKSPACE_PACKAGE_KEY;
final String contentCenterMap = s_conf.getContentCenterMap();
WorkspaceSetup workspaceSetup = new WorkspaceSetup( workspaceURL,
contentCenterMap);
workspaceSetup.run();
// register item adapters
XML.parse(ContentSection.getConfig().getItemAdapters(),
new TraversalHandler());
@ -316,6 +333,7 @@ public class Initializer extends CompoundInitializer {
f.registerInstantiator
(WorkflowTemplate.BASE_DATA_OBJECT_TYPE,
new ACSObjectInstantiator() {
@Override
public DomainObject doNewInstance(DataObject dataObject) {
return new WorkflowTemplate(dataObject);
}
@ -327,6 +345,7 @@ public class Initializer extends CompoundInitializer {
public DomainObject doNewInstance(DataObject dataObject) {
return new TemplateContext(dataObject);
}
@Override
public DomainObjectInstantiator
resolveInstantiator(DataObject obj) {
return this;

View File

@ -18,11 +18,13 @@
*/
package com.arsdigita.cms;
import com.arsdigita.cms.installer.ContentSectionSetup;
// import com.arsdigita.cms.CMS;
// import com.arsdigita.cms.installer.ContentSectionSetup;
import com.arsdigita.cms.contentsection.ContentSectionSetup;
// import com.arsdigita.cms.installer.PageClassConfigHandler;
import com.arsdigita.cms.installer.Util;
import com.arsdigita.cms.util.Util;
import com.arsdigita.cms.installer.xml.XMLContentTypeHandler;
import com.arsdigita.cms.installer.WorkspaceInstaller;
// import com.arsdigita.cms.installer.WorkspaceInstaller;
//import com.arsdigita.cms.portlet.ContentDirectoryPortlet;
import com.arsdigita.cms.portlet.ContentItemPortlet;
//import com.arsdigita.cms.portlet.ContentSectionsPortlet;
@ -38,7 +40,7 @@ import com.arsdigita.kernel.KernelExcursion;
import com.arsdigita.kernel.PackageInstance;
import com.arsdigita.kernel.PackageType;
import com.arsdigita.kernel.SiteNode;
// import com.arsdigita.kernel.Stylesheet;
import com.arsdigita.kernel.Stylesheet;
import com.arsdigita.kernel.permissions.PrivilegeDescriptor;
import com.arsdigita.loader.PackageLoader;
import com.arsdigita.persistence.DataObject;
@ -138,11 +140,11 @@ public class Loader extends PackageLoader {
private final static String CMS_STYLESHEET =
"/packages/content-section/xsl/cms.xsl";
/**
* Constant string used as key for creating Workspace (content-center) as a
* legacy application.
*/
public static final String WORKSPACE_PACKAGE_KEY = "content-center";
// /**
// * Constant string used as key for creating Workspace (content-center) as a
// * legacy application.
// */
// public static final String WORKSPACE_PACKAGE_KEY = "content-center";
private static final String WORKSPACE_INSTANCE_NAME = "Content Center";
/**
* Dispatcher class for Workspace (content-center) (needed to be assigned
@ -163,11 +165,11 @@ public class Loader extends PackageLoader {
* Name of the CMS service package instance, i.e. its URL.
*/
private final static String SERVICE_URL = "cms-service";
/**
* Constant string used as key for creating service package as a
* legacy application.
*/
public final static String SERVICE_PACKAGE_KEY = "cms-service";
// /**
// * Constant string used as key for creating service package as a
// * legacy application.
// */
// public final static String SERVICE_PACKAGE_KEY = "cms-service";
@ -235,40 +237,43 @@ public class Loader extends PackageLoader {
}.run();
}
/**
* Loads the CMS package type in the database, i.e. content-section,
* the main CMS domain (application) class.
*
* (pb) WRONG:
* Creates content-section PackageType. Is replaced by newer ApplicationType
* mechanisam (see loadContentSection). Must nolonger be used.
* createPrivileges might be included in load, but has te be executed at
* each startup to take modifications into accout. So it has to be an
* initializer task anyway.
*/
private void loadCMSPackageType() {
s_log.debug("Loading the CMS package type...");
// creating appl. type using the deprecated legacy application style.
// Should be refactored to c.ad.web.Application.
// CMS_PACKAGE_KEY = "content-section"
// Migration Status:
// Method completely replaced by loadContentSection()
// Code kept for reference purpose untill the complete migration will be done.
//
// /**
// * Loads the CMS package type in the database, i.e. content-section,
// * the main CMS domain (application) class.
// *
// * (pb) WRONG:
// * Creates content-section PackageType. Is replaced by newer ApplicationType
// * mechanisam (see loadContentSection). Must nolonger be used.
// * createPrivileges might be included in load, but has te be executed at
// * each startup to take modifications into accout. So it has to be an
// * initializer task anyway.
// */
// private void loadCMSPackageType() {
// s_log.debug("Loading the CMS package type...");
//
// // creating appl. type using the deprecated legacy application style.
// // Should be refactored to c.ad.web.Application.
// // CMS_PACKAGE_KEY = "content-section"
// PackageType type = PackageType.create
// (CMS_PACKAGE_KEY,
// "Content Management System",
// "Content Management Systems",
// "http://cms-java.arsdigita.com/");
//
// type.setDispatcherClass(CMS_DISPATCHER_CLASS);
//type.addListener(LISTENER_CLASS); (commented out)
// Register a stylesheets to the CMS package.
// //type.addListener(LISTENER_CLASS); (commented out)
//
// // Register a stylesheets to the CMS package.
// Stylesheet ss = Stylesheet.createStylesheet(CMS_STYLESHEET);
// ss.save();
// type.addStylesheet(ss);
// type.save();
//
//
// Creating of CMS package using new style c.ad.web.Application could
// be done like the following.
// ApplicationType type = ApplicationType
@ -280,12 +285,12 @@ public class Loader extends PackageLoader {
// // setDispatcherClass in web.Application or does it work magically without?
// type.setDispatcherClass(CMS_DISPATCHER_CLASS);
// type.addStylesheet(ss);
createPrivileges();
s_log.debug("Done creating the CMS package type.");
}
//
//
// createPrivileges();
//
// s_log.debug("Done creating the CMS package type.");
// }
/**
@ -296,29 +301,42 @@ public class Loader extends PackageLoader {
private void loadWorkspacePackage() {
s_log.debug("Creating CMS Workspace...");
WorkspaceInstaller workspaceInstaller = new WorkspaceInstaller();
// from WorkspaceInstaller workspaceInstaller = new WorkspaceInstaller();
try {
workspaceInstaller.createPackageType();
// type.setDispatcherClass(WORKSPACE_DISPATCHER_CLASS);
// workspaceInstaller.createPackageType();
PackageType type = PackageType.create(CMS.WORKSPACE_PACKAGE_KEY,
"Content Center",
"Content Centers",
"http://cms-workspace.arsdigita.com/");
type.setDispatcherClass(WORKSPACE_DISPATCHER_CLASS);
// PackageInstance instance = workspaceInstaller.createPackageInstance();
// Does the following:
// type = PackageType.findByKey(WORKSPACE_PACKAGE_KEY);
// PackageInstance instance = type.createInstance(WORKSPACE_INSTANCE_NAME);
// instance.save();
PackageInstance instance = workspaceInstaller.createPackageInstance();
// Register a stylesheet to the Content Center package.
Stylesheet ss =
Stylesheet.createStylesheet(WORKSPACE_STYLESHEET);
ss.save();
type.addStylesheet(ss);
// workspaceInstaller.mountPackageInstance(instance, m_workspaceURL);
type.save();
// from PackageInstance instance = workspaceInstaller.createPackageInstance();
// Does the following:
// SiteNode node = SiteNode.createSiteNode(
// s_conf.getWorkspaceURL(),
type = PackageType.findByKey(CMS.WORKSPACE_PACKAGE_KEY);
PackageInstance instance = type.createInstance(WORKSPACE_INSTANCE_NAME);
instance.save();
// from: workspaceInstaller.mountPackageInstance(instance, m_workspaceURL);
// Does the following:
// We really don't want it configurable.
// SiteNode node = SiteNode.createSiteNode(CMS.WORKSPACE_PACKAGE_KEY,
// SiteNode.getRootSiteNode());
// node.mountPackage(instance);
// node.save();
SiteNode node = SiteNode.createSiteNode(CMS.WORKSPACE_PACKAGE_KEY,
SiteNode.getRootSiteNode());
node.mountPackage(instance);
node.save();
// m_workspaceURL == WORKSPACE_PACKAGE_KEY
// workspaceInstaller.mountPackageInstance(instance, m_workspaceURL);
workspaceInstaller.mountPackageInstance(instance, WORKSPACE_PACKAGE_KEY);
// workspaceInstaller.mountPackageInstance(instance, CMS.WORKSPACE_PACKAGE_KEY);
} catch (DataObjectNotFoundException e) {
throw new ConfigError(
@ -387,7 +405,7 @@ public class Loader extends PackageLoader {
try {
// from ServiceInstaller.createPackageType();
PackageType type = PackageType.create
(SERVICE_PACKAGE_KEY,
(CMS.SERVICE_PACKAGE_KEY,
"Content Management System Services",
"Content Management System Services",
"http://cms-service.arsdigita.com/");
@ -396,8 +414,8 @@ public class Loader extends PackageLoader {
type.save();
// from PackageInstance instance = ServiceInstaller.createPackageInstance();
type = PackageType.findByKey(SERVICE_PACKAGE_KEY);
PackageInstance instance = type.createInstance(SERVICE_PACKAGE_KEY);
type = PackageType.findByKey(CMS.SERVICE_PACKAGE_KEY);
PackageInstance instance = type.createInstance(CMS.SERVICE_PACKAGE_KEY);
instance.save();
// from ServiceInstaller.mountPackageInstance(instance, url);
@ -472,48 +490,68 @@ public class Loader extends PackageLoader {
s_log.info("Creating content section on /" + name);
// Step 1: Creating content section application type first so that
// concrete content-section instance can be created.
ContentSectionSetup.setupContentSectionAppType();
createPrivileges();
// Step 2: Validatge name for section
// Step 1: Validate name for section
Util.validateURLParameter("name", name);
// Step 3: Create the installation default content section "name"
ContentSection section = ContentSection.create(name);
// Step 2: Creating content section application type first so that
// concrete content-section instance can be created.
// from: ContentSectionSetup.setupContentSectionAppType();
// Install application type using new application classes
ApplicationSetup appType = new ApplicationSetup(s_log);
appType.setApplicationObjectType(ContentSection.BASE_DATA_OBJECT_TYPE);
appType.setKey(ContentSection.PACKAGE_TYPE); // by default: content-section
appType.setTitle("CMS Content Section");
appType.setDescription("A CMS Content Section");
appType.setPortalApplication(false);
//setup.setDispatcherClass(ContentItemDispatcher.class.getName());
appType.setStylesheet(CMS_STYLESHEET); // by default: /pack./c-s/xml/cms.xml
// contains the xsl to generate the page
appType.setInstantiator(new ACSObjectInstantiator() {
@Override
public DomainObject doNewInstance(DataObject dataObject) {
return new ContentSection(dataObject);
}
});
appType.run();
// ContentSectionSetup is a convenient class for ContentSection.create()
// Step 3:
createPrivileges();
// Step 4: Create the installation default content section "name"
// ContentSection.create creates a section with several default values
// which have to be adopted for a concrete installation.
ContentSection section = ContentSection.create(name);
// ContentSectionSetup is a convenient class to adopt a section created
// by ContentSection.create()
ContentSectionSetup setup = new ContentSectionSetup(section);
// ContentSection.create uses the following properties:
// Name, see above
// Root & template folder, set autonomously by ContentSection.create()
// Roles (staff group) used in content section. Register roles using
// a complete set of default roles defined in ContentSectionSetup
setup.registerRoles(s_conf.getStuffGroup());
// ViewerGroup populated in ContentSection, public access is determined
// by parameter (affecting characteristics of the viewer group)
setup.registerViewers(s_conf.isPubliclyViewable());
// Page resolver class, set autonomously by ContentSection.create()
// Item resolver class, configurable, defaults in place.
// Template resolver class, configurable, defaults in place.
// We should not overwrite the default in the initial default configuration
// registers a predefined standard recipient for alerts
setup.registerAlerts();
// register a predefined one-phase lifecycle for items.
setup.registerPublicationCycles();
// registers predefined "Authoring", "Approval", "Publishing' steps
setup.registerWorkflowTemplates();
setup.registerContentTypes(s_conf.getContentSectionsContentTypes());
setup.registerResolvers(s_conf.getItemResolverClass(),
s_conf.getTemplateResolverClass() );
// XML generator class, set autonomously by ContentSection.create()
// section specific categories, usually not used.
setup.registerContentTypes(s_conf.getContentSectionsContentTypes());
// Section specific categories, usually not used.
// During initial load at install time nor used at all!
// default value is false so no categories get loaded.
if (s_conf.getUseSectionCategories()) {
@ -523,6 +561,13 @@ public class Loader extends PackageLoader {
}
}
// registers a predefined standard recipient for alerts
setup.registerAlerts();
// Load a list of cms tasks and associated alert events
// Currently no functionality to persist them. Not a loader task yet
// setup.loadTaskAlerts(s_conf.getTaskAlerts());
section.save(); //persists any changes in the database (DomainObject)
//i.e. creates an object (instance)

View File

@ -17,18 +17,6 @@
*/
// *****************************************************************************
// Stand:
// Alle Parameter aus SectionInitializer und enterprise.init hierhin übertragen.
// Noch zu klären, welche gehören tatsächlich hier hin?
// In Loader gehören nur solche, die in der Datenbank eingetragen werden (persisted).
// Alles, was zur Laufzeit eingestellt wird, muss in Initializer configuration.
// *****************************************************************************
package com.arsdigita.cms;
//import com.arsdigita.kernel.permissions.PrivilegeDescriptor;
@ -60,32 +48,36 @@ public final class LoaderConfig extends AbstractConfig {
private static final Logger s_log = Logger.getLogger(LoaderConfig.class);
// ////////////////////////////////////////////////
// The following two (three) parameters are used by
// com.arsdigita.cms.installer.Initializer
// ////////////////////////////////////////////////
// /**
// * The name of the workspace package instance, i.e. URL of the workspace,
// * where authors, editors and publishers are working and from which they
// * can select a content-section to create and edit documents.
// * Usually you won't modify it!
// *
// * NOTE Version 6.6.1 /2010-10-27)
// * This parameter is not used in Loader. Perhaps we will make it configurable
// * a migrating Workspace to new application style so it is retained here
// * for the time being.
// */
// private StringParameter
// m_workspaceURL = new StringParameter(
// "com.arsdigita.cms.loader.workspace_url",
// Parameter.REQUIRED,
// "content-center");
/**
* The name of the workspace package instance, i.e. URL of the workspace,
* where authors, editors and publishers are working and from which they
* can select a content-section to create and edit documents.
* Usually you won't modify it!
*/
private StringParameter
m_workspaceURL = new StringParameter(
"com.arsdigita.cms.loader.workspace_url",
Parameter.REQUIRED,
"content-center");
/**
* XML Mapping of the content center tabs to URLs, see
* {@link ContentCenterDispatcher}
*/
private final StringParameter
m_contentCenterMap = new StringParameter(
"com.arsdigita.cms.loader.content_center_map",
Parameter.REQUIRED,
"/WEB-INF/resources/content-center-map.xml");
// /**
// * XML Mapping of the content center tabs to URLs, see
// * {@link ContentCenterDispatcher}
// * NOTE Version 6.6.1 /2010-10-27)
// * Currently not used in Loader because it will not be persisted. Retained
// * here for reference in case we will add persisting while migrating to
// * new style application.
// */
// private final StringParameter
// m_contentCenterMap = new StringParameter(
// "com.arsdigita.cms.loader.content_center_map",
// Parameter.REQUIRED,
// "/WEB-INF/resources/content-center-map.xml");
// Update master object if upgrading from old versioning
// XXX: shouldn't we just gut this section (and
@ -127,7 +119,7 @@ public final class LoaderConfig extends AbstractConfig {
m_ctDefFiles = new StringArrayParameter(
"com.arsdigita.cms.loader.contenttype_definition_files",
Parameter.REQUIRED,
// Generic*.xml added by Quasi in enterprise.init fot
// Generic*.xml added by Quasi in enterprise.init for
// new generic Basetypes in addition to article
new String[] {"/WEB-INF/content-types/GenericAddress.xml",
"/WEB-INF/content-types/GenericArticle.xml",
@ -153,7 +145,7 @@ public final class LoaderConfig extends AbstractConfig {
*/
private final Parameter
m_contentSectionName = new StringParameter(
"com.arsdigita.cms.loader.content_section_name",
"com.arsdigita.cms.loader.section_name",
Parameter.REQUIRED,
"content");
//"public");
@ -172,7 +164,7 @@ public final class LoaderConfig extends AbstractConfig {
* Not implemented yet! We need a new parameter type "list" which must have
* multidimensional capabilities.
*/
// private final StringParameter
// private final Parameter
// m_staffGroup = new StringParameter(
// "com.arsdigita.cms.loader.section_staff_group",
// Parameter.REQUIRED,
@ -212,7 +204,7 @@ public final class LoaderConfig extends AbstractConfig {
*/
private final Parameter
m_contentTypeList = new StringArrayParameter(
"com.arsdigita.cms.loader.ctypes_include_list",
"com.arsdigita.cms.loader.section_ctypes_list",
Parameter.REQUIRED,
new String[] {} );
@ -287,13 +279,24 @@ public final class LoaderConfig extends AbstractConfig {
Parameter.REQUIRED,
new String[] {"/WEB-INF/resources/article-categories.xml",
"/WEB-INF/resources/navigation-categories.xml"} );
// Category tree to load
// categories = { "/WEB-INF/resources/article-categories.xml",
// "/WEB-INF/resources/navigation-categories.xml" };
// m_conf.initParameter(CATEGORIES,
// "XML file containing the category tree",
// List.class,
// Collections.EMPTY_LIST);
// Currently not a Loader task. There is no way to persist tasks preferences
// on a per section base.
// /**
// * When to generate email alerts: by default, generate email alerts
// * on enable, finish, and rollback (happens on rejection) changes.
// * There are four action types for each task type: enable,
// * disable, finish, and rollback. Note that the values below are
// * based on the task labels, and as such are not globalized.
// */
// private final Parameter
// m_taskAlerts = new StringArrayParameter(
// "com.arsdigita.cms.task_alerts",
// Parameter.REQUIRED, new String[] {
// "Authoring:enable:finish:rollback",
// "Approval:enable:finish:rollback",
// "Deploy:enable:finish:rollback" } );
// ///////////////////////////////////////////////////////////////////////
@ -351,8 +354,8 @@ public final class LoaderConfig extends AbstractConfig {
*/
public LoaderConfig() {
register(m_workspaceURL);
register(m_contentCenterMap);
// register(m_workspaceURL);
// register(m_contentCenterMap);
register(m_ctDefFiles);
// Parameters for creating a content section
@ -365,9 +368,10 @@ public final class LoaderConfig extends AbstractConfig {
register(m_useSectionCategories);
register(m_categoryFileList);
// (Currently not a loader task)
// register(m_taskAlerts);
// Parameters controlling Overdue Task alerts:
// (Currently not a loader task)
// register(m_taskAlerts); no Loader task, moved to contentsection/Initializer
// register(m_sendOverdueAlerts);
// register(m_taskDuration);
// register(m_overdueAlertInterval);
@ -386,22 +390,24 @@ public final class LoaderConfig extends AbstractConfig {
//
// //////////////////////////
/**
* Fetch name (URL) of the workspace package instance, e.g. content-center
* @return (URL) of the workspace package instance
*/
public String getWorkspaceURL() {
return (String) get(m_workspaceURL);
}
// Not used as long as we use old style application (seee above)
// /**
// * Fetch name (URL) of the workspace package instance, e.g. content-center
// * @return (URL) of the workspace package instance
// */
// public String getWorkspaceURL() {
// return (String) get(m_workspaceURL);
// }
/**
* Fetch the file name contaning XML Mapping of the content center tabs
* to URLs
* @return String containig file name including path component.
*/
public String getContentCenterMap() {
return (String) get(m_contentCenterMap);
}
// Moved to CMSConfig as long as it is not a Loader task. (see above)
// /**
// * Fetch the file name contaning XML Mapping of the content center tabs
// * to URLs
// * @return String containig file name including path component.
// */
// public String getContentCenterMap() {
// return (String) get(m_contentCenterMap);
// }
public List getCTDefFiles() {
String[] ctDefFiles = (String[]) get(m_ctDefFiles);
@ -424,8 +430,7 @@ public final class LoaderConfig extends AbstractConfig {
*
* In loading step a complete default configuration is persisted in database,
* immutable at this point.
* See contentsection.ContentSectio
nSetup.registerRoles()
* See contentsection.ContentSectionSetup.registerRoles()
* In enterprise.init: name roles, List of roles to create.
*
* Set consists of a set of roles, for each role first field is the role name,
@ -557,6 +562,10 @@ nSetup.registerRoles()
}
// public final String[] getTaskAlerts() {
// return (String[]) get(m_taskAlerts);
// }
// Parameters controlling Overdue Task alerts:
// Currently not a loader task, see above

View File

@ -7,3 +7,28 @@ com.arsdigita.cms.loader.content_center_map.title=Frequency
com.arsdigita.cms.loader.content_center_map.purpose=How often (in seconds) does the system look for pending items to make them live and live items to expire.
com.arsdigita.cms.loader.content_center_map.example=600
com.arsdigita.cms.loader.content_center_map.format=[integer]
com.arsdigita.cms.loader.contenttype_definition_files.title=
com.arsdigita.cms.loader.contenttype_definition_files.purpose=
com.arsdigita.cms.loader.contenttype_definition_files.example=
com.arsdigita.cms.loader.contenttype_definition_files.format=[StringArray]
com.arsdigita.cms.loader.section_name.title=
com.arsdigita.cms.loader.section_name.purpose=
com.arsdigita.cms.loader.section_name.example=
com.arsdigita.cms.loader.section_name.format=[StringArray]
com.arsdigita.cms.loader.section_staff_group.title=
com.arsdigita.cms.loader.section_staff_group.purpose=
com.arsdigita.cms.loader.section_staff_group.example=
com.arsdigita.cms.loader.section_staff_group.format=[StringArray]
com.arsdigita.cms.loader.section_is_public.title=
com.arsdigita.cms.loader.section_is_public.purpose=
com.arsdigita.cms.loader.section_is_public.example=
com.arsdigita.cms.loader.section_is_public.format=[StringArray]
com.arsdigita.cms.loader.section_ctypes_list.title=
com.arsdigita.cms.loader.section_ctypes_list.purpose=
com.arsdigita.cms.loader.section_ctypes_list.example=
com.arsdigita.cms.loader.section_ctypes_list.format=[ boolean]

View File

@ -0,0 +1,140 @@
/*
* Copyright (C) 2010 Peter Boy <pboy@barkhof.uni-bremen.de> All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.cms;
import com.arsdigita.cms.util.PageClassConfigHandler;
// import com.arsdigita.domain.DataObjectNotFoundException;
import com.arsdigita.runtime.ConfigError;
import com.arsdigita.initializer.InitializationException;
// import com.arsdigita.kernel.PackageInstance;
// import com.arsdigita.kernel.PackageType;
// import com.arsdigita.kernel.Stylesheet;
// import com.arsdigita.kernel.permissions.PrivilegeDescriptor;
// import com.arsdigita.persistence.DataQuery;
// import com.arsdigita.persistence.SessionManager;
import com.arsdigita.util.UncheckedWrapperException;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.apache.log4j.Logger;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
/**
* Sets up the CMS package.
*
* @author Peter Boy <pboy@barkhof.uni-bremen.,de>
* @version $Id: $
*/
public final class WorkspaceSetup {
private static Logger s_log = Logger.getLogger(WorkspaceSetup.class);
/** URL to access the CMS Workspace, by default content-center */
final String m_workspaceURL;
/** Map of URL stubs and resource handler classes for ContentCenterDispatcher
* to use */
final String m_contentCenterMap;
/** Contains mapping of URL (key) to resource handler*/
private static HashMap s_pageClasses = new HashMap();
/** Contains mapping of resource(key) to resource handler */
private static HashMap s_pageURLs = new HashMap();
/**
* Constructor
*
* @param workspaceURL
* @param contentCenterMap
*/
public WorkspaceSetup( String workspaceURL,
String contentCenterMap) {
m_workspaceURL = workspaceURL;
m_contentCenterMap = contentCenterMap;
}
/** Gives you a mapping of URL (key) to resource handler
* Use the returned map like so: map.get("search");
*/
public static HashMap getURLToClassMap() {
return s_pageClasses;
}
/** Gives you a mapping of resource(key) to resource handler
* Use the returned map like so: map.get("com.arsdigita.cms.ui.WorkspacePage");
*/
public static HashMap getClassToURLMap() {
return s_pageURLs;
}
public void run() {
// Load the content-center page mappings.
// Has to be executed at each system startup and is an
// Initializer task.
setupContentCenter();
}
/**
* Load the content center page mappings.
* Mapping stored in hashMaps, must be run during each system startup, so
* it is an initializer task.
* @throws InitializationException
*/
private void setupContentCenter() throws ConfigError {
final PageClassConfigHandler handler
= new PageClassConfigHandler(s_pageClasses, s_pageURLs);
final ClassLoader loader = Thread.currentThread()
.getContextClassLoader();
final InputStream input = loader.getResourceAsStream
(m_contentCenterMap.substring(1));
if (input == null) {
throw new IllegalStateException(m_contentCenterMap + " not found");
}
final InputSource source = new InputSource(input);
try {
final SAXParserFactory spf = SAXParserFactory.newInstance();
final SAXParser parser = spf.newSAXParser();
parser.parse(source, handler);
} catch (ParserConfigurationException e) {
throw new UncheckedWrapperException("error parsing dispatcher config", e);
} catch (SAXException e) {
throw new UncheckedWrapperException("error parsing dispatcher config", e);
} catch (IOException e) {
throw new UncheckedWrapperException("error parsing dispatcher config", e);
}
}
}

View File

@ -35,7 +35,7 @@ import com.arsdigita.util.parameter.StringParameter;
// import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
//import java.util.ArrayList;
import java.util.ArrayList;
import org.apache.log4j.Logger;
@ -52,8 +52,37 @@ public final class ContentSectionConfig extends AbstractConfig {
private static final Logger s_log =
Logger.getLogger(ContentSectionConfig.class);
/** Private Object to hold one's own instance to return to users. */
private static ContentSectionConfig s_config;
// Parameters controlling Overdue Task alerts:
/**
* Returns the singleton configuration record for the content section
* environment.
*
* @return The <code>ContentSectionConfig</code> record; it cannot be null
*/
public static final synchronized ContentSectionConfig getInstance() {
if (s_config == null) {
s_config = new ContentSectionConfig();
// deprecated
// s_config.require("ccm-core/runtime.properties");
// use instead:
// read values from the persistent storage
s_config.load();
}
return s_config;
}
// /////////////////////////////////////////////////////////////////////////////
//
// Set of parameters controlling Overdue Task alerts:
// Currently there is no way to persist it nor to persist on a per section base.
// Therefore Initializer has to create overdue task alert mechanism using a
// configuration applied to every content section.
//
// /////////////////////////////////////////////////////////////////////////////
/**
* A list of workflow tasks, and the associated events for which alerts
@ -80,17 +109,23 @@ public final class ContentSectionConfig extends AbstractConfig {
* };
* </pre>
*
* Default value (site-wide) is handled via the parameter
* <pre>com.arsdigita.cms.default_task_alerts</pre>.
* Section-specific override can be added here. Only do so if you are
* changing for a good reason from the default for a specific content section.
* In the new Initializer system we use a specifically formatted String Array
* because we have no List parameter. Format:
* - A string for each task to handle, possible values: Authoring, Approval,
* Depploy
* - Each String: [taskName]:[alert_1]:...:[alert_n]
* Currently there is no way to persist taskAlerts section specific. So all
* sections have to treated equally.
* Default values are provided here.
*/
private final Parameter
m_taskAlerts = new StringArrayParameter(
"com.arsdigita.cms.loader.section_task_alerts",
Parameter.REQUIRED,
null );
// new String[] {} );
"com.arsdigita.cms.section.task_alerts",
Parameter.REQUIRED, new String[] {
"Authoring:enable:finish:rollback",
"Approval:enable:finish:rollback",
"Deploy:enable:finish:rollback" }
);
/**
* Should we send alerts about overdue tasks at all?
@ -100,7 +135,7 @@ public final class ContentSectionConfig extends AbstractConfig {
*/
private final Parameter
m_sendOverdueAlerts = new BooleanParameter(
"com.arsdigita.cms.contentsection.send_overdue_alerts",
"com.arsdigita.cms.section.send_overdue_alerts",
Parameter.REQUIRED,
false );
@ -117,7 +152,7 @@ public final class ContentSectionConfig extends AbstractConfig {
// considered overdue (in hours)
private final Parameter
m_taskDuration = new IntegerParameter(
"com.arsdigita.cms.contentsection.task_duration",
"com.arsdigita.cms.section.task_duration",
Parameter.REQUIRED,
new Integer(96) );
@ -131,7 +166,7 @@ public final class ContentSectionConfig extends AbstractConfig {
*/
private final Parameter
m_alertInterval = new IntegerParameter(
"com.arsdigita.cms.contentsection.alert_interval",
"com.arsdigita.cms.section.alert_interval",
Parameter.REQUIRED,
new Integer(24) );
@ -144,7 +179,7 @@ public final class ContentSectionConfig extends AbstractConfig {
*/
private final Parameter
m_maxAlerts = new IntegerParameter(
"com.arsdigita.cms.contentsection.max_alerts",
"com.arsdigita.cms.section.max_alerts",
Parameter.REQUIRED,
new Integer(5) );
@ -168,9 +203,141 @@ public final class ContentSectionConfig extends AbstractConfig {
*/
private final Parameter
m_newContentSectionName = new StringParameter(
"com.arsdigita.cms.contentsection.new_section_name",
Parameter.REQUIRED,
"com.arsdigita.cms.section.new_section_name",
Parameter.OPTIONAL,
null);
/**
* Staff Group
* Contains roles and associated privileges. In loading step a complete
* default configuration is persisted in database, immutable at this point.
* See contentsection.ContentSectionSetup.registerRoles()
* In enterprise.init: name roles, List of roles to create.
*
* Not implemented yet! We need a new parameter type "list" which must have
* multidimensional capabilities.
*/
// private final StringParameter
// m_staffGroup = new StringParameter(
// "com.arsdigita.cms.loader.section_staff_group",
// Parameter.REQUIRED,
// null);
private List m_staffGroup;
// Viewer group, set autonomously by ContentSection.create() method. We can
// here specify, whether the first ( probalby only) content section should
// have a public viewer, i.e. without registration and login.
/**
* Whether to make content viewable to 'The Public', ie non-registered users.
*
* Parameter name in the old initializer code: PUBLIC. Default true.
*/
private final BooleanParameter
m_isPublic = new BooleanParameter(
"com.arsdigita.cms.section.is_public",
Parameter.REQUIRED,
true);
/**
* List of content types to register in the given content-section.
*
* Example:
* {
* "com.arsdigita.cms.contenttypes.Address",
* "com.arsdigita.cms.contenttypes.Article",
* "com.arsdigita.cms.contenttypes.Contact"
* }
*
* Parameter name "TYPES" in the old initializer code, empty by default in
* the former enterprise.init file.
* When the list is empty and the first default content section is created,
* all installed content types will get registered. This behaviour should
* not be altered without very good reasons.
*/
private final Parameter
m_contentTypeList = new StringArrayParameter(
"com.arsdigita.cms.section.ctypes_list",
Parameter.REQUIRED,
new String[] {} );
// Page Resolver Class, set autonomously by ContentSection.create() method.
// Item Resolver Class, configurable.
/**
* Name of the item resolver class to use for the section (defaults to
* <pre>com.arsdigita.cms.dispatcher.MultilingualItemResolver</pre>).
*
* Default value (site-wide) is handled via the parameter
* <pre>com.arsdigita.cms.default_item_resolver_class</pre>.
* Section-specific override can be added here. Only do so if you are
* changing from the default for a specific content section. The class
* must implement <pre>com.arsdigita.cms.dispatcher.ItemResolver</pre>.
*
* Parameter name ITEM_RESOLVER_CLASS in the old initializer system.
* Description: The ItemResolver class to use for the section
* (defaults to MultilingualItemResolver)
*/
private final Parameter
m_itemResolverClass = new StringParameter(
"com.arsdigita.cms.section.item_resolver_class",
Parameter.OPTIONAL, null );
// , "com.arsdigita.cms.dispatcher.MultilingualItemResolver"
// Template Resolver Class, configurable.
/**
* Name of the template resolver class to use for the section
* (defaults to <pre>com.arsdigita.cms.dispatcher.DefaultTemplateResolver</pre>)
*
* Default value (site-wide) is handled via the parameter
* <pre>com.arsdigita.cms.default_template_resolver_class</pre>.
* Section-specific override can be added here. Only do so if you are
* changing from the default for a specific content section. The class
* must implement <pre>com.arsdigita.cms.dispatcher.TemplateResolver</pre>.
*
* Parameter name TEMPLATE_RESOLVER_CLASS in the old initializer system.
*/
private final Parameter
m_templateResolverClass = new StringParameter(
"com.arsdigita.cms.section.template_resolver_class",
Parameter.OPTIONAL,
null );
// "com.arsdigita.cms.dispatcher.DefaultTemplateResolver" );
// XML Generator Class, set autonomously by ContentSection.create() method.
/**
* Determins weather to use section specific category tree(s). Defaults to
* false, so standard navigation is used.
* If set to true loader loads the categories from file(s) specified in the
* next parameter ( m_categoryFileList )
*/
private final Parameter
m_useSectionCategories = new BooleanParameter
("com.arsdigita.cms.section.use_section_categories",
Parameter.REQUIRED, new Boolean(false));
/**
* XML file containing the category tree to load for this content section.
* Usually not loaded {@see m_useSectionCategories). The files listed as
* default values are demo material and must be replaced in a production
* environment.
*/
private final Parameter
m_categoryFileList = new StringArrayParameter(
"com.arsdigita.cms.section.categories_toload",
Parameter.REQUIRED,
new String[] {"/WEB-INF/resources/article-categories.xml",
"/WEB-INF/resources/navigation-categories.xml"} );
// Category tree to load
// categories = { "/WEB-INF/resources/article-categories.xml",
// "/WEB-INF/resources/navigation-categories.xml" };
// m_conf.initParameter(CATEGORIES,
// "XML file containing the category tree",
// List.class,
// Collections.EMPTY_LIST);
/**
@ -189,6 +356,14 @@ public final class ContentSectionConfig extends AbstractConfig {
// parameters for creation of a new (additional) content section
register(m_newContentSectionName);
// register(m_staffGroup); NOT IMPLEMENTED yet
register(m_isPublic);
register(m_itemResolverClass);
register(m_templateResolverClass);
register(m_contentTypeList);
register(m_useSectionCategories);
register(m_categoryFileList);
}
@ -201,14 +376,9 @@ public final class ContentSectionConfig extends AbstractConfig {
/**
* Retrieve the list of workflow tasks and events for each tasks which
* should receive overdue notification alerts
*
* XXX wrong implementation !!
* Should be moved to CMS or section initializer because may be modified
* each startup. Does not store anything in database so not a loader task!
*/
public List getTaskAlerts() {
// String[] m_taskAlerts = (String[]) get(m_contentTypeList);
return Arrays.asList(m_taskAlerts);
public final String[] getTaskAlerts() {
return (String[]) get(m_taskAlerts);
}
@ -264,4 +434,144 @@ public final class ContentSectionConfig extends AbstractConfig {
return (String) get(m_newContentSectionName);
}
/**
* Retrieve the STAFF GROUP, i.e. a set of roles (author, editor, publisher,
* manager) and associated privileges for the content section to be created
* (m_contentSectionName).
*
* In loading step a complete default configuration is persisted in database,
* immutable at this point.
* See contentsection.ContentSectionSetup.registerRoles()
* In enterprise.init: name roles, List of roles to create.
*
* Set consists of a set of roles, for each role first field is the role name,
* second is the description, third is a list of privileges, and (optional)
* fourth is the workflow task to assign to.
*
* The set of roles constructed here is a complete set which reflects all
* functions of CMS and forms a necessary base for operations. When the first
* content section is created and loaded into database (during installation)
* this set is created, immutable by installer / administrator. Additional
* content section may be created using a subset. For a very special purpose
* a developer may alter the set.
*
* This method is typically used to construct the initial content section
* during installation.
*
* Not really implemented yet! We need a new parameter type "list" which
* must have multidimensional capabilities.
*
* As a temporary measure a constant list is retrieved. Until now the list
* was burried in enterprise.init and not user available for configuration.
* So it may turn into a permanent solution.
*/
public List getStuffGroup() {
final List<String> AUTH_PRIVS = Arrays.asList(
"new_item","read_item", "preview_item", "edit_item",
"categorize_items");
final List<String> EDIT_PRIVS = Arrays.asList(
"new_item","read_item", "preview_item", "edit_item",
"categorize_items", "delete_item", "approve_item" );
final List<String> PUBL_PRIVS = Arrays.asList(
"new_item","read_item", "preview_item", "edit_item",
"categorize_items", "delete_item", "approve_item",
"publish");
final List<String> MNGR_PRIVS = Arrays.asList(
"new_item","read_item", "preview_item", "edit_item",
"categorize_items", "delete_item", "approve_item",
"publish",
"staff_admin", "content_type_admin", "lifecycle_admin",
"workflow_admin", "category_admin");
m_staffGroup = new ArrayList();
m_staffGroup.add
( new ArrayList() {{ add("Author");
add("Creates new content");
add(AUTH_PRIVS);
add("Authoring");
}}
);
m_staffGroup.add
( new ArrayList() {{ add("Editor");
add("Reviews and approves the author's work");
add(EDIT_PRIVS);
add("Approval");
}}
);
m_staffGroup.add
( new ArrayList() {{ add("Publisher");
add("Deploys the content to the web site");
add(PUBL_PRIVS);
add("Publishing");
}}
);
m_staffGroup.add
( new ArrayList() {{ add("Manager");
add("Manages the overall content section");
add(MNGR_PRIVS);
// NB, manager doesn't have any assigned
// task for workflow - (as usual)
}}
);
return (List) m_staffGroup ;
}
/**
* Retrieve whether the content-section is publicly viewable (i.e. without
* registration and login)
*/
public Boolean isPubliclyViewable() {
return ((Boolean) get(m_isPublic)).booleanValue();
}
/**
* Retrieve the item resolver class
*/
public String getItemResolverClass() {
return (String) get(m_itemResolverClass);
}
/**
* Retrieve the template resolver class
*/
public String getTemplateResolverClass() {
return (String) get(m_templateResolverClass);
}
/**
* Retrieve weather to use section specific categories. If true they are
* loaded using the next parameters file list {@see getUseSectionCategories()}
*
* Default value is false, so standard navigation is used.
* @return
*/
public final boolean getUseSectionCategories() {
return ((Boolean) get(m_useSectionCategories)).booleanValue();
}
/**
* Retrieve the list of files containing categories to load.
* In old Initialiser: Parameter name: CATEGORIES
* Deskr. "XML file containing the category tree"
*/
public List getCategoryFileList() {
String[] catFiles = (String[]) get(m_categoryFileList);
return Arrays.asList(catFiles);
}
/**
* Retrieve the
*/
public List getContentSectionsContentTypes() {
String[] taskAlerts = (String[]) get(m_contentTypeList);
return Arrays.asList(taskAlerts);
}
}

View File

@ -0,0 +1,696 @@
/*
* Copyright (C) 2010 Peter Boy <pboy@barkhof.uni-bremen.de> All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.cms.contentsection;
import com.arsdigita.categorization.Category;
import com.arsdigita.categorization.RootCategoryCollection;
import com.arsdigita.cms.ContentSection;
import com.arsdigita.cms.ContentType;
import com.arsdigita.cms.ContentTypeLifecycleDefinition;
import com.arsdigita.cms.ContentTypeWorkflowTemplate;
import com.arsdigita.cms.SecurityManager;
import com.arsdigita.cms.Template;
import com.arsdigita.cms.TemplateManagerFactory;
import com.arsdigita.cms.lifecycle.LifecycleDefinition;
import com.arsdigita.cms.lifecycle.PhaseDefinition;
import com.arsdigita.cms.util.GlobalizationUtil;
import com.arsdigita.cms.workflow.CMSTask;
import com.arsdigita.cms.workflow.CMSTaskType;
import com.arsdigita.domain.DataObjectNotFoundException;
// import com.arsdigita.domain.DomainObject;
import com.arsdigita.initializer.InitializationException;
// import com.arsdigita.kernel.ACSObjectInstantiator;
import com.arsdigita.kernel.Party;
import com.arsdigita.kernel.PartyCollection;
import com.arsdigita.kernel.Role;
import com.arsdigita.kernel.permissions.PermissionService;
import com.arsdigita.kernel.permissions.PrivilegeDescriptor;
// import com.arsdigita.persistence.DataObject;
// import com.arsdigita.runtime.AbstractConfig;
import com.arsdigita.cms.LoaderConfig;
import com.arsdigita.util.Assert;
import com.arsdigita.util.UncheckedWrapperException;
// import com.arsdigita.web.ApplicationSetup;
import com.arsdigita.workflow.simple.WorkflowTemplate;
import com.arsdigita.xml.XML;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.EmptyStackException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
// import java.util.NoSuchElementException;
import java.util.Stack;
import org.apache.log4j.Logger;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
/**
* Helper class to setup (configure) a newly created content section instance.
* It handles those properties of a content section, which are to be persisted
* into the database.
*
* @author Peter Boy (pboy@barkhof.uni-bremen.de)
* @author Jon Orris (jorris@redhat.com)
* @version $Id: $
*/
public final class ContentSectionSetup {
private static Logger s_log = Logger.getLogger(ContentSectionSetup.class);
private final static String STYLESHEET = "/packages/content-section/xsl/cms.xsl";
private HashMap m_tasks = new HashMap();
private LifecycleDefinition m_lcd;
private WorkflowTemplate m_wf;
final ContentSection m_section;
// Load main CMS configuration file
private static final LoaderConfig s_conf = new LoaderConfig();
/**
* Constructor. Using this constructor the content section has to be
* already created using ContentSection.create(name)
*
* @param section name of a content section previously created by
* ContentSection.create
*/
public ContentSectionSetup(ContentSection section) {
Assert.exists(section, ContentSection.class);
m_section = section;
}
/**
* Wrapper class to create and configure a content section instance
* in one step.
*
*/
public static void setupContentSectionAppInstance(String name,
List staffGroup,
Boolean isPubliclyViewable,
String itemResolverClassName,
String templateResolverClassName,
List sectionContentTypes,
Boolean useSectionCategories,
List categoryFileList
) {
s_log.info("Creating content section on /" + name);
ContentSection section = ContentSection.create(name);
ContentSectionSetup setup = new ContentSectionSetup(section);
// Setup the access controls
setup.registerRoles(staffGroup);
setup.registerViewers(isPubliclyViewable);
setup.registerPublicationCycles();
setup.registerWorkflowTemplates();
setup.registerResolvers( itemResolverClassName,templateResolverClassName );
// setup.registerContentTypes((List)m_conf.getParameter(TYPES));
setup.registerContentTypes(sectionContentTypes);
// section specific categories, usually not used.
if (useSectionCategories) {
// Iterator files = ((List) m_conf.getParameter(CATEGORIES)).iterator();
// Iterator files = s_conf.getCategoryFileList().iterator();
Iterator files = categoryFileList.iterator();
while ( files.hasNext() ) {
setup.registerCategories((String) files.next());
}
}
setup.registerAlerts();
section.save();
// return section;
}
/**
* Steps through a list of roles which are part of a staff group and
* delegates processing of each role.
*
* @param roles
*/
public void registerRoles(List roles) {
Iterator i = roles.iterator();
while (i.hasNext()) {
List role = (List)i.next();
String name = (String)role.get(0);
String desc = (String)role.get(1);
List privileges = (List)role.get(2);
String task = (role.size() > 3 ? (String)role.get(3) : null);
s_log.info("Creating role " + name);
Role group = registerRole(
name,
desc,
privileges);
if (task != null)
m_tasks.put(task, group);
}
}
/**
* Takes the characteristics of a role and persists them in the database.
*
* @param name Name of the role
* @param desc Description of role
* @param privileges set (list) of privileges associated with the role
* @return
*/
private Role registerRole(String name, String desc, List privileges) {
Role role = m_section.getStaffGroup().createRole(name);
role.setDescription(desc);
role.save();
Iterator i = privileges.iterator();
while (i.hasNext()) {
String priv = (String)i.next();
s_log.info("Granting privilege cms_" + priv);
role.grantPermission(m_section,
PrivilegeDescriptor.get("cms_" + priv));
if (priv.equals(SecurityManager.CATEGORY_ADMIN) ||
priv.equals(SecurityManager.CATEGORIZE_ITEMS)) {
RootCategoryCollection coll = Category.getRootCategories(m_section);
while (coll.next()) {
if (priv.equals(SecurityManager.CATEGORY_ADMIN)) {
role.grantPermission(coll.getCategory(),
PrivilegeDescriptor.ADMIN);
} else {
role.grantPermission(coll.getCategory(),
Category.MAP_DESCRIPTOR);
}
}
}
}
return role;
}
/**
* Creates a public user role and adds permission to read published pages.
*
* @param pub Boolean wether published pages are accessible by the public
* (i.e. without login).
*/
public void registerViewers(Boolean pub) {
// XXX Obviously the pub parameter does not determine public access or
// not!
Role viewers = m_section.getViewersGroup().createRole("Content Reader");
viewers.setDescription("Can view published pages within this section");
viewers.save();
// XXX Shouldn't read permission granted depending on pub=true?
viewers.grantPermission(m_section,
PrivilegeDescriptor.get("cms_read_item"));
String email = Boolean.TRUE.equals(pub) ? "public@nullhost"
: "registered@nullhost";
Party viewer = retrieveParty(email);
if (viewer == null)
throw new InitializationException(
(String) GlobalizationUtil.globalize(
"cms.installer.cannot_find_group_for_email").localize() + email);
s_log.info("Adding " + email + " to viewers role");
viewers.getGroup().addMemberOrSubgroup(viewer);
viewers.save();
}
/**
* Retrieves a party by eimail as part of the viewers registration process.
*
* @param email
* @return
*/
private Party retrieveParty(String email) {
PartyCollection parties = Party.retrieveAllParties();
parties.filter(email);
if (parties.next()) {
Party party = parties.getParty();
parties.close();
return party;
}
return null;
}
/**
* Checks for specific item resolver and template resolver classes probably
* specified in parameters, otherwise uses system wide default parameters
* specified in CMS global configuration file. Delegates persistence task
* to ContentSection.
*
* @param itemResolverClassName
* @param templateResolverClassName
*/
public void registerResolvers(String itemResolverClassName,
String templateResolverClassName) {
if (itemResolverClassName != null && itemResolverClassName.length()>0) {
m_section.setItemResolverClass(itemResolverClassName);
s_log.info("Registering " + itemResolverClassName
+ " as the item resolver class");
} else {
m_section.setItemResolverClass(ContentSection.getConfig()
.getDefaultItemResolverClass()
.getName());
s_log.info("Registering " + itemResolverClassName
+ " as the item resolver class");
}
if (templateResolverClassName != null && templateResolverClassName.length()>0) {
m_section.setTemplateResolverClass(templateResolverClassName);
s_log.info("Registering " + templateResolverClassName +
" as the template resolver class");
} else {
m_section.setTemplateResolverClass(ContentSection.getConfig()
.getDefaultTemplateResolverClass()
.getName());
s_log.info("Registering " + templateResolverClassName +
" as the template resolver class");
}
m_section.save();
}
/**
* Create a (default) publication cycle and store it in the datavbase
* (delegated to package com.arsdigita.cms.lifecycle)
*
* @throws InitializationException
*/
public void registerPublicationCycles()
throws InitializationException {
// The feature lifecycle.
LifecycleDefinition lcd = new LifecycleDefinition();
lcd.setLabel( (String) GlobalizationUtil.globalize(
"cms.installer.simple_publication").localize());
lcd.setDescription("A one-phase lifecycle for items.");
lcd.save();
PhaseDefinition pd = lcd.addPhaseDefinition(
"Live", "The first phase. It lasts forever.",
new Integer(0), null, null);
pd.save();
lcd.save();
m_lcd = lcd;
// Save the created life cycle for the section to be set up.
m_section.addLifecycleDefinition(lcd);
m_section.save();
}
/**
* Defines a (default for section) workflow which gets persisted in tne
* database.
*
* @throws InitializationException
*/
public void registerWorkflowTemplates()
throws InitializationException {
// The 3-step production workflow.
WorkflowTemplate wf = new WorkflowTemplate();
wf.setLabel( (String) GlobalizationUtil.globalize(
"cms.installer.production_workflow").localize());
wf.setDescription("A process that involves creating and approving content.");
wf.save();
CMSTask authoring = new CMSTask();
authoring.setLabel((String) GlobalizationUtil.globalize(
"cms.installer.authoring").localize());
authoring.setDescription("Create content.");
authoring.save();
Role author = (Role)m_tasks.get("Authoring");
if (author != null)
authoring.assignGroup(author.getGroup());
authoring.setTaskType(CMSTaskType.retrieve(CMSTaskType.AUTHOR));
authoring.save();
CMSTask approval = new CMSTask();
approval.setLabel( (String) GlobalizationUtil.globalize(
"cms.installer.approval").localize());
approval.setDescription("Approve content.");
approval.save();
approval.addDependency(authoring);
approval.save();
Role approver = (Role)m_tasks.get("Approval");
if (approver != null)
approval.assignGroup(approver.getGroup());
approval.setTaskType(CMSTaskType.retrieve(CMSTaskType.EDIT));
approval.save();
CMSTask deploy = new CMSTask();
deploy.setLabel((String) GlobalizationUtil.globalize(
"cms.installer.deploy").localize());
deploy.setDescription("Deploy content.");
deploy.save();
deploy.addDependency(approval);
deploy.save();
Role publisher = (Role)m_tasks.get("Publishing");
if (publisher != null)
deploy.assignGroup(publisher.getGroup());
deploy.setTaskType(CMSTaskType.retrieve(CMSTaskType.DEPLOY));
deploy.save();
wf.addTask(authoring);
wf.addTask(approval);
wf.addTask(deploy);
wf.save();
m_section.addWorkflowTemplate(wf);
m_section.save();
m_wf = wf;
}
/**
* Steps through a list of congtent types to be available for this content
* section and delegates processing of each type.
*
* @param types list of content types to be available for this content section
*/
public void registerContentTypes(List types) {
Iterator i = types.iterator();
while (i.hasNext()) {
Object obj = i.next();
if (obj instanceof String) {
registerContentType((String)obj);
} else {
List list = (List)obj;
String name = (String)list.get(0);
String file = (String)list.get(1);
ContentType type = registerContentType(name);
registerTemplate(type, file);
}
}
}
/**
* Process one content type and registers it with the current content section.
*
* @param name
* @return
*/
ContentType registerContentType(String name) {
ContentType type = null;
try {
type = ContentType.findByAssociatedObjectType(name);
} catch (DataObjectNotFoundException ex) {
throw new UncheckedWrapperException(
(String) GlobalizationUtil.globalize(
"cms.installer.cannot_find_content_type").localize() + name, ex);
}
s_log.info("Adding type " + name + " to " + m_section.getDisplayName());
m_section.addContentType(type);
s_log.info("Setting the default lifecycle for " +
name + " to " + m_lcd.getLabel());
ContentTypeLifecycleDefinition.
updateLifecycleDefinition(m_section, type, m_lcd);
m_lcd.save();
s_log.info("Setting the default workflow template for " + name +
" to " + m_wf.getLabel());
ContentTypeWorkflowTemplate.updateWorkflowTemplate(m_section, type, m_wf);
m_wf.save();
return type;
}
void registerTemplate(ContentType type, String filename) {
// Use the base of the file name (ie without path & extension)
// as the template name
int pos1 = filename.lastIndexOf("/");
int pos2 = filename.lastIndexOf(".");
if (pos2 == -1)
pos2 = filename.length();
String label = filename.substring(pos1+1,pos2);
String typename = type.getClassName();
int pos3 = typename.lastIndexOf(".");
String name = typename.substring(pos3+1, typename.length()) + "-" + label;
Template temp = new Template();
temp.setContentSection(m_section);
temp.setName(name);
temp.setLabel(label);
temp.setParent(m_section.getTemplatesFolder());
final ClassLoader loader = Thread.currentThread
().getContextClassLoader();
final InputStream stream = loader.getResourceAsStream
(filename.substring(1));
if (stream == null) {
throw new IllegalStateException
((String) GlobalizationUtil.globalize
("cms.installer.cannot_find_file").localize() + filename);
}
final BufferedReader input = new BufferedReader
(new InputStreamReader(stream));
StringBuffer body = new StringBuffer();
String line;
for (;;) {
try {
line = input.readLine();
} catch (IOException ex) {
throw new UncheckedWrapperException(
(String) GlobalizationUtil.globalize(
"cms.installer.cannot_read_line_of_data").localize(), ex);
}
if (line == null)
break;
body.append(line);
body.append("\n");
}
temp.setText(body.toString());
temp.save();
TemplateManagerFactory.getInstance()
.addTemplate(m_section, type, temp, "public");
temp.publish(m_lcd, new Date());
// Dan said to comment this out
// temp.getLifecycle().start();
}
/**
*
* @param filename
*/
public void registerCategories(String filename) {
if (filename == null) {
s_log.info("not loading any categories");
return;
}
s_log.info("loading categories from " + filename);
XML.parseResource(filename, new CategoryHandler(m_section));
}
/**
* For the content section to be created create a role whose member will
* receive alerts.
*/
public void registerAlerts() {
Role alert = m_section.getStaffGroup().createRole("Alert Recipient");
alert.setDescription(
"Receive alerts regarding expiration of pubished content");
alert.save();
}
// // Currently there is no way to persists alert preferemces, therefore
// // currently not a loader or setup task.
// /**
// * Steps through a string array of tasks and associated alert events
// * creating section specific CMStasks.
// *
// * @param tasks
// */
// public void loadTaskAlerts(String[] taskAlerts) {
//
// if (taskAlerts != null) {
// for (int i=0,n=taskAlerts.length; i<n; i++) {
// StringTokenizer tok = new StringTokenizer(taskAlerts[i],":");
// try {
// String taskName = tok.nextToken();
// while (tok.hasMoreTokens()) {
// String operation = tok.nextToken();
// CMSTask.addAlert(m_section, taskName, operation);
// }
// } catch (NoSuchElementException nsee) {
// s_log.warn("Invalid task alerts definition");
// }
// }
// }
//
// }
// Starting a background thread is an initializer task, not a setup task. The
// old initializer system did all types of tasks.
// Retained here for reference purpose until migration has completed.
// public Timer startNotifierTask(Boolean sendOverdue, Integer duration,
// Integer alertInterval, Integer max) {
// Timer unfinished = null;
// if (sendOverdue.booleanValue()) {
// if (duration == null || alertInterval == null || max == null) {
// s_log.info("Not sending overdue task alerts, " +
// "required initialization parameters were not specified");
// return null;
// }
// // start the Timer as a daemon, so it doesn't keep the JVM from exiting
// unfinished = new Timer(true);
// UnfinishedTaskNotifier notifier = new UnfinishedTaskNotifier(
// m_section, duration.intValue(),
// alertInterval.intValue(), max.intValue());
// // schedule the Task to start in 5 minutes, at 1 hour intervals
// unfinished.schedule(notifier, 5L * 60 * 1000, 60L * 60 * 1000);
// s_log.info("Sending overdue alerts for tasks greater than " +
// duration + " hours old");
// } else {
// s_log.info("Not sending overdue task alerts");
// }
//
// return unfinished;
// }
// ///////////////////// Private Class Section ////////////////////////////
/**
* SAX Handler for category lists. Creates the categories as they are
* defined, with structure, in the xml document.
*/
private class CategoryHandler extends DefaultHandler {
private Stack m_cats = new Stack();
private ContentSection m_section;
public CategoryHandler(ContentSection section) {
m_section = section;
}
@Override
public void startElement ( String uri, String local,
String qName, Attributes attrs ) {
if ("categories".equals(qName)) {
String name = attrs.getValue("name");
if (name == null) {
name = "Root";
}
String description = attrs.getValue("description");
String context = attrs.getValue("context");
Category root = Category.getRootForObject(m_section,
context);
if (root == null) {
root = new Category();
}
root.setName(name);
root.setDescription(description);
if (root.isNew()) {
Category.setRootForObject(m_section,
root,
context);
}
m_cats.push(root);
PermissionService.setContext(root, m_section);
} else if ( "category".equals(qName) ) {
String name = attrs.getValue("name");
String description = attrs.getValue("description");
String url = attrs.getValue("url");
// set the default description to the name of the category
if ( description == null ) {
description = name;
}
s_log.debug("creating category '" + name + "'");
Category cat = new Category(name, description, url);
cat.save();
Category parent = null;
try {
parent = (Category)m_cats.peek();
} catch ( EmptyStackException ex ) {
throw new UncheckedWrapperException("no root category", ex);
}
parent.addChild(cat);
parent.save();
cat.setDefaultParentCategory(parent);
cat.save();
m_cats.push(cat);
}
}
@Override
public void endElement ( String uri, String local, String qName ) {
if ( "category".equals(qName) ) {
m_cats.pop();
} else if ( "categories".equals(qName)) {
m_cats.pop();
}
}
}
}

View File

@ -21,53 +21,50 @@
package com.arsdigita.cms.contentsection;
import com.arsdigita.cms.ContentSection;
import com.arsdigita.cms.LoaderConfig;
import com.arsdigita.cms.installer.ContentSectionSetup;
import com.arsdigita.cms.installer.Util;
import com.arsdigita.cms.util.GlobalizationUtil;
import com.arsdigita.cms.ContentSectionCollection;
// import com.arsdigita.cms.LoaderConfig;
//import com.arsdigita.cms.installer.Util;
// import com.arsdigita.cms.util.GlobalizationUtil;
import com.arsdigita.cms.workflow.UnfinishedTaskNotifier;
import com.arsdigita.domain.DataObjectNotFoundException;
import com.arsdigita.persistence.SessionManager;
import com.arsdigita.persistence.TransactionContext;
// import com.arsdigita.domain.DataObjectNotFoundException;
// import com.arsdigita.persistence.SessionManager;
// import com.arsdigita.persistence.TransactionContext;
import com.arsdigita.runtime.CompoundInitializer;
import com.arsdigita.runtime.ConfigError;
// import com.arsdigita.runtime.ConfigError;
// import com.arsdigita.runtime.DataInitEvent;
import com.arsdigita.runtime.ContextInitEvent;
import com.arsdigita.runtime.ContextCloseEvent;
import com.arsdigita.runtime.DomainInitEvent;
import com.arsdigita.util.Assert;
import com.arsdigita.web.Application;
// import com.arsdigita.runtime.DomainInitEvent;
// import com.arsdigita.util.Assert;
// import com.arsdigita.web.Application;
import com.arsdigita.cms.workflow.CMSTask;
import java.math.BigDecimal;
import java.util.Iterator;
// import java.math.BigDecimal;
import java.util.Enumeration;
import java.util.NoSuchElementException;
import java.util.StringTokenizer;
import java.util.Timer;
import java.util.Vector;
import org.apache.log4j.Logger;
// CURRENT STATUS:
// (Simple) Migration of the Old Initializer code of this package to the new
// initializer system. Current goal is a pure replacement with as less code
// changes as possible.
// In a second step a restructure of the code will be done.
// Has to handle in future:
// -- configuration of alert tasks
// -- creation of additional content sections during restart
/**
* XXX Reformulate according to the code development!
* <p>Initializes a content section, registering a default workflow, lifecycle &
* roles and adding the content types.
* Initializes the content section sub-package of the CMS package (module).
*
* XXX Reformulate according to the code development!
* Currently:
* - creation of additional content sections during restart (comming soon)
* - initializes alert preferences for each content section
* - initializes overdue alerts for each content section
* In the (hopefully) near future:
* Content section specific tasks of cms.Initializer will be moved into this
* Initializer.
*
* <p>The initialization process takes several configuration
* parameters. The <code>name</code> is the name of the content
* section, the <code>types</code> is a list of content types
* to register
*
* @author Daniel Berrange (berrange@redhat.com)
* @author Michael Pih
* @author pb
* @author pboy (pb@zes.uni-bremen.de)
* @version $Id: $
*/
public class Initializer extends CompoundInitializer {
@ -78,11 +75,10 @@ public class Initializer extends CompoundInitializer {
/** Local configuration object ContentSectionConfig containing parameters
which may be changed each system startup. */
// private static final LoaderConfig s_conf = LoaderConfig.getConfig();
private static final LoaderConfig s_conf = new LoaderConfig();
private static final ContentSectionConfig s_conf = ContentSectionConfig.getInstance();
/** The Timer used to send Unfinished notifications */
private static Timer s_unfinishedTimer;
private static Vector s_unfinishedTimers = new Vector();
public Initializer() {
@ -90,6 +86,7 @@ public class Initializer extends CompoundInitializer {
//final int database = DbHelper.getDatabaseFromURL(url);
}
// Currently nothing to do here. Will be changed in the ongoing migration process
// /**
// * An empty implementation of {@link Initializer#init(DataInitEvent)}.
// *
@ -98,42 +95,35 @@ public class Initializer extends CompoundInitializer {
// public void init(DataInitEvent evt) {
// }
/**
* Initializes domain-coupling machinery, usually consisting of
* registering object instantiators and observers.
*
*/
public void init(DomainInitEvent evt) {
s_log.debug("CMS.installer.Initializer.init(DomainInitEvent) invoked");
// Recursive invokation of init, is it really necessary??
// On the other hand:
// An empty implementations prevents this initializer from being executed.
// A missing implementations causes the super class method to be executed,
// which invokes the above added LegacyInitializer.
// If super is not invoked, various other cms sub-initializer may not run.
super.init(evt);
/*
* loadAlertPrefs loads a list of workflow tasks and associated events
* from configuration file and fills a hashmap. No database operation.
* Not a loader task!
*/
// XXX Currently in ContenSectionSetup - has to be migrated !!
// setup.loadAlertPrefs((List) s_conf.getTaskAlerts());
s_log.debug("CMS.installer.Initializer.init(DomainInitEvent) completed");
}
// Currently nothing to do here. Will be changed in the ongoing migration process
// /**
// * Initializes domain-coupling machinery, usually consisting of
// * registering object instantiators and observers.
// *
// */
// public void init(DomainInitEvent evt) {
// s_log.debug("CMS.installer.Initializer.init(DomainInitEvent) invoked");
//
// // Recursive invokation of init, is it really necessary??
// // On the other hand:
// // An empty implementations prevents this initializer from being executed.
// // A missing implementations causes the super class method to be executed,
// // which invokes the above added LegacyInitializer.
// // If super is not invoked, various other cms sub-initializer may not run.
// super.init(evt);
//
//
// s_log.debug("CMS.installer.Initializer.init(DomainInitEvent) completed");
// }
/**
* Implementation of the {@link Initializer#init(ContextInitEvent)}
* method.
*
* Initializes the scheduler thread to fire all the events for the
* ...... that have just began or ended.
* Steps through all installed content sections and for each section
* - initializes the allert preferences
* - initializes the scheduler background thread to fire all all alert events.
*
* A delay value of 0 inhibits start of processing.
* @param evt The context init event.
@ -141,16 +131,33 @@ public class Initializer extends CompoundInitializer {
public void init(ContextInitEvent evt) {
s_log.debug("content section ContextInitEvent started");
// XXX to be done yet!
// Currently we have only one timer, but notification is handled
// on a per section base. We have also only one set of timing parameters.
// So we have to configure all sections in the same way.
// s_unfinishedTimer = setup.startNotifierTask
// (s_conf.getSendOverdueAlerts(),
// s_conf.getTaskDuration(),
// s_conf.getOverdueAlertInterval(),
// s_conf.getMaxAlerts());
super.init(evt);
// Currently we have only one set of both alert preference configuration
// and timer configuration. Notification is handled on a per section
// base, so we have to configure all sections in the same way.
// TODO: Store alerts prefs as well as timer configuration for each
// content section and make it configurable in the UI.
// For now we step through all sections and configure them the same way.
ContentSectionCollection sections=ContentSection.getAllSections();
while( sections.next() ) {
ContentSection section = sections.getContentSection();
// Initialize workflow tasks and associated events from configuration
// file filling a hashmap.
initializeTaskAlerts(section, s_conf.getTaskAlerts() );
Timer unfinishedTimer = startNotifierTask(
section,
s_conf.getSendOverdueAlerts(),
s_conf.getTaskDuration(),
s_conf.getAlertInterval(),
s_conf.getMaxAlerts()
);
if ( unfinishedTimer != null) {
s_unfinishedTimers.addElement(unfinishedTimer);
}
}
s_log.debug("content section ContextInitEvent completed");
}
@ -160,16 +167,56 @@ public class Initializer extends CompoundInitializer {
* method.
*
*/
@Override
public void close(ContextCloseEvent evt) {
s_log.debug("content section ContextCloseEvent started");
if (s_unfinishedTimer != null) {
s_unfinishedTimer.cancel();
s_unfinishedTimer = null;
Timer unfinishedTimer = null;
if (s_unfinishedTimers.size() > 0) {
for (Enumeration el=s_unfinishedTimers.elements(); el.hasMoreElements(); ) {
unfinishedTimer = (Timer) el.nextElement();
if(unfinishedTimer != null) unfinishedTimer.cancel();
unfinishedTimer = null;
// s_unfinishedTimer = null;
}
}
s_log.debug("content section ContextCloseEvent completed");
}
/**
* Steps through a string array of tasks and associated alert events
* creating section specific CMStasks from configuration file.
*
* Note: Tasks are created on a per section base, but we have currently no
* way to store different values for each section. So all sections are
* configured equal.
*
* @param section A section object
* @param taskAlerts An array of tasks and associated events
*/
public void initializeTaskAlerts(ContentSection section,
String[] taskAlerts) {
if (taskAlerts != null) {
for (int i=0,n=taskAlerts.length; i<n; i++) {
StringTokenizer tok = new StringTokenizer(taskAlerts[i],":");
try {
String taskName = tok.nextToken();
while (tok.hasMoreTokens()) {
String operation = tok.nextToken();
CMSTask.addAlert(section, taskName, operation);
}
} catch (NoSuchElementException nsee) {
s_log.warn("Invalid task alerts definition");
}
}
}
}
/**
* @param section content section for which notifier should be started
* @param sendOverdue
@ -178,10 +225,12 @@ public class Initializer extends CompoundInitializer {
* @param max
* @return
*/
private final Timer startNotifierTask(
ContentSection section,
Boolean sendOverdue, Integer duration,
Integer alertInterval, Integer max) {
private final Timer startNotifierTask( ContentSection section,
Boolean sendOverdue,
Integer duration,
Integer alertInterval,
Integer max
) {
Timer unfinished = null;
if (sendOverdue.booleanValue()) {
if (duration == null || alertInterval == null || max == null) {
@ -191,10 +240,11 @@ public class Initializer extends CompoundInitializer {
}
// start the Timer as a daemon, so it doesn't keep the JVM from exiting
unfinished = new Timer(true);
UnfinishedTaskNotifier notifier =
new UnfinishedTaskNotifier( section, duration.intValue(),
UnfinishedTaskNotifier notifier = new UnfinishedTaskNotifier(
section,
duration.intValue(),
alertInterval.intValue(),
max.intValue());
max.intValue() );
// schedule the Task to start in 5 minutes, at 1 hour intervals
unfinished.schedule(notifier, 5L * 60 * 1000, 60L * 60 * 1000);
s_log.info("Sending overdue alerts for tasks greater than " +

View File

@ -18,7 +18,8 @@
*/
package com.arsdigita.cms.dispatcher;
import com.arsdigita.cms.installer.ContentCenterSetup;
import com.arsdigita.cms.WorkspaceSetup;
import com.arsdigita.cms.util.PageClassConfigHandler;
import com.arsdigita.developersupport.DeveloperSupport;
import com.arsdigita.dispatcher.Dispatcher;
import com.arsdigita.dispatcher.DispatcherHelper;
@ -74,7 +75,8 @@ public class ContentCenterDispatcher extends LockableImpl
/**
* The path of the file that maps resources.
*/
public final static String DEFAULT_MAP_FILE = "/WEB-INF/resources/content-center-map.xml";
public final static String DEFAULT_MAP_FILE =
"/WEB-INF/resources/content-center-map.xml";
/**
* Error logging.
@ -83,11 +85,10 @@ public class ContentCenterDispatcher extends LockableImpl
Logger.getLogger(ContentCenterDispatcher.class.getName());
/**
* Mapping between a relative URL and the class name of a
* ResourceHandler.
* Mapping between a relative URL and the class name of a ResourceHandler.
*/
private static HashMap s_pageClasses = ContentCenterSetup.getURLToClassMap();
private static HashMap s_pageURLs = ContentCenterSetup.getClassToURLMap();
private static HashMap s_pageClasses = WorkspaceSetup.getURLToClassMap();
private static HashMap s_pageURLs = WorkspaceSetup.getClassToURLMap();
/**
* Instantiated ResourceHandlers cache. This allows for lazy loading.
@ -101,6 +102,7 @@ public class ContentCenterDispatcher extends LockableImpl
* Constructor.
*/
public ContentCenterDispatcher() {
super();
m_trailingSlashList = new ArrayList();
@ -108,7 +110,6 @@ public class ContentCenterDispatcher extends LockableImpl
setNotFoundDispatcher(JSPApplicationDispatcher.getInstance());
//readFromFile(new java.io.File(MAP_FILE));
}
@ -174,15 +175,17 @@ public class ContentCenterDispatcher extends LockableImpl
m_trailingSlashList.add(url);
}
/** Return the URL stub for the class name, can return null if not
* mapped */
/**
* Return the URL stub for the class name, can return null if not
* mapped
*/
public static String getURLStubForClass(String classname) {
s_log.debug("Getting URL Stub for : " + classname);
Iterator itr = s_pageURLs.keySet().iterator();
while (itr.hasNext()) {
String classname2 = (String)itr.next();
s_log.debug("key: " + classname + " value: " + (String)s_pageURLs.get(classname2));
s_log.debug("key: " + classname + " value: " +
(String)s_pageURLs.get(classname2));
}
String url = (String)s_pageURLs.get(classname);
return url;

View File

@ -24,8 +24,8 @@ import com.arsdigita.cms.CMS;
import com.arsdigita.cms.ContentSection;
import com.arsdigita.cms.ImageAsset;
import com.arsdigita.cms.SecurityManager;
import com.arsdigita.cms.installer.ServiceInstaller;
import com.arsdigita.cms.installer.WorkspaceInstaller;
//import com.arsdigita.cms.installer.ServiceInstaller;
// import com.arsdigita.cms.installer.WorkspaceInstaller;
import com.arsdigita.dispatcher.DispatcherHelper;
import com.arsdigita.kernel.Kernel;
import com.arsdigita.kernel.KernelContext;
@ -54,8 +54,8 @@ import java.util.Map;
*/
public class Utilities {
public final static String CMS_WORKSPACE = WorkspaceInstaller.PACKAGE_KEY;
public final static String CMS_SERVICE = ServiceInstaller.PACKAGE_KEY;
// public final static String CMS_WORKSPACE = WorkspaceInstaller.PACKAGE_KEY;
// public final static String CMS_SERVICE = ServiceInstaller.PACKAGE_KEY;
// Used for caching util lookups
private static HashMap m_cache = new HashMap();
@ -71,10 +71,10 @@ public class Utilities {
* @return The URL of the CMS Workspace package
*/
public static String getWorkspaceURL() {
String url = (String) m_cache.get(CMS_WORKSPACE);
String url = (String) m_cache.get(CMS.WORKSPACE_PACKAGE_KEY);
if ( url == null ) {
url = getSingletonPackageURL(CMS_WORKSPACE);
m_cache.put(CMS_WORKSPACE, url);
url = getSingletonPackageURL(CMS.WORKSPACE_PACKAGE_KEY);
m_cache.put(CMS.WORKSPACE_PACKAGE_KEY, url);
}
return url;
}
@ -84,7 +84,7 @@ public class Utilities {
* @return The URL of the CMS Services package
*/
public static String getServiceURL() {
String url = (String) m_cache.get(CMS_SERVICE);
String url = (String) m_cache.get(CMS.SERVICE_PACKAGE_KEY);
if ( url == null ) {
// chris.gilbert@westsussex.gov.uk
// We don't want application context in this url, especially when
@ -92,8 +92,8 @@ public class Utilities {
// file that is maintained by a non cms application eg
// forum, then I can end up with a url that doesn't work
// and so breaks file links everywhere
url = getSingletonPackageURLSansContext(CMS_SERVICE);
m_cache.put(CMS_SERVICE, url);
url = getSingletonPackageURLSansContext(CMS.SERVICE_PACKAGE_KEY);
m_cache.put(CMS.SERVICE_PACKAGE_KEY, url);
}
return url;

View File

@ -38,6 +38,12 @@ import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
// Migration Status
// All tasks this class used to perform are migrated to either cms.Loader or
// cms.WorkspaceSetup.
// File is kept in trunk for reference purpose until the whole migration process
// will be completed. (2010-20-18)
/**
* Sets up the CMS package.
*

View File

@ -43,7 +43,7 @@ import com.arsdigita.kernel.Role;
import com.arsdigita.kernel.permissions.PermissionService;
import com.arsdigita.kernel.permissions.PrivilegeDescriptor;
import com.arsdigita.persistence.DataObject;
import com.arsdigita.runtime.AbstractConfig;
// import com.arsdigita.runtime.AbstractConfig;
import com.arsdigita.cms.LoaderConfig;
import com.arsdigita.util.Assert;
import com.arsdigita.util.UncheckedWrapperException;
@ -130,6 +130,7 @@ public final class ContentSectionSetup {
// contains the xsl to generate the page
setup.setInstantiator(new ACSObjectInstantiator() {
@Override
public DomainObject doNewInstance(DataObject dataObject) {
return new ContentSection(dataObject);
}
@ -542,6 +543,7 @@ public final class ContentSectionSetup {
m_section = section;
}
@Override
public void startElement ( String uri, String local,
String qName, Attributes attrs ) {
if ("categories".equals(qName)) {
@ -597,6 +599,7 @@ public final class ContentSectionSetup {
}
}
@Override
public void endElement ( String uri, String local, String qName ) {
if ( "category".equals(qName) ) {
m_cats.pop();

View File

@ -17,6 +17,15 @@
*
*/
// /////////////////////////////////////////////////////////////////////////////
// Migration Status
// All tasks this class used to perform are migrated to cms.Loader
// File is kept in trunk for reference purpose until the whole migration process
// will be completed. (2010-20-18)
// /////////////////////////////////////////////////////////////////////////////
package com.arsdigita.cms.installer;
import com.arsdigita.cms.LoaderConfig;
@ -106,6 +115,8 @@ public class Initializer extends CompoundInitializer {
* <li>create Workspace package type and instance</li>
* <li>create CMS Service package type and instance</li>
* </ol>
*
* All these tasks are migrated to Loader (2010-10-15).
*/

View File

@ -16,6 +16,16 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
// /////////////////////////////////////////////////////////////////////////////
// Migration Status
// All tasks this class used to perform are migrated to cms.Loader
// File is kept in trunk for reference purpose until the whole migration process
// will be completed. (2010-20-18)
// /////////////////////////////////////////////////////////////////////////////
package com.arsdigita.cms.installer;

View File

@ -16,6 +16,17 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
// /////////////////////////////////////////////////////////////////////////////
// Migration Status
// All tasks this class used to perform are migrated to either cms.Loader or
// cms.CMS.
// File is kept in trunk for reference purpose until the whole migration process
// will be completed. (2010-20-18)
// /////////////////////////////////////////////////////////////////////////////
package com.arsdigita.cms.installer;
import com.arsdigita.domain.DataObjectNotFoundException;

View File

@ -16,6 +16,17 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
// /////////////////////////////////////////////////////////////////////////////
// Migration Status
// All tasks this class used to perform are migrated to either cms.Loader or
// cms.CMS.
// File is kept in trunk for reference purpose until the whole migration process
// will be completed. (2010-20-18)
// /////////////////////////////////////////////////////////////////////////////
package com.arsdigita.cms.installer;
import com.arsdigita.domain.DataObjectNotFoundException;

View File

@ -98,6 +98,7 @@ public class LifecycleDefinition extends ACSObject {
* @return the base PDL object type for this definition. Child classes should
* override this method to return the correct value
*/
@Override
public String getBaseDataObjectType() {
return BASE_DATA_OBJECT_TYPE;
}

View File

@ -29,6 +29,11 @@ import com.arsdigita.cms.CMS;
import com.arsdigita.cms.ContentItem;
import com.arsdigita.kernel.ACSObject;
/**
* (No description available yet).
*
* Usage of this class is configured in parameter c.ad.cms.category_authoring_add_form
*/
public class ItemCategoryForm extends ACSObjectCategoryForm {
private static Logger s_log = Logger.getLogger(ItemCategoryForm.class);

View File

@ -33,13 +33,17 @@ import com.arsdigita.web.RedirectSignal;
import com.arsdigita.cms.CMS;
import com.arsdigita.cms.ContentSection;
import com.arsdigita.cms.ItemSelectionModel;
import com.arsdigita.cms.ui.authoring.AuthoringKitWizard;
// import com.arsdigita.cms.ui.authoring.AuthoringKitWizard;
import com.arsdigita.util.Assert;
import com.arsdigita.util.Classes;
import java.math.BigDecimal;
import org.apache.log4j.Logger;
/**
*
*
*/
public class ItemCategoryStep extends SimpleContainer
implements Resettable{

View File

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.cms.installer;
package com.arsdigita.cms.util;
import org.xml.sax.helpers.DefaultHandler;

View File

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.cms.installer;
package com.arsdigita.cms.util;
import com.arsdigita.initializer.InitializationException;
import org.apache.oro.text.perl.Perl5Util;

View File

@ -20,7 +20,7 @@ package com.arsdigita.cms.workflow;
import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.ContentSection;
import com.arsdigita.cms.SecurityManager;
// import com.arsdigita.cms.SecurityManager;
import com.arsdigita.cms.ui.ContentItemPage;
import com.arsdigita.cms.util.GlobalizationUtil;
import com.arsdigita.domain.DataObjectNotFoundException;
@ -43,7 +43,6 @@ import com.arsdigita.persistence.Session;
import com.arsdigita.persistence.SessionManager;
import com.arsdigita.persistence.metadata.ObjectType;
import com.arsdigita.util.Assert;
import com.arsdigita.util.StringUtils;
import com.arsdigita.versioning.TagCollection;
import com.arsdigita.versioning.Transaction;
import com.arsdigita.versioning.TransactionCollection;
@ -303,6 +302,7 @@ public class CMSTask extends UserTask {
* Creates a deep copy of this task and stores a persistent copy.
* TODO: refactor this method in this class, and its parents
* */
@Override
public Object clone() {
CMSTask taskClone = new CMSTask();
copyAttributes(taskClone);
@ -444,6 +444,7 @@ public class CMSTask extends UserTask {
return send;
}
@Override
protected boolean sendAlerts(String operation) {
ContentSection section = getContentSection();
String label = getLabel();
@ -466,6 +467,7 @@ public class CMSTask extends UserTask {
* @see com.arsdigita.messaging.Message
* @see #filterUsersAndSendMessage
*/
@Override
protected void sendMessageToAssignees(Message msg) {
if (m_authorOnly) {
ContentItem item = getItem();
@ -619,6 +621,7 @@ public class CMSTask extends UserTask {
}
}
@Override
public void finish() throws TaskException {
super.finish();
Integer type = getTaskType().getID();

View File

@ -83,6 +83,9 @@ public class UnfinishedTaskNotifier extends TimerTask {
}
/**
* The action to be performed by this timer Task.
*/
public void run() {
Thread.currentThread().setName("unfinished-notifier");
try {