/*
* Copyright: (c) 2004-2011 Mayo Foundation for Medical Education and
* Research (MFMER). All rights reserved. MAYO, MAYO CLINIC, and the
* triple-shield Mayo logo are trademarks and service marks of MFMER.
*
* Except as contained in the copyright notice above, or as used to identify
* MFMER as the author of this software, the trade names, trademarks, service
* marks, or product names of the copyright holder shall not be used in
* advertising, promotion or otherwise in connection with this software without
* prior written authorization of the copyright holder.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package edu.mayo.cts2.framework.model.util;
import edu.mayo.cts2.framework.model.codesystemversion.CodeSystemVersionCatalogEntry;
import edu.mayo.cts2.framework.model.core.*;
import edu.mayo.cts2.framework.model.entity.Designation;
import edu.mayo.cts2.framework.model.entity.EntityDescription;
import edu.mayo.cts2.framework.model.entity.EntityDescriptionBase;
import edu.mayo.cts2.framework.model.entity.types.DesignationRole;
import edu.mayo.cts2.framework.model.service.core.EntityNameOrURI;
import edu.mayo.cts2.framework.model.service.core.NameOrURI;
import edu.mayo.cts2.framework.model.updates.ChangeableResource;
import org.apache.commons.lang.StringUtils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.regex.Pattern;
/**
* The Class RestModelUtils.
*
* @author <a href="mailto:kevin.peterson@mayo.edu">Kevin Peterson</a>
*/
public class ModelUtils {
//TODO: This is probably an overly simplistic check
private static Pattern URI_PATTERN = Pattern.compile(
"(urn:[a-zA-Z]+:.*)|([a-zA-Z]+://.*)");
/**
* Instantiates a new rest model utils.
*/
private ModelUtils(){
super();
}
/**
* To ts any type.
*
* @param string the string
* @return the ts any type
*/
public static TsAnyType toTsAnyType(String string){
TsAnyType ts = new TsAnyType();
ts.setContent(string);
return ts;
}
/**
* Gets the resource synopsis value.
*
* @param entry the entry
* @return the resource synopsis value
*/
public static String getResourceSynopsisValue(AbstractResourceDescription entry){
EntryDescription synopsis = entry.getResourceSynopsis();
if(synopsis != null){
TsAnyType value = synopsis.getValue();
if(value != null){
return value.getContent();
}
}
return null;
}
/**
* Gets the resource synopsis value.
*
* @param entry the entry
* @return the resource synopsis value
*/
public static String getResourceSynopsisValue(ResourceDescriptionDirectoryEntry entry){
EntryDescription synopsis = entry.getResourceSynopsis();
if(synopsis != null){
TsAnyType value = synopsis.getValue();
if(value != null){
return value.getContent();
}
}
return null;
}
/**
* Creates the scoped entity name.
*
* @param name the name
* @param namespace the namespace
* @return the scoped entity name
*/
public static ScopedEntityName createScopedEntityName(String name, String namespace){
ScopedEntityName scopedName = new ScopedEntityName();
scopedName.setName(name);
scopedName.setNamespace(namespace);
return scopedName;
}
/**
* Creates the opaque data.
*
* @param text the text
* @return the opaque data
*/
public static OpaqueData createOpaqueData(String text){
OpaqueData data = new OpaqueData();
data.setValue(toTsAnyType(text));
return data;
}
/**
* Gets the entity.
*
* @param entityDescription the entity description
* @return the entity
*/
public static EntityDescriptionBase getEntity(EntityDescription entityDescription){
return (EntityDescriptionBase) entityDescription.getChoiceValue();
}
/**
* Sets the entity.
*
* @param wrapper the wrapper
* @param entityDescription the entity description
*/
public static void setEntity(EntityDescription wrapper,
EntityDescriptionBase entityDescription) {
try {
for(Method method : EntityDescription.class.getDeclaredMethods()){
if(method.getName().startsWith("set") &&
method.getParameterTypes().length == 1 &&
method.getParameterTypes()[0].equals(entityDescription.getClass())){
method.invoke(wrapper, entityDescription);
}
}
} catch (Exception e) {
throw new IllegalStateException(e);
}
}
/**
* To entity description.
*
* @param entityDescriptionBase the entity description base
* @return the entity description
*/
public static EntityDescription toEntityDescription(
EntityDescriptionBase entityDescriptionBase) {
EntityDescription wrapper = new EntityDescription();
setEntity(wrapper, entityDescriptionBase);
return wrapper;
}
/**
* Gets the preferred designation.
*
* @param entity the entity
* @return the preferred designation
*/
public static Designation getPreferredDesignation(EntityDescriptionBase entity){
if(entity.getDesignationCount() == 1){
return entity.getDesignation(0);
}
for(Designation designation : entity.getDesignation()){
DesignationRole role = designation.getDesignationRole();
if(role != null && role.equals(DesignationRole.PREFERRED)){
return designation;
}
}
return null;
}
/**
* Gets the code system name of code system version.
*
* @param resource the resource
* @return the code system name of code system version
*/
public static String getCodeSystemNameOfCodeSystemVersion(
CodeSystemVersionCatalogEntry resource) {
return resource.getVersionOf().getContent();
}
public static boolean isValidUri(String uriCandidate){
return URI_PATTERN.matcher(uriCandidate).matches();
}
public static NameOrURI nameOrUriFromEither(String nameOrUri) {
if(StringUtils.isBlank(nameOrUri)){
return null;
}
NameOrURI n;
if(isValidUri(nameOrUri)){
n = nameOrUriFromUri(nameOrUri);
} else {
n = nameOrUriFromName(nameOrUri);
}
return n;
}
public static NameOrURI nameOrUriFromName(String name) {
if(StringUtils.isBlank(name)){
return null;
}
NameOrURI nameOrUri = new NameOrURI();
nameOrUri.setName(name);
return nameOrUri;
}
public static EntityNameOrURI entityNameOrUriFromName(ScopedEntityName name) {
if(name == null){
return null;
}
EntityNameOrURI nameOrUri = new EntityNameOrURI();
nameOrUri.setEntityName(name);
return nameOrUri;
}
public static EntityNameOrURI entityNameOrUriFromUri(String uri) {
EntityNameOrURI nameOrUri = new EntityNameOrURI();
nameOrUri.setUri(uri);
return nameOrUri;
}
public static ChangeableResource createChangeableResource(IsChangeable changeable) {
ChangeableResource choice = new ChangeableResource();
for(Field field : choice.getClass().getDeclaredFields()){
if(field.getType().equals(changeable.getClass())
||
field.getName().equals("_choiceValue")){
field.setAccessible(true);
try {
field.set(choice, changeable);
} catch (IllegalArgumentException e) {
throw new IllegalStateException(e);
} catch (IllegalAccessException e) {
throw new IllegalStateException(e);
}
}
}
return choice;
}
public static NameOrURI nameOrUriFromUri(String uri) {
NameOrURI nameOrUri = new NameOrURI();
nameOrUri.setUri(uri);
return nameOrUri;
}
public static boolean matches(
ComponentReference componentReference1,
ComponentReference componentReference2){
if(componentReference1.getAttributeReference() != null &&
componentReference2.getAttributeReference() != null){
return StringUtils.equals(
componentReference1.getAttributeReference(),
componentReference2.getAttributeReference());
}
if(componentReference1.getPropertyReference() != null &&
componentReference2.getPropertyReference() != null){
URIAndEntityName ref1 = componentReference1.getPropertyReference();
URIAndEntityName ref2 = componentReference2.getPropertyReference();
return (StringUtils.equals(ref1.getName(), ref2.getName())
||
StringUtils.equals(ref1.getUri(), ref2.getUri()));
}
if(componentReference1.getSpecialReference() != null &&
componentReference2.getSpecialReference() != null){
return StringUtils.equals(
componentReference1.getSpecialReference(),
componentReference2.getSpecialReference());
}
return false;
}
}