1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License, Version 1.0 only
   6  * (the "License").  You may not use this file except in compliance
   7  * with the License.
   8  *
   9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10  * or http://www.opensolaris.org/os/licensing.
  11  * See the License for the specific language governing permissions
  12  * and limitations under the License.
  13  *
  14  * When distributing Covered Code, include this CDDL HEADER in each
  15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16  * If applicable, add the following below this CDDL HEADER, with the
  17  * fields enclosed by brackets "[]" replaced with your own identifying
  18  * information: Portions Copyright [yyyy] [name of copyright owner]
  19  *
  20  * CDDL HEADER END
  21  */
  22 /*
  23  * ident        "%Z%%M% %I%     %E% SMI"
  24  *
  25  * Copyright (c) 1998-2001 by Sun Microsystems, Inc.
  26  * All rights reserved.
  27  */
  28 package com.sun.dhcpmgr.client;
  29 
  30 import java.util.Arrays;
  31 import java.net.InetAddress;
  32 import java.net.UnknownHostException;
  33 import java.text.MessageFormat;
  34 
  35 import javax.swing.*;
  36 
  37 import com.sun.dhcpmgr.bridge.*;
  38 import com.sun.dhcpmgr.data.*;
  39 import com.sun.dhcpmgr.server.*;
  40 
  41 /**
  42  * DataManager implements a central point of contact between the client and the
  43  * server components; the client obtains all server object references through
  44  * this class which allows us to cache information as much as possible, 
  45  * improving users' perception of the performance of the tool.
  46  */
  47 public class DataManager {
  48     private DhcpMgr server;
  49     private DhcpNetMgr netMgr;
  50     private DhcptabMgr dhcptabMgr;
  51     private DhcpServiceMgr dhcpServiceMgr;
  52     private Network [] networks;
  53     private DhcpClientRecord [] clients;
  54     private String clientNet;
  55     private Macro [] macros;
  56     private Option [] options;
  57     private String serverName;
  58     private String shortServerName;
  59     private InetAddress serverAddress;
  60     private static DataManager mgr = null;
  61     
  62     private DataManager() {
  63         reset();
  64     }
  65     
  66     public synchronized void reset() {
  67         // Clear the data references; used by the applet to re-initialize
  68         server = new DhcpMgrImpl();
  69         netMgr = null;
  70         dhcptabMgr = null;
  71         dhcpServiceMgr = null;
  72         /*
  73          * The arrays aren't nulled so that we can use them as the lock objects
  74          * in the synchronized blocks below
  75          */
  76         networks = new Network[0];
  77         clients = new DhcpClientRecord[0];
  78         clientNet = null;
  79         macros = new Macro[0];
  80         options = new Option[0];
  81         try {
  82             serverAddress = InetAddress.getLocalHost();
  83             setServerName(serverAddress.getHostName());
  84         } catch (UnknownHostException e) {
  85             serverName = shortServerName = "";
  86         }
  87 
  88         try {
  89             StandardOptions.setAllOptions(
  90                 getDhcpServiceMgr().getInittabOptions(
  91                     Option.ctxts[Option.STANDARD].getCode()));
  92         } catch (Throwable e) {
  93             MessageFormat form = new MessageFormat(
  94                     ResourceStrings.getString("stdopts_init_error"));
  95             Object [] args = new Object[1];
  96             if (e instanceof BridgeException) {
  97                 args[0] = e.getMessage();
  98             } else {
  99                 args[0] = e.toString();
 100             }
 101             JOptionPane.showMessageDialog(null,
 102                 form.format(args),
 103                 ResourceStrings.getString("init_error"),
 104                 JOptionPane.ERROR_MESSAGE);
 105         }
 106     }
 107     
 108     private void setServerName(String name) {
 109         serverName = name;
 110         int i = serverName.indexOf('.');
 111         if (i == -1) {
 112             shortServerName = serverName;
 113         } else {
 114             shortServerName = serverName.substring(0, i);
 115         }
 116     }
 117 
 118     /*
 119      * Threading note: the following methods are all synchronized on the
 120      * class so that server references and names are always set & retrieved
 121      * in a consistent state.
 122      */
 123     public synchronized static DataManager get() {
 124         if (mgr == null) {
 125             mgr = new DataManager();
 126         }
 127         return mgr;
 128     }
 129     
 130     public synchronized void setServer(String name) throws Exception {
 131         setServerName(name);
 132         serverAddress = null;
 133     }
 134     
 135     public synchronized DhcpMgr getServer() {
 136         return server;
 137     }
 138     
 139     public synchronized String getServerName() {
 140         return serverName;
 141     }
 142     
 143     public synchronized String getShortServerName() {
 144         return shortServerName;
 145     }
 146 
 147     public synchronized InetAddress getServerAddress() {
 148         return serverAddress;
 149     }
 150 
 151     public synchronized DhcpNetMgr getDhcpNetMgr() {
 152         if (netMgr == null) {
 153             netMgr = getServer().getNetMgr();
 154         }
 155         return netMgr;
 156     }
 157     
 158     public synchronized DhcptabMgr getDhcptabMgr() {
 159         if (dhcptabMgr == null) {
 160             dhcptabMgr = getServer().getDhcptabMgr();
 161         }
 162         return dhcptabMgr;
 163     }
 164     
 165     public synchronized DhcpServiceMgr getDhcpServiceMgr() {
 166         if (dhcpServiceMgr == null) {
 167             dhcpServiceMgr = getServer().getDhcpServiceMgr();
 168         }
 169         return dhcpServiceMgr;
 170     }
 171     
 172     /*
 173      * End of class-synchronized methods.  Remaining methods are synchronized
 174      * at a data item level.
 175      */
 176 
 177     public Network [] getNetworks(boolean forceUpdate) throws BridgeException {
 178         synchronized (networks) {
 179             if (forceUpdate || networks.length == 0) {
 180                 networks = getDhcpNetMgr().getNetworks();
 181                 if (networks == null) {
 182                     networks = new Network[0];
 183                 } else {
 184                     Arrays.sort(networks);
 185                 }
 186             }
 187         }
 188         return networks;
 189     }
 190     
 191     public DhcpClientRecord [] getClients(String net, boolean forceUpdate)
 192             throws BridgeException {
 193         synchronized (clients) {
 194             if (forceUpdate || clients.length == 0 || !net.equals(clientNet)) {
 195                 clients = getDhcpNetMgr().loadNetwork(net);
 196                 if (clients == null) {
 197                     clients = new DhcpClientRecord[0];
 198                 }
 199                 clientNet = net;
 200             }
 201         }
 202         return clients;
 203     }
 204     
 205     public Macro [] getMacros(boolean forceUpdate) throws BridgeException {
 206         synchronized (macros) {
 207             if (forceUpdate || macros.length == 0) {
 208                 macros = getDhcptabMgr().getMacros();
 209                 if (macros == null) {
 210                     macros = new Macro[0];
 211                 }
 212             }
 213         }
 214         return macros;
 215     }
 216     
 217     public Option [] getOptions(boolean forceUpdate) throws BridgeException {
 218         synchronized (options) {
 219             if (forceUpdate || options.length == 0) {
 220                 options = getDhcptabMgr().getOptions();
 221                 if (options == null) {
 222                     options = new Option[0];
 223                 }
 224                 /*
 225                  * Reload the site/vendor options portion of the global options
 226                  * table with the data we just loaded so that macro validation
 227                  * can be handled properly.
 228                  */
 229                 OptionsTable.getTable().add(options); 
 230             }
 231         }
 232         return options;
 233     }
 234 }