001/*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *     http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018package org.apache.hadoop.hbase.rest.model;
019
020import java.io.IOException;
021import java.io.Serializable;
022import javax.servlet.ServletContext;
023import javax.xml.bind.annotation.XmlAttribute;
024import javax.xml.bind.annotation.XmlRootElement;
025import org.apache.hadoop.hbase.rest.ProtobufMessageHandler;
026import org.apache.hadoop.hbase.rest.RESTServlet;
027import org.apache.yetus.audience.InterfaceAudience;
028
029import org.apache.hbase.thirdparty.org.glassfish.jersey.servlet.ServletContainer;
030
031import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
032import org.apache.hadoop.hbase.shaded.rest.protobuf.generated.VersionMessage.Version;
033
034/**
035 * A representation of the collection of versions of the REST gateway software components.
036 * <ul>
037 * <li>restVersion: REST gateway revision</li>
038 * <li>jvmVersion: the JVM vendor and version information</li>
039 * <li>osVersion: the OS type, version, and hardware architecture</li>
040 * <li>serverVersion: the name and version of the servlet container</li>
041 * <li>jerseyVersion: the version of the embedded Jersey framework</li>
042 * </ul>
043 */
044@XmlRootElement(name = "Version")
045@InterfaceAudience.Private
046public class VersionModel implements Serializable, ProtobufMessageHandler {
047
048  private static final long serialVersionUID = 1L;
049
050  private String restVersion;
051  private String jvmVersion;
052  private String osVersion;
053  private String serverVersion;
054  private String jerseyVersion;
055
056  /**
057   * Default constructor. Do not use.
058   */
059  public VersionModel() {
060  }
061
062  /**
063   * Constructor
064   * @param context the servlet context
065   */
066  public VersionModel(ServletContext context) {
067    restVersion = RESTServlet.VERSION_STRING;
068    jvmVersion = System.getProperty("java.vm.vendor") + ' ' + System.getProperty("java.version")
069      + '-' + System.getProperty("java.vm.version");
070    osVersion = System.getProperty("os.name") + ' ' + System.getProperty("os.version") + ' '
071      + System.getProperty("os.arch");
072    serverVersion = context.getServerInfo();
073    jerseyVersion = ServletContainer.class.getPackage().getImplementationVersion();
074    // Currently, this will always be null because the manifest doesn't have any useful information
075    if (jerseyVersion == null) jerseyVersion = "";
076  }
077
078  /** Returns the REST gateway version */
079  @XmlAttribute(name = "REST")
080  public String getRESTVersion() {
081    return restVersion;
082  }
083
084  /** Returns the JVM vendor and version */
085  @XmlAttribute(name = "JVM")
086  public String getJVMVersion() {
087    return jvmVersion;
088  }
089
090  /** Returns the OS name, version, and hardware architecture */
091  @XmlAttribute(name = "OS")
092  public String getOSVersion() {
093    return osVersion;
094  }
095
096  /** Returns the servlet container version */
097  @XmlAttribute(name = "Server")
098  public String getServerVersion() {
099    return serverVersion;
100  }
101
102  /** Returns the version of the embedded Jersey framework */
103  @XmlAttribute(name = "Jersey")
104  public String getJerseyVersion() {
105    return jerseyVersion;
106  }
107
108  /**
109   * @param version the REST gateway version string
110   */
111  public void setRESTVersion(String version) {
112    this.restVersion = version;
113  }
114
115  /**
116   * @param version the OS version string
117   */
118  public void setOSVersion(String version) {
119    this.osVersion = version;
120  }
121
122  /**
123   * @param version the JVM version string
124   */
125  public void setJVMVersion(String version) {
126    this.jvmVersion = version;
127  }
128
129  /**
130   * @param version the servlet container version string
131   */
132  public void setServerVersion(String version) {
133    this.serverVersion = version;
134  }
135
136  /**
137   * @param version the Jersey framework version string
138   */
139  public void setJerseyVersion(String version) {
140    this.jerseyVersion = version;
141  }
142
143  /*
144   * (non-Javadoc)
145   * @see java.lang.Object#toString()
146   */
147  @Override
148  public String toString() {
149    StringBuilder sb = new StringBuilder();
150    sb.append("rest ");
151    sb.append(restVersion);
152    sb.append(" [JVM: ");
153    sb.append(jvmVersion);
154    sb.append("] [OS: ");
155    sb.append(osVersion);
156    sb.append("] [Server: ");
157    sb.append(serverVersion);
158    sb.append("] [Jersey: ");
159    sb.append(jerseyVersion);
160    sb.append("]\n");
161    return sb.toString();
162  }
163
164  @Override
165  public byte[] createProtobufOutput() {
166    Version.Builder builder = Version.newBuilder();
167    builder.setRestVersion(restVersion);
168    builder.setJvmVersion(jvmVersion);
169    builder.setOsVersion(osVersion);
170    builder.setServerVersion(serverVersion);
171    builder.setJerseyVersion(jerseyVersion);
172    return builder.build().toByteArray();
173  }
174
175  @Override
176  public ProtobufMessageHandler getObjectFromMessage(byte[] message) throws IOException {
177    Version.Builder builder = Version.newBuilder();
178    ProtobufUtil.mergeFrom(builder, message);
179    if (builder.hasRestVersion()) {
180      restVersion = builder.getRestVersion();
181    }
182    if (builder.hasJvmVersion()) {
183      jvmVersion = builder.getJvmVersion();
184    }
185    if (builder.hasOsVersion()) {
186      osVersion = builder.getOsVersion();
187    }
188    if (builder.hasServerVersion()) {
189      serverVersion = builder.getServerVersion();
190    }
191    if (builder.hasJerseyVersion()) {
192      jerseyVersion = builder.getJerseyVersion();
193    }
194    return this;
195  }
196}