1 | /** |
2 | * |
3 | * Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com> |
4 | * |
5 | * ==================================================================== |
6 | * Licensed under the Apache License, Version 2.0 (the "License"); |
7 | * you may not use this file except in compliance with the License. |
8 | * You may obtain a copy of the License at |
9 | * |
10 | * http://www.apache.org/licenses/LICENSE-2.0 |
11 | * |
12 | * Unless required by applicable law or agreed to in writing, software |
13 | * distributed under the License is distributed on an "AS IS" BASIS, |
14 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
15 | * See the License for the specific language governing permissions and |
16 | * limitations under the License. |
17 | * ==================================================================== |
18 | */ |
19 | package org.jclouds.compute.domain; |
20 | |
21 | import static com.google.common.base.Preconditions.checkNotNull; |
22 | |
23 | import javax.annotation.Nullable; |
24 | |
25 | import com.google.common.annotations.Beta; |
26 | |
27 | /** |
28 | * Running Operating system |
29 | * |
30 | * @author Adrian Cole |
31 | */ |
32 | @Beta |
33 | public class OperatingSystem { |
34 | @Nullable |
35 | private OsFamily family; |
36 | @Nullable |
37 | private String name; |
38 | @Nullable |
39 | private String arch; |
40 | @Nullable |
41 | private String version; |
42 | private String description; |
43 | private boolean is64Bit; |
44 | |
45 | // for serialization/deserialization |
46 | protected OperatingSystem() { |
47 | |
48 | } |
49 | |
50 | public OperatingSystem(@Nullable OsFamily family, @Nullable String name, @Nullable String version, |
51 | @Nullable String arch, String description, boolean is64Bit) { |
52 | this.family = family; |
53 | this.name = name; |
54 | this.arch = arch; |
55 | this.version = version; |
56 | this.description = checkNotNull(description, "description"); |
57 | this.is64Bit = is64Bit; |
58 | } |
59 | |
60 | /** |
61 | * Type of the operating system |
62 | * <p/> |
63 | * generally, this is used to compare the means by which you use an operating |
64 | * system. For example, to determine compatibility of a particular |
65 | * bootstrapping or package installation approach. |
66 | */ |
67 | @Nullable |
68 | public OsFamily getFamily() { |
69 | return family; |
70 | } |
71 | |
72 | /** |
73 | * name of the operating system; ex. {@code Red Hat Enterprise Linux} |
74 | * |
75 | * <h2>note</h2> While this looks similar to, and may in some cases be the |
76 | * same as the java system property {@code os.name} it isn't guaranteed to |
77 | * match a particular value. For example, this value could be derived from |
78 | * data parsed for a cloud api or the OVF CIM OSType enum value; |
79 | * |
80 | * @return operating system name or null if it couldn't be determined. |
81 | */ |
82 | @Nullable |
83 | public String getName() { |
84 | return name; |
85 | } |
86 | |
87 | /** |
88 | * architecture of the operating system; ex. {@code x86_64} |
89 | * <p/> |
90 | * generally, this is used to decide whether an operating system will run |
91 | * certain binaries, for example, a 64bit JDK. |
92 | * |
93 | * <h2>note</h2> |
94 | * While this looks similar to, and may in some cases be the same as the java |
95 | * system property {@code os.arch} it isn't guaranteed to match a particular |
96 | * value. For example, this value could be derived from data parsed for a |
97 | * cloud api or the OVF CIM OSType enum value; |
98 | * |
99 | * @return operating system architecture or null if it couldn't be |
100 | * determined. |
101 | */ |
102 | @Nullable |
103 | public String getArch() { |
104 | return arch; |
105 | } |
106 | |
107 | /** |
108 | * version of the operating system; ex. {@code 10.0.4} |
109 | * <p/> |
110 | * generally, this is used to compare versions of the same operating system |
111 | * name. It should be meaningful when sorted against, although this isn't |
112 | * necessary. |
113 | * <h2>note</h2> |
114 | * While this looks similar to, and may in some cases be the same as the java |
115 | * system property {@code os.version} it isn't guaranteed to match a |
116 | * particular value. For example, this value could be derived from data |
117 | * parsed for a cloud api or the OVF CIM OSType enum value; |
118 | * |
119 | * @return operating system version or null if it couldn't be determined. |
120 | */ |
121 | @Nullable |
122 | public String getVersion() { |
123 | return version; |
124 | } |
125 | |
126 | /** |
127 | * description of the operating system; ex. {@code CentOS 32-bit},{@code |
128 | * Other Linux (32-bit)} |
129 | * <p/> |
130 | * This is the only required field in the operating system object. In some |
131 | * implementations, it is this data that is used to parse the value of the |
132 | * {@link #name}, {@link #version}, and {@link #arch} fields. |
133 | * |
134 | * @return operating system description |
135 | */ |
136 | public String getDescription() { |
137 | return description; |
138 | } |
139 | |
140 | /** |
141 | * |
142 | * @return whether this operating system supports 64 bit computation. |
143 | */ |
144 | public boolean is64Bit() { |
145 | return is64Bit; |
146 | } |
147 | |
148 | @Override |
149 | public int hashCode() { |
150 | final int prime = 31; |
151 | int result = 1; |
152 | result = prime * result + ((arch == null) ? 0 : arch.hashCode()); |
153 | result = prime * result + ((description == null) ? 0 : description.hashCode()); |
154 | result = prime * result + ((family == null) ? 0 : family.hashCode()); |
155 | result = prime * result + (is64Bit ? 1231 : 1237); |
156 | result = prime * result + ((name == null) ? 0 : name.hashCode()); |
157 | result = prime * result + ((version == null) ? 0 : version.hashCode()); |
158 | return result; |
159 | } |
160 | |
161 | @Override |
162 | public boolean equals(Object obj) { |
163 | if (this == obj) |
164 | return true; |
165 | if (obj == null) |
166 | return false; |
167 | if (getClass() != obj.getClass()) |
168 | return false; |
169 | OperatingSystem other = (OperatingSystem) obj; |
170 | if (arch == null) { |
171 | if (other.arch != null) |
172 | return false; |
173 | } else if (!arch.equals(other.arch)) |
174 | return false; |
175 | if (description == null) { |
176 | if (other.description != null) |
177 | return false; |
178 | } else if (!description.equals(other.description)) |
179 | return false; |
180 | if (family == null) { |
181 | if (other.family != null) |
182 | return false; |
183 | } else if (!family.equals(other.family)) |
184 | return false; |
185 | if (is64Bit != other.is64Bit) |
186 | return false; |
187 | if (name == null) { |
188 | if (other.name != null) |
189 | return false; |
190 | } else if (!name.equals(other.name)) |
191 | return false; |
192 | if (version == null) { |
193 | if (other.version != null) |
194 | return false; |
195 | } else if (!version.equals(other.version)) |
196 | return false; |
197 | return true; |
198 | } |
199 | |
200 | @Override |
201 | public String toString() { |
202 | return "[name=" + name + ", family=" + family + ", version=" + version + ", arch=" + arch + ", is64Bit=" |
203 | + is64Bit + ", description=" + description + "]"; |
204 | } |
205 | |
206 | } |