/**
* Copyright (c) 2015 itemis AG (http://www.itemis.eu) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.xtext.xrobot.dsl.web;
import com.google.inject.Inject;
import com.google.inject.Provider;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Map;
import org.eclipse.emf.common.util.URI;
import org.eclipse.xtext.util.CancelIndicator;
import org.eclipse.xtext.util.concurrent.CancelableUnitOfWork;
import org.eclipse.xtext.web.server.IServiceResult;
import org.eclipse.xtext.web.server.ISessionStore;
import org.eclipse.xtext.web.server.InvalidRequestException;
import org.eclipse.xtext.web.server.ServiceConflictResult;
import org.eclipse.xtext.web.server.XtextServiceDispatcher;
import org.eclipse.xtext.web.server.model.DocumentStateResult;
import org.eclipse.xtext.web.server.model.IXtextWebDocument;
import org.eclipse.xtext.web.server.model.XtextWebDocument;
import org.eclipse.xtext.web.server.model.XtextWebDocumentAccess;
import org.eclipse.xtext.web.server.persistence.IResourceBaseProvider;
import org.eclipse.xtext.xbase.lib.Exceptions;
import org.eclipse.xtext.xbase.lib.Functions.Function0;
import org.eclipse.xtext.xbase.lib.ObjectExtensions;
import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
import org.xtext.xrobot.dsl.web.ReservedTokenStore;
import org.xtext.xrobot.dsl.web.ScriptProviderServlet;
@SuppressWarnings("all")
public class XRobotsServiceDispatcher extends XtextServiceDispatcher {
@Inject
private IResourceBaseProvider resourceBaseProvider;
@Override
public XtextServiceDispatcher.ServiceDescriptor createServiceDescriptor(final String requestType, final Map<String, String> parameters, final ISessionStore sessionStore) {
try {
XtextServiceDispatcher.ServiceDescriptor _switchResult = null;
switch (requestType) {
case "create":
_switchResult = this.getCreateService(parameters, sessionStore);
break;
case "execute":
_switchResult = this.getExecuteService(parameters, sessionStore);
break;
default:
_switchResult = super.createServiceDescriptor(requestType, parameters, sessionStore);
break;
}
return _switchResult;
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
protected XtextServiceDispatcher.ServiceDescriptor getCreateService(final Map<String, String> parameters, final ISessionStore sessionStore) throws InvalidRequestException {
XtextServiceDispatcher.ServiceDescriptor _xblockexpression = null;
{
final String resourceId = parameters.get("resource");
if ((resourceId == null)) {
throw new InvalidRequestException(InvalidRequestException.Type.INVALID_PARAMETERS, "The parameter \'resource\' is required.");
}
XtextServiceDispatcher.ServiceDescriptor _serviceDescriptor = new XtextServiceDispatcher.ServiceDescriptor();
final Procedure1<XtextServiceDispatcher.ServiceDescriptor> _function = new Procedure1<XtextServiceDispatcher.ServiceDescriptor>() {
@Override
public void apply(final XtextServiceDispatcher.ServiceDescriptor it) {
final Function0<IServiceResult> _function = new Function0<IServiceResult>() {
@Override
public IServiceResult apply() {
ServiceConflictResult _xtrycatchfinallyexpression = null;
try {
final URI uri = XRobotsServiceDispatcher.this.resourceBaseProvider.getFileURI(resourceId);
String _fileString = uri.toFileString();
final File file = new File(_fileString);
boolean _exists = file.exists();
if (_exists) {
return new ServiceConflictResult("The resource URI is already reserved.");
} else {
FileWriter writer = null;
try {
FileWriter _fileWriter = new FileWriter(file);
writer = _fileWriter;
final String fullText = parameters.get("fullText");
if ((fullText != null)) {
writer.write(fullText);
}
} finally {
if ((writer != null)) {
writer.close();
}
}
final Provider<XtextWebDocument> _function = new Provider<XtextWebDocument>() {
@Override
public XtextWebDocument get() {
try {
throw new IOException("Failed to create the script file.");
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
};
final XtextWebDocument document = XRobotsServiceDispatcher.this.getResourceDocument(resourceId, sessionStore, _function);
String _stateId = document.getStateId();
return new DocumentStateResult(_stateId);
}
} catch (final Throwable _t) {
if (_t instanceof Throwable) {
final Throwable throwable = (Throwable)_t;
_xtrycatchfinallyexpression = XRobotsServiceDispatcher.this.handleError(it, throwable);
} else {
throw Exceptions.sneakyThrow(_t);
}
}
return _xtrycatchfinallyexpression;
}
};
it.setService(_function);
it.setHasSideEffects(true);
}
};
_xblockexpression = ObjectExtensions.<XtextServiceDispatcher.ServiceDescriptor>operator_doubleArrow(_serviceDescriptor, _function);
}
return _xblockexpression;
}
protected XtextServiceDispatcher.ServiceDescriptor getExecuteService(final Map<String, String> parameters, final ISessionStore sessionStore) throws InvalidRequestException {
try {
XtextServiceDispatcher.ServiceDescriptor _xblockexpression = null;
{
final XtextWebDocumentAccess document = this.getDocumentAccess(parameters, sessionStore);
final String token = parameters.get("token");
if ((token == null)) {
throw new InvalidRequestException(InvalidRequestException.Type.INVALID_PARAMETERS, "The parameter \'token\' is required.");
}
final String address = parameters.get("remoteAddr");
if ((address == null)) {
throw new AssertionError();
}
XtextServiceDispatcher.ServiceDescriptor _serviceDescriptor = new XtextServiceDispatcher.ServiceDescriptor();
final Procedure1<XtextServiceDispatcher.ServiceDescriptor> _function = new Procedure1<XtextServiceDispatcher.ServiceDescriptor>() {
@Override
public void apply(final XtextServiceDispatcher.ServiceDescriptor it) {
final Function0<IServiceResult> _function = new Function0<IServiceResult>() {
@Override
public IServiceResult apply() {
IServiceResult _xtrycatchfinallyexpression = null;
try {
final CancelableUnitOfWork<ReservedTokenStore.ExecutorResult, IXtextWebDocument> _function = new CancelableUnitOfWork<ReservedTokenStore.ExecutorResult, IXtextWebDocument>() {
@Override
public ReservedTokenStore.ExecutorResult exec(final IXtextWebDocument it, final CancelIndicator cancelIndicator) throws Exception {
ReservedTokenStore _tokenStore = ScriptProviderServlet.getTokenStore();
String _text = it.getText();
String _resourceId = it.getResourceId();
return _tokenStore.add(_text, _resourceId, token, address);
}
};
_xtrycatchfinallyexpression = document.<ReservedTokenStore.ExecutorResult>readOnly(_function);
} catch (final Throwable _t) {
if (_t instanceof Throwable) {
final Throwable throwable = (Throwable)_t;
_xtrycatchfinallyexpression = XRobotsServiceDispatcher.this.handleError(it, throwable);
} else {
throw Exceptions.sneakyThrow(_t);
}
}
return _xtrycatchfinallyexpression;
}
};
it.setService(_function);
it.setHasSideEffects(true);
boolean _containsKey = parameters.containsKey("fullText");
it.setHasTextInput(_containsKey);
}
};
_xblockexpression = ObjectExtensions.<XtextServiceDispatcher.ServiceDescriptor>operator_doubleArrow(_serviceDescriptor, _function);
}
return _xblockexpression;
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
}