changeset 1181:f5e16d31cccb

fixed bugs in metadata implementation for index.meta files.
author robcast
date Wed, 10 Apr 2013 09:22:22 +0200
parents 5abbf21fdf9f
children 8bf1b3eda48c
files common/src/main/java/digilib/io/DocuDirectory.java common/src/main/java/digilib/meta/IndexMetaDirMeta.java common/src/main/java/digilib/meta/IndexMetaFileMeta.java servlet/src/main/java/digilib/auth/MetaAccessServletAuthOps.java servlet/src/main/java/digilib/auth/PathServletAuthOps.java servlet/src/main/java/digilib/auth/ServletAuthOpsImpl.java servlet/src/main/java/digilib/conf/DigilibServletConfiguration.java servlet/src/main/java/digilib/servlet/DocumentBean.java
diffstat 8 files changed, 49 insertions(+), 65 deletions(-) [+]
line wrap: on
line diff
--- a/common/src/main/java/digilib/io/DocuDirectory.java	Thu Apr 04 18:43:13 2013 +0200
+++ b/common/src/main/java/digilib/io/DocuDirectory.java	Wed Apr 10 09:22:22 2013 +0200
@@ -97,8 +97,9 @@
 	}
 
 	/**
-	 * number of DocuFiles in this directory.
-	 *  
+	 * number of DocuFiles in this directory. 
+	 * Warning: this does mostly not give the right result!  
+	 * @deprecated Use {@link #size(FileClass)} instead.
 	 */
 	public int size() {
 		return ((list != null) && (list.get(0) != null)) ? list.get(0).size() : 0;
@@ -434,4 +435,11 @@
         return meta;
     }
 
+    /**
+     * @return the cache
+     */
+    public DocuDirCache getCache() {
+        return cache;
+    }
+
 }
--- a/common/src/main/java/digilib/meta/IndexMetaDirMeta.java	Thu Apr 04 18:43:13 2013 +0200
+++ b/common/src/main/java/digilib/meta/IndexMetaDirMeta.java	Wed Apr 10 09:22:22 2013 +0200
@@ -1,6 +1,3 @@
-/**
- * 
- */
 package digilib.meta;
 
 /*
@@ -91,17 +88,19 @@
      */
     public void readParentMeta(DocuDirectory dir) {
         // check the parent directories for additional file meta
-        Directory dd = dir.getParent();
+        Directory pd = dir.getParent();
         String path = dir.getDir().getName();
-        while (dd != null) {
-            IndexMetaDirMeta dm = (IndexMetaDirMeta) ((DocuDirectory) dd).getMeta();
+        while (pd != null) {
+            DocuDirectory dd = (DocuDirectory) pd;
+            dd.checkMeta();
+            IndexMetaDirMeta dm = (IndexMetaDirMeta) dd.getMeta();
             if (dm.hasUnresolvedFileMeta()) {
                 readFileMeta(dir, dm.getUnresolvedFileMeta(), path);
             }
             // prepend parent dir path
-            path = dd.getDir().getName() + "/" + path;
+            path = pd.getDir().getName() + "/" + path;
             // become next parent
-            dd = dd.getParent();
+            pd = pd.getParent();
         }
     }
 
@@ -118,13 +117,9 @@
      *            fileClass
      */
     protected void readFileMeta(DocuDirectory dir, Map<String,MetadataMap> fileMeta, String relPath) {
-        if (dir.size() == 0) {
-            // there are no files
-            return;
-        }
         String path = (relPath != null) ? (relPath + "/") : "";
         // go through all file classes
-        for (FileClass fc: FileClass.values()) {
+        for (FileClass fc: dir.getCache().getFileClasses()) {
             int ds = dir.size(fc);
             if (ds == 0) {
                 continue;
--- a/common/src/main/java/digilib/meta/IndexMetaFileMeta.java	Thu Apr 04 18:43:13 2013 +0200
+++ b/common/src/main/java/digilib/meta/IndexMetaFileMeta.java	Wed Apr 10 09:22:22 2013 +0200
@@ -102,7 +102,7 @@
                         DocuDirectory pdd = (DocuDirectory) dd.getParent();
                         if (pdd != null) {
                             pdd.checkMeta();
-                            if (pdd.getMeta().getDirMeta() != null) {
+                            if (fileMeta == null) {
                                 fileMeta = pdd.getMeta().getDirMeta();
                             }
                         }
--- a/servlet/src/main/java/digilib/auth/MetaAccessServletAuthOps.java	Thu Apr 04 18:43:13 2013 +0200
+++ b/servlet/src/main/java/digilib/auth/MetaAccessServletAuthOps.java	Wed Apr 10 09:22:22 2013 +0200
@@ -37,6 +37,7 @@
 
 import digilib.conf.DigilibServletRequest;
 import digilib.io.DocuDirent;
+import digilib.io.FileOpException;
 import digilib.meta.MetadataMap;
 import digilib.util.HashTree;
 import digilib.util.XMLListLoader;
@@ -55,19 +56,6 @@
     private Map<String, List<String>> rolesMap;
 
     /**
-     * Constructor taking an XML config file.
-     * 
-     * @param confFile
-     *            Configuration file.
-     * @throws AuthOpException
-     *             Exception thrown on error.
-     */
-    public MetaAccessServletAuthOps(File confFile) throws AuthOpException {
-        configFile = confFile;
-        init();
-    }
-
-    /**
      * Set configuration file.
      * 
      * @param confFile
@@ -133,13 +121,19 @@
     @Override
     public List<String> rolesForPath(DigilibServletRequest dlRequest) throws AuthOpException {
         HttpServletRequest request = dlRequest.getServletRequest();
-        logger.debug("rolesForPath (" + dlRequest.getFilePath() + ") by [" + request.getRemoteAddr() + "]");
+        DocuDirent imgs;
+        try {
+            imgs = (DocuDirent) dlRequest.getJobDescription().getImageSet();
+        } catch (FileOpException e) {
+            throw new AuthOpException("No file for auth check!");
+        }
         /*
          * check if the requests address provides a role
          */
         List<String> provided = authIPs.match(request.getRemoteAddr());
         if ((provided != null) && (provided.contains("ALL"))) {
             // ALL switches off checking;
+            logger.debug("rolesForPath (" + imgs.getName() + ") by [" + request.getRemoteAddr() + "]: (ip-all)");
             return null;
         }
         /*
@@ -147,15 +141,15 @@
          */
         String access = null;
         try {
-            DocuDirent imgs = (DocuDirent) dlRequest.getJobDescription().getImageSet();
+            imgs.checkMeta();
             MetadataMap meta = imgs.getMeta().getFileMeta();
             access = meta.get("access");
         } catch (Exception e) {
-            logger.error("Error getting meta for file!", e);
-            throw new AuthOpException("Error getting meta for file access!");
+            logger.error("Error getting access meta for file!");
         }
         if (access == null) {
             // no access restriction - allow
+            logger.debug("rolesForPath (" + imgs.getName() + ") by [" + request.getRemoteAddr() + "]: (none)");
             return null;
         }
         // check provided against required roles
@@ -165,10 +159,12 @@
             for (String prov : provided) {
                 if (required.contains(prov)) {
                     // satisfied
+                    logger.debug("rolesForPath (" + imgs.getName() + ") by [" + request.getRemoteAddr() + "]: (provided)");
                     return null;
                 }
             }
         }
+        logger.debug("rolesForPath (" + imgs.getName() + ") by [" + request.getRemoteAddr() + "]: "+required);
         return required;
     }
 
--- a/servlet/src/main/java/digilib/auth/PathServletAuthOps.java	Thu Apr 04 18:43:13 2013 +0200
+++ b/servlet/src/main/java/digilib/auth/PathServletAuthOps.java	Wed Apr 10 09:22:22 2013 +0200
@@ -49,21 +49,6 @@
     private HashTree authIPs;
 
     /**
-     * Constructor taking an XML config file.
-     * 
-     * @param u
-     *            utils object
-     * @param confFile
-     *            Configuration file.
-     * @throws AuthOpException
-     *             Exception thrown on error.
-     */
-    public PathServletAuthOps(File confFile) throws AuthOpException {
-        configFile = confFile;
-        init();
-    }
-
-    /**
      * Set configuration file.
      * 
      * @param confFile
--- a/servlet/src/main/java/digilib/auth/ServletAuthOpsImpl.java	Thu Apr 04 18:43:13 2013 +0200
+++ b/servlet/src/main/java/digilib/auth/ServletAuthOpsImpl.java	Wed Apr 10 09:22:22 2013 +0200
@@ -44,14 +44,6 @@
     /** general logger for this class */
     protected Logger logger = Logger.getLogger(this.getClass());
 
-    /** Default constructor. */
-    public ServletAuthOpsImpl() {
-        try {
-            init();
-        } catch (AuthOpException e) {
-        }
-    }
-
     public abstract void init() throws AuthOpException;
 
     /**
@@ -67,22 +59,24 @@
      * @see digilib.auth.AuthOps#isAuthorized(digilib.conf.DigilibRequest)
      */
     public boolean isAuthorized(DigilibRequest request) throws AuthOpException {
-        List<String> rolesAllowed = rolesForPath((DigilibServletRequest) request);
-        return isRoleAuthorized(rolesAllowed, (DigilibServletRequest) request);
+        List<String> rolesRequired = rolesForPath((DigilibServletRequest) request);
+        if (rolesRequired == null) return true;
+        return isRoleAuthorized(rolesRequired, (DigilibServletRequest) request);
     }
 
     /**
      * Test request authorization against a list of roles.
      * 
-     * @param roles
+     * @param rolesRequired
      *            List of Strings with role names.
      * @param request
      *            ServletRequest with address information.
      * @return true if the user information in the request authorizes one of the
      *         roles.
      */
-    public boolean isRoleAuthorized(List<String> roles, DigilibServletRequest request) {
-        for (String s : roles) {
+    public boolean isRoleAuthorized(List<String> rolesRequired, DigilibServletRequest request) {
+        if (rolesRequired == null) return true;
+        for (String s : rolesRequired) {
             logger.debug("Testing role: " + s);
             if (request.getServletRequest().isUserInRole(s)) {
                 logger.debug("Role Authorized");
--- a/servlet/src/main/java/digilib/conf/DigilibServletConfiguration.java	Thu Apr 04 18:43:13 2013 +0200
+++ b/servlet/src/main/java/digilib/conf/DigilibServletConfiguration.java	Wed Apr 10 09:22:22 2013 +0200
@@ -97,6 +97,12 @@
         newParameter("servlet.dir.cache", null, null, 's');
         // Executor for image operations
         newParameter("servlet.worker.imageexecutor", null, null, 's');
+        // AuthOps instance
+        newParameter("servlet.auth.op", null, null, 's');
+        // classes TODO: do we need this?
+        newParameter("servlet.filemeta.class", null, null, 's');
+        newParameter("servlet.dirmeta.class", null, null, 's');
+        newParameter("servlet.authops.class", null, null, 's');
 
         /*
          * parameters that can be read from config file have a type 'f'
@@ -229,10 +235,10 @@
         try {
             // initialise MetaFactory
             Class<FileMeta> fileMetaClass = (Class<FileMeta>) Class.forName(getAsString("filemeta-class"));
-            newParameter("servlet.filemeta.class", fileMetaClass, null, 's');
+            setValue("servlet.filemeta.class", fileMetaClass);
             MetaFactory.setFileMetaClass(fileMetaClass);
             Class<DirMeta> dirMetaClass = (Class<DirMeta>) Class.forName(getAsString("dirmeta-class"));
-            newParameter("servlet.dirmeta.class", dirMetaClass, null, 's');
+            setValue("servlet.dirmeta.class", dirMetaClass);
             MetaFactory.setDirMetaClass(dirMetaClass);
         } catch (ClassNotFoundException e) {
             logger.error("Error setting Metadata classes!");
@@ -240,7 +246,7 @@
         try {
             // initialise AuthOpsFactory
             Class<AuthOps> authOpsClass = (Class<AuthOps>) Class.forName(getAsString("authops-class"));
-            newParameter("servlet.authops.class", authOpsClass, null, 's');
+            setValue("servlet.authops.class", authOpsClass);
             AuthOpsFactory.setAuthOpsClass(authOpsClass);
         } catch (ClassNotFoundException e) {
             logger.error("Error setting AuthOps class!");
--- a/servlet/src/main/java/digilib/servlet/DocumentBean.java	Thu Apr 04 18:43:13 2013 +0200
+++ b/servlet/src/main/java/digilib/servlet/DocumentBean.java	Wed Apr 10 09:22:22 2013 +0200
@@ -200,7 +200,7 @@
 		DocuDirectory dd = dirCache.getDirectory(fn);
 		if (dd != null) {
 			// add pt
-			dlRequest.setValue("pt", dd.size());
+			dlRequest.setValue("pt", dd.size(FileClass.IMAGE));
 		}
 		// get original pixel size
 		ImageInput origfile = fileset.getBiggest();