001 /* 002 * Cumulus4j - Securing your data in the cloud - http://cumulus4j.org 003 * Copyright (C) 2011 NightLabs Consulting GmbH 004 * 005 * This program is free software: you can redistribute it and/or modify 006 * it under the terms of the GNU Affero General Public License as 007 * published by the Free Software Foundation, either version 3 of the 008 * License, or (at your option) any later version. 009 * 010 * This program is distributed in the hope that it will be useful, 011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 013 * GNU Affero General Public License for more details. 014 * 015 * You should have received a copy of the GNU Affero General Public License 016 * along with this program. If not, see <http://www.gnu.org/licenses/>. 017 */ 018 package org.cumulus4j.keymanager; 019 020 import java.net.MalformedURLException; 021 import java.net.URL; 022 import java.util.ArrayList; 023 import java.util.Collection; 024 import java.util.Collections; 025 import java.util.HashMap; 026 import java.util.Map; 027 028 import org.cumulus4j.keystore.KeyStore; 029 030 /** 031 * <p> 032 * Manager for {@link AppServer}s. 033 * </p> 034 * <p> 035 * This is the actual key-manager-entry-point, as for every {@link KeyStore}, there can be many <code>AppServer</code>s in use. 036 * An instance of <code>AppServerManager</code> is bound to an instance of KeyStore (i.e. they are in a 1-1-relationship). 037 * </p> 038 * <p> 039 * This is not API! Use the classes and interfaces provided by <code>org.cumulus4j.keymanager.api</code> instead. 040 * </p> 041 * 042 * @author Marco หงุ่ยตระกูล-Schulze - marco at nightlabs dot de 043 */ 044 public class AppServerManager 045 { 046 private KeyStore keyStore; 047 048 private Map<String, AppServer> appServerID2appServer = new HashMap<String, AppServer>(); 049 private Collection<AppServer> appServers = null; 050 051 public AppServerManager(KeyStore keyStore) 052 { 053 if (keyStore == null) 054 throw new IllegalArgumentException("keyStore == null"); 055 056 this.keyStore = keyStore; 057 } 058 059 public KeyStore getKeyStore() { 060 return keyStore; 061 } 062 063 public synchronized AppServer getAppServerForAppServerID(String appServerID) 064 { 065 if (appServerID == null) 066 throw new IllegalArgumentException("appServerID == null"); 067 068 return appServerID2appServer.get(appServerID); 069 } 070 071 public synchronized void putAppServer(AppServer appServer) 072 { 073 if (appServer == null) 074 throw new IllegalArgumentException("appServer == null"); 075 076 if (this != appServer.getAppServerManager()) 077 throw new IllegalArgumentException("appServer.appServerManager != this"); 078 079 if (appServer.getAppServerBaseURL() == null) 080 throw new IllegalArgumentException("appServer.appServerBaseURL == null"); 081 082 URL url; 083 try { 084 url = new URL(appServer.getAppServerBaseURL()); 085 } catch (MalformedURLException e) { 086 throw new IllegalArgumentException("appServer.appServerBaseURL is not a valid URL: " + e, e); 087 } 088 089 if (appServer.getAppServerID() == null) { 090 AppServer oldAppServer; 091 String id; 092 int index = -1; 093 do { 094 id = url.getHost(); 095 if (url.getPort() < 0) { 096 if (url.getDefaultPort() >= 0) 097 id += '-' + url.getDefaultPort(); 098 } 099 else 100 id += '-' + url.getPort(); 101 102 if (++index > 0) 103 id += '-' + index; 104 105 oldAppServer = this.getAppServerForAppServerID(id); 106 } while (oldAppServer != null && !appServer.getAppServerBaseURL().equals(oldAppServer.getAppServerBaseURL())); 107 108 appServer.setAppServerID(id); 109 } 110 111 appServerID2appServer.put(appServer.getAppServerID(), appServer); 112 appServers = null; 113 } 114 115 public synchronized Collection<AppServer> getAppServers() { 116 if (appServers == null) { 117 appServers = Collections.unmodifiableCollection(new ArrayList<AppServer>(appServerID2appServer.values())); 118 } 119 return appServers; 120 } 121 122 public synchronized void removeAppServer(String appServerID) { 123 appServerID2appServer.remove(appServerID); 124 } 125 }