Avatar billede cayman Nybegynder
05. december 2005 - 14:09 Der er 11 kommentarer

InitialContext og datasources

Hey,

Roder lidt med en Tomcat der ik gider levere datasources.
Jeg ved at med InitialContext kan slå specifikke navngivne datasources op, men hvordan lister jeg alt hvad der er i JNDI.
Eller hvordan lister jeg alle java.sql.DataSource's
Avatar billede arne_v Ekspert
05. december 2005 - 14:26 #1
der er en list metode i Context
Avatar billede cayman Nybegynder
05. december 2005 - 15:30 #2
new InitialContext().getEnvironment() ?
Avatar billede arne_v Ekspert
05. december 2005 - 15:46 #3
nej

Context ctx = new InitialContext();
NamingEnumeration nodes = ctx.list("nodesomharaltdetdulederefter");
Avatar billede cayman Nybegynder
06. december 2005 - 09:01 #4
Men Arne, Hvordan ved jeg hvad jeg skal skrive i strengen. Normalt vil man vel lave en lookup på sit datasourcenavn. Men hvad hvis man bare vil have listet sine datasources? Hvilken node skal jeg så skrive i strengen.
Avatar billede arne_v Ekspert
06. december 2005 - 15:38 #5
JNDI er en træ struktur

hvis du vil finde alle JDBC data sources så skal du angive stien
til den node som de alle ligger under

ellers må du starte med "" og så recurse ned gennem træet

(JNDI noder med noget under sig vil alle kunne castes til Context)
Avatar billede cayman Nybegynder
07. december 2005 - 07:28 #6
Hvis man skriver "" i strengen - tager den så alle subnoder?
Avatar billede cayman Nybegynder
07. december 2005 - 08:50 #7
Har prøvet denne rekursive metode - men den looper bare.
Har du et forslag Arne:
    private void setDataSourcesInList(Context context, List list){
        try {
            NamingEnumeration namingEnumeration = context.list("");
            while (namingEnumeration.hasMoreElements()) {
                Object element = (Object) namingEnumeration.nextElement();
                if (element instanceof NameClassPair){
                    NameClassPair pair = (NameClassPair)element;
                   
                    if (pair.getClassName().equalsIgnoreCase("javax.sql.DataSource") ){
                        list.add(element);
                    }
                    else if (pair.getClassName().equalsIgnoreCase("javax.naming.Context") ||
                            pair.getClassName().equalsIgnoreCase("javax.naming.InitialContext")){
                        setDataSourcesInList((Context)context.lookup(pair.getName()), list);
                    }
                }
            }
        } catch (NamingException e) {
            e.printStackTrace();
        }
    }
Avatar billede arne_v Ekspert
08. december 2005 - 00:16 #8
prøv den her:

<%@ page import="java.util.*,javax.naming.*" %>
<table border="1">
<tr>
<th>Name</th>
<th>Class</th>
</tr>
<%
LinkedList list = new LinkedList();
Context ctx = new InitialContext();
list.addLast("java:comp");
while(list.size() > 0) {
    String node = (String)list.removeFirst();
    NamingEnumeration ctxe = ctx.list(node);
    while(ctxe.hasMore()) {
        NameClassPair ncp = (NameClassPair)ctxe.next();
        %>
        <tr>
        <td><%=node%>/<%=ncp.getName()%></td>
        <td><%=ncp.getClassName()%></td>
        </tr>
        <%
        try {
            if(ctx.lookup(node + "/" + ncp.getName()) instanceof Context) {
                list.addLast(node + "/" + ncp.getName());
            }
        } catch(Exception ex) {
        }
    }
}
%>
</table>
Avatar billede arne_v Ekspert
08. december 2005 - 00:20 #9
jeg har testet med JDK 1.5.0 Tomcat 5.5
Avatar billede cayman Nybegynder
08. december 2005 - 08:55 #10
Har prøvet det af som metode i an struts action. Virker fint. tak for hjælpen. Sender du et svar :o)
Avatar billede arne_v Ekspert
08. december 2005 - 14:35 #11
kommer her
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester