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.model.constraint; 028 029import gov.nist.secauto.metaschema.core.datatype.markup.MarkupLine; 030import gov.nist.secauto.metaschema.core.datatype.markup.MarkupMultiline; 031import gov.nist.secauto.metaschema.core.metapath.MetapathExpression; 032import gov.nist.secauto.metaschema.core.util.ObjectUtils; 033 034import java.util.List; 035import java.util.Map; 036import java.util.Set; 037 038import javax.xml.namespace.QName; 039 040import edu.umd.cs.findbugs.annotations.NonNull; 041import edu.umd.cs.findbugs.annotations.Nullable; 042 043public final class DefaultIndexHasKeyConstraint 044 extends AbstractKeyConstraint 045 implements IIndexHasKeyConstraint { 046 @NonNull 047 private final String indexName; 048 049 /** 050 * Create a key reference constraint, which uses a set of key fields to build a 051 * key to match against an index. 052 * 053 * @param id 054 * the optional identifier for the constraint 055 * @param formalName 056 * the constraint's formal indexName or {@code null} if not provided 057 * @param description 058 * the constraint's semantic description or {@code null} if not 059 * provided 060 * @param source 061 * information about the constraint source 062 * @param level 063 * the significance of a violation of this constraint 064 * @param target 065 * the Metapath expression identifying the nodes the constraint targets 066 * @param properties 067 * a collection of associated properties 068 * @param indexName 069 * a reference to the indexName of the index 070 * @param keyFields 071 * a list of key fields associated with the constraint 072 * @param remarks 073 * optional remarks describing the intent of the constraint 074 */ 075 private DefaultIndexHasKeyConstraint( 076 @Nullable String id, 077 @Nullable String formalName, 078 @Nullable MarkupLine description, 079 @NonNull ISource source, 080 @NonNull Level level, 081 @NonNull MetapathExpression target, 082 @NonNull Map<QName, Set<String>> properties, 083 @NonNull String indexName, 084 @NonNull List<DefaultKeyField> keyFields, 085 @Nullable MarkupMultiline remarks) { 086 super(id, formalName, description, source, level, target, properties, keyFields, remarks); 087 if (indexName.isBlank()) { 088 throw new IllegalArgumentException("The index indexName must be a non-blank string"); 089 } 090 this.indexName = indexName; 091 } 092 093 @Override 094 public String getIndexName() { 095 return indexName; 096 } 097 098 @Override 099 public <T, R> R accept(IConstraintVisitor<T, R> visitor, T state) { 100 return visitor.visitIndexHasKeyConstraint(this, state); 101 } 102 103 @NonNull 104 public static Builder builder() { 105 return new Builder(); 106 } 107 108 public static final class Builder 109 extends AbstractKeyConstraintBuilder<Builder, DefaultIndexHasKeyConstraint> { 110 private String indexName; 111 112 private Builder() { 113 // disable construction 114 } 115 116 public Builder name(@NonNull String name) { 117 this.indexName = name; 118 return this; 119 } 120 121 @Override 122 protected Builder getThis() { 123 return this; 124 } 125 126 @Override 127 protected void validate() { 128 super.validate(); 129 130 ObjectUtils.requireNonNull(indexName); 131 } 132 133 protected String getIndexName() { 134 return indexName; 135 } 136 137 @Override 138 protected DefaultIndexHasKeyConstraint newInstance() { 139 return new DefaultIndexHasKeyConstraint( 140 getId(), 141 getFormalName(), 142 getDescription(), 143 ObjectUtils.notNull(getSource()), 144 getLevel(), 145 getTarget(), 146 getProperties(), 147 ObjectUtils.notNull(getIndexName()), 148 getKeyFields(), 149 getRemarks()); 150 } 151 } 152}