You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 7 Next »

Magnolia stores data in a Java Content Repository. The repository is a hierarchical object database that is particularly well-suited for storing content. In a content management system you need to be able to store text, documents, images and other binary objects along with their metadata. The data is structured as a tree of nodes. Each node can have one or more types. The type defines what kind of properties the node has, the number and type of its child nodes, and its behavior. See Jackrabbit Node Types for more information and Node Type Visualization for a diagram of the node type hierarchy.

In Magnolia we define custom node types that define Magnolia's custom content model. The JCR in turn enforces the constraints of that model at the repository level. If you need to reference JCR node types in your code, Jackrabbit's JcrConstants is useful. We provide constants also for Magnolia's custom node types but also convenience methods. For example, to update the last modification date of a node, use the NodeTypes.LastModified.update(node) convenience method. Magnolia node types are registered by the 

$webResourceManager.requireResource("info.magnolia.sys.confluence.artifact-info-plugin:javadoc-resource-macro-resources") NodeTypes
 Java class.

Prefixes

Node type

Prefix

Notes

JCR primary node type

nt:


Mixin node type

mix:


Magnolia node type

mgnl:

The mgnl prefix does not tell you whether the node is a primary node or a mixin. To find out which type a mgnl node is, check the magnolia-types.xml file.

Node type hierarchy

In this simplified node type hierarchy diagram you can see what extends what. For example, mgnl:page extends mgnl:versionable. This means that page is an object you can version. In contrast, mgnl:area and mgnl:component are not versionable – they are subnodes that must be activated together with the parent page. However, all three node types (page, area, component) are renderable which means you can render a component on its own without its parent page. See the magnolia-types.xml  file for a full view of the Magnolia node type hierarchy.

Primary node types

Every node has a primary node type assigned to it upon creation. The primary node type defines node structure such as allowed and required child nodes and properties. Primary types reflect the business that is represented in the repository. Magnolia's primary node types define content management nodes such as pages, areas, components and resources.

JCR primary node types

Notation

Description

nt:base

The base type of all primary node types.

nt:unstructured

Unstructured node type that allows any properties and child nodes.

nt:hierarchyNode

Abstract base type for nodes in a structured node hierarchy.

nt:file

JCR representation of a file.

nt:frozenNode

This node type is used in the versioning system.

Magnolia primary node types

The primary Magnolia node types are defined in:

magnolia-nodetypes.xml
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>Log in - Magnolia Bitbucket</title><script>
window.WRM=window.WRM||{};window.WRM._unparsedData=window.WRM._unparsedData||{};window.WRM._unparsedErrors=window.WRM._unparsedErrors||{};
WRM._unparsedData["com.atlassian.bitbucket.server.bitbucket-webpack-INTERNAL:user-keyboard-shortcuts-enabled.data"]="true";
WRM._unparsedData["com.atlassian.analytics.analytics-client:programmatic-analytics-init.programmatic-analytics-data-provider"]="false";
WRM._unparsedData["com.atlassian.plugins.atlassian-plugins-webresource-plugin:context-path.context-path"]="\u0022\u0022";
WRM._unparsedData["com.atlassian.plugins.atlassian-clientside-extensions-runtime:runtime.atlassianDevMode"]="false";
WRM._unparsedData["com.atlassian.bitbucket.server.bitbucket-webpack-INTERNAL:date-format-preference.data"]="\u0022\u0022";
WRM._unparsedData["com.atlassian.bitbucket.server.feature-wrm-data:bitbucket.global.theme.data"]="false";
WRM._unparsedData["com.atlassian.analytics.analytics-client:policy-update-init.policy-update-data-provider"]="false";
WRM._unparsedData["com.atlassian.bitbucket.plugins.bitbucket-slack-server-integration-plugin:slack-link-error-resources.slack-link-error"]="{}";
WRM._unparsedData["com.atlassian.bitbucket.server.feature-wrm-data:user.time.zone.onboarding.data"]="true";
if(window.WRM._dataArrived)window.WRM._dataArrived();</script>
<link rel="stylesheet" href="/s/c2e7fb6cb0fa3d99cfd1ed5573a5b732-CDN/1015515914/fdb5904/1h5ouvp/a93e8b54a53a5453c42e8c7cfb35551a/_/download/contextbatch/css/_super/batch.css" data-wrm-key="_super" data-wrm-batch-type="context" media="all">
<link rel="stylesheet" href="/s/c3b4ddaba8d3dce9466950696444d252-CDN/1015515914/fdb5904/1h5ouvp/80af30e6da65e29f7038393c9f70794e/_/download/contextbatch/css/bitbucket.page.login,-_super/batch.css" data-wrm-key="bitbucket.page.login,-_super" data-wrm-batch-type="context" media="all">
<link rel="stylesheet" href="/s/a5886b3e3e45b4adb9b9991e2cf18803-CDN/1015515914/fdb5904/1h5ouvp/f4992ec124d5384cd0091fae42c3ca97/_/download/contextbatch/css/bitbucket.layout.focused,bitbucket.layout.base,atl.general,bitbucket.internal.feature.theme,-_super/batch.css?slack-enabled=true" data-wrm-key="bitbucket.layout.focused,bitbucket.layout.base,atl.general,bitbucket.internal.feature.theme,-_super" data-wrm-batch-type="context" media="all">
<script src="/s/2fb1765c7438a1e383facff8dd19270a-CDN/1015515914/fdb5904/1h5ouvp/a93e8b54a53a5453c42e8c7cfb35551a/_/download/contextbatch/js/_super/batch.js?locale=en-US" data-wrm-key="_super" data-wrm-batch-type="context" data-initially-rendered></script>
<script src="/s/8fd0897a356f9fee979922482537ec9e-CDN/1015515914/fdb5904/1h5ouvp/80af30e6da65e29f7038393c9f70794e/_/download/contextbatch/js/bitbucket.page.login,-_super/batch.js?locale=en-US" data-wrm-key="bitbucket.page.login,-_super" data-wrm-batch-type="context" data-initially-rendered></script>
<script src="/s/b26a251d5dcc697b8b37326544044035-CDN/1015515914/fdb5904/1h5ouvp/f4992ec124d5384cd0091fae42c3ca97/_/download/contextbatch/js/bitbucket.layout.focused,bitbucket.layout.base,atl.general,bitbucket.internal.feature.theme,-_super/batch.js?locale=en-US&amp;slack-enabled=true" data-wrm-key="bitbucket.layout.focused,bitbucket.layout.base,atl.general,bitbucket.internal.feature.theme,-_super" data-wrm-batch-type="context" data-initially-rendered></script>
<meta name="application-name" content="Bitbucket"><link rel="shortcut icon" type="image/x-icon" href="/s/1015515914/fdb5904/1h5ouvp/1.0/_/download/resources/com.atlassian.bitbucket.server.bitbucket-webpack-INTERNAL:favicon/favicon.ico" /><link rel="search" href="https://git.magnolia-cms.com/plugins/servlet/opensearch-descriptor" type="application/opensearchdescription+xml" title="Bitbucket code search"/></head><body class="aui-page-focused aui-page-focused-small aui-page-size-small bitbucket-theme user-login"><script type="text/javascript">require('@bitbucket/internal/feature/theme').init();</script><ul id="assistive-skip-links" class="assistive"><li><a href="#content">Skip to content</a></li></ul><div id="page"><!-- start #header --><header id="header" role="banner"><section class="notifications"></section><nav class="aui-header aui-dropdown2-trigger-group" aria-label="site"><div class="aui-header-inner"><div class="aui-header-before"><button class=" aui-dropdown2-trigger app-switcher-trigger aui-dropdown2-trigger-arrowless" aria-controls="app-switcher" aria-haspopup="true" role="button" data-aui-trigger href="#app-switcher"><span class="aui-icon aui-icon-small aui-iconfont-appswitcher">Linked Applications</span></button><div id="app-switcher" class="aui-dropdown2 aui-style-default" role="menu" hidden data-is-user-admin="false" data-is-switcher="true"><div class="app-switcher-loading">Loading&hellip;</div></div></div><div class="aui-header-primary"><span id="logo" class="aui-header-logo bitbucket-header-logo"><a href="https://git.magnolia-cms.com"><img src="/s/1015515914/fdb5904/1h5ouvp/1.0/_/download/resources/com.atlassian.bitbucket.server.bitbucket-webpack-INTERNAL:bitbucket-logo/images/logo/bitbucket.svg" alt="Bitbucket"/></a></span><ul class="aui-nav"></ul></div><div class="aui-header-secondary"><ul class="aui-nav"><li class=" help-link"title="Help"><a class=" aui-dropdown2-trigger aui-dropdown2-trigger-arrowless" aria-controls="com.atlassian.bitbucket.server.bitbucket-server-web-fragments-help-menu" aria-haspopup="true" role="button" tabindex="0" data-aui-trigger><span class="aui-icon aui-icon-small aui-icon-small aui-iconfont-question-filled">Help</span></a><div id="com.atlassian.bitbucket.server.bitbucket-server-web-fragments-help-menu" class="aui-dropdown2 aui-style-default" role="menu" hidden data-aui-dom-container="body"><div class="aui-dropdown2-section help-items-section"><ul class="aui-list-truncate" role="presentation"><li role="presentation"><a href="https://docs.atlassian.com/bitbucketserver/docs-0814/Bitbucket+Data+Center+and+Server+documentation?utm_campaign=in-app-help&amp;amp;utm_medium=in-app-help&amp;amp;utm_source=stash" title="Go to the online documentation for Bitbucket" data-web-item-key="com.atlassian.bitbucket.server.bitbucket-server-web-fragments:general-help">Online help</a></li><li role="presentation"><a href="https://www.atlassian.com/git?utm_campaign=learn-git&amp;utm_medium=in-app-help&amp;utm_source=stash" title="Learn about Git commands &amp; workflows" data-web-item-key="com.atlassian.bitbucket.server.bitbucket-server-web-fragments:learn-git">Learn Git</a></li><li role="presentation"><a href="/getting-started"class="getting-started-page-link" title="Overview of Bitbucket features" data-web-item-key="com.atlassian.bitbucket.server.bitbucket-server-web-fragments:getting-started-page-help-link">Welcome to Bitbucket</a></li><li role="presentation"><a href="/#"class="keyboard-shortcut-link" title="Discover keyboard shortcuts in Bitbucket" data-web-item-key="com.atlassian.bitbucket.server.bitbucket-server-web-fragments:keyboard-shortcuts-help-link">Keyboard shortcuts</a></li><li role="presentation"><a href="https://go.atlassian.com/bitbucket-server-whats-new?utm_campaign=in-app-help&amp;utm_medium=in-app-help&amp;utm_source=stash" title="Learn about what&#39;s new in Bitbucket" data-web-item-key="com.atlassian.bitbucket.server.bitbucket-server-web-fragments:whats-new-link">What&#39;s new</a></li><li role="presentation"><a href="https://go.atlassian.com/bitbucket-server-community?utm_campaign=in-app-help&amp;utm_medium=in-app-help&amp;utm_source=stash" title="Explore the Atlassian community" data-web-item-key="com.atlassian.bitbucket.server.bitbucket-server-web-fragments:community-link">Community</a></li><li role="presentation"><a href="/about" title="About Bitbucket" data-web-item-key="com.atlassian.bitbucket.server.bitbucket-server-web-fragments:about">About</a></li></ul></div></div></li><li class=" alerts-menu"title="View system alerts"><a href="#alerts" id="alerts-trigger"class="alerts-menu" title="View system alerts" data-web-item-key="com.atlassian.bitbucket.server.bitbucket-server-web-fragments:global-alerts-menu-item">Alerts</a></li></ul></div></div> <!-- End .aui-header-inner --></nav> <!-- End .aui-header --></header><!-- End #header --><!-- Start #content --><section id="content" role="main" tabindex="-1" data-timezone="-120" ><div class="aui-page-panel content-body" ><div class="aui-page-panel-inner"><main role="main" id="main" class="aui-page-panel-content" ><h2>Log in</h2><form class="aui top-label prevent-double-submit " action="/j_atl_security_check" method="post" accept-charset="UTF-8"><div class="field-group"><label for="j_username" >Username</label><input class="text long-field" type="text" id="j_username"  name="j_username"  autofocus accesskey="u"/></div><div class="field-group"><label for="j_password" >Password</label><input class="text long-field" type="password" id="j_password"  name="j_password"  accesskey="p"/></div><div class="aui-group"><fieldset class="group checkbox"><div class="checkbox"><input class="checkbox" type="checkbox" id="_atl_remember_me"  name="_atl_remember_me"  checked="checked"  accesskey="r"/><label for="_atl_remember_me" >Keep me logged in</label></div></fieldset></div><div class="aui-group"><input name="next" type="hidden" value="/projects/PLATFORM/repos/main.pub/browse/magnolia-core/src/main/resources/mgnl-nodetypes/magnolia-nodetypes.xml?at=master&amp;raw"/><input name="queryString" type="hidden" value="next=%2Fprojects%2FPLATFORM%2Frepos%2Fmain.pub%2Fbrowse%2Fmagnolia-core%2Fsrc%2Fmain%2Fresources%2Fmgnl-nodetypes%2Fmagnolia-nodetypes.xml%3Fat%3Dmaster%26raw"/><input class="aui-button aui-button-primary" type="submit" id="submit"  name="submit"  value="Log in" accesskey="s"/><a id="forgot" class="aui-button aui-button-link"  name="forgot" href="/passwordreset" autocomplete="off" tabindex="0">Unable to access your account?</a></div></form></main></div></div></section><!-- End #content --><!-- Start #footer --><footer id="footer" role="contentinfo"><section class="notifications"></section><section class="footer-body"><ul><li data-key="footer.license.free.eval">Git repository management powered by a free <a href="https://www.atlassian.com/software/bitbucket/">Atlassian Bitbucket</a> evaluation license</li></ul><ul><li>Atlassian Bitbucket <span title="fdb5904e84ca72e8d62953007cf5cf6cfcdfebd8" id="product-version" data-commitid="fdb5904e84ca72e8d62953007cf5cf6cfcdfebd8" data-system-build-number="fdb5904"> v8.14.0</span></li><li data-key="footer.links.documentation"><a href="https://docs.atlassian.com/bitbucketserver/docs-0814/Bitbucket+Data+Center+and+Server+documentation?utm_campaign=in-app-help&amp;utm_medium=in-app-help&amp;utm_source=stash" target="_blank">Documentation</a></li><li data-key="footer.links.jac"><a href="https://jira.atlassian.com/browse/BSERV?utm_campaign=in-app-help&amp;utm_medium=in-app-help&amp;utm_source=stash" target="_blank">Request a feature</a></li><li data-key="footer.links.about"><a href="/about">About</a></li><li data-key="footer.links.contact.atlassian"><a href="https://www.atlassian.com/company/contact?utm_campaign=in-app-help&amp;utm_medium=in-app-help&amp;utm_source=stash" target="_blank">Contact Atlassian</a></li></ul><div id="footer-logo"><a href="https://www.atlassian.com/" target="_blank">Atlassian</a></div></section></footer><!-- End #footer --></div><script>require('bitbucket/internal/layout/base/base').onReady(null, "Magnolia Bitbucket" ); require('bitbucket/internal/widget/keyboard-shortcuts/keyboard-shortcuts').onReady();</script><script type="text/javascript">require('bitbucket/internal/page/login/login').onReady();</script></body></html>
These types are required for the basic features of Magnolia to function: configuration, page-editing and rendering as well as activation from author to public (which relies on versioning).

Notation

Description

mgnl:area

Area

mgnl:component

Component

mgnl:content

Activatable and versionable content objects such as pages.

mgnl:contentNode

Activatable but not versionable content objects which can be rendered independently. For example, blocks or objects below page level such as such as area or component.

mgnl:folder

Folder

mgnl:group

Group

mgnl:metaData

Metadata

mgnl:nodeData

Property

mgnl:page

Page

mgnl:reserve

Reserved for system use.

mgnl:resource

Resource
mgnl:role Role

mgnl:user

User

Mixin node types

Mixin node types specify additional properties or characteristics to the node. A node can have a primary type and several mixin types at the same time. JCR mixins add repository-level functionality such as versioning and locking. Magnolia mixins add content management capabilities such as activating and rendering.

JCR mixin node types

Notation

Description

mix:referenceable Mixin type for referenceable nodes. Provides an auto-created jcr:uuid property that gives the node a unique, referenceable identifier.
mix:versionableMixin type for versionable nodes.
mix:lockableEnables locking capabilities for a node.

Magnolia mixin node types

Notation

Properties

Description

mgnl:deleted

mgnl:deleted (DATE)

mgnl:deletedBy (STRING)

Date the node was deleted, the user who deleted it and the deletion comment.

mgnl:lastModified

mgnl:lastModified (DATE)

mgnl:lastModifiedBy (STRING)

Date the node was last modified and the user who modified it.
mgnl:activatable

mgnl:lastActivated (DATE)

mgnl:lastActivatedBy (STRING)

mgnl:activationStatus (STRING)

mgnl:lastActivatedVersion (STRING)

Date the node was activated, the user who activated it, its current activation status and the version in which the node was activated.


Note that on the public instance, lastActionDate always contains the date of the previous activation, not the current one. This is because the lastActionDate is updated only after the content is sent to the public instance.

mgnl:created

mgnl:created (DATE)

mgnl:createdBy (STRING)

Date the node was created and the user who created it.
mgnl:renderablemgnl:template (STRING)Associates a template with the node for rendering.
mgnl:versionablemgnl:comment (STRING)Allows the user to leave a comment on the version.

Same name siblings are not allowed

The Magnolia node type definition magnolia-types.xml  does not allow same name siblings. This means that you cannot have two nodes at the same level in the node hierarchy with the same name. Typically same name siblings is not an issue because Magnolia enforces the constraint automatically during normal usage. However, if prior to Magnolia 5.2 you imported an XML file that was created outside of Magnolia or was edited by hand, it is possible that the XML import created a same name sibling.

Use the siblings.groovy script to find same name siblings in your repository. The example below searches for identically named areas (returnItemType is mgnl:area) in the website workspace under the /travel/about page. See Groovy module for instructions on how to execute Groovy scripts.

siblings.groovy
import info.magnolia.cms.util.QueryUtil;
import info.magnolia.cms.core.search.Query;
import info.magnolia.cms.core.Path;
import info.magnolia.jcr.util.NodeUtil;
import info.magnolia.context.MgnlContext;
import javax.jcr.Session;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import org.apache.commons.lang.StringUtils;
import java.util.LinkedList;
def siblings(workspace,path,returnItemType) {
    query = "/jcr:root" + path + "//* order by @name";  //i.e. path=/travel/about
    try {
        NodeIterator nodes = QueryUtil.search(workspace,query,Query.XPATH,returnItemType);
        
        Session session = MgnlContext.getJCRSession(workspace);
        def siblings = []; 
        while (nodes.hasNext()) {
            Node node = nodes.nextNode();
            nodePath = node.getPath();
            if (StringUtils.contains(nodePath,"[")) {
              println "found same name sibling of '${node.getName()}' at ${nodePath}";
              siblings.add(node);
            }
        }
        siblings.each {
            nodePath = node.getPath();
            newName = Path.getUniqueLabel(session,nodePath,node.getName());
            NodeUtil.renameNode(node,newName);
            println "${nodePath} was renamed to ${newName}";
        }
        session.save();
    } catch (Exception e) {
        println e;
    }
}
//example
siblings("website", "/travel/about", "mgnl:area");

Options from the expandable Groovy script above:

  • workspace: Any Magnolia workspace.
  • path: A valid path in the workspace. / will search for everything under the workspace root.
  • returnItemType: A valid JCR node type. The query goes through all node types but the results are filtered to the node type you specify. Use nt:base as a "wildcard". 

Module-specific node types

The following sections list node types that are provided by individual Magnolia modules. You can define several node types per module if you so require. Almost all the node types added inherit from mgnl:contentNode or mgnl:content.

Categorization module

Defined in  magnolia-category-nodetypes.xml  .

Notation

Description

mgnl:categoryAn object containing a category. Inherits from mgnl:content .

Content Editor module

Defined in  content-editor-nodetypes.xml  .

Notation

Description

mgnl:blockContent editor block objects containing text, image or similar content. Inherits from mgnl:contentNode and are activatable but not versionable.
mgnl:compositionCompositions are activatable and versionable as a whole and contain ordered subnodes of type mgnl:block.
mgnl:collectionCollection of unordered content editor compositions.

Content Tags module

Defined in  content-tags-nodetypes.xml  .

Notation

Description

mgnl:tagAn object containing a content tag. Inherits from mgnl:content .

Marketing Tags module

Defined in  magnolia-tags-nodetypes.xml  .

Notation

Description

mgnl:marketing-tagAn object containing a marketing tag. Inherits from mgnl:content .

Password manager module

Defined in  magnolia-keystore-nodetypes.xml .

Notation

Description

mgnl:passwordAn object containing a password. Inherits from mgnl:content .

Personalization module

Notation

Description

mgnl:componentVariantA personalized variant of a component node.
#trackbackRdf ($trackbackUtils.getContentIdentifier($page) $page.title $trackbackUtils.getPingUrl($page))
  • No labels