1 /* 2 Copyright (C) 2000 - 2007 Grid Systems, S.A. 3 4 This program is free software; you can redistribute it and/or modify 5 it under the terms of the GNU General Public License, version 2, as 6 published by the Free Software Foundation. 7 8 This program is distributed in the hope that it will be useful, 9 but WITHOUT ANY WARRANTY; without even the implied warranty of 10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 GNU General Public License for more details. 12 13 You should have received a copy of the GNU General Public License 14 along with this program; if not, write to the Free Software 15 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 16 */ 17 package com.gridsystems.innergrid.api; 18 19 import java.util.regex.Pattern; 20 21 import com.gridsystems.innergrid.kernel.KernelException; 22 23 /** 24 * Connects to a single server. 25 * <p> 26 * Used when connecting to a Server that has no backup Server (redundant). 27 * 28 * @author Rodrigo Ruiz 29 * @author Xmas 30 * @version 1.0 31 */ 32 public class DirectConnection extends AbstractConnection { 33 34 /** 35 * Pattern used to identify those exception codes that must launch 36 * a connection retry. 37 */ 38 private static final Pattern RETRY_PATTERN = Pattern.compile("CLT000|CLT001|CLT002"); 39 40 /** 41 * Creates an instance of the connection to the specified <code>host:port</code>, 42 * using the specified credentials. 43 * 44 * @param h a string with the remote Server host name or address 45 * @param p the remote Server port 46 * @param secure a boolean set to <code>true</code> if a secure protocol(HTTPS) 47 * must be used; <code>false</code> otherwise 48 * @param credentials the credentials to authenticate the user 49 */ 50 public DirectConnection(String h, int p, boolean secure, Credentials credentials) { 51 this(h, p, secure, null, credentials); 52 } 53 54 /** 55 * Creates an instance of the connection to the specified <code>host:port</code>, 56 * using the specified credentials. The port must accept SSL connections. 57 * 58 * @param h a string with the remote Server host name or address 59 * @param p the remote Server port 60 * @param sslinfo additional info to establish SSL connections 61 * @param credentials the credentials to authenticate the user 62 * 63 * @see AcceptAllCertificates AcceptAllCertificates 64 * @see AcceptCertificate AcceptCertificate 65 * @see AcceptCertificateOfKeyStore AcceptCertificateOfKeyStore 66 * @see AcceptCertificateOfSystemKeyStore AcceptCertificateOfSystemKeyStore 67 */ 68 public DirectConnection(String h, int p, SSLConnectionInfo sslinfo, 69 Credentials credentials) { 70 this(h, p, true, sslinfo, credentials); 71 } 72 73 /** 74 * Creates an instance of the connector to the specified <code>host:port</code>, 75 * using the specified credentials. 76 * 77 * @param h a string with the remote Server host name or address 78 * @param p the remote Server port 79 * @param secure a boolean set to <code>true</code> if a secure protocol(HTTPS) 80 * must be used; <code>false</code> otherwise 81 * @param sslInfo additional info to establish SSL connection 82 * @param credentials the credentials to authenticate the user 83 * 84 * @see AcceptAllCertificates AcceptAllCertificates 85 * @see AcceptCertificate AcceptCertificate 86 * @see AcceptCertificateOfKeyStore AcceptCertificateOfKeyStore 87 * @see AcceptCertificateOfSystemKeyStore AcceptCertificateOfSystemKeyStore 88 */ 89 public DirectConnection(String h, int p, boolean secure, 90 SSLConnectionInfo sslInfo, Credentials credentials) { 91 super(h, p, secure, sslInfo, credentials); 92 } 93 94 /** 95 * Creates an instance of the connector to the specified <code>host:port</code>, 96 * using the specified credentials. 97 * 98 * @param h a string with the remote Server host name or address 99 * @param p the remote Server port 100 * @param secure a boolean set to <code>true</code> if a secure protocol(HTTPS) 101 * must be used; <code>false</code> otherwise 102 * @param contextPath Service context path 103 * @param sslInfo additional info to establish SSL connection 104 * @param credentials the credentials to authenticate the user 105 * 106 * @see AcceptAllCertificates AcceptAllCertificates 107 * @see AcceptCertificate AcceptCertificate 108 * @see AcceptCertificateOfKeyStore AcceptCertificateOfKeyStore 109 * @see AcceptCertificateOfSystemKeyStore AcceptCertificateOfSystemKeyStore 110 */ 111 public DirectConnection(String h, int p, boolean secure, String contextPath, 112 SSLConnectionInfo sslInfo, Credentials credentials) { 113 super(h, p, contextPath, secure, sslInfo, credentials); 114 } 115 116 /** 117 * {@inheritDoc} 118 */ 119 public void close() { 120 // This implementation does nothing 121 } 122 123 /** 124 * Gets the base URL for all API URLs (Internal use only). 125 * 126 * @return the base URL 127 * @throws KernelException <code>CTL008</code> if the URL is not well formed 128 */ 129 @Override public String getBaseUrl() throws KernelException { 130 checkConnection(); 131 132 return (secured ? "https" : "http") + "://" + host + ":" + port + contextPath; 133 } 134 135 /** 136 * Manages exceptions (Internal use only). 137 * 138 * @param ke KernelException captured 139 * @param retry number of retries 140 * @throws KernelException the <code>ke</code> exception if it passes along the 141 * exception without managing 142 * 143 */ 144 @Override 145 public void manageException(KernelException ke, int retry) throws KernelException { 146 if (mustRetry(ke)) { 147 if (retry < retries) { 148 return; 149 } 150 } 151 throw ke; 152 } 153 154 /** 155 * Notifies to the Connection instance that the target API has been reached. 156 */ 157 public void success() { 158 } 159 160 /** 161 * Checks if the request must be retried, depending on the error code. 162 * 163 * @param ke exception produced 164 * @return <code>true</code> if exception must be retried; <code>false</code> otherwise. 165 */ 166 private boolean mustRetry(KernelException ke) { 167 String code = ke.getCode(); 168 return RETRY_PATTERN.matcher(code).matches(); 169 } 170 }