Skip to content

Commit

Permalink
Fix the ModelloCli to use Guice, since it is not Plexus component any…
Browse files Browse the repository at this point in the history
… more
  • Loading branch information
fridrich committed Apr 12, 2024
1 parent ef562b0 commit bb79a61
Show file tree
Hide file tree
Showing 3 changed files with 109 additions and 11 deletions.
1 change: 0 additions & 1 deletion modello-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
<groupId>org.sonatype.sisu</groupId>
<artifactId>sisu-guice</artifactId>
<classifier>no_aop</classifier>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.codehaus.plexus</groupId>
Expand Down
5 changes: 1 addition & 4 deletions modello-core/src/main/java/org/codehaus/modello/Modello.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,9 @@
* @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
*/
public class Modello {
private final ModelloCore core;

@Inject
public Modello(ModelloCore core) {
this.core = core;
}
private ModelloCore core;

public void generate(Reader modelReader, String outputType, Properties parameters)
throws ModelloException, ModelValidationException {
Expand Down
114 changes: 108 additions & 6 deletions modello-core/src/main/java/org/codehaus/modello/ModelloCli.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,29 @@
* SOFTWARE.
*/

import javax.inject.Named;

import java.io.File;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.codehaus.plexus.DefaultPlexusContainer;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.TypeLiteral;
import org.codehaus.modello.core.DefaultGeneratorPluginManager;
import org.codehaus.modello.core.DefaultMetadataPluginManager;
import org.codehaus.modello.core.DefaultModelloCore;
import org.codehaus.modello.core.GeneratorPluginManager;
import org.codehaus.modello.core.MetadataPluginManager;
import org.codehaus.modello.core.ModelloCore;
import org.codehaus.modello.metadata.MetadataPlugin;
import org.codehaus.modello.plugin.ModelloGenerator;
import org.codehaus.plexus.build.BuildContext;
import org.codehaus.plexus.build.DefaultBuildContext;
import org.codehaus.plexus.util.StringUtils;
import org.codehaus.plexus.util.xml.XmlStreamReader;

Expand All @@ -40,11 +59,94 @@ public class ModelloCli {
private static Properties parameters;

public static void main(String[] args) throws Exception {
Modello modello = new DefaultPlexusContainer().lookup(Modello.class);

parseArgumentsFromCommandLine(args);

modello.generate(new XmlStreamReader(modelFile), outputType, parameters);
try {

Map<String, ModelloGenerator> modelloGeneratorMap = new HashMap<String, ModelloGenerator>();
Map<String, MetadataPlugin> metadataPluginMap = new HashMap<String, MetadataPlugin>();

/* Give the whole list of plugin classes annotated by @Named.
It is a bit hairy but avoids convoluted way using external
reflection mechanisms.
*/
List<String> classNames = Arrays.asList(
// Internally built plugins
"org.codehaus.modello.plugin.converters.ConverterGenerator",
"org.codehaus.modello.plugin.dom4j.Dom4jReaderGenerator",
"org.codehaus.modello.plugin.dom4j.Dom4jWriterGenerator",
"org.codehaus.modello.plugin.jackson.JacksonReaderGenerator",
"org.codehaus.modello.plugin.jackson.JacksonWriterGenerator",
"org.codehaus.modello.plugin.java.JavaModelloGenerator",
"org.codehaus.modello.plugin.java.metadata.JavaMetadataPlugin",
"org.codehaus.modello.plugin.jdom.JDOMWriterGenerator",
"org.codehaus.modello.plugin.jsonschema.JsonSchemaGenerator",
"org.codehaus.modello.plugin.model.ModelMetadataPlugin",
"org.codehaus.modello.plugin.sax.SaxWriterGenerator",
"org.codehaus.modello.plugin.snakeyaml.SnakeYamlExtendedReaderGenerator",
"org.codehaus.modello.plugin.snakeyaml.SnakeYamlReaderGenerator",
"org.codehaus.modello.plugin.snakeyaml.SnakeYamlWriterGenerator",
"org.codehaus.modello.plugin.stax.StaxReaderGenerator",
"org.codehaus.modello.plugin.stax.StaxSerializerGenerator",
"org.codehaus.modello.plugin.stax.StaxWriterGenerator",
"org.codehaus.modello.plugins.xml.metadata.XmlMetadataPlugin",
"org.codehaus.modello.plugin.velocity.VelocityGenerator",
"org.codehaus.modello.plugin.xdoc.metadata.XdocMetadataPlugin",
"org.codehaus.modello.plugin.xdoc.XdocGenerator",
"org.codehaus.modello.plugin.xpp3.Xpp3ExtendedReaderGenerator",
"org.codehaus.modello.plugin.xpp3.Xpp3ExtendedWriterGenerator",
"org.codehaus.modello.plugin.xpp3.Xpp3ReaderGenerator",
"org.codehaus.modello.plugin.xpp3.Xpp3WriterGenerator",
"org.codehaus.modello.plugin.xsd.metadata.XsdMetadataPlugin",
"org.codehaus.modello.plugin.xsd.XsdGenerator");

Injector injector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(BuildContext.class).to(DefaultBuildContext.class);
bind(org.sonatype.plexus.build.incremental.BuildContext.class)
.to(org.sonatype.plexus.build.incremental.DefaultBuildContext.class);
bind(new TypeLiteral<Map<String, ModelloGenerator>>() {}).toInstance(modelloGeneratorMap);
bind(new TypeLiteral<Map<String, MetadataPlugin>>() {}).toInstance(metadataPluginMap);
bind(GeneratorPluginManager.class).to(DefaultGeneratorPluginManager.class);
bind(MetadataPluginManager.class).to(DefaultMetadataPluginManager.class);
bind(ModelloCore.class).to(DefaultModelloCore.class);
}
});

for (String className : classNames) {
try {
Class<?> cls = Class.forName(className);
Named namedAnnotation = cls.getAnnotation(Named.class);
if (namedAnnotation != null) {
String name = namedAnnotation.value();
Object instance = injector.getInstance(cls);
if (instance instanceof ModelloGenerator) {
modelloGeneratorMap.put(name, (ModelloGenerator) instance);
}
if (instance instanceof MetadataPlugin) {
metadataPluginMap.put(name, (MetadataPlugin) instance);
}
}
} catch (ClassNotFoundException e) {
}
}

for (ModelloGenerator generator : modelloGeneratorMap.values()) {
injector.injectMembers(generator);
}

for (MetadataPlugin plugin : metadataPluginMap.values()) {
injector.injectMembers(plugin);
}

Modello modello = injector.getInstance(Modello.class);
injector.injectMembers(modello);

parseArgumentsFromCommandLine(args);

modello.generate(new XmlStreamReader(modelFile), outputType, parameters);
} catch (Exception e) {
e.printStackTrace();
}
}

public static void parseArgumentsFromCommandLine(String[] args) throws Exception {
Expand Down

0 comments on commit bb79a61

Please sign in to comment.