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

org.sdmlib.models.classes.logic.GenAnnotation Maven / Gradle / Ivy

Go to download

SDMLib is a light weight modeling library. SDMLib intentionally comes without any tool or editor.

There is a newer version: 2.3.2341
Show newest version
package org.sdmlib.models.classes.logic;

import java.util.ArrayList;
import org.sdmlib.codegen.Parser;
import org.sdmlib.codegen.SymTabEntry;
import org.sdmlib.models.classes.ClassModel;

import de.uniks.networkparser.graph.Annotation;
import de.uniks.networkparser.graph.Attribute;
import de.uniks.networkparser.graph.Clazz;
import de.uniks.networkparser.graph.GraphMember;
import de.uniks.networkparser.graph.Method;
import de.uniks.networkparser.list.SimpleList;

public class GenAnnotation extends Generator
{
   public GenAnnotation generate(String rootDir, String helperDir)
   {
      if (model.getParent() instanceof Clazz)
         return generate((Clazz)model.getParent(), rootDir, helperDir);
      if (model.getParent() instanceof Method)
         return generate((Method)model.getParent(), rootDir, helperDir);
      if (model.getParent() instanceof Attribute)
         return generate((Attribute)model.getParent(), rootDir, helperDir);
      return this;
   }

   private GenAnnotation generate(Attribute attribute, String rootDir, String helperDir)
   {
      Parser parser = getGenerator(attribute.getClazz()).getOrCreateParser(rootDir);
      parser.parse();

      // ArrayList tabEntries =
      // parser.getSymTabEntriesFor(attribute.getName());
      return generate(parser, getStartPos(parser));
   }

   private int getStartPos(Parser parser)
   {
      return parser.indexOf(Parser.ATTRIBUTE + ":" + model.getParent().getName());
   }

   private GenAnnotation generate(Method method, String rootDir, String helperDir)
   {
      Parser parser = getGenerator(method.getClazz()).getOrCreateParser(rootDir);
      parser.parse();

      ArrayList tabEntries = parser.getSymTabEntriesFor(method.getName(false));
      return generate(parser, getStartPos(tabEntries));
   }

   private GenAnnotation generate(Clazz clazz, String rootDir, String helperDir)
   {
      Parser parser = getGenerator(clazz).getOrCreateParser(rootDir);
      parser.parse();

      ArrayList tabEntries = parser.getSymTabEntriesFor(clazz.getName());
      return generate(parser, getStartPos(tabEntries));
   }

   private int getStartPos(ArrayList tabEntries)
   {
      SymTabEntry symTabEntry = null;

      if (tabEntries.size() > 0)
      {
         symTabEntry = tabEntries.get(0);
      }

      if (symTabEntry == null || annotationAlreadyInserted(symTabEntry))
         return -1;

      return symTabEntry.getStartPos();
   }

   private boolean annotationAlreadyInserted(SymTabEntry symTabEntry)
   {
      boolean inserted = false;
      if (symTabEntry.getAnnotations() != null && symTabEntry.getAnnotations().contains(model.getName()))
      {
         inserted = true;
         for (Annotation value : model.getValue())
         {
            if (!symTabEntry.getAnnotations().contains(value.toString()))
            {
               inserted = false;
               break;
            }
         }
      }

      return inserted;
   }

   private GenAnnotation generate(Parser parser, int startPos)
   {

      if (startPos == -1)
      {
         return this;
      }

      StringBuilder sb = new StringBuilder();
      if(!model.getName().startsWith("@")) {
    	  sb.append("@");
      }
      sb.append(model.getName());

      SimpleList values = model.getValue();
      if(values == null) {
    	  
      }else if (values.size() == 1)
      {
         sb.append("(");
         sb.append(values.toArray(new Annotation[values.size()])[0]);
         sb.append(")");
      }
      else if (values.size() > 1)
      {
         sb.append("({");
         for (Annotation value : values)
         {
            sb.append("\"");
            sb.append(value.toString());
            sb.append("\", ");
         }
         sb.replace(sb.length() - 2, sb.length(), "");
         sb.append("})");
      }

      sb.append("\n");
      // CGUtil
      
      String newAnnotation = sb.toString();
      int indexOf = parser.getFileBody().indexOf(newAnnotation, startPos-newAnnotation.length()-5);
      if (indexOf < 0 || indexOf > startPos)
      {
         parser.insert(startPos, newAnnotation);
         parser.parse();
      }

      return this;
   }

	@Override
	ClassModel getClazz() {
		GraphMember owner = getModel().getParent();
		if (owner instanceof Clazz)
	         return (ClassModel)((Clazz)owner).getClassModel();
	      if (owner instanceof Method)
	         return (ClassModel)((Method)owner).getClazz().getClassModel();
	      if (owner instanceof Attribute)
	    	  return (ClassModel)((Attribute)owner).getClazz().getClassModel();
	      return null;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy