From 0f42f1e75d8c6cfd867902f410e3f6e585afd486 Mon Sep 17 00:00:00 2001 From: wow-such-code Date: Tue, 24 Jul 2018 15:28:14 +0200 Subject: [PATCH 01/12] add latest parent pom --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 40f6a52..15c2a92 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ life.qbic parent-pom - 1.0.0 + 1.2.0 life.qbic From 72d2c9b679b76bdc026523d86eb3d0b519ebd4c2 Mon Sep 17 00:00:00 2001 From: wow-such-code Date: Tue, 24 Jul 2018 15:29:15 +0200 Subject: [PATCH 02/12] new version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 15c2a92..3622b24 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ life.qbic xml-manager-lib jar - 1.0.0 + 1.0.1 XML Property Parser Library http://maven.apache.org From 483cb0706e1c91b2ab83e0520083f94d69e6e72e Mon Sep 17 00:00:00 2001 From: Luis de la Garza Date: Wed, 17 Oct 2018 15:20:52 +0200 Subject: [PATCH 03/12] Release/1.2.0 (#1) * prepare next development version * remove deprecated class * new snapshot version: test of new model and parser * more testing * add hashcode and equals functions * easier validation, proper logging * check for empty factors, add xml validator, fix: factor values were not properly created * add unit tests and schema resource * unstable update * renamed and added update functionality * formatting * add tests * update methods, slight restructuring * new constructor * add test * set deprecated * updating factor levels will now remove identifiers from old factor levels * add setter for value field * add test * add functionality to return all factos and properties for a single sample * add functionality to keep technology types without attached sample ids --- pom.xml | 12 +- .../life/qbic/xml/manager/StudyXMLParser.java | 360 ++++++++++++++ .../java/life/qbic/xml/manager/XMLParser.java | 1 + .../life/qbic/xml/manager/XMLValidator.java | 85 +--- .../java/life/qbic/xml/properties/Factor.java | 50 -- .../life/qbic/xml/properties/Property.java | 4 + .../java/life/qbic/xml/properties/Unit.java | 174 +++---- .../life/qbic/xml/study/ObjectFactory.java | 103 ++++ .../life/qbic/xml/study/Qcategorical.java | 202 ++++++++ .../java/life/qbic/xml/study/Qcatlevel.java | 138 ++++++ .../java/life/qbic/xml/study/Qcontinuous.java | 238 ++++++++++ .../java/life/qbic/xml/study/Qcontlevel.java | 127 +++++ .../java/life/qbic/xml/study/Qexperiment.java | 216 +++++++++ .../java/life/qbic/xml/study/Qfactors.java | 225 +++++++++ .../java/life/qbic/xml/study/Qproperty.java | 189 ++++++++ .../life/qbic/xml/study/TechnologyType.java | 144 ++++++ src/main/java/life/qbic/xml/study/binding.xml | 6 + .../java/life/qbic/xml/study/qproperties.xsd | 62 +++ .../life/qbic/xml/manager/qproperties.xsd | 78 +++ .../qbic/xml/manager/HistoryReaderTest.java | 6 + .../qbic/xml/manager/QCategoricalTest.java | 104 ++++ .../qbic/xml/manager/QContinuousTest.java | 103 ++++ .../life/qbic/xml/manager/QfactorsTest.java | 70 +++ .../qbic/xml/manager/StudyXMLParserTest.java | 446 ++++++++++++++++++ .../life/qbic/xml/manager/qproperties.xsd | 78 +++ 25 files changed, 2995 insertions(+), 226 deletions(-) create mode 100644 src/main/java/life/qbic/xml/manager/StudyXMLParser.java delete mode 100644 src/main/java/life/qbic/xml/properties/Factor.java create mode 100644 src/main/java/life/qbic/xml/study/ObjectFactory.java create mode 100644 src/main/java/life/qbic/xml/study/Qcategorical.java create mode 100644 src/main/java/life/qbic/xml/study/Qcatlevel.java create mode 100644 src/main/java/life/qbic/xml/study/Qcontinuous.java create mode 100644 src/main/java/life/qbic/xml/study/Qcontlevel.java create mode 100644 src/main/java/life/qbic/xml/study/Qexperiment.java create mode 100644 src/main/java/life/qbic/xml/study/Qfactors.java create mode 100644 src/main/java/life/qbic/xml/study/Qproperty.java create mode 100644 src/main/java/life/qbic/xml/study/TechnologyType.java create mode 100644 src/main/java/life/qbic/xml/study/binding.xml create mode 100644 src/main/java/life/qbic/xml/study/qproperties.xsd create mode 100644 src/main/resources/life/qbic/xml/manager/qproperties.xsd create mode 100644 src/test/java/life/qbic/xml/manager/HistoryReaderTest.java create mode 100644 src/test/java/life/qbic/xml/manager/QCategoricalTest.java create mode 100644 src/test/java/life/qbic/xml/manager/QContinuousTest.java create mode 100644 src/test/java/life/qbic/xml/manager/QfactorsTest.java create mode 100644 src/test/java/life/qbic/xml/manager/StudyXMLParserTest.java create mode 100644 src/test/resources/life/qbic/xml/manager/qproperties.xsd diff --git a/pom.xml b/pom.xml index 8d3a5eb..64d7beb 100644 --- a/pom.xml +++ b/pom.xml @@ -5,16 +5,20 @@ life.qbic parent-pom - 1.2.0 + 1.3.0 - life.qbic xml-manager-lib jar - 1.1.1 + 1.2.0 XML Property Parser Library http://maven.apache.org - + + + org.apache.commons + commons-lang3 + + nexus-snapshots diff --git a/src/main/java/life/qbic/xml/manager/StudyXMLParser.java b/src/main/java/life/qbic/xml/manager/StudyXMLParser.java new file mode 100644 index 0000000..8bd7730 --- /dev/null +++ b/src/main/java/life/qbic/xml/manager/StudyXMLParser.java @@ -0,0 +1,360 @@ +package life.qbic.xml.manager; + +import java.io.File; +import java.io.IOException; +import java.io.StringReader; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBElement; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; +import javax.xml.bind.Unmarshaller; +import javax.xml.transform.stream.StreamSource; + +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.xml.sax.SAXException; + +import life.qbic.xml.properties.Property; +import life.qbic.xml.properties.PropertyType; +import life.qbic.xml.properties.Unit; +import life.qbic.xml.study.ObjectFactory; +import life.qbic.xml.study.Qcategorical; +import life.qbic.xml.study.Qcatlevel; +import life.qbic.xml.study.Qcontinuous; +import life.qbic.xml.study.Qcontlevel; +import life.qbic.xml.study.Qexperiment; +import life.qbic.xml.study.Qfactors; +import life.qbic.xml.study.Qproperty; +import life.qbic.xml.study.TechnologyType; + +public class StudyXMLParser { + + private final Logger logger = LogManager.getLogger(StudyXMLParser.class); + final private XMLValidator validator = new XMLValidator(); + final public static ObjectFactory factory = new ObjectFactory(); + + public boolean validate(String xml) { + File xsd = new File(getClass().getResource("qproperties.xsd").getFile()); + try { + return validator.validate(xml, xsd); + } catch (SAXException | IOException e) { + return false; + } + } + + public List mapToTechnologyTypes(Map> techTypes) { + List res = new ArrayList(); + for (String technology : techTypes.keySet()) { + TechnologyType tt = factory.createTechnologyType(); + tt.setName(technology); + for (String id : techTypes.get(technology)) { + tt.getEntityId().add(id); + } + res.add(tt); + } + return res; + } + + public JAXBElement createNewDesign(List techTypes, + Map, List>> expDesign, Map> otherProps) + throws JAXBException { + JAXBElement res = getEmptyXML(); + mergeDesigns(res, techTypes, expDesign, otherProps); + + return res; + } + + public JAXBElement parseXMLString(String xml) throws JAXBException { + if (xml == null || xml.isEmpty()) + return null; + JAXBContext jc = JAXBContext.newInstance("life.qbic.xml.study"); + Unmarshaller unmarshaller = jc.createUnmarshaller(); + JAXBElement root = unmarshaller.unmarshal(new StreamSource(new StringReader(xml)), + Qexperiment.class); + return root; + } + + public JAXBElement getEmptyXML() throws JAXBException { + JAXBContext jc = JAXBContext.newInstance("life.qbic.xml.study"); + Unmarshaller unmarshaller = jc.createUnmarshaller(); + JAXBElement root = unmarshaller.unmarshal(new StreamSource( + new StringReader("" + + "" + "")), + Qexperiment.class); + return root; + } + + public String toString(JAXBElement root) throws JAXBException { + JAXBContext jc = JAXBContext.newInstance("life.qbic.xml.study"); + Marshaller marshaller = jc.createMarshaller(); + marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); + StringWriter sw = new StringWriter(); + marshaller.marshal(root, sw); + return sw.toString(); + } + + public Set getFactorLabels(JAXBElement expDesign) { + Set res = new HashSet(); + Qfactors factors = expDesign.getValue().getQfactors(); + if (factors != null) { + for (Qcategorical f : factors.getQcategorical()) { + Qcategorical cat = (Qcategorical) f; + res.add(cat.getLabel()); + } + for (Qcontinuous f : factors.getQcontinuous()) { + Qcontinuous cont = (Qcontinuous) f; + res.add(cont.getLabel()); + } + } + return res; + } + + public Map, Property> getFactorsForLabelsAndSamples(JAXBElement expDesign) { + Map, Property> res = new HashMap, Property>(); + Qfactors factors = expDesign.getValue().getQfactors(); + if (factors != null) { + for (Qcategorical f : factors.getQcategorical()) { + Qcategorical cat = (Qcategorical) f; + String lab = cat.getLabel(); + for (Qcatlevel level : cat.getQcatlevel()) { + String val = level.getValue(); + Property p = new Property(lab, val, PropertyType.Factor); + for (String sampleCode : level.getEntityId()) { + Pair labelCode = new ImmutablePair(lab, sampleCode); + res.put(labelCode, p); + } + } + } + for (Qcontinuous f : factors.getQcontinuous()) { + Qcontinuous cont = (Qcontinuous) f; + String lab = cont.getLabel(); + String unit = cont.getUnit(); + for (Qcontlevel level : cont.getQcontlevel()) { + String val = level.getValue(); + Property p = new Property(lab, val, Unit.fromString(unit), PropertyType.Factor); + for (String sampleCode : level.getEntityId()) { + Pair labelCode = new ImmutablePair(lab, sampleCode); + res.put(labelCode, p); + } + } + } + } + return res; + } + + public JAXBElement removeReferencesToMissingIDs(JAXBElement expDesign, + Set existingIDs, boolean keepTechsWithoutSamples) throws JAXBException { + List techTypes = getSamplesForTechTypes(expDesign); + List newTechTypes = new ArrayList(); + for (TechnologyType t : techTypes) { + TechnologyType newT = new TechnologyType(); + for (String code : t.getEntityId()) { + if (existingIDs.contains(code)) { + newT.getEntityId().add(code); + } + } + if (!newT.getEntityId().isEmpty() || keepTechsWithoutSamples) { + newT.setName(t.getName()); + newTechTypes.add(newT); + } + } + + Map> props = getPropertiesForSampleCode(expDesign); + Map> newProps = new HashMap>(); + for (String id : props.keySet()) { + if (existingIDs.contains(id)) { + List propsForThisID = new ArrayList(); + for (Property p : props.get(id)) { + Qproperty newProp = factory.createQproperty(); + newProp.setLabel(p.getLabel()); + newProp.setValue(p.getValue()); + if (p.hasUnit()) + newProp.setUnit(p.getUnit().getValue()); + newProp.setEntityId(id); + propsForThisID.add(newProp); + } + newProps.put(id, propsForThisID); + } else { + logger.info("removing property for sample " + id + + " from the design, since sample with this id does not exist anymore."); + } + } + + Map, Property> factors = getFactorsForLabelsAndSamples(expDesign); + Map, List>> newFactors = new HashMap, List>>(); + + for (Pair labelAndCode : factors.keySet()) { + String label = labelAndCode.getLeft(); + String id = labelAndCode.getRight(); + Property prop = factors.get(labelAndCode); + if (existingIDs.contains(id)) { + String unit = null; + if (prop.hasUnit()) { + unit = prop.getUnit().getValue(); + } + Pair newProp = new ImmutablePair(prop.getValue(), unit); + Map, List> level = new HashMap, List>(); + if (newFactors.containsKey(label)) { + level = newFactors.get(label); + + if (level.containsKey(newProp)) { + level.get(newProp).add(id); + } else { + level.put(newProp, new ArrayList(Arrays.asList(id))); + } + } else { + level.put(newProp, new ArrayList(Arrays.asList(id))); + newFactors.put(label, level); + } + } + } + return createNewDesign(newTechTypes, newFactors, newProps); + } + + private JAXBElement addTechTypesToDesign(JAXBElement experiment, + List techTypes) { + Qexperiment root = experiment.getValue(); + Map> idsForType = new HashMap>(); + for (TechnologyType t : root.getTechnologyType()) { + idsForType.put(t.getName(), t.getEntityId()); + } + List existing = root.getTechnologyType(); + for (TechnologyType t : techTypes) { + if (idsForType.containsKey(t.getName())) { + idsForType.get(t.getName()).addAll(t.getEntityId()); + } else { + existing.add(t); + } + } + return experiment; + } + + private JAXBElement addPropertiesToDesign(JAXBElement existing, + Map> newProps) { + Map, Qproperty> labelAndID = new HashMap, Qproperty>(); + List existingProps = existing.getValue().getQproperty(); + for (Qproperty prop : existingProps) { + labelAndID.put(new ImmutablePair(prop.getLabel(), prop.getEntityId()), prop); + } + for (String id : newProps.keySet()) { + for (Qproperty p : newProps.get(id)) { + Pair labelID = new ImmutablePair(p.getLabel(), id); + // for every id and property level add if it doesn't exist, update otherwise + if (!labelAndID.containsKey(labelID)) { + existingProps.add(p); + } else { + Qproperty old = labelAndID.get(labelID); + old.setValue(p.getValue()); + old.setUnit(p.getUnit()); + } + } + } + return existing; + } + + private JAXBElement addFactorsToDesign(JAXBElement existing, + Map, List>> newDesign) { + Qfactors factors = existing.getValue().getQfactors(); + if (factors == null) { + existing.getValue().setQfactors(factory.createQfactors()); + factors = existing.getValue().getQfactors(); + } + for (String label : newDesign.keySet()) { + Map, List> levels = newDesign.get(label); + Iterator> it = levels.keySet().iterator(); + if (it.hasNext()) { + String unit = it.next().getRight(); + // no unit: categorical factor + if (unit == null || unit.isEmpty()) { + Qcategorical oldCat = factors.getCatFactorOrNull(label); + // no factor, add everything + if (oldCat == null) { + factors.createNewFactor(label, levels); + } + // factor exists, add missing information + else { + oldCat.update(levels); + } + } + // unit: continuous factor + else { + Qcontinuous oldCont = factors.getContFactorOrNull(label); + // no factor, add everything + if (oldCont == null) { + factors.createNewFactor(label, unit, levels); + } + // factor exists, add missing information + else { + oldCont.update(levels); + } + } + } + } + return existing; + } + + public JAXBElement mergeDesigns(JAXBElement existing, List techTypes, + Map, List>> expDesign, Map> otherProps) { + + addTechTypesToDesign(existing, techTypes); + addPropertiesToDesign(existing, otherProps); + addFactorsToDesign(existing, expDesign); + + return existing; + } + + public List getSamplesForTechTypes(JAXBElement expDesign) { + List types = expDesign.getValue().getTechnologyType(); + return types; + } + + public Map> getPropertiesForSampleCode(JAXBElement expDesign) { + List props = expDesign.getValue().getQproperty(); + Map> res = new HashMap>(); + PropertyType type = PropertyType.Property; + for (Qproperty p : props) { + String code = p.getEntityId(); + Property property; + if (p.getUnit() == null) + property = new Property(p.getLabel(), p.getValue(), type); + else + property = new Property(p.getLabel(), p.getValue(), Unit.fromString(p.getUnit()), type); + if (res.containsKey(code)) { + res.get(code).add(property); + } else { + res.put(code, new ArrayList(Arrays.asList(property))); + } + } + return res; + } + + public List getFactorsAndPropertiesForSampleCode(JAXBElement expDesign, String code) { + List res = new ArrayList<>(); + List props = getPropertiesForSampleCode(expDesign).get(code); + if (props != null) { + res.addAll(props); + } + Map, Property> factorsForLabelsAndSamples = getFactorsForLabelsAndSamples(expDesign); + for (String label : getFactorLabels(expDesign)) { + Pair key = new ImmutablePair<>(label, code); + Property f = factorsForLabelsAndSamples.get(key); + if (f != null) { + res.add(f); + } + } + return res; + } + +} diff --git a/src/main/java/life/qbic/xml/manager/XMLParser.java b/src/main/java/life/qbic/xml/manager/XMLParser.java index 06fcc2a..8b822d2 100644 --- a/src/main/java/life/qbic/xml/manager/XMLParser.java +++ b/src/main/java/life/qbic/xml/manager/XMLParser.java @@ -27,6 +27,7 @@ import life.qbic.xml.properties.Qproperty; import life.qbic.xml.properties.Unit; +@Deprecated public class XMLParser { public Map getMapOfProperties(JAXBElement root) { diff --git a/src/main/java/life/qbic/xml/manager/XMLValidator.java b/src/main/java/life/qbic/xml/manager/XMLValidator.java index e69d1db..208b4f3 100644 --- a/src/main/java/life/qbic/xml/manager/XMLValidator.java +++ b/src/main/java/life/qbic/xml/manager/XMLValidator.java @@ -4,71 +4,38 @@ import java.io.IOException; import java.io.StringReader; import javax.xml.XMLConstants; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBElement; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; -import javax.xml.bind.Unmarshaller; import javax.xml.transform.Source; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.*; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.xml.sax.SAXException; -import life.qbic.xml.properties.Qproperties; - - public class XMLValidator { - public boolean validate(String xml, File schemaFile) throws SAXException, IOException { - SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); - Schema schema = schemaFactory.newSchema(schemaFile); - Validator validator = schema.newValidator(); - try { - validator.validate(new StreamSource(new StringReader(xml))); - System.out.println(xml + " is valid"); - return true; - } catch (SAXException e) { - System.out.println(xml + " is NOT valid"); - System.out.println("Reason: " + e.getLocalizedMessage()); - return false; - } - } - - public boolean validate(File xmlFile, File schemaFile) throws IOException, SAXException { - Source xml = new StreamSource(xmlFile); - SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); - Schema schema = schemaFactory.newSchema(schemaFile); - Validator validator = schema.newValidator(); - try { - validator.validate(xml); - System.out.println(xml.getSystemId() + " is valid"); - return true; - } catch (SAXException e) { - System.out.println(xml.getSystemId() + " is NOT valid"); - System.out.println("Reason: " + e.getLocalizedMessage()); - return false; - } - } - - public static void main(String[] args) throws IOException, SAXException, JAXBException { - XMLValidator x = new XMLValidator(); - x.validate( - " " - + " " - + " ", - new File("schemas/sample_prop_schema.xsd")); - File file = new File("examples/sample_prop_example.xml"); - x.validate(file, new File("schemas/sample_prop_schema.xsd")); - JAXBContext jc = JAXBContext.newInstance("life.qbic.xml.properties"); - - Unmarshaller unmarshaller = jc.createUnmarshaller(); - JAXBElement root = - unmarshaller.unmarshal(new StreamSource(file), Qproperties.class); - XMLParser p = new XMLParser(); - System.out.println(p.getMapOfProperties(root)); - Marshaller marshaller = jc.createMarshaller(); - marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); - marshaller.marshal(root, System.out); - } + private static final Logger logger = LogManager.getLogger(XMLValidator.class); + + private boolean validate(Source xml, File schemaFile) throws IOException, SAXException { + SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); + Schema schema = schemaFactory.newSchema(schemaFile); + Validator validator = schema.newValidator(); + try { + validator.validate(xml); + logger.info("Tested xml is valid."); + return true; + } catch (SAXException e) { + logger.warn("Tested xml is NOT valid"); + logger.warn("Reason: " + e.getLocalizedMessage()); + return false; + } + } + + public boolean validate(String xml, File schemaFile) throws SAXException, IOException { + return validate(new StreamSource(new StringReader(xml)), schemaFile); + } + + public boolean validate(File xmlFile, File schemaFile) throws IOException, SAXException { + return validate(new StreamSource(xmlFile), schemaFile); + } } diff --git a/src/main/java/life/qbic/xml/properties/Factor.java b/src/main/java/life/qbic/xml/properties/Factor.java deleted file mode 100644 index aef6c7a..0000000 --- a/src/main/java/life/qbic/xml/properties/Factor.java +++ /dev/null @@ -1,50 +0,0 @@ -package life.qbic.xml.properties; - -@Deprecated -/** - * use Property with PropertyType Factor - * @author Andreas Friedrich - * - */ -public class Factor { - - private String label; - private String value; - private String unit; - private boolean hasUnit; - - public Factor(String label, String value, String unit) { - this.label = label; - this.value = value; - this.unit = unit; - if(unit.equals("")) - hasUnit = false; - else - hasUnit = true; - } - - public Factor(String label, String value) { - this(label, value, ""); - } - - public String toString() { - return label+": "+value+unit; - } - - public String getLabel() { - return label; - } - - public String getValue() { - return value; - } - - public String getUnit() { - return unit; - } - - public boolean hasUnit() { - return hasUnit; - } - -} diff --git a/src/main/java/life/qbic/xml/properties/Property.java b/src/main/java/life/qbic/xml/properties/Property.java index 8cb08be..83c2d80 100644 --- a/src/main/java/life/qbic/xml/properties/Property.java +++ b/src/main/java/life/qbic/xml/properties/Property.java @@ -90,4 +90,8 @@ public boolean equals(Object obj) { return true; } +public void setValue(String val) { + this.value = val; +} + } diff --git a/src/main/java/life/qbic/xml/properties/Unit.java b/src/main/java/life/qbic/xml/properties/Unit.java index b24dcc9..85624db 100644 --- a/src/main/java/life/qbic/xml/properties/Unit.java +++ b/src/main/java/life/qbic/xml/properties/Unit.java @@ -7,120 +7,68 @@ @XmlType(name = "unit") @XmlEnum public enum Unit { - @XmlEnumValue("s") - Second("s"), - @XmlEnumValue("min") - Minute("min"), - @XmlEnumValue("g") - Hour("h"), - @XmlEnumValue("d") - Day("d"), - @XmlEnumValue("pg") - Picogram("pg"), - @XmlEnumValue("ng") - Nanogram("ng"), - @XmlEnumValue("\u00B5" + "g") - Microgram("\u00B5" + "g"), - @XmlEnumValue("mg") - Milligram("mg"), - @XmlEnumValue("g") - Gram("g"), - @XmlEnumValue("kg") - Kilogram("kg"), - @XmlEnumValue("m") - Meter("m"), - @XmlEnumValue("A") - Ampere("A"), - @XmlEnumValue("K") - Kelvin("K"), - @XmlEnumValue("mol") - Mole("mol"), - @XmlEnumValue("cd") - Candela("cd"), - @XmlEnumValue("Pa") - Pascal("Pa"), - @XmlEnumValue("J") - Joule("J"), - @XmlEnumValue("W") - Watt("W"), - @XmlEnumValue("N") - Newton("N"), - @XmlEnumValue("T") - Tesla("T"), - @XmlEnumValue("H") - Henry("H"), - @XmlEnumValue("C") - Coulomb("C"), - @XmlEnumValue("V") - Volt("V"), - @XmlEnumValue("F") - Farad("F"), - @XmlEnumValue("S") - Siemens("S"), - @XmlEnumValue("wb") - Weber("Wb"), - @XmlEnumValue("\u2126") - Ohm("\u2126"), - @XmlEnumValue("Hz") - Hertz("Hz"), - @XmlEnumValue("lx") - Lux("lx"), - @XmlEnumValue("lm") - Lumen("lm"), - @XmlEnumValue("Bq") - Becquerel("Bq"), - @XmlEnumValue("Gy") - Gray("Gy"), - @XmlEnumValue("Sv") - Sievert("Sv"), - @XmlEnumValue("kat") - Katal("kat"), - @XmlEnumValue("\u00B5" + "l") - Microliter("\u00B5" + "l"), - @XmlEnumValue("ml") - Milliliter("ml"), - @XmlEnumValue("l") - Liter("l"), - @XmlEnumValue("pg/l") - Picogram_Per_Liter("pg/l"), - @XmlEnumValue("ng/l") - Nanogram_Per_Liter("ng/l"), - @XmlEnumValue("\u00B5" + "g/l") - Microgram_Per_Liter("\u00B5" + "g/l"), - @XmlEnumValue("mg/l") - Milligram_Per_Liter("mg/l"), - @XmlEnumValue("g/l") - Gram_Per_Liter("g/l"), - @XmlEnumValue("pmol/l") - Picomol_Per_Liter("pmol/l"), - @XmlEnumValue("nmol/l") - Nanomol_Per_Liter("nmol/l"), - @XmlEnumValue("\u00B5"+ "mol/l") - Micromol_Per_Liter("\u00B5"+ "mol/l"), - @XmlEnumValue("mmol/l") - Millimol_Per_Liter("mmol/l"), - @XmlEnumValue("mol/l") - Mol_Per_Liter("mol/l"), - @XmlEnumValue("arb. unit") - Arbitrary_Unit("arb. unit"); - - private String value; + @XmlEnumValue("s") Second("s"), @XmlEnumValue("min") Minute("min"), @XmlEnumValue("g") Hour( + "h"), @XmlEnumValue("d") Day("d"), @XmlEnumValue("pg") Picogram("pg"), @XmlEnumValue("ng") Nanogram( + "ng"), @XmlEnumValue("\u00B5" + "g") Microgram("\u00B5" + "g"), @XmlEnumValue("mg") Milligram( + "mg"), @XmlEnumValue("g") Gram("g"), @XmlEnumValue("kg") Kilogram( + "kg"), @XmlEnumValue("m") Meter("m"), @XmlEnumValue("A") Ampere( + "A"), @XmlEnumValue("K") Kelvin("K"), @XmlEnumValue("mol") Mole( + "mol"), @XmlEnumValue("cd") Candela( + "cd"), @XmlEnumValue("Pa") Pascal( + "Pa"), @XmlEnumValue("J") Joule( + "J"), @XmlEnumValue("W") Watt( + "W"), @XmlEnumValue("N") Newton( + "N"), @XmlEnumValue("T") Tesla( + "T"), @XmlEnumValue("H") Henry( + "H"), @XmlEnumValue("C") Coulomb( + "C"), @XmlEnumValue("V") Volt( + "V"), @XmlEnumValue("F") Farad( + "F"), @XmlEnumValue("S") Siemens( + "S"), @XmlEnumValue("wb") Weber( + "Wb"), @XmlEnumValue("\u2126") Ohm( + "\u2126"), @XmlEnumValue("Hz") Hertz( + "Hz"), @XmlEnumValue("lx") Lux( + "lx"), @XmlEnumValue("lm") Lumen( + "lm"), @XmlEnumValue("Bq") Becquerel( + "Bq"), @XmlEnumValue("Gy") Gray( + "Gy"), @XmlEnumValue("Sv") Sievert( + "Sv"), @XmlEnumValue("kat") Katal( + "kat"), @XmlEnumValue("\u00B5" + + "l") Microliter( + "\u00B5" + "l"), @XmlEnumValue("ml") Milliliter( + "ml"), @XmlEnumValue("l") Liter( + "l"), @XmlEnumValue("pg/l") Picogram_Per_Liter( + "pg/l"), @XmlEnumValue("ng/l") Nanogram_Per_Liter( + "ng/l"), @XmlEnumValue("\u00B5" + + "g/l") Microgram_Per_Liter( + "\u00B5" + "g/l"), @XmlEnumValue("mg/l") Milligram_Per_Liter( + "mg/l"), @XmlEnumValue("g/l") Gram_Per_Liter( + "g/l"), @XmlEnumValue("pmol/l") Picomol_Per_Liter( + "pmol/l"), @XmlEnumValue("nmol/l") Nanomol_Per_Liter( + "nmol/l"), @XmlEnumValue("\u00B5" + + "mol/l") Micromol_Per_Liter( + "\u00B5" + "mol/l"), @XmlEnumValue("mmol/l") Millimol_Per_Liter( + "mmol/l"), @XmlEnumValue("mol/l") Mol_Per_Liter( + "mol/l"), @XmlEnumValue("arb. unit") Arbitrary_Unit( + "arb. unit"); - private Unit(String value) { - this.value = value; - } + private String value; - public String getValue() { - return value; - } - - public static Unit fromString(String value) { - for (Unit b : Unit.values()) { - if (b.value.equalsIgnoreCase(value)) { - return b; - } - } - throw new IllegalArgumentException("No constant with text " + value + " found"); - } + private Unit(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + + public static Unit fromString(String value) { + for (Unit b : Unit.values()) { + if (b.value.equalsIgnoreCase(value)) { + return b; + } + } + throw new IllegalArgumentException("No constant with text " + value + " found"); + } } \ No newline at end of file diff --git a/src/main/java/life/qbic/xml/study/ObjectFactory.java b/src/main/java/life/qbic/xml/study/ObjectFactory.java new file mode 100644 index 0000000..7d8f4d2 --- /dev/null +++ b/src/main/java/life/qbic/xml/study/ObjectFactory.java @@ -0,0 +1,103 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2018.08.22 at 04:15:01 PM CEST +// + + +package life.qbic.xml.study; + +import javax.xml.bind.annotation.XmlRegistry; + + +/** + * This object contains factory methods for each + * Java content interface and Java element interface + * generated in the life.qbic.xml.study package. + *

An ObjectFactory allows you to programatically + * construct new instances of the Java representation + * for XML content. The Java representation of XML + * content can consist of schema derived interfaces + * and classes representing the binding of schema + * type definitions, element declarations and model + * groups. Factory methods for each of these are + * provided in this class. + * + */ +@XmlRegistry +public class ObjectFactory { + + + /** + * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: life.qbic.xml.study + * + */ + public ObjectFactory() { + } + + /** + * Create an instance of {@link Qexperiment } + * + */ + public Qexperiment createQexperiment() { + return new Qexperiment(); + } + + /** + * Create an instance of {@link TechnologyType } + * + */ + public TechnologyType createTechnologyType() { + return new TechnologyType(); + } + + /** + * Create an instance of {@link Qfactors } + * + */ + public Qfactors createQfactors() { + return new Qfactors(); + } + + /** + * Create an instance of {@link Qproperty } + * + */ + public Qproperty createQproperty() { + return new Qproperty(); + } + + /** + * Create an instance of {@link Qcategorical } + * + */ + public Qcategorical createQcategorical() { + return new Qcategorical(); + } + + /** + * Create an instance of {@link Qcontinuous } + * + */ + public Qcontinuous createQcontinuous() { + return new Qcontinuous(); + } + + /** + * Create an instance of {@link Qcontlevel } + * + */ + public Qcontlevel createQcontlevel() { + return new Qcontlevel(); + } + + /** + * Create an instance of {@link Qcatlevel } + * + */ + public Qcatlevel createQcatlevel() { + return new Qcatlevel(); + } + +} diff --git a/src/main/java/life/qbic/xml/study/Qcategorical.java b/src/main/java/life/qbic/xml/study/Qcategorical.java new file mode 100644 index 0000000..ae6ad8a --- /dev/null +++ b/src/main/java/life/qbic/xml/study/Qcategorical.java @@ -0,0 +1,202 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2018.08.03 at 02:15:07 PM CEST +// + +package life.qbic.xml.study; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlType; + +import org.apache.commons.lang3.tuple.Pair; + +import life.qbic.xml.manager.StudyXMLParser; + +/** + *

+ * Java class for anonymous complex type. + * + *

+ * The following schema fragment specifies the expected content contained within + * this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="qcatlevel" maxOccurs="unbounded">
+ *           <complexType>
+ *             <complexContent>
+ *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                 <sequence>
+ *                   <element name="entity_id" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded"/>
+ *                 </sequence>
+ *                 <attribute name="value" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *               </restriction>
+ *             </complexContent>
+ *           </complexType>
+ *         </element>
+ *       </sequence>
+ *       <attribute name="label" type="{}variable_name_format" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { "qcatlevel" }) +public class Qcategorical { + + @XmlElement(required = true) + protected List qcatlevel; + @XmlAttribute(name = "label") + protected String label; + + /** + * Gets the value of the qcatlevel property. + * + *

+ * This accessor method returns a reference to the live list, not a + * snapshot. Therefore any modification you make to the returned list will + * be present inside the JAXB object. This is why there is not a + * set method for the qcatlevel property. + * + *

+ * For example, to add a new item, do as follows: + * + *

+	 * getQcatlevel().add(newItem);
+	 * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list {@link Qcatlevel + * } + * + * + */ + public List getQcatlevel() { + if (qcatlevel == null) { + qcatlevel = new ArrayList(); + } + return this.qcatlevel; + } + + /** + * Gets the value of the label property. + * + * @return possible object is {@link String } + * + */ + public String getLabel() { + return label; + } + + /** + * Sets the value of the label property. + * + * @param value + * allowed object is {@link String } + * + */ + public void setLabel(String value) { + this.label = value; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((label == null) ? 0 : label.hashCode()); + result = prime * result + ((qcatlevel == null) ? 0 : qcatlevel.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Qcategorical other = (Qcategorical) obj; + if (label == null) { + if (other.label != null) + return false; + } else if (!label.equals(other.label)) + return false; + if (qcatlevel == null) { + if (other.qcatlevel != null) + return false; + } else if (!qcatlevel.equals(other.qcatlevel)) + return false; + return true; + } + + public Qcatlevel getLevelOrNull(String value) { + for (Qcatlevel level : getQcatlevel()) { + if (level.getValue().equals(value)) { + return level; + } + } + return null; + } + + public void createLevels(Map, List> levels) { + for (Pair valunit : levels.keySet()) { + createLevel(valunit.getLeft(), levels.get(valunit)); + } + } + + private void createLevel(String value, List ids) { + Qcatlevel catLvl = StudyXMLParser.factory.createQcatlevel(); + catLvl.setValue(value); + catLvl.getEntityId().addAll(ids); + getQcatlevel().add(catLvl); + } + + public void update(Map, List> levels) { + for (Pair level : levels.keySet()) { + List ids = levels.get(level); + String value = level.getLeft(); + + // first remove all identifiers from other levels since they can't be part of multiple levels + removeIDsFromOldLevels(ids, value); + + Qcatlevel xmlLevel = getLevelOrNull(value); + if (xmlLevel == null) { + // if level exists, add all new identifiers on this level to the set, if not create it and also set value + createLevel(value, ids); + } else { + xmlLevel.getEntityId().addAll(ids); + } + } + } + + /** + * remove new ids from every old level with the wrong level value + * + * @param ids + * @param newValue + */ + private void removeIDsFromOldLevels(List ids, String newValue) { + for (Qcatlevel level : getQcatlevel()) { + if (!level.getValue().equals(newValue)) { + level.getEntityId().removeAll(ids); + } + } + } +} diff --git a/src/main/java/life/qbic/xml/study/Qcatlevel.java b/src/main/java/life/qbic/xml/study/Qcatlevel.java new file mode 100644 index 0000000..18f26df --- /dev/null +++ b/src/main/java/life/qbic/xml/study/Qcatlevel.java @@ -0,0 +1,138 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2018.08.03 at 02:15:07 PM CEST +// + + +package life.qbic.xml.study; + +import java.util.HashSet; +import java.util.Set; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="entity_id" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded"/>
+ *       </sequence>
+ *       <attribute name="value" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "entityId" +}) +public class Qcatlevel { + + @XmlElement(name = "entity_id", required = true) + protected Set entityId; + @XmlAttribute(name = "value", required = true) + protected String value; + + /** + * Gets the value of the entityId property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the entityId property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getEntityId().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link String } + * + * + */ + public Set getEntityId() { + if (entityId == null) { + entityId = new HashSet(); + } + return this.entityId; + } + + /** + * Gets the value of the value property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getValue() { + return value; + } + + /** + * Sets the value of the value property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setValue(String value) { + this.value = value; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((entityId == null) ? 0 : entityId.hashCode()); + result = prime * result + ((value == null) ? 0 : value.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Qcatlevel other = (Qcatlevel) obj; + if (entityId == null) { + if (other.entityId != null) + return false; + } else if (!entityId.equals(other.entityId)) + return false; + if (value == null) { + if (other.value != null) + return false; + } else if (!value.equals(other.value)) + return false; + return true; + } + + + +} diff --git a/src/main/java/life/qbic/xml/study/Qcontinuous.java b/src/main/java/life/qbic/xml/study/Qcontinuous.java new file mode 100644 index 0000000..d0df699 --- /dev/null +++ b/src/main/java/life/qbic/xml/study/Qcontinuous.java @@ -0,0 +1,238 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2018.08.03 at 02:15:07 PM CEST +// + + +package life.qbic.xml.study; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlType; + +import org.apache.commons.lang3.tuple.Pair; + +import life.qbic.xml.manager.StudyXMLParser; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="qcontlevel" maxOccurs="unbounded">
+ *           <complexType>
+ *             <complexContent>
+ *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                 <sequence>
+ *                   <element name="entity_id" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded"/>
+ *                 </sequence>
+ *                 <attribute name="value" use="required" type="{http://www.w3.org/2001/XMLSchema}double" />
+ *               </restriction>
+ *             </complexContent>
+ *           </complexType>
+ *         </element>
+ *       </sequence>
+ *       <attribute name="label" use="required" type="{}variable_name_format" />
+ *       <attribute name="unit" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "qcontlevel" +}) +public class Qcontinuous { + + @XmlElement(required = true) + protected List qcontlevel; + @XmlAttribute(name = "label", required = true) + protected String label; + @XmlAttribute(name = "unit", required = true) + protected String unit; + + /** + * Gets the value of the qcontlevel property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the qcontlevel property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getQcontlevel().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Qcontlevel } + * + * + */ + public List getQcontlevel() { + if (qcontlevel == null) { + qcontlevel = new ArrayList(); + } + return this.qcontlevel; + } + + /** + * Gets the value of the label property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getLabel() { + return label; + } + + /** + * Sets the value of the label property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setLabel(String value) { + this.label = value; + } + + /** + * Gets the value of the unit property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getUnit() { + return unit; + } + + /** + * Sets the value of the unit property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setUnit(String value) { + this.unit = value; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((label == null) ? 0 : label.hashCode()); + result = prime * result + ((qcontlevel == null) ? 0 : qcontlevel.hashCode()); + result = prime * result + ((unit == null) ? 0 : unit.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Qcontinuous other = (Qcontinuous) obj; + if (label == null) { + if (other.label != null) + return false; + } else if (!label.equals(other.label)) + return false; + if (qcontlevel == null) { + if (other.qcontlevel != null) + return false; + } else if (!qcontlevel.equals(other.qcontlevel)) + return false; + if (unit == null) { + if (other.unit != null) + return false; + } else if (!unit.equals(other.unit)) + return false; + return true; + } + + public Qcontlevel getLevelOrNull(String value) { + for (Qcontlevel level : getQcontlevel()) { + if (level.getValue().equals(value)) { + return level; + } + } + return null; + } + + public void createLevels(Map, List> levels) { + for (Pair valunit : levels.keySet()) { + createLevel(valunit.getLeft(), levels.get(valunit)); + } + } + + private void createLevel(String value, List ids) { + Qcontlevel contLvl = StudyXMLParser.factory.createQcontlevel(); + contLvl.setValue(value); + contLvl.getEntityId().addAll(ids); + getQcontlevel().add(contLvl); + } + + public void update(Map, List> levels) { + for (Pair level : levels.keySet()) { + List ids = levels.get(level); + String value = level.getLeft(); + + // first remove all identifiers from other levels since they can't be part of multiple levels + removeIDsFromOldLevels(ids, value); + + Qcontlevel xmlLevel = getLevelOrNull(value); + if (xmlLevel == null) { + // if level exists, add all new identifiers on this level to the set, if not create it and also set value + createLevel(value, ids); + } else { + xmlLevel.getEntityId().addAll(ids); + } + } + } + + /** + * remove new ids from every old level with the wrong level value + * + * @param ids + * @param newValue + */ + private void removeIDsFromOldLevels(List ids, String newValue) { + for (Qcontlevel level : getQcontlevel()) { + if (!level.getValue().equals(newValue)) { + level.getEntityId().removeAll(ids); + } + } + } +} diff --git a/src/main/java/life/qbic/xml/study/Qcontlevel.java b/src/main/java/life/qbic/xml/study/Qcontlevel.java new file mode 100644 index 0000000..1a89f4d --- /dev/null +++ b/src/main/java/life/qbic/xml/study/Qcontlevel.java @@ -0,0 +1,127 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2018.08.03 at 02:15:07 PM CEST +// + +package life.qbic.xml.study; + +import java.util.HashSet; +import java.util.Set; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlType; + +/** + *

+ * Java class for anonymous complex type. + * + *

+ * The following schema fragment specifies the expected content contained within + * this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="entity_id" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded"/>
+ *       </sequence>
+ *       <attribute name="value" use="required" type="{http://www.w3.org/2001/XMLSchema}double" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { "entityId" }) +public class Qcontlevel { + + @XmlElement(name = "entity_id", required = true) + protected Set entityId; + @XmlAttribute(name = "value", required = true) + protected String value; + + /** + * Gets the value of the entityId property. + * + *

+ * This accessor method returns a reference to the live list, not a + * snapshot. Therefore any modification you make to the returned list will + * be present inside the JAXB object. This is why there is not a + * set method for the entityId property. + * + *

+ * For example, to add a new item, do as follows: + * + *

+	 * getEntityId().add(newItem);
+	 * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list {@link String } + * + * + */ + public Set getEntityId() { + if (entityId == null) { + entityId = new HashSet(); + } + return this.entityId; + } + + /** + * Gets the value of the value property. + * + */ + public String getValue() { + return value; + } + + /** + * Sets the value of the value property. + * + */ + public void setValue(String value) { + this.value = value; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((entityId == null) ? 0 : entityId.hashCode()); + result = prime * result + ((value == null) ? 0 : value.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Qcontlevel other = (Qcontlevel) obj; + if (entityId == null) { + if (other.entityId != null) + return false; + } else if (!entityId.equals(other.entityId)) + return false; + if (value == null) { + if (other.value != null) + return false; + } else if (!value.equals(other.value)) + return false; + return true; + } + +} diff --git a/src/main/java/life/qbic/xml/study/Qexperiment.java b/src/main/java/life/qbic/xml/study/Qexperiment.java new file mode 100644 index 0000000..f5e6363 --- /dev/null +++ b/src/main/java/life/qbic/xml/study/Qexperiment.java @@ -0,0 +1,216 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2018.08.22 at 04:15:01 PM CEST +// + + +package life.qbic.xml.study; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="technology_type" maxOccurs="unbounded" minOccurs="0">
+ *           <complexType>
+ *             <complexContent>
+ *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                 <sequence>
+ *                   <element name="entity_id" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded" minOccurs="0"/>
+ *                 </sequence>
+ *                 <attribute name="name" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *               </restriction>
+ *             </complexContent>
+ *           </complexType>
+ *         </element>
+ *         <element name="qfactors">
+ *           <complexType>
+ *             <complexContent>
+ *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                 <sequence>
+ *                   <element name="qcategorical" maxOccurs="unbounded" minOccurs="0">
+ *                     <complexType>
+ *                       <complexContent>
+ *                         <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                           <sequence>
+ *                             <element name="qcatlevel" maxOccurs="unbounded">
+ *                               <complexType>
+ *                                 <complexContent>
+ *                                   <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                                     <sequence>
+ *                                       <element name="entity_id" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded"/>
+ *                                     </sequence>
+ *                                     <attribute name="value" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *                                   </restriction>
+ *                                 </complexContent>
+ *                               </complexType>
+ *                             </element>
+ *                           </sequence>
+ *                           <attribute name="label" type="{}variable_name_format" />
+ *                         </restriction>
+ *                       </complexContent>
+ *                     </complexType>
+ *                   </element>
+ *                   <element name="qcontinuous" maxOccurs="unbounded" minOccurs="0">
+ *                     <complexType>
+ *                       <complexContent>
+ *                         <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                           <sequence>
+ *                             <element name="qcontlevel" maxOccurs="unbounded">
+ *                               <complexType>
+ *                                 <complexContent>
+ *                                   <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                                     <sequence>
+ *                                       <element name="entity_id" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded"/>
+ *                                     </sequence>
+ *                                     <attribute name="value" use="required" type="{http://www.w3.org/2001/XMLSchema}double" />
+ *                                   </restriction>
+ *                                 </complexContent>
+ *                               </complexType>
+ *                             </element>
+ *                           </sequence>
+ *                           <attribute name="label" use="required" type="{}variable_name_format" />
+ *                           <attribute name="unit" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *                         </restriction>
+ *                       </complexContent>
+ *                     </complexType>
+ *                   </element>
+ *                 </sequence>
+ *               </restriction>
+ *             </complexContent>
+ *           </complexType>
+ *         </element>
+ *         <element name="qproperty" maxOccurs="unbounded" minOccurs="0">
+ *           <complexType>
+ *             <complexContent>
+ *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                 <attribute name="entity_id" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *                 <attribute name="label" use="required" type="{}variable_name_format" />
+ *                 <attribute name="value" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *                 <attribute name="unit" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *               </restriction>
+ *             </complexContent>
+ *           </complexType>
+ *         </element>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "technologyType", + "qfactors", + "qproperty" +}) +@XmlRootElement(name = "qexperiment") +public class Qexperiment { + + @XmlElement(name = "technology_type") + protected List technologyType; + @XmlElement(required = true) + protected Qfactors qfactors; + protected List qproperty; + + /** + * Gets the value of the technologyType property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the technologyType property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getTechnologyType().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link TechnologyType } + * + * + */ + public List getTechnologyType() { + if (technologyType == null) { + technologyType = new ArrayList(); + } + return this.technologyType; + } + + /** + * Gets the value of the qfactors property. + * + * @return + * possible object is + * {@link Qfactors } + * + */ + public Qfactors getQfactors() { + return qfactors; + } + + /** + * Sets the value of the qfactors property. + * + * @param value + * allowed object is + * {@link Qfactors } + * + */ + public void setQfactors(Qfactors value) { + this.qfactors = value; + } + + /** + * Gets the value of the qproperty property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the qproperty property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getQproperty().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Qproperty } + * + * + */ + public List getQproperty() { + if (qproperty == null) { + qproperty = new ArrayList(); + } + return this.qproperty; + } + +} diff --git a/src/main/java/life/qbic/xml/study/Qfactors.java b/src/main/java/life/qbic/xml/study/Qfactors.java new file mode 100644 index 0000000..b847e4a --- /dev/null +++ b/src/main/java/life/qbic/xml/study/Qfactors.java @@ -0,0 +1,225 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2018.08.03 at 02:15:07 PM CEST +// + +package life.qbic.xml.study; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlType; + +import org.apache.commons.lang3.tuple.Pair; + +import life.qbic.xml.manager.StudyXMLParser; + +/** + *

+ * Java class for anonymous complex type. + * + *

+ * The following schema fragment specifies the expected content contained within + * this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="qcategorical" maxOccurs="unbounded">
+ *           <complexType>
+ *             <complexContent>
+ *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                 <sequence>
+ *                   <element name="qcatlevel" maxOccurs="unbounded">
+ *                     <complexType>
+ *                       <complexContent>
+ *                         <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                           <sequence>
+ *                             <element name="entity_id" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded"/>
+ *                           </sequence>
+ *                           <attribute name="value" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *                         </restriction>
+ *                       </complexContent>
+ *                     </complexType>
+ *                   </element>
+ *                 </sequence>
+ *                 <attribute name="label" type="{}variable_name_format" />
+ *               </restriction>
+ *             </complexContent>
+ *           </complexType>
+ *         </element>
+ *         <element name="qcontinuous" maxOccurs="unbounded">
+ *           <complexType>
+ *             <complexContent>
+ *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                 <sequence>
+ *                   <element name="qcontlevel" maxOccurs="unbounded">
+ *                     <complexType>
+ *                       <complexContent>
+ *                         <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                           <sequence>
+ *                             <element name="entity_id" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded"/>
+ *                           </sequence>
+ *                           <attribute name="value" use="required" type="{http://www.w3.org/2001/XMLSchema}double" />
+ *                         </restriction>
+ *                       </complexContent>
+ *                     </complexType>
+ *                   </element>
+ *                 </sequence>
+ *                 <attribute name="label" use="required" type="{}variable_name_format" />
+ *                 <attribute name="unit" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *               </restriction>
+ *             </complexContent>
+ *           </complexType>
+ *         </element>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { "qcategorical", "qcontinuous" }) +public class Qfactors { + + @XmlElement(required = true) + protected List qcategorical; + @XmlElement(required = true) + protected List qcontinuous; + + /** + * Gets the value of the qcategorical property. + * + *

+ * This accessor method returns a reference to the live list, not a + * snapshot. Therefore any modification you make to the returned list will + * be present inside the JAXB object. This is why there is not a + * set method for the qcategorical property. + * + *

+ * For example, to add a new item, do as follows: + * + *

+	 * getQcategorical().add(newItem);
+	 * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Qcategorical } + * + * + */ + public List getQcategorical() { + if (qcategorical == null) { + qcategorical = new ArrayList(); + } + return this.qcategorical; + } + + /** + * Gets the value of the qcontinuous property. + * + *

+ * This accessor method returns a reference to the live list, not a + * snapshot. Therefore any modification you make to the returned list will + * be present inside the JAXB object. This is why there is not a + * set method for the qcontinuous property. + * + *

+ * For example, to add a new item, do as follows: + * + *

+	 * getQcontinuous().add(newItem);
+	 * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Qcontinuous } + * + * + */ + public List getQcontinuous() { + if (qcontinuous == null) { + qcontinuous = new ArrayList(); + } + return this.qcontinuous; + } + + public Qcategorical getCatFactorOrNull(String label) { + for (Qcategorical factor : getQcategorical()) { + Qcategorical cat = (Qcategorical) factor; + if (cat.getLabel().equals(label)) { + return cat; + } + } + return null; + } + + public Qcontinuous getContFactorOrNull(String label) { + for (Qcontinuous factor : getQcontinuous()) { + Qcontinuous cont = (Qcontinuous) factor; + if (cont.getLabel().equals(label)) { + return cont; + } + } + return null; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((qcategorical == null) ? 0 : qcategorical.hashCode()); + result = prime * result + ((qcontinuous == null) ? 0 : qcontinuous.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Qfactors other = (Qfactors) obj; + if (qcategorical == null) { + if (other.qcategorical != null) + return false; + } else if (!qcategorical.equals(other.qcategorical)) + return false; + if (qcontinuous == null) { + if (other.qcontinuous != null) + return false; + } else if (!qcontinuous.equals(other.qcontinuous)) + return false; + return true; + } + + public void createNewFactor(String label, Map, List> levels) { + Qcategorical cat = StudyXMLParser.factory.createQcategorical(); + cat.setLabel(label); + cat.createLevels(levels); + getQcategorical().add(cat); + } + + public void createNewFactor(String label, String unit, Map, List> levels) { + Qcontinuous cont = StudyXMLParser.factory.createQcontinuous(); + cont.setLabel(label); + cont.setUnit(unit); + cont.createLevels(levels); + getQcontinuous().add(cont); + } +} diff --git a/src/main/java/life/qbic/xml/study/Qproperty.java b/src/main/java/life/qbic/xml/study/Qproperty.java new file mode 100644 index 0000000..9319790 --- /dev/null +++ b/src/main/java/life/qbic/xml/study/Qproperty.java @@ -0,0 +1,189 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2018.08.03 at 02:15:07 PM CEST +// + +package life.qbic.xml.study; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlType; + +import life.qbic.xml.properties.Unit; + +/** + *

+ * Java class for anonymous complex type. + * + *

+ * The following schema fragment specifies the expected content contained within + * this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <attribute name="entity_id" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="label" use="required" type="{}variable_name_format" />
+ *       <attribute name="value" use="required" type="{http://www.w3.org/2001/XMLSchema}double" />
+ *       <attribute name="unit" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "") +public class Qproperty { + + @XmlAttribute(name = "entity_id", required = true) + protected String entityId; + @XmlAttribute(name = "label", required = true) + protected String label; + @XmlAttribute(name = "value", required = true) + protected String value; + @XmlAttribute(name = "unit") + protected String unit; + + public Qproperty(String entityID, String label, String value) { + setLabel(label); + setValue(value); + setEntityId(entityID); + } + + public Qproperty(String entityID, String label, String value, Unit unit) { + this(entityID, label, value); + setUnit(unit.getValue()); + } + + public Qproperty() { + } + + /** + * Gets the value of the entityId property. + * + * @return possible object is {@link String } + * + */ + public String getEntityId() { + return entityId; + } + + /** + * Sets the value of the entityId property. + * + * @param value + * allowed object is {@link String } + * + */ + public void setEntityId(String value) { + this.entityId = value; + } + + /** + * Gets the value of the label property. + * + * @return possible object is {@link String } + * + */ + public String getLabel() { + return label; + } + + /** + * Sets the value of the label property. + * + * @param value + * allowed object is {@link String } + * + */ + public void setLabel(String value) { + this.label = value; + } + + /** + * Gets the value of the value property. + * + */ + public String getValue() { + return value; + } + + /** + * Sets the value of the value property. + * + */ + public void setValue(String value) { + this.value = value; + } + + /** + * Gets the value of the unit property. + * + * @return possible object is {@link String } + * + */ + public String getUnit() { + return unit; + } + + /** + * Sets the value of the unit property. + * + * @param value + * allowed object is {@link String } + * + */ + public void setUnit(String value) { + this.unit = value; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((entityId == null) ? 0 : entityId.hashCode()); + result = prime * result + ((label == null) ? 0 : label.hashCode()); + result = prime * result + ((unit == null) ? 0 : unit.hashCode()); + result = prime * result + ((value == null) ? 0 : value.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Qproperty other = (Qproperty) obj; + if (entityId == null) { + if (other.entityId != null) + return false; + } else if (!entityId.equals(other.entityId)) + return false; + if (label == null) { + if (other.label != null) + return false; + } else if (!label.equals(other.label)) + return false; + if (unit == null) { + if (other.unit != null) + return false; + } else if (!unit.equals(other.unit)) + return false; + if (value == null) { + if (other.value != null) + return false; + } else if (!value.equals(other.value)) + return false; + return true; + } + +} diff --git a/src/main/java/life/qbic/xml/study/TechnologyType.java b/src/main/java/life/qbic/xml/study/TechnologyType.java new file mode 100644 index 0000000..1153de9 --- /dev/null +++ b/src/main/java/life/qbic/xml/study/TechnologyType.java @@ -0,0 +1,144 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2018.08.22 at 04:15:01 PM CEST +// + +package life.qbic.xml.study; + +import java.util.HashSet; +import java.util.Set; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlType; + +/** + *

+ * Java class for anonymous complex type. + * + *

+ * The following schema fragment specifies the expected content contained within + * this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="entity_id" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded" minOccurs="0"/>
+ *       </sequence>
+ *       <attribute name="name" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { "entityId" }) +public class TechnologyType { + + /** + * temporary function to store technology without samples + * + * @param name + */ + public TechnologyType(String name) { + this.name = name; + } + + public TechnologyType() { + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((entityId == null) ? 0 : entityId.hashCode()); + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + TechnologyType other = (TechnologyType) obj; + if (entityId == null) { + if (other.entityId != null) + return false; + } else if (!entityId.equals(other.entityId)) + return false; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; + } + + @XmlElement(name = "entity_id") + protected Set entityId; + @XmlAttribute(name = "name", required = true) + protected String name; + + /** + * Gets the value of the entityId property. + * + *

+ * This accessor method returns a reference to the live list, not a + * snapshot. Therefore any modification you make to the returned list will + * be present inside the JAXB object. This is why there is not a + * set method for the entityId property. + * + *

+ * For example, to add a new item, do as follows: + * + *

+	 * getEntityId().add(newItem);
+	 * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list {@link String } + * + * + */ + public Set getEntityId() { + if (entityId == null) { + entityId = new HashSet(); + } + return this.entityId; + } + + /** + * Gets the value of the name property. + * + * @return possible object is {@link String } + * + */ + public String getName() { + return name; + } + + /** + * Sets the value of the name property. + * + * @param value + * allowed object is {@link String } + * + */ + public void setName(String value) { + this.name = value; + } + +} diff --git a/src/main/java/life/qbic/xml/study/binding.xml b/src/main/java/life/qbic/xml/study/binding.xml new file mode 100644 index 0000000..b1d2a55 --- /dev/null +++ b/src/main/java/life/qbic/xml/study/binding.xml @@ -0,0 +1,6 @@ + + + diff --git a/src/main/java/life/qbic/xml/study/qproperties.xsd b/src/main/java/life/qbic/xml/study/qproperties.xsd new file mode 100644 index 0000000..524aaee --- /dev/null +++ b/src/main/java/life/qbic/xml/study/qproperties.xsd @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/life/qbic/xml/manager/qproperties.xsd b/src/main/resources/life/qbic/xml/manager/qproperties.xsd new file mode 100644 index 0000000..5f245fa --- /dev/null +++ b/src/main/resources/life/qbic/xml/manager/qproperties.xsd @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/java/life/qbic/xml/manager/HistoryReaderTest.java b/src/test/java/life/qbic/xml/manager/HistoryReaderTest.java new file mode 100644 index 0000000..8a2bab3 --- /dev/null +++ b/src/test/java/life/qbic/xml/manager/HistoryReaderTest.java @@ -0,0 +1,6 @@ + +package life.qbic.xml.manager; + +public class HistoryReaderTest { + +} diff --git a/src/test/java/life/qbic/xml/manager/QCategoricalTest.java b/src/test/java/life/qbic/xml/manager/QCategoricalTest.java new file mode 100644 index 0000000..c7b985f --- /dev/null +++ b/src/test/java/life/qbic/xml/manager/QCategoricalTest.java @@ -0,0 +1,104 @@ +package life.qbic.xml.manager; + +import static org.junit.Assert.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; + +import javax.xml.bind.JAXBException; + +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.junit.Before; +import org.junit.Test; + +import life.qbic.xml.study.Qcategorical; +import life.qbic.xml.study.Qcatlevel; + +public class QCategoricalTest { + + private static final Logger logger = LogManager.getLogger(QCategoricalTest.class); + private Qcategorical empty; + private Qcategorical filled; + + @Before + public void setUp() throws JAXBException { + empty = StudyXMLParser.factory.createQcategorical(); + filled = StudyXMLParser.factory.createQcategorical(); + filled.setLabel("filled"); + Qcatlevel c1 = StudyXMLParser.factory.createQcatlevel(); + c1.setValue("1"); + c1.getEntityId().add("a"); + Qcatlevel c2 = StudyXMLParser.factory.createQcatlevel(); + c2.setValue("2"); + c2.getEntityId().addAll(Arrays.asList("b", "c")); + filled.getQcatlevel().addAll(new ArrayList(Arrays.asList(c1, c2))); + } + + @Test + public void testCreateLevels() { + Map, List> levels = new HashMap, List>(); + levels.put(new ImmutablePair("3", null), Arrays.asList("d")); + levels.put(new ImmutablePair("4", null), Arrays.asList("e", "f")); + empty.createLevels(levels); + + assertEquals(empty.getQcatlevel().size(), 2); + assertEquals(empty.getLevelOrNull("1"), null); + assertEquals(empty.getLevelOrNull("3").getEntityId(), new HashSet(Arrays.asList("d"))); + assertEquals(empty.getLevelOrNull("4").getEntityId(), new HashSet(Arrays.asList("e","f"))); + + filled.createLevels(levels); + assertEquals(filled.getQcatlevel().size(), 4); + assertEquals(filled.getLevelOrNull("0"), null); + assertEquals(filled.getLevelOrNull("1").getEntityId(), new HashSet(Arrays.asList("a"))); + assertEquals(filled.getLevelOrNull("2").getEntityId(), new HashSet(Arrays.asList("b","c"))); + assertEquals(filled.getLevelOrNull("3").getEntityId(), new HashSet(Arrays.asList("d"))); + assertEquals(filled.getLevelOrNull("4").getEntityId(), new HashSet(Arrays.asList("e","f"))); + } + + @Test + public void testUpdate() { + Map, List> levels = new HashMap, List>(); + levels.put(new ImmutablePair("2", null), Arrays.asList("e", "f")); + levels.put(new ImmutablePair("3", null), Arrays.asList("g", "h")); + empty.update(levels); + + assertEquals(empty.getQcatlevel().size(), 2); + assertEquals(empty.getLevelOrNull("1"), null); + assertEquals(empty.getLevelOrNull("2").getEntityId(), new HashSet(Arrays.asList("e","f"))); + assertEquals(empty.getLevelOrNull("3").getEntityId(), new HashSet(Arrays.asList("g","h"))); + + filled.update(levels); + assertEquals(filled.getQcatlevel().size(), 3); + assertEquals(filled.getLevelOrNull("0"), null); + assertEquals(filled.getLevelOrNull("1").getEntityId(), new HashSet(Arrays.asList("a"))); + assertEquals(filled.getLevelOrNull("2").getEntityId(), new HashSet(Arrays.asList("b","c","e","f"))); + assertEquals(filled.getLevelOrNull("3").getEntityId(), new HashSet(Arrays.asList("g","h"))); + } + + @Test + public void testUpdateOverwrite() { + Map, List> overwrite = new HashMap, List>(); + overwrite.put(new ImmutablePair("1", null), Arrays.asList("b", "f")); + overwrite.put(new ImmutablePair("2", null), Arrays.asList("a", "h")); + filled.update(overwrite); + assertEquals(filled.getQcatlevel().size(), 2); + assertEquals(filled.getLevelOrNull("0"), null); + assertEquals(filled.getLevelOrNull("1").getEntityId(), new HashSet(Arrays.asList("b","f"))); + assertEquals(filled.getLevelOrNull("2").getEntityId(), new HashSet(Arrays.asList("a","c","h"))); + } + + @Test + public void testgetLevelOrNull() { + assertEquals(null, empty.getLevelOrNull("1")); + assertEquals(null, filled.getLevelOrNull("nonexistent")); + assertTrue(filled.getLevelOrNull("1") instanceof Qcatlevel); + } + +} diff --git a/src/test/java/life/qbic/xml/manager/QContinuousTest.java b/src/test/java/life/qbic/xml/manager/QContinuousTest.java new file mode 100644 index 0000000..584fd8e --- /dev/null +++ b/src/test/java/life/qbic/xml/manager/QContinuousTest.java @@ -0,0 +1,103 @@ +package life.qbic.xml.manager; + +import static org.junit.Assert.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; + +import javax.xml.bind.JAXBException; + +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.junit.Before; +import org.junit.Test; + +import life.qbic.xml.study.Qcontinuous; +import life.qbic.xml.study.Qcontlevel; + +public class QContinuousTest { + + private static final Logger logger = LogManager.getLogger(QContinuousTest.class); + private Qcontinuous empty; + private Qcontinuous filled; + + @Before + public void setUp() throws JAXBException { + empty = StudyXMLParser.factory.createQcontinuous(); + filled = StudyXMLParser.factory.createQcontinuous(); + filled.setLabel("filled"); + Qcontlevel c1 = StudyXMLParser.factory.createQcontlevel(); + c1.setValue("1"); + c1.getEntityId().add("a"); + Qcontlevel c2 = StudyXMLParser.factory.createQcontlevel(); + c2.setValue("2"); + c2.getEntityId().addAll(Arrays.asList("b", "c")); + filled.getQcontlevel().addAll(new ArrayList(Arrays.asList(c1, c2))); + } + + @Test + public void testCreateLevels() { + Map, List> levels = new HashMap, List>(); + levels.put(new ImmutablePair("3", "T"), Arrays.asList("d")); + levels.put(new ImmutablePair("4", "T"), Arrays.asList("e", "f")); + empty.createLevels(levels); + + assertEquals(empty.getQcontlevel().size(), 2); + assertEquals(empty.getLevelOrNull("1"), null); + assertEquals(empty.getLevelOrNull("3").getEntityId(), new HashSet(Arrays.asList("d"))); + assertEquals(empty.getLevelOrNull("4").getEntityId(), new HashSet(Arrays.asList("e","f"))); + + filled.createLevels(levels); + assertEquals(filled.getQcontlevel().size(), 4); + assertEquals(filled.getLevelOrNull("0"), null); + assertEquals(filled.getLevelOrNull("1").getEntityId(), new HashSet(Arrays.asList("a"))); + assertEquals(filled.getLevelOrNull("2").getEntityId(), new HashSet(Arrays.asList("b","c"))); + assertEquals(filled.getLevelOrNull("3").getEntityId(), new HashSet(Arrays.asList("d"))); + assertEquals(filled.getLevelOrNull("4").getEntityId(), new HashSet(Arrays.asList("e","f"))); + } + + @Test + public void testUpdate() { + Map, List> levels = new HashMap, List>(); + levels.put(new ImmutablePair("2", "T"), Arrays.asList("e", "f")); + levels.put(new ImmutablePair("3", "T"), Arrays.asList("g", "h")); + empty.update(levels); + + assertEquals(empty.getQcontlevel().size(), 2); + assertEquals(empty.getLevelOrNull("1"), null); + assertEquals(empty.getLevelOrNull("2").getEntityId(), new HashSet(Arrays.asList("e","f"))); + assertEquals(empty.getLevelOrNull("3").getEntityId(), new HashSet(Arrays.asList("g","h"))); + + filled.update(levels); + assertEquals(filled.getQcontlevel().size(), 3); + assertEquals(filled.getLevelOrNull("0"), null); + assertEquals(filled.getLevelOrNull("1").getEntityId(), new HashSet(Arrays.asList("a"))); + assertEquals(filled.getLevelOrNull("2").getEntityId(), new HashSet(Arrays.asList("b","c","e","f"))); + assertEquals(filled.getLevelOrNull("3").getEntityId(), new HashSet(Arrays.asList("g","h"))); + } + + @Test + public void testUpdateOverwrite() { + Map, List> overwrite = new HashMap, List>(); + overwrite.put(new ImmutablePair("1", "T"), Arrays.asList("b", "f")); + overwrite.put(new ImmutablePair("2", "T"), Arrays.asList("a", "h")); + filled.update(overwrite); + assertEquals(filled.getQcontlevel().size(), 2); + assertEquals(filled.getLevelOrNull("0"), null); + assertEquals(filled.getLevelOrNull("1").getEntityId(), new HashSet(Arrays.asList("b","f"))); + assertEquals(filled.getLevelOrNull("2").getEntityId(), new HashSet(Arrays.asList("a","c","h"))); + } + + @Test + public void testgetLevelOrNull() { + assertEquals(null, empty.getLevelOrNull("1")); + assertEquals(null, filled.getLevelOrNull("nonexistent")); + assertTrue(filled.getLevelOrNull("1") instanceof Qcontlevel); + } +} diff --git a/src/test/java/life/qbic/xml/manager/QfactorsTest.java b/src/test/java/life/qbic/xml/manager/QfactorsTest.java new file mode 100644 index 0000000..29f01ba --- /dev/null +++ b/src/test/java/life/qbic/xml/manager/QfactorsTest.java @@ -0,0 +1,70 @@ +package life.qbic.xml.manager; + +import static org.junit.Assert.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.xml.bind.JAXBElement; +import javax.xml.bind.JAXBException; + +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.junit.Before; +import org.junit.Test; + +import life.qbic.xml.properties.Unit; +import life.qbic.xml.study.Qexperiment; +import life.qbic.xml.study.Qfactors; +import life.qbic.xml.study.Qproperty; +import life.qbic.xml.study.TechnologyType; + +public class QfactorsTest { + + private static final Logger logger = LogManager.getLogger(QfactorsTest.class); + + private Qfactors factors = new Qfactors(); + private JAXBElement fullDesign; + + private Map, List>> expDesign; + + @Before + public void setUp() throws JAXBException { + + expDesign = new HashMap, List>>(); + Map, List> levelsFactor1 = new HashMap, List>(); + Pair level1Value1 = new ImmutablePair("10", "g"); + levelsFactor1.put(level1Value1, new ArrayList(Arrays.asList("1", "2"))); + Pair level1Value2 = new ImmutablePair("20", "g"); + levelsFactor1.put(level1Value2, new ArrayList(Arrays.asList("3", "4", "5"))); + Pair level1Value3 = new ImmutablePair("30", "g"); + levelsFactor1.put(level1Value3, new ArrayList(Arrays.asList("6"))); + + expDesign.put("weight", levelsFactor1); + + Map, List> levelsFactor2 = new HashMap, List>(); + Pair level2Value1 = new ImmutablePair("disease", null); + levelsFactor2.put(level2Value1, new ArrayList(Arrays.asList("1", "2", "3"))); + Pair level2Value2 = new ImmutablePair("control", null); + levelsFactor2.put(level2Value2, new ArrayList(Arrays.asList("4", "5", "6"))); + + expDesign.put("phenotype", levelsFactor2); + + factors.createNewFactor("weight", "g", levelsFactor1); + factors.createNewFactor("phenotype", levelsFactor2); + } + + @Test + public void testCreateNewFactor() { + assertEquals(factors.getQcategorical().size(), 1); + assertEquals(factors.getQcontinuous().size(), 1); + } + +} diff --git a/src/test/java/life/qbic/xml/manager/StudyXMLParserTest.java b/src/test/java/life/qbic/xml/manager/StudyXMLParserTest.java new file mode 100644 index 0000000..18040d6 --- /dev/null +++ b/src/test/java/life/qbic/xml/manager/StudyXMLParserTest.java @@ -0,0 +1,446 @@ +package life.qbic.xml.manager; + +import static org.junit.Assert.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.xml.bind.JAXBElement; +import javax.xml.bind.JAXBException; + +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.junit.Before; +import org.junit.Test; + +import life.qbic.xml.properties.Property; +import life.qbic.xml.properties.Unit; +import life.qbic.xml.study.Qexperiment; +import life.qbic.xml.study.Qproperty; +import life.qbic.xml.study.TechnologyType; + +public class StudyXMLParserTest { + + private static final Logger logger = LogManager.getLogger(StudyXMLParserTest.class); + + private StudyXMLParser parser; + private JAXBElement empty; + private JAXBElement fullDesign; + private JAXBElement noProps; + private JAXBElement noTypes; + private JAXBElement noPropsNoFactors; + private JAXBElement noFactors; + + private Map, List>> expDesign; + private Map> techTypes; + private Map> otherProps; + + @Before + public void setUp() throws JAXBException { + parser = new StudyXMLParser(); + empty = parser.getEmptyXML(); + + techTypes = new HashMap>(); + Set t1 = new HashSet(Arrays.asList("1", "2", "3")); + Set t2 = new HashSet(Arrays.asList("1", "4", "5")); + Set t3 = new HashSet(Arrays.asList("4", "5", "6")); + techTypes.put("type 1", t1); + techTypes.put("type 2", t2); + techTypes.put("type 3", t3); + + expDesign = new HashMap, List>>(); + Map, List> levelsFactor1 = new HashMap, List>(); + Pair level1Value1 = new ImmutablePair("10", "g"); + levelsFactor1.put(level1Value1, new ArrayList(Arrays.asList("1", "2"))); + Pair level1Value2 = new ImmutablePair("20", "g"); + levelsFactor1.put(level1Value2, new ArrayList(Arrays.asList("3", "4", "5"))); + Pair level1Value3 = new ImmutablePair("30", "g"); + levelsFactor1.put(level1Value3, new ArrayList(Arrays.asList("6"))); + + expDesign.put("weight", levelsFactor1); + + Map, List> levelsFactor2 = new HashMap, List>(); + Pair level2Value1 = new ImmutablePair("disease", null); + levelsFactor2.put(level2Value1, new ArrayList(Arrays.asList("1", "2", "3"))); + Pair level2Value2 = new ImmutablePair("control", null); + levelsFactor2.put(level2Value2, new ArrayList(Arrays.asList("4", "5", "6"))); + + expDesign.put("phenotype", levelsFactor2); + + otherProps = new HashMap>(); + List props1 = new ArrayList(); + props1.add(new Qproperty("ship1", "name", "Cargo Cult")); + props1.add(new Qproperty("ship1", "length", "50000", Unit.Meter)); + List props2 = new ArrayList(); + props2.add(new Qproperty("ship2", "name", "Prosthetic Conscience")); + props2.add(new Qproperty("ship2", "length", "56000", Unit.Meter)); + props2.add(new Qproperty("ship2", "class", "unknown")); + otherProps.put("ship1", props1); + otherProps.put("ship2", props2); + + List techs = parser.mapToTechnologyTypes(techTypes); + + fullDesign = parser.createNewDesign(techs, expDesign, otherProps); + noProps = parser.createNewDesign(techs, expDesign, new HashMap>()); + noTypes = parser.createNewDesign(new ArrayList(), expDesign, otherProps); + noPropsNoFactors = parser.createNewDesign(techs, new HashMap, List>>(), + new HashMap>()); + noFactors = parser.createNewDesign(techs, new HashMap, List>>(), + otherProps); + } + + @Test + public void testMapToTechnologyTypes() { + List techs = parser.mapToTechnologyTypes(techTypes); + for (TechnologyType t : techs) { + String name = t.getName(); + assertEquals(techTypes.get(name), t.getEntityId()); + } + } + + @Test + public void testGetFactorsAndPropertiesForSampleCode() { + List ship2 = parser.getFactorsAndPropertiesForSampleCode(fullDesign, "ship2"); + List s5 = parser.getFactorsAndPropertiesForSampleCode(fullDesign, "5"); + List ship2_empty = parser.getFactorsAndPropertiesForSampleCode(noProps, "ship2"); + List s5_empty = parser.getFactorsAndPropertiesForSampleCode(noFactors, "5"); + + assertTrue(ship2_empty.isEmpty()); + assertTrue(s5_empty.isEmpty()); + assertEquals(ship2.size(), 3); + assertEquals(s5.size(), 2); + } + + @Test + public void testRemoveReferencesToMissingIDs() throws JAXBException { + Set lessIDs = new HashSet(Arrays.asList("1", "2", "3", "4", "5", "ship2")); + Set moreIDs = new HashSet( + Arrays.asList("8", "1", "2", "3", "4", "5", "6", "7", "ship1", "ship2")); + Set sameIDs = new HashSet(Arrays.asList("1", "2", "3", "4", "5", "6", "ship1", "ship2")); + + JAXBElement fullSame = parser.removeReferencesToMissingIDs(fullDesign, sameIDs, false); + JAXBElement fullLess = parser.removeReferencesToMissingIDs(fullDesign, lessIDs, false); + JAXBElement fullMore = parser.removeReferencesToMissingIDs(fullDesign, moreIDs, false); + JAXBElement removedFactorIDs = parser.removeReferencesToMissingIDs(fullDesign, + new HashSet(Arrays.asList("ship1", "ship2")), false); + JAXBElement removedAllIDs = parser.removeReferencesToMissingIDs(fullDesign, + new HashSet(), false); + + // if we don't remove IDs, everything should stay the same + assertTrue(parser.getFactorsForLabelsAndSamples(fullSame) + .containsKey(new ImmutablePair("weight", "1"))); + assertTrue(parser.getFactorsForLabelsAndSamples(fullSame) + .containsKey(new ImmutablePair("weight", "2"))); + assertTrue(parser.getFactorsForLabelsAndSamples(fullSame) + .containsKey(new ImmutablePair("weight", "3"))); + assertTrue(parser.getFactorsForLabelsAndSamples(fullSame) + .containsKey(new ImmutablePair("weight", "4"))); + assertTrue(parser.getFactorsForLabelsAndSamples(fullSame) + .containsKey(new ImmutablePair("weight", "5"))); + assertTrue(parser.getFactorsForLabelsAndSamples(fullSame) + .containsKey(new ImmutablePair("weight", "6"))); + assertTrue(parser.getFactorsForLabelsAndSamples(fullSame) + .containsKey(new ImmutablePair("phenotype", "1"))); + assertTrue(parser.getFactorsForLabelsAndSamples(fullSame) + .containsKey(new ImmutablePair("phenotype", "2"))); + assertTrue(parser.getFactorsForLabelsAndSamples(fullSame) + .containsKey(new ImmutablePair("phenotype", "3"))); + assertTrue(parser.getFactorsForLabelsAndSamples(fullSame) + .containsKey(new ImmutablePair("phenotype", "4"))); + assertTrue(parser.getFactorsForLabelsAndSamples(fullSame) + .containsKey(new ImmutablePair("phenotype", "5"))); + assertTrue(parser.getFactorsForLabelsAndSamples(fullSame) + .containsKey(new ImmutablePair("phenotype", "6"))); + + // more IDs, nothing should change + assertEquals(parser.getFactorsForLabelsAndSamples(fullMore), parser.getFactorsForLabelsAndSamples(fullSame)); + + // id 6 removed + assertTrue(parser.getFactorsForLabelsAndSamples(fullLess) + .containsKey(new ImmutablePair("weight", "1"))); + assertTrue(parser.getFactorsForLabelsAndSamples(fullLess) + .containsKey(new ImmutablePair("weight", "2"))); + assertTrue(parser.getFactorsForLabelsAndSamples(fullLess) + .containsKey(new ImmutablePair("weight", "3"))); + assertTrue(parser.getFactorsForLabelsAndSamples(fullLess) + .containsKey(new ImmutablePair("weight", "4"))); + assertTrue(parser.getFactorsForLabelsAndSamples(fullLess) + .containsKey(new ImmutablePair("weight", "5"))); + assertFalse(parser.getFactorsForLabelsAndSamples(fullLess) + .containsKey(new ImmutablePair("weight", "6"))); + assertTrue(parser.getFactorsForLabelsAndSamples(fullLess) + .containsKey(new ImmutablePair("phenotype", "1"))); + assertTrue(parser.getFactorsForLabelsAndSamples(fullLess) + .containsKey(new ImmutablePair("phenotype", "2"))); + assertTrue(parser.getFactorsForLabelsAndSamples(fullLess) + .containsKey(new ImmutablePair("phenotype", "3"))); + assertTrue(parser.getFactorsForLabelsAndSamples(fullLess) + .containsKey(new ImmutablePair("phenotype", "4"))); + assertTrue(parser.getFactorsForLabelsAndSamples(fullLess) + .containsKey(new ImmutablePair("phenotype", "5"))); + assertFalse(parser.getFactorsForLabelsAndSamples(fullLess) + .containsKey(new ImmutablePair("phenotype", "6"))); + + // all IDs removed, should be empty + assertTrue(parser.getFactorsForLabelsAndSamples(removedFactorIDs).isEmpty()); + + // more ids, should be no change + assertTrue(parser.getPropertiesForSampleCode(fullMore).containsKey("ship1")); + assertTrue(parser.getPropertiesForSampleCode(fullMore).containsKey("ship2")); + assertEquals(parser.getPropertiesForSampleCode(fullMore).size(), 2); + // same ids, no change + assertTrue(parser.getPropertiesForSampleCode(fullSame).containsKey("ship1")); + assertTrue(parser.getPropertiesForSampleCode(fullSame).containsKey("ship2")); + // ship1 removed + assertFalse(parser.getPropertiesForSampleCode(fullLess).containsKey("ship1")); + assertTrue(parser.getPropertiesForSampleCode(fullLess).containsKey("ship2")); + assertEquals(parser.getPropertiesForSampleCode(fullLess).size(), 1); + // only factor and tech IDs removed + assertEquals(parser.getPropertiesForSampleCode(removedFactorIDs).size(), 2); + // everything removed + assertTrue(parser.getPropertiesForSampleCode(removedAllIDs).isEmpty()); + + assertEquals(parser.getSamplesForTechTypes(fullDesign), parser.getSamplesForTechTypes(fullMore)); + assertEquals(parser.getSamplesForTechTypes(fullDesign), parser.getSamplesForTechTypes(fullSame)); + + assertEquals(parser.getSamplesForTechTypes(fullLess).size(), 3); + assertTrue(parser.getSamplesForTechTypes(removedFactorIDs).isEmpty()); + } + + @Test + public void testMergeDesigns() { + //TODO + } + + @Test + public void testGetSamplesForTechTypes() { + List fullTech = parser.getSamplesForTechTypes(fullDesign); + List noTech = parser.getSamplesForTechTypes(noTypes); + List noPropsNoFactorsTech = parser.getSamplesForTechTypes(noPropsNoFactors); + List emptyTech = parser.getSamplesForTechTypes(empty); + List noFactorsTech = parser.getSamplesForTechTypes(noFactors); + List noPropsTech = parser.getSamplesForTechTypes(noProps); + + assertEquals(noPropsTech, fullTech); + assertEquals(noPropsNoFactorsTech, fullTech); + assertEquals(noFactorsTech, fullTech); + + assertEquals(emptyTech, noTech); + + assertTrue(noTech.isEmpty()); + + Set t1 = new HashSet(Arrays.asList("1", "2", "3")); + Set t2 = new HashSet(Arrays.asList("1", "4", "5")); + Set t3 = new HashSet(Arrays.asList("4", "5", "6")); + techTypes.put("type 1", t1); + techTypes.put("type 2", t2); + techTypes.put("type 3", t3); + for (TechnologyType t : fullTech) { + assertEquals(techTypes.get(t.getName()), t.getEntityId()); + } + } + + @Test + public void testGetEmptyXML() { + Qexperiment empty = this.empty.getValue(); + assertTrue(empty.getTechnologyType().isEmpty()); + assertEquals(empty.getQfactors(), null); + assertTrue(empty.getQproperty().isEmpty()); + } + + @Test + public void testCreateNewDesign() { + Qexperiment fullDesign = this.fullDesign.getValue(); + assertTrue(fullDesign.getQfactors() != null); + assertFalse(fullDesign.getQproperty().isEmpty()); + assertEquals(fullDesign.getTechnologyType().size(), 3); + assertEquals(fullDesign.getQfactors().getQcategorical().get(0).getLabel(), "phenotype"); + assertEquals(fullDesign.getQfactors().getQcategorical().get(0).getQcatlevel().size(), 2); + assertEquals(fullDesign.getQfactors().getQcontinuous().get(0).getLabel(), "weight"); + assertEquals(fullDesign.getQfactors().getQcontinuous().get(0).getQcontlevel().size(), 3); + int propCount = 0; + for (List props : otherProps.values()) { + propCount += props.size(); + } + assertEquals(fullDesign.getQproperty().size(), propCount); + + Qexperiment noProps = this.noProps.getValue(); + assertEquals(noProps.getTechnologyType().size(), 3); + assertTrue(noProps.getQproperty().isEmpty()); + assertEquals(noProps.getQfactors().getQcategorical().get(0).getLabel(), "phenotype"); + assertEquals(noProps.getQfactors().getQcategorical().get(0).getQcatlevel().size(), 2); + assertEquals(noProps.getQfactors().getQcontinuous().get(0).getLabel(), "weight"); + assertEquals(noProps.getQfactors().getQcontinuous().get(0).getQcontlevel().size(), 3); + + Qexperiment noTypes = this.noTypes.getValue(); + assertTrue(noTypes.getTechnologyType().isEmpty()); + propCount = 0; + for (List props : otherProps.values()) { + propCount += props.size(); + } + assertEquals(noTypes.getQproperty().size(), propCount); + assertEquals(noTypes.getQfactors().getQcategorical().get(0).getLabel(), "phenotype"); + assertEquals(noTypes.getQfactors().getQcategorical().get(0).getQcatlevel().size(), 2); + assertEquals(noTypes.getQfactors().getQcontinuous().get(0).getLabel(), "weight"); + assertEquals(noTypes.getQfactors().getQcontinuous().get(0).getQcontlevel().size(), 3); + + Qexperiment noPropsNoFactors = this.noPropsNoFactors.getValue(); + assertEquals(noPropsNoFactors.getTechnologyType().size(), 3); + assertTrue(noPropsNoFactors.getQproperty().isEmpty()); + assertTrue(noPropsNoFactors.getQfactors().getQcategorical().isEmpty()); + assertTrue(noPropsNoFactors.getQfactors().getQcontinuous().isEmpty()); + + Qexperiment noFactors = this.noFactors.getValue(); + propCount = 0; + for (List props : otherProps.values()) { + propCount += props.size(); + } + assertEquals(noFactors.getQproperty().size(), propCount); + assertEquals(noFactors.getTechnologyType().size(), 3); + assertTrue(noFactors.getQfactors().getQcategorical().isEmpty()); + assertTrue(noFactors.getQfactors().getQcontinuous().isEmpty()); + } + + @Test + public void testParseXMLString() throws JAXBException { + String xml1 = "" + "" + + " " + "QABCD004AF" + "" + + " QABCD004AF" + + " " + " " + + " " + " QABCD003AB" + + " QABCD004AF" + " " + + " " + " QABCD005AB" + + " QABCD006AF" + " " + + " " + " QABCD008AB" + + " " + " " + " " + + " " + " QABCD003AB" + + " QABCD004AF" + " " + + " " + " QABCD005AB" + + " QABCD006AF" + " " + " " + + " " + " " + + " QABCD003AB" + " QABCD004AF" + + " " + " " + + " QABCD005AB" + " QABCD006AF" + + " " + " " + + " QABCD008AB" + " " + + " " + " " + + " " + + " " + + ""; + + assertTrue(parser.validate(xml1)); + JAXBElement firstParse1 = parser.parseXMLString(xml1); + JAXBElement secondParse1 = parser.parseXMLString(parser.toString(firstParse1)); + assertEquals(secondParse1.getValue().getTechnologyType(), firstParse1.getValue().getTechnologyType()); + List q2 = secondParse1.getValue().getQproperty(); + List q1 = firstParse1.getValue().getQproperty(); + for (int i = 0; i < q1.size(); i++) { + assertEquals(q1.get(i), q2.get(i)); + } + assertEquals(secondParse1.getValue().getQfactors(), firstParse1.getValue().getQfactors()); + + String xml2 = "" + "" + + " " + "" + + " " + + " " + + ""; + + assertTrue(parser.validate(xml2)); + JAXBElement firstParse2 = parser.parseXMLString(xml2); + JAXBElement secondParse2 = parser.parseXMLString(parser.toString(firstParse2)); + q2 = secondParse2.getValue().getQproperty(); + q1 = firstParse2.getValue().getQproperty(); + for (int i = 0; i < q1.size(); i++) { + assertEquals(q1.get(i), q2.get(i)); + } + assertEquals(secondParse2.getValue().getQfactors(), firstParse2.getValue().getQfactors()); + + String xml3 = " "; + assertTrue(parser.validate(xml3)); + + assertFalse(parser.validate(parser.toString(empty))); + } + + @Test + public void testToString() throws JAXBException { + assertNotEquals(null, parser.toString(empty)); + assertNotEquals("", parser.toString(empty)); + + logger.info("testing empty xml, expect failure"); + assertFalse(parser.validate(parser.toString(empty))); + logger.info(""); + logger.info("testing full design"); + assertTrue(parser.validate(parser.toString(fullDesign))); + logger.info(""); + logger.info("testing no factors xml"); + assertTrue(parser.validate(parser.toString(noFactors))); + logger.info(""); + logger.info("testing no props xml"); + assertTrue(parser.validate(parser.toString(noProps))); + logger.info(""); + logger.info("testing props and no factors xml"); + assertTrue(parser.validate(parser.toString(noPropsNoFactors))); + logger.info(""); + logger.info("testing omics types xml"); + assertTrue(parser.validate(parser.toString(noTypes))); + } + + @Test + public void testGetFactorLabels() { + Set labels = new HashSet(Arrays.asList("weight", "phenotype")); + assertEquals(parser.getFactorLabels(fullDesign), labels); + assertTrue(parser.getFactorLabels(noFactors).isEmpty()); + assertEquals(parser.getFactorLabels(noProps), labels); + assertTrue(parser.getFactorLabels(noPropsNoFactors).isEmpty()); + assertEquals(parser.getFactorLabels(noTypes), labels); + assertTrue(parser.getFactorLabels(empty).isEmpty()); + } + + @Test + public void testGetFactorsForLabelsAndSamples() { + Set> expected = new HashSet>(); + expected.add(new ImmutablePair("phenotype", "1")); + expected.add(new ImmutablePair("phenotype", "2")); + expected.add(new ImmutablePair("phenotype", "3")); + expected.add(new ImmutablePair("phenotype", "4")); + expected.add(new ImmutablePair("phenotype", "5")); + expected.add(new ImmutablePair("phenotype", "6")); + expected.add(new ImmutablePair("weight", "1")); + expected.add(new ImmutablePair("weight", "2")); + expected.add(new ImmutablePair("weight", "3")); + expected.add(new ImmutablePair("weight", "4")); + expected.add(new ImmutablePair("weight", "5")); + expected.add(new ImmutablePair("weight", "6")); + + assertEquals(parser.getFactorsForLabelsAndSamples(fullDesign).keySet(), expected); + assertEquals(parser.getFactorsForLabelsAndSamples(fullDesign).size(), 12); + assertTrue(parser.getFactorsForLabelsAndSamples(noFactors).isEmpty()); + assertTrue(parser.getFactorsForLabelsAndSamples(empty).isEmpty()); + } + + @Test + public void testGetPropertiesForSampleCode() { + Map> parsedProps = parser.getPropertiesForSampleCode(fullDesign); + for (String id : otherProps.keySet()) { + assertEquals(otherProps.get(id).size(), parsedProps.get(id).size()); + } + parsedProps = parser.getPropertiesForSampleCode(noFactors); + for (String id : otherProps.keySet()) { + assertEquals(otherProps.get(id).size(), parsedProps.get(id).size()); + } + parsedProps = parser.getPropertiesForSampleCode(noTypes); + for (String id : otherProps.keySet()) { + assertEquals(otherProps.get(id).size(), parsedProps.get(id).size()); + } + assertTrue(parser.getPropertiesForSampleCode(empty).isEmpty()); + assertTrue(parser.getPropertiesForSampleCode(noProps).isEmpty()); + } + +} diff --git a/src/test/resources/life/qbic/xml/manager/qproperties.xsd b/src/test/resources/life/qbic/xml/manager/qproperties.xsd new file mode 100644 index 0000000..5f245fa --- /dev/null +++ b/src/test/resources/life/qbic/xml/manager/qproperties.xsd @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From f00de3b10a4c7f62d67f067531441f27863e6eb0 Mon Sep 17 00:00:00 2001 From: Sven Fillinger Date: Wed, 23 Sep 2020 13:56:51 +0200 Subject: [PATCH 04/12] Reference new parent pom 3.0.0 --- pom.xml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 5d5d6ae..a627da7 100644 --- a/pom.xml +++ b/pom.xml @@ -5,9 +5,8 @@ life.qbic parent-pom - 2.4.0-SNAPSHOT + 3.0.0 - xml-manager-lib jar 1.6.0-SNAPSHOT @@ -15,9 +14,9 @@ http://maven.apache.org - org.apache.commons - commons-lang3 - + org.apache.commons + commons-lang3 + From c5761a9dd537b556be1b4795db14c0201dd79711 Mon Sep 17 00:00:00 2001 From: Sven Fillinger Date: Wed, 23 Sep 2020 13:59:32 +0200 Subject: [PATCH 05/12] Fix maven syntax --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3dff668..e06879e 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ xml-manager-lib jar - 1.6.0/version> + 1.6.0 XML Property Parser Library http://maven.apache.org From b0ea7f2bae6afd76787105f0cecaeb370704287c Mon Sep 17 00:00:00 2001 From: Sven Fillinger Date: Wed, 23 Sep 2020 14:01:14 +0200 Subject: [PATCH 06/12] Add Changelog --- CHANGELOG.rst | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 CHANGELOG.rst diff --git a/CHANGELOG.rst b/CHANGELOG.rst new file mode 100644 index 0000000..d8632d2 --- /dev/null +++ b/CHANGELOG.rst @@ -0,0 +1,20 @@ +========== +Changelog +========== + +This document records all notable changes to `HTTPie `_. +This project adheres to `Semantic Versioning `_. + +1.6.0 (2020-09-23) +------------------ + +**Added** + +* Use parent pom 3.0.0 + +**Fixed** + +**Dependencies** + +**Deprecated** + From 4ec9048de28650d2614e020f33ed1f1193851472 Mon Sep 17 00:00:00 2001 From: Sven F Date: Wed, 23 Sep 2020 14:08:55 +0200 Subject: [PATCH 07/12] Update LICENSE --- LICENSE | 695 ++------------------------------------------------------ 1 file changed, 21 insertions(+), 674 deletions(-) diff --git a/LICENSE b/LICENSE index 94a9ed0..116b458 100644 --- a/LICENSE +++ b/LICENSE @@ -1,674 +1,21 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. +MIT License + +Copyright (c) 2020 QBiC + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From e12724aea5c8371a5bd393fdd6786550a6395285 Mon Sep 17 00:00:00 2001 From: Sven F Date: Wed, 23 Sep 2020 14:11:01 +0200 Subject: [PATCH 08/12] Include tagged commits --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index e9c89bb..428f2ee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,6 +19,8 @@ branches: only: - master - development + # Travis treats pushed tags as branches + - /^[vV]?\d+\.\d+\.\d+$/ # matches e.g., v1.2.3, 1.2.3, V1.2.3 # added to make logs look cleaner, crisper, certified fresh before_install: unset _JAVA_OPTIONS From 1defbb82986d6a4b4d94c63e0b08194dd03e597a Mon Sep 17 00:00:00 2001 From: Steffengreiner Date: Wed, 2 Dec 2020 15:25:01 +0100 Subject: [PATCH 09/12] Add necessary dependencies and osgi framework to pom --- pom.xml | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e06879e..79795a9 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,14 @@ org.apache.commons commons-lang3 + provided + + com.sun.xml.bind + jaxb-core + 2.2.7 + provided + @@ -30,6 +37,31 @@ http://qbic-repo.qbic.uni-tuebingen.de:8081/repository/maven-releases - + + + + org.apache.maven.plugins + maven-jar-plugin + 3.2.0 + + + ${project.build.outputDirectory}/META-INF/MANIFEST.MF + + + + + biz.aQute.bnd + bnd-maven-plugin + 5.1.2 + + + + bnd-process + + + + + + From 9f85476329b0bc9909dfa6cc7c651075dff3cde3 Mon Sep 17 00:00:00 2001 From: Steffengreiner Date: Wed, 2 Dec 2020 15:25:50 +0100 Subject: [PATCH 10/12] Add bnd file --- bnd.bnd | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 bnd.bnd diff --git a/bnd.bnd b/bnd.bnd new file mode 100644 index 0000000..8173906 --- /dev/null +++ b/bnd.bnd @@ -0,0 +1,7 @@ +Bundle-Name: ${project.name} +Bundle-Version: ${project.version} +Bundle-SymbolicName: ${project.groupId}.${project.artifactId} +Bundle-URL: ${project.url} + +Export-Package: life.qbic.xml*;version="${project.version}" +Import-Package: * \ No newline at end of file From 15567f2e53ad6090a3d9e0c24b9a57e314046259 Mon Sep 17 00:00:00 2001 From: Steffengreiner Date: Wed, 2 Dec 2020 17:32:12 +0100 Subject: [PATCH 11/12] Add profiles to pom to allow for osgi and non-osgi compilation --- pom.xml | 73 +++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 45 insertions(+), 28 deletions(-) diff --git a/pom.xml b/pom.xml index 79795a9..185d1f8 100644 --- a/pom.xml +++ b/pom.xml @@ -16,13 +16,13 @@ org.apache.commons commons-lang3 - provided + ${osgi.scope} com.sun.xml.bind jaxb-core 2.2.7 - provided + ${osgi.scope} @@ -37,31 +37,48 @@ http://qbic-repo.qbic.uni-tuebingen.de:8081/repository/maven-releases - - - - org.apache.maven.plugins - maven-jar-plugin - 3.2.0 - - - ${project.build.outputDirectory}/META-INF/MANIFEST.MF - - - - - biz.aQute.bnd - bnd-maven-plugin - 5.1.2 - - - - bnd-process - - - - - - + + + no-liferay + + true + + + compile + + + + liferay + + provided + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.2.0 + + + ${project.build.outputDirectory}/META-INF/MANIFEST.MF + + + + + biz.aQute.bnd + bnd-maven-plugin + 5.1.2 + + + + bnd-process + + + + + + + + From fda4cfd69e9ab6316130eebf6d70c2a941f59b18 Mon Sep 17 00:00:00 2001 From: Steffengreiner Date: Thu, 3 Dec 2020 14:14:48 +0100 Subject: [PATCH 12/12] Update Changelog and set Pom to SNAPSHOT --- CHANGELOG.rst | 3 +++ pom.xml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index d8632d2..ff6e51c 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -10,8 +10,11 @@ This project adheres to `Semantic Versioning `_. **Added** +* Include bnd file for manifest generation +* Add profiles to Pom to support OSGI and non-OSGI packaging * Use parent pom 3.0.0 + **Fixed** **Dependencies** diff --git a/pom.xml b/pom.xml index 185d1f8..07b0192 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ xml-manager-lib jar - 1.6.0 + 1.6.0-SNAPSHOT XML Property Parser Library http://maven.apache.org