Changeset 5650


Ignore:
Timestamp:
Jun 1, 2011, 2:56:51 PM (10 years ago)
Author:
Nicklas Nordborg
Message:

References #1597: Subtypes of items

Allow selection of more default items for a project. Previously only a single item for each subtype could be selected (eg. a single sampling protocol). Now that it is possible to create more subtypes there is a need to be able to select multiple default items. Since the subtype can be changed at any time, there is also no need to restrict the selection to a single item for each subtype.

The project edit dialog has changed so that it is now possible to select multiple platforms, array designs, protocols, software and hardware. The underlying storage has been changed from AnyToAny links to a list of ItemParameterValue (eg. the same mechanism that is used for job parameters).

Some use cases related to the default items have only been fixed to the level that the code compiles. There are more things to fix before everything can be said to work:

  • Edit dialogs for subtypable items: The list of default items (eg. protocol) should be dynamically updated when the subtype selection changes. We need to allow multiple default items in the lists.
  • Overview validators: subtypes are not validated
  • Automatically set default properties for new items: I think this is implemented, but needs to be tested.
Location:
trunk
Files:
32 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/clients/web/net/sf/basedb/clients/web/taglib/PropertyValue.java

    r5391 r5650  
    269269    {
    270270      Object item = getItem();
    271       Object value = null
     271      Object value = item
    272272      DbControl dc = getDbcontrol();
    273273      String ID = dc.getSessionControl().getId();     
    274274     
    275       if (item != null)
     275      if (item != null && getProperty() != null)
    276276      {
    277277        PropertyPath propertyPath = getPropertyPath(item, getProperty());
  • trunk/src/core/net/sf/basedb/core/ArrayBatch.java

    r5630 r5650  
    201201    {
    202202      HardwareData robot =
    203         (HardwareData)activeProject.getDefaultData(getDbControl(),
    204         Project.Default.PRINTROBOT_HARDWARE);
     203        (HardwareData)activeProject.findDefaultData(getDbControl(), Hardware.PRINT_ROBOT, false);
    205204      if (robot != null) getData().setPrintRobot(robot);
    206205      robotHasBeenSet = true;
     
    209208    {
    210209      ProtocolData protocol =
    211         (ProtocolData)activeProject.getDefaultData(getDbControl(),
    212         Project.Default.PRINTING_PROTOCOL);
     210        (ProtocolData)activeProject.findDefaultData(getDbControl(), Protocol.PRINTING, false);
    213211      if (protocol != null) getData().setProtocol(protocol);
    214212      protocolHasBeenSet = true;
  • trunk/src/core/net/sf/basedb/core/BioMaterialEvent.java

    r5642 r5650  
    329329    if (getEventType() == Type.OTHER || !hasPermission(Permission.WRITE)) return;
    330330   
    331     Project.Default defaultProtocolType = null;
    332     Project.Default defaultHardwareType = null;
    333 
     331 
     332    DbControl dc = getDbControl();
     333    Subtypable parent = null;
     334    ItemSubtype protocolSubtype = null;
     335    ItemSubtype hardwareSubtype = null;
     336    String defaultProtocolId = null;
    334337    if (getEventType() == Type.BIOASSAY)
    335338    {
    336       defaultProtocolType = Project.Default.HYBRIDIZATION_PROTOCOL;
    337       defaultHardwareType = Project.Default.HYBRIDIZATION_HARDWARE;
     339      parent = getPhysicalBioAssay();
    338340    }
    339341    else
    340342    {
    341       MeasuredBioMaterial parent = getBioMaterial();
     343      MeasuredBioMaterial bioMaterial = getBioMaterial();
     344      parent = bioMaterial;
    342345      Item parentType = parent.getType();
    343       if (parent.isPooled())
    344       {
    345         defaultProtocolType = Project.Default.POOLING_PROTOCOL;
     346      if (bioMaterial.isPooled())
     347      {
     348        defaultProtocolId = Protocol.POOLING;
    346349      }
    347350      else if (parentType == Item.SAMPLE)
    348351      {
    349         defaultProtocolType = Project.Default.SAMPLING_PROTOCOL;
     352        defaultProtocolId = Protocol.SAMPLING;
    350353      }
    351354      else if (parentType == Item.EXTRACT)
    352355      {
    353         defaultProtocolType = Project.Default.EXTRACTING_PROTOCOL;
    354       }
    355     }
     356        defaultProtocolId = Protocol.EXTRACTION;
     357      }
     358    }
     359    protocolSubtype = ItemSubtype.getRelatedSubtype(dc, parent, Item.PROTOCOL, SystemItems.getId(defaultProtocolId));
     360    hardwareSubtype = ItemSubtype.getRelatedSubtype(dc, parent, Item.HARDWARE, 0);
    356361   
    357     if (!protocolHasBeenSet && defaultProtocolType != null)
     362    if (!protocolHasBeenSet && protocolSubtype != null)
    358363    {
    359364      ProtocolData protocol =
    360         (ProtocolData)activeProject.getDefaultData(getDbControl(),
    361         defaultProtocolType);
     365        (ProtocolData)activeProject.findDefaultData(Item.PROTOCOL, protocolSubtype.getData(), false);
    362366      if (protocol != null) getData().setProtocol(protocol);
    363367      protocolHasBeenSet = true;
    364368    }
    365     if (!hardwareHasBeenSet && defaultHardwareType != null)
     369    if (!hardwareHasBeenSet && hardwareSubtype != null)
    366370    {
    367371      HardwareData hardware =
    368         (HardwareData)activeProject.getDefaultData(getDbControl(),
    369         defaultHardwareType);
     372        (HardwareData)activeProject.findDefaultData(Item.HARDWARE, hardwareSubtype.getData(), false);
    370373      if (hardware != null) getData().setHardware(hardware);
    371374      hardwareHasBeenSet = true;
  • trunk/src/core/net/sf/basedb/core/Project.java

    r5642 r5650  
    2525
    2626import net.sf.basedb.core.Transactional.Action;
    27 import net.sf.basedb.core.data.AnyToAnyData;
    2827import net.sf.basedb.core.data.BasicData;
     28import net.sf.basedb.core.data.ItemParameterValueData;
     29import net.sf.basedb.core.data.ItemSubtypeData;
    2930import net.sf.basedb.core.data.ProjectData;
    3031import net.sf.basedb.core.data.ShareableData;
     32import net.sf.basedb.core.data.SubtypableData;
    3133import net.sf.basedb.core.query.Restriction;
    3234import net.sf.basedb.core.query.Restrictions;
     
    4143import java.util.Date;
    4244import java.util.EnumSet;
    43 import java.util.HashMap;
    4445import java.util.HashSet;
     46import java.util.Iterator;
    4547import java.util.List;
    46 import java.util.Map;
    4748import java.util.Set;
    4849import java.util.Collections;
     
    153154  }
    154155
    155   /**
    156     Get the project default entry that is used to attach item of a
    157     given <code>itemType</code> to <code>attachesToType</code>. Eg.
    158     The {@link Default#SAMPLING_PROTOCOL} is attaches a {@link Item#PROTOCOL}
    159     to a {@link Item#SAMPLE}.
    160     @param itemType The item type that is attached... (eg PROTOCOL)
    161     @param attachesToType ... to this item type (eg. SAMPLE)
    162     @return A default entry or null
    163     @since 2.10
    164   */
    165   public static Default getDefaultType(Item itemType, Item attachesToType)
    166   {
    167     for (Default def : Default.values())
    168     {
    169       if (def.getItemType() == itemType && def.getAttachesToItemType() == attachesToType)
    170       {
    171         return def;
    172       }
    173     }
    174     return null;
    175   }
    176  
    177   private Map<Default, BasicData> defaults;
    178  
    179156  Project(ProjectData projectData)
    180157  {
     
    652629
    653630  /**
    654       Sets item as default for project.
    655      
    656       @param dc The <code>DbControl</code> which will be used for
    657       permission checking and database access.
    658       @param defaultItem The {@link net.sf.basedb.core.BasicItem} to set as default.
    659         Use null when to remove a default value.
    660       @param defaultType The {@link Default} to be set.
    661   */
    662   public void setDefaultItem(DbControl dc, BasicItem defaultItem, Default defaultType)
    663   {
    664     String lnkName = defaultType.getName();
    665     BasicData defaultData = null;
    666     if (defaultItem == null)
    667     {
    668       AnyToAny.unlinkFrom(dc, this, lnkName);
    669     }
    670     else
    671     {
    672       AnyToAny defaultLink = AnyToAny.getNewOrExisting(dc, this, lnkName, defaultItem, false);
    673       if (defaultLink.getId() == 0) dc.saveItem(defaultLink);
    674       defaultData = defaultItem.getData();
    675     }
    676     if (defaults == null) defaults = new HashMap<Default, BasicData>();
    677     defaults.put(defaultType, defaultData);
    678   }
    679  
    680   /**
    681       Gets the project's default item of a certain itemType defined in <code>defaultType</code>.
    682       If no item of the specified type is found this will return Null
    683      
    684       @param dc The <code>DbControl</code> which will be used for
    685       permission checking and database access.
    686       @param defaultType The project's <code>Default</code> to get.
    687       @return A BasicItem or null if no item was found.
    688   */
    689   public BasicItem getDefaultItem(DbControl dc, Default defaultType)
    690   {
    691     if (defaultType == null) throw new InvalidUseOfNullException("defaultType");
    692     BasicData defaultData = getDefaultData(dc, defaultType);
     631    Add an item as a default project item. If the item is already
     632    a default item of the project, nothing is done.
     633   
     634    @param defaultItem The item to make default
     635    @since 3.0
     636   */
     637  public void addDefaultItem(BasicItem defaultItem)
     638  {
     639    checkPermission(Permission.WRITE);
     640    if (defaultItem == null) throw new InvalidUseOfNullException("defaultItem");
     641   
     642    ItemParameterValueData defaultItems = getData().getDefaultItems();
     643    if (defaultItems == null)
     644    {
     645      // Create new placeholder object
     646      defaultItems = new ItemParameterValueData();
     647      getData().setDefaultItems(defaultItems);
     648    }
     649    else if (defaultItems.getValues().indexOf(defaultItem.getData()) >= 0)
     650    {
     651      // Check that it is not already added
     652      return;
     653    }
     654    defaultItems.getValues().add(defaultItem.getData());
     655  }
     656 
     657  /**
     658    Remove an item from the list of default items for this project.
     659    If the given item is not a default item nothing is done.
     660 
     661    @param defaultItem The item to remove
     662    @since 3.0
     663  */
     664  public void removeDefaultItem(BasicItem defaultItem)
     665  {
     666    checkPermission(Permission.WRITE);
     667    if (defaultItem == null) return;
     668   
     669    ItemParameterValueData defaultItems = getData().getDefaultItems();
     670    if (defaultItems == null) return;
     671   
     672    defaultItems.getValues().remove(defaultItem.getData());
     673  }
     674 
     675  /**
     676    Find a default item of the given item type. If the project contains
     677    more than one default item, the first one found is selected.
     678    @param dc A DbControl for database access
     679    @param itemType The type of item to find
     680    @return The item that was found, or null
     681    @since 3.0
     682  */
     683  public BasicItem findDefaultItem(DbControl dc, Item itemType)
     684  {
     685    if (itemType == null) throw new InvalidUseOfNullException("itemType");
     686    BasicData defaultData = findDefaultData(itemType, null, false);
    693687    return dc.getItem(BasicItem.class, defaultData);
    694688  }
    695689 
    696690  /**
    697       Gets the project's default item as a data object.
    698       If no item of the specified type is found this will return Null
    699       @since 2.9
    700   */
    701   BasicData getDefaultData(DbControl dc, Default defaultType)
    702   {
    703     BasicData defaultData = null;   
    704     if (defaults != null && defaults.containsKey(defaultType))
    705     {
    706       defaultData = defaults.get(defaultType);
    707     }
    708     else
    709     {
    710       org.hibernate.Session session = dc.getHibernateSession();
    711       AnyToAnyData any = AnyToAny.getDataByName(session, getId(), getType(), defaultType.getName());
    712       if (any != null)
    713       {
    714         defaultData = HibernateUtil.loadData(session,
    715           defaultType.getItemType().getDataClass(), any.getToId());
    716       }
    717       if (defaults == null) defaults = new HashMap<Default, BasicData>();
    718       defaults.put(defaultType, defaultData);
    719     }
    720     return defaultData;
    721   }
     691    Find a default (subtypable) item that has the given subtype. If the
     692    strict parameter is true, an exact match must be found, otherwise
     693    the search is repeated to find an item without a subtype. The search
     694    will never match an item that has a different subtype.
     695   
     696    @param dc A DbControl for database access
     697    @param subtype The requested subtype
     698    @param strict TRUE to strictly match the subtype, FALSE to also
     699      search for items without subtype
     700    @return The item that was found, or null
     701    @since 3.0
     702  */
     703  public BasicItem findDefaultItem(DbControl dc, ItemSubtype subtype, boolean strict)
     704  {
     705    if (subtype == null) throw new InvalidUseOfNullException("subtype");
     706    BasicData defaultData = findDefaultData(subtype.getMainItemType(), subtype.getData(), strict);
     707    return dc.getItem(BasicItem.class, defaultData);
     708  }
     709 
     710  /**
     711    Get a list with all default items added to this project.
     712    @param dc A DbControl for database access
     713    @return A list with the default items
     714    @since 3.0
     715  */
     716  public List<BasicItem> getDefaultItems(DbControl dc)
     717  {
     718    return getDefaultItems(dc, null);
     719  }
     720 
     721  /**
     722    Get a list with all default items of a given item type
     723    added to this project.
     724   
     725    @param dc A DbControl for database access
     726    @param itemType The type of the default item or null to return all default items
     727    @return A list with the default items
     728    @since 3.0
     729  */
     730  public List<BasicItem> getDefaultItems(DbControl dc, Item itemType)
     731  {
     732    ItemParameterValueData defaultItems = getData().getDefaultItems();
     733    if (defaultItems == null) return Collections.emptyList();
     734   
     735    List<BasicItem> items = new ArrayList<BasicItem>();
     736    Iterator<BasicData> it = defaultItems.getValues().iterator();
     737    Class dataClass = itemType == null ? null : itemType.getDataClass();
     738    while (it.hasNext())
     739    {
     740      BasicData data = it.next();
     741      if (dataClass == null || dataClass.isInstance(data))
     742      {
     743        try
     744        {
     745          items.add(dc.getItem(BasicItem.class, data));
     746        }
     747        catch (PermissionDeniedException ex)
     748        {}
     749        catch (ItemNotFoundException ex)
     750        {
     751          it.remove();
     752        }
     753      }
     754    }
     755    return items;
     756  }
     757
     758 
     759  /**
     760    Check if the given item is a default item in this project.
     761    @param item The item to check
     762    @return TRUE if the item is a default item, FALSE if not
     763    @since 3.0
     764  */
     765  public boolean isDefaultItem(BasicItem item)
     766  {
     767    if (item == null) return false;
     768    ItemParameterValueData defaultItems = getData().getDefaultItems();
     769    if (defaultItems == null) return false;
     770    return defaultItems.getValues().indexOf(item.getData()) >= 0;
     771  }
     772
     773  BasicData findDefaultData(DbControl dc, String subtypeId, boolean strict)
     774  {
     775    int id = SystemItems.getId(subtypeId);
     776    ItemSubtypeData subtype = HibernateUtil.loadData(dc.getHibernateSession(), ItemSubtypeData.class, id);
     777    return findDefaultData(Item.fromValue(subtype.getItemType()), subtype, strict);
     778  }
     779 
     780  /**
     781    Find a default item in this project of the given item type (required)
     782    and subtype (optional). If a subtype is given, this method first try to
     783    match exactly. If no item is found, and strict is false, a second attempt is made
     784    to match against items without subtype. If more than one
     785    item matches the critera, the first one found is returned.
     786   
     787      @param itemType The main item type of the item we are looking for
     788      @param subtype The subtype of the item we are looking for (optional)
     789      @param strict
     790      @since 3.0
     791  */
     792  BasicData findDefaultData(Item itemType, ItemSubtypeData subtype, boolean strict)
     793  {
     794    ItemParameterValueData defaultItems = getData().getDefaultItems();
     795    if (defaultItems == null) return null;
     796   
     797    BasicData bestMatch = null;
     798
     799    Class dataClass = itemType.getDataClass();
     800    for (BasicData data : defaultItems.getValues())
     801    {
     802      if (dataClass.isInstance(data))
     803      {
     804        // If no subtype is given we have found a match
     805        if (subtype == null)
     806        {
     807          bestMatch = data;
     808          break;
     809        }
     810       
     811        // Check the subtype
     812        if (data instanceof SubtypableData)
     813        {
     814          ItemSubtypeData otherSubtype = ((SubtypableData)data).getItemSubtype();
     815          if (subtype.equals(otherSubtype))
     816          {
     817            // Found an exact match
     818            bestMatch = data;
     819            break;
     820          }
     821         
     822          // This is a possible (non-strict) match -- do not update if already set
     823          if (!strict && otherSubtype == null && bestMatch == null)
     824          {
     825            bestMatch = data;
     826          }
     827        }
     828       
     829      }
     830    }
     831    return bestMatch;
     832  }
     833
    722834 
    723835  /**
     
    831943  }
    832944 
     945  /*
    833946  public enum Default
    834947  {   
     
    883996      return type;
    884997    }
    885    
     998    */
    886999    /**
    8871000      The item type an entry of this default type is usually attached to.
     
    8911004      @since 2.10
    8921005    */
     1006  /*
    8931007    public Item getAttachesToItemType()
    8941008    {
     
    8961010    }
    8971011  }
     1012  */
     1013 
    8981014}
    8991015
  • trunk/src/core/net/sf/basedb/core/RawBioAssay.java

    r5642 r5650  
    417417    {
    418418      SoftwareData software =
    419         (SoftwareData)activeProject.getDefaultData(getDbControl(),
    420         Project.Default.SOFTWARE);
     419        (SoftwareData)activeProject.findDefaultData(getDbControl(), Software.FEATURE_EXTRACTION, false);
    421420      if (software != null) getData().setSoftware(software);
    422421      softwareHasBeenSet = true;
     
    425424    {
    426425      ArrayDesignData design =
    427         (ArrayDesignData)activeProject.getDefaultData(getDbControl(),
    428         Project.Default.ARRAYDESIGN);
     426        (ArrayDesignData)activeProject.findDefaultData(Item.ARRAYDESIGN, null, false);
    429427      if (design != null) getData().setArrayDesign(design);
    430428      arrayDesignHasBeenSet = true;
     
    433431    {
    434432      ProtocolData protocol =
    435         (ProtocolData)activeProject.getDefaultData(getDbControl(),
    436         Project.Default.FEATURE_EXTRACTION_PROTOCOL);
     433        (ProtocolData)activeProject.findDefaultData(getDbControl(), Protocol.FEATURE_EXTRACTION, false);
    437434      if (protocol != null) getData().setProtocol(protocol);
    438435      protocolHasBeenSet = true;
  • trunk/src/core/net/sf/basedb/core/Scan.java

    r5642 r5650  
    199199    {
    200200      HardwareData scanner =
    201         (HardwareData)activeProject.getDefaultData(getDbControl(),
    202         Project.Default.SCANNER_HARDWARE);
     201        (HardwareData)activeProject.findDefaultData(getDbControl(), Hardware.SCANNER, false);
    203202      if (scanner != null) getData().setScanner(scanner);
    204203      scannerHasBeenSet = true;
     
    207206    {
    208207      ProtocolData protocol =
    209         (ProtocolData)activeProject.getDefaultData(getDbControl(),
    210         Project.Default.SCANNING_PROTOCOL);
     208        (ProtocolData)activeProject.findDefaultData(getDbControl(), Protocol.SCANNING, false);
    211209      if (protocol != null) getData().setProtocol(protocol);
    212210      protocolHasBeenSet = true;
  • trunk/src/core/net/sf/basedb/core/data/ProjectData.java

    r5368 r5650  
    203203    this.projectDefaults = projectDefaults;
    204204  }
     205 
     206  private ItemParameterValueData defaultItems;
     207  /**
     208    The default items to use in this project
     209    @hibernate.many-to-one column="`defaultitems_id`" not-null="false" cascade="all" unique="true"
     210  */
     211  public ItemParameterValueData getDefaultItems()
     212  {
     213    return defaultItems;
     214  }
     215  public void setDefaultItems(ItemParameterValueData defaultItems)
     216  {
     217    this.defaultItems = defaultItems;
     218  }
     219
     220 
    205221}
  • trunk/src/core/net/sf/basedb/util/overview/OverviewUtil.java

    r5642 r5650  
    3333import net.sf.basedb.core.Annotatable;
    3434import net.sf.basedb.core.AnnotationType;
    35 import net.sf.basedb.core.BaseException;
    3635import net.sf.basedb.core.BasicItem;
    3736import net.sf.basedb.core.DbControl;
     
    256255 
    257256  /**
    258     Get the project default item for a given project and type of item.
    259     This method does the same thing as {@link Project#getDefaultItem(DbControl, net.sf.basedb.core.Project.Default)}
    260     but returns null instead of throwing an exception.
    261     @param dc The DbControl to use for database access
    262     @param project The current project, or null if not project is current
    263     @param defaultType The default type of item to get
    264     @return The default item, or null if no default item exists or if
    265       there was an error loading it
    266   */
    267   public static BasicItem getProjectDefaultItem(DbControl dc, Project project, Project.Default defaultType)
    268   {
    269     BasicItem defaultItem = null;
    270     if (project != null)
    271     {
    272       try
    273       {
    274         defaultItem = project.getDefaultItem(dc, defaultType);
    275       }
    276       catch (BaseException ex)
    277       {}
    278     }
    279     return defaultItem;
    280   }
    281  
    282   /**
    283257    Find the first parent node that has a reference to the given item.
    284258    @param node The node to start looking at
  • trunk/src/core/net/sf/basedb/util/overview/validator/ArrayDesignValidator.java

    r4766 r5650  
    3636import net.sf.basedb.util.overview.Fix;
    3737import net.sf.basedb.util.overview.OverviewContext;
    38 import net.sf.basedb.util.overview.OverviewUtil;
    3938import net.sf.basedb.util.overview.Validator;
    4039import net.sf.basedb.util.overview.filter.ItemTypeFilter;
     
    7473    Project project = context.getProject();
    7574    ArrayDesign design = (ArrayDesign)node.getItem();
    76     BasicItem defaultDesign = OverviewUtil.getProjectDefaultItem(design.getDbControl(), project, Project.Default.ARRAYDESIGN);
    77     if (defaultDesign != null && !defaultDesign.equals(design))
     75    if (!project.isDefaultItem(design))
    7876    {
    7977      context.createFailure(Validator.NONDEFAULT_ARRAYDESIGN, node, null,
  • trunk/src/core/net/sf/basedb/util/overview/validator/HardwareValidator.java

    r5630 r5650  
    2525import net.sf.basedb.core.DbControl;
    2626import net.sf.basedb.core.Hardware;
    27 import net.sf.basedb.core.Item;
    28 import net.sf.basedb.core.ItemSubtype;
    2927import net.sf.basedb.core.PermissionDeniedException;
    3028import net.sf.basedb.core.Project;
    3129import net.sf.basedb.util.overview.Fix;
    3230import net.sf.basedb.util.overview.OverviewContext;
    33 import net.sf.basedb.util.overview.OverviewUtil;
    3431import net.sf.basedb.util.overview.Validator;
    3532import net.sf.basedb.util.overview.Node;
     
    7370    Hardware hardware = (Hardware)node.getItem();
    7471    BasicItem parentItem = parentNode.getItem();
    75     Project.Default defaultType = Project.getDefaultType(Item.HARDWARE, parentNode.getItemType());
     72    //Project.Default defaultType = Project.getDefaultType(Item.HARDWARE, parentNode.getItemType());
    7673    String hardwareTypeName = "hardware";
    77     String parentTypeName = "item";
     74    String parentTypeName = parentNode.getItemType().toString().toLowerCase();
     75    /*
    7876    if (defaultType != null)
    7977    {
     
    8179      parentTypeName = defaultType.getAttachesToItemType().toString().toLowerCase();
    8280    }
     81    */
    8382   
    8483    // Check if using project default hardware
    8584    Project project = context.getProject();
    86     BasicItem defaultHardware = OverviewUtil.getProjectDefaultItem(dc, project, defaultType);
    87     if (defaultHardware != null && !defaultHardware.equals(hardware))
     85//    BasicItem defaultHardware = OverviewUtil.getProjectDefaultItem(dc, project, defaultType);
     86    if (!project.isDefaultItem(hardware))
    8887    {
    8988      context.createFailure(Validator.NONDEFAULT_HARDWARE, parentNode, null,
     
    9392    }
    9493
    95     // Check hardware type
     94    // Check hardware subtype
    9695    try
    9796    {
     97      /*
    9898      ItemSubtype ht = hardware.getItemSubtype();
    9999      String requiredId = defaultType == null ? null : defaultType.getType();
     
    105105        );
    106106      }
     107      */
    107108    }
    108109    catch (PermissionDeniedException ex)
     
    116117  protected Fix getMissingItemFix(Node parentNode)
    117118  {
    118     Project.Default defaultType = Project.getDefaultType(Item.HARDWARE, parentNode.getItemType());
     119    //Project.Default defaultType = Project.getDefaultType(Item.HARDWARE, parentNode.getItemType());
    119120    String hardwareTypeName = "hardware";
    120     String parentTypeName = "item";
     121    String parentTypeName = parentNode.getItemType().toString().toLowerCase();
     122    /*
    121123    if (defaultType != null)
    122124    {
     
    124126      parentTypeName = defaultType.getAttachesToItemType().toString().toLowerCase();
    125127    }
     128    */
    126129    BasicItem parentItem = parentNode.getItem();
    127130    return new Fix("Add " + hardwareTypeName + " to " + parentTypeName, parentItem);
  • trunk/src/core/net/sf/basedb/util/overview/validator/PlatformValidator.java

    r5218 r5650  
    3232import net.sf.basedb.util.overview.Fix;
    3333import net.sf.basedb.util.overview.OverviewContext;
    34 import net.sf.basedb.util.overview.OverviewUtil;
    3534import net.sf.basedb.util.overview.Validator;
    3635import net.sf.basedb.util.overview.Node;
     
    6968    super.postValidate(dc, context, node, parentNode);
    7069    Project project = context.getProject();
    71     BasicItem defaultPlatform = OverviewUtil.getProjectDefaultItem(dc, project, Project.Default.PLATFORM);
    72     BasicItem defaultVariant = OverviewUtil.getProjectDefaultItem(dc, project, Project.Default.PLATFORM_VARIANT);
    7370    Platform platform = (Platform)node.getItem();
    7471    PlatformVariant variant = null;
     
    9289    }
    9390   
    94     if ((defaultPlatform != null && !defaultPlatform.equals(platform)) ||
    95       (defaultVariant != null && !defaultVariant.equals(variant) && !failedVariant))
     91    if (!project.isDefaultItem(platform) ||
     92      (variant != null && !project.isDefaultItem(variant) && !failedVariant))
    9693    {
    9794      context.createFailure(Validator.NONDEFAULT_PLATFORM, parentNode, null,
  • trunk/src/core/net/sf/basedb/util/overview/validator/ProtocolValidator.java

    r5630 r5650  
    7373    Protocol protocol = (Protocol)node.getItem();
    7474    BasicItem parentItem = parentNode.getItem();
    75     Project.Default defaultType = Project.getDefaultType(Item.PROTOCOL, parentNode.getItemType());
     75//    Project.Default defaultType = Project.getDefaultType(Item.PROTOCOL, parentNode.getItemType());
    7676    String protocolTypeName = "protocol";
    77     String parentTypeName = "item";
     77    String parentTypeName = parentNode.getItemType().toString().toLowerCase();
     78    /*
    7879    if (defaultType != null)
    7980    {
     
    8182      parentTypeName = defaultType.getAttachesToItemType().toString().toLowerCase();
    8283    }
     84    */
    8385   
    8486    // Check if using project default protocol
    8587    Project project = context.getProject();
    86     BasicItem defaultProtocol = OverviewUtil.getProjectDefaultItem(dc, project, defaultType);
    87     if (defaultProtocol != null && !defaultProtocol.equals(protocol))
     88//    BasicItem defaultProtocol = OverviewUtil.getProjectDefaultItem(dc, project, defaultType);
     89    if (!project.isDefaultItem(protocol))
    8890    {
    8991      context.createFailure(Validator.NONDEFAULT_PROTOCOL, parentNode, null,
     
    9395    }
    9496
    95     // Check protocol type
     97    // Check protocol subtype
    9698    try
    9799    {
     100      /*
    98101      ItemSubtype pt = protocol.getItemSubtype();
    99102      String requiredId = defaultType == null ? null : defaultType.getType();
     
    105108        );
    106109      }
     110      */
    107111    }
    108112    catch (PermissionDeniedException ex)
     
    116120  protected Fix getMissingItemFix(Node parentNode)
    117121  {
    118     Project.Default defaultType = Project.getDefaultType(Item.PROTOCOL, parentNode.getItemType());
    119     String parentTypeName = "item";
     122//    Project.Default defaultType = Project.getDefaultType(Item.PROTOCOL, parentNode.getItemType());
     123    String parentTypeName = parentNode.getItemType().toString().toLowerCase();
     124    /*
    120125    if (defaultType != null)
    121126    {
    122127      parentTypeName = defaultType.getAttachesToItemType().toString().toLowerCase();
    123128    }
     129    */
    124130    BasicItem parentItem = parentNode.getItem();
    125131    return new Fix("Add protocol to " + parentTypeName, parentItem);
  • trunk/src/core/net/sf/basedb/util/overview/validator/SoftwareValidator.java

    r5630 r5650  
    7373    Software software = (Software)node.getItem();
    7474    BasicItem parentItem = parentNode.getItem();
    75     Project.Default defaultType = Project.getDefaultType(Item.SOFTWARE, parentNode.getItemType());
     75  //  Project.Default defaultType = Project.getDefaultType(Item.SOFTWARE, parentNode.getItemType());
    7676    String softwareTypeName = "software";
    77     String parentTypeName = "item";
     77    String parentTypeName = parentNode.getItemType().toString().toLowerCase();
     78    /*
    7879    if (defaultType != null)
    7980    {
     
    8182      parentTypeName = defaultType.getAttachesToItemType().toString().toLowerCase();
    8283    }
     84    */
    8385   
    8486    // Check if using project default software
    8587    Project project = context.getProject();
    86     BasicItem defaultSoftware = OverviewUtil.getProjectDefaultItem(dc, project, defaultType);
    87     if (defaultSoftware != null && !defaultSoftware.equals(software))
     88  //  BasicItem defaultSoftware = OverviewUtil.getProjectDefaultItem(dc, project, defaultType);
     89    if (!project.isDefaultItem(software))
    8890    {
    8991      context.createFailure(Validator.NONDEFAULT_SOFTWARE, parentNode, null,
     
    9395    }
    9496     
    95     // Check software type
     97    // Check software subtype
    9698    try
    9799    {
    98100      ItemSubtype st = software.getItemSubtype();
     101      /*
    99102      String requiredId = defaultType == null ? null : defaultType.getType();
    100103      if (requiredId != null && !requiredId.equals(st.getSystemId()))
     
    105108        );
    106109      }
     110      */
    107111    }
    108112    catch (PermissionDeniedException ex)
     
    117121  protected Fix getMissingItemFix(Node parentNode)
    118122  {
    119     Project.Default defaultType = Project.getDefaultType(Item.SOFTWARE, parentNode.getItemType());
     123//    Project.Default defaultType = Project.getDefaultType(Item.SOFTWARE, parentNode.getItemType());
    120124    String softwareTypeName = "software";
    121     String parentTypeName = "item";
     125    String parentTypeName = parentNode.getItemType().toString().toLowerCase();
     126    /*
    122127    if (defaultType != null)
    123128    {
     
    125130      parentTypeName = defaultType.getAttachesToItemType().toString().toLowerCase();
    126131    }
     132    */
    127133    BasicItem parentItem = parentNode.getItem();
    128134    return new Fix("Add " + softwareTypeName + " to " + parentTypeName, parentItem);
  • trunk/src/plugins/core/net/sf/basedb/plugins/batchimport/AbstractItemImporter.java

    r5648 r5650  
    12961296    if (sc.getActiveProjectId() == 0) return null;
    12971297    Project activeProject = Project.getById(dc, sc.getActiveProjectId());
    1298     return (Platform)activeProject.getDefaultItem(dc, Project.Default.PLATFORM);
     1298    return (Platform)activeProject.findDefaultItem(dc, Item.PLATFORM);
    12991299  }
    13001300 
     
    13091309    if (sc.getActiveProjectId() == 0) return null;
    13101310    Project activeProject = Project.getById(dc, sc.getActiveProjectId());
    1311     return (PlatformVariant)activeProject.getDefaultItem(dc, Project.Default.PLATFORM_VARIANT);
     1311    return (PlatformVariant)activeProject.findDefaultItem(dc, Item.PLATFORMVARIANT);
    13121312  }
    13131313 
  • trunk/src/test/TestProject.java

    r5642 r5650  
    7474    int samplingId = TestProtocol.test_create(
    7575        SystemItems.getId(Protocol.SAMPLING), "Sampling protocol", false);
     76    int protocolId = TestProtocol.test_create(0, "Generic", false);
    7677    int hybStationId = TestHardware.test_create(
    7778        SystemItems.getId(Hardware.HYBRIDIZATION_STATION), "Hyb station", false);
    78     test_defaultItem(id, Project.Default.SAMPLING_PROTOCOL, samplingId);
    79     test_defaultItem(id, Project.Default.HYBRIDIZATION_HARDWARE, hybStationId);
     79    test_defaultItem(id, Item.PROTOCOL, protocolId);
     80    test_defaultItem(id, Item.PROTOCOL, samplingId);
     81    test_defaultItem(id, Item.HARDWARE, hybStationId);
     82    test_find_default(id, Item.PROTOCOL, 0, protocolId);
     83    test_find_default(id, Item.PROTOCOL, SystemItems.getId(Protocol.SAMPLING), samplingId);
    8084
    8185    // Extra test: activate project, create shared item, and list all items
     
    101105  }
    102106
    103   static void test_defaultItem(int project_id, Project.Default defaultType, int item_id)
     107  static void test_defaultItem(int project_id, Item defaultType, int item_id)
    104108  {
    105109    if (project_id == 0 || item_id == 0) return;
     
    109113      dc = TestUtil.getDbControl();
    110114      Project p = Project.getById(dc, project_id);
    111       BasicItem defaultItem = defaultType.getItemType().getById(dc, item_id);
    112       p.setDefaultItem(dc, defaultItem, defaultType);
     115      BasicItem defaultItem = defaultType.getById(dc, item_id);
     116      p.addDefaultItem(defaultItem);
    113117      dc.commit();
    114118      write("--Set default item OK (" + defaultType + "; id=" + item_id + ")");
     
    126130  }
    127131
     132  static void test_find_default(int project_id, Item defaultType, int subtypeId, int expectedId)
     133  {
     134    if (project_id == 0 || expectedId == 0) return;
     135    DbControl dc = null;   
     136    try
     137    {     
     138      dc = TestUtil.getDbControl();
     139      Project p = Project.getById(dc, project_id);
     140     
     141      BasicItem found = null;
     142      if (subtypeId == 0)
     143      {
     144        found = p.findDefaultItem(dc, defaultType);
     145      }
     146      else
     147      {
     148        ItemSubtype subtype = ItemSubtype.getById(dc, subtypeId);
     149        found = p.findDefaultItem(dc, subtype, true);
     150      }
     151     
     152      if (found == null)
     153      {
     154        throw new ItemNotFoundException("Default " + defaultType + " for project: " + p);
     155      }
     156      else if (found.getId() != expectedId)
     157      {
     158        throw new RuntimeException("Found " + found);
     159      }
     160     
     161      dc.commit();
     162      write("--Find default item OK (" + defaultType + "; id=" + expectedId + ")");
     163    }
     164    catch(Throwable ex)
     165    {
     166      write("--Find default item FAILED (" + defaultType + "; id=" + expectedId + ")");
     167      ex.printStackTrace();
     168      ok = false;
     169    }
     170    finally
     171    {
     172      if (dc != null) dc.close();
     173    }
     174  }
     175
     176 
    128177  static int test_create(String name, boolean setAll)
    129178  {
  • trunk/src/test/net/sf/basedb/test/roles/PowerUserTest.java

    r5641 r5650  
    220220      RawDataType genepix = RawDataTypes.getSafeRawDataType("genepix");
    221221      p = Project.getById(dc, p.getId());
    222       p.setDefaultItem(dc, genericPlatform, Project.Default.PLATFORM);
     222      p.addDefaultItem(genericPlatform);
    223223      p.setDefaultRawDataType(genepix);
    224       p.setDefaultItem(dc, design, Project.Default.ARRAYDESIGN);
    225       p.setDefaultItem(dc, software, Project.Default.SOFTWARE);
    226       p.setDefaultItem(dc, hybStation, Project.Default.HYBRIDIZATION_HARDWARE);
    227       p.setDefaultItem(dc, scanner, Project.Default.SCANNER_HARDWARE);
    228       p.setDefaultItem(dc, robot, Project.Default.PRINTROBOT_HARDWARE);
    229       p.setDefaultItem(dc, scanning, Project.Default.SCANNING_PROTOCOL);
    230       p.setDefaultItem(dc, sampling, Project.Default.SAMPLING_PROTOCOL);
    231       p.setDefaultItem(dc, extraction, Project.Default.EXTRACTING_PROTOCOL);
    232       p.setDefaultItem(dc, hybridization, Project.Default.HYBRIDIZATION_PROTOCOL);
    233       p.setDefaultItem(dc, feature, Project.Default.FEATURE_EXTRACTION_PROTOCOL);
    234       p.setDefaultItem(dc, printing, Project.Default.PRINTING_PROTOCOL); 
     224      p.addDefaultItem(design);
     225      p.addDefaultItem(software);
     226      p.addDefaultItem(hybStation);
     227      p.addDefaultItem(scanner);
     228      p.addDefaultItem(robot);
     229      p.addDefaultItem(scanning);
     230      p.addDefaultItem(sampling);
     231      p.addDefaultItem(extraction);
     232      p.addDefaultItem(hybridization);
     233      p.addDefaultItem(feature);
     234      p.addDefaultItem(printing);
    235235      dc.commit();
    236236      if (!useBatchImporters)
  • trunk/www/WEB-INF/base.tld

    r5364 r5650  
    289289    <attribute>
    290290      <name>property</name>
    291       <required>true</required>
     291      <required>false</required>
    292292      <rtexprvalue>true</rtexprvalue>
    293293    </attribute>
  • trunk/www/admin/itemsubtypes/ajax.jsp

    r5645 r5650  
    2727  import="net.sf.basedb.core.Item"
    2828  import="net.sf.basedb.core.ItemSubtype"
     29  import="net.sf.basedb.core.Subtypable"
    2930  import="net.sf.basedb.core.InvalidDataException"
    3031  import="net.sf.basedb.util.Values"
     
    6869    dc.close();
    6970  }
     71  else if ("GetSubtypeForItem".equals(cmd))
     72  {
     73    Item itemType = Item.valueOf(request.getParameter("itemType"));
     74    dc = sc.newDbControl();
     75    Subtypable item = (Subtypable)itemType.getById(dc, itemId);
     76    ItemSubtype subtype = item.getItemSubtype();
     77    if (subtype != null)
     78    {
     79      json.put("id", subtype.getId());
     80      json.put("name", subtype.getName());
     81    }
     82    dc.close();
     83  }
    7084  else
    7185  {
  • trunk/www/admin/platforms/variants/list_variants.jsp

    r5590 r5650  
    7878try
    7979{
    80   final Platform platform = Platform.getById(dc, platformId);
    81   final boolean createPermission = platform.hasPermission(Permission.WRITE);
     80  final Platform platform = platformId > 0 ? Platform.getById(dc, platformId) : null;
     81  final boolean createPermission = platform == null ? false : platform.hasPermission(Permission.WRITE);
    8282  final boolean deletePermission = createPermission;
    8383  final boolean writePermission = createPermission;
     
    8686  try
    8787  {
    88     final ItemQuery<PlatformVariant> query = Base.getConfiguredQuery(dc, cc, true, platform.getVariants(), mode);
     88    final ItemQuery<PlatformVariant> query = Base.getConfiguredQuery(dc, cc, true, platform == null ? PlatformVariant.getQuery() : platform.getVariants(), mode);
    8989    variants = query.iterate(dc);
    9090  }
     
    181181  <base:body>
    182182    <p>
    183     <p:path>
    184       <p:pathelement title="Platforms" href="<%="../index.jsp?ID="+ID%>" />
    185       <p:pathelement title="<%=HTML.encodeTags(platform.getName())%>" />
    186     </p:path>
    187 
    188     <t:tabcontrol id="main" active="variant" switch="switchTab">
    189     <t:tab id="properties" title="Properties" />
     183    <%
     184    if (platform != null)
     185    {
     186      %>
     187      <p:path>
     188        <p:pathelement title="Platforms" href="<%="../index.jsp?ID="+ID%>" />
     189        <p:pathelement title="<%=HTML.encodeTags(platform.getName())%>" />
     190      </p:path>
     191      <%
     192    }
     193    %>
     194
     195    <t:tabcontrol id="main" active="variant" switch="switchTab" notabs="<%=platform == null %>">
     196    <t:tab id="properties" title="Properties" visible="<%=platform != null %>"/>
    190197   
    191198    <t:tab id="variant" title="Variants">
    192    
    193199    <%
    194200    if (cc.getMessage() != null)
     
    223229        value="<%=callback%>"
    224230        skip="<%=callback == null%>"
     231      />
     232      <tbl:columndef
     233        id="platform"
     234        property="platform.name"
     235        datatype="string"
     236        title="Platform"
     237        sortable="true"
     238        filterable="true"
     239        exportable="true"
     240        show="<%=platform==null ? "always" : "never" %>"
    225241      />
    226242      <tbl:columndef
     
    437453                  title="<%=tooltip%>"><%=name%></div></tbl:cell>
    438454                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
     455                <tbl:cell column="platform"><base:propertyvalue
     456                    item="<%=item%>" property="platform"
     457                    enableEditLink="<%=mode.hasEditLink()%>"
     458                    enablePropertyLink="<%=mode.hasPropertyLink()%>"/></tbl:cell>
    439459                <tbl:cell column="externalId"><%=item.getExternalId()%></tbl:cell>
    440460                <tbl:cell column="fileOnly"><%=item.isFileOnly() ? "yes" : "no"%></tbl:cell>
  • trunk/www/biomaterials/extracts/edit_extract.jsp

    r5648 r5650  
    117117    try
    118118    {
    119       defaultProtocol = (Protocol)activeProject.getDefaultItem(dc, Project.Default.EXTRACTING_PROTOCOL);
     119      defaultProtocol = (Protocol)activeProject.findDefaultItem(dc,
     120          ItemSubtype.getById(dc, SystemItems.getId(Protocol.EXTRACTION)), false);
    120121    }
    121122    catch(PermissionDeniedException pdex)
  • trunk/www/biomaterials/samples/edit_sample.jsp

    r5648 r5650  
    113113    try
    114114    {
    115       defaultProtocol = (Protocol)activeProject.getDefaultItem(dc, Project.Default.SAMPLING_PROTOCOL);
     115      defaultProtocol = (Protocol)activeProject.findDefaultItem(dc,
     116          ItemSubtype.getById(dc, SystemItems.getId(Protocol.SAMPLING)), false);
    116117    }
    117118    catch(PermissionDeniedException pdex)
  • trunk/www/include/scripts/linkitems.js

    r4889 r5650  
    5151    @param list The list object
    5252    @param item The Item object
    53   */
    54   this.addNewItem = function(list, item)
     53    @param endOfSection If set, the new item is inserted into the end of the
     54      section, otherwise at the end of the list
     55     
     56  */
     57  this.addNewItem = function(list, item, endOfSection)
    5558  {
    5659    var option = new Option(item.name, item.type+item.id);
    57     Forms.addListOption(list, list.length, option);
     60    var insertIndex = list.length;
     61    if (endOfSection && item.type) insertIndex = Link.getInsertIndex(list, item.type);
     62    Forms.addListOption(list, insertIndex, option);
    5863    option.item = item;
    5964  }
     
    7782    var item = allItems['T'+type+id];
    7883    return item;
     84  }
     85 
     86  this.getInsertIndex = function(list, sectionType)
     87  {
     88    var insertIndex = list.length;
     89    if (!list.hasSections) return insertIndex;
     90   
     91    var sectionFound = false;
     92    for (var i = 0; i < list.length; i++)
     93    {
     94      var section = list[i].section;
     95      // Find the start of the correct section
     96      if (!sectionFound && section && section.type == sectionType)
     97      {
     98        sectionFound = true;
     99      }
     100      // Once we find the next section; we abort
     101      if (sectionFound && section && section.type != sectionType)
     102      {
     103        insertIndex = i;
     104        i = list.length;
     105      }
     106    }
     107    return insertIndex;
    79108  }
    80109 
  • trunk/www/include/scripts/main.js

    r5645 r5650  
    552552    this.controllers['BIOWELL'] = { url:'biomaterials/bioplates/wells/index.jsp', width:480, height:320 };
    553553    this.controllers['MESSAGE'] = { url:'my_base/messages/index.jsp', width:600, height:420, popup:true, edit:false };
    554     this.controllers['PROJECT'] = { url:'my_base/projects/index.jsp', width:600, height:460 };
     554    this.controllers['PROJECT'] = { url:'my_base/projects/index.jsp', width:640, height:480 };
    555555    this.controllers['PERMISSIONTEMPLATE'] = { url:'views/permissiontemplates/index.jsp', width:450, height:280 };
    556556    this.controllers['FILE'] = { url:'filemanager/index.jsp', width:560, height:420 };
  • trunk/www/include/scripts/subtypes.js

    r5645 r5650  
    2828function ItemSubtypeClass()
    2929{
     30  /**
     31    Get the subtype of the given item.
     32    @param The type of the item
     33    @param The id of the item
     34   */
     35  this.getSubtype = function(itemType, itemId)
     36  {
     37    var request = Ajax.getXmlHttpRequest();
     38    var ID = getSessionId();
     39    var url = getRoot() + 'admin/itemsubtypes/ajax.jsp?ID=' + ID;
     40    url += '&cmd=GetSubtypeForItem&item_id=' + itemId;
     41    url += '&itemType='+itemType;
     42    request.open("GET", url, false);
     43    request.send(null);
     44    var response = JSON.parse(request.responseText);
     45    return response && response.id ? response : null;
     46  }
     47 
    3048  /**
    3149    Get the subtype that is related to the given one.
  • trunk/www/lims/arraybatches/edit_batch.jsp

    r5630 r5650  
    3535  import="net.sf.basedb.core.ArrayDesign"
    3636  import="net.sf.basedb.core.Protocol"
     37  import="net.sf.basedb.core.ItemSubtype"
    3738  import="net.sf.basedb.core.Project"
    3839  import="net.sf.basedb.core.Hardware"
     
    9293    try
    9394    {
    94       defaultArrayDesign = (ArrayDesign)activeProject.getDefaultItem(dc, Project.Default.ARRAYDESIGN);
     95      defaultArrayDesign = (ArrayDesign)activeProject.findDefaultItem(dc, Item.ARRAYDESIGN);
    9596    }
    9697    catch (PermissionDeniedException pdex)
     
    100101    try
    101102    {
    102       defaultProtocol = (Protocol)activeProject.getDefaultItem(dc, Project.Default.PRINTING_PROTOCOL);
     103      defaultProtocol = (Protocol)activeProject.findDefaultItem(dc,
     104          ItemSubtype.getById(dc, SystemItems.getId(Protocol.PRINTING)), false);
    103105    }
    104106    catch (PermissionDeniedException pdex)
     
    108110    try
    109111    {
    110       defaultPrintRobot = (Hardware)activeProject.getDefaultItem(dc, Project.Default.PRINTROBOT_HARDWARE);
     112      defaultPrintRobot = (Hardware)activeProject.findDefaultItem(dc,
     113          ItemSubtype.getById(dc, SystemItems.getId(Hardware.PRINT_ROBOT)), false);
    111114    }
    112115    catch (PermissionDeniedException pdex)
  • trunk/www/lims/arraydesigns/edit_design.jsp

    r5498 r5650  
    8484    try
    8585    {
    86       defaultPlatform = (Platform)activeProject.getDefaultItem(dc, Project.Default.PLATFORM);
     86      defaultPlatform = (Platform)activeProject.findDefaultItem(dc, Item.PLATFORM);
    8787    }
    8888    catch (PermissionDeniedException pdex)
     
    9090    try
    9191    {
    92       defaultVariant = (PlatformVariant)activeProject.getDefaultItem(dc, Project.Default.PLATFORM_VARIANT);
     92      defaultVariant = (PlatformVariant)activeProject.findDefaultItem(dc, Item.PLATFORMVARIANT);
    9393    }
    9494    catch (PermissionDeniedException pdex)
  • trunk/www/my_base/projects/edit_project.jsp

    r5630 r5650  
    2929  import="net.sf.basedb.core.SessionControl"
    3030  import="net.sf.basedb.core.BasicItem"
     31  import="net.sf.basedb.core.Nameable"
    3132  import="net.sf.basedb.core.DbControl"
    3233  import="net.sf.basedb.core.Hardware"
    3334  import="net.sf.basedb.core.Item"
    3435  import="net.sf.basedb.core.ItemContext"
     36  import="net.sf.basedb.core.Subtypable"
     37  import="net.sf.basedb.core.ItemSubtype"
    3538  import="net.sf.basedb.core.SystemItems"
    3639  import="net.sf.basedb.core.Permission"
     
    106109  ItemQuery<User> userQuery = null;
    107110 
    108   // Load recently used items
    109   List<Protocol> recentProtocol = (List<Protocol>)cc.getRecent(dc, Item.PROTOCOL);
    110   List<Software> recentSoftware = (List<Software>)cc.getRecent(dc, Item.SOFTWARE);
    111   List<Hardware> recentHardware = (List<Hardware>)cc.getRecent(dc, Item.HARDWARE);
    112   List<ArrayDesign> recentArrayDesign = (List<ArrayDesign>)cc.getRecent(dc, Item.ARRAYDESIGN);
    113  
    114   boolean deniedPlatform = false;
    115   Platform currentPlatform = null;
    116   PlatformVariant currentVariant = null;
    117111  RawDataType currentRawDataType = null;
    118112  boolean readCurrentPermissionTemplate = true;
     
    130124  {
    131125    project = Project.getById(dc, itemId);
     126    project.checkPermission(Permission.WRITE);
    132127    cc.setObject("item", project);
    133128    title = "Edit project -- " + HTML.encodeTags(project.getName());
    134129    currentRawDataType = project.getDefaultRawDataType();
    135130   
    136     try
    137     {
    138       currentPlatform = (Platform)project.getDefaultItem(dc, Project.Default.PLATFORM);
    139       currentVariant = (PlatformVariant)project.getDefaultItem(dc, Project.Default.PLATFORM_VARIANT);
    140       if (currentRawDataType != null)
    141       {
    142         if (currentPlatform == null) currentPlatform = currentRawDataType.getPlatform(dc);
    143         if (currentVariant == null) currentVariant = currentRawDataType.getVariant(dc);
    144       }
    145     }
    146     catch (PermissionDeniedException ex)
    147     {
    148       deniedPlatform = true;
    149     }
    150    
    151     if (currentRawDataType == null && currentVariant != null) currentRawDataType = currentVariant.getRawDataType();
    152     if (currentRawDataType == null && currentPlatform != null) currentRawDataType = currentPlatform.getRawDataType();
    153     if (currentRawDataType == null) currentRawDataType = project.getDefaultRawDataType();
    154  
    155131    try
    156132    {
     
    169145    userQuery.order(Orders.asc(Hql.property("name")));
    170146  }
    171   if (project != null && !project.hasPermission(Permission.WRITE))
    172   {
    173     throw new PermissionDeniedException(Permission.WRITE, itemType.toString());
    174   }
    175147 
    176   ItemQuery<Platform> platformQuery = Platform.getQuery();
    177   platformQuery.include(Include.ALL);
    178   platformQuery.order(Orders.asc(Hql.property("name")));
    179   platformQuery.setCacheResult(true);
    180   ItemResultList<Platform> platforms = platformQuery.list(dc);
    181 
    182   ItemQuery<PlatformVariant> variantQuery = PlatformVariant.getQuery();
    183   variantQuery.include(Include.ALL);
    184   variantQuery.order(Orders.asc(Hql.property("name")));
    185   variantQuery.setCacheResult(true);
    186   ItemResultList<PlatformVariant> variants = variantQuery.list(dc);
    187  
    188   Set<Project.Default> ignore = EnumSet.of(
    189     Project.Default.PLATFORM, Project.Default.PLATFORM_VARIANT,
    190     Project.Default.RAW_DATA_TYPE);
    191  
    192   final StringBuilder sb = new StringBuilder();
    193148  final String clazz = "class=\"text\"";
    194149  final String requiredClazz = "class=\"text required\"";
     
    197152  %>
    198153  <base:page type="popup" title="<%=title%>">
    199   <base:head scripts="tabcontrol.js,linkitems.js,parameters.js,platforms.js" styles="tabcontrol.css,parameters.css">
     154  <base:head scripts="tabcontrol.js,linkitems.js,subtypes.js,ajax.js,json2.js" styles="tabcontrol.css">
    200155    <ext:scripts context="<%=jspContext%>" />
    201156    <ext:stylesheets context="<%=jspContext%>" />
     
    226181        frm.modifiedUsers.value = Link.exportModified(frm, 'U').join(',');
    227182        frm.modifiedGroups.value = Link.exportModified(frm, 'G').join(',');
     183       
     184        Forms.createHidden(frm, 'add:PLATFORM', Link.getActionIds(1, 'PLATFORM').join(','));
     185        Forms.createHidden(frm, 'remove:PLATFORM', Link.getActionIds(-1, 'PLATFORM').join(','));
     186        Forms.createHidden(frm, 'add:PLATFORMVARIANT', Link.getActionIds(1, 'PLATFORMVARIANT').join(','));
     187        Forms.createHidden(frm, 'remove:PLATFORMVARIANT', Link.getActionIds(-1, 'PLATFORMVARIANT').join(','));
     188        Forms.createHidden(frm, 'add:PROTOCOL', Link.getActionIds(1, 'PROTOCOL').join(','));
     189        Forms.createHidden(frm, 'remove:PROTOCOL', Link.getActionIds(-1, 'PROTOCOL').join(','));
     190        Forms.createHidden(frm, 'add:HARDWARE', Link.getActionIds(1, 'HARDWARE').join(','));
     191        Forms.createHidden(frm, 'remove:HARDWARE', Link.getActionIds(-1, 'HARDWARE').join(','));
     192        Forms.createHidden(frm, 'add:SOFTWARE', Link.getActionIds(1, 'SOFTWARE').join(','));
     193        Forms.createHidden(frm, 'remove:SOFTWARE', Link.getActionIds(-1, 'SOFTWARE').join(','));
     194        Forms.createHidden(frm, 'add:ARRAYDESIGN', Link.getActionIds(1, 'ARRAYDESIGN').join(','));
     195        Forms.createHidden(frm, 'remove:ARRAYDESIGN', Link.getActionIds(-1, 'ARRAYDESIGN').join(','));
     196
    228197        frm.submit();
    229198      }
     
    242211      }
    243212      %>
    244       initPlatforms(<%=currentPlatform == null ? 0 : currentPlatform.getId()%>, <%=currentVariant == null ? 0 : currentVariant.getId()%>);
    245213      initMembers();
    246214      initDefaults();
    247       platformOnChange();
    248215      permissionTemplateOnChange();
    249216      showPermissions(frm.autoPermissions.value, 'auto_');
    250217    }
    251     function initPlatforms(platformId, variantId)
    252     {
     218
     219    function initDefaults()
     220    {
     221      var frm = document.forms['project'];
     222      var defaultItems = frm.defaultItems;
     223      Link.addNewSection(defaultItems, new Section('PLATFORM', 'Platforms'));
     224      Link.addNewSection(defaultItems, new Section('PLATFORMVARIANT', 'Platform variants'));
     225      Link.addNewSection(defaultItems, new Section('ARRAYDESIGN', 'Array designs'));
     226      Link.addNewSection(defaultItems, new Section('PROTOCOL', 'Protocols'));
     227      Link.addNewSection(defaultItems, new Section('HARDWARE', 'Hardware'));
     228      Link.addNewSection(defaultItems, new Section('SOFTWARE', 'Software'));
    253229      <%
    254       for (Platform p : platforms)
    255       {
    256         if (!p.isRemoved() || p.equals(currentPlatform))
     230      for (BasicItem defaultItem : project.getDefaultItems(dc))
     231      {
     232        String name = defaultItem instanceof Nameable ? ((Nameable)defaultItem).getName() : defaultItem.toString();
     233        if (defaultItem instanceof Subtypable)
    257234        {
    258           RawDataType rdt = p.isFileOnly() ? null : p.getRawDataType();
    259           %>
    260           var p<%=p.getId()%> = new Platform(<%=p.getId()%>, '<%=HTML.javaScriptEncode(p.getExternalId())%>', '<%=HTML.javaScriptEncode(p.getName())%>', <%=p.isFileOnly()%>, '<%=rdt == null ? "" : rdt.getId()%>');
    261           <%
    262         }
    263       }
    264       for (PlatformVariant v : variants)
    265       {
    266         Platform p = v.getPlatform();
    267         if ((!v.isRemoved() || v.equals(currentVariant)) && (!p.isRemoved() || p.equals(currentPlatform)))
    268         {
    269           RawDataType rdt = v.isFileOnly() ? null : v.getRawDataType();
    270           %>
    271           var v<%=v.getId()%> = new Variant(p<%=p.getId()%>, <%=v.getId()%>, '<%=HTML.javaScriptEncode(v.getExternalId())%>', '<%=HTML.javaScriptEncode(v.getName())%>', <%=v.isFileOnly()%>, '<%=rdt == null ? "" : rdt.getId()%>');
    272           <%
    273         }
    274       }
    275       %>
    276       var frm = document.forms['project'];
    277       Platforms.populateList(frm.platform, platformId, variantId);
    278     }
    279     function initDefaults()
    280     {
    281       <%
    282       // Platform/variant/raw data type
    283       String icon = currentPlatform == null && currentVariant == null && currentRawDataType == null ?
    284         "notrequired_novalues.gif" : "notrequired_values.gif";
    285       icon = "<span class=\"icon\"><img id=\"icon_default_platform\" src=\"../../images/"+icon+"\"></span>";
    286       sb.append("<div class=\"param\" id=\"prompt_default_platform\" onclick=\"defaultItemOnClick('default_platform')\"");
    287       sb.append(" onmouseover=\"Main.addClass(this, 'hover')\" onmouseout=\"Main.removeClass(this, 'hover')\" title=\"Platform / raw data type\">");
    288       sb.append(icon+"<span class=\"label\">Platform / raw data type</span></div>\n");
    289       for (Project.Default d : Project.Default.values())
    290       {
    291         %>
    292         var values = new Array();
    293         <%
    294         icon = "";
    295         if (project != null)
    296         {
    297           if (d.getItemType() != null)
    298           {
    299             BasicItem defaultValue = project.getDefaultItem(dc, d);
    300             int valueId = 0;
    301             if (defaultValue != null)
    302             {
    303               valueId = defaultValue.getId();
    304               icon = "notrequired_values.gif";
    305             }
    306             else
    307             {
    308               icon = "notrequired_novalues.gif";
    309             }
    310             %>
    311             values[values.length] = <%=valueId%>;
    312             <%
    313           }
    314           else if (d == Project.Default.RAW_DATA_TYPE)
    315           {
    316             RawDataType rdt = project.getDefaultRawDataType();
    317             String strValueId = "";
    318             if (rdt != null)
    319             {
    320               strValueId = rdt.getId();
    321               icon = "notrequired_values.gif";
    322             }
    323             else
    324             {
    325               icon = "notrequired_novalues.gif";
    326             }
    327             %>
    328             values[values.length] = '<%=strValueId%>';
    329             <%
    330           }
    331         }
    332         else
    333         {
    334           icon = "notrequired_novalues.gif";
    335         }
    336         if (!ignore.contains(d))
    337         {
    338           icon = "<span class=\"icon\"><img id=\"icon_"+d.getName()+"\" src=\"../../images/"+icon+"\"></span>";
    339           sb.append("<div class=\"param\" id=\"prompt_"+d.getName()+"\" onclick=\"defaultItemOnClick('"+d.getName()+"')\"");
    340           sb.append(" onmouseover=\"Main.addClass(this, 'hover')\" onmouseout=\"Main.removeClass(this, 'hover')\" title=\""+d.getShortName()+"\">");
    341           sb.append(icon+"<span class=\"label\">"+d.getShortName()+"</span></div>\n");       
     235          ItemSubtype subtype = ((Subtypable)defaultItem).getItemSubtype();
     236          if (subtype != null) name += " (" + subtype.getName() + ")";
    342237        }
    343238        %>
    344         var di = new Parameter('<%=d.getName()%>', '<%=HTML.javaScriptEncode(d.getShortName())%>', 1, false, false, values);
     239        Link.addNewItem(defaultItems, new Item('<%=defaultItem.getType().name()%>', <%=defaultItem.getId()%>, '<%=HTML.javaScriptEncode(name)%>'), true);
    345240        <%
    346241      }
     
    551446      Link.addItem(document.forms['project'].members, item);
    552447    }
    553     var oldValueDiv;
    554     function defaultItemOnClick(defaultName)
    555     {
    556       var frm = document.forms['project'];
    557       if (oldValueDiv) Main.hide(oldValueDiv);
    558      
    559       var pp = Parameters.allParameters['ID'+defaultName];
    560       setSelectedParameter(pp, defaultName);
    561       oldValueDiv = 'value_'+pp.name+'_div';
    562       Main.show(oldValueDiv);
    563     }
    564     var selectedParameter = null;
    565     var selectedParameterName = null;
    566     function getSelectedParameter()
    567     {
    568       return selectedParameter;
    569     }   
    570     function setSelectedParameter(parameter, name)
    571     {
    572       if (selectedParameter != null)
    573       {
    574         Main.removeClass(document.getElementById('prompt_'+selectedParameter.name), 'selected');
    575       }
    576       selectedParameter = parameter;
    577       selectedParameterName = name;
    578       if (selectedParameter != null)
    579       {
    580         Main.addClass(document.getElementById('prompt_'+selectedParameter.name), 'selected');
    581       }
    582     }
    583     function updateSelectedStyle()
    584     {
    585       var pp = getSelectedParameter();
    586       var icon = document.getElementById('icon_'+pp.name);
    587       var gif = getRoot()+'images/';
    588       if (pp.values[0] == 0)
    589       {
    590         gif += 'notrequired_novalues.gif';
    591       }
    592       else
    593       {
    594         gif += 'notrequired_values.gif';
    595       }
    596       icon.src = gif;   
    597     }
    598     function defaultValueOnChange(value)
    599     {
    600       var pp = getSelectedParameter();
    601       if (value == null || value == '')
    602       {
    603         pp.removeValue(0);
    604       }
    605       else
    606       {
    607         pp.updateValue(0, value);
    608       }
    609       updateSelectedStyle();   
    610     }   
    611     function selectDefaultItemOnClick(url)
    612     {
    613       var frm = document.forms['project'];           
    614       var select_id = 'value_' + getSelectedParameter().name;
    615       var selectlist = frm[select_id];
    616       if (selectlist.length > 1)
    617       {
    618         var id = Math.abs(parseInt(selectlist[1].value));       
    619         url += '&item_id='+id;
    620       }
    621       Main.openPopup(url, 'SelectDefaultItem', 1000, 700);
    622     }
    623     function setDefaultItemCallback(id, name)
    624     {
    625       var frm = document.forms['project'];
    626       var select_id = 'value_' + getSelectedParameter().name;
    627       var selectlist = frm[select_id];
    628       if (selectlist.length < 2)
    629       {
    630         Forms.addListOption(selectlist, 1, new Option());
    631       }
    632       selectlist[1].value = id;
    633       selectlist[1].text = name;
    634       selectlist.selectedIndex = 1;
    635       defaultValueOnChange(selectlist[1].value);   
    636     }       
    637     function removeOnClick()
     448    function removeMemberOnClick()
    638449    {
    639450      Link.removeSelected(document.forms['project'].members);
    640451    }
     452
    641453   
    642     function platformOnChange()
    643     {
    644       var frm = document.forms['project'];
    645       var platform = Platforms.getSelectedPlatform(frm.platform);
    646       var variant = Platforms.getSelectedVariant(frm.platform);
    647       var fileOnly = (variant != null && variant.fileOnly) ||
    648         (variant == null && platform != null && platform.fileOnly);
    649       var rawDataType = null;
    650       if (variant != null)
    651       {
    652         rawDataType = variant.rawDataType;
    653       }
    654       else if (platform != null)
    655       {
    656         rawDataType = platform.rawDataType;
    657       }
    658       if (frm.rawdatatype[frm.rawdatatype.length - 1].value == '')
    659       {
    660         frm.rawdatatype[frm.rawdatatype.length - 1] = null;
    661       }
    662       if (fileOnly)
    663       {
    664         frm.rawdatatype.disabled = true;
    665         frm.rawdatatype[frm.rawdatatype.length] = new Option('- file only -', '');
    666         frm.rawdatatype.selectedIndex = frm.rawdatatype.length - 1;
    667       }
    668       else if (rawDataType)
    669       {
    670         frm.rawdatatype.disabled = true;
    671         Forms.selectListOption(frm.rawdatatype, rawDataType);
    672       }
    673       else
    674       {
    675         frm.rawdatatype.disabled = false;
    676         rawDataType = frm.rawdatatype[frm.rawdatatype.selectedIndex].value;
    677       }
    678       var icon = document.getElementById('icon_default_platform');
    679       var gif = getRoot()+'images/';
    680       if (!platform && !variant && !rawDataType)
    681       {
    682         gif += 'notrequired_novalues.gif';
    683       }
    684       else
    685       {
    686         gif += 'notrequired_values.gif';
    687       }
    688       icon.src = gif;
     454    function addDefaultProtocolsOnClick()
     455    {
     456      var ids = Link.getListIds(document.forms['project'].defaultItems, 'PROTOCOL');
     457      var excludes = ids.join(',');
     458      Main.openPopup('../../admin/protocols/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectmultiple&callback=addDefaultProtocolCallback&exclude='+excludes, 'AddProtocols', 1000, 700);
     459    }
     460    function addDefaultProtocolCallback(protocolId, name)
     461    {
     462      var item = Link.getItem('PROTOCOL', protocolId);
     463      if (!item)
     464      {
     465        var subtype = ItemSubtype.getSubtype('PROTOCOL', protocolId);
     466        if (subtype) name += ' ('+subtype.name+')';
     467        item = new Item('PROTOCOL', protocolId, name);
     468      }
     469      Link.addItem(document.forms['project'].defaultItems, item);
    689470    }
    690471   
    691     function rawDataTypeOnChange()
    692     {
    693       platformOnChange();
    694     }
     472    function addDefaultSoftwareOnClick()
     473    {
     474      var ids = Link.getListIds(document.forms['project'].defaultItems, 'SOFTWARE');
     475      var excludes = ids.join(',');
     476      Main.openPopup('../../admin/software/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectmultiple&callback=addDefaultSoftwareCallback&exclude='+excludes, 'AddSoftware', 1000, 700);
     477    }
     478    function addDefaultSoftwareCallback(softwareId, name)
     479    {
     480      var item = Link.getItem('SOFTWARE', softwareId);
     481      if (!item)
     482      {
     483        var subtype = ItemSubtype.getSubtype('SOFTWARE', softwareId);
     484        if (subtype) name += ' ('+subtype.name+')';
     485        item = new Item('SOFTWARE', softwareId, name);
     486      }
     487      Link.addItem(document.forms['project'].defaultItems, item);
     488    }
     489
     490    function addDefaultHardwareOnClick()
     491    {
     492      var ids = Link.getListIds(document.forms['project'].defaultItems, 'HARDWARE');
     493      var excludes = ids.join(',');
     494      Main.openPopup('../../admin/hardware/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectmultiple&callback=addDefaultHardwareCallback&exclude='+excludes, 'AddHardware', 1000, 700);
     495    }
     496    function addDefaultHardwareCallback(hardwareId, name)
     497    {
     498      var item = Link.getItem('HARDWARE', hardwareId);
     499      if (!item)
     500      {
     501        var subtype = ItemSubtype.getSubtype('HARDWARE', hardwareId);
     502        if (subtype) name += ' ('+subtype.name+')';
     503        item = new Item('HARDWARE', hardwareId, name);
     504      }
     505      Link.addItem(document.forms['project'].defaultItems, item);
     506    }
     507   
     508    function addDefaultArrayDesignsOnClick()
     509    {
     510      var ids = Link.getListIds(document.forms['project'].defaultItems, 'ARRAYDESIGN');
     511      var excludes = ids.join(',');
     512      Main.openPopup('../../lims/arraydesigns/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectmultiple&callback=addDefaultArrayDesignCallback&exclude='+excludes, 'AddArrayDesign', 1000, 700);
     513    }
     514    function addDefaultArrayDesignCallback(designId, name)
     515    {
     516      var item = Link.getItem('ARRAYDESIGN', designId);
     517      if (!item)
     518      {
     519        item = new Item('ARRAYDESIGN', designId, name);
     520      }
     521      Link.addItem(document.forms['project'].defaultItems, item);
     522    }
     523 
     524    function addDefaultPlatformsOnClick()
     525    {
     526      var ids = Link.getListIds(document.forms['project'].defaultItems, 'PLATFORM');
     527      var excludes = ids.join(',');
     528      Main.openPopup('../../admin/platforms/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectmultiple&callback=addDefaultPlatformCallback&exclude='+excludes, 'AddPlatform', 1000, 700);
     529    }
     530    function addDefaultPlatformCallback(platformId, name)
     531    {
     532      var item = Link.getItem('PLATFORM', platformId);
     533      if (!item)
     534      {
     535        item = new Item('PLATFORM', platformId, name);
     536      }
     537      Link.addItem(document.forms['project'].defaultItems, item);
     538    }
     539
     540    function addDefaultPlatformVariantsOnClick()
     541    {
     542      var frm = document.forms['project'];
     543      var selectedItem = frm.defaultItems[frm.defaultItems.selectedIndex];
     544      var url = '../../admin/platforms/variants/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectmultiple&callback=addDefaultPlatformVariantCallback';
     545      var ids = Link.getListIds(frm.defaultItems, 'PLATFORMVARIANT');
     546      url += '&exclude='+ids.join(',');
     547      Main.openPopup(url, 'AddPlatformVariant', 1000, 700);
     548    }
     549    function addDefaultPlatformVariantCallback(variantId, name)
     550    {
     551      var item = Link.getItem('PLATFORMVARIANT', variantId);
     552      if (!item)
     553      {
     554        item = new Item('PLATFORMVARIANT', variantId, name);
     555      }
     556      Link.addItem(document.forms['project'].defaultItems, item);
     557    }
     558
     559   
     560    function removeDefaultItemsOnClick()
     561    {
     562      Link.removeSelected(document.forms['project'].defaultItems);
     563    }
     564 
    695565    </script>
    696566  </base:head>
     
    702572
    703573    <h3 class="docked"><%=title%> <base:help tabcontrol="settings" /></h3>
    704     <t:tabcontrol id="settings" contentstyle="<%="height: "+(int)(scale*320)+"px;"%>"
     574    <t:tabcontrol id="settings" contentstyle="<%="height: "+(int)(scale*360)+"px;"%>"
    705575      position="bottom" remember="<%=project != null%>"
    706576      extensions="<%=invoker%>">
     
    786656      /></td></tr>
    787657      <tr><td><base:button
    788         onclick="removeOnClick()"
     658        onclick="removeMemberOnClick()"
    789659        title="Remove"
    790         tooltip="Remove the selected items from this group"
     660        tooltip="Remove the selected members from this project"
    791661      /></td></tr>
    792662      </table>
     
    797667   
    798668    <t:tab id="defaults" title="Default items"  helpid="project.edit.defaults">
     669      <table class="form" cellspacing="2" border="0" cellpadding="0">
     670      <tr>
     671        <td class="prompt">Raw data type</td>
     672        <td>
     673          <select name="rawdatatype">
     674          <option value="">- none -</option>
     675          <%
     676          for (RawDataType rdt : RawDataTypes.getSortedRawDataTypes(new RawDataTypes.NameComparator()))
     677          {
     678            if (rdt.isStoredInDb())
     679            {
     680              String selected = rdt.equals(currentRawDataType) ? "selected" : "";
     681              %>
     682              <option value="<%=rdt.getId()%>" <%=selected%>><%=HTML.encodeTags(rdt.getName())%>
     683              <%
     684            }
     685          }
     686          %>
     687          </select>
     688        </td>
     689      </tr>
     690      </table>
     691
    799692      <table class="form" cellspacing="2" border="0" cellpadding="0" width="100%">       
    800693        <tr valign="top">
    801           <td width="40%">
    802             <b>Project defaults</b><br>
    803             <div class="parameterlist" style="height: <%=(int)(scale*260)%>px; width:<%=(int)(scale*200)%>px; margin-top: 4px;">
    804               <%=sb.toString()%>
    805             </div>
    806             <base:icon image="hasvalues.gif" /> = Has value
     694          <td>
     695            <b>Default items</b><br>
     696            <select <%=clazz%> name="defaultItems" size="20" multiple style="width: 22em;">
     697            </select>
    807698          </td>
    808           <td width="60%">
     699          <td>
    809700            <br>
    810            
    811             <div id="value_default_platform_div" style="display: none">
    812               <table>
    813               <tr>
    814                 <td class="prompt">Platform</td>
    815               </tr>
    816               <tr>
    817                 <td>
    818                   <select name="platform" onchange="platformOnChange()">
    819                   <option value="">- none -</option>
    820                   </select>
    821                 </td>
    822               </tr>
    823               <tr>
    824                 <td class="prompt">Raw data type</td>
    825               </tr>
    826               <tr>
    827                 <td>
    828                   <select name="rawdatatype" onchange="rawDataTypeOnChange()">
    829                   <option value="">- none -</option>
    830                   <%
    831                   for (RawDataType rdt : RawDataTypes.getSortedRawDataTypes(new RawDataTypes.NameComparator()))
    832                   {
    833                     if (rdt.isStoredInDb())
    834                     {
    835                       String selected = rdt.equals(currentRawDataType) ? "selected" : "";
    836                       %>
    837                       <option value="<%=rdt.getId()%>" <%=selected%>><%=HTML.encodeTags(rdt.getName())%>
    838                       <%
    839                     }
    840                   }
    841                   %>
    842                   </select>
    843                 </td>
    844               </tr>
    845               </table>
    846               </div>
    847            
    848             <%
    849             for (Project.Default d : Project.Default.values())
    850             {
    851               String inputName = "value_" + d.getName();
    852               if (!ignore.contains(d))
    853               {
    854                 %>
    855                 <div id="<%=inputName%>_div" style="display: none;">
    856                   <table>
    857                     <tr>
    858                     <td class="prompt"><%=d.getShortName()%></td>
    859                     </tr>
    860                     <%
    861                     if (d.getItemType() != null)
    862                     {
    863                       String selectDefaultItemOnClick = "";
    864                       String defaultItemOnChange = ""; 
    865                       List recentItems = null;
    866                       boolean readCurrentItem = true;
    867                       BasicItem currentItem = null;
    868                       try
    869                       {
    870                         currentItem = project != null ? project.getDefaultItem(dc, d) : null;
    871                       }
    872                       catch (PermissionDeniedException ex)
    873                       {
    874                         readCurrentItem = false;
    875                       }
    876                      
    877                       if (d.getItemType() == Item.PROTOCOL)
    878                       {
    879                         int typeId = SystemItems.getId(d.getType());
    880                         String url = "'../../admin/protocols/index.jsp?ID=" + ID +
    881                             "&cmd=UpdateContext&mode=selectone&callback=setDefaultItemCallback" +
    882                             "&resetTemporary=1&tmpfilter:INT:itemSubtype=" + typeId + "'";
    883                         selectDefaultItemOnClick = "selectDefaultItemOnClick(" + url + ")";
    884                         recentItems = recentProtocol;
    885                       }
    886                       else if (d.getItemType() == Item.HARDWARE)
    887                       {
    888                         int typeId = SystemItems.getId(d.getType());
    889                         String url = "'../../admin/hardware/index.jsp?ID=" + ID +
    890                             "&cmd=UpdateContext&mode=selectone&callback=setDefaultItemCallback" +
    891                             "&resetTemporary=1&tmpfilter:INT:itemSubtype=" + typeId + "'";
    892                         selectDefaultItemOnClick = "selectDefaultItemOnClick(" + url + ")";
    893                         recentItems = recentHardware;
    894                       }
    895                       else if (d.getItemType() == Item.SOFTWARE)
    896                       {
    897                         String url = "'../../admin/software/index.jsp?ID=" + ID +
    898                             "&cmd=UpdateContext&mode=selectone&callback=setDefaultItemCallback'";
    899                         selectDefaultItemOnClick = "selectDefaultItemOnClick(" + url + ")";
    900                         recentItems = recentSoftware;
    901                       }
    902                       else if (d.getItemType() == Item.ARRAYDESIGN)
    903                       {
    904                         String url = "'../../lims/arraydesigns/index.jsp?ID=" + ID +
    905                             "&mode=selectone&callback=setDefaultItemCallback'";
    906                         selectDefaultItemOnClick = "selectDefaultItemOnClick(" + url + ")";                 
    907                         recentItems = recentArrayDesign;
    908                       }               
    909                       %>   
    910                       <tr>
    911                       <td>
    912                         <base:select
    913                           id="<%=inputName%>"
    914                           clazz="selectionlist"
    915                           required="false"
    916                           current="<%=currentItem%>"
    917                           denied="<%=!readCurrentItem%>"
    918                           recent="<%=recentItems%>"
    919                           newitem="<%=project == null%>"
    920                           onselect="<%=selectDefaultItemOnClick%>"
    921                           onchange = 'defaultValueOnChange(this[this.selectedIndex].value)'
    922                         />
    923                       </td>
    924                       </tr>                 
    925                     <%
    926                     }
    927                     %>
    928                   </table>                   
    929                 </div>
    930                 <%
    931               }
    932             }
    933             %>           
     701            <table width="200">
     702            <tr><td><base:button
     703              onclick="addDefaultPlatformsOnClick()"
     704              title="Add&nbsp;platforms&hellip;"
     705              tooltip="Add default platforms to this project"
     706              /></td></tr>
     707            <tr><td><base:button
     708              onclick="addDefaultPlatformVariantsOnClick()"
     709              title="Add&nbsp;variants&hellip;"
     710              tooltip="Add default platform variants to this project"
     711              /></td></tr>
     712            <tr><td><base:button
     713              onclick="addDefaultProtocolsOnClick()"
     714              title="Add&nbsp;protocols&hellip;"
     715              tooltip="Add default protocols to this project"
     716              /></td></tr>
     717            <tr><td><base:button
     718              onclick="addDefaultHardwareOnClick()"
     719              title="Add&nbsp;hardware&hellip;" 
     720              tooltip="Add default hardware to this project"
     721            /></td></tr>
     722            <tr><td><base:button
     723              onclick="addDefaultSoftwareOnClick()"
     724              title="Add&nbsp;software&hellip;" 
     725              tooltip="Add default software to this project"
     726            /></td></tr>
     727            <tr><td><base:button
     728              onclick="addDefaultArrayDesignsOnClick()"
     729              title="Add&nbsp;array&nbsp;designs&hellip;" 
     730              tooltip="Add default array designs to this project"
     731            /></td></tr>
     732            <tr><td><base:button
     733              onclick="removeDefaultItemsOnClick()"
     734              title="Remove"
     735              tooltip="Remove the selected items from this project"
     736            /></td></tr>
     737            </table>
    934738          </td>
    935739        </tr>
  • trunk/www/my_base/projects/index.jsp

    r5590 r5650  
    194194     
    195195      // Default tab
    196      
    197       Platform platform = null;
    198       PlatformVariant variant = null;
    199       RawDataType rdt = null;
    200       if (request.getParameter("platform") != null)
     196      Item[] types = { Item.PLATFORM, Item.PROTOCOL, Item.HARDWARE, Item.SOFTWARE, Item.ARRAYDESIGN };
     197      for (Item defaultType : types)
    201198      {
    202         String[] pv = request.getParameter("platform").split(":");
    203         int platformId = Values.getInt(pv[0], -1);
    204         int variantId = pv.length > 1 ? Values.getInt(pv[1], -1) : -1;
    205         if (platformId > 0) platform =  Platform.getById(dc, platformId);
    206         if (variantId > 0) variant = PlatformVariant.getById(dc, variantId);
    207       }
    208       if (variant != null) rdt = variant.getRawDataType();
    209       if (rdt == null && platform != null) rdt = platform.getRawDataType();
    210       if (rdt == null) rdt = RawDataTypes.getRawDataType( request.getParameter("rawdatatype"));
    211       project.setDefaultItem(dc, platform, Project.Default.PLATFORM);
    212       project.setDefaultItem(dc, variant, Project.Default.PLATFORM_VARIANT);
    213       project.setDefaultRawDataType(rdt);   
    214      
    215       for (Project.Default d : Project.Default.values())
    216       {
    217         String selectDefault = "value_"+d.getName();
    218         if (d.getItemType() != null)
     199        String[] remove = Values.getString(request.getParameter("remove:"+defaultType.name())).split(",");
     200        for (int i = 0; i < remove.length; ++i)
    219201        {
    220           int selectId = Values.getInt(request.getParameter(selectDefault), -1);     
    221           if (selectId >= 0)
    222           {
    223             BasicItem item = selectId == 0 ? null : d.getItemType().getById(dc, selectId);
    224             project.setDefaultItem(dc, item, d);
    225           }
     202          int defaultId = Values.getInt(remove[i], -1);
     203          if (defaultId != -1) project.removeDefaultItem(defaultType.getById(dc, defaultId));
     204        }
     205       
     206        String[] add = Values.getString(request.getParameter("add:"+defaultType.name())).split(",");
     207        for (int i = 0; i < add.length; ++i)
     208        {
     209          int defaultId = Values.getInt(add[i], -1);
     210          if (defaultId != -1) project.addDefaultItem(defaultType.getById(dc, defaultId));
    226211        }
    227212      }
     213     
     214      RawDataType rdt = RawDataTypes.getRawDataType( request.getParameter("rawdatatype"));
     215      project.setDefaultRawDataType(rdt);   
    228216     
    229217      // OnSave extensions
  • trunk/www/my_base/projects/view_project.jsp

    r5502 r5650  
    2323  @version 2.0
    2424--%>
     25<%@page import="net.sf.basedb.core.Subtypable"%>
    2526<%@ page pageEncoding="UTF-8" session="false"
    2627  import="net.sf.basedb.core.SessionControl"
     
    288289      userQuery.order(Orders.asc(Hql.property("name")));
    289290      ItemResultList<User> users = userQuery.list(dc);
    290       %>
     291      if (groups.size() + users.size() == 0)
     292      {
     293        %>
     294        <h4>Members</h4>
     295        There are no members in this project
     296        (or, you don't have permission to view them).
     297        <%
     298      }
     299      else
     300      {
     301        %>
    291302      <base:section
    292303        id="membersSection"
     
    350361        </tbl:table>
    351362      </base:section>
    352      
     363      <%
     364      }
     365      List<BasicItem> defaultItems = project.getDefaultItems(dc);
     366      if (defaultItems.size() == 0 && project.getDefaultRawDataType() == null)
     367      {
     368        %>
     369        <h4>Default items</h4>
     370        There are no default items in this project
     371        (or, you don't have permission to view them).
     372        <%
     373      }
     374      else
     375      {
     376        %>
    353377      <base:section
    354378        id="defaultSection"
    355         title="Defaults"
     379        title="Default items"
    356380        context="<%=cc%>"
    357381        >     
     
    362386        >
    363387        <tbl:columndef
    364           id="setting"
    365           title="Setting"
     388          id="item"
     389          title="Item"
    366390        />
    367391        <tbl:columndef
    368           id="value"
    369           title="Value"
     392          id="type"
     393          title="Type"
    370394        />
    371395        <tbl:data>
    372396          <tbl:columns />
    373397            <tbl:rows>     
    374             <%   
    375             // Check each Default if it has any value
    376             for (Project.Default d : Project.Default.values())
     398            <%
     399            if (project.getDefaultRawDataType() != null)
    377400            {
    378               boolean readDefaultValue = true;
    379               String defaultName = d.getShortName();
    380               String value = null;
    381               if (d.getItemType() != null)
    382               {
    383                 BasicItem item = null;
    384                 try
    385                 {
    386                   item = project.getDefaultItem(dc, d);
    387                   if (item != null)
     401              %>
     402              <tbl:row>
     403                <tbl:cell column="item"><%=project.getDefaultRawDataType().getName()%></tbl:cell>
     404                <tbl:cell column="type">Raw data type</tbl:cell>
     405              </tbl:row>
     406              <%
     407            }
     408            for (BasicItem item : defaultItems)
     409            {
     410              %>
     411              <tbl:row>
     412                <tbl:cell column="item"><base:propertyvalue item="<%=item%>" /></tbl:cell>
     413                <tbl:cell column="type">
     414                  <%
     415                  if (item instanceof Subtypable)
    388416                  {
    389                     value = item instanceof Nameable ? Base.getLinkedName(ID, (Nameable)item, false, true) : item.toString();
     417                    %>
     418                    <base:propertyvalue item="<%=item%>" property="itemSubtype" nulltext="" /> (<%=item.getType()%>)
     419                    <%
    390420                  }
    391                 }
    392                 catch (PermissionDeniedException ex)
    393                 {
    394                   readDefaultValue = false;
    395                   value = "<i>- denied -</i>";
    396                 }             
    397               }
    398               else if (d.equals(Project.Default.RAW_DATA_TYPE))
    399               {
    400                 RawDataType rdt = project.getDefaultRawDataType();
    401                 value = rdt != null ? rdt.getName() : null;
    402               }
    403               if (value != null)
    404               {
    405                 %>
    406                 <tbl:row>
    407                   <tbl:cell column="setting"><%=defaultName%></tbl:cell>
    408                   <tbl:cell column="value"><%=value%></tbl:cell>
    409                 </tbl:row>
    410                 <%
    411               }
     421                  else
     422                  {
     423                    %>
     424                    <%=item.getType()%>
     425                    <%
     426                  }
     427                  %>
     428                </tbl:cell>
     429              </tbl:row>
     430              <%
    412431            }
    413432            %>
     
    415434          </tbl:data>
    416435        </tbl:table>
    417       </base:section>     
     436      </base:section>
     437      <%
     438      }
     439      %>
     440           
    418441      <jsp:include page="../../common/anytoany/list_anytoany.jsp">
    419442        <jsp:param name="ID" value="<%=ID%>" />
     
    432455  </base:page>
    433456  <%
     457  dc.commit();
    434458}
    435459finally
  • trunk/www/views/physicalbioassays/edit_bioassay.jsp

    r5649 r5650  
    107107    try
    108108    {
    109       defaultProtocol = (Protocol)activeProject.getDefaultItem(dc, Project.Default.HYBRIDIZATION_PROTOCOL);
     109      defaultProtocol = (Protocol)activeProject.findDefaultItem(dc,
     110          ItemSubtype.getById(dc, SystemItems.getId(Protocol.HYBRIDIZATION)), false);
    110111    }
    111112    catch (PermissionDeniedException pdex)
     
    115116    try
    116117    {
    117       defaultHardware = (Hardware)activeProject.getDefaultItem(dc, Project.Default.HYBRIDIZATION_HARDWARE);
     118      defaultHardware = (Hardware)activeProject.findDefaultItem(dc,
     119          ItemSubtype.getById(dc, SystemItems.getId(Hardware.HYBRIDIZATION_STATION)), false);
    118120    }
    119121    catch (PermissionDeniedException pdex)
  • trunk/www/views/rawbioassays/edit_rawbioassay.jsp

    r5630 r5650  
    4141  import="net.sf.basedb.core.Software"
    4242  import="net.sf.basedb.core.ArrayDesign"
     43  import="net.sf.basedb.core.ItemSubtype"
    4344  import="net.sf.basedb.core.File"
    4445  import="net.sf.basedb.core.RawDataType"
     
    114115    try
    115116    {
    116       defaultProtocol = (Protocol)activeProject.getDefaultItem(dc, Project.Default.FEATURE_EXTRACTION_PROTOCOL);     
     117      defaultProtocol = (Protocol)activeProject.findDefaultItem(dc,
     118          ItemSubtype.getById(dc, SystemItems.getId(Protocol.FEATURE_EXTRACTION)), false);
    117119    }
    118120    catch (PermissionDeniedException pdex)
     
    122124    try
    123125    {
    124       defaultSoftware = (Software)activeProject.getDefaultItem(dc, Project.Default.SOFTWARE);     
     126      defaultSoftware = (Software)activeProject.findDefaultItem(dc,
     127          ItemSubtype.getById(dc, SystemItems.getId(Software.FEATURE_EXTRACTION)), false);
    125128    }
    126129    catch (PermissionDeniedException pdex)
     
    130133    try
    131134    {
    132       defaultArrayDesign = (ArrayDesign)activeProject.getDefaultItem(dc, Project.Default.ARRAYDESIGN);     
     135      defaultArrayDesign = (ArrayDesign)activeProject.findDefaultItem(dc, Item.ARRAYDESIGN);
    133136    }
    134137    catch (PermissionDeniedException pdex)
     
    138141    try
    139142    {
    140       defaultPlatform = (Platform)activeProject.getDefaultItem(dc, Project.Default.PLATFORM);
     143      defaultPlatform = (Platform)activeProject.findDefaultItem(dc, Item.PLATFORM);
    141144    }
    142145    catch (PermissionDeniedException pdex)
     
    144147    try
    145148    {
    146       defaultVariant = (PlatformVariant)activeProject.getDefaultItem(dc, Project.Default.PLATFORM_VARIANT);
     149      defaultVariant = (PlatformVariant)activeProject.findDefaultItem(dc, Item.PLATFORMVARIANT);
    147150    }
    148151    catch (PermissionDeniedException pdex)
  • trunk/www/views/scans/edit_scan.jsp

    r5642 r5650  
    3535  import="net.sf.basedb.core.Scan"
    3636  import="net.sf.basedb.core.PhysicalBioAssay"
     37  import="net.sf.basedb.core.ItemSubtype"
    3738  import="net.sf.basedb.core.Protocol"
    3839  import="net.sf.basedb.core.Project"
     
    9091    try
    9192    {
    92       defaultProtocol = (Protocol)activeProject.getDefaultItem(dc, Project.Default.SCANNING_PROTOCOL);     
     93      defaultProtocol = (Protocol)activeProject.findDefaultItem(dc,
     94          ItemSubtype.getById(dc, SystemItems.getId(Protocol.SCANNING)), false);
    9395    }
    9496    catch (PermissionDeniedException pdex)
     
    98100    try
    99101    {
    100       defaultScanner = (Hardware)activeProject.getDefaultItem(dc, Project.Default.SCANNER_HARDWARE);     
     102      defaultScanner = (Hardware)activeProject.findDefaultItem(dc,
     103          ItemSubtype.getById(dc, SystemItems.getId(Hardware.SCANNER)), false);
    101104    }
    102105    catch (PermissionDeniedException pdex)
Note: See TracChangeset for help on using the changeset viewer.