Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: jena/DBcmd.java


1   /*
2    * (c) Copyright 2003, 2004, 2005 Hewlett-Packard Development Company, LP
3    * [See end of file]
4    */
5   
6    
7   package jena;
8   import jena.cmdline.* ;
9   import com.hp.hpl.jena.db.* ;
10  //import com.hp.hpl.jena.rdf.model.* ;
11  import java.util.* ;
12   
13  /** Framework for the database commands.
14   * 
15   * @author Andy Seaborne
16   * @version $Id: DBcmd.java,v 1.6 2005/02/21 11:49:04 andy_seaborne Exp $
17   */ 
18   
19  abstract class DBcmd
20  {
21      // Standardised names.
22      protected final ArgDecl argDeclDbURL       = new ArgDecl(true, "db");
23      protected final ArgDecl argDeclDbType      = new ArgDecl(true, "dbType");
24      protected final ArgDecl argDeclDbUser      = new ArgDecl(true, "dbUser", "user");
25      protected final ArgDecl argDeclDbPassword  = new ArgDecl(true, "dbPassword", "password", "pw");
26      protected final ArgDecl argDeclModelName   = new ArgDecl(true, "model");
27      protected final ArgDecl argDeclDbDriver    = new ArgDecl(true, "driver");
28  
29      protected final ArgDecl argDeclVerbose     = new ArgDecl(false, "v", "verbose");
30      protected boolean verbose = false ;
31  
32      protected final ArgDecl argDeclDebug       = new ArgDecl(false, "debug");
33      protected boolean debug = false ;
34  
35      protected final ArgDecl argDeclHelp        = new ArgDecl(false, "help", "h");
36  
37  
38      // The values of these arguments
39      protected String argDbURL = null;
40      protected String argDbType = null;
41      protected String argDbUser = null;
42      protected String argDbPassword = null;
43      protected String argModelName = null;
44  
45      // DB types to driver
46      static Map drivers = new HashMap();
47      static {
48          drivers.put("mysql",       "com.mysql.jdbc.Driver");
49          drivers.put("postgresql",  "org.postgresql.Driver");
50          drivers.put("postgres",    "org.postgresql.Driver");
51          drivers.put("postgresql",  "org.postgresql.Driver");
52          drivers.put("PostgreSQL",  "org.postgresql.Driver") ;  // Thanks to Joshua Moore [j.moore@dkfz-heidelberg.de]
53      }
54  
55      boolean takesPositionalArgs = false ;
56      String cmdName = "DB" ;
57      CommandLine cmdLine = new CommandLine();
58      private IDBConnection jdbcConnection = null;
59      private ModelRDB dbModel = null ;
60      
61      private String [] usage = new String[]{ "Complain to jena-dev: someone forgot the usage string" } ;
62  
63      DBcmd(String n, boolean posArgs)
64      {
65          cmdName = n ;
66          takesPositionalArgs = posArgs ;
67          cmdLine.add(argDeclDbURL);
68          cmdLine.add(argDeclDbType);
69          cmdLine.add(argDeclDbUser);
70          cmdLine.add(argDeclDbPassword);
71          cmdLine.add(argDeclModelName);
72          cmdLine.add(argDeclVerbose) ;
73          cmdLine.add(argDeclDebug) ;
74          cmdLine.add(argDeclHelp) ;
75      }
76  
77      protected void init(String[] args)
78      {
79          try {
80              cmdLine.process(args);
81          } catch (IllegalArgumentException ex)
82          {
83              usage() ;
84              System.exit(1) ;
85          }
86          
87          if ( cmdLine.contains(argDeclHelp) )
88          {
89              usage() ;
90              System.exit(0) ;
91          }
92          
93          verbose = cmdLine.contains(argDeclVerbose) ;
94          debug = cmdLine.contains(argDeclDebug) ;
95          if ( debug )
96              verbose = true ;
97          
98          if (cmdLine.contains(argDeclDbURL))
99              argDbURL = cmdLine.getArg(argDeclDbURL).getValue();
100 
101         if (cmdLine.contains(argDeclDbType))
102             argDbType = cmdLine.getArg(argDeclDbType).getValue();
103 
104         if (cmdLine.contains(argDeclDbUser))
105             argDbUser = cmdLine.getArg(argDeclDbUser).getValue();
106 
107         if (cmdLine.contains(argDeclDbPassword))
108             argDbPassword = cmdLine.getArg(argDeclDbPassword).getValue();
109 
110         if (cmdLine.contains(argDeclModelName))
111             argModelName = cmdLine.getArg(argDeclModelName).getValue();
112 
113         if ( verbose )
114         {
115             System.out.println("URL       = " + argDbURL);
116             System.out.println("User      = " + argDbUser);
117             System.out.println("Password  = " + argDbPassword);
118             System.out.println("Type      = " + argDbType);
119             System.out.println("Name      = " + argModelName);
120         }
121 
122         // Mandatory arguments
123         if (argDbURL == null || argDbType == null || argDbUser == null || argDbPassword == null)
124         {
125             System.err.println("Missing a required argument (need JDBC URL, user, password and DB type)");
126             System.exit(9);
127         }
128 
129         if ( ! takesPositionalArgs && cmdLine.items().size() != 0 )
130         {
131             System.err.println(cmdName+": No positional arguments allowed") ;
132             usage() ;
133             System.exit(9) ;
134         }
135         
136         if ( takesPositionalArgs && cmdLine.items().size() == 0 )
137         {
138             System.err.println(cmdName+": Positional argument required") ;
139             usage() ;
140             System.exit(9) ;
141         }
142 
143         String driverClass = (String)drivers.get(argDbType);
144         if (cmdLine.contains(argDeclDbDriver))
145             driverClass = cmdLine.getArg(argDeclDbDriver).getValue();
146 
147         if (driverClass == null)
148         {
149             System.err.println("No driver: please say which JDBC driver to use");
150             System.exit(9);
151         }
152 
153         try
154         {
155             Class.forName(driverClass).newInstance();
156         }
157         catch (Exception ex)
158         {
159             System.err.println("Couldn't load the driver class: " + driverClass);
160             System.err.println("" + ex);
161             System.exit(9);
162         }
163 
164     }
165     
166 protected ModelRDB getRDBModel() 
167     {
168         if ( dbModel == null )
169         {
170             try 
171             {
172                 
173             if ( argModelName == null )
174                 dbModel = ModelRDB.open(getConnection()) ;
175             else
176                 try {
177                     dbModel = ModelRDB.open(getConnection(), argModelName) ;
178                 } catch (com.hp.hpl.jena.shared.DoesNotExistException ex)
179                 {
180                     System.out.println("No model '"+argModelName+"' in that database") ;
181                     System.exit(9) ;
182                 }
183             }
184             catch (com.hp.hpl.jena.db.RDFRDBException dbEx)
185             {
186                 Throwable t = dbEx.getCause() ;
187                 if ( t == null )
188                     t = dbEx ;
189                 System.out.println("Failed to connect to the database: "+t.getMessage()) ;
190                 System.exit(9) ;
191             }
192         }
193         
194         return dbModel ;   
195     }
196 
197 
198     protected IDBConnection getConnection()
199     {
200         if ( jdbcConnection == null )
201         {
202             try {
203                 jdbcConnection = new DBConnection(argDbURL, argDbUser, argDbPassword, argDbType);
204             } catch (Exception ex)
205             {
206                 System.out.println("Exception making connection: "+ex.getMessage()) ;
207                 System.exit(9) ;
208             }
209         }
210         return jdbcConnection ;
211     }
212 
213 
214     protected void exec()
215     {
216         if ( cmdLine.items().size() == 0 )
217         {
218             exec0() ;
219             return ;
220         }
221         
222         
223         boolean inTransaction = false ;
224         try
225         {
226             if ( getRDBModel().supportsTransactions() )
227             {
228                 inTransaction = true ;
229                 getRDBModel().begin() ;
230             }
231 
232             for ( Iterator iter = cmdLine.items().iterator() ; iter.hasNext() ; )
233             {
234                 String arg = (String)iter.next() ;
235                 boolean contTrans = false ;
236                 try {
237                     contTrans = exec1(arg) ;
238                 }
239                 catch (Exception ex)
240                 {
241                     System.out.println(ex.getMessage()) ;
242                     ex.printStackTrace(System.out) ;
243                     if ( inTransaction )
244                     {
245                         getRDBModel().abort() ;
246                         inTransaction = false ;
247                     }
248                     dbModel.close() ;
249                     dbModel = null ;
250                     System.exit(9);
251                 }
252                                         
253                     
254                 if ( !contTrans && inTransaction )
255                 {
256                     getRDBModel().commit() ;
257                     if ( iter.hasNext() )
258                     {
259                         inTransaction = true ;
260                         getRDBModel().begin() ; 
261                     } 
262                 }
263             }
264         }            
265         finally
266         {
267             if ( inTransaction )
268                 getRDBModel().commit() ;
269         }
270         
271         dbModel.close() ;
272         dbModel = null ;
273     }
274 
275     /** Called if there are no psoitional arguments
276      */     
277     abstract void exec0() ;
278     
279     /** Called for each postional argument, inside a transaction.
280      *  Return true to continue this transaction, false to end it and start a new
281      *  one if there are any more args 
282      */     
283     abstract boolean exec1(String arg) ;
284     
285     
286     
287     protected void setUsage(String a)
288     {
289         String[] aa = new String[]{a} ;
290         setUsage(aa) ;
291     } 
292 
293 
294     /** Usage message: one line per entry*/
295     
296     protected void setUsage(String[] a)
297     {
298         usage = a ;
299     }
300     
301     protected void usage()
302     {
303         for ( int i = 0 ; i < usage.length ; i++ )
304         {
305             System.err.println(usage[i]) ;
306         }
307     }
308 }
309 
310 /*
311  *  (c) Copyright 2003, 2004, 2005 Hewlett-Packard Development Company, LP
312  *  All rights reserved.
313  *
314  * Redistribution and use in source and binary forms, with or without
315  * modification, are permitted provided that the following conditions
316  * are met:
317  * 1. Redistributions of source code must retain the above copyright
318  *    notice, this list of conditions and the following disclaimer.
319  * 2. Redistributions in binary form must reproduce the above copyright
320  *    notice, this list of conditions and the following disclaimer in the
321  *    documentation and/or other materials provided with the distribution.
322  * 3. The name of the author may not be used to endorse or promote products
323  *    derived from this software without specific prior written permission.
324  *
325  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
326  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
327  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
328  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
329  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
330  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
331  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
332  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
333  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
334  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
335  */