/**
* Copyright (C) 2012-2013 eBusiness Information (www.ebusinessinformation.fr)
*
* 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.athomas.androidkickstartr;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.eclipse.egit.github.core.Repository;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.athomas.androidkickstartr.generator.ApplicationGenerator;
import com.athomas.androidkickstartr.generator.Generator;
import com.athomas.androidkickstartr.generator.MainActivityGenerator;
import com.athomas.androidkickstartr.generator.RestClientGenerator;
import com.athomas.androidkickstartr.generator.SampleFragmentGenerator;
import com.athomas.androidkickstartr.generator.ViewPagerAdapterGenerator;
import com.athomas.androidkickstartr.util.FileHelper;
import com.athomas.androidkickstartr.util.GitHubber;
import com.athomas.androidkickstartr.util.LibraryHelper;
import com.athomas.androidkickstartr.util.RefHelper;
import com.athomas.androidkickstartr.util.ResourcesUtils;
import com.athomas.androidkickstartr.util.TemplatesFileHelper;
import com.athomas.androidkickstartr.util.Zipper;
import com.sun.codemodel.JCodeModel;
import freemarker.template.TemplateException;
public class Kickstartr {
private final static Logger LOGGER = LoggerFactory.getLogger(Kickstartr.class);
private AppDetails appDetails;
private JCodeModel jCodeModel;
private FileHelper fileHelper;
public Kickstartr(AppDetails appDetails) {
this.appDetails = appDetails;
jCodeModel = new JCodeModel();
fileHelper = new FileHelper(appDetails.getName(), appDetails.getPackageName(), appDetails.isMaven());
extractResources(appDetails);
}
public File zipify() {
createDirectory();
File zipFile = null;
try {
File targetDir = fileHelper.getTargetDir();
zipFile = new File(targetDir, appDetails.getName() + "-AndroidKickstartr.zip");
Zipper.zip(fileHelper.getFinalDir(), zipFile);
LOGGER.debug("application sources zipped");
} catch (IOException e) {
LOGGER.error("a problem occured during the compression", e);
return null;
}
LOGGER.debug("AndroidKickstartR generation done");
return zipFile;
}
public Repository githubify(String accessToken) throws IOException, GitAPIException {
LOGGER.debug("Github creation started");
createDirectory();
GitHubber gitHubber = new GitHubber(accessToken);
Repository repository = gitHubber.createCommit(fileHelper.getFinalDir(), fileHelper.getProjectDir().getName());
return repository;
}
private void extractResources(AppDetails appDetails) {
try {
File resourcesDir = fileHelper.getKickstartrResourcesDir();
if (resourcesDir.exists() || resourcesDir.list() == null || resourcesDir.list().length == 0) {
ResourcesUtils.copyResourcesTo(resourcesDir, "org.eclipse.jdt.apt.core.prefs");
}
} catch (IOException e) {
LOGGER.error("an error occured during the resources extraction", e);
}
}
private void createDirectory() {
LOGGER.info("generation of " + appDetails + " : " + appDetails);
if (appDetails.isRestTemplate() || appDetails.isAcra()) {
List<String> permissions = appDetails.getPermissions();
permissions.add("android.permission.INTERNET");
}
try {
copyResDir();
LOGGER.debug("res dir copied.");
} catch (IOException e) {
LOGGER.error("problem occurs during the resources copying", e);
}
try {
generateSourceCode();
LOGGER.debug("source code generated from templates.");
} catch (IOException e) {
LOGGER.error("generated code file not generated", e);
}
try {
File androidResDir = fileHelper.getTargetAndroidResDir();
File sourceResDir = fileHelper.getResDir();
FileUtils.copyDirectory(sourceResDir, androidResDir);
LOGGER.debug("res dir copied.");
} catch (IOException e) {
LOGGER.error("problem occurs during the resources copying", e);
}
if (appDetails.isMaven()) {
// create src/text/java - it avoids an error when import to Eclipse
File targetTestDir = fileHelper.getTargetTestDir();
File removeMe = new File(targetTestDir, "REMOVE.ME");
try {
removeMe.createNewFile();
} catch (IOException e) {
LOGGER.error("an error occured during the REMOVE.ME file creation", e);
}
}
try {
TemplatesFileHelper templatesFileHelper = new TemplatesFileHelper(appDetails, fileHelper);
templatesFileHelper.generate();
LOGGER.debug("files generated from templates.");
} catch (IOException e) {
LOGGER.error("problem during ftl files loading", e);
} catch (TemplateException e) {
LOGGER.error("problem during template processing", e);
}
try {
if (appDetails.isEclipse()) {
if (appDetails.isAndroidAnnotations()) {
File targetEclipseJdtAptCorePrefsFile = fileHelper.getTargetEclipseJdtAptCorePrefsFile();
File eclipseJdtAptCorePrefs = fileHelper.getEclipseJdtAptCorePrefs();
FileUtils.copyFile(eclipseJdtAptCorePrefs, targetEclipseJdtAptCorePrefsFile);
LOGGER.debug("org.eclipse.jdt.apt.core.prefs copied");
}
File targetEclipseJdtCorePrefsFile = fileHelper.getTargetEclipseJdtCorePrefsFile();
File eclipseJdtCorePrefs = fileHelper.getEclipseJdtCorePrefs();
FileUtils.copyFile(eclipseJdtCorePrefs, targetEclipseJdtCorePrefsFile);
LOGGER.debug("org.eclipse.jdt.core.prefs copied");
}
} catch (IOException e) {
LOGGER.error("a problem occured during the org.eclipse.jdt.apt.core.prefs copying", e);
}
LibraryHelper libraryManager = new LibraryHelper(appDetails, fileHelper);
libraryManager.go();
LOGGER.debug("libraries copied");
}
private void generateSourceCode() throws IOException {
List<Generator> generators = new ArrayList<Generator>();
generators.add(new MainActivityGenerator(appDetails));
if (appDetails.isViewPager() && !appDetails.isSample()) {
generators.add(new ViewPagerAdapterGenerator(appDetails));
generators.add(new SampleFragmentGenerator(appDetails));
}
if (appDetails.isRestTemplate() && appDetails.isAndroidAnnotations() && !appDetails.isSample()) {
generators.add(new RestClientGenerator(appDetails));
}
if (appDetails.isAcra() && !appDetails.isSample()) {
generators.add(new ApplicationGenerator(appDetails));
}
RefHelper refHelper = new RefHelper(jCodeModel);
refHelper.r(appDetails.getR());
for (Generator generator : generators) {
generator.generate(jCodeModel, refHelper);
}
jCodeModel.build(fileHelper.getTargetSourceDir());
}
private void copyResDir() throws IOException {
File androidResDir = fileHelper.getTargetAndroidResDir();
File sourceResDir = fileHelper.getResDir();
FileFilter filter = null;
List<IOFileFilter> fileFilters = new ArrayList<IOFileFilter>();
if (!appDetails.isListNavigation() && !appDetails.isTabNavigation() && appDetails.isSample()) {
// Exclude arrays.xml from the copy
IOFileFilter resArraysFilter = FileFilterUtils.nameFileFilter("arrays.xml");
IOFileFilter fileFilter = FileFilterUtils.notFileFilter(resArraysFilter);
fileFilters.add(fileFilter);
}
if (!appDetails.isViewPager() && appDetails.isSample()) {
// Exclude fragment_sample.xml from the copy
IOFileFilter resFragmentSampleFilter = FileFilterUtils.nameFileFilter("fragment_sample.xml");
IOFileFilter fileFilter = FileFilterUtils.notFileFilter(resFragmentSampleFilter);
fileFilters.add(fileFilter);
}
if (!fileFilters.isEmpty()) {
filter = FileFilterUtils.and(fileFilters.toArray(new IOFileFilter[fileFilters.size()]));
}
FileUtils.copyDirectory(sourceResDir, androidResDir, filter);
}
public void clean() {
File targetDir = fileHelper.getTargetDir();
try {
FileUtils.cleanDirectory(targetDir);
} catch (IOException e) {
LOGGER.error("a problem occured during target dir cleaning", e);
}
}
}