All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.reprezen.genflow.rapidml.wadl.xtend.XGenerateWadl Maven / Gradle / Ivy

The newest version!
/**
 * Copyright © 2013, 2016 Modelsolv, Inc.
 * All Rights Reserved.
 * 
 * NOTICE: All information contained herein is, and remains the property
 * of ModelSolv, Inc. See the file license.html in the root directory of
 * this project for further information.
 */
package com.reprezen.genflow.rapidml.wadl.xtend;

import com.google.common.base.Objects;
import com.google.common.collect.Iterables;
import com.reprezen.genflow.api.zenmodel.ZenModelExtractOutputItem;
import com.reprezen.genflow.rapidml.wadl.xtend.TraceHelper;
import com.reprezen.genflow.rapidml.wadl.xtend.WadlHelper;
import com.reprezen.rapidml.DataModel;
import com.reprezen.rapidml.Documentable;
import com.reprezen.rapidml.Documentation;
import com.reprezen.rapidml.HTTPMethods;
import com.reprezen.rapidml.HttpMessageParameterLocation;
import com.reprezen.rapidml.MatrixParameter;
import com.reprezen.rapidml.MediaType;
import com.reprezen.rapidml.MessageParameter;
import com.reprezen.rapidml.Method;
import com.reprezen.rapidml.ObjectResource;
import com.reprezen.rapidml.Parameter;
import com.reprezen.rapidml.RESTElement;
import com.reprezen.rapidml.ReferenceElement;
import com.reprezen.rapidml.ReferenceEmbed;
import com.reprezen.rapidml.ReferenceLink;
import com.reprezen.rapidml.ResourceAPI;
import com.reprezen.rapidml.ResourceDefinition;
import com.reprezen.rapidml.ServiceDataResource;
import com.reprezen.rapidml.SourceReference;
import com.reprezen.rapidml.Structure;
import com.reprezen.rapidml.TemplateParameter;
import com.reprezen.rapidml.TypedMessage;
import com.reprezen.rapidml.TypedRequest;
import com.reprezen.rapidml.TypedResponse;
import com.reprezen.rapidml.URI;
import com.reprezen.rapidml.ZenModel;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import org.eclipse.emf.common.util.EList;
import org.eclipse.xtend2.lib.StringConcatenation;
import org.eclipse.xtext.xbase.lib.Extension;
import org.eclipse.xtext.xbase.lib.Functions.Function1;
import org.eclipse.xtext.xbase.lib.IterableExtensions;
import org.eclipse.xtext.xbase.lib.ListExtensions;
import org.eclipse.xtext.xbase.lib.StringExtensions;

@SuppressWarnings("all")
public class XGenerateWadl extends ZenModelExtractOutputItem {
  @Extension
  private WadlHelper _wadlHelper = new WadlHelper();
  
  @Extension
  private TraceHelper traceHelper;
  
  @Override
  public String generate(final ZenModel zenModel, final ResourceAPI resourceAPI) {
    String _xblockexpression = null;
    {
      TraceHelper _traceHelper = new TraceHelper(this.context, zenModel);
      this.traceHelper = _traceHelper;
      StringConcatenation _builder = new StringConcatenation();
      CharSequence _generateApplicationElement = this.generateApplicationElement(resourceAPI, zenModel);
      _builder.append(_generateApplicationElement);
      _builder.newLineIfNotEmpty();
      _xblockexpression = _builder.toString();
    }
    return _xblockexpression;
  }
  
  private CharSequence generateApplicationElement(final ResourceAPI resourceAPI, final ZenModel zenModel) {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("");
    _builder.newLine();
    _builder.append("\t");
    CharSequence _generateGrammar = this.generateGrammar(zenModel);
    _builder.append(_generateGrammar, "\t");
    _builder.newLineIfNotEmpty();
    _builder.append("\t");
    CharSequence _generateResourcesElement = this.generateResourcesElement(resourceAPI);
    _builder.append(_generateResourcesElement, "\t");
    _builder.newLineIfNotEmpty();
    _builder.append("");
    _builder.newLine();
    return _builder;
  }
  
  private String parameterLocation(final HttpMessageParameterLocation type) {
    String _xifexpression = null;
    boolean _equals = Objects.equal(type, HttpMessageParameterLocation.HEADER);
    if (_equals) {
      _xifexpression = "header";
    } else {
      _xifexpression = "query";
    }
    return _xifexpression;
  }
  
  protected CharSequence generateResourcesElement(final ResourceAPI resourceAPI) {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("");
    _builder.newLineIfNotEmpty();
    {
      EList _ownedResourceDefinitions = resourceAPI.getOwnedResourceDefinitions();
      for(final ResourceDefinition resourceDef : _ownedResourceDefinitions) {
        CharSequence _generateResource = this.generateResource(resourceDef);
        _builder.append(_generateResource);
        _builder.newLineIfNotEmpty();
      }
    }
    _builder.append("");
    _builder.newLine();
    {
      EList _ownedResourceDefinitions_1 = resourceAPI.getOwnedResourceDefinitions();
      for(final ResourceDefinition resourceDef_1 : _ownedResourceDefinitions_1) {
        CharSequence _generateResourceType = this.generateResourceType(resourceDef_1);
        _builder.append(_generateResourceType);
        _builder.newLineIfNotEmpty();
      }
    }
    return _builder;
  }
  
  private CharSequence generateNamespaceAdditions(final ZenModel zenModel) {
    StringConcatenation _builder = new StringConcatenation();
    CharSequence _generateXsdNamespaceDeclarations = this.generateXsdNamespaceDeclarations(zenModel);
    _builder.append(_generateXsdNamespaceDeclarations);
    _builder.newLineIfNotEmpty();
    CharSequence _generateAtomNamespaceDeclarations = this.generateAtomNamespaceDeclarations();
    _builder.append(_generateAtomNamespaceDeclarations);
    _builder.newLineIfNotEmpty();
    return _builder;
  }
  
  private CharSequence generateAtomNamespaceDeclarations() {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("xmlns:atom=\"http://www.w3.org/2005/Atom\"");
    return _builder;
  }
  
  private CharSequence generateXsdNamespaceDeclarations(final ZenModel zenModel) {
    StringConcatenation _builder = new StringConcatenation();
    {
      EList _dataModels = zenModel.getDataModels();
      for(final DataModel interfaceDataModel : _dataModels) {
        Object _generateNamespaceDeclaration = this.generateNamespaceDeclaration(interfaceDataModel);
        _builder.append(_generateNamespaceDeclaration);
        _builder.newLineIfNotEmpty();
      }
    }
    {
      EList _resourceAPIs = zenModel.getResourceAPIs();
      for(final ResourceAPI resourceAPI : _resourceAPIs) {
        CharSequence _generateNamespaceDeclaration_1 = this.generateNamespaceDeclaration(resourceAPI);
        _builder.append(_generateNamespaceDeclaration_1);
        _builder.newLineIfNotEmpty();
      }
    }
    return _builder;
  }
  
  private Object generateNamespaceDeclaration(final DataModel interfaceDataModel) {
    return null;
  }
  
  private CharSequence generateNamespaceDeclaration(final ResourceAPI resourceAPI) {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("xmlns:");
    String _nsPrefix = this.traceHelper.getNsPrefix(resourceAPI);
    _builder.append(_nsPrefix);
    _builder.append("=\"");
    String _namespace = this.traceHelper.getNamespace(resourceAPI);
    _builder.append(_namespace);
    _builder.append("\"");
    return _builder;
  }
  
  private CharSequence generateGrammar(final ZenModel zenModel) {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("");
    _builder.newLine();
    _builder.append("    ");
    CharSequence _generateInclude = this.generateInclude(zenModel);
    _builder.append(_generateInclude, "    ");
    _builder.newLineIfNotEmpty();
    _builder.append("");
    _builder.newLine();
    return _builder;
  }
  
  private CharSequence generateInclude(final ZenModel zenModel) {
    StringConcatenation _builder = new StringConcatenation();
    {
      EList _resourceAPIs = zenModel.getResourceAPIs();
      for(final ResourceAPI resourceAPI : _resourceAPIs) {
        _builder.append("");
        _builder.newLineIfNotEmpty();
      }
    }
    return _builder;
  }
  
  protected CharSequence generateResource(final ResourceDefinition resourceDef) {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("");
    _builder.newLineIfNotEmpty();
    _builder.append("");
    _builder.newLine();
    return _builder;
  }
  
  private CharSequence generateResourceType(final ResourceDefinition resourceDef) {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("");
    _builder.newLineIfNotEmpty();
    CharSequence _generateParameters = this.generateParameters(resourceDef);
    _builder.append(_generateParameters);
    _builder.newLineIfNotEmpty();
    {
      EList _methods = resourceDef.getMethods();
      for(final Method method : _methods) {
        CharSequence _generateMethod = this.generateMethod(method, ((ServiceDataResource) resourceDef));
        _builder.append(_generateMethod);
        _builder.newLineIfNotEmpty();
      }
    }
    _builder.append("");
    _builder.newLine();
    return _builder;
  }
  
  protected CharSequence generateMethod(final Method method, final ServiceDataResource containingDataResource) {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("");
    _builder.newLineIfNotEmpty();
    _builder.append("    ");
    CharSequence _generateDoc = this.generateDoc(method);
    _builder.append(_generateDoc, "    ");
    _builder.newLineIfNotEmpty();
    _builder.append("    ");
    _builder.append("");
    _builder.newLine();
    _builder.append("        ");
    CharSequence _generateRequestParameters = this.generateRequestParameters(method.getRequest());
    _builder.append(_generateRequestParameters, "        ");
    _builder.newLineIfNotEmpty();
    _builder.append("        ");
    CharSequence _generateMediaTypes = this.generateMediaTypes(method.getRequest(), containingDataResource);
    _builder.append(_generateMediaTypes, "        ");
    _builder.newLineIfNotEmpty();
    _builder.append("    ");
    _builder.append("");
    _builder.newLine();
    {
      EList _responses = method.getResponses();
      for(final TypedResponse response : _responses) {
        _builder.append("    ");
        _builder.append("");
        _builder.newLineIfNotEmpty();
        _builder.append("    ");
        _builder.append("    ");
        CharSequence _generateResponseParameters = this.generateResponseParameters(response);
        _builder.append(_generateResponseParameters, "        ");
        _builder.newLineIfNotEmpty();
        _builder.append("    ");
        _builder.append("    ");
        CharSequence _generateMediaTypes_1 = this.generateMediaTypes(response, containingDataResource);
        _builder.append(_generateMediaTypes_1, "        ");
        _builder.newLineIfNotEmpty();
        _builder.append("    ");
        _builder.append("");
        _builder.newLine();
      }
    }
    _builder.append("");
    _builder.newLine();
    return _builder;
  }
  
  private CharSequence generateDoc(final Documentable documentable) {
    CharSequence _xifexpression = null;
    Documentation _documentation = null;
    if (documentable!=null) {
      _documentation=documentable.getDocumentation();
    }
    boolean _tripleNotEquals = (_documentation != null);
    if (_tripleNotEquals) {
      StringConcatenation _builder = new StringConcatenation();
      _builder.append("");
      String _text = documentable.getDocumentation().getText();
      _builder.append(_text);
      _builder.append("");
      _xifexpression = _builder;
    }
    return _xifexpression;
  }
  
  private CharSequence generateMediaTypes(final TypedMessage message, final ServiceDataResource containingDataResource) {
    CharSequence _xifexpression = null;
    if ((this.hasResourceType(message) || this.hasDataType(message))) {
      StringConcatenation _builder = new StringConcatenation();
      CharSequence _generateRepresentation = this.generateRepresentation(message, containingDataResource);
      _builder.append(_generateRepresentation);
      _xifexpression = _builder;
    }
    return _xifexpression;
  }
  
  private CharSequence generateRepresentation(final TypedMessage message, final ServiceDataResource containingDataResource) {
    StringConcatenation _builder = new StringConcatenation();
    {
      final Function1> _function = (MediaType it) -> {
        return this._wadlHelper.getMediaSuperTypes(it);
      };
      Set _set = IterableExtensions.toSet(Iterables.concat(Iterables.concat(ListExtensions.>map(message.getMediaTypes(), _function)), message.getMediaTypes()));
      for(final MediaType derivedMediaType : _set) {
        _builder.append("");
        _builder.newLineIfNotEmpty();
        _builder.append("    ");
        CharSequence _generateRepresentationParameters = this.generateRepresentationParameters(message, derivedMediaType, containingDataResource);
        _builder.append(_generateRepresentationParameters, "    ");
        _builder.newLineIfNotEmpty();
        _builder.append("");
        _builder.newLine();
      }
    }
    return _builder;
  }
  
  private CharSequence generateRepresentationElement(final TypedMessage message, final MediaType mediaType) {
    CharSequence _xifexpression = null;
    boolean _supportsJaxb = this._wadlHelper.supportsJaxb(mediaType);
    if (_supportsJaxb) {
      CharSequence _xifexpression_1 = null;
      ResourceDefinition _resourceType = message.getResourceType();
      boolean _tripleEquals = (_resourceType == null);
      if (_tripleEquals) {
        StringConcatenation _builder = new StringConcatenation();
        _builder.append("element=\"");
        String _nsPrefix = this.traceHelper.getNsPrefix(this._wadlHelper.getEContainer(message, ResourceAPI.class));
        _builder.append(_nsPrefix);
        _builder.append(":");
        String _firstLower = StringExtensions.toFirstLower(this._wadlHelper.getMessageTypeName(message));
        _builder.append(_firstLower);
        _builder.append("\"");
        _xifexpression_1 = _builder;
      } else {
        StringConcatenation _builder_1 = new StringConcatenation();
        _builder_1.append("element=\"");
        String _complexTypeQName = this.traceHelper.getComplexTypeQName(message.getResourceType());
        _builder_1.append(_complexTypeQName);
        _builder_1.append("\"");
        _xifexpression_1 = _builder_1;
      }
      _xifexpression = _xifexpression_1;
    }
    return _xifexpression;
  }
  
  private CharSequence generateRepresentationParameters(final TypedMessage message, final MediaType mediaType, final ServiceDataResource containingDataResource) {
    CharSequence _xifexpression = null;
    ResourceDefinition _resourceType = message.getResourceType();
    boolean _tripleEquals = (_resourceType == null);
    if (_tripleEquals) {
      StringConcatenation _builder = new StringConcatenation();
      {
        Iterable _filter = Iterables.filter(message.getReferenceTreatments(), ReferenceLink.class);
        for(final ReferenceLink referenceLink : _filter) {
          CharSequence _generateRepresentationParameter = this.generateRepresentationParameter(referenceLink, mediaType, this._wadlHelper.getMessageTypeName(message), containingDataResource);
          _builder.append(_generateRepresentationParameter);
          _builder.newLineIfNotEmpty();
        }
      }
      _xifexpression = _builder;
    } else {
      StringConcatenation _builder_1 = new StringConcatenation();
      CharSequence _generateRepresentationParameters = this.generateRepresentationParameters(this._wadlHelper.getEContainer(message, ResourceDefinition.class), mediaType);
      _builder_1.append(_generateRepresentationParameters);
      _xifexpression = _builder_1;
    }
    return _xifexpression;
  }
  
  private CharSequence generateRepresentationParameters(final ResourceDefinition resourceDefinition, final MediaType mediaType) {
    CharSequence _xifexpression = null;
    if ((resourceDefinition instanceof ServiceDataResource)) {
      StringConcatenation _builder = new StringConcatenation();
      CharSequence _generateServiceDataResourceRepresentationParameters = this.generateServiceDataResourceRepresentationParameters(((ServiceDataResource) resourceDefinition), mediaType);
      _builder.append(_generateServiceDataResourceRepresentationParameters);
      _xifexpression = _builder;
    }
    return _xifexpression;
  }
  
  private CharSequence generateServiceDataResourceRepresentationParameters(final ServiceDataResource dataResource, final MediaType mediaType) {
    StringConcatenation _builder = new StringConcatenation();
    {
      Iterable _filter = Iterables.filter(dataResource.getAllReferenceTreatments(), ReferenceLink.class);
      for(final ReferenceLink referenceLink : _filter) {
        String _idInTrace = this.traceHelper.getIdInTrace(referenceLink.getTargetResource());
        String _plus = (_idInTrace + "Type");
        CharSequence _generateRepresentationParameter = this.generateRepresentationParameter(referenceLink, mediaType, _plus, dataResource);
        _builder.append(_generateRepresentationParameter);
        _builder.newLineIfNotEmpty();
      }
    }
    return _builder;
  }
  
  private CharSequence generateRepresentationParameter(final ReferenceLink referenceLink, final MediaType mediaType, final String typeName, final ServiceDataResource containingDataResource) {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("");
    _builder.newLineIfNotEmpty();
    _builder.append("    ");
    _builder.append("");
    _builder.newLine();
    _builder.append("");
    _builder.newLine();
    return _builder;
  }
  
  private CharSequence generateRepresentationParameterPath(final ReferenceLink referenceLink, final MediaType mediaType, final ServiceDataResource containingDataResource) {
    CharSequence _xifexpression = null;
    boolean _supportsJaxb = this._wadlHelper.supportsJaxb(mediaType);
    if (_supportsJaxb) {
      StringConcatenation _builder = new StringConcatenation();
      _builder.append("path=\"");
      String _path = this.getPath(referenceLink, containingDataResource);
      _builder.append(_path);
      _builder.append("\"");
      _xifexpression = _builder;
    }
    return _xifexpression;
  }
  
  private CharSequence generateRepresentationParameterType(final ReferenceLink referenceLink, final MediaType mediaType) {
    CharSequence _xifexpression = null;
    boolean _supportsJaxb = this._wadlHelper.supportsJaxb(mediaType);
    if (_supportsJaxb) {
      StringConcatenation _builder = new StringConcatenation();
      _builder.append("type=\"");
      String _type = this.getType(referenceLink);
      _builder.append(_type);
      _builder.append("\"");
      _xifexpression = _builder;
    }
    return _xifexpression;
  }
  
  protected CharSequence generateParameters(final ResourceDefinition resourceDef) {
    CharSequence _xifexpression = null;
    if ((resourceDef != null)) {
      CharSequence _xifexpression_1 = null;
      URI _uRI = resourceDef.getURI();
      boolean _tripleNotEquals = (_uRI != null);
      if (_tripleNotEquals) {
        StringConcatenation _builder = new StringConcatenation();
        {
          Iterable _filter = Iterables.filter(resourceDef.getURI().getUriParameters(), TemplateParameter.class);
          for(final TemplateParameter param : _filter) {
            _builder.append("");
            _builder.newLineIfNotEmpty();
          }
        }
        {
          Iterable _filter_1 = Iterables.filter(resourceDef.getURI().getUriParameters(), MatrixParameter.class);
          for(final MatrixParameter param_1 : _filter_1) {
            _builder.append("");
            _builder.newLineIfNotEmpty();
          }
        }
        _xifexpression_1 = _builder;
      }
      _xifexpression = _xifexpression_1;
    }
    return _xifexpression;
  }
  
  private CharSequence generateRequestParameters(final TypedRequest request) {
    CharSequence _xifexpression = null;
    if ((request != null)) {
      CharSequence _xblockexpression = null;
      {
        final Method method = request.getContainingMethod();
        StringConcatenation _builder = new StringConcatenation();
        {
          Iterable _primitiveParameters = this._wadlHelper.getPrimitiveParameters(request);
          for(final MessageParameter param : _primitiveParameters) {
            CharSequence _generateRequestParameter = this.generateRequestParameter(param, method);
            _builder.append(_generateRequestParameter);
            _builder.newLineIfNotEmpty();
          }
        }
        _xblockexpression = _builder;
      }
      _xifexpression = _xblockexpression;
    }
    return _xifexpression;
  }
  
  private CharSequence generateRequestParameter(final MessageParameter param, final Method method) {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("");
    _builder.newLineIfNotEmpty();
    return _builder;
  }
  
  private CharSequence generateResponseParameters(final TypedResponse request) {
    CharSequence _xifexpression = null;
    if ((request != null)) {
      CharSequence _xblockexpression = null;
      {
        final Method method = request.getContainingMethod();
        StringConcatenation _builder = new StringConcatenation();
        {
          Iterable _primitiveParameters = this._wadlHelper.getPrimitiveParameters(request);
          for(final MessageParameter param : _primitiveParameters) {
            CharSequence _generateResponseParameter = this.generateResponseParameter(param, method);
            _builder.append(_generateResponseParameter);
            _builder.newLineIfNotEmpty();
          }
        }
        _xblockexpression = _builder;
      }
      _xifexpression = _xblockexpression;
    }
    return _xifexpression;
  }
  
  private CharSequence generateResponseParameter(final MessageParameter param, final Method method) {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("");
    _builder.newLineIfNotEmpty();
    return _builder;
  }
  
  private CharSequence _generateParameterType(final Parameter param) {
    CharSequence _xifexpression = null;
    SourceReference _sourceReference = null;
    if (param!=null) {
      _sourceReference=param.getSourceReference();
    }
    boolean _tripleNotEquals = (_sourceReference != null);
    if (_tripleNotEquals) {
      StringConcatenation _builder = new StringConcatenation();
      _builder.append("type=\"xs:");
      String _name = param.getType().getName();
      _builder.append(_name);
      _builder.append("\"");
      _xifexpression = _builder;
    }
    return _xifexpression;
  }
  
  private CharSequence _generateParameterType(final ObjectResource resource) {
    CharSequence _xifexpression = null;
    Structure _dataType = null;
    if (resource!=null) {
      _dataType=resource.getDataType();
    }
    boolean _tripleNotEquals = (_dataType != null);
    if (_tripleNotEquals) {
      StringConcatenation _builder = new StringConcatenation();
      _builder.append("type=\"xs:");
      String _paramType = this.paramType(resource.getDataType());
      _builder.append(_paramType);
      _builder.append("\"");
      _xifexpression = _builder;
    }
    return _xifexpression;
  }
  
  private String getParameterName(final ReferenceLink referenceLink) {
    return StringExtensions.toFirstLower(referenceLink.getReferenceElement().getName());
  }
  
  private boolean hasResourceType(final TypedMessage message) {
    ResourceDefinition _resourceType = message.getResourceType();
    return (_resourceType != null);
  }
  
  private boolean hasDataType(final TypedMessage message) {
    Structure _actualType = message.getActualType();
    return (_actualType != null);
  }
  
  private String getPath(final ReferenceLink referenceLink, final ServiceDataResource containingDataResource) {
    return this.getXPath(referenceLink, containingDataResource);
  }
  
  private String getType(final ReferenceLink referenceLink) {
    return "xs:anyURI";
  }
  
  private String paramType(final Structure complexType) {
    return complexType.getName();
  }
  
  public String getXPath(final ReferenceLink referenceLink, final ServiceDataResource containingDataResource) {
    String _join = IterableExtensions.join(this.getPathToAtomLinkWithNs(referenceLink, containingDataResource), "/");
    String _plus = ("/" + _join);
    return (_plus + "/atom:link");
  }
  
  private Iterable getPathToAtomLinkWithNs(final ReferenceLink referenceLink, final ServiceDataResource containingDataResource) {
    Iterable _xblockexpression = null;
    {
      final String nsPrefix = this.traceHelper.getNsPrefix(this._wadlHelper.getEContainer(referenceLink, ResourceAPI.class));
      final Function1 _function = (String it) -> {
        return ((nsPrefix + ":") + it);
      };
      _xblockexpression = IterableExtensions.map(this.getPathToAtomLink(referenceLink, containingDataResource), _function);
    }
    return _xblockexpression;
  }
  
  private Iterable getPathToAtomLink(final ReferenceLink referenceLink, final ServiceDataResource dataResource) {
    List _xblockexpression = null;
    {
      List result = new ArrayList();
      String _rootElementName = this.traceHelper.getRootElementName(dataResource);
      result.add(_rootElementName);
      Iterable _containmentXpath = this.getContainmentXpath(referenceLink);
      Iterables.addAll(result, _containmentXpath);
      Iterable _referenceXpath = this.getReferenceXpath(referenceLink.getReferenceElement());
      Iterables.addAll(result, _referenceXpath);
      _xblockexpression = result;
    }
    return _xblockexpression;
  }
  
  private Iterable getContainmentXpath(final ReferenceLink referenceLink) {
    final Function1 _function = (ReferenceEmbed it) -> {
      return it.getReferenceElement();
    };
    final Function1> _function_1 = (ReferenceElement it) -> {
      return this.getContainmentXpath(it);
    };
    return Iterables.concat(ListExtensions.>map(ListExtensions.map(referenceLink.getEmbedHierarchy(), _function), _function_1));
  }
  
  private Iterable getReferenceXpath(final ReferenceElement refProperty) {
    LinkedList _xblockexpression = null;
    {
      LinkedList result = new LinkedList();
      boolean _isMultiValued = refProperty.isMultiValued();
      if (_isMultiValued) {
        String _listElementName = this.traceHelper.getListElementName(refProperty);
        result.add(_listElementName);
        String _listItemElementName = this.traceHelper.getListItemElementName(refProperty);
        result.add(_listItemElementName);
      } else {
        String _elementName = this.traceHelper.getElementName(refProperty);
        result.add(_elementName);
      }
      _xblockexpression = result;
    }
    return _xblockexpression;
  }
  
  private Iterable getContainmentXpath(final ReferenceElement refProperty) {
    LinkedList _xblockexpression = null;
    {
      LinkedList result = new LinkedList();
      boolean _isMultiValued = refProperty.isMultiValued();
      if (_isMultiValued) {
        String _listElementName = this.traceHelper.getListElementName(refProperty);
        result.add(_listElementName);
        String _listItemElementName = this.traceHelper.getListItemElementName(refProperty);
        result.add(_listItemElementName);
      } else {
        String _elementName = this.traceHelper.getElementName(refProperty);
        result.add(_elementName);
      }
      _xblockexpression = result;
    }
    return _xblockexpression;
  }
  
  private CharSequence generateParameterType(final RESTElement resource) {
    if (resource instanceof ObjectResource) {
      return _generateParameterType((ObjectResource)resource);
    } else if (resource instanceof Parameter) {
      return _generateParameterType((Parameter)resource);
    } else {
      throw new IllegalArgumentException("Unhandled parameter types: " +
        Arrays.asList(resource).toString());
    }
  }
}