﻿using DotCMIS.CMISWebServicesReference;
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */
using DotCMIS.Data;
using DotCMIS.Data.Extensions;
using System.Collections.Generic;
using System.Xml;
using DotCMIS.Enums;
using System;
using System.Reflection;
using System.Xml.Serialization;
using System.IO;

namespace DotCMIS.Binding
{
    internal class Converter
    {
        /// <summary>
        /// Converts a repository info.
        /// </summary>
        public static IRepositoryInfo Convert(cmisRepositoryInfoType repositotyInfo)
        {
            if (repositotyInfo == null)
            {
                return null;
            }

            RepositoryInfo result = new RepositoryInfo();
            result.Id = repositotyInfo.repositoryId;
            result.Name = repositotyInfo.repositoryName;
            result.Description = repositotyInfo.repositoryDescription;
            result.VendorName = repositotyInfo.vendorName;
            result.ProductName = repositotyInfo.productName;
            result.ProductVersion = repositotyInfo.productVersion;
            result.RootFolderId = repositotyInfo.rootFolderId;
            result.Capabilities = Convert(repositotyInfo.capabilities);
            result.AclCapabilities = Convert(repositotyInfo.aclCapability);
            result.LatestChangeLogToken = repositotyInfo.latestChangeLogToken;
            result.CmisVersionSupported = repositotyInfo.cmisVersionSupported;
            result.ThinClientUri = repositotyInfo.thinClientURI;
            result.ChangesIncomplete = (repositotyInfo.changesIncompleteSpecified ? (bool?)repositotyInfo.changesIncomplete : null);
            result.ChangesOnType = new List<BaseTypeId?>();
            if (repositotyInfo.changesOnType != null)
            {
                foreach (enumBaseObjectTypeIds baseType in repositotyInfo.changesOnType)
                {
                    result.ChangesOnType.Add((BaseTypeId?)CmisValue.SerializerToCmisEnum(baseType));
                }
            }
            result.PrincipalIdAnonymous = repositotyInfo.principalAnonymous;
            result.PrincipalIdAnyone = repositotyInfo.principalAnyone;

            ConvertExtension(repositotyInfo, result);

            return result;
        }

        /// <summary>
        /// Converts repository capabilities.
        /// </summary>
        public static IRepositoryCapabilities Convert(cmisRepositoryCapabilitiesType capabilities)
        {
            if (capabilities == null)
            {
                return null;
            }

            RepositoryCapabilities result = new RepositoryCapabilities();
            result.ContentStreamUpdatesCapability = (CapabilityContentStreamUpdates)CmisValue.SerializerToCmisEnum(capabilities.capabilityContentStreamUpdatability);
            result.ChangesCapability = (CapabilityChanges)CmisValue.SerializerToCmisEnum(capabilities.capabilityChanges);
            result.RenditionsCapability = (CapabilityRenditions)CmisValue.SerializerToCmisEnum(capabilities.capabilityRenditions);
            result.IsGetDescendantsSupported = capabilities.capabilityGetDescendants;
            result.IsGetFolderTreeSupported = capabilities.capabilityGetFolderTree;
            result.IsMultifilingSupported = capabilities.capabilityMultifiling;
            result.IsUnfilingSupported = capabilities.capabilityUnfiling;
            result.IsVersionSpecificFilingSupported = capabilities.capabilityVersionSpecificFiling;
            result.IsPwcSearchableSupported = capabilities.capabilityPWCSearchable;
            result.IsPwcUpdatableSupported = capabilities.capabilityPWCUpdatable;
            result.IsAllVersionsSearchableSupported = capabilities.capabilityAllVersionsSearchable;
            result.QueryCapability = (CapabilityQuery)CmisValue.SerializerToCmisEnum(capabilities.capabilityQuery);
            result.JoinCapability = (CapabilityJoin)CmisValue.SerializerToCmisEnum(capabilities.capabilityJoin);
            result.AclCapability = (CapabilityAcl)CmisValue.SerializerToCmisEnum(capabilities.capabilityACL);

            ConvertExtension(capabilities, result);

            return result;
        }

        /// <summary>
        /// Converts ACL capabilities.
        /// </summary>
        public static IAclCapabilities Convert(cmisACLCapabilityType capabilities)
        {
            if (capabilities == null)
            {
                return null;
            }

            AclCapabilities result = new AclCapabilities();
            result.SupportedPermissions = (SupportedPermissions)CmisValue.SerializerToCmisEnum(capabilities.supportedPermissions);
            result.AclPropagation = (AclPropagation)CmisValue.SerializerToCmisEnum(capabilities.propagation);
            result.Permissions = new List<IPermissionDefinition>();
            if (capabilities.permissions != null)
            {
                foreach (cmisPermissionDefinition permission in capabilities.permissions)
                {
                    PermissionDefinition permDef = new PermissionDefinition();
                    permDef.Id = permission.permission;
                    permDef.Description = permission.description;
                    result.Permissions.Add(permDef);

                    ConvertExtension(permission, permDef);
                }
            }
            result.PermissionMapping = new Dictionary<string, IPermissionMapping>();
            if (capabilities.mapping != null)
            {
                foreach (cmisPermissionMapping mapping in capabilities.mapping)
                {
                    PermissionMapping permMap = new PermissionMapping();
                    permMap.Key = GetXmlEnumAttributeValue(mapping.key);
                    permMap.Permissions = new List<string>();
                    if (mapping.permission != null)
                    {
                        foreach (string s in mapping.permission)
                        {
                            permMap.Permissions.Add(s);
                        }
                    }

                    result.PermissionMapping[permMap.Key] = permMap;

                    ConvertExtension(mapping, permMap);
                }
            }

            ConvertExtension(capabilities, result);

            return result;
        }

        public static ITypeDefinition Convert(cmisTypeDefinitionType typeDef)
        {
            if (typeDef == null)
            {
                return null;
            }

            AbstractTypeDefinition result = null;
            if (typeDef is cmisTypeDocumentDefinitionType)
            {
                DocumentTypeDefinition docType = new DocumentTypeDefinition();
                cmisTypeDocumentDefinitionType docTypeDef = (cmisTypeDocumentDefinitionType)typeDef;

                docType.IsVersionable = docTypeDef.versionable;
                docType.ContentStreamAllowed = (ContentStreamAllowed)CmisValue.SerializerToCmisEnum(docTypeDef.contentStreamAllowed);

                result = docType;
            }
            else if (typeDef is cmisTypeFolderDefinitionType)
            {
                result = new FolderTypeDefinition();
            }
            else if (typeDef is cmisTypePolicyDefinitionType)
            {
                result = new PolicyTypeDefinition();
            }
            else if (typeDef is cmisTypeRelationshipDefinitionType)
            {
                RelationshipTypeDefinition relType = new RelationshipTypeDefinition();
                cmisTypeRelationshipDefinitionType relTypeDef = (cmisTypeRelationshipDefinitionType)typeDef;

                if (relTypeDef.allowedSourceTypes != null)
                {
                    relType.AllowedSourceTypeIds = new List<string>();
                    foreach (string id in relTypeDef.allowedSourceTypes)
                    {
                        relType.AllowedSourceTypeIds.Add(id);
                    }
                }

                if (relTypeDef.allowedTargetTypes != null)
                {
                    relType.AllowedTargetTypeIds = new List<string>();
                    foreach (string id in relTypeDef.allowedTargetTypes)
                    {
                        relType.AllowedTargetTypeIds.Add(id);
                    }
                }

                result = relType;
            }

            result.Id = typeDef.id;
            result.LocalName = typeDef.localName;
            result.LocalNamespace = typeDef.localNamespace;
            result.DisplayName = typeDef.displayName;
            result.QueryName = typeDef.queryName;
            result.Description = typeDef.description;
            result.BaseTypeId = (BaseTypeId)CmisValue.SerializerToCmisEnum(typeDef.baseId);
            result.ParentTypeId = typeDef.parentId;
            result.IsCreatable = typeDef.creatable;
            result.IsFileable = typeDef.fileable;
            result.IsQueryable = typeDef.queryable;
            result.IsFulltextIndexed = typeDef.fulltextIndexed;
            result.IsIncludedInSupertypeQuery = typeDef.includedInSupertypeQuery;
            result.IsControllablePolicy = typeDef.controllablePolicy;
            result.IsControllableAcl = typeDef.controllableACL;

            if (typeDef.Items != null)
            {
                foreach (cmisPropertyDefinitionType propertyDefinition in typeDef.Items)
                {
                    result.AddPropertyDefinition(Convert(propertyDefinition));
                }
            }

            ConvertExtension(typeDef, result);

            return result;
        }

        public static IPropertyDefinition Convert(cmisPropertyDefinitionType propDef)
        {
            if (propDef == null) { return null; }

            PropertyDefinition result = null;
            if (propDef is cmisPropertyBooleanDefinitionType)
            {
                PropertyBooleanDefinition pd = new PropertyBooleanDefinition();
                cmisPropertyBooleanDefinitionType cpd = (cmisPropertyBooleanDefinitionType)propDef;

                if (cpd.defaultValue != null && cpd.defaultValue.value != null)
                {
                    pd.DefaultValue = new List<bool>();
                    foreach (bool value in cpd.defaultValue.value) { pd.DefaultValue.Add(value); }
                }
                if (cpd.choice != null)
                {
                    pd.Choices = new List<IChoice<bool>>();
                    foreach (cmisChoiceBoolean c in cpd.choice) { pd.Choices.Add(ConvertChoice(c)); }
                }

                result = pd;
            }
            else if (propDef is cmisPropertyDateTimeDefinitionType)
            {
                PropertyDateTimeDefinition pd = new PropertyDateTimeDefinition();
                cmisPropertyDateTimeDefinitionType cpd = (cmisPropertyDateTimeDefinitionType)propDef;

                if (cpd.defaultValue != null && cpd.defaultValue.value != null)
                {
                    pd.DefaultValue = new List<DateTime>();
                    foreach (DateTime value in cpd.defaultValue.value) { pd.DefaultValue.Add(value); }
                }
                if (cpd.choice != null)
                {
                    pd.Choices = new List<IChoice<DateTime>>();
                    foreach (cmisChoiceDateTime c in cpd.choice) { pd.Choices.Add(ConvertChoice(c)); }
                }

                if (cpd.resolutionSpecified)
                {
                    pd.DateTimeResolution = (DateTimeResolution)CmisValue.SerializerToCmisEnum(cpd.resolution);
                }

                result = pd;
            }
            else if (propDef is cmisPropertyDecimalDefinitionType)
            {
                PropertyDecimalDefinition pd = new PropertyDecimalDefinition();
                cmisPropertyDecimalDefinitionType cpd = (cmisPropertyDecimalDefinitionType)propDef;

                if (cpd.defaultValue != null && cpd.defaultValue.value != null)
                {
                    pd.DefaultValue = new List<decimal>();
                    foreach (decimal value in cpd.defaultValue.value) { pd.DefaultValue.Add(value); }
                }
                if (cpd.choice != null)
                {
                    pd.Choices = new List<IChoice<decimal>>();
                    foreach (cmisChoiceDecimal c in cpd.choice) { pd.Choices.Add(ConvertChoice(c)); }
                }

                if (cpd.maxValueSpecified)
                {
                    pd.MaxValue = cpd.maxValue;
                }
                if (cpd.minValueSpecified)
                {
                    pd.MinValue = cpd.minValue;
                }
                if (cpd.precisionSpecified)
                {
                    pd.Precision = (DecimalPrecision)CmisValue.SerializerToCmisEnum(cpd.precision);
                }

                result = pd;
            }
            else if (propDef is cmisPropertyHtmlDefinitionType)
            {
                PropertyHtmlDefinition pd = new PropertyHtmlDefinition();
                cmisPropertyHtmlDefinitionType cpd = (cmisPropertyHtmlDefinitionType)propDef;

                if (cpd.defaultValue != null && cpd.defaultValue.value != null)
                {
                    pd.DefaultValue = new List<string>();
                    foreach (string value in cpd.defaultValue.value) { pd.DefaultValue.Add(value); }
                }
                if (cpd.choice != null)
                {
                    pd.Choices = new List<IChoice<string>>();
                    foreach (cmisChoiceHtml c in cpd.choice) { pd.Choices.Add(ConvertChoice(c)); }
                }

                result = pd;
            }
            else if (propDef is cmisPropertyIdDefinitionType)
            {
                PropertyIdDefinition pd = new PropertyIdDefinition();
                cmisPropertyIdDefinitionType cpd = (cmisPropertyIdDefinitionType)propDef;

                if (cpd.defaultValue != null && cpd.defaultValue.value != null)
                {
                    pd.DefaultValue = new List<string>();
                    foreach (string value in cpd.defaultValue.value) { pd.DefaultValue.Add(value); }
                }
                if (cpd.choice != null)
                {
                    pd.Choices = new List<IChoice<string>>();
                    foreach (cmisChoiceId c in cpd.choice) { pd.Choices.Add(ConvertChoice(c)); }
                }

                result = pd;
            }
            else if (propDef is cmisPropertyIntegerDefinitionType)
            {
                PropertyIntegerDefinition pd = new PropertyIntegerDefinition();
                cmisPropertyIntegerDefinitionType cpd = (cmisPropertyIntegerDefinitionType)propDef;

                if (cpd.defaultValue != null && cpd.defaultValue.value != null)
                {
                    pd.DefaultValue = new List<long>();
                    foreach (string value in cpd.defaultValue.value) { pd.DefaultValue.Add(Int64.Parse(value)); }
                }
                if (cpd.choice != null)
                {
                    pd.Choices = new List<IChoice<long>>();
                    foreach (cmisChoiceInteger c in cpd.choice) { pd.Choices.Add(ConvertChoice(c)); }
                }

                if (cpd.maxValue != null)
                {
                    pd.MaxValue = Int64.Parse(cpd.maxValue);
                }
                if (cpd.minValue != null)
                {
                    pd.MinValue = Int64.Parse(cpd.minValue);
                }

                result = pd;
            }
            else if (propDef is cmisPropertyStringDefinitionType)
            {
                PropertyStringDefinition pd = new PropertyStringDefinition();
                cmisPropertyStringDefinitionType cpd = (cmisPropertyStringDefinitionType)propDef;

                if (cpd.defaultValue != null && cpd.defaultValue.value != null)
                {
                    pd.DefaultValue = new List<string>();
                    foreach (string value in cpd.defaultValue.value) { pd.DefaultValue.Add(value); }
                }
                if (cpd.choice != null)
                {
                    pd.Choices = new List<IChoice<string>>();
                    foreach (cmisChoiceString c in cpd.choice) { pd.Choices.Add(ConvertChoice(c)); }
                }

                if (cpd.maxLength != null)
                {
                    pd.MaxLength = Int64.Parse(cpd.maxLength);
                }

                result = pd;
            }
            else if (propDef is cmisPropertyUriDefinitionType)
            {
                PropertyUriDefinition pd = new PropertyUriDefinition();
                cmisPropertyUriDefinitionType cpd = (cmisPropertyUriDefinitionType)propDef;

                if (cpd.defaultValue != null && cpd.defaultValue.value != null)
                {
                    pd.DefaultValue = new List<string>();
                    foreach (string value in cpd.defaultValue.value) { pd.DefaultValue.Add(value); }
                }
                if (cpd.choice != null)
                {
                    pd.Choices = new List<IChoice<string>>();
                    foreach (cmisChoiceUri c in cpd.choice) { pd.Choices.Add(ConvertChoice(c)); }
                }

                result = pd;
            }

            result.Id = propDef.id;
            result.LocalName = propDef.localName;
            result.LocalNamespace = propDef.localNamespace;
            result.DisplayName = propDef.displayName;
            result.QueryName = propDef.queryName;
            result.Description = propDef.description;
            result.PropertyType = (PropertyType)CmisValue.SerializerToCmisEnum(propDef.propertyType);
            result.Cardinality = (Cardinality)CmisValue.SerializerToCmisEnum(propDef.cardinality);
            result.Updatability = (Updatability)CmisValue.SerializerToCmisEnum(propDef.updatability);
            result.IsInherited = (propDef.inheritedSpecified ? (bool?)propDef.inherited : null);
            result.IsRequired = propDef.required;
            result.IsQueryable = propDef.queryable;
            result.IsOrderable = propDef.orderable;
            result.IsOpenChoice = (propDef.openChoiceSpecified ? (bool?)propDef.openChoice : null);

            ConvertExtension(propDef, result);

            return result;
        }

        private static IChoice<bool> ConvertChoice(cmisChoiceBoolean choice)
        {
            if (choice == null) { return null; }

            Choice<bool> result = new Choice<bool>();
            result.DisplayName = choice.displayName;
            if (choice.value != null)
            {
                result.Value = new List<bool>();
                foreach (bool v in choice.value) { result.Value.Add(v); }
            }
            if (choice.choice != null)
            {
                result.Choices = new List<IChoice<bool>>();
                foreach (cmisChoiceBoolean sc in choice.choice) { result.Choices.Add(ConvertChoice(sc)); }
            }

            return result;
        }

        private static IChoice<DateTime> ConvertChoice(cmisChoiceDateTime choice)
        {
            if (choice == null) { return null; }

            Choice<DateTime> result = new Choice<DateTime>();
            result.DisplayName = choice.displayName;
            if (choice.value != null)
            {
                result.Value = new List<DateTime>();
                foreach (DateTime v in choice.value) { result.Value.Add(v); }
            }
            if (choice.choice != null)
            {
                result.Choices = new List<IChoice<DateTime>>();
                foreach (cmisChoiceDateTime sc in choice.choice) { result.Choices.Add(ConvertChoice(sc)); }
            }

            return result;
        }

        private static IChoice<decimal> ConvertChoice(cmisChoiceDecimal choice)
        {
            if (choice == null) { return null; }

            Choice<decimal> result = new Choice<decimal>();
            result.DisplayName = choice.displayName;
            if (choice.value != null)
            {
                result.Value = new List<decimal>();
                foreach (decimal v in choice.value) { result.Value.Add(v); }
            }
            if (choice.choice != null)
            {
                result.Choices = new List<IChoice<decimal>>();
                foreach (cmisChoiceDecimal sc in choice.choice) { result.Choices.Add(ConvertChoice(sc)); }
            }

            return result;
        }

        private static IChoice<string> ConvertChoice(cmisChoiceHtml choice)
        {
            if (choice == null) { return null; }

            Choice<string> result = new Choice<string>();
            result.DisplayName = choice.displayName;
            if (choice.value != null)
            {
                result.Value = new List<string>();
                foreach (string v in choice.value) { result.Value.Add(v); }
            }
            if (choice.choice != null)
            {
                result.Choices = new List<IChoice<string>>();
                foreach (cmisChoiceHtml sc in choice.choice) { result.Choices.Add(ConvertChoice(sc)); }
            }

            return result;
        }

        private static IChoice<string> ConvertChoice(cmisChoiceId choice)
        {
            if (choice == null) { return null; }

            Choice<string> result = new Choice<string>();
            result.DisplayName = choice.displayName;
            if (choice.value != null)
            {
                result.Value = new List<string>();
                foreach (string v in choice.value) { result.Value.Add(v); }
            }
            if (choice.choice != null)
            {
                result.Choices = new List<IChoice<string>>();
                foreach (cmisChoiceId sc in choice.choice) { result.Choices.Add(ConvertChoice(sc)); }
            }

            return result;
        }

        private static IChoice<long> ConvertChoice(cmisChoiceInteger choice)
        {
            if (choice == null) { return null; }

            Choice<long> result = new Choice<long>();
            result.DisplayName = choice.displayName;
            if (choice.value != null)
            {
                result.Value = new List<long>();
                foreach (string v in choice.value) { result.Value.Add(Int64.Parse(v)); }
            }
            if (choice.choice != null)
            {
                result.Choices = new List<IChoice<long>>();
                foreach (cmisChoiceInteger sc in choice.choice) { result.Choices.Add(ConvertChoice(sc)); }
            }

            return result;
        }

        private static IChoice<string> ConvertChoice(cmisChoiceString choice)
        {
            if (choice == null) { return null; }

            Choice<string> result = new Choice<string>();
            result.DisplayName = choice.displayName;
            if (choice.value != null)
            {
                result.Value = new List<string>();
                foreach (string v in choice.value) { result.Value.Add(v); }
            }
            if (choice.choice != null)
            {
                result.Choices = new List<IChoice<string>>();
                foreach (cmisChoiceString sc in choice.choice) { result.Choices.Add(ConvertChoice(sc)); }
            }

            return result;
        }

        private static IChoice<string> ConvertChoice(cmisChoiceUri choice)
        {
            if (choice == null) { return null; }

            Choice<string> result = new Choice<string>();
            result.DisplayName = choice.displayName;
            if (choice.value != null)
            {
                result.Value = new List<string>();
                foreach (string v in choice.value) { result.Value.Add(v); }
            }
            if (choice.choice != null)
            {
                result.Choices = new List<IChoice<string>>();
                foreach (cmisChoiceUri sc in choice.choice) { result.Choices.Add(ConvertChoice(sc)); }
            }

            return result;
        }


        /// <summary>
        /// Converts a type defintion list.
        /// </summary> 
        public static ITypeDefinitionList Convert(cmisTypeDefinitionListType typeDefList)
        {
            if (typeDefList == null) { return null; }

            TypeDefinitionList result = new TypeDefinitionList();

            if (typeDefList.types != null)
            {
                result.List = new List<ITypeDefinition>();
                foreach (cmisTypeDefinitionType type in typeDefList.types)
                {
                    result.List.Add(Convert(type));
                }
            }

            result.HasMoreItems = typeDefList.hasMoreItems;
            result.NumItems = Int64.Parse(typeDefList.numItems);

            ConvertExtension(typeDefList, result);

            return result;
        }

        /// <summary>
        /// Converts a type defintion container.
        /// </summary> 
        public static ITypeDefinitionContainer Convert(cmisTypeContainer typeDefCont)
        {
            if (typeDefCont == null) { return null; }

            TypeDefinitionContainer result = new TypeDefinitionContainer();
            result.TypeDefinition = Convert(typeDefCont.type);
            if (typeDefCont.children != null)
            {
                result.Children = new List<ITypeDefinitionContainer>();
                foreach (cmisTypeContainer container in typeDefCont.children)
                {
                    result.Children.Add(Convert(container));
                }
            }

            ConvertExtension(typeDefCont, result);

            return result;
        }

        public static IObjectData Convert(cmisObjectType cmisObject)
        {
            if (cmisObject == null) { return null; }

            ObjectData result = new ObjectData();
            result.Properties = Convert(cmisObject.properties);
            result.AllowableActions = Convert(cmisObject.allowableActions);
            if (cmisObject.relationship != null)
            {
                result.Relationships = new List<IObjectData>();
                foreach (cmisObjectType co in cmisObject.relationship)
                {
                    result.Relationships.Add(Convert(co));
                }
            }
            result.ChangeEventInfo = Convert(cmisObject.changeEventInfo);
            result.IsExactAcl = cmisObject.exactACLSpecified ? (bool?)cmisObject.exactACL : null;
            result.Acl = Convert(cmisObject.acl, result.IsExactAcl);
            result.PolicyIds = Convert(cmisObject.policyIds);
            if (cmisObject.rendition != null)
            {
                result.Renditions = new List<IRenditionData>();
                foreach (cmisRenditionType rendition in cmisObject.rendition)
                {
                    result.Renditions.Add(Convert(rendition));
                }
            }

            ConvertExtension(cmisObject, result);

            return result;
        }

        public static IProperties Convert(cmisPropertiesType properties)
        {
            if (properties == null) { return null; }

            Properties result = new Properties();
            if (properties.Items != null)
            {
                foreach (cmisProperty property in properties.Items)
                {
                    result.AddProperty(Convert(property));
                }
            }

            ConvertExtension(properties, result);

            return result;
        }
        public static IPropertyData Convert(cmisProperty property)
        {
            if (property == null) { return null; }

            PropertyData result = null;
            if (property is cmisPropertyString)
            {
                result = new PropertyData(PropertyType.String);
                if (((cmisPropertyString)property).value != null)
                {
                    foreach (string value in ((cmisPropertyString)property).value)
                    {
                        result.AddValue(value);
                    }
                }
            }
            else if (property is cmisPropertyId)
            {
                result = new PropertyData(PropertyType.Id);
                if (((cmisPropertyId)property).value != null)
                {
                    foreach (string value in ((cmisPropertyId)property).value)
                    {
                        result.AddValue(value);
                    }
                }
            }
            else if (property is cmisPropertyInteger)
            {
                result = new PropertyData(PropertyType.Integer);
                if (((cmisPropertyInteger)property).value != null)
                {
                    foreach (string value in ((cmisPropertyInteger)property).value)
                    {
                        result.AddValue(Int64.Parse(value));
                    }
                }
            }
            else if (property is cmisPropertyBoolean)
            {
                result = new PropertyData(PropertyType.Boolean);
                if (((cmisPropertyBoolean)property).value != null)
                {
                    foreach (bool value in ((cmisPropertyBoolean)property).value)
                    {
                        result.AddValue(value);
                    }
                }
            }
            else if (property is cmisPropertyDateTime)
            {
                result = new PropertyData(PropertyType.DateTime);
                if (((cmisPropertyDateTime)property).value != null)
                {
                    foreach (DateTime value in ((cmisPropertyDateTime)property).value)
                    {
                        result.AddValue(value);
                    }
                }
            }
            else if (property is cmisPropertyDecimal)
            {
                result = new PropertyData(PropertyType.Decimal);
                if (((cmisPropertyDecimal)property).value != null)
                {
                    foreach (decimal value in ((cmisPropertyDecimal)property).value)
                    {
                        result.AddValue(value);
                    }
                }
            }
            else if (property is cmisPropertyHtml)
            {
                result = new PropertyData(PropertyType.Html);
                if (((cmisPropertyHtml)property).value != null)
                {
                    foreach (string value in ((cmisPropertyHtml)property).value)
                    {
                        result.AddValue(value);
                    }
                }
            }
            else if (property is cmisPropertyUri)
            {
                result = new PropertyData(PropertyType.Uri);
                if (((cmisPropertyUri)property).value != null)
                {
                    foreach (string value in ((cmisPropertyUri)property).value)
                    {
                        result.AddValue(value);
                    }
                }
            }

            result.Id = property.propertyDefinitionId;
            result.LocalName = property.localName;
            result.DisplayName = property.displayName;
            result.QueryName = property.queryName;

            ConvertExtension(property, result);

            return result;
        }


        public static cmisPropertiesType Convert(IProperties properties)
        {
            if (properties == null) { return null; }

            cmisPropertiesType result = new cmisPropertiesType();
            if (properties.PropertyList != null)
            {
                result.Items = new cmisProperty[properties.PropertyList.Count];
                for (int i = 0; i < properties.PropertyList.Count; i++)
                {
                    result.Items[i] = Convert(properties.PropertyList[i]);
                }
            }

            ConvertExtension(properties, result);

            return result;
        }

        public static cmisProperty Convert(IPropertyData property)
        {
            if (property == null) { return null; }

            cmisProperty result = null;

            switch (property.PropertyType)
            {
                case PropertyType.String:
                    result = new cmisPropertyString();
                    if (property.Values != null)
                    {
                        ((cmisPropertyString)result).value = new string[property.Values.Count];
                        for (int i = 0; i < property.Values.Count; i++)
                        {
                            ((cmisPropertyString)result).value[i] = property.Values[i] as string;
                        }
                    }
                    break;
                case PropertyType.Id:
                    result = new cmisPropertyId();
                    if (property.Values != null)
                    {
                        ((cmisPropertyId)result).value = new string[property.Values.Count];
                        for (int i = 0; i < property.Values.Count; i++)
                        {
                            ((cmisPropertyId)result).value[i] = property.Values[i] as string;
                        }
                    }
                    break;
                case PropertyType.Integer:
                    result = new cmisPropertyInteger();
                    if (property.Values != null)
                    {
                        ((cmisPropertyInteger)result).value = new string[property.Values.Count];
                        for (int i = 0; i < property.Values.Count; i++)
                        {
                            long? value = property.Values[i] as long?;
                            if (value.HasValue)
                            {
                                ((cmisPropertyInteger)result).value[i] = value.ToString();
                            }
                        }
                    }
                    break;
                case PropertyType.Boolean:
                    result = new cmisPropertyBoolean();
                    if (property.Values != null)
                    {
                        ((cmisPropertyBoolean)result).value = new bool[property.Values.Count];
                        for (int i = 0; i < property.Values.Count; i++)
                        {
                            bool? value = property.Values[i] as bool?;
                            if (value.HasValue)
                            {
                                ((cmisPropertyBoolean)result).value[i] = value.Value;
                            }
                        }
                    }
                    break;
                case PropertyType.DateTime:
                    result = new cmisPropertyDateTime();
                    if (property.Values != null)
                    {
                        ((cmisPropertyDateTime)result).value = new DateTime[property.Values.Count];
                        for (int i = 0; i < property.Values.Count; i++)
                        {
                            DateTime? value = property.Values[i] as DateTime?;
                            if (value.HasValue)
                            {
                                ((cmisPropertyDateTime)result).value[i] = value.Value;
                            }
                        }
                    }
                    break;
                case PropertyType.Decimal:
                    result = new cmisPropertyDecimal();
                    if (property.Values != null)
                    {
                        ((cmisPropertyDecimal)result).value = new decimal[property.Values.Count];
                        for (int i = 0; i < property.Values.Count; i++)
                        {
                            decimal? value = property.Values[i] as decimal?;
                            if (value.HasValue)
                            {
                                ((cmisPropertyDecimal)result).value[i] = value.Value;
                            }
                        }
                    }
                    break;
                case PropertyType.Html:
                    result = new cmisPropertyHtml();
                    if (property.Values != null)
                    {
                        ((cmisPropertyHtml)result).value = new string[property.Values.Count];
                        for (int i = 0; i < property.Values.Count; i++)
                        {
                            ((cmisPropertyHtml)result).value[i] = property.Values[i] as string;
                        }
                    }
                    break;
                case PropertyType.Uri:
                    result = new cmisPropertyUri();
                    if (property.Values != null)
                    {
                        ((cmisPropertyUri)result).value = new string[property.Values.Count];
                        for (int i = 0; i < property.Values.Count; i++)
                        {
                            ((cmisPropertyUri)result).value[i] = property.Values[i] as string;
                        }
                    }
                    break;
            }

            result.propertyDefinitionId = property.Id;
            result.localName = property.LocalName;
            result.displayName = property.DisplayName;
            result.queryName = property.QueryName;

            ConvertExtension(property, result);

            return result;
        }

        public static IAllowableActions Convert(cmisAllowableActionsType allowableActions)
        {
            if (allowableActions == null) { return null; }

            AllowableActions result = new AllowableActions();
            result.Actions = new HashSet<string>();

            if (allowableActions.canDeleteObject && allowableActions.canDeleteObjectSpecified)
            { result.Actions.Add(Actions.CanDeleteObject); }

            if (allowableActions.canUpdateProperties && allowableActions.canUpdatePropertiesSpecified)
            { result.Actions.Add(Actions.CanUpdateProperties); }

            if (allowableActions.canGetFolderTree && allowableActions.canGetFolderTreeSpecified)
            { result.Actions.Add(Actions.CanGetFolderTree); }

            if (allowableActions.canGetProperties && allowableActions.canGetPropertiesSpecified)
            { result.Actions.Add(Actions.CanGetProperties); }

            if (allowableActions.canGetObjectRelationships && allowableActions.canGetObjectRelationshipsSpecified)
            { result.Actions.Add(Actions.CanGetObjectRelationships); }

            if (allowableActions.canGetObjectParents && allowableActions.canGetObjectParentsSpecified)
            { result.Actions.Add(Actions.CanGetObjectParents); }

            if (allowableActions.canGetFolderParent && allowableActions.canGetFolderParentSpecified)
            { result.Actions.Add(Actions.CanGetFolderParent); }

            if (allowableActions.canGetDescendants && allowableActions.canGetDescendantsSpecified)
            { result.Actions.Add(Actions.CanGetDescendants); }

            if (allowableActions.canMoveObject && allowableActions.canMoveObjectSpecified)
            { result.Actions.Add(Actions.CanMoveObject); }

            if (allowableActions.canDeleteContentStream && allowableActions.canDeleteContentStreamSpecified)
            { result.Actions.Add(Actions.CanDeleteContentStream); }

            if (allowableActions.canCheckOut && allowableActions.canCheckOutSpecified)
            { result.Actions.Add(Actions.CanCheckOut); }

            if (allowableActions.canCancelCheckOut && allowableActions.canCancelCheckOutSpecified)
            { result.Actions.Add(Actions.CanCancelCheckOut); }

            if (allowableActions.canCheckIn && allowableActions.canCheckInSpecified)
            { result.Actions.Add(Actions.CanCheckIn); }

            if (allowableActions.canSetContentStream && allowableActions.canSetContentStreamSpecified)
            { result.Actions.Add(Actions.CanSetContentStream); }

            if (allowableActions.canGetAllVersions && allowableActions.canGetAllVersionsSpecified)
            { result.Actions.Add(Actions.CanGetAllVersions); }

            if (allowableActions.canAddObjectToFolder && allowableActions.canAddObjectToFolderSpecified)
            { result.Actions.Add(Actions.CanAddObjectToFolder); }

            if (allowableActions.canRemoveObjectFromFolder && allowableActions.canRemoveObjectFromFolderSpecified)
            { result.Actions.Add(Actions.CanRemoveObjectFromFolder); }

            if (allowableActions.canGetContentStream && allowableActions.canGetContentStreamSpecified)
            { result.Actions.Add(Actions.CanGetContentStream); }

            if (allowableActions.canApplyPolicy && allowableActions.canApplyPolicySpecified)
            { result.Actions.Add(Actions.CanApplyPolicy); }

            if (allowableActions.canGetAppliedPolicies && allowableActions.canGetAppliedPoliciesSpecified)
            { result.Actions.Add(Actions.CanGetAppliedPolicies); }

            if (allowableActions.canRemovePolicy && allowableActions.canRemovePolicySpecified)
            { result.Actions.Add(Actions.CanRemovePolicy); }

            if (allowableActions.canGetChildren && allowableActions.canGetChildrenSpecified)
            { result.Actions.Add(Actions.CanGetChildren); }

            if (allowableActions.canCreateDocument && allowableActions.canCreateDocumentSpecified)
            { result.Actions.Add(Actions.CanCreateDocument); }

            if (allowableActions.canCreateFolder && allowableActions.canCreateFolderSpecified)
            { result.Actions.Add(Actions.CanCreateFolder); }

            if (allowableActions.canCreateRelationship && allowableActions.canCreateRelationshipSpecified)
            { result.Actions.Add(Actions.CanCreateRelationship); }

            if (allowableActions.canDeleteTree && allowableActions.canDeleteTreeSpecified)
            { result.Actions.Add(Actions.CanDeleteTree); }

            if (allowableActions.canGetRenditions && allowableActions.canGetRenditionsSpecified)
            { result.Actions.Add(Actions.CanGetRenditions); }

            if (allowableActions.canGetACL && allowableActions.canGetACLSpecified)
            { result.Actions.Add(Actions.CanGetAcl); }

            if (allowableActions.canApplyACL && allowableActions.canApplyACLSpecified)
            { result.Actions.Add(Actions.CanApplyAcl); }

            ConvertExtension(allowableActions, result);

            return result;
        }

        public static IAcl Convert(cmisAccessControlListType acl, bool? isExact)
        {
            if (acl == null) { return null; }

            Acl result = new Acl();
            if (acl.permission != null)
            {
                result.Aces = new List<IAce>();
                foreach (cmisAccessControlEntryType ace in acl.permission)
                {
                    result.Aces.Add(Convert(ace));
                }
            }
            result.IsExact = isExact;

            ConvertExtension(acl, result);

            return result;
        }


        public static IAcl Convert(cmisACLType acl)
        {
            if (acl == null) { return null; }

            Acl result = new Acl();
            if (acl.ACL != null && acl.ACL.permission != null)
            {
                result.Aces = new List<IAce>();
                foreach (cmisAccessControlEntryType ace in acl.ACL.permission)
                {
                    result.Aces.Add(Convert(ace));
                }
            }
            result.IsExact = (acl.exactSpecified ? (bool?)acl.exactSpecified : null);

            ConvertExtension(acl, result);

            return result;
        }


        public static IAce Convert(cmisAccessControlEntryType ace)
        {
            if (ace == null) { return null; }

            Ace result = new Ace();
            if (ace.principal != null)
            {
                Principal principal = new Principal();
                principal.Id = ace.principal.principalId;
                result.Principal = principal;

                ConvertExtension(ace.principal, principal);
            }
            if (ace.permission != null)
            {
                result.Permissions = new List<string>();
                foreach (string permission in ace.permission)
                {
                    result.Permissions.Add(permission);
                }
            }
            result.IsDirect = ace.direct;

            ConvertExtension(ace, result);

            return result;
        }

        public static cmisAccessControlListType Convert(IAcl acl)
        {
            if (acl == null) { return null; }

            cmisAccessControlListType result = new cmisAccessControlListType();
            if (acl.Aces != null)
            {
                result.permission = new cmisAccessControlEntryType[acl.Aces.Count];
                for (int i = 0; i < acl.Aces.Count; i++)
                {
                    result.permission[i] = Convert(acl.Aces[i]);
                }
            }

            ConvertExtension(acl, result);

            return result;
        }

        public static cmisAccessControlEntryType Convert(IAce ace)
        {
            if (ace == null) { return null; }

            cmisAccessControlEntryType result = new cmisAccessControlEntryType();
            if (ace.Principal != null)
            {
                result.principal = new cmisAccessControlPrincipalType();
                result.principal.principalId = ace.Principal.Id;

                ConvertExtension(ace.Principal, result.principal);
            }
            if (ace.Permissions != null)
            {
                result.permission = new string[ace.Permissions.Count];
                for (int i = 0; i < ace.Permissions.Count; i++)
                {
                    result.permission[i] = ace.Permissions[i];
                }
            }
            result.direct = ace.IsDirect;

            ConvertExtension(ace, result);

            return result;
        }


        public static IPolicyIdList Convert(cmisListOfIdsType policyIdList)
        {
            if (policyIdList == null) { return null; }

            PolicyIdList result = new PolicyIdList();
            if (policyIdList.id != null)
            {
                result.PolicyIds = new List<string>();
                foreach (string id in policyIdList.id)
                {
                    result.PolicyIds.Add(id);
                }
            }

            ConvertExtension(policyIdList, result);

            return result;
        }

        public static cmisListOfIdsType ConvertPolicies(IList<string> policyIds)
        {
            if (policyIds == null) { return null; }

            cmisListOfIdsType result = new cmisListOfIdsType();
            result.id = new string[policyIds.Count];
            for (int i = 0; i < policyIds.Count; i++)
            {
                result.id[i] = policyIds[i];
            }

            return result;
        }


        public static IRenditionData Convert(cmisRenditionType rendition)
        {
            if (rendition == null) { return null; }

            RenditionData result = new RenditionData();
            result.StreamId = rendition.streamId;
            result.MimeType = rendition.mimetype;
            result.Length = Int64.Parse(rendition.length);
            result.Kind = rendition.kind;
            result.Title = rendition.title;
            result.Height = Int64.Parse(rendition.height);
            result.Width = Int64.Parse(rendition.width);
            result.RenditionDocumentId = rendition.renditionDocumentId;

            ConvertExtension(rendition, result);

            return result;
        }

        public static IChangeEventInfo Convert(cmisChangeEventType changeEvent)
        {
            if (changeEvent == null) { return null; }

            ChangeEventInfo result = new ChangeEventInfo();
            result.ChangeType = (ChangeType)CmisValue.SerializerToCmisEnum(changeEvent.changeType);
            result.ChangeTime = changeEvent.changeTime;

            ConvertExtension(changeEvent, result);

            return result;
        }

        public static IObjectInFolderList Convert(cmisObjectInFolderListType list)
        {
            if (list == null) { return null; }

            ObjectInFolderList result = new ObjectInFolderList();
            if (list.objects != null)
            {
                result.Objects = new List<IObjectInFolderData>();
                foreach (cmisObjectInFolderType fo in list.objects)
                {
                    result.Objects.Add(Convert(fo));
                }
            }
            result.HasMoreItems = list.hasMoreItems;
            if (list.numItems != null)
            {
                result.NumItems = Int64.Parse(list.numItems);
            }

            ConvertExtension(list, result);

            return result;
        }


        public static IObjectInFolderData Convert(cmisObjectInFolderType objectInFolder)
        {
            if (objectInFolder == null) { return null; }

            ObjectInFolderData result = new ObjectInFolderData();
            result.Object = Convert(objectInFolder.@object);
            result.PathSegment = objectInFolder.pathSegment;

            ConvertExtension(objectInFolder, result);

            return result;
        }

        public static IObjectInFolderContainer Convert(cmisObjectInFolderContainerType container)
        {
            if (container == null) { return null; }

            ObjectInFolderContainer result = new ObjectInFolderContainer();
            result.Object = Convert(container.objectInFolder);
            if (container.children != null)
            {
                result.Children = new List<IObjectInFolderContainer>();
                foreach (cmisObjectInFolderContainerType child in container.children)
                {
                    result.Children.Add(Convert(child));
                }
            }

            ConvertExtension(container, result);

            return result;
        }

        public static IObjectParentData Convert(cmisObjectParentsType parent)
        {
            if (parent == null) { return null; }

            ObjectParentData result = new ObjectParentData();
            result.Object = Convert(parent.@object);
            result.RelativePathSegment = parent.relativePathSegment;

            ConvertExtension(parent, result);

            return result;
        }

        public static IObjectList Convert(cmisObjectListType list)
        {
            if (list == null) { return null; }

            ObjectList result = new ObjectList();
            if (list.objects != null)
            {
                result.Objects = new List<IObjectData>();
                foreach (cmisObjectType obj in list.objects)
                {
                    result.Objects.Add(Convert(obj));
                }
            }

            result.HasMoreItems = list.hasMoreItems;
            result.NumItems = Int64.Parse(list.numItems);

            ConvertExtension(list, result);

            return result;
        }

        public static IContentStream Convert(cmisContentStreamType contentStream)
        {
            if (contentStream == null) { return null; }

            ContentStream result = new ContentStream();
            if (contentStream.length != null)
            {
                result.Length = Int64.Parse(contentStream.length);
            }
            result.MimeType = contentStream.mimeType;
            result.FileName = contentStream.filename;
            // Todo: enable real streaming
            result.Stream = new MemoryStream(contentStream.stream);

            ConvertExtension(contentStream, result);

            return result;
        }

        public static cmisContentStreamType Convert(IContentStream contentStream)
        {
            if (contentStream == null) { return null; }

            cmisContentStreamType result = new cmisContentStreamType();
            result.length = contentStream.Length.ToString();
            result.mimeType = contentStream.MimeType;
            result.filename = contentStream.FileName;
            if (contentStream.Stream != null)
            {
                if (contentStream.Stream is MemoryStream)
                {
                    result.stream = ((MemoryStream)contentStream.Stream).ToArray();
                }
                else
                {
                    MemoryStream memStream = new MemoryStream();
                    byte[] buffer = new byte[4096];
                    int bytes;
                    while ((bytes = contentStream.Stream.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        memStream.Write(buffer, 0, bytes);
                    }
                    result.stream = memStream.ToArray();
                }
            }

            return result;
        }

        public static IFailedToDeleteData Convert(deleteTreeResponseFailedToDelete failedToDelete)
        {
            if (failedToDelete == null) { return null; }

            FailedToDeleteData result = new FailedToDeleteData();
            if (failedToDelete.objectIds != null)
            {
                result.Ids = new List<string>();
                foreach (string id in failedToDelete.objectIds)
                {
                    result.Ids.Add(id);
                }
            }

            ConvertExtension(failedToDelete, result);

            return result;
        }

        public static T[] ConvertList<T>(IList<T> list)
        {
            if (list == null) { return null; }

            T[] result = new T[list.Count];
            for (int i = 0; i < list.Count; i++)
            {
                result[i] = list[i];
            }

            return result;
        }

        /// <summary>
        /// Converts an extension.
        /// </summary> 
        public static void ConvertExtension(object source, IExtensionsData target)
        {
            if (source == null || target == null) { return; }

            Type type = source.GetType();
            PropertyInfo propInfo = type.GetProperty("Any");
            if (propInfo == null)
            {
                return;
            }

            XmlElement[] elements = (XmlElement[])propInfo.GetValue(source, null);
            if (elements == null)
            {
                return;
            }

            target.Extensions = new List<ICmisExtensionElement>();
            foreach (XmlElement xmlElement in elements)
            {
                ICmisExtensionElement element = CreateCmisExtensionElement(xmlElement);
                if (element != null)
                {
                    target.Extensions.Add(element);
                }
            }
        }

        private static ICmisExtensionElement CreateCmisExtensionElement(XmlNode xmlElement)
        {
            CmisExtensionElement result = new CmisExtensionElement();
            result.Name = xmlElement.Name;
            result.Namespace = xmlElement.NamespaceURI;

            if (xmlElement.Attributes != null && xmlElement.Attributes.Count > 0)
            {
                result.Attributes = new Dictionary<string, string>();
                foreach (XmlAttribute attr in xmlElement.Attributes)
                {
                    result.Attributes[attr.Name] = attr.Value;
                }
            }

            if (xmlElement.HasChildNodes)
            {
                result.Children = new List<ICmisExtensionElement>();
                foreach (XmlNode node in xmlElement.ChildNodes)
                {
                    ICmisExtensionElement element = CreateCmisExtensionElement(node);
                    if (element != null)
                    {
                        result.Children.Add(element);
                    }
                }
            }
            else
            {
                result.Value = xmlElement.Value;
            }

            return result;
        }

        /// <summary>
        /// Converts an extension.
        /// </summary>
        public static cmisExtensionType ConvertExtension(IExtensionsData extension)
        {
            if (extension == null || extension.Extensions == null) { return null; }

            XmlDocument doc = new XmlDocument();

            List<XmlElement> elements = new List<XmlElement>();
            foreach (ICmisExtensionElement element in extension.Extensions)
            {
                if (element == null) { continue; }
                elements.Add(CreateXmlElement(doc, element));
            }

            cmisExtensionType result = new cmisExtensionType();
            result.Any = elements.ToArray();

            return result;
        }

        public static void ConvertExtension(IExtensionsData source, object target)
        {
            if (source == null || source.Extensions == null || target == null)
            {
                return;
            }

            Type type = target.GetType();
            PropertyInfo propInfo = type.GetProperty("Any");
            if (propInfo == null)
            {
                return;
            }

            XmlDocument doc = new XmlDocument();

            List<XmlElement> elements = new List<XmlElement>();
            foreach (ICmisExtensionElement element in source.Extensions)
            {
                if (element == null) { continue; }
                elements.Add(CreateXmlElement(doc, element));
            }

            propInfo.SetValue(target, elements.ToArray(), null);
        }

        private static XmlElement CreateXmlElement(XmlDocument doc, ICmisExtensionElement element)
        {
            if (element == null)
            {
                return null;
            }

            XmlElement result = doc.CreateElement(element.Name, element.Namespace);

            if (element.Attributes != null)
            {
                foreach (string key in element.Attributes.Keys)
                {
                    XmlAttribute attr = doc.CreateAttribute(key);
                    attr.Value = element.Attributes[key];
                    result.Attributes.Append(attr);
                }
            }

            if (element.Value != null)
            {
                result.Value = element.Value;
            }
            else if (element.Children != null)
            {
                List<XmlElement> children = new List<XmlElement>();
                foreach (ICmisExtensionElement child in element.Children)
                {
                    XmlElement xml = CreateXmlElement(doc, child);
                    if (xml != null)
                    {
                        result.AppendChild(xml);
                    }
                }
            }

            return result;
        }

        public static string GetXmlEnumAttributeValue(Enum xsdEnum)
        {
            FieldInfo fieldInfo = xsdEnum.GetType().GetField(xsdEnum.ToString());
            XmlEnumAttribute[] xmlAttr = fieldInfo.GetCustomAttributes(typeof(XmlEnumAttribute), false) as XmlEnumAttribute[];

            if (xmlAttr.Length == 0)
            {
                return null;
            }

            return xmlAttr[0].Name;
        }
    }
}
