[Buix-commits] r816 - trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx
Author: tchemit Date: 2008-08-06 10:16:03 +0000 (Wed, 06 Aug 2008) New Revision: 816 Removed: trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/AbstractActionGeneratorMojo.java trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/AbstractJaxxMojo.java trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/ActionGeneratorMojo.java trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/ActionProviderGeneratorMojo.java Modified: trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/JaxxGeneratorMojo.java Log: simplification du code : on supprime la classe abstraite car pour le moment y'a qu'une seule implantation :) Deleted: trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/AbstractActionGeneratorMojo.java =================================================================== --- trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/AbstractActionGeneratorMojo.java 2008-08-06 10:15:00 UTC (rev 815) +++ trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/AbstractActionGeneratorMojo.java 2008-08-06 10:16:03 UTC (rev 816) @@ -1,55 +0,0 @@ -/** - * # #% Copyright (C) 2008 Code Lutin, Tony Chemit - * This program is free software; you - * can redistribute it and/or modify it under the terms of the GNU General - * Public License as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. This program is - * distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU General Public License for more details. You - * should have received a copy of the GNU General Public License along with this - * program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - * - Suite 330, Boston, MA 02111-1307, USA. - * # #% - */ -package org.codelutin.jaxx; - -import org.codelutin.util.FileUtil; - -import java.io.File; -import java.io.IOException; - -/** - * @author chemit - * @deprecated Now we use the {@link org.codelutin.jaxx.action.ActionAnnotationProcessing} - */ -public abstract class AbstractActionGeneratorMojo extends AbstractJaxxMojo { - - /** - * @description Nom du fichier d'actions à générer. - * @parameter expression="${jaxx.actionsFile}" - * @required - */ - protected String actionsFile; - - /** - * @description flag to copy generated resource files to outClass - * @parameter expression="${jaxx.copyToCP}" default-value="false" - */ - protected boolean copyToCP; - - protected void copyResourceToCP(File file) throws IOException { - - String path = file.getAbsolutePath().substring(outResource.getAbsolutePath().length() + 1); - File compiledFile = new File(outClass, path); - if (verbose) { - getLog().info("copy to classapth generated file " + compiledFile); - } - File parent = compiledFile.getParentFile(); - if (!parent.exists()) { - parent.mkdirs(); - } - FileUtil.copy(file, compiledFile); - } - -} Deleted: trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/AbstractJaxxMojo.java =================================================================== --- trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/AbstractJaxxMojo.java 2008-08-06 10:15:00 UTC (rev 815) +++ trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/AbstractJaxxMojo.java 2008-08-06 10:16:03 UTC (rev 816) @@ -1,183 +0,0 @@ -/** - * # #% Copyright (C) 2008 Code Lutin, Tony Chemit - * This program is free software; you - * can redistribute it and/or modify it under the terms of the GNU General - * Public License as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. This program is - * distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU General Public License for more details. You - * should have received a copy of the GNU General Public License along with this - * program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - * - Suite 330, Boston, MA 02111-1307, USA. - * # #% - */ -package org.codelutin.jaxx; - -import org.apache.maven.artifact.Artifact; -import org.apache.maven.plugin.AbstractMojo; -import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.plugin.MojoFailureException; -import org.apache.maven.plugin.logging.Log; -import org.apache.maven.project.MavenProject; -import static org.codelutin.i18n.I18n._; - -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; -import java.util.Set; - -/** - * Le mojo de base pour les goals Jaxx. - * - * @author chemit - */ -public abstract class AbstractJaxxMojo extends AbstractMojo { - - /** - * @description Dépendance du projet. - * @parameter default-value="${project}" - * @readonly - */ - protected MavenProject project; - - /** - * @description Répertoire de destination des fichiers java à générer. - * @parameter expression="${jaxx.outJava}" default-value="${basedir}/target/generated-sources/java" - */ - protected File outJava; - - /** - * @description chemin du répertoire de génération des resources. - * @parameter expression="${jaxx.outResource}" default-value="${basedir}/target/generated-sources/resources" - */ - protected File outResource; - - /** - * @description chemin du répertoire de compilation des resources. - * @parameter expression="${jaxx.outClass}" default-value="${basedir}/target/classes" - */ - protected File outClass; - - /** - * @description verbose - * @parameter expression="${jaxx.verbose}" default-value="false" - */ - protected boolean verbose; - - - protected abstract void doExecute() throws Exception; - - public void execute() throws MojoExecutionException, MojoFailureException { - - init(); - - try { - - doExecute(); - - } catch (Exception e) { - getLog().error(e); - Throwable e2 = e; - while (e2.getCause() != null) { - e2 = e.getCause(); - } - getLog().error(e2); - - throw new MojoExecutionException(e.getMessage(), e); - } - - } - - protected void init() { - - if (!outResource.exists()) { - outResource.mkdirs(); - } - - if (!outJava.exists()) { - outJava.mkdirs(); - } - - } - - protected void fixCompileSourceRoots() { - if (!project.getCompileSourceRoots().contains(outJava.getPath())) { - project.addCompileSourceRoot(outJava.getPath()); - } - } - - @SuppressWarnings({"unchecked"}) - protected URLClassLoader initClassLoader(MavenProject project, Log log) { - URLClassLoader loader = null; - if (project != null) { - URLClassLoader result; - try { - Set<Artifact> compileClasspathElements = project.getArtifacts(); - URL[] url = new URL[compileClasspathElements.size() + 1]; - url[0] = outClass.toURI().toURL(); - int i = 1; - for (Artifact artifact : compileClasspathElements) { - File file = new File(artifact.getFile().getAbsolutePath()); - if (file.getName().endsWith(".jar")) { - url[i] = new URL("jar", "", file.toURI().toURL().toString() + "!/"); - } else { - url[i] = file.toURI().toURL(); - } - i++; - } - //ClassLoader parent = Thread.currentThread().getContextClassLoader(); - if (compileClasspathElements.size() == 0) { - result = new URLClassLoader(url, getClass().getClassLoader()); - } else { - result = new URLClassLoader(url, getClass().getClassLoader()); - } - } catch (MalformedURLException eee) { - throw new RuntimeException(_("Can't create ClassLoader for script, bad directory: {0} for reason {1}", outClass, eee.getMessage()), eee); - } catch (IOException e) { - throw new RuntimeException(_("Can't create ClassLoader for script, bad directory: {0} for reason {1}", outClass, e.getMessage()), e); - } - loader = result; - } - if (verbose && loader != null) { - for (URL entry : loader.getURLs()) { - log.info("outClass url " + entry); - } - } - return loader; - } - - public File getOutJava() { - return outJava; - } - - public void setOutJava(File outJava) { - this.outJava = outJava; - } - - public File getOutResource() { - return outResource; - } - - public void setOutResource(File outResource) { - this.outResource = outResource; - } - - public File getOutClass() { - return outClass; - } - - public void setOutClass(File outClass) { - this.outClass = outClass; - } - - public boolean isVerbose() { - return verbose; - } - - public void setVerbose(boolean verbose) { - this.verbose = verbose; - } -} \ No newline at end of file Deleted: trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/ActionGeneratorMojo.java =================================================================== --- trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/ActionGeneratorMojo.java 2008-08-06 10:15:00 UTC (rev 815) +++ trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/ActionGeneratorMojo.java 2008-08-06 10:16:03 UTC (rev 816) @@ -1,259 +0,0 @@ -/* *##% - * Copyright (C) 2007 - * JaxxPlugin, Code Lutin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *##%*/ - -package org.codelutin.jaxx; - -import org.codehaus.plexus.util.DirectoryScanner; -import org.codelutin.jaxx.action.ActionConfig; -import org.codelutin.jaxx.action.SelectActionConfig; -import org.codelutin.jaxx.action.ToggleActionConfig; -import org.codelutin.util.SortedProperties; - -import java.io.File; -import java.io.IOException; -import java.io.OutputStream; -import java.net.URL; -import java.net.URLClassLoader; -import java.util.Properties; - -/** - * Classe permettant de generer le fichier de propriétés des actions détectées. - * - * @author chemit - * @goal generate-actions-properties - * @phase process-classes - * @deprecated Now we use the {@link org.codelutin.jaxx.action.ActionAnnotationProcessing} - */ -public class ActionGeneratorMojo extends AbstractActionGeneratorMojo { - - /** - * @description Répertoire sources des fichiers java à traiter. - * @parameter expression="${jaxx.src}" default-value="${basedir}/src/main/java" - */ - protected File src; - - /** - * @description pour filter - * @parameter expression="${jaxx.includes}" - */ - protected String[] includes; - - /** - * @description pour filter - * @parameter expression="${jaxx.excludes}" - */ - protected String[] excludes; - - protected String[] files; - - protected URLClassLoader loader; - - private static final String[] INCLUDES = {"**\\/*.java"}; - - - protected void doExecute() throws Exception { - - if (verbose) { - printInit(); - } - - Properties result = loadProperties(); - - - saveProperties(result); - - } - - protected Properties loadProperties() throws ClassNotFoundException { - Properties result = new SortedProperties(); - for (String file : files) { - String fqn = file.substring(0, file.length() - 5).replaceAll("\\/", "."); - - if (verbose) { - getLog().info("fqn to treate " + fqn); - } - - Class<?> clazz = Class.forName(fqn, false, loader); - - // try a ActionConfig - ActionConfig actionConfig = clazz.getAnnotation(ActionConfig.class); - if (actionConfig != null) { - - if (actionConfig.multiNames().length > 0) { - // multinames - registerEntry(clazz, result, actionConfig.multiNames()); - continue; - } - - if (!actionConfig.actionCommand().isEmpty()) { - registerEntry(clazz, result, actionConfig.actionCommand()); - continue; - } - - getLog().warn("could not treate class " + clazz); - continue; - } - - // try a SelectActionConfig - SelectActionConfig selectActionConfig = clazz.getAnnotation(SelectActionConfig.class); - if (selectActionConfig != null) { - if (selectActionConfig.multiNames().length > 0) { - // multinames - registerEntry(clazz, result, selectActionConfig.multiNames()); - continue; - } - - if (!selectActionConfig.actionCommand().isEmpty()) { - registerEntry(clazz, result, selectActionConfig.actionCommand()); - continue; - } - getLog().warn("could not treate class " + clazz); - continue; - } - - // try a toggleAction - ToggleActionConfig toggleActionConfig = clazz.getAnnotation(ToggleActionConfig.class); - if (toggleActionConfig != null) { - if (toggleActionConfig.multiNames().length > 0) { - // multinames - registerEntry(clazz, result, toggleActionConfig.multiNames()); - continue; - } - - if (!toggleActionConfig.actionCommand().isEmpty()) { - registerEntry(clazz, result, toggleActionConfig.actionCommand()); - continue; - } - - getLog().warn("could not treate class " + clazz); - } - - } - return result; - } - - protected void saveProperties(Properties result) throws IOException { - OutputStream writer = null; - File generatedFile = new File(outResource, actionsFile); - File parent = generatedFile.getParentFile(); - if (!parent.exists()) { - parent.mkdirs(); - } - try { - writer = new org.codelutin.util.PropertiesDateRemoveFilterStream(new java.io.FileOutputStream(generatedFile)); - - result.store(writer, null); - - - } finally { - if (writer != null) { - writer.flush(); - writer.close(); - } - } - - if (copyToCP) { - // save it also in classes - copyResourceToCP(generatedFile); - } - } - - - @Override - protected void init() { - - super.init(); - - DirectoryScanner ds; - ds = new DirectoryScanner(); - ds.setBasedir(src); - boolean noIncludes = includes == null || includes.length == 0; - ds.setIncludes(noIncludes ? INCLUDES : includes); - boolean noExcludes = excludes == null || excludes.length == 0; - if (!noExcludes) { - ds.setExcludes(excludes); - } - ds.scan(); - files = ds.getIncludedFiles(); - - getLog().info("jaxx-actions - found " + files.length + " file(s) to treate. "); - - loader = initClassLoader(project, getLog()); - } - - protected void registerEntry(Class<?> clazz, Properties result, String... names) { - for (String name : names) { - if (verbose) { - getLog().info("name: " + name + ", class:" + clazz); - } - result.put("action." + name, clazz.getName()); - } - } - - protected void printInit() { - - for (String file : files) { - getLog().info(file); - } - - printCP(); - } - - protected void printCP() { - - getLog().info(loader.toString()); - - for (URL url : loader.getURLs()) { - getLog().info("url in class loader " + url); - } - } - - public File getSrc() { - return src; - } - - public void setSrc(File src) { - this.src = src; - } - - public String[] getIncludes() { - return includes; - } - - public void setIncludes(String[] includes) { - this.includes = includes; - } - - public String[] getExcludes() { - return excludes; - } - - public void setExcludes(String[] excludes) { - this.excludes = excludes; - } - - public String[] getFiles() { - return files; - } - - public void setFiles(String[] files) { - this.files = files; - } - -} \ No newline at end of file Deleted: trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/ActionProviderGeneratorMojo.java =================================================================== --- trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/ActionProviderGeneratorMojo.java 2008-08-06 10:15:00 UTC (rev 815) +++ trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/ActionProviderGeneratorMojo.java 2008-08-06 10:16:03 UTC (rev 816) @@ -1,145 +0,0 @@ -/* *##% - * Copyright (C) 2007 - * JaxxPlugin, Code Lutin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *##%*/ - -package org.codelutin.jaxx; - -import org.codelutin.jaxx.action.provider.ActionProvider; -import org.codelutin.jaxx.action.provider.ActionProviderFromProperties; -import org.codelutin.util.FileUtil; - -import java.io.File; -import java.io.IOException; - -/** - * Classe permettant de generer un {@link org.codelutin.jaxx.action.provider.ActionProvider} et son fichier de déclaration. - * - * @author chemit - * @goal generate-actions-provider - * @phase process-resources - * @deprecated Now we use the {@link org.codelutin.jaxx.action.ActionAnnotationProcessing} - */ -public class ActionProviderGeneratorMojo extends AbstractActionGeneratorMojo { - - /** - * @description FQN de la classe à générer. - * @parameter expression="${jaxx.fqn}" - * @required - */ - protected String fqn; - - /** - * @description nom logique du provider à générer. - * @parameter expression="${jaxx.providerName}" - * @required - */ - protected String providerName; - - /** - * @description FQN de la classe d'action à utiliser. - * @parameter expression="${jaxx.fqnAction}" - * @required - */ - protected String fqnAction; - - /** - * template of ActionProvider - * $1 : package of class - * $2 : simple name of class - * $3 : abstract action fqn - * $4 : path to actions properties file - * $5 : provider name - */ - protected static final String PROVIDER_TEMPLATE = - "package %1$s;\n" + - "\n" + - "public class %2$s extends " + ActionProviderFromProperties.class.getName() + "<%3$s> {\n" + - "\n" + - " public %2$s() {\n" + - " super(\"%5$s\", %3$s.class, \"%4$s\");\n" + - " }\n" + - "\n" + - "}\n"; - - protected File generateJavaProvider; - - protected File generatedProviderDeclaration; - - - protected void doExecute() throws Exception { - - generateProvider(); - - generateProviderDeclaration(); - - } - - protected void generateProvider() throws IOException { - - int index = fqn.lastIndexOf("."); - String packageJava = fqn.substring(0, index); - String simpleJavaName = fqn.substring(index + 1); - - //TODO check if file was modified - String content = String.format(PROVIDER_TEMPLATE, - packageJava, - simpleJavaName, - fqnAction, - actionsFile, - providerName - ); - - FileUtil.writeString(generateJavaProvider, content); - } - - protected void generateProviderDeclaration() throws IOException { - - //TODO check if file was modified - - // just add the fqn inside the file :) - FileUtil.writeString(generatedProviderDeclaration, fqn); - - if (copyToCP) { - // save it also in classes (since we are in process-resources phase and resources has already been copied) - copyResourceToCP(generatedProviderDeclaration); - } - } - - @Override - protected void init() { - - super.init(); - - generateJavaProvider = new File(outJava, fqn.replaceAll("\\.", java.io.File.separator) + ".java"); - - File parent = generateJavaProvider.getParentFile(); - if (!parent.exists()) { - parent.mkdirs(); - } - - generatedProviderDeclaration = new File(outResource, "META-INF/services/" + ActionProvider.class.getName()); - parent = generatedProviderDeclaration.getParentFile(); - if (!parent.exists()) { - parent.mkdirs(); - } - - fixCompileSourceRoots(); - - } - -} \ No newline at end of file Modified: trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/JaxxGeneratorMojo.java =================================================================== --- trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/JaxxGeneratorMojo.java 2008-08-06 10:15:00 UTC (rev 815) +++ trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/JaxxGeneratorMojo.java 2008-08-06 10:16:03 UTC (rev 816) @@ -22,11 +22,20 @@ import jaxx.compiler.CompilerOptions; import jaxx.compiler.JAXXCompiler; import jaxx.tags.TagManager; +import org.apache.maven.artifact.Artifact; +import org.apache.maven.plugin.AbstractMojo; +import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugin.logging.Log; +import org.apache.maven.project.MavenProject; import org.codehaus.plexus.util.DirectoryScanner; import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; import java.net.URL; +import java.net.URLClassLoader; +import java.util.Set; /** * Classe permettant de transformer des sources jaxx vers du source java. @@ -35,9 +44,40 @@ * @goal generate * @phase process-resources */ -public class JaxxGeneratorMojo extends AbstractJaxxMojo { +public class JaxxGeneratorMojo extends AbstractMojo { /** + * @description Dépendance du projet. + * @parameter default-value="${project}" + * @readonly + */ + protected MavenProject project; + + /** + * @description Répertoire de destination des fichiers java à générer. + * @parameter expression="${jaxx.outJava}" default-value="${basedir}/target/generated-sources/java" + */ + protected File outJava; + + /** + * @description chemin du répertoire de génération des resources. + * @parameter expression="${jaxx.outResource}" default-value="${basedir}/target/generated-sources/resources" + */ + protected File outResource; + + /** + * @description chemin du répertoire de compilation des resources. + * @parameter expression="${jaxx.outClass}" default-value="${basedir}/target/classes" + */ + protected File outClass; + + /** + * @description verbose + * @parameter expression="${jaxx.verbose}" default-value="false" + */ + protected boolean verbose; + + /** * @description Répertoire sources des fichiers jaxx à générer. * @parameter expression="${jaxx.src}" default-value="${maven.src.dir}/main/uimodel" */ @@ -68,8 +108,15 @@ protected CompilerOptions options; protected void init() { - super.init(); + if (!outResource.exists()) { + outResource.mkdirs(); + } + + if (!outJava.exists()) { + outJava.mkdirs(); + } + fixCompileSourceRoots(); DirectoryScanner ds; @@ -143,6 +190,105 @@ } } + public void execute() throws MojoExecutionException, MojoFailureException { + + init(); + + try { + + doExecute(); + + } catch (Exception e) { + getLog().error(e); + Throwable e2 = e; + while (e2.getCause() != null) { + e2 = e.getCause(); + } + getLog().error(e2); + + throw new MojoExecutionException(e.getMessage(), e); + } + + } + + protected void fixCompileSourceRoots() { + if (!project.getCompileSourceRoots().contains(outJava.getPath())) { + project.addCompileSourceRoot(outJava.getPath()); + } + } + + @SuppressWarnings({"unchecked"}) + protected URLClassLoader initClassLoader(MavenProject project, Log log) { + URLClassLoader loader = null; + if (project != null) { + URLClassLoader result; + try { + Set<Artifact> compileClasspathElements = project.getArtifacts(); + URL[] url = new URL[compileClasspathElements.size() + 1]; + url[0] = outClass.toURI().toURL(); + int i = 1; + for (Artifact artifact : compileClasspathElements) { + File file = new File(artifact.getFile().getAbsolutePath()); + if (file.getName().endsWith(".jar")) { + url[i] = new URL("jar", "", file.toURI().toURL().toString() + "!/"); + } else { + url[i] = file.toURI().toURL(); + } + i++; + } + //ClassLoader parent = Thread.currentThread().getContextClassLoader(); + if (compileClasspathElements.size() == 0) { + result = new URLClassLoader(url, getClass().getClassLoader()); + } else { + result = new URLClassLoader(url, getClass().getClassLoader()); + } + } catch (MalformedURLException eee) { + throw new RuntimeException("Can't create ClassLoader for script, bad directory: " + outClass + " for reason " + eee.getMessage(), eee); + } catch (IOException e) { + throw new RuntimeException("Can't create ClassLoader for script, bad directory: " + outClass + " for reason " + e.getMessage(), e); + } + loader = result; + } + if (verbose && loader != null) { + for (URL entry : loader.getURLs()) { + log.info("outClass url " + entry); + } + } + return loader; + } + + public File getOutJava() { + return outJava; + } + + public void setOutJava(File outJava) { + this.outJava = outJava; + } + + public File getOutResource() { + return outResource; + } + + public void setOutResource(File outResource) { + this.outResource = outResource; + } + + public File getOutClass() { + return outClass; + } + + public void setOutClass(File outClass) { + this.outClass = outClass; + } + + public boolean isVerbose() { + return verbose; + } + + public void setVerbose(boolean verbose) { + this.verbose = verbose; + } + public File getSrc() { return src; }
participants (1)
-
tchemit@users.labs.libre-entreprise.org