Changeset 2562


Ignore:
Timestamp:
Aug 8, 2014, 8:01:17 AM (7 years ago)
Author:
Nicklas Nordborg
Message:

References #533: Add secondary analysis section to Reggie

Installing a SFT file server item 'ProjectArchive?'. This contains login information for connecting to the file server where the 'project archive' is located. The file server can then be used to create external file links to FASTQ and other data files and then link them to the corresponding bioassay items.

Location:
extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/dao/ReggieRole.java

    r2161 r2562  
    6565
    6666  /**
    67     The definition of the "SecondaryAnalysis" role. Maps to a BASE role item.
    68   */
    69   public static final ReggieRole<Role> SECONDARY_ANALYSIS = new ReggieRole<Role>("SecondaryAnalysis", Item.ROLE);
     67    The definition of the "SecondaryAnalysis" group. Maps to a BASE group item.
     68  */
     69  public static final ReggieRole<Group> SECONDARY_ANALYSIS = new ReggieRole<Group>("SecondaryAnalysis", Item.GROUP);
    7070
    7171  /**
  • extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/servlet/InstallServlet.java

    r2497 r2562  
    22
    33import java.io.IOException;
     4import java.net.URI;
    45import java.util.ArrayList;
    56import java.util.Arrays;
     
    2728import net.sf.basedb.core.DbControl;
    2829import net.sf.basedb.core.Extract;
     30import net.sf.basedb.core.FileServer;
    2931import net.sf.basedb.core.Group;
    3032import net.sf.basedb.core.Include;
     
    5860import net.sf.basedb.reggie.dao.BioplateEventtype;
    5961import net.sf.basedb.reggie.dao.BioplateType;
     62import net.sf.basedb.reggie.dao.Fileserver;
    6063import net.sf.basedb.reggie.dao.FlowCell;
    6164import net.sf.basedb.reggie.dao.Geometry;
     
    7578import net.sf.basedb.util.EqualsHelper;
    7679import net.sf.basedb.util.error.ThrowableUtil;
     80import net.sf.basedb.util.uri.ConnectionManager;
     81import net.sf.basedb.util.uri.ConnectionManagerFactory;
     82import net.sf.basedb.util.uri.ConnectionManagerUtil;
     83import net.sf.basedb.util.uri.ConnectionParameters;
     84import net.sf.basedb.util.uri.UriMetadata;
    7785
    7886/**
     
    118126        // Group checks
    119127        jsonChecks.add(checkReggieRole(dc, ReggieRole.PATIENT_CURATOR, createIfMissing));
     128        jsonChecks.add(checkReggieRole(dc, ReggieRole.SECONDARY_ANALYSIS, createIfMissing));
    120129
    121130        // Role checks
     
    125134        jsonChecks.add(checkReggieRole(dc, ReggieRole.LIBRARY_PREP, createIfMissing));
    126135        jsonChecks.add(checkReggieRole(dc, ReggieRole.LIBRARY_PLATE_DESIGNER, createIfMissing));
    127         jsonChecks.add(checkReggieRole(dc, ReggieRole.SECONDARY_ANALYSIS, createIfMissing));
    128136
    129137        int projectId = dc.getSessionControl().getActiveProjectId();
     
    147155            patientCuratorUse.set(activeProject, null);
    148156            patientCuratorWrite.set(activeProject, null);
     157          }
     158        }
     159       
     160        Group secondaryAnalysis = ReggieRole.SECONDARY_ANALYSIS.get(dc);
     161        PermissionOptions secondaryAnalysisUse = null;
     162        if (secondaryAnalysis != null)
     163        {
     164          secondaryAnalysisUse = new PermissionOptions();
     165          secondaryAnalysisUse.set(secondaryAnalysis, Permission.USE);
     166          if (activeProject != null)
     167          {
     168            secondaryAnalysisUse.set(activeProject, Permission.READ);
    149169          }
    150170        }
     
    528548        ));
    529549       
     550        jsonChecks.add(checkFileServer(dc, Fileserver.PROJECT_ARCHIVE, secondaryAnalysisUse, createIfMissing));
     551       
    530552        // Plugin definitions and configurations
    531553        jsonChecks.add(checkPlugin(dc, CaliperSampleNameExporter.class, effectivePermissionsUse, createIfMissing));
     
    17091731  }
    17101732 
     1733 
     1734  /**
     1735    Create a file server with the given options. The file server is created in
     1736    a separate transaction.
     1737    @since 2.16
     1738  */
     1739  public FileServer createFileServer(SessionControl sc, Fileserver def, PermissionOptions permissions)
     1740  {
     1741    FileServer fs = null;
     1742    DbControl dc = sc.newDbControl();
     1743    try
     1744    {
     1745      fs = FileServer.getNew(dc);
     1746      fs.setName(def.getName());
     1747      fs.setConnectionManagerFactoryId(def.getConnectionManagerId());
     1748      fs.setDescription(def.getDescription());
     1749      if (permissions != null) permissions.applyPermissions(fs);
     1750     
     1751      dc.saveItem(fs);
     1752      dc.commit();
     1753    }
     1754    finally
     1755    {
     1756      if (dc != null) dc.close();
     1757    }
     1758    return fs;
     1759  }
     1760
     1761 
     1762  /**
     1763    Check for an existing file server with the given options.
     1764    A JSONObject is returned with the result. The following
     1765    keys are used:
     1766    <ul>
     1767    <li>itemType: FILESERVER
     1768    <li>name: The name of the fileserver
     1769    <li>id: The id of the fileserver if it exists
     1770    <li>status: ok, error, or missing
     1771    <li>message: A descriptive message in case of an error
     1772    </ul>
     1773    @since 2.16
     1774  */
     1775  @SuppressWarnings("unchecked")
     1776  public JSONObject checkFileServer(DbControl dc, Fileserver fileServer,
     1777    PermissionOptions permissions, boolean createIfMissing)
     1778  {
     1779 
     1780    JSONObject json = new JSONObject();
     1781    JSONArray jsonMessages = new JSONArray();
     1782    json.put("itemType", Item.FILESERVER.name());
     1783    json.put("name", fileServer.getName());
     1784   
     1785    FileServer fs = null;
     1786    List<FileServer> result = fileServer.list(dc);
     1787    if (result.size() == 0)
     1788    {
     1789      if (createIfMissing)
     1790      {
     1791        fs = createFileServer(dc.getSessionControl(), fileServer, permissions);
     1792        fs = FileServer.getById(dc, fs.getId());
     1793        json.put("id", fs.getId());
     1794        // Not ok yet, need manual configuration which is checked below
     1795      }
     1796      else
     1797      {
     1798        json.put("status", "missing");
     1799        jsonMessages.add("Not found");
     1800      }
     1801    }
     1802    else if (result.size() > 1)
     1803    {
     1804      json.put("status", "error");
     1805      jsonMessages.add("Found > 1 file server");
     1806    }
     1807    else
     1808    {
     1809      fs = result.get(0);
     1810    }
     1811   
     1812    if (fs != null)
     1813    {
     1814      json.put("id", fs.getId());
     1815      json.put("status", "ok"); // For now -- more checks below
     1816     
     1817      if (permissions != null && !permissions.checkPermissions(fs))
     1818      {
     1819        if (createIfMissing)
     1820        {
     1821          permissions.applyPermissions(fs);
     1822          if (jsonMessages.size() == 0) jsonMessages.add("Fixed");
     1823        }
     1824        else
     1825        {
     1826          json.put("status", "incomplete");
     1827          jsonMessages.add(permissions.getMessage());
     1828        }
     1829      }
     1830     
     1831      if (!fileServer.getConnectionManagerId().equals(fs.getConnectionManagerFactoryId()))
     1832      {
     1833        if (createIfMissing)
     1834        {
     1835          fs.setConnectionManagerFactoryId(fileServer.getConnectionManagerId());
     1836        }
     1837        else
     1838        {
     1839          json.put("status", "incomplete");
     1840          jsonMessages.add("Should use SFTP connection manager");
     1841        }
     1842      }
     1843     
     1844      if (fs.getHost() == null)
     1845      {
     1846        json.put("status", "error");
     1847        jsonMessages.add("No host name configured");
     1848      }
     1849     
     1850      if (fs.getUsername() == null)
     1851      {
     1852        json.put("status", "error");
     1853        jsonMessages.add("No user configured");
     1854      }
     1855     
     1856      if (!fs.hasPassword())
     1857      {
     1858        json.put("status", "error");
     1859        jsonMessages.add("No password configured");
     1860      }
     1861
     1862      if (fs.getRootPath() == null)
     1863      {
     1864        json.put("status", "error");
     1865        jsonMessages.add("No root path configured");
     1866      }
     1867     
     1868      if (fs.getSshFingerprint() == null)
     1869      {
     1870        json.put("status", "error");
     1871        jsonMessages.add("No SSH fingerprint configured");
     1872      }
     1873     
     1874      if (json.get("status").equals("ok"))
     1875      {
     1876        ConnectionManagerFactory cmf = ConnectionManagerUtil.getFactory(fs.getConnectionManagerFactoryId());
     1877        if (cmf == null)
     1878        {
     1879          json.put("status", "warning");
     1880          jsonMessages.add("SFTP connection manager is not installed");
     1881        }
     1882        else
     1883        {
     1884          ConnectionParameters cp = new ConnectionParameters();
     1885          cp.setHost(fs.getHost());
     1886          cp.setUsername(fs.getUsername());
     1887          cp.setPassword(fs.getPassword());
     1888          cp.setRootPath(fs.getRootPath());
     1889          cp.setSshFingerprint(fs.getSshFingerprint());
     1890          URI uri = cp.changeHost(URI.create("sftp://" + fs.getHost() + "/"));
     1891          ConnectionManager cm = cmf.createConnectionManager(uri, cp);
     1892          try
     1893          {
     1894            UriMetadata meta = cm.getMetadata();
     1895          }
     1896          catch (IOException ex)
     1897          {
     1898            json.put("status", "warning");
     1899            jsonMessages.add(uri + ": " + ex.getMessage());
     1900            ex.printStackTrace();
     1901          }
     1902        }
     1903      }
     1904    }
     1905    if (jsonMessages.size() == 0) jsonMessages.add("Ok");
     1906    json.put("messages", jsonMessages);
     1907    return json;
     1908 
     1909  }
     1910
    17111911 
    17121912  /**
Note: See TracChangeset for help on using the changeset viewer.