1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one * 3 * or more contributor license agreements. See the NOTICE file * 4 * distributed with this work for additional information * 5 * regarding copyright ownership. The ASF licenses this file * 6 * to you under the Apache License, Version 2.0 (the * 7 * "License"); you may not use this file except in compliance * 8 * with the License. You may obtain a copy of the License at * 9 * * 10 * http://www.apache.org/licenses/LICENSE-2.0 * 11 * * 12 * Unless required by applicable law or agreed to in writing, * 13 * software distributed under the License is distributed on an * 14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * 15 * KIND, either express or implied. See the License for the * 16 * specific language governing permissions and limitations * 17 * under the License. * 18 */ 19 package org.apache.rat.license; 20 21 import java.util.Comparator; 22 import java.util.Objects; 23 import java.util.SortedSet; 24 25 import org.apache.rat.analysis.IHeaderMatcher; 26 27 /** 28 * The definition of a License. 29 */ 30 public interface ILicense extends IHeaderMatcher, Comparable<ILicense> { 31 /** 32 * @return the ILicenseFamily implementation for this license. 33 */ 34 ILicenseFamily getLicenseFamily(); 35 36 /** 37 * @return the notes associated with this license. May be null or empty. 38 */ 39 String getNotes(); 40 41 /** 42 * @return the id of a license that this license is derived from. May be null. 43 */ 44 String derivedFrom(); 45 46 /** 47 * Returns the name of this license. If no name was specified then the name of the family is returned. 48 * @return the name of this license. 49 */ 50 String getName(); 51 52 /** 53 * @return An ILicense.Builder instance. 54 */ 55 static ILicense.Builder builder() { 56 return new Builder(); 57 } 58 59 /** 60 * @return The comparator for used to sort Licenses. 61 */ 62 static Comparator<ILicense> getComparator() { 63 return Comparator.comparing(IHeaderMatcher::getId); 64 } 65 66 /** 67 * A builder for ILicense instances. 68 */ 69 class Builder { 70 71 private IHeaderMatcher.Builder matcher; 72 73 private String notes; 74 75 private String derivedFrom; 76 77 private String name; 78 79 private String id; 80 81 private final ILicenseFamily.Builder licenseFamily = ILicenseFamily.builder(); 82 83 /** 84 * Sets the matcher from a builder. 85 * @param matcher the builder for the matcher for the license. 86 * @return this builder for chaining. 87 */ 88 public Builder setMatcher(IHeaderMatcher.Builder matcher) { 89 this.matcher = matcher; 90 return this; 91 } 92 93 /** 94 * Sets the matcher. 95 * @param matcher the matcher for the license. 96 * @return this builder for chaining. 97 */ 98 public Builder setMatcher(IHeaderMatcher matcher) { 99 this.matcher = ()->matcher; 100 return this; 101 } 102 103 /** 104 * Sets the notes for the license. 105 * If called multiple times the notes are concatenated to create a single note. 106 * @param notes the notes for the license. 107 * @return this builder for chaining. 108 */ 109 public Builder setNotes(String notes) { 110 this.notes = notes; 111 return this; 112 } 113 114 /** 115 * Sets the ID of the license. 116 * If the ID is not set then the ID of the license family is used. 117 * @param id the ID for the license 118 * @return this builder for chaining. 119 */ 120 public Builder setId(String id) { 121 this.id = id; 122 return this; 123 } 124 125 /** 126 * Sets the derived from fields in the license. 127 * @param derivedFrom the family category of the license this license was derived from. 128 * @return this builder for chaining. 129 */ 130 public Builder setDerivedFrom(String derivedFrom) { 131 this.derivedFrom = derivedFrom; 132 return this; 133 } 134 135 /** 136 * Set the family category for this license. 137 * The category must be unique across all licenses and must be 5 characters. If more than 138 * 5 characters are provided then only the first 5 are taken. If fewer than 5 characters are provided 139 * the category is padded with spaces. 140 * @param licenseFamilyCategory the family category for the license. 141 * @return this builder for chaining. 142 */ 143 public Builder setLicenseFamilyCategory(String licenseFamilyCategory) { 144 this.licenseFamily.setLicenseFamilyCategory(licenseFamilyCategory); 145 this.licenseFamily.setLicenseFamilyName("License Family for searching"); 146 return this; 147 } 148 149 /** 150 * Sets the name of the license. 151 * If the name is not set then the name of the license family is used. 152 * @param name the name for the license 153 * @return this builder for chaining. 154 */ 155 public Builder setName(String name) { 156 this.name = name; 157 return this; 158 } 159 160 /** 161 * @param licenseFamilies the set of defined license families. 162 * @return A new License implementation. 163 */ 164 public ILicense build(SortedSet<ILicenseFamily> licenseFamilies) { 165 Objects.requireNonNull(matcher, "Matcher must not be null"); 166 ILicenseFamily family = LicenseFamilySetFactory.search(licenseFamily.build(), licenseFamilies); 167 Objects.requireNonNull(family, "License family "+licenseFamily.getCategory()+" not found."); 168 return new SimpleLicense(family, matcher.build(), derivedFrom, notes, name, id); 169 } 170 } 171 }