blob: 102a79c2f77e2ade4812d8ba1d411ec4479273c0 [file] [log] [blame]
// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
library domain.server;
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/protocol.dart';
import 'package:analyzer/src/generated/engine.dart';
import 'package:analyzer/src/generated/java_io.dart';
import 'package:analyzer/src/generated/sdk_io.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer/src/generated/source_io.dart';
/**
* Instances of the class [ServerDomainHandler] implement a [RequestHandler]
* that handles requests in the server domain.
*/
class ServerDomainHandler implements RequestHandler {
/**
* The name of the server.createContext request.
*/
static const String CREATE_CONTEXT_METHOD = 'server.createContext';
/**
* The name of the server.deleteContext request.
*/
static const String DELETE_CONTEXT_METHOD = 'server.deleteContext';
/**
* The name of the server.shutdown request.
*/
static const String SHUTDOWN_METHOD = 'server.shutdown';
/**
* The name of the server.version request.
*/
static const String VERSION_METHOD = 'server.version';
/**
* The name of the contextId parameter.
*/
static const String CONTEXT_ID_PARAM = 'contextId';
/**
* The name of the packageMap parameter.
*/
static const String PACKAGE_MAP_PARAM = 'packageMap';
/**
* The name of the sdkDirectory parameter.
*/
static const String SDK_DIRECTORY_PARAM = 'sdkDirectory';
/**
* The name of the version result value.
*/
static const String VERSION_RESULT = 'version';
/**
* The analysis server that is using this handler to process requests.
*/
final AnalysisServer server;
/**
* Initialize a newly created handler to handle requests for the given [server].
*/
ServerDomainHandler(this.server);
@override
Response handleRequest(Request request) {
try {
String requestName = request.method;
if (requestName == CREATE_CONTEXT_METHOD) {
return createContext(request);
} else if (requestName == DELETE_CONTEXT_METHOD) {
return deleteContext(request);
} else if (requestName == SHUTDOWN_METHOD) {
return shutdown(request);
} else if (requestName == VERSION_METHOD) {
return version(request);
}
} on RequestFailure catch (exception) {
return exception.response;
}
return null;
}
/**
* Create a new context in which analysis can be performed. The context that
* is created will persist until server.deleteContext is used to delete it.
* Clients, therefore, are responsible for managing the lifetime of contexts.
*/
Response createContext(Request request) {
String sdkDirectory = request.getRequiredParameter(SDK_DIRECTORY_PARAM).asString();
Map<String, String> packageMap = request.getParameter(PACKAGE_MAP_PARAM, {}).asStringMap();
String contextId = request.getRequiredParameter(CONTEXT_ID_PARAM).asString();
if (server.contextMap.containsKey(contextId)) {
return new Response.contextAlreadyExists(request);
}
AnalysisContext context = AnalysisEngine.instance.createAnalysisContext();
// TODO(brianwilkerson) Use the information from the request to set the
// source factory in the context.
DirectoryBasedDartSdk sdk;
try {
sdk = new DirectoryBasedDartSdk(new JavaFile(sdkDirectory));
} on Exception catch (e) {
// TODO what error code should be returned here?
return new Response(request.id, new RequestError(
RequestError.CODE_SDK_ERROR, 'Failed to access sdk: $e'));
}
context.sourceFactory = new SourceFactory([
new DartUriResolver(sdk),
new FileUriResolver(),
// new PackageUriResolver(),
]);
server.contextMap[contextId] = context;
Response response = new Response(request.id);
return response;
}
/**
* Delete the context with the given id. Future attempts to use the context id
* will result in an error being returned.
*/
Response deleteContext(Request request) {
String contextId = request.getRequiredParameter(CONTEXT_ID_PARAM).asString();
AnalysisContext removedContext = server.contextMap.remove(contextId);
if (removedContext == null) {
return new Response.contextDoesNotExist(request);
}
Response response = new Response(request.id);
return response;
}
/**
* Cleanly shutdown the analysis server.
*/
Response shutdown(Request request) {
server.running = false;
Response response = new Response(request.id);
return response;
}
/**
* Return the version number of the analysis server.
*/
Response version(Request request) {
Response response = new Response(request.id);
response.setResult(VERSION_RESULT, '0.0.1');
return response;
}
}