X4O: Some java cleanup and using new sax parser factory lookup

This commit is contained in:
Willem Cazander 2025-11-06 21:27:47 +01:00
parent ec8711df9c
commit 889e4b9eb8
24 changed files with 346 additions and 365 deletions

View file

@ -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);
} }
} }

View file

@ -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);
} }
/** /**

View file

@ -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));
} }
/** /**

View file

@ -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);
} }
/** /**

View file

@ -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);
} }
/** /**

View file

@ -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);
} }
/** /**

View file

@ -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);
} }
/** /**

View file

@ -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;
} }
} }

View file

@ -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());

View file

@ -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);
} }
} }

View file

@ -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);

View file

@ -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 {

View file

@ -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);
} }
} }

View file

@ -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;

View file

@ -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);

View file

@ -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;

View file

@ -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();

View file

@ -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();

View file

@ -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');
} }

View file

@ -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);
} }
} }

View file

@ -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();

View file

@ -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));
} }

View file

@ -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);

View file

@ -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);
} }
} }