001/*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *   http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied.  See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019package org.eclipse.aether.artifact;
020
021import java.io.File;
022import java.nio.file.Path;
023import java.util.Map;
024
025/**
026 * A specific artifact. In a nutshell, an artifact has identifying coordinates and optionally a file that denotes its
027 * data. <em>Note:</em> Artifact instances are supposed to be immutable, e.g. any exposed mutator method returns a new
028 * artifact instance and leaves the original instance unchanged. <em>Note:</em> Implementors are strongly advised to
029 * inherit from {@link AbstractArtifact} instead of directly implementing this interface.
030 *
031 * @noimplement This interface is not intended to be implemented by clients.
032 * @noextend This interface is not intended to be extended by clients.
033 */
034public interface Artifact {
035
036    /**
037     * Gets the group identifier of this artifact, for example "org.apache.maven".
038     *
039     * @return The group identifier, never {@code null}.
040     */
041    String getGroupId();
042
043    /**
044     * Gets the artifact identifier of this artifact, for example "maven-model".
045     *
046     * @return The artifact identifier, never {@code null}.
047     */
048    String getArtifactId();
049
050    /**
051     * Gets the version of this artifact, for example "1.0-20100529-1213". Note that in case of meta versions like
052     * "1.0-SNAPSHOT", the artifact's version depends on the state of the artifact. Artifacts that have been resolved or
053     * deployed will usually have the meta version expanded.
054     *
055     * @return The version, never {@code null}.
056     */
057    String getVersion();
058
059    /**
060     * Sets the version of the artifact.
061     *
062     * @param version The version of this artifact, may be {@code null} or empty.
063     * @return The new artifact, never {@code null}.
064     */
065    Artifact setVersion(String version);
066
067    /**
068     * Gets the base version of this artifact, for example "1.0-SNAPSHOT". In contrast to the {@link #getVersion()}, the
069     * base version will always refer to the unresolved meta version.
070     *
071     * @return The base version, never {@code null}.
072     */
073    String getBaseVersion();
074
075    /**
076     * Determines whether this artifact uses a snapshot version.
077     *
078     * @return {@code true} if the artifact is a snapshot, {@code false} otherwise.
079     */
080    boolean isSnapshot();
081
082    /**
083     * Gets the classifier of this artifact, for example "sources".
084     *
085     * @return The classifier or an empty string if none, never {@code null}.
086     */
087    String getClassifier();
088
089    /**
090     * Gets the (file) extension of this artifact, for example "jar" or "tar.gz".
091     *
092     * @return The file extension (without leading period), never {@code null}.
093     */
094    String getExtension();
095
096    /**
097     * Gets the file of this artifact. Note that only resolved artifacts have a file associated with them. In general,
098     * callers must not assume any relationship between an artifact's filename and its coordinates.
099     *
100     * @return The file or {@code null} if the artifact isn't resolved.
101     * @deprecated Use {@link #getPath()} instead.
102     */
103    @Deprecated
104    File getFile();
105
106    /**
107     * Gets the file of this artifact. Note that only resolved artifacts have a file associated with them. In general,
108     * callers must not assume any relationship between an artifact's filename and its coordinates.
109     *
110     * @return The file or {@code null} if the artifact isn't resolved.
111     * @since 2.0.0
112     */
113    Path getPath();
114
115    /**
116     * Sets the file of the artifact.
117     *
118     * @param file The file of the artifact, may be {@code null}
119     * @return The new artifact, never {@code null}.
120     * @deprecated Use {@link #setPath(Path)} instead.
121     */
122    @Deprecated
123    Artifact setFile(File file);
124
125    /**
126     * Sets the file of the artifact.
127     *
128     * @param path The file of the artifact, may be {@code null}
129     * @return The new artifact, never {@code null}.
130     * @since 2.0.0
131     */
132    Artifact setPath(Path path);
133
134    /**
135     * Gets the specified property.
136     *
137     * @param key The name of the property, must not be {@code null}.
138     * @param defaultValue The default value to return in case the property is not set, may be {@code null}.
139     * @return The requested property value or {@code null} if the property is not set and no default value was
140     *         provided.
141     * @see ArtifactProperties
142     */
143    String getProperty(String key, String defaultValue);
144
145    /**
146     * Gets the properties of this artifact. Clients may use these properties to associate non-persistent values with an
147     * artifact that help later processing when the artifact gets passed around within the application.
148     *
149     * @return The (read-only) properties, never {@code null}.
150     * @see ArtifactProperties
151     */
152    Map<String, String> getProperties();
153
154    /**
155     * Sets the properties for the artifact. Note that these properties exist merely in memory and are not persisted
156     * when the artifact gets installed/deployed to a repository.
157     *
158     * @param properties The properties for the artifact, may be {@code null}.
159     * @return The new artifact, never {@code null}.
160     * @see ArtifactProperties
161     */
162    Artifact setProperties(Map<String, String> properties);
163}