Utilities.ps1

<#
**************************************************
* Private utility methods
**************************************************
#>


function _AddProperty($Object, $Name, $Value)
{
    Add-Member -InputObject $Object -MemberType NoteProperty -Name $Name -Value $Value;
}

function _HasProperty($Object, $Name)
{
    return Get-Member -InputObject $Object -Name $Name -MemberType NoteProperty;
}

function _NewObjectWithProperties([Hashtable]$Properties)
{
    return New-Object -TypeName PSObject -Property $Properties;
}

function _IsObjectType($Object, $TypeName)
{
    if ($Object)
    {
        return ($Object.GetType().Name -eq $TypeName);
    }

    return $false;
}

function _IsNullUri($Id) 
{
    return (!$Id -or $Id.Trim().ToLowerInvariant() -eq 'tcm:0-0-0')
}

function _IsTcmUri($Id) 
{
    if ($Id)
    {
        $matchesFormat = $Id -match '^tcm:[0-9]*-[0-9]*(-[0-9]*)?(-v[0-9]*)?$';
        $itemType = _GetItemType $Id;
        return $matchesFormat -and ($itemType -ne $null);
    }
    return $false;
}

function _GetIdFromInput($Value)
{
    return _GetPropertyFromInput $Value 'Id';
}

function _GetPropertyFromInput($Value, $PropertyName)
{
    if ($Value -is [ScriptBlock])
    { 
        return $Value.invoke();
    }
    
    if ($Value -is [object])
    {
        if (Get-Member -InputObject $Value -Name $PropertyName)
        {
            return $Value.$PropertyName;
        }
    }
    
    return $Value;
}

function _GetMultipleIdsFromInput($Value)
{
    $result = @();
    foreach($val in @($Value))
    {
        $id = _GetIdFromInput $val;
        if (![string]::IsNullOrWhiteSpace($id))
        { 
            $result += $id;
        }
    }
    return $result;
}

function _GetItemType($Id)
{
    if ($Id)
    {
        $parts = $Id.Split('-');
        switch($parts.Count)
        {
            2 { return 16; }
            3 { return [int]$parts[2] }
            4 { return [int]$parts[2] }
        }
    }
    
    return $null;
}

function _AssertItemType($Id, $ExpectedItemType)
{
    $itemType = _GetItemType $Id;
    if ($itemType -ne $ExpectedItemType)
    {
        throw "Unexpected item type '$itemType'. Expected '$ExpectedItemType'.";
    }
}

function _AssertItemTypeValid($ItemType)
{
    if ($ItemType -le 0 -or ![Enum]::IsDefined([Tridion.ContentManager.CoreService.Client.ItemType], $ItemType))
    {
        throw "Invalid item type: $ItemType";
    }
}

function _GetSystemWideList($Client, $Filter)
{
    return $Client.GetSystemWideList($Filter);
}

function _IsExistingItem($Client, $Id)
{
    return $Client.IsExistingObject($Id);
}

function _GetItem($Client, $Id)
{
    $readOptions = New-Object Tridion.ContentManager.CoreService.Client.ReadOptions;
    $readOptions.LoadFlags = 'WebDavUrls,Expanded,IncludeAllowedActions';
    return $Client.Read($Id, $readOptions);
}

function _GetDefaultData($Client, $ItemType, $Parent, $Name = $null)
{
    if ($Client.GetDefaultData.OverloadDefinitions[0].IndexOf('ReadOptions readOptions') -gt 0)
    {
        $readOptions = New-Object Tridion.ContentManager.CoreService.Client.ReadOptions;
        $result = $Client.GetDefaultData($ItemType, $Parent, $readOptions);
    }
    else
    {
        $result = $Client.GetDefaultData($ItemType, $Parent);
    }
    
    if ($Name -and $result)
    {
        $result.Title = $Name;
    }
    return $result;
}

function _SaveItem($Client, $Item, $IsNew)
{
    if ($Client -eq $null) { throw "Failed to save. Reason: client is null"}
    $readOptions = New-Object Tridion.ContentManager.CoreService.Client.ReadOptions;
    if ($IsNew)
    {
        return $Client.Create($Item, $readOptions);    
    }
    else 
    {
        return $Client.Save($Item, $readOptions);
    }    
}

function _DeleteItem($Client, $Id)
{
    $Client.Delete($Id);
}

function _ExpandPropertiesIfRequested($List, $ExpandProperties)
{
    if ($ExpandProperties -and $List)
    {
        return $List | Get-TridionItem;
    }
    return $List;
}