From 0dae330e72260fe77964d270d50c13fdefb6ce41 Mon Sep 17 00:00:00 2001 From: Robert von Burg Date: Mon, 3 Mar 2014 23:32:33 +0100 Subject: [PATCH] [Major] Multiple issues - setId() and setName() don't allow empty values - added Locator.newBuilder(String) - fixed wrong locator created by ParameterizedElement - Better exception handling when parsing from XML as Sax --- .../strolch/model/AbstractStrolchElement.java | 18 +++-- src/main/java/li/strolch/model/Locator.java | 12 +++ .../strolch/model/ParameterizedElement.java | 1 - .../model/xml/ResourceToSaxVisitor.java | 3 +- .../strolch/model/xml/XmlModelSaxReader.java | 77 ++++++++++--------- 5 files changed, 67 insertions(+), 44 deletions(-) diff --git a/src/main/java/li/strolch/model/AbstractStrolchElement.java b/src/main/java/li/strolch/model/AbstractStrolchElement.java index 0718f538d..a2d4c000a 100644 --- a/src/main/java/li/strolch/model/AbstractStrolchElement.java +++ b/src/main/java/li/strolch/model/AbstractStrolchElement.java @@ -22,6 +22,8 @@ import li.strolch.model.Locator.LocatorBuilder; import org.w3c.dom.Element; +import ch.eitchnet.utils.helper.StringHelper; + /** * @author Robert von Burg */ @@ -70,12 +72,11 @@ public abstract class AbstractStrolchElement implements StrolchElement { @Override public void setId(String id) { - if (id == null) - throw new StrolchException("The id may never be null"); //$NON-NLS-1$ - - if (id.isEmpty()) - throw new StrolchException("The id may never be empty"); //$NON-NLS-1$ - + if (StringHelper.isEmpty(id)) { + String msg = "The id may never be empty for {0}"; + msg = MessageFormat.format(msg, getClass().getSimpleName()); + throw new StrolchException(msg); + } this.id = id; } @@ -86,6 +87,11 @@ public abstract class AbstractStrolchElement implements StrolchElement { @Override public void setName(String name) { + if (StringHelper.isEmpty(name)) { + String msg = "The name may never be empty for {0} with id {1}"; + msg = MessageFormat.format(msg, getClass().getSimpleName(), id); + throw new StrolchException(msg); + } this.name = name; } diff --git a/src/main/java/li/strolch/model/Locator.java b/src/main/java/li/strolch/model/Locator.java index 31f50528c..9e4a5e3e9 100644 --- a/src/main/java/li/strolch/model/Locator.java +++ b/src/main/java/li/strolch/model/Locator.java @@ -243,6 +243,18 @@ public class Locator { return new Locator(locatorPath); } + /** + * Creates a new {@link LocatorBuilder} instance and appends the given root element tag to it + * + * @param rootElement + * the first element on the {@link Locator} + * + * @return a new {@link LocatorBuilder} instance with the given root element tag as the first element + */ + public static LocatorBuilder newBuilder(String rootElement) { + return new LocatorBuilder().append(rootElement); + } + /** * {@link LocatorBuilder} is used to build {@link Locator}s where a deep hierarchy is to be created. The * {@link #append(String)} method returns itself for chain building diff --git a/src/main/java/li/strolch/model/ParameterizedElement.java b/src/main/java/li/strolch/model/ParameterizedElement.java index 5f1d6e72e..30b2f4c20 100644 --- a/src/main/java/li/strolch/model/ParameterizedElement.java +++ b/src/main/java/li/strolch/model/ParameterizedElement.java @@ -189,7 +189,6 @@ public abstract class ParameterizedElement extends AbstractStrolchElement { @Override public Locator getLocator() { LocatorBuilder lb = new LocatorBuilder(); - this.parent.fillLocator(lb); fillLocator(lb); return lb.build(); } diff --git a/src/main/java/li/strolch/model/xml/ResourceToSaxVisitor.java b/src/main/java/li/strolch/model/xml/ResourceToSaxVisitor.java index 3bafed894..5e10dab32 100644 --- a/src/main/java/li/strolch/model/xml/ResourceToSaxVisitor.java +++ b/src/main/java/li/strolch/model/xml/ResourceToSaxVisitor.java @@ -22,7 +22,6 @@ import li.strolch.model.ResourceVisitor; import li.strolch.model.Tags; import org.xml.sax.ContentHandler; -import org.xml.sax.SAXException; /** * @author Robert von Burg @@ -41,7 +40,7 @@ public class ResourceToSaxVisitor extends StrolchElementToDomVisitor implements toSax(res); this.contentHandler.endElement(null, null, Tags.RESOURCE); - } catch (SAXException e) { + } catch (Exception e) { String msg = "Failed to transform Resource {0} to XML due to {1}"; //$NON-NLS-1$ msg = MessageFormat.format(msg, res.getLocator(), e.getMessage()); throw new RuntimeException(msg, e); diff --git a/src/main/java/li/strolch/model/xml/XmlModelSaxReader.java b/src/main/java/li/strolch/model/xml/XmlModelSaxReader.java index cca74afa0..a1efba98b 100644 --- a/src/main/java/li/strolch/model/xml/XmlModelSaxReader.java +++ b/src/main/java/li/strolch/model/xml/XmlModelSaxReader.java @@ -20,6 +20,7 @@ import static ch.eitchnet.utils.helper.StringHelper.NULL; import java.text.MessageFormat; import java.util.Date; +import li.strolch.exception.StrolchException; import li.strolch.model.GroupedParameterizedElement; import li.strolch.model.Order; import li.strolch.model.ParameterBag; @@ -122,42 +123,48 @@ public class XmlModelSaxReader extends DefaultHandler { String paramValue = attributes.getValue(Tags.VALUE); String paramHiddenS = attributes.getValue(Tags.HIDDEN); String paramIndexS = attributes.getValue(Tags.INDEX); - int index = StringHelper.isEmpty(paramIndexS) ? 0 : Integer.valueOf(paramIndexS); - boolean paramHidden = StringHelper.isEmpty(paramHiddenS) ? false : StringHelper.parseBoolean(paramHiddenS); - String paramUom = attributes.getValue(Tags.UOM); - String paramInterpretation = attributes.getValue(Tags.INTERPRETATION); - Parameter param; - switch (paramType) { - case StringParameter.TYPE: - param = new StringParameter(paramId, paramName, paramValue); - break; - case IntegerParameter.TYPE: - param = new IntegerParameter(paramId, paramName, IntegerParameter.parseFromString(paramValue)); - break; - case BooleanParameter.TYPE: - param = new BooleanParameter(paramId, paramName, BooleanParameter.parseFromString(paramValue)); - break; - case LongParameter.TYPE: - param = new LongParameter(paramId, paramName, LongParameter.parseFromString(paramValue)); - break; - case DateParameter.TYPE: - param = new DateParameter(paramId, paramName, DateParameter.parseFromString(paramValue)); - break; - case StringListParameter.TYPE: - param = new StringListParameter(paramId, paramName, StringListParameter.parseFromString(paramValue)); - break; - case FloatParameter.TYPE: - param = new FloatParameter(paramId, paramName, FloatParameter.parseFromString(paramValue)); - break; - default: - throw new UnsupportedOperationException(MessageFormat.format( - "Parameters of type {0} are not supported!", paramType)); //$NON-NLS-1$ + try { + int index = StringHelper.isEmpty(paramIndexS) ? 0 : Integer.valueOf(paramIndexS); + boolean paramHidden = StringHelper.isEmpty(paramHiddenS) ? false : StringHelper + .parseBoolean(paramHiddenS); + String paramUom = attributes.getValue(Tags.UOM); + String paramInterpretation = attributes.getValue(Tags.INTERPRETATION); + Parameter param; + switch (paramType) { + case StringParameter.TYPE: + param = new StringParameter(paramId, paramName, paramValue); + break; + case IntegerParameter.TYPE: + param = new IntegerParameter(paramId, paramName, IntegerParameter.parseFromString(paramValue)); + break; + case BooleanParameter.TYPE: + param = new BooleanParameter(paramId, paramName, BooleanParameter.parseFromString(paramValue)); + break; + case LongParameter.TYPE: + param = new LongParameter(paramId, paramName, LongParameter.parseFromString(paramValue)); + break; + case DateParameter.TYPE: + param = new DateParameter(paramId, paramName, DateParameter.parseFromString(paramValue)); + break; + case StringListParameter.TYPE: + param = new StringListParameter(paramId, paramName, StringListParameter.parseFromString(paramValue)); + break; + case FloatParameter.TYPE: + param = new FloatParameter(paramId, paramName, FloatParameter.parseFromString(paramValue)); + break; + default: + throw new UnsupportedOperationException(MessageFormat.format( + "Parameters of type {0} are not supported!", paramType)); //$NON-NLS-1$ + } + param.setHidden(paramHidden); + param.setUom(paramUom); + param.setInterpretation(paramInterpretation); + param.setIndex(index); + this.pBag.addParameter(param); + } catch (Exception e) { + throw new StrolchException("Failed to instantiate parameter " + paramId + " for bag " + + this.pBag.getLocator() + " due to " + e.getMessage(), e); } - param.setHidden(paramHidden); - param.setUom(paramUom); - param.setInterpretation(paramInterpretation); - param.setIndex(index); - this.pBag.addParameter(param); break; default: