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.core.metapath.function; 028 029import gov.nist.secauto.metaschema.core.metapath.IExpression; 030import gov.nist.secauto.metaschema.core.metapath.item.IItem; 031import gov.nist.secauto.metaschema.core.util.ObjectUtils; 032 033import java.util.Objects; 034 035import edu.umd.cs.findbugs.annotations.NonNull; 036 037public interface IArgument { 038 @NonNull 039 String getName(); 040 041 @NonNull 042 ISequenceType getSequenceType(); 043 044 boolean isSupported(IExpression expression); 045 046 @NonNull 047 String toSignature(); 048 049 @NonNull 050 static Builder newBuilder() { 051 return new Builder(); 052 } 053 054 class Builder { 055 private String name; 056 private Class<? extends IItem> type = IItem.class; 057 private Occurrence occurrence = Occurrence.ONE; 058 059 public Builder() { 060 // construct a new non-initialized builder 061 } 062 063 public Builder(@NonNull String name) { 064 this.name = name; 065 } 066 067 @NonNull 068 public Builder name(@NonNull String name) { 069 Objects.requireNonNull(name, "name"); 070 if (name.isBlank()) { 071 throw new IllegalArgumentException("the name must be non-blank"); 072 } 073 this.name = name.trim(); 074 return this; 075 } 076 077 @NonNull 078 public Builder type(@NonNull Class<? extends IItem> type) { 079 Objects.requireNonNull(type, "type"); 080 this.type = type; 081 return this; 082 } 083 084 @NonNull 085 public Builder zeroOrOne() { 086 return occurrence(Occurrence.ZERO_OR_ONE); 087 } 088 089 @NonNull 090 public Builder one() { 091 return occurrence(Occurrence.ONE); 092 } 093 094 @NonNull 095 public Builder zeroOrMore() { 096 return occurrence(Occurrence.ZERO_OR_MORE); 097 } 098 099 @NonNull 100 public Builder oneOrMore() { 101 return occurrence(Occurrence.ONE_OR_MORE); 102 } 103 104 @NonNull 105 public Builder occurrence(@NonNull Occurrence occurrence) { 106 Objects.requireNonNull(occurrence, "occurrence"); 107 this.occurrence = occurrence; 108 return this; 109 } 110 111 @NonNull 112 public IArgument build() { 113 return new ArgumentImpl( 114 ObjectUtils.requireNonNull(name, "the name must not be null"), 115 new SequenceTypeImpl(type, occurrence)); 116 } 117 118 } 119 120}