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}