﻿/*
 * 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 System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DotCMIS.Exceptions
{
    [Serializable]
    public class CmisBaseException : ApplicationException
    {
        public CmisBaseException() { Code = null; }
        public CmisBaseException(string message) : base(message) { Code = null; }
        public CmisBaseException(string message, Exception inner) : base(message, inner) { Code = null; }
        protected CmisBaseException(
          System.Runtime.Serialization.SerializationInfo info,
          System.Runtime.Serialization.StreamingContext context)
            : base(info, context) { }

        public CmisBaseException(string message, long? code)
            : this(message)
        {
            Code = code;
        }

        public CmisBaseException(string message, string errorContent)
            : this(message)
        {
            ErrorContent = errorContent;
        }

        public CmisBaseException(string message, string errorContent, Exception inner)
            : this(message, inner)
        {
            ErrorContent = errorContent;
        }

        public long? Code { get; protected set; }
        public string ErrorContent { get; protected set; }
    }

    [Serializable]
    public class CmisConnectionException : CmisBaseException
    {
        public CmisConnectionException() : base() { }
        public CmisConnectionException(string message) : base(message) { }
        public CmisConnectionException(string message, Exception inner) : base(message, inner) { }
        protected CmisConnectionException(
          System.Runtime.Serialization.SerializationInfo info,
          System.Runtime.Serialization.StreamingContext context)
            : base(info, context) { }
        public CmisConnectionException(string message, long? code)
            : base(message) { }
        public CmisConnectionException(string message, string errorContent)
            : base(message) { }
        public CmisConnectionException(string message, string errorContent, Exception inner)
            : base(message, errorContent, inner) { }
    }

    [Serializable]
    public class CmisConstraintException : CmisBaseException
    {
        public CmisConstraintException() : base() { }
        public CmisConstraintException(string message) : base(message) { }
        public CmisConstraintException(string message, Exception inner) : base(message, inner) { }
        protected CmisConstraintException(
          System.Runtime.Serialization.SerializationInfo info,
          System.Runtime.Serialization.StreamingContext context)
            : base(info, context) { }
        public CmisConstraintException(string message, long? code)
            : base(message) { }
        public CmisConstraintException(string message, string errorContent)
            : base(message) { }
        public CmisConstraintException(string message, string errorContent, Exception inner)
            : base(message, errorContent, inner) { }
    }

    [Serializable]
    public class CmisContentAlreadyExistsException : CmisBaseException
    {
        public CmisContentAlreadyExistsException() : base() { }
        public CmisContentAlreadyExistsException(string message) : base(message) { }
        public CmisContentAlreadyExistsException(string message, Exception inner) : base(message, inner) { }
        protected CmisContentAlreadyExistsException(
          System.Runtime.Serialization.SerializationInfo info,
          System.Runtime.Serialization.StreamingContext context)
            : base(info, context) { }
        public CmisContentAlreadyExistsException(string message, long? code)
            : base(message) { }
        public CmisContentAlreadyExistsException(string message, string errorContent)
            : base(message) { }
        public CmisContentAlreadyExistsException(string message, string errorContent, Exception inner)
            : base(message, errorContent, inner) { }
    }

    [Serializable]
    public class CmisFilterNotValidException : CmisBaseException
    {
        public CmisFilterNotValidException() : base() { }
        public CmisFilterNotValidException(string message) : base(message) { }
        public CmisFilterNotValidException(string message, Exception inner) : base(message, inner) { }
        protected CmisFilterNotValidException(
          System.Runtime.Serialization.SerializationInfo info,
          System.Runtime.Serialization.StreamingContext context)
            : base(info, context) { }
        public CmisFilterNotValidException(string message, long? code)
            : base(message) { }
        public CmisFilterNotValidException(string message, string errorContent)
            : base(message) { }
        public CmisFilterNotValidException(string message, string errorContent, Exception inner)
            : base(message, errorContent, inner) { }
    }

    [Serializable]
    public class CmisInvalidArgumentException : CmisBaseException
    {
        public CmisInvalidArgumentException() : base() { }
        public CmisInvalidArgumentException(string message) : base(message) { }
        public CmisInvalidArgumentException(string message, Exception inner) : base(message, inner) { }
        protected CmisInvalidArgumentException(
          System.Runtime.Serialization.SerializationInfo info,
          System.Runtime.Serialization.StreamingContext context)
            : base(info, context) { }
        public CmisInvalidArgumentException(string message, long? code)
            : base(message) { }
        public CmisInvalidArgumentException(string message, string errorContent)
            : base(message) { }
        public CmisInvalidArgumentException(string message, string errorContent, Exception inner)
            : base(message, errorContent, inner) { }
    }

    [Serializable]
    public class CmisNameConstraintViolationException : CmisBaseException
    {
        public CmisNameConstraintViolationException() : base() { }
        public CmisNameConstraintViolationException(string message) : base(message) { }
        public CmisNameConstraintViolationException(string message, Exception inner) : base(message, inner) { }
        protected CmisNameConstraintViolationException(
          System.Runtime.Serialization.SerializationInfo info,
          System.Runtime.Serialization.StreamingContext context)
            : base(info, context) { }
        public CmisNameConstraintViolationException(string message, long? code)
            : base(message) { }
        public CmisNameConstraintViolationException(string message, string errorContent)
            : base(message) { }
        public CmisNameConstraintViolationException(string message, string errorContent, Exception inner)
            : base(message, errorContent, inner) { }
    }

    [Serializable]
    public class CmisNotSupportedException : CmisBaseException
    {
        public CmisNotSupportedException() : base() { }
        public CmisNotSupportedException(string message) : base(message) { }
        public CmisNotSupportedException(string message, Exception inner) : base(message, inner) { }
        protected CmisNotSupportedException(
          System.Runtime.Serialization.SerializationInfo info,
          System.Runtime.Serialization.StreamingContext context)
            : base(info, context) { }
        public CmisNotSupportedException(string message, long? code)
            : base(message) { }
        public CmisNotSupportedException(string message, string errorContent)
            : base(message) { }
        public CmisNotSupportedException(string message, string errorContent, Exception inner)
            : base(message, errorContent, inner) { }
    }

    [Serializable]
    public class CmisObjectNotFoundException : CmisBaseException
    {
        public CmisObjectNotFoundException() : base() { }
        public CmisObjectNotFoundException(string message) : base(message) { }
        public CmisObjectNotFoundException(string message, Exception inner) : base(message, inner) { }
        protected CmisObjectNotFoundException(
          System.Runtime.Serialization.SerializationInfo info,
          System.Runtime.Serialization.StreamingContext context)
            : base(info, context) { }
        public CmisObjectNotFoundException(string message, long? code)
            : base(message) { }
        public CmisObjectNotFoundException(string message, string errorContent)
            : base(message) { }
        public CmisObjectNotFoundException(string message, string errorContent, Exception inner)
            : base(message, errorContent, inner) { }
    }

    [Serializable]
    public class CmisPermissionDeniedException : CmisBaseException
    {
        public CmisPermissionDeniedException() : base() { }
        public CmisPermissionDeniedException(string message) : base(message) { }
        public CmisPermissionDeniedException(string message, Exception inner) : base(message, inner) { }
        protected CmisPermissionDeniedException(
          System.Runtime.Serialization.SerializationInfo info,
          System.Runtime.Serialization.StreamingContext context)
            : base(info, context) { }
        public CmisPermissionDeniedException(string message, long? code)
            : base(message) { }
        public CmisPermissionDeniedException(string message, string errorContent)
            : base(message) { }
        public CmisPermissionDeniedException(string message, string errorContent, Exception inner)
            : base(message, errorContent, inner) { }
    }

    [Serializable]
    public class CmisRuntimeException : CmisBaseException
    {
        public CmisRuntimeException() : base() { }
        public CmisRuntimeException(string message) : base(message) { }
        public CmisRuntimeException(string message, Exception inner) : base(message, inner) { }
        protected CmisRuntimeException(
          System.Runtime.Serialization.SerializationInfo info,
          System.Runtime.Serialization.StreamingContext context)
            : base(info, context) { }
        public CmisRuntimeException(string message, long? code)
            : base(message) { }
        public CmisRuntimeException(string message, string errorContent)
            : base(message) { }
        public CmisRuntimeException(string message, string errorContent, Exception inner)
            : base(message, errorContent, inner) { }
    }

    [Serializable]
    public class CmisStorageException : CmisBaseException
    {
        public CmisStorageException() : base() { }
        public CmisStorageException(string message) : base(message) { }
        public CmisStorageException(string message, Exception inner) : base(message, inner) { }
        protected CmisStorageException(
          System.Runtime.Serialization.SerializationInfo info,
          System.Runtime.Serialization.StreamingContext context)
            : base(info, context) { }
        public CmisStorageException(string message, long? code)
            : base(message) { }
        public CmisStorageException(string message, string errorContent)
            : base(message) { }
        public CmisStorageException(string message, string errorContent, Exception inner)
            : base(message, errorContent, inner) { }
    }

    [Serializable]
    public class CmisStreamNotSupportedException : CmisBaseException
    {
        public CmisStreamNotSupportedException() : base() { }
        public CmisStreamNotSupportedException(string message) : base(message) { }
        public CmisStreamNotSupportedException(string message, Exception inner) : base(message, inner) { }
        protected CmisStreamNotSupportedException(
          System.Runtime.Serialization.SerializationInfo info,
          System.Runtime.Serialization.StreamingContext context)
            : base(info, context) { }
        public CmisStreamNotSupportedException(string message, long? code)
            : base(message) { }
        public CmisStreamNotSupportedException(string message, string errorContent)
            : base(message) { }
        public CmisStreamNotSupportedException(string message, string errorContent, Exception inner)
            : base(message, errorContent, inner) { }
    }

    [Serializable]
    public class CmisUpdateConflictException : CmisBaseException
    {
        public CmisUpdateConflictException() : base() { }
        public CmisUpdateConflictException(string message) : base(message) { }
        public CmisUpdateConflictException(string message, Exception inner) : base(message, inner) { }
        protected CmisUpdateConflictException(
          System.Runtime.Serialization.SerializationInfo info,
          System.Runtime.Serialization.StreamingContext context)
            : base(info, context) { }
        public CmisUpdateConflictException(string message, long? code)
            : base(message) { }
        public CmisUpdateConflictException(string message, string errorContent)
            : base(message) { }
        public CmisUpdateConflictException(string message, string errorContent, Exception inner)
            : base(message, errorContent, inner) { }
    }

    [Serializable]
    public class CmisVersioningException : CmisBaseException
    {
        public CmisVersioningException() : base() { }
        public CmisVersioningException(string message) : base(message) { }
        public CmisVersioningException(string message, Exception inner) : base(message, inner) { }
        protected CmisVersioningException(
          System.Runtime.Serialization.SerializationInfo info,
          System.Runtime.Serialization.StreamingContext context)
            : base(info, context) { }
        public CmisVersioningException(string message, long? code)
            : base(message) { }
        public CmisVersioningException(string message, string errorContent)
            : base(message) { }
        public CmisVersioningException(string message, string errorContent, Exception inner)
            : base(message, errorContent, inner) { }
    }
}
