blob: b11530e2dca9331c61a55c2719fd7251456d587c [file] [log] [blame]
package facade;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.URIConverter;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.ecore.xmi.impl.GenericXMLResourceFactoryImpl;
import org.eclipse.emf.ecore.xml.type.AnyType;
import org.eclipse.emf.ecore.xml.type.XMLTypeDocumentRoot;
import org.eclipse.emf.ecore.util.FeatureMap;
/**
* Copyright: NEHTA 2014-2015 Author: Joerg Kiegeland, Distributed Models Pty
* Ltd
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
// / <summary>
// / This helper class is mainly used by facades to evaluate the .NET
// equivalents of the MDHT OCL expressions
// / </summary>
abstract public class FacadeBase {
// / <summary>
// / Enumeration for the data element level (that a constraint operates on)
// / </summary>
public enum DataElementLevel {
// / "1A"
DEL_CDA_HEADER,
// / "2"
DEL_CDA_BODY_LEVEL_2,
// / "3A"
DEL_CDA_BODY_LEVEL_3,
// / unknown
NA
};
/// returns the CDA element
abstract public Object getModelElement();
// / For a singleton set, returns the one and only element
static public <T> T One(T item) {
return item;
}
// / For a singleton set, returns the one and only element
static public <T> T One(Stream<T> list) {
Optional<T> optional = list.findFirst();
if (optional.isPresent())
return optional.get();
return null;
}
//
static public <T> Stream<T> Set(List<T> item) {
return item.stream();
}
// / Makes an element or elements available as set
static public <T> Stream<T> Set(T item) {
ArrayList<T> result = new ArrayList<T>();
if (item != null)
result.add(item);
return result.stream();
}
// / Flattens nested set structures
static public <T> Stream<T> Flatten(Stream<Stream<T>> list) {
return list.flatMap(x -> x);
}
static public <T> T Flatten(T list) {
return list;
}
// / <summary>
// / Mark properties for serialization by e.g. setting
// "contextControlCodeSpecified" to true for the "contextControlCode"
// property
// / </summary>
// / <param name="o">The CDA element</param>
// / <param name="featureName">The field name</param>
public void MarkSpecified(EObject o, EStructuralFeature feature) {
feature.setUnsettable(true);
}
// / <summary>
// / Asks if a property is specified, e.g. for the "contextControlCode"
// property, returns the value for "contextControlCodeSpecified"
// / </summary>
// / <param name="o">The CDA element</param>
// / <param name="featureName">The field name</param>
// / <returns>The value of the Specified field, or "false" if that does not
// exist for the field</returns>
public boolean IsSpecified(EObject o, String featureName) {
EStructuralFeature feature = o.eClass().getEStructuralFeature(featureName);
return o.eIsSet(feature);
}
protected FeatureMap getValueForFeaturemap(String value) {
/**
* @see org.eclipse.mdht.uml.cda.operations.SectionOperations#createStrucDocText()
*/
Resource.Factory factory = new GenericXMLResourceFactoryImpl();
XMLResource resource = (XMLResource) factory.createResource(null);
try {
resource.load(new URIConverter.ReadableInputStream("<text>" + value + "</text>"), null);
} catch (Exception e) {
//do nothing
}
XMLTypeDocumentRoot root = (XMLTypeDocumentRoot) resource.getContents().get(0);
AnyType any = (AnyType) root.getMixed().getValue(0);
return any.getMixed();
}
}