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-94f89814c4dfmaster
parent
8680391734
commit
efa88c40a7
|
|
@ -2,6 +2,10 @@
|
||||||
<registry>
|
<registry>
|
||||||
<config class="com.arsdigita.cms.CMSConfig"
|
<config class="com.arsdigita.cms.CMSConfig"
|
||||||
storage="ccm-cms/cms.properties"/>
|
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"
|
<config class="com.arsdigita.cms.lifecycle.LifecycleConfig"
|
||||||
storage="ccm-cms/lifecycle.properties"/>
|
storage="ccm-cms/lifecycle.properties"/>
|
||||||
<config class="com.arsdigita.cms.publishToFile.PublishToFileConfig"
|
<config class="com.arsdigita.cms.publishToFile.PublishToFileConfig"
|
||||||
|
|
|
||||||
|
|
@ -33,20 +33,46 @@ import org.apache.log4j.Logger;
|
||||||
*/
|
*/
|
||||||
public abstract class CMS {
|
public abstract class CMS {
|
||||||
|
|
||||||
|
private static final Logger s_log = Logger.getLogger(CMS.class);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The CMS XML namespace.
|
* The CMS XML namespace.
|
||||||
*/
|
*/
|
||||||
public final static String CMS_XML_NS = "http://www.arsdigita.com/cms/1.0";
|
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();
|
static final CMSContext s_initialContext = new CMSContext();
|
||||||
|
|
||||||
private static final ThreadLocal s_context = new ThreadLocal() {
|
private static final ThreadLocal s_context = new ThreadLocal() {
|
||||||
|
@Override
|
||||||
public Object initialValue() {
|
public Object initialValue() {
|
||||||
return s_initialContext;
|
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.
|
* Get the context record of the current thread.
|
||||||
|
|
|
||||||
|
|
@ -96,121 +96,71 @@ import org.apache.log4j.Logger;
|
||||||
public final class CMSConfig extends AbstractConfig {
|
public final class CMSConfig extends AbstractConfig {
|
||||||
|
|
||||||
private static final Logger s_log = Logger.getLogger(CMSConfig.class);
|
private static final Logger s_log = Logger.getLogger(CMSConfig.class);
|
||||||
|
/** Private Object to hold one's own instance to return to users. */
|
||||||
private static Map s_skipAssetSteps = null;
|
private static CMSConfig s_config;
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Do not instantiate this class directly.
|
* Returns the singleton configuration record for the content section
|
||||||
|
* environment.
|
||||||
*
|
*
|
||||||
* @see ContentSection#getConfig()
|
* @return The <code>ContentSectionConfig</code> record; it cannot be null
|
||||||
**/
|
*/
|
||||||
public CMSConfig() {
|
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
|
return s_config;
|
||||||
("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");
|
|
||||||
|
|
||||||
m_linksOnlyInSameSubsite = new BooleanParameter
|
/**
|
||||||
("com.arsdigita.cms.browse_links_in_same_subsite_only",
|
* Storage (map) for method getAssetStepsToSkip(ContentType type) to store
|
||||||
Parameter.REQUIRED, new Boolean(false));
|
* mapping of steps that are deemed irrelevant for the passid in type.
|
||||||
|
*/
|
||||||
m_defaultTaskAlerts = new StringArrayParameter
|
private static Map s_skipAssetSteps = null;
|
||||||
("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);
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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
|
m_categoryAuthoringAddForm = new SpecificClassParameter
|
||||||
("com.arsdigita.cms.category_authoring_add_form",
|
("com.arsdigita.cms.category_authoring_add_form",
|
||||||
Parameter.REQUIRED,
|
Parameter.REQUIRED,
|
||||||
ItemCategoryForm.class,
|
ItemCategoryForm.class,
|
||||||
SimpleComponent.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
|
m_templateRootPath = new StringParameter
|
||||||
("com.arsdigita.cms.template_root_path",
|
("com.arsdigita.cms.template_root_path",
|
||||||
Parameter.REQUIRED, "/packages/content-section/templates");
|
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
|
// URL resource: protocol handler removal: START
|
||||||
// remove:
|
// remove:
|
||||||
|
|
@ -223,20 +173,31 @@ public final class CMSConfig extends AbstractConfig {
|
||||||
// throw new UncheckedWrapperException("Cannot parse URL", ex);
|
// throw new UncheckedWrapperException("Cannot parse URL", ex);
|
||||||
// }
|
// }
|
||||||
// ADD:
|
// 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
|
m_itemAdapters = new ResourceParameter
|
||||||
("com.arsdigita.cms.item_adapters",
|
("com.arsdigita.cms.item_adapters",
|
||||||
Parameter.REQUIRED,
|
Parameter.REQUIRED,
|
||||||
"/WEB-INF/resources/cms-item-adapters.xml");
|
"/WEB-INF/resources/cms-item-adapters.xml");
|
||||||
// URL resource: protocol handler removal: END
|
// URL resource: protocol handler removal: END
|
||||||
|
|
||||||
m_defaultSection = new StringParameter
|
/**
|
||||||
("com.arsdigita.cms.default_content_section",
|
* Use streamlined content creation: upon item creation,
|
||||||
Parameter.REQUIRED, "content");
|
* automatically open authoring steps and forward to the next step
|
||||||
|
*/
|
||||||
|
private final Parameter
|
||||||
m_useStreamlinedCreation = new BooleanParameter
|
m_useStreamlinedCreation = new BooleanParameter
|
||||||
("com.arsdigita.cms.use_streamlined_creation",
|
("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
|
m_dhtmlEditorConfig = new DHTMLEditorConfigParameter
|
||||||
("com.arsdigita.cms.dhtml_editor_config",
|
("com.arsdigita.cms.dhtml_editor_config",
|
||||||
Parameter.REQUIRED,
|
Parameter.REQUIRED,
|
||||||
|
|
@ -253,190 +214,397 @@ public final class CMSConfig extends AbstractConfig {
|
||||||
// be accessable by other modules which use DHTMLeditor.
|
// be accessable by other modules which use DHTMLeditor.
|
||||||
// Would be bad style to configure a cms specific parameter in core.
|
// 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
|
m_dhtmlEditorPlugins = new StringArrayParameter
|
||||||
("com.arsdigita.cms.dhtml_editor_plugins",
|
("com.arsdigita.cms.dhtml_editor_plugins",
|
||||||
Parameter.OPTIONAL,
|
Parameter.OPTIONAL,
|
||||||
null);
|
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
|
m_dhtmlEditorHiddenButtons = new StringArrayParameter
|
||||||
("com.arsdigita.cms.dhtml_editor_hidden_buttons",
|
("com.arsdigita.cms.dhtml_editor_hidden_buttons",
|
||||||
Parameter.OPTIONAL,
|
Parameter.OPTIONAL,
|
||||||
null);
|
null);
|
||||||
|
|
||||||
m_hideTemplatesTab = new BooleanParameter
|
/**
|
||||||
("com.arsdigita.cms.hide_templates_tab",
|
* Hide section admin tabs from users without administrative rights.
|
||||||
Parameter.REQUIRED, new Boolean(false));
|
*/
|
||||||
|
private final Parameter
|
||||||
m_hideAdminTabs = new BooleanParameter
|
m_hideAdminTabs = new BooleanParameter
|
||||||
("com.arsdigita.cms.hide_admin_tabs",
|
("com.arsdigita.cms.hide_admin_tabs",
|
||||||
Parameter.REQUIRED, new Boolean(false));
|
Parameter.REQUIRED, new Boolean(false));
|
||||||
|
|
||||||
m_hideTimezone = new BooleanParameter
|
/**
|
||||||
("com.arsdigita.cms.hide_timezone",
|
* Hide Folder Index Checkbox from folder view
|
||||||
Parameter.REQUIRED, new Boolean(false));
|
*/
|
||||||
|
private final Parameter
|
||||||
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));
|
|
||||||
|
|
||||||
m_hideFolderIndexCheckbox = new BooleanParameter
|
m_hideFolderIndexCheckbox = new BooleanParameter
|
||||||
("com.arsdigita.cms.hide_folder_index_checkbox",
|
("com.arsdigita.cms.hide_folder_index_checkbox",
|
||||||
Parameter.REQUIRED, new Boolean(false));
|
Parameter.REQUIRED, new Boolean(false));
|
||||||
|
|
||||||
m_defaultNotificationTime = new IntegerParameter
|
/**
|
||||||
("com.arsdigita.cms.default_notification_time",
|
* Hide launch date parameter on all forms and displays where it's used.
|
||||||
Parameter.REQUIRED, new Integer(0));
|
*/
|
||||||
|
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
|
m_publishLifecycleListenerClass = new StringParameter
|
||||||
("com.arsdigita.cms.publish_lifecycle_listener_class",
|
("com.arsdigita.cms.publish_lifecycle_listener_class",
|
||||||
Parameter.OPTIONAL, PublishLifecycleListener.class.getName());
|
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
|
m_saveTextCleansWordTags = new BooleanParameter
|
||||||
("com.arsdigita.cms.save_text_cleans_word_tags",
|
("com.arsdigita.cms.save_text_cleans_word_tags",
|
||||||
Parameter.OPTIONAL, new Boolean(false));
|
Parameter.OPTIONAL, new Boolean(false));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hide Additional Resource Fields on RelatedLinkPropertyForm
|
||||||
|
*/
|
||||||
|
private final Parameter
|
||||||
m_hideAdditionalResourceFields = new BooleanParameter
|
m_hideAdditionalResourceFields = new BooleanParameter
|
||||||
("com.arsdigita.cms.contentassets.ui."+
|
("com.arsdigita.cms.contentassets.ui."+
|
||||||
"RelatedLinkPropertyForm.hideAdditionalResourceFields",
|
"RelatedLinkPropertyForm.hideAdditionalResourceFields",
|
||||||
Parameter.REQUIRED, new Boolean(false));
|
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
|
m_disableFileAssetExtraction = new BooleanParameter
|
||||||
("com.arsdigita.cms.search.disableFileAssetExtraction",
|
("com.arsdigita.cms.search.disableFileAssetExtraction",
|
||||||
Parameter.REQUIRED, new Boolean(false));
|
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
|
m_deleteWorkflowAfterPublication = new BooleanParameter
|
||||||
("com.arsdigita.cms.delete_workflow_after_publication",
|
("com.arsdigita.cms.delete_workflow_after_publication",
|
||||||
Parameter.REQUIRED, new Boolean(true));
|
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
|
m_soonExpiredTimespanDays = new IntegerParameter
|
||||||
("com.arsdigita.cms.soon_expired_timespan_days",
|
("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
|
m_soonExpiredTimespanMonths = new IntegerParameter
|
||||||
("com.arsdigita.cms.soon_expired_timespan_months",
|
("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
|
m_unpublishedNotFound = new BooleanParameter
|
||||||
("com.arsdigita.cms.unpublished_not_found",
|
("com.arsdigita.cms.unpublished_not_found",
|
||||||
Parameter.REQUIRED, new Boolean(true));
|
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
|
m_categoryAuthoringExtension = new SpecificClassParameter
|
||||||
("com.arsdigita.cms.category_authoring_extension",
|
("com.arsdigita.cms.category_authoring_extension",
|
||||||
Parameter.REQUIRED,
|
Parameter.REQUIRED,
|
||||||
ItemCategoryExtension.class,
|
ItemCategoryExtension.class,
|
||||||
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
|
m_hideResetLifecycleLink = new BooleanParameter
|
||||||
("com.arsdigita.cms.hide_reset_lifecycle_link",
|
("com.arsdigita.cms.hide_reset_lifecycle_link",
|
||||||
Parameter.OPTIONAL, new Boolean(true));
|
Parameter.OPTIONAL, new Boolean(true));
|
||||||
|
|
||||||
m_keywordWeight = new IntegerParameter
|
/**
|
||||||
("com.arsdigita.cms.search.intermedia.keyword_weight",
|
* Whether to include INPATH operators to contains clause in intermedia search
|
||||||
Parameter.OPTIONAL,
|
*/
|
||||||
new Integer(1));
|
private final Parameter
|
||||||
|
|
||||||
m_titleWeight = new IntegerParameter
|
|
||||||
("com.arsdigita.cms.search.intermedia.title_weight",
|
|
||||||
Parameter.OPTIONAL,
|
|
||||||
new Integer(1));
|
|
||||||
|
|
||||||
m_scoreTitleAndKeywords = new BooleanParameter
|
m_scoreTitleAndKeywords = new BooleanParameter
|
||||||
("com.arsdigita.cms.search.score_title_and_keywords",
|
("com.arsdigita.cms.search.score_title_and_keywords",
|
||||||
Parameter.OPTIONAL,
|
Parameter.OPTIONAL,
|
||||||
Boolean.FALSE);
|
Boolean.FALSE);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* each entry in the list is a : separated pair. The first string
|
* Title Weight, the relative weight given to title element within
|
||||||
* is the className for the type (refer to classname column in contenttypes table
|
* cms:item when ranking search results (only used by interMedia)
|
||||||
* eg com.arsdigita.cms.contenttypes.MultiPartArticle
|
*/
|
||||||
|
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
|
* Second string is the name of the bebop step component
|
||||||
* eg com.arsdigita.cms.contenttypes.ui.ImageStep
|
* eg com.arsdigita.cms.contenttypes.ui.ImageStep
|
||||||
*/
|
*/
|
||||||
|
private final Parameter
|
||||||
m_skipAssetSteps = new StringArrayParameter
|
m_skipAssetSteps = new StringArrayParameter
|
||||||
("com.arsdigita.cms.skip_asset_steps",
|
("com.arsdigita.cms.skip_asset_steps",
|
||||||
Parameter.OPTIONAL,
|
Parameter.OPTIONAL,
|
||||||
null);
|
null);
|
||||||
|
/**
|
||||||
|
* Mandatory Descriptions Content types may refer to this to decide
|
||||||
|
* whether to validate against empty descriptions
|
||||||
|
*/
|
||||||
|
private final Parameter
|
||||||
m_mandatoryDescriptions = new BooleanParameter
|
m_mandatoryDescriptions = new BooleanParameter
|
||||||
("com.arsdigita.cms.mandatory_descriptions",
|
("com.arsdigita.cms.mandatory_descriptions",
|
||||||
Parameter.OPTIONAL, new Boolean(false));
|
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));
|
Parameter.OPTIONAL, new Boolean(false));
|
||||||
|
|
||||||
m_deleteWorkflowNotificationsWhenSent = new BooleanParameter
|
/**
|
||||||
("com.arsdigita.cms.delete_workflow_notification_when_sent",
|
* Contacts for content items. Allows you to add a Contact authoring step
|
||||||
Parameter.OPTIONAL, new Boolean(false));
|
* to all items
|
||||||
|
*/
|
||||||
m_categoryTreeOrdering = new EnumerationParameter
|
private final Parameter
|
||||||
("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);
|
|
||||||
|
|
||||||
m_hasContactsAuthoringStep = new BooleanParameter
|
m_hasContactsAuthoringStep = new BooleanParameter
|
||||||
("com.arsdigita.cms.has_contacts_authoring_step",
|
("com.arsdigita.cms.has_contacts_authoring_step",
|
||||||
Parameter.REQUIRED, new Boolean(false));
|
Parameter.REQUIRED, new Boolean(false));
|
||||||
|
|
||||||
m_hideTextAssetUploadFile = new BooleanParameter
|
/**
|
||||||
("com.arsdigita.cms.hide_text_asset_upload_file",
|
* Ordering for nodes in assign category tree. Decide whether entries
|
||||||
Parameter.REQUIRED,
|
* should be ordered alphabetically or according to sort key
|
||||||
new Boolean(false));
|
* (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
|
m_allowContentCreateInSectionListing = new BooleanParameter
|
||||||
("com.arsdigita.cms.allow_content_create_in_section_listing",
|
("com.arsdigita.cms.allow_content_create_in_section_listing",
|
||||||
Parameter.REQUIRED,
|
Parameter.REQUIRED,
|
||||||
new Boolean(true));
|
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));
|
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
|
// 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
|
// Moved to publishToFile.PublishToFileConfig as of version 6.0.2
|
||||||
// m_disableItemPfs = new BooleanParameter
|
// private final Parameter m_disableItemPfs;
|
||||||
// ("com.arsdigita.cms.disable_item_pfs",
|
// private final Parameter m_publishToFileClass;
|
||||||
// Parameter.REQUIRED, new Boolean(false));
|
|
||||||
//
|
|
||||||
// m_publishToFileClass = new SpecificClassParameter
|
/**
|
||||||
// ("com.arsdigita.cms.publish_to_file_class",
|
* Constructor, but do NOT instantiate this class directly.
|
||||||
// Parameter.REQUIRED,
|
*
|
||||||
// PublishToFile.class,
|
* @see ContentSection#getConfig()
|
||||||
// PublishToFileListener.class);
|
**/
|
||||||
|
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_templateRootPath);
|
||||||
register(m_defaultItemTemplatePath);
|
register(m_defaultItemTemplatePath);
|
||||||
register(m_defaultFolderTemplatePath);
|
register(m_defaultFolderTemplatePath);
|
||||||
register(m_defaultItemResolverClass);
|
|
||||||
register(m_defaultTemplateResolverClass);
|
|
||||||
register(m_categoryAuthoringAddForm);
|
register(m_categoryAuthoringAddForm);
|
||||||
register(m_useSectionCategories);
|
|
||||||
register(m_itemAdapters);
|
register(m_itemAdapters);
|
||||||
register(m_defaultSection);
|
|
||||||
register(m_useStreamlinedCreation);
|
register(m_useStreamlinedCreation);
|
||||||
register(m_dhtmlEditorConfig);
|
register(m_dhtmlEditorConfig);
|
||||||
register(m_dhtmlEditorPlugins);
|
register(m_dhtmlEditorPlugins);
|
||||||
|
|
@ -457,7 +625,6 @@ public final class CMSConfig extends AbstractConfig {
|
||||||
register(m_deleteWorkflowAfterPublication);
|
register(m_deleteWorkflowAfterPublication);
|
||||||
register(m_soonExpiredTimespanMonths);
|
register(m_soonExpiredTimespanMonths);
|
||||||
register(m_soonExpiredTimespanDays);
|
register(m_soonExpiredTimespanDays);
|
||||||
register(m_defaultTaskAlerts);
|
|
||||||
register(m_unpublishedNotFound);
|
register(m_unpublishedNotFound);
|
||||||
register(m_linksOnlyInSameSubsite);
|
register(m_linksOnlyInSameSubsite);
|
||||||
register(m_categoryAuthoringExtension);
|
register(m_categoryAuthoringExtension);
|
||||||
|
|
@ -475,6 +642,17 @@ public final class CMSConfig extends AbstractConfig {
|
||||||
register(m_hideTextAssetUploadFile);
|
register(m_hideTextAssetUploadFile);
|
||||||
register(m_allowContentCreateInSectionListing);
|
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
|
// Moved to publishToFile.PublishToFileConfig as of version 6.0.2
|
||||||
// register(m_disableItemPfs);
|
// register(m_disableItemPfs);
|
||||||
// register(m_publishToFileClass);
|
// register(m_publishToFileClass);
|
||||||
|
|
@ -506,10 +684,6 @@ public final class CMSConfig extends AbstractConfig {
|
||||||
return (Class) get(m_categoryAuthoringAddForm);
|
return (Class) get(m_categoryAuthoringAddForm);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final boolean getUseSectionCategories() {
|
|
||||||
return ((Boolean) get(m_useSectionCategories)).booleanValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
public final InputStream getItemAdapters() {
|
public final InputStream getItemAdapters() {
|
||||||
// URL resource: protocol handler removal: START
|
// URL resource: protocol handler removal: START
|
||||||
// remove:
|
// remove:
|
||||||
|
|
@ -610,10 +784,6 @@ public final class CMSConfig extends AbstractConfig {
|
||||||
return ((Integer) get(m_soonExpiredTimespanDays)).intValue();
|
return ((Integer) get(m_soonExpiredTimespanDays)).intValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
public final String[] getDefaultTaskAlerts() {
|
|
||||||
return (String[]) get(m_defaultTaskAlerts);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final boolean isUnpublishedNotFound() {
|
public final boolean isUnpublishedNotFound() {
|
||||||
return ((Boolean) get(m_unpublishedNotFound)).booleanValue();
|
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
|
* Internal class representing a DHTMLEditor configuration parameter. It
|
||||||
|
|
|
||||||
|
|
@ -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.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.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
|
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.example=/default/folder.jsp
|
||||||
com.arsdigita.cms.default_folder_template_path.format=[string]
|
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.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.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
|
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.example=false
|
||||||
com.arsdigita.cms.use_streamlined_creation.format=[boolean]
|
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.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.purpose=Hide section admin tabs from users without administrative rights.
|
||||||
com.arsdigita.cms.hide_admin_tabs.example=false
|
com.arsdigita.cms.hide_admin_tabs.example=false
|
||||||
com.arsdigita.cms.hide_admin_tabs.format=[boolean]
|
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.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.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
|
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.example=false
|
||||||
com.arsdigita.cms.hide_udct_ui.format=[boolean]
|
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.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.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
|
com.arsdigita.cms.dhtml_editor_config.example=HTMLArea.Config.CMSStyled,/assets/htmlarea/config/Styled.js
|
||||||
|
|
|
||||||
|
|
@ -144,27 +144,44 @@ public class ContentSection extends Application {
|
||||||
// super(BASE_DATA_OBJECT_TYPE);
|
// 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 {
|
public ContentSection(OID oid) throws DataObjectNotFoundException {
|
||||||
super(oid);
|
super(oid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor re-creating a content section object from its data object.
|
||||||
|
*
|
||||||
|
* @param oid
|
||||||
|
* @throws DataObjectNotFoundException
|
||||||
|
*/
|
||||||
public ContentSection(DataObject obj) {
|
public ContentSection(DataObject obj) {
|
||||||
super(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 {
|
public ContentSection(BigDecimal id) throws DataObjectNotFoundException {
|
||||||
super(new OID(BASE_DATA_OBJECT_TYPE, id));
|
super(new OID(BASE_DATA_OBJECT_TYPE, id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static CMSConfig getConfig() {
|
public static CMSConfig getConfig() {
|
||||||
return s_config;
|
return s_config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the base PDL object type for this section. Child classes should
|
* @return the base PDL object type for this section. Child classes should
|
||||||
* override this method to return the correct value
|
* override this method to return the correct value
|
||||||
|
|
@ -234,38 +251,42 @@ public class ContentSection extends Application {
|
||||||
set(NAME, name);
|
set(NAME, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// Left-over from content section as old-style application based on kernel
|
||||||
* Get the package instance for this content section. Each section is
|
// PackageType and Sitenode instead on new style web.Application.
|
||||||
* associated with exactly one package instance.
|
// Retained for reference purpose until the packages Workspace and Service are
|
||||||
*
|
// migrated to new style application as well.
|
||||||
* @return the package instance associated with this content section.
|
// /**
|
||||||
* @post return != null
|
// * 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() {
|
// public PackageInstance getPackageInstance() {
|
||||||
// DataObject pkg = (DataObject) get(PACKAGE);
|
// DataObject pkg = (DataObject) get(PACKAGE);
|
||||||
// Assert.exists(pkg, "package instance");
|
// Assert.exists(pkg, "package instance");
|
||||||
// return new PackageInstance(pkg);
|
// return new PackageInstance(pkg);
|
||||||
// }
|
// }
|
||||||
|
//
|
||||||
/**
|
// /**
|
||||||
* Set the package instance for this content section.
|
// * Set the package instance for this content section.
|
||||||
*
|
// *
|
||||||
* @param pkg The package instance
|
// * @param pkg The package instance
|
||||||
* @pre ( pkg != null )
|
// * @pre ( pkg != null )
|
||||||
*/
|
// */
|
||||||
// protected void setPackageInstance(PackageInstance pkg) {
|
// protected void setPackageInstance(PackageInstance pkg) {
|
||||||
// Assert.exists(pkg, "package instance");
|
// Assert.exists(pkg, "package instance");
|
||||||
// setAssociation(PACKAGE, pkg);
|
// setAssociation(PACKAGE, pkg);
|
||||||
// }
|
// }
|
||||||
|
//
|
||||||
/**
|
// /**
|
||||||
* Fetch the site node on which the content section is mounted.
|
// * Fetch the site node on which the content section is mounted.
|
||||||
* A content section should be mounted on exactly one site node. If it
|
// * 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
|
// * is mounted on more than one site node, only the first site node will
|
||||||
* be returned.
|
// * be returned.
|
||||||
*
|
// *
|
||||||
* @return The site node
|
// * @return The site node
|
||||||
*/
|
// */
|
||||||
// public SiteNode getSiteNode() {
|
// public SiteNode getSiteNode() {
|
||||||
// return getPackageInstance().getDefaultMountPoint();
|
// return getPackageInstance().getDefaultMountPoint();
|
||||||
// }
|
// }
|
||||||
|
|
@ -306,6 +327,7 @@ public class ContentSection extends Application {
|
||||||
return URL.getDispatcherPath() + getPath();
|
return URL.getDispatcherPath() + getPath();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Left over, see above
|
||||||
// public final String getPath() {
|
// public final String getPath() {
|
||||||
// final String path = getSiteNode().getURL();
|
// final String path = getSiteNode().getURL();
|
||||||
//
|
//
|
||||||
|
|
@ -467,7 +489,7 @@ public class ContentSection extends Application {
|
||||||
* @return The class name
|
* @return The class name
|
||||||
* @post ( return != null )
|
* @post ( return != null )
|
||||||
*/
|
*/
|
||||||
public String getPageResolverClass() {
|
public String getPageResolverClassName() {
|
||||||
String prc = (String) get(PAGE_RESOLVER_CLASS);
|
String prc = (String) get(PAGE_RESOLVER_CLASS);
|
||||||
Assert.exists(prc, "Page Resolver class");
|
Assert.exists(prc, "Page Resolver class");
|
||||||
return prc;
|
return prc;
|
||||||
|
|
@ -489,7 +511,7 @@ public class ContentSection extends Application {
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final Class prc = Class.forName(getPageResolverClass());
|
final Class prc = Class.forName(getPageResolverClassName());
|
||||||
m_pageResolver = (PageResolver) prc.newInstance();
|
m_pageResolver = (PageResolver) prc.newInstance();
|
||||||
m_pageResolver.setContentSectionID(getID());
|
m_pageResolver.setContentSectionID(getID());
|
||||||
} catch (ClassNotFoundException cnfe) {
|
} catch (ClassNotFoundException cnfe) {
|
||||||
|
|
@ -513,7 +535,7 @@ public class ContentSection extends Application {
|
||||||
*
|
*
|
||||||
* @param className The class name
|
* @param className The class name
|
||||||
*/
|
*/
|
||||||
public void setPageResolverClass(String className) {
|
public void setPageResolverClassName(String className) {
|
||||||
set(PAGE_RESOLVER_CLASS, className);
|
set(PAGE_RESOLVER_CLASS, className);
|
||||||
m_pageResolver = null;
|
m_pageResolver = null;
|
||||||
}
|
}
|
||||||
|
|
@ -524,7 +546,7 @@ public class ContentSection extends Application {
|
||||||
* @return The class name
|
* @return The class name
|
||||||
* @post ( return != null )
|
* @post ( return != null )
|
||||||
*/
|
*/
|
||||||
public String getItemResolverClass() {
|
public String getItemResolverClassName() {
|
||||||
String irc = (String) get(ITEM_RESOLVER_CLASS);
|
String irc = (String) get(ITEM_RESOLVER_CLASS);
|
||||||
Assert.exists(irc, "Content Item Resolver class");
|
Assert.exists(irc, "Content Item Resolver class");
|
||||||
s_log.debug("Content Item Resolver Class is " + irc);
|
s_log.debug("Content Item Resolver Class is " + irc);
|
||||||
|
|
@ -541,7 +563,7 @@ public class ContentSection extends Application {
|
||||||
public ItemResolver getItemResolver() {
|
public ItemResolver getItemResolver() {
|
||||||
if (m_itemResolver == null) {
|
if (m_itemResolver == null) {
|
||||||
try {
|
try {
|
||||||
final Class irc = Class.forName(getItemResolverClass());
|
final Class irc = Class.forName(getItemResolverClassName());
|
||||||
m_itemResolver = (ItemResolver) irc.newInstance();
|
m_itemResolver = (ItemResolver) irc.newInstance();
|
||||||
} catch (ClassNotFoundException cnfe) {
|
} catch (ClassNotFoundException cnfe) {
|
||||||
throw new UncheckedWrapperException(cnfe);
|
throw new UncheckedWrapperException(cnfe);
|
||||||
|
|
@ -571,7 +593,7 @@ public class ContentSection extends Application {
|
||||||
* @return The class name
|
* @return The class name
|
||||||
* @post ( return != null )
|
* @post ( return != null )
|
||||||
*/
|
*/
|
||||||
public String getTemplateResolverClass() {
|
public String getTemplateResolverClassName() {
|
||||||
String trc = (String) get(TEMPLATE_RESOLVER_CLASS);
|
String trc = (String) get(TEMPLATE_RESOLVER_CLASS);
|
||||||
Assert.exists(trc, "Template Resolver class");
|
Assert.exists(trc, "Template Resolver class");
|
||||||
return trc;
|
return trc;
|
||||||
|
|
@ -586,7 +608,7 @@ public class ContentSection extends Application {
|
||||||
public TemplateResolver getTemplateResolver() {
|
public TemplateResolver getTemplateResolver() {
|
||||||
if (m_templateResolver == null) {
|
if (m_templateResolver == null) {
|
||||||
try {
|
try {
|
||||||
Class trc = Class.forName(getTemplateResolverClass());
|
Class trc = Class.forName(getTemplateResolverClassName());
|
||||||
m_templateResolver = (TemplateResolver) trc.newInstance();
|
m_templateResolver = (TemplateResolver) trc.newInstance();
|
||||||
} catch (ClassNotFoundException cnfe) {
|
} catch (ClassNotFoundException cnfe) {
|
||||||
throw new UncheckedWrapperException(cnfe);
|
throw new UncheckedWrapperException(cnfe);
|
||||||
|
|
@ -616,7 +638,7 @@ public class ContentSection extends Application {
|
||||||
*
|
*
|
||||||
* @return The class name
|
* @return The class name
|
||||||
*/
|
*/
|
||||||
public String getXMLGeneratorClass() {
|
public String getXMLGeneratorClassName() {
|
||||||
String xgc = (String) get(XML_GENERATOR_CLASS);
|
String xgc = (String) get(XML_GENERATOR_CLASS);
|
||||||
Assert.exists(xgc, "XML Generator class");
|
Assert.exists(xgc, "XML Generator class");
|
||||||
return xgc;
|
return xgc;
|
||||||
|
|
@ -631,7 +653,7 @@ public class ContentSection extends Application {
|
||||||
public XMLGenerator getXMLGenerator() {
|
public XMLGenerator getXMLGenerator() {
|
||||||
if (m_xmlGenerator == null) {
|
if (m_xmlGenerator == null) {
|
||||||
try {
|
try {
|
||||||
Class xgc = Class.forName(getXMLGeneratorClass());
|
Class xgc = Class.forName(getXMLGeneratorClassName());
|
||||||
m_xmlGenerator = (XMLGenerator) xgc.newInstance();
|
m_xmlGenerator = (XMLGenerator) xgc.newInstance();
|
||||||
} catch (ClassNotFoundException cnfe) {
|
} catch (ClassNotFoundException cnfe) {
|
||||||
throw new UncheckedWrapperException(cnfe);
|
throw new UncheckedWrapperException(cnfe);
|
||||||
|
|
@ -940,14 +962,14 @@ public class ContentSection extends Application {
|
||||||
// return getSectionFromPackage(pkg);
|
// return getSectionFromPackage(pkg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// /**
|
||||||
* Looks up the section given the PackageInstance.
|
// * Looks up the section given the PackageInstance.
|
||||||
*
|
// *
|
||||||
* @param pkg The package instance
|
// * @param pkg The package instance
|
||||||
* @return The content section ID
|
// * @return The content section ID
|
||||||
* @pre ( pkg != null )
|
// * @pre ( pkg != null )
|
||||||
* @post ( return != null )
|
// * @post ( return != null )
|
||||||
*/
|
// */
|
||||||
// public static ContentSection getSectionFromPackage(PackageInstance pkg)
|
// public static ContentSection getSectionFromPackage(PackageInstance pkg)
|
||||||
// throws DataObjectNotFoundException {
|
// 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
|
* 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
|
//create and initialize the content section application
|
||||||
ContentSection section = (ContentSection) Application.createApplication
|
ContentSection section = (ContentSection) Application.createApplication
|
||||||
(BASE_DATA_OBJECT_TYPE, name, name, null );
|
(BASE_DATA_OBJECT_TYPE, name, name, null );
|
||||||
section.initialize(
|
section.initialize( name,
|
||||||
name,
|
|
||||||
folder,
|
folder,
|
||||||
category,
|
category,
|
||||||
staff,
|
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.
|
* Creates and maps default resources to the content section.
|
||||||
*
|
*
|
||||||
|
|
@ -1155,8 +1178,7 @@ public class ContentSection extends Application {
|
||||||
|
|
||||||
// XML resources
|
// XML resources
|
||||||
ResourceType rt = ResourceType.findResourceType("xml");
|
ResourceType rt = ResourceType.findResourceType("xml");
|
||||||
Resource r =
|
Resource r = rt.createInstance("com.arsdigita.cms.ui.ContentSectionPage");
|
||||||
rt.createInstance("com.arsdigita.cms.ui.ContentSectionPage");
|
|
||||||
r.save();
|
r.save();
|
||||||
ResourceMapping rm = r.createInstance(section, "admin");
|
ResourceMapping rm = r.createInstance(section, "admin");
|
||||||
rm.save();
|
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.
|
* Creates the root folder for a content section.
|
||||||
*
|
*
|
||||||
|
|
@ -1217,6 +1225,20 @@ public class ContentSection extends Application {
|
||||||
return root;
|
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.
|
* Initialize a newly created content section.
|
||||||
|
|
@ -1245,15 +1267,15 @@ public class ContentSection extends Application {
|
||||||
|
|
||||||
setName(name);
|
setName(name);
|
||||||
//setPackageInstance(pkg);
|
//setPackageInstance(pkg);
|
||||||
setStaffGroup(staff);
|
|
||||||
setViewersGroup(viewers);
|
|
||||||
setRootFolder(folder);
|
setRootFolder(folder);
|
||||||
setRootCategory(category);
|
setRootCategory(category);
|
||||||
setPageResolverClass(prc);
|
setStaffGroup(staff);
|
||||||
|
setPageResolverClassName(prc);
|
||||||
setItemResolverClass(irc);
|
setItemResolverClass(irc);
|
||||||
setXMLGeneratorClass(xgc);
|
setXMLGeneratorClass(xgc);
|
||||||
setTemplatesFolder(templates);
|
|
||||||
setTemplateResolverClass(trc);
|
setTemplateResolverClass(trc);
|
||||||
|
setTemplatesFolder(templates);
|
||||||
|
setViewersGroup(viewers);
|
||||||
save();
|
save();
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
|
|
@ -1273,10 +1295,12 @@ public class ContentSection extends Application {
|
||||||
return new Folder.ItemCollection(dq);
|
return new Folder.ItemCollection(dq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public String getServletPath() {
|
public String getServletPath() {
|
||||||
return URL.SERVLET_DIR + "/content-section";
|
return URL.SERVLET_DIR + "/content-section";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public String getStylesheetPath() {
|
public String getStylesheetPath() {
|
||||||
return STYLESHEET;
|
return STYLESHEET;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,8 @@ import com.arsdigita.cms.dispatcher.AssetURLFinder;
|
||||||
import com.arsdigita.cms.dispatcher.ItemDelegatedURLPatternGenerator;
|
import com.arsdigita.cms.dispatcher.ItemDelegatedURLPatternGenerator;
|
||||||
import com.arsdigita.cms.dispatcher.ItemTemplatePatternGenerator;
|
import com.arsdigita.cms.dispatcher.ItemTemplatePatternGenerator;
|
||||||
import com.arsdigita.cms.dispatcher.ItemURLFinder;
|
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.PublishToFileListener;
|
||||||
import com.arsdigita.cms.publishToFile.QueueManager;
|
import com.arsdigita.cms.publishToFile.QueueManager;
|
||||||
import com.arsdigita.cms.search.AssetMetadataProvider;
|
import com.arsdigita.cms.search.AssetMetadataProvider;
|
||||||
|
|
@ -49,10 +50,10 @@ import com.arsdigita.domain.DomainObjectInstantiator;
|
||||||
import com.arsdigita.domain.xml.TraversalHandler;
|
import com.arsdigita.domain.xml.TraversalHandler;
|
||||||
import com.arsdigita.kernel.ACSObjectInstantiator;
|
import com.arsdigita.kernel.ACSObjectInstantiator;
|
||||||
import com.arsdigita.kernel.NoValidURLException;
|
import com.arsdigita.kernel.NoValidURLException;
|
||||||
import com.arsdigita.kernel.PackageInstance;
|
// import com.arsdigita.kernel.PackageInstance;
|
||||||
import com.arsdigita.kernel.PackageInstanceCollection;
|
// import com.arsdigita.kernel.PackageInstanceCollection;
|
||||||
import com.arsdigita.kernel.PackageType;
|
// import com.arsdigita.kernel.PackageType;
|
||||||
import com.arsdigita.kernel.SiteNode;
|
// import com.arsdigita.kernel.SiteNode;
|
||||||
import com.arsdigita.kernel.URLFinder;
|
import com.arsdigita.kernel.URLFinder;
|
||||||
import com.arsdigita.kernel.URLFinderNotFoundException;
|
import com.arsdigita.kernel.URLFinderNotFoundException;
|
||||||
import com.arsdigita.kernel.URLService;
|
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.ManifestSource;
|
||||||
import com.arsdigita.persistence.pdl.NameFilter;
|
import com.arsdigita.persistence.pdl.NameFilter;
|
||||||
import com.arsdigita.runtime.CompoundInitializer;
|
import com.arsdigita.runtime.CompoundInitializer;
|
||||||
import com.arsdigita.runtime.ConfigError;
|
// import com.arsdigita.runtime.ConfigError;
|
||||||
import com.arsdigita.runtime.DomainInitEvent;
|
import com.arsdigita.runtime.DomainInitEvent;
|
||||||
import com.arsdigita.runtime.LegacyInitializer;
|
import com.arsdigita.runtime.LegacyInitializer;
|
||||||
import com.arsdigita.runtime.PDLInitializer;
|
import com.arsdigita.runtime.PDLInitializer;
|
||||||
|
|
@ -87,14 +88,15 @@ import com.arsdigita.cms.util.LanguageUtil;
|
||||||
import com.arsdigita.kernel.Kernel;
|
import com.arsdigita.kernel.Kernel;
|
||||||
|
|
||||||
// For Id.
|
// For Id.
|
||||||
import java.math.BigDecimal;
|
// import java.math.BigDecimal;
|
||||||
|
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The main CMS initializer.
|
* The main CMS initializer, executed recurringly at each system startup.
|
||||||
*
|
*
|
||||||
* @author Justin Ross <jross@redhat.com>
|
* @author Justin Ross <jross@redhat.com>
|
||||||
|
* @author Peter Boy <pboy@barkhof.uni-bremen.de>
|
||||||
* @version $Id: Initializer.java 2070 2010-01-28 08:47:41Z pboy $
|
* @version $Id: Initializer.java 2070 2010-01-28 08:47:41Z pboy $
|
||||||
*/
|
*/
|
||||||
public class Initializer extends CompoundInitializer {
|
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 */
|
/** Creates a s_logging category with name = to the full name of class */
|
||||||
private static Logger s_log = Logger.getLogger(Initializer.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() {
|
public Initializer() {
|
||||||
final String url = RuntimeConfig.getConfig().getJDBCURL();
|
final String url = RuntimeConfig.getConfig().getJDBCURL();
|
||||||
|
|
@ -127,7 +138,7 @@ public class Initializer extends CompoundInitializer {
|
||||||
//
|
//
|
||||||
// Invokes ContentCenterSetup (without any LegacyInitializer)
|
// Invokes ContentCenterSetup (without any LegacyInitializer)
|
||||||
// performs mainly loader tasks and should be migrated to Loader.
|
// 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:
|
// Step 2:
|
||||||
// Old type initializer "com.arsdigita.cms.installer.xml.ContentTypeInitializer"
|
// 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
|
// Initializer for content section, needed when LegacyInitializer in step 4
|
||||||
// has been moved to c.ad.Loader in order to register the application and
|
// has been moved to c.ad.Loader in order to register the application and
|
||||||
// optionally to install additional content sections.
|
// 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.
|
// Used to be step 3 in old enterprise.init migrated to loader/new init.
|
||||||
add(new com.arsdigita.cms.publishToFile.Initializer());
|
add(new com.arsdigita.cms.publishToFile.Initializer());
|
||||||
|
|
@ -231,9 +242,15 @@ public class Initializer extends CompoundInitializer {
|
||||||
registerPatternGenerators();
|
registerPatternGenerators();
|
||||||
|
|
||||||
// cg - register Task Retrieval engine
|
// cg - register Task Retrieval engine
|
||||||
|
|
||||||
Engine.registerEngine(CMSEngine.CMS_ENGINE_TYPE, new CMSEngine());
|
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
|
// register item adapters
|
||||||
XML.parse(ContentSection.getConfig().getItemAdapters(),
|
XML.parse(ContentSection.getConfig().getItemAdapters(),
|
||||||
new TraversalHandler());
|
new TraversalHandler());
|
||||||
|
|
@ -316,6 +333,7 @@ public class Initializer extends CompoundInitializer {
|
||||||
f.registerInstantiator
|
f.registerInstantiator
|
||||||
(WorkflowTemplate.BASE_DATA_OBJECT_TYPE,
|
(WorkflowTemplate.BASE_DATA_OBJECT_TYPE,
|
||||||
new ACSObjectInstantiator() {
|
new ACSObjectInstantiator() {
|
||||||
|
@Override
|
||||||
public DomainObject doNewInstance(DataObject dataObject) {
|
public DomainObject doNewInstance(DataObject dataObject) {
|
||||||
return new WorkflowTemplate(dataObject);
|
return new WorkflowTemplate(dataObject);
|
||||||
}
|
}
|
||||||
|
|
@ -327,6 +345,7 @@ public class Initializer extends CompoundInitializer {
|
||||||
public DomainObject doNewInstance(DataObject dataObject) {
|
public DomainObject doNewInstance(DataObject dataObject) {
|
||||||
return new TemplateContext(dataObject);
|
return new TemplateContext(dataObject);
|
||||||
}
|
}
|
||||||
|
@Override
|
||||||
public DomainObjectInstantiator
|
public DomainObjectInstantiator
|
||||||
resolveInstantiator(DataObject obj) {
|
resolveInstantiator(DataObject obj) {
|
||||||
return this;
|
return this;
|
||||||
|
|
|
||||||
|
|
@ -18,11 +18,13 @@
|
||||||
*/
|
*/
|
||||||
package com.arsdigita.cms;
|
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.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.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.ContentDirectoryPortlet;
|
||||||
import com.arsdigita.cms.portlet.ContentItemPortlet;
|
import com.arsdigita.cms.portlet.ContentItemPortlet;
|
||||||
//import com.arsdigita.cms.portlet.ContentSectionsPortlet;
|
//import com.arsdigita.cms.portlet.ContentSectionsPortlet;
|
||||||
|
|
@ -38,7 +40,7 @@ import com.arsdigita.kernel.KernelExcursion;
|
||||||
import com.arsdigita.kernel.PackageInstance;
|
import com.arsdigita.kernel.PackageInstance;
|
||||||
import com.arsdigita.kernel.PackageType;
|
import com.arsdigita.kernel.PackageType;
|
||||||
import com.arsdigita.kernel.SiteNode;
|
import com.arsdigita.kernel.SiteNode;
|
||||||
// import com.arsdigita.kernel.Stylesheet;
|
import com.arsdigita.kernel.Stylesheet;
|
||||||
import com.arsdigita.kernel.permissions.PrivilegeDescriptor;
|
import com.arsdigita.kernel.permissions.PrivilegeDescriptor;
|
||||||
import com.arsdigita.loader.PackageLoader;
|
import com.arsdigita.loader.PackageLoader;
|
||||||
import com.arsdigita.persistence.DataObject;
|
import com.arsdigita.persistence.DataObject;
|
||||||
|
|
@ -138,11 +140,11 @@ public class Loader extends PackageLoader {
|
||||||
private final static String CMS_STYLESHEET =
|
private final static String CMS_STYLESHEET =
|
||||||
"/packages/content-section/xsl/cms.xsl";
|
"/packages/content-section/xsl/cms.xsl";
|
||||||
|
|
||||||
/**
|
// /**
|
||||||
* Constant string used as key for creating Workspace (content-center) as a
|
// * Constant string used as key for creating Workspace (content-center) as a
|
||||||
* legacy application.
|
// * legacy application.
|
||||||
*/
|
// */
|
||||||
public static final String WORKSPACE_PACKAGE_KEY = "content-center";
|
// public static final String WORKSPACE_PACKAGE_KEY = "content-center";
|
||||||
private static final String WORKSPACE_INSTANCE_NAME = "Content Center";
|
private static final String WORKSPACE_INSTANCE_NAME = "Content Center";
|
||||||
/**
|
/**
|
||||||
* Dispatcher class for Workspace (content-center) (needed to be assigned
|
* 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.
|
* Name of the CMS service package instance, i.e. its URL.
|
||||||
*/
|
*/
|
||||||
private final static String SERVICE_URL = "cms-service";
|
private final static String SERVICE_URL = "cms-service";
|
||||||
/**
|
// /**
|
||||||
* Constant string used as key for creating service package as a
|
// * Constant string used as key for creating service package as a
|
||||||
* legacy application.
|
// * legacy application.
|
||||||
*/
|
// */
|
||||||
public final static String SERVICE_PACKAGE_KEY = "cms-service";
|
// public final static String SERVICE_PACKAGE_KEY = "cms-service";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -235,40 +237,43 @@ public class Loader extends PackageLoader {
|
||||||
}.run();
|
}.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Migration Status:
|
||||||
/**
|
// Method completely replaced by loadContentSection()
|
||||||
* Loads the CMS package type in the database, i.e. content-section,
|
// Code kept for reference purpose untill the complete migration will be done.
|
||||||
* the main CMS domain (application) class.
|
//
|
||||||
*
|
// /**
|
||||||
* (pb) WRONG:
|
// * Loads the CMS package type in the database, i.e. content-section,
|
||||||
* Creates content-section PackageType. Is replaced by newer ApplicationType
|
// * the main CMS domain (application) class.
|
||||||
* mechanisam (see loadContentSection). Must nolonger be used.
|
// *
|
||||||
* createPrivileges might be included in load, but has te be executed at
|
// * (pb) WRONG:
|
||||||
* each startup to take modifications into accout. So it has to be an
|
// * Creates content-section PackageType. Is replaced by newer ApplicationType
|
||||||
* initializer task anyway.
|
// * mechanisam (see loadContentSection). Must nolonger be used.
|
||||||
*/
|
// * createPrivileges might be included in load, but has te be executed at
|
||||||
private void loadCMSPackageType() {
|
// * each startup to take modifications into accout. So it has to be an
|
||||||
s_log.debug("Loading the CMS package type...");
|
// * initializer task anyway.
|
||||||
|
// */
|
||||||
// creating appl. type using the deprecated legacy application style.
|
// private void loadCMSPackageType() {
|
||||||
// Should be refactored to c.ad.web.Application.
|
// s_log.debug("Loading the CMS package type...");
|
||||||
// CMS_PACKAGE_KEY = "content-section"
|
//
|
||||||
|
// // 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
|
// PackageType type = PackageType.create
|
||||||
// (CMS_PACKAGE_KEY,
|
// (CMS_PACKAGE_KEY,
|
||||||
// "Content Management System",
|
// "Content Management System",
|
||||||
// "Content Management Systems",
|
// "Content Management Systems",
|
||||||
// "http://cms-java.arsdigita.com/");
|
// "http://cms-java.arsdigita.com/");
|
||||||
|
//
|
||||||
// type.setDispatcherClass(CMS_DISPATCHER_CLASS);
|
// type.setDispatcherClass(CMS_DISPATCHER_CLASS);
|
||||||
//type.addListener(LISTENER_CLASS); (commented out)
|
// //type.addListener(LISTENER_CLASS); (commented out)
|
||||||
|
//
|
||||||
// Register a stylesheets to the CMS package.
|
// // Register a stylesheets to the CMS package.
|
||||||
// Stylesheet ss = Stylesheet.createStylesheet(CMS_STYLESHEET);
|
// Stylesheet ss = Stylesheet.createStylesheet(CMS_STYLESHEET);
|
||||||
// ss.save();
|
// ss.save();
|
||||||
// type.addStylesheet(ss);
|
// type.addStylesheet(ss);
|
||||||
// type.save();
|
// type.save();
|
||||||
|
//
|
||||||
|
//
|
||||||
// Creating of CMS package using new style c.ad.web.Application could
|
// Creating of CMS package using new style c.ad.web.Application could
|
||||||
// be done like the following.
|
// be done like the following.
|
||||||
// ApplicationType type = ApplicationType
|
// ApplicationType type = ApplicationType
|
||||||
|
|
@ -280,12 +285,12 @@ public class Loader extends PackageLoader {
|
||||||
// // setDispatcherClass in web.Application or does it work magically without?
|
// // setDispatcherClass in web.Application or does it work magically without?
|
||||||
// type.setDispatcherClass(CMS_DISPATCHER_CLASS);
|
// type.setDispatcherClass(CMS_DISPATCHER_CLASS);
|
||||||
// type.addStylesheet(ss);
|
// type.addStylesheet(ss);
|
||||||
|
//
|
||||||
|
//
|
||||||
createPrivileges();
|
// createPrivileges();
|
||||||
|
//
|
||||||
s_log.debug("Done creating the CMS package type.");
|
// s_log.debug("Done creating the CMS package type.");
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -296,29 +301,42 @@ public class Loader extends PackageLoader {
|
||||||
private void loadWorkspacePackage() {
|
private void loadWorkspacePackage() {
|
||||||
s_log.debug("Creating CMS Workspace...");
|
s_log.debug("Creating CMS Workspace...");
|
||||||
|
|
||||||
WorkspaceInstaller workspaceInstaller = new WorkspaceInstaller();
|
// from WorkspaceInstaller workspaceInstaller = new WorkspaceInstaller();
|
||||||
try {
|
try {
|
||||||
workspaceInstaller.createPackageType();
|
// workspaceInstaller.createPackageType();
|
||||||
// type.setDispatcherClass(WORKSPACE_DISPATCHER_CLASS);
|
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();
|
// Register a stylesheet to the Content Center package.
|
||||||
// Does the following:
|
Stylesheet ss =
|
||||||
// type = PackageType.findByKey(WORKSPACE_PACKAGE_KEY);
|
Stylesheet.createStylesheet(WORKSPACE_STYLESHEET);
|
||||||
// PackageInstance instance = type.createInstance(WORKSPACE_INSTANCE_NAME);
|
ss.save();
|
||||||
// instance.save();
|
type.addStylesheet(ss);
|
||||||
PackageInstance instance = workspaceInstaller.createPackageInstance();
|
|
||||||
|
|
||||||
// workspaceInstaller.mountPackageInstance(instance, m_workspaceURL);
|
type.save();
|
||||||
|
|
||||||
|
// from PackageInstance instance = workspaceInstaller.createPackageInstance();
|
||||||
// Does the following:
|
// Does the following:
|
||||||
// SiteNode node = SiteNode.createSiteNode(
|
type = PackageType.findByKey(CMS.WORKSPACE_PACKAGE_KEY);
|
||||||
// s_conf.getWorkspaceURL(),
|
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());
|
// SiteNode.getRootSiteNode());
|
||||||
// node.mountPackage(instance);
|
SiteNode node = SiteNode.createSiteNode(CMS.WORKSPACE_PACKAGE_KEY,
|
||||||
// node.save();
|
SiteNode.getRootSiteNode());
|
||||||
|
node.mountPackage(instance);
|
||||||
|
node.save();
|
||||||
|
|
||||||
// m_workspaceURL == WORKSPACE_PACKAGE_KEY
|
// m_workspaceURL == WORKSPACE_PACKAGE_KEY
|
||||||
// workspaceInstaller.mountPackageInstance(instance, m_workspaceURL);
|
// workspaceInstaller.mountPackageInstance(instance, m_workspaceURL);
|
||||||
workspaceInstaller.mountPackageInstance(instance, WORKSPACE_PACKAGE_KEY);
|
// workspaceInstaller.mountPackageInstance(instance, CMS.WORKSPACE_PACKAGE_KEY);
|
||||||
|
|
||||||
} catch (DataObjectNotFoundException e) {
|
} catch (DataObjectNotFoundException e) {
|
||||||
throw new ConfigError(
|
throw new ConfigError(
|
||||||
|
|
@ -387,7 +405,7 @@ public class Loader extends PackageLoader {
|
||||||
try {
|
try {
|
||||||
// from ServiceInstaller.createPackageType();
|
// from ServiceInstaller.createPackageType();
|
||||||
PackageType type = PackageType.create
|
PackageType type = PackageType.create
|
||||||
(SERVICE_PACKAGE_KEY,
|
(CMS.SERVICE_PACKAGE_KEY,
|
||||||
"Content Management System Services",
|
"Content Management System Services",
|
||||||
"Content Management System Services",
|
"Content Management System Services",
|
||||||
"http://cms-service.arsdigita.com/");
|
"http://cms-service.arsdigita.com/");
|
||||||
|
|
@ -396,8 +414,8 @@ public class Loader extends PackageLoader {
|
||||||
type.save();
|
type.save();
|
||||||
|
|
||||||
// from PackageInstance instance = ServiceInstaller.createPackageInstance();
|
// from PackageInstance instance = ServiceInstaller.createPackageInstance();
|
||||||
type = PackageType.findByKey(SERVICE_PACKAGE_KEY);
|
type = PackageType.findByKey(CMS.SERVICE_PACKAGE_KEY);
|
||||||
PackageInstance instance = type.createInstance(SERVICE_PACKAGE_KEY);
|
PackageInstance instance = type.createInstance(CMS.SERVICE_PACKAGE_KEY);
|
||||||
instance.save();
|
instance.save();
|
||||||
|
|
||||||
// from ServiceInstaller.mountPackageInstance(instance, url);
|
// from ServiceInstaller.mountPackageInstance(instance, url);
|
||||||
|
|
@ -472,48 +490,68 @@ public class Loader extends PackageLoader {
|
||||||
|
|
||||||
s_log.info("Creating content section on /" + name);
|
s_log.info("Creating content section on /" + name);
|
||||||
|
|
||||||
// Step 1: Creating content section application type first so that
|
// Step 1: Validate name for section
|
||||||
// concrete content-section instance can be created.
|
|
||||||
ContentSectionSetup.setupContentSectionAppType();
|
|
||||||
|
|
||||||
createPrivileges();
|
|
||||||
|
|
||||||
// Step 2: Validatge name for section
|
|
||||||
Util.validateURLParameter("name", name);
|
Util.validateURLParameter("name", name);
|
||||||
|
|
||||||
// Step 3: Create the installation default content section "name"
|
// Step 2: Creating content section application type first so that
|
||||||
ContentSection section = ContentSection.create(name);
|
// 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);
|
ContentSectionSetup setup = new ContentSectionSetup(section);
|
||||||
|
|
||||||
// ContentSection.create uses the following properties:
|
// ContentSection.create uses the following properties:
|
||||||
// Name, see above
|
// Name, see above
|
||||||
// Root & template folder, set autonomously by ContentSection.create()
|
// Root & template folder, set autonomously by ContentSection.create()
|
||||||
|
|
||||||
// Roles (staff group) used in content section. Register roles using
|
// Roles (staff group) used in content section. Register roles using
|
||||||
// a complete set of default roles defined in ContentSectionSetup
|
// a complete set of default roles defined in ContentSectionSetup
|
||||||
setup.registerRoles(s_conf.getStuffGroup());
|
setup.registerRoles(s_conf.getStuffGroup());
|
||||||
|
|
||||||
// ViewerGroup populated in ContentSection, public access is determined
|
// ViewerGroup populated in ContentSection, public access is determined
|
||||||
// by parameter (affecting characteristics of the viewer group)
|
// by parameter (affecting characteristics of the viewer group)
|
||||||
setup.registerViewers(s_conf.isPubliclyViewable());
|
setup.registerViewers(s_conf.isPubliclyViewable());
|
||||||
|
|
||||||
// Page resolver class, set autonomously by ContentSection.create()
|
// Page resolver class, set autonomously by ContentSection.create()
|
||||||
// Item resolver class, configurable, defaults in place.
|
// Item resolver class, configurable, defaults in place.
|
||||||
// Template resolver class, configurable, defaults in place.
|
// Template resolver class, configurable, defaults in place.
|
||||||
// We should not overwrite the default in the initial default configuration
|
// 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.
|
// register a predefined one-phase lifecycle for items.
|
||||||
setup.registerPublicationCycles();
|
setup.registerPublicationCycles();
|
||||||
// registers predefined "Authoring", "Approval", "Publishing' steps
|
// registers predefined "Authoring", "Approval", "Publishing' steps
|
||||||
setup.registerWorkflowTemplates();
|
setup.registerWorkflowTemplates();
|
||||||
setup.registerContentTypes(s_conf.getContentSectionsContentTypes());
|
|
||||||
|
|
||||||
setup.registerResolvers(s_conf.getItemResolverClass(),
|
setup.registerResolvers(s_conf.getItemResolverClass(),
|
||||||
s_conf.getTemplateResolverClass() );
|
s_conf.getTemplateResolverClass() );
|
||||||
// XML generator class, set autonomously by ContentSection.create()
|
// 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!
|
// During initial load at install time nor used at all!
|
||||||
// default value is false so no categories get loaded.
|
// default value is false so no categories get loaded.
|
||||||
if (s_conf.getUseSectionCategories()) {
|
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)
|
section.save(); //persists any changes in the database (DomainObject)
|
||||||
//i.e. creates an object (instance)
|
//i.e. creates an object (instance)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
package com.arsdigita.cms;
|
||||||
|
|
||||||
//import com.arsdigita.kernel.permissions.PrivilegeDescriptor;
|
//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);
|
private static final Logger s_log = Logger.getLogger(LoaderConfig.class);
|
||||||
|
|
||||||
// ////////////////////////////////////////////////
|
// /**
|
||||||
// The following two (three) parameters are used by
|
// * The name of the workspace package instance, i.e. URL of the workspace,
|
||||||
// com.arsdigita.cms.installer.Initializer
|
// * 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,
|
// * XML Mapping of the content center tabs to URLs, see
|
||||||
* where authors, editors and publishers are working and from which they
|
// * {@link ContentCenterDispatcher}
|
||||||
* can select a content-section to create and edit documents.
|
// * NOTE Version 6.6.1 /2010-10-27)
|
||||||
* Usually you won't modify it!
|
// * Currently not used in Loader because it will not be persisted. Retained
|
||||||
*/
|
// * here for reference in case we will add persisting while migrating to
|
||||||
private StringParameter
|
// * new style application.
|
||||||
m_workspaceURL = new StringParameter(
|
// */
|
||||||
"com.arsdigita.cms.loader.workspace_url",
|
// private final StringParameter
|
||||||
Parameter.REQUIRED,
|
// m_contentCenterMap = new StringParameter(
|
||||||
"content-center");
|
// "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}
|
|
||||||
*/
|
|
||||||
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
|
// Update master object if upgrading from old versioning
|
||||||
// XXX: shouldn't we just gut this section (and
|
// XXX: shouldn't we just gut this section (and
|
||||||
|
|
@ -127,7 +119,7 @@ public final class LoaderConfig extends AbstractConfig {
|
||||||
m_ctDefFiles = new StringArrayParameter(
|
m_ctDefFiles = new StringArrayParameter(
|
||||||
"com.arsdigita.cms.loader.contenttype_definition_files",
|
"com.arsdigita.cms.loader.contenttype_definition_files",
|
||||||
Parameter.REQUIRED,
|
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 generic Basetypes in addition to article
|
||||||
new String[] {"/WEB-INF/content-types/GenericAddress.xml",
|
new String[] {"/WEB-INF/content-types/GenericAddress.xml",
|
||||||
"/WEB-INF/content-types/GenericArticle.xml",
|
"/WEB-INF/content-types/GenericArticle.xml",
|
||||||
|
|
@ -153,7 +145,7 @@ public final class LoaderConfig extends AbstractConfig {
|
||||||
*/
|
*/
|
||||||
private final Parameter
|
private final Parameter
|
||||||
m_contentSectionName = new StringParameter(
|
m_contentSectionName = new StringParameter(
|
||||||
"com.arsdigita.cms.loader.content_section_name",
|
"com.arsdigita.cms.loader.section_name",
|
||||||
Parameter.REQUIRED,
|
Parameter.REQUIRED,
|
||||||
"content");
|
"content");
|
||||||
//"public");
|
//"public");
|
||||||
|
|
@ -172,7 +164,7 @@ public final class LoaderConfig extends AbstractConfig {
|
||||||
* Not implemented yet! We need a new parameter type "list" which must have
|
* Not implemented yet! We need a new parameter type "list" which must have
|
||||||
* multidimensional capabilities.
|
* multidimensional capabilities.
|
||||||
*/
|
*/
|
||||||
// private final StringParameter
|
// private final Parameter
|
||||||
// m_staffGroup = new StringParameter(
|
// m_staffGroup = new StringParameter(
|
||||||
// "com.arsdigita.cms.loader.section_staff_group",
|
// "com.arsdigita.cms.loader.section_staff_group",
|
||||||
// Parameter.REQUIRED,
|
// Parameter.REQUIRED,
|
||||||
|
|
@ -212,7 +204,7 @@ public final class LoaderConfig extends AbstractConfig {
|
||||||
*/
|
*/
|
||||||
private final Parameter
|
private final Parameter
|
||||||
m_contentTypeList = new StringArrayParameter(
|
m_contentTypeList = new StringArrayParameter(
|
||||||
"com.arsdigita.cms.loader.ctypes_include_list",
|
"com.arsdigita.cms.loader.section_ctypes_list",
|
||||||
Parameter.REQUIRED,
|
Parameter.REQUIRED,
|
||||||
new String[] {} );
|
new String[] {} );
|
||||||
|
|
||||||
|
|
@ -287,13 +279,24 @@ public final class LoaderConfig extends AbstractConfig {
|
||||||
Parameter.REQUIRED,
|
Parameter.REQUIRED,
|
||||||
new String[] {"/WEB-INF/resources/article-categories.xml",
|
new String[] {"/WEB-INF/resources/article-categories.xml",
|
||||||
"/WEB-INF/resources/navigation-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" };
|
// Currently not a Loader task. There is no way to persist tasks preferences
|
||||||
// m_conf.initParameter(CATEGORIES,
|
// on a per section base.
|
||||||
// "XML file containing the category tree",
|
// /**
|
||||||
// List.class,
|
// * When to generate email alerts: by default, generate email alerts
|
||||||
// Collections.EMPTY_LIST);
|
// * 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() {
|
public LoaderConfig() {
|
||||||
|
|
||||||
register(m_workspaceURL);
|
// register(m_workspaceURL);
|
||||||
register(m_contentCenterMap);
|
// register(m_contentCenterMap);
|
||||||
register(m_ctDefFiles);
|
register(m_ctDefFiles);
|
||||||
|
|
||||||
// Parameters for creating a content section
|
// Parameters for creating a content section
|
||||||
|
|
@ -365,9 +368,10 @@ public final class LoaderConfig extends AbstractConfig {
|
||||||
register(m_useSectionCategories);
|
register(m_useSectionCategories);
|
||||||
register(m_categoryFileList);
|
register(m_categoryFileList);
|
||||||
|
|
||||||
|
// (Currently not a loader task)
|
||||||
|
// register(m_taskAlerts);
|
||||||
// Parameters controlling Overdue Task alerts:
|
// Parameters controlling Overdue Task alerts:
|
||||||
// (Currently not a loader task)
|
// (Currently not a loader task)
|
||||||
// register(m_taskAlerts); no Loader task, moved to contentsection/Initializer
|
|
||||||
// register(m_sendOverdueAlerts);
|
// register(m_sendOverdueAlerts);
|
||||||
// register(m_taskDuration);
|
// register(m_taskDuration);
|
||||||
// register(m_overdueAlertInterval);
|
// register(m_overdueAlertInterval);
|
||||||
|
|
@ -386,22 +390,24 @@ public final class LoaderConfig extends AbstractConfig {
|
||||||
//
|
//
|
||||||
// //////////////////////////
|
// //////////////////////////
|
||||||
|
|
||||||
/**
|
// 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
|
// * 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);
|
// public String getWorkspaceURL() {
|
||||||
}
|
// return (String) get(m_workspaceURL);
|
||||||
|
// }
|
||||||
|
|
||||||
/**
|
// 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
|
// * Fetch the file name contaning XML Mapping of the content center tabs
|
||||||
* @return String containig file name including path component.
|
// * to URLs
|
||||||
*/
|
// * @return String containig file name including path component.
|
||||||
public String getContentCenterMap() {
|
// */
|
||||||
return (String) get(m_contentCenterMap);
|
// public String getContentCenterMap() {
|
||||||
}
|
// return (String) get(m_contentCenterMap);
|
||||||
|
// }
|
||||||
|
|
||||||
public List getCTDefFiles() {
|
public List getCTDefFiles() {
|
||||||
String[] ctDefFiles = (String[]) get(m_ctDefFiles);
|
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,
|
* In loading step a complete default configuration is persisted in database,
|
||||||
* immutable at this point.
|
* immutable at this point.
|
||||||
* See contentsection.ContentSectio
|
* See contentsection.ContentSectionSetup.registerRoles()
|
||||||
nSetup.registerRoles()
|
|
||||||
* In enterprise.init: name roles, List of roles to create.
|
* 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,
|
* 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:
|
// Parameters controlling Overdue Task alerts:
|
||||||
// Currently not a loader task, see above
|
// Currently not a loader task, see above
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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.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.example=600
|
||||||
com.arsdigita.cms.loader.content_center_map.format=[integer]
|
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]
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -35,7 +35,7 @@ import com.arsdigita.util.parameter.StringParameter;
|
||||||
// import java.io.InputStream;
|
// import java.io.InputStream;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
//import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
|
@ -52,8 +52,37 @@ public final class ContentSectionConfig extends AbstractConfig {
|
||||||
private static final Logger s_log =
|
private static final Logger s_log =
|
||||||
Logger.getLogger(ContentSectionConfig.class);
|
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
|
* A list of workflow tasks, and the associated events for which alerts
|
||||||
|
|
@ -80,17 +109,23 @@ public final class ContentSectionConfig extends AbstractConfig {
|
||||||
* };
|
* };
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Default value (site-wide) is handled via the parameter
|
* In the new Initializer system we use a specifically formatted String Array
|
||||||
* <pre>com.arsdigita.cms.default_task_alerts</pre>.
|
* because we have no List parameter. Format:
|
||||||
* Section-specific override can be added here. Only do so if you are
|
* - A string for each task to handle, possible values: Authoring, Approval,
|
||||||
* changing for a good reason from the default for a specific content section.
|
* 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
|
private final Parameter
|
||||||
m_taskAlerts = new StringArrayParameter(
|
m_taskAlerts = new StringArrayParameter(
|
||||||
"com.arsdigita.cms.loader.section_task_alerts",
|
"com.arsdigita.cms.section.task_alerts",
|
||||||
Parameter.REQUIRED,
|
Parameter.REQUIRED, new String[] {
|
||||||
null );
|
"Authoring:enable:finish:rollback",
|
||||||
// new String[] {} );
|
"Approval:enable:finish:rollback",
|
||||||
|
"Deploy:enable:finish:rollback" }
|
||||||
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Should we send alerts about overdue tasks at all?
|
* Should we send alerts about overdue tasks at all?
|
||||||
|
|
@ -100,7 +135,7 @@ public final class ContentSectionConfig extends AbstractConfig {
|
||||||
*/
|
*/
|
||||||
private final Parameter
|
private final Parameter
|
||||||
m_sendOverdueAlerts = new BooleanParameter(
|
m_sendOverdueAlerts = new BooleanParameter(
|
||||||
"com.arsdigita.cms.contentsection.send_overdue_alerts",
|
"com.arsdigita.cms.section.send_overdue_alerts",
|
||||||
Parameter.REQUIRED,
|
Parameter.REQUIRED,
|
||||||
false );
|
false );
|
||||||
|
|
||||||
|
|
@ -117,7 +152,7 @@ public final class ContentSectionConfig extends AbstractConfig {
|
||||||
// considered overdue (in hours)
|
// considered overdue (in hours)
|
||||||
private final Parameter
|
private final Parameter
|
||||||
m_taskDuration = new IntegerParameter(
|
m_taskDuration = new IntegerParameter(
|
||||||
"com.arsdigita.cms.contentsection.task_duration",
|
"com.arsdigita.cms.section.task_duration",
|
||||||
Parameter.REQUIRED,
|
Parameter.REQUIRED,
|
||||||
new Integer(96) );
|
new Integer(96) );
|
||||||
|
|
||||||
|
|
@ -131,7 +166,7 @@ public final class ContentSectionConfig extends AbstractConfig {
|
||||||
*/
|
*/
|
||||||
private final Parameter
|
private final Parameter
|
||||||
m_alertInterval = new IntegerParameter(
|
m_alertInterval = new IntegerParameter(
|
||||||
"com.arsdigita.cms.contentsection.alert_interval",
|
"com.arsdigita.cms.section.alert_interval",
|
||||||
Parameter.REQUIRED,
|
Parameter.REQUIRED,
|
||||||
new Integer(24) );
|
new Integer(24) );
|
||||||
|
|
||||||
|
|
@ -144,7 +179,7 @@ public final class ContentSectionConfig extends AbstractConfig {
|
||||||
*/
|
*/
|
||||||
private final Parameter
|
private final Parameter
|
||||||
m_maxAlerts = new IntegerParameter(
|
m_maxAlerts = new IntegerParameter(
|
||||||
"com.arsdigita.cms.contentsection.max_alerts",
|
"com.arsdigita.cms.section.max_alerts",
|
||||||
Parameter.REQUIRED,
|
Parameter.REQUIRED,
|
||||||
new Integer(5) );
|
new Integer(5) );
|
||||||
|
|
||||||
|
|
@ -168,9 +203,141 @@ public final class ContentSectionConfig extends AbstractConfig {
|
||||||
*/
|
*/
|
||||||
private final Parameter
|
private final Parameter
|
||||||
m_newContentSectionName = new StringParameter(
|
m_newContentSectionName = new StringParameter(
|
||||||
"com.arsdigita.cms.contentsection.new_section_name",
|
"com.arsdigita.cms.section.new_section_name",
|
||||||
Parameter.REQUIRED,
|
Parameter.OPTIONAL,
|
||||||
null);
|
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
|
// parameters for creation of a new (additional) content section
|
||||||
register(m_newContentSectionName);
|
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
|
* Retrieve the list of workflow tasks and events for each tasks which
|
||||||
* should receive overdue notification alerts
|
* 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() {
|
public final String[] getTaskAlerts() {
|
||||||
// String[] m_taskAlerts = (String[]) get(m_contentTypeList);
|
return (String[]) get(m_taskAlerts);
|
||||||
return Arrays.asList(m_taskAlerts);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -264,4 +434,144 @@ public final class ContentSectionConfig extends AbstractConfig {
|
||||||
return (String) get(m_newContentSectionName);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -21,53 +21,50 @@
|
||||||
package com.arsdigita.cms.contentsection;
|
package com.arsdigita.cms.contentsection;
|
||||||
|
|
||||||
import com.arsdigita.cms.ContentSection;
|
import com.arsdigita.cms.ContentSection;
|
||||||
import com.arsdigita.cms.LoaderConfig;
|
import com.arsdigita.cms.ContentSectionCollection;
|
||||||
import com.arsdigita.cms.installer.ContentSectionSetup;
|
// import com.arsdigita.cms.LoaderConfig;
|
||||||
import com.arsdigita.cms.installer.Util;
|
//import com.arsdigita.cms.installer.Util;
|
||||||
import com.arsdigita.cms.util.GlobalizationUtil;
|
// import com.arsdigita.cms.util.GlobalizationUtil;
|
||||||
import com.arsdigita.cms.workflow.UnfinishedTaskNotifier;
|
import com.arsdigita.cms.workflow.UnfinishedTaskNotifier;
|
||||||
import com.arsdigita.domain.DataObjectNotFoundException;
|
// import com.arsdigita.domain.DataObjectNotFoundException;
|
||||||
import com.arsdigita.persistence.SessionManager;
|
// import com.arsdigita.persistence.SessionManager;
|
||||||
import com.arsdigita.persistence.TransactionContext;
|
// import com.arsdigita.persistence.TransactionContext;
|
||||||
import com.arsdigita.runtime.CompoundInitializer;
|
import com.arsdigita.runtime.CompoundInitializer;
|
||||||
import com.arsdigita.runtime.ConfigError;
|
// import com.arsdigita.runtime.ConfigError;
|
||||||
// import com.arsdigita.runtime.DataInitEvent;
|
// import com.arsdigita.runtime.DataInitEvent;
|
||||||
import com.arsdigita.runtime.ContextInitEvent;
|
import com.arsdigita.runtime.ContextInitEvent;
|
||||||
import com.arsdigita.runtime.ContextCloseEvent;
|
import com.arsdigita.runtime.ContextCloseEvent;
|
||||||
import com.arsdigita.runtime.DomainInitEvent;
|
// import com.arsdigita.runtime.DomainInitEvent;
|
||||||
import com.arsdigita.util.Assert;
|
// import com.arsdigita.util.Assert;
|
||||||
import com.arsdigita.web.Application;
|
// import com.arsdigita.web.Application;
|
||||||
|
import com.arsdigita.cms.workflow.CMSTask;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
// import java.math.BigDecimal;
|
||||||
import java.util.Iterator;
|
import java.util.Enumeration;
|
||||||
|
import java.util.NoSuchElementException;
|
||||||
|
import java.util.StringTokenizer;
|
||||||
import java.util.Timer;
|
import java.util.Timer;
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
import org.apache.log4j.Logger;
|
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!
|
* Initializes the content section sub-package of the CMS package (module).
|
||||||
* <p>Initializes a content section, registering a default workflow, lifecycle &
|
*
|
||||||
* roles and adding the content types.
|
* 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 Daniel Berrange (berrange@redhat.com)
|
||||||
* @author Michael Pih
|
* @author Michael Pih
|
||||||
* @author pb
|
* @author pboy (pb@zes.uni-bremen.de)
|
||||||
* @version $Id: $
|
* @version $Id: $
|
||||||
*/
|
*/
|
||||||
public class Initializer extends CompoundInitializer {
|
public class Initializer extends CompoundInitializer {
|
||||||
|
|
@ -78,11 +75,10 @@ public class Initializer extends CompoundInitializer {
|
||||||
|
|
||||||
/** Local configuration object ContentSectionConfig containing parameters
|
/** Local configuration object ContentSectionConfig containing parameters
|
||||||
which may be changed each system startup. */
|
which may be changed each system startup. */
|
||||||
// private static final LoaderConfig s_conf = LoaderConfig.getConfig();
|
private static final ContentSectionConfig s_conf = ContentSectionConfig.getInstance();
|
||||||
private static final LoaderConfig s_conf = new LoaderConfig();
|
|
||||||
|
|
||||||
/** The Timer used to send Unfinished notifications */
|
/** The Timer used to send Unfinished notifications */
|
||||||
private static Timer s_unfinishedTimer;
|
private static Vector s_unfinishedTimers = new Vector();
|
||||||
|
|
||||||
|
|
||||||
public Initializer() {
|
public Initializer() {
|
||||||
|
|
@ -90,6 +86,7 @@ public class Initializer extends CompoundInitializer {
|
||||||
//final int database = DbHelper.getDatabaseFromURL(url);
|
//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)}.
|
// * An empty implementation of {@link Initializer#init(DataInitEvent)}.
|
||||||
// *
|
// *
|
||||||
|
|
@ -98,42 +95,35 @@ public class Initializer extends CompoundInitializer {
|
||||||
// public void init(DataInitEvent evt) {
|
// public void init(DataInitEvent evt) {
|
||||||
// }
|
// }
|
||||||
|
|
||||||
/**
|
// 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.
|
// * 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");
|
// 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:
|
// // Recursive invokation of init, is it really necessary??
|
||||||
// An empty implementations prevents this initializer from being executed.
|
// // On the other hand:
|
||||||
// A missing implementations causes the super class method to be executed,
|
// // An empty implementations prevents this initializer from being executed.
|
||||||
// which invokes the above added LegacyInitializer.
|
// // A missing implementations causes the super class method to be executed,
|
||||||
// If super is not invoked, various other cms sub-initializer may not run.
|
// // which invokes the above added LegacyInitializer.
|
||||||
super.init(evt);
|
// // 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
|
// s_log.debug("CMS.installer.Initializer.init(DomainInitEvent) completed");
|
||||||
* 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");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of the {@link Initializer#init(ContextInitEvent)}
|
* Implementation of the {@link Initializer#init(ContextInitEvent)}
|
||||||
* method.
|
* method.
|
||||||
*
|
*
|
||||||
* Initializes the scheduler thread to fire all the events for the
|
* Steps through all installed content sections and for each section
|
||||||
* ...... that have just began or ended.
|
* - initializes the allert preferences
|
||||||
|
* - initializes the scheduler background thread to fire all all alert events.
|
||||||
*
|
*
|
||||||
* A delay value of 0 inhibits start of processing.
|
* A delay value of 0 inhibits start of processing.
|
||||||
* @param evt The context init event.
|
* @param evt The context init event.
|
||||||
|
|
@ -141,16 +131,33 @@ public class Initializer extends CompoundInitializer {
|
||||||
public void init(ContextInitEvent evt) {
|
public void init(ContextInitEvent evt) {
|
||||||
s_log.debug("content section ContextInitEvent started");
|
s_log.debug("content section ContextInitEvent started");
|
||||||
|
|
||||||
// XXX to be done yet!
|
super.init(evt);
|
||||||
// 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());
|
|
||||||
|
|
||||||
|
// 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");
|
s_log.debug("content section ContextInitEvent completed");
|
||||||
}
|
}
|
||||||
|
|
@ -160,16 +167,56 @@ public class Initializer extends CompoundInitializer {
|
||||||
* method.
|
* method.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void close(ContextCloseEvent evt) {
|
public void close(ContextCloseEvent evt) {
|
||||||
s_log.debug("content section ContextCloseEvent started");
|
s_log.debug("content section ContextCloseEvent started");
|
||||||
if (s_unfinishedTimer != null) {
|
|
||||||
s_unfinishedTimer.cancel();
|
Timer unfinishedTimer = null;
|
||||||
s_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");
|
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 section content section for which notifier should be started
|
||||||
* @param sendOverdue
|
* @param sendOverdue
|
||||||
|
|
@ -178,10 +225,12 @@ public class Initializer extends CompoundInitializer {
|
||||||
* @param max
|
* @param max
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private final Timer startNotifierTask(
|
private final Timer startNotifierTask( ContentSection section,
|
||||||
ContentSection section,
|
Boolean sendOverdue,
|
||||||
Boolean sendOverdue, Integer duration,
|
Integer duration,
|
||||||
Integer alertInterval, Integer max) {
|
Integer alertInterval,
|
||||||
|
Integer max
|
||||||
|
) {
|
||||||
Timer unfinished = null;
|
Timer unfinished = null;
|
||||||
if (sendOverdue.booleanValue()) {
|
if (sendOverdue.booleanValue()) {
|
||||||
if (duration == null || alertInterval == null || max == null) {
|
if (duration == null || alertInterval == null || max == null) {
|
||||||
|
|
@ -191,8 +240,9 @@ public class Initializer extends CompoundInitializer {
|
||||||
}
|
}
|
||||||
// start the Timer as a daemon, so it doesn't keep the JVM from exiting
|
// start the Timer as a daemon, so it doesn't keep the JVM from exiting
|
||||||
unfinished = new Timer(true);
|
unfinished = new Timer(true);
|
||||||
UnfinishedTaskNotifier notifier =
|
UnfinishedTaskNotifier notifier = new UnfinishedTaskNotifier(
|
||||||
new UnfinishedTaskNotifier( section, duration.intValue(),
|
section,
|
||||||
|
duration.intValue(),
|
||||||
alertInterval.intValue(),
|
alertInterval.intValue(),
|
||||||
max.intValue() );
|
max.intValue() );
|
||||||
// schedule the Task to start in 5 minutes, at 1 hour intervals
|
// schedule the Task to start in 5 minutes, at 1 hour intervals
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,8 @@
|
||||||
*/
|
*/
|
||||||
package com.arsdigita.cms.dispatcher;
|
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.developersupport.DeveloperSupport;
|
||||||
import com.arsdigita.dispatcher.Dispatcher;
|
import com.arsdigita.dispatcher.Dispatcher;
|
||||||
import com.arsdigita.dispatcher.DispatcherHelper;
|
import com.arsdigita.dispatcher.DispatcherHelper;
|
||||||
|
|
@ -74,7 +75,8 @@ public class ContentCenterDispatcher extends LockableImpl
|
||||||
/**
|
/**
|
||||||
* The path of the file that maps resources.
|
* 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.
|
* Error logging.
|
||||||
|
|
@ -83,11 +85,10 @@ public class ContentCenterDispatcher extends LockableImpl
|
||||||
Logger.getLogger(ContentCenterDispatcher.class.getName());
|
Logger.getLogger(ContentCenterDispatcher.class.getName());
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mapping between a relative URL and the class name of a
|
* Mapping between a relative URL and the class name of a ResourceHandler.
|
||||||
* ResourceHandler.
|
|
||||||
*/
|
*/
|
||||||
private static HashMap s_pageClasses = ContentCenterSetup.getURLToClassMap();
|
private static HashMap s_pageClasses = WorkspaceSetup.getURLToClassMap();
|
||||||
private static HashMap s_pageURLs = ContentCenterSetup.getClassToURLMap();
|
private static HashMap s_pageURLs = WorkspaceSetup.getClassToURLMap();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiated ResourceHandlers cache. This allows for lazy loading.
|
* Instantiated ResourceHandlers cache. This allows for lazy loading.
|
||||||
|
|
@ -101,6 +102,7 @@ public class ContentCenterDispatcher extends LockableImpl
|
||||||
* Constructor.
|
* Constructor.
|
||||||
*/
|
*/
|
||||||
public ContentCenterDispatcher() {
|
public ContentCenterDispatcher() {
|
||||||
|
|
||||||
super();
|
super();
|
||||||
|
|
||||||
m_trailingSlashList = new ArrayList();
|
m_trailingSlashList = new ArrayList();
|
||||||
|
|
@ -108,7 +110,6 @@ public class ContentCenterDispatcher extends LockableImpl
|
||||||
|
|
||||||
setNotFoundDispatcher(JSPApplicationDispatcher.getInstance());
|
setNotFoundDispatcher(JSPApplicationDispatcher.getInstance());
|
||||||
|
|
||||||
//readFromFile(new java.io.File(MAP_FILE));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -174,15 +175,17 @@ public class ContentCenterDispatcher extends LockableImpl
|
||||||
m_trailingSlashList.add(url);
|
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) {
|
public static String getURLStubForClass(String classname) {
|
||||||
s_log.debug("Getting URL Stub for : " + classname);
|
s_log.debug("Getting URL Stub for : " + classname);
|
||||||
Iterator itr = s_pageURLs.keySet().iterator();
|
Iterator itr = s_pageURLs.keySet().iterator();
|
||||||
while (itr.hasNext()) {
|
while (itr.hasNext()) {
|
||||||
String classname2 = (String)itr.next();
|
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);
|
String url = (String)s_pageURLs.get(classname);
|
||||||
return url;
|
return url;
|
||||||
|
|
|
||||||
|
|
@ -24,8 +24,8 @@ import com.arsdigita.cms.CMS;
|
||||||
import com.arsdigita.cms.ContentSection;
|
import com.arsdigita.cms.ContentSection;
|
||||||
import com.arsdigita.cms.ImageAsset;
|
import com.arsdigita.cms.ImageAsset;
|
||||||
import com.arsdigita.cms.SecurityManager;
|
import com.arsdigita.cms.SecurityManager;
|
||||||
import com.arsdigita.cms.installer.ServiceInstaller;
|
//import com.arsdigita.cms.installer.ServiceInstaller;
|
||||||
import com.arsdigita.cms.installer.WorkspaceInstaller;
|
// import com.arsdigita.cms.installer.WorkspaceInstaller;
|
||||||
import com.arsdigita.dispatcher.DispatcherHelper;
|
import com.arsdigita.dispatcher.DispatcherHelper;
|
||||||
import com.arsdigita.kernel.Kernel;
|
import com.arsdigita.kernel.Kernel;
|
||||||
import com.arsdigita.kernel.KernelContext;
|
import com.arsdigita.kernel.KernelContext;
|
||||||
|
|
@ -54,8 +54,8 @@ import java.util.Map;
|
||||||
*/
|
*/
|
||||||
public class Utilities {
|
public class Utilities {
|
||||||
|
|
||||||
public final static String CMS_WORKSPACE = WorkspaceInstaller.PACKAGE_KEY;
|
// public final static String CMS_WORKSPACE = WorkspaceInstaller.PACKAGE_KEY;
|
||||||
public final static String CMS_SERVICE = ServiceInstaller.PACKAGE_KEY;
|
// public final static String CMS_SERVICE = ServiceInstaller.PACKAGE_KEY;
|
||||||
|
|
||||||
// Used for caching util lookups
|
// Used for caching util lookups
|
||||||
private static HashMap m_cache = new HashMap();
|
private static HashMap m_cache = new HashMap();
|
||||||
|
|
@ -71,10 +71,10 @@ public class Utilities {
|
||||||
* @return The URL of the CMS Workspace package
|
* @return The URL of the CMS Workspace package
|
||||||
*/
|
*/
|
||||||
public static String getWorkspaceURL() {
|
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 ) {
|
if ( url == null ) {
|
||||||
url = getSingletonPackageURL(CMS_WORKSPACE);
|
url = getSingletonPackageURL(CMS.WORKSPACE_PACKAGE_KEY);
|
||||||
m_cache.put(CMS_WORKSPACE, url);
|
m_cache.put(CMS.WORKSPACE_PACKAGE_KEY, url);
|
||||||
}
|
}
|
||||||
return url;
|
return url;
|
||||||
}
|
}
|
||||||
|
|
@ -84,7 +84,7 @@ public class Utilities {
|
||||||
* @return The URL of the CMS Services package
|
* @return The URL of the CMS Services package
|
||||||
*/
|
*/
|
||||||
public static String getServiceURL() {
|
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 ) {
|
if ( url == null ) {
|
||||||
// chris.gilbert@westsussex.gov.uk
|
// chris.gilbert@westsussex.gov.uk
|
||||||
// We don't want application context in this url, especially when
|
// 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
|
// file that is maintained by a non cms application eg
|
||||||
// forum, then I can end up with a url that doesn't work
|
// forum, then I can end up with a url that doesn't work
|
||||||
// and so breaks file links everywhere
|
// and so breaks file links everywhere
|
||||||
url = getSingletonPackageURLSansContext(CMS_SERVICE);
|
url = getSingletonPackageURLSansContext(CMS.SERVICE_PACKAGE_KEY);
|
||||||
m_cache.put(CMS_SERVICE, url);
|
m_cache.put(CMS.SERVICE_PACKAGE_KEY, url);
|
||||||
}
|
}
|
||||||
|
|
||||||
return url;
|
return url;
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,12 @@ import org.xml.sax.InputSource;
|
||||||
import org.xml.sax.SAXException;
|
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.
|
* Sets up the CMS package.
|
||||||
*
|
*
|
||||||
|
|
@ -43,7 +43,7 @@ import com.arsdigita.kernel.Role;
|
||||||
import com.arsdigita.kernel.permissions.PermissionService;
|
import com.arsdigita.kernel.permissions.PermissionService;
|
||||||
import com.arsdigita.kernel.permissions.PrivilegeDescriptor;
|
import com.arsdigita.kernel.permissions.PrivilegeDescriptor;
|
||||||
import com.arsdigita.persistence.DataObject;
|
import com.arsdigita.persistence.DataObject;
|
||||||
import com.arsdigita.runtime.AbstractConfig;
|
// import com.arsdigita.runtime.AbstractConfig;
|
||||||
import com.arsdigita.cms.LoaderConfig;
|
import com.arsdigita.cms.LoaderConfig;
|
||||||
import com.arsdigita.util.Assert;
|
import com.arsdigita.util.Assert;
|
||||||
import com.arsdigita.util.UncheckedWrapperException;
|
import com.arsdigita.util.UncheckedWrapperException;
|
||||||
|
|
@ -130,6 +130,7 @@ public final class ContentSectionSetup {
|
||||||
// contains the xsl to generate the page
|
// contains the xsl to generate the page
|
||||||
|
|
||||||
setup.setInstantiator(new ACSObjectInstantiator() {
|
setup.setInstantiator(new ACSObjectInstantiator() {
|
||||||
|
@Override
|
||||||
public DomainObject doNewInstance(DataObject dataObject) {
|
public DomainObject doNewInstance(DataObject dataObject) {
|
||||||
return new ContentSection(dataObject);
|
return new ContentSection(dataObject);
|
||||||
}
|
}
|
||||||
|
|
@ -542,6 +543,7 @@ public final class ContentSectionSetup {
|
||||||
m_section = section;
|
m_section = section;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void startElement ( String uri, String local,
|
public void startElement ( String uri, String local,
|
||||||
String qName, Attributes attrs ) {
|
String qName, Attributes attrs ) {
|
||||||
if ("categories".equals(qName)) {
|
if ("categories".equals(qName)) {
|
||||||
|
|
@ -597,6 +599,7 @@ public final class ContentSectionSetup {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void endElement ( String uri, String local, String qName ) {
|
public void endElement ( String uri, String local, String qName ) {
|
||||||
if ( "category".equals(qName) ) {
|
if ( "category".equals(qName) ) {
|
||||||
m_cats.pop();
|
m_cats.pop();
|
||||||
|
|
@ -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;
|
package com.arsdigita.cms.installer;
|
||||||
|
|
||||||
import com.arsdigita.cms.LoaderConfig;
|
import com.arsdigita.cms.LoaderConfig;
|
||||||
|
|
@ -106,6 +115,8 @@ public class Initializer extends CompoundInitializer {
|
||||||
* <li>create Workspace package type and instance</li>
|
* <li>create Workspace package type and instance</li>
|
||||||
* <li>create CMS Service package type and instance</li>
|
* <li>create CMS Service package type and instance</li>
|
||||||
* </ol>
|
* </ol>
|
||||||
|
*
|
||||||
|
* All these tasks are migrated to Loader (2010-10-15).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -16,6 +16,16 @@
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* 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;
|
package com.arsdigita.cms.installer;
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -16,6 +16,17 @@
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* 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;
|
package com.arsdigita.cms.installer;
|
||||||
|
|
||||||
import com.arsdigita.domain.DataObjectNotFoundException;
|
import com.arsdigita.domain.DataObjectNotFoundException;
|
||||||
|
|
@ -16,6 +16,17 @@
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* 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;
|
package com.arsdigita.cms.installer;
|
||||||
|
|
||||||
import com.arsdigita.domain.DataObjectNotFoundException;
|
import com.arsdigita.domain.DataObjectNotFoundException;
|
||||||
|
|
@ -98,6 +98,7 @@ public class LifecycleDefinition extends ACSObject {
|
||||||
* @return the base PDL object type for this definition. Child classes should
|
* @return the base PDL object type for this definition. Child classes should
|
||||||
* override this method to return the correct value
|
* override this method to return the correct value
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public String getBaseDataObjectType() {
|
public String getBaseDataObjectType() {
|
||||||
return BASE_DATA_OBJECT_TYPE;
|
return BASE_DATA_OBJECT_TYPE;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,11 @@ import com.arsdigita.cms.CMS;
|
||||||
import com.arsdigita.cms.ContentItem;
|
import com.arsdigita.cms.ContentItem;
|
||||||
import com.arsdigita.kernel.ACSObject;
|
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 {
|
public class ItemCategoryForm extends ACSObjectCategoryForm {
|
||||||
|
|
||||||
private static Logger s_log = Logger.getLogger(ItemCategoryForm.class);
|
private static Logger s_log = Logger.getLogger(ItemCategoryForm.class);
|
||||||
|
|
|
||||||
|
|
@ -33,13 +33,17 @@ import com.arsdigita.web.RedirectSignal;
|
||||||
import com.arsdigita.cms.CMS;
|
import com.arsdigita.cms.CMS;
|
||||||
import com.arsdigita.cms.ContentSection;
|
import com.arsdigita.cms.ContentSection;
|
||||||
import com.arsdigita.cms.ItemSelectionModel;
|
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.Assert;
|
||||||
import com.arsdigita.util.Classes;
|
import com.arsdigita.util.Classes;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
public class ItemCategoryStep extends SimpleContainer
|
public class ItemCategoryStep extends SimpleContainer
|
||||||
implements Resettable{
|
implements Resettable{
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* 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;
|
import org.xml.sax.helpers.DefaultHandler;
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* 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 com.arsdigita.initializer.InitializationException;
|
||||||
import org.apache.oro.text.perl.Perl5Util;
|
import org.apache.oro.text.perl.Perl5Util;
|
||||||
|
|
@ -20,7 +20,7 @@ package com.arsdigita.cms.workflow;
|
||||||
|
|
||||||
import com.arsdigita.cms.ContentItem;
|
import com.arsdigita.cms.ContentItem;
|
||||||
import com.arsdigita.cms.ContentSection;
|
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.ui.ContentItemPage;
|
||||||
import com.arsdigita.cms.util.GlobalizationUtil;
|
import com.arsdigita.cms.util.GlobalizationUtil;
|
||||||
import com.arsdigita.domain.DataObjectNotFoundException;
|
import com.arsdigita.domain.DataObjectNotFoundException;
|
||||||
|
|
@ -43,7 +43,6 @@ import com.arsdigita.persistence.Session;
|
||||||
import com.arsdigita.persistence.SessionManager;
|
import com.arsdigita.persistence.SessionManager;
|
||||||
import com.arsdigita.persistence.metadata.ObjectType;
|
import com.arsdigita.persistence.metadata.ObjectType;
|
||||||
import com.arsdigita.util.Assert;
|
import com.arsdigita.util.Assert;
|
||||||
import com.arsdigita.util.StringUtils;
|
|
||||||
import com.arsdigita.versioning.TagCollection;
|
import com.arsdigita.versioning.TagCollection;
|
||||||
import com.arsdigita.versioning.Transaction;
|
import com.arsdigita.versioning.Transaction;
|
||||||
import com.arsdigita.versioning.TransactionCollection;
|
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.
|
* Creates a deep copy of this task and stores a persistent copy.
|
||||||
* TODO: refactor this method in this class, and its parents
|
* TODO: refactor this method in this class, and its parents
|
||||||
* */
|
* */
|
||||||
|
@Override
|
||||||
public Object clone() {
|
public Object clone() {
|
||||||
CMSTask taskClone = new CMSTask();
|
CMSTask taskClone = new CMSTask();
|
||||||
copyAttributes(taskClone);
|
copyAttributes(taskClone);
|
||||||
|
|
@ -444,6 +444,7 @@ public class CMSTask extends UserTask {
|
||||||
return send;
|
return send;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
protected boolean sendAlerts(String operation) {
|
protected boolean sendAlerts(String operation) {
|
||||||
ContentSection section = getContentSection();
|
ContentSection section = getContentSection();
|
||||||
String label = getLabel();
|
String label = getLabel();
|
||||||
|
|
@ -466,6 +467,7 @@ public class CMSTask extends UserTask {
|
||||||
* @see com.arsdigita.messaging.Message
|
* @see com.arsdigita.messaging.Message
|
||||||
* @see #filterUsersAndSendMessage
|
* @see #filterUsersAndSendMessage
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
protected void sendMessageToAssignees(Message msg) {
|
protected void sendMessageToAssignees(Message msg) {
|
||||||
if (m_authorOnly) {
|
if (m_authorOnly) {
|
||||||
ContentItem item = getItem();
|
ContentItem item = getItem();
|
||||||
|
|
@ -619,6 +621,7 @@ public class CMSTask extends UserTask {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void finish() throws TaskException {
|
public void finish() throws TaskException {
|
||||||
super.finish();
|
super.finish();
|
||||||
Integer type = getTaskType().getID();
|
Integer type = getTaskType().getID();
|
||||||
|
|
|
||||||
|
|
@ -83,6 +83,9 @@ public class UnfinishedTaskNotifier extends TimerTask {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The action to be performed by this timer Task.
|
||||||
|
*/
|
||||||
public void run() {
|
public void run() {
|
||||||
Thread.currentThread().setName("unfinished-notifier");
|
Thread.currentThread().setName("unfinished-notifier");
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue