/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.motorola.studio.android.db.deployment; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Map; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Platform; import com.motorola.studio.android.codeutils.db.utils.DatabaseUtils; import com.motorola.studio.android.common.IAndroidConstants; import com.motorola.studio.android.common.utilities.FileUtil; /** * Handles database deployment in devices and plug-in projects. */ public class DatabaseDeployer { /** * Plug-in Identifier */ private static final String PLUGIN_IDENTIFIER = "com.motorola.studio.android.codeutils"; /** * Constant representing the location of the DatabaseHelper class. */ private static final String DATABASE_HELPER_CLASS_LOCATION = "resources/databaseDeploy/DatabaseHelperjava.txt"; //$NON-NLS-1$ /** * This constant represents the value of the to-be-copied Database Name */ public static final String DATABASE_NAME = "#dbName#"; /** * This constant represents the value of newly-created Android Application Package Name for the Database */ public static final String APPLICATION_DATABASE_NAMESPACE = "#applicationPackageNamespace#"; /** * Directory of the Database Helper in the android project */ public static final String ANDROID_PROJECT_PACKAGE_NAME = "#packageName#"; //$NON-NLS-1$ /** * Open Helper Package Name */ public static final String OPEN_HELPER_PACKAGE_NAME = "#databaseOpenHelperPackageName#"; //$NON-NLS-1$ /** * File name of the Database Helper in the android project */ public static final String DATABASE_HELPER_CLASS_NAME = "#className#"; //$NON-NLS-1$ /** * Copy the DatabaseHelper deploy file to the newly-created-android-plu-in. * * @param project Newly-created-android Project * @param parameters Parameters to replace in the DatabaseHelper class file * @param monitor Monitor * * @throws IOException Exception thrown in case there are problems accessing data of a file. * @throws CoreException Exception thrown in case there are problems accessing a file itself. */ public static void copyDataBaseDeployerClassToProject(IProject project, Map<String, String> parameters, IProgressMonitor monitor) throws IOException, CoreException { // get the destination folder IFolder destinationFolder = project.getFolder(IAndroidConstants.WS_ROOT + IAndroidConstants.FD_SOURCES); // split the new sequence of folders - they will be created, one by one String[] folders = parameters.get(ANDROID_PROJECT_PACKAGE_NAME).split(IAndroidConstants.RE_DOT); // iterate through the folders and create them if ((folders != null) && (folders.length > 0)) { // iterate for (String folder : folders) { // get destination folder with the next one to be created destinationFolder = destinationFolder.getFolder(folder); // proceed in case the destination folder does not exists and can be created if (!destinationFolder.exists()) { // create the folder destinationFolder.create(true, true, monitor); } } } // get the destination file IFile destinationFile = destinationFolder.getFile(parameters.get(DATABASE_HELPER_CLASS_NAME) + IAndroidConstants.DOT_JAVA); // proceed in case it does not exist and can be created if (!destinationFile.exists() && FileUtil.canWrite(destinationFile)) { // get the Database Helper class as a text String databaseHelperText = readDatabaseHelperClassFile(project, parameters); // transform it in a stream InputStream stream = null; try { stream = new ByteArrayInputStream(databaseHelperText.getBytes("UTF-8")); //$NON-NLS-1$ // create the destination folder destinationFile.create(stream, true, monitor); DatabaseUtils.formatCode(destinationFile, databaseHelperText, monitor); } finally { if (stream != null) { stream.close(); } } } } /** * Read the DatabaseHelper class file, replace the parameter maps * and return it as a String. * * @param project Project where the DatabaseHelper is retrieved. * @param parameters Parameters for replacement in the DatabaseHelper class file. * * @return a String representing the DatabaseHelper class file. * * @throws IOException Exception thrown when there are problems reading elements from the * DatabaseHelper class file. */ private static String readDatabaseHelperClassFile(IProject project, Map<String, String> parameters) throws IOException { URL url = Platform.getBundle(PLUGIN_IDENTIFIER).getEntry(DATABASE_HELPER_CLASS_LOCATION); url = FileLocator.toFileURL(url); // string buffer which holds the file as a text StringBuffer databaseHelperBuffer = new StringBuffer(""); // reader BufferedReader databaseHelperReader = null; // get the file to be read File f = null; try { f = new File(url.getFile()); // create the reader to manipulate the file databaseHelperReader = new BufferedReader(new FileReader(f)); // read the Database Helper class file in steps (using buffer) String buffer = null; // iterate while there is stuff to read while ((buffer = databaseHelperReader.readLine()) != null) { // read and put the content in the string buffer element databaseHelperBuffer.append(buffer); databaseHelperBuffer.append(System.getProperty("line.separator")); } } finally { // close reader if (databaseHelperReader != null) { databaseHelperReader.close(); } } // string holding the "text" of the DatabaseHelper class String databaseHelperText = ""; // proceed in case there is stuff in the buffer to read if (databaseHelperBuffer != null) { databaseHelperText = databaseHelperBuffer.toString(); // iterate through the parameters and replace the parameters in the map if (parameters != null) { for (String key : parameters.keySet()) { databaseHelperText = databaseHelperText.replaceAll(key, parameters.get(key)); } } } // return the file as a text return databaseHelperText; } }