1 /* 2 * #%L 3 * ServerVersionException.java - mongodb-async-driver - Allanbank Consulting, Inc. 4 * %% 5 * Copyright (C) 2011 - 2014 Allanbank Consulting, Inc. 6 * %% 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * #L% 19 */ 20 package com.allanbank.mongodb.error; 21 22 import java.io.IOException; 23 24 import com.allanbank.mongodb.MongoDbException; 25 import com.allanbank.mongodb.Version; 26 import com.allanbank.mongodb.client.Message; 27 import com.allanbank.mongodb.client.VersionRange; 28 29 /** 30 * ServerVersionException is thrown to report that an attempt was made to send a 31 * request to a server that required a more recent version of the server. 32 * 33 * @api.yes This class is part of the driver's API. Public and protected members 34 * will be deprecated for at least 1 non-bugfix release (version 35 * numbers are <major>.<minor>.<bugfix>) before being 36 * removed or modified. 37 * @copyright 2013, Allanbank Consulting, Inc., All Rights Reserved 38 */ 39 public class ServerVersionException extends MongoDbException { 40 41 /** Serialization version for the class. */ 42 private static final long serialVersionUID = -8577756570001826274L; 43 44 /** 45 * Creates a suitable message for the exception. 46 * 47 * @param operation 48 * The name of the command/operation. 49 * @param range 50 * The required server version range for the operation. 51 * @param actual 52 * The actual version from the server. 53 * @return The message for the exception. 54 */ 55 private static String message(final String operation, 56 final VersionRange range, final Version actual) { 57 if (Version.VERSION_0.equals(range.getLowerBounds())) { 58 return "Attempted to send the '" + operation 59 + "' operation to a version " + actual 60 + " server but the operation is only supported " 61 + "before version " + range.getUpperBounds() + "."; 62 } 63 else if (Version.UNKNOWN.equals(range.getUpperBounds())) { 64 return "Attempted to send the '" + operation 65 + "' operation to a version " + actual 66 + " server but the operation is only supported " 67 + "after version " + range.getLowerBounds() + "."; 68 } 69 else { 70 return "Attempted to send the '" + operation 71 + "' operation to a version " + actual 72 + " server but the operation is only supported " 73 + "from version " + range.getLowerBounds() + " to " 74 + range.getUpperBounds() + "."; 75 } 76 } 77 78 /** The actual server version. */ 79 private final Version myActualVersion; 80 81 /** The operation's message. */ 82 private transient Message myMessage; 83 84 /** The name of the operation. */ 85 private final String myOperation; 86 87 /** The required server version for the operation. */ 88 private final VersionRange myRange; 89 90 /** 91 * Creates a new ServerVersionException. 92 * 93 * @param operation 94 * The name of the command/operation. 95 * @param range 96 * The required server version range for the operation. 97 * @param actual 98 * The actual version from the server. 99 * @param message 100 * The operation's message. 101 */ 102 public ServerVersionException(final String operation, 103 final VersionRange range, final Version actual, 104 final Message message) { 105 super(message(operation, range, actual)); 106 107 myOperation = operation; 108 myActualVersion = actual; 109 myRange = range; 110 myMessage = message; 111 } 112 113 /** 114 * Returns the actual server version. 115 * 116 * @return The actual server version. 117 */ 118 public Version getActualVersion() { 119 return myActualVersion; 120 } 121 122 /** 123 * Returns the maximum (exclusive) server version for the operation. 124 * 125 * @return The required server version for the operation. 126 */ 127 public Version getMaximumVersion() { 128 return myRange.getUpperBounds(); 129 } 130 131 /** 132 * Returns the name of the operation. 133 * 134 * @return The name of the operation. 135 */ 136 public String getOperation() { 137 return myOperation; 138 } 139 140 /** 141 * Returns the required (inclusive) server version for the operation. 142 * 143 * @return The required server version for the operation. 144 */ 145 public Version getRequiredVersion() { 146 return myRange.getLowerBounds(); 147 } 148 149 /** 150 * Returns the operation's message. 151 * 152 * @return The operation's message. 153 */ 154 public Message getSentMessage() { 155 return myMessage; 156 } 157 158 /** 159 * Reads the serialized configuration and sets the transient field to known 160 * values. 161 * 162 * @param stream 163 * The stream to read from. 164 * @throws IOException 165 * On a failure reading from the stream. 166 * @throws ClassNotFoundException 167 * On a failure locating a type in the stream. 168 */ 169 private void readObject(final java.io.ObjectInputStream stream) 170 throws IOException, ClassNotFoundException { 171 stream.defaultReadObject(); 172 173 myMessage = null; 174 } 175 }