1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  package org.apache.maven.artifact.repository.metadata;
20  
21  import java.io.File;
22  import java.io.IOException;
23  import java.io.Reader;
24  import java.io.Writer;
25  import org.apache.maven.artifact.Artifact;
26  import org.apache.maven.artifact.metadata.ArtifactMetadata;
27  import org.apache.maven.artifact.repository.ArtifactRepository;
28  import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
29  import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader;
30  import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Writer;
31  import org.codehaus.plexus.util.ReaderFactory;
32  import org.codehaus.plexus.util.WriterFactory;
33  import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
34  
35  
36  
37  
38  
39  
40  public abstract class AbstractRepositoryMetadata implements RepositoryMetadata {
41      private static final String LS = System.lineSeparator();
42  
43      private Metadata metadata;
44  
45      protected AbstractRepositoryMetadata(Metadata metadata) {
46          this.metadata = metadata;
47      }
48  
49      public String getRemoteFilename() {
50          return "maven-metadata.xml";
51      }
52  
53      public String getLocalFilename(ArtifactRepository repository) {
54          return "maven-metadata-" + repository.getKey() + ".xml";
55      }
56  
57      public void storeInLocalRepository(ArtifactRepository localRepository, ArtifactRepository remoteRepository)
58              throws RepositoryMetadataStoreException {
59          try {
60              updateRepositoryMetadata(localRepository, remoteRepository);
61          } catch (IOException | XmlPullParserException e) {
62              throw new RepositoryMetadataStoreException("Error updating group repository metadata", e);
63          }
64      }
65  
66      protected void updateRepositoryMetadata(ArtifactRepository localRepository, ArtifactRepository remoteRepository)
67              throws IOException, XmlPullParserException {
68          MetadataXpp3Reader mappingReader = new MetadataXpp3Reader();
69  
70          Metadata metadata = null;
71  
72          File metadataFile = new File(
73                  localRepository.getBasedir(), localRepository.pathOfLocalRepositoryMetadata(this, remoteRepository));
74  
75          if (metadataFile.length() == 0) {
76              if (!metadataFile.delete()) {
77                  
78                  try {
79                      Thread.sleep(10);
80                  } catch (InterruptedException e) {
81                      
82                  }
83                  metadataFile.delete(); 
84                  
85              }
86          } else if (metadataFile.exists()) {
87              try (Reader reader = ReaderFactory.newXmlReader(metadataFile)) {
88                  metadata = mappingReader.read(reader, false);
89              }
90          }
91  
92          boolean changed;
93  
94          
95          if (metadata == null) {
96              metadata = this.metadata;
97  
98              changed = true;
99          } else {
100             changed = metadata.merge(this.metadata);
101         }
102 
103         
104         String version = metadata.getVersion();
105         if (Artifact.LATEST_VERSION.equals(version) || Artifact.RELEASE_VERSION.equals(version)) {
106             
107             metadata.setVersion(null);
108         }
109 
110         if (changed || !metadataFile.exists()) {
111             metadataFile.getParentFile().mkdirs();
112             try (Writer writer = WriterFactory.newXmlWriter(metadataFile)) {
113                 MetadataXpp3Writer mappingWriter = new MetadataXpp3Writer();
114 
115                 mappingWriter.write(writer, metadata);
116             }
117         } else {
118             metadataFile.setLastModified(System.currentTimeMillis());
119         }
120     }
121 
122     public String toString() {
123         return "repository metadata for: '" + getKey() + "'";
124     }
125 
126     protected static Metadata createMetadata(Artifact artifact, Versioning versioning) {
127         Metadata metadata = new Metadata();
128         metadata.setGroupId(artifact.getGroupId());
129         metadata.setArtifactId(artifact.getArtifactId());
130         metadata.setVersion(artifact.getVersion());
131         metadata.setVersioning(versioning);
132         return metadata;
133     }
134 
135     protected static Versioning createVersioning(Snapshot snapshot) {
136         Versioning versioning = new Versioning();
137         versioning.setSnapshot(snapshot);
138         return versioning;
139     }
140 
141     public void setMetadata(Metadata metadata) {
142         this.metadata = metadata;
143     }
144 
145     public Metadata getMetadata() {
146         return metadata;
147     }
148 
149     public void merge(org.apache.maven.repository.legacy.metadata.ArtifactMetadata metadata) {
150         
151         
152         AbstractRepositoryMetadata repoMetadata = (AbstractRepositoryMetadata) metadata;
153         this.metadata.merge(repoMetadata.getMetadata());
154     }
155 
156     public void merge(ArtifactMetadata metadata) {
157         
158         
159         AbstractRepositoryMetadata repoMetadata = (AbstractRepositoryMetadata) metadata;
160         this.metadata.merge(repoMetadata.getMetadata());
161     }
162 
163     public String extendedToString() {
164         StringBuilder buffer = new StringBuilder(256);
165 
166         buffer.append(LS).append("Repository Metadata").append(LS).append("--------------------------");
167         buffer.append(LS).append("GroupId: ").append(getGroupId());
168         buffer.append(LS).append("ArtifactId: ").append(getArtifactId());
169         buffer.append(LS).append("Metadata Type: ").append(getClass().getName());
170 
171         return buffer.toString();
172     }
173 
174     public int getNature() {
175         return RELEASE;
176     }
177 
178     public ArtifactRepositoryPolicy getPolicy(ArtifactRepository repository) {
179         int nature = getNature();
180         if ((nature & RepositoryMetadata.RELEASE_OR_SNAPSHOT) == RepositoryMetadata.RELEASE_OR_SNAPSHOT) {
181             ArtifactRepositoryPolicy policy = new ArtifactRepositoryPolicy(repository.getReleases());
182             policy.merge(repository.getSnapshots());
183             return policy;
184         } else if ((nature & RepositoryMetadata.SNAPSHOT) != 0) {
185             return repository.getSnapshots();
186         } else {
187             return repository.getReleases();
188         }
189     }
190 }