001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041: package org.netbeans.modules.visualweb.faces.dt.data;
042:
043: import java.beans.PropertyEditorSupport;
044: import java.util.ArrayList;
045: import javax.naming.Binding;
046: import javax.naming.Context;
047: import javax.naming.InitialContext;
048: import javax.naming.NamingEnumeration;
049: import javax.naming.NamingException;
050: import javax.sql.DataSource;
051:
052: public class DataSourceNamePropertyEditor extends PropertyEditorSupport {
053:
054: private static final String DS_SUBCTX = "java:comp/env/jdbc"; // NOI18N
055:
056: public String[] getTags() {
057: try {
058: Context ctx = new InitialContext();
059: ArrayList dsNameList = getDataSources(ctx, DS_SUBCTX, "");
060: return (String[]) dsNameList.toArray(new String[dsNameList
061: .size()]);
062: } catch (NamingException e) {
063: return null;
064: }
065: }
066:
067: public ArrayList getDataSources(Context curCtx, String startName,
068: String dsNamePrefix) throws NamingException {
069: String nodeName = null;
070: ArrayList retVal = new ArrayList();
071:
072: NamingEnumeration list = curCtx.listBindings(startName);
073: while (list.hasMore()) {
074: Binding binding = (Binding) list.next();
075: String name = binding.getName();
076: if (binding.isRelative()) {
077: // append the name to the startimg name.
078: name = startName + "/" + name; // NOI18N
079: }
080: nodeName = name.substring(name.lastIndexOf("/") + 1);
081: if (binding.getObject() instanceof DataSource) {
082:
083: String dsNodeName = ("".equals(dsNamePrefix) ? ""
084: : dsNamePrefix + "/")
085: + nodeName;
086: retVal.add(dsNodeName);
087:
088: } else if (binding.getObject() instanceof Context) {
089: // It's a subcontext, so search that.
090: retVal.addAll(getDataSources((Context) binding
091: .getObject(), "", dsNamePrefix
092: + ("".equals(dsNamePrefix) ? "" : "/")
093: + nodeName));
094: }
095: }
096: list.close();
097: return retVal;
098: }
099:
100: public void setAsText(String text) {
101: /* setAsText should hand me the tag. That is, if the user selects the tag
102: * "Travel" from the dropdown, netbeans should hand me "Travel" as the arg
103: * to setAsText. For the most part, netbeans does this; but, if "Travel"
104: * is already selected in the drop down and I select it again (i.e., I'm not
105: * looking to change anything, netbeans hands me "java:comp/env/jdbcTravel"
106: * as the argument to setAsText. As a workaround, check for and strip
107: * the DS_SUBCTX
108: */
109: setValue(DS_SUBCTX + "/" + stripSubContext(text)); //NOI18N
110: }
111:
112: public String getAsText() {
113: return stripSubContext((String) getValue());
114: }
115:
116: public String getJavaInitializationString() {
117: return getAsText().equals("null") ? "null" : //NOI18N
118: "\"" + DS_SUBCTX + "/" + getAsText() + "\""; //NOI18N
119: }
120:
121: private String stripSubContext(String name) {
122: return name == null ? name : name.replaceFirst(DS_SUBCTX + "/",
123: ""); //NOI18N
124: }
125: }
|