View Javadoc
1   /*
2    * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
3    * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4    *
5    * This code is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU General Public License version 2 only, as
7    * published by the Free Software Foundation.  Oracle designates this
8    * particular file as subject to the "Classpath" exception as provided
9    * by Oracle in the LICENSE file that accompanied this code.
10   *
11   * This code is distributed in the hope that it will be useful, but WITHOUT
12   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14   * version 2 for more details (a copy is included in the LICENSE file that
15   * accompanied this code).
16   *
17   * You should have received a copy of the GNU General Public License version
18   * 2 along with this work; if not, write to the Free Software Foundation,
19   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20   *
21   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22   * or visit www.oracle.com if you need additional information or have any
23   * questions.
24   */
25  package sun.management.snmp.jvminstr;
26  
27  import java.net.InetAddress;
28  import java.net.UnknownHostException;
29  
30  /**
31   * Notification Target data.
32   */
33  public class NotificationTargetImpl implements NotificationTarget {
34      private InetAddress address;
35      private int port;
36      private String community;
37  
38      /**
39       * Target parameter is a <CODE>java.lang.String</CODE>
40       * target synctax is <host>:<port>:community. Eg: "localhost:163:private".
41       * <p>The <code><em>host</em></code> is a host name, an IPv4 numeric
42       * host address, or an IPv6 numeric address enclosed in square
43       * brackets.</p>
44       * @throws IllegalArgumentException In case the target is malformed
45       */
46      public NotificationTargetImpl(String target)
47          throws IllegalArgumentException, UnknownHostException  {
48          parseTarget(target);
49      }
50  
51      public NotificationTargetImpl(String address, int port,
52                                    String community)
53          throws UnknownHostException {
54          this(InetAddress.getByName(address),port,community);
55      }
56  
57      public NotificationTargetImpl(InetAddress address, int port,
58                                    String community) {
59          this.address = address;
60          this.port = port;
61          this.community = community;
62      }
63  
64      private void parseTarget(String target)
65          throws IllegalArgumentException, UnknownHostException {
66  
67          if(target == null ||
68             target.length() == 0) throw new
69                 IllegalArgumentException("Invalid target [" + target + "]");
70  
71          String addrStr;
72          if (target.startsWith("[")) {
73              final int index = target.indexOf("]");
74              final int index2 = target.lastIndexOf(":");
75              if(index == -1)
76                  throw new IllegalArgumentException("Host starts with [ but " +
77                                                     "does not end with ]");
78              addrStr = target.substring(1, index);
79              port = Integer.parseInt(target.substring(index + 2,
80                                                       index2));
81              if (!isNumericIPv6Address(addrStr)) {
82              throw new IllegalArgumentException("Address inside [...] must " +
83                                                 "be numeric IPv6 address");
84              }
85              if (addrStr.startsWith("["))
86                  throw new IllegalArgumentException("More than one [[...]]");
87          } else {
88              final int index = target.indexOf(":");
89              final int index2 = target.lastIndexOf(":");
90              if(index == -1) throw new
91                  IllegalArgumentException("Missing port separator \":\"");
92              addrStr = target.substring(0, index);
93  
94              port = Integer.parseInt(target.substring(index + 1,
95                                                       index2));
96          }
97  
98          address = InetAddress.getByName(addrStr);
99  
100         //THE CHECK SHOULD BE STRONGER!!!
101         final int index = target.lastIndexOf(":");
102 
103         community = target.substring(index + 1, target.length());
104 
105     }
106 
107     /* True if this string, assumed to be a valid argument to
108      * InetAddress.getByName, is a numeric IPv6 address.
109      */
110     private static boolean isNumericIPv6Address(String s) {
111         // address contains colon iff it's a numeric IPv6 address
112         return (s.indexOf(':') >= 0);
113     }
114 
115     public String getCommunity() {
116         return community;
117     }
118 
119     public InetAddress getAddress() {
120         return address;
121     }
122 
123     public int getPort() {
124         return port;
125     }
126 
127     public String toString() {
128         return "address : " + address + " port : " + port +
129             " community : " + community;
130     }
131 }