1. /*
  2. * @(#)RepositoryImpl.java 1.31 03/01/23
  3. *
  4. * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
  5. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
  6. */
  7. /*
  8. * @(#)RepositoryImpl.java 1.1 97/10/17
  9. *
  10. * Copyright 1993-1997 Sun Microsystems, Inc. 901 San Antonio Road,
  11. * Palo Alto, California, 94303, U.S.A. All Rights Reserved.
  12. *
  13. * This software is the confidential and proprietary information of Sun
  14. * Microsystems, Inc. ("Confidential Information"). You shall not
  15. * disclose such Confidential Information and shall use it only in
  16. * accordance with the terms of the license agreement you entered into
  17. * with Sun.
  18. *
  19. * CopyrightVersion 1.2
  20. *
  21. */
  22. package com.sun.corba.se.internal.Activation;
  23. import java.io.File;
  24. import java.io.FileInputStream;
  25. import java.io.FileOutputStream;
  26. import java.io.ObjectInputStream;
  27. import java.io.ObjectOutputStream;
  28. import java.io.Serializable;
  29. import java.util.Properties;
  30. import java.util.Hashtable;
  31. import java.util.Enumeration;
  32. import java.util.Vector;
  33. import org.omg.CORBA.ORB;
  34. import org.omg.CORBA.INITIALIZE;
  35. import org.omg.CORBA.INTERNAL;
  36. import org.omg.CORBA.CompletionStatus;
  37. import com.sun.corba.se.internal.POA.POAORB;
  38. import com.sun.corba.se.internal.orbutil.ORBConstants;
  39. import com.sun.corba.se.ActivationIDL.RepositoryPackage.ServerDef;
  40. import com.sun.corba.se.ActivationIDL._RepositoryImplBase;
  41. import com.sun.corba.se.ActivationIDL.ServerAlreadyRegistered;
  42. import com.sun.corba.se.ActivationIDL.ServerAlreadyInstalled;
  43. import com.sun.corba.se.ActivationIDL.ServerAlreadyUninstalled;
  44. import com.sun.corba.se.ActivationIDL.ServerNotRegistered;
  45. import com.sun.corba.se.ActivationIDL.BadServerDefinition;
  46. /**
  47. *
  48. * @version 1.1, 97/10/17
  49. * @author Rohit Garg
  50. * @since JDK1.2
  51. */
  52. public class RepositoryImpl extends _RepositoryImplBase
  53. implements Serializable
  54. {
  55. // added serialver computed by the tool
  56. private static final long serialVersionUID = 8458417785209341858L;
  57. RepositoryImpl(POAORB orb, File dbDir, boolean debug)
  58. {
  59. this.debug = debug ;
  60. // if databse does not exist, create it otherwise read it in
  61. File dbFile = new File(dbDir, "servers.db");
  62. if (!dbFile.exists()) {
  63. db = new RepositoryDB(dbFile);
  64. db.flush();
  65. } else {
  66. try {
  67. FileInputStream fis = new FileInputStream(dbFile);
  68. ObjectInputStream ois = new ObjectInputStream(fis);
  69. db = (RepositoryDB) ois.readObject();
  70. ois.close();
  71. } catch (Exception e) {
  72. System.err.println(e.toString());
  73. System.err.println("Unable to read IMR Database!");
  74. throw new INITIALIZE(MinorCodes.CANNOT_READ_REPOSITORY_DB,
  75. CompletionStatus.COMPLETED_NO);
  76. }
  77. }
  78. // export the repository
  79. this.orb = orb;
  80. ((com.sun.corba.se.internal.corba.ORB)orb).connect(this);
  81. }
  82. private String printServerDef( ServerDef sd )
  83. {
  84. return "ServerDef[applicationName=" + sd.applicationName +
  85. " serverName=" + sd.serverName +
  86. " serverClassPath=" + sd.serverClassPath +
  87. " serverArgs=" + sd. serverArgs +
  88. " serverVmArgs=" + sd.serverVmArgs +
  89. "]" ;
  90. }
  91. public int registerServer(ServerDef serverDef, int theServerId)
  92. throws ServerAlreadyRegistered
  93. {
  94. int serverId;
  95. DBServerDef server = null;
  96. synchronized (db) {
  97. // check if server already registered
  98. Enumeration enum = db.serverTable.elements();
  99. while (enum.hasMoreElements()) {
  100. server = (DBServerDef) enum.nextElement();
  101. if (serverDef.applicationName.equals(server.applicationName)) {
  102. if (debug)
  103. System.out.println(
  104. "RepositoryImpl: registerServer called " +
  105. "to register ServerDef " +
  106. printServerDef( serverDef ) +
  107. " with " + ((theServerId==illegalServerId) ?
  108. "a new server Id" : ("server Id " + theServerId)) +
  109. " FAILED because it is already registered." ) ;
  110. throw (new ServerAlreadyRegistered(server.id));
  111. }
  112. }
  113. // generate a new server id
  114. if (theServerId == illegalServerId)
  115. serverId = db.incrementServerIdCounter();
  116. else
  117. serverId = theServerId;
  118. // add server def to the database
  119. server = new DBServerDef(serverDef, serverId);
  120. db.serverTable.put(new Integer(serverId), server);
  121. db.flush();
  122. if (debug)
  123. if (theServerId==illegalServerId)
  124. System.out.println( "RepositoryImpl: registerServer called " +
  125. "to register ServerDef " + printServerDef( serverDef ) +
  126. " with new serverId " + serverId ) ;
  127. else
  128. System.out.println( "RepositoryImpl: registerServer called " +
  129. "to register ServerDef " + printServerDef( serverDef ) +
  130. " with assigned serverId " + serverId ) ;
  131. return serverId;
  132. }
  133. }
  134. public int registerServer(ServerDef serverDef)
  135. throws ServerAlreadyRegistered, BadServerDefinition
  136. {
  137. // verify that the entry is valid
  138. int initSvcPort = orb.getServerGIOP().getBootstrapEndpoint(0).getPort();
  139. ServerTableEntry entry = new ServerTableEntry(
  140. illegalServerId, serverDef, (int) initSvcPort, "", true, debug );
  141. switch (entry.verify()) {
  142. case ServerMain.OK:
  143. break;
  144. case ServerMain.MAIN_CLASS_NOT_FOUND:
  145. throw new BadServerDefinition("main class not found.");
  146. case ServerMain.NO_MAIN_METHOD:
  147. throw new BadServerDefinition("no main method found.");
  148. case ServerMain.APPLICATION_ERROR:
  149. throw new BadServerDefinition("server application error.");
  150. default:
  151. throw new BadServerDefinition("unknown Exception.");
  152. }
  153. return registerServer(serverDef, illegalServerId);
  154. }
  155. public void unregisterServer(int serverId) throws ServerNotRegistered {
  156. DBServerDef server = null;
  157. Integer id = new Integer(serverId);
  158. synchronized (db) {
  159. // check to see if the server is registered
  160. server = (DBServerDef) db.serverTable.get(id);
  161. if (server == null) {
  162. if (debug)
  163. System.out.println(
  164. "RepositoryImpl: unregisterServer for serverId " +
  165. serverId + " called: server not registered" ) ;
  166. throw (new ServerNotRegistered());
  167. }
  168. // remove server from the database
  169. db.serverTable.remove(id);
  170. db.flush();
  171. }
  172. if (debug)
  173. System.out.println(
  174. "RepositoryImpl: unregisterServer for serverId " + serverId +
  175. " called" ) ;
  176. }
  177. private DBServerDef getDBServerDef(int serverId) throws ServerNotRegistered
  178. {
  179. Integer id = new Integer(serverId);
  180. DBServerDef server = (DBServerDef) db.serverTable.get(id);
  181. if (server == null)
  182. throw new ServerNotRegistered( serverId );
  183. return server ;
  184. }
  185. public ServerDef getServer(int serverId) throws ServerNotRegistered
  186. {
  187. DBServerDef server = getDBServerDef( serverId ) ;
  188. ServerDef serverDef = new ServerDef(server.applicationName, server.name,
  189. server.classPath, server.args, server.vmArgs);
  190. if (debug)
  191. System.out.println(
  192. "RepositoryImpl: getServer for serverId " + serverId +
  193. " returns " + printServerDef( serverDef ) ) ;
  194. return serverDef;
  195. }
  196. public boolean isInstalled(int serverId) throws ServerNotRegistered {
  197. DBServerDef server = getDBServerDef( serverId ) ;
  198. return server.isInstalled ;
  199. }
  200. public void install( int serverId )
  201. throws ServerNotRegistered, ServerAlreadyInstalled
  202. {
  203. DBServerDef server = getDBServerDef( serverId ) ;
  204. if (server.isInstalled)
  205. throw new ServerAlreadyInstalled( serverId ) ;
  206. else {
  207. server.isInstalled = true ;
  208. db.flush() ;
  209. }
  210. }
  211. public void uninstall( int serverId )
  212. throws ServerNotRegistered, ServerAlreadyUninstalled
  213. {
  214. DBServerDef server = getDBServerDef( serverId ) ;
  215. if (!server.isInstalled)
  216. throw new ServerAlreadyUninstalled( serverId ) ;
  217. else {
  218. server.isInstalled = false ;
  219. db.flush() ;
  220. }
  221. }
  222. public int[] listRegisteredServers() {
  223. synchronized (db) {
  224. int i=0;
  225. int servers[] = new int[db.serverTable.size()];
  226. Enumeration enum = db.serverTable.elements();
  227. while (enum.hasMoreElements()) {
  228. DBServerDef server = (DBServerDef) enum.nextElement();
  229. servers[i++] = server.id;
  230. }
  231. if (debug) {
  232. StringBuffer sb = new StringBuffer() ;
  233. for (int ctr=0; ctr<servers.length; ctr++) {
  234. sb.append( ' ' ) ;
  235. sb.append( servers[ctr] ) ;
  236. }
  237. System.out.println(
  238. "RepositoryImpl: listRegisteredServers returns" +
  239. sb.toString() ) ;
  240. }
  241. return servers;
  242. }
  243. }
  244. public int getServerID(String applicationName) throws ServerNotRegistered {
  245. synchronized (db) {
  246. int result = -1 ;
  247. for (Enumeration serverIds = db.serverTable.keys();
  248. serverIds.hasMoreElements();)
  249. {
  250. Integer nextServerId = (Integer) serverIds.nextElement();
  251. DBServerDef dbServerDef =
  252. (DBServerDef) db.serverTable.get(nextServerId);
  253. if (dbServerDef.applicationName.equals(applicationName)) {
  254. result = nextServerId.intValue();
  255. break ;
  256. }
  257. }
  258. if (debug)
  259. System.out.println("RepositoryImpl: getServerID for " +
  260. applicationName + " is " + result ) ;
  261. if (result == -1) {
  262. throw (new ServerNotRegistered());
  263. } else {
  264. return result ;
  265. }
  266. }
  267. }
  268. public String[] getApplicationNames() {
  269. synchronized (db) {
  270. Vector v = new Vector();
  271. for (Enumeration serverIds = db.serverTable.keys();
  272. serverIds.hasMoreElements();)
  273. {
  274. Integer nextServerId = (Integer) serverIds.nextElement();
  275. DBServerDef dbServerDef = (DBServerDef)db.serverTable.get(
  276. nextServerId);
  277. if (!dbServerDef.applicationName.equals(""))
  278. v.addElement( dbServerDef.applicationName ) ;
  279. }
  280. String[] apps = new String[v.size()];
  281. for (int i = 0; i < v.size(); i++) {
  282. apps[i] = (String)v.elementAt(i);
  283. }
  284. if (debug) {
  285. StringBuffer sb = new StringBuffer() ;
  286. for (int ctr=0; ctr<apps.length; ctr++) {
  287. sb.append( ' ' ) ;
  288. sb.append( apps[ctr] ) ;
  289. }
  290. System.out.println( "RepositoryImpl: getApplicationNames returns " +
  291. sb.toString() ) ;
  292. }
  293. return apps;
  294. }
  295. }
  296. /**
  297. * Typically the Repositoy is created within the ORBd VM but it can
  298. * be independently started as well.
  299. */
  300. public static void main(String args[]) {
  301. boolean debug = false ;
  302. for (int ctr=0; ctr<args.length; ctr++)
  303. if (args[ctr].equals("-debug"))
  304. debug = true ;
  305. try {
  306. // See Bug 4396928 for more information about why we are
  307. // initializing the ORBClass to PIORB.
  308. Properties props = new Properties();
  309. props.put("org.omg.CORBA.ORBClass",
  310. "com.sun.corba.se.internal.Interceptors.PIORB");
  311. POAORB orb = (POAORB) ORB.init(args, props);
  312. // create the repository object
  313. String db = System.getProperty( ORBConstants.DB_PROPERTY,
  314. ORBConstants.DEFAULT_DB_NAME );
  315. RepositoryImpl repository = new RepositoryImpl(orb, new File(db),
  316. debug);
  317. // wait for shutdown
  318. orb.run();
  319. } catch (Exception ex) {
  320. ex.printStackTrace();
  321. }
  322. }
  323. transient private boolean debug = false;
  324. final static int illegalServerId = -1;
  325. transient private RepositoryDB db = null;
  326. transient POAORB orb = null;
  327. class RepositoryDB implements Serializable
  328. {
  329. File db;
  330. Hashtable serverTable;
  331. Integer serverIdCounter;
  332. RepositoryDB(File dbFile) {
  333. db = dbFile;
  334. // initialize the Server Id counter and hashtable.
  335. // the lower id range is reserved for system servers
  336. serverTable = new Hashtable(255);
  337. serverIdCounter = new Integer(256);
  338. }
  339. int incrementServerIdCounter()
  340. {
  341. int value = serverIdCounter.intValue();
  342. serverIdCounter = new Integer(++value);
  343. return value;
  344. }
  345. void flush()
  346. {
  347. try {
  348. db.delete();
  349. FileOutputStream fos = new FileOutputStream(db);
  350. ObjectOutputStream oos = new ObjectOutputStream(fos);
  351. oos.writeObject(this);
  352. oos.flush();
  353. oos.close();
  354. } catch (Exception ex) {
  355. System.err.println(ex.toString());
  356. System.err.println("Unable to write IMR Database!");
  357. throw new INTERNAL(MinorCodes.CANNOT_WRITE_REPOSITORY_DB,
  358. CompletionStatus.COMPLETED_NO);
  359. }
  360. }
  361. }
  362. class DBServerDef implements Serializable
  363. {
  364. public String toString() {
  365. return "DBServerDef(applicationName=" + applicationName +
  366. ", name=" + name +
  367. ", classPath=" + classPath +
  368. ", args=" + args +
  369. ", vmArgs=" + vmArgs +
  370. ", id=" + id +
  371. ", isInstalled=" + isInstalled + ")" ;
  372. }
  373. DBServerDef(ServerDef server, int server_id) {
  374. applicationName = server.applicationName ;
  375. name = server.serverName;
  376. classPath = server.serverClassPath;
  377. args = server.serverArgs;
  378. vmArgs = server.serverVmArgs;
  379. id = server_id;
  380. isInstalled = false ;
  381. }
  382. String applicationName;
  383. String name;
  384. String classPath;
  385. String args;
  386. String vmArgs;
  387. boolean isInstalled ;
  388. int id;
  389. }
  390. }