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

Code
Comments
Other
Rev Date Author Line
2933 14 Nov 14 olle 1 package net.sf.basedb.meludi.servlet;
2933 14 Nov 14 olle 2
2933 14 Nov 14 olle 3 import java.io.IOException;
2933 14 Nov 14 olle 4 import java.net.URI;
2933 14 Nov 14 olle 5 import java.util.ArrayList;
2933 14 Nov 14 olle 6 import java.util.Arrays;
2933 14 Nov 14 olle 7 import java.util.Collections;
3449 28 Jul 15 olle 8 import java.util.Date;
2933 14 Nov 14 olle 9 import java.util.HashMap;
2933 14 Nov 14 olle 10 import java.util.List;
2933 14 Nov 14 olle 11 import java.util.Map;
2933 14 Nov 14 olle 12 import java.util.Set;
2933 14 Nov 14 olle 13
2933 14 Nov 14 olle 14 import javax.servlet.ServletException;
2933 14 Nov 14 olle 15 import javax.servlet.http.HttpServlet;
2933 14 Nov 14 olle 16 import javax.servlet.http.HttpServletRequest;
2933 14 Nov 14 olle 17 import javax.servlet.http.HttpServletResponse;
2933 14 Nov 14 olle 18
2933 14 Nov 14 olle 19 import org.json.simple.JSONArray;
2933 14 Nov 14 olle 20 import org.json.simple.JSONObject;
2933 14 Nov 14 olle 21
2933 14 Nov 14 olle 22 import net.sf.basedb.core.AnnotationType;
2933 14 Nov 14 olle 23 import net.sf.basedb.core.AnnotationTypeCategory;
2933 14 Nov 14 olle 24 import net.sf.basedb.core.Application;
2933 14 Nov 14 olle 25 import net.sf.basedb.core.BasicItem;
2933 14 Nov 14 olle 26 import net.sf.basedb.core.BioPlateEventType;
2933 14 Nov 14 olle 27 import net.sf.basedb.core.BioPlateType;
2933 14 Nov 14 olle 28 import net.sf.basedb.core.DataFileType;
2933 14 Nov 14 olle 29 import net.sf.basedb.core.DbControl;
5271 29 Jan 19 olle 30 import net.sf.basedb.core.Directory;
2933 14 Nov 14 olle 31 import net.sf.basedb.core.Extract;
2933 14 Nov 14 olle 32 import net.sf.basedb.core.FileServer;
2933 14 Nov 14 olle 33 import net.sf.basedb.core.Group;
2933 14 Nov 14 olle 34 import net.sf.basedb.core.Include;
2933 14 Nov 14 olle 35 import net.sf.basedb.core.Item;
2933 14 Nov 14 olle 36 import net.sf.basedb.core.ItemKey;
3384 10 Jun 15 olle 37 import net.sf.basedb.core.ItemList;
2933 14 Nov 14 olle 38 import net.sf.basedb.core.ItemNotFoundException;
2933 14 Nov 14 olle 39 import net.sf.basedb.core.ItemQuery;
2933 14 Nov 14 olle 40 import net.sf.basedb.core.ItemSubtype;
2933 14 Nov 14 olle 41 import net.sf.basedb.core.ItemSubtypeFileType;
2933 14 Nov 14 olle 42 import net.sf.basedb.core.MimeType;
2933 14 Nov 14 olle 43 import net.sf.basedb.core.MultiPermissions;
2933 14 Nov 14 olle 44 import net.sf.basedb.core.Nameable;
5271 29 Jan 19 olle 45 import net.sf.basedb.core.Path;
2933 14 Nov 14 olle 46 import net.sf.basedb.core.Permission;
2933 14 Nov 14 olle 47 import net.sf.basedb.core.PlateGeometry;
2933 14 Nov 14 olle 48 import net.sf.basedb.core.PluginConfiguration;
2933 14 Nov 14 olle 49 import net.sf.basedb.core.PluginDefinition;
2933 14 Nov 14 olle 50 import net.sf.basedb.core.Project;
2933 14 Nov 14 olle 51 import net.sf.basedb.core.ProjectKey;
3527 05 Oct 15 olle 52 import net.sf.basedb.core.Role;
2933 14 Nov 14 olle 53 import net.sf.basedb.core.SessionControl;
2933 14 Nov 14 olle 54 import net.sf.basedb.core.SharedItem;
2933 14 Nov 14 olle 55 import net.sf.basedb.core.SystemItems;
2933 14 Nov 14 olle 56 import net.sf.basedb.core.Tag;
2933 14 Nov 14 olle 57 import net.sf.basedb.core.Type;
2933 14 Nov 14 olle 58 import net.sf.basedb.core.User;
2933 14 Nov 14 olle 59 import net.sf.basedb.core.query.Expressions;
2933 14 Nov 14 olle 60 import net.sf.basedb.core.query.Hql;
2933 14 Nov 14 olle 61 import net.sf.basedb.core.query.Restrictions;
2933 14 Nov 14 olle 62 import net.sf.basedb.meludi.JsonUtil;
2933 14 Nov 14 olle 63 import net.sf.basedb.meludi.Meludi;
2933 14 Nov 14 olle 64 import net.sf.basedb.meludi.Site;
2933 14 Nov 14 olle 65 import net.sf.basedb.meludi.dao.Annotationtype;
2933 14 Nov 14 olle 66 import net.sf.basedb.meludi.dao.BiomaterialList;
2933 14 Nov 14 olle 67 import net.sf.basedb.meludi.dao.BioplateEventtype;
2933 14 Nov 14 olle 68 import net.sf.basedb.meludi.dao.BioplateType;
4773 20 Apr 18 olle 69 import net.sf.basedb.meludi.dao.Consent;
2933 14 Nov 14 olle 70 import net.sf.basedb.meludi.dao.Datafiletype;
3028 11 Dec 14 olle 71 import net.sf.basedb.meludi.dao.Dna;
2933 14 Nov 14 olle 72 import net.sf.basedb.meludi.dao.Fileserver;
2933 14 Nov 14 olle 73 import net.sf.basedb.meludi.dao.Geometry;
5093 14 Nov 18 olle 74 import net.sf.basedb.meludi.dao.Histology;
2933 14 Nov 14 olle 75 import net.sf.basedb.meludi.dao.Mimetype;
2933 14 Nov 14 olle 76 import net.sf.basedb.meludi.dao.ReactionPlate;
2933 14 Nov 14 olle 77 import net.sf.basedb.meludi.dao.MeludiRole;
2933 14 Nov 14 olle 78 import net.sf.basedb.meludi.dao.Rna;
2933 14 Nov 14 olle 79 import net.sf.basedb.meludi.dao.Subtype;
3101 21 Jan 15 olle 80 import net.sf.basedb.meludi.counter.CounterService;
3449 28 Jul 15 olle 81 import net.sf.basedb.meludi.servlet.InstallServlet.ValueOptions;
5271 29 Jan 19 olle 82 //import net.sf.basedb.meludi.servlet.Directory;
5271 29 Jan 19 olle 83 //import net.sf.basedb.meludi.servlet.Path;
5271 29 Jan 19 olle 84 import net.sf.basedb.meludi.servlet.InstallServlet.PermissionOptions;
2933 14 Nov 14 olle 85 import net.sf.basedb.util.EqualsHelper;
2933 14 Nov 14 olle 86 import net.sf.basedb.util.error.ThrowableUtil;
2933 14 Nov 14 olle 87 import net.sf.basedb.util.uri.ConnectionManager;
2933 14 Nov 14 olle 88 import net.sf.basedb.util.uri.ConnectionManagerFactory;
2933 14 Nov 14 olle 89 import net.sf.basedb.util.uri.ConnectionManagerUtil;
2933 14 Nov 14 olle 90 import net.sf.basedb.util.uri.ConnectionParameters;
2933 14 Nov 14 olle 91 import net.sf.basedb.util.uri.UriMetadata;
2933 14 Nov 14 olle 92
2933 14 Nov 14 olle 93 /**
2933 14 Nov 14 olle 94   Servlet that verify and install items that are required by other Meludi actions.
2933 14 Nov 14 olle 95   @author nicklas
2933 14 Nov 14 olle 96 */
2933 14 Nov 14 olle 97 public class InstallServlet 
2933 14 Nov 14 olle 98   extends HttpServlet 
2933 14 Nov 14 olle 99 {
2933 14 Nov 14 olle 100
2933 14 Nov 14 olle 101   private static final long serialVersionUID = -3216326283682707833L;
2933 14 Nov 14 olle 102
3058 19 Dec 14 olle 103   public final static String PROJECTFOCUS_NONE = "none";
3058 19 Dec 14 olle 104   public final static String PROJECTFOCUS_MELANOMA = "melanoma";
3058 19 Dec 14 olle 105   public final static String PROJECTFOCUS_LUNG_CANCER = "lungcancer";
3058 19 Dec 14 olle 106   public final static String PROJECTFOCUS_COLON_CANCER = "coloncancer";
3139 16 Feb 15 olle 107   public final static String PROJECTFOCUS_GIST = "GIST";
4196 31 Oct 16 olle 108   public final static String PROJECTFOCUS_BREAST_CANCER = "breastcancer";
3058 19 Dec 14 olle 109   public final static String PROJECTFOCUS_UNKNOWN = "";
3058 19 Dec 14 olle 110
4180 27 Oct 16 olle 111   public final static String SPECIMENTYPE_PRIMARY_TUMOR = "Primary";
4180 27 Oct 16 olle 112   public final static String SPECIMENTYPE_METASTASIS = "MetastasisDistant";
4180 27 Oct 16 olle 113   public final static String SPECIMENTYPE_UNKNOWN = "";
4180 27 Oct 16 olle 114
2933 14 Nov 14 olle 115   public InstallServlet()
2933 14 Nov 14 olle 116   {}
2933 14 Nov 14 olle 117
2933 14 Nov 14 olle 118   @SuppressWarnings("unchecked")
2933 14 Nov 14 olle 119   @Override
2933 14 Nov 14 olle 120   protected void doGet(HttpServletRequest req, HttpServletResponse resp)
2933 14 Nov 14 olle 121     throws ServletException, IOException 
2933 14 Nov 14 olle 122   {
2933 14 Nov 14 olle 123
2933 14 Nov 14 olle 124     String ID = req.getParameter("ID");
2933 14 Nov 14 olle 125     String cmd = req.getParameter("cmd");
2933 14 Nov 14 olle 126     JsonUtil.setJsonResponseHeaders(resp);
2933 14 Nov 14 olle 127     
2933 14 Nov 14 olle 128     JSONObject json = new JSONObject();
2933 14 Nov 14 olle 129     json.put("status", "ok");
2933 14 Nov 14 olle 130   
5468 04 Jun 19 olle 131     //final SessionControl sc = Application.getSessionControl(ID, req.getRemoteAddr());
5744 20 Nov 19 olle 132     //final SessionControl sc  = Application.getSessionControl(ID, "", req.getRemoteAddr(), true);
5744 20 Nov 19 olle 133     final SessionControl sc  = Application.getSessionControl(ID, null, req.getRemoteAddr(), true);
2933 14 Nov 14 olle 134     DbControl dc = null;
2933 14 Nov 14 olle 135     try
2933 14 Nov 14 olle 136     {
2933 14 Nov 14 olle 137       if ("Validate".equals(cmd) || "Install".equals(cmd))
2933 14 Nov 14 olle 138       {
2933 14 Nov 14 olle 139         dc = sc.newDbControl();
2933 14 Nov 14 olle 140         boolean createIfMissing = "Install".equals(cmd);
2933 14 Nov 14 olle 141         JSONArray jsonChecks = new JSONArray();
2933 14 Nov 14 olle 142         
2933 14 Nov 14 olle 143         // Project checks
2933 14 Nov 14 olle 144         jsonChecks.add(checkActiveProject(dc));
2933 14 Nov 14 olle 145         
2933 14 Nov 14 olle 146         // Group checks
2933 14 Nov 14 olle 147         jsonChecks.add(checkMeludiRole(dc, MeludiRole.PATIENT_CURATOR, createIfMissing));
2933 14 Nov 14 olle 148
2933 14 Nov 14 olle 149         // Role checks
2933 14 Nov 14 olle 150         jsonChecks.add(checkMeludiRole(dc, MeludiRole.ADMINISTRATOR, createIfMissing));
2933 14 Nov 14 olle 151         jsonChecks.add(checkMeludiRole(dc, MeludiRole.SAMPLE_PREP, createIfMissing));
3527 05 Oct 15 olle 152         jsonChecks.add(checkMeludiRole(dc, MeludiRole.LIBRARY_PREP, createIfMissing));
2933 14 Nov 14 olle 153
2933 14 Nov 14 olle 154         int projectId = dc.getSessionControl().getActiveProjectId();
2933 14 Nov 14 olle 155         Project activeProject = projectId == 0 ? null : Project.getById(dc, projectId);
2933 14 Nov 14 olle 156
2933 14 Nov 14 olle 157         Group patientCurator = MeludiRole.PATIENT_CURATOR.get(dc);
2933 14 Nov 14 olle 158         PermissionOptions patientCuratorUse = null;
2933 14 Nov 14 olle 159         PermissionOptions patientCuratorWrite = null;
2933 14 Nov 14 olle 160         PermissionOptions patientCuratorRead = null;
2933 14 Nov 14 olle 161         if (patientCurator != null)
2933 14 Nov 14 olle 162         {
2933 14 Nov 14 olle 163           patientCuratorRead = new PermissionOptions();
2933 14 Nov 14 olle 164           patientCuratorRead.set(patientCurator, Permission.READ);
2933 14 Nov 14 olle 165           patientCuratorUse = new PermissionOptions();
2933 14 Nov 14 olle 166           patientCuratorUse.set(patientCurator, Permission.USE);
2933 14 Nov 14 olle 167           patientCuratorWrite = new PermissionOptions();
2933 14 Nov 14 olle 168           patientCuratorWrite.set(patientCurator, Permission.WRITE);
2933 14 Nov 14 olle 169           if (activeProject != null)
2933 14 Nov 14 olle 170           {
2933 14 Nov 14 olle 171             patientCuratorRead.set(activeProject, null);
2933 14 Nov 14 olle 172             patientCuratorUse.set(activeProject, null);
2933 14 Nov 14 olle 173             patientCuratorWrite.set(activeProject, null);
2933 14 Nov 14 olle 174           }
2933 14 Nov 14 olle 175         }
2933 14 Nov 14 olle 176         
2933 14 Nov 14 olle 177         PermissionOptions activeProjectRead = null;
2933 14 Nov 14 olle 178         PermissionOptions activeProjectUse = null;
2933 14 Nov 14 olle 179         PermissionOptions activeProjectWrite = null;
2933 14 Nov 14 olle 180         if (activeProject != null)
2933 14 Nov 14 olle 181         {
2933 14 Nov 14 olle 182           activeProjectRead = new PermissionOptions();
2933 14 Nov 14 olle 183           activeProjectRead.set(activeProject, Permission.READ);
2933 14 Nov 14 olle 184           activeProjectUse = new PermissionOptions();
2933 14 Nov 14 olle 185           activeProjectUse.set(activeProject, Permission.USE);
2933 14 Nov 14 olle 186           activeProjectWrite = new PermissionOptions();
2933 14 Nov 14 olle 187           activeProjectWrite.set(activeProject, Permission.WRITE);
2933 14 Nov 14 olle 188         }
2933 14 Nov 14 olle 189         
2933 14 Nov 14 olle 190         PermissionOptions effectivePermissionsRead = activeProjectRead == null ?
2933 14 Nov 14 olle 191             patientCuratorRead : activeProjectRead;
2933 14 Nov 14 olle 192         PermissionOptions effectivePermissionsUse = activeProjectUse == null ?
2933 14 Nov 14 olle 193             patientCuratorUse : activeProjectUse;
2933 14 Nov 14 olle 194         PermissionOptions effectivePermissionsWrite = activeProjectWrite == null ?
2933 14 Nov 14 olle 195             patientCuratorWrite : activeProjectWrite;
2933 14 Nov 14 olle 196         Map<String, Item> subtypeItems = new HashMap<String, Item>();
2933 14 Nov 14 olle 197
2933 14 Nov 14 olle 198         // Subtype checks
2933 14 Nov 14 olle 199         jsonChecks.add(checkSubtype(dc, Subtype.PATIENT, null, createIfMissing));
4785 27 Apr 18 olle 200         jsonChecks.add(checkSubtype(dc, Subtype.NO, null, createIfMissing));
4785 27 Apr 18 olle 201         jsonChecks.add(checkSubtype(dc, Subtype.NOT_ASKED, null, createIfMissing));
2933 14 Nov 14 olle 202         jsonChecks.add(checkSubtype(dc, Subtype.CASE, null, createIfMissing, Subtype.PATIENT));
4795 08 May 18 olle 203         jsonChecks.add(checkSubtype(dc, Subtype.BLOOD, null, createIfMissing, Subtype.PATIENT));
4795 08 May 18 olle 204         jsonChecks.add(checkSubtype(dc, Subtype.BLOOD_DNA, null, createIfMissing, Subtype.BLOOD));
4903 10 Jul 18 olle 205         jsonChecks.add(checkSubtype(dc, Subtype.FFPE_BLOCK, null, createIfMissing, Subtype.PATIENT));
2933 14 Nov 14 olle 206         jsonChecks.add(checkSubtype(dc, Subtype.SPECIMEN,null, createIfMissing, Subtype.CASE));
5093 14 Nov 18 olle 207         //jsonChecks.add(checkSubtype(dc, Subtype.HISTOLOGY, null, createIfMissing, Subtype.SPECIMEN, Subtype.HISTOLOGY_PROTOCOL));
5093 14 Nov 18 olle 208         jsonChecks.add(checkSubtype(dc, Subtype.HISTOLOGY, null, createIfMissing, Subtype.SPECIMEN));
5111 20 Nov 18 olle 209         //jsonChecks.add(checkSubtype(dc, Subtype.STAINED, null, createIfMissing, Subtype.HISTOLOGY, Subtype.STAINING_PROTOCOL));
5111 20 Nov 18 olle 210         jsonChecks.add(checkSubtype(dc, Subtype.STAINED, null, createIfMissing, Subtype.HISTOLOGY));
3044 16 Dec 14 olle 211         jsonChecks.add(checkSubtype(dc, Subtype.DNA, null, createIfMissing));
3044 16 Dec 14 olle 212         jsonChecks.add(checkSubtype(dc, Subtype.RNA, null, createIfMissing));
3180 17 Mar 15 olle 213 /*
3180 17 Mar 15 olle 214         jsonChecks.add(checkSubtype(dc, Subtype.CDNA, null, createIfMissing, Subtype.MRNA, Subtype.CDNA_PROTOCOL));
3180 17 Mar 15 olle 215 */
3449 28 Jul 15 olle 216         jsonChecks.add(checkSubtype(dc, Subtype.LIBRARY_PROTOCOL, null, createIfMissing));
3449 28 Jul 15 olle 217         jsonChecks.add(checkSubtype(dc, Subtype.BARCODE, null, createIfMissing));
3449 28 Jul 15 olle 218         jsonChecks.add(checkSubtype(dc, Subtype.LIBRARY, null, createIfMissing, Subtype.DNA, Subtype.BARCODE, Subtype.LIBRARY_PROTOCOL)); 
4785 27 Apr 18 olle 219         jsonChecks.add(checkSubtype(dc, Subtype.RETRACT, null, createIfMissing));
4785 27 Apr 18 olle 220         jsonChecks.add(checkSubtype(dc, Subtype.RETRO_NO, null, createIfMissing));
5149 28 Nov 18 olle 221         jsonChecks.add(checkSubtype(dc, Subtype.BASE_LINE_CSV, null, createIfMissing));
2933 14 Nov 14 olle 222         
2933 14 Nov 14 olle 223         // Plate geometries
2933 14 Nov 14 olle 224         jsonChecks.add(checkPlateGeometry(dc, Geometry.THREE_BY_TWO, createIfMissing));
2933 14 Nov 14 olle 225         jsonChecks.add(checkPlateGeometry(dc, Geometry.ONE_BY_TWELVE, createIfMissing));
2933 14 Nov 14 olle 226         jsonChecks.add(checkPlateGeometry(dc, Geometry.NINE_BY_NINE, createIfMissing));
2933 14 Nov 14 olle 227         jsonChecks.add(checkPlateGeometry(dc, Geometry.EIGHT_BY_TWELVE, createIfMissing));
5175 04 Dec 18 olle 228         jsonChecks.add(checkPlateGeometry(dc, Geometry.TEN_BY_TEN, createIfMissing));
2933 14 Nov 14 olle 229         
2933 14 Nov 14 olle 230         // Bioplate types
5111 20 Nov 18 olle 231         jsonChecks.add(checkBioplateType(dc, BioplateType.HE_GLASS, createIfMissing));
3180 17 Mar 15 olle 232         jsonChecks.add(checkBioplateType(dc, BioplateType.DNA, createIfMissing));
2933 14 Nov 14 olle 233
2933 14 Nov 14 olle 234         // Bioplate event types
2933 14 Nov 14 olle 235         
2933 14 Nov 14 olle 236         // Annotation type checks 
2933 14 Nov 14 olle 237         // -- the first batch need to be shared to the PatientCurator group
2933 14 Nov 14 olle 238         jsonChecks.add(checkAnnotationType(dc, Annotationtype.PERSONAL_NUMBER, 1, null, patientCuratorUse, createIfMissing));
2933 14 Nov 14 olle 239         jsonChecks.add(checkAnnotationType(dc, Annotationtype.FAMILY_NAME, 1, null, patientCuratorUse, createIfMissing));
2933 14 Nov 14 olle 240         jsonChecks.add(checkAnnotationType(dc, Annotationtype.ALL_FIRST_NAMES, 1, null, patientCuratorUse, createIfMissing));
2933 14 Nov 14 olle 241         
2933 14 Nov 14 olle 242         // -- the second batch need only be shared to the active project or to the PatientCurator group
2933 14 Nov 14 olle 243
2933 14 Nov 14 olle 244         jsonChecks.add(checkAnnotationType(dc, Annotationtype.DATE_OF_BIRTH, 1, null, effectivePermissionsUse, createIfMissing));
2933 14 Nov 14 olle 245         jsonChecks.add(checkAnnotationType(dc, Annotationtype.GENDER, 1, new ValueOptions("F", "M"), effectivePermissionsUse, createIfMissing));
4795 08 May 18 olle 246         jsonChecks.add(checkAnnotationType(dc, Annotationtype.PL_NUMBER, 1, null, patientCuratorUse, createIfMissing));
4795 08 May 18 olle 247         jsonChecks.add(checkAnnotationType(dc, Annotationtype.PAD, 1, null, patientCuratorUse, createIfMissing));
5074 06 Nov 18 olle 248         jsonChecks.add(checkAnnotationType(dc, Annotationtype.MATERIAL_NUMBER, 1, null, patientCuratorUse, createIfMissing));
5160 30 Nov 18 olle 249         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LOCALISATION, 1,  null, effectivePermissionsUse, createIfMissing));
2933 14 Nov 14 olle 250         
4795 08 May 18 olle 251         jsonChecks.add(checkAnnotationType(dc, Annotationtype.BLOOD_SAMPLING_DATETIME, 1, null, effectivePermissionsUse, createIfMissing));
4986 28 Sep 18 olle 252         jsonChecks.add(checkAnnotationType(dc, Annotationtype.TUBE_LABEL, 1,  null, patientCuratorUse, createIfMissing));
4795 08 May 18 olle 253
3028 11 Dec 14 olle 254         jsonChecks.add(checkAnnotationType(dc, Annotationtype.SAMPLING_DATE, 1, null, effectivePermissionsUse, createIfMissing));
4773 20 Apr 18 olle 255         jsonChecks.add(checkAnnotationType(dc, Annotationtype.CONSENT, 1, new ValueOptions("Yes", "No", "Not asked"), effectivePermissionsUse, createIfMissing));
4773 20 Apr 18 olle 256         jsonChecks.add(checkAnnotationType(dc, Annotationtype.CONSENT_DATE, 1, null, effectivePermissionsUse, createIfMissing));
4879 27 Jun 18 olle 257         jsonChecks.add(checkAnnotationType(dc, Annotationtype.DIAGNOSIS_CONFIRMED, 1, null, effectivePermissionsUse, createIfMissing));
4840 08 Jun 18 olle 258         jsonChecks.add(checkAnnotationType(dc, Annotationtype.REFERRAL_ID, 1,  null, patientCuratorUse, createIfMissing));
4899 10 Jul 18 olle 259         jsonChecks.add(checkAnnotationType(dc, Annotationtype.CASE_ID, 1,  null, effectivePermissionsUse, createIfMissing));
2933 14 Nov 14 olle 260         jsonChecks.add(checkAnnotationType(dc, Annotationtype.ARRIVAL_DATE, 1, null, effectivePermissionsUse, createIfMissing));
5034 17 Oct 18 olle 261         jsonChecks.add(checkAnnotationType(dc, Annotationtype.ARRIVAL_OPERATOR, 1, null, effectivePermissionsUse, createIfMissing));
2933 14 Nov 14 olle 262         jsonChecks.add(checkAnnotationType(dc, Annotationtype.NOF_DELIVERED_TUBES, 1, null, effectivePermissionsUse, createIfMissing));
3028 11 Dec 14 olle 263         jsonChecks.add(checkAnnotationType(dc, Annotationtype.NOF_SECTIONS, 1, null, effectivePermissionsUse, createIfMissing));
3067 08 Jan 15 olle 264         jsonChecks.add(checkAnnotationType(dc, Annotationtype.VIABLE_TUMOUR_CELLS_PERCENT, 1, null, effectivePermissionsUse, createIfMissing));
5111 20 Nov 18 olle 265         jsonChecks.add(checkAnnotationType(dc, Annotationtype.TUMOUR_CELLS_PERCENT, 1, null, effectivePermissionsUse, createIfMissing));
2933 14 Nov 14 olle 266         jsonChecks.add(checkAnnotationType(dc, Annotationtype.OPERATOR_DELIVERY_COMMENT, 1, null, effectivePermissionsUse, createIfMissing));
5031 16 Oct 18 olle 267         jsonChecks.add(checkAnnotationType(dc, Annotationtype.YELLOW_LABEL, 1, 
5031 16 Oct 18 olle 268             new ValueOptions("yellow"), effectivePermissionsUse, createIfMissing));
5031 16 Oct 18 olle 269         jsonChecks.add(checkAnnotationType(dc, Annotationtype.COMPLETED_DATE, 1, null, effectivePermissionsUse, createIfMissing));
2933 14 Nov 14 olle 270         jsonChecks.add(checkAnnotationType(dc, Annotationtype.OTHER_PATH_NOTE, 1, null, effectivePermissionsUse, createIfMissing));
5243 17 Jan 19 olle 271         jsonChecks.add(checkAnnotationType(dc, Annotationtype.FFPE_BLOCK_ORDER_DATE, 1, null, effectivePermissionsUse, createIfMissing));
5061 30 Oct 18 olle 272         jsonChecks.add(checkAnnotationType(dc, Annotationtype.USED_FOR_FFPE_SECTION_ORDER_FORM, 1, null, effectivePermissionsUse, createIfMissing));
5061 30 Oct 18 olle 273         jsonChecks.add(checkAnnotationType(dc, Annotationtype.USED_FOR_FFPE_SECTION, 1, null, effectivePermissionsUse, createIfMissing));
5060 29 Oct 18 olle 274         jsonChecks.add(checkAnnotationType(dc, Annotationtype.RETURNED_DATE, 1, null, effectivePermissionsUse, createIfMissing));
4730 04 Apr 18 olle 275         jsonChecks.add(checkAnnotationType(dc, Annotationtype.MUTATION_ANALYSIS, 0, new ValueOptions("KRAS", "NRAS", "BRAF", "EGFR", "ALKEML4", "PDGFRA", "KIT", "TST170", "Other"), effectivePermissionsUse, createIfMissing));
2933 14 Nov 14 olle 276         jsonChecks.add(checkAnnotationType(dc, Annotationtype.SITE, 1, new ValueOptions(
4231 10 Nov 16 olle 277             Site.GOTEBORG.getPrefix(),
4725 29 Mar 18 olle 278             Site.HALMSTAD.getPrefix(),
2933 14 Nov 14 olle 279             Site.HELSINGBORG.getPrefix(),
4725 29 Mar 18 olle 280             Site.JONKOPING.getPrefix(),
2962 19 Nov 14 olle 281             Site.KARLSKRONA.getPrefix(),
2933 14 Nov 14 olle 282             Site.KRISTIANSTAD.getPrefix(),
4211 07 Nov 16 olle 283             Site.LINKOPING.getPrefix(),
2933 14 Nov 14 olle 284             Site.LUND.getPrefix(),
2933 14 Nov 14 olle 285             Site.MALMO.getPrefix(),
4231 10 Nov 16 olle 286             Site.STOCKHOLM.getPrefix(),
3408 17 Jun 15 olle 287             Site.TRELLEBORG.getPrefix(),
4211 07 Nov 16 olle 288             Site.UMEA.getPrefix(),
4211 07 Nov 16 olle 289             Site.UPPSALA.getPrefix(),
4211 07 Nov 16 olle 290             Site.VAXJO.getPrefix()),
2933 14 Nov 14 olle 291             effectivePermissionsUse, createIfMissing));
3028 11 Dec 14 olle 292         jsonChecks.add(checkAnnotationType(dc, Annotationtype.TUBE_CONTENT_TYPE, 1,
3028 11 Dec 14 olle 293             new ValueOptions("Specimen", "DNA", "RNA", "DNA_RNA"), 
2933 14 Nov 14 olle 294             effectivePermissionsUse, createIfMissing));
4196 31 Oct 16 olle 295         jsonChecks.add(checkAnnotationType(dc, Annotationtype.PROJECT_FOCUS, 1, new ValueOptions(PROJECTFOCUS_MELANOMA, PROJECTFOCUS_LUNG_CANCER, PROJECTFOCUS_COLON_CANCER, PROJECTFOCUS_GIST, PROJECTFOCUS_BREAST_CANCER), effectivePermissionsUse, createIfMissing));
4732 04 Apr 18 olle 296         jsonChecks.add(checkAnnotationType(dc, Annotationtype.METASTASIS_SITE, 1,
4732 04 Apr 18 olle 297             new ValueOptions("liver", "skeleton", "bone"),
4732 04 Apr 18 olle 298             effectivePermissionsUse, createIfMissing));
2933 14 Nov 14 olle 299         jsonChecks.add(checkAnnotationType(dc, Annotationtype.SPECIMEN_TYPE, 1,
4180 27 Oct 16 olle 300             new ValueOptions(SPECIMENTYPE_PRIMARY_TUMOR, SPECIMENTYPE_METASTASIS), 
2933 14 Nov 14 olle 301             effectivePermissionsUse, createIfMissing));
4195 31 Oct 16 olle 302         jsonChecks.add(checkAnnotationType(dc, Annotationtype.SPECIMEN_INPUT_TYPE, 1,
4729 04 Apr 18 olle 303             new ValueOptions("fresh_frozen", "rna_later", "ffpe_block", "ffpe_section", "ffpe_punch", "ffpe_slide", "cell_line"), 
4195 31 Oct 16 olle 304             effectivePermissionsUse, createIfMissing));
3318 08 May 15 olle 305         jsonChecks.add(checkAnnotationType(dc, Annotationtype.SAMPLING_DATE_EXTRACT, 1, null, effectivePermissionsUse, createIfMissing));
3318 08 May 15 olle 306         jsonChecks.add(checkAnnotationType(dc, Annotationtype.ARRIVAL_DATE_EXTRACT, 1, null, effectivePermissionsUse, createIfMissing));
3318 08 May 15 olle 307         jsonChecks.add(checkAnnotationType(dc, Annotationtype.SPECIMEN_TYPE_EXTRACT, 1,
4180 27 Oct 16 olle 308             new ValueOptions(SPECIMENTYPE_PRIMARY_TUMOR, SPECIMENTYPE_METASTASIS), 
3318 08 May 15 olle 309             effectivePermissionsUse, createIfMissing));
3318 08 May 15 olle 310         jsonChecks.add(checkAnnotationType(dc, Annotationtype.VIABLE_TUMOUR_CELLS_PERCENT_EXTRACT, 1, null, effectivePermissionsUse, createIfMissing));
3318 08 May 15 olle 311         jsonChecks.add(checkAnnotationType(dc, Annotationtype.OPERATOR_DELIVERY_COMMENT_EXTRACT, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 312         // Sample processing
3180 17 Mar 15 olle 313         jsonChecks.add(checkAnnotationType(dc, Annotationtype.ISOLATION_DATE, 1, null, effectivePermissionsUse, createIfMissing));
3501 21 Sep 15 olle 314         jsonChecks.add(checkAnnotationType(dc, Annotationtype.EXTRACTION_OPERATOR, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 315         jsonChecks.add(checkAnnotationType(dc, Annotationtype.XYLENE_SPECIMEN, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 316         jsonChecks.add(checkAnnotationType(dc, Annotationtype.ETOH995_SPECIMEN, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 317         jsonChecks.add(checkAnnotationType(dc, Annotationtype.BUFFER_PKD_SPECIMEN, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 318         jsonChecks.add(checkAnnotationType(dc, Annotationtype.BUFFER_ATL_SPECIMEN, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 319         jsonChecks.add(checkAnnotationType(dc, Annotationtype.PROTEINASE_K_SPECIMEN, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 320         jsonChecks.add(checkAnnotationType(dc, Annotationtype.RNASE_A_SPECIMEN, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 321         jsonChecks.add(checkAnnotationType(dc, Annotationtype.QIACUBE_DATE, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 322         jsonChecks.add(checkAnnotationType(dc, Annotationtype.QIACUBE_OPERATOR, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 323         jsonChecks.add(checkAnnotationType(dc, Annotationtype.QIACUBE_INSTRUMENT_PREFIX, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 324         jsonChecks.add(checkAnnotationType(dc, Annotationtype.QIACUBE_POSITION, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 325         jsonChecks.add(checkAnnotationType(dc, Annotationtype.QIACUBE_RUN_NO, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 326         jsonChecks.add(checkAnnotationType(dc, Annotationtype.ALLPREP_FFPE_KIT, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 327         jsonChecks.add(checkAnnotationType(dc, Annotationtype.ETOH995, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 328         jsonChecks.add(checkAnnotationType(dc, Annotationtype.BUFFER_RLT, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 329         jsonChecks.add(checkAnnotationType(dc, Annotationtype.BUFFER_FRN, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 330         jsonChecks.add(checkAnnotationType(dc, Annotationtype.BUFFER_RPE, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 331         jsonChecks.add(checkAnnotationType(dc, Annotationtype.BUFFER_AL, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 332         jsonChecks.add(checkAnnotationType(dc, Annotationtype.BUFFER_AW1, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 333         jsonChecks.add(checkAnnotationType(dc, Annotationtype.BUFFER_AW2, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 334         jsonChecks.add(checkAnnotationType(dc, Annotationtype.BUFFER_ATE, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 335         jsonChecks.add(checkAnnotationType(dc, Annotationtype.BUFFER_RDD, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 336         jsonChecks.add(checkAnnotationType(dc, Annotationtype.RNASE_FREE_WATER, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 337         jsonChecks.add(checkAnnotationType(dc, Annotationtype.DNASE_MIX, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 338         jsonChecks.add(checkAnnotationType(dc, Annotationtype.RNEASY_MIN_ELUTE_SPIN_COL, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 339         jsonChecks.add(checkAnnotationType(dc, Annotationtype.QIAAMP_MIN_ELUTE_SPIN_COL, 1, null, effectivePermissionsUse, createIfMissing));
3324 11 May 15 olle 340         jsonChecks.add(checkAnnotationType(dc, Annotationtype.KAPA_SYBR_FAST, 1, null, effectivePermissionsUse, createIfMissing));
3324 11 May 15 olle 341         jsonChecks.add(checkAnnotationType(dc, Annotationtype.QUALITY_CONTROL_PRIMERS_QCP_RGT, 1, null, effectivePermissionsUse, createIfMissing));
3438 03 Jul 15 olle 342         jsonChecks.add(checkAnnotationType(dc, Annotationtype.QUALITY_CONTROL_TEMPLATE_QCT, 1, null, effectivePermissionsUse, createIfMissing));
3324 11 May 15 olle 343         jsonChecks.add(checkAnnotationType(dc, Annotationtype.QUBIT_DNA_HIGH_SENS, 1, null, effectivePermissionsUse, createIfMissing));
3324 11 May 15 olle 344         jsonChecks.add(checkAnnotationType(dc, Annotationtype.QUBIT_DNA_BROAD_RANGE, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 345         jsonChecks.add(checkAnnotationType(dc, Annotationtype.ND_CONC, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 346         jsonChecks.add(checkAnnotationType(dc, Annotationtype.ND_260_BY_280, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 347         jsonChecks.add(checkAnnotationType(dc, Annotationtype.ND_260_BY_230, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 348         jsonChecks.add(checkAnnotationType(dc, Annotationtype.QUBIT_CONC, 1, null, effectivePermissionsUse, createIfMissing));
3176 06 Mar 15 olle 349         jsonChecks.add(checkAnnotationType(dc, Annotationtype.DELTA_CT, 1, null, effectivePermissionsUse, createIfMissing));
3449 28 Jul 15 olle 350         jsonChecks.add(checkAnnotationType(dc, Annotationtype.DILUTION_DATE, 1, null, effectivePermissionsUse, createIfMissing));
3449 28 Jul 15 olle 351         jsonChecks.add(checkAnnotationType(dc, Annotationtype.DILUTION_OPERATOR, 1, null, effectivePermissionsUse, createIfMissing));
3449 28 Jul 15 olle 352         jsonChecks.add(checkAnnotationType(dc, Annotationtype.DILUTION_CONC, 1, null, effectivePermissionsUse, createIfMissing));
3180 17 Mar 15 olle 353
3233 09 Apr 15 olle 354         jsonChecks.add(checkAnnotationType(dc, Annotationtype.SOURCE_ITEM_NAMES_LIST_STRING, 1, null, effectivePermissionsUse, createIfMissing));
3180 17 Mar 15 olle 355         jsonChecks.add(checkAnnotationType(dc, Annotationtype.BATCH_NUMBER_EXTRA_QIACUBE_ITEMS, 1, null, effectivePermissionsUse, createIfMissing));
3245 14 Apr 15 olle 356         jsonChecks.add(checkAnnotationType(dc, Annotationtype.EXTRA_QIACUBE_ITEM_NAMES_LIST_STRING, 1, null, effectivePermissionsUse, createIfMissing));
3180 17 Mar 15 olle 357         jsonChecks.add(checkAnnotationType(dc, Annotationtype.BATCH_ISOLATION_DATE, 1, null, effectivePermissionsUse, createIfMissing));
3180 17 Mar 15 olle 358         jsonChecks.add(checkAnnotationType(dc, Annotationtype.BATCH_EXTRACTION_PROTOCOL_ID, 1, null, effectivePermissionsUse, createIfMissing));
3180 17 Mar 15 olle 359         jsonChecks.add(checkAnnotationType(dc, Annotationtype.BATCH_EXTRACTION_PROTOCOL_NAME, 1, null, effectivePermissionsUse, createIfMissing));
3180 17 Mar 15 olle 360         jsonChecks.add(checkAnnotationType(dc, Annotationtype.BATCH_RNA_DEFAULT_VOLUME_IN_MICROLITRE, 1, null, effectivePermissionsUse, createIfMissing));
3180 17 Mar 15 olle 361         jsonChecks.add(checkAnnotationType(dc, Annotationtype.BATCH_DNA_DEFAULT_VOLUME_IN_MICROLITRE, 1, null, effectivePermissionsUse, createIfMissing));
3180 17 Mar 15 olle 362         jsonChecks.add(checkAnnotationType(dc, Annotationtype.BATCH_QIACUBE_DATE, 1, null, effectivePermissionsUse, createIfMissing));
3180 17 Mar 15 olle 363         jsonChecks.add(checkAnnotationType(dc, Annotationtype.BATCH_QIACUBE_PRIMARY_PREFIX, 1, null, effectivePermissionsUse, createIfMissing));
3180 17 Mar 15 olle 364         jsonChecks.add(checkAnnotationType(dc, Annotationtype.BATCH_QIACUBE_SECONDARY_PREFIX, 1, null, effectivePermissionsUse, createIfMissing));
3180 17 Mar 15 olle 365         jsonChecks.add(checkAnnotationType(dc, Annotationtype.BATCH_QIACUBE_RUN_NO, 1, null, effectivePermissionsUse, createIfMissing));
3180 17 Mar 15 olle 366         jsonChecks.add(checkAnnotationType(dc, Annotationtype.BATCH_QIACUBE_OPERATOR, 1, null, effectivePermissionsUse, createIfMissing));
3180 17 Mar 15 olle 367         jsonChecks.add(checkAnnotationType(dc, Annotationtype.BATCH_ALLPREP_FFPE_KIT, 1, null, effectivePermissionsUse, createIfMissing));
2933 14 Nov 14 olle 368         
3430 29 Jun 15 olle 369         jsonChecks.add(checkAnnotationType(dc, Annotationtype.SAMPLE_PREP_LIST_IS_PROCESSED, 1, null, effectivePermissionsUse, createIfMissing));
3430 29 Jun 15 olle 370         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_ISOLATION_DATE, 1, null, effectivePermissionsUse, createIfMissing));
3430 29 Jun 15 olle 371         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_EXTRACTION_DATE, 1, null, effectivePermissionsUse, createIfMissing));
3501 21 Sep 15 olle 372         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_EXTRACTION_OPERATOR, 1, null, effectivePermissionsUse, createIfMissing));
3430 29 Jun 15 olle 373         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_EXTRACTION_PROTOCOL_ID, 1, null, effectivePermissionsUse, createIfMissing));
3430 29 Jun 15 olle 374         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_EXTRACTION_PROTOCOL_NAME, 1, null, effectivePermissionsUse, createIfMissing));
3430 29 Jun 15 olle 375         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_RNA_DEFAULT_VOLUME_IN_MICROLITRE, 1, null, effectivePermissionsUse, createIfMissing));
3430 29 Jun 15 olle 376         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_DNA_DEFAULT_VOLUME_IN_MICROLITRE, 1, null, effectivePermissionsUse, createIfMissing));
3430 29 Jun 15 olle 377         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_QIACUBE_DATE, 1, null, effectivePermissionsUse, createIfMissing));
3430 29 Jun 15 olle 378         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_QIACUBE_PRIMARY_PREFIX, 1, null, effectivePermissionsUse, createIfMissing));
3430 29 Jun 15 olle 379         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_QIACUBE_SECONDARY_PREFIX, 1, null, effectivePermissionsUse, createIfMissing));
3430 29 Jun 15 olle 380         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_QIACUBE_RUN_NO, 1, null, effectivePermissionsUse, createIfMissing));
3430 29 Jun 15 olle 381         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_QIACUBE_OPERATOR, 1, null, effectivePermissionsUse, createIfMissing));
3430 29 Jun 15 olle 382         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_ALLPREP_FFPE_KIT, 1, null, effectivePermissionsUse, createIfMissing));
3501 21 Sep 15 olle 383         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_XYLENE_SPECIMEN, 1, null, effectivePermissionsUse, createIfMissing));
3501 21 Sep 15 olle 384         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_ETOH995_SPECIMEN, 1, null, effectivePermissionsUse, createIfMissing));
3501 21 Sep 15 olle 385         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_BUFFER_PKD_SPECIMEN, 1, null, effectivePermissionsUse, createIfMissing));
3501 21 Sep 15 olle 386         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_BUFFER_ATL_SPECIMEN, 1, null, effectivePermissionsUse, createIfMissing));
3501 21 Sep 15 olle 387         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_PROTEINASE_K_SPECIMEN, 1, null, effectivePermissionsUse, createIfMissing));
3501 21 Sep 15 olle 388         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_RNASE_A_SPECIMEN, 1, null, effectivePermissionsUse, createIfMissing));
3501 21 Sep 15 olle 389         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_ETOH995, 1, null, effectivePermissionsUse, createIfMissing));
3501 21 Sep 15 olle 390         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_BUFFER_RLT, 1, null, effectivePermissionsUse, createIfMissing));
3501 21 Sep 15 olle 391         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_BUFFER_FRN, 1, null, effectivePermissionsUse, createIfMissing));
3501 21 Sep 15 olle 392         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_BUFFER_RPE, 1, null, effectivePermissionsUse, createIfMissing));
3501 21 Sep 15 olle 393         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_BUFFER_AL, 1, null, effectivePermissionsUse, createIfMissing));
3501 21 Sep 15 olle 394         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_BUFFER_AW1, 1, null, effectivePermissionsUse, createIfMissing));
3501 21 Sep 15 olle 395         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_BUFFER_AW2, 1, null, effectivePermissionsUse, createIfMissing));
3501 21 Sep 15 olle 396         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_BUFFER_ATE, 1, null, effectivePermissionsUse, createIfMissing));
3501 21 Sep 15 olle 397         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_BUFFER_RDD, 1, null, effectivePermissionsUse, createIfMissing));
3501 21 Sep 15 olle 398         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_RNASE_FREE_WATER, 1, null, effectivePermissionsUse, createIfMissing));
3501 21 Sep 15 olle 399         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_DNASE_MIX, 1, null, effectivePermissionsUse, createIfMissing));
3501 21 Sep 15 olle 400         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_RNEASY_MIN_ELUTE_SPIN_COL, 1, null, effectivePermissionsUse, createIfMissing));
3501 21 Sep 15 olle 401         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_QIAAMP_MIN_ELUTE_SPIN_COL, 1, null, effectivePermissionsUse, createIfMissing));
3501 21 Sep 15 olle 402         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_KAPA_SYBR_FAST, 1, null, effectivePermissionsUse, createIfMissing));
3501 21 Sep 15 olle 403         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_QUALITY_CONTROL_PRIMERS_QCP_RGT, 1, null, effectivePermissionsUse, createIfMissing));
3501 21 Sep 15 olle 404         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_QUALITY_CONTROL_TEMPLATE_QCT, 1, null, effectivePermissionsUse, createIfMissing));
3501 21 Sep 15 olle 405         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_QUBIT_DNA_HIGH_SENS, 1, null, effectivePermissionsUse, createIfMissing));
3501 21 Sep 15 olle 406         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIST_QUBIT_DNA_BROAD_RANGE, 1, null, effectivePermissionsUse, createIfMissing));
3430 29 Jun 15 olle 407
5111 20 Nov 18 olle 408         jsonChecks.add(checkAnnotationType(dc, Annotationtype.IHC, 1, 
5111 20 Nov 18 olle 409             new ValueOptions("p63"),
5111 20 Nov 18 olle 410             effectivePermissionsUse, createIfMissing));
5111 20 Nov 18 olle 411
3449 28 Jul 15 olle 412         // Library preparation
3449 28 Jul 15 olle 413         jsonChecks.add(checkAnnotationType(dc, Annotationtype.POOL_SCHEMA, 1, 
3449 28 Jul 15 olle 414             new ValueOptions("2by48", "4by24", "1by16", "2by16", "3by16", "4by16", "5by16", "NP1by16"), 
3449 28 Jul 15 olle 415             effectivePermissionsUse, createIfMissing));
3449 28 Jul 15 olle 416         jsonChecks.add(checkAnnotationType(dc, Annotationtype.BARCODE_VARIANT, 1, null,  effectivePermissionsUse, createIfMissing));
3449 28 Jul 15 olle 417         jsonChecks.add(checkAnnotationType(dc, Annotationtype.BARCODE_SEQUENCE, 1, null, effectivePermissionsUse, createIfMissing));
3630 27 Nov 15 olle 418         jsonChecks.add(checkAnnotationType(dc, Annotationtype.CONTROL_LOT_NO, 1, null, effectivePermissionsUse, createIfMissing));
3719 22 Jan 16 olle 419         jsonChecks.add(checkAnnotationType(dc, Annotationtype.QPCR_BRANCH, 1, null, effectivePermissionsUse, createIfMissing));
3449 28 Jul 15 olle 420
3610 20 Nov 15 olle 421         // Library preparation kits
3610 20 Nov 15 olle 422         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_LIB_PREP_BOX1, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 423         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_LIB_INDEX_KIT, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 424         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_CONTENT_SET_BOX3, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 425         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_OLIGO_POOL_A_FPA, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 426         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_OLIGO_POOL_B_FPB, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 427         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_OLIGO_HYBR_SEQ_REAGENT3_OHS3, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 428         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_STRINGENT_WASH1_SW1, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 429         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_EXTENSION_LIGATION_MIX3_ELM3, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 430         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_PCR_MASTER_MIX2_PMM2, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 431         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_UB1, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 432         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_TDP, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 433         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_FILTER_PLATE, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 434         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_A701, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 435         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_A702, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 436         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_A703, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 437         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_A704, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 438         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_A705, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 439         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_A706, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 440         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_A707, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 441         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_A708, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 442         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_A709, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 443         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_A710, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 444         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_A711, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 445         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_A712, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 446         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_A501, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 447         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_A502, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 448         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_A503, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 449         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_A504, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 450         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_A505, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 451         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_A506, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 452         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_A507, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 453         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_A508, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 454         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_LAST_UPDATED, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 455         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_NUMBER_TIMES_USED, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 456         jsonChecks.add(checkAnnotationType(dc, Annotationtype.LIBPREPKIT_UNUSED_FPA_WELLS, 1, null, effectivePermissionsUse, createIfMissing));
3610 20 Nov 15 olle 457
2933 14 Nov 14 olle 458         // Annotation type categories
2933 14 Nov 14 olle 459         jsonChecks.add(checkAnnotationTypeCategory(dc, Subtype.PATIENT, createIfMissing, 
2933 14 Nov 14 olle 460             Annotationtype.ALL_FIRST_NAMES, Annotationtype.DATE_OF_BIRTH, 
2933 14 Nov 14 olle 461             Annotationtype.FAMILY_NAME, Annotationtype.GENDER, Annotationtype.PERSONAL_NUMBER));
2933 14 Nov 14 olle 462         
3028 11 Dec 14 olle 463         jsonChecks.add(checkAnnotationTypeCategory(dc, Subtype.CASE, createIfMissing,
4773 20 Apr 18 olle 464             Annotationtype.CONSENT, Annotationtype.CONSENT_DATE,
4879 27 Jun 18 olle 465             Annotationtype.DIAGNOSIS_CONFIRMED,
4840 08 Jun 18 olle 466             Annotationtype.REFERRAL_ID,
3028 11 Dec 14 olle 467             Annotationtype.MUTATION_ANALYSIS,
3028 11 Dec 14 olle 468             Annotationtype.SITE, Annotationtype.TUBE_CONTENT_TYPE, Annotationtype.PROJECT_FOCUS,
5158 30 Nov 18 olle 469             Annotationtype.NOF_DELIVERED_TUBES,
5243 17 Jan 19 olle 470             Annotationtype.FFPE_BLOCK_ORDER_DATE));
2933 14 Nov 14 olle 471         
4899 10 Jul 18 olle 472         jsonChecks.add(checkAnnotationTypeCategory(dc, Subtype.BLOOD, createIfMissing, 
4899 10 Jul 18 olle 473             Annotationtype.CONSENT, Annotationtype.CONSENT_DATE,
4899 10 Jul 18 olle 474             Annotationtype.CASE_ID,
4986 28 Sep 18 olle 475             Annotationtype.TUBE_LABEL,
5027 15 Oct 18 olle 476             Annotationtype.SAMPLING_DATE,
4899 10 Jul 18 olle 477             Annotationtype.BLOOD_SAMPLING_DATETIME,
5027 15 Oct 18 olle 478             Annotationtype.ARRIVAL_DATE,
5034 17 Oct 18 olle 479             Annotationtype.ARRIVAL_OPERATOR,
4899 10 Jul 18 olle 480             Annotationtype.OTHER_PATH_NOTE));
4899 10 Jul 18 olle 481
4903 10 Jul 18 olle 482         jsonChecks.add(checkAnnotationTypeCategory(dc, Subtype.FFPE_BLOCK, createIfMissing, 
4903 10 Jul 18 olle 483             Annotationtype.CONSENT, Annotationtype.CONSENT_DATE,
4903 10 Jul 18 olle 484             Annotationtype.CASE_ID,
4903 10 Jul 18 olle 485             Annotationtype.PAD,
5074 06 Nov 18 olle 486             Annotationtype.MATERIAL_NUMBER,
5160 30 Nov 18 olle 487             Annotationtype.LOCALISATION,
4903 10 Jul 18 olle 488             Annotationtype.SAMPLING_DATE,
5044 19 Oct 18 olle 489             Annotationtype.ARRIVAL_DATE,
5044 19 Oct 18 olle 490             Annotationtype.YELLOW_LABEL,
5044 19 Oct 18 olle 491             Annotationtype.OPERATOR_DELIVERY_COMMENT,
5052 25 Oct 18 olle 492             Annotationtype.OTHER_PATH_NOTE,
5061 30 Oct 18 olle 493             Annotationtype.USED_FOR_FFPE_SECTION_ORDER_FORM,
5061 30 Oct 18 olle 494             Annotationtype.USED_FOR_FFPE_SECTION,
5060 29 Oct 18 olle 495             Annotationtype.RETURNED_DATE));
4903 10 Jul 18 olle 496
2933 14 Nov 14 olle 497         jsonChecks.add(checkAnnotationTypeCategory(dc, Subtype.SPECIMEN, createIfMissing, 
3050 17 Dec 14 olle 498             Annotationtype.ARRIVAL_DATE,
3028 11 Dec 14 olle 499             Annotationtype.NOF_SECTIONS, Annotationtype.OPERATOR_DELIVERY_COMMENT,
2933 14 Nov 14 olle 500             Annotationtype.OTHER_PATH_NOTE,
2933 14 Nov 14 olle 501             Annotationtype.PL_NUMBER, Annotationtype.PAD,
3067 08 Jan 15 olle 502             Annotationtype.SAMPLING_DATE, Annotationtype.SPECIMEN_TYPE,
4195 31 Oct 16 olle 503             Annotationtype.SPECIMEN_INPUT_TYPE,
5031 16 Oct 18 olle 504             Annotationtype.YELLOW_LABEL, 
5031 16 Oct 18 olle 505             Annotationtype.COMPLETED_DATE,
3067 08 Jan 15 olle 506             Annotationtype.VIABLE_TUMOUR_CELLS_PERCENT));
2933 14 Nov 14 olle 507
5093 14 Nov 18 olle 508 /*
5093 14 Nov 18 olle 509         jsonChecks.add(checkAnnotationTypeCategory(dc, Subtype.HISTOLOGY, createIfMissing,
5093 14 Nov 18 olle 510             Annotationtype.AUTO_PROCESSING, Annotationtype.FLAG));
5093 14 Nov 18 olle 511 */
5111 20 Nov 18 olle 512 /*
5111 20 Nov 18 olle 513         jsonChecks.add(checkAnnotationTypeCategory(dc, Subtype.STAINED, createIfMissing,
5111 20 Nov 18 olle 514             Annotationtype.IHC, Annotationtype.IHC_QUALITY,
5111 20 Nov 18 olle 515             Annotationtype.GOOD_STAIN, Annotationtype.SCORE_COMPLETE, Annotationtype.SCORE_INVASIVE_CANCER,
5111 20 Nov 18 olle 516             Annotationtype.SCORE_INSITU_CANCER, Annotationtype.SCORE_LYMPHOCYTES, Annotationtype.SCORE_NORMAL,
5111 20 Nov 18 olle 517             Annotationtype.SCORE_STROMA, Annotationtype.SCORE_FAT));
5111 20 Nov 18 olle 518 */
5111 20 Nov 18 olle 519         jsonChecks.add(checkAnnotationTypeCategory(dc, Subtype.STAINED, createIfMissing,
5111 20 Nov 18 olle 520             Annotationtype.IHC,
5111 20 Nov 18 olle 521             Annotationtype.TUMOUR_CELLS_PERCENT));
5093 14 Nov 18 olle 522
2933 14 Nov 14 olle 523         jsonChecks.add(checkAnnotationTypeCategory(dc, Subtype.RNA, createIfMissing,
3318 08 May 15 olle 524             Annotationtype.ARRIVAL_DATE_EXTRACT,
3318 08 May 15 olle 525             Annotationtype.SAMPLING_DATE_EXTRACT,
3318 08 May 15 olle 526             Annotationtype.SPECIMEN_TYPE_EXTRACT,
3318 08 May 15 olle 527             Annotationtype.VIABLE_TUMOUR_CELLS_PERCENT_EXTRACT,
3318 08 May 15 olle 528             Annotationtype.OPERATOR_DELIVERY_COMMENT_EXTRACT,
3180 17 Mar 15 olle 529             Annotationtype.ISOLATION_DATE,
3501 21 Sep 15 olle 530             Annotationtype.EXTRACTION_OPERATOR,
3176 06 Mar 15 olle 531             Annotationtype.XYLENE_SPECIMEN,
3176 06 Mar 15 olle 532             Annotationtype.ETOH995_SPECIMEN,
3176 06 Mar 15 olle 533             Annotationtype.BUFFER_PKD_SPECIMEN,
3176 06 Mar 15 olle 534             Annotationtype.BUFFER_ATL_SPECIMEN,
3176 06 Mar 15 olle 535             Annotationtype.PROTEINASE_K_SPECIMEN,
3176 06 Mar 15 olle 536             Annotationtype.RNASE_A_SPECIMEN,
3176 06 Mar 15 olle 537             Annotationtype.QIACUBE_DATE,
3176 06 Mar 15 olle 538             Annotationtype.QIACUBE_OPERATOR,
3176 06 Mar 15 olle 539             Annotationtype.QIACUBE_INSTRUMENT_PREFIX,
3176 06 Mar 15 olle 540             Annotationtype.QIACUBE_POSITION,
3176 06 Mar 15 olle 541             Annotationtype.QIACUBE_RUN_NO,
3176 06 Mar 15 olle 542             Annotationtype.ALLPREP_FFPE_KIT,
3176 06 Mar 15 olle 543             Annotationtype.ETOH995,
3176 06 Mar 15 olle 544             Annotationtype.BUFFER_RLT,
3176 06 Mar 15 olle 545             Annotationtype.BUFFER_FRN,
3176 06 Mar 15 olle 546             Annotationtype.BUFFER_RPE,
3176 06 Mar 15 olle 547             Annotationtype.BUFFER_AL,
3176 06 Mar 15 olle 548             Annotationtype.BUFFER_AW1,
3176 06 Mar 15 olle 549             Annotationtype.BUFFER_AW2,
3176 06 Mar 15 olle 550             Annotationtype.BUFFER_ATE,
3176 06 Mar 15 olle 551             Annotationtype.BUFFER_RDD,
3176 06 Mar 15 olle 552             Annotationtype.RNASE_FREE_WATER,
3176 06 Mar 15 olle 553             Annotationtype.DNASE_MIX,
3176 06 Mar 15 olle 554             Annotationtype.RNEASY_MIN_ELUTE_SPIN_COL,
3176 06 Mar 15 olle 555             Annotationtype.QIAAMP_MIN_ELUTE_SPIN_COL,
3324 11 May 15 olle 556             Annotationtype.KAPA_SYBR_FAST,
3324 11 May 15 olle 557             Annotationtype.QUALITY_CONTROL_PRIMERS_QCP_RGT,
3438 03 Jul 15 olle 558             Annotationtype.QUALITY_CONTROL_TEMPLATE_QCT,
3324 11 May 15 olle 559             Annotationtype.QUBIT_DNA_HIGH_SENS,
3324 11 May 15 olle 560             Annotationtype.QUBIT_DNA_BROAD_RANGE,
3176 06 Mar 15 olle 561             Annotationtype.ND_CONC,
3176 06 Mar 15 olle 562             Annotationtype.ND_260_BY_280,
3176 06 Mar 15 olle 563             Annotationtype.ND_260_BY_230,
3176 06 Mar 15 olle 564             Annotationtype.QUBIT_CONC,
3176 06 Mar 15 olle 565             Annotationtype.DELTA_CT));
2933 14 Nov 14 olle 566         
2933 14 Nov 14 olle 567         jsonChecks.add(checkAnnotationTypeCategory(dc, Subtype.DNA, createIfMissing,
3318 08 May 15 olle 568             Annotationtype.ARRIVAL_DATE_EXTRACT,
3318 08 May 15 olle 569             Annotationtype.SAMPLING_DATE_EXTRACT,
3318 08 May 15 olle 570             Annotationtype.SPECIMEN_TYPE_EXTRACT,
3318 08 May 15 olle 571             Annotationtype.VIABLE_TUMOUR_CELLS_PERCENT_EXTRACT,
3318 08 May 15 olle 572             Annotationtype.OPERATOR_DELIVERY_COMMENT_EXTRACT,
3180 17 Mar 15 olle 573             Annotationtype.ISOLATION_DATE,
3501 21 Sep 15 olle 574             Annotationtype.EXTRACTION_OPERATOR,
3176 06 Mar 15 olle 575             Annotationtype.XYLENE_SPECIMEN,
3176 06 Mar 15 olle 576             Annotationtype.ETOH995_SPECIMEN,
3176 06 Mar 15 olle 577             Annotationtype.BUFFER_PKD_SPECIMEN,
3176 06 Mar 15 olle 578             Annotationtype.BUFFER_ATL_SPECIMEN,
3176 06 Mar 15 olle 579             Annotationtype.PROTEINASE_K_SPECIMEN,
3176 06 Mar 15 olle 580             Annotationtype.RNASE_A_SPECIMEN,
3176 06 Mar 15 olle 581             Annotationtype.QIACUBE_DATE,
3176 06 Mar 15 olle 582             Annotationtype.QIACUBE_OPERATOR,
3176 06 Mar 15 olle 583             Annotationtype.QIACUBE_INSTRUMENT_PREFIX,
3176 06 Mar 15 olle 584             Annotationtype.QIACUBE_POSITION,
3176 06 Mar 15 olle 585             Annotationtype.QIACUBE_RUN_NO,
3176 06 Mar 15 olle 586             Annotationtype.ALLPREP_FFPE_KIT,
3176 06 Mar 15 olle 587             Annotationtype.ETOH995,
3176 06 Mar 15 olle 588             Annotationtype.BUFFER_RLT,
3176 06 Mar 15 olle 589             Annotationtype.BUFFER_FRN,
3176 06 Mar 15 olle 590             Annotationtype.BUFFER_RPE,
3176 06 Mar 15 olle 591             Annotationtype.BUFFER_AL,
3176 06 Mar 15 olle 592             Annotationtype.BUFFER_AW1,
3176 06 Mar 15 olle 593             Annotationtype.BUFFER_AW2,
3176 06 Mar 15 olle 594             Annotationtype.BUFFER_ATE,
3176 06 Mar 15 olle 595             Annotationtype.BUFFER_RDD,
3176 06 Mar 15 olle 596             Annotationtype.RNASE_FREE_WATER,
3176 06 Mar 15 olle 597             Annotationtype.DNASE_MIX,
3176 06 Mar 15 olle 598             Annotationtype.RNEASY_MIN_ELUTE_SPIN_COL,
3176 06 Mar 15 olle 599             Annotationtype.QIAAMP_MIN_ELUTE_SPIN_COL,
3324 11 May 15 olle 600             Annotationtype.KAPA_SYBR_FAST,
3324 11 May 15 olle 601             Annotationtype.QUALITY_CONTROL_PRIMERS_QCP_RGT,
3438 03 Jul 15 olle 602             Annotationtype.QUALITY_CONTROL_TEMPLATE_QCT,
3324 11 May 15 olle 603             Annotationtype.QUBIT_DNA_HIGH_SENS,
3324 11 May 15 olle 604             Annotationtype.QUBIT_DNA_BROAD_RANGE,
3176 06 Mar 15 olle 605             Annotationtype.ND_CONC,
3176 06 Mar 15 olle 606             Annotationtype.ND_260_BY_280,
3176 06 Mar 15 olle 607             Annotationtype.ND_260_BY_230,
3176 06 Mar 15 olle 608             Annotationtype.QUBIT_CONC,
3630 27 Nov 15 olle 609             Annotationtype.DELTA_CT,
3719 22 Jan 16 olle 610             Annotationtype.CONTROL_LOT_NO,
3719 22 Jan 16 olle 611             Annotationtype.QPCR_BRANCH));
2933 14 Nov 14 olle 612
3449 28 Jul 15 olle 613         jsonChecks.add(checkAnnotationType(dc, Annotationtype.PLATE_PROCESS_RESULT, 1,
3449 28 Jul 15 olle 614             new ValueOptions(ReactionPlate.PROCESS_SUCCESSFUL, ReactionPlate.PROCESS_FAILED),
3449 28 Jul 15 olle 615             effectivePermissionsUse, createIfMissing));
3449 28 Jul 15 olle 616         jsonChecks.add(checkAnnotationTypeCategory(dc, Subtype.DNA, createIfMissing,
3641 02 Dec 15 olle 617             Annotationtype.POOL_SCHEMA, Annotationtype.BARCODE_VARIANT, Annotationtype.PLATE_PROCESS_RESULT));
3180 17 Mar 15 olle 618 /*
3180 17 Mar 15 olle 619         jsonChecks.add(checkAnnotationTypeCategory(dc, Subtype.CDNA, createIfMissing,
3180 17 Mar 15 olle 620             Annotationtype.SYNTHESIS_DATE, Annotationtype.SYNTHESIS_OPERATOR,
3180 17 Mar 15 olle 621             Annotationtype.POOL_SCHEMA, Annotationtype.BARCODE_VARIANT, Annotationtype.PLATE_PROCESS_RESULT));
3180 17 Mar 15 olle 622 */
3180 17 Mar 15 olle 623         jsonChecks.add(checkAnnotationTypeCategory(dc, Subtype.DNA, createIfMissing));
3449 28 Jul 15 olle 624         jsonChecks.add(checkAnnotationTypeCategory(dc, Subtype.BARCODE, createIfMissing, 
3449 28 Jul 15 olle 625             Annotationtype.BARCODE_SEQUENCE
3449 28 Jul 15 olle 626           ));
3180 17 Mar 15 olle 627           
3180 17 Mar 15 olle 628           
2933 14 Nov 14 olle 629         // File servers
2933 14 Nov 14 olle 630
5271 29 Jan 19 olle 631         // Directories
5271 29 Jan 19 olle 632         //jsonChecks.add(checkDirectory(dc, Histology.IMAGE_DIR, createIfMissing, effectivePermissionsUse));
5271 29 Jan 19 olle 633         List<String> projectNameList = new ArrayList<String>();
5271 29 Jan 19 olle 634         projectNameList.add("SCAN-B-rec");
5686 25 Oct 19 olle 635         projectNameList.add("NordicTrip");
6783 25 Jul 22 olle 636         projectNameList.add("LUCAS");
5271 29 Jan 19 olle 637         for (String projectName: projectNameList)
5271 29 Jan 19 olle 638         {
5271 29 Jan 19 olle 639           String referralFormTemplatesDir = Meludi.fetchReferralFormTemplatesDir(projectName);
5271 29 Jan 19 olle 640           String referralFormTemplatesOldDir = Meludi.fetchReferralFormTemplatesOldDir(projectName);
5271 29 Jan 19 olle 641           jsonChecks.add(checkDirectory(dc, referralFormTemplatesDir, createIfMissing, patientCuratorUse));
5271 29 Jan 19 olle 642           jsonChecks.add(checkDirectory(dc, referralFormTemplatesOldDir, createIfMissing, patientCuratorUse));
5327 06 Mar 19 olle 643 /*
5327 06 Mar 19 olle 644           // Creates sub-directories with names equals to site prefixes          
5271 29 Jan 19 olle 645           HashMap<String,String> siteKeySitePrefixHashMap = Meludi.fetchSiteKeySitePrefixHashMap(projectName);
5271 29 Jan 19 olle 646           for (Site site: Site.getAllSites())
5271 29 Jan 19 olle 647           {
5271 29 Jan 19 olle 648             String siteKey = site.getPrefix();
5271 29 Jan 19 olle 649             if (siteKey != null && siteKeySitePrefixHashMap != null)
5271 29 Jan 19 olle 650             {
5271 29 Jan 19 olle 651               String sitePrefix = siteKeySitePrefixHashMap.get(siteKey);
5271 29 Jan 19 olle 652               if (sitePrefix != null && !sitePrefix.equals(("")))
5271 29 Jan 19 olle 653               {
5271 29 Jan 19 olle 654                 String siteDirName = referralFormTemplatesDir + "/" + sitePrefix;
5271 29 Jan 19 olle 655                 jsonChecks.add(checkDirectory(dc, siteDirName, createIfMissing, patientCuratorUse));
5271 29 Jan 19 olle 656                 siteDirName = referralFormTemplatesOldDir + "/" + sitePrefix;
5271 29 Jan 19 olle 657                 jsonChecks.add(checkDirectory(dc, siteDirName, createIfMissing, patientCuratorUse));
5271 29 Jan 19 olle 658               }
5271 29 Jan 19 olle 659             }
5271 29 Jan 19 olle 660           }
5327 06 Mar 19 olle 661 */
5271 29 Jan 19 olle 662           String baselineFilesDir = Meludi.fetchBaselineFilesDir(projectName);
5271 29 Jan 19 olle 663           jsonChecks.add(checkDirectory(dc, baselineFilesDir, createIfMissing, patientCuratorUse));
5271 29 Jan 19 olle 664         }
5271 29 Jan 19 olle 665         
2933 14 Nov 14 olle 666         // Plugin definitions and configurations
2933 14 Nov 14 olle 667         
2933 14 Nov 14 olle 668         // Biomaterial lists
2933 14 Nov 14 olle 669         
2933 14 Nov 14 olle 670         // MIME types
2933 14 Nov 14 olle 671         
2933 14 Nov 14 olle 672         // Special items
2933 14 Nov 14 olle 673
2933 14 Nov 14 olle 674         // Tags
3449 28 Jul 15 olle 675 /*
3449 28 Jul 15 olle 676         for (int i = 1; i <= 27; i++)
3449 28 Jul 15 olle 677         {
3449 28 Jul 15 olle 678           // Skip 17, 24 and 26 since those are not present in our kits
3449 28 Jul 15 olle 679           if (i == 17 || i == 24 || i == 26) continue;
3449 28 Jul 15 olle 680           jsonChecks.add(checkTag(dc, "AD"+(i < 10 ? "00" : "0")+i, Subtype.BARCODE,
3449 28 Jul 15 olle 681               "TruSeq Adapter Index " + i,
3449 28 Jul 15 olle 682               effectivePermissionsUse, createIfMissing));
3449 28 Jul 15 olle 683         }
3449 28 Jul 15 olle 684 */
3449 28 Jul 15 olle 685         // Illumina Index 1 Primers Lot Number
3449 28 Jul 15 olle 686         for (int i = 1; i <= 12; i++)
3449 28 Jul 15 olle 687         {
3449 28 Jul 15 olle 688           jsonChecks.add(checkTag(dc, "A7"+(i < 10 ? "0" : "")+i, Subtype.BARCODE,
3449 28 Jul 15 olle 689               "TruSight Index 1 Primer " + i,
3449 28 Jul 15 olle 690               effectivePermissionsUse, createIfMissing));
3449 28 Jul 15 olle 691         }
3449 28 Jul 15 olle 692         // Illumina Index 2 Primers Lot Number
3449 28 Jul 15 olle 693         for (int i = 1; i <= 8; i++)
3449 28 Jul 15 olle 694         {
3449 28 Jul 15 olle 695           jsonChecks.add(checkTag(dc, "A5"+(i < 10 ? "0" : "")+i, Subtype.BARCODE,
3449 28 Jul 15 olle 696               "TruSight Index 2 Primer " + i,
3449 28 Jul 15 olle 697               effectivePermissionsUse, createIfMissing));
3449 28 Jul 15 olle 698         }
3449 28 Jul 15 olle 699         
2933 14 Nov 14 olle 700         json.put("checks", jsonChecks);
2933 14 Nov 14 olle 701                 
3101 21 Jan 15 olle 702         if (createIfMissing)
3101 21 Jan 15 olle 703         {
3101 21 Jan 15 olle 704           dc.commit();
3102 21 Jan 15 olle 705           CounterService.getInstance().setForceCount();
3101 21 Jan 15 olle 706         }
2933 14 Nov 14 olle 707       }
2933 14 Nov 14 olle 708       
2933 14 Nov 14 olle 709       else if ("GetPermissions".equals(cmd))
2933 14 Nov 14 olle 710       {
2933 14 Nov 14 olle 711         dc = sc.newDbControl();
2933 14 Nov 14 olle 712         boolean isRoot = sc.getLoggedInUserId() == SystemItems.getId(User.ROOT);
2933 14 Nov 14 olle 713         JSONObject jsonPermissions = new JSONObject();
2933 14 Nov 14 olle 714         jsonPermissions.put("Administrator", isRoot|| MeludiRole.ADMINISTRATOR.isMember(dc) ? 1 : 0);
2933 14 Nov 14 olle 715         jsonPermissions.put("PatientCurator", MeludiRole.PATIENT_CURATOR.isMember(dc) ? 1 : 0);
2933 14 Nov 14 olle 716         jsonPermissions.put("SamplePrep", MeludiRole.SAMPLE_PREP.isMember(dc) ? 1 : 0);
3527 05 Oct 15 olle 717         jsonPermissions.put("LibraryPrep", MeludiRole.LIBRARY_PREP.isMember(dc) ? 1 : 0);
2933 14 Nov 14 olle 718         
2933 14 Nov 14 olle 719         json.put("permissions", jsonPermissions);
2933 14 Nov 14 olle 720         dc.close();
2933 14 Nov 14 olle 721       }
2933 14 Nov 14 olle 722     }
2933 14 Nov 14 olle 723     catch (Throwable t)
2933 14 Nov 14 olle 724     {
2933 14 Nov 14 olle 725       t.printStackTrace();
2933 14 Nov 14 olle 726       json.clear();
2933 14 Nov 14 olle 727       json.put("status", "error");
2933 14 Nov 14 olle 728       json.put("message", t.getMessage());
2933 14 Nov 14 olle 729       json.put("stacktrace", ThrowableUtil.stackTraceToString(t));
2933 14 Nov 14 olle 730     }
2933 14 Nov 14 olle 731     finally
2933 14 Nov 14 olle 732     {
2933 14 Nov 14 olle 733       if (dc != null) dc.close();
2933 14 Nov 14 olle 734       json.writeJSONString(resp.getWriter());
2933 14 Nov 14 olle 735     }
2933 14 Nov 14 olle 736     
2933 14 Nov 14 olle 737     
2933 14 Nov 14 olle 738   }
2933 14 Nov 14 olle 739   
2933 14 Nov 14 olle 740   
2933 14 Nov 14 olle 741   /**
2933 14 Nov 14 olle 742     Creates an annotation type with the given options. The annotation
2933 14 Nov 14 olle 743     type is created in a separate transaction. The annotation can be enabled for 
2933 14 Nov 14 olle 744     one or more item-types.
2933 14 Nov 14 olle 745     
2933 14 Nov 14 olle 746     @since 2.5
2933 14 Nov 14 olle 747    */
2933 14 Nov 14 olle 748   public AnnotationType createAnnotationType(SessionControl sc, Annotationtype annotationType, 
2933 14 Nov 14 olle 749       int multiplicity, ValueOptions valueOptions, PermissionOptions permissions)
2933 14 Nov 14 olle 750   {
2933 14 Nov 14 olle 751     AnnotationType at = null;
2933 14 Nov 14 olle 752     DbControl dc = sc.newDbControl();
2933 14 Nov 14 olle 753     try
2933 14 Nov 14 olle 754     {
2933 14 Nov 14 olle 755       at = AnnotationType.getNew(dc, annotationType.getValueType());
2933 14 Nov 14 olle 756       at.setName(annotationType.getName());
2933 14 Nov 14 olle 757       for (Item it : annotationType.getMainType())
2933 14 Nov 14 olle 758       {
2933 14 Nov 14 olle 759         at.enableForItem(it);
2933 14 Nov 14 olle 760       }
2933 14 Nov 14 olle 761       at.setMultiplicity(multiplicity);
2933 14 Nov 14 olle 762       if (valueOptions != null)
2933 14 Nov 14 olle 763       {
2933 14 Nov 14 olle 764         if (valueOptions.isEnumeration())
2933 14 Nov 14 olle 765         {
2933 14 Nov 14 olle 766           at.setEnumeration(true);
2933 14 Nov 14 olle 767           at.setDisplayAsList(false);
2933 14 Nov 14 olle 768           at.setValues(valueOptions.getList());
2933 14 Nov 14 olle 769         }
2933 14 Nov 14 olle 770         else if (at.getValueType().isNumerical())
2933 14 Nov 14 olle 771         {
2933 14 Nov 14 olle 772           Integer max = valueOptions.getMax();
2933 14 Nov 14 olle 773           if (max != null)
2933 14 Nov 14 olle 774           {
2933 14 Nov 14 olle 775             at.setMaxValueLong(max.longValue());
2933 14 Nov 14 olle 776           }
2933 14 Nov 14 olle 777           Integer min = valueOptions.getMin();
2933 14 Nov 14 olle 778           if (min != null)
2933 14 Nov 14 olle 779           {
2933 14 Nov 14 olle 780             at.setMinValueLong(min.longValue());
2933 14 Nov 14 olle 781           }
2933 14 Nov 14 olle 782         }
2933 14 Nov 14 olle 783       }
2933 14 Nov 14 olle 784       if (permissions != null) permissions.applyPermissions(at);
2933 14 Nov 14 olle 785       dc.saveItem(at);
2933 14 Nov 14 olle 786       dc.commit();
2933 14 Nov 14 olle 787     }
2933 14 Nov 14 olle 788     finally
2933 14 Nov 14 olle 789     {
2933 14 Nov 14 olle 790       if (dc != null) dc.close();
2933 14 Nov 14 olle 791     }
2933 14 Nov 14 olle 792     return at;
2933 14 Nov 14 olle 793   }
2933 14 Nov 14 olle 794
2933 14 Nov 14 olle 795   /**
2933 14 Nov 14 olle 796     Check for an existing annotation type with the given options. A JSONObject is returned
2933 14 Nov 14 olle 797     with the result. The following keys are used:
2933 14 Nov 14 olle 798     <ul>
2933 14 Nov 14 olle 799     <li>itemType: ANNOTATIONTYPE
2933 14 Nov 14 olle 800     <li>name: The name of the annotation type
2933 14 Nov 14 olle 801     <li>id: The id of the annotation type if it exists
2933 14 Nov 14 olle 802     <li>status: ok, error, or missing
2933 14 Nov 14 olle 803     <li>message: A descriptive message in case of an error
2933 14 Nov 14 olle 804     </ul>
2933 14 Nov 14 olle 805     
2933 14 Nov 14 olle 806     @since 2.5
2933 14 Nov 14 olle 807   */
2933 14 Nov 14 olle 808   @SuppressWarnings("unchecked")
2933 14 Nov 14 olle 809   public JSONObject checkAnnotationType(DbControl dc, Annotationtype annotationType, 
2933 14 Nov 14 olle 810       int multiplicity, ValueOptions valueOptions, PermissionOptions permissions, 
2933 14 Nov 14 olle 811       boolean createIfMissing)
2933 14 Nov 14 olle 812   {
2933 14 Nov 14 olle 813     JSONObject json = new JSONObject();
2933 14 Nov 14 olle 814     JSONArray jsonMessages = new JSONArray();
2933 14 Nov 14 olle 815     json.put("itemType", Item.ANNOTATIONTYPE.name());
2933 14 Nov 14 olle 816     json.put("name", annotationType.getName());
2933 14 Nov 14 olle 817     
2933 14 Nov 14 olle 818     List<AnnotationType> result = annotationType.list(dc);
2933 14 Nov 14 olle 819     if (result.size() == 0)
2933 14 Nov 14 olle 820     {
2933 14 Nov 14 olle 821       if (createIfMissing)
2933 14 Nov 14 olle 822       {
2933 14 Nov 14 olle 823         AnnotationType at = createAnnotationType(dc.getSessionControl(), annotationType, 
2933 14 Nov 14 olle 824             multiplicity, valueOptions, permissions);
2933 14 Nov 14 olle 825         json.put("id", at.getId());
2933 14 Nov 14 olle 826         json.put("status", "ok");
2933 14 Nov 14 olle 827         jsonMessages.add("Created");
2933 14 Nov 14 olle 828       }
2933 14 Nov 14 olle 829       else
2933 14 Nov 14 olle 830       {
2933 14 Nov 14 olle 831         json.put("status", "missing");
2933 14 Nov 14 olle 832         jsonMessages.add("Not found");
2933 14 Nov 14 olle 833       }
2933 14 Nov 14 olle 834     }
2933 14 Nov 14 olle 835     else if (result.size() > 1)
2933 14 Nov 14 olle 836     {
2933 14 Nov 14 olle 837       json.put("status", "error");
2933 14 Nov 14 olle 838       jsonMessages.add("Found > 1 annotation type");
2933 14 Nov 14 olle 839     }
2933 14 Nov 14 olle 840     else
2933 14 Nov 14 olle 841     {
2933 14 Nov 14 olle 842       AnnotationType at = result.get(0);
2933 14 Nov 14 olle 843       json.put("id", at.getId());
2933 14 Nov 14 olle 844       json.put("status", "ok");// For now -- more checks below
2933 14 Nov 14 olle 845       if (permissions != null && !permissions.checkPermissions(at))
2933 14 Nov 14 olle 846       {
2933 14 Nov 14 olle 847         if (createIfMissing)
2933 14 Nov 14 olle 848         {
2933 14 Nov 14 olle 849           permissions.applyPermissions(at);
2933 14 Nov 14 olle 850           if (jsonMessages.size() == 0) jsonMessages.add("Fixed");
2933 14 Nov 14 olle 851         }
2933 14 Nov 14 olle 852         else
2933 14 Nov 14 olle 853         {
2933 14 Nov 14 olle 854           json.put("status", "incomplete");
2933 14 Nov 14 olle 855           jsonMessages.add(permissions.getMessage());
2933 14 Nov 14 olle 856         }
2933 14 Nov 14 olle 857       }
2933 14 Nov 14 olle 858       boolean allTypesOk = true;
2933 14 Nov 14 olle 859       boolean fixedTypes = false;
2933 14 Nov 14 olle 860       for (Item it : annotationType.getMainType())
2933 14 Nov 14 olle 861       {
2933 14 Nov 14 olle 862         if (!at.isEnabledForItem(it))
2933 14 Nov 14 olle 863         {
2933 14 Nov 14 olle 864           allTypesOk = false;
2933 14 Nov 14 olle 865           if (createIfMissing)
2933 14 Nov 14 olle 866           {
2933 14 Nov 14 olle 867             at.enableForItem(it);
2933 14 Nov 14 olle 868             fixedTypes = true;
2933 14 Nov 14 olle 869           }
2933 14 Nov 14 olle 870           else
2933 14 Nov 14 olle 871           {
2933 14 Nov 14 olle 872             json.put("status", "incomplete");
2933 14 Nov 14 olle 873             jsonMessages.add("Not enabled for " + it.name());
2933 14 Nov 14 olle 874           }
2933 14 Nov 14 olle 875         }
2933 14 Nov 14 olle 876       }
2933 14 Nov 14 olle 877       if (fixedTypes && jsonMessages.size() == 0) jsonMessages.add("Fixed");
2933 14 Nov 14 olle 878       if (at.getValueType() != annotationType.getValueType())
2933 14 Nov 14 olle 879       {
2933 14 Nov 14 olle 880         json.put("status", "error");
2933 14 Nov 14 olle 881         jsonMessages.add("Is not a " + annotationType.getValueType().name() + " type");
2933 14 Nov 14 olle 882       }
2933 14 Nov 14 olle 883       if (at.getMultiplicity() != multiplicity)
2933 14 Nov 14 olle 884       {
2933 14 Nov 14 olle 885         json.put("status", "error");
2933 14 Nov 14 olle 886         jsonMessages.add("Should have multiplicity=" + (multiplicity == 0 ? "unlimited" : multiplicity));
2933 14 Nov 14 olle 887       }
2933 14 Nov 14 olle 888       if (at.getDisableLogOfValues() != annotationType.getDisableChangeHistoryLog())
2933 14 Nov 14 olle 889       {
2933 14 Nov 14 olle 890         if (createIfMissing)
2933 14 Nov 14 olle 891         {
2933 14 Nov 14 olle 892           at.setDisableLogOfValues(annotationType.getDisableChangeHistoryLog());
2933 14 Nov 14 olle 893           if (jsonMessages.size() == 0) jsonMessages.add("Fixed");
2933 14 Nov 14 olle 894         }
2933 14 Nov 14 olle 895         else
2933 14 Nov 14 olle 896         {
2933 14 Nov 14 olle 897           json.put("status", "incomplete");
2933 14 Nov 14 olle 898           if (annotationType.getDisableChangeHistoryLog())
2933 14 Nov 14 olle 899           {
2933 14 Nov 14 olle 900             jsonMessages.add("Should disable change log");
2933 14 Nov 14 olle 901           }
2933 14 Nov 14 olle 902           else
2933 14 Nov 14 olle 903           {
2933 14 Nov 14 olle 904             jsonMessages.add("Should not disable change log");
2933 14 Nov 14 olle 905           }
2933 14 Nov 14 olle 906         }
2933 14 Nov 14 olle 907       }
2933 14 Nov 14 olle 908       if (at.isEnumeration() && (valueOptions == null || !valueOptions.isEnumeration()))
2933 14 Nov 14 olle 909       {
2933 14 Nov 14 olle 910         json.put("status", "error");
2933 14 Nov 14 olle 911         jsonMessages.add("Should not be an enumeration");
2933 14 Nov 14 olle 912       }
2933 14 Nov 14 olle 913       if (valueOptions != null)
2933 14 Nov 14 olle 914       {
2933 14 Nov 14 olle 915         if (valueOptions.isEnumeration())
2933 14 Nov 14 olle 916         {
2933 14 Nov 14 olle 917           if (!at.isEnumeration())
2933 14 Nov 14 olle 918           {
2933 14 Nov 14 olle 919             json.put("status", "error");
2933 14 Nov 14 olle 920             jsonMessages.add("Is not enumeration of: " + valueOptions.getList());
2933 14 Nov 14 olle 921           }
2933 14 Nov 14 olle 922           else if (!EqualsHelper.invariantEquals(at.getValues().toArray(), valueOptions.getArray()))
2933 14 Nov 14 olle 923           {
2933 14 Nov 14 olle 924             if (createIfMissing)
2933 14 Nov 14 olle 925             {
2933 14 Nov 14 olle 926               valueOptions.applyEnumeration(at);
2933 14 Nov 14 olle 927               if (jsonMessages.size() == 0) jsonMessages.add("Fixed");
2933 14 Nov 14 olle 928             }
2933 14 Nov 14 olle 929             else
2933 14 Nov 14 olle 930             {
2933 14 Nov 14 olle 931               json.put("status", "incomplete");
2933 14 Nov 14 olle 932               jsonMessages.add("Doesn't have all options: " + valueOptions.getList() + "!=" + at.getValues());
2933 14 Nov 14 olle 933             }
2933 14 Nov 14 olle 934           }
2933 14 Nov 14 olle 935         }
2933 14 Nov 14 olle 936         if (valueOptions.getMax() != null)
2933 14 Nov 14 olle 937         {
2933 14 Nov 14 olle 938           if (at.getMaxValueLong() == null || at.getMaxValueLong().longValue() != valueOptions.getMax().longValue())
2933 14 Nov 14 olle 939           {
2933 14 Nov 14 olle 940             json.put("status", "error");
2933 14 Nov 14 olle 941             jsonMessages.add("Should have max allowed value=" + valueOptions.getMax());
2933 14 Nov 14 olle 942           }
2933 14 Nov 14 olle 943         }
2933 14 Nov 14 olle 944         if (valueOptions.getMin() != null)
2933 14 Nov 14 olle 945         {
2933 14 Nov 14 olle 946           if (at.getMinValueLong() == null || at.getMinValueLong().longValue() != valueOptions.getMin().longValue())
2933 14 Nov 14 olle 947           {
2933 14 Nov 14 olle 948             json.put("status", "error");
2933 14 Nov 14 olle 949             jsonMessages.add("Should have min allowed value=" + valueOptions.getMin());
2933 14 Nov 14 olle 950           }
2933 14 Nov 14 olle 951         }
2933 14 Nov 14 olle 952       }
2933 14 Nov 14 olle 953     }
2933 14 Nov 14 olle 954     if (jsonMessages.size() == 0) jsonMessages.add("Ok");
2933 14 Nov 14 olle 955     json.put("messages", jsonMessages);
2933 14 Nov 14 olle 956     return json;
2933 14 Nov 14 olle 957   }
2933 14 Nov 14 olle 958   
2933 14 Nov 14 olle 959   /**
2933 14 Nov 14 olle 960     Create a group or role with the given options. The item is created in
2933 14 Nov 14 olle 961     a separate transaction.
2933 14 Nov 14 olle 962   */
3610 20 Nov 15 olle 963   public <T extends BasicItem & Nameable> T createMeludiRole(SessionControl sc, MeludiRole<T> role)
2933 14 Nov 14 olle 964   {
2933 14 Nov 14 olle 965     T r = null;
2933 14 Nov 14 olle 966     DbControl dc = sc.newDbControl();
2933 14 Nov 14 olle 967     try
2933 14 Nov 14 olle 968     {
2933 14 Nov 14 olle 969       r = role.create(dc);
2933 14 Nov 14 olle 970       r.setName(role.getName());
2933 14 Nov 14 olle 971       dc.saveItem(r);
2933 14 Nov 14 olle 972       dc.commit();
2933 14 Nov 14 olle 973     }
2933 14 Nov 14 olle 974     finally
2933 14 Nov 14 olle 975     {
2933 14 Nov 14 olle 976       if (dc != null) dc.close();
2933 14 Nov 14 olle 977     }
2933 14 Nov 14 olle 978     return r;
2933 14 Nov 14 olle 979   }
2933 14 Nov 14 olle 980
2933 14 Nov 14 olle 981   /**
2944 17 Nov 14 olle 982     Check for an existing meludi role (a BASE role or group) with the given options.
2933 14 Nov 14 olle 983     A JSONObject is returned with the result. The following keys are used:
2933 14 Nov 14 olle 984     <ul>
2933 14 Nov 14 olle 985     <li>itemType: GROUP or ROLE
2933 14 Nov 14 olle 986     <li>name: The name of the item
2933 14 Nov 14 olle 987     <li>id: The id of the item if it exists
2933 14 Nov 14 olle 988     <li>status: ok, error, or missing
2933 14 Nov 14 olle 989     <li>message: A descriptive message in case of an error
2933 14 Nov 14 olle 990     </ul>
2933 14 Nov 14 olle 991   */
2933 14 Nov 14 olle 992   @SuppressWarnings("unchecked")
2933 14 Nov 14 olle 993   public JSONObject checkMeludiRole(DbControl dc, MeludiRole<? extends BasicItem> role, boolean createIfMissing)
2933 14 Nov 14 olle 994   {
2933 14 Nov 14 olle 995     JSONObject json = new JSONObject();
2933 14 Nov 14 olle 996     JSONArray jsonMessages = new JSONArray();
2933 14 Nov 14 olle 997     json.put("itemType", role.getActualType().name());
2933 14 Nov 14 olle 998     json.put("name", role.getName());
2933 14 Nov 14 olle 999     
2933 14 Nov 14 olle 1000     List<? extends BasicItem> result = role.list(dc);
2933 14 Nov 14 olle 1001     if (result.size() == 0)
2933 14 Nov 14 olle 1002     {
2933 14 Nov 14 olle 1003       if (createIfMissing)
2933 14 Nov 14 olle 1004       {
2933 14 Nov 14 olle 1005         BasicItem g = createMeludiRole(dc.getSessionControl(), role);
2933 14 Nov 14 olle 1006         json.put("id", g.getId());
2933 14 Nov 14 olle 1007         json.put("status", "ok");
2933 14 Nov 14 olle 1008         jsonMessages.add("Created");
2933 14 Nov 14 olle 1009       }
2933 14 Nov 14 olle 1010       else
2933 14 Nov 14 olle 1011       {
2933 14 Nov 14 olle 1012         json.put("status", "missing");
2933 14 Nov 14 olle 1013         jsonMessages.add("Not found");
2933 14 Nov 14 olle 1014       }
2933 14 Nov 14 olle 1015     }
2933 14 Nov 14 olle 1016     else if (result.size() > 1)
2933 14 Nov 14 olle 1017     {
2933 14 Nov 14 olle 1018       json.put("status", "error");
2933 14 Nov 14 olle 1019       jsonMessages.add("Found > 1 " + role.getActualType().toString());
2933 14 Nov 14 olle 1020     }
2933 14 Nov 14 olle 1021     else
2933 14 Nov 14 olle 1022     {
2933 14 Nov 14 olle 1023       BasicItem g = result.get(0);
2933 14 Nov 14 olle 1024       json.put("id", g.getId());
2933 14 Nov 14 olle 1025       json.put("status", "ok");
2933 14 Nov 14 olle 1026       json.put("message", "Ok");
2933 14 Nov 14 olle 1027     }
2933 14 Nov 14 olle 1028     if (jsonMessages.size() == 0) jsonMessages.add("Ok");
2933 14 Nov 14 olle 1029     json.put("messages", jsonMessages);
2933 14 Nov 14 olle 1030     return json;
2933 14 Nov 14 olle 1031   }
2933 14 Nov 14 olle 1032
2933 14 Nov 14 olle 1033   @SuppressWarnings("unchecked")
2933 14 Nov 14 olle 1034   public JSONObject checkActiveProject(DbControl dc)
2933 14 Nov 14 olle 1035   {
2933 14 Nov 14 olle 1036     JSONObject json = new JSONObject();
2933 14 Nov 14 olle 1037     JSONArray jsonMessages = new JSONArray();
2933 14 Nov 14 olle 1038     json.put("itemType", Item.PROJECT.name());
2933 14 Nov 14 olle 1039     
2933 14 Nov 14 olle 1040     int projectId = dc.getSessionControl().getActiveProjectId();
2933 14 Nov 14 olle 1041     if (projectId == 0)
2933 14 Nov 14 olle 1042     {
2933 14 Nov 14 olle 1043       json.put("status", "warning");
2933 14 Nov 14 olle 1044       json.put("name", "not selected");
2933 14 Nov 14 olle 1045       jsonMessages.add("No active project");
2933 14 Nov 14 olle 1046     }
2933 14 Nov 14 olle 1047     else
2933 14 Nov 14 olle 1048     {
2933 14 Nov 14 olle 1049       Project p = Project.getById(dc, projectId);
2933 14 Nov 14 olle 1050       json.put("name", p.getName());
2933 14 Nov 14 olle 1051       json.put("id", projectId);
2933 14 Nov 14 olle 1052       json.put("status", "ok");
2933 14 Nov 14 olle 1053     }
2933 14 Nov 14 olle 1054     if (jsonMessages.size() == 0) jsonMessages.add("Ok");
2933 14 Nov 14 olle 1055     json.put("messages", jsonMessages);
2933 14 Nov 14 olle 1056     return json;
2933 14 Nov 14 olle 1057   }
2933 14 Nov 14 olle 1058
2933 14 Nov 14 olle 1059   /**
2933 14 Nov 14 olle 1060     Create a subtype with the given options. The subtype is created in
2933 14 Nov 14 olle 1061     a separate transaction.
2933 14 Nov 14 olle 1062     @since 2.0
2933 14 Nov 14 olle 1063   */
2933 14 Nov 14 olle 1064   public ItemSubtype createSubtype(SessionControl sc, Subtype def, Datafiletype fileType, Subtype... relatedTo)
2933 14 Nov 14 olle 1065   {
2933 14 Nov 14 olle 1066     ItemSubtype subtype = null;
2933 14 Nov 14 olle 1067     DbControl dc = sc.newDbControl();
2933 14 Nov 14 olle 1068     try
2933 14 Nov 14 olle 1069     {
2933 14 Nov 14 olle 1070       subtype = ItemSubtype.getNew(dc, def.getMainType());
2933 14 Nov 14 olle 1071       subtype.setName(def.getName());
2933 14 Nov 14 olle 1072       subtype.setPushAnnotations(def.getPushAnnotations());
2933 14 Nov 14 olle 1073       
2933 14 Nov 14 olle 1074       if (fileType != null)
2933 14 Nov 14 olle 1075       {
2933 14 Nov 14 olle 1076         ItemSubtypeFileType ft = subtype.getAssociatedDataFileType(fileType.load(dc), true);
2933 14 Nov 14 olle 1077         ft.setRequired(fileType.isRequired());
2933 14 Nov 14 olle 1078         ft.setAllowMultiple(fileType.getAllowMultiple());
2933 14 Nov 14 olle 1079       }
2933 14 Nov 14 olle 1080       
2933 14 Nov 14 olle 1081       if (relatedTo != null)
2933 14 Nov 14 olle 1082       {
2933 14 Nov 14 olle 1083         for (Subtype related : relatedTo)
2933 14 Nov 14 olle 1084         {
2933 14 Nov 14 olle 1085           ItemSubtype r = related.get(dc);
2933 14 Nov 14 olle 1086           if (r != null) subtype.setRelatedSubtype(r);
2933 14 Nov 14 olle 1087         }
2933 14 Nov 14 olle 1088       }
2933 14 Nov 14 olle 1089       
2933 14 Nov 14 olle 1090       dc.saveItem(subtype);
2933 14 Nov 14 olle 1091       dc.commit();
2933 14 Nov 14 olle 1092     }
2933 14 Nov 14 olle 1093     finally
2933 14 Nov 14 olle 1094     {
2933 14 Nov 14 olle 1095       if (dc != null) dc.close();
2933 14 Nov 14 olle 1096     }
2933 14 Nov 14 olle 1097     return subtype;
2933 14 Nov 14 olle 1098   }
2933 14 Nov 14 olle 1099   
2933 14 Nov 14 olle 1100   /**
2933 14 Nov 14 olle 1101     Check for an existing item subtype with the given options.
2933 14 Nov 14 olle 1102     A JSONObject is returned with the result. The following 
2933 14 Nov 14 olle 1103     keys are used:
2933 14 Nov 14 olle 1104     <ul>
2933 14 Nov 14 olle 1105     <li>itemType: ITEMSUBTYPE
2933 14 Nov 14 olle 1106     <li>name: The name of the subtype
2933 14 Nov 14 olle 1107     <li>id: The id of the subtype if it exists
2933 14 Nov 14 olle 1108     <li>mainType: The main item type that the subtype applies to
2933 14 Nov 14 olle 1109     <li>status: ok, error, or missing
2933 14 Nov 14 olle 1110     <li>message: A descriptive message in case of an error
2933 14 Nov 14 olle 1111     </ul
2933 14 Nov 14 olle 1112     @since 2.0
2933 14 Nov 14 olle 1113   */
2933 14 Nov 14 olle 1114   @SuppressWarnings("unchecked")
2933 14 Nov 14 olle 1115   public JSONObject checkSubtype(DbControl dc, Subtype subtype, 
2933 14 Nov 14 olle 1116     Datafiletype fileType, boolean createIfMissing, Subtype... relatedTo)
2933 14 Nov 14 olle 1117   {
2933 14 Nov 14 olle 1118   
2933 14 Nov 14 olle 1119     JSONObject json = new JSONObject();
2933 14 Nov 14 olle 1120     JSONArray jsonMessages = new JSONArray();
2933 14 Nov 14 olle 1121     json.put("itemType", Item.ITEMSUBTYPE.name());
2933 14 Nov 14 olle 1122     json.put("name", subtype.getName());
2933 14 Nov 14 olle 1123     json.put("mainType", subtype.getMainType().name());
2933 14 Nov 14 olle 1124       
2933 14 Nov 14 olle 1125     List<ItemSubtype> result = subtype.list(dc);
2933 14 Nov 14 olle 1126     if (result.size() == 0)
2933 14 Nov 14 olle 1127     {
2933 14 Nov 14 olle 1128       if (createIfMissing)
2933 14 Nov 14 olle 1129       {
2933 14 Nov 14 olle 1130         ItemSubtype s = createSubtype(dc.getSessionControl(), subtype, fileType, relatedTo);
2933 14 Nov 14 olle 1131         json.put("id", s.getId());
2933 14 Nov 14 olle 1132         json.put("status", "ok");
2933 14 Nov 14 olle 1133         jsonMessages.add("Created");
2933 14 Nov 14 olle 1134       }
2933 14 Nov 14 olle 1135       else
2933 14 Nov 14 olle 1136       {
2933 14 Nov 14 olle 1137         json.put("status", "missing");
2933 14 Nov 14 olle 1138         jsonMessages.add("Not found");
2933 14 Nov 14 olle 1139       }
2933 14 Nov 14 olle 1140     }
2933 14 Nov 14 olle 1141     else if (result.size() > 1)
2933 14 Nov 14 olle 1142     {
2933 14 Nov 14 olle 1143       json.put("status", "error");
2933 14 Nov 14 olle 1144       jsonMessages.add("Found > 1 subtype");
2933 14 Nov 14 olle 1145     }
2933 14 Nov 14 olle 1146     else
2933 14 Nov 14 olle 1147     {
2933 14 Nov 14 olle 1148       ItemSubtype s = result.get(0);
2933 14 Nov 14 olle 1149       json.put("id", s.getId());
2933 14 Nov 14 olle 1150       json.put("status", "ok"); // For now -- more checks below
2933 14 Nov 14 olle 1151       
2933 14 Nov 14 olle 1152       if (subtype.getPushAnnotations() != s.getPushAnnotations())
2933 14 Nov 14 olle 1153       {
2933 14 Nov 14 olle 1154         json.put("status", "error");
2933 14 Nov 14 olle 1155         jsonMessages.add("Should have 'Push annotations to parent'="+subtype.getPushAnnotations());
2933 14 Nov 14 olle 1156       }
2933 14 Nov 14 olle 1157       
2933 14 Nov 14 olle 1158       if (fileType != null)
2933 14 Nov 14 olle 1159       {
2933 14 Nov 14 olle 1160         DataFileType dft = fileType.get(dc);
2933 14 Nov 14 olle 1161         if (dft != null && !s.isAssociatedDataFileType(dft))
2933 14 Nov 14 olle 1162         {
2933 14 Nov 14 olle 1163           if (createIfMissing)
2933 14 Nov 14 olle 1164           {
2933 14 Nov 14 olle 1165             ItemSubtypeFileType ft = s.getAssociatedDataFileType(dft, true);
2933 14 Nov 14 olle 1166             ft.setRequired(fileType.isRequired());
2933 14 Nov 14 olle 1167             ft.setAllowMultiple(fileType.getAllowMultiple());
2933 14 Nov 14 olle 1168             jsonMessages.add("Fixed");
2933 14 Nov 14 olle 1169           }
2933 14 Nov 14 olle 1170           else
2933 14 Nov 14 olle 1171           {
2933 14 Nov 14 olle 1172             json.put("status", "incomplete");
2933 14 Nov 14 olle 1173             jsonMessages.add("Should be related to '" + fileType.getName() + " file type");
2933 14 Nov 14 olle 1174           }
2933 14 Nov 14 olle 1175         }
2933 14 Nov 14 olle 1176       }
2933 14 Nov 14 olle 1177       
2933 14 Nov 14 olle 1178       if (relatedTo != null)
2933 14 Nov 14 olle 1179       {
2933 14 Nov 14 olle 1180         for (Subtype related : relatedTo)
2933 14 Nov 14 olle 1181         {
2933 14 Nov 14 olle 1182           ItemSubtype r = s.getRelatedSubtype(related.getMainType());
2933 14 Nov 14 olle 1183           if (r == null)
2933 14 Nov 14 olle 1184           {
2933 14 Nov 14 olle 1185             r = related.get(dc);
2933 14 Nov 14 olle 1186             if (createIfMissing && r != null)
2933 14 Nov 14 olle 1187             {
2933 14 Nov 14 olle 1188               s.setRelatedSubtype(r);
2933 14 Nov 14 olle 1189               jsonMessages.add("Fixed");
2933 14 Nov 14 olle 1190             }
2933 14 Nov 14 olle 1191             else
2933 14 Nov 14 olle 1192             {
2933 14 Nov 14 olle 1193               json.put("status", "incomplete");
2933 14 Nov 14 olle 1194               jsonMessages.add("Should be related to '" + related.getName() + "' [" + related.getMainType().name() + "]");
2933 14 Nov 14 olle 1195             }
2933 14 Nov 14 olle 1196           }
2933 14 Nov 14 olle 1197           else if (!r.getName().equals(related.getName()))
2933 14 Nov 14 olle 1198           {
2933 14 Nov 14 olle 1199             if (createIfMissing)
2933 14 Nov 14 olle 1200             {
2933 14 Nov 14 olle 1201               s.setRelatedSubtype(related.get(dc));
2933 14 Nov 14 olle 1202               jsonMessages.add("Fixed");
2933 14 Nov 14 olle 1203             }
2933 14 Nov 14 olle 1204             else
2933 14 Nov 14 olle 1205             {
2933 14 Nov 14 olle 1206               json.put("status", "incomplete");
2933 14 Nov 14 olle 1207               jsonMessages.add("Should be related to: '" + 
2933 14 Nov 14 olle 1208                   related.getName() + "' not '" + r.getName() + "'");
2933 14 Nov 14 olle 1209             }
2933 14 Nov 14 olle 1210           }
2933 14 Nov 14 olle 1211         }
2933 14 Nov 14 olle 1212       }
2933 14 Nov 14 olle 1213       
2933 14 Nov 14 olle 1214     }
2933 14 Nov 14 olle 1215     if (jsonMessages.size() == 0) jsonMessages.add("Ok");
2933 14 Nov 14 olle 1216     json.put("messages", jsonMessages);
2933 14 Nov 14 olle 1217     return json;
2933 14 Nov 14 olle 1218
2933 14 Nov 14 olle 1219   }
2933 14 Nov 14 olle 1220   
2933 14 Nov 14 olle 1221   /**
2933 14 Nov 14 olle 1222     Create a Tag with the given options. The tag is created in
2933 14 Nov 14 olle 1223     a separate transaction.
2933 14 Nov 14 olle 1224     @since 2.12
2933 14 Nov 14 olle 1225   */
2933 14 Nov 14 olle 1226   public Tag createTag(SessionControl sc, String name, Subtype subtype, String description, PermissionOptions permissions)
2933 14 Nov 14 olle 1227   {
2933 14 Nov 14 olle 1228     Tag tag = null;
2933 14 Nov 14 olle 1229     DbControl dc = sc.newDbControl();
2933 14 Nov 14 olle 1230     try
2933 14 Nov 14 olle 1231     {
2933 14 Nov 14 olle 1232       tag = Tag.getNew(dc);
2933 14 Nov 14 olle 1233       tag.setName(name);
2933 14 Nov 14 olle 1234       tag.setItemSubtype(subtype.get(dc));
2933 14 Nov 14 olle 1235       tag.setDescription(description);
2933 14 Nov 14 olle 1236       if (permissions != null) permissions.applyPermissions(tag);
2933 14 Nov 14 olle 1237       dc.saveItem(tag);
2933 14 Nov 14 olle 1238       dc.commit();
2933 14 Nov 14 olle 1239     }
2933 14 Nov 14 olle 1240     finally
2933 14 Nov 14 olle 1241     {
2933 14 Nov 14 olle 1242       if (dc != null) dc.close();
2933 14 Nov 14 olle 1243     }
2933 14 Nov 14 olle 1244     return tag;
2933 14 Nov 14 olle 1245   }
2933 14 Nov 14 olle 1246
2933 14 Nov 14 olle 1247   
2933 14 Nov 14 olle 1248   /**
2933 14 Nov 14 olle 1249     Check for an existing tag with the given options.
2933 14 Nov 14 olle 1250     A JSONObject is returned with the result. The following 
2933 14 Nov 14 olle 1251     keys are used:
2933 14 Nov 14 olle 1252     <ul>
2933 14 Nov 14 olle 1253     <li>itemType: TAG
2933 14 Nov 14 olle 1254     <li>name: The name of the tag
2933 14 Nov 14 olle 1255     <li>id: The id of the subtype if it exists
2933 14 Nov 14 olle 1256     <li>status: ok, error, or missing
2933 14 Nov 14 olle 1257     <li>message: A descriptive message in case of an error
2933 14 Nov 14 olle 1258     </ul>
3449 28 Jul 15 olle 1259     @since 1.3
2933 14 Nov 14 olle 1260   */
2933 14 Nov 14 olle 1261   @SuppressWarnings("unchecked")
2933 14 Nov 14 olle 1262   public JSONObject checkTag(DbControl dc, String name, Subtype subtype, String description, PermissionOptions permissions, boolean createIfMissing)
2933 14 Nov 14 olle 1263   {
3449 28 Jul 15 olle 1264 System.out.println(new Date() + " InstallServlet::checkTag(): name = " + name + " subtype = " + subtype + " description = " + description + " createIfMissing = " + createIfMissing);  
2933 14 Nov 14 olle 1265     JSONObject json = new JSONObject();
2933 14 Nov 14 olle 1266     JSONArray jsonMessages = new JSONArray();
2933 14 Nov 14 olle 1267     json.put("itemType", Item.TAG.name());
2933 14 Nov 14 olle 1268     json.put("name", name);
2933 14 Nov 14 olle 1269     
2933 14 Nov 14 olle 1270     ItemQuery<Tag> query = Tag.getQuery();
2933 14 Nov 14 olle 1271     query.restrict(
2933 14 Nov 14 olle 1272         Restrictions.eq(
2933 14 Nov 14 olle 1273           Hql.property("name"), 
2933 14 Nov 14 olle 1274           Expressions.parameter("name", name, Type.STRING)
2933 14 Nov 14 olle 1275         ));
2933 14 Nov 14 olle 1276     query.include(Include.ALL);
2933 14 Nov 14 olle 1277     List<Tag> result = query.list(dc);
3449 28 Jul 15 olle 1278 System.out.println(new Date() + " InstallServlet::checkTag(): result.size() = " + result.size());  
2933 14 Nov 14 olle 1279     if (result.size() == 0)
2933 14 Nov 14 olle 1280     {
2933 14 Nov 14 olle 1281       if (createIfMissing)
2933 14 Nov 14 olle 1282       {
2933 14 Nov 14 olle 1283         Tag t = createTag(dc.getSessionControl(), name, subtype, description, permissions);
2933 14 Nov 14 olle 1284         json.put("id", t.getId());
2933 14 Nov 14 olle 1285         json.put("status", "ok");
2933 14 Nov 14 olle 1286         jsonMessages.add("Created");
2933 14 Nov 14 olle 1287       }
2933 14 Nov 14 olle 1288       else
2933 14 Nov 14 olle 1289       {
2933 14 Nov 14 olle 1290         json.put("status", "missing");
2933 14 Nov 14 olle 1291         jsonMessages.add("Not found");
2933 14 Nov 14 olle 1292       }
2933 14 Nov 14 olle 1293     }
2933 14 Nov 14 olle 1294     else if (result.size() > 1)
2933 14 Nov 14 olle 1295     {
2933 14 Nov 14 olle 1296       json.put("status", "error");
2933 14 Nov 14 olle 1297       jsonMessages.add("Found > 1 tag");
2933 14 Nov 14 olle 1298     }
2933 14 Nov 14 olle 1299     else
2933 14 Nov 14 olle 1300     {
2933 14 Nov 14 olle 1301       Tag t = result.get(0);
2933 14 Nov 14 olle 1302       json.put("id", t.getId());
2933 14 Nov 14 olle 1303       json.put("status", "ok"); // For now -- more checks below
2933 14 Nov 14 olle 1304       
2933 14 Nov 14 olle 1305       if (!subtype.load(dc).equals(t.getItemSubtype()))
2933 14 Nov 14 olle 1306       {
2933 14 Nov 14 olle 1307         json.put("status", "error");
2933 14 Nov 14 olle 1308         jsonMessages.add("Should have '" + subtype.getName() + "' as subtype.");
2933 14 Nov 14 olle 1309       }
2933 14 Nov 14 olle 1310       
2933 14 Nov 14 olle 1311       if (permissions != null && !permissions.checkPermissions(t))
2933 14 Nov 14 olle 1312       {
2933 14 Nov 14 olle 1313         if (createIfMissing)
2933 14 Nov 14 olle 1314         {
2933 14 Nov 14 olle 1315           permissions.applyPermissions(t);
2933 14 Nov 14 olle 1316           if (jsonMessages.size() == 0) jsonMessages.add("Fixed");
2933 14 Nov 14 olle 1317         }
2933 14 Nov 14 olle 1318         else
2933 14 Nov 14 olle 1319         {
2933 14 Nov 14 olle 1320           json.put("status", "incomplete");
2933 14 Nov 14 olle 1321           jsonMessages.add(permissions.getMessage());
2933 14 Nov 14 olle 1322         }
2933 14 Nov 14 olle 1323       }
2933 14 Nov 14 olle 1324       AnnotationType barcodeSequenceType = Annotationtype.BARCODE_SEQUENCE.get(dc);
3449 28 Jul 15 olle 1325 System.out.println(new Date() + " InstallServlet::checkTag(): barcodeSequenceType = " + barcodeSequenceType);  
2933 14 Nov 14 olle 1326       if (barcodeSequenceType != null)
2933 14 Nov 14 olle 1327       {
2933 14 Nov 14 olle 1328         String barcodeSequence = (String)Annotationtype.BARCODE_SEQUENCE.getAnnotationValue(dc, t);
3449 28 Jul 15 olle 1329 System.out.println(new Date() + " InstallServlet::checkTag(): (1) barcodeSequence = " + barcodeSequence);  
2933 14 Nov 14 olle 1330         if (barcodeSequence == null)
2933 14 Nov 14 olle 1331         {
3449 28 Jul 15 olle 1332 System.out.println(new Date() + " InstallServlet::checkTag(): createIfMissing = " + createIfMissing);  
2933 14 Nov 14 olle 1333           if (createIfMissing)
2933 14 Nov 14 olle 1334           {
2933 14 Nov 14 olle 1335             barcodeSequence = lookupSequence(name);
3449 28 Jul 15 olle 1336 System.out.println(new Date() + " InstallServlet::checkTag(): (2) barcodeSequence = " + barcodeSequence);  
2933 14 Nov 14 olle 1337             Annotationtype.BARCODE_SEQUENCE.setAnnotationValue(dc, t, barcodeSequence);
2933 14 Nov 14 olle 1338             if (jsonMessages.size() == 0) jsonMessages.add("Fixed");
2933 14 Nov 14 olle 1339           }
2933 14 Nov 14 olle 1340           else
2933 14 Nov 14 olle 1341           {
2933 14 Nov 14 olle 1342             json.put("status", "incomplete");
2933 14 Nov 14 olle 1343             jsonMessages.add("Missing BarcodeSequence annotation");
2933 14 Nov 14 olle 1344           }
2933 14 Nov 14 olle 1345         }
2933 14 Nov 14 olle 1346       }
2933 14 Nov 14 olle 1347     }
2933 14 Nov 14 olle 1348     if (jsonMessages.size() == 0) jsonMessages.add("Ok");
2933 14 Nov 14 olle 1349     json.put("messages", jsonMessages);
2933 14 Nov 14 olle 1350     return json;
2933 14 Nov 14 olle 1351   
2933 14 Nov 14 olle 1352   }
2933 14 Nov 14 olle 1353   
2933 14 Nov 14 olle 1354   /**
2933 14 Nov 14 olle 1355     Create an annotation type category with the given options. The category
2933 14 Nov 14 olle 1356     is created in a separate transaction.
2933 14 Nov 14 olle 1357     @since 2.5
2933 14 Nov 14 olle 1358   */
2933 14 Nov 14 olle 1359   public AnnotationTypeCategory createAnnotationTypeCategory(SessionControl sc, 
2933 14 Nov 14 olle 1360     Subtype subtype)
2933 14 Nov 14 olle 1361   {
2933 14 Nov 14 olle 1362     AnnotationTypeCategory cat = null;
2933 14 Nov 14 olle 1363     DbControl dc = sc.newDbControl();
2933 14 Nov 14 olle 1364     try
2933 14 Nov 14 olle 1365     {
2933 14 Nov 14 olle 1366       cat = AnnotationTypeCategory.getNew(dc);
2933 14 Nov 14 olle 1367       cat.setName(subtype.getName());
2933 14 Nov 14 olle 1368       dc.saveItem(cat);
2933 14 Nov 14 olle 1369       dc.commit();
2933 14 Nov 14 olle 1370     }
2933 14 Nov 14 olle 1371     finally
2933 14 Nov 14 olle 1372     {
2933 14 Nov 14 olle 1373       if (dc != null) dc.close();
2933 14 Nov 14 olle 1374     }
2933 14 Nov 14 olle 1375     return cat;
2933 14 Nov 14 olle 1376   }
2933 14 Nov 14 olle 1377
2933 14 Nov 14 olle 1378   /**
2933 14 Nov 14 olle 1379     Check for an existing annotation type category.
2933 14 Nov 14 olle 1380     A JSONObject is returned with the result. The following 
2933 14 Nov 14 olle 1381     keys are used:
2933 14 Nov 14 olle 1382     <ul>
2933 14 Nov 14 olle 1383     <li>itemType: ANNOTATIONTYPECATEGORY
2933 14 Nov 14 olle 1384     <li>name: The name of the subtype
2933 14 Nov 14 olle 1385     <li>id: The id of the subtype if it exists
2933 14 Nov 14 olle 1386     <li>mainType: The main item type that the subtype applies to
2933 14 Nov 14 olle 1387     <li>status: ok, error, or missing
2933 14 Nov 14 olle 1388     <li>message: A descriptive message in case of an error
2933 14 Nov 14 olle 1389     </ul>
2933 14 Nov 14 olle 1390     @since 2.5
2933 14 Nov 14 olle 1391   */
2933 14 Nov 14 olle 1392   @SuppressWarnings("unchecked")
2933 14 Nov 14 olle 1393   public JSONObject checkAnnotationTypeCategory(DbControl dc, Subtype subtype, 
2933 14 Nov 14 olle 1394     boolean createIfMissing, Annotationtype... annotationTypes)
2933 14 Nov 14 olle 1395   {
2933 14 Nov 14 olle 1396   
2933 14 Nov 14 olle 1397     JSONObject json = new JSONObject();
2933 14 Nov 14 olle 1398     JSONArray jsonMessages = new JSONArray();
2933 14 Nov 14 olle 1399     json.put("itemType", Item.ANNOTATIONTYPECATEGORY.name());
2933 14 Nov 14 olle 1400     json.put("name", subtype.getName());
2933 14 Nov 14 olle 1401       
2933 14 Nov 14 olle 1402     List<AnnotationTypeCategory> result = Meludi.listAnnotationTypeCategories(dc, subtype.getName());
2933 14 Nov 14 olle 1403     if (result.size() == 0)
2933 14 Nov 14 olle 1404     {
2933 14 Nov 14 olle 1405       if (createIfMissing)
2933 14 Nov 14 olle 1406       {
2933 14 Nov 14 olle 1407         AnnotationTypeCategory cat = createAnnotationTypeCategory(dc.getSessionControl(), subtype);
2933 14 Nov 14 olle 1408         // Add the category to annotation types in the original transaction
2933 14 Nov 14 olle 1409         if (annotationTypes != null)
2933 14 Nov 14 olle 1410         {
2933 14 Nov 14 olle 1411           for (Annotationtype annotationType : annotationTypes)
2933 14 Nov 14 olle 1412           {
2933 14 Nov 14 olle 1413             AnnotationType at = annotationType.load(dc);
2933 14 Nov 14 olle 1414             at.addCategory(cat);
2933 14 Nov 14 olle 1415           }
2933 14 Nov 14 olle 1416         }
2933 14 Nov 14 olle 1417
2933 14 Nov 14 olle 1418         json.put("id", cat.getId());
2933 14 Nov 14 olle 1419         json.put("status", "ok");
2933 14 Nov 14 olle 1420         jsonMessages.add("Created");
2933 14 Nov 14 olle 1421       }
2933 14 Nov 14 olle 1422       else
2933 14 Nov 14 olle 1423       {
2933 14 Nov 14 olle 1424         json.put("status", "missing");
2933 14 Nov 14 olle 1425         jsonMessages.add("Not found");
2933 14 Nov 14 olle 1426       }
2933 14 Nov 14 olle 1427     }
2933 14 Nov 14 olle 1428     else if (result.size() > 1)
2933 14 Nov 14 olle 1429     {
2933 14 Nov 14 olle 1430       json.put("status", "error");
2933 14 Nov 14 olle 1431       jsonMessages.add("Found > 1 annotation type category");
2933 14 Nov 14 olle 1432     }
2933 14 Nov 14 olle 1433     else
2933 14 Nov 14 olle 1434     {
2933 14 Nov 14 olle 1435       AnnotationTypeCategory cat = result.get(0);
2933 14 Nov 14 olle 1436       json.put("id", cat.getId());
2933 14 Nov 14 olle 1437       json.put("status", "ok"); // For now -- more checks below
2933 14 Nov 14 olle 1438       
2933 14 Nov 14 olle 1439       if (annotationTypes != null)
2933 14 Nov 14 olle 1440       {
2933 14 Nov 14 olle 1441         for (Annotationtype annotationType : annotationTypes)
2933 14 Nov 14 olle 1442         {
2933 14 Nov 14 olle 1443           List<AnnotationType> list = annotationType.list(dc); // Use list() to avoid throwing exceptions if the annotation type doesn't exists yet
2933 14 Nov 14 olle 1444           AnnotationType at = list.size() == 1 ? list.get(0) : null;
2933 14 Nov 14 olle 1445           if (at != null && !at.isMember(cat))
2933 14 Nov 14 olle 1446           {
2933 14 Nov 14 olle 1447             if (createIfMissing)
2933 14 Nov 14 olle 1448             {
2933 14 Nov 14 olle 1449               at.addCategory(cat);
2933 14 Nov 14 olle 1450               if (jsonMessages.size() == 0) jsonMessages.add("Fixed");
2933 14 Nov 14 olle 1451             }
2933 14 Nov 14 olle 1452             else
2933 14 Nov 14 olle 1453             {
2933 14 Nov 14 olle 1454               json.put("status", "incomplete");
2933 14 Nov 14 olle 1455               jsonMessages.add("Not linked with: " + annotationType.getName());
2933 14 Nov 14 olle 1456             }
2933 14 Nov 14 olle 1457           }
2933 14 Nov 14 olle 1458         }
2933 14 Nov 14 olle 1459       }
2933 14 Nov 14 olle 1460     }
2933 14 Nov 14 olle 1461     if (jsonMessages.size() == 0) jsonMessages.add("Ok");
2933 14 Nov 14 olle 1462     json.put("messages", jsonMessages);
2933 14 Nov 14 olle 1463     return json;
2933 14 Nov 14 olle 1464   
2933 14 Nov 14 olle 1465   }
2933 14 Nov 14 olle 1466   
2933 14 Nov 14 olle 1467   
2933 14 Nov 14 olle 1468   /**
2933 14 Nov 14 olle 1469     Create a bioplate event type with the given options. The bioplate event type is created in
2933 14 Nov 14 olle 1470     a separate transaction.
2933 14 Nov 14 olle 1471     @since 2.12
2933 14 Nov 14 olle 1472   */
2933 14 Nov 14 olle 1473   public BioPlateEventType createBioPlateEventType(SessionControl sc, BioplateEventtype def)
2933 14 Nov 14 olle 1474   {
2933 14 Nov 14 olle 1475     BioPlateEventType eventType = null;
2933 14 Nov 14 olle 1476     DbControl dc = sc.newDbControl();
2933 14 Nov 14 olle 1477     try
2933 14 Nov 14 olle 1478     {
2933 14 Nov 14 olle 1479       eventType = BioPlateEventType.getNew(dc, def.getSystemId());
2933 14 Nov 14 olle 1480       eventType.setName(def.getName());
2933 14 Nov 14 olle 1481       eventType.setDescription(def.getDescription());
2933 14 Nov 14 olle 1482       dc.saveItem(eventType);
2933 14 Nov 14 olle 1483       dc.commit();
2933 14 Nov 14 olle 1484     }
2933 14 Nov 14 olle 1485     finally
2933 14 Nov 14 olle 1486     {
2933 14 Nov 14 olle 1487       if (dc != null) dc.close();
2933 14 Nov 14 olle 1488     }
2933 14 Nov 14 olle 1489     return eventType;
2933 14 Nov 14 olle 1490   }
2933 14 Nov 14 olle 1491
2933 14 Nov 14 olle 1492   
2933 14 Nov 14 olle 1493   /**
2933 14 Nov 14 olle 1494     Check for an existing bioplate event type with the given options.
2933 14 Nov 14 olle 1495     A JSONObject is returned with the result. The following 
2933 14 Nov 14 olle 1496     keys are used:
2933 14 Nov 14 olle 1497     <ul>
2933 14 Nov 14 olle 1498     <li>itemType: BIOPLATEEVENTTYPE
2933 14 Nov 14 olle 1499     <li>name: The name of the event type
2933 14 Nov 14 olle 1500     <li>id: The id of the event type if it exists
2933 14 Nov 14 olle 1501     <li>status: ok, error, or missing
2933 14 Nov 14 olle 1502     <li>message: A descriptive message in case of an error
2933 14 Nov 14 olle 1503     </ul>
2933 14 Nov 14 olle 1504     @since 2.12
2933 14 Nov 14 olle 1505   */
2933 14 Nov 14 olle 1506   @SuppressWarnings("unchecked")
2933 14 Nov 14 olle 1507   public JSONObject checkBioplateEventtype(DbControl dc, BioplateEventtype eventType, 
2933 14 Nov 14 olle 1508     boolean createIfMissing)
2933 14 Nov 14 olle 1509   {
2933 14 Nov 14 olle 1510   
2933 14 Nov 14 olle 1511     JSONObject json = new JSONObject();
2933 14 Nov 14 olle 1512     JSONArray jsonMessages = new JSONArray();
2933 14 Nov 14 olle 1513     json.put("itemType", Item.BIOPLATEEVENTTYPE.name());
2933 14 Nov 14 olle 1514     json.put("name", eventType.getName());
2933 14 Nov 14 olle 1515     
2933 14 Nov 14 olle 1516     List<BioPlateEventType> result = eventType.list(dc);
2933 14 Nov 14 olle 1517     if (result.size() == 0)
2933 14 Nov 14 olle 1518     {
2933 14 Nov 14 olle 1519       if (createIfMissing)
2933 14 Nov 14 olle 1520       {
2933 14 Nov 14 olle 1521         BioPlateEventType t = createBioPlateEventType(dc.getSessionControl(), eventType);
2933 14 Nov 14 olle 1522         json.put("id", t.getId());
2933 14 Nov 14 olle 1523         json.put("status", "ok");
2933 14 Nov 14 olle 1524         jsonMessages.add("Created");
2933 14 Nov 14 olle 1525       }
2933 14 Nov 14 olle 1526       else
2933 14 Nov 14 olle 1527       {
2933 14 Nov 14 olle 1528         json.put("status", "missing");
2933 14 Nov 14 olle 1529         jsonMessages.add("Not found");
2933 14 Nov 14 olle 1530       }
2933 14 Nov 14 olle 1531     }
2933 14 Nov 14 olle 1532     else if (result.size() > 1)
2933 14 Nov 14 olle 1533     {
2933 14 Nov 14 olle 1534       json.put("status", "error");
2933 14 Nov 14 olle 1535       jsonMessages.add("Found > 1 bioplate event type");
2933 14 Nov 14 olle 1536     }
2933 14 Nov 14 olle 1537     else
2933 14 Nov 14 olle 1538     {
2933 14 Nov 14 olle 1539       BioPlateEventType t = result.get(0);
2933 14 Nov 14 olle 1540       json.put("id", t.getId());
2933 14 Nov 14 olle 1541       json.put("status", "ok"); // For now -- more checks below
2933 14 Nov 14 olle 1542       
2933 14 Nov 14 olle 1543     }
2933 14 Nov 14 olle 1544     if (jsonMessages.size() == 0) jsonMessages.add("Ok");
2933 14 Nov 14 olle 1545     json.put("messages", jsonMessages);
2933 14 Nov 14 olle 1546     return json;
2933 14 Nov 14 olle 1547   }
2933 14 Nov 14 olle 1548
2933 14 Nov 14 olle 1549   
2933 14 Nov 14 olle 1550
2933 14 Nov 14 olle 1551   /**
2933 14 Nov 14 olle 1552     Create a bioplate type with the given options. The bioplate type is created in
2933 14 Nov 14 olle 1553     a separate transaction.
2933 14 Nov 14 olle 1554     @since 2.4
2933 14 Nov 14 olle 1555   */
2933 14 Nov 14 olle 1556   public BioPlateType createBioPlateType(SessionControl sc, BioplateType def)
2933 14 Nov 14 olle 1557   {
2933 14 Nov 14 olle 1558     BioPlateType plateType = null;
2933 14 Nov 14 olle 1559     DbControl dc = sc.newDbControl();
2933 14 Nov 14 olle 1560     try
2933 14 Nov 14 olle 1561     {
2933 14 Nov 14 olle 1562       plateType = BioPlateType.getNew(dc);
2933 14 Nov 14 olle 1563       plateType.setName(def.getName());
2933 14 Nov 14 olle 1564       plateType.setBioMaterialType(def.getBioMaterialType());
2933 14 Nov 14 olle 1565       if (def.getSubtype() != null)
2933 14 Nov 14 olle 1566       {
2933 14 Nov 14 olle 1567         ItemSubtype subtype = def.getSubtype().get(dc);
2933 14 Nov 14 olle 1568         if (subtype != null)
2933 14 Nov 14 olle 1569         {
2933 14 Nov 14 olle 1570           plateType.setItemSubtype(subtype);
2933 14 Nov 14 olle 1571         }
2933 14 Nov 14 olle 1572       }
2933 14 Nov 14 olle 1573       plateType.setLockMode(def.getLockMode());
2933 14 Nov 14 olle 1574       
2933 14 Nov 14 olle 1575       dc.saveItem(plateType);
2933 14 Nov 14 olle 1576       dc.commit();
2933 14 Nov 14 olle 1577     }
2933 14 Nov 14 olle 1578     finally
2933 14 Nov 14 olle 1579     {
2933 14 Nov 14 olle 1580       if (dc != null) dc.close();
2933 14 Nov 14 olle 1581     }
2933 14 Nov 14 olle 1582     return plateType;
2933 14 Nov 14 olle 1583   }
2933 14 Nov 14 olle 1584
2933 14 Nov 14 olle 1585   
2933 14 Nov 14 olle 1586   /**
2933 14 Nov 14 olle 1587     Check for an existing bioplate type with the given options.
2933 14 Nov 14 olle 1588     A JSONObject is returned with the result. The following 
2933 14 Nov 14 olle 1589     keys are used:
2933 14 Nov 14 olle 1590     <ul>
2933 14 Nov 14 olle 1591     <li>itemType: BIOPLATETYPE
2933 14 Nov 14 olle 1592     <li>name: The name of the bioplate type
2933 14 Nov 14 olle 1593     <li>id: The id of the bioplate type if it exists
2933 14 Nov 14 olle 1594     <li>bioMaterialType: The bioMaterial type that can be used on bioplates with the given type
2933 14 Nov 14 olle 1595     <li>status: ok, error, or missing
2933 14 Nov 14 olle 1596     <li>message: A descriptive message in case of an error
2933 14 Nov 14 olle 1597     </ul>
2933 14 Nov 14 olle 1598     @since 2.0
2933 14 Nov 14 olle 1599   */
2933 14 Nov 14 olle 1600   @SuppressWarnings("unchecked")
2933 14 Nov 14 olle 1601   public JSONObject checkBioplateType(DbControl dc, BioplateType plateType, 
2933 14 Nov 14 olle 1602     boolean createIfMissing)
2933 14 Nov 14 olle 1603   {
2933 14 Nov 14 olle 1604   
2933 14 Nov 14 olle 1605     JSONObject json = new JSONObject();
2933 14 Nov 14 olle 1606     JSONArray jsonMessages = new JSONArray();
2933 14 Nov 14 olle 1607     json.put("itemType", Item.BIOPLATETYPE.name());
2933 14 Nov 14 olle 1608     json.put("name", plateType.getName());
2933 14 Nov 14 olle 1609     json.put("bioMaterialType", plateType.getBioMaterialType().name());
2933 14 Nov 14 olle 1610     
2933 14 Nov 14 olle 1611     List<BioPlateType> result = plateType.list(dc);
2933 14 Nov 14 olle 1612     if (result.size() == 0)
2933 14 Nov 14 olle 1613     {
2933 14 Nov 14 olle 1614       if (createIfMissing)
2933 14 Nov 14 olle 1615       {
2933 14 Nov 14 olle 1616         BioPlateType t = createBioPlateType(dc.getSessionControl(), plateType);
2933 14 Nov 14 olle 1617         json.put("id", t.getId());
2933 14 Nov 14 olle 1618         json.put("status", "ok");
2933 14 Nov 14 olle 1619         jsonMessages.add("Created");
2933 14 Nov 14 olle 1620       }
2933 14 Nov 14 olle 1621       else
2933 14 Nov 14 olle 1622       {
2933 14 Nov 14 olle 1623         json.put("status", "missing");
2933 14 Nov 14 olle 1624         jsonMessages.add("Not found");
2933 14 Nov 14 olle 1625       }
2933 14 Nov 14 olle 1626     }
2933 14 Nov 14 olle 1627     else if (result.size() > 1)
2933 14 Nov 14 olle 1628     {
2933 14 Nov 14 olle 1629       json.put("status", "error");
2933 14 Nov 14 olle 1630       jsonMessages.add("Found > 1 bioplate type");
2933 14 Nov 14 olle 1631     }
2933 14 Nov 14 olle 1632     else
2933 14 Nov 14 olle 1633     {
2933 14 Nov 14 olle 1634       BioPlateType t = result.get(0);
2933 14 Nov 14 olle 1635       json.put("id", t.getId());
2933 14 Nov 14 olle 1636       json.put("status", "ok"); // For now -- more checks below
2933 14 Nov 14 olle 1637       
2933 14 Nov 14 olle 1638       if (t.getBioMaterialType() != plateType.getBioMaterialType())
2933 14 Nov 14 olle 1639       {
2933 14 Nov 14 olle 1640         json.put("status", "error");
2933 14 Nov 14 olle 1641         jsonMessages.add("Can't be used by '" + plateType.getBioMaterialType() + "' items.");
2933 14 Nov 14 olle 1642       }
2933 14 Nov 14 olle 1643       
2933 14 Nov 14 olle 1644       Subtype subtype = plateType.getSubtype();
2933 14 Nov 14 olle 1645       if (subtype != null)
2933 14 Nov 14 olle 1646       {
2933 14 Nov 14 olle 1647         ItemSubtype st = subtype.get(dc);
2933 14 Nov 14 olle 1648         if (st == null || !st.equals(t.getItemSubtype()))
2933 14 Nov 14 olle 1649         {
2933 14 Nov 14 olle 1650           json.put("status", "error");
2933 14 Nov 14 olle 1651           jsonMessages.add("Should be locked to '" + subtype.getName() + "' (" + subtype.getMainType() + ") items.");
2933 14 Nov 14 olle 1652         }
2933 14 Nov 14 olle 1653       }
2933 14 Nov 14 olle 1654       
2933 14 Nov 14 olle 1655       if (t.getLockMode() != plateType.getLockMode())
2933 14 Nov 14 olle 1656       {
2933 14 Nov 14 olle 1657         json.put("status", "error");
2933 14 Nov 14 olle 1658         jsonMessages.add("Should be using '" + plateType.getLockMode().name() + "' well lock mode");
2933 14 Nov 14 olle 1659       }
2933 14 Nov 14 olle 1660     }
2933 14 Nov 14 olle 1661     if (jsonMessages.size() == 0) jsonMessages.add("Ok");
2933 14 Nov 14 olle 1662     json.put("messages", jsonMessages);
2933 14 Nov 14 olle 1663     return json;
2933 14 Nov 14 olle 1664   
2933 14 Nov 14 olle 1665   }
2933 14 Nov 14 olle 1666
2933 14 Nov 14 olle 1667   /**
3384 10 Jun 15 olle 1668     Create an item list with the given options. The list is created in
2933 14 Nov 14 olle 1669     a separate transaction.
2933 14 Nov 14 olle 1670     @since 2.12
2933 14 Nov 14 olle 1671   */
3384 10 Jun 15 olle 1672   public ItemList createItemList(SessionControl sc, BiomaterialList def, PermissionOptions permissions)
2933 14 Nov 14 olle 1673   {
3384 10 Jun 15 olle 1674     ItemList list = null;
2933 14 Nov 14 olle 1675     DbControl dc = sc.newDbControl();
2933 14 Nov 14 olle 1676     try
2933 14 Nov 14 olle 1677     {
3384 10 Jun 15 olle 1678       list = ItemList.getNew(dc, def.getBioMaterialType());
2933 14 Nov 14 olle 1679       list.setName(def.getName());
2933 14 Nov 14 olle 1680       list.setExternalId(def.getExternalId());
2933 14 Nov 14 olle 1681       list.setDescription(def.getDescription());
2933 14 Nov 14 olle 1682       if (permissions != null) permissions.applyPermissions(list);
2933 14 Nov 14 olle 1683       
2933 14 Nov 14 olle 1684       dc.saveItem(list);
2933 14 Nov 14 olle 1685       dc.commit();
2933 14 Nov 14 olle 1686     }
2933 14 Nov 14 olle 1687     finally
2933 14 Nov 14 olle 1688     {
2933 14 Nov 14 olle 1689       if (dc != null) dc.close();
2933 14 Nov 14 olle 1690     }
2933 14 Nov 14 olle 1691     return list;
2933 14 Nov 14 olle 1692   }
2933 14 Nov 14 olle 1693
2933 14 Nov 14 olle 1694   
2933 14 Nov 14 olle 1695   /**
2933 14 Nov 14 olle 1696     Check for an existing biomaterial list with the given options.
2933 14 Nov 14 olle 1697     A JSONObject is returned with the result. The following 
2933 14 Nov 14 olle 1698     keys are used:
2933 14 Nov 14 olle 1699     <ul>
2933 14 Nov 14 olle 1700     <li>itemType: BIOMATERIALLIST
2933 14 Nov 14 olle 1701     <li>name: The name of the biomaterial list
2933 14 Nov 14 olle 1702     <li>id: The id of the biomaterial list if it exists
2933 14 Nov 14 olle 1703     <li>bioMaterialType: The bioMaterial type that can be stored in the list
2933 14 Nov 14 olle 1704     <li>status: ok, error, or missing
2933 14 Nov 14 olle 1705     <li>message: A descriptive message in case of an error
2933 14 Nov 14 olle 1706     </ul>
2933 14 Nov 14 olle 1707     @since 2.12
2933 14 Nov 14 olle 1708   */
2933 14 Nov 14 olle 1709   @SuppressWarnings("unchecked")
2933 14 Nov 14 olle 1710   public JSONObject checkBioMaterialList(DbControl dc, BiomaterialList list, 
2933 14 Nov 14 olle 1711     PermissionOptions permissions, boolean createIfMissing)
2933 14 Nov 14 olle 1712   {
2933 14 Nov 14 olle 1713   
2933 14 Nov 14 olle 1714     JSONObject json = new JSONObject();
2933 14 Nov 14 olle 1715     JSONArray jsonMessages = new JSONArray();
3384 10 Jun 15 olle 1716     json.put("itemType", Item.ITEMLIST.name());
2933 14 Nov 14 olle 1717     json.put("name", list.getName());
2933 14 Nov 14 olle 1718     json.put("bioMaterialType", list.getBioMaterialType().name());
2933 14 Nov 14 olle 1719     
3384 10 Jun 15 olle 1720     List<ItemList> result = list.list(dc);
2933 14 Nov 14 olle 1721     if (result.size() == 0)
2933 14 Nov 14 olle 1722     {
2933 14 Nov 14 olle 1723       if (createIfMissing)
2933 14 Nov 14 olle 1724       {
3384 10 Jun 15 olle 1725         ItemList l = createItemList(dc.getSessionControl(), list, permissions);
2933 14 Nov 14 olle 1726         json.put("id", l.getId());
2933 14 Nov 14 olle 1727         json.put("status", "ok");
2933 14 Nov 14 olle 1728         jsonMessages.add("Created");
2933 14 Nov 14 olle 1729       }
2933 14 Nov 14 olle 1730       else
2933 14 Nov 14 olle 1731       {
2933 14 Nov 14 olle 1732         json.put("status", "missing");
2933 14 Nov 14 olle 1733         jsonMessages.add("Not found");
2933 14 Nov 14 olle 1734       }
2933 14 Nov 14 olle 1735     }
2933 14 Nov 14 olle 1736     else if (result.size() > 1)
2933 14 Nov 14 olle 1737     {
2933 14 Nov 14 olle 1738       json.put("status", "error");
2933 14 Nov 14 olle 1739       jsonMessages.add("Found > 1 biomaterial list");
2933 14 Nov 14 olle 1740     }
2933 14 Nov 14 olle 1741     else
2933 14 Nov 14 olle 1742     {
3384 10 Jun 15 olle 1743       ItemList l = result.get(0);
2933 14 Nov 14 olle 1744       json.put("id", l.getId());
2933 14 Nov 14 olle 1745       json.put("status", "ok"); // For now -- more checks below
2933 14 Nov 14 olle 1746       
2933 14 Nov 14 olle 1747       if (l.getMemberType() != list.getBioMaterialType())
2933 14 Nov 14 olle 1748       {
2933 14 Nov 14 olle 1749         json.put("status", "error");
2933 14 Nov 14 olle 1750         jsonMessages.add("Can't be used by '" + list.getBioMaterialType() + "' items.");
2933 14 Nov 14 olle 1751       }
2933 14 Nov 14 olle 1752       
2933 14 Nov 14 olle 1753       if (permissions != null && !permissions.checkPermissions(l))
2933 14 Nov 14 olle 1754       {
2933 14 Nov 14 olle 1755         if (createIfMissing)
2933 14 Nov 14 olle 1756         {
2933 14 Nov 14 olle 1757           permissions.applyPermissions(l);
2933 14 Nov 14 olle 1758           if (jsonMessages.size() == 0) jsonMessages.add("Fixed");
2933 14 Nov 14 olle 1759         }
2933 14 Nov 14 olle 1760         else
2933 14 Nov 14 olle 1761         {
2933 14 Nov 14 olle 1762           json.put("status", "incomplete");
2933 14 Nov 14 olle 1763           jsonMessages.add(permissions.getMessage());
2933 14 Nov 14 olle 1764         }
2933 14 Nov 14 olle 1765       }
2933 14 Nov 14 olle 1766
2933 14 Nov 14 olle 1767     }
2933 14 Nov 14 olle 1768     if (jsonMessages.size() == 0) jsonMessages.add("Ok");
2933 14 Nov 14 olle 1769     json.put("messages", jsonMessages);
2933 14 Nov 14 olle 1770     return json;
2933 14 Nov 14 olle 1771   }
2933 14 Nov 14 olle 1772
2933 14 Nov 14 olle 1773   
2933 14 Nov 14 olle 1774   /**
2933 14 Nov 14 olle 1775     Create a MIME type with the given options. The type is created in
2933 14 Nov 14 olle 1776     a separate transaction.
2933 14 Nov 14 olle 1777     @since 2.4
2933 14 Nov 14 olle 1778   */
2933 14 Nov 14 olle 1779   public MimeType createMimeType(SessionControl sc, Mimetype def)
2933 14 Nov 14 olle 1780   {
2933 14 Nov 14 olle 1781     MimeType type = null;
2933 14 Nov 14 olle 1782     DbControl dc = sc.newDbControl();
2933 14 Nov 14 olle 1783     try
2933 14 Nov 14 olle 1784     {
2933 14 Nov 14 olle 1785       type = MimeType.getNew(dc);
2933 14 Nov 14 olle 1786       type.setName(def.getMimeType());
2933 14 Nov 14 olle 1787       type.setExtension(def.getExtension());
2933 14 Nov 14 olle 1788       type.setDescription(def.getDescription());
2933 14 Nov 14 olle 1789       if (def.getFileType() != null)
2933 14 Nov 14 olle 1790       {
2933 14 Nov 14 olle 1791         ItemSubtype subtype = def.getFileType().get(dc);
2933 14 Nov 14 olle 1792         if (subtype != null) type.setFileType(subtype);
2933 14 Nov 14 olle 1793       }
2933 14 Nov 14 olle 1794       
2933 14 Nov 14 olle 1795       dc.saveItem(type);
2933 14 Nov 14 olle 1796       dc.commit();
2933 14 Nov 14 olle 1797     }
2933 14 Nov 14 olle 1798     finally
2933 14 Nov 14 olle 1799     {
2933 14 Nov 14 olle 1800       if (dc != null) dc.close();
2933 14 Nov 14 olle 1801     }
2933 14 Nov 14 olle 1802     return type;
2933 14 Nov 14 olle 1803   }
2933 14 Nov 14 olle 1804
2933 14 Nov 14 olle 1805   
2933 14 Nov 14 olle 1806   /**
2933 14 Nov 14 olle 1807     Check for an existing MIME type with the given options.
2933 14 Nov 14 olle 1808     A JSONObject is returned with the result. The following 
2933 14 Nov 14 olle 1809     keys are used:
2933 14 Nov 14 olle 1810     <ul>
2933 14 Nov 14 olle 1811     <li>itemType: MIMETYPE
2933 14 Nov 14 olle 1812     <li>name: The name of the subtype
2933 14 Nov 14 olle 1813     <li>id: The id of the subtype if it exists
2933 14 Nov 14 olle 1814     <li>mainType: The main item type that the subtype applies to
2933 14 Nov 14 olle 1815     <li>status: ok, error, or missing
2933 14 Nov 14 olle 1816     <li>message: A descriptive message in case of an error
2933 14 Nov 14 olle 1817     </ul>
2933 14 Nov 14 olle 1818     @since 2.4
2933 14 Nov 14 olle 1819   */
2933 14 Nov 14 olle 1820   @SuppressWarnings("unchecked")
2933 14 Nov 14 olle 1821   public JSONObject checkMimeType(DbControl dc, Mimetype mimeType, 
2933 14 Nov 14 olle 1822     boolean createIfMissing)
2933 14 Nov 14 olle 1823   {
2933 14 Nov 14 olle 1824   
2933 14 Nov 14 olle 1825     JSONObject json = new JSONObject();
2933 14 Nov 14 olle 1826     JSONArray jsonMessages = new JSONArray();
2933 14 Nov 14 olle 1827     json.put("itemType", Item.MIMETYPE.name());
2933 14 Nov 14 olle 1828     json.put("name", mimeType.getDescription());
2933 14 Nov 14 olle 1829     json.put("mimeType", mimeType.getMimeType());
2933 14 Nov 14 olle 1830     json.put("extension", mimeType.getExtension());
2933 14 Nov 14 olle 1831     
2933 14 Nov 14 olle 1832     List<MimeType> result = mimeType.list(dc);
2933 14 Nov 14 olle 1833     if (result.size() == 0)
2933 14 Nov 14 olle 1834     {
2933 14 Nov 14 olle 1835       if (createIfMissing)
2933 14 Nov 14 olle 1836       {
2933 14 Nov 14 olle 1837         MimeType type = createMimeType(dc.getSessionControl(), mimeType);
2933 14 Nov 14 olle 1838         json.put("id", type.getId());
2933 14 Nov 14 olle 1839         json.put("status", "ok");
2933 14 Nov 14 olle 1840         jsonMessages.add("Created");
2933 14 Nov 14 olle 1841       }
2933 14 Nov 14 olle 1842       else
2933 14 Nov 14 olle 1843       {
2933 14 Nov 14 olle 1844         json.put("status", "missing");
2933 14 Nov 14 olle 1845         jsonMessages.add("Not found");
2933 14 Nov 14 olle 1846       }
2933 14 Nov 14 olle 1847     }
2933 14 Nov 14 olle 1848     else if (result.size() > 1)
2933 14 Nov 14 olle 1849     {
2933 14 Nov 14 olle 1850       json.put("status", "error");
2933 14 Nov 14 olle 1851       jsonMessages.add("Found > 1 MIME type");
2933 14 Nov 14 olle 1852     }
2933 14 Nov 14 olle 1853     else
2933 14 Nov 14 olle 1854     {
2933 14 Nov 14 olle 1855       MimeType s = result.get(0);
2933 14 Nov 14 olle 1856       json.put("id", s.getId());
2933 14 Nov 14 olle 1857       json.put("status", "ok"); // For now -- more checks below
2933 14 Nov 14 olle 1858       
2933 14 Nov 14 olle 1859       if (!s.getName().equals(mimeType.getMimeType()))
2933 14 Nov 14 olle 1860       {
2933 14 Nov 14 olle 1861         json.put("status", "error");
2933 14 Nov 14 olle 1862         jsonMessages.add("Should have '" + mimeType.getMimeType() + "' as MIME type.");
2933 14 Nov 14 olle 1863       }
2933 14 Nov 14 olle 1864       
2933 14 Nov 14 olle 1865     }
2933 14 Nov 14 olle 1866     if (jsonMessages.size() == 0) jsonMessages.add("Ok");
2933 14 Nov 14 olle 1867     json.put("messages", jsonMessages);
2933 14 Nov 14 olle 1868     return json;
2933 14 Nov 14 olle 1869   
2933 14 Nov 14 olle 1870   }
2933 14 Nov 14 olle 1871   
2933 14 Nov 14 olle 1872   
2933 14 Nov 14 olle 1873   /**
2933 14 Nov 14 olle 1874     Create a file server with the given options. The file server is created in
2933 14 Nov 14 olle 1875     a separate transaction.
2933 14 Nov 14 olle 1876     @since 2.16
2933 14 Nov 14 olle 1877   */
2933 14 Nov 14 olle 1878   public FileServer createFileServer(SessionControl sc, Fileserver def, PermissionOptions permissions)
2933 14 Nov 14 olle 1879   {
2933 14 Nov 14 olle 1880     FileServer fs = null;
2933 14 Nov 14 olle 1881     DbControl dc = sc.newDbControl();
2933 14 Nov 14 olle 1882     try
2933 14 Nov 14 olle 1883     {
2933 14 Nov 14 olle 1884       fs = FileServer.getNew(dc);
2933 14 Nov 14 olle 1885       fs.setName(def.getName());
2933 14 Nov 14 olle 1886       fs.setConnectionManagerFactoryId(def.getConnectionManagerId());
2933 14 Nov 14 olle 1887       fs.setDescription(def.getDescription());
2933 14 Nov 14 olle 1888       if (permissions != null) permissions.applyPermissions(fs);
2933 14 Nov 14 olle 1889       
2933 14 Nov 14 olle 1890       dc.saveItem(fs);
2933 14 Nov 14 olle 1891       dc.commit();
2933 14 Nov 14 olle 1892     }
2933 14 Nov 14 olle 1893     finally
2933 14 Nov 14 olle 1894     {
2933 14 Nov 14 olle 1895       if (dc != null) dc.close();
2933 14 Nov 14 olle 1896     }
2933 14 Nov 14 olle 1897     return fs;
2933 14 Nov 14 olle 1898   }
2933 14 Nov 14 olle 1899
2933 14 Nov 14 olle 1900   
2933 14 Nov 14 olle 1901   /**
2933 14 Nov 14 olle 1902     Check for an existing file server with the given options.
2933 14 Nov 14 olle 1903     A JSONObject is returned with the result. The following 
2933 14 Nov 14 olle 1904     keys are used:
2933 14 Nov 14 olle 1905     <ul>
2933 14 Nov 14 olle 1906     <li>itemType: FILESERVER
2933 14 Nov 14 olle 1907     <li>name: The name of the fileserver
2933 14 Nov 14 olle 1908     <li>id: The id of the fileserver if it exists
2933 14 Nov 14 olle 1909     <li>status: ok, error, or missing
2933 14 Nov 14 olle 1910     <li>message: A descriptive message in case of an error
2933 14 Nov 14 olle 1911     </ul>
2933 14 Nov 14 olle 1912     @since 2.16
2933 14 Nov 14 olle 1913   */
2933 14 Nov 14 olle 1914   @SuppressWarnings("unchecked")
2933 14 Nov 14 olle 1915   public JSONObject checkFileServer(DbControl dc, Fileserver fileServer, 
2933 14 Nov 14 olle 1916     PermissionOptions permissions, boolean createIfMissing)
2933 14 Nov 14 olle 1917   {
2933 14 Nov 14 olle 1918   
2933 14 Nov 14 olle 1919     JSONObject json = new JSONObject();
2933 14 Nov 14 olle 1920     JSONArray jsonMessages = new JSONArray();
2933 14 Nov 14 olle 1921     json.put("itemType", Item.FILESERVER.name());
2933 14 Nov 14 olle 1922     json.put("name", fileServer.getName());
2933 14 Nov 14 olle 1923     
2933 14 Nov 14 olle 1924     FileServer fs = null;
2933 14 Nov 14 olle 1925     List<FileServer> result = fileServer.list(dc);
2933 14 Nov 14 olle 1926     if (result.size() == 0)
2933 14 Nov 14 olle 1927     {
2933 14 Nov 14 olle 1928       if (createIfMissing)
2933 14 Nov 14 olle 1929       {
2933 14 Nov 14 olle 1930         fs = createFileServer(dc.getSessionControl(), fileServer, permissions);
2933 14 Nov 14 olle 1931         fs = FileServer.getById(dc, fs.getId());
2933 14 Nov 14 olle 1932         json.put("id", fs.getId());
2933 14 Nov 14 olle 1933         // Not ok yet, need manual configuration which is checked below
2933 14 Nov 14 olle 1934       }
2933 14 Nov 14 olle 1935       else
2933 14 Nov 14 olle 1936       {
2933 14 Nov 14 olle 1937         json.put("status", "missing");
2933 14 Nov 14 olle 1938         jsonMessages.add("Not found");
2933 14 Nov 14 olle 1939       }
2933 14 Nov 14 olle 1940     }
2933 14 Nov 14 olle 1941     else if (result.size() > 1)
2933 14 Nov 14 olle 1942     {
2933 14 Nov 14 olle 1943       json.put("status", "error");
2933 14 Nov 14 olle 1944       jsonMessages.add("Found > 1 file server");
2933 14 Nov 14 olle 1945     }
2933 14 Nov 14 olle 1946     else
2933 14 Nov 14 olle 1947     {
2933 14 Nov 14 olle 1948       fs = result.get(0);
2933 14 Nov 14 olle 1949     }
2933 14 Nov 14 olle 1950     
2933 14 Nov 14 olle 1951     if (fs != null)
2933 14 Nov 14 olle 1952     {
2933 14 Nov 14 olle 1953       json.put("id", fs.getId());
2933 14 Nov 14 olle 1954       json.put("status", "ok"); // For now -- more checks below
2933 14 Nov 14 olle 1955       
2933 14 Nov 14 olle 1956       if (permissions != null && !permissions.checkPermissions(fs))
2933 14 Nov 14 olle 1957       {
2933 14 Nov 14 olle 1958         if (createIfMissing)
2933 14 Nov 14 olle 1959         {
2933 14 Nov 14 olle 1960           permissions.applyPermissions(fs);
2933 14 Nov 14 olle 1961           if (jsonMessages.size() == 0) jsonMessages.add("Fixed");
2933 14 Nov 14 olle 1962         }
2933 14 Nov 14 olle 1963         else
2933 14 Nov 14 olle 1964         {
2933 14 Nov 14 olle 1965           json.put("status", "incomplete");
2933 14 Nov 14 olle 1966           jsonMessages.add(permissions.getMessage());
2933 14 Nov 14 olle 1967         }
2933 14 Nov 14 olle 1968       }
2933 14 Nov 14 olle 1969       
2933 14 Nov 14 olle 1970       if (!fileServer.getConnectionManagerId().equals(fs.getConnectionManagerFactoryId()))
2933 14 Nov 14 olle 1971       {
2933 14 Nov 14 olle 1972         if (createIfMissing)
2933 14 Nov 14 olle 1973         {
2933 14 Nov 14 olle 1974           fs.setConnectionManagerFactoryId(fileServer.getConnectionManagerId());
2933 14 Nov 14 olle 1975         }
2933 14 Nov 14 olle 1976         else
2933 14 Nov 14 olle 1977         {
2933 14 Nov 14 olle 1978           json.put("status", "incomplete");
2933 14 Nov 14 olle 1979           jsonMessages.add("Should use SFTP connection manager");
2933 14 Nov 14 olle 1980         }
2933 14 Nov 14 olle 1981       }
2933 14 Nov 14 olle 1982       
2933 14 Nov 14 olle 1983       if (fs.getHost() == null)
2933 14 Nov 14 olle 1984       {
2933 14 Nov 14 olle 1985         json.put("status", "warning");
2933 14 Nov 14 olle 1986         jsonMessages.add("No host name configured");
2933 14 Nov 14 olle 1987       }
2933 14 Nov 14 olle 1988       
2933 14 Nov 14 olle 1989       if (fs.getUsername() == null)
2933 14 Nov 14 olle 1990       {
2933 14 Nov 14 olle 1991         json.put("status", "warning");
2933 14 Nov 14 olle 1992         jsonMessages.add("No user configured");
2933 14 Nov 14 olle 1993       }
2933 14 Nov 14 olle 1994       
2933 14 Nov 14 olle 1995       if (!fs.hasPassword())
2933 14 Nov 14 olle 1996       {
2933 14 Nov 14 olle 1997         json.put("status", "warning");
2933 14 Nov 14 olle 1998         jsonMessages.add("No password configured");
2933 14 Nov 14 olle 1999       }
2933 14 Nov 14 olle 2000
2933 14 Nov 14 olle 2001       if (fs.getRootPath() == null)
2933 14 Nov 14 olle 2002       {
2933 14 Nov 14 olle 2003         json.put("status", "warning");
2933 14 Nov 14 olle 2004         jsonMessages.add("No root path configured");
2933 14 Nov 14 olle 2005       }
2933 14 Nov 14 olle 2006       
2933 14 Nov 14 olle 2007       if (fs.getSshFingerprint() == null)
2933 14 Nov 14 olle 2008       {
2933 14 Nov 14 olle 2009         json.put("status", "warning");
2933 14 Nov 14 olle 2010         jsonMessages.add("No SSH fingerprint configured");
2933 14 Nov 14 olle 2011       }
2933 14 Nov 14 olle 2012       
2933 14 Nov 14 olle 2013       if (json.get("status").equals("ok"))
2933 14 Nov 14 olle 2014       {
2933 14 Nov 14 olle 2015         ConnectionManagerFactory cmf = ConnectionManagerUtil.getFactory(fs.getConnectionManagerFactoryId());
2933 14 Nov 14 olle 2016         if (cmf == null)
2933 14 Nov 14 olle 2017         {
2933 14 Nov 14 olle 2018           json.put("status", "warning");
2933 14 Nov 14 olle 2019           jsonMessages.add("SFTP connection manager is not installed");
2933 14 Nov 14 olle 2020         }
2933 14 Nov 14 olle 2021         else
2933 14 Nov 14 olle 2022         {
2933 14 Nov 14 olle 2023           ConnectionParameters cp = new ConnectionParameters();
2933 14 Nov 14 olle 2024           cp.setHost(fs.getHost());
2933 14 Nov 14 olle 2025           cp.setUsername(fs.getUsername());
2933 14 Nov 14 olle 2026           cp.setPassword(fs.getPassword());
2933 14 Nov 14 olle 2027           cp.setRootPath(fs.getRootPath());
2933 14 Nov 14 olle 2028           cp.setSshFingerprint(fs.getSshFingerprint());
2933 14 Nov 14 olle 2029           URI uri = cp.changeHost(URI.create("sftp://" + fs.getHost() + "/"));
2933 14 Nov 14 olle 2030           ConnectionManager cm = cmf.createConnectionManager(uri, cp);
2933 14 Nov 14 olle 2031           try
2933 14 Nov 14 olle 2032           {
2933 14 Nov 14 olle 2033             UriMetadata meta = cm.getMetadata();
2933 14 Nov 14 olle 2034           }
2933 14 Nov 14 olle 2035           catch (IOException ex)
2933 14 Nov 14 olle 2036           {
2933 14 Nov 14 olle 2037             json.put("status", "warning");
2933 14 Nov 14 olle 2038             jsonMessages.add(uri + ": " + ex.getMessage());
2933 14 Nov 14 olle 2039             ex.printStackTrace();
2933 14 Nov 14 olle 2040           }
2933 14 Nov 14 olle 2041         }
2933 14 Nov 14 olle 2042       }
2933 14 Nov 14 olle 2043     }
2933 14 Nov 14 olle 2044     if (jsonMessages.size() == 0) jsonMessages.add("Ok");
2933 14 Nov 14 olle 2045     json.put("messages", jsonMessages);
2933 14 Nov 14 olle 2046     return json;
2933 14 Nov 14 olle 2047   
2933 14 Nov 14 olle 2048   }
2933 14 Nov 14 olle 2049
2933 14 Nov 14 olle 2050   
2933 14 Nov 14 olle 2051   /**
5271 29 Jan 19 olle 2052     Create a directory with the given options. The directory is created in
5271 29 Jan 19 olle 2053     a separate transaction.
5271 29 Jan 19 olle 2054     @since 1.6.0
5271 29 Jan 19 olle 2055   */
5271 29 Jan 19 olle 2056   public Directory createDirectory(SessionControl sc, Path path, PermissionOptions... permissions)
5271 29 Jan 19 olle 2057   {
5271 29 Jan 19 olle 2058     Directory d = null;
5271 29 Jan 19 olle 2059     DbControl dc = sc.newDbControl();
5271 29 Jan 19 olle 2060     try
5271 29 Jan 19 olle 2061     {
5271 29 Jan 19 olle 2062       d = Directory.getNew(dc, path);
5271 29 Jan 19 olle 2063       if (permissions != null) 
5271 29 Jan 19 olle 2064       {
5271 29 Jan 19 olle 2065         for (PermissionOptions p : permissions)
5271 29 Jan 19 olle 2066         {
5271 29 Jan 19 olle 2067           p.applyPermissions(d);
5271 29 Jan 19 olle 2068         }
5271 29 Jan 19 olle 2069       }
5271 29 Jan 19 olle 2070       dc.saveItem(d);
5271 29 Jan 19 olle 2071       dc.commit();
5271 29 Jan 19 olle 2072     }
5271 29 Jan 19 olle 2073     finally
5271 29 Jan 19 olle 2074     {
5271 29 Jan 19 olle 2075       if (dc != null) dc.close();
5271 29 Jan 19 olle 2076     }
5271 29 Jan 19 olle 2077     return d;
5271 29 Jan 19 olle 2078   }
5271 29 Jan 19 olle 2079
5271 29 Jan 19 olle 2080   /**
5271 29 Jan 19 olle 2081     Check for an existing directory.
5271 29 Jan 19 olle 2082     A JSONObject is returned with the result. The following 
5271 29 Jan 19 olle 2083     keys are used:
5271 29 Jan 19 olle 2084     <ul>
5271 29 Jan 19 olle 2085     <li>itemType: DIRECTORY
5271 29 Jan 19 olle 2086     <li>name: The full path of the directory
5271 29 Jan 19 olle 2087     <li>id: The id of the directory if it exists
5271 29 Jan 19 olle 2088     <li>status: ok, error, or missing
5271 29 Jan 19 olle 2089     <li>message: A descriptive message in case of an error
5271 29 Jan 19 olle 2090     </ul>
5271 29 Jan 19 olle 2091     @since 1.6.0
5271 29 Jan 19 olle 2092    */
5271 29 Jan 19 olle 2093   @SuppressWarnings("unchecked")
5271 29 Jan 19 olle 2094   public JSONObject checkDirectory(DbControl dc, String name, 
5271 29 Jan 19 olle 2095     boolean createIfMissing, PermissionOptions... permissions)
5271 29 Jan 19 olle 2096   {
5271 29 Jan 19 olle 2097
5271 29 Jan 19 olle 2098     JSONObject json = new JSONObject();
5271 29 Jan 19 olle 2099     JSONArray jsonMessages = new JSONArray();
5271 29 Jan 19 olle 2100     json.put("itemType", Item.DIRECTORY.name());
5271 29 Jan 19 olle 2101     json.put("name", name);
5271 29 Jan 19 olle 2102   
5271 29 Jan 19 olle 2103     Directory d = null;
5271 29 Jan 19 olle 2104     Path path = new Path(name, Path.Type.DIRECTORY);
5271 29 Jan 19 olle 2105     try
5271 29 Jan 19 olle 2106     {
5271 29 Jan 19 olle 2107       d = Directory.getByPath(dc, path);
5271 29 Jan 19 olle 2108     }
5271 29 Jan 19 olle 2109     catch (RuntimeException ex)
5271 29 Jan 19 olle 2110     {}
5271 29 Jan 19 olle 2111   
5271 29 Jan 19 olle 2112     if (d == null)
5271 29 Jan 19 olle 2113     {
5271 29 Jan 19 olle 2114       if (createIfMissing)
5271 29 Jan 19 olle 2115       {
5271 29 Jan 19 olle 2116         d = createDirectory(dc.getSessionControl(), path, permissions);
5271 29 Jan 19 olle 2117         d = Directory.getById(dc, d.getId());
5271 29 Jan 19 olle 2118         json.put("id", d.getId());
5271 29 Jan 19 olle 2119       }
5271 29 Jan 19 olle 2120       else
5271 29 Jan 19 olle 2121       {
5271 29 Jan 19 olle 2122         json.put("status", "missing");
5271 29 Jan 19 olle 2123         jsonMessages.add("Not found");
5271 29 Jan 19 olle 2124       }
5271 29 Jan 19 olle 2125     }
5271 29 Jan 19 olle 2126   
5271 29 Jan 19 olle 2127     if (d != null)
5271 29 Jan 19 olle 2128     {
5271 29 Jan 19 olle 2129       json.put("id", d.getId());
5271 29 Jan 19 olle 2130       json.put("status", "ok"); // For now -- more checks below
5271 29 Jan 19 olle 2131     
5271 29 Jan 19 olle 2132       if (permissions != null)
5271 29 Jan 19 olle 2133       {
5271 29 Jan 19 olle 2134         String permissionCheck = null;
5271 29 Jan 19 olle 2135         for (PermissionOptions p : permissions)
5271 29 Jan 19 olle 2136         {
5271 29 Jan 19 olle 2137           if (!p.checkPermissions(d))
5271 29 Jan 19 olle 2138           {
5271 29 Jan 19 olle 2139             permissionCheck = p.getMessage();
5271 29 Jan 19 olle 2140             break;
5271 29 Jan 19 olle 2141           }
5271 29 Jan 19 olle 2142         }
5271 29 Jan 19 olle 2143       
5271 29 Jan 19 olle 2144         if (permissionCheck != null)
5271 29 Jan 19 olle 2145         {
5271 29 Jan 19 olle 2146           if (createIfMissing)
5271 29 Jan 19 olle 2147           {
5271 29 Jan 19 olle 2148             for (PermissionOptions p : permissions)
5271 29 Jan 19 olle 2149             {
5271 29 Jan 19 olle 2150               p.applyPermissions(d);
5271 29 Jan 19 olle 2151             }
5271 29 Jan 19 olle 2152             if (jsonMessages.size() == 0) jsonMessages.add("Fixed");
5271 29 Jan 19 olle 2153           }
5271 29 Jan 19 olle 2154           else
5271 29 Jan 19 olle 2155           {
5271 29 Jan 19 olle 2156             json.put("status", "incomplete");
5271 29 Jan 19 olle 2157             jsonMessages.add(permissionCheck);
5271 29 Jan 19 olle 2158           }
5271 29 Jan 19 olle 2159         }
5271 29 Jan 19 olle 2160       }      
5271 29 Jan 19 olle 2161     }
5271 29 Jan 19 olle 2162     if (jsonMessages.size() == 0) jsonMessages.add("Ok");
5271 29 Jan 19 olle 2163     json.put("messages", jsonMessages);
5271 29 Jan 19 olle 2164     return json;
5271 29 Jan 19 olle 2165   }
5271 29 Jan 19 olle 2166
5271 29 Jan 19 olle 2167
5271 29 Jan 19 olle 2168   /**
2933 14 Nov 14 olle 2169     Create a data file type with the given options. The type is created in
2933 14 Nov 14 olle 2170     a separate transaction.
2933 14 Nov 14 olle 2171     @since 2.16
2933 14 Nov 14 olle 2172   */
2933 14 Nov 14 olle 2173   public DataFileType createDataFileType(SessionControl sc, Datafiletype def)
2933 14 Nov 14 olle 2174   {
2933 14 Nov 14 olle 2175     DataFileType type = null;
2933 14 Nov 14 olle 2176     DbControl dc = sc.newDbControl();
2933 14 Nov 14 olle 2177     try
2933 14 Nov 14 olle 2178     {
2933 14 Nov 14 olle 2179       type = DataFileType.getNew(dc, def.getExternalId(), def.getItemType());
2933 14 Nov 14 olle 2180       type.setName(def.getName());
2933 14 Nov 14 olle 2181       type.setExtension(def.getExtension());
2933 14 Nov 14 olle 2182       type.setDescription(def.getDescription());
2933 14 Nov 14 olle 2183       if (def.getSubtype() != null)
2933 14 Nov 14 olle 2184       {
2933 14 Nov 14 olle 2185         type.setGenericType(def.getSubtype().get(dc));
2933 14 Nov 14 olle 2186       }
2933 14 Nov 14 olle 2187       dc.saveItem(type);
2933 14 Nov 14 olle 2188       dc.commit();
2933 14 Nov 14 olle 2189     }
2933 14 Nov 14 olle 2190     finally
2933 14 Nov 14 olle 2191     {
2933 14 Nov 14 olle 2192       if (dc != null) dc.close();
2933 14 Nov 14 olle 2193     }
2933 14 Nov 14 olle 2194     return type;
2933 14 Nov 14 olle 2195   }
2933 14 Nov 14 olle 2196
2933 14 Nov 14 olle 2197   
2933 14 Nov 14 olle 2198   /**
2933 14 Nov 14 olle 2199     Check for an existing data file type with the given options.
2933 14 Nov 14 olle 2200     A JSONObject is returned with the result. The following 
2933 14 Nov 14 olle 2201     keys are used:
2933 14 Nov 14 olle 2202     <ul>
2933 14 Nov 14 olle 2203     <li>itemType: DATAFILETYPE
2933 14 Nov 14 olle 2204     <li>name: The name of the file type
2933 14 Nov 14 olle 2205     <li>id: The id of the file type if it exists
2933 14 Nov 14 olle 2206     <li>status: ok, error, or missing
2933 14 Nov 14 olle 2207     <li>message: A descriptive message in case of an error
2933 14 Nov 14 olle 2208     </ul>
2933 14 Nov 14 olle 2209     @since 2.16
2933 14 Nov 14 olle 2210   */
2933 14 Nov 14 olle 2211   @SuppressWarnings("unchecked")
2933 14 Nov 14 olle 2212   public JSONObject checkDataFileType(DbControl dc, Datafiletype fileType, 
2933 14 Nov 14 olle 2213     boolean createIfMissing)
2933 14 Nov 14 olle 2214   {
2933 14 Nov 14 olle 2215   
2933 14 Nov 14 olle 2216     JSONObject json = new JSONObject();
2933 14 Nov 14 olle 2217     JSONArray jsonMessages = new JSONArray();
2933 14 Nov 14 olle 2218     json.put("itemType", Item.DATAFILETYPE.name());
2933 14 Nov 14 olle 2219     json.put("name", fileType.getName());
2933 14 Nov 14 olle 2220     
2933 14 Nov 14 olle 2221     List<DataFileType> result = fileType.list(dc);
2933 14 Nov 14 olle 2222     if (result.size() == 0)
2933 14 Nov 14 olle 2223     {
2933 14 Nov 14 olle 2224       if (createIfMissing)
2933 14 Nov 14 olle 2225       {
2933 14 Nov 14 olle 2226         DataFileType type = createDataFileType(dc.getSessionControl(), fileType);
2933 14 Nov 14 olle 2227         json.put("id", type.getId());
2933 14 Nov 14 olle 2228         json.put("status", "ok");
2933 14 Nov 14 olle 2229         jsonMessages.add("Created");
2933 14 Nov 14 olle 2230       }
2933 14 Nov 14 olle 2231       else
2933 14 Nov 14 olle 2232       {
2933 14 Nov 14 olle 2233         json.put("status", "missing");
2933 14 Nov 14 olle 2234         jsonMessages.add("Not found");
2933 14 Nov 14 olle 2235       }
2933 14 Nov 14 olle 2236     }
2933 14 Nov 14 olle 2237     else if (result.size() > 1)
2933 14 Nov 14 olle 2238     {
2933 14 Nov 14 olle 2239       json.put("status", "error");
2933 14 Nov 14 olle 2240       jsonMessages.add("Found > 1 MIME type");
2933 14 Nov 14 olle 2241     }
2933 14 Nov 14 olle 2242     else
2933 14 Nov 14 olle 2243     {
2933 14 Nov 14 olle 2244       DataFileType ft = result.get(0);
2933 14 Nov 14 olle 2245       json.put("id", ft.getId());
2933 14 Nov 14 olle 2246       json.put("status", "ok"); // For now -- more checks below
2933 14 Nov 14 olle 2247       
2933 14 Nov 14 olle 2248       if (!ft.getExternalId().equals(fileType.getExternalId()))
2933 14 Nov 14 olle 2249       {
2933 14 Nov 14 olle 2250         json.put("status", "error");
2933 14 Nov 14 olle 2251         jsonMessages.add("Should have '" + fileType.getExternalId() + "' as external id.");
2933 14 Nov 14 olle 2252       }
2933 14 Nov 14 olle 2253       
2933 14 Nov 14 olle 2254       if (!ft.getItemType().equals(fileType.getItemType()))
2933 14 Nov 14 olle 2255       {
2933 14 Nov 14 olle 2256         json.put("status", "error");
2933 14 Nov 14 olle 2257         jsonMessages.add("Should have '" + fileType.getItemType().name() + "' as item type.");
2933 14 Nov 14 olle 2258       }
2933 14 Nov 14 olle 2259       
2933 14 Nov 14 olle 2260       if (fileType.getSubtype() != null)
2933 14 Nov 14 olle 2261       {
2933 14 Nov 14 olle 2262         ItemSubtype subtype = fileType.getSubtype().get(dc);
2933 14 Nov 14 olle 2263         if (subtype != null && !subtype.equals(ft.getGenericType()))
2933 14 Nov 14 olle 2264         {
2933 14 Nov 14 olle 2265           if (createIfMissing)
2933 14 Nov 14 olle 2266           {
2933 14 Nov 14 olle 2267             ft.setGenericType(fileType.getSubtype().get(dc));
2933 14 Nov 14 olle 2268             jsonMessages.add("Fixed");
2933 14 Nov 14 olle 2269           }
2933 14 Nov 14 olle 2270           else
2933 14 Nov 14 olle 2271           {
2933 14 Nov 14 olle 2272             json.put("status", "incomplete");
2933 14 Nov 14 olle 2273             jsonMessages.add("Should be related to '" + fileType.getSubtype().getName() + "' subtype.");
2933 14 Nov 14 olle 2274           }
2933 14 Nov 14 olle 2275         }
2933 14 Nov 14 olle 2276       }
2933 14 Nov 14 olle 2277     }
2933 14 Nov 14 olle 2278     if (jsonMessages.size() == 0) jsonMessages.add("Ok");
2933 14 Nov 14 olle 2279     json.put("messages", jsonMessages);
2933 14 Nov 14 olle 2280     return json;
2933 14 Nov 14 olle 2281   
2933 14 Nov 14 olle 2282   }
2933 14 Nov 14 olle 2283
2933 14 Nov 14 olle 2284   
2933 14 Nov 14 olle 2285   /**
2933 14 Nov 14 olle 2286     Create a MIME type with the given options. The type is created in
2933 14 Nov 14 olle 2287     a separate transaction.
2933 14 Nov 14 olle 2288     @since 2.12
2933 14 Nov 14 olle 2289   */
2933 14 Nov 14 olle 2290   public Extract createExtract(SessionControl sc, String name, Subtype subtype, String description, PermissionOptions permissions)
2933 14 Nov 14 olle 2291   {
2933 14 Nov 14 olle 2292     Extract extract = null;
2933 14 Nov 14 olle 2293     DbControl dc = sc.newDbControl();
2933 14 Nov 14 olle 2294     try
2933 14 Nov 14 olle 2295     {
2933 14 Nov 14 olle 2296       extract = Extract.getNew(dc);
2933 14 Nov 14 olle 2297       extract.setName(name);
2933 14 Nov 14 olle 2298       extract.setItemSubtype(subtype.get(dc));
2933 14 Nov 14 olle 2299       extract.setDescription(description);
2933 14 Nov 14 olle 2300       if (permissions != null) permissions.applyPermissions(extract);
2933 14 Nov 14 olle 2301       dc.saveItem(extract);
2933 14 Nov 14 olle 2302       dc.commit();
2933 14 Nov 14 olle 2303     }
2933 14 Nov 14 olle 2304     finally
2933 14 Nov 14 olle 2305     {
2933 14 Nov 14 olle 2306       if (dc != null) dc.close();
2933 14 Nov 14 olle 2307     }
2933 14 Nov 14 olle 2308     return extract;
2933 14 Nov 14 olle 2309   }
2933 14 Nov 14 olle 2310   
2933 14 Nov 14 olle 2311   /**
2933 14 Nov 14 olle 2312     Check for an existing Extract type with the given options.
2933 14 Nov 14 olle 2313     A JSONObject is returned with the result. The following 
2933 14 Nov 14 olle 2314     keys are used:
2933 14 Nov 14 olle 2315     <ul>
2933 14 Nov 14 olle 2316     <li>itemType: EXTRACT
2933 14 Nov 14 olle 2317     <li>name: The name of the extract
2933 14 Nov 14 olle 2318     <li>id: The id of the extract if it exists
2933 14 Nov 14 olle 2319     <li>status: ok, error, or missing
2933 14 Nov 14 olle 2320     <li>message: A descriptive message in case of an error
2933 14 Nov 14 olle 2321     </ul>
2933 14 Nov 14 olle 2322     @since 2.12
2933 14 Nov 14 olle 2323   */
2933 14 Nov 14 olle 2324   @SuppressWarnings("unchecked")
2933 14 Nov 14 olle 2325   public JSONObject checkExtract(DbControl dc, String name, Subtype subtype, String description, PermissionOptions permissions,
2933 14 Nov 14 olle 2326     boolean createIfMissing)
2933 14 Nov 14 olle 2327   {
2933 14 Nov 14 olle 2328   
2933 14 Nov 14 olle 2329     JSONObject json = new JSONObject();
2933 14 Nov 14 olle 2330     JSONArray jsonMessages = new JSONArray();
2933 14 Nov 14 olle 2331     json.put("itemType", Item.EXTRACT.name());
2933 14 Nov 14 olle 2332     json.put("name", name);
2933 14 Nov 14 olle 2333
2933 14 Nov 14 olle 2334     ItemQuery<Extract> query = Extract.getQuery();
2933 14 Nov 14 olle 2335     query.setIncludes(Include.ALL);
2933 14 Nov 14 olle 2336     query.restrict(
2933 14 Nov 14 olle 2337       Restrictions.eq(
2933 14 Nov 14 olle 2338         Hql.property("name"), 
2933 14 Nov 14 olle 2339         Expressions.parameter("name", name, Type.STRING)
2933 14 Nov 14 olle 2340       ));
2933 14 Nov 14 olle 2341     
2933 14 Nov 14 olle 2342     List<Extract> result = query.list(dc);
2933 14 Nov 14 olle 2343     if (result.size() == 0)
2933 14 Nov 14 olle 2344     {
2933 14 Nov 14 olle 2345       if (createIfMissing)
2933 14 Nov 14 olle 2346       {
2933 14 Nov 14 olle 2347         Extract extract = createExtract(dc.getSessionControl(), name, subtype, description, permissions);
2933 14 Nov 14 olle 2348         json.put("id", extract.getId());
2933 14 Nov 14 olle 2349         json.put("status", "ok");
2933 14 Nov 14 olle 2350         jsonMessages.add("Created");
2933 14 Nov 14 olle 2351       }
2933 14 Nov 14 olle 2352       else
2933 14 Nov 14 olle 2353       {
2933 14 Nov 14 olle 2354         json.put("status", "missing");
2933 14 Nov 14 olle 2355         jsonMessages.add("Not found");
2933 14 Nov 14 olle 2356       }
2933 14 Nov 14 olle 2357     }
2933 14 Nov 14 olle 2358     else if (result.size() > 1)
2933 14 Nov 14 olle 2359     {
2933 14 Nov 14 olle 2360       json.put("status", "error");
2933 14 Nov 14 olle 2361       jsonMessages.add("Found > 1 Extract [" + name + "]");
2933 14 Nov 14 olle 2362     }
2933 14 Nov 14 olle 2363     else
2933 14 Nov 14 olle 2364     {
2933 14 Nov 14 olle 2365       Extract e = result.get(0);
2933 14 Nov 14 olle 2366       json.put("id", e.getId());
2933 14 Nov 14 olle 2367       json.put("status", "ok"); // For now -- more checks below
2933 14 Nov 14 olle 2368       
2933 14 Nov 14 olle 2369       if (!subtype.load(dc).equals(e.getItemSubtype()))
2933 14 Nov 14 olle 2370       {
2933 14 Nov 14 olle 2371         json.put("status", "error");
2933 14 Nov 14 olle 2372         jsonMessages.add("Should have '" + subtype.getName() + "' as subtype.");
2933 14 Nov 14 olle 2373       }
2933 14 Nov 14 olle 2374       
2933 14 Nov 14 olle 2375       if (permissions != null && !permissions.checkPermissions(e))
2933 14 Nov 14 olle 2376       {
2933 14 Nov 14 olle 2377         if (createIfMissing)
2933 14 Nov 14 olle 2378         {
2933 14 Nov 14 olle 2379           permissions.applyPermissions(e);
2933 14 Nov 14 olle 2380           if (jsonMessages.size() == 0) jsonMessages.add("Fixed");
2933 14 Nov 14 olle 2381         }
2933 14 Nov 14 olle 2382         else
2933 14 Nov 14 olle 2383         {
2933 14 Nov 14 olle 2384           json.put("status", "incomplete");
2933 14 Nov 14 olle 2385           jsonMessages.add(permissions.getMessage());
2933 14 Nov 14 olle 2386         }
2933 14 Nov 14 olle 2387       }
2933 14 Nov 14 olle 2388       
2933 14 Nov 14 olle 2389     }
2933 14 Nov 14 olle 2390     if (jsonMessages.size() == 0) jsonMessages.add("Ok");
2933 14 Nov 14 olle 2391     json.put("messages", jsonMessages);
2933 14 Nov 14 olle 2392     return json;
2933 14 Nov 14 olle 2393   }
2933 14 Nov 14 olle 2394
2933 14 Nov 14 olle 2395   
2933 14 Nov 14 olle 2396   /**
2933 14 Nov 14 olle 2397     Create a Plate geometry with the given options. The geometry is created in
2933 14 Nov 14 olle 2398     a separate transaction.
2933 14 Nov 14 olle 2399     @since 2.5
2933 14 Nov 14 olle 2400   */
2933 14 Nov 14 olle 2401   public PlateGeometry createPlateGeometry(SessionControl sc, Geometry def)
2933 14 Nov 14 olle 2402   {
2933 14 Nov 14 olle 2403     PlateGeometry g = null;
2933 14 Nov 14 olle 2404     DbControl dc = sc.newDbControl();
2933 14 Nov 14 olle 2405     try
2933 14 Nov 14 olle 2406     {
2933 14 Nov 14 olle 2407       g = PlateGeometry.getNew(dc, def.getRows(), def.getColumns());
2933 14 Nov 14 olle 2408       g.setName(def.getName());
2933 14 Nov 14 olle 2409       dc.saveItem(g);
2933 14 Nov 14 olle 2410       dc.commit();
2933 14 Nov 14 olle 2411     }
2933 14 Nov 14 olle 2412     finally
2933 14 Nov 14 olle 2413     {
2933 14 Nov 14 olle 2414       if (dc != null) dc.close();
2933 14 Nov 14 olle 2415     }
2933 14 Nov 14 olle 2416     return g;
2933 14 Nov 14 olle 2417   }
2933 14 Nov 14 olle 2418
2933 14 Nov 14 olle 2419   
2933 14 Nov 14 olle 2420   /**
2933 14 Nov 14 olle 2421     Check for an existing Plate geometry type with the given options.
2933 14 Nov 14 olle 2422     A JSONObject is returned with the result. The following 
2933 14 Nov 14 olle 2423     keys are used:
2933 14 Nov 14 olle 2424     <ul>
2933 14 Nov 14 olle 2425     <li>itemType: PLATEGEOMETRY
2933 14 Nov 14 olle 2426     <li>name: The name of the geometry
2933 14 Nov 14 olle 2427     <li>id: The id of the geometry if it exists
2933 14 Nov 14 olle 2428     <li>rows: The number of rows
2933 14 Nov 14 olle 2429     <li>column: The number of columns
2933 14 Nov 14 olle 2430     <li>status: ok, error, or missing
2933 14 Nov 14 olle 2431     <li>message: A descriptive message in case of an error
2933 14 Nov 14 olle 2432     </ul>
2933 14 Nov 14 olle 2433     @since 2.5
2933 14 Nov 14 olle 2434   */
2933 14 Nov 14 olle 2435   @SuppressWarnings("unchecked")
2933 14 Nov 14 olle 2436   public JSONObject checkPlateGeometry(DbControl dc, Geometry geometry, boolean createIfMissing)
2933 14 Nov 14 olle 2437   {
2933 14 Nov 14 olle 2438   
2933 14 Nov 14 olle 2439     JSONObject json = new JSONObject();
2933 14 Nov 14 olle 2440     JSONArray jsonMessages = new JSONArray();
2933 14 Nov 14 olle 2441     json.put("itemType", Item.PLATEGEOMETRY.name());
2933 14 Nov 14 olle 2442     json.put("name", geometry.getName());
2933 14 Nov 14 olle 2443     json.put("rows", geometry.getRows());
2933 14 Nov 14 olle 2444     json.put("columns", geometry.getColumns());
2933 14 Nov 14 olle 2445       
2933 14 Nov 14 olle 2446     List<PlateGeometry> result = geometry.list(dc);
2933 14 Nov 14 olle 2447     if (result.size() == 0)
2933 14 Nov 14 olle 2448     {
2933 14 Nov 14 olle 2449       if (createIfMissing)
2933 14 Nov 14 olle 2450       {
2933 14 Nov 14 olle 2451         PlateGeometry g = createPlateGeometry(dc.getSessionControl(), geometry);
2933 14 Nov 14 olle 2452         json.put("id", g.getId());
2933 14 Nov 14 olle 2453         json.put("status", "ok");
2933 14 Nov 14 olle 2454         jsonMessages.add("Created");
2933 14 Nov 14 olle 2455       }
2933 14 Nov 14 olle 2456       else
2933 14 Nov 14 olle 2457       {
2933 14 Nov 14 olle 2458         json.put("status", "missing");
2933 14 Nov 14 olle 2459         jsonMessages.add("Not found");
2933 14 Nov 14 olle 2460       }
2933 14 Nov 14 olle 2461     }
2933 14 Nov 14 olle 2462     else if (result.size() > 1)
2933 14 Nov 14 olle 2463     {
2933 14 Nov 14 olle 2464       json.put("status", "error");
2933 14 Nov 14 olle 2465       jsonMessages.add("Found > 1 geometry");
2933 14 Nov 14 olle 2466     }
2933 14 Nov 14 olle 2467     else
2933 14 Nov 14 olle 2468     {
2933 14 Nov 14 olle 2469       PlateGeometry g = result.get(0);
2933 14 Nov 14 olle 2470       json.put("id", g.getId());
2933 14 Nov 14 olle 2471       json.put("status", "ok"); // For now -- more checks below
2933 14 Nov 14 olle 2472     }
2933 14 Nov 14 olle 2473     if (jsonMessages.size() == 0) jsonMessages.add("Ok");
2933 14 Nov 14 olle 2474     json.put("messages", jsonMessages);
2933 14 Nov 14 olle 2475     return json;
2933 14 Nov 14 olle 2476   
2933 14 Nov 14 olle 2477   }
2933 14 Nov 14 olle 2478
2933 14 Nov 14 olle 2479   @SuppressWarnings("unchecked")
2933 14 Nov 14 olle 2480   public JSONObject checkPlugin(DbControl dc, String clazz,
2933 14 Nov 14 olle 2481     PermissionOptions permissions, boolean createIfMissing)
2933 14 Nov 14 olle 2482   {
2933 14 Nov 14 olle 2483     JSONObject json = new JSONObject();
2933 14 Nov 14 olle 2484     JSONArray jsonMessages = new JSONArray();
2933 14 Nov 14 olle 2485     json.put("itemType", Item.PLUGINDEFINITION.name());
2933 14 Nov 14 olle 2486     json.put("name", clazz);
2933 14 Nov 14 olle 2487     
2933 14 Nov 14 olle 2488     try
2933 14 Nov 14 olle 2489     {
2933 14 Nov 14 olle 2490       PluginDefinition plugin = PluginDefinition.getByClassName(dc, clazz);
2933 14 Nov 14 olle 2491       
2933 14 Nov 14 olle 2492       json.put("id", plugin.getId());
2933 14 Nov 14 olle 2493       json.put("name", plugin.getName());
2933 14 Nov 14 olle 2494       json.put("status", "ok"); // For now -- more checks below
2933 14 Nov 14 olle 2495       
2933 14 Nov 14 olle 2496       if (permissions != null && !permissions.checkPermissions(plugin))
2933 14 Nov 14 olle 2497       {
2933 14 Nov 14 olle 2498         if (createIfMissing)
2933 14 Nov 14 olle 2499         {
2933 14 Nov 14 olle 2500           permissions.applyPermissions(plugin);
2933 14 Nov 14 olle 2501           if (jsonMessages.size() == 0) jsonMessages.add("Fixed");
2933 14 Nov 14 olle 2502         }
2933 14 Nov 14 olle 2503         else
2933 14 Nov 14 olle 2504         {
2933 14 Nov 14 olle 2505           json.put("status", "incomplete");
2933 14 Nov 14 olle 2506           jsonMessages.add(permissions.getMessage());
2933 14 Nov 14 olle 2507         }
2933 14 Nov 14 olle 2508       }
2933 14 Nov 14 olle 2509     }
2933 14 Nov 14 olle 2510     catch (ItemNotFoundException ex)
2933 14 Nov 14 olle 2511     {
2933 14 Nov 14 olle 2512       jsonMessages.add("Not installed");
2933 14 Nov 14 olle 2513       json.put("status", "error");
2933 14 Nov 14 olle 2514     }
2933 14 Nov 14 olle 2515     
2933 14 Nov 14 olle 2516     if (jsonMessages.size() == 0) jsonMessages.add("Ok");
2933 14 Nov 14 olle 2517     json.put("messages", jsonMessages);
2933 14 Nov 14 olle 2518     return json;
2933 14 Nov 14 olle 2519   }
2933 14 Nov 14 olle 2520
2933 14 Nov 14 olle 2521   @SuppressWarnings("unchecked")
2933 14 Nov 14 olle 2522   public JSONObject checkPluginConfiguration(DbControl dc, String clazz, String configName,
2933 14 Nov 14 olle 2523     PermissionOptions permissions, boolean createIfMissing)
2933 14 Nov 14 olle 2524   {
2933 14 Nov 14 olle 2525     JSONObject json = new JSONObject();
2933 14 Nov 14 olle 2526     JSONArray jsonMessages = new JSONArray();
2933 14 Nov 14 olle 2527     json.put("itemType", Item.PLUGINCONFIGURATION.name());
2933 14 Nov 14 olle 2528     json.put("name", configName);
2933 14 Nov 14 olle 2529     
2933 14 Nov 14 olle 2530     try
2933 14 Nov 14 olle 2531     {
2933 14 Nov 14 olle 2532       PluginDefinition plugin = PluginDefinition.getByClassName(dc, clazz);
2933 14 Nov 14 olle 2533       
2933 14 Nov 14 olle 2534       ItemQuery<PluginConfiguration> query = plugin.getPluginConfigurations();
2933 14 Nov 14 olle 2535       query.include(Include.ALL);
2933 14 Nov 14 olle 2536       query.restrict(Restrictions.eq(Hql.property("name"), Expressions.string(configName)));
2933 14 Nov 14 olle 2537       
2933 14 Nov 14 olle 2538       List<PluginConfiguration> result = query.list(dc);
2933 14 Nov 14 olle 2539       
2933 14 Nov 14 olle 2540       if (result.size() == 0)
2933 14 Nov 14 olle 2541       {
2933 14 Nov 14 olle 2542         json.put("status", "error");
2933 14 Nov 14 olle 2543         jsonMessages.add("Not installed");
2933 14 Nov 14 olle 2544       }
2933 14 Nov 14 olle 2545       else if (result.size() > 1)
2933 14 Nov 14 olle 2546       {
2933 14 Nov 14 olle 2547         json.put("status", "error");
2933 14 Nov 14 olle 2548         jsonMessages.add("Found > 1 configuration");
2933 14 Nov 14 olle 2549       }
2933 14 Nov 14 olle 2550       else
2933 14 Nov 14 olle 2551       {
2933 14 Nov 14 olle 2552         PluginConfiguration config = result.get(0);
2933 14 Nov 14 olle 2553         json.put("id", config.getId());
2933 14 Nov 14 olle 2554         json.put("status", "ok"); // For now -- more checks below
2933 14 Nov 14 olle 2555         
2933 14 Nov 14 olle 2556         if (permissions != null && !permissions.checkPermissions(config))
2933 14 Nov 14 olle 2557         {
2933 14 Nov 14 olle 2558           if (createIfMissing)
2933 14 Nov 14 olle 2559           {
2933 14 Nov 14 olle 2560             permissions.applyPermissions(config);
2933 14 Nov 14 olle 2561             if (jsonMessages.size() == 0) jsonMessages.add("Fixed");
2933 14 Nov 14 olle 2562           }
2933 14 Nov 14 olle 2563           else
2933 14 Nov 14 olle 2564           {
2933 14 Nov 14 olle 2565             json.put("status", "incomplete");
2933 14 Nov 14 olle 2566             jsonMessages.add(permissions.getMessage());
2933 14 Nov 14 olle 2567           }
2933 14 Nov 14 olle 2568         }
2933 14 Nov 14 olle 2569       }
2933 14 Nov 14 olle 2570     }
2933 14 Nov 14 olle 2571     catch (ItemNotFoundException ex)
2933 14 Nov 14 olle 2572     {
2933 14 Nov 14 olle 2573       jsonMessages.add("Not installed");
2933 14 Nov 14 olle 2574       json.put("status", "error");
2933 14 Nov 14 olle 2575     }
2933 14 Nov 14 olle 2576     
2933 14 Nov 14 olle 2577     if (jsonMessages.size() == 0) jsonMessages.add("Ok");
2933 14 Nov 14 olle 2578     json.put("messages", jsonMessages);
2933 14 Nov 14 olle 2579     return json;
2933 14 Nov 14 olle 2580   }
2933 14 Nov 14 olle 2581
2933 14 Nov 14 olle 2582   private Map<String, String> barcodeSequences;
2933 14 Nov 14 olle 2583   /**
3449 28 Jul 15 olle 2584     Maps barcode name (A701, ... , A712, A501, ... , A508) to gene sequence.
2933 14 Nov 14 olle 2585   */
2933 14 Nov 14 olle 2586   private String lookupSequence(String barcode)
2933 14 Nov 14 olle 2587   {
2933 14 Nov 14 olle 2588     if (barcodeSequences == null)
2933 14 Nov 14 olle 2589     {
2933 14 Nov 14 olle 2590       barcodeSequences = new HashMap<String, String>();
3449 28 Jul 15 olle 2591       // Illumina Index 1 Primers Lot Number
3449 28 Jul 15 olle 2592       barcodeSequences.put("A701", "ATCACGAC");
3449 28 Jul 15 olle 2593       barcodeSequences.put("A702", "ACAGTGGT");
3449 28 Jul 15 olle 2594       barcodeSequences.put("A703", "CAGATCCA");
3449 28 Jul 15 olle 2595       barcodeSequences.put("A704", "ACAAACGG");
3449 28 Jul 15 olle 2596       barcodeSequences.put("A705", "ACCCAGCA");
3449 28 Jul 15 olle 2597       barcodeSequences.put("A706", "AACCCCTC");
3449 28 Jul 15 olle 2598       barcodeSequences.put("A707", "CCCAACCT");
3449 28 Jul 15 olle 2599       barcodeSequences.put("A708", "CACCACAC");
3449 28 Jul 15 olle 2600       barcodeSequences.put("A709", "GAAACCCA");
3449 28 Jul 15 olle 2601       barcodeSequences.put("A710", "TGTGACCA");
3449 28 Jul 15 olle 2602       barcodeSequences.put("A711", "AGGGTCAA");
3449 28 Jul 15 olle 2603       barcodeSequences.put("A712", "AGGAGTGG");
3449 28 Jul 15 olle 2604       // Illumina Index 2 Primers Lot Number
3449 28 Jul 15 olle 2605       barcodeSequences.put("A501", "TGAACCTT");
3449 28 Jul 15 olle 2606       barcodeSequences.put("A502", "TGCTAAGT");
3449 28 Jul 15 olle 2607       barcodeSequences.put("A503", "TGTTCTCT");
3449 28 Jul 15 olle 2608       barcodeSequences.put("A504", "TAAGACAC");
3449 28 Jul 15 olle 2609       barcodeSequences.put("A505", "CTAATCGA");
3449 28 Jul 15 olle 2610       barcodeSequences.put("A506", "CTAGAACA");
3449 28 Jul 15 olle 2611       barcodeSequences.put("A507", "TAAGTTCC");
3449 28 Jul 15 olle 2612       barcodeSequences.put("A508", "TAGACCTA");
3449 28 Jul 15 olle 2613 /*
2933 14 Nov 14 olle 2614       barcodeSequences.put("AD001", "ATCACGA");
2933 14 Nov 14 olle 2615       barcodeSequences.put("AD002", "CGATGTA");
2933 14 Nov 14 olle 2616       barcodeSequences.put("AD003", "TTAGGCA");
2933 14 Nov 14 olle 2617       barcodeSequences.put("AD004", "TGACCAA");
2933 14 Nov 14 olle 2618       barcodeSequences.put("AD005", "ACAGTGA");
2933 14 Nov 14 olle 2619       barcodeSequences.put("AD006", "GCCAATA");
2933 14 Nov 14 olle 2620       barcodeSequences.put("AD007", "CAGATCA");
2933 14 Nov 14 olle 2621       barcodeSequences.put("AD008", "ACTTGAA");
2933 14 Nov 14 olle 2622       barcodeSequences.put("AD009", "GATCAGA");
2933 14 Nov 14 olle 2623       barcodeSequences.put("AD010", "TAGCTTA");
2933 14 Nov 14 olle 2624       barcodeSequences.put("AD011", "GGCTACA");
2933 14 Nov 14 olle 2625       barcodeSequences.put("AD012", "CTTGTAA");
2933 14 Nov 14 olle 2626       barcodeSequences.put("AD013", "AGTCAAA");
2933 14 Nov 14 olle 2627       barcodeSequences.put("AD014", "AGTTCCA");
2933 14 Nov 14 olle 2628       barcodeSequences.put("AD015", "ATGTCAA");
2933 14 Nov 14 olle 2629       barcodeSequences.put("AD016", "CCGTCCA");
2933 14 Nov 14 olle 2630       barcodeSequences.put("AD018", "GTCCGCA");
2933 14 Nov 14 olle 2631       barcodeSequences.put("AD019", "GTGAAAA");
2933 14 Nov 14 olle 2632       barcodeSequences.put("AD020", "GTGGCCA");
2933 14 Nov 14 olle 2633       barcodeSequences.put("AD021", "GTTTCGA");
2933 14 Nov 14 olle 2634       barcodeSequences.put("AD022", "CGTACGA");
2933 14 Nov 14 olle 2635       barcodeSequences.put("AD023", "GAGTGGA");
2933 14 Nov 14 olle 2636       barcodeSequences.put("AD025", "ACTGATA");
2933 14 Nov 14 olle 2637       barcodeSequences.put("AD027", "ATTCCTA");
3449 28 Jul 15 olle 2638 */
2933 14 Nov 14 olle 2639     }
2933 14 Nov 14 olle 2640     
2933 14 Nov 14 olle 2641     return barcodeSequences.get(barcode);
2933 14 Nov 14 olle 2642   }
2933 14 Nov 14 olle 2643   
2933 14 Nov 14 olle 2644   /**
2933 14 Nov 14 olle 2645     Store options for enumerated annotation types and min/max values for numerical annotations.
2933 14 Nov 14 olle 2646   */
2933 14 Nov 14 olle 2647   static class ValueOptions
2933 14 Nov 14 olle 2648   {
2933 14 Nov 14 olle 2649     private final Object[] options;
2933 14 Nov 14 olle 2650     private final Integer min;
2933 14 Nov 14 olle 2651     private final Integer max;
2933 14 Nov 14 olle 2652     
2933 14 Nov 14 olle 2653     /**
2933 14 Nov 14 olle 2654       The annotation type is an enumerated annotation type with the following options.
2933 14 Nov 14 olle 2655     */
2933 14 Nov 14 olle 2656     ValueOptions(Object... options)
2933 14 Nov 14 olle 2657     {
2933 14 Nov 14 olle 2658       this.options = options;
2933 14 Nov 14 olle 2659       this.min = null;
2933 14 Nov 14 olle 2660       this.max = null;
2933 14 Nov 14 olle 2661     }
2933 14 Nov 14 olle 2662     
2933 14 Nov 14 olle 2663     /**
2933 14 Nov 14 olle 2664       The annotation type is a numeric annotation type with the following restrictions.
2933 14 Nov 14 olle 2665     */
2933 14 Nov 14 olle 2666     ValueOptions(Integer min, Integer max)
2933 14 Nov 14 olle 2667     {
2933 14 Nov 14 olle 2668       this.min = min;
2933 14 Nov 14 olle 2669       this.max = max;
2933 14 Nov 14 olle 2670       this.options = null;
2933 14 Nov 14 olle 2671     }
2933 14 Nov 14 olle 2672     
2933 14 Nov 14 olle 2673     boolean isEnumeration()
2933 14 Nov 14 olle 2674     {
2933 14 Nov 14 olle 2675       return options != null;
2933 14 Nov 14 olle 2676     }
2933 14 Nov 14 olle 2677     
2933 14 Nov 14 olle 2678     Integer getMin()
2933 14 Nov 14 olle 2679     {
2933 14 Nov 14 olle 2680       return min;
2933 14 Nov 14 olle 2681     }
2933 14 Nov 14 olle 2682     
2933 14 Nov 14 olle 2683     Integer getMax()
2933 14 Nov 14 olle 2684     {
2933 14 Nov 14 olle 2685       return max;
2933 14 Nov 14 olle 2686     }
2933 14 Nov 14 olle 2687     
2933 14 Nov 14 olle 2688     /**
2933 14 Nov 14 olle 2689       Get the options as a List.
2933 14 Nov 14 olle 2690     */
2933 14 Nov 14 olle 2691     List<?> getList()
2933 14 Nov 14 olle 2692     {
2933 14 Nov 14 olle 2693       return Arrays.asList(options);
2933 14 Nov 14 olle 2694     }
2933 14 Nov 14 olle 2695     
2933 14 Nov 14 olle 2696     /**
2933 14 Nov 14 olle 2697       Get the options as an array.
2933 14 Nov 14 olle 2698     */
2933 14 Nov 14 olle 2699     Object[] getArray()
2933 14 Nov 14 olle 2700     {
2933 14 Nov 14 olle 2701       return options;
2933 14 Nov 14 olle 2702     }
2933 14 Nov 14 olle 2703     
2933 14 Nov 14 olle 2704     /**
2933 14 Nov 14 olle 2705       Add options missing in the current annotation type.
2933 14 Nov 14 olle 2706     */
2933 14 Nov 14 olle 2707     void applyEnumeration(AnnotationType at)
2933 14 Nov 14 olle 2708     {
2933 14 Nov 14 olle 2709       List<Object> values = new ArrayList<Object>(at.getValues());
2933 14 Nov 14 olle 2710       for (Object opt : options)
2933 14 Nov 14 olle 2711       {
2933 14 Nov 14 olle 2712         System.out.println(opt+":"+values.contains(opt));
2933 14 Nov 14 olle 2713         if (!values.contains(opt)) values.add(opt);
2933 14 Nov 14 olle 2714       }
2933 14 Nov 14 olle 2715       at.setValues(values);
2933 14 Nov 14 olle 2716     }
2933 14 Nov 14 olle 2717   }
2933 14 Nov 14 olle 2718   
2933 14 Nov 14 olle 2719   /**
2933 14 Nov 14 olle 2720     Store permissions that can be applied to shareable items.
2933 14 Nov 14 olle 2721   */
2933 14 Nov 14 olle 2722   static class PermissionOptions
2933 14 Nov 14 olle 2723   {
2933 14 Nov 14 olle 2724     private Map<Group, Permission> groupPermissions;
2933 14 Nov 14 olle 2725     private Map<Project, Permission> projectPermissions;
2933 14 Nov 14 olle 2726     private String message;
2933 14 Nov 14 olle 2727     
2933 14 Nov 14 olle 2728     PermissionOptions()
2933 14 Nov 14 olle 2729     {
2933 14 Nov 14 olle 2730       groupPermissions = new HashMap<Group, Permission>();
2933 14 Nov 14 olle 2731       projectPermissions = new HashMap<Project, Permission>();
2933 14 Nov 14 olle 2732     }
2933 14 Nov 14 olle 2733
2933 14 Nov 14 olle 2734     /**
2933 14 Nov 14 olle 2735       Set a permission for the given group.
2933 14 Nov 14 olle 2736     */
2933 14 Nov 14 olle 2737     void set(Group g, Permission p)
2933 14 Nov 14 olle 2738     {
2933 14 Nov 14 olle 2739       groupPermissions.put(g, p);
2933 14 Nov 14 olle 2740     }
2933 14 Nov 14 olle 2741
2933 14 Nov 14 olle 2742     /**
2933 14 Nov 14 olle 2743       Set a permission for the given project.
2933 14 Nov 14 olle 2744     */
2933 14 Nov 14 olle 2745     void set(Project pr, Permission p)
2933 14 Nov 14 olle 2746     {
2933 14 Nov 14 olle 2747       projectPermissions.put(pr, p);
2933 14 Nov 14 olle 2748     }
2933 14 Nov 14 olle 2749
2933 14 Nov 14 olle 2750     /**
2933 14 Nov 14 olle 2751       Check if the given item includes at least all the required permissions.
2933 14 Nov 14 olle 2752       @return TRUE if all permissions are ok, FALSE if not (call getMessage())
2933 14 Nov 14 olle 2753       to get more information.
2933 14 Nov 14 olle 2754     */
2933 14 Nov 14 olle 2755     boolean checkPermissions(SharedItem item)
2933 14 Nov 14 olle 2756     {
2933 14 Nov 14 olle 2757       ProjectKey pKey = item.getProjectKey();
2933 14 Nov 14 olle 2758       for (Map.Entry<Project, Permission> entry : projectPermissions.entrySet())
2933 14 Nov 14 olle 2759       {
2933 14 Nov 14 olle 2760         Project pr = entry.getKey();
2933 14 Nov 14 olle 2761         Permission p = entry.getValue();
2933 14 Nov 14 olle 2762         
2933 14 Nov 14 olle 2763         Set<Permission> permissions = pKey != null ? pKey.getPermissions(pr) : null;
2933 14 Nov 14 olle 2764         if (p == null)
2933 14 Nov 14 olle 2765         {
2933 14 Nov 14 olle 2766           // The item should not be shared to project 'pr'
2933 14 Nov 14 olle 2767           if (permissions != null && permissions.size() > 0)
2933 14 Nov 14 olle 2768           {
2933 14 Nov 14 olle 2769             message = "Should not be shared to project: " + pr.getName() + " (" + permissions + ")";
2933 14 Nov 14 olle 2770             return false;
2933 14 Nov 14 olle 2771           }
2933 14 Nov 14 olle 2772         }
2933 14 Nov 14 olle 2773         else
2933 14 Nov 14 olle 2774         {
2933 14 Nov 14 olle 2775           // The item should be shared to project 'pr' with permission 'p'
2933 14 Nov 14 olle 2776           if (pKey == null || !permissions.contains(p))
2933 14 Nov 14 olle 2777           {
2933 14 Nov 14 olle 2778             message = "Not shared to project: " + pr.getName() + " (" + p + ")";
2933 14 Nov 14 olle 2779             return false;
2933 14 Nov 14 olle 2780           }
2933 14 Nov 14 olle 2781         }
2933 14 Nov 14 olle 2782       }
2933 14 Nov 14 olle 2783       ItemKey key = item.getItemKey();
2933 14 Nov 14 olle 2784       for (Map.Entry<Group, Permission> entry : groupPermissions.entrySet())
2933 14 Nov 14 olle 2785       {
2933 14 Nov 14 olle 2786         Group g = entry.getKey();
2933 14 Nov 14 olle 2787         Permission p = entry.getValue();
2933 14 Nov 14 olle 2788         
2933 14 Nov 14 olle 2789         Set<Permission> permissions = key != null ? key.getPermissions(g) : null;
2933 14 Nov 14 olle 2790         if (p == null)
2933 14 Nov 14 olle 2791         {
2933 14 Nov 14 olle 2792           // The item should not be shared to group 'g'
2933 14 Nov 14 olle 2793           if (permissions != null && permissions.size() > 0)
2933 14 Nov 14 olle 2794           {
2933 14 Nov 14 olle 2795             message = "Should not be shared to group: " + g.getName() + " (" + permissions + ")";
2933 14 Nov 14 olle 2796             return false;
2933 14 Nov 14 olle 2797           }
2933 14 Nov 14 olle 2798         }
2933 14 Nov 14 olle 2799         else
2933 14 Nov 14 olle 2800         {
2933 14 Nov 14 olle 2801           // The item should be shared to group 'g' with permission 'p'
2933 14 Nov 14 olle 2802           if (key == null || !key.getPermissions(g).contains(p))
2933 14 Nov 14 olle 2803           {
2933 14 Nov 14 olle 2804             message = "Not shared to group: " + g.getName() + " (" + p + ")";
2933 14 Nov 14 olle 2805             return false;
2933 14 Nov 14 olle 2806           }
2933 14 Nov 14 olle 2807         }
2933 14 Nov 14 olle 2808
2933 14 Nov 14 olle 2809       }
2933 14 Nov 14 olle 2810       return true;
2933 14 Nov 14 olle 2811     }
2933 14 Nov 14 olle 2812     
2933 14 Nov 14 olle 2813     /**
2933 14 Nov 14 olle 2814       More information about missing permission from the checkPermissions() method.
2933 14 Nov 14 olle 2815     */
2933 14 Nov 14 olle 2816     String getMessage()
2933 14 Nov 14 olle 2817     {
2933 14 Nov 14 olle 2818       return message;
2933 14 Nov 14 olle 2819     }
2933 14 Nov 14 olle 2820   
2933 14 Nov 14 olle 2821     /**
2933 14 Nov 14 olle 2822       Apply all permissions to the given item.
2933 14 Nov 14 olle 2823     */
2933 14 Nov 14 olle 2824     void applyPermissions(SharedItem item)
2933 14 Nov 14 olle 2825     {
2933 14 Nov 14 olle 2826       MultiPermissions mp = new MultiPermissions(Collections.singleton(item));
2933 14 Nov 14 olle 2827       for (Map.Entry<Group, Permission> entry : groupPermissions.entrySet())
2933 14 Nov 14 olle 2828       {
2933 14 Nov 14 olle 2829         Group g = entry.getKey();
2933 14 Nov 14 olle 2830         Permission p = entry.getValue();
2933 14 Nov 14 olle 2831         if (p == null)
2933 14 Nov 14 olle 2832         {
2933 14 Nov 14 olle 2833           mp.setPermissions(g, null);
2933 14 Nov 14 olle 2834         }
2933 14 Nov 14 olle 2835         else
2933 14 Nov 14 olle 2836         {
2933 14 Nov 14 olle 2837           mp.addPermissions(g, Collections.singleton(p));
2933 14 Nov 14 olle 2838         }
2933 14 Nov 14 olle 2839       }
2933 14 Nov 14 olle 2840       for (Map.Entry<Project, Permission> entry : projectPermissions.entrySet())
2933 14 Nov 14 olle 2841       {
2933 14 Nov 14 olle 2842         Project pr = entry.getKey();
2933 14 Nov 14 olle 2843         Permission p = entry.getValue();
2933 14 Nov 14 olle 2844         if (p == null)
2933 14 Nov 14 olle 2845         {
2933 14 Nov 14 olle 2846           mp.setPermissions(pr, null);
2933 14 Nov 14 olle 2847         }
2933 14 Nov 14 olle 2848         else
2933 14 Nov 14 olle 2849         {
2933 14 Nov 14 olle 2850           mp.addPermissions(pr, Collections.singleton(p));
2933 14 Nov 14 olle 2851         }
2933 14 Nov 14 olle 2852       }
2933 14 Nov 14 olle 2853       mp.updateKeys(item.getDbControl());
2933 14 Nov 14 olle 2854     }
2933 14 Nov 14 olle 2855   }
2933 14 Nov 14 olle 2856 }