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.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.DefaultX4OLanguageConfiguration;
import org.x4o.xml.lang.X4OLanguage;
@ -51,10 +55,9 @@ import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
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
* @version 1.0 Apr 6, 2013
@ -65,57 +68,53 @@ public final class X4ODriverManager {
private final static X4ODriverManager instance;
private Logger logger = null;
private volatile boolean reloadDrivers = true;
private Map<String,String> classdrivers = null;
private Map<String,String> defaultDrivers = null;
private Map<String,X4ODriver<?>> drivers = null;
private Map<String,X4OLanguageTask> languageTasks = null;
private Map<String, String> classdrivers = null;
private Map<String, String> defaultDrivers = null;
private Map<String, X4ODriver<?>> drivers = null;
private Map<String, X4OLanguageTask> languageTasks = null;
private X4ODriverManager() {
logger = Logger.getLogger(X4ODriverManager.class.getName());
classdrivers = new HashMap<String,String>(10);
defaultDrivers = new HashMap<String,String>(10);
drivers = new HashMap<String,X4ODriver<?>>(10);
languageTasks = new HashMap<String,X4OLanguageTask>(10);
classdrivers = new HashMap<String, String>(10);
defaultDrivers = new HashMap<String, String>(10);
drivers = new HashMap<String, X4ODriver<?>>(10);
languageTasks = new HashMap<String, X4OLanguageTask>(10);
}
static {
instance = new X4ODriverManager();
}
private void registerX4OLanguageTask(String className) {
try {
X4OLanguageTask task = (X4OLanguageTask)X4OLanguageClassLoader.newInstance(className);
X4OLanguageTask task = (X4OLanguageTask) X4OLanguageClassLoader.newInstance(className);
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);
} catch (ClassNotFoundException 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);
throw new IllegalStateException(e.getMessage(), e);
}
}
static public X4OLanguageTask getX4OLanguageTask(String taskId) {
instance.lazyInit(); // fixme
return instance.languageTasks.get(taskId);
}
static public List<X4OLanguageTask> getX4OLanguageTasks() {
instance.lazyInit(); // fixme
return new ArrayList<X4OLanguageTask>(instance.languageTasks.values());
}
static protected String getDefaultLanguageVersion(String[] languages) {
if (languages==null || languages.length==0) {
if (languages == null || languages.length == 0) {
return X4ODriver.DEFAULT_LANGUAGE_VERSION;
}
String languageVersion = languages[languages.length-1];
String languageVersion = languages[languages.length - 1];
return languageVersion;
}
static protected X4OPhaseManager getDefaultBuildPhaseManager() {
DefaultX4OPhaseManager manager = new DefaultX4OPhaseManager();
new X4OPhaseLanguageInit().createPhases(manager);
@ -123,85 +122,61 @@ public final class X4ODriverManager {
new X4OPhaseLanguageWrite().createPhases(manager);
return manager;
}
static protected X4OLanguage getDefaultBuildLanguage(X4ODriver<?> driver,String version) {
if (version==null) {
static protected X4OLanguage getDefaultBuildLanguage(X4ODriver<?> driver, String version) {
if (version == null) {
version = driver.getLanguageVersionDefault();
}
DefaultX4OLanguage result = new DefaultX4OLanguage(
driver.buildLanguageConfiguration(),
driver.buildPhaseManager(),
driver.getLanguageName(),
version
);
DefaultX4OLanguage result = new DefaultX4OLanguage(driver.buildLanguageConfiguration(), driver.buildPhaseManager(), driver.getLanguageName(), version);
try {
result.getPhaseManager().runPhases(result.createLanguageSession(), X4OPhaseType.INIT); // TODO: fix phase to interface T
} catch (X4OPhaseException e) {
throw new RuntimeException(e); //TODO: change layer
throw new RuntimeException(e); // TODO: change layer
}
return result;
}
static protected X4OLanguageConfiguration getDefaultBuildLanguageConfiguration() {
DefaultX4OLanguageConfiguration config = new DefaultX4OLanguageConfiguration();
config.fillDefaults();
X4OLanguageConfiguration result = config.createProxy();
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) {
if (driver==null) {
if (driver == null) {
throw new NullPointerException("Can't register null driver.");
}
if (driver.getLanguageName()==null) {
throw new NullPointerException("Error in driver impl languageName is null in: "+driver.getClass());
if (driver.getLanguageName() == null) {
throw new NullPointerException("Error in driver impl languageName is null in: " + driver.getClass());
}
if (driver.getLanguageName().length()==0) {
throw new IllegalArgumentException("Error in driver impl languageName is empty in: "+driver.getClass());
if (driver.getLanguageName().length() == 0) {
throw new IllegalArgumentException("Error in driver impl languageName is empty in: " + driver.getClass());
}
if (driver.getLanguageVersions()==null) {
throw new NullPointerException("Error in driver impl languageVersions is null in: "+driver.getClass());
if (driver.getLanguageVersions() == null) {
throw new NullPointerException("Error in driver impl languageVersions is null in: " + driver.getClass());
}
if (driver.getLanguageVersions().length==0) {
throw new IllegalArgumentException("Error in driver impl languageVersions is empty in: "+driver.getClass());
if (driver.getLanguageVersions().length == 0) {
throw new IllegalArgumentException("Error in driver impl languageVersions is empty in: " + driver.getClass());
}
instance.drivers.put(driver.getLanguageName(), driver);
}
static public void deregisterX4ODriver(X4ODriver<?> driver) {
if (driver==null) {
if (driver == null) {
throw new NullPointerException("Can't deregister null driver.");
}
if (driver.getLanguageName()==null) {
throw new NullPointerException("Error in driver impl languageName is null in: "+driver.getClass());
if (driver.getLanguageName() == null) {
throw new NullPointerException("Error in driver impl languageName is null in: " + driver.getClass());
}
instance.drivers.remove(driver.getLanguageName());
}
static public X4ODriver<?> getX4ODriver(String language) {
if (language==null) {
if (language == null) {
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.");
}
if (instance.drivers.containsKey(language)) {
@ -209,12 +184,12 @@ public final class X4ODriverManager {
}
instance.lazyInit();
X4ODriver<?> result = instance.createX4ODriver(language);
if (result==null) {
throw new IllegalArgumentException("Can't find driver for language: "+language);
if (result == null) {
throw new IllegalArgumentException("Can't find driver for language: " + language);
}
return result;
}
static public List<String> getX4OLanguages() {
instance.lazyInit();
List<String> result = new ArrayList<String>(10);
@ -223,15 +198,15 @@ public final class X4ODriverManager {
Collections.sort(result);
return result;
}
private void lazyInit() {
if (reloadDrivers==false) {
if (reloadDrivers == false) {
return;
}
instance.loadLanguageDrivers();
reloadDrivers = false;
}
private X4ODriver<?> createX4ODriver(String language) {
String driverClassName = null;
if (classdrivers.containsKey(language)) {
@ -239,71 +214,70 @@ public final class X4ODriverManager {
} else if (defaultDrivers.containsKey(language)) {
driverClassName = defaultDrivers.get(language);
}
if (driverClassName==null) {
if (driverClassName == null) {
return null;
}
try {
Class<?> driverClass = X4OLanguageClassLoader.loadClass(driverClassName);
//Constructor<?> markedConstructor = driverClass.getDeclaredConstructor(new Class[]{ConstructorMarker.class});
//X4ODriver<?> driver = (X4ODriver<?>)markedConstructor.newInstance(new Object[]{new ConstructorMarker()});
X4ODriver<?> driver = (X4ODriver<?>)driverClass.newInstance();
// Constructor<?> markedConstructor = driverClass.getDeclaredConstructor(new Class[]{ConstructorMarker.class});
// X4ODriver<?> driver = (X4ODriver<?>)markedConstructor.newInstance(new Object[]{new ConstructorMarker()});
X4ODriver<?> driver = (X4ODriver<?>) X4OLanguageClassLoader.newInstance(driverClass);
registerX4ODriver(driver);
return driver;
} catch (ClassNotFoundException 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);
throw new IllegalStateException(e.getMessage(), e);
}
}
/*
* Class to make sure all driver instances are created by this manager instance.
final public class ConstructorMarker {
private ConstructorMarker() {
}
}*/
* TODO: Class to make sure all driver instances are created by this manager instance.
*
* final public class ConstructorMarker { private ConstructorMarker() { } }
*/
/**
* Loads all defined language drivers in classpath.
*/
private void loadLanguageDrivers() {
logger.finer("loading x4o drivers from: "+X4O_DRIVERS_RESOURCE);
logger.finer("loading x4o drivers from: " + X4O_DRIVERS_RESOURCE);
try {
Enumeration<URL> e = Thread.currentThread().getContextClassLoader().getResources(X4O_DRIVERS_RESOURCE);
while(e.hasMoreElements()) {
while (e.hasMoreElements()) {
URL u = e.nextElement();
loadDriversXml(u.openStream());
}
e = Thread.currentThread().getContextClassLoader().getResources("/"+X4O_DRIVERS_RESOURCE);
while(e.hasMoreElements()) {
e = Thread.currentThread().getContextClassLoader().getResources("/" + X4O_DRIVERS_RESOURCE);
while (e.hasMoreElements()) {
URL u = e.nextElement();
loadDriversXml(u.openStream());
}
} 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.
* @param in The inputstream to parser.
*
* @param in The inputstream to parser.
* @throws IOException
* @throws SAXException
* @throws ParserConfigurationException
*/
private void loadDriversXml(InputStream in) throws IOException, SAXException {
if (in==null) {
private void loadDriversXml(InputStream in) throws IOException, SAXException, ParserConfigurationException {
if (in == null) {
throw new NullPointerException("Can't parse null input stream");
}
DriversTagHandler xth = new DriversTagHandler();
XMLReader saxParser = XMLReaderFactory.createXMLReader();
saxParser.setContentHandler(xth);
saxParser.setProperty("http://xml.org/sax/properties/lexical-handler", xth);
saxParser.setProperty("http://xml.org/sax/properties/declaration-handler",xth);
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
SAXParser parser = factory.newSAXParser();
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 {
saxParser.parse(new InputSource(in));
reader.parse(new InputSource(in));
} finally {
in.close();
}
@ -311,26 +285,26 @@ public final class X4ODriverManager {
private class DriversTagHandler extends DefaultHandler2 {
@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)) {
String version = attr.getValue("version");
logger.finest("Version attribute: "+version);
logger.finest("Version attribute: " + version);
} else if ("driver".equals(tag)) {
String language = attr.getValue("language");
String className = attr.getValue("className");
logger.finest("Driver className: "+className+" for language: "+language);
if (classdrivers.containsKey(className)==false) {
classdrivers.put(language,className);
logger.finest("Driver className: " + className + " for language: " + language);
if (classdrivers.containsKey(className) == false) {
classdrivers.put(language, className);
}
} else if ("defaultDriver".equals(tag)) {
String language = attr.getValue("language");
logger.finest("DefaultDriver language: "+language);
if (defaultDrivers.containsKey(language)==false) {
defaultDrivers.put(language,language);
logger.finest("DefaultDriver language: " + language);
if (defaultDrivers.containsKey(language) == false) {
defaultDrivers.put(language, language);
}
} else if ("languageTask".equals(tag)) {
String className = attr.getValue("className");
logger.finest("Language task className: "+className);
logger.finest("Language task className: " + className);
X4ODriverManager.instance.registerX4OLanguageTask(className);
}
}

View file

@ -57,7 +57,7 @@ public class ByteConverter extends AbstractStringObjectConverter {
* @throws ObjectConverterException When conversion fails.
*/
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.
*/
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.
*/
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.
*/
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.
*/
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.
*/
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;
try {
Class<?> expressionFactoryClass = X4OLanguageClassLoader.loadClass(EL_FACTORY_IMPL_APACHE);
result = (ExpressionFactory) expressionFactoryClass.newInstance();
} catch (Exception e) {
result = X4OLanguageClassLoader.newInstance(ExpressionFactory.class, expressionFactoryClass);
} catch (ClassNotFoundException e) {
try {
Class<?> expressionFactoryClass = X4OLanguageClassLoader.loadClass(EL_FACTORY_IMPL_ODYSSEUS);
result = (ExpressionFactory) expressionFactoryClass.newInstance();
} catch (Exception ee) {
result = X4OLanguageClassLoader.newInstance(ExpressionFactory.class, expressionFactoryClass);
} 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.");
}
}
return result;
}
static public ELContext createELContext(Class<?> elContextClass) {
ELContext result = null;
static public ELContext createELContext(Class<?> elContextClass) {
try {
result = (ELContext)X4OLanguageClassLoader.newInstance(elContextClass);
} catch (Exception e) {
return X4OLanguageClassLoader.newInstance(ELContext.class, elContextClass);
} catch (ClassNotFoundException 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 {
private Logger logger = null;
private String eldResource = null;
private boolean isEldCore = false;
private final Logger logger;
private final String eldResource;
private final boolean isEldCore;
/** The EL key to access the parent language module. */
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.
*/
public EldModuleLoader(String eldResource,boolean isEldCore) {
if (eldResource==null) {
if (eldResource == null) {
throw new NullPointerException("Can't load null eld resource.");
}
logger = Logger.getLogger(EldModuleLoader.class.getName());
this.eldResource=eldResource;
this.isEldCore=isEldCore;
this.logger = Logger.getLogger(EldModuleLoader.class.getName());
this.eldResource = eldResource;
this.isEldCore = isEldCore;
}
/**
@ -80,8 +80,8 @@ public class EldModuleLoader implements X4OLanguageModuleLoader {
* @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)
*/
public void loadLanguageModule(X4OLanguageLocal language,X4OLanguageModuleLocal languageModule) throws X4OLanguageModuleLoaderException {
logger.fine("Loading name eld file from resource: "+eldResource);
public void loadLanguageModule(X4OLanguageLocal language, X4OLanguageModuleLocal languageModule) throws X4OLanguageModuleLoaderException {
logger.fine("Loading name eld file from resource: " + eldResource);
try {
X4ODriver<?> driver = null;
if (isEldCore) {
@ -97,9 +97,7 @@ public class EldModuleLoader implements X4OLanguageModuleLoader {
reader.addELBeanInstance(EL_PARENT_LANGUAGE, language);
reader.addELBeanInstance(EL_PARENT_LANGUAGE_MODULE, languageModule);
//language.createLanguageSession()
reader.setProperty(DefaultX4OReader.DEBUG_OUTPUT_HANDLER, reader);
reader.setProperty(DefaultX4OReader.DEBUG_OUTPUT_HANDLER, null);
//TODO: if (language.getLanguageConfiguration().getLanguagePropertyBoolean(X4OLanguageProperty.DEBUG_OUTPUT_ELD_PARSER)) {
// eldLang.setX4ODebugWriter(elementLanguage.getLanguageConfiguration().getX4ODebugWriter());

View file

@ -210,21 +210,17 @@ public class EldModuleLoaderCore implements X4OLanguageModuleLoader {
logger.finer("Creating "+language.getLanguageName()+" namespace.");
ElementNamespace namespace;
try {
namespace = (ElementNamespace)X4OLanguageClassLoader.newInstance(language.getLanguageConfiguration().getDefaultElementNamespace());
} catch (InstantiationException e) {
namespace = X4OLanguageClassLoader.newInstance(ElementNamespace.class, language.getLanguageConfiguration().getDefaultElementNamespace());
} catch (ClassNotFoundException e) {
throw new X4OLanguageModuleLoaderException(this,e.getMessage(),e);
} catch (IllegalAccessException e) {
throw new X4OLanguageModuleLoaderException(this,e.getMessage(),e);
}
}
try {
namespace.setElementNamespaceInstanceProvider((ElementNamespaceInstanceProvider)
X4OLanguageClassLoader.newInstance(language.getLanguageConfiguration().getDefaultElementNamespaceInstanceProvider())
namespace.setElementNamespaceInstanceProvider(
X4OLanguageClassLoader.newInstance(ElementNamespaceInstanceProvider.class, language.getLanguageConfiguration().getDefaultElementNamespaceInstanceProvider())
);
} catch (InstantiationException e) {
} catch (ClassNotFoundException e) {
throw new X4OLanguageModuleLoaderException(this,e.getMessage(),e);
} catch (IllegalAccessException e) {
throw new X4OLanguageModuleLoaderException(this,e.getMessage(),e);
}
}
namespace.setId(id);
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 {
try {
ElementClass result = (ElementClass)X4OLanguageClassLoader.newInstance(language.getLanguageConfiguration().getDefaultElementClass());
ElementClass result = X4OLanguageClassLoader.newInstance(ElementClass.class, language.getLanguageConfiguration().getDefaultElementClass());
result.setId(tag);
result.setObjectClass(objectClass);
result.setElementClass(elementClass);
result.setDescription(description);
return result;
} catch (InstantiationException e) {
throw new X4OLanguageModuleLoaderException(this,e.getMessage(),e);
} catch (IllegalAccessException e) {
} catch (ClassNotFoundException 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 {
try {
ElementClassAttribute result = (ElementClassAttribute)X4OLanguageClassLoader.newInstance(language.getLanguageConfiguration().getDefaultElementClassAttribute());
ElementClassAttribute result = X4OLanguageClassLoader.newInstance(ElementClassAttribute.class, language.getLanguageConfiguration().getDefaultElementClassAttribute());
result.setId(name);
if (required) {
result.setRequired(required);
@ -269,9 +263,7 @@ public class EldModuleLoaderCore implements X4OLanguageModuleLoader {
result.setObjectConverter(converter);
}
return result;
} catch (InstantiationException e) {
throw new X4OLanguageModuleLoaderException(this,e.getMessage(),e);
} catch (IllegalAccessException e) {
} catch (ClassNotFoundException e) {
throw new X4OLanguageModuleLoaderException(this,e.getMessage(),e);
}
}

View file

@ -59,7 +59,7 @@ public class BeanElement extends AbstractElement {
try {
Class<?> beanClass = X4OLanguageClassLoader.loadClass(className);
if (constructorArguments.isEmpty()) {
setElementObject(beanClass.newInstance());
setElementObject(X4OLanguageClassLoader.newInstance(beanClass));
} else {
Class<?>[] arguClass = new Class<?>[constructorArguments.size()];
constructorArguments.toArray(arguClass);

View file

@ -131,8 +131,8 @@ public class ElementModuleBindingHandler extends AbstractElementBindingHandler<
}
try {
elementNamespace.setElementNamespaceInstanceProvider((ElementNamespaceInstanceProvider)X4OLanguageClassLoader.newInstance(childElement.getLanguageSession().getLanguage().getLanguageConfiguration().getDefaultElementNamespaceInstanceProvider()));
} catch (Exception e) {
elementNamespace.setElementNamespaceInstanceProvider(X4OLanguageClassLoader.newInstance(ElementNamespaceInstanceProvider.class, childElement.getLanguageSession().getLanguage().getLanguageConfiguration().getDefaultElementNamespaceInstanceProvider()));
} catch (ClassNotFoundException e) {
throw new ElementBindingHandlerException("Error loading: "+e.getMessage(),e);
}
try {

View file

@ -132,10 +132,10 @@ public abstract class AbstractElement implements Element {
*/
public void doCharacters(String characters) throws ElementException {
try {
Element e = (Element)X4OLanguageClassLoader.newInstance(getLanguageSession().getLanguage().getLanguageConfiguration().getDefaultElementBodyCharacters());
Element e = X4OLanguageClassLoader.newInstance(Element.class, getLanguageSession().getLanguage().getLanguageConfiguration().getDefaultElementBodyCharacters());
e.setElementObject(characters);
addChild(e);
} catch (Exception exception) {
} catch (ClassNotFoundException exception) {
throw new ElementException(exception);
}
}
@ -145,10 +145,10 @@ public abstract class AbstractElement implements Element {
*/
public void doComment(String comment) throws ElementException {
try {
Element e = (Element)X4OLanguageClassLoader.newInstance(getLanguageSession().getLanguage().getLanguageConfiguration().getDefaultElementBodyComment());
Element e = X4OLanguageClassLoader.newInstance(Element.class, getLanguageSession().getLanguage().getLanguageConfiguration().getDefaultElementBodyComment());
e.setElementObject(comment);
addChild(e);
} catch (Exception exception) {
} catch (ClassNotFoundException exception) {
throw new ElementException(exception);
}
}
@ -158,10 +158,10 @@ public abstract class AbstractElement implements Element {
*/
public void doIgnorableWhitespace(String space) throws ElementException {
try {
Element e = (Element)X4OLanguageClassLoader.newInstance(getLanguageSession().getLanguage().getLanguageConfiguration().getDefaultElementBodyWhitespace());
Element e = X4OLanguageClassLoader.newInstance(Element.class, getLanguageSession().getLanguage().getLanguageConfiguration().getDefaultElementBodyWhitespace());
e.setElementObject(space);
addChild(e);
} catch (Exception exception) {
} catch (ClassNotFoundException exception) {
throw new ElementException(exception);
}
}

View file

@ -86,13 +86,9 @@ public class DefaultElementNamespaceInstanceProvider implements ElementNamespace
if (elementClass.getObjectClass()!=null) {
element.setElementObject(X4OLanguageClassLoader.newInstance(elementClass.getObjectClass()));
}
} catch (InstantiationException e) {
} catch (ClassNotFoundException 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.setLanguageSession(languageSession);
return element;

View file

@ -29,6 +29,7 @@ import java.io.OutputStream;
import org.x4o.xml.element.Element;
import org.x4o.xml.lang.X4OLanguage;
import org.x4o.xml.lang.X4OLanguageClassLoader;
import org.x4o.xml.lang.X4OLanguageSession;
import org.xml.sax.SAXException;
@ -49,10 +50,8 @@ public abstract class AbstractX4OWriter<T> extends AbstractX4OWriterSession<T> i
X4OLanguageSession context = createLanguageSession();
Element rootElement = null;
try {
rootElement = (Element)context.getLanguage().getLanguageConfiguration().getDefaultElement().newInstance();
} catch (InstantiationException e) {
throw new SAXException(e);
} catch (IllegalAccessException e) {
rootElement = X4OLanguageClassLoader.newInstance(Element.class, context.getLanguage().getLanguageConfiguration().getDefaultElement());
} catch (ClassNotFoundException e) {
throw new SAXException(e);
}
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.X4OLanguageSession;
import org.x4o.xml.lang.X4OLanguageSessionLocal;
import org.x4o.xml.lang.phase.X4OPhaseException;
import org.x4o.xml.lang.phase.X4OPhaseType;
import org.xml.sax.EntityResolver;
import org.xml.sax.ErrorHandler;

View file

@ -64,11 +64,12 @@ import org.xml.sax.helpers.AttributesImpl;
public class DefaultX4OWriter<T> extends AbstractX4OWriter<T> {
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/";
public final static SAX3PropertyConfig DEFAULT_PROPERTY_CONFIG;
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 SCHEMA_PRINT = PROPERTY_CONTEXT_PREFIX+"schema/print";
@ -95,7 +96,7 @@ public class DefaultX4OWriter<T> extends AbstractX4OWriter<T> {
*/
public DefaultX4OWriter(X4OLanguage 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)
*/
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);
addPhaseSkip(X4OPhaseLanguageWrite.WRITE_RELEASE);
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);
}
private AttributeEntryComparator attributeEntryComparator = new AttributeEntryComparator();
private boolean schemaUriPrint;
private String schemaUriRoot;
private void runWrite(X4OLanguageSession languageSession) throws X4OConnectionException {
OutputStream out = (OutputStream)getProperty(OUTPUT_STREAM);
try {
String encoding = getPropertyConfig().getPropertyString(SAX3WriterXml.OUTPUT_ENCODING);
schemaUriPrint = getPropertyConfig().getPropertyBoolean(SCHEMA_PRINT);
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();
if (schemaUriRoot==null) {
if (schemaUriRoot == null) {
String rootUri = findElementUri(root);
ElementNamespace ns = languageSession.getLanguage().findElementNamespace(rootUri);
if (ns!=null) {
if (ns != null) {
schemaUriRoot = ns.getSchemaUri();
}
}
@ -153,9 +151,9 @@ public class DefaultX4OWriter<T> extends AbstractX4OWriter<T> {
}
writer.startDocument();
Map<String,String> prefixes = new HashMap<String,String>();
Map<String, String> prefixes = new HashMap<>();
startPrefixTree(root,prefixes);
for (String uri:prefixes.keySet()) {
for (String uri : prefixes.keySet()) {
String prefix = prefixes.get(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);
if (result.containsKey(elementUri)==false) {
String elementUriPrefix = findNamespacePrefix(element,elementUri);
if (result.containsKey(elementUri) == false) {
String elementUriPrefix = findNamespacePrefix(element, elementUri);
result.put(elementUri, elementUriPrefix);
}
for (Element e:element.getChilderen()) {
for (Element e : element.getChilderen()) {
startPrefixTree(e,result);
}
}
private List<String> getProperties(Class<?> objectClass) {
List<String> result = new ArrayList<String>();
for (Method m:objectClass.getMethods()) {
for (Method m : objectClass.getMethods()) {
Class<?>[] types = m.getParameterTypes();
if (types.length != 0) {
continue;
@ -206,78 +204,81 @@ public class DefaultX4OWriter<T> extends AbstractX4OWriter<T> {
if (m.getName().startsWith("get")==false) {
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);
}
return result;
}
class AttributeEntry {
String id;
String value;
Integer writeOrder;
static final class AttributeEntry {
final String id;
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) {
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);
if (element.getElementClass().getAutoAttributes()!=null && element.getElementClass().getAutoAttributes()==false) {
if (element.getElementClass().getAutoAttributes() != null && element.getElementClass().getAutoAttributes() == false) {
for (ElementClassAttribute eca:element.getElementClass().getElementClassAttributes()) {
if (eca.getRunBeanValue()!=null && eca.getRunBeanValue()==false) {
if (eca.getRunBeanValue() != null && eca.getRunBeanValue() == false) {
continue;
}
Object value = element.getLanguageSession().getElementObjectPropertyValue().getProperty(element.getElementObject(),eca.getId());
if (value==null) {
Object value = element.getLanguageSession().getElementObjectPropertyValue().getProperty(element.getElementObject(), eca.getId());
if (value == null) {
continue;
}
AttributeEntry e = new AttributeEntry();
e.id = eca.getId();
e.value = ""+value;
e.writeOrder = calcOrderNumber(e.id,eca.getWriteOrder());
AttributeEntry e = new AttributeEntry(eca.getId(), ""+value, calcOrderNumber(eca.getId(),eca.getWriteOrder()));
attr.add(e);
}
} else {
for (String p:getProperties(element.getElementObject().getClass())) {
for (String p : getProperties(element.getElementObject().getClass())) {
Integer writeOrder = null;
ElementClassAttribute eca = element.getElementClass().getElementClassAttributeByName(p);
if (eca!=null) {
if (eca != null) {
writeOrder = eca.getWriteOrder();
}
if (eca!=null && eca.getRunBeanValue()!=null && eca.getRunBeanValue()) {
if (eca != null && eca.getRunBeanValue() != null && eca.getRunBeanValue()) {
continue;
}
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);
if (eca!=null && writeOrder==null) {
if (eca != null && writeOrder == null) {
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;
break;
}
}
if (writeValue==false) {
if (writeValue == false) {
continue;
}
// TODO: check attr see reader
Object value = element.getLanguageSession().getElementObjectPropertyValue().getProperty(element.getElementObject(),p);
if (value==null) {
Object value = element.getLanguageSession().getElementObjectPropertyValue().getProperty(element.getElementObject(), p);
if (value == null) {
continue;
}
if (value instanceof List || value instanceof Collection) {
continue; // TODO; filter on type of childeren
}
AttributeEntry e = new AttributeEntry();
e.id = p;
e.value = ""+value;
e.writeOrder = calcOrderNumber(e.id,writeOrder);
AttributeEntry e = new AttributeEntry(p, ""+value, calcOrderNumber(p,writeOrder));
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
Collections.sort(attr, attributeEntryComparator);
for (int i=0;i<attr.size();i++) {
Collections.sort(attr, ATTR_ENTRY_COMPARATOR);
for (int i = 0; i < attr.size(); i++) {
AttributeEntry a = attr.get(i);
atts.addAttribute ("", a.id, "", "", a.value);
}
@ -300,41 +301,41 @@ public class DefaultX4OWriter<T> extends AbstractX4OWriter<T> {
// Write Element tree recursive.
String elementUri = findElementUri(element);
writer.startElement(elementUri, element.getElementClass().getId(), "", atts);
for (Element e:element.getChilderen()) {
writeTree(writer,e,false);
for (Element e : element.getChilderen()) {
writeTree(writer, e, false);
}
writer.endElement(elementUri, element.getElementClass().getId(), "");
}
// TODO: move to defaults layer so visible in docs.
private Integer calcOrderNumber(String name,Integer orderNumberOverride) {
if (orderNumberOverride!=null) {
private Integer calcOrderNumber(String name, Integer orderNumberOverride) {
if (orderNumberOverride != null) {
return orderNumberOverride;
}
if (name==null) {
if (name == null) {
throw new NullPointerException("Can't calculate order of null name.");
}
int nameSize = name.length();
if (nameSize==1) {
if (nameSize == 1) {
return (name.charAt(0) * 1000);
}
if (nameSize==2) {
if (nameSize == 2) {
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);
}
if (nameSize>3) {
if (nameSize > 3) {
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.");
}
private String findElementUri(Element e) {
for (X4OLanguageModule mod:e.getLanguageSession().getLanguage().getLanguageModules()) {
for (ElementNamespace c:mod.getElementNamespaces()) {
for (X4OLanguageModule mod : e.getLanguageSession().getLanguage().getLanguageModules()) {
for (ElementNamespace c : mod.getElementNamespaces()) {
ElementClass ec = c.getElementClass(e.getElementClass().getId());
if (ec!=null) {
if (ec != null) {
return c.getUri();
}
}
@ -342,9 +343,9 @@ public class DefaultX4OWriter<T> extends AbstractX4OWriter<T> {
return null;
}
private String findNamespacePrefix(Element e,String uri) {
private String findNamespacePrefix(Element e, String uri) {
ElementNamespace ns = e.getLanguageSession().getLanguage().findElementNamespace(uri);
if (ns.getPrefixMapping()!=null) {
if (ns.getPrefixMapping() != null) {
return ns.getPrefixMapping();
}
return ns.getId();

View file

@ -29,7 +29,6 @@ import org.x4o.xml.lang.X4OLanguageSession;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
import java.io.IOException;
import java.io.InputStream;
@ -38,6 +37,10 @@ import java.util.HashMap;
import java.util.List;
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.
*
@ -56,7 +59,7 @@ public class X4OContentParser {
return propertyConfig;
}
public void parse(X4OLanguageSession languageSession) throws SAXException, IOException {
public void parse(X4OLanguageSession languageSession) throws SAXException, IOException, ParserConfigurationException {
// Group debug config property messages
if (languageSession.hasX4ODebugWriter()) {
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
//XMLParserConfiguration config = new XIncludeAwareParserConfiguration();
//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
X4OContentHandler xth = new X4OContentHandler(languageSession,getPropertyConfig());
XMLReader saxParser = XMLReaderFactory.createXMLReader();
saxParser.setErrorHandler(new X4OErrorHandler(languageSession,getPropertyConfig()));
saxParser.setEntityResolver(new X4OEntityResolver(languageSession,getPropertyConfig()));
saxParser.setContentHandler(xth);
saxParser.setProperty("http://xml.org/sax/properties/lexical-handler", xth);
saxParser.setProperty("http://xml.org/sax/properties/declaration-handler",xth);
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
SAXParser parser = factory.newSAXParser();
XMLReader reader = parser.getXMLReader();
reader.setErrorHandler(new X4OErrorHandler(languageSession,getPropertyConfig()));
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
Map<String,Object> saxParserProperties = getSAXParserProperties(languageSession);
for (Map.Entry<String,Object> entry:saxParserProperties.entrySet()) {
String name = entry.getKey();
Object value= entry.getValue();
saxParser.setProperty(name, value);
reader.setProperty(name, value);
debugMessage("property",name,value,languageSession);
}
Map<String,Object> saxParserPropertiesOptional = getSAXParserPropertiesOptional(languageSession);
@ -98,7 +104,7 @@ public class X4OContentParser {
String name = entry.getKey();
Object value= entry.getValue();
try {
saxParser.setProperty(name, value);
reader.setProperty(name, value);
debugMessage("optional-property",name,value,languageSession);
} catch (SAXException e) {
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);
for (String key:features.keySet()) {
Boolean value=features.get(key);
saxParser.setFeature(key, value);
reader.setFeature(key, value);
debugMessage("feature",key,value,languageSession);
}
Map<String, Boolean> featuresOptional = getSAXParserFeaturesOptional(languageSession);
for (String key:featuresOptional.keySet()) {
Boolean value=featuresOptional.get(key);
try {
saxParser.setFeature(key, value);
reader.setFeature(key, value);
debugMessage("optional-feature",key,value,languageSession);
} catch (SAXException e) {
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
List<String> requiredFeatures = getSAXParserFeaturesRequired(languageSession);
for (String requiredFeature:requiredFeatures) {
if (saxParser.getFeature(requiredFeature)==false) {
if (reader.getFeature(requiredFeature)==false) {
throw new IllegalStateException("Missing required feature: "+requiredFeature);
}
debugMessage("required",requiredFeature,"true",languageSession);
@ -153,7 +159,7 @@ public class X4OContentParser {
}
try {
saxParser.parse(input);
reader.parse(input);
} finally {
if (inputStream!=null) {
inputStream.close();

View file

@ -176,7 +176,7 @@ public class X4ODebugWriter {
StringBuilder buf = new StringBuilder();
buf.append("0x");
for (char c:newline.toCharArray()) {
Integer i = new Integer(c);
Integer i = Integer.valueOf(c);
if (i<16) {
buf.append('0');
}

View file

@ -48,30 +48,30 @@ import org.x4o.xml.lang.phase.X4OPhaseManager;
*/
public class DefaultX4OLanguage implements X4OLanguageLocal {
private Logger logger = null;
private X4OLanguageConfiguration languageConfiguration = null;
private List<X4OLanguageModule> elementLanguageModules = null;
private String languageName = null;
private String languageVersion = null;
private X4OPhaseManager phaseManager = null;
private Map<String,ElementNamespace> keyedNamespaceLookup = null;
public DefaultX4OLanguage(X4OLanguageConfiguration languageConfiguration,X4OPhaseManager phaseManager,String languageName,String languageVersion) {
if (languageName==null) {
private final Logger logger;
private final X4OLanguageConfiguration languageConfiguration;
private final List<X4OLanguageModule> elementLanguageModules;
private final String languageName;
private final String languageVersion;
private final X4OPhaseManager phaseManager;
private final Map<String, ElementNamespace> keyedNamespaceLookup;
public DefaultX4OLanguage(X4OLanguageConfiguration languageConfiguration, X4OPhaseManager phaseManager, String languageName, String languageVersion) {
if (languageName == null) {
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.");
}
logger = Logger.getLogger(DefaultX4OLanguage.class.getName());
elementLanguageModules = new ArrayList<X4OLanguageModule>(20);
keyedNamespaceLookup = new HashMap<String,ElementNamespace>(20);
this.languageConfiguration=languageConfiguration;
this.languageName=languageName;
this.languageVersion=languageVersion;
this.phaseManager=phaseManager;
this.logger = Logger.getLogger(DefaultX4OLanguage.class.getName());
this.elementLanguageModules = new ArrayList<X4OLanguageModule>(20);
this.keyedNamespaceLookup = new HashMap<String, ElementNamespace>(20);
this.languageConfiguration = languageConfiguration;
this.languageName = languageName;
this.languageVersion = languageVersion;
this.phaseManager = phaseManager;
}
/**
* @see org.x4o.xml.lang.X4OLanguage#getLanguageName()
*/
@ -85,7 +85,7 @@ public class DefaultX4OLanguage implements X4OLanguageLocal {
public String getLanguageVersion() {
return languageVersion;
}
/**
* @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)
*/
public void addLanguageModule(X4OLanguageModule elementLanguageModule) {
if (elementLanguageModule.getId()==null) {
if (elementLanguageModule.getId() == null) {
throw new NullPointerException("Can't add module without id.");
}
for (X4OLanguageModule mod:elementLanguageModules) {
for (X4OLanguageModule mod : elementLanguageModules) {
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);
for (ElementNamespace ns:elementLanguageModule.getElementNamespaces()) {
for (ElementNamespace ns : elementLanguageModule.getElementNamespaces()) {
keyedNamespaceLookup.put(ns.getUri(), ns);
}
}
/**
* @see org.x4o.xml.lang.X4OLanguage#getLanguageModules()
*/
public Collection<X4OLanguageModule> getLanguageModules() {
return elementLanguageModules;
}
/**
* @see org.x4o.xml.lang.X4OLanguage#createLanguageSession()
*/
@ -134,22 +133,25 @@ public class DefaultX4OLanguage implements X4OLanguageLocal {
return result;
}
protected X4OLanguageSession buildElementLanguage(X4OLanguageSessionLocal languageSession) {
protected X4OLanguageSession buildElementLanguage(X4OLanguageSessionLocal languageSession) {
try {
if (languageSession.getExpressionLanguageFactory()==null) {
if (languageSession.getExpressionLanguageFactory() == null) {
languageSession.setExpressionLanguageFactory(X4OExpressionFactory.createExpressionFactory());
}
if (languageSession.getExpressionLanguageContext()==null) {
languageSession.setExpressionLanguageContext(X4OExpressionFactory.createELContext(languageSession.getLanguage().getLanguageConfiguration().getDefaultExpressionLanguageContext()));
if (languageSession.getExpressionLanguageContext() == null) {
languageSession.setExpressionLanguageContext(
X4OExpressionFactory.createELContext(languageSession.getLanguage().getLanguageConfiguration().getDefaultExpressionLanguageContext()));
}
if (languageSession.getElementAttributeValueParser()==null) {
languageSession.setElementAttributeValueParser((ElementAttributeValueParser)X4OLanguageClassLoader.newInstance(getLanguageConfiguration().getDefaultElementAttributeValueParser()));
if (languageSession.getElementAttributeValueParser() == null) {
languageSession.setElementAttributeValueParser(X4OLanguageClassLoader.newInstance(ElementAttributeValueParser.class,
getLanguageConfiguration().getDefaultElementAttributeValueParser()));
}
if (languageSession.getElementObjectPropertyValue()==null) {
languageSession.setElementObjectPropertyValue((ElementObjectPropertyValue)X4OLanguageClassLoader.newInstance(getLanguageConfiguration().getDefaultElementObjectPropertyValue()));
if (languageSession.getElementObjectPropertyValue() == null) {
languageSession.setElementObjectPropertyValue(X4OLanguageClassLoader.newInstance(ElementObjectPropertyValue.class,
getLanguageConfiguration().getDefaultElementObjectPropertyValue()));
}
} catch (Exception e) {
throw new RuntimeException(e.getMessage(),e);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e.getMessage(), e);
}
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)
*/
public Element createElementInstance(X4OLanguageSession context,Class<?> objectClass) {
for (X4OLanguageModule modContext:getLanguageModules()) {
for (ElementNamespace nsContext:modContext.getElementNamespaces()) {
for (ElementClass ec:nsContext.getElementClasses()) {
if (ec.getObjectClass()!=null && ec.getObjectClass().equals(objectClass)) {
public Element createElementInstance(X4OLanguageSession context, Class<?> objectClass) {
for (X4OLanguageModule modContext : getLanguageModules()) {
for (ElementNamespace nsContext : modContext.getElementNamespaces()) {
for (ElementClass ec : nsContext.getElementClasses()) {
if (ec.getObjectClass() != null && ec.getObjectClass().equals(objectClass)) {
try {
return nsContext.getElementNamespaceInstanceProvider().createElementInstance(context, ec.getId());
} 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) {
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);
findElementBindingHandlerInList(parent,null,result,module.getElementBindingHandlers(),false);
findElementBindingHandlerInList(parent, null, result, module.getElementBindingHandlers(), false);
}
return result;
}
@ -189,37 +191,38 @@ public class DefaultX4OLanguage implements X4OLanguageLocal {
/**
* @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);
for (int i=0;i<elementLanguageModules.size();i++) {
for (int i = 0; i < elementLanguageModules.size(); i++) {
X4OLanguageModule module = elementLanguageModules.get(i);
findElementBindingHandlerInList(parent,child,result,module.getElementBindingHandlers(),true);
findElementBindingHandlerInList(parent, child, result, module.getElementBindingHandlers(), true);
}
return result;
}
private void findElementBindingHandlerInList(Object parent,Object child,List<ElementBindingHandler> result,List<ElementBindingHandler> checkList,boolean checkChild) {
for (ElementBindingHandler binding:checkList) {
private void findElementBindingHandlerInList(Object parent, Object child, List<ElementBindingHandler> result, List<ElementBindingHandler> checkList,
boolean checkChild) {
for (ElementBindingHandler binding : checkList) {
boolean parentBind = false;
if (parent instanceof Class) {
parentBind = binding.getBindParentClass().isAssignableFrom((Class<?>)parent);
parentBind = binding.getBindParentClass().isAssignableFrom((Class<?>) parent);
} else {
parentBind = binding.getBindParentClass().isInstance(parent);
}
if (parentBind==false) {
if (parentBind == false) {
continue;
}
if (checkChild==false) {
if (checkChild == false) {
result.add(binding); // All all handlers for parent only
continue;
}
boolean childBind = false;
for (Class<?> childClass:binding.getBindChildClasses()) {
if (child instanceof Class && childClass.isAssignableFrom((Class<?>)child)) {
childBind=true;
break;
for (Class<?> childClass : binding.getBindChildClasses()) {
if (child instanceof Class && childClass.isAssignableFrom((Class<?>) child)) {
childBind = true;
break;
} else if (childClass.isInstance(child)) {
childBind=true;
childBind = true;
break;
}
}
@ -228,25 +231,25 @@ public class DefaultX4OLanguage implements X4OLanguageLocal {
}
}
}
/**
* @see org.x4o.xml.lang.X4OLanguage#findElementInterfaces(java.lang.Object)
*/
public List<ElementInterface> findElementInterfaces(Object elementObject) {
if (elementObject==null) {
if (elementObject == null) {
throw new NullPointerException("Can't search for null object.");
}
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);
for (ElementInterface ei:module.getElementInterfaces()) {
for (ElementInterface ei : module.getElementInterfaces()) {
Class<?> eClass = ei.getInterfaceClass();
logger.finest("Checking interface handler: "+ei+" for class: "+eClass);
if (elementObject instanceof Class && eClass.isAssignableFrom((Class<?>)elementObject)) {
logger.finer("Found interface match from class; "+elementObject);
logger.finest("Checking interface handler: " + ei + " for class: " + eClass);
if (elementObject instanceof Class && eClass.isAssignableFrom((Class<?>) elementObject)) {
logger.finer("Found interface match from class; " + elementObject);
result.add(ei);
} else if (eClass.isInstance(elementObject)) {
logger.finer("Found interface match from object; "+elementObject);
logger.finer("Found interface match from object; " + elementObject);
result.add(ei);
}
}

View file

@ -31,6 +31,10 @@ import java.util.Enumeration;
import java.util.List;
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.EldModuleLoader;
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.XMLReader;
import org.xml.sax.ext.DefaultHandler2;
import org.xml.sax.helpers.XMLReaderFactory;
/**
* DefaultX4OLanguageLoader loads the modules of language.
@ -101,7 +104,7 @@ TODO: if (language.getLanguageConfiguration().hasX4ODebugWriter()) {
}
for (String value:versionedResources.moduleLoaders) {
try {
loader = (X4OLanguageModuleLoader)X4OLanguageClassLoader.loadClass(value).newInstance();
loader = (X4OLanguageModuleLoader)X4OLanguageClassLoader.newInstance(value);
} catch (Exception 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) {
try {
loader = (X4OLanguageModuleLoader)X4OLanguageClassLoader.loadClass(value).newInstance();
loader = (X4OLanguageModuleLoader)X4OLanguageClassLoader.newInstance(value);
} catch (Exception 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());
X4OLanguageVersionFilter lvf;
try {
lvf = (X4OLanguageVersionFilter)X4OLanguageClassLoader.newInstance(languageLocal.getLanguageConfiguration().getDefaultLanguageVersionFilter());
} catch (InstantiationException e) {
throw new X4OLanguageLoaderException(e);
} catch (IllegalAccessException e) {
lvf = X4OLanguageClassLoader.newInstance(X4OLanguageVersionFilter.class, languageLocal.getLanguageConfiguration().getDefaultLanguageVersionFilter());
} catch (ClassNotFoundException e) {
throw new X4OLanguageLoaderException(e);
}
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 {
X4OLanguageModuleLocal module;
try {
module = (X4OLanguageModuleLocal)X4OLanguageClassLoader.newInstance(languageLocal.getLanguageConfiguration().getDefaultElementLanguageModule());
} catch (InstantiationException e) {
throw new X4OLanguageLoaderException(e);
} catch (IllegalAccessException e) {
module = X4OLanguageClassLoader.newInstance(X4OLanguageModuleLocal.class, languageLocal.getLanguageConfiguration().getDefaultElementLanguageModule());
} catch (ClassNotFoundException e) {
throw new X4OLanguageLoaderException(e);
}
logMessage(languageLocal,"Created module: "+module);
@ -236,9 +235,7 @@ TODO: if (language.getLanguageConfiguration().hasX4ODebugWriter()) {
result.addAll(loadLanguageModulesXml(u.openStream(),u.toString()));
}
return result;
} catch (IOException e) {
throw new X4OLanguageLoaderException(e);
} catch (SAXException e) {
} catch (IOException | SAXException | ParserConfigurationException e) {
throw new X4OLanguageLoaderException(e);
}
}
@ -248,18 +245,22 @@ TODO: if (language.getLanguageConfiguration().hasX4ODebugWriter()) {
* @param in The inputstream to parser.
* @throws IOException
* @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) {
throw new NullPointerException("Can't parse null input stream");
}
ModulesTagHandler xth = new ModulesTagHandler(loadedFrom);
XMLReader saxParser = XMLReaderFactory.createXMLReader();
saxParser.setContentHandler(xth);
saxParser.setProperty("http://xml.org/sax/properties/lexical-handler", xth);
saxParser.setProperty("http://xml.org/sax/properties/declaration-handler",xth);
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
SAXParser parser = factory.newSAXParser();
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 {
saxParser.parse(new InputSource(in));
reader.parse(new InputSource(in));
return xth.getResult();
} finally {
in.close();

View file

@ -23,6 +23,7 @@
package org.x4o.xml.lang;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
/**
@ -62,27 +63,40 @@ public final class X4OLanguageClassLoader {
public static Class<?> loadClass(String className) throws ClassNotFoundException {
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.
* @param clazz The class to make object from.
* @return The object of the clazz.
* @throws InstantiationException When className has no default constructor.
* @throws IllegalAccessException When class loading has security error.
* @throws ClassNotFoundException On any construct access or invoke error.
*/
public static Object newInstance(Class<?> clazz) throws InstantiationException, IllegalAccessException {
return clazz.newInstance();
public static Object newInstance(Class<?> clazz) throws ClassNotFoundException {
try {
return clazz.getConstructor().newInstance();
} catch (IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException e) {
throw new ClassNotFoundException(e.getMessage(), e);
}
}
/**
* Creates new instance of className.
* @param className The className to create object from.
* @return The object of the className.
* @throws ClassNotFoundException When className is not found.
* @throws InstantiationException When className has no default constructor.
* @throws IllegalAccessException When class loading has security error.
* @throws ClassNotFoundException When className is not found or can't be created.
*/
public static Object newInstance(String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
public static Object newInstance(String className) throws ClassNotFoundException {
return newInstance(loadClass(className));
}

View file

@ -103,7 +103,7 @@ public class X4OPhaseLanguageInit {
public void runPhase(X4OLanguageSession languageSession) throws X4OPhaseException {
try {
//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());
if (languageSession.hasX4ODebugWriter()) {
@ -141,7 +141,7 @@ public class X4OPhaseLanguageInit {
public void runPhase(X4OLanguageSession languageSession) throws X4OPhaseException {
try {
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) {
//debugPhaseMessage("Loading sibling langauge loader: "+siblingLoader,this,elementLanguage);
siblingLoader.loadLanguageSibling((X4OLanguageLocal)languageSession.getLanguage(), loader);

View file

@ -277,7 +277,7 @@ public class X4OPhaseLanguageRead {
if (elementNamespaceAttributeComparator==null) {
try {
elementNamespaceAttributeComparator = (Comparator<ElementNamespaceAttribute>)X4OLanguageClassLoader.newInstance(element.getLanguageSession().getLanguage().getLanguageConfiguration().getDefaultElementNamespaceAttributeComparator());
} catch (Exception e) {
} catch (ClassNotFoundException e) {
throw new X4OPhaseException(this,e);
}
}