1a48aae2创建于 2019年4月18日历史提交
/*----------------------------------------------------------------------------------

// Copyright 2019 Huawei Technologies Co.,Ltd.

// 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.

//----------------------------------------------------------------------------------*/

using System;

using System.Collections.Generic;

using System.Text;

using System.IO;

using System.Xml;

using OBS.Model;



namespace OBS.Internal

{

    internal class ObsConvertor : V2Convertor

    {



        protected ObsConvertor(IHeaders iheaders) : base(iheaders)

        {



        }



        public new static IConvertor GetInstance(IHeaders iheaders)

        {

            return new ObsConvertor(iheaders);

        }



        protected override string TransStorageClass(StorageClassEnum storageClass)

        {

            return storageClass.ToString().ToUpper();

        }



        protected override string TransEventType(EventTypeEnum eventType)

        {

            return EnumAdaptor.GetStringValue(eventType);

        }



        protected override string TransDestinationBucket(string bucketName)

        {

            return bucketName;

        }



        protected override string TransBucketCannedAcl(CannedAclEnum cannedAcl)

        {

            return EnumAdaptor.GetStringValue(cannedAcl);

        }



        protected override string TransSseKmsAlgorithm(SseKmsAlgorithmEnum algorithm)

        {

            return EnumAdaptor.GetStringValue(algorithm);

        }



        protected override string TransObjectCannedAcl(CannedAclEnum cannedAcl)

        {

            if (cannedAcl == CannedAclEnum.PublicReadDelivered)

            {

                cannedAcl = CannedAclEnum.PublicRead;

            }

            else if (cannedAcl == CannedAclEnum.PublicReadWriteDelivered)

            {

                cannedAcl = CannedAclEnum.PublicReadWrite;

            }

            return EnumAdaptor.GetStringValue(cannedAcl);

        }



        protected override string BucketLocationTag

        {

            get

            {

                return "Location";

            }

        }





        protected override string FilterContainerTag

        {

            get

            {

                return "Object";

            }

        }



        protected override string BucketStoragePolicyParam

        {

            get

            {

                return EnumAdaptor.GetStringValue(SubResourceEnum.StorageClass);

            }

        }



        protected override void TransSetBucketStoragePolicyContent(XmlWriter xmlWriter, StorageClassEnum storageClass)

        {

            xmlWriter.WriteElementString("StorageClass", TransStorageClass(storageClass));

        }



        private void TransGrants(XmlWriter xmlWriter, IList<Grant> grants, bool isBucket, string startElementName)

        {

            xmlWriter.WriteStartElement(startElementName);

            foreach (Grant grant in grants)

            {

                if (grant.Grantee != null && grant.Permission.HasValue)

                {

                    xmlWriter.WriteStartElement("Grant");



                    if (grant.Grantee is GroupGrantee)

                    {

                        GroupGrantee groupGrantee = grant.Grantee as GroupGrantee;

                        if (groupGrantee.GroupGranteeType == GroupGranteeEnum.AllUsers)

                        {

                            xmlWriter.WriteStartElement("Grantee");

                            xmlWriter.WriteElementString("Canned", "Everyone");

                            xmlWriter.WriteEndElement();

                        }

                    }

                    else if (grant.Grantee is CanonicalGrantee)

                    {

                        xmlWriter.WriteStartElement("Grantee");

                        CanonicalGrantee canonicalGrantee = grant.Grantee as CanonicalGrantee;

                        xmlWriter.WriteElementString("ID", canonicalGrantee.Id);

                        xmlWriter.WriteEndElement();

                    }

                    xmlWriter.WriteElementString("Permission", EnumAdaptor.GetStringValue(grant.Permission));

                    if (isBucket)

                    {

                        xmlWriter.WriteElementString("Delivered", grant.Delivered.ToString().ToLower());

                    }

                    xmlWriter.WriteEndElement();

                }

            }

            xmlWriter.WriteEndElement();

        }



        protected override void TransAccessControlList(HttpRequest httpRequest, AccessControlList acl, bool isBucket)

        {

            this.TransContent(httpRequest, delegate (XmlWriter xmlWriter)

            {

                xmlWriter.WriteStartElement("AccessControlPolicy");

                if (acl.Owner != null && !string.IsNullOrEmpty(acl.Owner.Id))

                {

                    xmlWriter.WriteStartElement("Owner");

                    xmlWriter.WriteElementString("ID", acl.Owner.Id);

                    xmlWriter.WriteEndElement();

                }

                if (!isBucket)

                {

                    xmlWriter.WriteElementString("Delivered", acl.Delivered.ToString().ToLower());

                }

                if (acl.Grants.Count > 0)

                {

                    this.TransGrants(xmlWriter, acl.Grants, isBucket, "AccessControlList");

                }

                xmlWriter.WriteEndElement();

            });

        }



        protected override void TransLoggingConfiguration(HttpRequest httpRequest, LoggingConfiguration configuration)

        {

            this.TransContent(httpRequest, delegate (XmlWriter xmlWriter)

            {

                xmlWriter.WriteStartElement("BucketLoggingStatus");



                if (!string.IsNullOrEmpty(configuration.Agency))

                {

                    xmlWriter.WriteElementString("Agency", configuration.Agency);

                }



                if (configuration != null && (!string.IsNullOrEmpty(configuration.TargetBucketName) || configuration.TargetPrefix != null))

                {

                    xmlWriter.WriteStartElement("LoggingEnabled");

                    if (!string.IsNullOrEmpty(configuration.TargetBucketName))

                    {

                        xmlWriter.WriteElementString("TargetBucket", configuration.TargetBucketName);

                    }



                    if (configuration.TargetPrefix != null)

                    {

                        xmlWriter.WriteElementString("TargetPrefix", configuration.TargetPrefix);

                    }



                    if (configuration.Grants.Count > 0)

                    {

                        this.TransGrants(xmlWriter, configuration.Grants, false, "TargetGrants");

                    }



                    xmlWriter.WriteEndElement();

                }

                xmlWriter.WriteEndElement();

            });

        }



        protected override void TransTier(RestoreTierEnum? tier, XmlWriter xmlWriter)

        {

            if (tier.HasValue && tier.Value != RestoreTierEnum.Bulk)

            {

                xmlWriter.WriteStartElement("RestoreJob");



                xmlWriter.WriteElementString("Tier", tier.Value.ToString());



                xmlWriter.WriteEndElement();

            }

        }



    }

}