Env.java
001 /*
002  * Java Genetic Algorithm Library (jenetics-3.7.0).
003  * Copyright (c) 2007-2016 Franz Wilhelmstötter
004  *
005  * Licensed under the Apache License, Version 2.0 (the "License");
006  * you may not use this file except in compliance with the License.
007  * You may obtain a copy of the License at
008  *
009  *      http://www.apache.org/licenses/LICENSE-2.0
010  *
011  * Unless required by applicable law or agreed to in writing, software
012  * distributed under the License is distributed on an "AS IS" BASIS,
013  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014  * See the License for the specific language governing permissions and
015  * limitations under the License.
016  *
017  * Author:
018  *    Franz Wilhelmstötter (franz.wilhelmstoetter@gmx.at)
019  */
020 package org.jenetics.tool.trial;
021 
022 import static java.util.Objects.requireNonNull;
023 
024 import java.io.Serializable;
025 
026 import javax.xml.bind.annotation.XmlAccessType;
027 import javax.xml.bind.annotation.XmlAccessorType;
028 import javax.xml.bind.annotation.XmlElement;
029 import javax.xml.bind.annotation.XmlRootElement;
030 import javax.xml.bind.annotation.XmlType;
031 import javax.xml.bind.annotation.adapters.XmlAdapter;
032 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
033 
034 import org.jenetics.internal.util.Hash;
035 
036 /**
037  * Represents the collected runtime information.
038  *
039  @author <a href="mailto:franz.wilhelmstoetter@gmx.at">Franz Wilhelmstötter</a>
040  @version 3.4
041  @since 3.4
042  */
043 @XmlJavaTypeAdapter(Env.Model.Adapter.class)
044 public final class Env implements Serializable  {
045 
046     private static final long serialVersionUID = 1L;
047 
048     private final String _osName;
049     private final String _osVersion;
050     private final String _osArch;
051     private final String _javaVersion;
052     private final String _javaRuntimeName;
053     private final String _javaRuntimeVersion;
054     private final String _javaVMName;
055     private final String _javaVMVersion;
056 
057     private Env(
058         final String osName,
059         final String osVersion,
060         final String osArch,
061         final String javaVersion,
062         final String javaRuntimeName,
063         final String javaRuntimeVersion,
064         final String javaVMName,
065         final String javaVMVersion
066     ) {
067         _osName = requireNonNull(osName);
068         _osVersion = requireNonNull(osVersion);
069         _osArch = requireNonNull(osArch);
070         _javaVersion = requireNonNull(javaVersion);
071         _javaRuntimeName = requireNonNull(javaRuntimeName);
072         _javaRuntimeVersion = requireNonNull(javaRuntimeVersion);
073         _javaVMName = requireNonNull(javaVMName);
074         _javaVMVersion = requireNonNull(javaVMVersion);
075     }
076 
077     /**
078      * The OS architecture.
079      *
080      @return the OS architecture
081      */
082     public String getOSArch() {
083         return _osArch;
084     }
085 
086     /**
087      * The OS name.
088      *
089      @return the OS name
090      */
091     public String getOSName() {
092         return _osName;
093     }
094 
095     /**
096      * The OS version.
097      *
098      @return the OS version
099      */
100     public String getOSVersion() {
101         return _osVersion;
102     }
103 
104     /**
105      * The Java runtime name.
106      *
107      @return the Java runtime name
108      */
109     public String getJavaRuntimeName() {
110         return _javaRuntimeName;
111     }
112 
113     /**
114      * The Java runtime version.
115      *
116      @return the Java runtime version
117      */
118     public String getJavaRuntimeVersion() {
119         return _javaRuntimeVersion;
120     }
121 
122     /**
123      * The Java version.
124      *
125      @return the Java version
126      */
127     public String getJavaVersion() {
128         return _javaVersion;
129     }
130 
131     /**
132      * The Java VM name.
133      *
134      @return the Java VM name
135      */
136     public String getJavaVMName() {
137         return _javaVMName;
138     }
139 
140     /**
141      * Return the Java VM version.
142      *
143      @return the Java VM version
144      */
145     public String getJavaVMVersion() {
146         return _javaVMVersion;
147     }
148 
149     @Override
150     public int hashCode() {
151         return Hash.of(getClass())
152             .and(_osName)
153             .and(_osVersion)
154             .and(_osArch)
155             .and(_javaVersion)
156             .and(_javaRuntimeName)
157             .and(_javaRuntimeVersion)
158             .and(_javaVMName)
159             .and(_javaVMVersion).value();
160     }
161 
162     @Override
163     public boolean equals(final Object obj) {
164         return obj instanceof Env &&
165             _osName.equals(((Env)obj)._osName&&
166             _osVersion.equals(((Env)obj)._osVersion&&
167             _osArch.equals(((Env)obj)._osArch&&
168             _javaVersion.equals(((Env)obj)._javaVersion&&
169             _javaRuntimeName.equals(((Env)obj)._javaRuntimeName&&
170             _javaRuntimeVersion.equals(((Env)obj)._javaRuntimeVersion&&
171             _javaVMName.equals(((Env)obj)._javaVMName&&
172             _javaVMVersion.equals(((Env)obj)._javaVMVersion);
173     }
174 
175     @Override
176     public String toString() {
177         return
178             "OS name:              " + _osName + "\n" +
179             "OS version:           " + _osVersion + "\n" +
180             "OS architecture:      " + _osArch + "\n" +
181             "Java version:         " + _javaVersion + "\n" +
182             "Java runtime name:    " + _javaRuntimeName + "\n" +
183             "Java runtime version: " + _javaRuntimeName + "\n" +
184             "VM name:              " + _javaVMName + "\n" +
185             "VM version:           " + _javaVMVersion;
186     }
187 
188     /**
189      * Return a new {@code Env} object with the given parameters.
190      *
191      @param osName the OS name
192      @param osVersion the OS version
193      @param osArch the OS architecture
194      @param javaVersion the Java version
195      @param javaRuntimeName the Java runtime name
196      @param javaRuntimeVersion the Java runtime version
197      @param javaVMName the Java VM name
198      @param javaVMVersion the Java VM version
199      @throws  NullPointerException if one of the parameters is {@code null}
200      @return a new {@code Env} object
201      */
202     public static Env of(
203         final String osName,
204         final String osVersion,
205         final String osArch,
206         final String javaVersion,
207         final String javaRuntimeName,
208         final String javaRuntimeVersion,
209         final String javaVMName,
210         final String javaVMVersion
211     ) {
212         return new Env(
213             osName,
214             osVersion,
215             osArch,
216             javaVersion,
217             javaRuntimeName,
218             javaRuntimeVersion,
219             javaVMName,
220             javaVMVersion
221         );
222     }
223 
224     /**
225      * Return the <i>current</i> environment values.
226      *
227      @return the <i>current</i> environment values
228      */
229     public static Env of() {
230         return of(
231             System.getProperty("os.name"),
232             System.getProperty("os.version"),
233             System.getProperty("os.arch"),
234             System.getProperty("java.version"),
235             System.getProperty("java.runtime.name"),
236             System.getProperty("java.runtime.version"),
237             System.getProperty("java.vm.name"),
238             System.getProperty("java.vm.version")
239         );
240     }
241 
242     /* *************************************************************************
243      *  JAXB object serialization
244      * ************************************************************************/
245 
246     @XmlRootElement(name = "environment")
247     @XmlType(name = "org.jenetics.tool.trial.Env")
248     @XmlAccessorType(XmlAccessType.FIELD)
249     static final class Model {
250 
251         @XmlElement(name = "os-name")
252         public String osName;
253 
254         @XmlElement(name = "os-version")
255         public String osVersion;
256 
257         @XmlElement(name = "os-architecture")
258         public String osArch;
259 
260         @XmlElement(name = "java-version")
261         public String javaVersion;
262 
263         @XmlElement(name = "java-runtime-name")
264         public String javaRuntimeName;
265 
266         @XmlElement(name = "java-runtime-version")
267         public String javaRuntimeVersion;
268 
269         @XmlElement(name = "java-vm-name")
270         public String javaVMName;
271 
272         @XmlElement(name = "java-vm-version")
273         public String javaVMVersion;
274 
275         public static final class Adapter extends XmlAdapter<Model, Env> {
276             @Override
277             public Model marshal(final Env env) {
278                 final Model model = new Model();
279                 model.osName = env.getOSName();
280                 model.osVersion = env.getOSVersion();
281                 model.osArch = env.getOSArch();
282                 model.javaVersion = env.getJavaVersion();
283                 model.javaRuntimeName = env.getJavaRuntimeName();
284                 model.javaRuntimeVersion = env.getJavaRuntimeVersion();
285                 model.javaVMName = env.getJavaVMName();
286                 model.javaVMVersion = env.getJavaVMVersion();
287                 return model;
288             }
289 
290             @Override
291             public Env unmarshal(final Model model) {
292                 return Env.of(
293                     model.osName,
294                     model.osVersion,
295                     model.osArch,
296                     model.javaVersion,
297                     model.javaRuntimeName,
298                     model.javaRuntimeVersion,
299                     model.javaVMName,
300                     model.javaVMVersion
301                 );
302             }
303         }
304     }
305 
306 }