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

com.fhoster.livebase.BlueprintAnnotationProcessor Maven / Gradle / Ivy

/**
 *   Copyright 2024 Fhoster srl
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */
package com.fhoster.livebase;

import com.fhoster.blueprintassisted.BlpServiceReference;
import com.google.common.base.Objects;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import javax.tools.FileObject;
import javax.tools.StandardLocation;
import org.eclipse.xtend2.lib.StringConcatenation;
import org.eclipse.xtext.xbase.lib.CollectionLiterals;
import org.eclipse.xtext.xbase.lib.Conversions;
import org.eclipse.xtext.xbase.lib.Exceptions;
import org.eclipse.xtext.xbase.lib.Functions.Function1;
import org.eclipse.xtext.xbase.lib.IterableExtensions;
import org.eclipse.xtext.xbase.lib.ListExtensions;

@SuppressWarnings("all")
public abstract class BlueprintAnnotationProcessor extends AnnotationProcessor {
  private UniqueIdGenerator generator;
  
  private String uniqueId;
  
  public BlueprintAnnotationProcessor(final UniqueIdGenerator generator) {
    this.generator = generator;
  }
  
  protected void generateBlueprintXML(final Element c, final String serviceProperties) {
    try {
      final Annotation annot = c.getAnnotation(this.supportedAnnotation());
      final String className = c.toString();
      final CharSequence beanId = this.beanID(c);
      final CharSequence serviceId = this.serviceID(className);
      final ExecutableElement onlyConstructor = this.inectableConstructor(c);
      String elementInterface = null;
      boolean _isEmpty = this.interfaces(c).isEmpty();
      if (_isEmpty) {
        elementInterface = this.superclass(c).toString();
      } else {
        elementInterface = IterableExtensions.head(this.interfaces(c)).toString();
      }
      StringConcatenation _builder = new StringConcatenation();
      _builder.append("OSGI-INF/blueprint/");
      _builder.append(className);
      _builder.append(".blueprint.xml");
      String fileName = _builder.toString();
      final Function1 _function = (Method it) -> {
        String _name = it.getName();
        return Boolean.valueOf(Objects.equal(_name, "draft"));
      };
      final Iterable hasDraft = IterableExtensions.filter(((Iterable)Conversions.doWrapArray(annot.annotationType().getDeclaredMethods())), _function);
      int _size = IterableExtensions.size(hasDraft);
      boolean _greaterThan = (_size > 0);
      if (_greaterThan) {
        Object _invoke = IterableExtensions.head(hasDraft).invoke(annot);
        final Boolean draft = ((Boolean) _invoke);
        if ((draft).booleanValue()) {
          String _fileName = fileName;
          fileName = (_fileName + ".draft");
        }
      }
      final StandardLocation location = StandardLocation.SOURCE_OUTPUT;
      final FileObject file = this.createResource(location, fileName);
      this.uniqueId = this.generator.getUniqueId();
      final ArrayList predefinedServiceReferences = CollectionLiterals.newArrayList();
      predefinedServiceReferences.addAll(this.getAssistedBlueprintReferences(onlyConstructor));
      predefinedServiceReferences.addAll(this.getKnownBlueprintReferences());
      final ArrayList constructorArgs = this.processElementConstructor(onlyConstructor, predefinedServiceReferences);
      OutputStream _openOutputStream = file.openOutputStream();
      final PrintWriter out = new PrintWriter(_openOutputStream);
      StringConcatenation _builder_1 = new StringConcatenation();
      _builder_1.append("");
      _builder_1.newLine();
      _builder_1.append("\t");
      _builder_1.append("");
      _builder_1.newLine();
      _builder_1.append("\t");
      _builder_1.newLine();
      _builder_1.append("\t");
      final Function1 _function_1 = (BlueprintReference it) -> {
        return Boolean.valueOf(it.used);
      };
      final Function1 _function_2 = (BlueprintReference it) -> {
        return it.xmlSnippet;
      };
      String _join = IterableExtensions.join(IterableExtensions.map(IterableExtensions.filter(predefinedServiceReferences, _function_1), _function_2), "\n");
      _builder_1.append(_join, "\t");
      _builder_1.newLineIfNotEmpty();
      _builder_1.append("\t\t\t\t\t\t");
      _builder_1.newLine();
      _builder_1.append("\t");
      _builder_1.append("");
      _builder_1.newLineIfNotEmpty();
      _builder_1.append("\t\t");
      String _join_1 = IterableExtensions.join(constructorArgs, "\n");
      _builder_1.append(_join_1, "\t\t");
      _builder_1.newLineIfNotEmpty();
      _builder_1.append("\t");
      _builder_1.append("");
      _builder_1.newLine();
      _builder_1.append("\t");
      _builder_1.newLine();
      _builder_1.newLine();
      _builder_1.append("\t");
      _builder_1.append("");
      _builder_1.newLineIfNotEmpty();
      _builder_1.append("\t\t");
      _builder_1.append(serviceProperties, "\t\t");
      _builder_1.newLineIfNotEmpty();
      _builder_1.append("\t");
      _builder_1.append("");
      _builder_1.newLine();
      _builder_1.append("\t\t");
      _builder_1.newLine();
      _builder_1.append("\t");
      _builder_1.append("");
      _builder_1.newLine();
      final String part = _builder_1.toString();
      out.write(part);
      out.close();
    } catch (Throwable _e) {
      throw Exceptions.sneakyThrow(_e);
    }
  }
  
  public Collection getAssistedBlueprintReferences(final ExecutableElement onlyConstructor) {
    final Function1 _function = (VariableElement it) -> {
      BlpServiceReference _annotation = it.getAnnotation(BlpServiceReference.class);
      return Boolean.valueOf((_annotation != null));
    };
    final Function1 _function_1 = (VariableElement annotated) -> {
      BlueprintReference _xblockexpression = null;
      {
        final BlpServiceReference annotation = annotated.getAnnotation(BlpServiceReference.class);
        String _xifexpression = null;
        String _id = annotation.id();
        boolean _notEquals = (!Objects.equal(_id, ""));
        if (_notEquals) {
          _xifexpression = annotation.id();
        } else {
          StringConcatenation _builder = new StringConcatenation();
          _builder.append("assistedReference");
          _builder.append(this.uniqueId);
          _xifexpression = _builder.toString();
        }
        String refId = _xifexpression;
        String _string = annotated.asType().toString();
        StringConcatenation _builder_1 = new StringConcatenation();
        _builder_1.append("");
        StringConcatenation _builder_2 = new StringConcatenation();
        _builder_2.append("");
        _builder_2.newLine();
        final Function1 _function_2 = (AnnotationMirror it) -> {
          return it.toString();
        };
        List _list = IterableExtensions.toList(ListExtensions.map(annotated.getAnnotationMirrors(), _function_2));
        _xblockexpression = new BlueprintReference(_string, _builder_1.toString(), _builder_2.toString(), _list);
      }
      return _xblockexpression;
    };
    return IterableExtensions.toList(IterableExtensions.map(IterableExtensions.filter(onlyConstructor.getParameters(), _function), _function_1));
  }
  
  protected CharSequence serviceID(final String className) {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("sid.");
    String _lowerCase = className.toLowerCase();
    _builder.append(_lowerCase);
    return _builder;
  }
  
  protected CharSequence beanID(final Element c) {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("bid.");
    String _lowerCase = c.toString().toLowerCase();
    _builder.append(_lowerCase);
    return _builder;
  }
  
  private List getKnownBlueprintReferences() {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("");
    StringConcatenation _builder_1 = new StringConcatenation();
    BlueprintReference _blueprintReference = new BlueprintReference("org.osgi.framework.BundleContext", _builder.toString(), _builder_1.toString());
    StringConcatenation _builder_2 = new StringConcatenation();
    _builder_2.append("");
    StringConcatenation _builder_3 = new StringConcatenation();
    _builder_3.append("");
    _builder_3.newLine();
    BlueprintReference _blueprintReference_1 = new BlueprintReference("com.fhoster.livebase.cloudlet.CloudletDataSource", _builder_2.toString(), _builder_3.toString());
    StringConcatenation _builder_4 = new StringConcatenation();
    _builder_4.append("");
    StringConcatenation _builder_5 = new StringConcatenation();
    _builder_5.append("");
    _builder_5.newLine();
    BlueprintReference _blueprintReference_2 = new BlueprintReference("javax.sql.DataSource", _builder_4.toString(), _builder_5.toString());
    StringConcatenation _builder_6 = new StringConcatenation();
    _builder_6.append("");
    StringConcatenation _builder_7 = new StringConcatenation();
    _builder_7.append("");
    _builder_7.newLine();
    BlueprintReference _blueprintReference_3 = new BlueprintReference("com.fhoster.livebase.cloudlet.CloudletMailSystem", _builder_6.toString(), _builder_7.toString());
    StringConcatenation _builder_8 = new StringConcatenation();
    _builder_8.append("");
    StringConcatenation _builder_9 = new StringConcatenation();
    _builder_9.append("");
    _builder_9.newLine();
    BlueprintReference _blueprintReference_4 = new BlueprintReference("com.fhoster.livebase.cloudlet.CloudletMemberManager", _builder_8.toString(), _builder_9.toString());
    StringConcatenation _builder_10 = new StringConcatenation();
    _builder_10.append("");
    StringConcatenation _builder_11 = new StringConcatenation();
    _builder_11.append("");
    _builder_11.newLine();
    BlueprintReference _blueprintReference_5 = new BlueprintReference("com.fhoster.livebase.cloudlet.CloudletIdGenerator", _builder_10.toString(), _builder_11.toString());
    StringConcatenation _builder_12 = new StringConcatenation();
    _builder_12.append("");
    StringConcatenation _builder_13 = new StringConcatenation();
    _builder_13.append("");
    _builder_13.newLine();
    BlueprintReference _blueprintReference_6 = new BlueprintReference("com.fhoster.livebase.cloudlet.EntitySessionFactory", _builder_12.toString(), _builder_13.toString());
    StringConcatenation _builder_14 = new StringConcatenation();
    _builder_14.append("");
    StringConcatenation _builder_15 = new StringConcatenation();
    _builder_15.append("");
    _builder_15.newLine();
    BlueprintReference _blueprintReference_7 = new BlueprintReference("com.fhoster.livebase.cloudlet.CloudletEntitySessionFactory", _builder_14.toString(), _builder_15.toString());
    StringConcatenation _builder_16 = new StringConcatenation();
    _builder_16.append("");
    StringConcatenation _builder_17 = new StringConcatenation();
    _builder_17.append("");
    _builder_17.newLine();
    BlueprintReference _blueprintReference_8 = new BlueprintReference("com.fhoster.livebase.cloudlet.CloudletSessionFactory", _builder_16.toString(), _builder_17.toString());
    StringConcatenation _builder_18 = new StringConcatenation();
    _builder_18.append("");
    StringConcatenation _builder_19 = new StringConcatenation();
    _builder_19.append("");
    _builder_19.newLine();
    BlueprintReference _blueprintReference_9 = new BlueprintReference("com.fhoster.livebase.cloudlet.EntityLockManager", _builder_18.toString(), _builder_19.toString());
    StringConcatenation _builder_20 = new StringConcatenation();
    _builder_20.append("");
    StringConcatenation _builder_21 = new StringConcatenation();
    _builder_21.append("");
    _builder_21.newLine();
    BlueprintReference _blueprintReference_10 = new BlueprintReference("com.fhoster.livebase.cloudlet.SpiCloudletSMSSender", _builder_20.toString(), _builder_21.toString());
    StringConcatenation _builder_22 = new StringConcatenation();
    _builder_22.append("");
    StringConcatenation _builder_23 = new StringConcatenation();
    _builder_23.append("");
    _builder_23.newLine();
    BlueprintReference _blueprintReference_11 = new BlueprintReference("com.fhoster.livebase.cloudlet.__CurrentUserLoader", _builder_22.toString(), _builder_23.toString());
    return Collections.unmodifiableList(CollectionLiterals.newArrayList(_blueprintReference, _blueprintReference_1, _blueprintReference_2, _blueprintReference_3, _blueprintReference_4, _blueprintReference_5, _blueprintReference_6, _blueprintReference_7, _blueprintReference_8, _blueprintReference_9, _blueprintReference_10, _blueprintReference_11));
  }
  
  private ArrayList processElementConstructor(final ExecutableElement constructor, final Iterable references) {
    ArrayList _xblockexpression = null;
    {
      final ArrayList constructorArgs = CollectionLiterals.newArrayList();
      List _parameters = constructor.getParameters();
      for (final VariableElement t : _parameters) {
        {
          final Function1 _function = (BlueprintReference br) -> {
            String _string = t.asType().toString();
            boolean _notEquals = (!Objects.equal(br.name, _string));
            if (_notEquals) {
              return Boolean.valueOf(false);
            }
            final Function1 _function_1 = (AnnotationMirror it) -> {
              return it.toString();
            };
            final Function1 _function_2 = (String am) -> {
              return Boolean.valueOf(br.filters.contains(am));
            };
            final String filter = IterableExtensions.findFirst(ListExtensions.map(t.getAnnotationMirrors(), _function_1), _function_2);
            if ((filter != null)) {
              return Boolean.valueOf(true);
            }
            boolean _isEmpty = br.filters.isEmpty();
            if (_isEmpty) {
              return Boolean.valueOf(true);
            }
            return Boolean.valueOf(false);
          };
          final BlueprintReference reference = IterableExtensions.findFirst(references, _function);
          if ((reference != null)) {
            reference.used = true;
            constructorArgs.add(reference.argumentSnippet);
          } else {
            StringConcatenation _builder = new StringConcatenation();
            _builder.append("");
            constructorArgs.add(_builder.toString());
          }
        }
      }
      _xblockexpression = constructorArgs;
    }
    return _xblockexpression;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy