package bluej.stride.framedjava.ast;

import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.util.Arrays;
import java.util.Collections;

import nu.xom.Builder;
import nu.xom.Document;
import nu.xom.Element;
import nu.xom.ParsingException;
import bluej.parser.entity.EntityResolver;
import bluej.stride.framedjava.elements.AssignElement;
import bluej.stride.framedjava.elements.BlankElement;
import bluej.stride.framedjava.elements.BreakElement;
import bluej.stride.framedjava.elements.BreakpointElement;
import bluej.stride.framedjava.elements.CallElement;
import bluej.stride.framedjava.elements.CaseElement;
import bluej.stride.framedjava.elements.ClassElement;
import bluej.stride.framedjava.elements.CodeElement;
import bluej.stride.framedjava.elements.CommentElement;
import bluej.stride.framedjava.elements.ConstructorElement;
import bluej.stride.framedjava.elements.ForeachElement;
import bluej.stride.framedjava.elements.IfElement;
import bluej.stride.framedjava.elements.ImportElement;
import bluej.stride.framedjava.elements.InterfaceElement;
import bluej.stride.framedjava.elements.MethodProtoElement;
import bluej.stride.framedjava.elements.NormalMethodElement;
import bluej.stride.framedjava.elements.ReturnElement;
import bluej.stride.framedjava.elements.SwitchElement;
import bluej.stride.framedjava.elements.ThrowElement;
import bluej.stride.framedjava.elements.TopLevelCodeElement;
import bluej.stride.framedjava.elements.TryElement;
import bluej.stride.framedjava.elements.VarElement;
import bluej.stride.framedjava.elements.WhileElement;
import bluej.utility.Debug;

public class Loader
{       
public static CodeElement loadElement(Element el)
   {
      switch (el.getLocalName())
       {        
         case AssignElement.ELEMENT: return new AssignElement(el);
       
         case BlankElement.ELEMENT: return new BlankElement(el);
       
         case BreakElement.ELEMENT: return new BreakElement(el);
       
         case BreakpointElement.ELEMENT: return new BreakpointElement(el);
       
         case CallElement.ELEMENT: return new CallElement(el);
       
         case CaseElement.ELEMENT: return new CaseElement(el);
       
         case ClassElement.ELEMENT: throw new IllegalArgumentException("Cannot load top level element via loadElement: " + el.getLocalName());
       
         case CommentElement.ELEMENT: return new CommentElement(el);
       
         case ConstructorElement.ELEMENT: return new ConstructorElement(el);
       
         case ForeachElement.ELEMENT: return new ForeachElement(el);
       
         case IfElement.ELEMENT: return new IfElement(el);
       
         case ImportElement.ELEMENT: return new ImportElement(el);
       
         case InterfaceElement.ELEMENT: throw new IllegalArgumentException("Cannot load top level element via loadElement: " + el.getLocalName());
       
         case MethodProtoElement.ELEMENT: return new MethodProtoElement(el);
       
         case NormalMethodElement.ELEMENT: return new NormalMethodElement(el);
       
         case ReturnElement.ELEMENT: return new ReturnElement(el);
       
         case SwitchElement.ELEMENT: return new SwitchElement(el);
       
         case ThrowElement.ELEMENT: return new ThrowElement(el);
       
         case TryElement.ELEMENT: return new TryElement(el);
       
         case VarElement.ELEMENT: return new VarElement(el);
       
         case WhileElement.ELEMENT: return new WhileElement(el);
       
         default: return null;         
         }     
      }

   
   public static CodeElement loadElement(String elementString)
   {        
      try
       {            
         return loadElement(new Element( 
                       
         new Builder().build(new StringReader(elementString)).getRootElement())
                   
         );         
         }
       
      catch (ParsingException | IOException e)
       {
         Debug.reportError(e);         
         }
       
      return null;     
      }
    
   
   public static TopLevelCodeElement loadTopLevelElement(File file, EntityResolver resolver,
           
   String packageName)
   {        
      try
       {            
         Document xml = new Builder().build(file);
         return Loader.loadTopLevelElement(xml.getRootElement(), resolver, packageName);         
         }
       
      catch (ParsingException | IOException e)
       {
         Debug.reportError(e);         
         }
       
      return null;     
      }

   
   public static TopLevelCodeElement loadTopLevelElement(Element el, EntityResolver resolver,
           
   String packageName)
   {
      switch (el.getLocalName())
       {            
         case ClassElement.ELEMENT:
               
         return new ClassElement(el, resolver, packageName);
           
         case InterfaceElement.ELEMENT:
               
         return new InterfaceElement(el, resolver, packageName);
           
         default:
               
         throw new IllegalArgumentException("Unknown top level element: " + el.getLocalName());         
         }     
      }

   
   public static TopLevelCodeElement buildTopLevelElement(String template, EntityResolver resolver,
           
   String topLevelName, String packageName)
   {
      switch (template) {            
         case "stdclass":
               
         return new ClassElement(resolver, false, topLevelName, packageName,
                       
         Arrays.asList(new ConstructorElement("Constructor for objects of class "
         + topLevelName)));
           
         case "abstract":
               
         return new ClassElement(resolver, true, topLevelName, packageName, Collections.emptyList());
           
         case "interface":
               
         return new InterfaceElement(resolver, topLevelName, packageName);
           
         default:
               
         throw new IllegalArgumentException("Unknown template: " + template);         
         }     
      } 
   }
top, use, map, class Loader

.   loadElement
.   loadElement
.   loadTopLevelElement
.   loadTopLevelElement
.   buildTopLevelElement




182 neLoCode + 0 LoComm