X4O: Some java cleanup and using new sax parser factory lookup
This commit is contained in:
parent
ec8711df9c
commit
889e4b9eb8
24 changed files with 346 additions and 365 deletions
|
|
@ -33,6 +33,10 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
import javax.xml.parsers.SAXParser;
|
||||||
|
import javax.xml.parsers.SAXParserFactory;
|
||||||
|
|
||||||
import org.x4o.xml.lang.DefaultX4OLanguage;
|
import org.x4o.xml.lang.DefaultX4OLanguage;
|
||||||
import org.x4o.xml.lang.DefaultX4OLanguageConfiguration;
|
import org.x4o.xml.lang.DefaultX4OLanguageConfiguration;
|
||||||
import org.x4o.xml.lang.X4OLanguage;
|
import org.x4o.xml.lang.X4OLanguage;
|
||||||
|
|
@ -51,10 +55,9 @@ import org.xml.sax.InputSource;
|
||||||
import org.xml.sax.SAXException;
|
import org.xml.sax.SAXException;
|
||||||
import org.xml.sax.XMLReader;
|
import org.xml.sax.XMLReader;
|
||||||
import org.xml.sax.ext.DefaultHandler2;
|
import org.xml.sax.ext.DefaultHandler2;
|
||||||
import org.xml.sax.helpers.XMLReaderFactory;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* X4ODriverManager controls all the x4o driver and languages loaded in the classpath.
|
* X4ODriverManager controls all the x4o driver and languages loaded in the class-path.
|
||||||
*
|
*
|
||||||
* @author Willem Cazander
|
* @author Willem Cazander
|
||||||
* @version 1.0 Apr 6, 2013
|
* @version 1.0 Apr 6, 2013
|
||||||
|
|
@ -65,57 +68,53 @@ public final class X4ODriverManager {
|
||||||
private final static X4ODriverManager instance;
|
private final static X4ODriverManager instance;
|
||||||
private Logger logger = null;
|
private Logger logger = null;
|
||||||
private volatile boolean reloadDrivers = true;
|
private volatile boolean reloadDrivers = true;
|
||||||
private Map<String,String> classdrivers = null;
|
private Map<String, String> classdrivers = null;
|
||||||
private Map<String,String> defaultDrivers = null;
|
private Map<String, String> defaultDrivers = null;
|
||||||
private Map<String,X4ODriver<?>> drivers = null;
|
private Map<String, X4ODriver<?>> drivers = null;
|
||||||
private Map<String,X4OLanguageTask> languageTasks = null;
|
private Map<String, X4OLanguageTask> languageTasks = null;
|
||||||
|
|
||||||
private X4ODriverManager() {
|
private X4ODriverManager() {
|
||||||
logger = Logger.getLogger(X4ODriverManager.class.getName());
|
logger = Logger.getLogger(X4ODriverManager.class.getName());
|
||||||
classdrivers = new HashMap<String,String>(10);
|
classdrivers = new HashMap<String, String>(10);
|
||||||
defaultDrivers = new HashMap<String,String>(10);
|
defaultDrivers = new HashMap<String, String>(10);
|
||||||
drivers = new HashMap<String,X4ODriver<?>>(10);
|
drivers = new HashMap<String, X4ODriver<?>>(10);
|
||||||
languageTasks = new HashMap<String,X4OLanguageTask>(10);
|
languageTasks = new HashMap<String, X4OLanguageTask>(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
static {
|
static {
|
||||||
instance = new X4ODriverManager();
|
instance = new X4ODriverManager();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void registerX4OLanguageTask(String className) {
|
private void registerX4OLanguageTask(String className) {
|
||||||
try {
|
try {
|
||||||
X4OLanguageTask task = (X4OLanguageTask)X4OLanguageClassLoader.newInstance(className);
|
X4OLanguageTask task = (X4OLanguageTask) X4OLanguageClassLoader.newInstance(className);
|
||||||
if (languageTasks.containsKey(task.getId())) {
|
if (languageTasks.containsKey(task.getId())) {
|
||||||
throw new RuntimeException("Can't add duplicate language task: "+task.getId());
|
throw new RuntimeException("Can't add duplicate language task: " + task.getId());
|
||||||
}
|
}
|
||||||
languageTasks.put(task.getId(), task);
|
languageTasks.put(task.getId(), task);
|
||||||
} catch (ClassNotFoundException e) {
|
} catch (ClassNotFoundException e) {
|
||||||
throw new IllegalStateException(e.getMessage(),e);
|
throw new IllegalStateException(e.getMessage(), e);
|
||||||
} catch (InstantiationException e) {
|
|
||||||
throw new IllegalStateException(e.getMessage(),e);
|
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
throw new IllegalStateException(e.getMessage(),e);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static public X4OLanguageTask getX4OLanguageTask(String taskId) {
|
static public X4OLanguageTask getX4OLanguageTask(String taskId) {
|
||||||
instance.lazyInit(); // fixme
|
instance.lazyInit(); // fixme
|
||||||
return instance.languageTasks.get(taskId);
|
return instance.languageTasks.get(taskId);
|
||||||
}
|
}
|
||||||
|
|
||||||
static public List<X4OLanguageTask> getX4OLanguageTasks() {
|
static public List<X4OLanguageTask> getX4OLanguageTasks() {
|
||||||
instance.lazyInit(); // fixme
|
instance.lazyInit(); // fixme
|
||||||
return new ArrayList<X4OLanguageTask>(instance.languageTasks.values());
|
return new ArrayList<X4OLanguageTask>(instance.languageTasks.values());
|
||||||
}
|
}
|
||||||
|
|
||||||
static protected String getDefaultLanguageVersion(String[] languages) {
|
static protected String getDefaultLanguageVersion(String[] languages) {
|
||||||
if (languages==null || languages.length==0) {
|
if (languages == null || languages.length == 0) {
|
||||||
return X4ODriver.DEFAULT_LANGUAGE_VERSION;
|
return X4ODriver.DEFAULT_LANGUAGE_VERSION;
|
||||||
}
|
}
|
||||||
String languageVersion = languages[languages.length-1];
|
String languageVersion = languages[languages.length - 1];
|
||||||
return languageVersion;
|
return languageVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
static protected X4OPhaseManager getDefaultBuildPhaseManager() {
|
static protected X4OPhaseManager getDefaultBuildPhaseManager() {
|
||||||
DefaultX4OPhaseManager manager = new DefaultX4OPhaseManager();
|
DefaultX4OPhaseManager manager = new DefaultX4OPhaseManager();
|
||||||
new X4OPhaseLanguageInit().createPhases(manager);
|
new X4OPhaseLanguageInit().createPhases(manager);
|
||||||
|
|
@ -123,85 +122,61 @@ public final class X4ODriverManager {
|
||||||
new X4OPhaseLanguageWrite().createPhases(manager);
|
new X4OPhaseLanguageWrite().createPhases(manager);
|
||||||
return manager;
|
return manager;
|
||||||
}
|
}
|
||||||
|
|
||||||
static protected X4OLanguage getDefaultBuildLanguage(X4ODriver<?> driver,String version) {
|
static protected X4OLanguage getDefaultBuildLanguage(X4ODriver<?> driver, String version) {
|
||||||
if (version==null) {
|
if (version == null) {
|
||||||
version = driver.getLanguageVersionDefault();
|
version = driver.getLanguageVersionDefault();
|
||||||
}
|
}
|
||||||
DefaultX4OLanguage result = new DefaultX4OLanguage(
|
DefaultX4OLanguage result = new DefaultX4OLanguage(driver.buildLanguageConfiguration(), driver.buildPhaseManager(), driver.getLanguageName(), version);
|
||||||
driver.buildLanguageConfiguration(),
|
|
||||||
driver.buildPhaseManager(),
|
|
||||||
driver.getLanguageName(),
|
|
||||||
version
|
|
||||||
);
|
|
||||||
try {
|
try {
|
||||||
result.getPhaseManager().runPhases(result.createLanguageSession(), X4OPhaseType.INIT); // TODO: fix phase to interface T
|
result.getPhaseManager().runPhases(result.createLanguageSession(), X4OPhaseType.INIT); // TODO: fix phase to interface T
|
||||||
} catch (X4OPhaseException e) {
|
} catch (X4OPhaseException e) {
|
||||||
throw new RuntimeException(e); //TODO: change layer
|
throw new RuntimeException(e); // TODO: change layer
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static protected X4OLanguageConfiguration getDefaultBuildLanguageConfiguration() {
|
static protected X4OLanguageConfiguration getDefaultBuildLanguageConfiguration() {
|
||||||
DefaultX4OLanguageConfiguration config = new DefaultX4OLanguageConfiguration();
|
DefaultX4OLanguageConfiguration config = new DefaultX4OLanguageConfiguration();
|
||||||
config.fillDefaults();
|
config.fillDefaults();
|
||||||
X4OLanguageConfiguration result = config.createProxy();
|
X4OLanguageConfiguration result = config.createProxy();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
static public void setGlobalProperty(X4ODriver<?> driver,String key,Object value) {
|
|
||||||
Map<String,Object> driverProperties = instance.globalProperties.get(driver.getLanguageName());
|
|
||||||
if (driverProperties==null) {
|
|
||||||
driverProperties = new HashMap<String,Object>(20);
|
|
||||||
instance.globalProperties.put(driver.getLanguageName(), driverProperties);
|
|
||||||
}
|
|
||||||
String keyLimits[] = driver.getGlobalPropertyKeySet();
|
|
||||||
for (int i=0;i<keyLimits.length;i++) {
|
|
||||||
String keyLimit = keyLimits[i];
|
|
||||||
if (keyLimit.equals(key)) {
|
|
||||||
driverProperties.put(key,value);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
throw new IllegalArgumentException("Property with key: "+key+" is protected by key limit.");
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
static public void registerX4ODriver(X4ODriver<?> driver) {
|
static public void registerX4ODriver(X4ODriver<?> driver) {
|
||||||
if (driver==null) {
|
if (driver == null) {
|
||||||
throw new NullPointerException("Can't register null driver.");
|
throw new NullPointerException("Can't register null driver.");
|
||||||
}
|
}
|
||||||
if (driver.getLanguageName()==null) {
|
if (driver.getLanguageName() == null) {
|
||||||
throw new NullPointerException("Error in driver impl languageName is null in: "+driver.getClass());
|
throw new NullPointerException("Error in driver impl languageName is null in: " + driver.getClass());
|
||||||
}
|
}
|
||||||
if (driver.getLanguageName().length()==0) {
|
if (driver.getLanguageName().length() == 0) {
|
||||||
throw new IllegalArgumentException("Error in driver impl languageName is empty in: "+driver.getClass());
|
throw new IllegalArgumentException("Error in driver impl languageName is empty in: " + driver.getClass());
|
||||||
}
|
}
|
||||||
if (driver.getLanguageVersions()==null) {
|
if (driver.getLanguageVersions() == null) {
|
||||||
throw new NullPointerException("Error in driver impl languageVersions is null in: "+driver.getClass());
|
throw new NullPointerException("Error in driver impl languageVersions is null in: " + driver.getClass());
|
||||||
}
|
}
|
||||||
if (driver.getLanguageVersions().length==0) {
|
if (driver.getLanguageVersions().length == 0) {
|
||||||
throw new IllegalArgumentException("Error in driver impl languageVersions is empty in: "+driver.getClass());
|
throw new IllegalArgumentException("Error in driver impl languageVersions is empty in: " + driver.getClass());
|
||||||
}
|
}
|
||||||
instance.drivers.put(driver.getLanguageName(), driver);
|
instance.drivers.put(driver.getLanguageName(), driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
static public void deregisterX4ODriver(X4ODriver<?> driver) {
|
static public void deregisterX4ODriver(X4ODriver<?> driver) {
|
||||||
if (driver==null) {
|
if (driver == null) {
|
||||||
throw new NullPointerException("Can't deregister null driver.");
|
throw new NullPointerException("Can't deregister null driver.");
|
||||||
}
|
}
|
||||||
if (driver.getLanguageName()==null) {
|
if (driver.getLanguageName() == null) {
|
||||||
throw new NullPointerException("Error in driver impl languageName is null in: "+driver.getClass());
|
throw new NullPointerException("Error in driver impl languageName is null in: " + driver.getClass());
|
||||||
}
|
}
|
||||||
instance.drivers.remove(driver.getLanguageName());
|
instance.drivers.remove(driver.getLanguageName());
|
||||||
}
|
}
|
||||||
|
|
||||||
static public X4ODriver<?> getX4ODriver(String language) {
|
static public X4ODriver<?> getX4ODriver(String language) {
|
||||||
if (language==null) {
|
if (language == null) {
|
||||||
throw new NullPointerException("Can't provider driver for null language.");
|
throw new NullPointerException("Can't provider driver for null language.");
|
||||||
}
|
}
|
||||||
if (language.length()==0) {
|
if (language.length() == 0) {
|
||||||
throw new IllegalArgumentException("Can't provider driver for empty language.");
|
throw new IllegalArgumentException("Can't provider driver for empty language.");
|
||||||
}
|
}
|
||||||
if (instance.drivers.containsKey(language)) {
|
if (instance.drivers.containsKey(language)) {
|
||||||
|
|
@ -209,12 +184,12 @@ public final class X4ODriverManager {
|
||||||
}
|
}
|
||||||
instance.lazyInit();
|
instance.lazyInit();
|
||||||
X4ODriver<?> result = instance.createX4ODriver(language);
|
X4ODriver<?> result = instance.createX4ODriver(language);
|
||||||
if (result==null) {
|
if (result == null) {
|
||||||
throw new IllegalArgumentException("Can't find driver for language: "+language);
|
throw new IllegalArgumentException("Can't find driver for language: " + language);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static public List<String> getX4OLanguages() {
|
static public List<String> getX4OLanguages() {
|
||||||
instance.lazyInit();
|
instance.lazyInit();
|
||||||
List<String> result = new ArrayList<String>(10);
|
List<String> result = new ArrayList<String>(10);
|
||||||
|
|
@ -223,15 +198,15 @@ public final class X4ODriverManager {
|
||||||
Collections.sort(result);
|
Collections.sort(result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void lazyInit() {
|
private void lazyInit() {
|
||||||
if (reloadDrivers==false) {
|
if (reloadDrivers == false) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
instance.loadLanguageDrivers();
|
instance.loadLanguageDrivers();
|
||||||
reloadDrivers = false;
|
reloadDrivers = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private X4ODriver<?> createX4ODriver(String language) {
|
private X4ODriver<?> createX4ODriver(String language) {
|
||||||
String driverClassName = null;
|
String driverClassName = null;
|
||||||
if (classdrivers.containsKey(language)) {
|
if (classdrivers.containsKey(language)) {
|
||||||
|
|
@ -239,71 +214,70 @@ public final class X4ODriverManager {
|
||||||
} else if (defaultDrivers.containsKey(language)) {
|
} else if (defaultDrivers.containsKey(language)) {
|
||||||
driverClassName = defaultDrivers.get(language);
|
driverClassName = defaultDrivers.get(language);
|
||||||
}
|
}
|
||||||
if (driverClassName==null) {
|
if (driverClassName == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
Class<?> driverClass = X4OLanguageClassLoader.loadClass(driverClassName);
|
Class<?> driverClass = X4OLanguageClassLoader.loadClass(driverClassName);
|
||||||
//Constructor<?> markedConstructor = driverClass.getDeclaredConstructor(new Class[]{ConstructorMarker.class});
|
// Constructor<?> markedConstructor = driverClass.getDeclaredConstructor(new Class[]{ConstructorMarker.class});
|
||||||
//X4ODriver<?> driver = (X4ODriver<?>)markedConstructor.newInstance(new Object[]{new ConstructorMarker()});
|
// X4ODriver<?> driver = (X4ODriver<?>)markedConstructor.newInstance(new Object[]{new ConstructorMarker()});
|
||||||
X4ODriver<?> driver = (X4ODriver<?>)driverClass.newInstance();
|
X4ODriver<?> driver = (X4ODriver<?>) X4OLanguageClassLoader.newInstance(driverClass);
|
||||||
registerX4ODriver(driver);
|
registerX4ODriver(driver);
|
||||||
return driver;
|
return driver;
|
||||||
} catch (ClassNotFoundException e) {
|
} catch (ClassNotFoundException e) {
|
||||||
throw new IllegalStateException(e.getMessage(),e);
|
throw new IllegalStateException(e.getMessage(), e);
|
||||||
} catch (InstantiationException e) {
|
|
||||||
throw new IllegalStateException(e.getMessage(),e);
|
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
throw new IllegalStateException(e.getMessage(),e);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Class to make sure all driver instances are created by this manager instance.
|
* TODO: Class to make sure all driver instances are created by this manager instance.
|
||||||
|
*
|
||||||
final public class ConstructorMarker {
|
* final public class ConstructorMarker { private ConstructorMarker() { } }
|
||||||
private ConstructorMarker() {
|
*/
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads all defined language drivers in classpath.
|
* Loads all defined language drivers in classpath.
|
||||||
*/
|
*/
|
||||||
private void loadLanguageDrivers() {
|
private void loadLanguageDrivers() {
|
||||||
logger.finer("loading x4o drivers from: "+X4O_DRIVERS_RESOURCE);
|
logger.finer("loading x4o drivers from: " + X4O_DRIVERS_RESOURCE);
|
||||||
try {
|
try {
|
||||||
Enumeration<URL> e = Thread.currentThread().getContextClassLoader().getResources(X4O_DRIVERS_RESOURCE);
|
Enumeration<URL> e = Thread.currentThread().getContextClassLoader().getResources(X4O_DRIVERS_RESOURCE);
|
||||||
while(e.hasMoreElements()) {
|
while (e.hasMoreElements()) {
|
||||||
URL u = e.nextElement();
|
URL u = e.nextElement();
|
||||||
loadDriversXml(u.openStream());
|
loadDriversXml(u.openStream());
|
||||||
}
|
}
|
||||||
e = Thread.currentThread().getContextClassLoader().getResources("/"+X4O_DRIVERS_RESOURCE);
|
e = Thread.currentThread().getContextClassLoader().getResources("/" + X4O_DRIVERS_RESOURCE);
|
||||||
while(e.hasMoreElements()) {
|
while (e.hasMoreElements()) {
|
||||||
URL u = e.nextElement();
|
URL u = e.nextElement();
|
||||||
loadDriversXml(u.openStream());
|
loadDriversXml(u.openStream());
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new IllegalStateException(e.getMessage(),e);
|
throw new IllegalStateException(e.getMessage(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parser xml inputstream and add into drivers and defaultDrivers lists.
|
* Parser xml inputstream and add into drivers and defaultDrivers lists.
|
||||||
* @param in The inputstream to parser.
|
*
|
||||||
|
* @param in The inputstream to parser.
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
* @throws SAXException
|
* @throws SAXException
|
||||||
|
* @throws ParserConfigurationException
|
||||||
*/
|
*/
|
||||||
private void loadDriversXml(InputStream in) throws IOException, SAXException {
|
private void loadDriversXml(InputStream in) throws IOException, SAXException, ParserConfigurationException {
|
||||||
if (in==null) {
|
if (in == null) {
|
||||||
throw new NullPointerException("Can't parse null input stream");
|
throw new NullPointerException("Can't parse null input stream");
|
||||||
}
|
}
|
||||||
DriversTagHandler xth = new DriversTagHandler();
|
DriversTagHandler xth = new DriversTagHandler();
|
||||||
XMLReader saxParser = XMLReaderFactory.createXMLReader();
|
SAXParserFactory factory = SAXParserFactory.newInstance();
|
||||||
saxParser.setContentHandler(xth);
|
factory.setNamespaceAware(true);
|
||||||
saxParser.setProperty("http://xml.org/sax/properties/lexical-handler", xth);
|
SAXParser parser = factory.newSAXParser();
|
||||||
saxParser.setProperty("http://xml.org/sax/properties/declaration-handler",xth);
|
XMLReader reader = parser.getXMLReader();
|
||||||
|
reader.setContentHandler(xth);
|
||||||
|
reader.setProperty("http://xml.org/sax/properties/lexical-handler", xth);
|
||||||
|
reader.setProperty("http://xml.org/sax/properties/declaration-handler", xth);
|
||||||
try {
|
try {
|
||||||
saxParser.parse(new InputSource(in));
|
reader.parse(new InputSource(in));
|
||||||
} finally {
|
} finally {
|
||||||
in.close();
|
in.close();
|
||||||
}
|
}
|
||||||
|
|
@ -311,26 +285,26 @@ public final class X4ODriverManager {
|
||||||
|
|
||||||
private class DriversTagHandler extends DefaultHandler2 {
|
private class DriversTagHandler extends DefaultHandler2 {
|
||||||
@Override
|
@Override
|
||||||
public void startElement(String namespaceUri, String tag, String qName,Attributes attr) throws SAXException {
|
public void startElement(String namespaceUri, String tag, String qName, Attributes attr) throws SAXException {
|
||||||
if ("drivers".equals(tag)) {
|
if ("drivers".equals(tag)) {
|
||||||
String version = attr.getValue("version");
|
String version = attr.getValue("version");
|
||||||
logger.finest("Version attribute: "+version);
|
logger.finest("Version attribute: " + version);
|
||||||
} else if ("driver".equals(tag)) {
|
} else if ("driver".equals(tag)) {
|
||||||
String language = attr.getValue("language");
|
String language = attr.getValue("language");
|
||||||
String className = attr.getValue("className");
|
String className = attr.getValue("className");
|
||||||
logger.finest("Driver className: "+className+" for language: "+language);
|
logger.finest("Driver className: " + className + " for language: " + language);
|
||||||
if (classdrivers.containsKey(className)==false) {
|
if (classdrivers.containsKey(className) == false) {
|
||||||
classdrivers.put(language,className);
|
classdrivers.put(language, className);
|
||||||
}
|
}
|
||||||
} else if ("defaultDriver".equals(tag)) {
|
} else if ("defaultDriver".equals(tag)) {
|
||||||
String language = attr.getValue("language");
|
String language = attr.getValue("language");
|
||||||
logger.finest("DefaultDriver language: "+language);
|
logger.finest("DefaultDriver language: " + language);
|
||||||
if (defaultDrivers.containsKey(language)==false) {
|
if (defaultDrivers.containsKey(language) == false) {
|
||||||
defaultDrivers.put(language,language);
|
defaultDrivers.put(language, language);
|
||||||
}
|
}
|
||||||
} else if ("languageTask".equals(tag)) {
|
} else if ("languageTask".equals(tag)) {
|
||||||
String className = attr.getValue("className");
|
String className = attr.getValue("className");
|
||||||
logger.finest("Language task className: "+className);
|
logger.finest("Language task className: " + className);
|
||||||
X4ODriverManager.instance.registerX4OLanguageTask(className);
|
X4ODriverManager.instance.registerX4OLanguageTask(className);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@ public class ByteConverter extends AbstractStringObjectConverter {
|
||||||
* @throws ObjectConverterException When conversion fails.
|
* @throws ObjectConverterException When conversion fails.
|
||||||
*/
|
*/
|
||||||
public Object convertStringTo(String str, Locale locale) throws ObjectConverterException {
|
public Object convertStringTo(String str, Locale locale) throws ObjectConverterException {
|
||||||
return new Byte(str);
|
return Byte.valueOf(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@ public class CharacterConverter extends AbstractStringObjectConverter {
|
||||||
* @throws ObjectConverterException When conversion fails.
|
* @throws ObjectConverterException When conversion fails.
|
||||||
*/
|
*/
|
||||||
public Object convertStringTo(String str, Locale locale) throws ObjectConverterException {
|
public Object convertStringTo(String str, Locale locale) throws ObjectConverterException {
|
||||||
return new Character(str.charAt(0));
|
return Character.valueOf(str.charAt(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@ public class DoubleConverter extends AbstractStringObjectConverter {
|
||||||
* @throws ObjectConverterException When conversion fails.
|
* @throws ObjectConverterException When conversion fails.
|
||||||
*/
|
*/
|
||||||
public Object convertStringTo(String str, Locale locale) throws ObjectConverterException {
|
public Object convertStringTo(String str, Locale locale) throws ObjectConverterException {
|
||||||
return new Double(str);
|
return Double.valueOf(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@ public class FloatConverter extends AbstractStringObjectConverter {
|
||||||
* @throws ObjectConverterException When conversion fails.
|
* @throws ObjectConverterException When conversion fails.
|
||||||
*/
|
*/
|
||||||
public Object convertStringTo(String str, Locale locale) throws ObjectConverterException {
|
public Object convertStringTo(String str, Locale locale) throws ObjectConverterException {
|
||||||
return new Float(str);
|
return Float.valueOf(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@ public class IntegerConverter extends AbstractStringObjectConverter {
|
||||||
* @throws ObjectConverterException When conversion fails.
|
* @throws ObjectConverterException When conversion fails.
|
||||||
*/
|
*/
|
||||||
public Object convertStringTo(String str, Locale locale) throws ObjectConverterException {
|
public Object convertStringTo(String str, Locale locale) throws ObjectConverterException {
|
||||||
return new Integer(str);
|
return Integer.valueOf(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@ public class LongConverter extends AbstractStringObjectConverter {
|
||||||
* @throws ObjectConverterException When conversion fails.
|
* @throws ObjectConverterException When conversion fails.
|
||||||
*/
|
*/
|
||||||
public Object convertStringTo(String str, Locale locale) throws ObjectConverterException {
|
public Object convertStringTo(String str, Locale locale) throws ObjectConverterException {
|
||||||
return new Long(str);
|
return Long.valueOf(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -42,25 +42,23 @@ public class X4OExpressionFactory {
|
||||||
ExpressionFactory result = null;
|
ExpressionFactory result = null;
|
||||||
try {
|
try {
|
||||||
Class<?> expressionFactoryClass = X4OLanguageClassLoader.loadClass(EL_FACTORY_IMPL_APACHE);
|
Class<?> expressionFactoryClass = X4OLanguageClassLoader.loadClass(EL_FACTORY_IMPL_APACHE);
|
||||||
result = (ExpressionFactory) expressionFactoryClass.newInstance();
|
result = X4OLanguageClassLoader.newInstance(ExpressionFactory.class, expressionFactoryClass);
|
||||||
} catch (Exception e) {
|
} catch (ClassNotFoundException e) {
|
||||||
try {
|
try {
|
||||||
Class<?> expressionFactoryClass = X4OLanguageClassLoader.loadClass(EL_FACTORY_IMPL_ODYSSEUS);
|
Class<?> expressionFactoryClass = X4OLanguageClassLoader.loadClass(EL_FACTORY_IMPL_ODYSSEUS);
|
||||||
result = (ExpressionFactory) expressionFactoryClass.newInstance();
|
result = X4OLanguageClassLoader.newInstance(ExpressionFactory.class, expressionFactoryClass);
|
||||||
} catch (Exception ee) {
|
} catch (ClassNotFoundException ee) {
|
||||||
throw new RuntimeException("Could not load ExpressionFactory tried: "+EL_FACTORY_IMPL_APACHE+" and "+EL_FACTORY_IMPL_ODYSSEUS+" but could not load one of them.");
|
throw new RuntimeException("Could not load ExpressionFactory tried: "+EL_FACTORY_IMPL_APACHE+" and "+EL_FACTORY_IMPL_ODYSSEUS+" but could not load one of them.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static public ELContext createELContext(Class<?> elContextClass) {
|
static public ELContext createELContext(Class<?> elContextClass) {
|
||||||
ELContext result = null;
|
|
||||||
try {
|
try {
|
||||||
result = (ELContext)X4OLanguageClassLoader.newInstance(elContextClass);
|
return X4OLanguageClassLoader.newInstance(ELContext.class, elContextClass);
|
||||||
} catch (Exception e) {
|
} catch (ClassNotFoundException e) {
|
||||||
throw new RuntimeException("Could not create instance of ELContext: "+e.getMessage(),e);
|
throw new RuntimeException("Could not create instance of ELContext: "+e.getMessage(),e);
|
||||||
}
|
}
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -49,9 +49,9 @@ import org.xml.sax.SAXException;
|
||||||
*/
|
*/
|
||||||
public class EldModuleLoader implements X4OLanguageModuleLoader {
|
public class EldModuleLoader implements X4OLanguageModuleLoader {
|
||||||
|
|
||||||
private Logger logger = null;
|
private final Logger logger;
|
||||||
private String eldResource = null;
|
private final String eldResource;
|
||||||
private boolean isEldCore = false;
|
private final boolean isEldCore;
|
||||||
|
|
||||||
/** The EL key to access the parent language module. */
|
/** The EL key to access the parent language module. */
|
||||||
public static final String EL_PARENT_LANGUAGE_MODULE = "parentLanguageModule";
|
public static final String EL_PARENT_LANGUAGE_MODULE = "parentLanguageModule";
|
||||||
|
|
@ -65,12 +65,12 @@ public class EldModuleLoader implements X4OLanguageModuleLoader {
|
||||||
* @param isEldCore If true then load CEL else load ELD.
|
* @param isEldCore If true then load CEL else load ELD.
|
||||||
*/
|
*/
|
||||||
public EldModuleLoader(String eldResource,boolean isEldCore) {
|
public EldModuleLoader(String eldResource,boolean isEldCore) {
|
||||||
if (eldResource==null) {
|
if (eldResource == null) {
|
||||||
throw new NullPointerException("Can't load null eld resource.");
|
throw new NullPointerException("Can't load null eld resource.");
|
||||||
}
|
}
|
||||||
logger = Logger.getLogger(EldModuleLoader.class.getName());
|
this.logger = Logger.getLogger(EldModuleLoader.class.getName());
|
||||||
this.eldResource=eldResource;
|
this.eldResource = eldResource;
|
||||||
this.isEldCore=isEldCore;
|
this.isEldCore = isEldCore;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -80,8 +80,8 @@ public class EldModuleLoader implements X4OLanguageModuleLoader {
|
||||||
* @throws X4OLanguageModuleLoaderException When eld language could not be loaded.
|
* @throws X4OLanguageModuleLoaderException When eld language could not be loaded.
|
||||||
* @see org.x4o.xml.lang.X4OLanguageModuleLoader#loadLanguageModule(org.x4o.xml.lang.X4OLanguageLocal, org.x4o.xml.lang.X4OLanguageModuleLocal)
|
* @see org.x4o.xml.lang.X4OLanguageModuleLoader#loadLanguageModule(org.x4o.xml.lang.X4OLanguageLocal, org.x4o.xml.lang.X4OLanguageModuleLocal)
|
||||||
*/
|
*/
|
||||||
public void loadLanguageModule(X4OLanguageLocal language,X4OLanguageModuleLocal languageModule) throws X4OLanguageModuleLoaderException {
|
public void loadLanguageModule(X4OLanguageLocal language, X4OLanguageModuleLocal languageModule) throws X4OLanguageModuleLoaderException {
|
||||||
logger.fine("Loading name eld file from resource: "+eldResource);
|
logger.fine("Loading name eld file from resource: " + eldResource);
|
||||||
try {
|
try {
|
||||||
X4ODriver<?> driver = null;
|
X4ODriver<?> driver = null;
|
||||||
if (isEldCore) {
|
if (isEldCore) {
|
||||||
|
|
@ -97,9 +97,7 @@ public class EldModuleLoader implements X4OLanguageModuleLoader {
|
||||||
reader.addELBeanInstance(EL_PARENT_LANGUAGE, language);
|
reader.addELBeanInstance(EL_PARENT_LANGUAGE, language);
|
||||||
reader.addELBeanInstance(EL_PARENT_LANGUAGE_MODULE, languageModule);
|
reader.addELBeanInstance(EL_PARENT_LANGUAGE_MODULE, languageModule);
|
||||||
|
|
||||||
//language.createLanguageSession()
|
reader.setProperty(DefaultX4OReader.DEBUG_OUTPUT_HANDLER, null);
|
||||||
|
|
||||||
reader.setProperty(DefaultX4OReader.DEBUG_OUTPUT_HANDLER, reader);
|
|
||||||
|
|
||||||
//TODO: if (language.getLanguageConfiguration().getLanguagePropertyBoolean(X4OLanguageProperty.DEBUG_OUTPUT_ELD_PARSER)) {
|
//TODO: if (language.getLanguageConfiguration().getLanguagePropertyBoolean(X4OLanguageProperty.DEBUG_OUTPUT_ELD_PARSER)) {
|
||||||
// eldLang.setX4ODebugWriter(elementLanguage.getLanguageConfiguration().getX4ODebugWriter());
|
// eldLang.setX4ODebugWriter(elementLanguage.getLanguageConfiguration().getX4ODebugWriter());
|
||||||
|
|
|
||||||
|
|
@ -210,21 +210,17 @@ public class EldModuleLoaderCore implements X4OLanguageModuleLoader {
|
||||||
logger.finer("Creating "+language.getLanguageName()+" namespace.");
|
logger.finer("Creating "+language.getLanguageName()+" namespace.");
|
||||||
ElementNamespace namespace;
|
ElementNamespace namespace;
|
||||||
try {
|
try {
|
||||||
namespace = (ElementNamespace)X4OLanguageClassLoader.newInstance(language.getLanguageConfiguration().getDefaultElementNamespace());
|
namespace = X4OLanguageClassLoader.newInstance(ElementNamespace.class, language.getLanguageConfiguration().getDefaultElementNamespace());
|
||||||
} catch (InstantiationException e) {
|
} catch (ClassNotFoundException e) {
|
||||||
throw new X4OLanguageModuleLoaderException(this,e.getMessage(),e);
|
throw new X4OLanguageModuleLoaderException(this,e.getMessage(),e);
|
||||||
} catch (IllegalAccessException e) {
|
}
|
||||||
throw new X4OLanguageModuleLoaderException(this,e.getMessage(),e);
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
namespace.setElementNamespaceInstanceProvider((ElementNamespaceInstanceProvider)
|
namespace.setElementNamespaceInstanceProvider(
|
||||||
X4OLanguageClassLoader.newInstance(language.getLanguageConfiguration().getDefaultElementNamespaceInstanceProvider())
|
X4OLanguageClassLoader.newInstance(ElementNamespaceInstanceProvider.class, language.getLanguageConfiguration().getDefaultElementNamespaceInstanceProvider())
|
||||||
);
|
);
|
||||||
} catch (InstantiationException e) {
|
} catch (ClassNotFoundException e) {
|
||||||
throw new X4OLanguageModuleLoaderException(this,e.getMessage(),e);
|
throw new X4OLanguageModuleLoaderException(this,e.getMessage(),e);
|
||||||
} catch (IllegalAccessException e) {
|
}
|
||||||
throw new X4OLanguageModuleLoaderException(this,e.getMessage(),e);
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace.setId(id);
|
namespace.setId(id);
|
||||||
namespace.setUri(uri);
|
namespace.setUri(uri);
|
||||||
|
|
@ -236,15 +232,13 @@ public class EldModuleLoaderCore implements X4OLanguageModuleLoader {
|
||||||
|
|
||||||
private ElementClass createElementClass(X4OLanguage language,String tag,Class<?> objectClass,Class<?> elementClass,String description) throws X4OLanguageModuleLoaderException {
|
private ElementClass createElementClass(X4OLanguage language,String tag,Class<?> objectClass,Class<?> elementClass,String description) throws X4OLanguageModuleLoaderException {
|
||||||
try {
|
try {
|
||||||
ElementClass result = (ElementClass)X4OLanguageClassLoader.newInstance(language.getLanguageConfiguration().getDefaultElementClass());
|
ElementClass result = X4OLanguageClassLoader.newInstance(ElementClass.class, language.getLanguageConfiguration().getDefaultElementClass());
|
||||||
result.setId(tag);
|
result.setId(tag);
|
||||||
result.setObjectClass(objectClass);
|
result.setObjectClass(objectClass);
|
||||||
result.setElementClass(elementClass);
|
result.setElementClass(elementClass);
|
||||||
result.setDescription(description);
|
result.setDescription(description);
|
||||||
return result;
|
return result;
|
||||||
} catch (InstantiationException e) {
|
} catch (ClassNotFoundException e) {
|
||||||
throw new X4OLanguageModuleLoaderException(this,e.getMessage(),e);
|
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
throw new X4OLanguageModuleLoaderException(this,e.getMessage(),e);
|
throw new X4OLanguageModuleLoaderException(this,e.getMessage(),e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -260,7 +254,7 @@ public class EldModuleLoaderCore implements X4OLanguageModuleLoader {
|
||||||
*/
|
*/
|
||||||
private ElementClassAttribute createElementClassAttribute(X4OLanguage language,String name,boolean required,ObjectConverter converter) throws X4OLanguageModuleLoaderException {
|
private ElementClassAttribute createElementClassAttribute(X4OLanguage language,String name,boolean required,ObjectConverter converter) throws X4OLanguageModuleLoaderException {
|
||||||
try {
|
try {
|
||||||
ElementClassAttribute result = (ElementClassAttribute)X4OLanguageClassLoader.newInstance(language.getLanguageConfiguration().getDefaultElementClassAttribute());
|
ElementClassAttribute result = X4OLanguageClassLoader.newInstance(ElementClassAttribute.class, language.getLanguageConfiguration().getDefaultElementClassAttribute());
|
||||||
result.setId(name);
|
result.setId(name);
|
||||||
if (required) {
|
if (required) {
|
||||||
result.setRequired(required);
|
result.setRequired(required);
|
||||||
|
|
@ -269,9 +263,7 @@ public class EldModuleLoaderCore implements X4OLanguageModuleLoader {
|
||||||
result.setObjectConverter(converter);
|
result.setObjectConverter(converter);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
} catch (InstantiationException e) {
|
} catch (ClassNotFoundException e) {
|
||||||
throw new X4OLanguageModuleLoaderException(this,e.getMessage(),e);
|
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
throw new X4OLanguageModuleLoaderException(this,e.getMessage(),e);
|
throw new X4OLanguageModuleLoaderException(this,e.getMessage(),e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@ public class BeanElement extends AbstractElement {
|
||||||
try {
|
try {
|
||||||
Class<?> beanClass = X4OLanguageClassLoader.loadClass(className);
|
Class<?> beanClass = X4OLanguageClassLoader.loadClass(className);
|
||||||
if (constructorArguments.isEmpty()) {
|
if (constructorArguments.isEmpty()) {
|
||||||
setElementObject(beanClass.newInstance());
|
setElementObject(X4OLanguageClassLoader.newInstance(beanClass));
|
||||||
} else {
|
} else {
|
||||||
Class<?>[] arguClass = new Class<?>[constructorArguments.size()];
|
Class<?>[] arguClass = new Class<?>[constructorArguments.size()];
|
||||||
constructorArguments.toArray(arguClass);
|
constructorArguments.toArray(arguClass);
|
||||||
|
|
|
||||||
|
|
@ -131,8 +131,8 @@ public class ElementModuleBindingHandler extends AbstractElementBindingHandler<
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
elementNamespace.setElementNamespaceInstanceProvider((ElementNamespaceInstanceProvider)X4OLanguageClassLoader.newInstance(childElement.getLanguageSession().getLanguage().getLanguageConfiguration().getDefaultElementNamespaceInstanceProvider()));
|
elementNamespace.setElementNamespaceInstanceProvider(X4OLanguageClassLoader.newInstance(ElementNamespaceInstanceProvider.class, childElement.getLanguageSession().getLanguage().getLanguageConfiguration().getDefaultElementNamespaceInstanceProvider()));
|
||||||
} catch (Exception e) {
|
} catch (ClassNotFoundException e) {
|
||||||
throw new ElementBindingHandlerException("Error loading: "+e.getMessage(),e);
|
throw new ElementBindingHandlerException("Error loading: "+e.getMessage(),e);
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
|
|
@ -132,10 +132,10 @@ public abstract class AbstractElement implements Element {
|
||||||
*/
|
*/
|
||||||
public void doCharacters(String characters) throws ElementException {
|
public void doCharacters(String characters) throws ElementException {
|
||||||
try {
|
try {
|
||||||
Element e = (Element)X4OLanguageClassLoader.newInstance(getLanguageSession().getLanguage().getLanguageConfiguration().getDefaultElementBodyCharacters());
|
Element e = X4OLanguageClassLoader.newInstance(Element.class, getLanguageSession().getLanguage().getLanguageConfiguration().getDefaultElementBodyCharacters());
|
||||||
e.setElementObject(characters);
|
e.setElementObject(characters);
|
||||||
addChild(e);
|
addChild(e);
|
||||||
} catch (Exception exception) {
|
} catch (ClassNotFoundException exception) {
|
||||||
throw new ElementException(exception);
|
throw new ElementException(exception);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -145,10 +145,10 @@ public abstract class AbstractElement implements Element {
|
||||||
*/
|
*/
|
||||||
public void doComment(String comment) throws ElementException {
|
public void doComment(String comment) throws ElementException {
|
||||||
try {
|
try {
|
||||||
Element e = (Element)X4OLanguageClassLoader.newInstance(getLanguageSession().getLanguage().getLanguageConfiguration().getDefaultElementBodyComment());
|
Element e = X4OLanguageClassLoader.newInstance(Element.class, getLanguageSession().getLanguage().getLanguageConfiguration().getDefaultElementBodyComment());
|
||||||
e.setElementObject(comment);
|
e.setElementObject(comment);
|
||||||
addChild(e);
|
addChild(e);
|
||||||
} catch (Exception exception) {
|
} catch (ClassNotFoundException exception) {
|
||||||
throw new ElementException(exception);
|
throw new ElementException(exception);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -158,10 +158,10 @@ public abstract class AbstractElement implements Element {
|
||||||
*/
|
*/
|
||||||
public void doIgnorableWhitespace(String space) throws ElementException {
|
public void doIgnorableWhitespace(String space) throws ElementException {
|
||||||
try {
|
try {
|
||||||
Element e = (Element)X4OLanguageClassLoader.newInstance(getLanguageSession().getLanguage().getLanguageConfiguration().getDefaultElementBodyWhitespace());
|
Element e = X4OLanguageClassLoader.newInstance(Element.class, getLanguageSession().getLanguage().getLanguageConfiguration().getDefaultElementBodyWhitespace());
|
||||||
e.setElementObject(space);
|
e.setElementObject(space);
|
||||||
addChild(e);
|
addChild(e);
|
||||||
} catch (Exception exception) {
|
} catch (ClassNotFoundException exception) {
|
||||||
throw new ElementException(exception);
|
throw new ElementException(exception);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -86,13 +86,9 @@ public class DefaultElementNamespaceInstanceProvider implements ElementNamespace
|
||||||
if (elementClass.getObjectClass()!=null) {
|
if (elementClass.getObjectClass()!=null) {
|
||||||
element.setElementObject(X4OLanguageClassLoader.newInstance(elementClass.getObjectClass()));
|
element.setElementObject(X4OLanguageClassLoader.newInstance(elementClass.getObjectClass()));
|
||||||
}
|
}
|
||||||
} catch (InstantiationException e) {
|
} catch (ClassNotFoundException e) {
|
||||||
throw new ElementNamespaceInstanceProviderException(this,"Error while providing Element: "+e.getMessage(),e);
|
throw new ElementNamespaceInstanceProviderException(this,"Error while providing Element: "+e.getMessage(),e);
|
||||||
} catch (IllegalAccessException e) {
|
}
|
||||||
throw new ElementNamespaceInstanceProviderException(this,"Error while providing Element: "+e.getMessage(),e);
|
|
||||||
} /*catch (ClassNotFoundException e) {
|
|
||||||
throw new ElementNamespaceInstanceProviderException(this,"Error while providing Element: "+e.getMessage(),e);
|
|
||||||
} */
|
|
||||||
element.setElementClass(elementClass);
|
element.setElementClass(elementClass);
|
||||||
element.setLanguageSession(languageSession);
|
element.setLanguageSession(languageSession);
|
||||||
return element;
|
return element;
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@ import java.io.OutputStream;
|
||||||
|
|
||||||
import org.x4o.xml.element.Element;
|
import org.x4o.xml.element.Element;
|
||||||
import org.x4o.xml.lang.X4OLanguage;
|
import org.x4o.xml.lang.X4OLanguage;
|
||||||
|
import org.x4o.xml.lang.X4OLanguageClassLoader;
|
||||||
import org.x4o.xml.lang.X4OLanguageSession;
|
import org.x4o.xml.lang.X4OLanguageSession;
|
||||||
import org.xml.sax.SAXException;
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
|
|
@ -49,10 +50,8 @@ public abstract class AbstractX4OWriter<T> extends AbstractX4OWriterSession<T> i
|
||||||
X4OLanguageSession context = createLanguageSession();
|
X4OLanguageSession context = createLanguageSession();
|
||||||
Element rootElement = null;
|
Element rootElement = null;
|
||||||
try {
|
try {
|
||||||
rootElement = (Element)context.getLanguage().getLanguageConfiguration().getDefaultElement().newInstance();
|
rootElement = X4OLanguageClassLoader.newInstance(Element.class, context.getLanguage().getLanguageConfiguration().getDefaultElement());
|
||||||
} catch (InstantiationException e) {
|
} catch (ClassNotFoundException e) {
|
||||||
throw new SAXException(e);
|
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
throw new SAXException(e);
|
throw new SAXException(e);
|
||||||
}
|
}
|
||||||
rootElement.setElementObject(object);
|
rootElement.setElementObject(object);
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,6 @@ import org.x4o.sax3.io.SAX3PropertyConfig.PropertyConfigItem;
|
||||||
import org.x4o.xml.lang.X4OLanguage;
|
import org.x4o.xml.lang.X4OLanguage;
|
||||||
import org.x4o.xml.lang.X4OLanguageSession;
|
import org.x4o.xml.lang.X4OLanguageSession;
|
||||||
import org.x4o.xml.lang.X4OLanguageSessionLocal;
|
import org.x4o.xml.lang.X4OLanguageSessionLocal;
|
||||||
import org.x4o.xml.lang.phase.X4OPhaseException;
|
|
||||||
import org.x4o.xml.lang.phase.X4OPhaseType;
|
import org.x4o.xml.lang.phase.X4OPhaseType;
|
||||||
import org.xml.sax.EntityResolver;
|
import org.xml.sax.EntityResolver;
|
||||||
import org.xml.sax.ErrorHandler;
|
import org.xml.sax.ErrorHandler;
|
||||||
|
|
|
||||||
|
|
@ -64,11 +64,12 @@ import org.xml.sax.helpers.AttributesImpl;
|
||||||
public class DefaultX4OWriter<T> extends AbstractX4OWriter<T> {
|
public class DefaultX4OWriter<T> extends AbstractX4OWriter<T> {
|
||||||
|
|
||||||
private final SAX3PropertyConfig propertyConfig;
|
private final SAX3PropertyConfig propertyConfig;
|
||||||
|
private boolean schemaUriPrint;
|
||||||
|
private String schemaUriRoot;
|
||||||
|
|
||||||
|
private final static AttributeEntryComparator ATTR_ENTRY_COMPARATOR = new AttributeEntryComparator();
|
||||||
private final static String PROPERTY_CONTEXT_PREFIX = SAX3PropertyConfig.X4O_PROPERTIES_PREFIX+"writer/x4o/";
|
private final static String PROPERTY_CONTEXT_PREFIX = SAX3PropertyConfig.X4O_PROPERTIES_PREFIX+"writer/x4o/";
|
||||||
|
|
||||||
public final static SAX3PropertyConfig DEFAULT_PROPERTY_CONFIG;
|
public final static SAX3PropertyConfig DEFAULT_PROPERTY_CONFIG;
|
||||||
|
|
||||||
public final static String OUTPUT_STREAM = PROPERTY_CONTEXT_PREFIX+"output/stream";
|
public final static String OUTPUT_STREAM = PROPERTY_CONTEXT_PREFIX+"output/stream";
|
||||||
public final static String OUTPUT_XDBX = PROPERTY_CONTEXT_PREFIX+"output/xdbx";
|
public final static String OUTPUT_XDBX = PROPERTY_CONTEXT_PREFIX+"output/xdbx";
|
||||||
public final static String SCHEMA_PRINT = PROPERTY_CONTEXT_PREFIX+"schema/print";
|
public final static String SCHEMA_PRINT = PROPERTY_CONTEXT_PREFIX+"schema/print";
|
||||||
|
|
@ -95,7 +96,7 @@ public class DefaultX4OWriter<T> extends AbstractX4OWriter<T> {
|
||||||
*/
|
*/
|
||||||
public DefaultX4OWriter(X4OLanguage language) {
|
public DefaultX4OWriter(X4OLanguage language) {
|
||||||
super(language);
|
super(language);
|
||||||
propertyConfig = new SAX3PropertyConfig(DEFAULT_PROPERTY_CONFIG,PROPERTY_CONTEXT_PREFIX);
|
propertyConfig = new SAX3PropertyConfig(DEFAULT_PROPERTY_CONFIG, PROPERTY_CONTEXT_PREFIX);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -108,7 +109,7 @@ public class DefaultX4OWriter<T> extends AbstractX4OWriter<T> {
|
||||||
/**
|
/**
|
||||||
* @see org.x4o.xml.io.X4OWriterSession#writeSession(org.x4o.xml.lang.X4OLanguageSession, java.io.OutputStream)
|
* @see org.x4o.xml.io.X4OWriterSession#writeSession(org.x4o.xml.lang.X4OLanguageSession, java.io.OutputStream)
|
||||||
*/
|
*/
|
||||||
public void writeSession(X4OLanguageSession languageSession,OutputStream output) throws X4OConnectionException,SAXException,IOException {
|
public void writeSession(X4OLanguageSession languageSession, OutputStream output) throws X4OConnectionException,SAXException,IOException {
|
||||||
setProperty(OUTPUT_STREAM, output);
|
setProperty(OUTPUT_STREAM, output);
|
||||||
addPhaseSkip(X4OPhaseLanguageWrite.WRITE_RELEASE);
|
addPhaseSkip(X4OPhaseLanguageWrite.WRITE_RELEASE);
|
||||||
debugStart(languageSession, DEBUG_OUTPUT_HANDLER, DEBUG_OUTPUT_STREAM, DEBUG_OUTPUT_STREAM_CLOSE);
|
debugStart(languageSession, DEBUG_OUTPUT_HANDLER, DEBUG_OUTPUT_STREAM, DEBUG_OUTPUT_STREAM_CLOSE);
|
||||||
|
|
@ -120,23 +121,20 @@ public class DefaultX4OWriter<T> extends AbstractX4OWriter<T> {
|
||||||
runWrite(languageSession);
|
runWrite(languageSession);
|
||||||
}
|
}
|
||||||
|
|
||||||
private AttributeEntryComparator attributeEntryComparator = new AttributeEntryComparator();
|
|
||||||
private boolean schemaUriPrint;
|
|
||||||
private String schemaUriRoot;
|
|
||||||
|
|
||||||
private void runWrite(X4OLanguageSession languageSession) throws X4OConnectionException {
|
private void runWrite(X4OLanguageSession languageSession) throws X4OConnectionException {
|
||||||
OutputStream out = (OutputStream)getProperty(OUTPUT_STREAM);
|
OutputStream out = (OutputStream)getProperty(OUTPUT_STREAM);
|
||||||
try {
|
try {
|
||||||
String encoding = getPropertyConfig().getPropertyString(SAX3WriterXml.OUTPUT_ENCODING);
|
String encoding = getPropertyConfig().getPropertyString(SAX3WriterXml.OUTPUT_ENCODING);
|
||||||
schemaUriPrint = getPropertyConfig().getPropertyBoolean(SCHEMA_PRINT);
|
schemaUriPrint = getPropertyConfig().getPropertyBoolean(SCHEMA_PRINT);
|
||||||
schemaUriRoot = getPropertyConfig().getPropertyString(SCHEMA_ROOT_URI);
|
schemaUriRoot = getPropertyConfig().getPropertyString(SCHEMA_ROOT_URI);
|
||||||
if (encoding==null) { encoding = SAX3XMLConstants.XML_DEFAULT_ENCODING; }
|
if (encoding == null) {
|
||||||
|
encoding = SAX3XMLConstants.XML_DEFAULT_ENCODING;
|
||||||
|
}
|
||||||
Element root = languageSession.getRootElement();
|
Element root = languageSession.getRootElement();
|
||||||
if (schemaUriRoot==null) {
|
if (schemaUriRoot == null) {
|
||||||
String rootUri = findElementUri(root);
|
String rootUri = findElementUri(root);
|
||||||
ElementNamespace ns = languageSession.getLanguage().findElementNamespace(rootUri);
|
ElementNamespace ns = languageSession.getLanguage().findElementNamespace(rootUri);
|
||||||
if (ns!=null) {
|
if (ns != null) {
|
||||||
schemaUriRoot = ns.getSchemaUri();
|
schemaUriRoot = ns.getSchemaUri();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -153,9 +151,9 @@ public class DefaultX4OWriter<T> extends AbstractX4OWriter<T> {
|
||||||
}
|
}
|
||||||
writer.startDocument();
|
writer.startDocument();
|
||||||
|
|
||||||
Map<String,String> prefixes = new HashMap<String,String>();
|
Map<String, String> prefixes = new HashMap<>();
|
||||||
startPrefixTree(root,prefixes);
|
startPrefixTree(root,prefixes);
|
||||||
for (String uri:prefixes.keySet()) {
|
for (String uri : prefixes.keySet()) {
|
||||||
String prefix = prefixes.get(uri);
|
String prefix = prefixes.get(uri);
|
||||||
writer.startPrefixMapping(prefix, uri);
|
writer.startPrefixMapping(prefix, uri);
|
||||||
}
|
}
|
||||||
|
|
@ -182,20 +180,20 @@ public class DefaultX4OWriter<T> extends AbstractX4OWriter<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void startPrefixTree(Element element,Map<String,String> result) throws SAXException {
|
private void startPrefixTree(Element element, Map<String, String> result) throws SAXException {
|
||||||
String elementUri = findElementUri(element);
|
String elementUri = findElementUri(element);
|
||||||
if (result.containsKey(elementUri)==false) {
|
if (result.containsKey(elementUri) == false) {
|
||||||
String elementUriPrefix = findNamespacePrefix(element,elementUri);
|
String elementUriPrefix = findNamespacePrefix(element, elementUri);
|
||||||
result.put(elementUri, elementUriPrefix);
|
result.put(elementUri, elementUriPrefix);
|
||||||
}
|
}
|
||||||
for (Element e:element.getChilderen()) {
|
for (Element e : element.getChilderen()) {
|
||||||
startPrefixTree(e,result);
|
startPrefixTree(e,result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<String> getProperties(Class<?> objectClass) {
|
private List<String> getProperties(Class<?> objectClass) {
|
||||||
List<String> result = new ArrayList<String>();
|
List<String> result = new ArrayList<String>();
|
||||||
for (Method m:objectClass.getMethods()) {
|
for (Method m : objectClass.getMethods()) {
|
||||||
Class<?>[] types = m.getParameterTypes();
|
Class<?>[] types = m.getParameterTypes();
|
||||||
if (types.length != 0) {
|
if (types.length != 0) {
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -206,78 +204,81 @@ public class DefaultX4OWriter<T> extends AbstractX4OWriter<T> {
|
||||||
if (m.getName().startsWith("get")==false) {
|
if (m.getName().startsWith("get")==false) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
String name = m.getName().substring(3,4).toLowerCase()+m.getName().substring(4);
|
String name = m.getName().substring(3, 4).toLowerCase() + m.getName().substring(4);
|
||||||
result.add(name);
|
result.add(name);
|
||||||
|
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
class AttributeEntry {
|
|
||||||
String id;
|
static final class AttributeEntry {
|
||||||
String value;
|
final String id;
|
||||||
Integer writeOrder;
|
final String value;
|
||||||
|
final Integer writeOrder;
|
||||||
|
|
||||||
|
public AttributeEntry(String id, String value, Integer writeOrder) {
|
||||||
|
this.id = id;
|
||||||
|
this.value = value;
|
||||||
|
this.writeOrder = writeOrder;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
class AttributeEntryComparator implements Comparator<AttributeEntry> {
|
|
||||||
|
static final class AttributeEntryComparator implements Comparator<AttributeEntry> {
|
||||||
|
|
||||||
|
@Override
|
||||||
public int compare(AttributeEntry o1, AttributeEntry o2) {
|
public int compare(AttributeEntry o1, AttributeEntry o2) {
|
||||||
return o1.writeOrder.compareTo(o2.writeOrder);
|
return o1.writeOrder.compareTo(o2.writeOrder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private void writeTree(ContentWriter writer,Element element,boolean isRoot) throws SAXException, ElementObjectPropertyValueException {
|
|
||||||
|
private void writeTree(ContentWriter writer, Element element, boolean isRoot) throws SAXException, ElementObjectPropertyValueException {
|
||||||
List<AttributeEntry> attr = new ArrayList<AttributeEntry>(20);
|
List<AttributeEntry> attr = new ArrayList<AttributeEntry>(20);
|
||||||
if (element.getElementClass().getAutoAttributes()!=null && element.getElementClass().getAutoAttributes()==false) {
|
if (element.getElementClass().getAutoAttributes() != null && element.getElementClass().getAutoAttributes() == false) {
|
||||||
for (ElementClassAttribute eca:element.getElementClass().getElementClassAttributes()) {
|
for (ElementClassAttribute eca:element.getElementClass().getElementClassAttributes()) {
|
||||||
if (eca.getRunBeanValue()!=null && eca.getRunBeanValue()==false) {
|
if (eca.getRunBeanValue() != null && eca.getRunBeanValue() == false) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
Object value = element.getLanguageSession().getElementObjectPropertyValue().getProperty(element.getElementObject(), eca.getId());
|
||||||
Object value = element.getLanguageSession().getElementObjectPropertyValue().getProperty(element.getElementObject(),eca.getId());
|
if (value == null) {
|
||||||
if (value==null) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
AttributeEntry e = new AttributeEntry();
|
AttributeEntry e = new AttributeEntry(eca.getId(), ""+value, calcOrderNumber(eca.getId(),eca.getWriteOrder()));
|
||||||
e.id = eca.getId();
|
|
||||||
e.value = ""+value;
|
|
||||||
e.writeOrder = calcOrderNumber(e.id,eca.getWriteOrder());
|
|
||||||
attr.add(e);
|
attr.add(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
for (String p:getProperties(element.getElementObject().getClass())) {
|
for (String p : getProperties(element.getElementObject().getClass())) {
|
||||||
Integer writeOrder = null;
|
Integer writeOrder = null;
|
||||||
ElementClassAttribute eca = element.getElementClass().getElementClassAttributeByName(p);
|
ElementClassAttribute eca = element.getElementClass().getElementClassAttributeByName(p);
|
||||||
if (eca!=null) {
|
if (eca != null) {
|
||||||
writeOrder = eca.getWriteOrder();
|
writeOrder = eca.getWriteOrder();
|
||||||
}
|
}
|
||||||
if (eca!=null && eca.getRunBeanValue()!=null && eca.getRunBeanValue()) {
|
if (eca != null && eca.getRunBeanValue() != null && eca.getRunBeanValue()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
boolean writeValue = true;
|
boolean writeValue = true;
|
||||||
for (ElementInterface ei:element.getLanguageSession().getLanguage().findElementInterfaces(element.getElementObject().getClass())) {
|
for (ElementInterface ei : element.getLanguageSession().getLanguage().findElementInterfaces(element.getElementObject().getClass())) {
|
||||||
eca = ei.getElementClassAttributeByName(p);
|
eca = ei.getElementClassAttributeByName(p);
|
||||||
if (eca!=null && writeOrder==null) {
|
if (eca != null && writeOrder == null) {
|
||||||
writeOrder = eca.getWriteOrder(); // add interface but allow override local
|
writeOrder = eca.getWriteOrder(); // add interface but allow override local
|
||||||
}
|
}
|
||||||
if (eca!=null && eca.getRunBeanValue()!=null && eca.getRunBeanValue()==false) {
|
if (eca != null && eca.getRunBeanValue() != null && eca.getRunBeanValue() == false) {
|
||||||
writeValue = false;
|
writeValue = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (writeValue==false) {
|
if (writeValue == false) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: check attr see reader
|
// TODO: check attr see reader
|
||||||
Object value = element.getLanguageSession().getElementObjectPropertyValue().getProperty(element.getElementObject(),p);
|
Object value = element.getLanguageSession().getElementObjectPropertyValue().getProperty(element.getElementObject(), p);
|
||||||
if (value==null) {
|
if (value == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (value instanceof List || value instanceof Collection) {
|
if (value instanceof List || value instanceof Collection) {
|
||||||
continue; // TODO; filter on type of childeren
|
continue; // TODO; filter on type of childeren
|
||||||
}
|
}
|
||||||
AttributeEntry e = new AttributeEntry();
|
AttributeEntry e = new AttributeEntry(p, ""+value, calcOrderNumber(p,writeOrder));
|
||||||
e.id = p;
|
|
||||||
e.value = ""+value;
|
|
||||||
e.writeOrder = calcOrderNumber(e.id,writeOrder);
|
|
||||||
attr.add(e);
|
attr.add(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -291,8 +292,8 @@ public class DefaultX4OWriter<T> extends AbstractX4OWriter<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sort attributes in natural order of localName and add to attributes
|
// Sort attributes in natural order of localName and add to attributes
|
||||||
Collections.sort(attr, attributeEntryComparator);
|
Collections.sort(attr, ATTR_ENTRY_COMPARATOR);
|
||||||
for (int i=0;i<attr.size();i++) {
|
for (int i = 0; i < attr.size(); i++) {
|
||||||
AttributeEntry a = attr.get(i);
|
AttributeEntry a = attr.get(i);
|
||||||
atts.addAttribute ("", a.id, "", "", a.value);
|
atts.addAttribute ("", a.id, "", "", a.value);
|
||||||
}
|
}
|
||||||
|
|
@ -300,41 +301,41 @@ public class DefaultX4OWriter<T> extends AbstractX4OWriter<T> {
|
||||||
// Write Element tree recursive.
|
// Write Element tree recursive.
|
||||||
String elementUri = findElementUri(element);
|
String elementUri = findElementUri(element);
|
||||||
writer.startElement(elementUri, element.getElementClass().getId(), "", atts);
|
writer.startElement(elementUri, element.getElementClass().getId(), "", atts);
|
||||||
for (Element e:element.getChilderen()) {
|
for (Element e : element.getChilderen()) {
|
||||||
writeTree(writer,e,false);
|
writeTree(writer, e, false);
|
||||||
}
|
}
|
||||||
writer.endElement(elementUri, element.getElementClass().getId(), "");
|
writer.endElement(elementUri, element.getElementClass().getId(), "");
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: move to defaults layer so visible in docs.
|
// TODO: move to defaults layer so visible in docs.
|
||||||
private Integer calcOrderNumber(String name,Integer orderNumberOverride) {
|
private Integer calcOrderNumber(String name, Integer orderNumberOverride) {
|
||||||
if (orderNumberOverride!=null) {
|
if (orderNumberOverride != null) {
|
||||||
return orderNumberOverride;
|
return orderNumberOverride;
|
||||||
}
|
}
|
||||||
if (name==null) {
|
if (name == null) {
|
||||||
throw new NullPointerException("Can't calculate order of null name.");
|
throw new NullPointerException("Can't calculate order of null name.");
|
||||||
}
|
}
|
||||||
int nameSize = name.length();
|
int nameSize = name.length();
|
||||||
if (nameSize==1) {
|
if (nameSize == 1) {
|
||||||
return (name.charAt(0) * 1000);
|
return (name.charAt(0) * 1000);
|
||||||
}
|
}
|
||||||
if (nameSize==2) {
|
if (nameSize == 2) {
|
||||||
return (name.charAt(0) * 1000) + (name.charAt(1) * 100);
|
return (name.charAt(0) * 1000) + (name.charAt(1) * 100);
|
||||||
}
|
}
|
||||||
if (nameSize==3) {
|
if (nameSize == 3) {
|
||||||
return (name.charAt(0) * 1000) + (name.charAt(1) * 100) + (name.charAt(2) * 10);
|
return (name.charAt(0) * 1000) + (name.charAt(1) * 100) + (name.charAt(2) * 10);
|
||||||
}
|
}
|
||||||
if (nameSize>3) {
|
if (nameSize > 3) {
|
||||||
return (name.charAt(0) * 1000) + (name.charAt(1) * 100) + (name.charAt(2) * 10) + (name.charAt(3) * 1);
|
return (name.charAt(0) * 1000) + (name.charAt(1) * 100) + (name.charAt(2) * 10) + (name.charAt(3) * 1);
|
||||||
}
|
}
|
||||||
throw new IllegalArgumentException("Can't calculate order of empty name.");
|
throw new IllegalArgumentException("Can't calculate order of empty name.");
|
||||||
}
|
}
|
||||||
|
|
||||||
private String findElementUri(Element e) {
|
private String findElementUri(Element e) {
|
||||||
for (X4OLanguageModule mod:e.getLanguageSession().getLanguage().getLanguageModules()) {
|
for (X4OLanguageModule mod : e.getLanguageSession().getLanguage().getLanguageModules()) {
|
||||||
for (ElementNamespace c:mod.getElementNamespaces()) {
|
for (ElementNamespace c : mod.getElementNamespaces()) {
|
||||||
ElementClass ec = c.getElementClass(e.getElementClass().getId());
|
ElementClass ec = c.getElementClass(e.getElementClass().getId());
|
||||||
if (ec!=null) {
|
if (ec != null) {
|
||||||
return c.getUri();
|
return c.getUri();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -342,9 +343,9 @@ public class DefaultX4OWriter<T> extends AbstractX4OWriter<T> {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String findNamespacePrefix(Element e,String uri) {
|
private String findNamespacePrefix(Element e, String uri) {
|
||||||
ElementNamespace ns = e.getLanguageSession().getLanguage().findElementNamespace(uri);
|
ElementNamespace ns = e.getLanguageSession().getLanguage().findElementNamespace(uri);
|
||||||
if (ns.getPrefixMapping()!=null) {
|
if (ns.getPrefixMapping() != null) {
|
||||||
return ns.getPrefixMapping();
|
return ns.getPrefixMapping();
|
||||||
}
|
}
|
||||||
return ns.getId();
|
return ns.getId();
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,6 @@ import org.x4o.xml.lang.X4OLanguageSession;
|
||||||
import org.xml.sax.InputSource;
|
import org.xml.sax.InputSource;
|
||||||
import org.xml.sax.SAXException;
|
import org.xml.sax.SAXException;
|
||||||
import org.xml.sax.XMLReader;
|
import org.xml.sax.XMLReader;
|
||||||
import org.xml.sax.helpers.XMLReaderFactory;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
|
@ -38,6 +37,10 @@ import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
import javax.xml.parsers.SAXParser;
|
||||||
|
import javax.xml.parsers.SAXParserFactory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* X4OContentParser Runs the SAX parser with the X4OContentHandler.
|
* X4OContentParser Runs the SAX parser with the X4OContentHandler.
|
||||||
*
|
*
|
||||||
|
|
@ -56,7 +59,7 @@ public class X4OContentParser {
|
||||||
return propertyConfig;
|
return propertyConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void parse(X4OLanguageSession languageSession) throws SAXException, IOException {
|
public void parse(X4OLanguageSession languageSession) throws SAXException, IOException, ParserConfigurationException {
|
||||||
// Group debug config property messages
|
// Group debug config property messages
|
||||||
if (languageSession.hasX4ODebugWriter()) {
|
if (languageSession.hasX4ODebugWriter()) {
|
||||||
languageSession.getX4ODebugWriter().debugSAXConfigStart();
|
languageSession.getX4ODebugWriter().debugSAXConfigStart();
|
||||||
|
|
@ -70,7 +73,7 @@ public class X4OContentParser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void parseSax(X4OLanguageSession languageSession) throws SAXException, IOException {
|
private void parseSax(X4OLanguageSession languageSession) throws SAXException, IOException, ParserConfigurationException {
|
||||||
// If xsd caching is needed this should be the way
|
// If xsd caching is needed this should be the way
|
||||||
//XMLParserConfiguration config = new XIncludeAwareParserConfiguration();
|
//XMLParserConfiguration config = new XIncludeAwareParserConfiguration();
|
||||||
//config.setProperty("http://apache.org/xml/properties/internal/grammar-pool",myFullGrammarPool);
|
//config.setProperty("http://apache.org/xml/properties/internal/grammar-pool",myFullGrammarPool);
|
||||||
|
|
@ -78,19 +81,22 @@ public class X4OContentParser {
|
||||||
|
|
||||||
// Create Sax parser with x4o tag handler
|
// Create Sax parser with x4o tag handler
|
||||||
X4OContentHandler xth = new X4OContentHandler(languageSession,getPropertyConfig());
|
X4OContentHandler xth = new X4OContentHandler(languageSession,getPropertyConfig());
|
||||||
XMLReader saxParser = XMLReaderFactory.createXMLReader();
|
SAXParserFactory factory = SAXParserFactory.newInstance();
|
||||||
saxParser.setErrorHandler(new X4OErrorHandler(languageSession,getPropertyConfig()));
|
factory.setNamespaceAware(true);
|
||||||
saxParser.setEntityResolver(new X4OEntityResolver(languageSession,getPropertyConfig()));
|
SAXParser parser = factory.newSAXParser();
|
||||||
saxParser.setContentHandler(xth);
|
XMLReader reader = parser.getXMLReader();
|
||||||
saxParser.setProperty("http://xml.org/sax/properties/lexical-handler", xth);
|
reader.setErrorHandler(new X4OErrorHandler(languageSession,getPropertyConfig()));
|
||||||
saxParser.setProperty("http://xml.org/sax/properties/declaration-handler",xth);
|
reader.setEntityResolver(new X4OEntityResolver(languageSession,getPropertyConfig()));
|
||||||
|
reader.setContentHandler(xth);
|
||||||
|
reader.setProperty("http://xml.org/sax/properties/lexical-handler", xth);
|
||||||
|
reader.setProperty("http://xml.org/sax/properties/declaration-handler",xth);
|
||||||
|
|
||||||
// Set properties and optional
|
// Set properties and optional
|
||||||
Map<String,Object> saxParserProperties = getSAXParserProperties(languageSession);
|
Map<String,Object> saxParserProperties = getSAXParserProperties(languageSession);
|
||||||
for (Map.Entry<String,Object> entry:saxParserProperties.entrySet()) {
|
for (Map.Entry<String,Object> entry:saxParserProperties.entrySet()) {
|
||||||
String name = entry.getKey();
|
String name = entry.getKey();
|
||||||
Object value= entry.getValue();
|
Object value= entry.getValue();
|
||||||
saxParser.setProperty(name, value);
|
reader.setProperty(name, value);
|
||||||
debugMessage("property",name,value,languageSession);
|
debugMessage("property",name,value,languageSession);
|
||||||
}
|
}
|
||||||
Map<String,Object> saxParserPropertiesOptional = getSAXParserPropertiesOptional(languageSession);
|
Map<String,Object> saxParserPropertiesOptional = getSAXParserPropertiesOptional(languageSession);
|
||||||
|
|
@ -98,7 +104,7 @@ public class X4OContentParser {
|
||||||
String name = entry.getKey();
|
String name = entry.getKey();
|
||||||
Object value= entry.getValue();
|
Object value= entry.getValue();
|
||||||
try {
|
try {
|
||||||
saxParser.setProperty(name, value);
|
reader.setProperty(name, value);
|
||||||
debugMessage("optional-property",name,value,languageSession);
|
debugMessage("optional-property",name,value,languageSession);
|
||||||
} catch (SAXException e) {
|
} catch (SAXException e) {
|
||||||
debugMessageLog("Could not set optional SAX property: "+name+" to: "+value+" error: "+e.getMessage(),languageSession);
|
debugMessageLog("Could not set optional SAX property: "+name+" to: "+value+" error: "+e.getMessage(),languageSession);
|
||||||
|
|
@ -109,14 +115,14 @@ public class X4OContentParser {
|
||||||
Map<String, Boolean> features = getSAXParserFeatures(languageSession);
|
Map<String, Boolean> features = getSAXParserFeatures(languageSession);
|
||||||
for (String key:features.keySet()) {
|
for (String key:features.keySet()) {
|
||||||
Boolean value=features.get(key);
|
Boolean value=features.get(key);
|
||||||
saxParser.setFeature(key, value);
|
reader.setFeature(key, value);
|
||||||
debugMessage("feature",key,value,languageSession);
|
debugMessage("feature",key,value,languageSession);
|
||||||
}
|
}
|
||||||
Map<String, Boolean> featuresOptional = getSAXParserFeaturesOptional(languageSession);
|
Map<String, Boolean> featuresOptional = getSAXParserFeaturesOptional(languageSession);
|
||||||
for (String key:featuresOptional.keySet()) {
|
for (String key:featuresOptional.keySet()) {
|
||||||
Boolean value=featuresOptional.get(key);
|
Boolean value=featuresOptional.get(key);
|
||||||
try {
|
try {
|
||||||
saxParser.setFeature(key, value);
|
reader.setFeature(key, value);
|
||||||
debugMessage("optional-feature",key,value,languageSession);
|
debugMessage("optional-feature",key,value,languageSession);
|
||||||
} catch (SAXException e) {
|
} catch (SAXException e) {
|
||||||
debugMessageLog("Could not set optional SAX feature: "+key+" to: "+value+" error: "+e.getMessage(),languageSession);
|
debugMessageLog("Could not set optional SAX feature: "+key+" to: "+value+" error: "+e.getMessage(),languageSession);
|
||||||
|
|
@ -126,7 +132,7 @@ public class X4OContentParser {
|
||||||
// check for required features
|
// check for required features
|
||||||
List<String> requiredFeatures = getSAXParserFeaturesRequired(languageSession);
|
List<String> requiredFeatures = getSAXParserFeaturesRequired(languageSession);
|
||||||
for (String requiredFeature:requiredFeatures) {
|
for (String requiredFeature:requiredFeatures) {
|
||||||
if (saxParser.getFeature(requiredFeature)==false) {
|
if (reader.getFeature(requiredFeature)==false) {
|
||||||
throw new IllegalStateException("Missing required feature: "+requiredFeature);
|
throw new IllegalStateException("Missing required feature: "+requiredFeature);
|
||||||
}
|
}
|
||||||
debugMessage("required",requiredFeature,"true",languageSession);
|
debugMessage("required",requiredFeature,"true",languageSession);
|
||||||
|
|
@ -153,7 +159,7 @@ public class X4OContentParser {
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
saxParser.parse(input);
|
reader.parse(input);
|
||||||
} finally {
|
} finally {
|
||||||
if (inputStream!=null) {
|
if (inputStream!=null) {
|
||||||
inputStream.close();
|
inputStream.close();
|
||||||
|
|
|
||||||
|
|
@ -176,7 +176,7 @@ public class X4ODebugWriter {
|
||||||
StringBuilder buf = new StringBuilder();
|
StringBuilder buf = new StringBuilder();
|
||||||
buf.append("0x");
|
buf.append("0x");
|
||||||
for (char c:newline.toCharArray()) {
|
for (char c:newline.toCharArray()) {
|
||||||
Integer i = new Integer(c);
|
Integer i = Integer.valueOf(c);
|
||||||
if (i<16) {
|
if (i<16) {
|
||||||
buf.append('0');
|
buf.append('0');
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -48,30 +48,30 @@ import org.x4o.xml.lang.phase.X4OPhaseManager;
|
||||||
*/
|
*/
|
||||||
public class DefaultX4OLanguage implements X4OLanguageLocal {
|
public class DefaultX4OLanguage implements X4OLanguageLocal {
|
||||||
|
|
||||||
private Logger logger = null;
|
private final Logger logger;
|
||||||
private X4OLanguageConfiguration languageConfiguration = null;
|
private final X4OLanguageConfiguration languageConfiguration;
|
||||||
private List<X4OLanguageModule> elementLanguageModules = null;
|
private final List<X4OLanguageModule> elementLanguageModules;
|
||||||
private String languageName = null;
|
private final String languageName;
|
||||||
private String languageVersion = null;
|
private final String languageVersion;
|
||||||
private X4OPhaseManager phaseManager = null;
|
private final X4OPhaseManager phaseManager;
|
||||||
private Map<String,ElementNamespace> keyedNamespaceLookup = null;
|
private final Map<String, ElementNamespace> keyedNamespaceLookup;
|
||||||
|
|
||||||
public DefaultX4OLanguage(X4OLanguageConfiguration languageConfiguration,X4OPhaseManager phaseManager,String languageName,String languageVersion) {
|
public DefaultX4OLanguage(X4OLanguageConfiguration languageConfiguration, X4OPhaseManager phaseManager, String languageName, String languageVersion) {
|
||||||
if (languageName==null) {
|
if (languageName == null) {
|
||||||
throw new NullPointerException("Can't define myself with null name.");
|
throw new NullPointerException("Can't define myself with null name.");
|
||||||
}
|
}
|
||||||
if (languageVersion==null) {
|
if (languageVersion == null) {
|
||||||
throw new NullPointerException("Can't define myself with null version.");
|
throw new NullPointerException("Can't define myself with null version.");
|
||||||
}
|
}
|
||||||
logger = Logger.getLogger(DefaultX4OLanguage.class.getName());
|
this.logger = Logger.getLogger(DefaultX4OLanguage.class.getName());
|
||||||
elementLanguageModules = new ArrayList<X4OLanguageModule>(20);
|
this.elementLanguageModules = new ArrayList<X4OLanguageModule>(20);
|
||||||
keyedNamespaceLookup = new HashMap<String,ElementNamespace>(20);
|
this.keyedNamespaceLookup = new HashMap<String, ElementNamespace>(20);
|
||||||
this.languageConfiguration=languageConfiguration;
|
this.languageConfiguration = languageConfiguration;
|
||||||
this.languageName=languageName;
|
this.languageName = languageName;
|
||||||
this.languageVersion=languageVersion;
|
this.languageVersion = languageVersion;
|
||||||
this.phaseManager=phaseManager;
|
this.phaseManager = phaseManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see org.x4o.xml.lang.X4OLanguage#getLanguageName()
|
* @see org.x4o.xml.lang.X4OLanguage#getLanguageName()
|
||||||
*/
|
*/
|
||||||
|
|
@ -85,7 +85,7 @@ public class DefaultX4OLanguage implements X4OLanguageLocal {
|
||||||
public String getLanguageVersion() {
|
public String getLanguageVersion() {
|
||||||
return languageVersion;
|
return languageVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see org.x4o.xml.lang.X4OLanguage#getPhaseManager()
|
* @see org.x4o.xml.lang.X4OLanguage#getPhaseManager()
|
||||||
*/
|
*/
|
||||||
|
|
@ -104,28 +104,27 @@ public class DefaultX4OLanguage implements X4OLanguageLocal {
|
||||||
* @see org.x4o.xml.lang.X4OLanguageLocal#addLanguageModule(org.x4o.xml.lang.X4OLanguageModule)
|
* @see org.x4o.xml.lang.X4OLanguageLocal#addLanguageModule(org.x4o.xml.lang.X4OLanguageModule)
|
||||||
*/
|
*/
|
||||||
public void addLanguageModule(X4OLanguageModule elementLanguageModule) {
|
public void addLanguageModule(X4OLanguageModule elementLanguageModule) {
|
||||||
if (elementLanguageModule.getId()==null) {
|
if (elementLanguageModule.getId() == null) {
|
||||||
throw new NullPointerException("Can't add module without id.");
|
throw new NullPointerException("Can't add module without id.");
|
||||||
}
|
}
|
||||||
for (X4OLanguageModule mod:elementLanguageModules) {
|
for (X4OLanguageModule mod : elementLanguageModules) {
|
||||||
if (mod.getId().equals(elementLanguageModule.getId())) {
|
if (mod.getId().equals(elementLanguageModule.getId())) {
|
||||||
throw new IllegalArgumentException("Can't add module with duplicate id; "+elementLanguageModule.getId());
|
throw new IllegalArgumentException("Can't add module with duplicate id; " + elementLanguageModule.getId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
elementLanguageModules.add(elementLanguageModule);
|
elementLanguageModules.add(elementLanguageModule);
|
||||||
|
for (ElementNamespace ns : elementLanguageModule.getElementNamespaces()) {
|
||||||
for (ElementNamespace ns:elementLanguageModule.getElementNamespaces()) {
|
|
||||||
keyedNamespaceLookup.put(ns.getUri(), ns);
|
keyedNamespaceLookup.put(ns.getUri(), ns);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see org.x4o.xml.lang.X4OLanguage#getLanguageModules()
|
* @see org.x4o.xml.lang.X4OLanguage#getLanguageModules()
|
||||||
*/
|
*/
|
||||||
public Collection<X4OLanguageModule> getLanguageModules() {
|
public Collection<X4OLanguageModule> getLanguageModules() {
|
||||||
return elementLanguageModules;
|
return elementLanguageModules;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see org.x4o.xml.lang.X4OLanguage#createLanguageSession()
|
* @see org.x4o.xml.lang.X4OLanguage#createLanguageSession()
|
||||||
*/
|
*/
|
||||||
|
|
@ -134,22 +133,25 @@ public class DefaultX4OLanguage implements X4OLanguageLocal {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected X4OLanguageSession buildElementLanguage(X4OLanguageSessionLocal languageSession) {
|
protected X4OLanguageSession buildElementLanguage(X4OLanguageSessionLocal languageSession) {
|
||||||
try {
|
try {
|
||||||
if (languageSession.getExpressionLanguageFactory()==null) {
|
if (languageSession.getExpressionLanguageFactory() == null) {
|
||||||
languageSession.setExpressionLanguageFactory(X4OExpressionFactory.createExpressionFactory());
|
languageSession.setExpressionLanguageFactory(X4OExpressionFactory.createExpressionFactory());
|
||||||
}
|
}
|
||||||
if (languageSession.getExpressionLanguageContext()==null) {
|
if (languageSession.getExpressionLanguageContext() == null) {
|
||||||
languageSession.setExpressionLanguageContext(X4OExpressionFactory.createELContext(languageSession.getLanguage().getLanguageConfiguration().getDefaultExpressionLanguageContext()));
|
languageSession.setExpressionLanguageContext(
|
||||||
|
X4OExpressionFactory.createELContext(languageSession.getLanguage().getLanguageConfiguration().getDefaultExpressionLanguageContext()));
|
||||||
}
|
}
|
||||||
if (languageSession.getElementAttributeValueParser()==null) {
|
if (languageSession.getElementAttributeValueParser() == null) {
|
||||||
languageSession.setElementAttributeValueParser((ElementAttributeValueParser)X4OLanguageClassLoader.newInstance(getLanguageConfiguration().getDefaultElementAttributeValueParser()));
|
languageSession.setElementAttributeValueParser(X4OLanguageClassLoader.newInstance(ElementAttributeValueParser.class,
|
||||||
|
getLanguageConfiguration().getDefaultElementAttributeValueParser()));
|
||||||
}
|
}
|
||||||
if (languageSession.getElementObjectPropertyValue()==null) {
|
if (languageSession.getElementObjectPropertyValue() == null) {
|
||||||
languageSession.setElementObjectPropertyValue((ElementObjectPropertyValue)X4OLanguageClassLoader.newInstance(getLanguageConfiguration().getDefaultElementObjectPropertyValue()));
|
languageSession.setElementObjectPropertyValue(X4OLanguageClassLoader.newInstance(ElementObjectPropertyValue.class,
|
||||||
|
getLanguageConfiguration().getDefaultElementObjectPropertyValue()));
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (ClassNotFoundException e) {
|
||||||
throw new RuntimeException(e.getMessage(),e);
|
throw new RuntimeException(e.getMessage(), e);
|
||||||
}
|
}
|
||||||
return languageSession;
|
return languageSession;
|
||||||
}
|
}
|
||||||
|
|
@ -157,21 +159,21 @@ public class DefaultX4OLanguage implements X4OLanguageLocal {
|
||||||
/**
|
/**
|
||||||
* @see org.x4o.xml.lang.X4OLanguage#createElementInstance(org.x4o.xml.lang.X4OLanguageSession,java.lang.Class)
|
* @see org.x4o.xml.lang.X4OLanguage#createElementInstance(org.x4o.xml.lang.X4OLanguageSession,java.lang.Class)
|
||||||
*/
|
*/
|
||||||
public Element createElementInstance(X4OLanguageSession context,Class<?> objectClass) {
|
public Element createElementInstance(X4OLanguageSession context, Class<?> objectClass) {
|
||||||
for (X4OLanguageModule modContext:getLanguageModules()) {
|
for (X4OLanguageModule modContext : getLanguageModules()) {
|
||||||
for (ElementNamespace nsContext:modContext.getElementNamespaces()) {
|
for (ElementNamespace nsContext : modContext.getElementNamespaces()) {
|
||||||
for (ElementClass ec:nsContext.getElementClasses()) {
|
for (ElementClass ec : nsContext.getElementClasses()) {
|
||||||
if (ec.getObjectClass()!=null && ec.getObjectClass().equals(objectClass)) {
|
if (ec.getObjectClass() != null && ec.getObjectClass().equals(objectClass)) {
|
||||||
try {
|
try {
|
||||||
return nsContext.getElementNamespaceInstanceProvider().createElementInstance(context, ec.getId());
|
return nsContext.getElementNamespaceInstanceProvider().createElementInstance(context, ec.getId());
|
||||||
} catch (ElementNamespaceInstanceProviderException e) {
|
} catch (ElementNamespaceInstanceProviderException e) {
|
||||||
throw new RuntimeException(e.getMessage(),e); // TODO: fix me
|
throw new RuntimeException(e.getMessage(), e); // TODO: fix me
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
throw new IllegalArgumentException("Could not find ElementClass for: "+objectClass.getName());
|
throw new IllegalArgumentException("Could not find ElementClass for: " + objectClass.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -179,9 +181,9 @@ public class DefaultX4OLanguage implements X4OLanguageLocal {
|
||||||
*/
|
*/
|
||||||
public List<ElementBindingHandler> findElementBindingHandlers(Object parent) {
|
public List<ElementBindingHandler> findElementBindingHandlers(Object parent) {
|
||||||
List<ElementBindingHandler> result = new ArrayList<ElementBindingHandler>(50);
|
List<ElementBindingHandler> result = new ArrayList<ElementBindingHandler>(50);
|
||||||
for (int i=0;i<elementLanguageModules.size();i++) {
|
for (int i = 0; i < elementLanguageModules.size(); i++) {
|
||||||
X4OLanguageModule module = elementLanguageModules.get(i);
|
X4OLanguageModule module = elementLanguageModules.get(i);
|
||||||
findElementBindingHandlerInList(parent,null,result,module.getElementBindingHandlers(),false);
|
findElementBindingHandlerInList(parent, null, result, module.getElementBindingHandlers(), false);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
@ -189,37 +191,38 @@ public class DefaultX4OLanguage implements X4OLanguageLocal {
|
||||||
/**
|
/**
|
||||||
* @see org.x4o.xml.lang.X4OLanguage#findElementBindingHandlers(java.lang.Object,java.lang.Object)
|
* @see org.x4o.xml.lang.X4OLanguage#findElementBindingHandlers(java.lang.Object,java.lang.Object)
|
||||||
*/
|
*/
|
||||||
public List<ElementBindingHandler> findElementBindingHandlers(Object parent,Object child) {
|
public List<ElementBindingHandler> findElementBindingHandlers(Object parent, Object child) {
|
||||||
List<ElementBindingHandler> result = new ArrayList<ElementBindingHandler>(50);
|
List<ElementBindingHandler> result = new ArrayList<ElementBindingHandler>(50);
|
||||||
for (int i=0;i<elementLanguageModules.size();i++) {
|
for (int i = 0; i < elementLanguageModules.size(); i++) {
|
||||||
X4OLanguageModule module = elementLanguageModules.get(i);
|
X4OLanguageModule module = elementLanguageModules.get(i);
|
||||||
findElementBindingHandlerInList(parent,child,result,module.getElementBindingHandlers(),true);
|
findElementBindingHandlerInList(parent, child, result, module.getElementBindingHandlers(), true);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void findElementBindingHandlerInList(Object parent,Object child,List<ElementBindingHandler> result,List<ElementBindingHandler> checkList,boolean checkChild) {
|
private void findElementBindingHandlerInList(Object parent, Object child, List<ElementBindingHandler> result, List<ElementBindingHandler> checkList,
|
||||||
for (ElementBindingHandler binding:checkList) {
|
boolean checkChild) {
|
||||||
|
for (ElementBindingHandler binding : checkList) {
|
||||||
boolean parentBind = false;
|
boolean parentBind = false;
|
||||||
if (parent instanceof Class) {
|
if (parent instanceof Class) {
|
||||||
parentBind = binding.getBindParentClass().isAssignableFrom((Class<?>)parent);
|
parentBind = binding.getBindParentClass().isAssignableFrom((Class<?>) parent);
|
||||||
} else {
|
} else {
|
||||||
parentBind = binding.getBindParentClass().isInstance(parent);
|
parentBind = binding.getBindParentClass().isInstance(parent);
|
||||||
}
|
}
|
||||||
if (parentBind==false) {
|
if (parentBind == false) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (checkChild==false) {
|
if (checkChild == false) {
|
||||||
result.add(binding); // All all handlers for parent only
|
result.add(binding); // All all handlers for parent only
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
boolean childBind = false;
|
boolean childBind = false;
|
||||||
for (Class<?> childClass:binding.getBindChildClasses()) {
|
for (Class<?> childClass : binding.getBindChildClasses()) {
|
||||||
if (child instanceof Class && childClass.isAssignableFrom((Class<?>)child)) {
|
if (child instanceof Class && childClass.isAssignableFrom((Class<?>) child)) {
|
||||||
childBind=true;
|
childBind = true;
|
||||||
break;
|
break;
|
||||||
} else if (childClass.isInstance(child)) {
|
} else if (childClass.isInstance(child)) {
|
||||||
childBind=true;
|
childBind = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -228,25 +231,25 @@ public class DefaultX4OLanguage implements X4OLanguageLocal {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see org.x4o.xml.lang.X4OLanguage#findElementInterfaces(java.lang.Object)
|
* @see org.x4o.xml.lang.X4OLanguage#findElementInterfaces(java.lang.Object)
|
||||||
*/
|
*/
|
||||||
public List<ElementInterface> findElementInterfaces(Object elementObject) {
|
public List<ElementInterface> findElementInterfaces(Object elementObject) {
|
||||||
if (elementObject==null) {
|
if (elementObject == null) {
|
||||||
throw new NullPointerException("Can't search for null object.");
|
throw new NullPointerException("Can't search for null object.");
|
||||||
}
|
}
|
||||||
List<ElementInterface> result = new ArrayList<ElementInterface>(50);
|
List<ElementInterface> result = new ArrayList<ElementInterface>(50);
|
||||||
for (int i=0;i<elementLanguageModules.size();i++) {
|
for (int i = 0; i < elementLanguageModules.size(); i++) {
|
||||||
X4OLanguageModule module = elementLanguageModules.get(i);
|
X4OLanguageModule module = elementLanguageModules.get(i);
|
||||||
for (ElementInterface ei:module.getElementInterfaces()) {
|
for (ElementInterface ei : module.getElementInterfaces()) {
|
||||||
Class<?> eClass = ei.getInterfaceClass();
|
Class<?> eClass = ei.getInterfaceClass();
|
||||||
logger.finest("Checking interface handler: "+ei+" for class: "+eClass);
|
logger.finest("Checking interface handler: " + ei + " for class: " + eClass);
|
||||||
if (elementObject instanceof Class && eClass.isAssignableFrom((Class<?>)elementObject)) {
|
if (elementObject instanceof Class && eClass.isAssignableFrom((Class<?>) elementObject)) {
|
||||||
logger.finer("Found interface match from class; "+elementObject);
|
logger.finer("Found interface match from class; " + elementObject);
|
||||||
result.add(ei);
|
result.add(ei);
|
||||||
} else if (eClass.isInstance(elementObject)) {
|
} else if (eClass.isInstance(elementObject)) {
|
||||||
logger.finer("Found interface match from object; "+elementObject);
|
logger.finer("Found interface match from object; " + elementObject);
|
||||||
result.add(ei);
|
result.add(ei);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,10 @@ import java.util.Enumeration;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
import javax.xml.parsers.SAXParser;
|
||||||
|
import javax.xml.parsers.SAXParserFactory;
|
||||||
|
|
||||||
import org.x4o.xml.eld.EldDriver;
|
import org.x4o.xml.eld.EldDriver;
|
||||||
import org.x4o.xml.eld.EldModuleLoader;
|
import org.x4o.xml.eld.EldModuleLoader;
|
||||||
import org.x4o.xml.lang.phase.X4OPhaseLanguageInit;
|
import org.x4o.xml.lang.phase.X4OPhaseLanguageInit;
|
||||||
|
|
@ -40,7 +44,6 @@ import org.xml.sax.InputSource;
|
||||||
import org.xml.sax.SAXException;
|
import org.xml.sax.SAXException;
|
||||||
import org.xml.sax.XMLReader;
|
import org.xml.sax.XMLReader;
|
||||||
import org.xml.sax.ext.DefaultHandler2;
|
import org.xml.sax.ext.DefaultHandler2;
|
||||||
import org.xml.sax.helpers.XMLReaderFactory;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* DefaultX4OLanguageLoader loads the modules of language.
|
* DefaultX4OLanguageLoader loads the modules of language.
|
||||||
|
|
@ -101,7 +104,7 @@ TODO: if (language.getLanguageConfiguration().hasX4ODebugWriter()) {
|
||||||
}
|
}
|
||||||
for (String value:versionedResources.moduleLoaders) {
|
for (String value:versionedResources.moduleLoaders) {
|
||||||
try {
|
try {
|
||||||
loader = (X4OLanguageModuleLoader)X4OLanguageClassLoader.loadClass(value).newInstance();
|
loader = (X4OLanguageModuleLoader)X4OLanguageClassLoader.newInstance(value);
|
||||||
} catch (Exception ee) {
|
} catch (Exception ee) {
|
||||||
throw new X4OLanguageLoaderException("Could not load class: "+value+" error: "+ee.getMessage(),ee);
|
throw new X4OLanguageLoaderException("Could not load class: "+value+" error: "+ee.getMessage(),ee);
|
||||||
}
|
}
|
||||||
|
|
@ -109,7 +112,7 @@ TODO: if (language.getLanguageConfiguration().hasX4ODebugWriter()) {
|
||||||
}
|
}
|
||||||
for (String value:versionedResources.siblingLoaders) {
|
for (String value:versionedResources.siblingLoaders) {
|
||||||
try {
|
try {
|
||||||
loader = (X4OLanguageModuleLoader)X4OLanguageClassLoader.loadClass(value).newInstance();
|
loader = (X4OLanguageModuleLoader)X4OLanguageClassLoader.newInstance(value);
|
||||||
} catch (Exception ee) {
|
} catch (Exception ee) {
|
||||||
throw new X4OLanguageLoaderException("Could not load class: "+value+" error: "+ee.getMessage(),ee);
|
throw new X4OLanguageLoaderException("Could not load class: "+value+" error: "+ee.getMessage(),ee);
|
||||||
}
|
}
|
||||||
|
|
@ -135,10 +138,8 @@ TODO: if (language.getLanguageConfiguration().hasX4ODebugWriter()) {
|
||||||
List<VersionedResources> result = new ArrayList<VersionedResources>(resources.size());
|
List<VersionedResources> result = new ArrayList<VersionedResources>(resources.size());
|
||||||
X4OLanguageVersionFilter lvf;
|
X4OLanguageVersionFilter lvf;
|
||||||
try {
|
try {
|
||||||
lvf = (X4OLanguageVersionFilter)X4OLanguageClassLoader.newInstance(languageLocal.getLanguageConfiguration().getDefaultLanguageVersionFilter());
|
lvf = X4OLanguageClassLoader.newInstance(X4OLanguageVersionFilter.class, languageLocal.getLanguageConfiguration().getDefaultLanguageVersionFilter());
|
||||||
} catch (InstantiationException e) {
|
} catch (ClassNotFoundException e) {
|
||||||
throw new X4OLanguageLoaderException(e);
|
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
throw new X4OLanguageLoaderException(e);
|
throw new X4OLanguageLoaderException(e);
|
||||||
}
|
}
|
||||||
for (VersionedResources versionedResources:resources) {
|
for (VersionedResources versionedResources:resources) {
|
||||||
|
|
@ -178,10 +179,8 @@ TODO: if (language.getLanguageConfiguration().hasX4ODebugWriter()) {
|
||||||
private void loadModule(X4OLanguageLocal languageLocal,X4OLanguageModuleLoader loader,String resource,VersionedResources versionedResources) throws X4OLanguageLoaderException {
|
private void loadModule(X4OLanguageLocal languageLocal,X4OLanguageModuleLoader loader,String resource,VersionedResources versionedResources) throws X4OLanguageLoaderException {
|
||||||
X4OLanguageModuleLocal module;
|
X4OLanguageModuleLocal module;
|
||||||
try {
|
try {
|
||||||
module = (X4OLanguageModuleLocal)X4OLanguageClassLoader.newInstance(languageLocal.getLanguageConfiguration().getDefaultElementLanguageModule());
|
module = X4OLanguageClassLoader.newInstance(X4OLanguageModuleLocal.class, languageLocal.getLanguageConfiguration().getDefaultElementLanguageModule());
|
||||||
} catch (InstantiationException e) {
|
} catch (ClassNotFoundException e) {
|
||||||
throw new X4OLanguageLoaderException(e);
|
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
throw new X4OLanguageLoaderException(e);
|
throw new X4OLanguageLoaderException(e);
|
||||||
}
|
}
|
||||||
logMessage(languageLocal,"Created module: "+module);
|
logMessage(languageLocal,"Created module: "+module);
|
||||||
|
|
@ -236,9 +235,7 @@ TODO: if (language.getLanguageConfiguration().hasX4ODebugWriter()) {
|
||||||
result.addAll(loadLanguageModulesXml(u.openStream(),u.toString()));
|
result.addAll(loadLanguageModulesXml(u.openStream(),u.toString()));
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
} catch (IOException e) {
|
} catch (IOException | SAXException | ParserConfigurationException e) {
|
||||||
throw new X4OLanguageLoaderException(e);
|
|
||||||
} catch (SAXException e) {
|
|
||||||
throw new X4OLanguageLoaderException(e);
|
throw new X4OLanguageLoaderException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -248,18 +245,22 @@ TODO: if (language.getLanguageConfiguration().hasX4ODebugWriter()) {
|
||||||
* @param in The inputstream to parser.
|
* @param in The inputstream to parser.
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
* @throws SAXException
|
* @throws SAXException
|
||||||
|
* @throws ParserConfigurationException
|
||||||
*/
|
*/
|
||||||
protected List<VersionedResources> loadLanguageModulesXml(InputStream in,String loadedFrom) throws IOException, SAXException {
|
protected List<VersionedResources> loadLanguageModulesXml(InputStream in,String loadedFrom) throws IOException, SAXException, ParserConfigurationException {
|
||||||
if (in==null) {
|
if (in==null) {
|
||||||
throw new NullPointerException("Can't parse null input stream");
|
throw new NullPointerException("Can't parse null input stream");
|
||||||
}
|
}
|
||||||
ModulesTagHandler xth = new ModulesTagHandler(loadedFrom);
|
ModulesTagHandler xth = new ModulesTagHandler(loadedFrom);
|
||||||
XMLReader saxParser = XMLReaderFactory.createXMLReader();
|
SAXParserFactory factory = SAXParserFactory.newInstance();
|
||||||
saxParser.setContentHandler(xth);
|
factory.setNamespaceAware(true);
|
||||||
saxParser.setProperty("http://xml.org/sax/properties/lexical-handler", xth);
|
SAXParser parser = factory.newSAXParser();
|
||||||
saxParser.setProperty("http://xml.org/sax/properties/declaration-handler",xth);
|
XMLReader reader = parser.getXMLReader();
|
||||||
|
reader.setContentHandler(xth);
|
||||||
|
reader.setProperty("http://xml.org/sax/properties/lexical-handler", xth);
|
||||||
|
reader.setProperty("http://xml.org/sax/properties/declaration-handler",xth);
|
||||||
try {
|
try {
|
||||||
saxParser.parse(new InputSource(in));
|
reader.parse(new InputSource(in));
|
||||||
return xth.getResult();
|
return xth.getResult();
|
||||||
} finally {
|
} finally {
|
||||||
in.close();
|
in.close();
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@
|
||||||
package org.x4o.xml.lang;
|
package org.x4o.xml.lang;
|
||||||
|
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -62,27 +63,40 @@ public final class X4OLanguageClassLoader {
|
||||||
public static Class<?> loadClass(String className) throws ClassNotFoundException {
|
public static Class<?> loadClass(String className) throws ClassNotFoundException {
|
||||||
return getClassLoader().loadClass(className);
|
return getClassLoader().loadClass(className);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates new instance of clazz.
|
||||||
|
* @param resultType The result type to cast to..
|
||||||
|
* @param clazz The class to make object from.
|
||||||
|
* @return The object of the clazz.
|
||||||
|
* @throws ClassNotFoundException On any construct access or invoke error.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static <T> T newInstance(Class<T> resultType, Class<?> clazz) throws ClassNotFoundException {
|
||||||
|
return (T) newInstance(clazz);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates new instance of clazz.
|
* Creates new instance of clazz.
|
||||||
* @param clazz The class to make object from.
|
* @param clazz The class to make object from.
|
||||||
* @return The object of the clazz.
|
* @return The object of the clazz.
|
||||||
* @throws InstantiationException When className has no default constructor.
|
* @throws ClassNotFoundException On any construct access or invoke error.
|
||||||
* @throws IllegalAccessException When class loading has security error.
|
|
||||||
*/
|
*/
|
||||||
public static Object newInstance(Class<?> clazz) throws InstantiationException, IllegalAccessException {
|
public static Object newInstance(Class<?> clazz) throws ClassNotFoundException {
|
||||||
return clazz.newInstance();
|
try {
|
||||||
|
return clazz.getConstructor().newInstance();
|
||||||
|
} catch (IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException e) {
|
||||||
|
throw new ClassNotFoundException(e.getMessage(), e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates new instance of className.
|
* Creates new instance of className.
|
||||||
* @param className The className to create object from.
|
* @param className The className to create object from.
|
||||||
* @return The object of the className.
|
* @return The object of the className.
|
||||||
* @throws ClassNotFoundException When className is not found.
|
* @throws ClassNotFoundException When className is not found or can't be created.
|
||||||
* @throws InstantiationException When className has no default constructor.
|
|
||||||
* @throws IllegalAccessException When class loading has security error.
|
|
||||||
*/
|
*/
|
||||||
public static Object newInstance(String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
|
public static Object newInstance(String className) throws ClassNotFoundException {
|
||||||
return newInstance(loadClass(className));
|
return newInstance(loadClass(className));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -103,7 +103,7 @@ public class X4OPhaseLanguageInit {
|
||||||
public void runPhase(X4OLanguageSession languageSession) throws X4OPhaseException {
|
public void runPhase(X4OLanguageSession languageSession) throws X4OPhaseException {
|
||||||
try {
|
try {
|
||||||
//debugPhaseMessage("Loading main language: "+elementLanguage.getLanguage(),this,elementLanguage);
|
//debugPhaseMessage("Loading main language: "+elementLanguage.getLanguage(),this,elementLanguage);
|
||||||
X4OLanguageLoader loader = (X4OLanguageLoader)X4OLanguageClassLoader.newInstance(languageSession.getLanguage().getLanguageConfiguration().getDefaultLanguageLoader());
|
X4OLanguageLoader loader = X4OLanguageClassLoader.newInstance(X4OLanguageLoader.class, languageSession.getLanguage().getLanguageConfiguration().getDefaultLanguageLoader());
|
||||||
loader.loadLanguage((X4OLanguageLocal)languageSession.getLanguage(),languageSession.getLanguage().getLanguageName(),languageSession.getLanguage().getLanguageVersion());
|
loader.loadLanguage((X4OLanguageLocal)languageSession.getLanguage(),languageSession.getLanguage().getLanguageName(),languageSession.getLanguage().getLanguageVersion());
|
||||||
|
|
||||||
if (languageSession.hasX4ODebugWriter()) {
|
if (languageSession.hasX4ODebugWriter()) {
|
||||||
|
|
@ -141,7 +141,7 @@ public class X4OPhaseLanguageInit {
|
||||||
public void runPhase(X4OLanguageSession languageSession) throws X4OPhaseException {
|
public void runPhase(X4OLanguageSession languageSession) throws X4OPhaseException {
|
||||||
try {
|
try {
|
||||||
if (siblingLoaders.isEmpty()==false) {
|
if (siblingLoaders.isEmpty()==false) {
|
||||||
X4OLanguageLoader loader = (X4OLanguageLoader)X4OLanguageClassLoader.newInstance(languageSession.getLanguage().getLanguageConfiguration().getDefaultLanguageLoader());
|
X4OLanguageLoader loader = X4OLanguageClassLoader.newInstance(X4OLanguageLoader.class, languageSession.getLanguage().getLanguageConfiguration().getDefaultLanguageLoader());
|
||||||
for (X4OLanguageModuleLoaderSibling siblingLoader:siblingLoaders) {
|
for (X4OLanguageModuleLoaderSibling siblingLoader:siblingLoaders) {
|
||||||
//debugPhaseMessage("Loading sibling langauge loader: "+siblingLoader,this,elementLanguage);
|
//debugPhaseMessage("Loading sibling langauge loader: "+siblingLoader,this,elementLanguage);
|
||||||
siblingLoader.loadLanguageSibling((X4OLanguageLocal)languageSession.getLanguage(), loader);
|
siblingLoader.loadLanguageSibling((X4OLanguageLocal)languageSession.getLanguage(), loader);
|
||||||
|
|
|
||||||
|
|
@ -277,7 +277,7 @@ public class X4OPhaseLanguageRead {
|
||||||
if (elementNamespaceAttributeComparator==null) {
|
if (elementNamespaceAttributeComparator==null) {
|
||||||
try {
|
try {
|
||||||
elementNamespaceAttributeComparator = (Comparator<ElementNamespaceAttribute>)X4OLanguageClassLoader.newInstance(element.getLanguageSession().getLanguage().getLanguageConfiguration().getDefaultElementNamespaceAttributeComparator());
|
elementNamespaceAttributeComparator = (Comparator<ElementNamespaceAttribute>)X4OLanguageClassLoader.newInstance(element.getLanguageSession().getLanguage().getLanguageConfiguration().getDefaultElementNamespaceAttributeComparator());
|
||||||
} catch (Exception e) {
|
} catch (ClassNotFoundException e) {
|
||||||
throw new X4OPhaseException(this,e);
|
throw new X4OPhaseException(this,e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue