/*
* Copyright 2012 Splunk, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"): you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
namespace Splunk
{
using System;
using System.Collections.Generic;
///
/// Represents the Entity Collection class.
///
/// The Generic parameter that matches The Entity class,
/// or any class derived from Entity.
public class EntityCollection : ResourceCollection where T : Entity
{
///
/// Initializes a new instance of the
/// class.
///
/// The service
/// The endpoint for this collection
public EntityCollection(Service service, string path)
: base(service, path, typeof(Entity))
{
}
///
/// Initializes a new instance of the
/// class.
///
/// The service
/// The endpoint for this collection
/// The variable argument list
public EntityCollection(Service service, string path, Args args)
: base(service, path, args, typeof(Entity))
{
}
///
/// Initializes a new instance of the
/// class.
///
/// The service
/// The endpoint for this collection
/// The type of this Entity
public EntityCollection(Service service, string path, Type itemClass)
: base(service, path, itemClass)
{
}
///
/// Initializes a new instance of the
/// class.
///
/// The service
/// The endpoint for this collection
/// The variable argument list
/// The type of this Entity
public EntityCollection(
Service service, string path, Args args, Type itemClass)
: base(service, path, args, itemClass)
{
}
///
/// Creates an Entity in this collection.
///
/// The name of this Entity
/// The Entity
public virtual T Create(string name)
{
return this.Create(name, (Args)null);
}
///
/// Creates an Entity in this collection.
///
/// The name of this Entity
/// The variable argument list
/// The Entity
public virtual T Create(string name, Args args)
{
args = Args.Create(args);
args.Add("name", name);
this.Service.Post(this.Path, args);
this.Invalidate();
return this.Get(name);
}
///
/// Removes an entity from this collection. Note that this method can
/// throw the SplunkException "AMBIGUOUS" if the collection contains
/// more than one entity with the specified key. Disambiguation is done
/// through the similar method Remove(object key, Dictionary namespace)
/// which uses the namespace to perform the disambiguation.
///
/// The name of this Entity
/// The removed Entity
public virtual T Remove(string key)
{
this.Validate();
if (!this.ContainsKey(key))
{
return default(T);
}
List entities = this.Items[key];
if (entities != null && entities.Count > 1)
{
throw new SplunkException(
SplunkException.AMBIGUOUS,
"Key has multiple values, specify a namespace");
}
if (entities == null)
{
return default(T);
}
T entity = entities[0];
entity.Remove();
this.Invalidate();
return entity;
}
///
/// Removes an entity from this collection, with a namespace
/// restriction.
///
/// The name of this Entity
/// The namespace
/// The removed Entity
public virtual T Remove(string key, Args splunkNamespace)
{
this.Validate();
if (!this.ContainsKey(key))
{
return default(T);
}
List entities = Items[key];
string pathMatcher =
Service.Fullpath(string.Empty, splunkNamespace);
if (entities.Count == 0)
{
return default(T);
}
foreach (T entity in entities)
{
if (entity.Path.StartsWith(pathMatcher))
{
entity.Remove();
this.Invalidate();
return entity;
}
}
return default(T);
}
}
}