Improve CMS session.
authorMathieu Baudier <mbaudier@argeo.org>
Sat, 28 Nov 2020 11:52:31 +0000 (12:52 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Sat, 28 Nov 2020 11:52:31 +0000 (12:52 +0100)
org.argeo.cms.ui.rap/src/org/argeo/cms/web/AbstractCmsEntryPoint.java
org.argeo.cms.ui.rap/src/org/argeo/cms/web/BundleResourceLoader.java
org.argeo.cms.ui.rap/src/org/argeo/cms/web/CmsWebApp.java
org.argeo.cms.ui.rap/src/org/argeo/cms/web/CmsWebEntryPoint.java
org.argeo.cms.ui.rap/src/org/argeo/cms/web/SimpleApp.java
org.argeo.cms.ui.rap/src/org/argeo/cms/web/SimpleErgonomics.java
org.argeo.cms.ui/src/org/argeo/cms/ui/CmsView.java
org.argeo.cms/src/org/argeo/cms/auth/CmsSession.java
org.argeo.cms/src/org/argeo/cms/internal/auth/CmsSessionImpl.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/EgoRepository.java
org.argeo.jcr/src/org/argeo/jcr/Jcr.java

index bdc4f24bbf4551111d90bf9cc89dd03caa3e8017..887490c41d3cc3d7706d69928db494635a30b712 100644 (file)
@@ -46,6 +46,7 @@ import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
 
 /** Manages history and navigation */
+@Deprecated
 public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint implements CmsView {
        private static final long serialVersionUID = 906558779562569784L;
 
index e6ad61db6e02b2cc309a6dbdfc560921e2ff4caf..ca93e625efa181c3f2373765a256cf852b9e6a53 100644 (file)
@@ -4,7 +4,6 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
 
-import org.argeo.cms.CmsException;
 import org.eclipse.rap.rwt.service.ResourceLoader;
 import org.osgi.framework.Bundle;
 
@@ -22,7 +21,8 @@ public class BundleResourceLoader implements ResourceLoader {
                if (res == null) {
                        res = bundle.getResource(resourceName);
                        if (res == null)
-                               throw new CmsException("Resource " + resourceName + " not found in bundle " + bundle.getSymbolicName());
+                               throw new IllegalArgumentException(
+                                               "Resource " + resourceName + " not found in bundle " + bundle.getSymbolicName());
                }
                return res.openStream();
        }
index ca26c5830c7a0ad4bbf4a08928aa45a06bc53848..25b30c9b3c6ef6d0ec10674668eb7126640775f6 100644 (file)
@@ -39,7 +39,6 @@ public class CmsWebApp implements ApplicationConfiguration, ExceptionHandler, Cm
                contextName = properties.get(CONTEXT_NAME);
                if (cmsApp != null)
                        themingUpdated();
-//             registerIfAllThemesAvailable();
        }
 
        public void destroy(BundleContext bundleContext, Map<String, String> properties) {
@@ -54,12 +53,10 @@ public class CmsWebApp implements ApplicationConfiguration, ExceptionHandler, Cm
                        if (theme != null)
                                WebThemeUtils.apply(application, theme);
                }
-//             for (CmsTheme theme : themes.values())
-//                     WebThemeUtils.apply(application, theme);
 
                Map<String, String> properties = new HashMap<>();
                addEntryPoints(application, properties);
-
+               application.setExceptionHandler(this);
        }
 
        @Override
@@ -83,8 +80,6 @@ public class CmsWebApp implements ApplicationConfiguration, ExceptionHandler, Cm
                                properties.put(WebClient.HEAD_HTML, theme.getHtmlHeaders());
                        } else {
                                properties.put(WebClient.THEME_ID, RWT.DEFAULT_THEME_ID);
-//                             if (themeId != null)
-//                                     log.warn("Theme id " + themeId + " was specified but it was not found, using default RWT theme.");
                        }
                        String entryPointName = !uiName.equals("") ? "/" + uiName : "/";
                        application.addEntryPoint(entryPointName, () -> {
@@ -99,34 +94,17 @@ public class CmsWebApp implements ApplicationConfiguration, ExceptionHandler, Cm
                        log.debug("Published CMS web app /" + (contextName != null ? contextName : ""));
        }
 
-//     private void registerIfAllThemesAvailable() {
-//             boolean themeMissing = false;
-//             uiNames: for (String uiName : cmsApp.getUiNames()) {
-//                     String themeId = cmsApp.getThemeId(uiName);
-//                     if (RWT.DEFAULT_THEME_ID.equals(themeId))
-//                             continue uiNames;
-//                     if (!themes.containsKey(themeId)) {
-//                             themeMissing = true;
-//                             break uiNames;
-//                     }
-//             }
-//             if (!themeMissing) {
-//                     Dictionary<String, Object> regProps = LangUtils.dict(CONTEXT_NAME, contextName);
-//                     if (bundleContext != null) {
-//                             rwtAppReg = bundleContext.registerService(ApplicationConfiguration.class, this, regProps);
-//                             log.info("Published CMS web app /" + (contextName != null ? contextName : ""));
-//                     }
-//             }
-//     }
-
        CmsApp getCmsApp() {
                return cmsApp;
        }
 
+       BundleContext getBundleContext() {
+               return bundleContext;
+       }
+
        public void setCmsApp(CmsApp cmsApp, Map<String, String> properties) {
                this.cmsApp = cmsApp;
                this.cmsApp.addCmsAppListener(this);
-//             registerIfAllThemesAvailable();
        }
 
        public void unsetCmsApp(CmsApp cmsApp, Map<String, String> properties) {
index 9dae30cb26416807b2a49f5b60b54b630d27cf39..470aa5edc0ccc7630e9caee2ace4f73d274212e7 100644 (file)
@@ -14,6 +14,7 @@ import javax.security.auth.login.LoginException;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.api.NodeConstants;
+import org.argeo.cms.auth.CmsSession;
 import org.argeo.cms.auth.CurrentUser;
 import org.argeo.cms.auth.HttpRequestCallbackHandler;
 import org.argeo.cms.ui.CmsApp;
@@ -217,7 +218,7 @@ public class CmsWebEntryPoint implements EntryPoint, CmsView, BrowserNavigationL
        @Override
        public void navigated(BrowserNavigationEvent event) {
                setState(event.getState());
-               //doRefresh();
+               // doRefresh();
        }
 
        @Override
@@ -236,6 +237,12 @@ public class CmsWebEntryPoint implements EntryPoint, CmsView, BrowserNavigationL
                browserNavigation.pushState(state, title);
        }
 
+       @Override
+       public CmsSession getCmsSession() {
+               CmsSession cmsSession = CmsSession.getCmsSession(cmsWebApp.getBundleContext(), getSubject());
+               return cmsSession;
+       }
+
        /*
         * EntryPoint IMPLEMENTATION
         */
index 2a651bd30856ed7c31ce5c0c7b7a8a793fb91726..fd893106a0affaaea4d43744656aa0f290a1681b 100644 (file)
@@ -52,6 +52,7 @@ import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
 
 /** A basic generic app based on {@link SimpleErgonomics}. */
+@Deprecated
 public class SimpleApp implements CmsConstants, ApplicationConfiguration {
        private final static Log log = LogFactory.getLog(SimpleApp.class);
 
index 7e17770e64ef15e2000d67d45091dba8b6ecbb51..9760f9dadcdf0eb2eefc821b3a9a090cce456590 100644 (file)
@@ -27,6 +27,7 @@ import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 
 /** Simple header/body ergonomics. */
+@Deprecated
 public class SimpleErgonomics extends AbstractCmsEntryPoint {
        private static final long serialVersionUID = 8743413921359548523L;
 
index d57f20bed897a626da6e4d584180b7a7f6471f9e..dcc1f1fd16b8b747723382dc071927e1246cb0ae 100644 (file)
@@ -6,6 +6,7 @@ import java.util.Map;
 
 import javax.security.auth.login.LoginContext;
 
+import org.argeo.cms.auth.CmsSession;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Shell;
 
@@ -63,6 +64,10 @@ public interface CmsView {
        
        default void stateChanged(String state, String title) {
        }
+       
+       default CmsSession getCmsSession() {
+               throw new UnsupportedOperationException();
+       }
 
        static CmsView getCmsView(Control parent) {
                // find parent shell
index b9798006b4ca040fa3ecb3d543cf27f639dcc967..8b389087888ac76851425b0bad9f3e2d953c8d40 100644 (file)
@@ -38,6 +38,8 @@ public interface CmsSession {
 
        boolean isValid();
 
+       void registerView(String uid, Object view);
+
        /** @return The {@link CmsSession} for this {@link Subject} or null. */
        static CmsSession getCmsSession(BundleContext bc, Subject subject) {
                if (subject.getPrivateCredentials(CmsSessionId.class).isEmpty())
index 8761480fe29f8ebdc57a4d7336ab4c748ab4ffd1..211f21c94ead35175e5e730dee0348765f93c3da 100644 (file)
@@ -60,6 +60,8 @@ public class CmsSessionImpl implements CmsSession {
        private Set<String> dataSessionsInUse = new HashSet<>();
        private LinkedHashSet<Session> additionalDataSessions = new LinkedHashSet<>();
 
+       private Map<String, Object> views = new HashMap<>();
+
        public CmsSessionImpl(Subject initialSubject, Authorization authorization, Locale locale, String localSessionId) {
                this.creationTime = ZonedDateTime.now();
                this.locale = locale;
@@ -247,6 +249,13 @@ public class CmsSessionImpl implements CmsSession {
                return end;
        }
 
+       @Override
+       public void registerView(String uid, Object view) {
+               if (views.containsKey(uid))
+                       throw new IllegalArgumentException("View " + uid + " is already registered.");
+               views.put(uid, view);
+       }
+
        public String toString() {
                return "CMS Session " + userDn + " local=" + localSessionId + ", uuid=" + uuid;
        }
index e23f8d1ac4e970376eacad5c5306cbc2afb0be1a..c866eaaa2fe0168e44ebca8d95984fba7b455648 100644 (file)
@@ -20,6 +20,7 @@ import javax.security.auth.login.LoginContext;
 import org.argeo.api.NodeConstants;
 import org.argeo.api.NodeUtils;
 import org.argeo.cms.CmsException;
+import org.argeo.jcr.JcrException;
 import org.argeo.jcr.JcrRepositoryWrapper;
 import org.argeo.jcr.JcrUtils;
 
@@ -52,7 +53,7 @@ class EgoRepository extends JcrRepositoryWrapper implements KernelConstants {
                                lc = new LoginContext(NodeConstants.LOGIN_CONTEXT_DATA_ADMIN);
                                lc.login();
                        } catch (javax.security.auth.login.LoginException e1) {
-                               throw new CmsException("Cannot login as systrem", e1);
+                               throw new IllegalStateException("Cannot login as system", e1);
                        }
                        Subject.doAs(lc.getSubject(), new PrivilegedAction<Void>() {
 
@@ -75,7 +76,7 @@ class EgoRepository extends JcrRepositoryWrapper implements KernelConstants {
 
 //                     initJcr(adminSession);
                } catch (RepositoryException e) {
-                       throw new CmsException("Cannot init JCR home", e);
+                       throw new JcrException("Cannot init JCR home", e);
                } finally {
                        JcrUtils.logoutQuietly(adminSession);
                }
@@ -185,7 +186,7 @@ class EgoRepository extends JcrRepositoryWrapper implements KernelConstants {
                                adminSession.save();
                } catch (RepositoryException e) {
                        JcrUtils.discardQuietly(adminSession);
-                       throw new CmsException("Cannot sync node security model for " + username, e);
+                       throw new JcrException("Cannot sync node security model for " + username, e);
                }
        }
 
index 263128448f3f5f133b194c91cf2f647013d5b5d2..493e4afe27da3e327e84df69210061c3277882e2 100644 (file)
@@ -94,62 +94,62 @@ public class Jcr {
 
        /**
         * @see Node#isNodeType(String)
-        * @throws IllegalStateException caused by {@link RepositoryException}
+        * @throws JcrException caused by {@link RepositoryException}
         */
        public static boolean isNodeType(Node node, String nodeTypeName) {
                try {
                        return node.isNodeType(nodeTypeName);
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot get whether " + node + " is of type " + nodeTypeName, e);
+                       throw new JcrException("Cannot get whether " + node + " is of type " + nodeTypeName, e);
                }
        }
 
        /**
         * @see Node#hasNodes()
-        * @throws IllegalStateException caused by {@link RepositoryException}
+        * @throws JcrException caused by {@link RepositoryException}
         */
        public static boolean hasNodes(Node node) {
                try {
                        return node.hasNodes();
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot get whether " + node + " has children.", e);
+                       throw new JcrException("Cannot get whether " + node + " has children.", e);
                }
        }
 
        /**
         * @see Node#getParent()
-        * @throws IllegalStateException caused by {@link RepositoryException}
+        * @throws JcrException caused by {@link RepositoryException}
         */
        public static Node getParent(Node node) {
                try {
                        return isRoot(node) ? null : node.getParent();
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot get parent of " + node, e);
+                       throw new JcrException("Cannot get parent of " + node, e);
                }
        }
 
        /**
         * Whether this node is the root node.
         * 
-        * @throws IllegalStateException caused by {@link RepositoryException}
+        * @throws JcrException caused by {@link RepositoryException}
         */
        public static boolean isRoot(Node node) {
                try {
                        return node.getDepth() == 0;
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot get depth of " + node, e);
+                       throw new JcrException("Cannot get depth of " + node, e);
                }
        }
 
        /**
         * @see Node#getPath()
-        * @throws IllegalStateException caused by {@link RepositoryException}
+        * @throws JcrException caused by {@link RepositoryException}
         */
        public static String getPath(Node node) {
                try {
                        return node.getPath();
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot get path of " + node, e);
+                       throw new JcrException("Cannot get path of " + node, e);
                }
        }
 
@@ -164,25 +164,25 @@ public class Jcr {
 
        /**
         * @see Node#getIdentifier()
-        * @throws IllegalStateException caused by {@link RepositoryException}
+        * @throws JcrException caused by {@link RepositoryException}
         */
        public static String getIdentifier(Node node) {
                try {
                        return node.getIdentifier();
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot get identifier of " + node, e);
+                       throw new JcrException("Cannot get identifier of " + node, e);
                }
        }
 
        /**
         * @see Node#getName()
-        * @throws IllegalStateException caused by {@link RepositoryException}
+        * @throws JcrException caused by {@link RepositoryException}
         */
        public static String getName(Node node) {
                try {
                        return node.getName();
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot get name of " + node, e);
+                       throw new JcrException("Cannot get name of " + node, e);
                }
        }
 
@@ -212,20 +212,20 @@ public class Jcr {
        /**
         * @return the children as an {@link Iterable} for use in for-each llops.
         * @see Node#getNodes()
-        * @throws IllegalStateException caused by {@link RepositoryException}
+        * @throws JcrException caused by {@link RepositoryException}
         */
        public static Iterable<Node> nodes(Node node) {
                try {
                        return iterate(node.getNodes());
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot get children of " + node, e);
+                       throw new JcrException("Cannot get children of " + node, e);
                }
        }
 
        /**
         * @return the children as a (possibly empty) {@link List}.
         * @see Node#getNodes()
-        * @throws IllegalStateException caused by {@link RepositoryException}
+        * @throws JcrException caused by {@link RepositoryException}
         */
        public static List<Node> getNodes(Node node) {
                List<Node> nodes = new ArrayList<>();
@@ -238,14 +238,14 @@ public class Jcr {
                        } else
                                return nodes;
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot get children of " + node, e);
+                       throw new JcrException("Cannot get children of " + node, e);
                }
        }
 
        /**
         * @return the child or <code>null</node> if not found
         * @see Node#getNode(String)
-        * @throws IllegalStateException caused by {@link RepositoryException}
+        * @throws JcrException caused by {@link RepositoryException}
         */
        public static Node getNode(Node node, String child) {
                try {
@@ -254,14 +254,14 @@ public class Jcr {
                        else
                                return null;
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot get child of " + node, e);
+                       throw new JcrException("Cannot get child of " + node, e);
                }
        }
 
        /**
         * @return the node at this path or <code>null</node> if not found
         * @see Session#getNode(String)
-        * @throws IllegalStateException caused by {@link RepositoryException}
+        * @throws JcrException caused by {@link RepositoryException}
         */
        public static Node getNode(Session session, String path) {
                try {
@@ -270,14 +270,14 @@ public class Jcr {
                        else
                                return null;
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot get node " + path, e);
+                       throw new JcrException("Cannot get node " + path, e);
                }
        }
 
        /**
         * @return the node with htis id or <code>null</node> if not found
         * @see Session#getNodeByIdentifier(String)
-        * @throws IllegalStateException caused by {@link RepositoryException}
+        * @throws JcrException caused by {@link RepositoryException}
         */
        public static Node getNodeById(Session session, String id) {
                try {
@@ -285,7 +285,7 @@ public class Jcr {
                } catch (ItemNotFoundException e) {
                        return null;
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot get node with id " + id, e);
+                       throw new JcrException("Cannot get node with id " + id, e);
                }
        }
 
@@ -293,7 +293,7 @@ public class Jcr {
         * Set a property to the given value, or remove it if the value is
         * <code>null</code>.
         * 
-        * @throws IllegalStateException caused by {@link RepositoryException}
+        * @throws JcrException caused by {@link RepositoryException}
         */
        public static void set(Node node, String property, Object value) {
                try {
@@ -327,7 +327,7 @@ public class Jcr {
                        } else // try with toString()
                                prop.setValue(value.toString());
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot set property " + property + " of " + node + " to " + value, e);
+                       throw new JcrException("Cannot set property " + property + " of " + node + " to " + value, e);
                }
        }
 
@@ -337,7 +337,7 @@ public class Jcr {
         * @return the value of
         *         {@link Node#getProperty(String)}.{@link Property#getString()} or
         *         <code>null</code> if the property does not exist.
-        * @throws IllegalStateException caused by {@link RepositoryException}
+        * @throws JcrException caused by {@link RepositoryException}
         */
        public static String get(Node node, String property) {
                return get(node, property, null);
@@ -350,7 +350,7 @@ public class Jcr {
         * @return the value of
         *         {@link Node#getProperty(String)}.{@link Property#getString()} or
         *         <code>defaultValue</code> if the property does not exist.
-        * @throws IllegalStateException caused by {@link RepositoryException}
+        * @throws JcrException caused by {@link RepositoryException}
         */
        public static String get(Node node, String property, String defaultValue) {
                try {
@@ -368,7 +368,7 @@ public class Jcr {
                        } else
                                return defaultValue;
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot retrieve property " + property + " from " + node);
+                       throw new JcrException("Cannot retrieve property " + property + " from " + node, e);
                }
        }
 
@@ -377,7 +377,7 @@ public class Jcr {
         * 
         * @return {@link Node#getProperty(String)} or <code>null</code> if the property
         *         does not exist.
-        * @throws IllegalStateException caused by {@link RepositoryException}
+        * @throws JcrException caused by {@link RepositoryException}
         */
        public static Value getValue(Node node, String property) {
                try {
@@ -386,7 +386,7 @@ public class Jcr {
                        else
                                return null;
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot retrieve property " + property + " from " + node);
+                       throw new JcrException("Cannot retrieve property " + property + " from " + node, e);
                }
        }
 
@@ -396,7 +396,7 @@ public class Jcr {
         * @return the value of {@link Node#getProperty(String)} or
         *         <code>defaultValue</code> if the property does not exist.
         * @throws IllegalArgumentException if the value could not be cast
-        * @throws IllegalStateException    in case of unexpected
+        * @throws JcrException             in case of unexpected
         *                                  {@link RepositoryException}
         */
        @SuppressWarnings("unchecked")
@@ -428,7 +428,7 @@ public class Jcr {
                                return defaultValue;
                        }
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot retrieve property " + property + " from " + node);
+                       throw new JcrException("Cannot retrieve property " + property + " from " + node, e);
                }
        }
 
@@ -447,7 +447,7 @@ public class Jcr {
                try {
                        return node.getSession();
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot retrieve session related to " + node, e);
+                       throw new JcrException("Cannot retrieve session related to " + node, e);
                }
        }
 
@@ -456,7 +456,16 @@ public class Jcr {
                try {
                        return session.getRootNode();
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot get root node for " + session, e);
+                       throw new JcrException("Cannot get root node for " + session, e);
+               }
+       }
+
+       /** Whether this item exists. */
+       public static boolean itemExists(Session session, String path) {
+               try {
+                       return session.itemExists(path);
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot check whether " + path + " exists", e);
                }
        }
 
@@ -474,7 +483,7 @@ public class Jcr {
                        if (session.hasPendingChanges())
                                session.save();
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot save session related to " + node + " in workspace "
+                       throw new JcrException("Cannot save session related to " + node + " in workspace "
                                        + session(node).getWorkspace().getName(), e);
                }
        }
@@ -517,7 +526,7 @@ public class Jcr {
                        Session session = node.getSession();
                        JcrUtils.addPrivilege(session, node.getPath(), principal, privilege);
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot add privilege " + privilege + " to " + node, e);
+                       throw new JcrException("Cannot add privilege " + privilege + " to " + node, e);
                }
        }
 
@@ -529,7 +538,7 @@ public class Jcr {
                try {
                        return node.isCheckedOut();
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot retrieve checked out status of " + node, e);
+                       throw new JcrException("Cannot retrieve checked out status of " + node, e);
                }
        }
 
@@ -538,7 +547,7 @@ public class Jcr {
                try {
                        versionManager(node).checkpoint(node.getPath());
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot check in " + node, e);
+                       throw new JcrException("Cannot check in " + node, e);
                }
        }
 
@@ -547,7 +556,7 @@ public class Jcr {
                try {
                        versionManager(node).checkin(node.getPath());
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot check in " + node, e);
+                       throw new JcrException("Cannot check in " + node, e);
                }
        }
 
@@ -556,7 +565,7 @@ public class Jcr {
                try {
                        versionManager(node).checkout(node.getPath());
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot check out " + node, e);
+                       throw new JcrException("Cannot check out " + node, e);
                }
        }
 
@@ -565,7 +574,7 @@ public class Jcr {
                try {
                        return node.getSession().getWorkspace().getVersionManager();
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot get version manager from " + node, e);
+                       throw new JcrException("Cannot get version manager from " + node, e);
                }
        }
 
@@ -574,7 +583,7 @@ public class Jcr {
                try {
                        return versionManager(node).getVersionHistory(node.getPath());
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot get version history from " + node, e);
+                       throw new JcrException("Cannot get version history from " + node, e);
                }
        }
 
@@ -592,7 +601,7 @@ public class Jcr {
                        Collections.reverse(lst);
                        return lst;
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot get linear versions from " + versionHistory, e);
+                       throw new JcrException("Cannot get linear versions from " + versionHistory, e);
                }
        }
 
@@ -601,7 +610,7 @@ public class Jcr {
                try {
                        return version.getFrozenNode();
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot get frozen node from " + version, e);
+                       throw new JcrException("Cannot get frozen node from " + version, e);
                }
        }
 
@@ -610,7 +619,7 @@ public class Jcr {
                try {
                        return versionManager(node).getBaseVersion(node.getPath());
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot get base version from " + node, e);
+                       throw new JcrException("Cannot get base version from " + node, e);
                }
        }
 
@@ -628,7 +637,7 @@ public class Jcr {
                                throw new IllegalArgumentException(fileNode + " must be a file.");
                        return getBinarySize(fileNode.getNode(Node.JCR_CONTENT).getProperty(Property.JCR_DATA).getBinary());
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot get file size of " + fileNode, e);
+                       throw new JcrException("Cannot get file size of " + fileNode, e);
                }
        }
 
@@ -639,7 +648,7 @@ public class Jcr {
                                return binary.getSize();
                        }
                } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot get file size of binary " + binaryArg, e);
+                       throw new JcrException("Cannot get file size of binary " + binaryArg, e);
                }
        }