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.dataconnectivity.explorer;
042:
043: import java.lang.reflect.InvocationTargetException;
044: import org.netbeans.modules.visualweb.dataconnectivity.project.datasource.ProjectDataSourceTracker;
045:
046: import java.util.ArrayList;
047: import java.util.Collections;
048: import java.util.List;
049:
050: import org.netbeans.api.project.Project;
051:
052: import org.openide.nodes.AbstractNode;
053: import org.openide.nodes.Children;
054: import org.openide.nodes.Node;
055: import org.netbeans.modules.visualweb.dataconnectivity.project.datasource.ProjectDataSourceListener;
056: import org.netbeans.modules.visualweb.dataconnectivity.project.datasource.ProjectDataSourceChangeEvent;
057: import java.awt.Image;
058: import java.beans.PropertyEditor;
059: import java.io.CharConversionException;
060: import java.util.logging.Logger;
061: import javax.naming.NamingException;
062: import org.netbeans.modules.visualweb.api.j2ee.common.RequestedJdbcResource;
063: import org.netbeans.modules.visualweb.dataconnectivity.datasource.BrokenDataSourceSupport;
064: import org.netbeans.modules.visualweb.dataconnectivity.model.ProjectDataSourceManager;
065: import org.openide.nodes.PropertySupport;
066: import org.openide.nodes.Sheet;
067: import org.openide.util.Exceptions;
068: import org.openide.util.NbBundle;
069: import org.openide.util.Utilities;
070: import org.openide.xml.XMLUtil;
071:
072: /**
073: * This class builds the visual representation of data sources (list) in the Project Navigator
074: * @author Winston Prakash
075: */
076: public class ProjectDataSourceNodeChildren extends Children.Keys
077: implements Node.Cookie, ProjectDataSourceListener {
078:
079: Project nbProject = null;
080: String url;
081:
082: private final String DYNAMIC_DATA_SOURCES = "dynamic_data_sources"; // NOI18N
083: private final String HARD_CODED_DATA_SOURCES = "hard_coded_data_sources"; // NOI18N
084:
085: public ProjectDataSourceNodeChildren(Project project) {
086: nbProject = project;
087: }
088:
089: protected void addNotify() {
090: super .addNotify();
091: updateKeys();
092: ProjectDataSourceTracker.addListener(nbProject, this );
093: }
094:
095: protected void removeNotify() {
096: ProjectDataSourceTracker.removeListener(nbProject, this );
097:
098: setKeys(Collections.EMPTY_SET);
099: super .removeNotify();
100: }
101:
102: private void updateKeys() {
103: List dataSourceTypes = new ArrayList();
104:
105: dataSourceTypes.add(DYNAMIC_DATA_SOURCES);
106: refreshKey(DYNAMIC_DATA_SOURCES);
107: dataSourceTypes.add(HARD_CODED_DATA_SOURCES);
108: refreshKey(HARD_CODED_DATA_SOURCES);
109:
110: if (!dataSourceTypes.isEmpty()) {
111: setKeys(dataSourceTypes);
112: } else {
113: setKeys(Collections.EMPTY_SET);
114: }
115: }
116:
117: protected Node[] createNodes(Object key) {
118: String type = (String) key;
119: Node[] nodeArray = null;
120: if (type.equals(DYNAMIC_DATA_SOURCES)) {
121:
122: String[] dynamicDataSources = ProjectDataSourceTracker
123: .getDynamicDataSources(nbProject);
124:
125: if (dynamicDataSources != null
126: && dynamicDataSources.length > 0) {
127: nodeArray = new Node[dynamicDataSources.length];
128: for (int i = 0; i < dynamicDataSources.length; i++) {
129: nodeArray[i] = createDatasourceNode(dynamicDataSources[i]);
130: }
131: }
132: } else if (type.equals(HARD_CODED_DATA_SOURCES)) {
133:
134: String[] hardCodedDataSources = ProjectDataSourceTracker
135: .getHardcodedDataSources(nbProject);
136:
137: if (hardCodedDataSources != null
138: && hardCodedDataSources.length > 0) {
139: nodeArray = new Node[hardCodedDataSources.length];
140: for (int i = 0; i < hardCodedDataSources.length; i++) {
141: nodeArray[i] = createDatasourceNode(hardCodedDataSources[i]);
142: }
143: }
144: }
145: return nodeArray;
146: }
147:
148: private Node createDatasourceNode(String datasourceName) {
149: AbstractNode node = new AbstractNode(Children.LEAF) {
150: final Image icon = Utilities
151: .loadImage("org/netbeans/modules/visualweb/dataconnectivity/resources/datasource_container.png"); // NOI18N
152: final Image disconnectedIcon = Utilities
153: .loadImage("org/netbeans/modules/visualweb/dataconnectivity/resources/disconnected.png"); // NOI18N
154: Image brokenBadgedImage = Utilities.mergeImages(icon,
155: disconnectedIcon, 8, 0);
156: Image datasourceImage = Utilities
157: .loadImage("org/netbeans/modules/visualweb/dataconnectivity/resources/datasource.png"); // NOI18N
158: String dispName;
159:
160: public Image getIcon(int type) {
161:
162: dispName = super .getDisplayName();
163: try {
164: if (BrokenDataSourceSupport.isBroken(nbProject)) {
165: dispName = "<font color=\"#A40000\">"
166: + dispName + "</font>"; //NOI18N;
167: } else {
168: dispName = XMLUtil.toElementContent(dispName);
169: }
170: } catch (CharConversionException ex) {
171: // ignore
172: }
173:
174: if (BrokenDataSourceSupport.isBroken(nbProject)) {
175: return brokenBadgedImage;
176: } else {
177: return datasourceImage;
178: }
179: }
180:
181: public Image getOpenedIcon(int type) {
182: return getIcon(type);
183: }
184:
185: protected Sheet createSheet() {
186: Sheet result = super .createSheet();
187: Sheet.Set set = result.createPropertiesSet();
188: set.put(new DataSourceURLProperty());
189: result.put(set);
190: return result;
191: }
192:
193: final class DataSourceURLProperty extends
194: PropertySupport.ReadOnly {
195: private String url;
196:
197: DataSourceURLProperty() {
198: super ("URL", DataSourceURLProperty.class, NbBundle
199: .getMessage(DataSourceURLProperty.class,
200: "LBL_URL"), NbBundle.getMessage(
201: DataSourceURLProperty.class, "DESC_URL")
202: + ", " + dispName);
203: try {
204: url = (String) getValue();
205: } catch (IllegalAccessException ex) {
206: Exceptions.printStackTrace(ex);
207: } catch (InvocationTargetException ex) {
208: Exceptions.printStackTrace(ex);
209: }
210: }
211:
212: public Object getValue() throws IllegalAccessException,
213: InvocationTargetException {
214: ProjectDataSourceManager projectDataSourceManager = new ProjectDataSourceManager(
215: nbProject);
216: RequestedJdbcResource jdbcResource = projectDataSourceManager
217: .getDataSourceWithName(dispName);
218: if (jdbcResource != null) {
219: return jdbcResource.getUrl();
220: } else {
221: return "";
222: }
223: }
224:
225: public PropertyEditor getPropertyEditor() {
226: return new DataSourcePropertyEditor(url);
227: }
228: }
229: };
230:
231: String hoser = "java:comp/env/jdbc/";
232: int pos = datasourceName.indexOf(hoser);
233: String dsName = datasourceName.substring(hoser.length());
234: node.setName(datasourceName);
235: node.setDisplayName(dsName);
236: node.setShortDescription(dsName);
237:
238: Image icon = Utilities
239: .loadImage("org/netbeans/modules/visualweb/dataconnectivity/resources/datasource.png"); // NOI18N
240: node
241: .setIconBaseWithExtension("org/netbeans/modules/visualweb/dataconnectivity/resources/datasource.png"); //NOI18N
242:
243: new ProjectDataSourceNode(nbProject);
244:
245: return node;
246: }
247:
248: public void dataSourceChange(ProjectDataSourceChangeEvent evt) {
249: updateKeys();
250: }
251:
252: }
|