001    /*
002     * CDDL HEADER START
003     *
004     * The contents of this file are subject to the terms of the
005     * Common Development and Distribution License, Version 1.0 only
006     * (the "License").  You may not use this file except in compliance
007     * with the License.
008     *
009     * You can obtain a copy of the license at
010     * trunk/opends/resource/legal-notices/OpenDS.LICENSE
011     * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
012     * See the License for the specific language governing permissions
013     * and limitations under the License.
014     *
015     * When distributing Covered Code, include this CDDL HEADER in each
016     * file and include the License file at
017     * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
018     * add the following below this CDDL HEADER, with the fields enclosed
019     * by brackets "[]" replaced with your own identifying information:
020     *      Portions Copyright [yyyy] [name of copyright owner]
021     *
022     * CDDL HEADER END
023     *
024     *
025     *      Copyright 2008 Sun Microsystems, Inc.
026     */
027    
028    package org.opends.server.admin;
029    
030    
031    
032    import java.io.BufferedInputStream;
033    import java.io.IOException;
034    import java.io.InputStream;
035    import java.util.HashMap;
036    import java.util.Map;
037    import java.util.MissingResourceException;
038    import java.util.Properties;
039    
040    
041    
042    /**
043     * A class for retrieving non-internationalized resource properties
044     * associated with a managed object definition.
045     * <p>
046     * Resource properties are not available for the {@link TopCfgDefn}.
047     */
048    public final class ManagedObjectDefinitionResource {
049    
050      // Mapping from definition to property tables.
051      private final Map<AbstractManagedObjectDefinition<?, ?>,
052          Properties> properties;
053    
054      // The resource name prefix.
055      private final String prefix;
056    
057    
058    
059      /**
060       * Creates a new resource instance for the named profile.
061       *
062       * @param profile
063       *          The name of the profile.
064       * @return Returns the resource instance for the named profile.
065       */
066      public static ManagedObjectDefinitionResource createForProfile(
067          String profile) {
068        return new ManagedObjectDefinitionResource("admin.profiles."
069            + profile);
070      }
071    
072    
073    
074      // Private constructor.
075      private ManagedObjectDefinitionResource(String prefix) {
076        this.properties =
077          new HashMap<AbstractManagedObjectDefinition<?, ?>, Properties>();
078        this.prefix = prefix;
079      }
080    
081    
082    
083      /**
084       * Get the resource value associated with the specified key.
085       *
086       * @param d
087       *          The managed object definition.
088       * @param key
089       *          The resource key.
090       * @return Returns the resource value associated with the specified
091       *         key.
092       * @throws MissingResourceException
093       *           If the key was not found.
094       * @throws UnsupportedOperationException
095       *           If the provided managed object definition was the
096       *           {@link TopCfgDefn}.
097       */
098      public String getString(AbstractManagedObjectDefinition<?, ?> d, String key)
099          throws MissingResourceException, UnsupportedOperationException {
100        if (d.isTop()) {
101          throw new UnsupportedOperationException(
102              "Profile resources are not available for the "
103                  + "Top configuration definition");
104        }
105    
106        Properties p = getProperties(d);
107        String result = p.getProperty(key);
108    
109        if (result == null) {
110          String baseName = prefix + "." + d.getClass().getName();
111          String path = baseName.replace('.', '/') + ".properties";
112    
113          throw new MissingResourceException("Can't find resource "
114              + path + ", key " + key, baseName, key);
115        }
116    
117        return result;
118      }
119    
120    
121    
122      // Retrieve the properties table associated with a managed object,
123      // lazily loading it if necessary.
124      private synchronized Properties getProperties(
125          AbstractManagedObjectDefinition<?, ?> d)
126          throws MissingResourceException {
127        Properties p = properties.get(d);
128    
129        if (p == null) {
130          // Load the resource file.
131          String baseName = prefix + "." + d.getClass().getName();
132          String path = baseName.replace('.', '/') + ".properties";
133          InputStream stream = ClassLoaderProvider.getInstance()
134              .getClassLoader().getResourceAsStream(path);
135    
136          if (stream == null) {
137            throw new MissingResourceException("Can't find resource "
138                + path, baseName, "");
139          }
140    
141          p = new Properties();
142          try {
143            p.load(new BufferedInputStream(stream));
144          } catch (IOException e) {
145            throw new MissingResourceException("Can't load resource "
146                + path + " due to IO exception: " + e.getMessage(),
147                baseName, "");
148          }
149    
150          // Cache the resource.
151          properties.put(d, p);
152        }
153    
154        return p;
155      }
156    }