1 /* 2 * Portions of this software was developed by employees of the National Institute 3 * of Standards and Technology (NIST), an agency of the Federal Government and is 4 * being made available as a public service. Pursuant to title 17 United States 5 * Code Section 105, works of NIST employees are not subject to copyright 6 * protection in the United States. This software may be subject to foreign 7 * copyright. Permission in the United States and in foreign countries, to the 8 * extent that NIST may hold copyright, to use, copy, modify, create derivative 9 * works, and distribute this software and its documentation without fee is hereby 10 * granted on a non-exclusive basis, provided that this notice and disclaimer 11 * of warranty appears in all copies. 12 * 13 * THE SOFTWARE IS PROVIDED 'AS IS' WITHOUT ANY WARRANTY OF ANY KIND, EITHER 14 * EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY 15 * THAT THE SOFTWARE WILL CONFORM TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND FREEDOM FROM 17 * INFRINGEMENT, AND ANY WARRANTY THAT THE DOCUMENTATION WILL CONFORM TO THE 18 * SOFTWARE, OR ANY WARRANTY THAT THE SOFTWARE WILL BE ERROR FREE. IN NO EVENT 19 * SHALL NIST BE LIABLE FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO, DIRECT, 20 * INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF, RESULTING FROM, 21 * OR IN ANY WAY CONNECTED WITH THIS SOFTWARE, WHETHER OR NOT BASED UPON WARRANTY, 22 * CONTRACT, TORT, OR OTHERWISE, WHETHER OR NOT INJURY WAS SUSTAINED BY PERSONS OR 23 * PROPERTY OR OTHERWISE, AND WHETHER OR NOT LOSS WAS SUSTAINED FROM, OR AROSE OUT 24 * OF THE RESULTS OF, OR USE OF, THE SOFTWARE OR SERVICES PROVIDED HEREUNDER. 25 */ 26 27 package gov.nist.secauto.metaschema.databind.model; 28 29 import gov.nist.secauto.metaschema.core.model.INamedModelInstance; 30 import gov.nist.secauto.metaschema.core.util.ObjectUtils; 31 import gov.nist.secauto.metaschema.databind.io.BindingException; 32 import gov.nist.secauto.metaschema.databind.model.info.IDataTypeHandler; 33 import gov.nist.secauto.metaschema.databind.model.info.IModelPropertyInfo; 34 35 import java.lang.reflect.Field; 36 import java.lang.reflect.ParameterizedType; 37 import java.lang.reflect.Type; 38 import java.util.Collection; 39 import java.util.List; 40 import java.util.Map; 41 42 import edu.umd.cs.findbugs.annotations.NonNull; 43 44 /** 45 * This marker interface provides common methods for interacting with bound 46 * object values. 47 */ 48 public interface IBoundNamedModelInstance extends IBoundNamedInstance, INamedModelInstance { 49 50 @NonNull 51 static Class<?> getItemType(@NonNull Field field) { 52 Type fieldType = field.getGenericType(); 53 Class<?> rawType = ObjectUtils.notNull( 54 (Class<?>) (fieldType instanceof ParameterizedType ? ((ParameterizedType) fieldType).getRawType() : fieldType)); 55 56 Class<?> itemType; 57 if (Map.class.isAssignableFrom(rawType)) { 58 // this is a Map so the second generic type is the value 59 itemType = ObjectUtils.notNull((Class<?>) ((ParameterizedType) fieldType).getActualTypeArguments()[1]); 60 } else if (List.class.isAssignableFrom(rawType)) { 61 // this is a List so there is only a single generic type 62 itemType = ObjectUtils.notNull((Class<?>) ((ParameterizedType) fieldType).getActualTypeArguments()[0]); 63 } else { 64 // non-collection 65 itemType = rawType; 66 } 67 return itemType; 68 } 69 70 @Override 71 default Class<?> getItemType() { 72 return getPropertyInfo().getItemType(); 73 } 74 75 @Override 76 IAssemblyClassBinding getParentClassBinding(); 77 78 @NonNull 79 IModelPropertyInfo getPropertyInfo(); 80 81 @NonNull 82 IDataTypeHandler getDataTypeHandler(); 83 84 /** 85 * Get the item values associated with the provided value. 86 * 87 * @param value 88 * the value which may be a singleton or a collection 89 * @return the ordered collection of values 90 */ 91 @Override 92 @NonNull 93 Collection<? extends Object> getItemValues(Object value); 94 95 @NonNull 96 Object copyItem(@NonNull Object fromItem, @NonNull Object toInstance) throws BindingException; 97 98 // void writeItems(List<? extends WritableItem> items, IJsonWritingContext 99 // context); 100 101 // Collection<? extends WritableItem> getItemsToWrite(Collection<? extends 102 // Object> items); 103 104 // void writeItem(Object instance, IJsonWritingContext context); 105 }