/*******************************************************************************
* Copyright (c) 2007, 2013 Alphonse Van Assche.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Alphonse Van Assche - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.rpmstubby;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.linuxtools.internal.rpmstubby.model.FeatureModel;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
/**
* Generates the RPM specfile and the fetch script based on the feature and user
* preferences.
*/
public class StubbyGenerator extends AbstractGenerator {
private FeatureModel model;
private IFile featureFile;
/**
* Creates the specfile and fetch script generator for the given packages.
*
* @param featureFile
* The feature.xml file to generate from.
*/
public StubbyGenerator(IFile featureFile) {
this.featureFile = featureFile;
parse(featureFile);
specfileName = model.getPackageName().toLowerCase() + ".spec";
projectName = featureFile.getProject().getName();
}
private void parse(IFile featureFile) {
DocumentBuilderFactory docfactory = DocumentBuilderFactory
.newInstance();
IPath featureDir = featureFile.getLocation().removeLastSegments(1);
String featurePropertiesFile = featureDir.toOSString()
+ "/feature.properties";
Properties featureProperties = new Properties();
try {
featureProperties.load(new FileInputStream(featurePropertiesFile));
} catch (FileNotFoundException e) {
// Do nothing if the feature.properties is not found
} catch (IOException e) {
StubbyLog.logError(e);
}
DocumentBuilder docbuilder;
try {
docbuilder = docfactory.newDocumentBuilder();
Document docroot = docbuilder.parse(featureFile.getContents());
model = new FeatureModel(docroot, featureProperties);
} catch (ParserConfigurationException|SAXException|IOException|CoreException e) {
StubbyLog.logError(e);
}
}
/**
* Generates a RPM specfile based on the parsed data from the pom file.
*
* @return The generated specfile.
*/
@Override
public String generateSpecfile() {
StringBuilder buffer = new StringBuilder();
buffer.append("Name: " + model.getPackageName().toLowerCase()
+ "\n");
buffer.append("Version: " + model.getVersion() + "\n");
buffer.append("Release: 1%{?dist}" + "\n");
buffer.append("Summary: " + model.getSummary() + "\n\n");
buffer.append("License: " + model.getLicense() + "\n");
buffer.append("URL: " + model.getURL() + "\n");
buffer.append("Source0: #FIXME\n");
buffer.append("BuildArch: noarch\n\n");
generateRequires(buffer);
buffer.append("%description\n" + model.getDescription() + "\n");
generatePrepSection(buffer);
generateBuildSection(buffer);
generateInstallSection(buffer);
generateFilesSections(buffer);
generateChangelog(buffer);
return buffer.toString();
}
private static void generateRequires(StringBuilder buffer) {
buffer.append("BuildRequires: maven-local\n");
buffer.append("\n\n");
}
private static void generateInstallSection(StringBuilder buffer) {
buffer.append("%install\n");
buffer.append("%mvn_install \n");
buffer.append("\n\n");
}
private void generateFilesSections(StringBuilder buffer) {
buffer.append("%files -f .mfiles\n");
String docsRoot = featureFile.getLocation().removeLastSegments(1)
.lastSegment();
String[] files = featureFile.getLocation().removeLastSegments(1)
.toFile().list();
for (String file : files) {
if (file.matches("(epl-.*|license)\\.html")) {
buffer.append("%doc " + docsRoot + "/" + file + "\n");
}
}
buffer.append("\n\n");
}
private static void generatePrepSection(StringBuilder buffer) {
buffer.append("\n%prep\n");
buffer.append("%setup -q #You may need to update this according to your Source0\n");
buffer.append("\n\n");
}
private static void generateBuildSection(StringBuilder buffer) {
buffer.append("%build\n");
buffer.append("%mvn_build -j\n ");
buffer.append("\n\n");
}
/**
* Returns the last meaningful part of the feature id before the feature
* substring.
*
* @param packageName
* The feature id from which to extract the name.
* @return The part of the feature id to be used for package name.
*/
public String getPackageName(String packageName) {
String[] packageItems = packageName.split("\\.");
String name = packageItems[packageItems.length - 1];
if (name.equalsIgnoreCase("feature")) {
name = packageItems[packageItems.length - 2];
}
return "eclipse-" + name;
}
}