users@jaxb.java.net

Réf. : Re: Plugin problem

From: Patrick BRUNETON <patrick.bruneton_at_eads.com>
Date: Wed, 17 Aug 2005 15:10:17 +0200

Yes I can run my plugin with your launcher. Thanks !

I have another question, about the API.

Consedering the schema fragment :

<xs:simpleType name="Length">
     <xs:restriction base="xs:double"></xs:restriction>
</xs:simpleType>

<xs:complexType>
     <xs:sequence>
          <xs:element name="Test" type="Length" />
     ...

In my plugin when I visit the model, I can see in the properties that there
is a property "Test" with type "double".
Is there a way to know at the plugin level, that the xml type is "Length" ?
I would like to use this info to annotate the generated code.
I could use appinfo customization in the schema but it would be heavier.
(It seems I cannot customize the simpleType)



                                                                                                                              
                    Aleksei
                    Valikov Pour : users_at_jaxb.dev.java.net
                    <valikov_at_gmx.n cc :
                    et> Objet : Re: Plugin problem
                                                                                                                              
                    17/08/2005
                    10:58
                    Veuillez
                    répondre à
                    users
                                                                                                                              
                                                                                                                              




Hi.

> I have a problem to integrate a plugin with JAXB 2.0. It is a very simple
> plugin which does nothing. Problem is xjc doesn't instanciate it.
> I put my plugin in a separated jar and launch xjc with the command line :
> java -Dcom.sun.tools.xjc.Options.findServices=true -classpath
> "jaxb-ri-20050815\lib\jaxb-xjc.jar;plug.jar" com.sun.tools.xjc.XJCFacade
>
> I got the error :
> java.lang.ArrayStoreException
> at java.lang.System.arraycopy(Native Method)
> at java.util.ArrayList.toArray(ArrayList.java:305)
> at com.sun.tools.xjc.Options.findServices(Options.java:590)
> at com.sun.tools.xjc.Options.findServices(Options.java:527)
>
> I looked at the sources, and it seems there is a problem with
classloaders,
> the Plugin class is loaded two times.

I've also had problems with classloaders when writing plugins for jaxb2.

> Then I looked in the mailing list and found, somebody already had this
> problem and solved it.
> However I don't know what to do !

As far as I remember, I've fixed the classloaders somehow... But I can't
tell you what exactly I did. Try searching the mailing list archieve, I
must have reported the solution.

> I tried to put my plugin directly into jaxb-xjc.jar with standard
plugins.
> I thought only one Classloader would be used.
> But I still have the error !
>
> What is the standard way to add a plugin ? Is there any example (which
does
> not use Ant task) ?

I've attached the base test case I used to test plugins with JAXB 2.0.
You only need to implement newPlugin() method.

Hope it helps.

ps. I think we really need jaxbcommons2. Seems like more people are
attracted by plugins in jaxb2.

Bye.
/lexi

package org.jvnet.hyperjaxb.plugin.tests;

import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import junit.framework.TestCase;

import org.apache.commons.io.filefilter.SuffixFileFilter;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.sun.tools.xjc.Driver;
import com.sun.tools.xjc.Options;
import com.sun.tools.xjc.Plugin;

/**
 * Abstract test for plugins.
 *
 * @author Aleksei Valikov
 */
public abstract class AbstractPluginTest extends TestCase{

           /**
            * Logger.
            */
           protected Log log = LogFactory.getLog(AbstractPluginTest.class);

           /**
            * Plugin.
            */
           protected Plugin plugin;

           /**
            * Constructs a new test case.
            *
            * @param name
            * test name.
            */
           public AbstractPluginTest(final String name) {
                     super(name);
           }

           /**
            * Test setup.
            *
            * @throws Exception
            * In case of setup problems.
            */
           public void setUp() throws Exception {
                     super.setUp();
                     plugin = newPlugin();
           }

           /**
            * Returns command-line arguments for XJC invocation. This array
will be
            * constructed of what {_at_link #getOptions()},{_at_link
#getBindingOptions()},
            * {_at_link #getAddonOptions()}and {_at_link #getSchemaOptions
()}return.
            *
            * @return Command-line arguments for XJC invocation.
            */
           public String[] getArguments() {
                     final List<String> options = getOptions();
                     final List<String> bindingOptions = getBindingOptions
();
                     final List<String> addonOptions = getAddonOptions();
                     final List<String> schemaOptions = getSchemaOptions();

                     final List<String> args = new ArrayList<String>();

                     args.addAll(options);
                     args.addAll(bindingOptions);
                     args.addAll(addonOptions);
                     args.addAll(schemaOptions);
                     return (String[]) args.toArray(new String[]{});
           }

           /**
            * Returns command-line options for the add-on.
            *
            * @return Command line options for the add-on.
            */
           public List<String> getOptions() {
                     return Arrays.asList(new String[] { "-d",
getGeneratedSourcesDir().getAbsolutePath() });
           }

           protected boolean isDebug()
           {
                     return true;
           }

           protected boolean isNv()
           {
                     return true;
           }

           protected boolean isExtension()
           {
                     return true;
           }
/**
            * Returns a string array of add-on command-line options.
            *
            * @return Command-line options for the add-on.
            */
           public List<String> getAddonOptions()
           {
                     final List<String> addonOptions = new
ArrayList<String>();
                     if (isDebug())
                               addonOptions.add("-debug");
                     if (isNv())
                               addonOptions.add("-nv");
                     if (isExtension())
                               addonOptions.add("-extension");
                     addonOptions.add("-" + plugin.getOptionName());
                     return addonOptions;
           }


           /**
            * Returns schema options.
            *
            * @return Schema options.
            */
           public List<String> getSchemaOptions() {
                     final File[] schemaFiles = getSchemaFiles();
                     final List<String> schemaOptions = new
ArrayList<String>(schemaFiles.length);
                     for (int index = 0; index < schemaFiles.length;
index++) {
                               final File schemaFile = schemaFiles[index];
                               schemaOptions.add(schemaFile.getAbsolutePath
());
                     }
                     return schemaOptions;
           }

           public File getSchemaDirectory()
           {
                     return new File("schema");
           }

           /**
            * Returns an array of schema files.
            *
            * @return Array of schema files.
            */
           public File[] getSchemaFiles() {

                     final FileFilter fileFilter = new SuffixFileFilter
(".xsd");
                     return getSchemaDirectory().listFiles(fileFilter);
           }

           public File getBindingDirectory()
           {
                     return new File("binding");
    }

           /**
            * Returns an array of binding files.
            *
            * @return An array of binding files.
            */
           public File[] getBindingFiles() {
                     final FileFilter fileFilter = new SuffixFileFilter
(".xml");
                     return getBindingDirectory().listFiles(fileFilter);
           }

           /**
            * Binding options.
            *
            * @return Binding options.
            */
           public List<String> getBindingOptions() {
                     final File[] bindingFiles = getBindingFiles();
                     final List<String> bindingOptions = new
ArrayList<String>();
                     if (null != bindingFiles && bindingFiles.length > 0) {
                               bindingOptions.add("-b");
                               for (int index = 0; index <
bindingFiles.length; index++) {
                                          final File bindingFile =
bindingFiles[index];

bindingOptions.add(bindingFile.getAbsolutePath());
                               }
                     }
                     return bindingOptions;
           }

           /**
            * Directory where the sources will be generated.
            *
            * @return "Generated sources" directory.
            */
           public File getGeneratedSourcesDir() {
                     final File generatedSourcesDir = new File
("generated.src");
                     if (!generatedSourcesDir.exists()) {
                               generatedSourcesDir.mkdirs();
                     }
                     return generatedSourcesDir;
           }

           protected abstract Plugin newPlugin();

           /**
            * Runs the test.
            *
            * @throws Exception
            * In case a problem occurs during running the test.
            */
           public void testRun() throws Exception {
                     try {
                               Options.allPlugins.add(plugin);
                               Driver.run(getArguments(), System.out,
System.err);
                     } catch (Exception ex) {
                               ex.printStackTrace();
                               throw ex;
                     }
           }
}

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe_at_jaxb.dev.java.net
For additional commands, e-mail: users-help_at_jaxb.dev.java.net