You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ko...@apache.org on 2015/02/23 11:11:38 UTC
[31/41] olingo-odata4-js git commit: [OLINGO-541] Move the odatajs
branch one directory up
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/503b4417/odatajs/tests/code/ReflectionDataContext.cs
----------------------------------------------------------------------
diff --git a/odatajs/tests/code/ReflectionDataContext.cs b/odatajs/tests/code/ReflectionDataContext.cs
deleted file mode 100644
index 1635d54..0000000
--- a/odatajs/tests/code/ReflectionDataContext.cs
+++ /dev/null
@@ -1,743 +0,0 @@
-/*
- * 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.
- */
-
-
-namespace DataJS.Tests
-{
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Collections.ObjectModel;
- using Microsoft.OData.Service;
- using System.Globalization;
- using System.Linq;
- using System.Reflection;
-
- /// <summary>
- /// Provides a reflection-based, updatable data context.
- /// </summary>
- public abstract class ReflectionDataContext
- {
- // Fields
- private List<object> deletedObjects = new List<object>();
- private List<Action> pendingChanges;
- private static Dictionary<Type, Dictionary<string, IList>> resourceSetsByContextTypeStorage = new Dictionary<Type, Dictionary<string, IList>>();
-
- // Methods
- protected ReflectionDataContext()
- {
- this.MetadataHelper = new ReflectionMetadataHelper(this);
- this.pendingChanges = new List<Action>();
- if (!resourceSetsByContextTypeStorage.ContainsKey(base.GetType()))
- {
- resourceSetsByContextTypeStorage.Add(base.GetType(), new Dictionary<string, IList>());
- foreach (string resourceSetName in this.MetadataHelper.GetResourceSetNames())
- {
- Type resourceType = this.MetadataHelper.GetResourceTypeOfSet(resourceSetName);
- IList listOfTInstance = Activator.CreateInstance(typeof(List<>).MakeGenericType(new Type[] { resourceType })) as IList;
- this.ResourceSetsStorage.Add(resourceSetName, listOfTInstance);
- }
- }
- this.EnsureDataIsInitialized();
- }
-
- public virtual void AddReferenceToCollection(object targetResource, string propertyName, object resourceToBeAdded)
- {
- ExceptionUtilities.CheckArgumentNotNull(targetResource, "targetResource");
- ExceptionUtilities.CheckArgumentNotNull(propertyName, "propertyName");
- ExceptionUtilities.CheckArgumentNotNull(resourceToBeAdded, "resourceToBeAdded");
- UpdatableToken targetToken = UpdatableToken.AssertIsToken(targetResource, "targetResource");
- targetResource = targetToken.Resource;
- resourceToBeAdded = UpdatableToken.AssertIsTokenAndResolve(resourceToBeAdded, "resourceToBeAdded");
- IList list = this.GetValue(targetToken, propertyName) as IList;
- ExceptionUtilities.CheckObjectNotNull(list, "Property '{0}' on type '{1}' was not a list", new object[] { propertyName, targetResource.GetType().Name });
- this.pendingChanges.Add(delegate {
- list.Add(resourceToBeAdded);
- });
- }
-
- public virtual void ClearChanges()
- {
- this.pendingChanges.Clear();
- }
-
- public void ClearData()
- {
- this.ResourceSetsStorage.Clear();
- }
-
- private static bool CompareETagValues(Dictionary<string, object> resourceCookieValues, IEnumerable<KeyValuePair<string, object>> concurrencyValues)
- {
- if (concurrencyValues.Count<KeyValuePair<string, object>>() != resourceCookieValues.Count)
- {
- return false;
- }
- foreach (KeyValuePair<string, object> keyValuePair in concurrencyValues)
- {
- if (!resourceCookieValues.ContainsKey(keyValuePair.Key))
- {
- return false;
- }
- if (keyValuePair.Value == null)
- {
- return (resourceCookieValues[keyValuePair.Key] == null);
- }
- if (!keyValuePair.Value.Equals(resourceCookieValues[keyValuePair.Key]))
- {
- return false;
- }
- }
- return true;
- }
-
- public virtual object CreateResource(string containerName, string fullTypeName)
- {
- ExceptionUtilities.CheckArgumentNotNull(fullTypeName, "fullTypeName");
- UpdatableToken token = this.InstantiateResourceType(fullTypeName);
- if (containerName != null)
- {
- this.pendingChanges.Add(delegate {
- this.GetResourceSetEntities(containerName).Add(token.Resource);
- });
- }
- return token;
- }
-
- private void DeleteAllReferences(object targetResource)
- {
- foreach (string currentSetName in this.MetadataHelper.GetResourceSetNames())
- {
- Type currentEntityType = this.MetadataHelper.GetResourceTypeOfSet(currentSetName);
- IList entitySetList = this.GetResourceSetEntities(currentSetName);
- foreach (NavigationPropertyInfo navigationProperty in this.MetadataHelper.GetNavigationProperties(GetResourceTypeFullName(currentEntityType)))
- {
- if (navigationProperty.CollectionElementType != null)
- {
- foreach (object currentEntityInstance in entitySetList)
- {
- this.RemoveResourceFromCollectionOnTargetResourceMatch(targetResource, navigationProperty, currentEntityInstance);
- }
- }
- else
- {
- ExceptionUtilities.CheckObjectNotNull(navigationProperty.PropertyInfo, "Invalid navigation property info", new object[0]);
- foreach (object currentEntityInstance in entitySetList)
- {
- this.SetEntityReferenceToNullOnTargetResourceMatch(targetResource, navigationProperty, currentEntityInstance);
- }
- }
- }
- }
- }
-
- public virtual void DeleteResource(object targetResource)
- {
- ExceptionUtilities.CheckArgumentNotNull(targetResource, "targetResource");
- targetResource = UpdatableToken.AssertIsTokenAndResolve(targetResource, "targetResource");
- string resourceSetName = this.GetResourceSetOfTargetResource(targetResource);
- ExceptionUtilities.CheckObjectNotNull(resourceSetName, "Unable to find set of the resource to delete", new object[0]);
- this.deletedObjects.Add(targetResource);
- IList resourceSetList = this.GetResourceSetEntities(resourceSetName);
- this.DeleteAllReferences(targetResource);
- this.pendingChanges.Add(delegate {
- resourceSetList.Remove(targetResource);
- });
- }
-
- protected abstract void EnsureDataIsInitialized();
-
- protected virtual Type GetCollectionPropertyType(string fullTypeName, string propertyName)
- {
- Type type = this.MetadataHelper.FindClrTypeByFullName(fullTypeName);
- Type collectionType = null;
- if (type != null)
- {
- PropertyInfo property = type.GetProperty(propertyName);
- if (property != null)
- {
- collectionType = property.PropertyType;
- }
- }
- return collectionType;
- }
-
- private Dictionary<string, object> GetConcurrencyValues(object targetResource)
- {
- Dictionary<string, object> etagValues = new Dictionary<string, object>();
- foreach (string etagProperty in this.MetadataHelper.GetETagPropertiesOfType(GetResourceTypeFullName(targetResource.GetType())))
- {
- etagValues.Add(etagProperty, targetResource.GetType().GetProperty(etagProperty).GetValue(targetResource, null));
- }
- return etagValues;
- }
-
- public virtual object GetResource(IQueryable query, string fullTypeName)
- {
- ExceptionUtilities.CheckArgumentNotNull(query, "query");
- object resource = null;
- foreach (object r in query)
- {
- ExceptionUtilities.Assert(resource == null, "Invalid Uri specified. The query '{0}' must refer to a single resource", new object[] { query.ToString() });
- resource = r;
- }
- if (resource == null)
- {
- return null;
- }
- if (fullTypeName != null)
- {
- this.ValidateResourceType(resource, fullTypeName);
- }
- return new UpdatableToken(resource);
- }
-
- public IList<T> GetResourceSetEntities<T>(string resourceSetName)
- {
- return (IList<T>) this.GetResourceSetEntities(resourceSetName);
- }
-
- internal IList GetResourceSetEntities(string resourceSetName)
- {
- IList entities;
- if (!this.ResourceSetsStorage.TryGetValue(resourceSetName, out entities))
- {
- Type elementType = this.MetadataHelper.GetResourceTypeOfSet(resourceSetName);
- entities = (IList) Activator.CreateInstance(typeof(List<>).MakeGenericType(new Type[] { elementType }));
- this.ResourceSetsStorage[resourceSetName] = entities;
- }
- return entities;
- }
-
- private string GetResourceSetOfTargetResource(object targetResource)
- {
- foreach (string currentResourceSetName in this.MetadataHelper.GetResourceSetNames())
- {
- if (this.GetResourceSetEntities(currentResourceSetName).Contains(targetResource))
- {
- return currentResourceSetName;
- }
- }
- return null;
- }
-
- public static string GetResourceTypeFullName(Type type)
- {
- return type.FullName.Replace('+', '_');
- }
-
- public virtual object GetValue(object targetResource, string propertyName)
- {
- ExceptionUtilities.CheckArgumentNotNull(targetResource, "targetResource");
- ExceptionUtilities.CheckArgumentNotNull(propertyName, "propertyName");
- UpdatableToken token = UpdatableToken.AssertIsToken(targetResource, "targetResource");
- if (token.PendingPropertyUpdates.ContainsKey(propertyName))
- {
- return token.PendingPropertyUpdates[propertyName];
- }
- targetResource = token.Resource;
- PropertyInfo pi = targetResource.GetType().GetProperty(propertyName);
- ExceptionUtilities.CheckObjectNotNull(pi, "Cannot find the property '{0}' on type '{1}'", new object[] { propertyName, targetResource.GetType().Name });
- object value = pi.GetValue(targetResource, null);
- if ((value != null) && (pi.PropertyType.Assembly == base.GetType().Assembly))
- {
- ExceptionUtilities.Assert(!this.MetadataHelper.IsTypeAnEntityType(pi.PropertyType), "GetValue should never be called for reference properties. Type was '{0}', property was '{1}'", new object[] { pi.PropertyType.FullName, propertyName });
- value = new UpdatableToken(value);
- }
- return value;
- }
-
- private UpdatableToken InstantiateResourceType(string fullTypeName)
- {
- Type t = this.MetadataHelper.FindClrTypeByFullName(fullTypeName);
- object instance = Activator.CreateInstance(t);
- UpdatableToken token = new UpdatableToken(instance);
- foreach (PropertyInfo p in t.GetProperties())
- {
- object generatedValue;
- PropertyInfo property = p;
- if (this.IsCollectionProperty(property))
- {
- Type collectionType = this.GetCollectionPropertyType(GetResourceTypeFullName(t), property.Name);
- if (collectionType != null)
- {
- object newCollection = Activator.CreateInstance(collectionType);
- token.PendingPropertyUpdates[property.Name] = newCollection;
- this.pendingChanges.Add(delegate {
- property.SetValue(instance, newCollection, null);
- });
- }
- }
- if (this.TryGetStoreGeneratedValue(fullTypeName, property.Name, out generatedValue))
- {
- token.PendingPropertyUpdates[property.Name] = generatedValue;
- this.pendingChanges.Add(delegate {
- property.SetValue(instance, generatedValue, null);
- });
- }
- }
- return token;
- }
-
- protected virtual bool IsCollectionProperty(PropertyInfo propertyInfo)
- {
- return ((typeof(IEnumerable).IsAssignableFrom(propertyInfo.PropertyType) && (propertyInfo.PropertyType != typeof(string))) && (propertyInfo.PropertyType != typeof(byte[])));
- }
-
- public virtual void RemoveReferenceFromCollection(object targetResource, string propertyName, object resourceToBeRemoved)
- {
- ExceptionUtilities.CheckArgumentNotNull(targetResource, "targetResource");
- ExceptionUtilities.CheckArgumentNotNull(propertyName, "propertyName");
- ExceptionUtilities.CheckArgumentNotNull(resourceToBeRemoved, "resourceToBeRemoved");
- UpdatableToken.AssertIsToken(targetResource, "targetResource");
- resourceToBeRemoved = UpdatableToken.AssertIsTokenAndResolve(resourceToBeRemoved, "resourceToBeRemoved");
- IList list = this.GetValue(targetResource, propertyName) as IList;
- ExceptionUtilities.CheckObjectNotNull(list, "Property '{0}' on type '{1}' was not a list", new object[] { propertyName, targetResource.GetType().Name });
- this.pendingChanges.Add(delegate {
- list.Remove(resourceToBeRemoved);
- });
- }
-
- private void RemoveResourceFromCollectionOnTargetResourceMatch(object targetResource, NavigationPropertyInfo navigationPropertyInfo, object currentEntityInstance)
- {
- IEnumerable childCollectionObject = navigationPropertyInfo.PropertyInfo.GetValue(currentEntityInstance, null) as IEnumerable;
- if (childCollectionObject.Cast<object>().Any<object>(delegate (object o) {
- return o == targetResource;
- }))
- {
- MethodInfo removeMethod = navigationPropertyInfo.PropertyInfo.PropertyType.GetMethod("Remove");
- this.pendingChanges.Add(delegate {
- removeMethod.Invoke(childCollectionObject, new object[] { targetResource });
- });
- }
- }
-
- public virtual object ResetResource(object resource)
- {
- ExceptionUtilities.CheckArgumentNotNull(resource, "resource");
- UpdatableToken token = UpdatableToken.AssertIsToken(resource, "resource");
- resource = token.Resource;
- token = new UpdatableToken(resource);
- object newInstance = Activator.CreateInstance(resource.GetType());
- ExceptionUtilities.CheckObjectNotNull(newInstance, "Cannot reset resource because unable to creating new instance of type '{0}' returns null", new object[] { resource.GetType().Name });
- foreach (string propertyToReset in this.MetadataHelper.GetPropertiesToReset(GetResourceTypeFullName(resource.GetType())))
- {
- PropertyInfo pi = newInstance.GetType().GetProperty(propertyToReset);
- ExceptionUtilities.CheckObjectNotNull(pi, "Cannot reset resource because unable to find property '{0}'", new object[] { propertyToReset });
- object newValue = pi.GetValue(newInstance, null);
- this.pendingChanges.Add(delegate {
- pi.SetValue(resource, newValue, null);
- });
- token.PendingPropertyUpdates[propertyToReset] = newValue;
- }
- return token;
- }
-
- public virtual object ResolveResource(object resource)
- {
- ExceptionUtilities.CheckArgumentNotNull(resource, "resource");
- return UpdatableToken.AssertIsTokenAndResolve(resource, "resource");
- }
-
- public virtual void SaveChanges()
- {
- foreach (Action pendingChange in this.pendingChanges)
- {
- pendingChange();
- }
- this.pendingChanges.Clear();
- foreach (object deleted in this.deletedObjects)
- {
- foreach (object entity in this.ResourceSetsStorage.SelectMany<KeyValuePair<string, IList>, object>(delegate (KeyValuePair<string, IList> p) {
- return p.Value.Cast<object>();
- }))
- {
- ExceptionUtilities.Assert(!object.ReferenceEquals(deleted, entity), "Found deleted entity!", new object[0]);
- foreach (PropertyInfo propertyInfo in entity.GetType().GetProperties())
- {
- object value = propertyInfo.GetValue(entity, null);
- ExceptionUtilities.Assert(!object.ReferenceEquals(deleted, value), "Found deleted entity!", new object[0]);
- IEnumerable enumerable = value as IEnumerable;
- if (enumerable != null)
- {
- foreach (object valueElement in enumerable.Cast<object>())
- {
- ExceptionUtilities.Assert(!object.ReferenceEquals(deleted, valueElement), "Found deleted entity!", new object[0]);
- }
- }
- }
- }
- }
- this.deletedObjects.Clear();
- }
-
- protected virtual void SetCollectionPropertyValue(object targetResource, PropertyInfo propertyInfo, IEnumerable propertyValue)
- {
- object collection;
- ExceptionUtilities.CheckArgumentNotNull(targetResource, "targetResource");
- ExceptionUtilities.CheckArgumentNotNull(propertyInfo, "propertyInfo");
- ExceptionUtilities.CheckArgumentNotNull(propertyValue, "propertyValue");
- Type collectionType = this.GetCollectionPropertyType(GetResourceTypeFullName(propertyInfo.ReflectedType), propertyInfo.Name);
- ExceptionUtilities.CheckObjectNotNull(collectionType, "Could not infer collection type for property", new object[0]);
- propertyValue = propertyValue.Cast<object>().Select<object, object>(delegate (object o) {
- return UpdatableToken.ResolveIfToken(o);
- });
- ConstructorInfo enumerableConstructor = collectionType.GetConstructor(new Type[] { typeof(IEnumerable) });
- if (enumerableConstructor != null)
- {
- collection = enumerableConstructor.Invoke(new object[] { propertyValue });
- }
- else if (collectionType.IsGenericType && (collectionType.GetGenericArguments().Count<Type>() == 1))
- {
- Type typeArgument = collectionType.GetGenericArguments().Single<Type>();
- ConstructorInfo typedEnumerableConstructor = collectionType.GetConstructor(new Type[] { typeof(IEnumerable<>).MakeGenericType(new Type[] { typeArgument }) });
- if (typedEnumerableConstructor != null)
- {
- object typedEnumerable = typeof(Enumerable).GetMethod("Cast").MakeGenericMethod(new Type[] { typeArgument }).Invoke(null, new object[] { propertyValue });
- collection = typedEnumerableConstructor.Invoke(new object[] { typedEnumerable });
- }
- else
- {
- MethodInfo typedAddMethod = collectionType.GetMethod("Add", new Type[] { typeArgument });
- ExceptionUtilities.CheckObjectNotNull(typedAddMethod, "Could not find constructor or add method for type: " + collectionType.FullName, new object[0]);
- collection = Activator.CreateInstance(collectionType);
- foreach (object element in propertyValue)
- {
- typedAddMethod.Invoke(collection, new object[] { element });
- }
- }
- }
- else
- {
- MethodInfo addMethod = collectionType.GetMethod("Add");
- ExceptionUtilities.CheckObjectNotNull(addMethod, "Could not find constructor or add method for type: " + collectionType.FullName, new object[0]);
- collection = Activator.CreateInstance(collectionType);
- foreach (object element in propertyValue)
- {
- addMethod.Invoke(collection, new object[] { element });
- }
- }
- propertyInfo.SetValue(targetResource, collection, null);
- }
-
- public virtual void SetConcurrencyValues(object resourceCookie, bool? checkForEquality, IEnumerable<KeyValuePair<string, object>> concurrencyValues)
- {
- ExceptionUtilities.CheckArgumentNotNull(resourceCookie, "resourceCookie");
- ExceptionUtilities.ThrowDataServiceExceptionIfFalse(checkForEquality.HasValue, 0x1a1, "Missing concurrency token for update operation", new object[0]);
- ExceptionUtilities.Assert(checkForEquality.Value, "Should not be called with check for equality parameter equal to false", new object[0]);
- ExceptionUtilities.CheckArgumentNotNull(concurrencyValues, "concurrencyValues");
- if (concurrencyValues.Any<KeyValuePair<string, object>>())
- {
- resourceCookie = UpdatableToken.AssertIsTokenAndResolve(resourceCookie, "resourceCookie");
- ExceptionUtilities.ThrowDataServiceExceptionIfFalse(CompareETagValues(this.GetConcurrencyValues(resourceCookie), concurrencyValues), 0x19c, "Concurrency tokens do not match", new object[0]);
- }
- }
-
- private void SetEntityReferenceToNullOnTargetResourceMatch(object targetResource, NavigationPropertyInfo navigationPropertyInfo, object currentEntityInstance)
- {
- if (navigationPropertyInfo.PropertyInfo.GetValue(currentEntityInstance, null) == targetResource)
- {
- this.pendingChanges.Add(delegate {
- navigationPropertyInfo.PropertyInfo.SetValue(currentEntityInstance, null, null);
- });
- }
- }
-
- public virtual void SetReference(object targetResource, string propertyName, object propertyValue)
- {
- ExceptionUtilities.CheckArgumentNotNull(targetResource, "targetResource");
- ExceptionUtilities.CheckArgumentNotNull(propertyName, "propertyName");
- if (propertyValue != null)
- {
- UpdatableToken.AssertIsToken(propertyValue, "propertyValue");
- }
- this.SetValue(targetResource, propertyName, propertyValue);
- }
-
- public virtual void SetValue(object targetResource, string propertyName, object propertyValue)
- {
- ExceptionUtilities.CheckArgumentNotNull(targetResource, "targetResource");
- ExceptionUtilities.CheckArgumentNotNull(propertyName, "propertyName");
- UpdatableToken token = UpdatableToken.AssertIsToken(targetResource, "targetResource");
- targetResource = token.Resource;
- token.PendingPropertyUpdates[propertyName] = propertyValue;
- this.pendingChanges.Add(delegate {
- object generatedValue;
- Type t = targetResource.GetType();
- PropertyInfo pi = t.GetProperty(propertyName);
- ExceptionUtilities.CheckObjectNotNull(pi, "Unable to find property '{0}' on type '{1}'", new object[] { propertyName, targetResource.GetType().Name });
- if (this.TryGetStoreGeneratedValue(GetResourceTypeFullName(t), propertyName, out generatedValue))
- {
- propertyValue = generatedValue;
- }
- if (this.IsCollectionProperty(pi))
- {
- ExceptionUtilities.CheckObjectNotNull(propertyValue, "Collection property value was null", new object[0]);
- IEnumerable enumerable = propertyValue as IEnumerable;
- ExceptionUtilities.CheckObjectNotNull(enumerable, "Collection property value was not an enumerable", new object[0]);
- this.SetCollectionPropertyValue(targetResource, pi, enumerable);
- }
- else
- {
- propertyValue = UpdatableToken.ResolveIfToken(propertyValue);
- pi.SetValue(targetResource, propertyValue, null);
- }
- });
- }
-
- protected virtual bool TryGetStoreGeneratedValue(string fullTypeName, string propertyName, out object propertyValue)
- {
- propertyValue = null;
- return false;
- }
-
- private void ValidateResourceType(object targetResource, string fullTypeName)
- {
- ExceptionUtilities.Assert(this.MetadataHelper.FindClrTypeByFullName(fullTypeName).IsAssignableFrom(targetResource.GetType()), "Invalid uri specified. expected type: '{0}', actual type: '{1}'", new object[] { fullTypeName, targetResource.GetType().FullName });
- }
-
- // Properties
- internal ReflectionMetadataHelper MetadataHelper { get; set; }
-
- internal Dictionary<string, IList> ResourceSetsStorage
- {
- get
- {
- Dictionary<string, IList> resourceSetsLookup = null;
- Type currentContextType = base.GetType();
- ExceptionUtilities.Assert(resourceSetsByContextTypeStorage.TryGetValue(currentContextType, out resourceSetsLookup), "Cannot find resource sets by the context type '{0}'", new object[] { currentContextType });
- return resourceSetsLookup;
- }
- }
-
- #region Inner types.
-
- internal class ReflectionMetadataHelper
- {
- // Fields
- private ReflectionDataContext reflectionDataContext;
-
- // Methods
- public ReflectionMetadataHelper(ReflectionDataContext reflectionDataContext)
- {
- this.reflectionDataContext = reflectionDataContext;
- }
-
- public Type FindClrTypeByFullName(string resourceTypeFullName)
- {
- Type type = this.reflectionDataContext.GetType().Assembly.GetTypes().Where<Type>(delegate (Type t) {
- return (ReflectionDataContext.GetResourceTypeFullName(t) == resourceTypeFullName);
- }).FirstOrDefault<Type>();
- ExceptionUtilities.CheckObjectNotNull(type, "Unable to find type '{0}'", new object[] { resourceTypeFullName });
- return type;
- }
-
- public string[] GetETagPropertiesOfType(string fullTypeName)
- {
- Type type = this.FindClrTypeByFullName(fullTypeName);
- List<string> etags = new List<string>();
- foreach (ETagAttribute customAttribute in type.GetCustomAttributes(typeof(ETagAttribute), true))
- {
- etags.AddRange(customAttribute.PropertyNames);
- }
-
- return etags.ToArray();
- }
-
- public string[] GetKeyProperties(string fullTypeName)
- {
- Type type = this.FindClrTypeByFullName(fullTypeName);
- List<string> keyPropertyList = new List<string>();
- foreach (PropertyInfo keyProperty in type.GetProperties().Where(pi => pi.Name.Contains("ID")))
- {
- keyPropertyList.Add(keyProperty.Name);
- }
-
- return keyPropertyList.ToArray();
- }
-
- public NavigationPropertyInfo[] GetNavigationProperties(string fullTypeName)
- {
- Type type = this.FindClrTypeByFullName(fullTypeName);
- var navigationProperties = new List<NavigationPropertyInfo>();
- var keyProperties = new List<string>(this.GetKeyProperties(fullTypeName));
- foreach (PropertyInfo pi in type.GetProperties())
- {
- if (!keyProperties.Contains(pi.Name))
- {
- if (this.IsTypeAnEntityType(pi.PropertyType))
- {
- navigationProperties.Add(new NavigationPropertyInfo(pi, null));
- }
-
- if (pi.PropertyType.IsGenericType && ((pi.PropertyType.GetGenericTypeDefinition() == typeof(List<>)) || (pi.PropertyType.GetGenericTypeDefinition() == typeof(Collection<>))))
- {
- Type elementType = pi.PropertyType.GetGenericArguments()[0];
- if (this.IsTypeAnEntityType(elementType))
- {
- navigationProperties.Add(new NavigationPropertyInfo(pi, elementType));
- }
- }
- }
- }
-
- return navigationProperties.ToArray();
- }
-
- public string[] GetPropertiesToReset(string fullTypeName)
- {
- Type type = this.FindClrTypeByFullName(fullTypeName);
- var keyProperties = new List<string>(this.GetKeyProperties(fullTypeName));
- var navigationProperties = new List<string>(this.GetNavigationProperties(fullTypeName).Select(ni =>ni.PropertyInfo.Name));
- return type.GetProperties().Where(
- pi => !keyProperties.Contains(pi.Name) && !navigationProperties.Contains(pi.Name)
- ).Select(pi => pi.Name).ToArray();
- }
-
- public string[] GetResourceSetNames()
- {
- return this.reflectionDataContext.GetType().GetProperties().Where(
- pi => pi.PropertyType.IsGenericType && (pi.PropertyType.GetGenericTypeDefinition() == typeof(IQueryable<>))
- ).Select(pi => pi.Name).ToArray();
- }
-
- public Type GetResourceTypeOfSet(string resourceSetName)
- {
- PropertyInfo resourceSetPropertyInfo = this.reflectionDataContext.GetType().GetProperties().Where(pi => pi.Name == resourceSetName).FirstOrDefault();
- ExceptionUtilities.CheckObjectNotNull(resourceSetPropertyInfo, "Error finding type of set '{0}'", new object[] { resourceSetName });
- return resourceSetPropertyInfo.PropertyType.GetGenericArguments()[0];
- }
-
- public bool IsTypeAnEntityType(Type t)
- {
- foreach (string setName in this.GetResourceSetNames())
- {
- if (this.GetResourceTypeOfSet(setName).IsAssignableFrom(t))
- {
- return true;
- }
- }
-
- return false;
- }
- }
-
- internal static class ExceptionUtilities
- {
- // Methods
- public static void Assert(bool condition, string errorMessage, params object[] messageArguments)
- {
- if (!condition)
- {
- throw new InvalidOperationException("Assertion failed: " + string.Format(CultureInfo.InvariantCulture, errorMessage, messageArguments));
- }
- }
-
- public static void CheckArgumentNotNull(object argument, string argumentName)
- {
- if (argument == null)
- {
- throw new ArgumentNullException(argumentName);
- }
- }
-
- public static void CheckCollectionNotEmpty<TElement>(IEnumerable<TElement> argument, string argumentName)
- {
- CheckArgumentNotNull(argument, argumentName);
- if (!argument.Any<TElement>())
- {
- throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "Collection argument '{0}' must have at least one element.", new object[] { argumentName }));
- }
- }
-
- public static void CheckObjectNotNull(object value, string exceptionMessageFormatText, params object[] messageArguments)
- {
- Assert(exceptionMessageFormatText != null, "message cannnot be null", new object[0]);
- Assert(messageArguments != null, "messageArguments cannnot be null", new object[0]);
- if (value == null)
- {
- throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, exceptionMessageFormatText, messageArguments));
- }
- }
-
- public static void ThrowDataServiceExceptionIfFalse(bool condition, int statusCode, string errorMessage, params object[] messageArguments)
- {
- if (!condition)
- {
- throw new DataServiceException(statusCode, string.Format(CultureInfo.InvariantCulture, errorMessage, messageArguments));
- }
- }
- }
-
- public class UpdatableToken
- {
- // Methods
- public UpdatableToken(object resource)
- {
- ExceptionUtilities.CheckArgumentNotNull(resource, "resource");
- this.Resource = resource;
- this.PendingPropertyUpdates = new Dictionary<string, object>();
- }
-
- public static UpdatableToken AssertIsToken(object resource, string name)
- {
- ExceptionUtilities.CheckArgumentNotNull(resource, "resource");
- UpdatableToken token = resource as UpdatableToken;
- ExceptionUtilities.CheckObjectNotNull(token, "{0} was not a token. Type was: '{1}'", new object[] { name, resource.GetType() });
- return token;
- }
-
- public static object AssertIsTokenAndResolve(object resource, string name)
- {
- return AssertIsToken(resource, name).Resource;
- }
-
- public static object ResolveIfToken(object resource)
- {
- UpdatableToken token = resource as UpdatableToken;
- if (token != null)
- {
- resource = token.Resource;
- }
- return resource;
- }
-
- // Properties
- public IDictionary<string, object> PendingPropertyUpdates { get; set; }
-
- public object Resource { get; set; }
- }
-
- internal class NavigationPropertyInfo
- {
- // Methods
- internal NavigationPropertyInfo(PropertyInfo pi, Type collectionElementType)
- {
- this.PropertyInfo = pi;
- this.CollectionElementType = collectionElementType;
- }
-
- // Properties
- public Type CollectionElementType { get; set; }
-
- public PropertyInfo PropertyInfo { get; set; }
- }
-
- #endregion Inner types.
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/503b4417/odatajs/tests/code/csdlreader.cs
----------------------------------------------------------------------
diff --git a/odatajs/tests/code/csdlreader.cs b/odatajs/tests/code/csdlreader.cs
deleted file mode 100644
index c88333e..0000000
--- a/odatajs/tests/code/csdlreader.cs
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * 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.
- */
-
-/// <summary>
-/// Class used to parse csdl to create the metatdata object
-/// </summary>
-///
-
-namespace DataJS.Tests
-{
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Xml.Linq;
-
-
- public static class CsdlReader
- {
- static readonly string knownNamespace = "http://docs.oasis-open.org";
- static readonly string[] repeatingElements =
- {
- "Action",
- "ActionImport",
- "Annotation",
- "Annotations",
- "Apply",
- "Binary",
- "Bool",
- "Cast",
- "Collection",
- "ComplexType",
- "Date",
- "DateTimeOffset",
- "Decimal",
- "Duration",
- "EntitySet",
- "EntityType",
- "EnumMember",
- "EnumType",
- "Float",
- "Function",
- "FunctionImport",
- "Guid",
- "If",
- "Int",
- "IsOf",
- "Key",
- "LabeledElement",
- "LabeledElementReference",
- "Member",
- "NavigationProperty",
- "NavigationPropertyBinding",
- "NavigationPropertyPath",
- "Null",
- "OnDelete",
- "Path",
- "Parameter",
- "Property",
- "PropertyPath",
- "PropertyRef",
- "PropertyValue",
- "Record",
- "ReferentialConstraint",
- "String",
- "Schema",
- "Singleton",
- "Term",
- "TimeOfDay",
- "TypeDefinition",
- "UrlRef",
- "Reference",
- "Include",
- "IncludeAnnotations"
- };
-
- public static Dictionary<string, object> ReadCsdl(TextReader payload)
- {
- return BuildElementJsonObject(XElement.Load(payload));
- }
-
- /// <summary>
- /// Build the attribute object
- /// </summary>
- /// <param name="xmlAttributes">IEnumberable of XAttributes to build the attribute object</param>
- /// <returns>The JsonObject containing the name-value pairs for an element's attributes</returns>
- static Dictionary<string, object> BuildAttributeJsonObject(IEnumerable<XAttribute> xmlAttributes)
- {
- Dictionary<string, object> jsonObject = new Dictionary<string, object>();
-
- foreach (XAttribute attribute in xmlAttributes)
- {
- if (!attribute.IsNamespaceDeclaration)
- {
- string attributeNamespace = attribute.Name.Namespace.ToString();
- if (string.IsNullOrEmpty(attributeNamespace) ||
- attributeNamespace.StartsWith(knownNamespace, StringComparison.InvariantCultureIgnoreCase))
- {
- jsonObject[MakeFirstLetterLowercase(attribute.Name.LocalName)] = attribute.Value;
- }
- }
- }
-
- return jsonObject;
- }
-
- /// <summary>
- /// Creates a JsonObject from an XML container element with each attribute or subelement as a property
- /// </summary>
- /// <param name="container">The XML container</param>
- /// <param name="buildValue">Function that builds a value from a property element</param>
- /// <returns>The JsonObject containing the name-value pairs</returns>
- public static Dictionary<string, object> BuildElementJsonObject(XElement container)
- {
- if (container == null)
- {
- return null;
- }
-
- Dictionary<string, object> jsonObject = new Dictionary<string, object>();
- string keyName = MakeFirstLetterLowercase(container.Name.LocalName);
-
- if (container.HasAttributes || container.HasElements)
- {
- Dictionary<string, List<Dictionary<string, object>>> repeatingObjectArrays = new Dictionary<string, List<Dictionary<string, object>>>();
-
- jsonObject = BuildAttributeJsonObject(container.Attributes());
-
- foreach (XElement propertyElement in container.Elements())
- {
- string propertyName = MakeFirstLetterLowercase(propertyElement.Name.LocalName);
- string properyNamespace = propertyElement.Name.Namespace.ToString();
-
- if (string.IsNullOrEmpty(properyNamespace) || properyNamespace.StartsWith(knownNamespace, StringComparison.InvariantCultureIgnoreCase))
- {
- // Check to see if the element is repeating and needs to be an array
- if (repeatingElements.Contains(propertyElement.Name.LocalName))
- {
- // See if property was already created as an array, if not then create it
- if (!repeatingObjectArrays.ContainsKey(propertyName))
- {
- repeatingObjectArrays.Add(propertyName, new List<Dictionary<string, object>>());
- }
-
- repeatingObjectArrays[propertyName].Add(BuildElementJsonObject(propertyElement));
- }
- else
- {
- jsonObject[propertyName] = BuildElementJsonObject(propertyElement);
- }
- }
- }
-
- foreach (string key in repeatingObjectArrays.Keys)
- {
- jsonObject[key] = repeatingObjectArrays[key].ToArray();
- }
- }
- else
- {
- jsonObject[MakeFirstLetterLowercase(container.Name.LocalName)] = container.Value;
- }
-
- return jsonObject;
- }
-
- /// <summary>
- /// Makes the first letter of a string lowercase
- /// </summary>
- /// <param name="name">The string to be modified</param>
- /// <returns>Modified string</returns>
- private static string MakeFirstLetterLowercase(string str)
- {
- if (!string.IsNullOrWhiteSpace(str))
- {
- if (str.Length > 1 && !(str[1].ToString() == str[1].ToString().ToUpper()))
- {
- return str[0].ToString().ToLower() + str.Substring(1);
- }
- else
- {
- return str;
- }
- }
-
- return str;
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/503b4417/odatajs/tests/code/jsdate.cs
----------------------------------------------------------------------
diff --git a/odatajs/tests/code/jsdate.cs b/odatajs/tests/code/jsdate.cs
deleted file mode 100644
index 4439a3a..0000000
--- a/odatajs/tests/code/jsdate.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * 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.
- */
-
-/// <summary>
-/// The verifiers's representation of a Javascript date object as deserialized by the library
-/// </summary>
-
-namespace DataJS.Tests
-{
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Net;
- using System.Runtime.Serialization;
- using System.ServiceModel;
- using System.ServiceModel.Activation;
- using System.ServiceModel.Syndication;
- using System.ServiceModel.Web;
- using System.Xml;
- using System.Xml.Linq;
- using Microsoft.Spatial;
- using Microsoft.OData.Core;
-
- [Serializable]
- public class JsDate : JsonObject
- {
- private static readonly DateTime JsEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
-
- public JsDate(DateTime dateTime)
- : base()
- {
- this["milliseconds"] = dateTime.Subtract(JsEpoch).TotalMilliseconds;
- }
-
- public JsDate(DateTimeOffset dateTimeOffset)
- : this(dateTimeOffset.UtcDateTime)
- {
- this["__edmType"] = "Edm.DateTimeOffset";
- this["__offset"] = (dateTimeOffset.Offset < TimeSpan.Zero ? "-" : "+") + dateTimeOffset.Offset.ToString("hh':'mm");
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/503b4417/odatajs/tests/code/jsonobject.cs
----------------------------------------------------------------------
diff --git a/odatajs/tests/code/jsonobject.cs b/odatajs/tests/code/jsonobject.cs
deleted file mode 100644
index 27f4b9b..0000000
--- a/odatajs/tests/code/jsonobject.cs
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * 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.
- */
-
-/// <summary>
-/// A weakly typed representation of a JSON object using a dictionary implementation
-/// </summary>
-/// <typeparam name="T">The CLR type of the values of the properties</typeparam>
-
-namespace DataJS.Tests
-{
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Linq;
- using System.Runtime.Serialization;
-
- [Serializable]
- [KnownType(typeof(JsonObject))]
- [KnownType(typeof(JsonObject[]))]
- [KnownType(typeof(JsDate))]
- [KnownType(typeof(List<object>))]
- public class JsonObject : ISerializable, IEnumerable<KeyValuePair<string, object>>
- {
- Dictionary<string, object> dictionary = new Dictionary<string, object>();
-
- public void Remove(string key)
- {
- dictionary.Remove(key);
- }
-
- public object this[string key]
- {
- get
- {
- return this.dictionary[key];
- }
- set
- {
- this.dictionary[key] = value;
- }
- }
-
- public bool ContainsKey(string key)
- {
- return this.dictionary.ContainsKey(key);
- }
-
- public static JsonObject Merge(JsonObject first, JsonObject second)
- {
- if (first == null)
- {
- return second;
- }
-
- if (second != null)
- {
- JsonObject merged = new JsonObject();
- merged.dictionary = new Dictionary<string, object>(first.dictionary);
- foreach (var pair in second.dictionary)
- {
- merged.dictionary[pair.Key] = pair.Value;
- }
- return merged;
- }
- return first;
- }
-
- public void GetObjectData(SerializationInfo info, StreamingContext context)
- {
- this.dictionary.ToList().ForEach(pair => info.AddValue(pair.Key, pair.Value));
- }
-
- public IEnumerator<KeyValuePair<string, object>> GetEnumerator()
- {
- return this.dictionary.GetEnumerator();
- }
-
- IEnumerator IEnumerable.GetEnumerator()
- {
- return this.dictionary.GetEnumerator();
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/503b4417/odatajs/tests/code/readerutils.cs
----------------------------------------------------------------------
diff --git a/odatajs/tests/code/readerutils.cs b/odatajs/tests/code/readerutils.cs
deleted file mode 100644
index 094a70c..0000000
--- a/odatajs/tests/code/readerutils.cs
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * 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.Collections.Generic;
-using System.IO;
-using System.Net;
-using System.Web.Script.Serialization;
-
-namespace DataJS.Tests
-{
- public static class ReaderUtils
- {
- public static JsonObject CreateEntryPropertyMetadata(string type)
- {
- return CreateEntryPropertyMetadata(type, true);
- }
-
- public static JsonObject CreateEntryPropertyMetadata(string type, bool withExtensions)
- {
- JsonObject json = new JsonObject();
- json["type"] = type;
-
-
- // TODO: add proper support for property extensions
- if (withExtensions)
- {
- json["extensions"] = new JsonObject[] { };
- }
-
- return json;
- }
-
- public static JsonObject CreateExtension(string name, string nameSpace, string value)
- {
- JsonObject json = new JsonObject();
- json["name"] = name;
- json["namespaceURI"] = nameSpace;
- json["value"] = value;
- return json;
- }
-
- public static WebRequest CreateRequest(string url, string user = null, string password = null)
- {
- WebRequest request = WebRequest.Create(url);
- if (user != null || password != null)
- {
- request.Credentials = new NetworkCredential(user, password);
- request.PreAuthenticate = true;
- }
-
- return request;
- }
-
- public static Stream ConvertDictionarytoJsonlightStream(Dictionary<string, object> dict)
- {
- MemoryStream stream = new MemoryStream();
- if (dict == null)
- {
- return stream;
- }
-
- string jsonString = new JavaScriptSerializer().Serialize(dict);
- StreamWriter writer = new StreamWriter(stream);
- writer.Write(jsonString);
- writer.Flush();
- stream.Position = 0;
- return stream;
- }
-
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/503b4417/odatajs/tests/common/CacheVerifier.js
----------------------------------------------------------------------
diff --git a/odatajs/tests/common/CacheVerifier.js b/odatajs/tests/common/CacheVerifier.js
deleted file mode 100644
index 1e9f0d4..0000000
--- a/odatajs/tests/common/CacheVerifier.js
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * 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.
- */
-
-// CacheVerifier.js
-// This object verifies the operation of the cache.
-// Internally it maintains a simple model of the cache implemented using a lookup array of the expected cached pages.
-
-(function (window, undefined) {
-
- var CacheVerifier = function (baseUri, pageSize, total, cacheSize) {
- /** Creates a new CacheVerifier
- * @param {String} baseUri - The base URI of the collection
- * @param {Integer} pageSize - The page size used in the cache
- * @param {Integer} total - The total number of items in the collection
- * @param {Integer} cacheSize - Cache size in bytes
- */
- this.baseUri = baseUri;
- this.pageSize = pageSize;
- this.total = total;
- this.cacheSize = (cacheSize !== undefined) ? cacheSize : 1024 * 1024;
- this.actualSize = 0;
- this.actualCount = 0;
- this.cachedPages = [];
- this.exactPageCount = (total % pageSize === 0);
- this.maxPage = Math.floor(total / pageSize);
- this.overflowed = this.cacheSize === 0;
- };
-
- CacheVerifier.mechanisms = {
- memory: "memory",
- indexeddb: "indexeddb",
- dom: "dom",
- best: "best"
- };
-
- CacheVerifier.isMechanismAvailable = function (mechanism) {
- /** Determines if the specified local storage mechanism is available
- * @param mechanism - The name of the mechanism
- * @returns Whether the mechanism is available
- */
- switch (mechanism) {
- case CacheVerifier.mechanisms.indexeddb:
- if (window.msIndexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.indexedDB) {
- return true;
- }
- else {
- return false;
- }
- break;
- case CacheVerifier.mechanisms.dom:
- if (window.localStorage) {
- return true;
- }
- else {
- return false;
- }
- break;
- case CacheVerifier.mechanisms.memory:
- case CacheVerifier.mechanisms.best:
- case undefined:
- return true;
- default:
- return false;
- }
- }
-
- CacheVerifier.prototype.clear = function () {
- /** Clears the cache in the verifier
- */
- this.cachedPages = [];
- this.actualSize = 0;
- this.actualCount = 0;
- this.overflowed = this.cacheSize === 0;
- }
-
- CacheVerifier.prototype.verifyRequests = function (requests, responses, index, count, description, backwards, isPrefetch) {
- /** Verifies the HTTP requests for a single data request, and updates the verifier with cached pages
- * @param {Array} requests - The sequence of request objects (from OData.defaultHttpClient)
- * @param {Array} responses - The sequence of response objects (from OData.defaultHttpClient)
- * @param {Integer} index - The starting index of the read
- * @param {Integer} count - The count of items in the read
- * @param {String} description - The description of the requests being verified
- * @param {Boolean} backwards - Whether or not filterBack is being verified
- * @param {Boolean} isPrefetch - Whether the requests being verified come from the prefetcher
- */
- var that = this;
-
- index = (index < 0 ? 0 : index);
- var pageIndex = function (index) {
- /** Returns the page index that the given item index belongs to
- * @param {Integer} index - The item index
- * @returns The page index
- */
- return Math.floor(index / that.pageSize);
- };
-
- var estimateSize = function (obj) {
- /** Estimates the size of an object in bytes.
- * @param {Object} obj - Object to determine the size of.
- * @returns {Number} Estimated size of the object in bytes.
- */
-
- var size = 0;
- var type = typeof obj;
-
- if (type === "object" && obj) {
- for (var name in obj) {
- size += name.length * 2 + estimateSize(obj[name]);
- }
- } else if (type === "string") {
- size = obj.length * 2;
- } else {
- size = 8;
- }
- return size;
- };
-
- var expectedUris = [];
- var responseIndex = 0;
- if (count >= 0) {
- var minPage = pageIndex(index);
- var maxPage = Math.min(pageIndex(index + count - 1), pageIndex(this.total));
-
- // In the case that the index is outside the range of the collection the minPage will be greater than the maxPage
- maxPage = Math.max(minPage, maxPage);
-
- if (!(isPrefetch && !this.exactPageCount && minPage > this.maxPage)) {
- for (var page = minPage; page <= maxPage && this.actualCount <= this.total && !(isPrefetch && this.overflowed); page++) {
- if (!this.cachedPages[page]) {
-
- expectedUris.push(that.baseUri + "?$skip=" + page * this.pageSize + "&$top=" + (this.pageSize));
-
- var actualPageSize = 0;
- var actualPageCount = 0;
- if (responses[responseIndex] && responses[responseIndex].data) {
- actualPageSize += estimateSize(responses[responseIndex].data);
- actualPageCount += responses[responseIndex].data.value.length;
- // Handle server paging skipToken requests
- while (responses[responseIndex].data["@odata.nextLink"]) {
- var nextLink = responses[responseIndex].data["@odata.nextLink"];
- if (nextLink) {
- var index = that.baseUri.indexOf(".svc/", 0);
- if (index != -1) {
- nextLink = that.baseUri.substring(0, index + 5) + nextLink;
- }
- }
-
- expectedUris.push(nextLink);
- responseIndex++;
- actualPageSize += estimateSize(responses[responseIndex].data);
- actualPageCount += responses[responseIndex].data.value.length;
- }
-
- actualPageSize += 24; // 24 byte overhead for the pages (i)ndex, and (c)ount fields
- }
-
- responseIndex++;
-
- this.overflowed = this.cacheSize >= 0 && this.actualSize + actualPageSize > this.cacheSize;
- if (!this.overflowed) {
- this.cachedPages[page] = true;
- this.actualSize += actualPageSize;
- this.actualCount += actualPageCount;
- }
- }
- }
- }
- }
-
- if (backwards) {
- expectedUris.reverse();
- }
-
- var actualUris = $.map(requests, function (r) { return r.requestUri; });
- djstest.assertAreEqualDeep(actualUris, expectedUris, description);
- };
-
- CacheVerifier.getExpectedFilterResults = function (data, filterIndex, filterCount, predicate, backwards) {
- /** Verifies the cache filter returns the correct data
- * @param {Array} collection - Array of items in the collection
- * @param {Integer} filterIndex - The index value
- * @param {Integer} filterCount - The count value
- * @param {Function} predicate - Predicate to be applied in filter, takes an item
- * @param {Boolean} backwards - Whether or not filterBackwards is being verified
- */
- if (!data || !data.value) {
- return data;
- }
-
- var value = [];
- if (filterCount !== 0) {
- // Convert [item0, item1, ...] into [{ index: 0, item: item0 }, { index: 1, item: item1 }, ...]
- var indexedCollection = $.map(data.value, function (item, index) {
- return { index: index, item: item };
- });
-
- var grepPredicate = function (element, index) {
- return predicate(element.item);
- };
-
- var index = filterIndex < 0 ? 0 : filterIndex;
- var count = filterCount < 0 ? indexedCollection.length : filterCount;
-
- value = backwards ?
- // Slice up to 'index', filter, then slice 'count' number of items from the end
- $.grep(indexedCollection.slice(0, index + 1), grepPredicate).slice(-count) :
- // Slice from 'index' to the end, filter, then slice 'count' number of items from the beginning
- $.grep(indexedCollection.slice(index), grepPredicate).slice(0, count);
- }
-
- var expectedResults = {};
- for (var property in data) {
- if (property == "value") {
- expectedResults[property] = value;
- } else {
- expectedResults[property] = data[property];
- }
- }
-
- return expectedResults;
- };
-
- window.CacheVerifier = CacheVerifier;
-
-})(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/503b4417/odatajs/tests/common/Instrument.js
----------------------------------------------------------------------
diff --git a/odatajs/tests/common/Instrument.js b/odatajs/tests/common/Instrument.js
deleted file mode 100644
index fab583a..0000000
--- a/odatajs/tests/common/Instrument.js
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.
- */
-
-// Instrument.js
-// Instrumentation utilities
-
-(function (window, undefined) {
-
- var warmedUp = false;
- var getBrowserMemorySize = function (success) {
- /** Gets the memory size (in bytes) of the browser process
- * @param {Function} success - The success callback
- */
- var makeRequest = function (success) {
- $.get("./common/Instrument.svc/GetBrowserMemorySize", function (data) {
- success(parseInt(data));
- }, "text");
- };
-
- if (window.CollectGarbage) {
- window.CollectGarbage();
- }
-
- if (!warmedUp) {
- // Make a dummy request to warm it up
- makeRequest(function () {
- warmedUp = true;
- makeRequest(success);
- });
- } else {
- makeRequest(success);
- }
- }
-
- window.Instrument = {
- getBrowserMemorySize: getBrowserMemorySize
- };
-
-})(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/503b4417/odatajs/tests/common/Instrument.svc
----------------------------------------------------------------------
diff --git a/odatajs/tests/common/Instrument.svc b/odatajs/tests/common/Instrument.svc
deleted file mode 100644
index 111020f..0000000
--- a/odatajs/tests/common/Instrument.svc
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * 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.
-*/
-
-<%@ ServiceHost Language="C#" Debug="true" Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory"
- Service="DataJS.Tests.Instrument" %>
-
-namespace DataJS.Tests
-{
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.IO;
- using System.Linq;
- using System.Runtime.Serialization;
- using System.ServiceModel;
- using System.ServiceModel.Activation;
- using System.ServiceModel.Syndication;
- using System.ServiceModel.Web;
- using System.Text;
-
- /// <summary>
- /// Instrumentation utilities
- /// </summary>
- [ServiceContract]
- [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
- [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
- public class Instrument
- {
- static readonly Dictionary<string, string> userAgents = new Dictionary<string,string>
- {
- { "MSIE", "iexplore" },
- { "Firefox", "firefox" },
- { "Chrome", "chrome" },
- { "Safari", "safari" }
- };
-
- /// <summary>
- /// Gets the memory size used by the browser
- /// </summary>
- /// <returns>The memory size used by the browser (in bytes), or zero if browser is not supported</returns>
- [OperationContract]
- [WebGet]
- public Stream GetBrowserMemorySize()
- {
- string userAgentString = WebOperationContext.Current.IncomingRequest.UserAgent;
- string userAgentKey = Instrument.userAgents.Keys.FirstOrDefault(ua => userAgentString.Contains(ua));
-
- if (userAgentKey != null)
- {
- string processName = userAgents[userAgentKey];
- long totalMemory = Process.GetProcessesByName(processName).Select(p => p.WorkingSet64).Sum();
-
- return new MemoryStream(Encoding.UTF8.GetBytes(totalMemory.ToString()));
- }
- else
- {
- return new MemoryStream(Encoding.UTF8.GetBytes("0"));
- }
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/503b4417/odatajs/tests/common/ODataVerifyReader.svc
----------------------------------------------------------------------
diff --git a/odatajs/tests/common/ODataVerifyReader.svc b/odatajs/tests/common/ODataVerifyReader.svc
deleted file mode 100644
index 6b71acf..0000000
--- a/odatajs/tests/common/ODataVerifyReader.svc
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * 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.
-*/
-
-<%@ ServiceHost Language="C#" Debug="true" Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory"
- Service="DataJS.Tests.ODataVerifyReader" %>
-
-//uncomment this line to debug JSON serialization.
-//#define DEBUG_SERIALIZATION
-
-namespace DataJS.Tests
-{
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Net;
- using System.Runtime.Serialization;
- using System.ServiceModel;
- using System.ServiceModel.Activation;
- using System.ServiceModel.Syndication;
- using System.ServiceModel.Web;
- using System.Xml;
- using System.Xml.Linq;
- using Microsoft.Spatial;
- using Microsoft.OData.Core;
- using System.Web.Script.Serialization;
-
- /// <summary>
- /// Verifier for the OData.read library function
- /// </summary>
- [ServiceContract]
- [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
- [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
- public class ODataVerifyReader
- {
- const string jsonlightMediaType = "application/json";
-
- /// <summary>
- /// Reads a URI that will return a metadata object
- /// </summary>
- /// <param name="url">The URL to send the request to</param>
- /// <returns>Stream of metadata in json light format</returns>
- [OperationContract]
- [WebGet]
- public Stream ReadMetadata(string url)
- {
- WebResponse response = WebRequest.Create(ResolveUri(url, UriKind.Absolute)).GetResponse();
- Dictionary<string, object> jsonObject = CsdlReader.ReadCsdl(new StreamReader(response.GetResponseStream()));
- return ReaderUtils.ConvertDictionarytoJsonlightStream(jsonObject);
- }
-
- /// <summary>
- /// Reads a URI that will get the Json response and return the stream
- /// </summary>
- /// <param name="url">URL of the entry</param>
- /// <param name="user">The username for basic authentication</param>
- /// <param name="password">The password for basic authentication</param>
- /// <returns>Stream of the Json response expected to be returned by OData.read</returns>
- [OperationContract]
- [WebGet(ResponseFormat = WebMessageFormat.Json)]
- public Stream ReadJson(string url, string mimeType, string user, string password)
- {
- if (mimeType == null)
- {
- mimeType = jsonlightMediaType + ";odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=false;charset=utf-8";
- }
-
- HttpWebRequest request = (HttpWebRequest)ReaderUtils.CreateRequest(ResolveUri(url, UriKind.Absolute), user, password);
- request.Accept = mimeType;
- WebResponse response = request.GetResponse();
-
- return response.GetResponseStream();
- }
-
- /// <summary>
- /// Resolves the given url string to a URI
- /// </summary>
- /// <param name="url">The given URL string</param>
- /// <param name="urlKind">URI kind to resolve to</param>
- /// <returns>The resolved URI</returns>
- private static string ResolveUri(string url, UriKind uriKind)
- {
- Uri resolvedUri = new Uri(url, UriKind.RelativeOrAbsolute);
- if (!resolvedUri.IsAbsoluteUri)
- {
- // If the given URI is relative, then base it on the Referer URI
- Uri baseUri = new Uri(WebOperationContext.Current.IncomingRequest.Headers["Referer"]);
- resolvedUri = new Uri(baseUri, resolvedUri);
- if (uriKind == UriKind.Relative)
- {
- resolvedUri = baseUri.MakeRelativeUri(resolvedUri);
- }
- }
-
- return resolvedUri.ToString();
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/503b4417/odatajs/tests/common/ObservableHttpClient.js
----------------------------------------------------------------------
diff --git a/odatajs/tests/common/ObservableHttpClient.js b/odatajs/tests/common/ObservableHttpClient.js
deleted file mode 100644
index 9be75f8..0000000
--- a/odatajs/tests/common/ObservableHttpClient.js
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * 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.
- */
-
-// ObservableHttpClient.js
-// This object extends OData's default httpClient by supporting request and response recording sessions, and firing a custom
-// JQuery event for each request/response.
-//
-// The events fired by this object are:
-// request: Before a request is made
-// success: Before the primary success handler is called
-//
-// To bind to an event, JQuery event attachers can be used on the object, e.g.
-// $(observableHttpClient).bind("request", function (request) { ... });
-//
-// To begin a new recording session, use:
-// var session = observableHttpClient.newSession();
-//
-// Requests and responses are then recorded in session.requests and session.responses. Session can be ended by session.end().
-// Multiple simultaneous sessions are supported.
-
-(function (window, undefined) {
-
- var ObservableHttpClient = function (provider) {
- this.provider = provider ? provider : window.odatajs.oData.net.defaultHttpClient;
- };
-
- ObservableHttpClient.prototype.newSession = function () {
- return new Session(this);
- };
-
- ObservableHttpClient.prototype.request = function (request, success, error) {
- var that = this;
-
- $(this).triggerHandler("request", request);
- return this.provider.request(request, function (response) {
- $(that).triggerHandler("success", response);
- success(response);
- }, error);
- };
-
-
- var Session = function (client) {
- var that = this;
-
- this.client = client;
- this.clear();
-
- this.requestHandler = function (event, request) { that.requests.push(request); };
- $(client).bind("request", this.requestHandler);
-
- this.successHandler = function (event, response) { that.responses.push(response); };
- $(client).bind("success", this.successHandler);
- };
-
- Session.prototype.clear = function () {
- this.requests = [];
- this.responses = [];
- }
-
- Session.prototype.end = function () {
- $(this.client).unbind("request", this.requestHandler);
- $(this.client).unbind("success", this.successHandler);
- };
-
- window.ObservableHttpClient = ObservableHttpClient;
- window.Session = Session;
-
-})(this);
\ No newline at end of file