/*******************************************************************************
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
*******************************************************************************/
package com.liferay.ide.adt.core.model.internal;
import com.liferay.ide.adt.core.ADTCore;
import com.liferay.ide.adt.core.ADTUtil;
import com.liferay.ide.adt.core.model.NewLiferayAndroidProjectOp;
import com.liferay.ide.core.util.CoreUtil;
import com.liferay.ide.core.util.FileUtil;
import com.liferay.ide.core.util.ZipUtil;
import java.io.File;
import java.io.IOException;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.sapphire.modeling.ProgressMonitor;
import org.eclipse.sapphire.modeling.Status;
import org.eclipse.sapphire.platform.PathBridge;
import org.eclipse.sapphire.platform.ProgressMonitorBridge;
/**
* @author Gregory Amerson
* @author Kuo Zhang
*/
public class NewLiferayAndroidProjectOpMethods
{
private static File createProjectDir(final NewLiferayAndroidProjectOp op)
{
File projectDir = null;
if( op.getUseDefaultLocation().content( true ) )
{
projectDir = CoreUtil.getWorkspaceRoot().getLocation().append( op.getProjectName().content() ).toFile();
}
else
{
projectDir = PathBridge.create( op.getLocation().content() ).toFile();
}
projectDir.mkdirs();
return projectDir;
}
public static final Status execute( final NewLiferayAndroidProjectOp op, final ProgressMonitor monitor )
{
final IProgressMonitor platformMonitor = ProgressMonitorBridge.create( monitor );
platformMonitor.beginTask( "Creating Liferay Android project", 100 );
File projectDir = createProjectDir( op );
File projectTemplate = ADTCore.getProjectTemplateFile();
try
{
final String topLevelDir = ZipUtil.getFirstZipEntryName( projectTemplate );
ZipUtil.unzip( projectTemplate, topLevelDir, projectDir, platformMonitor );
updateProjectContents( projectDir, op );
openProject( projectDir, op, platformMonitor );
}
catch( Exception e )
{
return Status.createErrorStatus( "Error creating Liferay Android project", e );
}
return Status.createOkStatus();
}
private static void openProject( File projectDir, NewLiferayAndroidProjectOp op, final IProgressMonitor monitor )
throws CoreException
{
final IProject newProject = workspaceRoot().getProject( op.getProjectName().content() );
final IProjectDescription description = workspace().newProjectDescription( op.getProjectName().content() );
if( op.getUseDefaultLocation().content( true ) )
{
description.setLocation( null );
}
else
{
description.setLocationURI( projectDir.toURI() );
}
newProject.create( description, monitor );
newProject.open( monitor );
}
private static void updateProjectContents( File projectDir, NewLiferayAndroidProjectOp op ) throws CoreException
{
// update project name
final File dotProject = new File( projectDir, ".project" );
try
{
boolean updated =
FileUtil.searchAndReplace( dotProject, "<name>liferay-mobile-sdk-sample-android</name>", "<name>" +
op.getProjectName().content() + "</name>" );
if( ! updated )
{
throw new IOException();
}
// update target sdk
final int sdkLevel = ADTUtil.extractSdkLevel( op.getTargetSDK().content( true ) );
final File androidManfest = new File( projectDir, "AndroidManifest.xml" );
FileUtil.searchAndReplace(
androidManfest, "android:targetSdkVersion=\"\\d+\"", "android:targetSdkVersion=\"" + sdkLevel + "\"" );
final File projectProperties = new File( projectDir, "project.properties" );
FileUtil.searchAndReplace( projectProperties, "target=android-\\d+", "target=android-" + sdkLevel );
}
catch( IOException e )
{
throw new CoreException( ADTCore.createErrorStatus( "Unable to update project contents", e ) );
}
}
private static IWorkspace workspace()
{
return ResourcesPlugin.getWorkspace();
}
private static IWorkspaceRoot workspaceRoot()
{
return workspace().getRoot();
}
}