extensions/net.sf.basedb.varsearch/trunk/src/net/sf/basedb/varsearch/servlet/InstallServlet.java

Code
Comments
Other
Rev Date Author Line
6161 04 Mar 21 nicklas 1 package net.sf.basedb.varsearch.servlet;
6161 04 Mar 21 nicklas 2
6161 04 Mar 21 nicklas 3 import java.io.IOException;
6161 04 Mar 21 nicklas 4 import java.util.ArrayList;
6161 04 Mar 21 nicklas 5 import java.util.Arrays;
6161 04 Mar 21 nicklas 6 import java.util.Collections;
6161 04 Mar 21 nicklas 7 import java.util.HashMap;
6161 04 Mar 21 nicklas 8 import java.util.List;
6161 04 Mar 21 nicklas 9 import java.util.Map;
6161 04 Mar 21 nicklas 10 import java.util.Set;
6161 04 Mar 21 nicklas 11
6161 04 Mar 21 nicklas 12 import javax.servlet.ServletException;
6161 04 Mar 21 nicklas 13 import javax.servlet.http.HttpServlet;
6161 04 Mar 21 nicklas 14 import javax.servlet.http.HttpServletRequest;
6161 04 Mar 21 nicklas 15 import javax.servlet.http.HttpServletResponse;
6161 04 Mar 21 nicklas 16
6161 04 Mar 21 nicklas 17 import org.json.simple.JSONArray;
6161 04 Mar 21 nicklas 18 import org.json.simple.JSONObject;
6161 04 Mar 21 nicklas 19
6161 04 Mar 21 nicklas 20 import net.sf.basedb.core.AnnotationType;
6161 04 Mar 21 nicklas 21 import net.sf.basedb.core.DataFileType;
6161 04 Mar 21 nicklas 22 import net.sf.basedb.core.DbControl;
6161 04 Mar 21 nicklas 23 import net.sf.basedb.core.Group;
6161 04 Mar 21 nicklas 24 import net.sf.basedb.core.Item;
6161 04 Mar 21 nicklas 25 import net.sf.basedb.core.ItemKey;
6161 04 Mar 21 nicklas 26 import net.sf.basedb.core.ItemList;
6543 18 Jan 22 nicklas 27 import net.sf.basedb.core.ItemNotFoundException;
6161 04 Mar 21 nicklas 28 import net.sf.basedb.core.MultiPermissions;
6161 04 Mar 21 nicklas 29 import net.sf.basedb.core.Permission;
6161 04 Mar 21 nicklas 30 import net.sf.basedb.core.Platform;
6161 04 Mar 21 nicklas 31 import net.sf.basedb.core.PlatformVariant;
6161 04 Mar 21 nicklas 32 import net.sf.basedb.core.Project;
6161 04 Mar 21 nicklas 33 import net.sf.basedb.core.ProjectKey;
6161 04 Mar 21 nicklas 34 import net.sf.basedb.core.SessionControl;
6161 04 Mar 21 nicklas 35 import net.sf.basedb.core.SharedItem;
6161 04 Mar 21 nicklas 36 import net.sf.basedb.core.SystemItems;
6161 04 Mar 21 nicklas 37 import net.sf.basedb.util.error.ThrowableUtil;
6161 04 Mar 21 nicklas 38 import net.sf.basedb.varsearch.JsonUtil;
6161 04 Mar 21 nicklas 39 import net.sf.basedb.varsearch.VarSearch;
6161 04 Mar 21 nicklas 40 import net.sf.basedb.varsearch.dao.Annotationtype;
6161 04 Mar 21 nicklas 41 import net.sf.basedb.varsearch.dao.Datafiletype;
6161 04 Mar 21 nicklas 42 import net.sf.basedb.varsearch.dao.Itemlist;
6161 04 Mar 21 nicklas 43 import net.sf.basedb.varsearch.dao.Rawdatatype;
6161 04 Mar 21 nicklas 44
6161 04 Mar 21 nicklas 45 /**
6161 04 Mar 21 nicklas 46   Servlet that verify and install items that are required by 
6161 04 Mar 21 nicklas 47   other Relax actions.
6161 04 Mar 21 nicklas 48   
6161 04 Mar 21 nicklas 49   @author nicklas
6161 04 Mar 21 nicklas 50   @since 1.0
6161 04 Mar 21 nicklas 51 */
6161 04 Mar 21 nicklas 52 public class InstallServlet 
6161 04 Mar 21 nicklas 53   extends HttpServlet 
6161 04 Mar 21 nicklas 54 {
6161 04 Mar 21 nicklas 55
6161 04 Mar 21 nicklas 56
6161 04 Mar 21 nicklas 57   private static final long serialVersionUID = -1102755485743652012L;
6161 04 Mar 21 nicklas 58
6161 04 Mar 21 nicklas 59   public InstallServlet()
6161 04 Mar 21 nicklas 60   {}
6161 04 Mar 21 nicklas 61
6161 04 Mar 21 nicklas 62   @Override
6161 04 Mar 21 nicklas 63   protected void doGet(HttpServletRequest req, HttpServletResponse resp)
6161 04 Mar 21 nicklas 64     throws ServletException, IOException 
6161 04 Mar 21 nicklas 65   {
6161 04 Mar 21 nicklas 66     String cmd = req.getParameter("cmd");
6161 04 Mar 21 nicklas 67     JsonUtil.setJsonResponseHeaders(resp);
6161 04 Mar 21 nicklas 68     
6161 04 Mar 21 nicklas 69     JSONObject json = new JSONObject();
6161 04 Mar 21 nicklas 70     json.put("status", "ok");
6161 04 Mar 21 nicklas 71   
6161 04 Mar 21 nicklas 72     final SessionControl sc = VarSearch.getSessionControl(req);
6161 04 Mar 21 nicklas 73     DbControl dc = null;
6161 04 Mar 21 nicklas 74     String progressId = null;
6161 04 Mar 21 nicklas 75     try
6161 04 Mar 21 nicklas 76     {
6161 04 Mar 21 nicklas 77       if ("Validate".equals(cmd) || "Install".equals(cmd))
6161 04 Mar 21 nicklas 78       {
6161 04 Mar 21 nicklas 79         VarSearch.checkIsAdmin(sc, "'" + cmd + "' wizard");
6161 04 Mar 21 nicklas 80
6161 04 Mar 21 nicklas 81         
6604 23 Feb 22 nicklas 82         dc = sc.newDbControl("Variant search: Installation wizard");
6161 04 Mar 21 nicklas 83         
6161 04 Mar 21 nicklas 84         boolean createIfMissing = "Install".equals(cmd);
6161 04 Mar 21 nicklas 85         JSONArray jsonChecks = new JSONArray();
6161 04 Mar 21 nicklas 86         
6161 04 Mar 21 nicklas 87         Group everyone = Group.getById(dc, SystemItems.getId(Group.EVERYONE));
6161 04 Mar 21 nicklas 88
6161 04 Mar 21 nicklas 89         // READ permission for the EVERYONE group
6161 04 Mar 21 nicklas 90         PermissionOptions everyoneRead = new PermissionOptions();
6161 04 Mar 21 nicklas 91         everyoneRead.set(everyone, Permission.READ);
6161 04 Mar 21 nicklas 92
6161 04 Mar 21 nicklas 93         PermissionOptions everyoneDenied = new PermissionOptions();
6161 04 Mar 21 nicklas 94         everyoneDenied.set(everyone, null);
6161 04 Mar 21 nicklas 95
6161 04 Mar 21 nicklas 96         // Annotation type checks
6161 04 Mar 21 nicklas 97         jsonChecks.add(checkAnnotationType(dc, Annotationtype.AUTO_PROCESSING, 
6161 04 Mar 21 nicklas 98           // List of current releases -- new ones are added automatically by the release importer
6161 04 Mar 21 nicklas 99           new ValueOptions("Disable"), 
6161 04 Mar 21 nicklas 100           createIfMissing));
6161 04 Mar 21 nicklas 101
6161 04 Mar 21 nicklas 102         // Platform
6161 04 Mar 21 nicklas 103         jsonChecks.add(checkPlatform(dc, Rawdatatype.VARIANT_CALL, createIfMissing));
6543 18 Jan 22 nicklas 104         jsonChecks.add(checkPlatform(dc, Rawdatatype.ONCOARRAY500K, createIfMissing));
6161 04 Mar 21 nicklas 105
6161 04 Mar 21 nicklas 106         // Data file types
6161 04 Mar 21 nicklas 107         jsonChecks.add(checkDataFileType(dc, Datafiletype.VCF, createIfMissing));
6543 18 Jan 22 nicklas 108         jsonChecks.add(checkDataFileType(dc, Datafiletype.VCF_DESIGN, createIfMissing));
6161 04 Mar 21 nicklas 109
6161 04 Mar 21 nicklas 110         // Item lists
6161 04 Mar 21 nicklas 111         jsonChecks.add(checkItemList(dc, Itemlist.VARIANT_INDEX_FILTERED, true, null, createIfMissing));
6161 04 Mar 21 nicklas 112         jsonChecks.add(checkItemList(dc, Itemlist.VARIANT_INDEX_ALL, true, null, createIfMissing));
6371 07 Sep 21 nicklas 113         jsonChecks.add(checkItemList(dc, Itemlist.VARIANT_INDEX_TARGETED, true, null, createIfMissing));
6539 17 Jan 22 nicklas 114         jsonChecks.add(checkItemList(dc, Itemlist.GENOTYPING_ONCOARRAY_500K, true, null, createIfMissing));
6161 04 Mar 21 nicklas 115         
6161 04 Mar 21 nicklas 116         json.put("checks", jsonChecks);
6161 04 Mar 21 nicklas 117         
6161 04 Mar 21 nicklas 118         if (createIfMissing) 
6161 04 Mar 21 nicklas 119         {
6161 04 Mar 21 nicklas 120           dc.commit();
6161 04 Mar 21 nicklas 121         }
6161 04 Mar 21 nicklas 122       }
6161 04 Mar 21 nicklas 123     }
6161 04 Mar 21 nicklas 124     catch (Throwable t)
6161 04 Mar 21 nicklas 125     {
6161 04 Mar 21 nicklas 126       t.printStackTrace();
6161 04 Mar 21 nicklas 127       json.clear();
6161 04 Mar 21 nicklas 128       json.put("status", "error");
6161 04 Mar 21 nicklas 129       json.put("message", t.getMessage());
6161 04 Mar 21 nicklas 130       json.put("stacktrace", ThrowableUtil.stackTraceToString(t));
6161 04 Mar 21 nicklas 131     }
6161 04 Mar 21 nicklas 132     finally
6161 04 Mar 21 nicklas 133     {
6161 04 Mar 21 nicklas 134       if (dc != null) dc.close();
6161 04 Mar 21 nicklas 135       if (sc != null && progressId != null) sc.setSessionSetting(progressId, null);
6161 04 Mar 21 nicklas 136       json.writeJSONString(resp.getWriter());
6161 04 Mar 21 nicklas 137     }
6161 04 Mar 21 nicklas 138   }
6161 04 Mar 21 nicklas 139   
6161 04 Mar 21 nicklas 140
6161 04 Mar 21 nicklas 141
6161 04 Mar 21 nicklas 142
6161 04 Mar 21 nicklas 143   /**
6161 04 Mar 21 nicklas 144     Creates an annotation type with the given options. The annotation
6161 04 Mar 21 nicklas 145     type is created in a separate transaction. The annotation can be enabled for 
6161 04 Mar 21 nicklas 146     one or more item-types.
6161 04 Mar 21 nicklas 147   */
6161 04 Mar 21 nicklas 148   public AnnotationType createAnnotationType(SessionControl sc, Annotationtype annotationType, 
6161 04 Mar 21 nicklas 149     ValueOptions valueOptions, PermissionOptions... permissions)
6161 04 Mar 21 nicklas 150   {
6161 04 Mar 21 nicklas 151     AnnotationType at = null;
6604 23 Feb 22 nicklas 152     DbControl dc = sc.newDbControl("Variant search: Installation wizard");
6161 04 Mar 21 nicklas 153     try
6161 04 Mar 21 nicklas 154     {
6161 04 Mar 21 nicklas 155       at = AnnotationType.getNew(dc, annotationType.getValueType());
6161 04 Mar 21 nicklas 156       at.setName(annotationType.getName());
6161 04 Mar 21 nicklas 157       for (Item it : annotationType.getMainType())
6161 04 Mar 21 nicklas 158       {
6161 04 Mar 21 nicklas 159         at.enableForItem(it);
6161 04 Mar 21 nicklas 160       }
6161 04 Mar 21 nicklas 161       at.setMultiplicity(1);
6161 04 Mar 21 nicklas 162       if (valueOptions != null)
6161 04 Mar 21 nicklas 163       {
6161 04 Mar 21 nicklas 164         if (valueOptions.isEnumeration())
6161 04 Mar 21 nicklas 165         {
6161 04 Mar 21 nicklas 166           at.setEnumeration(true);
6161 04 Mar 21 nicklas 167           at.setDisplayAsList(false);
6161 04 Mar 21 nicklas 168           at.setValues(valueOptions.getList());
6161 04 Mar 21 nicklas 169         }
6161 04 Mar 21 nicklas 170       }
6161 04 Mar 21 nicklas 171       if (permissions != null) 
6161 04 Mar 21 nicklas 172       {
6161 04 Mar 21 nicklas 173         for (PermissionOptions p : permissions)
6161 04 Mar 21 nicklas 174         {
6161 04 Mar 21 nicklas 175           p.applyPermissions(at);
6161 04 Mar 21 nicklas 176         }
6161 04 Mar 21 nicklas 177       }
6161 04 Mar 21 nicklas 178       dc.saveItem(at);
6161 04 Mar 21 nicklas 179       dc.commit();
6161 04 Mar 21 nicklas 180     }
6161 04 Mar 21 nicklas 181     finally
6161 04 Mar 21 nicklas 182     {
6161 04 Mar 21 nicklas 183       if (dc != null) dc.close();
6161 04 Mar 21 nicklas 184     }
6161 04 Mar 21 nicklas 185     return at;
6161 04 Mar 21 nicklas 186   }
6161 04 Mar 21 nicklas 187   
6161 04 Mar 21 nicklas 188   /**
6161 04 Mar 21 nicklas 189     Check for an existing annotation type with the given options. A JSONObject is returned
6161 04 Mar 21 nicklas 190     with the result. The following keys are used:
6161 04 Mar 21 nicklas 191     <ul>
6161 04 Mar 21 nicklas 192     <li>itemType: ANNOTATIONTYPE
6161 04 Mar 21 nicklas 193     <li>name: The name of the annotation type
6161 04 Mar 21 nicklas 194     <li>id: The id of the annotation type if it exists
6161 04 Mar 21 nicklas 195     <li>status: ok, error, or missing
6161 04 Mar 21 nicklas 196     <li>message: A descriptive message in case of an error
6161 04 Mar 21 nicklas 197     </ul>
6161 04 Mar 21 nicklas 198   */
6161 04 Mar 21 nicklas 199   public JSONObject checkAnnotationType(DbControl dc, Annotationtype annotationType, 
6161 04 Mar 21 nicklas 200       ValueOptions valueOptions, boolean createIfMissing, PermissionOptions... permissions)
6161 04 Mar 21 nicklas 201   {
6161 04 Mar 21 nicklas 202     JSONObject json = new JSONObject();
6161 04 Mar 21 nicklas 203     JSONArray jsonMessages = new JSONArray();
6161 04 Mar 21 nicklas 204     json.put("itemType", Item.ANNOTATIONTYPE.name());
6161 04 Mar 21 nicklas 205     json.put("name", annotationType.getName());
6161 04 Mar 21 nicklas 206     
6161 04 Mar 21 nicklas 207     List<AnnotationType> result = annotationType.list(dc);
6161 04 Mar 21 nicklas 208     if (result.size() == 0)
6161 04 Mar 21 nicklas 209     {
6161 04 Mar 21 nicklas 210       if (createIfMissing)
6161 04 Mar 21 nicklas 211       {
6161 04 Mar 21 nicklas 212         AnnotationType at = createAnnotationType(dc.getSessionControl(), annotationType, valueOptions, permissions);
6161 04 Mar 21 nicklas 213         json.put("id", at.getId());
6161 04 Mar 21 nicklas 214         json.put("status", "ok");
6161 04 Mar 21 nicklas 215         jsonMessages.add("Created");
6161 04 Mar 21 nicklas 216       }
6161 04 Mar 21 nicklas 217       else
6161 04 Mar 21 nicklas 218       {
6161 04 Mar 21 nicklas 219         json.put("status", "missing");
6161 04 Mar 21 nicklas 220         jsonMessages.add("Not found");
6161 04 Mar 21 nicklas 221       }
6161 04 Mar 21 nicklas 222     }
6161 04 Mar 21 nicklas 223     else if (result.size() > 1)
6161 04 Mar 21 nicklas 224     {
6161 04 Mar 21 nicklas 225       json.put("status", "error");
6161 04 Mar 21 nicklas 226       jsonMessages.add("Found > 1 annotation type");
6161 04 Mar 21 nicklas 227     }
6161 04 Mar 21 nicklas 228     else
6161 04 Mar 21 nicklas 229     {
6161 04 Mar 21 nicklas 230       AnnotationType at = result.get(0);
6161 04 Mar 21 nicklas 231       json.put("id", at.getId());
6161 04 Mar 21 nicklas 232       json.put("status", "ok");// For now -- more checks below
6161 04 Mar 21 nicklas 233       if (permissions != null)
6161 04 Mar 21 nicklas 234       {
6161 04 Mar 21 nicklas 235         String permissionCheck = null;
6161 04 Mar 21 nicklas 236         for (PermissionOptions p : permissions)
6161 04 Mar 21 nicklas 237         {
6161 04 Mar 21 nicklas 238           if (!p.checkPermissions(at))
6161 04 Mar 21 nicklas 239           {
6161 04 Mar 21 nicklas 240             permissionCheck = p.getMessage();
6161 04 Mar 21 nicklas 241             break;
6161 04 Mar 21 nicklas 242           }
6161 04 Mar 21 nicklas 243         }
6161 04 Mar 21 nicklas 244         
6161 04 Mar 21 nicklas 245         if (permissionCheck != null)
6161 04 Mar 21 nicklas 246         {
6161 04 Mar 21 nicklas 247           if (createIfMissing)
6161 04 Mar 21 nicklas 248           {
6161 04 Mar 21 nicklas 249             for (PermissionOptions p : permissions)
6161 04 Mar 21 nicklas 250             {
6161 04 Mar 21 nicklas 251               p.applyPermissions(at);
6161 04 Mar 21 nicklas 252             }
6161 04 Mar 21 nicklas 253             if (jsonMessages.size() == 0) jsonMessages.add("Fixed");
6161 04 Mar 21 nicklas 254           }
6161 04 Mar 21 nicklas 255           else
6161 04 Mar 21 nicklas 256           {
6161 04 Mar 21 nicklas 257             json.put("status", "incomplete");
6161 04 Mar 21 nicklas 258             jsonMessages.add(permissionCheck);
6161 04 Mar 21 nicklas 259           }
6161 04 Mar 21 nicklas 260         }
6161 04 Mar 21 nicklas 261       }
6161 04 Mar 21 nicklas 262       boolean allTypesOk = true;
6161 04 Mar 21 nicklas 263       boolean fixedTypes = false;
6161 04 Mar 21 nicklas 264       for (Item it : annotationType.getMainType())
6161 04 Mar 21 nicklas 265       {
6161 04 Mar 21 nicklas 266         if (!at.isEnabledForItem(it))
6161 04 Mar 21 nicklas 267         {
6161 04 Mar 21 nicklas 268           allTypesOk = false;
6161 04 Mar 21 nicklas 269           if (createIfMissing)
6161 04 Mar 21 nicklas 270           {
6161 04 Mar 21 nicklas 271             at.enableForItem(it);
6161 04 Mar 21 nicklas 272             fixedTypes = true;
6161 04 Mar 21 nicklas 273           }
6161 04 Mar 21 nicklas 274           else
6161 04 Mar 21 nicklas 275           {
6161 04 Mar 21 nicklas 276             json.put("status", "incomplete");
6161 04 Mar 21 nicklas 277             jsonMessages.add("Not enabled for " + it.name());
6161 04 Mar 21 nicklas 278           }
6161 04 Mar 21 nicklas 279         }
6161 04 Mar 21 nicklas 280       }
6161 04 Mar 21 nicklas 281       if (fixedTypes && jsonMessages.size() == 0) jsonMessages.add("Fixed");
6161 04 Mar 21 nicklas 282       if (at.getValueType() != annotationType.getValueType())
6161 04 Mar 21 nicklas 283       {
6161 04 Mar 21 nicklas 284         json.put("status", "error");
6161 04 Mar 21 nicklas 285         jsonMessages.add("Is not a " + annotationType.getValueType().name() + " type");
6161 04 Mar 21 nicklas 286       }
6161 04 Mar 21 nicklas 287       if (at.getMultiplicity() != 1)
6161 04 Mar 21 nicklas 288       {
6161 04 Mar 21 nicklas 289         json.put("status", "error");
6161 04 Mar 21 nicklas 290         jsonMessages.add("Should have multiplicity=1");
6161 04 Mar 21 nicklas 291       }
6161 04 Mar 21 nicklas 292       if (at.isEnumeration() && (valueOptions == null || !valueOptions.isEnumeration()))
6161 04 Mar 21 nicklas 293       {
6161 04 Mar 21 nicklas 294         json.put("status", "error");
6161 04 Mar 21 nicklas 295         jsonMessages.add("Should not be an enumeration");
6161 04 Mar 21 nicklas 296       }
6161 04 Mar 21 nicklas 297       if (valueOptions != null)
6161 04 Mar 21 nicklas 298       {
6161 04 Mar 21 nicklas 299         if (valueOptions.isEnumeration())
6161 04 Mar 21 nicklas 300         {
6161 04 Mar 21 nicklas 301           if (!at.isEnumeration())
6161 04 Mar 21 nicklas 302           {
6161 04 Mar 21 nicklas 303             json.put("status", "error");
6161 04 Mar 21 nicklas 304             jsonMessages.add("Is not enumeration of: " + valueOptions.getList());
6161 04 Mar 21 nicklas 305           }
6161 04 Mar 21 nicklas 306           else if (!at.getValues().containsAll(valueOptions.getList()))
6161 04 Mar 21 nicklas 307           {
6161 04 Mar 21 nicklas 308             if (createIfMissing)
6161 04 Mar 21 nicklas 309             {
6161 04 Mar 21 nicklas 310               valueOptions.applyEnumeration(at);
6161 04 Mar 21 nicklas 311               if (jsonMessages.size() == 0) jsonMessages.add("Fixed");
6161 04 Mar 21 nicklas 312             }
6161 04 Mar 21 nicklas 313             else
6161 04 Mar 21 nicklas 314             {
6161 04 Mar 21 nicklas 315               json.put("status", "incomplete");
6161 04 Mar 21 nicklas 316               jsonMessages.add("Doesn't have all options: " + valueOptions.getList() + "!=" + at.getValues());
6161 04 Mar 21 nicklas 317             }
6161 04 Mar 21 nicklas 318           }
6161 04 Mar 21 nicklas 319         }
6161 04 Mar 21 nicklas 320       }
6161 04 Mar 21 nicklas 321     }
6161 04 Mar 21 nicklas 322     if (jsonMessages.size() == 0) jsonMessages.add("Ok");
6161 04 Mar 21 nicklas 323     json.put("messages", jsonMessages);
6161 04 Mar 21 nicklas 324     return json;
6161 04 Mar 21 nicklas 325   }
6161 04 Mar 21 nicklas 326
6161 04 Mar 21 nicklas 327   /**
6161 04 Mar 21 nicklas 328     Create an item list with the given options. The list is created in
6161 04 Mar 21 nicklas 329     a separate transaction.
6161 04 Mar 21 nicklas 330   */
6161 04 Mar 21 nicklas 331   public ItemList createItemList(SessionControl sc, Itemlist def, PermissionOptions permissions)
6161 04 Mar 21 nicklas 332   {
6161 04 Mar 21 nicklas 333     ItemList list = null;
6604 23 Feb 22 nicklas 334     DbControl dc = sc.newDbControl("Variant search: Installation wizard");
6161 04 Mar 21 nicklas 335     try
6161 04 Mar 21 nicklas 336     {
6161 04 Mar 21 nicklas 337       list = ItemList.getNew(dc, def.getItemType());
6161 04 Mar 21 nicklas 338       list.setName(def.getName());
6161 04 Mar 21 nicklas 339       list.setExternalId(def.getExternalId());
6161 04 Mar 21 nicklas 340       if (def.getRawdatatype() != null)
6161 04 Mar 21 nicklas 341       {
6161 04 Mar 21 nicklas 342         list.setRawDataType(def.getRawdatatype().getRawDataType());
6161 04 Mar 21 nicklas 343       }
6161 04 Mar 21 nicklas 344       list.setDescription(def.getDescription());
6161 04 Mar 21 nicklas 345       if (permissions != null) permissions.applyPermissions(list);
6161 04 Mar 21 nicklas 346       
6161 04 Mar 21 nicklas 347       dc.saveItem(list);
6161 04 Mar 21 nicklas 348       dc.commit();
6161 04 Mar 21 nicklas 349     }
6161 04 Mar 21 nicklas 350     finally
6161 04 Mar 21 nicklas 351     {
6161 04 Mar 21 nicklas 352       if (dc != null) dc.close();
6161 04 Mar 21 nicklas 353     }
6161 04 Mar 21 nicklas 354     return list;
6161 04 Mar 21 nicklas 355   }
6161 04 Mar 21 nicklas 356   
6161 04 Mar 21 nicklas 357   
6161 04 Mar 21 nicklas 358   /**
6161 04 Mar 21 nicklas 359     Check for an existing item list with the given options.
6161 04 Mar 21 nicklas 360     A JSONObject is returned with the result. The following 
6161 04 Mar 21 nicklas 361     keys are used:
6161 04 Mar 21 nicklas 362     <ul>
6161 04 Mar 21 nicklas 363     <li>itemType: ITEMLIST
6161 04 Mar 21 nicklas 364     <li>name: The name of the biomaterial list
6161 04 Mar 21 nicklas 365     <li>id: The id of the biomaterial list if it exists
6161 04 Mar 21 nicklas 366     <li>itemType: The item type that can be stored in the list
6161 04 Mar 21 nicklas 367     <li>status: ok, error, or missing
6161 04 Mar 21 nicklas 368     <li>message: A descriptive message in case of an error
6161 04 Mar 21 nicklas 369     </ul>
6161 04 Mar 21 nicklas 370   */
6161 04 Mar 21 nicklas 371   public JSONObject checkItemList(DbControl dc, Itemlist list, boolean checkAutoProcessing,
6161 04 Mar 21 nicklas 372     PermissionOptions permissions, boolean createIfMissing)
6161 04 Mar 21 nicklas 373   {
6161 04 Mar 21 nicklas 374   
6161 04 Mar 21 nicklas 375     JSONObject json = new JSONObject();
6161 04 Mar 21 nicklas 376     JSONArray jsonMessages = new JSONArray();
6161 04 Mar 21 nicklas 377     json.put("itemType", Item.ITEMLIST.name());
6161 04 Mar 21 nicklas 378     json.put("name", list.getName());
6161 04 Mar 21 nicklas 379     json.put("memberType", list.getItemType().name());
6161 04 Mar 21 nicklas 380     
6161 04 Mar 21 nicklas 381     List<ItemList> result = list.list(dc);
6161 04 Mar 21 nicklas 382     if (result.size() == 0)
6161 04 Mar 21 nicklas 383     {
6161 04 Mar 21 nicklas 384       if (createIfMissing)
6161 04 Mar 21 nicklas 385       {
6161 04 Mar 21 nicklas 386         ItemList l = createItemList(dc.getSessionControl(), list, permissions);
6161 04 Mar 21 nicklas 387         json.put("id", l.getId());
6161 04 Mar 21 nicklas 388         json.put("status", "ok");
6161 04 Mar 21 nicklas 389         jsonMessages.add("Created");
6161 04 Mar 21 nicklas 390       }
6161 04 Mar 21 nicklas 391       else
6161 04 Mar 21 nicklas 392       {
6161 04 Mar 21 nicklas 393         json.put("status", "missing");
6161 04 Mar 21 nicklas 394         jsonMessages.add("Not found");
6161 04 Mar 21 nicklas 395       }
6161 04 Mar 21 nicklas 396     }
6161 04 Mar 21 nicklas 397     else if (result.size() > 1)
6161 04 Mar 21 nicklas 398     {
6161 04 Mar 21 nicklas 399       json.put("status", "error");
6161 04 Mar 21 nicklas 400       jsonMessages.add("Found > 1 item list");
6161 04 Mar 21 nicklas 401     }
6161 04 Mar 21 nicklas 402     else
6161 04 Mar 21 nicklas 403     {
6161 04 Mar 21 nicklas 404       ItemList l = result.get(0);
6161 04 Mar 21 nicklas 405       json.put("id", l.getId());
6161 04 Mar 21 nicklas 406       json.put("status", "ok"); // For now -- more checks below
6161 04 Mar 21 nicklas 407       
6161 04 Mar 21 nicklas 408       if (l.getMemberType() != list.getItemType())
6161 04 Mar 21 nicklas 409       {
6161 04 Mar 21 nicklas 410         json.put("status", "error");
6161 04 Mar 21 nicklas 411         jsonMessages.add("Can't be used by '" + list.getItemType() + "' items.");
6161 04 Mar 21 nicklas 412       }
6161 04 Mar 21 nicklas 413       
6161 04 Mar 21 nicklas 414       if (checkAutoProcessing)
6161 04 Mar 21 nicklas 415       {
6161 04 Mar 21 nicklas 416         AnnotationType autoProc = Annotationtype.AUTO_PROCESSING.get(dc);
6161 04 Mar 21 nicklas 417         if (autoProc != null)
6161 04 Mar 21 nicklas 418         {
6161 04 Mar 21 nicklas 419           boolean disabled = "Disable".equals(Annotationtype.AUTO_PROCESSING.getAnnotationValue(dc, l));
6161 04 Mar 21 nicklas 420           if (disabled)
6161 04 Mar 21 nicklas 421           {
6161 04 Mar 21 nicklas 422             json.put("status", "warning");
6161 04 Mar 21 nicklas 423             jsonMessages.add("Auto-processing is disabled. It can be enabled by clearing the AutoProcessing annotation.");
6161 04 Mar 21 nicklas 424           }
6161 04 Mar 21 nicklas 425         }
6161 04 Mar 21 nicklas 426       }
6161 04 Mar 21 nicklas 427             
6161 04 Mar 21 nicklas 428       Rawdatatype subtype = list.getRawdatatype();
6161 04 Mar 21 nicklas 429       if (subtype != null)
6161 04 Mar 21 nicklas 430       {
6161 04 Mar 21 nicklas 431         if (!subtype.getRawDataType().equals(l.getRawDataType()))
6161 04 Mar 21 nicklas 432         {
6161 04 Mar 21 nicklas 433           if (createIfMissing)
6161 04 Mar 21 nicklas 434           {
6161 04 Mar 21 nicklas 435             l.setRawDataType(subtype.getRawDataType());
6161 04 Mar 21 nicklas 436             jsonMessages.add("Fixed");
6161 04 Mar 21 nicklas 437           }
6161 04 Mar 21 nicklas 438           else
6161 04 Mar 21 nicklas 439           {
6161 04 Mar 21 nicklas 440             json.put("status", "incomplete");
6161 04 Mar 21 nicklas 441             jsonMessages.add("Raw data type should be '" + subtype.getName() + "'");
6161 04 Mar 21 nicklas 442           }
6161 04 Mar 21 nicklas 443         }
6161 04 Mar 21 nicklas 444       }
6161 04 Mar 21 nicklas 445       
6161 04 Mar 21 nicklas 446       if (permissions != null && !permissions.checkPermissions(l))
6161 04 Mar 21 nicklas 447       {
6161 04 Mar 21 nicklas 448         if (createIfMissing)
6161 04 Mar 21 nicklas 449         {
6161 04 Mar 21 nicklas 450           permissions.applyPermissions(l);
6161 04 Mar 21 nicklas 451           if (jsonMessages.size() == 0) jsonMessages.add("Fixed");
6161 04 Mar 21 nicklas 452         }
6161 04 Mar 21 nicklas 453         else
6161 04 Mar 21 nicklas 454         {
6161 04 Mar 21 nicklas 455           json.put("status", "incomplete");
6161 04 Mar 21 nicklas 456           jsonMessages.add(permissions.getMessage());
6161 04 Mar 21 nicklas 457         }
6161 04 Mar 21 nicklas 458       }
6161 04 Mar 21 nicklas 459   
6161 04 Mar 21 nicklas 460     }
6161 04 Mar 21 nicklas 461     if (jsonMessages.size() == 0) jsonMessages.add("Ok");
6161 04 Mar 21 nicklas 462     json.put("messages", jsonMessages);
6161 04 Mar 21 nicklas 463     return json;
6161 04 Mar 21 nicklas 464   }
6161 04 Mar 21 nicklas 465
6161 04 Mar 21 nicklas 466
6161 04 Mar 21 nicklas 467   
6161 04 Mar 21 nicklas 468   /**
6161 04 Mar 21 nicklas 469     Create a platform variant with the given options. The platform is created in
6161 04 Mar 21 nicklas 470     a separate transaction.
6161 04 Mar 21 nicklas 471     @since 1.2
6161 04 Mar 21 nicklas 472   */
6161 04 Mar 21 nicklas 473   public PlatformVariant createPlatform(SessionControl sc, Rawdatatype rawType)
6161 04 Mar 21 nicklas 474   {
6161 04 Mar 21 nicklas 475     PlatformVariant pv = null;
6543 18 Jan 22 nicklas 476     Platform p = null;
6604 23 Feb 22 nicklas 477     DbControl dc = sc.newDbControl("Variant search: Installation wizard");
6161 04 Mar 21 nicklas 478     try
6161 04 Mar 21 nicklas 479     {
6543 18 Jan 22 nicklas 480       try
6543 18 Jan 22 nicklas 481       {
6543 18 Jan 22 nicklas 482         p = rawType.getPlatform(dc);
6543 18 Jan 22 nicklas 483       }
6543 18 Jan 22 nicklas 484       catch (ItemNotFoundException ex)
6543 18 Jan 22 nicklas 485       {
6543 18 Jan 22 nicklas 486         p = Platform.getNew(dc, rawType.getPlatformId(), 1);
6543 18 Jan 22 nicklas 487         p.setName(rawType.getPlatformName());
6543 18 Jan 22 nicklas 488         dc.saveItem(p);
6543 18 Jan 22 nicklas 489       }
6161 04 Mar 21 nicklas 490       pv = PlatformVariant.getNew(dc, p, rawType.getVariantId(), 1);
6161 04 Mar 21 nicklas 491       pv.setName(rawType.getName());
6161 04 Mar 21 nicklas 492       dc.saveItem(pv);
6161 04 Mar 21 nicklas 493       dc.commit();
6161 04 Mar 21 nicklas 494     }
6161 04 Mar 21 nicklas 495     finally
6161 04 Mar 21 nicklas 496     {
6161 04 Mar 21 nicklas 497       if (dc != null) dc.close();
6161 04 Mar 21 nicklas 498     }
6161 04 Mar 21 nicklas 499     return pv;
6161 04 Mar 21 nicklas 500   }
6161 04 Mar 21 nicklas 501   
6161 04 Mar 21 nicklas 502   /**
6161 04 Mar 21 nicklas 503     Check for an existing platform (variant) with the given options.
6161 04 Mar 21 nicklas 504     A JSONObject is returned with the result. The following 
6161 04 Mar 21 nicklas 505     keys are used:
6161 04 Mar 21 nicklas 506     <ul>
6161 04 Mar 21 nicklas 507     <li>itemType: PLATFORMVARIANT
6161 04 Mar 21 nicklas 508     <li>name: The name of the platform variant
6161 04 Mar 21 nicklas 509     <li>id: The id of the platform variant if it exists
6161 04 Mar 21 nicklas 510     <li>status: ok, error, or missing
6161 04 Mar 21 nicklas 511     <li>message: A descriptive message in case of an error
6161 04 Mar 21 nicklas 512     </ul>
6161 04 Mar 21 nicklas 513     @since 1.2
6161 04 Mar 21 nicklas 514   */
6161 04 Mar 21 nicklas 515   public JSONObject checkPlatform(DbControl dc, Rawdatatype rawType, 
6161 04 Mar 21 nicklas 516     boolean createIfMissing)
6161 04 Mar 21 nicklas 517   {
6161 04 Mar 21 nicklas 518   
6161 04 Mar 21 nicklas 519     JSONObject json = new JSONObject();
6161 04 Mar 21 nicklas 520     JSONArray jsonMessages = new JSONArray();
6161 04 Mar 21 nicklas 521     json.put("itemType", Item.PLATFORMVARIANT.name());
6161 04 Mar 21 nicklas 522     json.put("name", rawType.getName());
6161 04 Mar 21 nicklas 523     
6161 04 Mar 21 nicklas 524     List<PlatformVariant> result = rawType.list(dc);
6161 04 Mar 21 nicklas 525     if (result.size() == 0)
6161 04 Mar 21 nicklas 526     {
6161 04 Mar 21 nicklas 527       if (createIfMissing)
6161 04 Mar 21 nicklas 528       {
6161 04 Mar 21 nicklas 529         PlatformVariant pv = createPlatform(dc.getSessionControl(), rawType);
6161 04 Mar 21 nicklas 530         json.put("id", pv.getId());
6161 04 Mar 21 nicklas 531         json.put("status", "ok");
6161 04 Mar 21 nicklas 532         jsonMessages.add("Created");
6161 04 Mar 21 nicklas 533       }
6161 04 Mar 21 nicklas 534       else
6161 04 Mar 21 nicklas 535       {
6161 04 Mar 21 nicklas 536         json.put("status", "missing");
6161 04 Mar 21 nicklas 537         jsonMessages.add("Not found");
6161 04 Mar 21 nicklas 538       }
6161 04 Mar 21 nicklas 539     }
6161 04 Mar 21 nicklas 540     else if (result.size() > 1)
6161 04 Mar 21 nicklas 541     {
6161 04 Mar 21 nicklas 542       json.put("status", "error");
6161 04 Mar 21 nicklas 543       jsonMessages.add("Found > 1 platform");
6161 04 Mar 21 nicklas 544     }
6161 04 Mar 21 nicklas 545     else
6161 04 Mar 21 nicklas 546     {
6161 04 Mar 21 nicklas 547       PlatformVariant pv = result.get(0);
6161 04 Mar 21 nicklas 548       Platform p = pv.getPlatform();
6161 04 Mar 21 nicklas 549       json.put("id", pv.getId());
6161 04 Mar 21 nicklas 550       json.put("status", "ok"); // For now -- more checks below
6161 04 Mar 21 nicklas 551       
6161 04 Mar 21 nicklas 552       if (!pv.getExternalId().equals(rawType.getVariantId()))
6161 04 Mar 21 nicklas 553       {
6161 04 Mar 21 nicklas 554         json.put("status", "error");
6161 04 Mar 21 nicklas 555         jsonMessages.add("Should have '" + rawType.getVariantId() + "' as external id.");
6161 04 Mar 21 nicklas 556       }
6161 04 Mar 21 nicklas 557     }
6161 04 Mar 21 nicklas 558     
6161 04 Mar 21 nicklas 559     if (jsonMessages.size() == 0) jsonMessages.add("Ok");
6161 04 Mar 21 nicklas 560     json.put("messages", jsonMessages);
6161 04 Mar 21 nicklas 561     return json;
6161 04 Mar 21 nicklas 562   
6161 04 Mar 21 nicklas 563   }
6161 04 Mar 21 nicklas 564
6161 04 Mar 21 nicklas 565   /**
6161 04 Mar 21 nicklas 566     Create a data file type with the given options. The type is created in
6161 04 Mar 21 nicklas 567     a separate transaction.
6161 04 Mar 21 nicklas 568     @since 2.16
6161 04 Mar 21 nicklas 569   */
6161 04 Mar 21 nicklas 570   public DataFileType createDataFileType(SessionControl sc, Datafiletype def)
6161 04 Mar 21 nicklas 571   {
6161 04 Mar 21 nicklas 572     DataFileType type = null;
6604 23 Feb 22 nicklas 573     DbControl dc = sc.newDbControl("Variant search: Installation wizard");
6161 04 Mar 21 nicklas 574     try
6161 04 Mar 21 nicklas 575     {
6161 04 Mar 21 nicklas 576       type = DataFileType.getNew(dc, def.getExternalId(), def.getItemType());
6161 04 Mar 21 nicklas 577       type.setName(def.getName());
6161 04 Mar 21 nicklas 578       dc.saveItem(type);
6161 04 Mar 21 nicklas 579       dc.commit();
6161 04 Mar 21 nicklas 580     }
6161 04 Mar 21 nicklas 581     finally
6161 04 Mar 21 nicklas 582     {
6161 04 Mar 21 nicklas 583       if (dc != null) dc.close();
6161 04 Mar 21 nicklas 584     }
6161 04 Mar 21 nicklas 585     return type;
6161 04 Mar 21 nicklas 586   }
6161 04 Mar 21 nicklas 587   
6161 04 Mar 21 nicklas 588   
6161 04 Mar 21 nicklas 589   /**
6161 04 Mar 21 nicklas 590     Check for an existing data file type with the given options.
6161 04 Mar 21 nicklas 591     A JSONObject is returned with the result. The following 
6161 04 Mar 21 nicklas 592     keys are used:
6161 04 Mar 21 nicklas 593     <ul>
6161 04 Mar 21 nicklas 594     <li>itemType: DATAFILETYPE
6161 04 Mar 21 nicklas 595     <li>name: The name of the file type
6161 04 Mar 21 nicklas 596     <li>id: The id of the file type if it exists
6161 04 Mar 21 nicklas 597     <li>status: ok, error, or missing
6161 04 Mar 21 nicklas 598     <li>message: A descriptive message in case of an error
6161 04 Mar 21 nicklas 599     </ul>
6161 04 Mar 21 nicklas 600     @since 2.16
6161 04 Mar 21 nicklas 601   */
6161 04 Mar 21 nicklas 602   public JSONObject checkDataFileType(DbControl dc, Datafiletype fileType, 
6161 04 Mar 21 nicklas 603     boolean createIfMissing)
6161 04 Mar 21 nicklas 604   {
6161 04 Mar 21 nicklas 605   
6161 04 Mar 21 nicklas 606     JSONObject json = new JSONObject();
6161 04 Mar 21 nicklas 607     JSONArray jsonMessages = new JSONArray();
6161 04 Mar 21 nicklas 608     json.put("itemType", Item.DATAFILETYPE.name());
6161 04 Mar 21 nicklas 609     json.put("name", fileType.getName());
6161 04 Mar 21 nicklas 610     
6161 04 Mar 21 nicklas 611     List<DataFileType> result = fileType.list(dc);
6161 04 Mar 21 nicklas 612     if (result.size() == 0)
6161 04 Mar 21 nicklas 613     {
6161 04 Mar 21 nicklas 614       if (createIfMissing)
6161 04 Mar 21 nicklas 615       {
6161 04 Mar 21 nicklas 616         DataFileType type = createDataFileType(dc.getSessionControl(), fileType);
6161 04 Mar 21 nicklas 617         json.put("id", type.getId());
6161 04 Mar 21 nicklas 618         json.put("status", "ok");
6161 04 Mar 21 nicklas 619         jsonMessages.add("Created");
6161 04 Mar 21 nicklas 620       }
6161 04 Mar 21 nicklas 621       else
6161 04 Mar 21 nicklas 622       {
6161 04 Mar 21 nicklas 623         json.put("status", "missing");
6161 04 Mar 21 nicklas 624         jsonMessages.add("Not found");
6161 04 Mar 21 nicklas 625       }
6161 04 Mar 21 nicklas 626     }
6161 04 Mar 21 nicklas 627     else if (result.size() > 1)
6161 04 Mar 21 nicklas 628     {
6161 04 Mar 21 nicklas 629       json.put("status", "error");
6161 04 Mar 21 nicklas 630       jsonMessages.add("Found > 1 data file type");
6161 04 Mar 21 nicklas 631     }
6161 04 Mar 21 nicklas 632     else
6161 04 Mar 21 nicklas 633     {
6161 04 Mar 21 nicklas 634       DataFileType ft = result.get(0);
6161 04 Mar 21 nicklas 635       json.put("id", ft.getId());
6161 04 Mar 21 nicklas 636       json.put("status", "ok"); // For now -- more checks below
6161 04 Mar 21 nicklas 637       
6161 04 Mar 21 nicklas 638       if (!ft.getExternalId().equals(fileType.getExternalId()))
6161 04 Mar 21 nicklas 639       {
6161 04 Mar 21 nicklas 640         json.put("status", "error");
6161 04 Mar 21 nicklas 641         jsonMessages.add("Should have '" + fileType.getExternalId() + "' as external id.");
6161 04 Mar 21 nicklas 642       }
6161 04 Mar 21 nicklas 643       
6161 04 Mar 21 nicklas 644       if (!ft.getItemType().equals(fileType.getItemType()))
6161 04 Mar 21 nicklas 645       {
6161 04 Mar 21 nicklas 646         json.put("status", "error");
6161 04 Mar 21 nicklas 647         jsonMessages.add("Should have '" + fileType.getItemType().name() + "' as item type.");
6161 04 Mar 21 nicklas 648       }
6161 04 Mar 21 nicklas 649       
6161 04 Mar 21 nicklas 650     }
6161 04 Mar 21 nicklas 651     if (jsonMessages.size() == 0) jsonMessages.add("Ok");
6161 04 Mar 21 nicklas 652     json.put("messages", jsonMessages);
6161 04 Mar 21 nicklas 653     return json;
6161 04 Mar 21 nicklas 654   
6161 04 Mar 21 nicklas 655   }
6161 04 Mar 21 nicklas 656
6161 04 Mar 21 nicklas 657   
6161 04 Mar 21 nicklas 658   /**
6161 04 Mar 21 nicklas 659     Store options for enumerated annotation types.
6161 04 Mar 21 nicklas 660   */
6161 04 Mar 21 nicklas 661   static class ValueOptions
6161 04 Mar 21 nicklas 662   {
6161 04 Mar 21 nicklas 663     private final Object[] options;
6161 04 Mar 21 nicklas 664     
6161 04 Mar 21 nicklas 665     /**
6161 04 Mar 21 nicklas 666       The annotation type is an enumerated annotation type with the following options.
6161 04 Mar 21 nicklas 667     */
6161 04 Mar 21 nicklas 668     ValueOptions(Object... options)
6161 04 Mar 21 nicklas 669     {
6161 04 Mar 21 nicklas 670       this.options = options;
6161 04 Mar 21 nicklas 671     }
6161 04 Mar 21 nicklas 672     
6161 04 Mar 21 nicklas 673     boolean isEnumeration()
6161 04 Mar 21 nicklas 674     {
6161 04 Mar 21 nicklas 675       return options != null;
6161 04 Mar 21 nicklas 676     }
6161 04 Mar 21 nicklas 677     
6161 04 Mar 21 nicklas 678     /**
6161 04 Mar 21 nicklas 679       Get the options as a List.
6161 04 Mar 21 nicklas 680     */
6161 04 Mar 21 nicklas 681     List<?> getList()
6161 04 Mar 21 nicklas 682     {
6161 04 Mar 21 nicklas 683       return Arrays.asList(options);
6161 04 Mar 21 nicklas 684     }
6161 04 Mar 21 nicklas 685     
6161 04 Mar 21 nicklas 686     /**
6161 04 Mar 21 nicklas 687       Get the options as an array.
6161 04 Mar 21 nicklas 688     */
6161 04 Mar 21 nicklas 689     Object[] getArray()
6161 04 Mar 21 nicklas 690     {
6161 04 Mar 21 nicklas 691       return options;
6161 04 Mar 21 nicklas 692     }
6161 04 Mar 21 nicklas 693     
6161 04 Mar 21 nicklas 694     /**
6161 04 Mar 21 nicklas 695       Add options missing in the current annotation type.
6161 04 Mar 21 nicklas 696     */
6161 04 Mar 21 nicklas 697     void applyEnumeration(AnnotationType at)
6161 04 Mar 21 nicklas 698     {
6161 04 Mar 21 nicklas 699       List<Object> values = new ArrayList<Object>(at.getValues());
6161 04 Mar 21 nicklas 700       for (Object opt : options)
6161 04 Mar 21 nicklas 701       {
6161 04 Mar 21 nicklas 702         if (!values.contains(opt)) values.add(opt);
6161 04 Mar 21 nicklas 703       }
6161 04 Mar 21 nicklas 704       at.setValues(values);
6161 04 Mar 21 nicklas 705     }
6161 04 Mar 21 nicklas 706   }
6161 04 Mar 21 nicklas 707   /**
6161 04 Mar 21 nicklas 708     Store permissions that can be applied to shareable items.
6161 04 Mar 21 nicklas 709   */
6161 04 Mar 21 nicklas 710   static class PermissionOptions
6161 04 Mar 21 nicklas 711   {
6161 04 Mar 21 nicklas 712     private Map<Group, Permission> groupPermissions;
6161 04 Mar 21 nicklas 713     private Map<Project, Permission> projectPermissions;
6161 04 Mar 21 nicklas 714     private String message;
6161 04 Mar 21 nicklas 715     
6161 04 Mar 21 nicklas 716     PermissionOptions()
6161 04 Mar 21 nicklas 717     {
6161 04 Mar 21 nicklas 718       groupPermissions = new HashMap<Group, Permission>();
6161 04 Mar 21 nicklas 719       projectPermissions = new HashMap<Project, Permission>();
6161 04 Mar 21 nicklas 720     }
6161 04 Mar 21 nicklas 721   
6161 04 Mar 21 nicklas 722     /**
6161 04 Mar 21 nicklas 723       Set a permission for the given group.
6161 04 Mar 21 nicklas 724     */
6161 04 Mar 21 nicklas 725     void set(Group g, Permission p)
6161 04 Mar 21 nicklas 726     {
6161 04 Mar 21 nicklas 727       groupPermissions.put(g, p);
6161 04 Mar 21 nicklas 728     }
6161 04 Mar 21 nicklas 729   
6161 04 Mar 21 nicklas 730     /**
6161 04 Mar 21 nicklas 731       Set a permission for the given project.
6161 04 Mar 21 nicklas 732     */
6161 04 Mar 21 nicklas 733     void set(Project pr, Permission p)
6161 04 Mar 21 nicklas 734     {
6161 04 Mar 21 nicklas 735       projectPermissions.put(pr, p);
6161 04 Mar 21 nicklas 736     }
6161 04 Mar 21 nicklas 737   
6161 04 Mar 21 nicklas 738     /**
6161 04 Mar 21 nicklas 739       Check if the given item includes at least all the required permissions.
6161 04 Mar 21 nicklas 740       @return TRUE if all permissions are ok, FALSE if not (call getMessage())
6161 04 Mar 21 nicklas 741       to get more information.
6161 04 Mar 21 nicklas 742     */
6161 04 Mar 21 nicklas 743     boolean checkPermissions(SharedItem item)
6161 04 Mar 21 nicklas 744     {
6161 04 Mar 21 nicklas 745       ProjectKey pKey = item.getProjectKey();
6161 04 Mar 21 nicklas 746       for (Map.Entry<Project, Permission> entry : projectPermissions.entrySet())
6161 04 Mar 21 nicklas 747       {
6161 04 Mar 21 nicklas 748         Project pr = entry.getKey();
6161 04 Mar 21 nicklas 749         Permission p = entry.getValue();
6161 04 Mar 21 nicklas 750         
6161 04 Mar 21 nicklas 751         Set<Permission> permissions = pKey != null ? pKey.getPermissions(pr) : null;
6161 04 Mar 21 nicklas 752         if (p == null)
6161 04 Mar 21 nicklas 753         {
6161 04 Mar 21 nicklas 754           // The item should not be shared to project 'pr'
6161 04 Mar 21 nicklas 755           if (permissions != null && permissions.size() > 0)
6161 04 Mar 21 nicklas 756           {
6161 04 Mar 21 nicklas 757             message = "Should not be shared to project: " + pr.getName() + " (" + permissions + ")";
6161 04 Mar 21 nicklas 758             return false;
6161 04 Mar 21 nicklas 759           }
6161 04 Mar 21 nicklas 760         }
6161 04 Mar 21 nicklas 761         else
6161 04 Mar 21 nicklas 762         {
6161 04 Mar 21 nicklas 763           // The item should be shared to project 'pr' with permission 'p'
6161 04 Mar 21 nicklas 764           if (pKey == null || !permissions.contains(p))
6161 04 Mar 21 nicklas 765           {
6161 04 Mar 21 nicklas 766             message = "Not shared to project: " + pr.getName() + " (" + p + ")";
6161 04 Mar 21 nicklas 767             return false;
6161 04 Mar 21 nicklas 768           }
6161 04 Mar 21 nicklas 769         }
6161 04 Mar 21 nicklas 770       }
6161 04 Mar 21 nicklas 771       ItemKey key = item.getItemKey();
6161 04 Mar 21 nicklas 772       for (Map.Entry<Group, Permission> entry : groupPermissions.entrySet())
6161 04 Mar 21 nicklas 773       {
6161 04 Mar 21 nicklas 774         Group g = entry.getKey();
6161 04 Mar 21 nicklas 775         Permission p = entry.getValue();
6161 04 Mar 21 nicklas 776         
6161 04 Mar 21 nicklas 777         Set<Permission> permissions = key != null ? key.getPermissions(g) : null;
6161 04 Mar 21 nicklas 778         if (p == null)
6161 04 Mar 21 nicklas 779         {
6161 04 Mar 21 nicklas 780           // The item should not be shared to group 'g'
6161 04 Mar 21 nicklas 781           if (permissions != null && permissions.size() > 0)
6161 04 Mar 21 nicklas 782           {
6161 04 Mar 21 nicklas 783             message = "Should not be shared to group: " + g.getName() + " (" + permissions + ")";
6161 04 Mar 21 nicklas 784             return false;
6161 04 Mar 21 nicklas 785           }
6161 04 Mar 21 nicklas 786         }
6161 04 Mar 21 nicklas 787         else
6161 04 Mar 21 nicklas 788         {
6161 04 Mar 21 nicklas 789           // The item should be shared to group 'g' with permission 'p'
6161 04 Mar 21 nicklas 790           if (key == null || !key.getPermissions(g).contains(p))
6161 04 Mar 21 nicklas 791           {
6161 04 Mar 21 nicklas 792             message = "Not shared to group: " + g.getName() + " (" + p + ")";
6161 04 Mar 21 nicklas 793             return false;
6161 04 Mar 21 nicklas 794           }
6161 04 Mar 21 nicklas 795         }
6161 04 Mar 21 nicklas 796   
6161 04 Mar 21 nicklas 797       }
6161 04 Mar 21 nicklas 798       return true;
6161 04 Mar 21 nicklas 799     }
6161 04 Mar 21 nicklas 800     
6161 04 Mar 21 nicklas 801     /**
6161 04 Mar 21 nicklas 802       More information about missing permission from the checkPermissions() method.
6161 04 Mar 21 nicklas 803     */
6161 04 Mar 21 nicklas 804     String getMessage()
6161 04 Mar 21 nicklas 805     {
6161 04 Mar 21 nicklas 806       return message;
6161 04 Mar 21 nicklas 807     }
6161 04 Mar 21 nicklas 808   
6161 04 Mar 21 nicklas 809     /**
6161 04 Mar 21 nicklas 810       Apply all permissions to the given item.
6161 04 Mar 21 nicklas 811     */
6161 04 Mar 21 nicklas 812     void applyPermissions(SharedItem item)
6161 04 Mar 21 nicklas 813     {
6161 04 Mar 21 nicklas 814       MultiPermissions mp = new MultiPermissions(Collections.singleton(item));
6161 04 Mar 21 nicklas 815       for (Map.Entry<Group, Permission> entry : groupPermissions.entrySet())
6161 04 Mar 21 nicklas 816       {
6161 04 Mar 21 nicklas 817         Group g = entry.getKey();
6161 04 Mar 21 nicklas 818         Permission p = entry.getValue();
6161 04 Mar 21 nicklas 819         if (p == null)
6161 04 Mar 21 nicklas 820         {
6161 04 Mar 21 nicklas 821           mp.setPermissions(g, null);
6161 04 Mar 21 nicklas 822         }
6161 04 Mar 21 nicklas 823         else
6161 04 Mar 21 nicklas 824         {
6161 04 Mar 21 nicklas 825           mp.addPermissions(g, Collections.singleton(p));
6161 04 Mar 21 nicklas 826         }
6161 04 Mar 21 nicklas 827       }
6161 04 Mar 21 nicklas 828       for (Map.Entry<Project, Permission> entry : projectPermissions.entrySet())
6161 04 Mar 21 nicklas 829       {
6161 04 Mar 21 nicklas 830         Project pr = entry.getKey();
6161 04 Mar 21 nicklas 831         Permission p = entry.getValue();
6161 04 Mar 21 nicklas 832         if (p == null)
6161 04 Mar 21 nicklas 833         {
6161 04 Mar 21 nicklas 834           mp.setPermissions(pr, null);
6161 04 Mar 21 nicklas 835         }
6161 04 Mar 21 nicklas 836         else
6161 04 Mar 21 nicklas 837         {
6161 04 Mar 21 nicklas 838           mp.addPermissions(pr, Collections.singleton(p));
6161 04 Mar 21 nicklas 839         }
6161 04 Mar 21 nicklas 840       }
6161 04 Mar 21 nicklas 841       mp.updateKeys(item.getDbControl());
6161 04 Mar 21 nicklas 842     }
6161 04 Mar 21 nicklas 843   }
6161 04 Mar 21 nicklas 844 }