Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'jaxb/plugins/org.eclipse.jpt.jaxb.core.schemagen/src/org')
-rw-r--r--jaxb/plugins/org.eclipse.jpt.jaxb.core.schemagen/src/org/eclipse/jpt/jaxb/core/schemagen/Main.java247
-rw-r--r--jaxb/plugins/org.eclipse.jpt.jaxb.core.schemagen/src/org/eclipse/jpt/jaxb/core/schemagen/internal/JptJaxbCoreMessages.java43
-rw-r--r--jaxb/plugins/org.eclipse.jpt.jaxb.core.schemagen/src/org/eclipse/jpt/jaxb/core/schemagen/internal/jpt_jaxb_core.properties19
3 files changed, 309 insertions, 0 deletions
diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.core.schemagen/src/org/eclipse/jpt/jaxb/core/schemagen/Main.java b/jaxb/plugins/org.eclipse.jpt.jaxb.core.schemagen/src/org/eclipse/jpt/jaxb/core/schemagen/Main.java
new file mode 100644
index 0000000000..b469e47b82
--- /dev/null
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.core.schemagen/src/org/eclipse/jpt/jaxb/core/schemagen/Main.java
@@ -0,0 +1,247 @@
+/*******************************************************************************
+* Copyright (c) 2010 Oracle. All rights reserved.
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License v1.0, which accompanies this distribution
+* and is available at http://www.eclipse.org/legal/epl-v10.html.
+*
+* Contributors:
+* Oracle - initial API and implementation
+*******************************************************************************/
+package org.eclipse.jpt.jaxb.core.schemagen;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.SchemaOutputResolver;
+import javax.xml.transform.Result;
+import javax.xml.transform.stream.StreamResult;
+
+import org.eclipse.jpt.jaxb.core.schemagen.internal.JptJaxbCoreMessages;
+
+/**
+ * Generate a JAXB Schema
+ *
+ * Current command-line arguments:
+ * [-s schema.xsd] - specifies the target schema
+ * [-c className] - specifies the fully qualified class name
+ *
+ * [-p packageName] - specifies the source package // @deprecated
+ */
+public class Main
+{
+ private String[] sourceClassNames;
+ private String targetSchemaName;
+ @SuppressWarnings("unused")
+ private boolean isDebugMode;
+
+ static public String NO_FACTORY_CLASS = "doesnt contain ObjectFactory.class"; //$NON-NLS-1$
+
+ // ********** static methods **********
+
+ public static void main(String[] args) {
+ new Main().execute(args);
+ }
+
+ // ********** constructors **********
+
+ private Main() {
+ super();
+ }
+
+ // ********** behavior **********
+
+ protected void execute(String[] args) {
+
+ this.initializeWith(args);
+
+ this.generate();
+ }
+
+ // ********** internal methods **********
+
+ private void initializeWith(String[] args) {
+ this.sourceClassNames = this.getSourceClassNames(args);
+ this.targetSchemaName = this.getTargetSchemaName(args);
+
+ this.isDebugMode = this.getDebugMode(args);
+ }
+
+ private void generate() {
+ // Create the JAXBContext
+ JAXBContext jaxbContext = this.buildJaxbContext();
+
+ // Generate an XML Schema
+ if(jaxbContext != null) {
+ this.generateSchema(jaxbContext);
+ }
+ String result = (jaxbContext != null) ?
+ this.bind(JptJaxbCoreMessages.SCHEMA_GENERATED, this.targetSchemaName) :
+ this.bind(JptJaxbCoreMessages.SCHEMA_NOT_CREATED, this.targetSchemaName);
+ System.out.println(result);
+ }
+
+ private JAXBContext buildJaxbContext() {
+ System.out.println(this.getString(JptJaxbCoreMessages.LOADING_CLASSES));
+ JAXBContext jaxbContext = null;
+ try {
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+
+ Class[] sourceClasses = this.buildSourceClasses(this.sourceClassNames, loader);
+
+ jaxbContext = JAXBContext.newInstance(sourceClasses);
+ }
+ catch(JAXBException ex) {
+ this.handleException(ex);
+ }
+ return jaxbContext;
+ }
+
+ private void generateSchema(JAXBContext jaxbContext) {
+ System.out.println(this.getString(JptJaxbCoreMessages.GENERATING_SCHEMA));
+ System.out.flush();
+
+ SchemaOutputResolver schemaOutputResolver =
+ new JptSchemaOutputResolver(this.targetSchemaName);
+
+ try {
+ jaxbContext.generateSchema(schemaOutputResolver);
+ }
+ catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private Class[] buildSourceClasses(String[] classNames, ClassLoader loader) {
+
+ ArrayList<Class> sourceClasses = new ArrayList<Class>(classNames.length);
+ for(String className: classNames) {
+ try {
+ sourceClasses.add(loader.loadClass(className));
+ System.out.println(className);
+ }
+ catch (ClassNotFoundException e) {
+ System.err.println(this.bind(JptJaxbCoreMessages.NOT_FOUND, className));
+ }
+ }
+ System.out.flush();
+ return sourceClasses.toArray(new Class[0]);
+ }
+
+ private void handleException(JAXBException ex) {
+ String message = ex.getMessage();
+ Throwable linkedEx = ex.getLinkedException();
+ if(message != null && message.indexOf(NO_FACTORY_CLASS) > -1) {
+ System.err.println(message);
+ }
+ else if(linkedEx != null && linkedEx instanceof ClassNotFoundException) {
+ String errorMessage = this.bind(JptJaxbCoreMessages.CONTEXT_FACTORY_NOT_FOUND, linkedEx.getMessage());
+ System.err.println(errorMessage);
+ }
+ else {
+ ex.printStackTrace();
+ }
+ }
+
+ private String getString(String key) {
+ return JptJaxbCoreMessages.getString(key);
+ }
+
+ private String bind(String key, Object argument) {
+ return MessageFormat.format(this.getString(key), argument);
+ }
+
+ // ********** argument queries **********
+
+ private String[] getSourceClassNames(String[] args) {
+
+ return this.getAllArgumentValue("-c", args); //$NON-NLS-1$
+ }
+
+ private String getTargetSchemaName(String[] args) {
+
+ return this.getArgumentValue("-s", args); //$NON-NLS-1$
+ }
+
+ private boolean getDebugMode(String[] args) {
+
+ return this.argumentExists("-debug", args); //$NON-NLS-1$
+ }
+
+ private String getArgumentValue(String argName, String[] args) {
+ for (int i = 0; i < args.length; i++) {
+ String arg = args[i];
+ if (arg.toLowerCase().equals(argName)) {
+ int j = i + 1;
+ if (j < args.length) {
+ return args[j];
+ }
+ }
+ }
+ return null;
+ }
+
+ private String[] getAllArgumentValue(String argName, String[] args) {
+ List<String> argValues = new ArrayList<String>();
+ for (int i = 0; i < args.length; i++) {
+ String arg = args[i];
+ if (arg.toLowerCase().equals(argName)) {
+ int j = i + 1;
+ if (j < args.length) {
+ argValues.add(args[j]);
+ i++;
+ }
+ }
+ }
+ return argValues.toArray(new String[0]);
+ }
+
+ private boolean argumentExists(String argName, String[] args) {
+ for (int i = 0; i < args.length; i++) {
+ String arg = args[i];
+ if (arg.toLowerCase().equals(argName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
+
+// ********** inner class **********
+
+class JptSchemaOutputResolver extends SchemaOutputResolver {
+
+ private final String targetSchemaName;
+
+ protected JptSchemaOutputResolver(String targetSchemaName) {
+ this.targetSchemaName = targetSchemaName;
+ }
+
+ @Override
+ public Result createOutput(String namespaceURI, String suggestedFileName) throws IOException {
+ String canonicalName = this.canonicalFileName(this.targetSchemaName);
+ File file = new File(canonicalName);
+ StreamResult result = new StreamResult(file);
+ result.setSystemId(file.toURL().toExternalForm());
+ return result;
+ }
+
+ public String canonicalFileName(String fileName) {
+ return canonicalFile(new File(fileName)).getAbsolutePath();
+ }
+
+ public File canonicalFile(File file) {
+ try {
+ return file.getCanonicalFile();
+ }
+ catch (IOException ioexception) {
+ return file.getAbsoluteFile();
+ }
+ }
+
+}
diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.core.schemagen/src/org/eclipse/jpt/jaxb/core/schemagen/internal/JptJaxbCoreMessages.java b/jaxb/plugins/org.eclipse.jpt.jaxb.core.schemagen/src/org/eclipse/jpt/jaxb/core/schemagen/internal/JptJaxbCoreMessages.java
new file mode 100644
index 0000000000..49170533dd
--- /dev/null
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.core.schemagen/src/org/eclipse/jpt/jaxb/core/schemagen/internal/JptJaxbCoreMessages.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+* Copyright (c) 2010 Oracle. All rights reserved.
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License v1.0, which accompanies this distribution
+* and is available at http://www.eclipse.org/legal/epl-v10.html.
+*
+* Contributors:
+* Oracle - initial API and implementation
+*******************************************************************************/
+package org.eclipse.jpt.jaxb.core.schemagen.internal;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * Localized messages used by Dali JAXB core.
+ */
+public class JptJaxbCoreMessages
+{
+
+ public static final String LOADING_CLASSES = "LOADING_CLASSES";
+ public static final String GENERATING_SCHEMA = "GENERATING_SCHEMA";
+ public static final String SCHEMA_GENERATED = "SCHEMA_GENERATED";
+ public static final String SCHEMA_NOT_CREATED = "SCHEMA_NOT_CREATED";
+ public static final String NOT_FOUND = "NOT_FOUND";
+ public static final String CONTEXT_FACTORY_NOT_FOUND = "CONTEXT_FACTORY_NOT_FOUND";
+
+
+ private static final String BUNDLE_NAME = "org.eclipse.jpt.jaxb.core.schemagen.internal.jpt_jaxb_core"; //$NON-NLS-1$
+ private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
+
+ private JptJaxbCoreMessages() {
+ }
+
+ public static String getString(String key) {
+ try {
+ return RESOURCE_BUNDLE.getString(key);
+ }
+ catch (MissingResourceException e) {
+ return '!' + key + '!';
+ }
+ }
+} \ No newline at end of file
diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.core.schemagen/src/org/eclipse/jpt/jaxb/core/schemagen/internal/jpt_jaxb_core.properties b/jaxb/plugins/org.eclipse.jpt.jaxb.core.schemagen/src/org/eclipse/jpt/jaxb/core/schemagen/internal/jpt_jaxb_core.properties
new file mode 100644
index 0000000000..e6367e13a7
--- /dev/null
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.core.schemagen/src/org/eclipse/jpt/jaxb/core/schemagen/internal/jpt_jaxb_core.properties
@@ -0,0 +1,19 @@
+################################################################################
+# Copyright (c) 2010 Oracle. All rights reserved.
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License v1.0, which accompanies this distribution
+# and is available at http://www.eclipse.org/legal/epl-v10.html.
+#
+# Contributors:
+# Oracle - initial API and implementation
+################################################################################
+
+LOADING_CLASSES = loading...
+GENERATING_SCHEMA = \ngenerating schema...
+SCHEMA_GENERATED = \nSchema {0} generated
+SCHEMA_NOT_CREATED = \nSchema {0} not created
+NOT_FOUND = \n\tNot found: {0}
+CONTEXT_FACTORY_NOT_FOUND = \nThe JAXBContextFactory {0} \n\
+configured in the jaxb.properties file could not be located on the project classpath. \n\
+The JAXB provider that defines this factory should be added to the project classpath, \n\
+or the jaxb.properties file should be removed to use the default provider.

Back to the top