blob: 0c95ca802320722ba06dceedb836e91f291ccf3d [file] [log] [blame]
/*
* 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;
}
}