/* Copyright (c) Citrix Systems, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms,
* with or without modification, are permitted provided
* that the following conditions are met:
*
* * Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
using System;
using XenAdmin.Controls;
using XenAdmin.Model;
using XenAdmin.XenSearch;
using XenAPI;
namespace XenAdmin
{
public abstract class OrganizationalView : Grouping
{
protected OrganizationalView()
: base((Grouping)null)
{}
protected abstract Grouping Grouping { get; }
protected abstract QueryFilter Query { get; }
///
/// Normally exclude folders even if in search: CA-27260
///
protected virtual bool IncludeFolders
{
get { return false; }
}
public override object GetGroup(IXenObject o)
{
throw new NotImplementedException();
}
public VirtualTreeNode RootNode
{
get
{
return new VirtualTreeNode(GroupingName)
{
Tag = new GroupingTag(this, null, GroupingName),
ImageIndex = (int)GetGroupIcon(null)
};
}
}
public void Populate(Search search, params IAcceptGroups[] groupAcceptors)
{
var orgViewSearch = OrgViewSearch(search);
orgViewSearch.PopulateAdapters(groupAcceptors);
}
private Search OrgViewSearch(Search search)
{
ObjectTypes types;
if (search == null || search.Query == null || search.Query.QueryScope == null)
{
types = IncludeFolders ? ObjectTypes.AllIncFolders : ObjectTypes.AllExcFolders;
}
else
{
types = IncludeFolders
? search.Query.QueryScope.ObjectTypes
: (search.Query.QueryScope.ObjectTypes & ~ObjectTypes.Folder);
}
QueryScope scope = new QueryScope(types);
QueryFilter filter;
if (search == null || search.Query == null || search.Query.QueryFilter == null)
filter = Query;
else if (Query == null)
filter = search.Query.QueryFilter;
else
filter = new GroupQuery(new[] { search.Query.QueryFilter, Query }, GroupQuery.GroupQueryType.And);
return new Search(new Query(scope, filter), Grouping, "", null, null, new Sort[] { });
}
}
public class OrganizationViewObjects : OrganizationalView
{
private readonly Grouping typesGrouping = new PropertyGrouping(PropertyNames.type, null);
public override string GroupingName
{
get { return Messages.VIEW_OBJECTS; }
}
public override Icons GetGroupIcon(object obj)
{
return Icons.Objects;
}
public override Grouping GetSubgrouping(object val)
{
return typesGrouping;
}
protected override Grouping Grouping { get { return typesGrouping; } }
protected override QueryFilter Query { get { return null; } }
}
public class OrganizationViewTags : OrganizationalView
{
private readonly QueryFilter tagsQuery = new ListEmptyQuery(PropertyNames.tags, false);
private readonly Grouping tagsGrouping = new PropertyGrouping(PropertyNames.tags, null);
public override string GroupingName
{
get { return Messages.TAGS; }
}
public override Icons GetGroupIcon(object obj)
{
return Icons.Tag;
}
public override QueryFilter GetSubquery(object parent, object val)
{
return tagsQuery;
}
public override Grouping GetSubgrouping(object val)
{
return tagsGrouping;
}
protected override Grouping Grouping { get { return tagsGrouping; } }
protected override QueryFilter Query { get { return tagsQuery; } }
}
public class OrganizationViewFields : OrganizationalView
{
private readonly QueryFilter fieldsQuery = new BooleanQuery(PropertyNames.has_custom_fields, true);
private readonly Grouping fieldsGrouping = new AllCustomFieldsGrouping((Grouping)null);
public override string GroupingName
{
get { return Messages.CUSTOM_FIELDS; }
}
public override Icons GetGroupIcon(object obj)
{
return Icons.CustomField;
}
public override QueryFilter GetSubquery(object parent, object val)
{
return fieldsQuery;
}
public override Grouping GetSubgrouping(object val)
{
return fieldsGrouping;
}
protected override Grouping Grouping { get { return fieldsGrouping; } }
protected override QueryFilter Query { get { return fieldsQuery; } }
}
public class OrganizationViewFolders : OrganizationalView
{
private readonly QueryFilter foldersQuery = new NullQuery(PropertyNames.folder, false);
private readonly Grouping foldersGrouping = new FolderGrouping((Grouping)null);
public override string GroupingName
{
get { return Messages.FOLDERS; }
}
public override Icons GetGroupIcon(object obj)
{
return Icons.Folder;
}
public override QueryFilter GetSubquery(object parent, object val)
{
return foldersQuery;
}
public override Grouping GetSubgrouping(object val)
{
return foldersGrouping;
}
protected override Grouping Grouping { get { return foldersGrouping; } }
protected override QueryFilter Query { get { return foldersQuery; } }
protected override bool IncludeFolders { get { return true; } }
}
public class OrganizationViewVapps : OrganizationalView
{
private readonly QueryFilter vAppsQuery = new BooleanQuery(PropertyNames.in_any_appliance, true);
private readonly Grouping vAppsGrouping = new XenModelObjectPropertyGrouping(PropertyNames.appliance, null);
public override string GroupingName
{
get { return Messages.VM_APPLIANCES; }
}
public override Icons GetGroupIcon(object obj)
{
return Icons.VmAppliance;
}
public override QueryFilter GetSubquery(object parent, object val)
{
return vAppsQuery;
}
public override Grouping GetSubgrouping(object val)
{
return vAppsGrouping;
}
protected override Grouping Grouping { get { return vAppsGrouping; } }
protected override QueryFilter Query { get { return vAppsQuery; } }
}
}