/**
* 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.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput;
import org.apache.commons.io.FileUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
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.util.GithubUtils;
import com.athomas.androidkickstartr.util.StringUtils;
@Path("/")
public class Main {
private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);
private static final String ERROR = "error";
private static final String SUCCESS = "success";
private static String GITHUB_SECRET;
private static String GITHUB_ID;
// Initialize the
static {
Properties prop = new Properties();
try {
prop.load(Main.class.getClassLoader().getResourceAsStream("Github.properties"));
GITHUB_ID = prop.getProperty("id");
GITHUB_SECRET = prop.getProperty("secret");
} catch (FileNotFoundException e) {
LOGGER.error("problem during properties loading", e);
} catch (IOException e) {
LOGGER.error("problem during properties loading", e);
}
}
@POST
@Produces("application/zip")
public Response go(//
// State
@FormParam("actionBarSherlock") boolean actionBarSherlock,//
@FormParam("navigationType") String navigationType,//
@FormParam("androidAnnotations") boolean androidAnnotations,//
@FormParam("restTemplate") boolean restTemplate,//
@FormParam("maven") boolean maven,//
@FormParam("nineOldAndroids") boolean nineOldAndroids,//
@FormParam("supportV4") boolean supportV4,//
@FormParam("acra") boolean acra,//
@FormParam("eclipse") boolean eclipse,//
@FormParam("viewPager") boolean viewPager,//
@FormParam("viewPagerIndicator") boolean viewPagerIndicator,//
@FormParam("roboguice") boolean roboguice,//
@FormParam("proguard") boolean proguard,//
@FormParam("sample") boolean sample,//
// Application
@FormParam("packageName") String packageName,//
@FormParam("name") String name,//
@FormParam("activity") String activity,//
@FormParam("activityLayout") String activityLayout,//
// Github access token
@FormParam("accessToken") String accessToken//
) {
boolean listNavigation = false;
boolean tabNavigation = false;
boolean git = false;
if (navigationType != null) {
tabNavigation = navigationType.equals("tabNavigation");
listNavigation = navigationType.equals("listNavigation");
}
if (StringUtils.isEmpty(packageName)) {
packageName = "com.androidkickstarter.app";
}
if (StringUtils.isEmpty(name)) {
name = "MyApplication";
}
if (StringUtils.isEmpty(activity)) {
activity = "MainActivity";
}
if (StringUtils.isEmpty(activityLayout)) {
activityLayout = "activity_main";
}
if (!StringUtils.isEmpty(accessToken)) {
git = true;
}
if (viewPager && !actionBarSherlock && !viewPagerIndicator && !supportV4) {
supportV4 = true;
}
AppDetails appDetails = new AppDetails.Builder().//
// Parameters
packageName(packageName).//
name(name).//
activity(activity).//
activityLayout(activityLayout).//
minSdk(8).//
targetSdk(16).//
permissions(new ArrayList<String>()).//
// Libraries
actionBarSherlock(actionBarSherlock).//
listNavigation(listNavigation).//
tabNavigation(tabNavigation).//
viewPager(viewPager).//
viewPagerIndicator(viewPagerIndicator).//
roboguice(roboguice).//
androidAnnotations(androidAnnotations).//
restTemplate(restTemplate). //
maven(maven). //
nineOldAndroids(nineOldAndroids). //
supportV4(supportV4). //
acra(acra). //
eclipse(eclipse). //
proguard(proguard). //
sample(sample). //
git(git). //
build();
final Kickstartr kickstarter = new Kickstartr(appDetails);
if (!git) {
LOGGER.debug("No github asked");
final File file = kickstarter.zipify();
if (file == null) {
return Response.serverError().build();
}
StreamingOutput output = new StreamingOutput() {
public void write(OutputStream output) throws IOException, WebApplicationException {
try {
FileUtils.copyFile(file, output);
kickstarter.clean();
} catch (Exception e) {
throw new WebApplicationException(e);
}
}
};
return Response //
.ok(output) //
.header("Content-Length", file.length()) //
.header("Content-Disposition", "attachment; filename=" + file.getName()) //
.build();
} else {
LOGGER.debug("Github output asked");
Repository repository = null;
try {
repository = kickstarter.githubify(accessToken);
} catch (IOException e) {
e.printStackTrace();
return Response.seeOther(GithubUtils.createAndroidKickstartRUriWithAccessToken(accessToken, ERROR, "Unable to create or access repository : " + e.getMessage())).build();
} catch (GitAPIException e) {
e.printStackTrace();
return Response.seeOther(GithubUtils.createAndroidKickstartRUriWithAccessToken(accessToken, ERROR, "Unable to create or access repository : " + e.getMessage())).build();
} finally {
kickstarter.clean();
}
if (repository != null)
return Response.seeOther(GithubUtils.createAndroidKickstartRUriWithAccessToken(accessToken, SUCCESS, "Repository successfully created! You can access it now at the following address : &repositoryUrl=" + repository.getHtmlUrl())).build();
else
return Response.serverError().build();
}
}
@GET
@Path("token")
@Produces(MediaType.APPLICATION_JSON)
public Response getAccessToken(@QueryParam("code") String code) throws ClientProtocolException, IOException, URISyntaxException {
HttpClient httpclient = new DefaultHttpClient();
HttpPost postRequest = new HttpPost("https://github.com/login/oauth/access_token");
List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(3);
nameValuePair.add(new BasicNameValuePair("client_id", GITHUB_ID));
nameValuePair.add(new BasicNameValuePair("client_secret", GITHUB_SECRET));
nameValuePair.add(new BasicNameValuePair("code", code));
postRequest.setEntity(new UrlEncodedFormEntity(nameValuePair));
HttpResponse response = httpclient.execute(postRequest);
if (response.getStatusLine().getStatusCode() != 200) {
return Response.temporaryRedirect(GithubUtils.createAndroidKickstartRUri(ERROR, "Unexpected status code : " + response.getStatusLine().getStatusCode() + " " + response.getStatusLine().getReasonPhrase())).build();
} else {
HttpEntity entity = response.getEntity();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent()));
String line;
while ((line = bufferedReader.readLine()) != null) {
String accessToken = GithubUtils.findAccessTokenInString(line);
if (accessToken != null) {
return Response.temporaryRedirect(GithubUtils.createAndroidKickstartRUri(GithubUtils.ACCESS_TOKEN, accessToken)).build();
}
}
}
return Response.temporaryRedirect(GithubUtils.createAndroidKickstartRUri(ERROR, "Couldn't retrieve access token")).build();
}
}