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.maven.model.building; 20 21 import java.util.function.Supplier; 22 23 import org.apache.maven.building.Source; 24 25 /** 26 * Caches auxiliary data used during model building like already processed raw/effective models. The data in the cache 27 * is meant for exclusive consumption by the model builder and is opaque to the cache implementation. The cache key is 28 * formed by a combination of group id, artifact id, version and tag. The first three components generally refer to the 29 * identify of a model. The tag allows for further classification of the associated data on the sole discretion of the 30 * model builder. 31 * 32 */ 33 public interface ModelCache { 34 /** 35 * Puts the specified data into the cache. 36 * 37 * @param path The path of the cache record, must not be {@code null}. 38 * @param tag The tag of the cache record, must not be {@code null}. 39 * @param data The data to store in the cache, must not be {@code null}. 40 * @since 4.0.0 41 */ 42 default void put(Source path, String tag, Object data) { 43 // only useful for ReactorModelCache 44 } 45 46 /** 47 * Gets the specified data from the cache. 48 * 49 * @param path The path of the cache record, must not be {@code null}. 50 * @param tag The tag of the cache record, must not be {@code null}. 51 * @return The requested data or {@code null} if none was present in the cache. 52 * @since 4.0.0 53 */ 54 default Object get(Source path, String tag) { 55 // only useful for ReactorModelCache 56 return null; 57 } 58 59 /** 60 * Puts the specified data into the cache. 61 * 62 * @param groupId The group id of the cache record, must not be {@code null}. 63 * @param artifactId The artifact id of the cache record, must not be {@code null}. 64 * @param version The version of the cache record, must not be {@code null}. 65 * @param tag The tag of the cache record, must not be {@code null}. 66 * @param data The data to store in the cache, must not be {@code null}. 67 */ 68 void put(String groupId, String artifactId, String version, String tag, Object data); 69 70 /** 71 * Gets the specified data from the cache. 72 * 73 * @param groupId The group id of the cache record, must not be {@code null}. 74 * @param artifactId The artifact id of the cache record, must not be {@code null}. 75 * @param version The version of the cache record, must not be {@code null}. 76 * @param tag The tag of the cache record, must not be {@code null}. 77 * @return The requested data or {@code null} if none was present in the cache. 78 */ 79 Object get(String groupId, String artifactId, String version, String tag); 80 81 /** 82 * Puts the specified data into the cache. 83 * 84 * @param path The path of the cache record, must not be {@code null}. 85 * @param tag The tag of the cache record, must not be {@code null}. 86 * @param data The data to store in the cache, must not be {@code null}. 87 * @since 4.0.0 88 */ 89 default <T> void put(Source path, ModelCacheTag<T> tag, T data) { 90 put(path, tag.getName(), tag.intoCache(data)); 91 } 92 93 /** 94 * Gets the specified data from the cache. 95 * 96 * @param path The path of the cache record, must not be {@code null}. 97 * @param tag The tag of the cache record, must not be {@code null}. 98 * @return The requested data or {@code null} if none was present in the cache. 99 * @since 4.0.0 100 */ 101 default <T> T get(Source path, ModelCacheTag<T> tag) { 102 Object obj = get(path, tag.getName()); 103 return (obj != null) ? tag.fromCache(tag.getType().cast(obj)) : null; 104 } 105 106 /** 107 * Puts the specified data into the cache. 108 * 109 * @param groupId The group id of the cache record, must not be {@code null}. 110 * @param artifactId The artifact id of the cache record, must not be {@code null}. 111 * @param version The version of the cache record, must not be {@code null}. 112 * @param tag The tag of the cache record, must not be {@code null}. 113 * @param data The data to store in the cache, must not be {@code null}. 114 */ 115 default <T> void put(String groupId, String artifactId, String version, ModelCacheTag<T> tag, T data) { 116 put(groupId, artifactId, version, tag.getName(), tag.intoCache(data)); 117 } 118 119 /** 120 * Gets the specified data from the cache. 121 * 122 * @param groupId The group id of the cache record, must not be {@code null}. 123 * @param artifactId The artifact id of the cache record, must not be {@code null}. 124 * @param version The version of the cache record, must not be {@code null}. 125 * @param tag The tag of the cache record, must not be {@code null}. 126 * @return The requested data or {@code null} if none was present in the cache. 127 */ 128 default <T> T get(String groupId, String artifactId, String version, ModelCacheTag<T> tag) { 129 Object obj = get(groupId, artifactId, version, tag.getName()); 130 return (obj != null) ? tag.fromCache(tag.getType().cast(obj)) : null; 131 } 132 133 default <T> T computeIfAbsent( 134 String groupId, String artifactId, String version, ModelCacheTag<T> tag, Supplier<Supplier<T>> data) { 135 Object obj = computeIfAbsent(groupId, artifactId, version, tag.getName(), (Supplier) data); 136 return (obj != null) ? tag.fromCache(tag.getType().cast(obj)) : null; 137 } 138 139 default <T> T computeIfAbsent(Source path, ModelCacheTag<T> tag, Supplier<Supplier<T>> data) { 140 Object obj = computeIfAbsent(path, tag.getName(), (Supplier) data); 141 return (obj != null) ? tag.fromCache(tag.getType().cast(obj)) : null; 142 } 143 144 Object computeIfAbsent(String groupId, String artifactId, String version, String tag, Supplier<Supplier<?>> data); 145 146 Object computeIfAbsent(Source path, String tag, Supplier<Supplier<?>> data); 147 }