Skip to content

Instantly share code, notes, and snippets.

@sebastienblanc
Created April 4, 2013 12:02
Show Gist options
  • Save sebastienblanc/5309817 to your computer and use it in GitHub Desktop.
Save sebastienblanc/5309817 to your computer and use it in GitHub Desktop.
package org.jboss.forge.scaffold.angularjs;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.jboss.forge.env.Configuration;
import org.jboss.forge.parser.java.JavaClass;
import org.jboss.forge.project.facets.BaseFacet;
import org.jboss.forge.project.facets.DependencyFacet;
import org.jboss.forge.project.facets.JavaSourceFacet;
import org.jboss.forge.project.facets.MetadataFacet;
import org.jboss.forge.project.facets.WebResourceFacet;
import org.jboss.forge.resources.FileResource;
import org.jboss.forge.resources.Resource;
import org.jboss.forge.resources.java.JavaResource;
import org.jboss.forge.scaffoldx.AccessStrategy;
import org.jboss.forge.scaffoldx.ScaffoldProvider;
import org.jboss.forge.scaffoldx.TemplateStrategy;
import org.jboss.forge.scaffoldx.facets.ScaffoldTemplateFacet;
import org.jboss.forge.scaffoldx.util.ScaffoldUtil;
import org.jboss.forge.shell.ShellPrompt;
import org.jboss.forge.shell.plugins.Alias;
import org.jboss.forge.shell.plugins.Help;
import org.jboss.forge.shell.plugins.RequiresFacet;
import org.jboss.forge.shell.project.ProjectScoped;
import org.jboss.forge.shell.util.ConstraintInspector;
import org.jboss.forge.spec.javaee.CDIFacet;
import org.jboss.forge.spec.javaee.EJBFacet;
import org.jboss.forge.spec.javaee.PersistenceFacet;
import org.jboss.forge.spec.javaee.RestFacet;
import org.metawidget.util.simple.StringUtils;
/**
*
*/
@Alias("angularjs")
@Help("AngularJS scaffolding")
@RequiresFacet({ WebResourceFacet.class, DependencyFacet.class, PersistenceFacet.class, EJBFacet.class, CDIFacet.class,
RestFacet.class, ScaffoldTemplateFacet.class })
public class AerogearAngularScaffold extends BaseFacet implements ScaffoldProvider {
protected ShellPrompt prompt;
@Inject
protected IntrospectorClient introspectorClient;
@Inject
protected ResourceProvider resourceProvider;
@Inject
@ProjectScoped
Configuration configuration;
@Inject
public AerogearAngularScaffold(final ShellPrompt prompt) {
this.prompt = prompt;
}
@Override
public boolean install() {
// TODO Add Maven artifacts to the project here. Required facet installation is already handled by the class-level
// @RequiresFacet annotation.
return true;
}
@Override
public boolean isInstalled() {
// TODO Looks unnecessary for this scaffold. See comments on install(). We could extract install() and installed() out.
return true;
}
public List<Resource<?>> setup(String targetDir, boolean overwrite, boolean installTemplates) {
ArrayList<Resource<?>> result = new ArrayList<Resource<?>>();
// Copy templates
if(installTemplates) {
installTemplates();
}
List<ScaffoldResource> staticResources = resourceProvider.getStaticResources();
for(ScaffoldResource scaffoldResource: staticResources){
result.add(processResource(scaffoldResource, overwrite));
}
return result;
}
private Resource processResource(ScaffoldResource scaffoldResource, boolean overwrite) {
switch (scaffoldResource.getType()){
case WEB_STATIC: return processStaticResource(scaffoldResource, overwrite);
case WEB_TEMPLATE: return processWebTemplateResource(scaffoldResource, overwrite);
case JAVA_TEMPLATE: return processJavaTemplateResource(scaffoldResource, overwrite);
default: return null;
}
}
public List<Resource<?>> generateIndex(List<Resource<?>> resources, String targetDir, boolean overwrite) {
ArrayList<Resource<?>> result = new ArrayList<Resource<?>>();
List<String> entityNames = new ArrayList<String>();
WebResourceFacet web = getWebResourceFacet();
FileResource<?> partialsDirectory = web.getWebResource("views");
for (Resource<?> resource : partialsDirectory.listResources()) {
entityNames.add(resource.getName());
}
Map<String, Object> root = new HashMap<String, Object>();
setGeneralContext(root);
root.put("entityNames", entityNames);
List<ScaffoldResource> templateResources = resourceProvider.getCommonTemplateResources();
for(ScaffoldResource scaffoldResource : templateResources) {
scaffoldResource.setContext(root);
result.add(processResource(scaffoldResource, overwrite));
}
return result;
}
@Override
public List<Resource<?>> generateFrom(List<Resource<?>> resources, String targetDir, boolean overwrite) {
ArrayList<Resource<?>> result = new ArrayList<Resource<?>>();
for(Resource<?> resource: resources)
{
JavaClass entity = getJavaClassFrom(resource);
System.out.println("Generating artifacts from Entity:" + entity.getQualifiedName());
WebResourceFacet web = getWebResourceFacet();
Map<String, Object> root = createEntityContext(entity);
List<ScaffoldResource> templateResources = resourceProvider.getPerEntityTemplateResources();
for(ScaffoldResource scaffoldResource : templateResources) {
scaffoldResource.setContext(root);
scaffoldResource.setDestination(replacePattern(scaffoldResource.getDestination(), "{entity}", (String) root.get("entityName")));
result.add(processResource(scaffoldResource, overwrite));
}
}
generateIndex(resources, targetDir, overwrite);
return result;
}
private Resource processStaticResource(ScaffoldResource scaffoldResource, boolean overwrite) {
return ScaffoldUtil.createOrOverwrite(this.prompt, getWebResourceFacet().getWebResource("/styles/bootstrap.css"), getClass()
.getResourceAsStream("/scaffold/styles/bootstrap.css"), overwrite);
}
private Resource processJavaTemplateResource(ScaffoldResource scaffoldResource, boolean overwrite) {
}
private Resource processWebTemplateResource(ScaffoldResource scaffoldResource, boolean overwrite) {
FreemarkerClient freemarkerClient = new FreemarkerClient();
String output = freemarkerClient.processFTL(scaffoldResource.getContext(), scaffoldResource.getSource());
String outputPath = scaffoldResource.getDestination();
return ScaffoldUtil.createOrOverwrite(prompt, getWebResourceFacet().getWebResource(outputPath), output, overwrite);
}
private String replacePattern(String destination, String s, String entityName) {
return destination.replace(s,entityName);
}
private Map<String, Object> createEntityContext(JavaClass entity) {
List<Map<String, String>> inspectionResults = introspectorClient.inspect(entity);
Map<String, Object> root = new HashMap<String, Object>();
setGeneralContext(root);
root.put("entityName", entity.getName());
root.put("properties", inspectionResults);
root.put("resourceRootPath", getResourceRootPath());
return root;
}
private String getResourceRootPath() {
String resourceRootPath = configuration.getString(RestFacet.ROOTPATH);
if (resourceRootPath == null) {
throw new RuntimeException(
"This project does not have a rootpath for REST resources. You may need to run \"rest setup\" in Forge.");
}
if (resourceRootPath.startsWith("/")) {
resourceRootPath = resourceRootPath.substring(1);
}
if (resourceRootPath.endsWith("/")) {
resourceRootPath = resourceRootPath.substring(0, resourceRootPath.length() - 1);
}
return resourceRootPath;
}
private WebResourceFacet getWebResourceFacet() {
return this.project.getFacet(WebResourceFacet.class);
}
private void setGeneralContext(Map<String, Object> root){
MetadataFacet metadata = this.project.getFacet(MetadataFacet.class);
root.put("projectId", StringUtils.camelCase(metadata.getProjectName()));
root.put("projectTitle", StringUtils.uncamelCase(metadata.getProjectName()));
}
@Override
public AccessStrategy getAccessStrategy() {
// TODO Auto-generated method stub
return null;
}
@Override
public TemplateStrategy getTemplateStrategy() {
// TODO Auto-generated method stub
return null;
}
private JavaClass getJavaClassFrom(Resource<?> resource) {
JavaResource javaResource = null;
if(resource instanceof JavaResource)
{
javaResource = (JavaResource) resource;
}
else
{
return null;
}
JavaClass entity;
try {
entity = (JavaClass) javaResource.getJavaSource();
} catch (FileNotFoundException fileEx) {
throw new RuntimeException(fileEx);
}
return entity;
}
private void installTemplates() {
ScaffoldTemplateFacet templates = project.getFacet(ScaffoldTemplateFacet.class);
//templates.createResource(null, ConstraintInspector.getName(getClass()), null);
}
}
public class ScaffoldResource {
private String source;
private String destination;
private Map<String, Object> context;
private ResourceType type;
public ScaffoldResource(String source, ResourceType type, Map<String, Object> context, String destination) {
this.source = source;
this.type = type;
this.context = context;
this.destination = destination;
}
public ScaffoldResource(String source, String destination, ResourceType type) {
this.source = source;
this.destination = destination;
this.type = type;
}
public enum ResourceType {
JAVA_TEMPLATE, WEB_STATIC, WEB_TEMPLATE
}
public String getDestination() {
return destination;
}
public void setDestination(String destination) {
this.destination = destination;
}
public Map<String, Object> getContext() {
return context;
}
public void setContext(Map<String, Object> context) {
this.context = context;
}
public ResourceType getType() {
return type;
}
public void setType(ResourceType type) {
this.type = type;
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
}
package org.jboss.forge.scaffold.angularjs;
import java.util.ArrayList;
import java.util.List;
/**
* Created with IntelliJ IDEA.
* User: sebastien
* Date: 4/4/13
* Time: 11:36 AM
* To change this template use File | Settings | File Templates.
*/
public class ResourceProvider {
public List<ScaffoldResource> getStaticResources(){
List<ScaffoldResource> staticResources = new ArrayList<ScaffoldResource>();
staticResources.add(new ScaffoldResource("/scaffold/styles/bootstrap.css","/styles/bootstrap.css", ScaffoldResource.ResourceType.WEB_STATIC));
staticResources.add(new ScaffoldResource("/scaffold/styles/main.css","/styles/main.css", ScaffoldResource.ResourceType.WEB_STATIC));
staticResources.add(new ScaffoldResource("/scaffold/styles/bootstrap-responsive.css","/styles/bootstrap-responsive.css", ScaffoldResource.ResourceType.WEB_STATIC));
staticResources.add(new ScaffoldResource("/scaffold/scripts/vendor/angular.js","/scripts/vendor/angular.js", ScaffoldResource.ResourceType.WEB_STATIC));
staticResources.add(new ScaffoldResource("/scaffold/scripts/vendor/angular.js","/scripts/vendor/angular.js", ScaffoldResource.ResourceType.WEB_STATIC));
return staticResources;
}
public List<ScaffoldResource> getCommonTemplateResources(){
List<ScaffoldResource> resources = new ArrayList<ScaffoldResource>();
resources.add(new ScaffoldResource("views/index.html.ftl","index.html", ScaffoldResource.ResourceType.WEB_TEMPLATE));
resources.add(new ScaffoldResource("scripts/app.js.ftl","scripts/app.js", ScaffoldResource.ResourceType.WEB_TEMPLATE));
resources.add(new ScaffoldResource("scripts/services/locationParser.js.ftl","scripts/services/locationParser.js", ScaffoldResource.ResourceType.WEB_TEMPLATE));
resources.add(new ScaffoldResource("scripts/filters/genericSearchFilter.js.ftl","scripts/filters/genericSearchFilter.js", ScaffoldResource.ResourceType.WEB_TEMPLATE));
resources.add(new ScaffoldResource("scripts/filters/startFromFilter.js.ftl","scripts/filters/startFromFilter.js", ScaffoldResource.ResourceType.WEB_TEMPLATE));
resources.add(new ScaffoldResource("scripts/filters/startFromFilter.js.ftl","scripts/filters/startFromFilter.js", ScaffoldResource.ResourceType.WEB_TEMPLATE));
return resources;
}
public List<ScaffoldResource> getPerEntityTemplateResources(){
List<ScaffoldResource> resources = new ArrayList<ScaffoldResource>();
resources.add(new ScaffoldResource("views/detail.html.ftl","/views/{entity}/detail.html", ScaffoldResource.ResourceType.WEB_TEMPLATE));
resources.add(new ScaffoldResource("views/search.html.ftl","/views/{entity}/search.html", ScaffoldResource.ResourceType.WEB_TEMPLATE));
resources.add(new ScaffoldResource("scripts/services/entityFactory.js.ftl","/scripts/services/{entity}Factory.js", ScaffoldResource.ResourceType.WEB_TEMPLATE));
resources.add(new ScaffoldResource("scripts/controllers/newEntityController.js.ftl","/scripts/controllers/new{entity}Controller.js", ScaffoldResource.ResourceType.WEB_TEMPLATE));
resources.add(new ScaffoldResource("scripts/controllers/searchEntityController.js.ftl","/scripts/controllers/search{entity}Controller.js", ScaffoldResource.ResourceType.WEB_TEMPLATE));
resources.add(new ScaffoldResource("scripts/controllers/editEntityController.js.ftl","/scripts/controllers/edit{entity}Controller.js", ScaffoldResource.ResourceType.WEB_TEMPLATE));
return resources;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment