1 package org.apache.maven.repository.internal;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.File;
23 import java.io.IOException;
24 import java.io.Reader;
25 import java.io.Writer;
26 import java.util.Collections;
27 import java.util.Map;
28
29 import org.apache.maven.artifact.repository.metadata.Metadata;
30 import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader;
31 import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Writer;
32 import org.codehaus.plexus.util.IOUtil;
33 import org.codehaus.plexus.util.ReaderFactory;
34 import org.codehaus.plexus.util.WriterFactory;
35 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
36 import org.eclipse.aether.RepositoryException;
37 import org.eclipse.aether.metadata.AbstractMetadata;
38 import org.eclipse.aether.metadata.MergeableMetadata;
39
40
41
42
43 abstract class MavenMetadata
44 extends AbstractMetadata
45 implements MergeableMetadata
46 {
47
48 static final String MAVEN_METADATA_XML = "maven-metadata.xml";
49
50 private final File file;
51
52 protected Metadata metadata;
53
54 private boolean merged;
55
56 protected MavenMetadata( Metadata metadata, File file )
57 {
58 this.metadata = metadata;
59 this.file = file;
60 }
61
62 public String getType()
63 {
64 return MAVEN_METADATA_XML;
65 }
66
67 public File getFile()
68 {
69 return file;
70 }
71
72 public void merge( File existing, File result )
73 throws RepositoryException
74 {
75 Metadata recessive = read( existing );
76
77 merge( recessive );
78
79 write( result, metadata );
80
81 merged = true;
82 }
83
84 public boolean isMerged()
85 {
86 return merged;
87 }
88
89 protected abstract void merge( Metadata recessive );
90
91 static Metadata read( File metadataFile )
92 throws RepositoryException
93 {
94 if ( metadataFile.length() <= 0 )
95 {
96 return new Metadata();
97 }
98
99 Reader reader = null;
100 try
101 {
102 reader = ReaderFactory.newXmlReader( metadataFile );
103 return new MetadataXpp3Reader().read( reader, false );
104 }
105 catch ( IOException e )
106 {
107 throw new RepositoryException( "Could not read metadata " + metadataFile + ": " + e.getMessage(), e );
108 }
109 catch ( XmlPullParserException e )
110 {
111 throw new RepositoryException( "Could not parse metadata " + metadataFile + ": " + e.getMessage(), e );
112 }
113 finally
114 {
115 IOUtil.close( reader );
116 }
117 }
118
119 private void write( File metadataFile, Metadata metadata )
120 throws RepositoryException
121 {
122 Writer writer = null;
123 try
124 {
125 metadataFile.getParentFile().mkdirs();
126 writer = WriterFactory.newXmlWriter( metadataFile );
127 new MetadataXpp3Writer().write( writer, metadata );
128 }
129 catch ( IOException e )
130 {
131 throw new RepositoryException( "Could not write metadata " + metadataFile + ": " + e.getMessage(), e );
132 }
133 finally
134 {
135 IOUtil.close( writer );
136 }
137 }
138
139 public Map<String, String> getProperties()
140 {
141 return Collections.emptyMap();
142 }
143
144 @Override
145 public org.eclipse.aether.metadata.Metadata setProperties( Map<String, String> properties )
146 {
147 return this;
148 }
149
150 }