001/* 002 * Portions of this software was developed by employees of the National Institute 003 * of Standards and Technology (NIST), an agency of the Federal Government and is 004 * being made available as a public service. Pursuant to title 17 United States 005 * Code Section 105, works of NIST employees are not subject to copyright 006 * protection in the United States. This software may be subject to foreign 007 * copyright. Permission in the United States and in foreign countries, to the 008 * extent that NIST may hold copyright, to use, copy, modify, create derivative 009 * works, and distribute this software and its documentation without fee is hereby 010 * granted on a non-exclusive basis, provided that this notice and disclaimer 011 * of warranty appears in all copies. 012 * 013 * THE SOFTWARE IS PROVIDED 'AS IS' WITHOUT ANY WARRANTY OF ANY KIND, EITHER 014 * EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY 015 * THAT THE SOFTWARE WILL CONFORM TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF 016 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND FREEDOM FROM 017 * INFRINGEMENT, AND ANY WARRANTY THAT THE DOCUMENTATION WILL CONFORM TO THE 018 * SOFTWARE, OR ANY WARRANTY THAT THE SOFTWARE WILL BE ERROR FREE. IN NO EVENT 019 * SHALL NIST BE LIABLE FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO, DIRECT, 020 * INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF, RESULTING FROM, 021 * OR IN ANY WAY CONNECTED WITH THIS SOFTWARE, WHETHER OR NOT BASED UPON WARRANTY, 022 * CONTRACT, TORT, OR OTHERWISE, WHETHER OR NOT INJURY WAS SUSTAINED BY PERSONS OR 023 * PROPERTY OR OTHERWISE, AND WHETHER OR NOT LOSS WAS SUSTAINED FROM, OR AROSE OUT 024 * OF THE RESULTS OF, OR USE OF, THE SOFTWARE OR SERVICES PROVIDED HEREUNDER. 025 */ 026 027package gov.nist.secauto.metaschema.databind.model; 028 029import gov.nist.secauto.metaschema.core.model.INamedModelInstance; 030import gov.nist.secauto.metaschema.core.util.ObjectUtils; 031import gov.nist.secauto.metaschema.databind.io.BindingException; 032import gov.nist.secauto.metaschema.databind.model.info.IDataTypeHandler; 033import gov.nist.secauto.metaschema.databind.model.info.IModelPropertyInfo; 034 035import java.lang.reflect.Field; 036import java.lang.reflect.ParameterizedType; 037import java.lang.reflect.Type; 038import java.util.Collection; 039import java.util.List; 040import java.util.Map; 041 042import edu.umd.cs.findbugs.annotations.NonNull; 043 044/** 045 * This marker interface provides common methods for interacting with bound 046 * object values. 047 */ 048public interface IBoundNamedModelInstance extends IBoundNamedInstance, INamedModelInstance { 049 050 @NonNull 051 static Class<?> getItemType(@NonNull Field field) { 052 Type fieldType = field.getGenericType(); 053 Class<?> rawType = ObjectUtils.notNull( 054 (Class<?>) (fieldType instanceof ParameterizedType ? ((ParameterizedType) fieldType).getRawType() : fieldType)); 055 056 Class<?> itemType; 057 if (Map.class.isAssignableFrom(rawType)) { 058 // this is a Map so the second generic type is the value 059 itemType = ObjectUtils.notNull((Class<?>) ((ParameterizedType) fieldType).getActualTypeArguments()[1]); 060 } else if (List.class.isAssignableFrom(rawType)) { 061 // this is a List so there is only a single generic type 062 itemType = ObjectUtils.notNull((Class<?>) ((ParameterizedType) fieldType).getActualTypeArguments()[0]); 063 } else { 064 // non-collection 065 itemType = rawType; 066 } 067 return itemType; 068 } 069 070 @Override 071 default Class<?> getItemType() { 072 return getPropertyInfo().getItemType(); 073 } 074 075 @Override 076 IAssemblyClassBinding getParentClassBinding(); 077 078 @NonNull 079 IModelPropertyInfo getPropertyInfo(); 080 081 @NonNull 082 IDataTypeHandler getDataTypeHandler(); 083 084 /** 085 * Get the item values associated with the provided value. 086 * 087 * @param value 088 * the value which may be a singleton or a collection 089 * @return the ordered collection of values 090 */ 091 @Override 092 @NonNull 093 Collection<? extends Object> getItemValues(Object value); 094 095 @NonNull 096 Object copyItem(@NonNull Object fromItem, @NonNull Object toInstance) throws BindingException; 097 098 // void writeItems(List<? extends WritableItem> items, IJsonWritingContext 099 // context); 100 101 // Collection<? extends WritableItem> getItemsToWrite(Collection<? extends 102 // Object> items); 103 104 // void writeItem(Object instance, IJsonWritingContext context); 105}