parent
1b1bcabbb1
commit
f32212d160
@ -1,6 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="morelinq" version="1.0.16006" targetFramework="net45" />
|
||||
<package id="ServiceStack.Common" version="3.9.70" targetFramework="net45" />
|
||||
<package id="ServiceStack.Text" version="3.9.70" targetFramework="net45" />
|
||||
</packages>
|
@ -1,7 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="NLog" version="2.1.0" targetFramework="net45" />
|
||||
<package id="ServiceStack.Text" version="3.9.70" targetFramework="net45" />
|
||||
<package id="sharpcompress" version="0.10.1.3" targetFramework="net45" />
|
||||
<package id="SimpleInjector" version="2.3.6" targetFramework="net45" />
|
||||
</packages>
|
@ -1,5 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="ServiceStack.Common" version="3.9.70" targetFramework="net45" />
|
||||
<package id="ServiceStack.Text" version="3.9.70" targetFramework="net45" />
|
||||
</packages>
|
@ -1,642 +0,0 @@
|
||||
using Funq;
|
||||
using MediaBrowser.Common;
|
||||
using MediaBrowser.Common.Extensions;
|
||||
using MediaBrowser.Common.Net;
|
||||
using MediaBrowser.Model.Logging;
|
||||
using ServiceStack.Api.Swagger;
|
||||
using ServiceStack.Common.Web;
|
||||
using ServiceStack.Configuration;
|
||||
using ServiceStack.Logging;
|
||||
using ServiceStack.ServiceHost;
|
||||
using ServiceStack.ServiceInterface.Cors;
|
||||
using ServiceStack.Text;
|
||||
using ServiceStack.WebHost.Endpoints;
|
||||
using ServiceStack.WebHost.Endpoints.Extensions;
|
||||
using ServiceStack.WebHost.Endpoints.Support;
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Net.WebSockets;
|
||||
using System.Reactive.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MediaBrowser.Server.Implementations.HttpServer
|
||||
{
|
||||
/// <summary>
|
||||
/// Class HttpServer
|
||||
/// </summary>
|
||||
public class HttpServer : HttpListenerBase, IHttpServer
|
||||
{
|
||||
/// <summary>
|
||||
/// The logger
|
||||
/// </summary>
|
||||
private readonly ILogger _logger;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the URL prefix.
|
||||
/// </summary>
|
||||
/// <value>The URL prefix.</value>
|
||||
public string UrlPrefix { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// The _rest services
|
||||
/// </summary>
|
||||
private readonly List<IRestfulService> _restServices = new List<IRestfulService>();
|
||||
|
||||
/// <summary>
|
||||
/// This subscribes to HttpListener requests and finds the appropriate BaseHandler to process it
|
||||
/// </summary>
|
||||
/// <value>The HTTP listener.</value>
|
||||
private IDisposable HttpListener { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Occurs when [web socket connected].
|
||||
/// </summary>
|
||||
public event EventHandler<WebSocketConnectEventArgs> WebSocketConnected;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the default redirect path.
|
||||
/// </summary>
|
||||
/// <value>The default redirect path.</value>
|
||||
private string DefaultRedirectPath { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the name of the server.
|
||||
/// </summary>
|
||||
/// <value>The name of the server.</value>
|
||||
private string ServerName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The _container adapter
|
||||
/// </summary>
|
||||
private readonly ContainerAdapter _containerAdapter;
|
||||
|
||||
private readonly ConcurrentDictionary<string, string> _localEndPoints = new ConcurrentDictionary<string, string>(StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the local end points.
|
||||
/// </summary>
|
||||
/// <value>The local end points.</value>
|
||||
public IEnumerable<string> LocalEndPoints
|
||||
{
|
||||
get { return _localEndPoints.Keys.ToList(); }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="HttpServer" /> class.
|
||||
/// </summary>
|
||||
/// <param name="applicationHost">The application host.</param>
|
||||
/// <param name="logManager">The log manager.</param>
|
||||
/// <param name="serverName">Name of the server.</param>
|
||||
/// <param name="defaultRedirectpath">The default redirectpath.</param>
|
||||
/// <exception cref="System.ArgumentNullException">urlPrefix</exception>
|
||||
public HttpServer(IApplicationHost applicationHost, ILogManager logManager, string serverName, string defaultRedirectpath)
|
||||
: base()
|
||||
{
|
||||
if (logManager == null)
|
||||
{
|
||||
throw new ArgumentNullException("logManager");
|
||||
}
|
||||
if (applicationHost == null)
|
||||
{
|
||||
throw new ArgumentNullException("applicationHost");
|
||||
}
|
||||
if (string.IsNullOrEmpty(serverName))
|
||||
{
|
||||
throw new ArgumentNullException("serverName");
|
||||
}
|
||||
if (string.IsNullOrEmpty(defaultRedirectpath))
|
||||
{
|
||||
throw new ArgumentNullException("defaultRedirectpath");
|
||||
}
|
||||
|
||||
ServerName = serverName;
|
||||
DefaultRedirectPath = defaultRedirectpath;
|
||||
_logger = logManager.GetLogger("HttpServer");
|
||||
|
||||
LogManager.LogFactory = new ServerLogFactory(logManager);
|
||||
|
||||
EndpointHostConfig.Instance.ServiceStackHandlerFactoryPath = null;
|
||||
EndpointHostConfig.Instance.MetadataRedirectPath = "metadata";
|
||||
|
||||
_containerAdapter = new ContainerAdapter(applicationHost);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The us culture
|
||||
/// </summary>
|
||||
protected static readonly CultureInfo UsCulture = new CultureInfo("en-US");
|
||||
|
||||
/// <summary>
|
||||
/// Configures the specified container.
|
||||
/// </summary>
|
||||
/// <param name="container">The container.</param>
|
||||
public override void Configure(Container container)
|
||||
{
|
||||
JsConfig.DateHandler = JsonDateHandler.ISO8601;
|
||||
JsConfig.ExcludeTypeInfo = true;
|
||||
JsConfig.IncludeNullValues = false;
|
||||
|
||||
SetConfig(new EndpointHostConfig
|
||||
{
|
||||
DefaultRedirectPath = DefaultRedirectPath,
|
||||
|
||||
MapExceptionToStatusCode = {
|
||||
{ typeof(InvalidOperationException), 422 },
|
||||
{ typeof(ResourceNotFoundException), 404 },
|
||||
{ typeof(FileNotFoundException), 404 },
|
||||
{ typeof(DirectoryNotFoundException), 404 }
|
||||
},
|
||||
|
||||
DebugMode = true,
|
||||
|
||||
ServiceName = ServerName,
|
||||
|
||||
LogFactory = LogManager.LogFactory,
|
||||
|
||||
// The Markdown feature causes slow startup times (5 mins+) on cold boots for some users
|
||||
// Custom format allows images
|
||||
EnableFeatures = Feature.Csv | Feature.Html | Feature.Json | Feature.Jsv | Feature.Metadata | Feature.Xml | Feature.CustomFormat
|
||||
});
|
||||
|
||||
container.Adapter = _containerAdapter;
|
||||
|
||||
Plugins.Add(new SwaggerFeature());
|
||||
Plugins.Add(new CorsFeature());
|
||||
|
||||
ResponseFilters.Add(FilterResponse);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Filters the response.
|
||||
/// </summary>
|
||||
/// <param name="req">The req.</param>
|
||||
/// <param name="res">The res.</param>
|
||||
/// <param name="dto">The dto.</param>
|
||||
private void FilterResponse(IHttpRequest req, IHttpResponse res, object dto)
|
||||
{
|
||||
// Try to prevent compatibility view
|
||||
res.AddHeader("X-UA-Compatible", "IE=Edge");
|
||||
|
||||
var exception = dto as Exception;
|
||||
|
||||
if (exception != null)
|
||||
{
|
||||
_logger.ErrorException("Error processing request for {0}", exception, req.RawUrl);
|
||||
|
||||
if (!string.IsNullOrEmpty(exception.Message))
|
||||
{
|
||||
var error = exception.Message.Replace(Environment.NewLine, " ");
|
||||
error = RemoveControlCharacters(error);
|
||||
|
||||
res.AddHeader("X-Application-Error-Code", error);
|
||||
}
|
||||
}
|
||||
|
||||
if (dto is CompressedResult)
|
||||
{
|
||||
// Per Google PageSpeed
|
||||
// This instructs the proxies to cache two versions of the resource: one compressed, and one uncompressed.
|
||||
// The correct version of the resource is delivered based on the client request header.
|
||||
// This is a good choice for applications that are singly homed and depend on public proxies for user locality.
|
||||
res.AddHeader("Vary", "Accept-Encoding");
|
||||
}
|
||||
|
||||
var hasOptions = dto as IHasOptions;
|
||||
|
||||
if (hasOptions != null)
|
||||
{
|
||||
// Content length has to be explicitly set on on HttpListenerResponse or it won't be happy
|
||||
string contentLength;
|
||||
|
||||
if (hasOptions.Options.TryGetValue("Content-Length", out contentLength) && !string.IsNullOrEmpty(contentLength))
|
||||
{
|
||||
var length = long.Parse(contentLength, UsCulture);
|
||||
|
||||
if (length > 0)
|
||||
{
|
||||
var response = (HttpListenerResponse)res.OriginalResponse;
|
||||
|
||||
response.ContentLength64 = length;
|
||||
|
||||
// Disable chunked encoding. Technically this is only needed when using Content-Range, but
|
||||
// anytime we know the content length there's no need for it
|
||||
response.SendChunked = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Removes the control characters.
|
||||
/// </summary>
|
||||
/// <param name="inString">The in string.</param>
|
||||
/// <returns>System.String.</returns>
|
||||
private static string RemoveControlCharacters(string inString)
|
||||
{
|
||||
if (inString == null) return null;
|
||||
|
||||
var newString = new StringBuilder();
|
||||
|
||||
foreach (var ch in inString)
|
||||
{
|
||||
if (!char.IsControl(ch))
|
||||
{
|
||||
newString.Append(ch);
|
||||
}
|
||||
}
|
||||
return newString.ToString();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Starts the Web Service
|
||||
/// </summary>
|
||||
/// <param name="urlBase">A Uri that acts as the base that the server is listening on.
|
||||
/// Format should be: http://127.0.0.1:8080/ or http://127.0.0.1:8080/somevirtual/
|
||||
/// Note: the trailing slash is required! For more info see the
|
||||
/// HttpListener.Prefixes property on MSDN.</param>
|
||||
/// <exception cref="System.ArgumentNullException">urlBase</exception>
|
||||
public override void Start(string urlBase)
|
||||
{
|
||||
if (string.IsNullOrEmpty(urlBase))
|
||||
{
|
||||
throw new ArgumentNullException("urlBase");
|
||||
}
|
||||
|
||||
// *** Already running - just leave it in place
|
||||
if (IsStarted)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (Listener == null)
|
||||
{
|
||||
_logger.Info("Creating HttpListner");
|
||||
Listener = new HttpListener();
|
||||
}
|
||||
|
||||
EndpointHost.Config.ServiceStackHandlerFactoryPath = HttpListenerRequestWrapper.GetHandlerPathIfAny(urlBase);
|
||||
|
||||
UrlPrefix = urlBase;
|
||||
|
||||
_logger.Info("Adding HttpListener Prefixes");
|
||||
Listener.Prefixes.Add(urlBase);
|
||||
|
||||
IsStarted = true;
|
||||
_logger.Info("Starting HttpListner");
|
||||
Listener.Start();
|
||||
|
||||
_logger.Info("Creating HttpListner observable stream");
|
||||
HttpListener = CreateObservableStream().Subscribe(ProcessHttpRequestAsync);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates the observable stream.
|
||||
/// </summary>
|
||||
/// <returns>IObservable{HttpListenerContext}.</returns>
|
||||
private IObservable<HttpListenerContext> CreateObservableStream()
|
||||
{
|
||||
return Observable.Create<HttpListenerContext>(obs =>
|
||||
Observable.FromAsync(() => Listener.GetContextAsync())
|
||||
.Subscribe(obs))
|
||||
.Repeat()
|
||||
.Retry()
|
||||
.Publish()
|
||||
.RefCount();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Processes incoming http requests by routing them to the appropiate handler
|
||||
/// </summary>
|
||||
/// <param name="context">The CTX.</param>
|
||||
private async void ProcessHttpRequestAsync(HttpListenerContext context)
|
||||
{
|
||||
var date = DateTime.Now;
|
||||
|
||||
LogHttpRequest(context);
|
||||
|
||||
if (context.Request.IsWebSocketRequest)
|
||||
{
|
||||
await ProcessWebSocketRequest(context).ConfigureAwait(false);
|
||||
return;
|
||||
}
|
||||
|
||||
var localPath = context.Request.Url.LocalPath;
|
||||
|
||||
if (string.Equals(localPath, "/mediabrowser/", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
context.Response.Redirect(DefaultRedirectPath);
|
||||
context.Response.Close();
|
||||
return;
|
||||
}
|
||||
if (string.Equals(localPath, "/mediabrowser", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
context.Response.Redirect("mediabrowser/" + DefaultRedirectPath);
|
||||
context.Response.Close();
|
||||
return;
|
||||
}
|
||||
if (string.Equals(localPath, "/", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
context.Response.Redirect("mediabrowser/" + DefaultRedirectPath);
|
||||
context.Response.Close();
|
||||
return;
|
||||
}
|
||||
if (string.IsNullOrEmpty(localPath))
|
||||
{
|
||||
context.Response.Redirect("/mediabrowser/" + DefaultRedirectPath);
|
||||
context.Response.Close();
|
||||
return;
|
||||
}
|
||||
|
||||
RaiseReceiveWebRequest(context);
|
||||
|
||||
await Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
var url = context.Request.Url.ToString();
|
||||
var endPoint = context.Request.RemoteEndPoint;
|
||||
|
||||
ProcessRequest(context);
|
||||
|
||||
var duration = DateTime.Now - date;
|
||||
|
||||
LogResponse(context, url, endPoint, duration);
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.ErrorException("ProcessRequest failure", ex);
|
||||
}
|
||||
|
||||
}).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Processes the web socket request.
|
||||
/// </summary>
|
||||
/// <param name="ctx">The CTX.</param>
|
||||
/// <returns>Task.</returns>
|
||||
private async Task ProcessWebSocketRequest(HttpListenerContext ctx)
|
||||
{
|
||||
#if __MonoCS__
|
||||
#else
|
||||
try
|
||||
{
|
||||
var webSocketContext = await ctx.AcceptWebSocketAsync(null).ConfigureAwait(false);
|
||||
if (WebSocketConnected != null)
|
||||
{
|
||||
WebSocketConnected(this, new WebSocketConnectEventArgs { WebSocket = new NativeWebSocket(webSocketContext.WebSocket, _logger), Endpoint = ctx.Request.RemoteEndPoint.ToString() });
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.ErrorException("AcceptWebSocketAsync error", ex);
|
||||
ctx.Response.StatusCode = 500;
|
||||
ctx.Response.Close();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Logs the HTTP request.
|
||||
/// </summary>
|
||||
/// <param name="ctx">The CTX.</param>
|
||||
private void LogHttpRequest(HttpListenerContext ctx)
|
||||
{
|
||||
var endpoint = ctx.Request.LocalEndPoint;
|
||||
|
||||
if (endpoint != null)
|
||||
{
|
||||
var address = endpoint.ToString();
|
||||
|
||||
_localEndPoints.GetOrAdd(address, address);
|
||||
}
|
||||
|
||||
if (EnableHttpRequestLogging)
|
||||
{
|
||||
var log = new StringBuilder();
|
||||
|
||||
log.AppendLine("Url: " + ctx.Request.Url);
|
||||
log.AppendLine("Headers: " + string.Join(",", ctx.Request.Headers.AllKeys.Select(k => k + "=" + ctx.Request.Headers[k])));
|
||||
|
||||
var type = ctx.Request.IsWebSocketRequest ? "Web Socket" : "HTTP " + ctx.Request.HttpMethod;
|
||||
|
||||
_logger.LogMultiline(type + " request received from " + ctx.Request.RemoteEndPoint, LogSeverity.Debug, log);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Overridable method that can be used to implement a custom hnandler
|
||||
/// </summary>
|
||||
/// <param name="context">The context.</param>
|
||||
/// <exception cref="System.NotImplementedException">Cannot execute handler: + handler + at PathInfo: + httpReq.PathInfo</exception>
|
||||
protected override void ProcessRequest(HttpListenerContext context)
|
||||
{
|
||||
if (string.IsNullOrEmpty(context.Request.RawUrl)) return;
|
||||
|
||||
var operationName = context.Request.GetOperationName();
|
||||
|
||||
var httpReq = new HttpListenerRequestWrapper(operationName, context.Request);
|
||||
var httpRes = new HttpListenerResponseWrapper(context.Response);
|
||||
var handler = ServiceStackHttpHandlerFactory.GetHandler(httpReq);
|
||||
|
||||
var serviceStackHandler = handler as IServiceStackHttpHandler;
|
||||
|
||||
if (serviceStackHandler != null)
|
||||
{
|
||||
var restHandler = serviceStackHandler as RestHandler;
|
||||
if (restHandler != null)
|
||||
{
|
||||
httpReq.OperationName = operationName = restHandler.RestPath.RequestType.Name;
|
||||
}
|
||||
serviceStackHandler.ProcessRequest(httpReq, httpRes, operationName);
|
||||
return;
|
||||
}
|
||||
|
||||
throw new NotImplementedException("Cannot execute handler: " + handler + " at PathInfo: " + httpReq.PathInfo);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Logs the response.
|
||||
/// </summary>
|
||||
/// <param name="ctx">The CTX.</param>
|
||||
/// <param name="url">The URL.</param>
|
||||
/// <param name="endPoint">The end point.</param>
|
||||
/// <param name="duration">The duration.</param>
|
||||
private void LogResponse(HttpListenerContext ctx, string url, IPEndPoint endPoint, TimeSpan duration)
|
||||
{
|
||||
if (!EnableHttpRequestLogging)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var statusCode = ctx.Response.StatusCode;
|
||||
|
||||
var log = new StringBuilder();
|
||||
|
||||
log.AppendLine(string.Format("Url: {0}", url));
|
||||
|
||||
log.AppendLine("Headers: " + string.Join(",", ctx.Response.Headers.AllKeys.Select(k => k + "=" + ctx.Response.Headers[k])));
|
||||
|
||||
var responseTime = string.Format(". Response time: {0} ms", duration.TotalMilliseconds);
|
||||
|
||||
var msg = "Response code " + statusCode + " sent to " + endPoint + responseTime;
|
||||
|
||||
_logger.LogMultiline(msg, LogSeverity.Debug, log);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates the service manager.
|
||||
/// </summary>
|
||||
/// <param name="assembliesWithServices">The assemblies with services.</param>
|
||||
/// <returns>ServiceManager.</returns>
|
||||
protected override ServiceManager CreateServiceManager(params Assembly[] assembliesWithServices)
|
||||
{
|
||||
var types = _restServices.Select(r => r.GetType()).ToArray();
|
||||
|
||||
return new ServiceManager(new Container(), new ServiceController(() => types));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Shut down the Web Service
|
||||
/// </summary>
|
||||
public override void Stop()
|
||||
{
|
||||
if (HttpListener != null)
|
||||
{
|
||||
HttpListener.Dispose();
|
||||
HttpListener = null;
|
||||
}
|
||||
|
||||
if (Listener != null)
|
||||
{
|
||||
Listener.Prefixes.Remove(UrlPrefix);
|
||||
}
|
||||
|
||||
base.Stop();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The _supports native web socket
|
||||
/// </summary>
|
||||
private bool? _supportsNativeWebSocket;
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether [supports web sockets].
|
||||
/// </summary>
|
||||
/// <value><c>true</c> if [supports web sockets]; otherwise, <c>false</c>.</value>
|
||||
public bool SupportsWebSockets
|
||||
{
|
||||
get
|
||||
{
|
||||
#if __MonoCS__
|
||||
return false;
|
||||
#else
|
||||
#endif
|
||||
|
||||
if (!_supportsNativeWebSocket.HasValue)
|
||||
{
|
||||
try
|
||||
{
|
||||
new ClientWebSocket();
|
||||
|
||||
_supportsNativeWebSocket = true;
|
||||
}
|
||||
catch (PlatformNotSupportedException)
|
||||
{
|
||||
_supportsNativeWebSocket = false;
|
||||
}
|
||||
}
|
||||
|
||||
return _supportsNativeWebSocket.Value;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether [enable HTTP request logging].
|
||||
/// </summary>
|
||||
/// <value><c>true</c> if [enable HTTP request logging]; otherwise, <c>false</c>.</value>
|
||||
public bool EnableHttpRequestLogging { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Adds the rest handlers.
|
||||
/// </summary>
|
||||
/// <param name="services">The services.</param>
|
||||
public void Init(IEnumerable<IRestfulService> services)
|
||||
{
|
||||
_restServices.AddRange(services);
|
||||
|
||||
_logger.Info("Calling EndpointHost.ConfigureHost");
|
||||
|
||||
EndpointHost.ConfigureHost(this, ServerName, CreateServiceManager());
|
||||
|
||||
_logger.Info("Calling ServiceStack AppHost.Init");
|
||||
Init();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Releases the specified instance.
|
||||
/// </summary>
|
||||
/// <param name="instance">The instance.</param>
|
||||
public override void Release(object instance)
|
||||
{
|
||||
// Leave this empty so SS doesn't try to dispose our objects
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Class ContainerAdapter
|
||||
/// </summary>
|
||||
class ContainerAdapter : IContainerAdapter, IRelease
|
||||
{
|
||||
/// <summary>
|
||||
/// The _app host
|
||||
/// </summary>
|
||||
private readonly IApplicationHost _appHost;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="ContainerAdapter" /> class.
|
||||
/// </summary>
|
||||
/// <param name="appHost">The app host.</param>
|
||||
public ContainerAdapter(IApplicationHost appHost)
|
||||
{
|
||||
_appHost = appHost;
|
||||
}
|
||||
/// <summary>
|
||||
/// Resolves this instance.
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <returns>``0.</returns>
|
||||
public T Resolve<T>()
|
||||
{
|
||||
return _appHost.Resolve<T>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Tries the resolve.
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <returns>``0.</returns>
|
||||
public T TryResolve<T>()
|
||||
{
|
||||
return _appHost.TryResolve<T>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Releases the specified instance.
|
||||
/// </summary>
|
||||
/// <param name="instance">The instance.</param>
|
||||
public void Release(object instance)
|
||||
{
|
||||
// Leave this empty so SS doesn't try to dispose our objects
|
||||
}
|
||||
}
|
||||
}
|
@ -1,135 +0,0 @@
|
||||
/*
|
||||
|
||||
Original style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>
|
||||
|
||||
*/
|
||||
|
||||
pre code {
|
||||
display: block; padding: 0.5em;
|
||||
background: #F0F0F0;
|
||||
}
|
||||
|
||||
pre code,
|
||||
pre .subst,
|
||||
pre .tag .title,
|
||||
pre .lisp .title,
|
||||
pre .clojure .built_in,
|
||||
pre .nginx .title {
|
||||
color: black;
|
||||
}
|
||||
|
||||
pre .string,
|
||||
pre .title,
|
||||
pre .constant,
|
||||
pre .parent,
|
||||
pre .tag .value,
|
||||
pre .rules .value,
|
||||
pre .rules .value .number,
|
||||
pre .preprocessor,
|
||||
pre .ruby .symbol,
|
||||
pre .ruby .symbol .string,
|
||||
pre .aggregate,
|
||||
pre .template_tag,
|
||||
pre .django .variable,
|
||||
pre .smalltalk .class,
|
||||
pre .addition,
|
||||
pre .flow,
|
||||
pre .stream,
|
||||
pre .bash .variable,
|
||||
pre .apache .tag,
|
||||
pre .apache .cbracket,
|
||||
pre .tex .command,
|
||||
pre .tex .special,
|
||||
pre .erlang_repl .function_or_atom,
|
||||
pre .markdown .header {
|
||||
color: #800;
|
||||
}
|
||||
|
||||
pre .comment,
|
||||
pre .annotation,
|
||||
pre .template_comment,
|
||||
pre .diff .header,
|
||||
pre .chunk,
|
||||
pre .markdown .blockquote {
|
||||
color: #888;
|
||||
}
|
||||
|
||||
pre .number,
|
||||
pre .date,
|
||||
pre .regexp,
|
||||
pre .literal,
|
||||
pre .smalltalk .symbol,
|
||||
pre .smalltalk .char,
|
||||
pre .go .constant,
|
||||
pre .change,
|
||||
pre .markdown .bullet,
|
||||
pre .markdown .link_url {
|
||||
color: #080;
|
||||
}
|
||||
|
||||
pre .label,
|
||||
pre .javadoc,
|
||||
pre .ruby .string,
|
||||
pre .decorator,
|
||||
pre .filter .argument,
|
||||
pre .localvars,
|
||||
pre .array,
|
||||
pre .attr_selector,
|
||||
pre .important,
|
||||
pre .pseudo,
|
||||
pre .pi,
|
||||
pre .doctype,
|
||||
pre .deletion,
|
||||
pre .envvar,
|
||||
pre .shebang,
|
||||
pre .apache .sqbracket,
|
||||
pre .nginx .built_in,
|
||||
pre .tex .formula,
|
||||
pre .erlang_repl .reserved,
|
||||
pre .prompt,
|
||||
pre .markdown .link_label,
|
||||
pre .vhdl .attribute,
|
||||
pre .clojure .attribute,
|
||||
pre .coffeescript .property {
|
||||
color: #88F
|
||||
}
|
||||
|
||||
pre .keyword,
|
||||
pre .id,
|
||||
pre .phpdoc,
|
||||
pre .title,
|
||||
pre .built_in,
|
||||
pre .aggregate,
|
||||
pre .css .tag,
|
||||
pre .javadoctag,
|
||||
pre .phpdoc,
|
||||
pre .yardoctag,
|
||||
pre .smalltalk .class,
|
||||
pre .winutils,
|
||||
pre .bash .variable,
|
||||
pre .apache .tag,
|
||||
pre .go .typename,
|
||||
pre .tex .command,
|
||||
pre .markdown .strong,
|
||||
pre .request,
|
||||
pre .status {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
pre .markdown .emphasis {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
pre .nginx .built_in {
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
pre .coffeescript .javascript,
|
||||
pre .javascript .xml,
|
||||
pre .tex .formula,
|
||||
pre .xml .javascript,
|
||||
pre .xml .vbscript,
|
||||
pre .xml .css,
|
||||
pre .xml .cdata {
|
||||
opacity: 0.5;
|
||||
}
|
File diff suppressed because it is too large
Load Diff
Before Width: | Height: | Size: 770 B |
Before Width: | Height: | Size: 824 B |
Before Width: | Height: | Size: 9.0 KiB |
Before Width: | Height: | Size: 980 B |
@ -1,38 +0,0 @@
|
||||
// Backbone.js 0.9.2
|
||||
|
||||
// (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc.
|
||||
// Backbone may be freely distributed under the MIT license.
|
||||
// For all details and documentation:
|
||||
// http://backbonejs.org
|
||||
(function(){var l=this,y=l.Backbone,z=Array.prototype.slice,A=Array.prototype.splice,g;g="undefined"!==typeof exports?exports:l.Backbone={};g.VERSION="0.9.2";var f=l._;!f&&"undefined"!==typeof require&&(f=require("underscore"));var i=l.jQuery||l.Zepto||l.ender;g.setDomLibrary=function(a){i=a};g.noConflict=function(){l.Backbone=y;return this};g.emulateHTTP=!1;g.emulateJSON=!1;var p=/\s+/,k=g.Events={on:function(a,b,c){var d,e,f,g,j;if(!b)return this;a=a.split(p);for(d=this._callbacks||(this._callbacks=
|
||||
{});e=a.shift();)f=(j=d[e])?j.tail:{},f.next=g={},f.context=c,f.callback=b,d[e]={tail:g,next:j?j.next:f};return this},off:function(a,b,c){var d,e,h,g,j,q;if(e=this._callbacks){if(!a&&!b&&!c)return delete this._callbacks,this;for(a=a?a.split(p):f.keys(e);d=a.shift();)if(h=e[d],delete e[d],h&&(b||c))for(g=h.tail;(h=h.next)!==g;)if(j=h.callback,q=h.context,b&&j!==b||c&&q!==c)this.on(d,j,q);return this}},trigger:function(a){var b,c,d,e,f,g;if(!(d=this._callbacks))return this;f=d.all;a=a.split(p);for(g=
|
||||
z.call(arguments,1);b=a.shift();){if(c=d[b])for(e=c.tail;(c=c.next)!==e;)c.callback.apply(c.context||this,g);if(c=f){e=c.tail;for(b=[b].concat(g);(c=c.next)!==e;)c.callback.apply(c.context||this,b)}}return this}};k.bind=k.on;k.unbind=k.off;var o=g.Model=function(a,b){var c;a||(a={});b&&b.parse&&(a=this.parse(a));if(c=n(this,"defaults"))a=f.extend({},c,a);b&&b.collection&&(this.collection=b.collection);this.attributes={};this._escapedAttributes={};this.cid=f.uniqueId("c");this.changed={};this._silent=
|
||||
{};this._pending={};this.set(a,{silent:!0});this.changed={};this._silent={};this._pending={};this._previousAttributes=f.clone(this.attributes);this.initialize.apply(this,arguments)};f.extend(o.prototype,k,{changed:null,_silent:null,_pending:null,idAttribute:"id",initialize:function(){},toJSON:function(){return f.clone(this.attributes)},get:function(a){return this.attributes[a]},escape:function(a){var b;if(b=this._escapedAttributes[a])return b;b=this.get(a);return this._escapedAttributes[a]=f.escape(null==
|
||||
b?"":""+b)},has:function(a){return null!=this.get(a)},set:function(a,b,c){var d,e;f.isObject(a)||null==a?(d=a,c=b):(d={},d[a]=b);c||(c={});if(!d)return this;d instanceof o&&(d=d.attributes);if(c.unset)for(e in d)d[e]=void 0;if(!this._validate(d,c))return!1;this.idAttribute in d&&(this.id=d[this.idAttribute]);var b=c.changes={},h=this.attributes,g=this._escapedAttributes,j=this._previousAttributes||{};for(e in d){a=d[e];if(!f.isEqual(h[e],a)||c.unset&&f.has(h,e))delete g[e],(c.silent?this._silent:
|
||||
b)[e]=!0;c.unset?delete h[e]:h[e]=a;!f.isEqual(j[e],a)||f.has(h,e)!=f.has(j,e)?(this.changed[e]=a,c.silent||(this._pending[e]=!0)):(delete this.changed[e],delete this._pending[e])}c.silent||this.change(c);return this},unset:function(a,b){(b||(b={})).unset=!0;return this.set(a,null,b)},clear:function(a){(a||(a={})).unset=!0;return this.set(f.clone(this.attributes),a)},fetch:function(a){var a=a?f.clone(a):{},b=this,c=a.success;a.success=function(d,e,f){if(!b.set(b.parse(d,f),a))return!1;c&&c(b,d)};
|
||||
a.error=g.wrapError(a.error,b,a);return(this.sync||g.sync).call(this,"read",this,a)},save:function(a,b,c){var d,e;f.isObject(a)||null==a?(d=a,c=b):(d={},d[a]=b);c=c?f.clone(c):{};if(c.wait){if(!this._validate(d,c))return!1;e=f.clone(this.attributes)}a=f.extend({},c,{silent:!0});if(d&&!this.set(d,c.wait?a:c))return!1;var h=this,i=c.success;c.success=function(a,b,e){b=h.parse(a,e);if(c.wait){delete c.wait;b=f.extend(d||{},b)}if(!h.set(b,c))return false;i?i(h,a):h.trigger("sync",h,a,c)};c.error=g.wrapError(c.error,
|
||||
h,c);b=this.isNew()?"create":"update";b=(this.sync||g.sync).call(this,b,this,c);c.wait&&this.set(e,a);return b},destroy:function(a){var a=a?f.clone(a):{},b=this,c=a.success,d=function(){b.trigger("destroy",b,b.collection,a)};if(this.isNew())return d(),!1;a.success=function(e){a.wait&&d();c?c(b,e):b.trigger("sync",b,e,a)};a.error=g.wrapError(a.error,b,a);var e=(this.sync||g.sync).call(this,"delete",this,a);a.wait||d();return e},url:function(){var a=n(this,"urlRoot")||n(this.collection,"url")||t();
|
||||
return this.isNew()?a:a+("/"==a.charAt(a.length-1)?"":"/")+encodeURIComponent(this.id)},parse:function(a){return a},clone:function(){return new this.constructor(this.attributes)},isNew:function(){return null==this.id},change:function(a){a||(a={});var b=this._changing;this._changing=!0;for(var c in this._silent)this._pending[c]=!0;var d=f.extend({},a.changes,this._silent);this._silent={};for(c in d)this.trigger("change:"+c,this,this.get(c),a);if(b)return this;for(;!f.isEmpty(this._pending);){this._pending=
|
||||
{};this.trigger("change",this,a);for(c in this.changed)!this._pending[c]&&!this._silent[c]&&delete this.changed[c];this._previousAttributes=f.clone(this.attributes)}this._changing=!1;return this},hasChanged:function(a){return!arguments.length?!f.isEmpty(this.changed):f.has(this.changed,a)},changedAttributes:function(a){if(!a)return this.hasChanged()?f.clone(this.changed):!1;var b,c=!1,d=this._previousAttributes,e;for(e in a)if(!f.isEqual(d[e],b=a[e]))(c||(c={}))[e]=b;return c},previous:function(a){return!arguments.length||
|
||||
!this._previousAttributes?null:this._previousAttributes[a]},previousAttributes:function(){return f.clone(this._previousAttributes)},isValid:function(){return!this.validate(this.attributes)},_validate:function(a,b){if(b.silent||!this.validate)return!0;var a=f.extend({},this.attributes,a),c=this.validate(a,b);if(!c)return!0;b&&b.error?b.error(this,c,b):this.trigger("error",this,c,b);return!1}});var r=g.Collection=function(a,b){b||(b={});b.model&&(this.model=b.model);b.comparator&&(this.comparator=b.comparator);
|
||||
this._reset();this.initialize.apply(this,arguments);a&&this.reset(a,{silent:!0,parse:b.parse})};f.extend(r.prototype,k,{model:o,initialize:function(){},toJSON:function(a){return this.map(function(b){return b.toJSON(a)})},add:function(a,b){var c,d,e,g,i,j={},k={},l=[];b||(b={});a=f.isArray(a)?a.slice():[a];c=0;for(d=a.length;c<d;c++){if(!(e=a[c]=this._prepareModel(a[c],b)))throw Error("Can't add an invalid model to a collection");g=e.cid;i=e.id;j[g]||this._byCid[g]||null!=i&&(k[i]||this._byId[i])?
|
||||
l.push(c):j[g]=k[i]=e}for(c=l.length;c--;)a.splice(l[c],1);c=0;for(d=a.length;c<d;c++)(e=a[c]).on("all",this._onModelEvent,this),this._byCid[e.cid]=e,null!=e.id&&(this._byId[e.id]=e);this.length+=d;A.apply(this.models,[null!=b.at?b.at:this.models.length,0].concat(a));this.comparator&&this.sort({silent:!0});if(b.silent)return this;c=0;for(d=this.models.length;c<d;c++)if(j[(e=this.models[c]).cid])b.index=c,e.trigger("add",e,this,b);return this},remove:function(a,b){var c,d,e,g;b||(b={});a=f.isArray(a)?
|
||||
a.slice():[a];c=0;for(d=a.length;c<d;c++)if(g=this.getByCid(a[c])||this.get(a[c]))delete this._byId[g.id],delete this._byCid[g.cid],e=this.indexOf(g),this.models.splice(e,1),this.length--,b.silent||(b.index=e,g.trigger("remove",g,this,b)),this._removeReference(g);return this},push:function(a,b){a=this._prepareModel(a,b);this.add(a,b);return a},pop:function(a){var b=this.at(this.length-1);this.remove(b,a);return b},unshift:function(a,b){a=this._prepareModel(a,b);this.add(a,f.extend({at:0},b));return a},
|
||||
shift:function(a){var b=this.at(0);this.remove(b,a);return b},get:function(a){return null==a?void 0:this._byId[null!=a.id?a.id:a]},getByCid:function(a){return a&&this._byCid[a.cid||a]},at:function(a){return this.models[a]},where:function(a){return f.isEmpty(a)?[]:this.filter(function(b){for(var c in a)if(a[c]!==b.get(c))return!1;return!0})},sort:function(a){a||(a={});if(!this.comparator)throw Error("Cannot sort a set without a comparator");var b=f.bind(this.comparator,this);1==this.comparator.length?
|
||||
this.models=this.sortBy(b):this.models.sort(b);a.silent||this.trigger("reset",this,a);return this},pluck:function(a){return f.map(this.models,function(b){return b.get(a)})},reset:function(a,b){a||(a=[]);b||(b={});for(var c=0,d=this.models.length;c<d;c++)this._removeReference(this.models[c]);this._reset();this.add(a,f.extend({silent:!0},b));b.silent||this.trigger("reset",this,b);return this},fetch:function(a){a=a?f.clone(a):{};void 0===a.parse&&(a.parse=!0);var b=this,c=a.success;a.success=function(d,
|
||||
e,f){b[a.add?"add":"reset"](b.parse(d,f),a);c&&c(b,d)};a.error=g.wrapError(a.error,b,a);return(this.sync||g.sync).call(this,"read",this,a)},create:function(a,b){var c=this,b=b?f.clone(b):{},a=this._prepareModel(a,b);if(!a)return!1;b.wait||c.add(a,b);var d=b.success;b.success=function(e,f){b.wait&&c.add(e,b);d?d(e,f):e.trigger("sync",a,f,b)};a.save(null,b);return a},parse:function(a){return a},chain:function(){return f(this.models).chain()},_reset:function(){this.length=0;this.models=[];this._byId=
|
||||
{};this._byCid={}},_prepareModel:function(a,b){b||(b={});a instanceof o?a.collection||(a.collection=this):(b.collection=this,a=new this.model(a,b),a._validate(a.attributes,b)||(a=!1));return a},_removeReference:function(a){this==a.collection&&delete a.collection;a.off("all",this._onModelEvent,this)},_onModelEvent:function(a,b,c,d){("add"==a||"remove"==a)&&c!=this||("destroy"==a&&this.remove(b,d),b&&a==="change:"+b.idAttribute&&(delete this._byId[b.previous(b.idAttribute)],this._byId[b.id]=b),this.trigger.apply(this,
|
||||
arguments))}});f.each("forEach,each,map,reduce,reduceRight,find,detect,filter,select,reject,every,all,some,any,include,contains,invoke,max,min,sortBy,sortedIndex,toArray,size,first,initial,rest,last,without,indexOf,shuffle,lastIndexOf,isEmpty,groupBy".split(","),function(a){r.prototype[a]=function(){return f[a].apply(f,[this.models].concat(f.toArray(arguments)))}});var u=g.Router=function(a){a||(a={});a.routes&&(this.routes=a.routes);this._bindRoutes();this.initialize.apply(this,arguments)},B=/:\w+/g,
|
||||
C=/\*\w+/g,D=/[-[\]{}()+?.,\\^$|#\s]/g;f.extend(u.prototype,k,{initialize:function(){},route:function(a,b,c){g.history||(g.history=new m);f.isRegExp(a)||(a=this._routeToRegExp(a));c||(c=this[b]);g.history.route(a,f.bind(function(d){d=this._extractParameters(a,d);c&&c.apply(this,d);this.trigger.apply(this,["route:"+b].concat(d));g.history.trigger("route",this,b,d)},this));return this},navigate:function(a,b){g.history.navigate(a,b)},_bindRoutes:function(){if(this.routes){var a=[],b;for(b in this.routes)a.unshift([b,
|
||||
this.routes[b]]);b=0;for(var c=a.length;b<c;b++)this.route(a[b][0],a[b][1],this[a[b][1]])}},_routeToRegExp:function(a){a=a.replace(D,"\\$&").replace(B,"([^/]+)").replace(C,"(.*?)");return RegExp("^"+a+"$")},_extractParameters:function(a,b){return a.exec(b).slice(1)}});var m=g.History=function(){this.handlers=[];f.bindAll(this,"checkUrl")},s=/^[#\/]/,E=/msie [\w.]+/;m.started=!1;f.extend(m.prototype,k,{interval:50,getHash:function(a){return(a=(a?a.location:window.location).href.match(/#(.*)$/))?a[1]:
|
||||
""},getFragment:function(a,b){if(null==a)if(this._hasPushState||b){var a=window.location.pathname,c=window.location.search;c&&(a+=c)}else a=this.getHash();a.indexOf(this.options.root)||(a=a.substr(this.options.root.length));return a.replace(s,"")},start:function(a){if(m.started)throw Error("Backbone.history has already been started");m.started=!0;this.options=f.extend({},{root:"/"},this.options,a);this._wantsHashChange=!1!==this.options.hashChange;this._wantsPushState=!!this.options.pushState;this._hasPushState=
|
||||
!(!this.options.pushState||!window.history||!window.history.pushState);var a=this.getFragment(),b=document.documentMode;if(b=E.exec(navigator.userAgent.toLowerCase())&&(!b||7>=b))this.iframe=i('<iframe src="javascript:0" tabindex="-1" />').hide().appendTo("body")[0].contentWindow,this.navigate(a);this._hasPushState?i(window).bind("popstate",this.checkUrl):this._wantsHashChange&&"onhashchange"in window&&!b?i(window).bind("hashchange",this.checkUrl):this._wantsHashChange&&(this._checkUrlInterval=setInterval(this.checkUrl,
|
||||
this.interval));this.fragment=a;a=window.location;b=a.pathname==this.options.root;if(this._wantsHashChange&&this._wantsPushState&&!this._hasPushState&&!b)return this.fragment=this.getFragment(null,!0),window.location.replace(this.options.root+"#"+this.fragment),!0;this._wantsPushState&&this._hasPushState&&b&&a.hash&&(this.fragment=this.getHash().replace(s,""),window.history.replaceState({},document.title,a.protocol+"//"+a.host+this.options.root+this.fragment));if(!this.options.silent)return this.loadUrl()},
|
||||
stop:function(){i(window).unbind("popstate",this.checkUrl).unbind("hashchange",this.checkUrl);clearInterval(this._checkUrlInterval);m.started=!1},route:function(a,b){this.handlers.unshift({route:a,callback:b})},checkUrl:function(){var a=this.getFragment();a==this.fragment&&this.iframe&&(a=this.getFragment(this.getHash(this.iframe)));if(a==this.fragment)return!1;this.iframe&&this.navigate(a);this.loadUrl()||this.loadUrl(this.getHash())},loadUrl:function(a){var b=this.fragment=this.getFragment(a);return f.any(this.handlers,
|
||||
function(a){if(a.route.test(b))return a.callback(b),!0})},navigate:function(a,b){if(!m.started)return!1;if(!b||!0===b)b={trigger:b};var c=(a||"").replace(s,"");this.fragment!=c&&(this._hasPushState?(0!=c.indexOf(this.options.root)&&(c=this.options.root+c),this.fragment=c,window.history[b.replace?"replaceState":"pushState"]({},document.title,c)):this._wantsHashChange?(this.fragment=c,this._updateHash(window.location,c,b.replace),this.iframe&&c!=this.getFragment(this.getHash(this.iframe))&&(b.replace||
|
||||
this.iframe.document.open().close(),this._updateHash(this.iframe.location,c,b.replace))):window.location.assign(this.options.root+a),b.trigger&&this.loadUrl(a))},_updateHash:function(a,b,c){c?a.replace(a.toString().replace(/(javascript:|#).*$/,"")+"#"+b):a.hash=b}});var v=g.View=function(a){this.cid=f.uniqueId("view");this._configure(a||{});this._ensureElement();this.initialize.apply(this,arguments);this.delegateEvents()},F=/^(\S+)\s*(.*)$/,w="model,collection,el,id,attributes,className,tagName".split(",");
|
||||
f.extend(v.prototype,k,{tagName:"div",$:function(a){return this.$el.find(a)},initialize:function(){},render:function(){return this},remove:function(){this.$el.remove();return this},make:function(a,b,c){a=document.createElement(a);b&&i(a).attr(b);c&&i(a).html(c);return a},setElement:function(a,b){this.$el&&this.undelegateEvents();this.$el=a instanceof i?a:i(a);this.el=this.$el[0];!1!==b&&this.delegateEvents();return this},delegateEvents:function(a){if(a||(a=n(this,"events"))){this.undelegateEvents();
|
||||
for(var b in a){var c=a[b];f.isFunction(c)||(c=this[a[b]]);if(!c)throw Error('Method "'+a[b]+'" does not exist');var d=b.match(F),e=d[1],d=d[2],c=f.bind(c,this),e=e+(".delegateEvents"+this.cid);""===d?this.$el.bind(e,c):this.$el.delegate(d,e,c)}}},undelegateEvents:function(){this.$el.unbind(".delegateEvents"+this.cid)},_configure:function(a){this.options&&(a=f.extend({},this.options,a));for(var b=0,c=w.length;b<c;b++){var d=w[b];a[d]&&(this[d]=a[d])}this.options=a},_ensureElement:function(){if(this.el)this.setElement(this.el,
|
||||
!1);else{var a=n(this,"attributes")||{};this.id&&(a.id=this.id);this.className&&(a["class"]=this.className);this.setElement(this.make(this.tagName,a),!1)}}});o.extend=r.extend=u.extend=v.extend=function(a,b){var c=G(this,a,b);c.extend=this.extend;return c};var H={create:"POST",update:"PUT","delete":"DELETE",read:"GET"};g.sync=function(a,b,c){var d=H[a];c||(c={});var e={type:d,dataType:"json"};c.url||(e.url=n(b,"url")||t());if(!c.data&&b&&("create"==a||"update"==a))e.contentType="application/json",
|
||||
e.data=JSON.stringify(b.toJSON());g.emulateJSON&&(e.contentType="application/x-www-form-urlencoded",e.data=e.data?{model:e.data}:{});if(g.emulateHTTP&&("PUT"===d||"DELETE"===d))g.emulateJSON&&(e.data._method=d),e.type="POST",e.beforeSend=function(a){a.setRequestHeader("X-HTTP-Method-Override",d)};"GET"!==e.type&&!g.emulateJSON&&(e.processData=!1);return i.ajax(f.extend(e,c))};g.wrapError=function(a,b,c){return function(d,e){e=d===b?e:d;a?a(b,e,c):b.trigger("error",b,e,c)}};var x=function(){},G=function(a,
|
||||
b,c){var d;d=b&&b.hasOwnProperty("constructor")?b.constructor:function(){a.apply(this,arguments)};f.extend(d,a);x.prototype=a.prototype;d.prototype=new x;b&&f.extend(d.prototype,b);c&&f.extend(d,c);d.prototype.constructor=d;d.__super__=a.prototype;return d},n=function(a,b){return!a||!a[b]?null:f.isFunction(a[b])?a[b]():a[b]},t=function(){throw Error('A "url" property or function must be specified');}}).call(this);
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,18 +0,0 @@
|
||||
/*
|
||||
* jQuery BBQ: Back Button & Query Library - v1.2.1 - 2/17/2010
|
||||
* http://benalman.com/projects/jquery-bbq-plugin/
|
||||
*
|
||||
* Copyright (c) 2010 "Cowboy" Ben Alman
|
||||
* Dual licensed under the MIT and GPL licenses.
|
||||
* http://benalman.com/about/license/
|
||||
*/
|
||||
(function($,p){var i,m=Array.prototype.slice,r=decodeURIComponent,a=$.param,c,l,v,b=$.bbq=$.bbq||{},q,u,j,e=$.event.special,d="hashchange",A="querystring",D="fragment",y="elemUrlAttr",g="location",k="href",t="src",x=/^.*\?|#.*$/g,w=/^.*\#/,h,C={};function E(F){return typeof F==="string"}function B(G){var F=m.call(arguments,1);return function(){return G.apply(this,F.concat(m.call(arguments)))}}function n(F){return F.replace(/^[^#]*#?(.*)$/,"$1")}function o(F){return F.replace(/(?:^[^?#]*\?([^#]*).*$)?.*/,"$1")}function f(H,M,F,I,G){var O,L,K,N,J;if(I!==i){K=F.match(H?/^([^#]*)\#?(.*)$/:/^([^#?]*)\??([^#]*)(#?.*)/);J=K[3]||"";if(G===2&&E(I)){L=I.replace(H?w:x,"")}else{N=l(K[2]);I=E(I)?l[H?D:A](I):I;L=G===2?I:G===1?$.extend({},I,N):$.extend({},N,I);L=a(L);if(H){L=L.replace(h,r)}}O=K[1]+(H?"#":L||!K[1]?"?":"")+L+J}else{O=M(F!==i?F:p[g][k])}return O}a[A]=B(f,0,o);a[D]=c=B(f,1,n);c.noEscape=function(G){G=G||"";var F=$.map(G.split(""),encodeURIComponent);h=new RegExp(F.join("|"),"g")};c.noEscape(",/");$.deparam=l=function(I,F){var H={},G={"true":!0,"false":!1,"null":null};$.each(I.replace(/\+/g," ").split("&"),function(L,Q){var K=Q.split("="),P=r(K[0]),J,O=H,M=0,R=P.split("]["),N=R.length-1;if(/\[/.test(R[0])&&/\]$/.test(R[N])){R[N]=R[N].replace(/\]$/,"");R=R.shift().split("[").concat(R);N=R.length-1}else{N=0}if(K.length===2){J=r(K[1]);if(F){J=J&&!isNaN(J)?+J:J==="undefined"?i:G[J]!==i?G[J]:J}if(N){for(;M<=N;M++){P=R[M]===""?O.length:R[M];O=O[P]=M<N?O[P]||(R[M+1]&&isNaN(R[M+1])?{}:[]):J}}else{if($.isArray(H[P])){H[P].push(J)}else{if(H[P]!==i){H[P]=[H[P],J]}else{H[P]=J}}}}else{if(P){H[P]=F?i:""}}});return H};function z(H,F,G){if(F===i||typeof F==="boolean"){G=F;F=a[H?D:A]()}else{F=E(F)?F.replace(H?w:x,""):F}return l(F,G)}l[A]=B(z,0);l[D]=v=B(z,1);$[y]||($[y]=function(F){return $.extend(C,F)})({a:k,base:k,iframe:t,img:t,input:t,form:"action",link:k,script:t});j=$[y];function s(I,G,H,F){if(!E(H)&&typeof H!=="object"){F=H;H=G;G=i}return this.each(function(){var L=$(this),J=G||j()[(this.nodeName||"").toLowerCase()]||"",K=J&&L.attr(J)||"";L.attr(J,a[I](K,H,F))})}$.fn[A]=B(s,A);$.fn[D]=B(s,D);b.pushState=q=function(I,F){if(E(I)&&/^#/.test(I)&&F===i){F=2}var H=I!==i,G=c(p[g][k],H?I:{},H?F:2);p[g][k]=G+(/#/.test(G)?"":"#")};b.getState=u=function(F,G){return F===i||typeof F==="boolean"?v(F):v(G)[F]};b.removeState=function(F){var G={};if(F!==i){G=u();$.each($.isArray(F)?F:arguments,function(I,H){delete G[H]})}q(G,2)};e[d]=$.extend(e[d],{add:function(F){var H;function G(J){var I=J[D]=c();J.getState=function(K,L){return K===i||typeof K==="boolean"?l(I,K):l(I,L)[K]};H.apply(this,arguments)}if($.isFunction(F)){H=F;return G}else{H=F.handler;F.handler=G}}})})(jQuery,this);
|
||||
/*
|
||||
* jQuery hashchange event - v1.2 - 2/11/2010
|
||||
* http://benalman.com/projects/jquery-hashchange-plugin/
|
||||
*
|
||||
* Copyright (c) 2010 "Cowboy" Ben Alman
|
||||
* Dual licensed under the MIT and GPL licenses.
|
||||
* http://benalman.com/about/license/
|
||||
*/
|
||||
(function($,i,b){var j,k=$.event.special,c="location",d="hashchange",l="href",f=$.browser,g=document.documentMode,h=f.msie&&(g===b||g<8),e="on"+d in i&&!h;function a(m){m=m||i[c][l];return m.replace(/^[^#]*#?(.*)$/,"$1")}$[d+"Delay"]=100;k[d]=$.extend(k[d],{setup:function(){if(e){return false}$(j.start)},teardown:function(){if(e){return false}$(j.stop)}});j=(function(){var m={},r,n,o,q;function p(){o=q=function(s){return s};if(h){n=$('<iframe src="javascript:0"/>').hide().insertAfter("body")[0].contentWindow;q=function(){return a(n.document[c][l])};o=function(u,s){if(u!==s){var t=n.document;t.open().close();t[c].hash="#"+u}};o(a())}}m.start=function(){if(r){return}var t=a();o||p();(function s(){var v=a(),u=q(t);if(v!==t){o(t=v,u);$(i).trigger(d)}else{if(u!==t){i[c][l]=i[c][l].replace(/#.*/,"")+"#"+u}}r=setTimeout(s,$[d+"Delay"])})()};m.stop=function(){if(!n){r&&clearTimeout(r);r=0}};return m})()})(jQuery,this);
|
@ -1 +0,0 @@
|
||||
(function(b){b.fn.slideto=function(a){a=b.extend({slide_duration:"slow",highlight_duration:3E3,highlight:true,highlight_color:"#FFFF99"},a);return this.each(function(){obj=b(this);b("body").animate({scrollTop:obj.offset().top},a.slide_duration,function(){a.highlight&&b.ui.version&&obj.effect("highlight",{color:a.highlight_color},a.highlight_duration)})})}})(jQuery);
|
@ -1,8 +0,0 @@
|
||||
/*
|
||||
jQuery Wiggle
|
||||
Author: WonderGroup, Jordan Thomas
|
||||
URL: http://labs.wondergroup.com/demos/mini-ui/index.html
|
||||
License: MIT (http://en.wikipedia.org/wiki/MIT_License)
|
||||
*/
|
||||
jQuery.fn.wiggle=function(o){var d={speed:50,wiggles:3,travel:5,callback:null};var o=jQuery.extend(d,o);return this.each(function(){var cache=this;var wrap=jQuery(this).wrap('<div class="wiggle-wrap"></div>').css("position","relative");var calls=0;for(i=1;i<=o.wiggles;i++){jQuery(this).animate({left:"-="+o.travel},o.speed).animate({left:"+="+o.travel*2},o.speed*2).animate({left:"-="+o.travel},o.speed,function(){calls++;if(jQuery(cache).parent().hasClass('wiggle-wrap')){jQuery(cache).parent().replaceWith(cache);}
|
||||
if(calls==o.wiggles&&jQuery.isFunction(o.callback)){o.callback();}});}});};
|
@ -1,772 +0,0 @@
|
||||
// Generated by CoffeeScript 1.4.0
|
||||
(function() {
|
||||
var SwaggerApi, SwaggerModel, SwaggerModelProperty, SwaggerOperation, SwaggerRequest, SwaggerResource,
|
||||
__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
|
||||
|
||||
SwaggerApi = (function() {
|
||||
|
||||
SwaggerApi.prototype.discoveryUrl = "http://api.wordnik.com/v4/resources.json";
|
||||
|
||||
SwaggerApi.prototype.debug = false;
|
||||
|
||||
SwaggerApi.prototype.api_key = null;
|
||||
|
||||
SwaggerApi.prototype.basePath = null;
|
||||
|
||||
function SwaggerApi(options) {
|
||||
if (options == null) {
|
||||
options = {};
|
||||
}
|
||||
if (options.discoveryUrl != null) {
|
||||
this.discoveryUrl = options.discoveryUrl;
|
||||
}
|
||||
if (options.debug != null) {
|
||||
this.debug = options.debug;
|
||||
}
|
||||
this.apiKeyName = options.apiKeyName != null ? options.apiKeyName : 'api_key';
|
||||
if (options.apiKey != null) {
|
||||
this.api_key = options.apiKey;
|
||||
}
|
||||
if (options.api_key != null) {
|
||||
this.api_key = options.api_key;
|
||||
}
|
||||
if (options.verbose != null) {
|
||||
this.verbose = options.verbose;
|
||||
}
|
||||
this.supportHeaderParams = options.supportHeaderParams != null ? options.supportHeaderParams : false;
|
||||
this.supportedSubmitMethods = options.supportedSubmitMethods != null ? options.supportedSubmitMethods : ['get'];
|
||||
if (options.success != null) {
|
||||
this.success = options.success;
|
||||
}
|
||||
this.failure = options.failure != null ? options.failure : function() {};
|
||||
this.progress = options.progress != null ? options.progress : function() {};
|
||||
this.headers = options.headers != null ? options.headers : {};
|
||||
this.booleanValues = options.booleanValues != null ? options.booleanValues : new Array('true', 'false');
|
||||
this.discoveryUrl = this.suffixApiKey(this.discoveryUrl);
|
||||
if (options.success != null) {
|
||||
this.build();
|
||||
}
|
||||
}
|
||||
|
||||
SwaggerApi.prototype.build = function() {
|
||||
var _this = this;
|
||||
this.progress('fetching resource list: ' + this.discoveryUrl);
|
||||
return jQuery.getJSON(this.discoveryUrl, function(response) {
|
||||
var res, resource, _i, _j, _len, _len1, _ref, _ref1;
|
||||
if (response.apiVersion != null) {
|
||||
_this.apiVersion = response.apiVersion;
|
||||
}
|
||||
if ((response.basePath != null) && jQuery.trim(response.basePath).length > 0) {
|
||||
_this.basePath = response.basePath;
|
||||
if (_this.basePath.match(/^HTTP/i) == null) {
|
||||
_this.fail("discoveryUrl basePath must be a URL.");
|
||||
}
|
||||
_this.basePath = _this.basePath.replace(/\/$/, '');
|
||||
} else {
|
||||
_this.basePath = _this.discoveryUrl.substring(0, _this.discoveryUrl.lastIndexOf('/'));
|
||||
log('derived basepath from discoveryUrl as ' + _this.basePath);
|
||||
}
|
||||
_this.apis = {};
|
||||
_this.apisArray = [];
|
||||
if (response.resourcePath != null) {
|
||||
_this.resourcePath = response.resourcePath;
|
||||
res = null;
|
||||
_ref = response.apis;
|
||||
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||
resource = _ref[_i];
|
||||
if (res === null) {
|
||||
res = new SwaggerResource(resource, _this);
|
||||
} else {
|
||||
res.addOperations(resource.path, resource.operations);
|
||||
}
|
||||
}
|
||||
if (res != null) {
|
||||
_this.apis[res.name] = res;
|
||||
_this.apisArray.push(res);
|
||||
res.ready = true;
|
||||
_this.selfReflect();
|
||||
}
|
||||
} else {
|
||||
_ref1 = response.apis;
|
||||
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
|
||||
resource = _ref1[_j];
|
||||
res = new SwaggerResource(resource, _this);
|
||||
_this.apis[res.name] = res;
|
||||
_this.apisArray.push(res);
|
||||
}
|
||||
}
|
||||
return _this;
|
||||
}).error(function(error) {
|
||||
if (_this.discoveryUrl.substring(0, 4) !== 'http') {
|
||||
return _this.fail('Please specify the protocol for ' + _this.discoveryUrl);
|
||||
} else if (error.status === 0) {
|
||||
return _this.fail('Can\'t read from server. It may not have the appropriate access-control-origin settings.');
|
||||
} else if (error.status === 404) {
|
||||
return _this.fail('Can\'t read swagger JSON from ' + _this.discoveryUrl);
|
||||
} else {
|
||||
return _this.fail(error.status + ' : ' + error.statusText + ' ' + _this.discoveryUrl);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
SwaggerApi.prototype.selfReflect = function() {
|
||||
var resource, resource_name, _ref;
|
||||
if (this.apis == null) {
|
||||
return false;
|
||||
}
|
||||
_ref = this.apis;
|
||||
for (resource_name in _ref) {
|
||||
resource = _ref[resource_name];
|
||||
if (resource.ready == null) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
this.setConsolidatedModels();
|
||||
this.ready = true;
|
||||
if (this.success != null) {
|
||||
return this.success();
|
||||
}
|
||||
};
|
||||
|
||||
SwaggerApi.prototype.fail = function(message) {
|
||||
this.failure(message);
|
||||
throw message;
|
||||
};
|
||||
|
||||
SwaggerApi.prototype.setConsolidatedModels = function() {
|
||||
var model, modelName, resource, resource_name, _i, _len, _ref, _ref1, _results;
|
||||
this.modelsArray = [];
|
||||
this.models = {};
|
||||
_ref = this.apis;
|
||||
for (resource_name in _ref) {
|
||||
resource = _ref[resource_name];
|
||||
for (modelName in resource.models) {
|
||||
if (!(this.models[modelName] != null)) {
|
||||
this.models[modelName] = resource.models[modelName];
|
||||
this.modelsArray.push(resource.models[modelName]);
|
||||
}
|
||||
}
|
||||
}
|
||||
_ref1 = this.modelsArray;
|
||||
_results = [];
|
||||
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
|
||||
model = _ref1[_i];
|
||||
_results.push(model.setReferencedModels(this.models));
|
||||
}
|
||||
return _results;
|
||||
};
|
||||
|
||||
SwaggerApi.prototype.suffixApiKey = function(url) {
|
||||
var sep;
|
||||
if ((this.api_key != null) && jQuery.trim(this.api_key).length > 0 && (url != null)) {
|
||||
sep = url.indexOf('?') > 0 ? '&' : '?';
|
||||
return url + sep + this.apiKeyName + '=' + this.api_key;
|
||||
} else {
|
||||
return url;
|
||||
}
|
||||
};
|
||||
|
||||
SwaggerApi.prototype.help = function() {
|
||||
var operation, operation_name, parameter, resource, resource_name, _i, _len, _ref, _ref1, _ref2;
|
||||
_ref = this.apis;
|
||||
for (resource_name in _ref) {
|
||||
resource = _ref[resource_name];
|
||||
console.log(resource_name);
|
||||
_ref1 = resource.operations;
|
||||
for (operation_name in _ref1) {
|
||||
operation = _ref1[operation_name];
|
||||
console.log(" " + operation.nickname);
|
||||
_ref2 = operation.parameters;
|
||||
for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
|
||||
parameter = _ref2[_i];
|
||||
console.log(" " + parameter.name + (parameter.required ? ' (required)' : '') + " - " + parameter.description);
|
||||
}
|
||||
}
|
||||
}
|
||||
return this;
|
||||
};
|
||||
|
||||
return SwaggerApi;
|
||||
|
||||
})();
|
||||
|
||||
SwaggerResource = (function() {
|
||||
|
||||
function SwaggerResource(resourceObj, api) {
|
||||
var parts,
|
||||
_this = this;
|
||||
this.api = api;
|
||||
this.path = this.api.resourcePath != null ? this.api.resourcePath : resourceObj.path;
|
||||
this.description = resourceObj.description;
|
||||
parts = this.path.split("/");
|
||||
this.name = parts[parts.length - 1].replace('.{format}', '');
|
||||
this.basePath = this.api.basePath;
|
||||
this.operations = {};
|
||||
this.operationsArray = [];
|
||||
this.modelsArray = [];
|
||||
this.models = {};
|
||||
if ((resourceObj.operations != null) && (this.api.resourcePath != null)) {
|
||||
this.api.progress('reading resource ' + this.name + ' models and operations');
|
||||
this.addModels(resourceObj.models);
|
||||
this.addOperations(resourceObj.path, resourceObj.operations);
|
||||
this.api[this.name] = this;
|
||||
} else {
|
||||
if (this.path == null) {
|
||||
this.api.fail("SwaggerResources must have a path.");
|
||||
}
|
||||
this.url = this.api.suffixApiKey(this.api.basePath + this.path.replace('{format}', 'json'));
|
||||
this.api.progress('fetching resource ' + this.name + ': ' + this.url);
|
||||
jQuery.getJSON(this.url, function(response) {
|
||||
var endpoint, _i, _len, _ref;
|
||||
if ((response.basePath != null) && jQuery.trim(response.basePath).length > 0) {
|
||||
_this.basePath = response.basePath;
|
||||
_this.basePath = _this.basePath.replace(/\/$/, '');
|
||||
}
|
||||
_this.addModels(response.models);
|
||||
if (response.apis) {
|
||||
_ref = response.apis;
|
||||
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||
endpoint = _ref[_i];
|
||||
_this.addOperations(endpoint.path, endpoint.operations);
|
||||
}
|
||||
}
|
||||
_this.api[_this.name] = _this;
|
||||
_this.ready = true;
|
||||
return _this.api.selfReflect();
|
||||
}).error(function(error) {
|
||||
return _this.api.fail("Unable to read api '" + _this.name + "' from path " + _this.url + " (server returned " + error.statusText + ")");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
SwaggerResource.prototype.addModels = function(models) {
|
||||
var model, modelName, swaggerModel, _i, _len, _ref, _results;
|
||||
if (models != null) {
|
||||
for (modelName in models) {
|
||||
if (!(this.models[modelName] != null)) {
|
||||
swaggerModel = new SwaggerModel(modelName, models[modelName]);
|
||||
this.modelsArray.push(swaggerModel);
|
||||
this.models[modelName] = swaggerModel;
|
||||
}
|
||||
}
|
||||
_ref = this.modelsArray;
|
||||
_results = [];
|
||||
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||
model = _ref[_i];
|
||||
_results.push(model.setReferencedModels(this.models));
|
||||
}
|
||||
return _results;
|
||||
}
|
||||
};
|
||||
|
||||
SwaggerResource.prototype.addOperations = function(resource_path, ops) {
|
||||
var consumes, o, op, _i, _len, _results;
|
||||
if (ops) {
|
||||
_results = [];
|
||||
for (_i = 0, _len = ops.length; _i < _len; _i++) {
|
||||
o = ops[_i];
|
||||
consumes = o.consumes;
|
||||
if (o.supportedContentTypes) {
|
||||
consumes = o.supportedContentTypes;
|
||||
}
|
||||
op = new SwaggerOperation(o.nickname, resource_path, o.httpMethod, o.parameters, o.summary, o.notes, o.responseClass, o.errorResponses, this, o.consumes, o.produces);
|
||||
this.operations[op.nickname] = op;
|
||||
_results.push(this.operationsArray.push(op));
|
||||
}
|
||||
return _results;
|
||||
}
|
||||
};
|
||||
|
||||
SwaggerResource.prototype.help = function() {
|
||||
var operation, operation_name, parameter, _i, _len, _ref, _ref1;
|
||||
_ref = this.operations;
|
||||
for (operation_name in _ref) {
|
||||
operation = _ref[operation_name];
|
||||
console.log(" " + operation.nickname);
|
||||
_ref1 = operation.parameters;
|
||||
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
|
||||
parameter = _ref1[_i];
|
||||
console.log(" " + parameter.name + (parameter.required ? ' (required)' : '') + " - " + parameter.description);
|
||||
}
|
||||
}
|
||||
return this;
|
||||
};
|
||||
|
||||
return SwaggerResource;
|
||||
|
||||
})();
|
||||
|
||||
SwaggerModel = (function() {
|
||||
|
||||
function SwaggerModel(modelName, obj) {
|
||||
var propertyName;
|
||||
this.name = obj.id != null ? obj.id : modelName;
|
||||
this.properties = [];
|
||||
for (propertyName in obj.properties) {
|
||||
this.properties.push(new SwaggerModelProperty(propertyName, obj.properties[propertyName]));
|
||||
}
|
||||
}
|
||||
|
||||
SwaggerModel.prototype.setReferencedModels = function(allModels) {
|
||||
var prop, _i, _len, _ref, _results;
|
||||
_ref = this.properties;
|
||||
_results = [];
|
||||
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||
prop = _ref[_i];
|
||||
if (allModels[prop.dataType] != null) {
|
||||
_results.push(prop.refModel = allModels[prop.dataType]);
|
||||
} else if ((prop.refDataType != null) && (allModels[prop.refDataType] != null)) {
|
||||
_results.push(prop.refModel = allModels[prop.refDataType]);
|
||||
} else {
|
||||
_results.push(void 0);
|
||||
}
|
||||
}
|
||||
return _results;
|
||||
};
|
||||
|
||||
SwaggerModel.prototype.getMockSignature = function(modelsToIgnore) {
|
||||
var classClose, classOpen, prop, propertiesStr, returnVal, strong, strongClose, stronger, _i, _j, _len, _len1, _ref, _ref1;
|
||||
propertiesStr = [];
|
||||
_ref = this.properties;
|
||||
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||
prop = _ref[_i];
|
||||
propertiesStr.push(prop.toString());
|
||||
}
|
||||
strong = '<span class="strong">';
|
||||
stronger = '<span class="stronger">';
|
||||
strongClose = '</span>';
|
||||
classOpen = strong + this.name + ' {' + strongClose;
|
||||
classClose = strong + '}' + strongClose;
|
||||
returnVal = classOpen + '<div>' + propertiesStr.join(',</div><div>') + '</div>' + classClose;
|
||||
if (!modelsToIgnore) {
|
||||
modelsToIgnore = [];
|
||||
}
|
||||
modelsToIgnore.push(this);
|
||||
_ref1 = this.properties;
|
||||
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
|
||||
prop = _ref1[_j];
|
||||
if ((prop.refModel != null) && (modelsToIgnore.indexOf(prop.refModel)) === -1) {
|
||||
returnVal = returnVal + ('<br>' + prop.refModel.getMockSignature(modelsToIgnore));
|
||||
}
|
||||
}
|
||||
return returnVal;
|
||||
};
|
||||
|
||||
SwaggerModel.prototype.createJSONSample = function(modelsToIgnore) {
|
||||
var prop, result, _i, _len, _ref;
|
||||
result = {};
|
||||
modelsToIgnore = modelsToIgnore || [];
|
||||
modelsToIgnore.push(this.name);
|
||||
_ref = this.properties;
|
||||
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||
prop = _ref[_i];
|
||||
result[prop.name] = prop.getSampleValue(modelsToIgnore);
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
return SwaggerModel;
|
||||
|
||||
})();
|
||||
|
||||
SwaggerModelProperty = (function() {
|
||||
|
||||
function SwaggerModelProperty(name, obj) {
|
||||
this.name = name;
|
||||
this.dataType = obj.type;
|
||||
this.isCollection = this.dataType && (this.dataType.toLowerCase() === 'array' || this.dataType.toLowerCase() === 'list' || this.dataType.toLowerCase() === 'set');
|
||||
this.descr = obj.description;
|
||||
this.required = obj.required;
|
||||
if (obj.items != null) {
|
||||
if (obj.items.type != null) {
|
||||
this.refDataType = obj.items.type;
|
||||
}
|
||||
if (obj.items.$ref != null) {
|
||||
this.refDataType = obj.items.$ref;
|
||||
}
|
||||
}
|
||||
this.dataTypeWithRef = this.refDataType != null ? this.dataType + '[' + this.refDataType + ']' : this.dataType;
|
||||
if (obj.allowableValues != null) {
|
||||
this.valueType = obj.allowableValues.valueType;
|
||||
this.values = obj.allowableValues.values;
|
||||
if (this.values != null) {
|
||||
this.valuesString = "'" + this.values.join("' or '") + "'";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SwaggerModelProperty.prototype.getSampleValue = function(modelsToIgnore) {
|
||||
var result;
|
||||
if ((this.refModel != null) && (modelsToIgnore.indexOf(this.refModel.name) === -1)) {
|
||||
result = this.refModel.createJSONSample(modelsToIgnore);
|
||||
} else {
|
||||
if (this.isCollection) {
|
||||
result = this.refDataType;
|
||||
} else {
|
||||
result = this.dataType;
|
||||
}
|
||||
}
|
||||
if (this.isCollection) {
|
||||
return [result];
|
||||
} else {
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
SwaggerModelProperty.prototype.toString = function() {
|
||||
var req, str;
|
||||
req = this.required ? 'propReq' : 'propOpt';
|
||||
str = '<span class="propName ' + req + '">' + this.name + '</span> (<span class="propType">' + this.dataTypeWithRef + '</span>';
|
||||
if (!this.required) {
|
||||
str += ', <span class="propOptKey">optional</span>';
|
||||
}
|
||||
str += ')';
|
||||
if (this.values != null) {
|
||||
str += " = <span class='propVals'>['" + this.values.join("' or '") + "']</span>";
|
||||
}
|
||||
if (this.descr != null) {
|
||||
str += ': <span class="propDesc">' + this.descr + '</span>';
|
||||
}
|
||||
return str;
|
||||
};
|
||||
|
||||
return SwaggerModelProperty;
|
||||
|
||||
})();
|
||||
|
||||
SwaggerOperation = (function() {
|
||||
|
||||
function SwaggerOperation(nickname, path, httpMethod, parameters, summary, notes, responseClass, errorResponses, resource, consumes, produces) {
|
||||
var parameter, v, _i, _j, _len, _len1, _ref, _ref1, _ref2,
|
||||
_this = this;
|
||||
this.nickname = nickname;
|
||||
this.path = path;
|
||||
this.httpMethod = httpMethod;
|
||||
this.parameters = parameters != null ? parameters : [];
|
||||
this.summary = summary;
|
||||
this.notes = notes;
|
||||
this.responseClass = responseClass;
|
||||
this.errorResponses = errorResponses;
|
||||
this.resource = resource;
|
||||
this.consumes = consumes;
|
||||
this.produces = produces;
|
||||
this["do"] = __bind(this["do"], this);
|
||||
|
||||
if (this.nickname == null) {
|
||||
this.resource.api.fail("SwaggerOperations must have a nickname.");
|
||||
}
|
||||
if (this.path == null) {
|
||||
this.resource.api.fail("SwaggerOperation " + nickname + " is missing path.");
|
||||
}
|
||||
if (this.httpMethod == null) {
|
||||
this.resource.api.fail("SwaggerOperation " + nickname + " is missing httpMethod.");
|
||||
}
|
||||
this.path = this.path.replace('{format}', 'json');
|
||||
this.httpMethod = this.httpMethod.toLowerCase();
|
||||
this.isGetMethod = this.httpMethod === "get";
|
||||
this.resourceName = this.resource.name;
|
||||
if (((_ref = this.responseClass) != null ? _ref.toLowerCase() : void 0) === 'void') {
|
||||
this.responseClass = void 0;
|
||||
}
|
||||
if (this.responseClass != null) {
|
||||
this.responseClassSignature = this.getSignature(this.responseClass, this.resource.models);
|
||||
this.responseSampleJSON = this.getSampleJSON(this.responseClass, this.resource.models);
|
||||
}
|
||||
this.errorResponses = this.errorResponses || [];
|
||||
_ref1 = this.parameters;
|
||||
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
|
||||
parameter = _ref1[_i];
|
||||
parameter.name = parameter.name || parameter.dataType;
|
||||
if (parameter.dataType.toLowerCase() === 'boolean') {
|
||||
parameter.allowableValues = {};
|
||||
parameter.allowableValues.values = this.resource.api.booleanValues;
|
||||
}
|
||||
parameter.signature = this.getSignature(parameter.dataType, this.resource.models);
|
||||
parameter.sampleJSON = this.getSampleJSON(parameter.dataType, this.resource.models);
|
||||
if (parameter.allowableValues != null) {
|
||||
if (parameter.allowableValues.valueType === "RANGE") {
|
||||
parameter.isRange = true;
|
||||
} else {
|
||||
parameter.isList = true;
|
||||
}
|
||||
if (parameter.allowableValues.values != null) {
|
||||
parameter.allowableValues.descriptiveValues = [];
|
||||
_ref2 = parameter.allowableValues.values;
|
||||
for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
|
||||
v = _ref2[_j];
|
||||
if ((parameter.defaultValue != null) && parameter.defaultValue === v) {
|
||||
parameter.allowableValues.descriptiveValues.push({
|
||||
value: v,
|
||||
isDefault: true
|
||||
});
|
||||
} else {
|
||||
parameter.allowableValues.descriptiveValues.push({
|
||||
value: v,
|
||||
isDefault: false
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
this.resource[this.nickname] = function(args, callback, error) {
|
||||
return _this["do"](args, callback, error);
|
||||
};
|
||||
}
|
||||
|
||||
SwaggerOperation.prototype.isListType = function(dataType) {
|
||||
if (dataType.indexOf('[') >= 0) {
|
||||
return dataType.substring(dataType.indexOf('[') + 1, dataType.indexOf(']'));
|
||||
} else {
|
||||
return void 0;
|
||||
}
|
||||
};
|
||||
|
||||
SwaggerOperation.prototype.getSignature = function(dataType, models) {
|
||||
var isPrimitive, listType;
|
||||
listType = this.isListType(dataType);
|
||||
isPrimitive = ((listType != null) && models[listType]) || (models[dataType] != null) ? false : true;
|
||||
if (isPrimitive) {
|
||||
return dataType;
|
||||
} else {
|
||||
if (listType != null) {
|
||||
return models[listType].getMockSignature();
|
||||
} else {
|
||||
return models[dataType].getMockSignature();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
SwaggerOperation.prototype.getSampleJSON = function(dataType, models) {
|
||||
var isPrimitive, listType, val;
|
||||
listType = this.isListType(dataType);
|
||||
isPrimitive = ((listType != null) && models[listType]) || (models[dataType] != null) ? false : true;
|
||||
val = isPrimitive ? void 0 : (listType != null ? models[listType].createJSONSample() : models[dataType].createJSONSample());
|
||||
if (val) {
|
||||
val = listType ? [val] : val;
|
||||
return JSON.stringify(val, null, 2);
|
||||
}
|
||||
};
|
||||
|
||||
SwaggerOperation.prototype["do"] = function(args, callback, error) {
|
||||
var body, headers;
|
||||
if (args == null) {
|
||||
args = {};
|
||||
}
|
||||
if ((typeof args) === "function") {
|
||||
error = callback;
|
||||
callback = args;
|
||||
args = {};
|
||||
}
|
||||
if (error == null) {
|
||||
error = function(xhr, textStatus, error) {
|
||||
return console.log(xhr, textStatus, error);
|
||||
};
|
||||
}
|
||||
if (callback == null) {
|
||||
callback = function(data) {
|
||||
return console.log(data);
|
||||
};
|
||||
}
|
||||
if (args.headers != null) {
|
||||
headers = args.headers;
|
||||
delete args.headers;
|
||||
}
|
||||
if (args.body != null) {
|
||||
body = args.body;
|
||||
delete args.body;
|
||||
}
|
||||
return new SwaggerRequest(this.httpMethod, this.urlify(args), headers, body, callback, error, this);
|
||||
};
|
||||
|
||||
SwaggerOperation.prototype.pathJson = function() {
|
||||
return this.path.replace("{format}", "json");
|
||||
};
|
||||
|
||||
SwaggerOperation.prototype.pathXml = function() {
|
||||
return this.path.replace("{format}", "xml");
|
||||
};
|
||||
|
||||
SwaggerOperation.prototype.urlify = function(args, includeApiKey) {
|
||||
var param, queryParams, reg, url, _i, _len, _ref;
|
||||
if (includeApiKey == null) {
|
||||
includeApiKey = true;
|
||||
}
|
||||
url = this.resource.basePath + this.pathJson();
|
||||
_ref = this.parameters;
|
||||
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||
param = _ref[_i];
|
||||
if (param.paramType === 'path') {
|
||||
if (args[param.name]) {
|
||||
reg = new RegExp('\{' + param.name + '[^\}]*\}', 'gi');
|
||||
url = url.replace(reg, encodeURIComponent(args[param.name]));
|
||||
delete args[param.name];
|
||||
} else {
|
||||
throw "" + param.name + " is a required path param.";
|
||||
}
|
||||
}
|
||||
}
|
||||
if (includeApiKey && (this.resource.api.api_key != null) && this.resource.api.api_key.length > 0) {
|
||||
args[this.apiKeyName] = this.resource.api.api_key;
|
||||
}
|
||||
if (this.supportHeaderParams()) {
|
||||
queryParams = jQuery.param(this.getQueryParams(args, includeApiKey));
|
||||
} else {
|
||||
queryParams = jQuery.param(this.getQueryAndHeaderParams(args, includeApiKey));
|
||||
}
|
||||
if ((queryParams != null) && queryParams.length > 0) {
|
||||
url += "?" + queryParams;
|
||||
}
|
||||
return url;
|
||||
};
|
||||
|
||||
SwaggerOperation.prototype.supportHeaderParams = function() {
|
||||
return this.resource.api.supportHeaderParams;
|
||||
};
|
||||
|
||||
SwaggerOperation.prototype.supportedSubmitMethods = function() {
|
||||
return this.resource.api.supportedSubmitMethods;
|
||||
};
|
||||
|
||||
SwaggerOperation.prototype.getQueryAndHeaderParams = function(args, includeApiKey) {
|
||||
if (includeApiKey == null) {
|
||||
includeApiKey = true;
|
||||
}
|
||||
return this.getMatchingParams(['query', 'header'], args, includeApiKey);
|
||||
};
|
||||
|
||||
SwaggerOperation.prototype.getQueryParams = function(args, includeApiKey) {
|
||||
if (includeApiKey == null) {
|
||||
includeApiKey = true;
|
||||
}
|
||||
return this.getMatchingParams(['query'], args, includeApiKey);
|
||||
};
|
||||
|
||||
SwaggerOperation.prototype.getHeaderParams = function(args, includeApiKey) {
|
||||
if (includeApiKey == null) {
|
||||
includeApiKey = true;
|
||||
}
|
||||
return this.getMatchingParams(['header'], args, includeApiKey);
|
||||
};
|
||||
|
||||
SwaggerOperation.prototype.getMatchingParams = function(paramTypes, args, includeApiKey) {
|
||||
var matchingParams, name, param, value, _i, _len, _ref, _ref1;
|
||||
matchingParams = {};
|
||||
_ref = this.parameters;
|
||||
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||
param = _ref[_i];
|
||||
if ((jQuery.inArray(param.paramType, paramTypes) >= 0) && args[param.name]) {
|
||||
matchingParams[param.name] = args[param.name];
|
||||
}
|
||||
}
|
||||
if (includeApiKey && (this.resource.api.api_key != null) && this.resource.api.api_key.length > 0) {
|
||||
matchingParams[this.resource.api.apiKeyName] = this.resource.api.api_key;
|
||||
}
|
||||
if (jQuery.inArray('header', paramTypes) >= 0) {
|
||||
_ref1 = this.resource.api.headers;
|
||||
for (name in _ref1) {
|
||||
value = _ref1[name];
|
||||
matchingParams[name] = value;
|
||||
}
|
||||
}
|
||||
return matchingParams;
|
||||
};
|
||||
|
||||
SwaggerOperation.prototype.help = function() {
|
||||
var parameter, _i, _len, _ref;
|
||||
_ref = this.parameters;
|
||||
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||
parameter = _ref[_i];
|
||||
console.log(" " + parameter.name + (parameter.required ? ' (required)' : '') + " - " + parameter.description);
|
||||
}
|
||||
return this;
|
||||
};
|
||||
|
||||
return SwaggerOperation;
|
||||
|
||||
})();
|
||||
|
||||
SwaggerRequest = (function() {
|
||||
|
||||
function SwaggerRequest(type, url, headers, body, successCallback, errorCallback, operation) {
|
||||
var obj,
|
||||
_this = this;
|
||||
this.type = type;
|
||||
this.url = url;
|
||||
this.headers = headers;
|
||||
this.body = body;
|
||||
this.successCallback = successCallback;
|
||||
this.errorCallback = errorCallback;
|
||||
this.operation = operation;
|
||||
if (this.type == null) {
|
||||
throw "SwaggerRequest type is required (get/post/put/delete).";
|
||||
}
|
||||
if (this.url == null) {
|
||||
throw "SwaggerRequest url is required.";
|
||||
}
|
||||
if (this.successCallback == null) {
|
||||
throw "SwaggerRequest successCallback is required.";
|
||||
}
|
||||
if (this.errorCallback == null) {
|
||||
throw "SwaggerRequest error callback is required.";
|
||||
}
|
||||
if (this.operation == null) {
|
||||
throw "SwaggerRequest operation is required.";
|
||||
}
|
||||
if (this.operation.resource.api.verbose) {
|
||||
console.log(this.asCurl());
|
||||
}
|
||||
this.headers || (this.headers = {});
|
||||
if (this.operation.resource.api.api_key != null) {
|
||||
this.headers[this.apiKeyName] = this.operation.resource.api.api_key;
|
||||
}
|
||||
if (this.headers.mock == null) {
|
||||
obj = {
|
||||
type: this.type,
|
||||
url: this.url,
|
||||
data: JSON.stringify(this.body),
|
||||
dataType: 'json',
|
||||
error: function(xhr, textStatus, error) {
|
||||
return _this.errorCallback(xhr, textStatus, error);
|
||||
},
|
||||
success: function(data) {
|
||||
return _this.successCallback(data);
|
||||
}
|
||||
};
|
||||
if (obj.type.toLowerCase() === "post" || obj.type.toLowerCase() === "put") {
|
||||
obj.contentType = "application/json";
|
||||
}
|
||||
jQuery.ajax(obj);
|
||||
}
|
||||
}
|
||||
|
||||
SwaggerRequest.prototype.asCurl = function() {
|
||||
var header_args, k, v;
|
||||
header_args = (function() {
|
||||
var _ref, _results;
|
||||
_ref = this.headers;
|
||||
_results = [];
|
||||
for (k in _ref) {
|
||||
v = _ref[k];
|
||||
_results.push("--header \"" + k + ": " + v + "\"");
|
||||
}
|
||||
return _results;
|
||||
}).call(this);
|
||||
return "curl " + (header_args.join(" ")) + " " + this.url;
|
||||
};
|
||||
|
||||
return SwaggerRequest;
|
||||
|
||||
})();
|
||||
|
||||
window.SwaggerApi = SwaggerApi;
|
||||
|
||||
window.SwaggerResource = SwaggerResource;
|
||||
|
||||
window.SwaggerOperation = SwaggerOperation;
|
||||
|
||||
window.SwaggerRequest = SwaggerRequest;
|
||||
|
||||
window.SwaggerModelProperty = SwaggerModelProperty;
|
||||
|
||||
}).call(this);
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue