/// <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; }
/// <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; } }