Skip to content

Commit

Permalink
FORGE-1745: Fix crazy Templates API (Breaks backwards compatibility) …
Browse files Browse the repository at this point in the history
…And solve FreemarkerTemplate proxy issue.
  • Loading branch information
lincolnthree committed Apr 23, 2014
1 parent d5edebd commit b6dd963
Show file tree
Hide file tree
Showing 21 changed files with 303 additions and 392 deletions.
Expand Up @@ -17,8 +17,8 @@
import javax.xml.bind.annotation.XmlRootElement;

import org.jboss.forge.addon.resource.ResourceFactory;
import org.jboss.forge.addon.templates.TemplateProcessor;
import org.jboss.forge.addon.templates.TemplateProcessorFactory;
import org.jboss.forge.addon.templates.Template;
import org.jboss.forge.addon.templates.TemplateFactory;
import org.jboss.forge.addon.templates.freemarker.FreemarkerTemplate;
import org.jboss.forge.roaster.Roaster;
import org.jboss.forge.roaster.model.JavaClass;
Expand Down Expand Up @@ -46,25 +46,27 @@ public class DTOClassBuilder
private MethodSource<JavaClassSource> assembleJPA;
private MethodSource<JavaClassSource> copyCtor;
private final Property<?> idProperty;
private final TemplateProcessor initializeJPAEntityFromId;
private final TemplateProcessor assembleCollection;
private final TemplateProcessor initializeNestedDTOCollection;
private final Template initializeJPAEntityFromId;
private final Template assembleCollection;
private final Template initializeNestedDTOCollection;

public DTOClassBuilder(JavaClass<?> entity, Property<?> idProperty, boolean topLevel,
TemplateProcessorFactory processorFactory, ResourceFactory resourceFactory)
TemplateFactory templateFactory, ResourceFactory resourceFactory)
{
this.entity = entity;
this.idProperty = idProperty;
this.topLevel = topLevel;
this.copyCtorBuilder = new StringBuilder();
this.assembleJPABuilder = new StringBuilder();
this.initializeJPAEntityFromId = processorFactory.fromTemplate(new FreemarkerTemplate(resourceFactory
.create(getClass().getResource("InitializeJPAEntityFromId.jv"))));
this.assembleCollection = processorFactory.fromTemplate(new FreemarkerTemplate(resourceFactory.create(getClass()
.getResource("AssembleCollection.jv"))));

this.initializeNestedDTOCollection = processorFactory.fromTemplate(new FreemarkerTemplate(resourceFactory
.create(getClass().getResource("InitializeNestedDTOCollection.jv"))));
this.initializeJPAEntityFromId = templateFactory.create(
resourceFactory.create(getClass().getResource("InitializeJPAEntityFromId.jv")),
FreemarkerTemplate.class);
this.assembleCollection = templateFactory.create(
resourceFactory.create(getClass().getResource("AssembleCollection.jv")), FreemarkerTemplate.class);

this.initializeNestedDTOCollection = templateFactory.create(
resourceFactory.create(getClass().getResource("InitializeNestedDTOCollection.jv")),
FreemarkerTemplate.class);

initName();
initClassStructure();
Expand Down
Expand Up @@ -22,8 +22,8 @@
import org.jboss.forge.addon.projects.Project;
import org.jboss.forge.addon.resource.Resource;
import org.jboss.forge.addon.resource.ResourceFactory;
import org.jboss.forge.addon.templates.TemplateProcessor;
import org.jboss.forge.addon.templates.TemplateProcessorFactory;
import org.jboss.forge.addon.templates.Template;
import org.jboss.forge.addon.templates.TemplateFactory;
import org.jboss.forge.addon.templates.freemarker.FreemarkerTemplate;
import org.jboss.forge.roaster.Roaster;
import org.jboss.forge.roaster.model.source.JavaClassSource;
Expand All @@ -34,7 +34,7 @@
public class EntityBasedResourceGenerator implements RestResourceGenerator
{
@Inject
TemplateProcessorFactory processorFactory;
TemplateFactory templateFactory;

@Inject
ResourceFactory resourceFactory;
Expand Down Expand Up @@ -73,7 +73,7 @@ public List<JavaClassSource> generateFrom(RestGenerationContext context) throws
map.put("resourcePath", resourcePath);

Resource<URL> templateResource = resourceFactory.create(getClass().getResource("Endpoint.jv"));
TemplateProcessor processor = processorFactory.fromTemplate(new FreemarkerTemplate(templateResource));
Template processor = templateFactory.create(templateResource, FreemarkerTemplate.class);
String output = processor.process(map);
JavaClassSource resource = Roaster.parse(JavaClassSource.class, output);
resource.addImport(entity.getQualifiedName());
Expand Down
Expand Up @@ -35,8 +35,8 @@
import org.jboss.forge.addon.resource.Resource;
import org.jboss.forge.addon.resource.ResourceException;
import org.jboss.forge.addon.resource.ResourceFactory;
import org.jboss.forge.addon.templates.TemplateProcessor;
import org.jboss.forge.addon.templates.TemplateProcessorFactory;
import org.jboss.forge.addon.templates.Template;
import org.jboss.forge.addon.templates.TemplateFactory;
import org.jboss.forge.addon.templates.freemarker.FreemarkerTemplate;
import org.jboss.forge.roaster.Roaster;
import org.jboss.forge.roaster.model.Field;
Expand All @@ -49,13 +49,13 @@
/**
* A JAX-RS resource generator that creates root and nested DTOs for JPA entities, and references these DTOs in the
* created REST resources.
*
*
* @author <a href="ggastald@redhat.com">George Gastaldi</a>
*/
public class RootAndNestedDTOResourceGenerator implements RestResourceGenerator
{
@Inject
TemplateProcessorFactory processorFactory;
TemplateFactory templateFactory;

@Inject
ResourceFactory resourceFactory;
Expand Down Expand Up @@ -95,7 +95,7 @@ public List<JavaClassSource> generateFrom(RestGenerationContext context) throws
map.put("resourcePath", resourcePath);

Resource<URL> templateResource = resourceFactory.create(getClass().getResource("EndpointWithDTO.jv"));
TemplateProcessor processor = processorFactory.fromTemplate(new FreemarkerTemplate(templateResource));
Template processor = templateFactory.create(templateResource, FreemarkerTemplate.class);
String output = processor.process(map);
JavaClassSource resource = Roaster.parse(JavaClassSource.class, output);
resource.addImport(rootDto.getQualifiedName());
Expand All @@ -109,7 +109,7 @@ public List<JavaClassSource> generateFrom(RestGenerationContext context) throws

/**
* Creates a collection of DTOs for the provided JPA entity, and any JPA entities referenced in the JPA entity.
*
*
* @param entity The JPA entity for which DTOs are to be generated
* @param dtoPackage The Java package in which the DTOs are to be created
* @return The {@link DTOCollection} containing the DTOs created for the JPA entity.
Expand All @@ -136,7 +136,7 @@ private JavaClassSource generatedDTOGraphForEntity(Project project, JavaClass<?>

Property<?> idProperty = parseIdPropertyForJPAEntity(entity);

DTOClassBuilder dtoClassBuilder = new DTOClassBuilder(entity, idProperty, topLevel, processorFactory,
DTOClassBuilder dtoClassBuilder = new DTOClassBuilder(entity, idProperty, topLevel, templateFactory,
resourceFactory)
.setPackage(dtoPackage)
.setEmbeddedType(isEmbeddedType);
Expand Down
Expand Up @@ -28,6 +28,8 @@ public class DirectoryResourceImpl extends AbstractFileResource<DirectoryResourc
public DirectoryResourceImpl(final ResourceFactory factory, final File file)
{
super(factory, file);

isStale();
}

@Override
Expand Down Expand Up @@ -84,7 +86,8 @@ public DirectoryResourceImpl getChildDirectory(final String name) throws Resourc

if (!(result instanceof DirectoryResourceImpl))
{
result = new DirectoryResourceImpl(getResourceFactory(), new File(getUnderlyingResourceObject().getAbsoluteFile(), name));
result = new DirectoryResourceImpl(getResourceFactory(), new File(getUnderlyingResourceObject()
.getAbsoluteFile(), name));
}
return (DirectoryResourceImpl) result;
}
Expand Down Expand Up @@ -179,13 +182,15 @@ public String getName()
{
String fileName = getUnderlyingResourceObject().getName();
// Windows: drive letter is needed. If filename is empty, we are on a root folder
return (OperatingSystemUtils.isWindows() && fileName.length() == 0) ? getUnderlyingResourceObject().getPath() : fileName;
return (OperatingSystemUtils.isWindows() && fileName.length() == 0) ? getUnderlyingResourceObject().getPath()
: fileName;
}

@Override
public boolean equals(final Object obj)
{
return (obj instanceof DirectoryResourceImpl) && ((DirectoryResourceImpl) obj).getUnderlyingResourceObject().equals(getUnderlyingResourceObject());
return (obj instanceof DirectoryResourceImpl)
&& ((DirectoryResourceImpl) obj).getUnderlyingResourceObject().equals(getUnderlyingResourceObject());
}

@Override
Expand Down
19 changes: 9 additions & 10 deletions templates/README.asciidoc
Expand Up @@ -35,27 +35,26 @@ To use this addon, you must add it as a dependency in the *pom.xml* of your `for
</dependency>
----
== Features
TemplateProcessorFactory for template processing::
Allows a template to be processed by replacing the variables with the provided parameters
TemplateFactory for template creation::
Allows a Template to be created, which will replace its template's variables with the provided parameters
+
[source,java]
----
@Inject private TemplateProcessorFactory factory;
@Inject private TemplateFactory factory;
...
FileResource<?> resource = ...; // A file resource containing "Hello ${name}"
Template template = new FreemarkerTemplate(resource); // Mark this resource as a Freemarker template
TemplateProcessor processor = factory.fromTemplate(template);
Map<String,Object> params = new HashMap<String,Object>(); //Could be a POJO also.
Template template = factory.create(resource, FreemarkerTemplate.class); // Create a freemarker template for the given Resource
Map<String,Object> params = new HashMap<String,Object>(); //Could also be a POJO also.
params.put("name", "JBoss Forge");
String output = processor.process(params); // should return "Hello JBoss Forge".
String output = template.process(params); // should return "Hello JBoss Forge".
----
+
[TIP]
====
If your addon uses a container that does not support "@Inject" annotations, services such as the `TemplateProcessorFactory` may also be
If your addon uses a container that does not support "@Inject" annotations, services such as the `TemplateFactory` may also be
accessed via the `AddonRegistry`:
----
Imported<TemplateProcessorFactory> imported = addonRegistry.getServices(TemplateProcessorFactory.class);
TemplateProcessorFactory factory = imported.get();
Imported<TemplateFactory> imported = addonRegistry.getServices(TemplateProcessorFactory.class);
TemplateFactory factory = imported.get();
----
====
@@ -0,0 +1,23 @@
/**
* Copyright 2013 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.addon.templates;

import org.jboss.forge.addon.resource.Resource;

/**
* Creates a {@link TemplateProcessor} based on a {@link Template}
*
* @author <a href="ggastald@redhat.com">George Gastaldi</a>
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
*/
public interface TemplateFactory
{
/**
* Create a {@link TemplateProcessor} for the supplied {@link Resource} and {@link Template} type.
*/
Template create(Resource<?> template, Class<? extends Template> type);
}

This file was deleted.

This file was deleted.

@@ -1,19 +1,17 @@
package org.jboss.forge.addon.templates.freemarker;

import org.jboss.forge.addon.resource.Resource;
import org.jboss.forge.addon.templates.AbstractTemplate;
import org.jboss.forge.addon.templates.Template;

/**
* An abstract representation of a Freemarker template. Consumers of this class create instances of it with
* {@link Resource} instances to wrap Freemarker template resources. This class is used to distinguish Freemarker
* templates from other templates.
*
* A Freemarker {@link Template}.
*
* @author Vineet Reynolds
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
*/
public class FreemarkerTemplate extends AbstractTemplate
public interface FreemarkerTemplate extends Template
{
public FreemarkerTemplate(Resource<?> resource)
{
super(resource);
}
/**
* Get the Freemarker engine template Configuration.
*/
public freemarker.template.Configuration getFreemarkerConfig();
}

0 comments on commit b6dd963

Please sign in to comment.