1 package org.apache.maven.plugin;
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.util.ArrayList;
24 import java.util.HashMap;
25 import java.util.List;
26 import java.util.Map;
27
28 import org.apache.maven.project.ExtensionDescriptor;
29 import org.apache.maven.project.MavenProject;
30 import org.codehaus.plexus.classworlds.realm.ClassRealm;
31 import org.codehaus.plexus.component.annotations.Component;
32 import org.sonatype.aether.artifact.Artifact;
33
34
35
36
37 @Component( role = ExtensionRealmCache.class )
38 public class DefaultExtensionRealmCache
39 implements ExtensionRealmCache
40 {
41
42 private static class CacheKey
43 {
44
45 private final List<File> files;
46
47 private final List<Long> timestamps;
48
49 private final List<Long> sizes;
50
51 private final List<String> ids;
52
53 private final int hashCode;
54
55 public CacheKey( List<? extends Artifact> extensionArtifacts )
56 {
57 this.files = new ArrayList<File>( extensionArtifacts.size() );
58 this.timestamps = new ArrayList<Long>( extensionArtifacts.size() );
59 this.sizes = new ArrayList<Long>( extensionArtifacts.size() );
60 this.ids = new ArrayList<String>( extensionArtifacts.size() );
61
62 for ( Artifact artifact : extensionArtifacts )
63 {
64 File file = artifact.getFile();
65 files.add( file );
66 timestamps.add( ( file != null ) ? Long.valueOf( file.lastModified() ) : Long.valueOf( 0 ) );
67 sizes.add( ( file != null ) ? Long.valueOf( file.length() ) : Long.valueOf( 0 ) );
68 ids.add( artifact.getVersion() );
69 }
70
71 this.hashCode =
72 31 * files.hashCode() + 31 * ids.hashCode() + 31 * timestamps.hashCode() + 31 * sizes.hashCode();
73 }
74
75 @Override
76 public int hashCode()
77 {
78 return hashCode;
79 }
80
81 @Override
82 public boolean equals( Object o )
83 {
84 if ( o == this )
85 {
86 return true;
87 }
88
89 if ( !( o instanceof CacheKey ) )
90 {
91 return false;
92 }
93
94 CacheKey other = (CacheKey) o;
95
96 return ids.equals( other.ids ) && files.equals( other.files ) && timestamps.equals( other.timestamps )
97 && sizes.equals( other.sizes );
98 }
99
100 }
101
102 private final Map<CacheKey, CacheRecord> cache = new HashMap<CacheKey, CacheRecord>();
103
104 public CacheRecord get( List<? extends Artifact> extensionArtifacts )
105 {
106 return cache.get( new CacheKey( extensionArtifacts ) );
107 }
108
109 public CacheRecord put( List<? extends Artifact> extensionArtifacts, ClassRealm extensionRealm,
110 ExtensionDescriptor extensionDescriptor )
111 {
112 if ( extensionRealm == null )
113 {
114 throw new NullPointerException();
115 }
116
117 CacheKey key = new CacheKey( extensionArtifacts );
118
119 if ( cache.containsKey( key ) )
120 {
121 throw new IllegalStateException( "Duplicate extension realm for extension " + extensionArtifacts );
122 }
123
124 CacheRecord record = new CacheRecord( extensionRealm, extensionDescriptor );
125
126 cache.put( key, record );
127
128 return record;
129 }
130
131 public void flush()
132 {
133 cache.clear();
134 }
135
136 public void register( MavenProject project, CacheRecord record )
137 {
138
139 }
140
141 }