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: /*
042: * SampleDatabaseCreator.java
043: *
044: * Created on July 28, 2006, 4:10 PM
045: *
046: * To change this template, choose Tools | Template Manager
047: * and open the template in the editor.
048: */
049: package org.netbeans.modules.visualweb.dataconnectivity.utils;
050:
051: import java.io.File;
052: import java.io.FileInputStream;
053: import java.io.FileNotFoundException;
054: import java.io.IOException;
055: import java.io.OutputStream;
056: import java.util.logging.Level;
057: import java.util.logging.Logger;
058: import org.openide.filesystems.FileLock;
059: import java.util.zip.ZipEntry;
060: import java.util.zip.ZipInputStream;
061: import org.netbeans.api.db.explorer.ConnectionManager;
062: import org.netbeans.api.db.explorer.DatabaseConnection;
063: import org.netbeans.api.db.explorer.DatabaseException;
064: import org.netbeans.api.db.explorer.JDBCDriver;
065: import org.netbeans.api.db.explorer.JDBCDriverManager;
066: import org.openide.filesystems.FileObject;
067: import org.openide.filesystems.FileUtil;
068: import org.openide.modules.InstalledFileLocator;
069: import org.netbeans.modules.derby.api.DerbyDatabases;
070: import org.openide.util.NbPreferences;
071:
072: /**
073: *
074: * @author John Baker
075: */
076: public class SampleDatabaseCreator {
077: public static final String DRIVER_CLASS_NET = "org.apache.derby.jdbc.ClientDriver"; // NOI18N
078: public static final String DRIVER_DISP_NAME_NET = "Java DB (Network)"; // NOI18N
079: private static Logger LOGGER = Logger
080: .getLogger(SampleDatabaseCreator.class.getName());
081:
082: /** Creates a new instance of SampleDatabaseUtils */
083: public SampleDatabaseCreator() {
084: }
085:
086: /**
087: * Create connection and register a NetBeans property to indicate that sample databae had been created, so as not to recreate if deleted intentionally.
088: */
089: public static void createAll(String database, String username,
090: String password, String schema, String sampleZipFile,
091: boolean rememberPassword, String server, int port) {
092: try {
093: if (DerbyDatabases.isDerbyRegistered()) {
094: SampleDatabaseCreator sample = new SampleDatabaseCreator();
095: if (DerbyDatabases.databaseExists(database)) {
096: sample.registerDatabase(database, username, schema
097: .toUpperCase(), password, rememberPassword,
098: server, port);
099: NbPreferences
100: .forModule(SampleDatabaseCreator.class)
101: .put(
102: "VISUALWEB_SAMPLE_DATABASE_REGISTERED",
103: "true"); // NOI18N
104: }
105: }
106: // if Java DB server isn't registered, do nothing. Once Java EE 5 server is registered then Java DB will be automatically registered
107: } catch (DatabaseException de) {
108: LOGGER.log(Level.WARNING, "Sample database error, ", de);
109: }
110: }
111:
112: /**
113: * Extracts the sample database under the given name in the Derby system home.
114: * Does not overwrite an existing database.
115: *
116: * <p>Not public because used in tests.</p>
117: */
118: private void extractSampleDatabase(String databaseName,
119: String zipFile) throws IOException {
120:
121: File systemHomeFile = DerbyDatabases.getSystemHome();
122: if (systemHomeFile == null) { // NOI18N
123: throw new IllegalStateException(
124: "The derby.system.home directory is not set"); // NOI18N
125: }
126:
127: File sourceFO = InstalledFileLocator.getDefault().locate(
128: zipFile, null, false); // NOI18N
129: FileObject systemHomeFO = FileUtil.toFileObject(systemHomeFile);
130: // Partial fix for Issue 121195. If toFileObject can't find the file on disk, it returns null
131: if (systemHomeFO == null) {
132: LOGGER.log(Level.WARNING, org.openide.util.NbBundle
133: .getMessage(SampleDatabaseCreator.class,
134: "MSG_DERBY_SYSTEM_FOLDER_NOT_FOUND")); // NOI18N
135: throw new FileNotFoundException(org.openide.util.NbBundle
136: .getMessage(SampleDatabaseCreator.class,
137: "MSG_DERBY_SYSTEM_FOLDER_NOT_FOUND")
138: + systemHomeFile.getCanonicalPath()); // NOI18N
139: }
140: FileObject sampleFO = systemHomeFO.getFileObject(databaseName); // NOI18N
141: if (sampleFO == null) {
142: sampleFO = systemHomeFO.createFolder(databaseName);
143: this .extractZip(sourceFO, sampleFO);
144: }
145: }
146:
147: /**
148: * Registers in the Database Explorer the specified database
149: * on the local Derby server.
150: */
151: private DatabaseConnection registerDatabase(String databaseName,
152: String user, String schema, String password,
153: boolean rememberPassword, String server, int port)
154: throws DatabaseException {
155: JDBCDriver drivers[] = JDBCDriverManager.getDefault()
156: .getDrivers(DRIVER_CLASS_NET);
157: if (drivers.length == 0) {
158: throw new IllegalStateException("The "
159: + DRIVER_DISP_NAME_NET + " driver was not found"); // NOI18N
160: }
161: DatabaseConnection dbconn = DatabaseConnection.create(
162: drivers[0], "jdbc:derby://" + server + ":" + port + "/"
163: + databaseName, user, schema, password,
164: rememberPassword); // NOI18N
165: ConnectionManager.getDefault().addConnection(dbconn);
166: return dbconn;
167: }
168:
169: // Unzips sample database file from modules/ext
170: public static void extractZip(File source, FileObject target)
171: throws IOException {
172: FileInputStream is = new FileInputStream(source);
173: try {
174: ZipInputStream zis = new ZipInputStream(is);
175: ZipEntry ze;
176:
177: while ((ze = zis.getNextEntry()) != null) {
178: String name = ze.getName();
179:
180: // if directory, create
181: if (ze.isDirectory()) {
182: FileUtil.createFolder(target, name);
183: continue;
184: }
185:
186: // if file, copy
187: FileObject fd = FileUtil.createData(target, name);
188: FileLock lock = fd.lock();
189: try {
190: OutputStream os = fd.getOutputStream(lock);
191: try {
192: FileUtil.copy(zis, os);
193: } finally {
194: os.close();
195: }
196: } finally {
197: lock.releaseLock();
198: }
199: }
200: } finally {
201: is.close();
202: }
203: }
204:
205: /**
206: * Unzip sample database if derby registered
207: * @param database
208: * @param sampleZipFile
209: */
210: public static void createDatabase(String database,
211: String sampleZipFile) {
212: try {
213: if (DerbyDatabases.isDerbyRegistered()) {
214: SampleDatabaseCreator sample = new SampleDatabaseCreator();
215: if (!DerbyDatabases.databaseExists(database)) {
216: sample.extractSampleDatabase(database,
217: sampleZipFile);
218: }
219: }
220: } catch (IOException ioe) {
221: LOGGER.log(Level.WARNING, "Sample database error, ", ioe); // NOI18N
222: }
223: }
224: }
|