Index: ../magnolia-git/magnolia_ui/magnolia-ui-api/src/main/java/info/magnolia/ui/api/action/AbstractActionExecutor.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- ../magnolia-git/magnolia_ui/magnolia-ui-api/src/main/java/info/magnolia/ui/api/action/AbstractActionExecutor.java (revision 0a35de2) +++ ../magnolia-git/magnolia_ui/magnolia-ui-api/src/main/java/info/magnolia/ui/api/action/AbstractActionExecutor.java (revision 624b6a32dcaa0674b039f1c8bfbbb2fed5d509ab) @@ -39,15 +39,18 @@ import info.magnolia.objectfactory.MgnlInstantiationException; import info.magnolia.ui.api.availability.AvailabilityDefinition; import info.magnolia.ui.api.availability.AvailabilityRule; +import info.magnolia.ui.vaadin.integration.jcr.JcrNodeAdapter; +import info.magnolia.ui.vaadin.integration.jcr.JcrPropertyAdapter; import javax.inject.Inject; -import javax.jcr.Item; import javax.jcr.Node; import javax.jcr.RepositoryException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.vaadin.data.Item; + /** * Abstract base implementation of {@link ActionExecutor}. Creates the {@link Action} from the implementation class * using a {@link ComponentProvider} and binds the ActionDefinition to the Action. Subclasses need only implement @@ -155,22 +158,27 @@ return availability.isRoot(); } - if (!item.isNode()) { + if (item instanceof JcrPropertyAdapter) { return availability.isProperties(); } + if (item instanceof JcrNodeAdapter) { + + Node node = ((JcrNodeAdapter) item).getJcrItem(); + - // Must have _any_ of the node types if any are specified, otherwise its available by default - if (availability.getNodeTypes().isEmpty()) { - return availability.isNodes(); - } + // Must have _any_ of the node types if any are specified, otherwise its available by default + if (availability.getNodeTypes().isEmpty()) { + return availability.isNodes(); + } - for (String nodeType : availability.getNodeTypes()) { - try { + for (String nodeType : availability.getNodeTypes()) { + try { - if (NodeUtil.isNodeType((Node)item, nodeType)) { + if (NodeUtil.isNodeType(node, nodeType)) { - return true; - } - } catch (RepositoryException e) { - log.error("Could not determine node type of node " + NodeUtil.getNodePathIfPossible((Node) item)); + return true; + } + } catch (RepositoryException e) { + log.error("Could not determine node type of node " + NodeUtil.getNodePathIfPossible((Node) item)); + } } } Index: ../magnolia-git/magnolia_ui/magnolia-ui-api/src/main/java/info/magnolia/ui/api/action/ActionExecutor.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- ../magnolia-git/magnolia_ui/magnolia-ui-api/src/main/java/info/magnolia/ui/api/action/ActionExecutor.java (revision 0a35de2) +++ ../magnolia-git/magnolia_ui/magnolia-ui-api/src/main/java/info/magnolia/ui/api/action/ActionExecutor.java (revision 624b6a32dcaa0674b039f1c8bfbbb2fed5d509ab) @@ -33,7 +33,7 @@ */ package info.magnolia.ui.api.action; -import javax.jcr.Item; +import com.vaadin.data.Item; /** * Responsible for executing actions, doing lookups of action definitions based on action names and evaluating if an Index: ../magnolia-git/magnolia_ui/magnolia-ui-api/src/main/java/info/magnolia/ui/api/availability/AbstractAvailabilityRule.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- ../magnolia-git/magnolia_ui/magnolia-ui-api/src/main/java/info/magnolia/ui/api/availability/AbstractAvailabilityRule.java (revision 0a35de2) +++ ../magnolia-git/magnolia_ui/magnolia-ui-api/src/main/java/info/magnolia/ui/api/availability/AbstractAvailabilityRule.java (revision 624b6a32dcaa0674b039f1c8bfbbb2fed5d509ab) @@ -33,7 +33,7 @@ */ package info.magnolia.ui.api.availability; -import javax.jcr.Item; +import com.vaadin.data.Item; /** * Abstract rule class. Index: ../magnolia-git/magnolia_ui/magnolia-ui-api/src/main/java/info/magnolia/ui/api/availability/AvailabilityRule.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- ../magnolia-git/magnolia_ui/magnolia-ui-api/src/main/java/info/magnolia/ui/api/availability/AvailabilityRule.java (revision 0a35de2) +++ ../magnolia-git/magnolia_ui/magnolia-ui-api/src/main/java/info/magnolia/ui/api/availability/AvailabilityRule.java (revision 624b6a32dcaa0674b039f1c8bfbbb2fed5d509ab) @@ -33,7 +33,7 @@ */ package info.magnolia.ui.api.availability; -import javax.jcr.Item; +import com.vaadin.data.Item; /** * Defines the rule for additional availability restrictions. Index: ../magnolia-git/magnolia_ui/magnolia-ui-api/src/main/java/info/magnolia/ui/api/availability/IsDeletedRule.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- ../magnolia-git/magnolia_ui/magnolia-ui-api/src/main/java/info/magnolia/ui/api/availability/IsDeletedRule.java (revision 0a35de2) +++ ../magnolia-git/magnolia_ui/magnolia-ui-api/src/main/java/info/magnolia/ui/api/availability/IsDeletedRule.java (revision 624b6a32dcaa0674b039f1c8bfbbb2fed5d509ab) @@ -35,14 +35,16 @@ import info.magnolia.jcr.util.NodeTypes; import info.magnolia.jcr.util.NodeUtil; +import info.magnolia.ui.vaadin.integration.jcr.JcrNodeAdapter; -import javax.jcr.Item; import javax.jcr.Node; import javax.jcr.RepositoryException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.vaadin.data.Item; + /** * This rule returns true if the item is node and has the mgnl:deleted mixin type. */ @@ -52,8 +54,8 @@ @Override protected boolean isAvailableForItem(Item item) { - if (item != null && item.isNode()) { - Node node = (Node) item; + if (item instanceof JcrNodeAdapter) { + Node node = ((JcrNodeAdapter) item).getJcrItem(); try { return NodeUtil.hasMixin(node, NodeTypes.Deleted.NAME); } catch (RepositoryException e) { Index: ../magnolia-git/magnolia_ui/magnolia-ui-api/src/main/java/info/magnolia/ui/api/availability/IsNotDeletedRule.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- ../magnolia-git/magnolia_ui/magnolia-ui-api/src/main/java/info/magnolia/ui/api/availability/IsNotDeletedRule.java (revision 0a35de2) +++ ../magnolia-git/magnolia_ui/magnolia-ui-api/src/main/java/info/magnolia/ui/api/availability/IsNotDeletedRule.java (revision 624b6a32dcaa0674b039f1c8bfbbb2fed5d509ab) @@ -35,14 +35,16 @@ import info.magnolia.jcr.util.NodeTypes; import info.magnolia.jcr.util.NodeUtil; +import info.magnolia.ui.vaadin.integration.jcr.JcrNodeAdapter; -import javax.jcr.Item; import javax.jcr.Node; import javax.jcr.RepositoryException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.vaadin.data.Item; + /** * This rule returns true if the item is not a node, or if it is a node and has NOT the mgnl:deleted mixin type. */ @@ -52,8 +54,8 @@ @Override public boolean isAvailableForItem(Item item) { - if (item != null && item.isNode()) { - Node node = (Node) item; + if (item instanceof JcrNodeAdapter) { + Node node = ((JcrNodeAdapter) item).getJcrItem(); try { return !NodeUtil.hasMixin(node, NodeTypes.Deleted.NAME); } catch (RepositoryException e) { Index: ../magnolia-git/magnolia_ui/magnolia-ui-api/src/test/java/info/magnolia/ui/api/action/AbstractActionExecutorTest.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- ../magnolia-git/magnolia_ui/magnolia-ui-api/src/test/java/info/magnolia/ui/api/action/AbstractActionExecutorTest.java (revision 0a35de2) +++ ../magnolia-git/magnolia_ui/magnolia-ui-api/src/test/java/info/magnolia/ui/api/action/AbstractActionExecutorTest.java (revision 624b6a32dcaa0674b039f1c8bfbbb2fed5d509ab) @@ -34,6 +34,8 @@ package info.magnolia.ui.api.action; import static org.junit.Assert.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import info.magnolia.cms.security.MgnlUser; import info.magnolia.cms.security.operations.ConfiguredAccessDefinition; @@ -50,6 +52,8 @@ import info.magnolia.test.mock.jcr.MockProperty; import info.magnolia.ui.api.availability.AvailabilityDefinition; import info.magnolia.ui.api.availability.ConfiguredAvailabilityDefinition; +import info.magnolia.ui.vaadin.integration.jcr.JcrNodeAdapter; +import info.magnolia.ui.vaadin.integration.jcr.JcrPropertyAdapter; import java.util.ArrayList; import java.util.Collection; @@ -57,11 +61,14 @@ import java.util.List; import javax.inject.Inject; -import javax.jcr.Item; +import javax.jcr.Session; +import javax.jcr.Workspace; import org.junit.Before; import org.junit.Test; +import com.vaadin.data.Item; + /** * Test case for AbstractActionExecutor. */ @@ -246,8 +253,8 @@ // THEN assertFalse(actionExecutor.isAvailable("foobar", ROOT_ITEM)); - assertFalse(actionExecutor.isAvailable("foobar", new MockNode())); - assertFalse(actionExecutor.isAvailable("foobar", new MockProperty("propertyName", "propertyValue", new MockNode()))); + assertFalse(actionExecutor.isAvailable("foobar", mockNodeAdapter(new MockNode()))); + assertFalse(actionExecutor.isAvailable("foobar", mockPropertyAdapter(new MockProperty("propertyName", "propertyValue", new MockNode())))); } @Test @@ -265,8 +272,8 @@ // THEN assertTrue(actionExecutor.isAvailable("foobar", ROOT_ITEM)); - assertTrue(actionExecutor.isAvailable("foobar", new MockNode())); - assertFalse(actionExecutor.isAvailable("foobar", new MockProperty("propertyName", "propertyValue", new MockNode()))); + assertTrue(actionExecutor.isAvailable("foobar", mockNodeAdapter(new MockNode()))); + assertFalse(actionExecutor.isAvailable("foobar", mockPropertyAdapter(new MockProperty("propertyName", "propertyValue", new MockNode())))); } @Test @@ -284,8 +291,8 @@ // THEN assertFalse(actionExecutor.isAvailable("foobar", ROOT_ITEM)); - assertTrue(actionExecutor.isAvailable("foobar", new MockProperty("propertyName", "propertyValue", new MockNode()))); - assertTrue(actionExecutor.isAvailable("foobar", new MockNode())); + assertTrue(actionExecutor.isAvailable("foobar", mockPropertyAdapter(new MockProperty("propertyName", "propertyValue", new MockNode())))); + assertTrue(actionExecutor.isAvailable("foobar", mockNodeAdapter(new MockNode()))); } @Test @@ -301,8 +308,8 @@ // THEN assertFalse(actionExecutor.isAvailable("foobar", ROOT_ITEM)); - assertFalse(actionExecutor.isAvailable("foobar", new MockProperty("propertyName", "propertyValue", new MockNode()))); - assertTrue(actionExecutor.isAvailable("foobar", new MockNode())); + assertFalse(actionExecutor.isAvailable("foobar", mockPropertyAdapter(new MockProperty("propertyName", "propertyValue", new MockNode())))); + assertTrue(actionExecutor.isAvailable("foobar", mockNodeAdapter(new MockNode()))); } @Test @@ -320,9 +327,9 @@ // THEN assertFalse(actionExecutor.isAvailable("foobar", ROOT_ITEM)); - assertFalse(actionExecutor.isAvailable("foobar", new MockProperty("propertyName", "propertyValue", new MockNode()))); - assertTrue(actionExecutor.isAvailable("foobar", new MockNode("", NodeTypes.Content.NAME))); - assertFalse(actionExecutor.isAvailable("foobar", new MockNode("", NodeTypes.ContentNode.NAME))); + assertFalse(actionExecutor.isAvailable("foobar", mockPropertyAdapter(new MockProperty("propertyName", "propertyValue", new MockNode())))); + assertTrue(actionExecutor.isAvailable("foobar", mockNodeAdapter(new MockNode("", NodeTypes.Content.NAME)))); + assertFalse(actionExecutor.isAvailable("foobar", mockNodeAdapter(new MockNode("", NodeTypes.ContentNode.NAME)))); } @Test @@ -360,5 +367,24 @@ GuiceComponentProvider componentProvider = builder.build(); return new SimpleActionExecutor(componentProvider); } + + private Item mockPropertyAdapter(MockProperty mockProperty) { + Workspace workspace = mock(Workspace.class); + when(workspace.getName()).thenReturn("config"); + Session mock = mock(Session.class); + when(mock.getWorkspace()).thenReturn(workspace); + JcrPropertyAdapter adapterMock = mock(JcrPropertyAdapter.class); + when(adapterMock.getJcrItem()).thenReturn(mockProperty); + return adapterMock; -} + } + private Item mockNodeAdapter(MockNode mockNode) { + Workspace workspace = mock(Workspace.class); + when(workspace.getName()).thenReturn("config"); + Session mock = mock(Session.class); + when(mock.getWorkspace()).thenReturn(workspace); + JcrNodeAdapter adapterMock = mock(JcrNodeAdapter.class); + when(adapterMock.getJcrItem()).thenReturn(mockNode); + return adapterMock; + } +} Index: ../magnolia-git/magnolia_ui/magnolia-ui-contentapp/src/main/java/info/magnolia/ui/contentapp/browser/BrowserSubApp.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- ../magnolia-git/magnolia_ui/magnolia-ui-contentapp/src/main/java/info/magnolia/ui/contentapp/browser/BrowserSubApp.java (revision 0a35de2) +++ ../magnolia-git/magnolia_ui/magnolia-ui-contentapp/src/main/java/info/magnolia/ui/contentapp/browser/BrowserSubApp.java (revision 624b6a32dcaa0674b039f1c8bfbbb2fed5d509ab) @@ -54,6 +54,8 @@ import info.magnolia.ui.framework.app.BaseSubApp; import info.magnolia.ui.vaadin.actionbar.ActionPopup; import info.magnolia.ui.vaadin.integration.jcr.JcrItemUtil; +import info.magnolia.ui.vaadin.integration.jcr.JcrNodeAdapter; +import info.magnolia.ui.vaadin.integration.jcr.JcrPropertyAdapter; import info.magnolia.ui.workbench.ContentView.ViewType; import info.magnolia.ui.workbench.definition.WorkbenchDefinition; import info.magnolia.ui.workbench.event.ItemRightClickedEvent; @@ -66,8 +68,8 @@ import javax.inject.Inject; import javax.inject.Named; -import javax.jcr.Item; import javax.jcr.Node; +import javax.jcr.Property; import javax.jcr.RepositoryException; import org.apache.commons.lang.StringUtils; @@ -75,6 +77,7 @@ import org.slf4j.LoggerFactory; import org.vaadin.peter.contextmenu.ContextMenu; +import com.vaadin.data.Item; import com.vaadin.server.ExternalResource; /** @@ -222,7 +225,7 @@ try { String workbenchRootItemId = JcrItemUtil.getItemId(workbench.getWorkspace(), workbench.getPath()); List selectedItemIds = getBrowser().getSelectedItemIds(); - List items = getJcrItemsExceptOne(workbench.getWorkspace(), selectedItemIds, workbenchRootItemId); + List items = getItemsWithWorkbenchRootAsNull(workbench.getWorkspace(), selectedItemIds, workbenchRootItemId); // Figure out which section to show, only one ActionbarSectionDefinition sectionDefinition = getVisibleSection(sections, items); @@ -238,7 +241,7 @@ for (ActionbarItemDefinition itemDefinition : groupDefinition.getItems()) { String actionName = itemDefinition.getName(); - menuItem = addActionPopupItem(subAppDescriptor, actionPopup, itemDefinition, items); + menuItem = addActionPopupItem(subAppDescriptor, actionPopup, itemDefinition); menuItem.setEnabled(actionExecutor.isAvailable(actionName, items.toArray(new Item[items.size()]))); } @@ -258,7 +261,7 @@ * Add an additional menu item on the actionPopup. * TODO: Move to BrowserPresenter. Christopher Zimmermann */ - private ContextMenu.ContextMenuItem addActionPopupItem(BrowserSubAppDescriptor subAppDescriptor, ActionPopup actionPopup, ActionbarItemDefinition itemDefinition, List items) { + private ContextMenu.ContextMenuItem addActionPopupItem(BrowserSubAppDescriptor subAppDescriptor, ActionPopup actionPopup, ActionbarItemDefinition itemDefinition) { String actionName = itemDefinition.getName(); ActionDefinition action = subAppDescriptor.getActions().get(actionName); @@ -288,7 +291,7 @@ try { String workbenchRootItemId = JcrItemUtil.getItemId(workbench.getWorkspace(), workbench.getPath()); List selectedItemIds = getBrowser().getSelectedItemIds(); - List items = getJcrItemsExceptOne(workbench.getWorkspace(), selectedItemIds, workbenchRootItemId); + List items = getItemsWithWorkbenchRootAsNull(workbench.getWorkspace(), selectedItemIds, workbenchRootItemId); // Figure out which section to show, only one ActionbarSectionDefinition sectionDefinition = getVisibleSection(sections, items); @@ -374,24 +377,28 @@ } // If its a property we display it only if the properties property is set - if (!item.isNode()) { + if (item instanceof JcrPropertyAdapter) { return availability.isProperties(); } + if (item instanceof JcrNodeAdapter) { + + Node node = ((JcrNodeAdapter) item).getJcrItem(); + - // If node is selected and the section is available for nodes - if (availability.isNodes()) { - // if no node type defined, the for all node types - if (availability.getNodeTypes().isEmpty()) { - return true; - } - // else the node must match at least one of the configured node types - for (String nodeType : availability.getNodeTypes()) { + // If node is selected and the section is available for nodes + if (availability.isNodes()) { + // if no node type defined, the for all node types + if (availability.getNodeTypes().isEmpty()) { + return true; + } + // else the node must match at least one of the configured node types + for (String nodeType : availability.getNodeTypes()) { - if (NodeUtil.isNodeType((Node) item, nodeType)) { + if (NodeUtil.isNodeType(node, nodeType)) { - return true; - } - } + return true; + } + } - - } + } + } return false; } @@ -437,7 +444,7 @@ public void onSelectionChanged(SelectionChangedEvent event) { BrowserLocation location = getCurrentLocation(); try { - Item selected = JcrItemUtil.getJcrItem(event.getWorkspace(), JcrItemUtil.parseNodeIdentifier(event.getFirstItemId())); + javax.jcr.Item selected = JcrItemUtil.getJcrItem(event.getWorkspace(), JcrItemUtil.parseNodeIdentifier(event.getFirstItemId())); location.updateNodePath(selected.getPath()); } catch (RepositoryException e) { log.warn("Could not get jcrItem with itemId " + event.getFirstItemId() + " from workspace " + event.getWorkspace(), e); @@ -493,20 +500,33 @@ }); } - public static List getJcrItemsExceptOne(final String workspaceName, List ids, String itemIdToExclude) { - List items = JcrItemUtil.getJcrItems(workspaceName, ids); - if (itemIdToExclude == null) { - return items; + private List getItemsWithWorkbenchRootAsNull(final String workspaceName, List itemIds, String workbenchRootItemId) { + + // sanity check + if (StringUtils.isBlank(workspaceName) || itemIds == null) { + return null; } - for (int i = 0; i < items.size(); i++) { + + List items = new ArrayList(); + for (String itemId : itemIds) { try { - if (itemIdToExclude.equals(JcrItemUtil.getItemId(items.get(i)))) { - items.set(i, null); + if (itemId.equals(workbenchRootItemId)) { + items.add(null); + } else { + javax.jcr.Item jcrItem = JcrItemUtil.getJcrItem(workspaceName, itemId); + if (jcrItem != null) { + if (jcrItem.isNode()) { + items.add(new JcrNodeAdapter((Node) jcrItem)); + } else { + items.add(new JcrPropertyAdapter((Property) jcrItem)); - } + } + } + } } catch (RepositoryException e) { - log.debug("Cannot get item ID for item [{}].", items.get(i)); + log.debug("Cannot find item with id [{}] in workspace [{}].", itemId, workspaceName); } } + return items; } } Index: ../magnolia-git/magnolia_ui/magnolia-ui-contentapp/src/test/java/info/magnolia/ui/contentapp/ContentSubAppTest.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- ../magnolia-git/magnolia_ui/magnolia-ui-contentapp/src/test/java/info/magnolia/ui/contentapp/ContentSubAppTest.java (revision 0a35de2) +++ ../magnolia-git/magnolia_ui/magnolia-ui-contentapp/src/test/java/info/magnolia/ui/contentapp/ContentSubAppTest.java (revision 624b6a32dcaa0674b039f1c8bfbbb2fed5d509ab) @@ -46,9 +46,9 @@ import info.magnolia.ui.api.app.SubAppContext; import info.magnolia.event.EventBus; -import javax.jcr.Item; - import org.junit.Before; + +import com.vaadin.data.Item; /** * ContentSubAppTest. Index: ../magnolia-git/magnolia_ui/pages/src/main/java/info/magnolia/pages/app/availability/PageHasSubpagesAndIsNotDeletedRule.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- ../magnolia-git/magnolia_ui/pages/src/main/java/info/magnolia/pages/app/availability/PageHasSubpagesAndIsNotDeletedRule.java (revision 0a35de2) +++ ../magnolia-git/magnolia_ui/pages/src/main/java/info/magnolia/pages/app/availability/PageHasSubpagesAndIsNotDeletedRule.java (revision 624b6a32dcaa0674b039f1c8bfbbb2fed5d509ab) @@ -37,7 +37,7 @@ import info.magnolia.ui.api.availability.AvailabilityRule; import info.magnolia.ui.api.availability.IsNotDeletedRule; -import javax.jcr.Item; +import com.vaadin.data.Item; /** * This rule returns true, if the item is node of the mgnl:page type, has a subnode of the same type, and is not deleted (i.e. has not the mgnl:deleted mixin type). Index: ../magnolia-git/magnolia_ui/pages/src/main/java/info/magnolia/pages/app/availability/PageHasSubpagesRule.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- ../magnolia-git/magnolia_ui/pages/src/main/java/info/magnolia/pages/app/availability/PageHasSubpagesRule.java (revision 0a35de2) +++ ../magnolia-git/magnolia_ui/pages/src/main/java/info/magnolia/pages/app/availability/PageHasSubpagesRule.java (revision 624b6a32dcaa0674b039f1c8bfbbb2fed5d509ab) @@ -36,13 +36,16 @@ import info.magnolia.jcr.util.NodeTypes; import info.magnolia.jcr.util.NodeUtil; import info.magnolia.ui.api.availability.AbstractAvailabilityRule; -import javax.jcr.Item; +import info.magnolia.ui.vaadin.integration.jcr.JcrNodeAdapter; + import javax.jcr.Node; import javax.jcr.RepositoryException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.vaadin.data.Item; + /** * This rule returns true, if the item is node of the mgnl:page type and has a subnode of the same type. */ @@ -53,8 +56,8 @@ @Override public boolean isAvailableForItem(Item item) { // item must be a Node - if (item != null && item.isNode()) { - Node node = (Node) item; + if (item instanceof JcrNodeAdapter) { + Node node = ((JcrNodeAdapter) item).getJcrItem(); try { // node must be of the Page type if (NodeUtil.isNodeType(node, NodeTypes.Page.NAME)) {