]> source.dussan.org Git - archiva.git/blob
4d902f33f99171d21a8d26a48666f0669e6c02b2
[archiva.git] /
1 package org.apache.archiva.repository.content.base;
2
3 /*
4  * Licensed to the Apache Software Foundation (ASF) under one
5  * or more contributor license agreements.  See the NOTICE file
6  * distributed with this work for additional information
7  * regarding copyright ownership.  The ASF licenses this file
8  * to you under the Apache License, Version 2.0 (the
9  * "License"); you may not use this file except in compliance
10  * with the License.  You may obtain a copy of the License at
11  *
12  *  http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17  * KIND, either express or implied.  See the License for the
18  * specific language governing permissions and limitations
19  * under the License.
20  */
21
22 import org.apache.archiva.repository.content.Namespace;
23 import org.apache.archiva.repository.content.Project;
24 import org.apache.archiva.repository.content.base.builder.ProjectOptBuilder;
25 import org.apache.archiva.repository.content.base.builder.ProjectWithIdBuilder;
26 import org.apache.archiva.repository.content.base.builder.WithNamespaceObjectBuilder;
27 import org.apache.archiva.repository.storage.StorageAsset;
28 import org.apache.commons.lang3.StringUtils;
29
30 /**
31  * Immutable class, that represents a project.
32  * <p>
33  * The namespace and id are required attributes for each instance.
34  * <p>
35  * Two project instances are equal if the id, and the namespace are equal and if the base attributes
36  * repository and asset match.
37  *
38  * @author Martin Stockhammer <martin_s@apache.org>
39  * @since 3.0
40  */
41 public class ArchivaProject extends ArchivaContentItem implements Project
42 {
43     private Namespace namespace;
44     private String id;
45
46     // Setting all setters to private. Builder is the way to go.
47     private ArchivaProject( )
48     {
49
50     }
51
52
53     /**
54      * Creates the builder for creating new archiva project instances.
55      * You have to set all required attributes before you can call the build() method.
56      *
57      * @param storageAsset the asset
58      * @return a builder instance
59      */
60     public static WithNamespaceObjectBuilder withAsset( StorageAsset storageAsset )
61     {
62         return new Builder( ).withAsset( storageAsset );
63     }
64
65     @Override
66     public Namespace getNamespace( )
67     {
68         return this.namespace;
69     }
70
71     @Override
72     public String getId( )
73     {
74         return this.id;
75     }
76
77
78     @Override
79     public boolean equals( Object o )
80     {
81         if ( this == o ) return true;
82         if ( o == null || getClass( ) != o.getClass( ) ) return false;
83         if ( !super.equals( o ) ) return false;
84
85         ArchivaProject that = (ArchivaProject) o;
86
87         if ( !namespace.equals( that.namespace ) ) return false;
88         return id.equals( that.id );
89     }
90
91     @Override
92     public int hashCode( )
93     {
94         int result = super.hashCode( );
95         result = 31 * result + namespace.hashCode( );
96         result = 31 * result + id.hashCode( );
97         return result;
98     }
99
100
101     /*
102      * Builder class
103      */
104     public static final class Builder
105         extends ContentItemBuilder<ArchivaProject, ProjectOptBuilder, WithNamespaceObjectBuilder>
106         implements ProjectOptBuilder, ProjectWithIdBuilder, WithNamespaceObjectBuilder
107     {
108         private Builder( )
109         {
110             super( new ArchivaProject( ) );
111         }
112
113
114         @Override
115         protected ProjectOptBuilder getOptBuilder( )
116         {
117             return this;
118         }
119
120         @Override
121         protected WithNamespaceObjectBuilder getNextBuilder( )
122         {
123             return this;
124         }
125
126         @Override
127         public ProjectOptBuilder withId( String id )
128         {
129             if ( StringUtils.isEmpty( id ) )
130             {
131                 throw new IllegalArgumentException( "Null or empty value not allowed for id" );
132             }
133             item.id = id;
134             return this;
135         }
136
137         @Override
138         public ProjectWithIdBuilder withNamespace( Namespace namespace )
139         {
140             if ( namespace == null )
141             {
142                 throw new IllegalArgumentException( "Null value not allowed for namespace" );
143             }
144             item.namespace = namespace;
145             super.setRepository( namespace.getRepository( ) );
146             return this;
147         }
148
149         @Override
150         public ArchivaProject build( )
151         {
152             super.build( );
153             if ( item.namespace == null )
154             {
155                 throw new IllegalArgumentException( "Namespace may not be null" );
156             }
157             return item;
158         }
159     }
160
161
162 }