The main method code path in
SDOClassGenerator uses our default resolver, so you have a few options
- modify the schema location(s) [not preferred], write an application
and not use the compiler script, or write a custom class generator that
uses your custom resolver and execute that from the script instead of
the SDOClassGenerator.  For example, your custom class generator class
could look something like: 
package test; 
   
import java.io.FileReader; 
import java.io.IOException; 
import javax.xml.transform.Source; 
import org.eclipse.persistence.sdo.helper.DefaultSchemaResolver; 
import org.eclipse.persistence.sdo.helper.FileCodeWriter; 
import org.eclipse.persistence.sdo.helper.SDOClassGenerator; 
   
public class CustomClassGenerator { 
    CustomClassGenerator(String sourceFile, String sourceDir) { 
        try { 
            FileReader reader = new FileReader(sourceFile); 
            FileCodeWriter fileCodeWriter = new FileCodeWriter(); 
            fileCodeWriter.setSourceDir(sourceDir); 
            new SDOClassGenerator().generate(reader, fileCodeWriter,
new CustomSchemaResolver()); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
    } 
     
    public static void main(String[] args) { 
        String sourceDir = null; 
        String sourceFile = null; 
        int argsLength = args.length; 
   
        for (int i = 0; i < argsLength; i++) { 
            if (args[i].equals("-sourceFile")) { 
                if (i == (argsLength - 1)) { 
                    System.out.println("-sourceFile argument required"); 
                    System.exit(0); 
                } 
                sourceFile = args[++i]; 
            } 
            if (args[i].equals("-targetDirectory")) { 
                if (i == (argsLength - 1)) { 
                    System.out.println("-targetDirectory argument
required"); 
                    System.exit(0); 
                } 
                sourceDir = args[++i]; 
            } 
        } 
        if (null == sourceFile) { 
            System.exit(0); 
        } 
   
        new CustomClassGenerator(sourceFile, sourceDir); 
    } 
   
    // SchemaResolver implementation 
    class CustomSchemaResolver extends DefaultSchemaResolver { 
        public Source resolveSchema(Source sourceXSD, String namespace,
String schemaLocation) { 
            // TODO: handle relative schema locations 
            return super.resolveSchema(sourceXSD, namespace,
schemaLocation); 
        } 
    } 
} 
   
   
Make sure this class is on the classpath, and change the following line
in the script from: 
${JAVA_HOME}/bin/java
${JVM_ARGS} -cp ${CLASSPATH} \ 
    org.eclipse.persistence.sdo.helper.SDOClassGenerator ${JAVA_ARGS} 
   
to: 
${JAVA_HOME}/bin/java
${JVM_ARGS} -cp ${CLASSPATH} \ 
    test.CustomClassGenerator ${JAVA_ARGS} 
   
 
Please
let me know if you have any further questions. 
 
  
David Goodenough wrote:
  How do I use this in the sdo-compiler?
David
On Wednesday 09 July 2008, David McCann wrote:
   
  
    Hey David,
To handle this scenario you will need to implement a SchemaResolver
(org.eclipse.persistence.sdo.helper package) that can load the doc based
on the relative path.  To do this, you can simply extend the default
resolver we provide
(org.eclipse.persistence.sdo.helper.DefaultSchemaResolver) and override
the resolveSchema(Source, String, String) method to handle this case.
Note that the schema resolver is passed in as a parameter in the define
method on the delegator.
Here's an example of a custom resolver:
    public class CyclicSchemaResolver extends DefaultSchemaResolver {
        public Source resolveSchema(Source sourceXSD, String namespace,
    String schemaLocation) {
            if (schemaLocation != null && !schemaLocation.equals("")) {
                return super.resolveSchema(sourceXSD, namespace,
    schemaLocation);
            }
            schemaLocation = namespace.equals("uri") ? "Cyclic1.xsd" :
    "Cyclic2.xsd";
            URL schemaUrl = null;
            try {
                if (getBaseSchemaLocation() != null) {
                    // Attempt to resolve the schema location against
    the base location
                    URI baseUri = new URI(getBaseSchemaLocation());
                    URI resolvedUri = baseUri.resolve(schemaLocation);
                    schemaUrl = resolvedUri.toURL();
                } else {
                    schemaUrl = new URL(schemaLocation);
                }
            } catch (Exception e) {
                return null;
            }
            return new StreamSource(schemaUrl.toExternalForm());
        }
    }
Please let me know if you have any questions.
--Dave
------------------------------------------------------------------------
David Goodenough wrote:
    
    
      I am trying to run the sdo-compiler against some of the OASIS xsd files
but when I try I get a MalformedURLException when resolving schemas.
This is using 1.0M11.
The first exception I get is:-
[EL Warning]: 2008.07.09 11:41:48.932--Thread(Thread[main,5,main])--An
java.net.MalformedURLException occurred processing referenced schema with
uri
urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2
with schemaLocation ../common/UBL-CommonAggregateComponents-2.0.xsd.
[EL Finest]: 2008.07.09
11:41:48.947--Thread(Thread[main,5,main])--java.net.MalformedURLException
: no protocol: ../common/UBL-CommonAggregateComponents-2.0.xsd
        at java.net.URL.<init>(URL.java:567)
        at java.net.URL.<init>(URL.java:464)
        at java.net.URL.<init>(URL.java:413)
        at
org.eclipse.persistence.sdo.helper.DefaultSchemaResolver.resolveSchema(De
faultSchemaResolver.java:55) at
org.eclipse.persistence.sdo.helper.SchemaResolverWrapper.resolveSchema(Sc
hemaResolverWrapper.java:61) at
org.eclipse.persistence.sdo.helper.SDOTypesGenerator.getReferencedSchema(
SDOTypesGenerator.java:2056) at
org.eclipse.persistence.sdo.helper.SDOTypesGenerator.getSchema(SDOTypesGe
nerator.java:2025) at
org.eclipse.persistence.sdo.helper.SDOTypesGenerator.getSchema(SDOTypesGe
nerator.java:1999) at
org.eclipse.persistence.sdo.helper.SDOTypesGenerator.define(SDOTypesGener
ator.java:108) at
org.eclipse.persistence.sdo.helper.SDOClassGenerator.generate(SDOClassGen
erator.java:209) at
org.eclipse.persistence.sdo.helper.SDOClassGenerator.generate(SDOClassGen
erator.java:175) at
org.eclipse.persistence.sdo.helper.SDOClassGenerator.main(SDOClassGenerat
or.java:111)
Looking at the relevant line in the xsd file, it starts:-
<?xml version="1.0" encoding="UTF-8"?>
<!--
  Document Type:     Invoice
  Generated On:      Tue Oct 03 2:26:38 P3 2006
-->
<!-- ===== xsd:schema Element With Namespaces Declarations ===== -->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   
targetNamespace="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateCo
mponents-2"
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicCompon
ents-2"
xmlns:udt="urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesS
chemaModule:2" xmlns:ccts="urn:un:unece:uncefact:documentation:2"
xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionCo
mponents-2"
xmlns:qdt="urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatype
s-2" elementFormDefault="qualified"
    attributeFormDefault="unqualified"
    version="2.0">
<!-- ===== Imports ===== -->
  <xsd:import
namespace="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateCo
mponents-2"
schemaLocation="../common/UBL-CommonAggregateComponents-2.0.xsd"/>
and I think it is complaining about schemaLocation.
I guess this is because of the lack of a protocol.
I am using Sun Java 6 on linux, using its default XML code.
Perhaps the code in DefaultSchemaResolver needs to trap this exception
and try adding file:/// to the front of the URL.  I do not know whether
this is really a fault with the OASIS xsd file but they have been in the
field for a while and I am sure of XML parsers generally objected to this
it would have been picked up as a problem.
In fact looking at the code, should DefaultSchemaResolver.java line 55
which currently reads:-
                schemaUrl = new URL(schemaLocation);
read instead:-
		schemaUrl = new URI(schemaLocation).toUrl();
as the javadoc for URI says that it can handle this kind of specification
without a protocol.
David
_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users
      
     
   
  
_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users
   
 
 
--  
  
David
McCann |
Principal Software Engineer | TopLink Product 
Oracle
Corporation Canada 
45 O'Connor Street, Suite 400 
Ottawa, Ontario K1P 1A4 
Canada 
613.288.4636 
613.238.2818 (fax) 
 
 
 |