/****************************************************************************/
/* File: PackagesXmlFile.java */
/* Author: F. Georges - H2O Consulting */
/* Date: 2013-09-17 */
/* Tags: */
/* Copyright (c) 2013 Florent Georges (see end of file.) */
/* ------------------------------------------------------------------------ */
package org.expath.pkg.repo.tools;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.io.Writer;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Pattern;
import org.expath.pkg.repo.Package;
import org.expath.pkg.repo.PackageException;
/**
* Represent the file [repo]/.expath-pkg/packages.txt.
*
* @author Florent Georges
*/
public class PackagesTxtFile
extends UpdatableFile
{
public PackagesTxtFile(File file)
throws PackageException
{
super(file);
}
public void addPackage(Package pkg, String pkg_dir)
throws PackageException
{
String pkg_name = pkg.getName();
String pkg_version = pkg.getVersion();
try {
BufferedReader in = new BufferedReader(new FileReader(myFile));
StringWriter buffer = new StringWriter();
String line;
while ( (line = in.readLine()) != null ) {
// ignore "white" lines
if ( WHITE_LINE_RE.matcher(line).matches() ) {
continue;
}
int pos = line.indexOf(' ');
String dir = line.substring(0, pos);
++pos;
int pos2 = line.indexOf(' ', pos);
String name = line.substring(pos, pos2);
pos = pos2 + 1;
pos2 = line.length();
String version = line.substring(pos, pos2);
// we don't write the line if either the dir is the same, or if
// both the name and the version are the same
if ( ! dir.equals(pkg_dir) && ! ( name.equals(pkg_name) && version.equals(pkg_version) ) ) {
buffer.write(line);
buffer.write("\n");
}
}
in.close();
buffer.write(pkg_dir);
buffer.write(" ");
buffer.write(pkg_name);
buffer.write(" ");
buffer.write(pkg_version);
buffer.write("\n");
update(buffer);
}
catch ( FileNotFoundException ex ) {
throw new PackageException("File not found: " + myFile, ex);
}
catch ( IOException ex ) {
throw new PackageException("Error writing the file: " + myFile, ex);
}
}
public void removePackageByDir(String dir)
throws PackageException
{
try {
BufferedReader in = new BufferedReader(new FileReader(myFile));
StringWriter buffer = new StringWriter();
String line;
while ( (line = in.readLine()) != null ) {
// ignore "white" lines
if ( WHITE_LINE_RE.matcher(line).matches() ) {
continue;
}
int pos = line.indexOf(' ');
String d = line.substring(0, pos);
// we don't write the line of the dir of the package to remove
if ( ! d.equals(dir) ) {
buffer.write(line);
buffer.write("\n");
}
}
in.close();
update(buffer);
}
catch ( FileNotFoundException ex ) {
throw new PackageException("File not found: " + myFile, ex);
}
catch ( IOException ex ) {
throw new PackageException("Error writing the file: " + myFile, ex);
}
}
/**
* Return the names of all the package directories, as a set.
*
* TODO: Cache them! (easy now, as all update go through this class)
*/
public Set<String> parseDirectories()
throws PackageException
{
try {
InputStream stream = new FileInputStream(myFile);
return parseDirectories(stream);
}
catch ( FileNotFoundException ex ) {
throw new PackageException("File not found: " + myFile, ex);
}
}
/**
* Return the names of all the package directories, as a set.
*
* This is a utility method for systems where packages.txt is not stored as
* an actual file (for instance on classpath storages).
*/
public static Set<String> parseDirectories(InputStream stream)
throws PackageException
{
Set<String> result = new HashSet<String>();
try {
BufferedReader in = new BufferedReader(new InputStreamReader(stream));
String line;
while ( (line = in.readLine()) != null ) {
// ignore "white" lines
if ( WHITE_LINE_RE.matcher(line).matches() ) {
continue;
}
int pos = line.indexOf(' ');
String dir = line.substring(0, pos);
result.add(dir);
}
return result;
}
catch ( IOException ex ) {
throw new PackageException("Error reading the package list", ex);
}
}
protected void createEmpty(Writer out)
throws IOException
{
out.write("\n");
}
private static final Pattern WHITE_LINE_RE = Pattern.compile("^[ \t\n\r]*$");
}
/* ------------------------------------------------------------------------ */
/* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS COMMENT. */
/* */
/* The contents of this file are subject to the Mozilla Public License */
/* Version 1.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.mozilla.org/MPL/. */
/* */
/* Software distributed under the License is distributed on an "AS IS" */
/* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See */
/* the License for the specific language governing rights and limitations */
/* under the License. */
/* */
/* The Original Code is: all this file. */
/* */
/* The Initial Developer of the Original Code is Florent Georges. */
/* */
/* Contributor(s): none. */
/* ------------------------------------------------------------------------ */