Package org.jboss.forge.spec.javaee.rest

Source Code of org.jboss.forge.spec.javaee.rest.RestApplicationFacetImpl

/*
* Copyright 2012 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.jboss.forge.spec.javaee.rest;

import java.io.FileNotFoundException;

import javax.inject.Inject;

import org.jboss.forge.env.Configuration;
import org.jboss.forge.parser.JavaParser;
import org.jboss.forge.parser.java.JavaClass;
import org.jboss.forge.project.facets.BaseFacet;
import org.jboss.forge.project.facets.JavaSourceFacet;
import org.jboss.forge.resources.java.JavaResource;
import org.jboss.forge.resources.java.JavaResourceVisitor;
import org.jboss.forge.shell.plugins.Alias;
import org.jboss.forge.shell.plugins.RequiresFacet;
import org.jboss.forge.spec.javaee.RestApplicationFacet;
import org.jboss.forge.spec.javaee.RestFacet;

/**
* @Author Paul Bakker - paul.bakker@luminis.eu
*/
@Alias("forge.spec.jaxrs.applicationclass")
@RequiresFacet({ RestFacet.class, JavaSourceFacet.class })
public class RestApplicationFacetImpl extends BaseFacet implements RestApplicationFacet
{
   private String classPackage;
   private String className;
   private String rootPath;

   @Inject
   private Configuration configuration;

   @Inject
   public RestApplicationFacetImpl(Configuration configuration)
   {
      classPackage = configuration.getString(REST_APPLICATIONCLASS_PACKAGE);
      className = configuration.getString(REST_APPLICATIONCLASS_NAME);
      rootPath = configuration.getString(RestFacet.ROOTPATH);
   }

   @Override
   public boolean install()
   {
      if (!isInstalled())
      {
         JavaSourceFacet javaSourceFacet = project.getFacet(JavaSourceFacet.class);

         JavaClass applicationClass = JavaParser.create(JavaClass.class)
                  .setPackage(classPackage)
                  .setName(className)
                  .setSuperType("javax.ws.rs.core.Application")
                  .addAnnotation("javax.ws.rs.ApplicationPath").setStringValue(rootPath).getOrigin();

         applicationClass.addImport("javax.ws.rs.core.Application");
         applicationClass.addImport("javax.ws.rs.ApplicationPath");

         try
         {
            javaSourceFacet.saveJavaSource(applicationClass);
         }
         catch (FileNotFoundException e)
         {
            throw new RuntimeException(e);
         }
      }

      return true;
   }

   @Override
   public boolean isInstalled()
   {
      JavaSourceFacet javaSourceFacet = project.getFacet(JavaSourceFacet.class);

      if ((classPackage == null || className == null) && !findApplicationClass())
      {
         return false;
      }

      try
      {
         JavaResource javaResource = javaSourceFacet.getJavaResource(classPackage + "." + className);
         if (javaResource.exists() || findApplicationClass())
         {
            return true;
         }

      }
      catch (FileNotFoundException e)
      {
         return false;
      }

      return false;
   }

   private boolean findApplicationClass()
   {
      JavaSourceFacet javaSourceFacet = project.getFacet(JavaSourceFacet.class);

      configuration.clearProperty(REST_APPLICATIONCLASS_NAME);
      configuration.clearProperty(REST_APPLICATIONCLASS_PACKAGE);

      javaSourceFacet.visitJavaSources(new JavaResourceVisitor()
      {
         boolean found = false;

         @Override
         public void visit(JavaResource javaResource)
         {
            if (!found)
            {
               try
               {
                  if (javaResource.getJavaSource().getAnnotation("javax.ws.rs.ApplicationPath") != null)
                  {
                     configuration
                              .setProperty(REST_APPLICATIONCLASS_PACKAGE, javaResource.getJavaSource().getPackage());
                     configuration.setProperty(REST_APPLICATIONCLASS_NAME, javaResource.getFullyQualifiedName());
                     configuration.setProperty(RestFacet.ROOTPATH,
                              javaResource.getJavaSource().getAnnotation("javax.ws.rs.ApplicationPath")
                                       .getLiteralValue());
                     found = true;
                  }
               }
               catch (FileNotFoundException e)
               {
                  throw new RuntimeException(e);
               }
            }
         }
      });

      return configuration.getString(REST_APPLICATIONCLASS_NAME) != null;
   }

   @Override
   public void setApplicationPath(String path)
   {
      configuration.setProperty(RestFacet.ROOTPATH, path);

      if (classPackage == null || className == null)
      {
         reportConfigurationError(className);
      }

      JavaSourceFacet javaSourceFacet = project.getFacet(JavaSourceFacet.class);

      try
      {
         String classname = classPackage + "." + this.className;
         JavaResource javaResource = javaSourceFacet.getJavaResource(classname);
         if (!javaResource.exists())
         {
            reportConfigurationError(classname);
         }

         javaResource.getJavaSource().getAnnotation("javax.ws.rs.ApplicationPath").setStringValue(path);

      }
      catch (FileNotFoundException e)
      {
         reportConfigurationError(className);
      }

   }

   private void reportConfigurationError(String classname)
   {
      throw new RuntimeException("Error setting application path. The class '" + classname
               + "' in your configuration file does not exist. Run rest setup again.");
   }
}
TOP

Related Classes of org.jboss.forge.spec.javaee.rest.RestApplicationFacetImpl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.