Ejemplo n.º 1
0
        /// <summary>
        /// Creates a new Location that is a copy of the current Location.
        /// </summary>
        /// <returns>A new Location that is a copy of this Location.</returns>
        public Location Clone()
        {
            Location loc = new Location();
            loc.Accession = Accession;
            loc.StartData = StartData;
            loc.EndData = EndData;
            loc.Separator = Separator;
            loc.Operator = Operator;
            loc.Resolver = Resolver.Clone();

            foreach (ILocation subloc in SubLocations)
            {
                loc.SubLocations.Add(subloc.Clone());
            }

            return loc;
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Builds location from the specified location string.
        /// </summary>
        /// <param name="locationString">Location string.</param>
        /// <returns>A Location instance.</returns>
        private ILocation BuildLocation(ref string locationString)
        {
            Location location = new Location {Resolver = new LocationResolver()};

            if (locationString.StartsWith("complement(", StringComparison.OrdinalIgnoreCase))
            {
                location.Operator = LocationOperator.Complement;
                locationString = locationString.Substring(11);
                BuilSubLocation(location, ref locationString);
                return location;
            }
            else if (locationString.StartsWith("join(", StringComparison.OrdinalIgnoreCase))
            {
                location.Operator = LocationOperator.Join;
                locationString = locationString.Substring(5);
                BuilSubLocation(location, ref locationString);
                return location;
            }
            else if (locationString.StartsWith("bond(", StringComparison.OrdinalIgnoreCase))
            {
                location.Operator = LocationOperator.Bond;
                locationString = locationString.Substring(5);
                BuilSubLocation(location, ref locationString);
                return location;
            }
            else if (locationString.StartsWith("order(", StringComparison.OrdinalIgnoreCase))
            {
                location.Operator = LocationOperator.Order;
                locationString = locationString.Substring(6);
                BuilSubLocation(location, ref locationString);
                return location;
            }
            else
            {
                int index = GetNextIndex(locationString);
                string singleLocation = locationString;
                if (index != -1)
                {
                    singleLocation = locationString.Substring(0, index);
                    locationString = locationString.Substring(index);
                }
                else
                {
                    locationString = string.Empty;
                }

                if (singleLocation.Contains(":"))
                {
                    int firstIndex = singleLocation.IndexOf(":",StringComparison.OrdinalIgnoreCase);
                    if (firstIndex != singleLocation.LastIndexOf(":", StringComparison.OrdinalIgnoreCase))
                    {
                        string str = string.Format(CultureInfo.CurrentCulture, Properties.Resource.InvalidLocationString, locationString);
                        throw new ArgumentException(str);
                    }

                    string[] strArray = singleLocation.Split(':');
                    if (strArray.Length != 2)
                    {
                        string str = string.Format(CultureInfo.CurrentCulture, Properties.Resource.InvalidLocationString, locationString);
                        throw new ArgumentException(str);
                    }

                    location.Accession = strArray[0];
                    singleLocation = strArray[1];
                }

                if (singleLocation.Contains(".."))
                {
                    int firstIndex = singleLocation.IndexOf("..", StringComparison.OrdinalIgnoreCase);
                    if (firstIndex != singleLocation.LastIndexOf("..", StringComparison.OrdinalIgnoreCase))
                    {
                        string str = string.Format(CultureInfo.CurrentCulture, Properties.Resource.InvalidLocationString, locationString);
                        throw new ArgumentException(str);
                    }

                    string[] delisms = new string[1];
                    delisms[0] = "..";
                    string[] strArray = singleLocation.Split(delisms, StringSplitOptions.RemoveEmptyEntries);
                    if (strArray.Length != 2)
                    {
                        string str = string.Format(CultureInfo.CurrentCulture, Properties.Resource.InvalidLocationString, locationString);
                        throw new ArgumentException(str);
                    }

                    location.StartData = strArray[0];
                    location.EndData = strArray[1];
                    location.Separator = "..";
                }
                else if (singleLocation.Contains("."))
                {
                    int firstIndex = singleLocation.IndexOf(".", StringComparison.OrdinalIgnoreCase);
                    if (firstIndex != singleLocation.LastIndexOf(".", StringComparison.OrdinalIgnoreCase))
                    {
                        string str = string.Format(CultureInfo.CurrentCulture, Properties.Resource.InvalidLocationString, locationString);
                        throw new ArgumentException(str);
                    }

                    string[] strArray = singleLocation.Split(".".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                    if (strArray.Length != 2)
                    {
                        string str = string.Format(CultureInfo.CurrentCulture, Properties.Resource.InvalidLocationString, locationString);
                        throw new ArgumentException(str);
                    }

                    location.StartData = strArray[0];
                    location.EndData = strArray[1];
                    location.Separator = ".";
                }
                else if (singleLocation.Contains("^"))
                {
                    int firstIndex = singleLocation.IndexOf("^", StringComparison.OrdinalIgnoreCase);
                    if (firstIndex != singleLocation.LastIndexOf("^", StringComparison.OrdinalIgnoreCase))
                    {
                        string str = string.Format(CultureInfo.CurrentCulture, Properties.Resource.InvalidLocationString, locationString);
                        throw new ArgumentException(str);
                    }

                    string[] strArray = singleLocation.Split('^');
                    if (strArray.Length != 2)
                    {
                        string str = string.Format(CultureInfo.CurrentCulture, Properties.Resource.InvalidLocationString, locationString);
                        throw new ArgumentException(str);
                    }

                    location.StartData = strArray[0];
                    location.EndData = strArray[1];
                    location.Separator = "^";
                }
                else if (singleLocation.StartsWith("<", StringComparison.OrdinalIgnoreCase) 
                    || singleLocation.StartsWith(">", StringComparison.OrdinalIgnoreCase))
                {
                    int point;
                    if (int.TryParse(singleLocation.Substring(1,singleLocation.Length - 1), out point))
                    {
                        location.StartData = singleLocation;
                        location.EndData = singleLocation;
                        location.Separator = string.Empty;
                    }
                    else
                    {
                        string str = string.Format(CultureInfo.CurrentCulture, Properties.Resource.InvalidLocationString, locationString);
                        throw new ArgumentException(str);
                    }
                }
                else
                {
                    int point;
                    if (int.TryParse(singleLocation, out point))
                    {
                        location.StartData = singleLocation;
                        location.EndData = singleLocation;
                        location.Separator = string.Empty;
                    }
                    else
                    {
                        string str = string.Format(CultureInfo.CurrentCulture, Properties.Resource.InvalidLocationString, locationString);
                        throw new ArgumentException(str);
                    }
                }

                return location;
            }
        }