Skip to content

Commit

Permalink
#75 Added support to Array serialization and ISavedSearch
Browse files Browse the repository at this point in the history
  • Loading branch information
linvi committed Aug 14, 2016
1 parent 90c220b commit cd8d755
Show file tree
Hide file tree
Showing 5 changed files with 81 additions and 35 deletions.
1 change: 1 addition & 0 deletions Tweetinvi.Core/Core/Factories/ISavedSearchFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,6 @@ public interface ISavedSearchFactory
ISavedSearch GetSavedSearch(long searchId);
ISavedSearch GenerateSavedSearchFromDTO(ISavedSearchDTO savedSearchDTO);
IEnumerable<ISavedSearch> GenerateSavedSearchesFromDTOs(IEnumerable<ISavedSearchDTO> savedSearchDTO);
ISavedSearch GenerateSavedSearchFromJson(string json);
}
}
2 changes: 1 addition & 1 deletion Tweetinvi.Core/Core/Factories/ITweetFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public interface ITweetFactory
ITweet CreateTweet(string text);

// Generate Tweet From Json
ITweet GenerateTweetFromJson(string jsonTweet);
ITweet GenerateTweetFromJson(string json);

// Generate Tweet from DTO
ITweet GenerateTweetFromDTO(ITweetDTO tweetDTO);
Expand Down
38 changes: 28 additions & 10 deletions Tweetinvi.Factories/SavedSearch/SavedSearchFactory.cs
Original file line number Diff line number Diff line change
@@ -1,20 +1,26 @@
using System.Collections.Generic;
using System.Linq;
using Tweetinvi.Core.Factories;
using Tweetinvi.Core.Helpers;
using Tweetinvi.Core.Injectinvi;
using Tweetinvi.Models;
using Tweetinvi.Models.DTO;

namespace Tweetinvi.Factories.SavedSearch
{
public class SavedSearchFactory : ISavedSearchFactory
public class SavedSearchFactory : ISavedSearchFactory
{
private readonly ISavedSearchQueryExecutor _savedSearchQueryExecutor;
private readonly IJsonObjectConverter _jsonObjectConverter;
private readonly IFactory<ISavedSearch> _savedSearchUnityFactory;

public SavedSearchFactory(ISavedSearchQueryExecutor savedSearchQueryExecutor, IFactory<ISavedSearch> savedSearchUnityFactory)
public SavedSearchFactory(
ISavedSearchQueryExecutor savedSearchQueryExecutor,
IJsonObjectConverter jsonObjectConverter,
IFactory<ISavedSearch> savedSearchUnityFactory)
{
_savedSearchQueryExecutor = savedSearchQueryExecutor;
_jsonObjectConverter = jsonObjectConverter;
_savedSearchUnityFactory = savedSearchUnityFactory;
}

Expand All @@ -39,14 +45,26 @@ public ISavedSearch GenerateSavedSearchFromDTO(ISavedSearchDTO savedSearchDTO)
return _savedSearchUnityFactory.Create(savedSearchDTOParameter);
}

public IEnumerable<ISavedSearch> GenerateSavedSearchesFromDTOs(IEnumerable<ISavedSearchDTO> savedSearchDTOs)
{
if (savedSearchDTOs == null)
{
return null;
}
public IEnumerable<ISavedSearch> GenerateSavedSearchesFromDTOs(IEnumerable<ISavedSearchDTO> savedSearchDTOs)
{
if (savedSearchDTOs == null)
{
return null;
}

return savedSearchDTOs.Select(GenerateSavedSearchFromDTO);
}

return savedSearchDTOs.Select(GenerateSavedSearchFromDTO);
}
// Generate SavedSearch from Json
public ISavedSearch GenerateSavedSearchFromJson(string json)
{
var savedSearchDTO = _jsonObjectConverter.DeserializeObject<ISavedSearchDTO>(json);
if (savedSearchDTO == null || savedSearchDTO.Id == TweetinviSettings.DEFAULT_ID)
{
return null;
}

return GenerateSavedSearchFromDTO(savedSearchDTO);
}
}
}
4 changes: 2 additions & 2 deletions Tweetinvi.Factories/Tweet/TweetFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,9 @@ public ITweet CreateTweet(string text)
}

// Generate Tweet from Json
public ITweet GenerateTweetFromJson(string jsonTweet)
public ITweet GenerateTweetFromJson(string json)
{
var tweetDTO = _jsonObjectConverter.DeserializeObject<ITweetDTO>(jsonTweet);
var tweetDTO = _jsonObjectConverter.DeserializeObject<ITweetDTO>(json);
if (tweetDTO == null || tweetDTO.Id == TweetinviSettings.DEFAULT_ID)
{
return null;
Expand Down
71 changes: 49 additions & 22 deletions Tweetinvi/JsonExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,13 +69,17 @@ static JsonExtensions()
var userFactory = TweetinviContainer.Resolve<IUserFactory>();
var messageFactory = TweetinviContainer.Resolve<IMessageFactory>();
var twitterListFactory = TweetinviContainer.Resolve<ITwitterListFactory>();
var savedSearchFactory = TweetinviContainer.Resolve<ISavedSearchFactory>();

_getSerializableObject = new Dictionary<Type, IJsonMap>();

_getSerializableObject.Add(typeof(ITweet), new JsonMap<ITweet, ITweetDTO>(u => u.TweetDTO, tweetFactory.GenerateTweetFromJson));
_getSerializableObject.Add(typeof(IUser), new JsonMap<IUser, IUserDTO>(u => u.UserDTO, userFactory.GenerateUserFromJson));
_getSerializableObject.Add(typeof(IMessage), new JsonMap<IMessage, IMessageDTO>(m => m.MessageDTO, messageFactory.GenerateMessageFromJson));
_getSerializableObject.Add(typeof(ITwitterList), new JsonMap<ITwitterList, ITwitterListDTO>(l => l.TwitterListDTO, twitterListFactory.GenerateListFromJson));
// ReSharper disable RedundantTypeArgumentsOfMethod
Map<ITweet, ITweetDTO>(u => u.TweetDTO, tweetFactory.GenerateTweetFromJson);
Map<IUser, IUserDTO>(u => u.UserDTO, userFactory.GenerateUserFromJson);
Map<IMessage, IMessageDTO>(m => m.MessageDTO, messageFactory.GenerateMessageFromJson);
Map<ITwitterList, ITwitterListDTO>(l => l.TwitterListDTO, twitterListFactory.GenerateListFromJson);
Map<ISavedSearch, ISavedSearchDTO>(s => s.SavedSearchDTO, savedSearchFactory.GenerateSavedSearchFromJson);
// ReSharper restore RedundantTypeArgumentsOfMethod
}

public static string ToJson<T>(this T obj) where T : class
Expand Down Expand Up @@ -119,39 +123,62 @@ public static T ConvertJsonTo<T>(this string json) where T : class
{
var type = typeof(T);

if (_getSerializableObject.ContainsKey(type))
{
return _getSerializableObject[type].GetDeserializedObject(json) as T;
}

if (typeof(IEnumerable).IsAssignableFrom(type) && type.IsGenericType)
try
{
var genericType = type.GetGenericArguments()[0];
if (_getSerializableObject.ContainsKey(genericType))
if (_getSerializableObject.ContainsKey(type))
{
var list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(genericType));
var serializer = _getSerializableObject[genericType];
return _getSerializableObject[type].GetDeserializedObject(json) as T;
}

JArray jsonArray = JArray.Parse(json);
if (typeof(IEnumerable).IsAssignableFrom(type))
{
Type genericType = null;

foreach (var elt in jsonArray)
if (type.IsGenericType)
{
var eltJson = elt.ToJson();
list.Add(serializer.GetDeserializedObject(eltJson));
genericType = type.GetGenericArguments()[0];
}
else if (typeof(Array).IsAssignableFrom(type))
{
genericType = type.GetElementType();
}

return list as T;
if (_getSerializableObject.ContainsKey(genericType))
{
var list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(genericType));
var serializer = _getSerializableObject[genericType];

JArray jsonArray = JArray.Parse(json);

foreach (var elt in jsonArray)
{
var eltJson = elt.ToJson();
list.Add(serializer.GetDeserializedObject(eltJson));
}

if (typeof(Array).IsAssignableFrom(type))
{
var array = Array.CreateInstance(genericType, list.Count);
list.CopyTo(array, 0);
return array as T;
}

return list as T;
}
}
}

try
{

return JsonConvert.DeserializeObject<T>(json, JsonPropertiesConverterRepository.Converters);
}
catch (Exception ex)
{
throw new Exception("The type provided is probably not compatible with Tweetinvi Json serializer.", ex);
}
}

private static void Map<T1, T2>(Func<T1, T2> getSerializableObject, Func<string, T1> deserializer) where T1 : class where T2 : class
{
_getSerializableObject.Add(typeof(T1), new JsonMap<T1, T2>(getSerializableObject, deserializer));
}
}
}

0 comments on commit cd8d755

Please sign in to comment.