Removed all files that do not match StringList.

This commit is contained in:
Christian P. MOMON 2017-05-01 22:42:28 +02:00
parent 9477e61b67
commit 182528b8f5
54 changed files with 6 additions and 7298 deletions

View file

@ -1,9 +1,9 @@
# DEVINSY Utils
# DEVINSY Strings
GeoNames is geographical database under a creative commons attribution license.
DEVINSY Strings is an util
FlatDB4GeoNames provides an easy, local and fast Java access to GeoNames data.
DEVINSY String provides an easy, local and fast Java String List management.
## Author
Christian Pierre MOMON <christian.momon@devinsy.fr>
@ -13,7 +13,6 @@ This software is released under the GNU LGPL.
## Requirements
FlatDB4Geonames requires:
- Java 1.6
- Eclipse Kepler
@ -22,5 +21,5 @@ Several useful Java classes.
## Conclusion
Enjoy and use FlatDB4GeoNames. For questions, improvement, issues: christian.momon@devinsy.fr
Enjoy and use DEVINSY Strings. For questions, improvement, issues: christian.momon@devinsy.fr

View file

@ -1,3 +1,3 @@
product.name=devinsy-utils
product.name=devinsy-strings
product.revision.major=0
product.revision.minor=4

View file

@ -1,500 +0,0 @@
/**
* Copyright (C) 2005-2010, 2013, 2015-2016 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.cmdexec;
import java.util.ArrayList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fr.devinsy.util.cmdexec.StreamGobbler.StreamWay;
import fr.devinsy.util.strings.StringListUtils;
/**
* We must use the isOver method on Gobblers because with short tasks the
* waitFor ends before the Gobbler read.
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class CmdExec
{
private static Logger logger = LoggerFactory.getLogger(CmdExec.class);
private int exitValue;
private String out;
private String err;
// ////////////////////////////////////////////////////////////////////
//
// ////////////////////////////////////////////////////////////////////
/**
*
*/
public CmdExec(final String command)
{
run(command, StreamGobbler.StreamWay.BUFFER, StreamGobbler.StreamWay.BUFFER);
}
/**
*
*/
public CmdExec(final String... command)
{
run(command, StreamGobbler.StreamWay.BUFFER, StreamGobbler.StreamWay.BUFFER);
}
/**
*
*/
public CmdExec(final String command, final StreamGobbler outputGobbler, final StreamGobbler errorGobbler)
{
run(command, outputGobbler, errorGobbler);
}
/**
*
*/
public CmdExec(final String command, final StreamGobbler.StreamWay stdout, final StreamGobbler.StreamWay stderr)
{
run(command, stdout, stderr);
}
/**
*
*/
public CmdExec(final String[] command, final StreamGobbler outputGobbler, final StreamGobbler errorGobbler)
{
run(command, outputGobbler, errorGobbler);
}
/**
*
*/
public CmdExec(final String[] command, final StreamGobbler.StreamWay stdout, final StreamGobbler.StreamWay stderr)
{
run(command, stdout, stderr);
}
// ////////////////////////////////////////////////////////////////////
//
// ////////////////////////////////////////////////////////////////////
/**
*
* @return
*/
public String getErrStream()
{
String result;
result = this.err;
//
return (result);
}
/**
*
* @return
*/
public int getExitValue()
{
int result;
result = this.exitValue;
//
return (result);
}
/**
*
* @return
*/
public String getOutStream()
{
String result;
result = this.out;
//
return (result);
}
/**
*
* @param command
* : not a shell command, it must be a executable program.
* @param outputGobbler
* @param errorGobbler
* @return
*/
public int run(final String command, final StreamGobbler outputGobbler, final StreamGobbler errorGobbler)
{
int result;
logger.info("CmdExec(command) = [" + command + "]");
String[] commands = command.split("[ \t\n\r\f]");
result = run(commands, outputGobbler, errorGobbler);
//
return (result);
}
/**
*
*/
public int run(final String command, final StreamWay stdout, final StreamWay stderr)
{
int result;
result = run(command, new StreamGobbler("OUTPUT", stdout), new StreamGobbler("ERROR", stderr));
//
return (result);
}
/**
* Note: this code is inspired by an article of Michael C. Daconta published
* in JavaWorld Dec 29, 2000 (http://www.javaworld.com/article/2071275
* /core-java/when-runtime-exec---won-t.html?page=2).
*
* @param command
* not a shell command, it must be a executable program.
* @param outputGobbler
* @param errorGobbler
* @return
*/
public int run(final String[] command, final StreamGobbler outputGobbler, final StreamGobbler errorGobbler)
{
int result;
logger.info("CmdExec(command[]) = [" + StringListUtils.toStringSeparatedBy(command, " ") + "]");
logger.info("CmdExec(command[]) = [" + StringListUtils.toStringWithBrackets(command) + "]");
try
{
Runtime rt = Runtime.getRuntime();
Process process = rt.exec(command);
// Set a collector for error message.
errorGobbler.setInputStream(process.getErrorStream());
// Set a collector for output message.
outputGobbler.setInputStream(process.getInputStream());
// Collect messages.
errorGobbler.start();
outputGobbler.start();
// Wait and manage the exit value.
this.exitValue = process.waitFor();
logger.info("ExitValue: {}", this.exitValue);
// Sometimes, process ends before Gobblers read its outpout, so we
// must wait them.
while ((!outputGobbler.isOver()) || (!errorGobbler.isOver()))
{
Thread.sleep(1);
}
// Store messages.
this.out = outputGobbler.getStream();
this.err = errorGobbler.getStream();
result = this.exitValue;
}
catch (Exception exception)
{
this.err = exception.getMessage();
this.exitValue = -77;
result = this.exitValue;
logger.error(exception.getMessage(), exception);
}
//
return (result);
}
/**
*
* @param command
* @param stdout
* @param stderr
* @return
*/
public int run(final String[] command, final StreamGobbler.StreamWay stdout, final StreamGobbler.StreamWay stderr)
{
int result;
result = run(command, new StreamGobbler("OUTPUT", stdout), new StreamGobbler("ERROR", stderr));
//
return (result);
}
/**
*
* @param commands
* @return
* @throws CmdExecException
*/
public static String multirun(final String... commands) throws CmdExecException
{
String result;
ArrayList<String> stdouts = new ArrayList<String>(commands.length);
boolean ended = false;
int commandCounter = 0;
while (!ended)
{
if (commandCounter < commands.length)
{
String command = commands[commandCounter];
if ((command == null) || (command.length() == 0))
{
result = null;
commandCounter += 1;
}
else
{
stdouts.add(CmdExec.run(command));
commandCounter += 1;
}
}
else
{
ended = true;
result = null;
}
}
//
int resultLength = 0;
for (String stdout : stdouts)
{
resultLength += stdout.length();
}
StringBuffer buffer = new StringBuffer(resultLength);
for (String stdout : stdouts)
{
buffer.append(stdout);
}
result = buffer.toString();
//
return (result);
}
// ////////////////////////////////////////////////////////////////////
//
// ////////////////////////////////////////////////////////////////////
/**
* @throws CmdExecException
*/
public static String run(final String command) throws CmdExecException
{
String result;
result = CmdExec.run(command.split("[ \t\n\r\f]"));
//
return (result);
}
/**
* @throws CmdExecException
* @throws Exception
*/
public static String run(final String... command) throws CmdExecException
{
String result;
if ((command == null) || (command.length == 0))
{
throw new IllegalArgumentException("Empty command");
}
else
{
CmdExec cmd = new CmdExec(command, StreamGobbler.StreamWay.BUFFER, StreamGobbler.StreamWay.BUFFER);
if (cmd.getExitValue() == 0)
{
result = cmd.getOutStream();
}
else
{
logger.error("Command=\"" + StringListUtils.toStringWithBrackets(command));
logger.error("Command=\"[" + StringListUtils.toString(command) + "]\n out => [" + cmd.getOutStream() + "]\n " + "err => (" + cmd.getErrStream().length() + ")[" + cmd.getErrStream()
+ "]");
throw new CmdExecException(cmd.getErrStream());
}
}
//
return (result);
}
/**
* Examples:
*
* run("sudo", "setfacl", "-m", "g:cpm:rwX", "/tmp/toto");
*
* run("sudo", "setfacl", "-R", "-m", "g:cpm:rwX", "/tmp/toto");
*
* @throws CmdExecException
*/
public static String run(final String program1, final String program2, final String[] args, final int min, final int max) throws CmdExecException
{
String result;
//
boolean nullArg = false;
boolean ended = false;
int argumentIndex = 0;
while (!ended)
{
if (argumentIndex >= args.length)
{
ended = true;
nullArg = false;
}
else
{
if (args[argumentIndex] == null)
{
ended = true;
nullArg = true;
}
else
{
argumentIndex += 1;
}
}
}
//
if (program1 == null)
{
throw new IllegalArgumentException("Null program parameter 1 detected: [" + program1 + "].");
}
else if (program2 == null)
{
throw new IllegalArgumentException("Null program parameter 2 detected: [" + program2 + "].");
}
else if (nullArg)
{
throw new IllegalArgumentException("Null parameter detected in position " + argumentIndex + " for " + StringListUtils.toStringWithBrackets(args) + ".");
}
else if ((args.length < min) || (args.length > max))
{
throw new IllegalArgumentException("Bad number of parameters: " + args.length + " for " + StringListUtils.toStringWithBrackets(args) + ".");
}
else
{
//
String[] command = new String[args.length + 2];
command[0] = program1;
command[1] = program2;
for (argumentIndex = 0; argumentIndex < args.length; argumentIndex++)
{
command[argumentIndex + 2] = args[argumentIndex];
}
result = CmdExec.run(command);
}
//
return (result);
}
/**
* Examples:
*
* run("setfacl", "-m", "g:cpm:rwX", "/tmp/toto");
*
* run("setfacl", "-R", "-m", "g:cpm:rwX", "/tmp/toto");
*
* @throws CmdExecException
*/
public static String run(final String program, final String[] args, final int min, final int max) throws CmdExecException
{
String result;
//
boolean nullArg = false;
boolean ended = false;
int argumentCounter = 0;
while (!ended)
{
if (argumentCounter >= args.length)
{
ended = true;
nullArg = false;
}
else
{
if (args[argumentCounter] == null)
{
ended = true;
nullArg = true;
}
else
{
argumentCounter += 1;
}
}
}
//
if (program == null)
{
throw new IllegalArgumentException("Null program parameter detected: [" + program + "].");
}
else if (nullArg)
{
throw new IllegalArgumentException("Null parameter detected in position " + argumentCounter + " for " + StringListUtils.toStringWithBrackets(args) + ".");
}
else if ((args.length < min) || (args.length > max))
{
throw new IllegalArgumentException("Bad number of parameters: " + args.length + " for " + StringListUtils.toStringWithBrackets(args) + ".");
}
else
{
//
String[] command = new String[args.length + 1];
command[0] = program;
for (argumentCounter = 0; argumentCounter < args.length; argumentCounter++)
{
command[argumentCounter + 1] = args[argumentCounter];
}
result = CmdExec.run(command);
}
//
return (result);
}
}

View file

@ -1,65 +0,0 @@
/**
* Copyright (C) 2016 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.cmdexec;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*
*/
public class CmdExecException extends Exception
{
private static final long serialVersionUID = 3264886426311529668L;
/**
*
*/
public CmdExecException()
{
super();
}
/**
*
* @param message
*/
public CmdExecException(final String message)
{
super(message);
}
/**
*
* @param message
* @param cause
*/
public CmdExecException(final String message, final Throwable cause)
{
super(message, cause);
}
/**
*
* @param cause
*/
public CmdExecException(final Throwable cause)
{
super(cause);
}
}

View file

@ -1,196 +0,0 @@
/**
* Copyright (C) 2005-2008, 2010, 2013, 2016 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.cmdexec;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class StreamGobbler extends Thread
{
public enum StreamWay
{
NONE,
PRINT,
BUFFER
}
private static final Logger logger = LoggerFactory.getLogger(CmdExec.class);
private InputStream is;
private String name;
private StreamWay streamWay;
private StringBuffer stream;
// Important if the caller wants have complete stream in case of very short
// command.
private boolean isOverStatus;
/**
*
*/
StreamGobbler()
{
this.is = null;
this.name = "";
this.streamWay = StreamWay.NONE;
this.stream = new StringBuffer();
this.isOverStatus = false;
}
/**
*
* @param is
* @param name
*/
StreamGobbler(final InputStream is, final String name)
{
this.is = is;
this.name = name;
this.streamWay = StreamWay.NONE;
this.stream = new StringBuffer();
this.isOverStatus = false;
}
/**
*
* @param is
* @param name
* @param streamWay
*/
StreamGobbler(final InputStream is, final String name, final StreamWay streamWay)
{
this.is = is;
this.name = name;
this.streamWay = streamWay;
this.stream = new StringBuffer();
this.isOverStatus = false;
}
/**
*
* @param type
* @param streamWay
*/
StreamGobbler(final String type, final StreamWay streamWay)
{
this.name = type;
this.streamWay = streamWay;
this.stream = new StringBuffer();
this.isOverStatus = false;
}
/**
*
* @return
*/
public String getStream()
{
String result;
if (this.stream != null)
{
result = this.stream.toString();
}
else
{
result = null;
}
//
return (result);
}
/**
*
* @return
*/
public boolean isOver()
{
boolean result;
result = this.isOverStatus;
//
return (result);
}
/**
*
*/
@Override
public void run()
{
try
{
InputStreamReader isr = new InputStreamReader(this.is);
BufferedReader buffer = new BufferedReader(isr);
String line = null;
switch (this.streamWay)
{
case NONE:
while ((line = buffer.readLine()) != null)
{
;
}
break;
case PRINT:
while ((line = buffer.readLine()) != null)
{
System.out.println(this.name + ">" + line);
}
break;
case BUFFER:
while ((line = buffer.readLine()) != null)
{
this.stream.append(line + "\n");
}
break;
default:
logger.warn("unknow way for stream");
}
}
catch (IOException exception)
{
logger.error(exception.getMessage(), exception);
}
this.isOverStatus = true;
}
/**
*
* @param is
*/
public void setInputStream(final InputStream is)
{
this.is = is;
}
}

View file

@ -1,214 +0,0 @@
/**
* Copyright (C) 2013-2014 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.rss;
import java.util.HashMap;
import java.util.Locale;
import fr.devinsy.util.strings.StringList;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class RSSCache
{
private static RSSCache instance = new RSSCache();
private HashMap<String, String> cache;
/**
*
*/
private RSSCache()
{
this.cache = new HashMap<String, String>();
}
/**
*
* @param key
* @param locale
* @return
*/
public String get(final String name)
{
return get(name, Locale.ROOT);
}
/**
*
* @param name
* @param locale
* @return
*/
public String get(final String name, final Locale locale)
{
String result;
if (name == null)
{
throw new NullPointerException("name is null.");
}
else if (locale == null)
{
result = get(name, Locale.ROOT);
}
else
{
result = this.cache.get(key(name, locale));
if (result == null)
{
result = this.cache.get(name);
}
}
return result;
}
/**
*
* @param name
* @param locale
* @return
*/
private String key(final String name, final Locale locale)
{
String result;
if (locale.getLanguage().length() == 0)
{
result = name;
}
else
{
result = name + "_" + locale.getLanguage();
}
//
return result;
}
/**
*
* @param key
* @param locale
* @param rss
*/
public void put(final String name, final Locale locale, final String rss)
{
if (name == null)
{
throw new NullPointerException("name is null.");
}
else if (locale == null)
{
put(name, Locale.ROOT, rss);
}
else
{
this.cache.put(key(name, locale), rss);
}
}
/**
*
* @param name
* @param locale
* @param rss
*/
public void put(final String name, final String rss)
{
put(name, Locale.ROOT, rss);
}
/**
*
* @param name
*/
public void remove(final String name)
{
remove(name, Locale.ROOT);
}
/**
*
* @param name
*/
public void remove(final String name, final Locale locale)
{
if (name == null)
{
throw new NullPointerException("key is null.");
}
else
{
this.cache.remove(name + "-" + locale.getLanguage());
}
}
/**
*
* @param key
*/
public void setOudated(final String name)
{
for (String subkey : subkeys(name))
{
if (subkey.startsWith(name))
{
this.cache.remove(subkey);
}
}
}
/**
*
* @param key
*/
public StringList subkeys(final String name)
{
StringList result;
//
result = new StringList();
//
for (String key : this.cache.keySet())
{
if (key.startsWith(name))
{
result.add(key);
}
}
//
return result;
}
/**
*
* @return
*/
public static RSSCache instance()
{
return instance;
}
}

View file

@ -1,154 +0,0 @@
/**
* Copyright (C) 2013-2014 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.rss;
import org.joda.time.DateTime;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class RSSElement
{
public static final String DATE_PATTERN = "dd MMM YYYY hh:mm:ss Z";
private String name;
private String value;
private String[] attributes;
/**
*
* @param name
* @param value
*/
public RSSElement(final String name, final DateTime value)
{
setName(name);
if (value == null)
{
this.value = null;
}
else
{
this.value = value.toString(DATE_PATTERN);
}
this.attributes = null;
}
/**
*
* @param name
* @param value
*/
public RSSElement(final String name, final long value)
{
setName(name);
this.value = String.valueOf(value);
this.attributes = null;
}
/**
*
* @param name
* @param value
*/
public RSSElement(final String name, final long value, final String... attributes)
{
setName(name);
this.value = String.valueOf(value);
this.attributes = attributes;
}
/**
*
* @param name
* @param value
*/
public RSSElement(final String name, final String value)
{
setName(name);
this.value = value;
this.attributes = null;
}
/**
*
* @param name
* @param value
*/
public RSSElement(final String name, final String value, final String... attributes)
{
setName(name);
this.value = value;
this.attributes = attributes;
}
public String[] getAttributes()
{
return this.attributes;
}
/**
*
* @return
*/
public String getName()
{
return this.name;
}
/**
*
* @return
*/
public String getValue()
{
return this.value;
}
public void setAttributes(final String[] attributes)
{
this.attributes = attributes;
}
/**
*
* @param name
*/
public void setName(final String name)
{
if (name == null)
{
throw new NullPointerException("name is null");
}
else
{
this.name = name;
}
}
/**
*
* @param value
*/
public void setValue(final String value)
{
this.value = value;
}
}

View file

@ -1,172 +0,0 @@
/**
* Copyright (C) 2013-2014 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.rss;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import fr.devinsy.util.xml.XMLWriter;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class RSSWriter
{
private XMLWriter out;
/**
*
* @param file
* @throws FileNotFoundException
* @throws UnsupportedEncodingException
*/
public RSSWriter(final File file) throws UnsupportedEncodingException, FileNotFoundException
{
this.out = new XMLWriter(file);
writeRSSHeader();
}
/**
*
* @param target
* @throws UnsupportedEncodingException
*/
public RSSWriter(final OutputStream target) throws UnsupportedEncodingException
{
this.out = new XMLWriter(target);
writeRSSHeader();
}
/**
*
* @param target
* @throws UnsupportedEncodingException
*/
public RSSWriter(final Writer target) throws UnsupportedEncodingException
{
this.out = new XMLWriter(target);
writeRSSHeader();
}
/**
*
*/
public void close() throws IOException
{
if (this.out != null)
{
this.out.writeEndTag("channel");
this.out.writeEndTag("rss");
this.out.close();
}
}
/**
*
*/
public void flush() throws IOException
{
if (this.out != null)
{
this.out.flush();
}
}
/**
*
*/
public void writeChannel(final String title, final String link, final String description, final RSSElement... elements)
{
//
this.out.writeStartTag("channel");
//
this.out.writeTag("title", title);
this.out.writeTag("link", link);
this.out.writeTag("description", description);
//
if ((elements != null) && (elements.length > 0))
{
for (RSSElement element : elements)
{
this.out.writeTag(element.getName(), element.getValue(), element.getAttributes());
}
}
}
/**
*
* @param comment
*/
public void writeComment(final String comment)
{
this.out.writeComment(comment);
}
/**
*
*/
public void writeItem(final String title, final String link, final String description, final RSSElement... elements)
{
//
this.out.writeStartTag("item");
//
this.out.writeTag("title", title);
if (link != null)
{
this.out.writeTag("link", link);
}
if (description == null)
{
this.out.writeTag("description", "n/a");
}
else
{
this.out.writeTag("description", description);
}
//
if ((elements != null) && (elements.length > 0))
{
for (RSSElement element : elements)
{
this.out.writeTag(element.getName(), element.getValue(), element.getAttributes());
}
}
//
this.out.writeEndTag("item");
}
/**
*
*/
private void writeRSSHeader()
{
this.out.writeXMLHeader();
this.out.writeStartTag("rss", "version", "2.0");
}
}

View file

@ -1,134 +0,0 @@
/**
* Copyright (C) 2006-2010, 2013-2014 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.unix;
import java.io.File;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class CachedFile
{
public enum Status
{
NOT_LOAD, EXPIRED, UPDATED
}
private static final Logger logger = LoggerFactory.getLogger(CachedFile.class);
protected String sourceName;
protected long sourceTime;
protected Status status;
/**
*
*/
public CachedFile(final String fileName)
{
this.sourceName = fileName;
this.sourceTime = 0;
this.status = Status.NOT_LOAD;
}
/**
*
*/
protected File getSourceFile()
{
File result;
if (this.sourceName == null)
{
result = null;
}
else
{
File source = new File(this.sourceName);
if (!source.exists())
{
logger.error("source file defined but not found");
result = null;
}
else
{
result = source;
}
}
//
return (result);
}
/**
*
*/
protected Status getStatus()
{
Status result;
File source = getSourceFile();
if (source == null)
{
this.status = Status.NOT_LOAD;
}
else if (this.sourceTime != source.lastModified())
{
this.status = Status.EXPIRED;
}
result = this.status;
//
return (result);
}
/**
*
*/
public void setNotLoad()
{
this.status = Status.NOT_LOAD;
}
/**
*
*/
public void setUpdated()
{
File source = getSourceFile();
if (source == null)
{
this.status = Status.NOT_LOAD;
}
else
{
this.sourceTime = source.lastModified();
this.status = Status.UPDATED;
}
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,200 +0,0 @@
/**
* Copyright (C) 2006-2010, 2013-2014 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.unix;
import java.util.Vector;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class EtcGroupFile extends CachedFile
{
// static private final Logger logger =
// LoggerFactory.getLogger(EtcGroupFile.class);
private static EtcGroupFile instance = null;
protected Groups groups;
/**
*
*/
protected EtcGroupFile()
{
super("/etc/group");
this.groups = null;
}
/*
*
*/
public boolean contains(final String name)
{
boolean result;
Groups groups = updatedGroups();
if (groups == null)
{
result = false;
}
else
{
result = groups.contains(name);
}
//
return (result);
}
/**
*
*/
public Group get(final int gid)
{
Group result;
Groups groups = updatedGroups();
if (groups == null)
{
result = null;
}
else
{
result = groups.getByGid(gid);
}
//
return (result);
}
/**
*
*/
public Group get(final String name)
{
Group result;
Groups groups = updatedGroups();
if (groups == null)
{
result = null;
}
else
{
result = groups.getByName(name);
}
//
return (result);
}
/**
*
*/
public Vector<String> getLoginGroups(final String login)
{
Vector<String> result;
Groups groups = updatedGroups();
result = groups.getLoginGroups(login);
//
return (result);
}
/**
*
*/
public String getLoginGroupsString(final String login)
{
String result;
this.groups = updatedGroups();
result = this.groups.getLoginGroupsString(login);
//
return (result);
}
/**
*
*/
@Override
public String toString()
{
String result;
result = this.groups.toString();
//
return (result);
}
/**
*
*/
protected Groups updatedGroups()
{
Groups result;
if (getStatus() != Status.UPDATED)
{
this.groups = EtcGroupFileReader.load();
if (this.groups == null)
{
setNotLoad();
}
else
{
setUpdated();
}
}
result = this.groups;
//
return (result);
}
/**
*
*/
static public EtcGroupFile instance()
{
EtcGroupFile result;
if (EtcGroupFile.instance == null)
{
EtcGroupFile.instance = new EtcGroupFile();
}
result = EtcGroupFile.instance;
//
return (result);
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,102 +0,0 @@
/**
* Copyright (C) 2006-2010, 2013-2014 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.unix;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class EtcGroupFileReader
{
private static final Logger logger = LoggerFactory.getLogger(EtcGroupFileReader.class);
/**
*
*/
public static Groups load()
{
Groups result;
BufferedReader file;
try
{
file = new BufferedReader(new FileReader("/etc/group"));
}
catch (FileNotFoundException exception)
{
logger.error("File not found");
file = null;
}
if (file == null)
{
result = null;
}
else
{
result = new Groups();
try
{
String line;
while ((line = file.readLine()) != null)
{
String[] tokens = line.split(":");
Group group = new Group();
group.setName(tokens[0]);
group.setPassword(tokens[1]);
group.setGid((new Integer(tokens[2])).intValue());
// Manage the case of empty shell.
if (tokens.length == 4)
{
String[] tokensBis = tokens[3].split(",");
for (int tokenCounter = 0; tokenCounter < tokensBis.length; tokenCounter++)
{
group.addMember(tokensBis[tokenCounter]);
}
}
result.add(group);
}
file.close();
}
catch (java.io.IOException exception)
{
logger.error("Exception here.");
result = null;
}
}
//
return (result);
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,186 +0,0 @@
/**
* Copyright (C) 2006-2010, 2013-2014 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.unix;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class EtcPasswdFile extends CachedFile
{
private static final Logger logger = LoggerFactory.getLogger(EtcPasswdFile.class);
private static EtcPasswdFile instance = null;
protected Users users;
/**
*
*/
protected EtcPasswdFile()
{
super("/etc/passwd");
this.users = null;
}
/*
*
*/
public boolean contains(final String login)
{
boolean result;
Users users = updatedUsers();
if (users == null)
{
result = false;
}
else
{
result = users.contains(login);
}
//
return (result);
}
/**
*
*/
public User get(final int uid)
{
User result;
Users users = updatedUsers();
if (users == null)
{
result = null;
}
else
{
result = users.getByUid(uid);
}
//
return (result);
}
/**
*
*/
public User get(final String login)
{
User result;
Users users = updatedUsers();
if (users == null)
{
result = null;
}
else
{
result = users.getByLogin(login);
}
//
return (result);
}
/**
*
*/
@Override
public String toString()
{
String result;
result = this.users.toString();
//
return (result);
}
/**
*
*/
protected Users update()
{
Users result;
logger.debug("updating");
this.users = EtcPasswdFileReader.load();
if (this.users == null)
{
setNotLoad();
}
else
{
setUpdated();
}
result = this.users;
//
return (result);
}
/**
*
*/
protected Users updatedUsers()
{
Users result;
if (getStatus() != Status.UPDATED)
{
update();
}
result = this.users;
//
return (result);
}
/**
*
*/
public static EtcPasswdFile instance()
{
EtcPasswdFile result;
if (EtcPasswdFile.instance == null)
{
EtcPasswdFile.instance = new EtcPasswdFile();
}
result = EtcPasswdFile.instance;
//
return (result);
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,105 +0,0 @@
/**
* Copyright (C) 2006-2010, 2013-2014 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.unix;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class EtcPasswdFileReader
{
private static final Logger logger = LoggerFactory.getLogger(EtcPasswdFileReader.class);
/**
*
*/
public static Users load()
{
Users result;
BufferedReader file;
try
{
file = new BufferedReader(new FileReader("/etc/passwd"));
}
catch (FileNotFoundException exception)
{
logger.error("File not found");
file = null;
}
if (file == null)
{
result = null;
}
else
{
result = new Users();
try
{
String line;
while ((line = file.readLine()) != null)
{
String[] tokens = line.split(":");
User user = new User();
user.setLogin(tokens[0]);
user.setPassword(tokens[1]);
user.setUid((new Integer(tokens[2])).intValue());
user.setGid((new Integer(tokens[3])).intValue());
user.setRealName(tokens[4]);
user.setHomeDirectory(tokens[5]);
// Manage the case of empty shell.
if (tokens.length == 7)
{
user.setShell(tokens[6]);
}
else
{
user.setShell("");
}
result.add(user);
}
file.close();
}
catch (java.io.IOException exception)
{
logger.error("Exception here.");
result = null;
}
}
//
return (result);
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,223 +0,0 @@
/**
* Copyright (C) 2006-2010, 2013-2014 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.unix;
import java.util.Vector;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class Group
{
// static private final Logger logger =
// LoggerFactory.getLogger(Group.class);
/*
* /usr/include/grp.h
*
* The group structure.
* struct group
* {
* char *gr_name; Group name.
* char *gr_passwd; Password.
* __gid_t gr_gid; Group ID.
* char **gr_mem; Member list.
* };
*/
protected String name;
protected String password;
protected int gid;
protected Vector<String> members;
/**
*
*/
public Group()
{
this.name = null;
this.password = null;
this.gid = -1;
this.members = new Vector<String>();
}
/**
*
*/
public void addMember(final String login)
{
if ((login != null) && (login.length() != 0))
{
this.members.add(login);
}
}
/**
*
*/
public int getGid()
{
int result;
result = this.gid;
//
return (result);
}
/**
*
*/
public Vector<String> getMembers()
{
Vector<String> result;
result = this.members;
//
return (result);
}
/**
*
*/
public String getName()
{
String result;
result = this.name;
//
return (result);
}
/**
*
*/
public String getPassword()
{
String result;
result = this.password;
//
return (result);
}
/**
*
*/
public int gid()
{
int result;
result = this.gid;
//
return (result);
}
/**
*
*/
public Vector<String> members()
{
Vector<String> result;
result = this.members;
//
return (result);
}
/**
*
*/
public String name()
{
String result;
result = this.name;
//
return (result);
}
/**
*
*/
public String passwd()
{
String result;
result = this.password;
//
return (result);
}
/**
*
*/
public void setGid(final int gid)
{
this.gid = gid;
}
/**
*
*/
public void setName(final String name)
{
this.name = name;
}
/**
*
*/
public void setPasswd(final String password)
{
this.password = password;
}
/**
*
*/
public void setPassword(final String password)
{
this.password = password;
}
/**
*
*/
@Override
public String toString()
{
String result;
result = "|" + this.name + "|" + this.password + "|" + this.gid + "|" + this.members + "|";
//
return (result);
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,233 +0,0 @@
/**
* Copyright (C) 2006-2010, 2013-2014 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.unix;
import java.util.Iterator;
import java.util.Vector;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class Groups extends Vector<Group>
{
private static final long serialVersionUID = 5802487312198869603L;
// static private final Logger logger =
// LoggerFactory.getLogger(Groups.class);
/**
*
*/
public Groups()
{
super();
}
/*
*
*/
public boolean contains(final int gid)
{
boolean result;
if (getByGid(gid) == null)
{
result = false;
}
else
{
result = true;
}
//
return (result);
}
/*
*
*/
public boolean contains(final String name)
{
boolean result;
if (getByName(name) == null)
{
result = false;
}
else
{
result = true;
}
//
return (result);
}
/**
*
*/
public Group getByGid(final int gid)
{
Group result;
result = null;
boolean ended = false;
Iterator<Group> iterator = this.iterator();
while (!ended)
{
if (iterator.hasNext())
{
Group group = iterator.next();
if (group.getGid() == gid)
{
ended = true;
result = group;
}
}
else
{
ended = true;
result = null;
}
}
//
return (result);
}
/**
*
*/
public Group getByName(final String name)
{
Group result;
if (name == null)
{
result = null;
}
else
{
result = null;
boolean ended = false;
Iterator<Group> iterator = this.iterator();
while (!ended)
{
if (iterator.hasNext())
{
Group group = iterator.next();
if (group.getName().equals(name))
{
ended = true;
result = group;
}
}
else
{
ended = true;
result = null;
}
}
}
//
return (result);
}
/**
*
*/
public Vector<String> getLoginGroups(final String login)
{
Vector<String> result;
result = new Vector<String>();
Iterator<Group> iterator = this.iterator();
while (iterator.hasNext())
{
Group group = iterator.next();
if (group.members().contains(login))
{
result.add(group.getName());
}
}
//
return (result);
}
/**
*
*/
public String getLoginGroupsString(final String login)
{
String result;
Vector<String> groups = getLoginGroups(login);
StringBuffer string = new StringBuffer();
for (String group : groups)
{
if (string.length() == 0)
{
string.append(group);
}
else
{
string.append(",");
string.append(group);
}
}
result = string.toString();
//
return (result);
}
/**
*
*/
@Override
public String toString()
{
String result;
StringBuffer out = new StringBuffer();
Iterator<Group> iterator = this.iterator();
while (iterator.hasNext())
{
out.append(iterator.next().toString() + "\n");
}
result = out.toString();
//
return (result);
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,597 +0,0 @@
/**
* Copyright (C) 2006-2010, 2013-2015 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.unix;
import java.io.File;
import java.util.Vector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fr.devinsy.util.cmdexec.CmdExec;
import fr.devinsy.util.strings.StringListUtils;
import fr.devinsy.util.unix.acl.Acl;
import fr.devinsy.util.unix.acl.AclManager;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class Unix
{
private static final Logger logger = LoggerFactory.getLogger(Unix.class);
public static final String SUDO = "/usr/bin/sudo";
/**
*
*/
public static void appendToFile(final String text, final String path) throws Exception
{
if ((text == null) || (text.length() == 0) || (path == null) || (path.length() == 0))
{
throw new Exception("Parameter undefined: [" + text + "][" + path + "].");
}
else
{
try
{
CmdExec.run(SUDO, "bash", "-c", "echo \"" + text + "\" >> " + path);
}
catch (Exception exception)
{
throw new Exception("Error detected appending text to file [" + path + "].", exception);
}
}
}
/**
*
*/
public static void chmod(final String changes, final String path) throws Exception
{
if ((changes == null) || (changes.length() == 0) || (path == null) || (path.length() == 0))
{
throw new Exception("Parameter undefined: [" + changes + "][" + path + "].");
}
else if (!new File(path).exists())
{
throw new Exception("Path not found: [" + path + "].");
}
else
{
try
{
CmdExec.run(SUDO, "chmod", changes, path);
}
catch (Exception exception)
{
throw new Exception("Error running chmod command for [" + changes + "][" + path + "].", exception);
}
}
}
/**
*
*/
public static void clearAcl(final String id, final String filePathName) throws Exception
{
AclManager.clearId(id, filePathName);
}
/**
*
*/
public static void clearAclGroup(final String group, final String filePathName) throws Exception
{
AclManager.clearGroup(group, filePathName);
}
/**
*
*/
public static void clearAclUser(final String login, final String filePathName) throws Exception
{
AclManager.clearUser(login, filePathName);
}
/**
*
*/
public static void createUserAccount(final String login) throws Exception
{
if ((login == null) || (login.length() == 0))
{
throw new Exception("Login parameter undefined.");
}
else
{
createUserAccount(login, login);
}
}
/**
*
*/
public static void createUserAccount(final String login, final String name) throws Exception
{
if ((login == null) || (login.length() == 0))
{
throw new Exception("Login parameter undefined.");
}
else if ((name == null) || (name.length() == 0))
{
throw new Exception("Name parameter undefined.");
}
else
{
createUserAccount(login, name, "/home/" + login);
}
}
/**
*
*/
public static void createUserAccount(final String login, final String name, final String home) throws Exception
{
if ((login == null) || (login.length() == 0))
{
throw new Exception("Login parameter undefined.");
}
else if ((name == null) || (name.length() == 0))
{
throw new Exception("Name parameter undefined.");
}
else if ((home == null) || (home.length() == 0))
{
throw new Exception("Home parameter undefined.");
}
else
{
try
{
logger.info("Creating user account for [" + login + "].");
CmdExec.run(SUDO, "/usr/sbin/useradd", "-m", "-c", name, "-d", home, login);
EtcPasswdFile.instance().update();
logger.info("User account created for [" + login + "].");
}
catch (Exception exception)
{
throw new Exception("Error detected creating user account [" + login + "].", exception);
}
}
}
/**
*
*/
public static void createUserAccount(final String login, final String name, final String home, final String password) throws Exception
{
if ((password == null) || (password.length() == 0))
{
throw new Exception("Password parameter undefined.");
}
else if (Unix.isLogin(login))
{
throw new Exception("Login [" + login + "] already in use");
}
else
{
createUserAccount(login, name, home);
setPassword(login, password);
}
}
/**
*
*/
public static void deleteGroup(final String group) throws Exception
{
if ((group == null) || (group.length() == 0))
{
throw new Exception("Group parameter undefined.");
}
else
{
try
{
logger.info("Deleting group for [" + group + "].");
CmdExec.run(SUDO + " groupdel " + group);
logger.info("Group deleted for [" + group + "].");
}
catch (Exception exception)
{
throw new Exception("Error running groupdel command for group [" + group + "].", exception);
}
}
}
/**
*
*/
public static void deleteUserAccount(final String login) throws Exception
{
if ((login == null) || (login.length() == 0))
{
throw new Exception("Login parameter undefined.");
}
else
{
try
{
logger.info("Deleting user account for [" + login + "].");
CmdExec.run(SUDO + " /usr/sbin/userdel " + login);
logger.info("User account delted for [" + login + "].");
}
catch (Exception exception)
{
throw new Exception("Error running userdel command for login [" + login + "].", exception);
}
}
}
/**
*
*/
public static String getAclData(final String filePathName) throws Exception
{
String result;
result = AclManager.getAclData(filePathName);
//
return (result);
}
/**
*
*/
public static String[] getAclUsers(final String filePathName) throws Exception
{
String[] result;
Acl acl = AclManager.getAcl(filePathName);
result = acl.currentAcl().getUserIds();
//
return (result);
}
/**
*
*/
public static boolean isGroup(final String groupName)
{
boolean result;
result = EtcGroupFile.instance().contains(groupName);
//
return (result);
}
/**
*
*/
public static boolean isLogin(final String login)
{
boolean result;
result = EtcPasswdFile.instance().contains(login);
//
return (result);
}
/**
*
*/
public static void link(final String sourcePath, final String targetPath) throws Exception
{
logger.info("[" + sourcePath + "][" + targetPath + "]");
if ((sourcePath == null) || (sourcePath.length() == 0) || (targetPath == null) || (targetPath.length() == 0))
{
throw new Exception("Parameter undefined: [" + sourcePath + "][" + targetPath + "].");
}
else
{
File sourceFile = new File(sourcePath);
File targetFile = new File(targetPath);
if (!sourceFile.exists())
{
throw new Exception("Source does not exist: [" + sourcePath + "].");
}
else if ((targetFile.exists()) && (!targetFile.isDirectory()))
{
throw new Exception("Target already exists: [" + targetPath + "].");
}
else
{
try
{
CmdExec.run(SUDO, "ln", "-s", sourcePath, targetPath);
}
catch (Exception exception)
{
throw new Exception("Error detected linking [" + sourcePath + "][" + targetPath + "].", exception);
}
}
}
}
/**
*
*/
public static void modifyLogin(final String sourceLogin, final String targetLogin, final String sourceHomeDirectory) throws Exception
{
logger.info("Starting login modifying: [" + sourceLogin + "] -> [" + targetLogin + "]");
if ((sourceLogin == null) || (sourceLogin.length() == 0))
{
throw new Exception("Original login parameters undefined");
}
else if ((targetLogin == null) || (targetLogin.length() == 0))
{
throw new Exception("New login parameters undefined");
}
else if (!Unix.isLogin(sourceLogin))
{
throw new Exception("Original login unknow: [" + sourceLogin + "].");
}
else if (Unix.isLogin(targetLogin))
{
throw new Exception("New login unknow: [" + targetLogin + "].");
}
else if (sourceHomeDirectory == null)
{
throw new Exception("sourceHomeDirectory parameter undefined, thus no home directory move.");
}
else if (!new File(sourceHomeDirectory).exists())
{
throw new Exception("Source home directory does not exist: [" + sourceHomeDirectory + "].");
}
else
{
String targetHomeDirectory = new File(sourceHomeDirectory).getParent().toString() + "/" + targetLogin;
if (new File(targetHomeDirectory).exists())
{
throw new Exception("Target home directory already exists: [" + targetHomeDirectory + "].");
}
else
{
try
{
logger.info("Login modifying: [" + sourceLogin + "] -> [" + targetLogin + "]");
CmdExec.run(SUDO + " usermod -l " + targetLogin + " " + sourceLogin);
logger.info("Login modified: [" + sourceLogin + "] -> [" + targetLogin + "]");
}
catch (Exception exception)
{
throw new Exception("Login modification failed for [" + sourceLogin + "].", exception);
}
try
{
logger.info("Renaming home directory: [" + sourceHomeDirectory + "] -> [" + targetLogin + "]");
CmdExec.run(SUDO + " mv " + sourceHomeDirectory + " " + targetHomeDirectory);
logger.info("Home directory renamed: [" + sourceHomeDirectory + "] -> [" + targetLogin + "]");
}
catch (Exception exception)
{
throw new Exception("Home directory rename failed for [" + sourceHomeDirectory + "].", exception);
}
}
}
logger.info("Login modifying done: [" + sourceLogin + "] -> [" + targetLogin + "]");
}
/**
*
*/
public static void recursiveChmod(final String changes, final String path) throws Exception
{
if ((changes == null) || (changes.length() == 0) || (path == null) || (path.length() == 0))
{
throw new Exception("Parameter undefined: [" + changes + "][" + path + "].");
}
else if (!new File(path).exists())
{
throw new Exception("Path not found: [" + path + "].");
}
else
{
try
{
CmdExec.run(SUDO, "chmod", "-R", changes, path);
}
catch (Exception exception)
{
throw new Exception("Error running recursive chmod command for [" + changes + "][" + path + "].", exception);
}
}
}
/**
*
*/
public static void renameGroup(final String sourceGroup, final String targetGroup) throws Exception
{
logger.info("Starting group renaming: [" + sourceGroup + "] -> [" + targetGroup + "]");
if ((sourceGroup == null) || (sourceGroup.length() == 0))
{
throw new Exception("Original group name parameters undefined");
}
else if ((targetGroup == null) || (targetGroup.length() == 0))
{
throw new Exception("New group name parameters undefined");
}
else if (!Unix.isGroup(sourceGroup))
{
throw new Exception("Original group unknow: [" + sourceGroup + "].");
}
else if (Unix.isGroup(targetGroup))
{
throw new Exception("New group unknow: [" + targetGroup + "].");
}
else
{
try
{
logger.info("Login modifying: [" + sourceGroup + "] -> [" + targetGroup + "]");
CmdExec.run(SUDO + " groupmod -n " + targetGroup + " " + sourceGroup);
logger.info("Login modified: [" + sourceGroup + "] -> [" + targetGroup + "]");
}
catch (Exception exception)
{
throw new Exception("Group renaming failed for [" + sourceGroup + "].", exception);
}
}
logger.info("Group renaming done: [" + sourceGroup + "] -> [" + targetGroup + "]");
}
/**
*
*/
public static Group searchGroup(final String groupName)
{
Group result;
result = EtcGroupFile.instance().get(groupName);
//
return (result);
}
/**
*
*/
public static User searchLogin(final String login)
{
User result;
result = EtcPasswdFile.instance().get(login);
//
return (result);
}
/**
*
*/
public static Vector<String> searchLoginGroups(final String login)
{
Vector<String> result;
result = EtcGroupFile.instance().getLoginGroups(login);
//
return (result);
}
/**
*
*/
public static void setfacl(final String... args) throws Exception
{
try
{
CmdExec.run(SUDO, "setfacl", args, 1, 6);
}
catch (Exception exception)
{
throw new Exception("Error running setfacl command for " + StringListUtils.toStringWithBrackets(args) + ":" + exception.getMessage() + ".", exception);
}
}
/**
* As 'passwd' command has not the option '--stdin' in all systems (eg.
* Debian), this method uses the 'chpasswd' command.
*/
public static void setPassword(final String login, final String newPassword) throws Exception
{
if ((login == null) || (login.length() == 0))
{
throw new Exception("Login parameter undefined.");
}
else if (newPassword == null)
{
throw new Exception("New password parameter undefined.");
}
else
{
try
{
logger.info("Password setting for [" + login + "].");
CmdExec.run(SUDO, "bash", "-c", "echo \"" + login + ":" + newPassword + "\"| chpasswd ");
logger.info("Password set for [" + login + "].");
}
catch (Exception exception)
{
throw new Exception("Error detected on setting of the new password for [" + login + "].", exception);
}
}
}
/**
* chfn [ -f full-name ] [ username ]
*/
public static void setRealName(final String login, final String newRealName) throws Exception
{
if ((login == null) || (login.length() == 0))
{
throw new Exception("Login parameter undefined.");
}
else if (newRealName == null)
{
throw new Exception("New real name parameter undefined.");
}
else
{
try
{
logger.info("Real name changing for user [" + login + "].");
CmdExec.run(SUDO, "chfn", "-f", newRealName, login);
EtcPasswdFile.instance().update();
logger.info("Real name changed for user [" + login + "].");
}
catch (Exception exception)
{
throw new Exception("Error detected on setting of the new real name for [" + login + "].", exception);
}
}
}
/**
*
*/
public static void unlink(final String filePathName) throws Exception
{
logger.info("[" + filePathName + "]");
if (filePathName == null)
{
throw new Exception("Parameter undefined: [" + filePathName + "].");
}
else
{
new File(filePathName).delete();
}
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,355 +0,0 @@
/**
* Copyright (C) 2006-2010, 2013-2014 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.unix;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class User
{
// private static final Logger logger = LoggerFactory.getLogger(User.class);
/*
* /usr/include/pwd.h
*
* The passwd structure.
* struct passwd
* {
* char *pw_name;D Username.
* char *pw_passwd; Password.
* __uid_t pw_uid; User ID.
* __gid_t pw_gid; Group ID.
* char *pw_gecos; Real name.
* char *pw_dir; Home directory.
* char *pw_shell; Shell program.
* };
*/
protected String login;
protected String password;
protected int uid;
protected int gid;
protected String realName;
protected String homeDirectory;
protected String shell;
/**
*
*/
public User()
{
this.login = null;
this.password = null;
this.uid = -1;
this.gid = -1;
this.realName = null;
this.homeDirectory = null;
this.shell = null;
}
/**
*
*/
public User(final User user)
{
this.login = user.login();
this.password = user.passwd();
this.uid = user.uid();
this.gid = user.gid();
this.realName = user.realName();
this.homeDirectory = user.homeDirectory();
this.shell = user.shell();
}
/**
*
*/
public int getGid()
{
int result;
result = this.gid;
//
return (result);
}
/**
*
*/
public String getHomeDirectory()
{
String result;
result = this.homeDirectory;
//
return (result);
}
/**
*
*/
public String getLogin()
{
String result;
result = this.login;
//
return (result);
}
/**
*
*/
public String getPasswd()
{
String result;
result = this.password;
//
return (result);
}
/**
*
*/
public String getPassword()
{
String result;
result = this.password;
//
return (result);
}
/**
*
*/
public String getRealName()
{
String result;
result = this.realName;
//
return (result);
}
/**
*
*/
public String getShell()
{
String result;
result = this.shell;
//
return (result);
}
/**
*
*/
public int getUid()
{
int result;
result = this.uid;
//
return (result);
}
/**
*
*/
public int gid()
{
int result;
result = this.gid;
//
return (result);
}
/**
*
*/
public String homeDirectory()
{
String result;
result = this.homeDirectory;
//
return (result);
}
/**
*
*/
public String login()
{
String result;
result = this.login;
//
return (result);
}
/**
*
*/
public String passwd()
{
String result;
result = this.password;
//
return (result);
}
/**
*
*/
public String realName()
{
String result;
result = this.realName;
//
return (result);
}
/**
*
*/
public void setGid(final int gid)
{
this.gid = gid;
}
/**
*
*/
public void setHomeDirectory(final String homeDirectory)
{
this.homeDirectory = homeDirectory;
}
/**
*
*/
public void setLogin(final String login)
{
this.login = login;
}
/**
*
*/
public void setPasswd(final String password)
{
this.password = password;
}
/**
*
*/
public void setPassword(final String password)
{
this.password = password;
}
/**
*
*/
public void setRealName(final String realName)
{
this.realName = realName;
}
/**
*
*/
public void setShell(final String shell)
{
this.shell = shell;
}
/**
*
*/
public void setUid(final int uid)
{
this.uid = uid;
}
/**
*
*/
public String shell()
{
String result;
result = this.shell;
//
return (result);
}
/**
*
*/
@Override
public String toString()
{
String result;
result = "|" + this.login + "|" + this.password + "|" + this.uid + "|" + this.gid + "|" + this.realName + "|" + this.homeDirectory + "|" + this.shell + "|";
//
return (result);
}
/**
*
*/
public int uid()
{
int result;
result = this.uid;
//
return (result);
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,179 +0,0 @@
/**
* Copyright (C) 2006-2010, 2013-2014 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.unix;
import java.util.Iterator;
import java.util.Vector;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class Users extends Vector<User>
{
private static final long serialVersionUID = -7178304512851592399L;
// private static final Logger logger =
// LoggerFactory.getLogger(Users.class);
/**
*
*/
public Users()
{
super();
}
/*
*
*/
public boolean contains(final int uid)
{
boolean result;
if (getByUid(uid) == null)
{
result = false;
}
else
{
result = true;
}
//
return (result);
}
/*
*
*/
public boolean contains(final String login)
{
boolean result;
if (getByLogin(login) == null)
{
result = false;
}
else
{
result = true;
}
//
return (result);
}
/**
*
*/
public User getByLogin(final String login)
{
User result;
if (login == null)
{
result = null;
}
else
{
result = null;
boolean ended = false;
Iterator<User> iterator = this.iterator();
while (!ended)
{
if (iterator.hasNext())
{
User user = iterator.next();
if (user.getLogin().equals(login))
{
ended = true;
result = user;
}
}
else
{
ended = true;
result = null;
}
}
}
//
return (result);
}
/**
*
*/
public User getByUid(final int uid)
{
User result;
result = null;
boolean ended = false;
Iterator<User> iterator = this.iterator();
while (!ended)
{
if (iterator.hasNext())
{
User user = iterator.next();
if (user.getUid() == uid)
{
ended = true;
result = user;
}
}
else
{
ended = true;
result = null;
}
}
//
return (result);
}
/**
*
*/
@Override
public String toString()
{
String result;
StringBuffer out;
out = new StringBuffer();
Iterator<User> iterator = this.iterator();
while (iterator.hasNext())
{
out.append(iterator.next().toString() + "\n");
}
result = out.toString();
//
return (result);
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,216 +0,0 @@
/**
* Copyright (C) 2010, 2013-2014 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.unix.acl;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class Acl
{
// private static final Logger logger = LoggerFactory.getLogger(Acl.class);
/*
# file: goo39
# owner: goo39
# group: goo39
user::rwx
user:cpm:rwx #effective:rwx
user:goo39:rwx #effective:rwx
group::--- #effective:---
group:goo40:rwx #effective:rwx
mask::rwx
other::---
default:user::rwx
default:user:cpm:rwx #effective:rwx
default:group::--- #effective:---
default:group:cpm:rwx #effective:rwx
default:group:goo40:rwx #effective:rwx
default:mask::rwx
default:other::---
*/
protected String filePathname;
protected String owner;
protected String group;
protected AclEntries currentAcl;
protected AclEntries defaultAcl;
/**
*
*/
public Acl(final String filePathname)
{
this.filePathname = filePathname;
this.owner = "";
this.group = "";
this.currentAcl = new AclEntries();
this.defaultAcl = new AclEntries();
}
/**
*
*/
public boolean contains(final AclEntry.Type type, final String id)
{
boolean result;
if ((this.currentAcl().contains(type, id)) || (this.defaultAcl().contains(type, id)))
{
result = true;
}
else
{
result = false;
}
//
return (result);
}
/**
*
*/
public boolean containsGroup(final String group)
{
boolean result;
result = contains(AclEntry.Type.GROUP, group);
//
return (result);
}
/**
*
*/
public boolean containsId(final String id)
{
boolean result;
if ((containsUser(id) || containsGroup(id)))
{
result = true;
}
else
{
result = false;
}
//
return (result);
}
/**
*
*/
public boolean containsUser(final String login)
{
boolean result;
result = contains(AclEntry.Type.USER, login);
//
return (result);
}
/**
*
*/
public AclEntries currentAcl()
{
AclEntries result;
result = this.currentAcl;
//
return (result);
}
/**
*
*/
public AclEntries defaultAcl()
{
AclEntries result;
result = this.defaultAcl;
//
return (result);
}
/**
*
*/
public String filePathname()
{
String result;
result = this.filePathname;
//
return (result);
}
/**
*
*/
public String group()
{
String result;
result = this.group;
//
return (result);
}
/**
*
*/
public String owner()
{
String result;
result = this.owner;
//
return (result);
}
/**
*
*/
public void setGroup(final String group)
{
this.group = group;
}
/**
*
*/
public void setOwner(final String owner)
{
this.owner = owner;
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,216 +0,0 @@
/**
* Copyright (C) 2010, 2013-2014 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.unix.acl;
import java.util.Iterator;
import java.util.Vector;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class AclEntries extends Vector<AclEntry>
{
private static final long serialVersionUID = 5802487312198869603L;
// private static final Logger logger =
// LoggerFactory.getLogger(AclEntries.class);
/**
*
*/
public AclEntries()
{
super();
}
/*
*
*/
public boolean contains(final AclEntry.Type type, final String id)
{
boolean result;
if (this.get(type, id) == null)
{
result = false;
}
else
{
result = true;
}
//
return (result);
}
/**
*
*/
public boolean containsId(final String id)
{
boolean result;
if ((this.get(AclEntry.Type.USER, id) == null) && (this.get(AclEntry.Type.GROUP, id) == null))
{
result = false;
}
else
{
result = true;
}
//
return (result);
}
/**
*
*/
public AclEntry get(final AclEntry.Type type, final String id)
{
AclEntry result;
result = null;
boolean ended = false;
Iterator<AclEntry> iterator = this.iterator();
while (!ended)
{
if (iterator.hasNext())
{
AclEntry entry = iterator.next();
if ((type == entry.type()) && (entry.id().equals(id)))
{
ended = true;
result = entry;
}
}
else
{
ended = true;
result = null;
}
}
//
return (result);
}
/**
*
*/
public String[] getGroupIds()
{
String[] result;
Vector<String> ids = new Vector<String>();
for (AclEntry entry : this)
{
if ((entry.type == AclEntry.Type.GROUP) && (!ids.contains(entry.id())))
{
ids.add(entry.id());
}
}
result = (String[]) ids.toArray();
//
return (result);
}
/**
*
*/
public String[] getIds()
{
String[] result;
Vector<String> ids = new Vector<String>();
for (AclEntry entry : this)
{
if (!ids.contains(entry.id()))
{
ids.add(entry.id());
}
}
result = (String[]) ids.toArray();
//
return (result);
}
/**
*
*/
public String[] getUserIds()
{
String[] result;
//
Vector<String> ids = new Vector<String>();
for (AclEntry entry : this)
{
if ((entry.type == AclEntry.Type.USER) && (!ids.contains(entry.id())))
{
ids.add(entry.id());
}
}
//
result = new String[ids.size()];
for (int nId = 0; nId < ids.size(); nId++)
{
result[nId] = ids.get(nId);
}
//
return (result);
}
/**
*
*/
@Override
public String toString()
{
String result;
StringBuffer out;
out = new StringBuffer();
Iterator<AclEntry> iterator = this.iterator();
while (iterator.hasNext())
{
out.append(iterator.next().toString() + "\n");
}
result = out.toString();
//
return (result);
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,113 +0,0 @@
/**
* Copyright (C) 2010, 2013-2014 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.unix.acl;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class AclEntry
{
// private static final Logger logger =
// LoggerFactory.getLogger(AclEntry.class);
/*
user::rwx
user:cpm:rwx #effective:rwx
user:goo39:rwx #effective:rwx
group::--- #effective:---
group:goo40:rwx #effective:rwx
mask::rwx
other::---
*/
public enum Type
{
NONE, USER, GROUP, MASK, OTHER
};
protected Type type;
protected String id;
protected String permission;
/**
*
*/
public AclEntry(final Type type, final String id, final String permission)
{
this.type = type;
this.id = id;
this.permission = permission;
}
/**
*
*/
public String id()
{
String result;
result = this.id;
//
return (result);
}
/**
*
*/
public String permission()
{
String result;
result = this.type.toString() + ":" + this.id + ":" + this.permission;
//
return (result);
}
/**
*
*/
@Override
public String toString()
{
String result;
result = this.permission;
//
return (result);
}
/**
*
*/
public Type type()
{
Type result;
result = this.type;
//
return (result);
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,424 +0,0 @@
/**
* Copyright (C) 2010, 2013-2015 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.unix.acl;
import java.io.File;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fr.devinsy.util.cmdexec.CmdExec;
import fr.devinsy.util.strings.StringListUtils;
import fr.devinsy.util.unix.Unix;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class AclManager
{
private static final Logger logger = LoggerFactory.getLogger(AclManager.class);
public static final String SUDO = "/usr/bin/sudo";
final static public Pattern USER_PATTERN = Pattern.compile("^user:(.*):(.*)$");
final static public Pattern GROUP_PATTERN = Pattern.compile("^group:(.*):(.*)$");
final static public Pattern MASK_PATTERN = Pattern.compile("^mask:(.*):(.*)$");
final static public Pattern OTHER_PATTERN = Pattern.compile("^other:(.*):(.*)$");
final static public Pattern DEFAULT_USER_PATTERN = Pattern.compile("^default:user:(.*):(.*)$");
final static public Pattern DEFAULT_GROUP_PATTERN = Pattern.compile("^default:group:(.*):(.*)$");
final static public Pattern DEFAULT_MASK_PATTERN = Pattern.compile("^default:mask:(.*):(.*)$");
final static public Pattern DEFAULT_OTHER_PATTERN = Pattern.compile("^default:other:(.*):(.*)$");
/**
*
*/
public static void clearGroup(final String group, final String filePathName) throws Exception
{
if ((group == null) || (group.length() == 0) || (filePathName == null) || (filePathName.length() == 0))
{
throw new Exception("Bad parameters [" + group + "][" + filePathName + "].");
}
else
{
Unix.setfacl("-R", "-L", "-x", "group:" + group, filePathName);
Unix.setfacl("-R", "-L", "-d", "-x", "group:" + group, filePathName);
}
}
/**
*
*/
public static void clearId(final String id, final String filePathName) throws Exception
{
clearUser(id, filePathName);
clearGroup(id, filePathName);
}
/**
*
*/
public static void clearUser(final String login, final String filePathName) throws Exception
{
if ((login == null) || (login.length() == 0) || (filePathName == null) || (filePathName.length() == 0))
{
throw new Exception("Bad parameters [" + login + "][" + filePathName + "].");
}
else
{
Unix.setfacl("-R", "-L", "-x", "user:" + login, filePathName);
Unix.setfacl("-R", "-L", "-d", "-x", "user:" + login, filePathName);
}
}
/**
*
*/
public static Acl getAcl(final String filePathName) throws Exception
{
Acl result;
result = new Acl(filePathName);
String[] entries = getAclEntryLines(filePathName);
// Login pattern: "^[a-z_][a-z0-9_-]*$".
logger.debug("Line=[" + entries[1] + "]");
Matcher matcher = Pattern.compile("^#\\sowner:\\s([a-z_][a-z0-9_-]*)$").matcher(entries[1]);
if (matcher.matches())
{
logger.debug("group=[" + matcher.group(1) + "]");
result.setOwner(matcher.group(1));
}
// Group pattern: "^[a-z_][a-z0-9_-]*$".
logger.debug("Line=[" + entries[2] + "]");
matcher = Pattern.compile("^#\\sgroup:\\s([a-z_][a-z0-9_-]*)$").matcher(entries[2]);
if (matcher.matches())
{
logger.debug("group=[" + matcher.group(1) + "]");
result.setOwner(matcher.group(1));
}
for (int nEntry = 3; nEntry < entries.length; nEntry++)
{
String entryLine = entries[nEntry];
logger.debug("Line=[" + entryLine + "]");
//
Matcher userMatcher = USER_PATTERN.matcher(entryLine);
Matcher groupMatcher = GROUP_PATTERN.matcher(entryLine);
Matcher maskMatcher = MASK_PATTERN.matcher(entryLine);
Matcher otherMatcher = OTHER_PATTERN.matcher(entryLine);
Matcher defaultUserMatcher = DEFAULT_USER_PATTERN.matcher(entryLine);
Matcher defaultGroupMatcher = DEFAULT_GROUP_PATTERN.matcher(entryLine);
Matcher defaultMaskMatcher = DEFAULT_MASK_PATTERN.matcher(entryLine);
Matcher defaultOtherMatcher = DEFAULT_OTHER_PATTERN.matcher(entryLine);
AclEntry entry;
if (userMatcher.matches())
{
entry = new AclEntry(AclEntry.Type.USER, userMatcher.group(1), userMatcher.group(2));
result.currentAcl().add(entry);
}
else if (groupMatcher.matches())
{
entry = new AclEntry(AclEntry.Type.GROUP, groupMatcher.group(1), groupMatcher.group(2));
result.currentAcl().add(entry);
}
else if (maskMatcher.matches())
{
entry = new AclEntry(AclEntry.Type.MASK, maskMatcher.group(1), maskMatcher.group(2));
result.currentAcl().add(entry);
}
else if (otherMatcher.matches())
{
entry = new AclEntry(AclEntry.Type.OTHER, otherMatcher.group(1), otherMatcher.group(2));
result.currentAcl().add(entry);
}
else if (defaultUserMatcher.matches())
{
entry = new AclEntry(AclEntry.Type.USER, defaultUserMatcher.group(1), defaultUserMatcher.group(2));
result.defaultAcl().add(entry);
}
else if (defaultGroupMatcher.matches())
{
entry = new AclEntry(AclEntry.Type.GROUP, defaultGroupMatcher.group(1), defaultGroupMatcher.group(2));
result.defaultAcl().add(entry);
}
else if (defaultMaskMatcher.matches())
{
entry = new AclEntry(AclEntry.Type.MASK, defaultMaskMatcher.group(1), defaultMaskMatcher.group(2));
result.defaultAcl().add(entry);
}
else if (defaultOtherMatcher.matches())
{
entry = new AclEntry(AclEntry.Type.OTHER, defaultOtherMatcher.group(1), defaultOtherMatcher.group(2));
result.defaultAcl().add(entry);
}
else
{
throw new Exception("Unknow ACL entry line pattern for [" + entryLine + "].");
}
logger.debug("Acl entry decoded: [" + entry.toString() + "]");
}
//
return (result);
}
/**
*
*/
public static String getAclData(final String filePathName) throws Exception
{
String result;
try
{
logger.info("Getting Acl data for [" + filePathName + "].");
result = CmdExec.run(SUDO, "/usr/bin/getfacl", "--no-effective", filePathName);
logger.info("Acl data got for [" + filePathName + "].");
}
catch (Exception exception)
{
throw new Exception("Error getting ACL for [" + filePathName + "].", exception);
}
//
return (result);
}
/**
*
*/
public static String[] getAclEntryLines(final String filePathName)
{
String[] result;
try
{
result = getAclData(filePathName).split("\n");
}
catch (Exception exception)
{
result = new String[0];
}
//
return (result);
}
/**
*
*/
public static boolean isUsed(final AclEntry.Type type, final String id, final String filePathName) throws Exception
{
boolean result;
result = isUsed(type, id, filePathName, 0);
//
return (result);
}
/**
*
*/
public static boolean isUsed(final AclEntry.Type type, final String id, final String filePathName, final int depth) throws Exception
{
boolean result;
if ((type == null) || (id == null) || (id.length() == 0) || (filePathName == null) || (filePathName.length() == 0) || (depth < 0))
{
throw new Exception("Bad parameter: [" + type + "][" + id + "][" + filePathName + "][" + depth + "].");
}
else
{
File file = new File(filePathName);
if (!file.exists())
{
throw new Exception("File does not exist [" + filePathName + "].");
}
else
{
Acl acl = getAcl(filePathName);
if (acl.contains(type, id))
{
result = true;
}
else if ((file.isDirectory()) && (depth > 0))
{
result = isUsed(type, id, filePathName, file.list(), depth - 1);
}
else
{
result = false;
}
}
}
//
return (result);
}
/**
*
*/
public static boolean isUsed(final AclEntry.Type type, final String id, final String filePath, final String[] filePathNames, final int depth) throws Exception
{
boolean result;
result = false;
boolean ended = false;
int nLine = 0;
while (!ended)
{
if (nLine < filePathNames.length)
{
String filePathName = filePathNames[nLine];
if (isUsed(type, id, filePath + "/" + filePathName, depth))
{
ended = true;
result = true;
}
else
{
nLine += 1;
}
}
else
{
ended = true;
result = false;
}
}
//
return (result);
}
/**
*
*/
public static boolean isUsed(final String id, final String filePathName) throws Exception
{
boolean result;
result = isUsed(id, filePathName, 0);
//
return (result);
}
/**
*
*/
public static boolean isUsed(final String id, final String filePathName, final int depth) throws Exception
{
boolean result;
if ((id == null) || (id.length() == 0) || (filePathName == null) || (filePathName.length() == 0) || (depth < 0))
{
throw new Exception("Bad parameter: [" + id + "][" + filePathName + "][" + depth + "].");
}
else
{
File file = new File(filePathName);
if (!file.exists())
{
throw new Exception("File does not exist [" + filePathName + "].");
}
else
{
Acl acl = getAcl(filePathName);
if (acl.containsId(id))
{
result = true;
}
else if ((file.isDirectory()) && (depth > 0))
{
result = isUsed(id, file.list(), depth - 1);
}
else
{
result = false;
}
}
}
//
return (result);
}
/**
*
*/
public static boolean isUsed(final String id, final String[] filePathNames, final int depth) throws Exception
{
boolean result;
result = false;
boolean ended = false;
int nLine = 0;
while (!ended)
{
if (nLine < filePathNames.length)
{
String filePathName = filePathNames[nLine];
if (isUsed(id, filePathName, depth))
{
ended = true;
result = true;
}
else
{
nLine += 1;
}
}
else
{
ended = true;
result = false;
}
}
//
return (result);
}
/**
*
*/
public static void setfacl(final String... args) throws Exception
{
try
{
CmdExec.run(SUDO, "setfacl", args, 1, 5);
}
catch (Exception exception)
{
throw new Exception("Error running setfacl command for " + StringListUtils.toStringWithBrackets(args) + ":" + exception.getMessage() + ".");
}
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,160 +0,0 @@
/**
* Copyright (C) 2013-2014 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.xml;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.xml.stream.events.Attribute;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class XMLAttributes extends HashMap<String, Attribute> implements Iterable<Attribute>
{
private static final long serialVersionUID = 8456469741805779474L;
/**
*
*/
public XMLAttributes()
{
super();
}
/**
*
*/
public XMLAttributes(final int capacity)
{
super(capacity);
}
/**
*
*/
public XMLAttributes(final Iterator<Attribute> source)
{
super();
if (source != null)
{
while (source.hasNext())
{
Attribute attribute = source.next();
add(attribute);
}
}
}
/**
*
*/
public XMLAttributes(final XMLAttributes source)
{
super();
addAll(source);
}
/**
*
* @param attribute
*/
public void add(final Attribute attribute)
{
if (attribute != null)
{
put(attribute.getName().getLocalPart(), attribute);
}
}
/**
*
* @param source
*/
public void addAll(final XMLAttributes source)
{
for (Attribute attribute : source)
{
this.add(attribute);
}
}
/**
*
* @param label
* @return
*/
public Attribute getByLabel(final String label)
{
Attribute result;
result = get(label);
//
return result;
}
/**
*
*/
@Override
public Iterator<Attribute> iterator()
{
Iterator<Attribute> result;
result = this.values().iterator();
//
return result;
}
/**
*
* @return
*/
public Set<String> labels()
{
Set<String> result;
result = this.keySet();
//
return result;
}
/**
*
* @return
*/
public List<Attribute> toList()
{
List<Attribute> result;
result = new ArrayList<Attribute>(values());
//
return result;
}
}

View file

@ -1,81 +0,0 @@
/**
* Copyright (C) 2013-2014 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.xml;
import org.slf4j.helpers.MessageFormatter;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class XMLBadFormatException extends Exception
{
private static final long serialVersionUID = 768256303984176512L;
/**
*
* @param code
* @param message
*/
public XMLBadFormatException(final String message)
{
super(message);
}
/**
*
* @param code
* @param message
* @param exception
*/
public XMLBadFormatException(final String message, final Exception exception)
{
super(message, exception);
}
/**
*
* @param format
* @param arguments
*/
public XMLBadFormatException(final String format, final Object... arguments)
{
this(MessageFormatter.arrayFormat(format, arguments).getMessage());
}
/**
*
* @param message
* @param cause
*/
public XMLBadFormatException(final String message, final Throwable cause)
{
super(message, cause);
}
/**
*
* @param cause
*/
public XMLBadFormatException(final Throwable cause)
{
super(cause);
}
}

View file

@ -1,617 +0,0 @@
/**
* Copyright (C) 2013-2014 Christian Pierre MOMON
* Copyright (C) 2017 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.xml;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.InputStream;
import java.io.Reader;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.XMLEvent;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fr.devinsy.util.strings.StringList;
import fr.devinsy.util.xml.XMLTag.TagType;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class XMLReader
{
private static final Logger logger = LoggerFactory.getLogger(XMLReader.class);
protected XMLEventReader in;
private XMLEvent nextEvent;
/**
*
*/
protected XMLReader()
{
this.in = null;
this.nextEvent = null;
}
/**
*
* @param file
* @throws XMLStreamException
* @throws FileNotFoundException
*/
public XMLReader(final File file) throws FileNotFoundException, XMLStreamException
{
this.nextEvent = null;
XMLInputFactory factory = XMLInputFactory.newInstance();
this.in = factory.createXMLEventReader(new FileInputStream(file), "UTF-8");
}
/**
*
* @param target
* @throws XMLStreamException
*/
public XMLReader(final InputStream source) throws XMLStreamException
{
this.nextEvent = null;
XMLInputFactory factory = XMLInputFactory.newInstance();
this.in = factory.createXMLEventReader(source);
}
/**
*
* @param target
* @throws XMLStreamException
*/
public XMLReader(final Reader source) throws XMLStreamException
{
this.nextEvent = null;
XMLInputFactory factory = XMLInputFactory.newInstance();
this.in = factory.createXMLEventReader(source);
}
/**
* @throws XMLStreamException
*/
public void close() throws XMLStreamException
{
if (this.in != null)
{
this.in.close();
}
}
/**
* This methods does a premonition act. Useful to detect end of a list.
*
* @param label
* @return
* @throws XMLStreamException
*/
public boolean hasNextStartTag(final String label) throws XMLStreamException
{
boolean result;
// Load next event.
if (this.nextEvent == null)
{
if (this.in.hasNext())
{
this.nextEvent = this.in.nextEvent();
}
}
// Analyze next event.
if (this.nextEvent == null)
{
result = false;
}
else if ((this.nextEvent.isStartElement()) && (StringUtils.equals(this.nextEvent.asStartElement().getName().getLocalPart(), label)))
{
result = true;
}
else
{
result = false;
}
//
return result;
}
/**
*
* @param label
* @return
* @throws XMLBadFormatException
* @throws XMLStreamException
*/
public XMLTag readContentTag(final String label) throws XMLBadFormatException, XMLStreamException
{
XMLTag result;
//
result = readTag();
//
if (result == null)
{
throw new XMLBadFormatException("XML file ends prematurely, content tag [" + label + "] is expected.");
}
else if (result.getType() != TagType.CONTENT)
{
throw new XMLBadFormatException("Content tag [" + label + "] is missing.");
}
else if (!StringUtils.equals(label, result.getLabel()))
{
throw new XMLBadFormatException("Tag with label [" + label + "] is missing.");
}
//
return result;
}
/**
*
* @param label
* @return
* @throws XMLStreamException
* @throws XMLBadFormatException
*/
public XMLTag readEndTag(final String label) throws XMLStreamException, XMLBadFormatException
{
XMLTag result;
//
result = readTag();
//
if (result == null)
{
throw new XMLBadFormatException("XML file ends prematurely, end tag [" + label + "] is expected.");
}
else if (result.getType() != TagType.END)
{
throw new XMLBadFormatException("End tag [" + label + "] is missing.");
}
else if (!StringUtils.equals(result.getLabel(), label))
{
throw new XMLBadFormatException("Tag with label [" + label + "] is missing.");
}
//
return result;
}
/**
*
* @param label
* @return
* @throws XMLStreamException
* @throws XMLBadFormatException
* @throws Exception
*/
public XMLTag readListTag(final String label) throws XMLStreamException, XMLBadFormatException
{
XMLTag result;
//
result = readTag();
//
if (result == null)
{
throw new XMLBadFormatException("XML file ends prematurely, tag [" + label + "] is expected.");
}
else if ((result.getType() != TagType.START) && (result.getType() != TagType.EMPTY))
{
throw new XMLBadFormatException("List tag [" + label + "] is missing.");
}
else if (!StringUtils.equals(label, result.getLabel()))
{
throw new XMLBadFormatException("Tag with label [" + label + "] is missing.");
}
//
return result;
}
/**
*
* @param label
* @return
* @throws XMLStreamException
* @throws XMLBadFormatException
* @throws Exception
*/
public XMLTag readNullableContentTag(final String label) throws XMLStreamException, XMLBadFormatException
{
XMLTag result;
//
result = readTag();
//
if (result == null)
{
throw new XMLBadFormatException("XML file ends prematurely, tag [" + label + "] is expected.");
}
else if (!StringUtils.equals(label, result.getLabel()))
{
throw new XMLBadFormatException("Nullable content tag [" + label + "] is missing.");
}
else if ((result.getType() != TagType.EMPTY) && (result.getType() != TagType.CONTENT))
{
throw new XMLBadFormatException("Nullable content tag [" + label + "] is missing.");
}
//
return result;
}
/**
*
* @param label
* @return
* @throws XMLStreamException
* @throws XMLBadFormatException
* @throws Exception
*/
public XMLTag readNullableStartTag(final String label) throws XMLStreamException, XMLBadFormatException
{
XMLTag result;
//
result = readTag();
//
if (result == null)
{
throw new XMLBadFormatException("XML file ends prematurely, start tag [" + label + "] is expected.");
}
else if ((result.getType() != TagType.START) && (result.getType() != TagType.EMPTY))
{
throw new XMLBadFormatException("Start tag [" + label + "] is missing.");
}
else if (!StringUtils.equals(result.getLabel(), label))
{
throw new XMLBadFormatException("Tag with label [" + label + "] is missing.");
}
//
return result;
}
/**
*
* @param label
* @return
* @throws XMLStreamException
* @throws XMLBadFormatException
* @throws Exception
*/
public XMLTag readStartTag(final String label) throws XMLStreamException, XMLBadFormatException
{
XMLTag result;
//
result = readTag();
//
if (result == null)
{
throw new XMLBadFormatException("XML file ends prematurely, start tag [" + label + "] is expected.");
}
else if (result.getType() != TagType.START)
{
throw new XMLBadFormatException("Start tag [" + label + "] is missing.");
}
else if (!StringUtils.equals(result.getLabel(), label))
{
throw new XMLBadFormatException("Tag with label [" + label + "] is missing.");
}
//
return result;
}
/**
* Transducer graph :
* <ul>
* <li>START_DOCUMENT => HEADER TAG
* <li>START_ELEMENT(X) + START_ELEMENT(Y) => <X><Y> => START TAG
* <li>START_ELEMENT(X) + CHARACTERS(C) + START_ELEMENT(Y) => <X>SPACES<Y>=>
* START TAG
* <li>START_ELEMENT(X) + CHARACTERS(C) + END_ELEMENT(X) => <X>C</X> =>
* CONTENT TAG
* <li>START_ELEMENT(X) + END_ELEMENT(X) => <X></X> => <X/> => EMPTY
* <li>END_ELEMENT(X) => </X> => END TAG
* <li>END_DOCUMENT => FOOTER TAG
* </ul>
*
* @throws XMLStreamException
* @throws XMLBadFormatException
*
*/
public XMLTag readTag() throws XMLStreamException, XMLBadFormatException
{
XMLTag result;
int level = 1;
boolean ended = false;
result = null;
XMLAttributes attributesBuffer = null;
QName nameBuffer = null;
StringList contentBuffer = null;
while (!ended)
{
//
XMLEvent event;
if (this.nextEvent != null)
{
event = this.nextEvent;
this.nextEvent = null;
}
else if (this.in.hasNext())
{
event = this.in.nextEvent();
}
else
{
event = null;
}
if (event == null)
{
ended = true;
result = null;
}
else
{
logger.debug("eventType=" + XMLTools.toString(event));
switch (level)
{
case 1:
switch (event.getEventType())
{
case XMLEvent.START_DOCUMENT:
// START_DOCUMENT => START DOCUMENT TAG
ended = true;
result = new XMLTag(null, TagType.HEADER, null);
break;
case XMLEvent.START_ELEMENT:
// START_ELEMENT(X) => ...
nameBuffer = event.asStartElement().getName();
attributesBuffer = new XMLAttributes(event.asStartElement().getAttributes());
level += 1;
break;
case XMLEvent.END_ELEMENT:
// END_ELEMENT(X) => </X> => END TAG
ended = true;
result = new XMLTag(event.asEndElement().getName(), TagType.END, null);
break;
case XMLEvent.END_DOCUMENT:
// END_DOCUMENT => END DOCUMENT TAG
ended = true;
result = new XMLTag(null, TagType.FOOTER, null);
break;
}
break;
case 2:
switch (event.getEventType())
{
case XMLEvent.START_ELEMENT:
// START_ELEMENT(X) + START_ELEMENT(Y) => <X><Y>
// => START TAG
ended = true;
result = new XMLTag(nameBuffer, TagType.START, attributesBuffer);
this.nextEvent = event;
break;
case XMLEvent.CHARACTERS:
// START_ELEMENT(X) + CHARACTERS(C) => ...
contentBuffer = new StringList(50);
contentBuffer.append(event.asCharacters().getData());
level += 1;
break;
case XMLEvent.END_ELEMENT:
// START_ELEMENT(X) + END_ELEMENT(X) => <X></X>
// => <X/> => EMPTY
ended = true;
result = new XMLTag(nameBuffer, TagType.EMPTY, attributesBuffer);
break;
default:
throw new XMLBadFormatException("Unexpected XMLEvent [" + event.getEventType() + "].");
}
break;
case 3:
switch (event.getEventType())
{
case XMLEvent.START_ELEMENT:
// START_ELEMENT(X) + CHARACTERS(C) +
// START_ELEMENT(Y) =>
// <X>SPACES<Y> => START TAG
ended = true;
result = new XMLTag(nameBuffer, TagType.START, attributesBuffer);
this.nextEvent = event;
break;
case XMLEvent.CHARACTERS:
// START_ELEMENT(X) + CHARACTERS(C1) +
// CHARACTERS(C2)=> ...
contentBuffer.append(event.asCharacters().getData());
break;
case XMLEvent.END_ELEMENT:
// START_ELEMENT(X) + CHARACTERS(C) +
// END_ELEMENT(X) => <X>C</X>
// => CONTENT TAG
ended = true;
result = new XMLTag(nameBuffer, TagType.CONTENT, attributesBuffer);
result.setContent(contentBuffer.toString());
break;
default:
throw new XMLBadFormatException("Unexpected XMLEvent [" + event.getEventType() + "].");
}
break;
default:
throw new XMLBadFormatException("Unexpected level [" + level + "].");
}
}
}
logger.debug("=> " + XMLTools.toString(result));
//
return result;
}
/**
*
* @param label
* @return
* @throws XMLStreamException
* @throws XMLBadFormatException
*/
public XMLTag readXMLFooter() throws XMLStreamException, XMLBadFormatException
{
XMLTag result;
//
result = readTag();
//
if (result == null)
{
throw new XMLBadFormatException("XML file ends prematurely, end document event is expected.");
}
else if (result.getType() != TagType.FOOTER)
{
throw new XMLBadFormatException("End document tag is missing.");
}
//
return result;
}
/**
*
* @return
* @throws XMLException
* @throws XMLStreamException
* @throws XMLBadFormatException
*/
public XMLTag readXMLHeader() throws XMLStreamException, XMLBadFormatException
{
XMLTag result;
//
result = readTag();
//
if (result == null)
{
throw new XMLBadFormatException("XML file ends prematurely, start document event is expected.");
}
else if (result.getType() != TagType.HEADER)
{
throw new XMLBadFormatException("XML header is missing.");
}
//
return result;
}
/**
*
* @param args
* @throws Exception
*/
public static void main(final String args[]) throws Exception
{
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLEventReader in = factory.createXMLEventReader(new FileReader("/home/cpm/C/Puck/Dev/Puck/test/TT/t3.puc"));
XMLEvent event;
while (in.hasNext())
{
event = in.nextEvent();
switch (event.getEventType())
{
case XMLEvent.ATTRIBUTE:
System.out.println("ATTRIBUTE ");
break;
case XMLEvent.CDATA:
System.out.println("CDATA");
break;
case XMLEvent.CHARACTERS:
System.out.println("CHARACTERS [" + event.asCharacters().getData() + "]");
break;
case XMLEvent.COMMENT:
System.out.println("COMMENT");
break;
case XMLEvent.DTD:
System.out.println("DTD");
break;
case XMLEvent.END_DOCUMENT:
System.out.println("END_DOCUMENT");
break;
case XMLEvent.END_ELEMENT:
System.out.println("END_ELEMENT " + event.asEndElement().getName());
break;
case XMLEvent.ENTITY_DECLARATION:
System.out.println("ENTITY_DECLARATION");
break;
case XMLEvent.ENTITY_REFERENCE:
System.out.println("ENTITY_REFERENCE");
break;
case XMLEvent.NAMESPACE:
System.out.println("NAMESPACE");
break;
case XMLEvent.NOTATION_DECLARATION:
System.out.println("NOTATION_DECLARATION");
break;
case XMLEvent.PROCESSING_INSTRUCTION:
System.out.println("PROCESSING_INSTRUCTION");
break;
case XMLEvent.SPACE:
System.out.println("SPACE");
break;
case XMLEvent.START_DOCUMENT:
System.out.println("START_DOCUMENT");
break;
case XMLEvent.START_ELEMENT:
System.out.println("START_ELEMENT [name=" + event.asStartElement().getName() + "][namespaceURI=" + event.asStartElement().getName().getNamespaceURI() + "][prefix="
+ event.asStartElement().getName().getPrefix() + "][localPart=" + event.asStartElement().getName().getLocalPart() + "]");
break;
default:
System.out.println("DEFAULT");
}
}
}
}

View file

@ -1,148 +0,0 @@
/**
* Copyright (C) 2013-2014 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.xml;
import javax.xml.namespace.QName;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class XMLTag
{
public enum TagType
{
HEADER, START, END, EMPTY, CONTENT, FOOTER
}
private QName name;
private TagType type;
private XMLAttributes attributes;
private String content;
/**
*
*/
public XMLTag(final QName name, final TagType type, final XMLAttributes attributes)
{
this.name = name;
this.type = type;
this.attributes = attributes;
this.content = null;
}
public XMLAttributes attributes()
{
return this.attributes;
}
public String getContent()
{
return this.content;
}
/**
*
* @return
*/
public String getLabel()
{
String result;
if (this.name == null)
{
result = "";
}
else
{
result = this.name.getLocalPart();
}
//
return result;
}
public QName getName()
{
return this.name;
}
/**
*
* @return
*/
public String getNamespaceURI()
{
String result;
if (this.name == null)
{
result = "";
}
else
{
result = this.name.getNamespaceURI();
}
//
return result;
}
/**
*
* @return
*/
public String getPrefix()
{
String result;
if (this.name == null)
{
result = "";
}
else
{
result = this.name.getPrefix();
}
//
return result;
}
public TagType getType()
{
return this.type;
}
public void setContent(final String content)
{
this.content = content;
}
public void setName(final QName name)
{
this.name = name;
}
public void setType(final TagType type)
{
this.type = type;
}
}

View file

@ -1,389 +0,0 @@
/**
* Copyright (C) 2013-2014 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.xml;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.ZipInputStream;
import javax.xml.stream.events.XMLEvent;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class XMLTools
{
/**
*
* @param source
* @return
*/
public static String escapeXmlBlank(final String source)
{
String result;
if (StringUtils.isBlank(source))
{
result = "";
}
else
{
result = StringEscapeUtils.escapeXml(source);
}
//
return result;
}
/**
*
*
* @param source
* @throws SAXException
* @throws IOException
* @throws PuckException
*/
public static boolean isValid(final File xmlFile, final File xsdFile) throws SAXException, IOException
{
boolean result;
//
InputStream xmlSource;
if (isZipFile(xmlFile))
{
ZipInputStream zin = new ZipInputStream(new FileInputStream(xmlFile));
zin.getNextEntry();
xmlSource = zin;
}
else
{
xmlSource = new FileInputStream(xmlFile);
}
//
result = isValid(xmlSource, new FileInputStream(xsdFile));
//
return result;
}
/**
*
*
* @param source
* @throws SAXException
* @throws IOException
* @throws PuckException
*/
public static boolean isValid(final File xmlFile, final InputStream xsdSource) throws SAXException, IOException
{
boolean result;
//
InputStream xmlSource;
if (isZipFile(xmlFile))
{
ZipInputStream zin = new ZipInputStream(new FileInputStream(xmlFile));
zin.getNextEntry();
xmlSource = zin;
}
else
{
xmlSource = new FileInputStream(xmlFile);
}
//
result = isValid(xmlSource, xsdSource);
//
return result;
}
/**
*
*
* @param source
* @throws SAXException
* @throws IOException
* @throws PuckException
*/
public static boolean isValid(final InputStream xmlSource, final InputStream xsdSource) throws SAXException, IOException
{
boolean result;
if (xmlSource == null)
{
result = false;
}
else
{
try
{
//
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
InputSource sourceentree = new InputSource(xsdSource);
SAXSource sourceXSD = new SAXSource(sourceentree);
Schema schema = factory.newSchema(sourceXSD);
Validator validator = schema.newValidator();
//
validator.validate(new StreamSource(xmlSource));
result = true;
}
catch (final IllegalArgumentException exception)
{
exception.printStackTrace();
result = false;
}
}
//
return result;
}
/**
*
* @param file
* @return
* @throws IOException
*/
public static boolean isZipFile(final File file) throws IOException
{
boolean result;
//
byte[] buffer = new byte[4];
FileInputStream is = null;
try
{
is = new FileInputStream(file);
is.read(buffer);
}
finally
{
if (is != null)
{
is.close();
}
}
// 50 4B 3 4
if ((buffer[0] == 0x50) && (buffer[1] == 0x4B) && (buffer[2] == 0x03) && (buffer[3] == 0x04))
{
result = true;
}
else
{
result = false;
}
//
return result;
}
/**
*
*/
public static String readTag(final BufferedReader in) throws Exception
{
String result;
Pattern TAG_PATTERN = Pattern.compile("^<([\\w-_\\.]+)>.*</([\\w-_\\.]+)>$");
Pattern SHORT_TAG_PATTERN = Pattern.compile("^<.+/>$");
result = in.readLine();
boolean ended = false;
while (!ended)
{
/*
* DEBUG Matcher tagMatcher2 = TAG_PATTERN.matcher(result); if
* (tagMatcher2.find()) { logger.info("group count,0,1,2 = [" +
* tagMatcher2.groupCount() + "][" + tagMatcher2.group(0) + "][" +
* tagMatcher2.group(1) + "][" + tagMatcher2.group(2) + "]"); }
*/
Matcher tagMatcher = TAG_PATTERN.matcher(result);
Matcher shortTagMatcher = SHORT_TAG_PATTERN.matcher(result);
if ((tagMatcher.find()) && (tagMatcher.groupCount() == 2) && (tagMatcher.group(1).equals(tagMatcher.group(2))))
{
ended = true;
}
else if (shortTagMatcher.matches())
{
ended = true;
}
else
{
result += in.readLine();
}
}
//
return (result);
}
/**
*
* @param source
* @return
*/
public static String toHTLM5(final String source)
{
String result;
if (StringUtils.isBlank(source))
{
result = "";
}
else
{
result = source.replace("&nbsp;", "&#160;");
}
//
return result;
}
/**
*
* @param value
* @return
*/
public static String toString(final XMLEvent source)
{
String result;
switch (source.getEventType())
{
case XMLEvent.ATTRIBUTE:
result = "ATTRIBUTE ";
break;
case XMLEvent.CDATA:
result = "CDATA";
break;
case XMLEvent.CHARACTERS:
result = "CHARACTERS [" + source.asCharacters().getData() + "]";
break;
case XMLEvent.COMMENT:
result = "COMMENT";
break;
case XMLEvent.DTD:
result = "DTD";
break;
case XMLEvent.END_DOCUMENT:
result = "END_DOCUMENT";
break;
case XMLEvent.END_ELEMENT:
result = "END_ELEMENT " + source.asEndElement().getName();
break;
case XMLEvent.ENTITY_DECLARATION:
result = "ENTITY_DECLARATION";
break;
case XMLEvent.ENTITY_REFERENCE:
result = "ENTITY_REFERENCE";
break;
case XMLEvent.NAMESPACE:
result = "NAMESPACE";
break;
case XMLEvent.NOTATION_DECLARATION:
result = "NOTATION_DECLARATION";
break;
case XMLEvent.PROCESSING_INSTRUCTION:
result = "PROCESSING_INSTRUCTION";
break;
case XMLEvent.SPACE:
result = "SPACE";
break;
case XMLEvent.START_DOCUMENT:
result = "START_DOCUMENT";
break;
case XMLEvent.START_ELEMENT:
result = "START_ELEMENT [name=" + source.asStartElement().getName() + "][namespaceURI=" + source.asStartElement().getName().getNamespaceURI() + "][prefix="
+ source.asStartElement().getName().getPrefix() + "][localPart=" + source.asStartElement().getName().getLocalPart() + "]";
break;
default:
result = null;
}
//
return result;
}
/**
*
* @param event
* @return
*/
public static String toString(final XMLTag source)
{
String result;
if (source == null)
{
result = "null";
}
else
{
result = "[label=" + source.getLabel() + "][type=" + source.getType().toString() + "][content=" + source.getContent() + "]";
}
//
return result;
}
/**
*
* @param source
* @return
*/
public static String unescapeXmlBlank(final String source)
{
String result;
if (StringUtils.isBlank(source))
{
result = null;
}
else
{
result = StringEscapeUtils.unescapeXml(source);
}
//
return result;
}
}

View file

@ -1,315 +0,0 @@
/**
* Copyright (C) 2013-2014 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.xml;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import org.apache.commons.lang3.ArrayUtils;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class XMLWriter
{
protected PrintWriter out;
/**
* Default constructor (useful for extend this class).
*/
protected XMLWriter()
{
this.out = null;
}
/**
* Initialize a XML Writer to a file.
*
* @param file
* Where write the XML data.
*
* @throws FileNotFoundException
* @throws UnsupportedEncodingException
*/
public XMLWriter(final File file) throws UnsupportedEncodingException, FileNotFoundException
{
this.out = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
}
/**
* Initialize a XML Writer to a <code>OutputStream</code>.
*
* @param target
* Where write the XML data.
*
* @throws UnsupportedEncodingException
*/
public XMLWriter(final OutputStream target) throws UnsupportedEncodingException
{
this.out = new PrintWriter(new OutputStreamWriter(target, "UTF-8"));
}
/**
* Initialize a XML Writer to a <code>Writer</code>.
*
* @param target
* Where write the XML data.
*
* @throws UnsupportedEncodingException
*/
public XMLWriter(final Writer target) throws UnsupportedEncodingException
{
this.out = new PrintWriter(target);
}
/**
* This method closes the target stream.
*/
public void close() throws IOException
{
if (this.out != null)
{
this.out.flush();
this.out.close();
}
}
/**
* This method flushes the target stream.
*/
public void flush() throws IOException
{
if (this.out != null)
{
this.out.flush();
}
}
/**
* This method writes a XML comment.
*
* @param comment
* The comment to write.
*/
public void writeComment(final String comment)
{
this.out.print("<!-- ");
if (comment != null)
{
writeTagContent(comment);
}
this.out.print(" -->");
}
/**
* This method writes a XML tag with no content.
*/
public void writeEmptyTag(final String label, final String... attributes)
{
this.out.print("<");
this.out.print(label);
writeTagAttributes(attributes);
this.out.print("/>");
}
/**
* This method writes a XML ender tag.
*/
public void writeEndTag(final String label)
{
this.out.print("</");
this.out.print(label);
this.out.print(">");
}
/**
* This method writes a XML start tag.
*/
public void writeStartTag(final String label, final String... attributes)
{
this.out.print("<");
this.out.print(label);
writeTagAttributes(attributes);
this.out.print(">");
}
/**
* This method write a XML tag with attributes and boolean content data.
*
* @param label
* @param content
* @param attributes
*/
public void writeTag(final String label, final boolean content, final String... attributes)
{
writeStartTag(label, attributes);
writeTagContent(String.valueOf(content));
writeEndTag(label);
}
/**
* This method write a XML tag with attributes and long content data.
*
* @param label
* @param content
* @param attributes
*/
public void writeTag(final String label, final long content, final String... attributes)
{
writeStartTag(label, attributes);
writeTagContent(String.valueOf(content));
writeEndTag(label);
}
/**
* This method write a XML tag with attributes and content data. Content
* data are converted in XML format.
*
* @param label
* @param content
* @param attributes
*/
public void writeTag(final String label, final String content, final String... attributes)
{
if (content == null)
{
writeEmptyTag(label, attributes);
}
else
{
writeStartTag(label, attributes);
writeTagContent(content);
writeEndTag(label);
}
}
/**
* This method writes attributes of a tag.
*
* @param attributes
*/
private void writeTagAttributes(final String... attributes)
{
//
if ((attributes != null) && (attributes.length > 0))
{
for (int count = 0; count < attributes.length; count += 2)
{
this.out.print(" ");
this.out.print(attributes[count]);
this.out.print("=\"");
this.out.print(attributes[count + 1]);
this.out.print("\"");
}
}
}
/**
* This method writes content using XML escape.
*
* @param content
* data to write in XML format.
*/
private void writeTagContent(final String content)
{
//
for (int count = 0; count < content.length(); count++)
{
//
char car = content.charAt(count);
switch (car)
{
case '<':
this.out.print("&lt;");
break;
case '>':
this.out.print("&gt;");
break;
case '&':
this.out.print("&amp;");
break;
case '"':
this.out.print("&quot;");
break;
case '\'':
this.out.print("&apos;");
break;
default:
this.out.print(car);
}
}
}
/**
* This method writes a XML header with attributes.
*
* @param attributes
*/
public void writeXMLHeader(final String... attributes)
{
//
this.out.print("<?xml");
//
if (!ArrayUtils.contains(attributes, "version"))
{
this.out.print(" version=\"1.0\"");
}
//
if (!ArrayUtils.contains(attributes, "encoding"))
{
this.out.print(" encoding=\"UTF-8\"");
}
//
if (!ArrayUtils.contains(attributes, "encoding"))
{
this.out.print(" standalone=\"no\"");
}
//
if (attributes != null)
{
//
for (int count = 0; count < attributes.length; count += 2)
{
this.out.print(" ");
this.out.print(attributes[count]);
this.out.print("=\"");
this.out.print(attributes[count + 1]);
this.out.print("\"");
}
}
//
this.out.print(" ?>");
}
}

View file

@ -1,68 +0,0 @@
/**
* Copyright (C) 2013-2014 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.xml;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.ZipInputStream;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class XMLZipReader extends XMLReader
{
/**
*
* @param file
* @throws IOException
* @throws XMLStreamException
*/
public XMLZipReader(final File file) throws IOException, XMLStreamException
{
super();
XMLInputFactory factory = XMLInputFactory.newInstance();
ZipInputStream zis = new ZipInputStream(new FileInputStream(file));
zis.getNextEntry();
this.in = factory.createXMLEventReader(zis, "UTF-8");
}
/**
*
* @param target
* @throws IOException
* @throws XMLStreamException
*/
public XMLZipReader(final InputStream source) throws IOException, XMLStreamException
{
super();
XMLInputFactory factory = XMLInputFactory.newInstance();
ZipInputStream zis = new ZipInputStream(source);
zis.getNextEntry();
this.in = factory.createXMLEventReader(zis, "UTF-8");
}
}

View file

@ -1,149 +0,0 @@
/**
* Copyright (C) 2013-2014 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.xml;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.zip.Deflater;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import fr.devinsy.util.FileTools;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class XMLZipWriter extends XMLWriter
{
private ZipOutputStream zos;
/**
*
* @param file
* @throws IOException
*/
public XMLZipWriter(final File file) throws IOException
{
super();
this.zos = new ZipOutputStream(new FileOutputStream(file));
this.zos.setLevel(Deflater.BEST_COMPRESSION);
this.zos.setMethod(ZipOutputStream.DEFLATED);
this.zos.setComment("Generated by XMLZipWriter");
this.zos.putNextEntry(new ZipEntry(FileTools.setExtension(file, ".xml").getName()));
this.out = new PrintWriter(new OutputStreamWriter(this.zos, "UTF-8"));
}
/**
*
* @param file
* @throws IOException
*/
public XMLZipWriter(final File file, final String generator) throws IOException
{
super();
this.zos = new ZipOutputStream(new FileOutputStream(file));
this.zos.setLevel(Deflater.BEST_COMPRESSION);
this.zos.setMethod(ZipOutputStream.DEFLATED);
this.zos.setComment(generator);
this.zos.putNextEntry(new ZipEntry(FileTools.setExtension(file, ".xml").getName()));
this.out = new PrintWriter(new OutputStreamWriter(this.zos, "UTF-8"));
}
/**
*
* @param target
* @throws IOException
*/
public XMLZipWriter(final OutputStream target, final String generator) throws IOException
{
super();
this.zos = new ZipOutputStream(target);
this.zos.setLevel(Deflater.BEST_COMPRESSION);
this.zos.setMethod(ZipOutputStream.DEFLATED);
if (generator != null)
{
this.zos.setComment(generator);
}
this.out = new PrintWriter(new OutputStreamWriter(this.zos, "UTF-8"));
}
/**
*
* @param target
* @throws IOException
*/
public XMLZipWriter(final OutputStream target, final String fileName, final String generator) throws IOException
{
super();
this.zos = new ZipOutputStream(target);
this.zos.setLevel(Deflater.BEST_COMPRESSION);
this.zos.setMethod(ZipOutputStream.DEFLATED);
if (generator != null)
{
this.zos.setComment(generator);
}
openEntry(fileName);
this.out = new PrintWriter(new OutputStreamWriter(this.zos, "UTF-8"));
}
/**
* @throws IOException
*
*/
@Override
public void close() throws IOException
{
closeEntry();
super.close();
}
/**
* @throws IOException
*
*/
public void closeEntry() throws IOException
{
flush();
this.zos.closeEntry();
}
/**
*
* @param fileName
* @throws IOException
*/
public void openEntry(final String fileName) throws IOException
{
if (fileName == null)
{
throw new NullPointerException("fileName is null.");
}
else
{
this.zos.putNextEntry(new ZipEntry(FileTools.setExtension(fileName, ".xml")));
}
}
}

View file

@ -1,316 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.jackrabbit.util;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;
/**
* The <code>ISO8601</code> utility class provides helper methods
* to deal with date/time formatting using a specific ISO8601-compliant
* format (see <a href="http://www.w3.org/TR/NOTE-datetime">ISO 8601</a>).
* <p/>
* The currently supported format is:
* <pre>
* &plusmn;YYYY-MM-DDThh:mm:ss.SSSTZD
* </pre>
* where:
* <pre>
* &plusmn;YYYY = four-digit year with optional sign where values <= 0 are
* denoting years BCE and values > 0 are denoting years CE,
* e.g. -0001 denotes the year 2 BCE, 0000 denotes the year 1 BCE,
* 0001 denotes the year 1 CE, and so on...
* MM = two-digit month (01=January, etc.)
* DD = two-digit day of month (01 through 31)
* hh = two digits of hour (00 through 23) (am/pm NOT allowed)
* mm = two digits of minute (00 through 59)
* ss = two digits of second (00 through 59)
* SSS = three digits of milliseconds (000 through 999)
* TZD = time zone designator, Z for Zulu (i.e. UTC) or an offset from UTC
* in the form of +hh:mm or -hh:mm
* </pre>
*/
public final class ISO8601 {
/**
* Parses an ISO8601-compliant date/time string.
*
* @param text the date/time string to be parsed
* @return a <code>Calendar</code>, or <code>null</code> if the input could
* not be parsed
* @throws IllegalArgumentException if a <code>null</code> argument is passed
*/
public static Calendar parse(String text) {
if (text == null) {
throw new IllegalArgumentException("argument can not be null");
}
// check optional leading sign
char sign;
int start;
if (text.startsWith("-")) {
sign = '-';
start = 1;
} else if (text.startsWith("+")) {
sign = '+';
start = 1;
} else {
sign = '+'; // no sign specified, implied '+'
start = 0;
}
/**
* the expected format of the remainder of the string is:
* YYYY-MM-DDThh:mm:ss.SSSTZD
*
* note that we cannot use java.text.SimpleDateFormat for
* parsing because it can't handle years <= 0 and TZD's
*/
int year, month, day, hour, min, sec, ms;
String tzID;
try {
// year (YYYY)
year = Integer.parseInt(text.substring(start, start + 4));
start += 4;
// delimiter '-'
if (text.charAt(start) != '-') {
return null;
}
start++;
// month (MM)
month = Integer.parseInt(text.substring(start, start + 2));
start += 2;
// delimiter '-'
if (text.charAt(start) != '-') {
return null;
}
start++;
// day (DD)
day = Integer.parseInt(text.substring(start, start + 2));
start += 2;
// delimiter 'T'
if (text.charAt(start) != 'T') {
return null;
}
start++;
// hour (hh)
hour = Integer.parseInt(text.substring(start, start + 2));
start += 2;
// delimiter ':'
if (text.charAt(start) != ':') {
return null;
}
start++;
// minute (mm)
min = Integer.parseInt(text.substring(start, start + 2));
start += 2;
// delimiter ':'
if (text.charAt(start) != ':') {
return null;
}
start++;
// second (ss)
sec = Integer.parseInt(text.substring(start, start + 2));
start += 2;
// delimiter '.'
if (text.charAt(start) != '.') {
return null;
}
start++;
// millisecond (SSS)
ms = Integer.parseInt(text.substring(start, start + 3));
start += 3;
// time zone designator (Z or +00:00 or -00:00)
if (text.charAt(start) == '+' || text.charAt(start) == '-') {
// offset to UTC specified in the format +00:00/-00:00
tzID = "GMT" + text.substring(start);
} else if (text.substring(start).equals("Z")) {
tzID = "GMT";
} else {
// invalid time zone designator
return null;
}
} catch (IndexOutOfBoundsException e) {
return null;
} catch (NumberFormatException e) {
return null;
}
TimeZone tz = TimeZone.getTimeZone(tzID);
// verify id of returned time zone (getTimeZone defaults to "GMT")
if (!tz.getID().equals(tzID)) {
// invalid time zone
return null;
}
// initialize Calendar object
Calendar cal = Calendar.getInstance(tz);
cal.setLenient(false);
// year and era
if (sign == '-' || year == 0) {
// not CE, need to set era (BCE) and adjust year
cal.set(Calendar.YEAR, year + 1);
cal.set(Calendar.ERA, GregorianCalendar.BC);
} else {
cal.set(Calendar.YEAR, year);
cal.set(Calendar.ERA, GregorianCalendar.AD);
}
// month (0-based!)
cal.set(Calendar.MONTH, month - 1);
// day of month
cal.set(Calendar.DAY_OF_MONTH, day);
// hour
cal.set(Calendar.HOUR_OF_DAY, hour);
// minute
cal.set(Calendar.MINUTE, min);
// second
cal.set(Calendar.SECOND, sec);
// millisecond
cal.set(Calendar.MILLISECOND, ms);
try {
/**
* the following call will trigger an IllegalArgumentException
* if any of the set values are illegal or out of range
*/
cal.getTime();
/**
* in addition check the validity of the year
*/
getYear(cal);
} catch (IllegalArgumentException e) {
return null;
}
return cal;
}
/**
* Formats a <code>Calendar</code> value into an ISO8601-compliant
* date/time string.
*
* @param cal the time value to be formatted into a date/time string.
* @return the formatted date/time string.
* @throws IllegalArgumentException if a <code>null</code> argument is passed
* or the calendar cannot be represented as defined by ISO 8601 (i.e. year
* with more than four digits).
*/
public static String format(Calendar cal) throws IllegalArgumentException {
if (cal == null) {
throw new IllegalArgumentException("argument can not be null");
}
/**
* the format of the date/time string is:
* YYYY-MM-DDThh:mm:ss.SSSTZD
*
* note that we cannot use java.text.SimpleDateFormat for
* formatting because it can't handle years <= 0 and TZD's
*/
StringBuffer buf = new StringBuffer();
// year ([-]YYYY)
appendZeroPaddedInt(buf, getYear(cal), 4);
buf.append('-');
// month (MM)
appendZeroPaddedInt(buf, cal.get(Calendar.MONTH) + 1, 2);
buf.append('-');
// day (DD)
appendZeroPaddedInt(buf, cal.get(Calendar.DAY_OF_MONTH), 2);
buf.append('T');
// hour (hh)
appendZeroPaddedInt(buf, cal.get(Calendar.HOUR_OF_DAY), 2);
buf.append(':');
// minute (mm)
appendZeroPaddedInt(buf, cal.get(Calendar.MINUTE), 2);
buf.append(':');
// second (ss)
appendZeroPaddedInt(buf, cal.get(Calendar.SECOND), 2);
buf.append('.');
// millisecond (SSS)
appendZeroPaddedInt(buf, cal.get(Calendar.MILLISECOND), 3);
// time zone designator (Z or +00:00 or -00:00)
TimeZone tz = cal.getTimeZone();
// determine offset of timezone from UTC (incl. daylight saving)
int offset = tz.getOffset(cal.getTimeInMillis());
if (offset != 0) {
int hours = Math.abs((offset / (60 * 1000)) / 60);
int minutes = Math.abs((offset / (60 * 1000)) % 60);
buf.append(offset < 0 ? '-' : '+');
appendZeroPaddedInt(buf, hours, 2);
buf.append(':');
appendZeroPaddedInt(buf, minutes, 2);
} else {
buf.append('Z');
}
return buf.toString();
}
/**
* Returns the astronomical year of the given calendar.
*
* @param cal a calendar instance.
* @return the astronomical year.
* @throws IllegalArgumentException if calendar cannot be represented as
* defined by ISO 8601 (i.e. year with more
* than four digits).
*/
public static int getYear(Calendar cal) throws IllegalArgumentException {
// determine era and adjust year if necessary
int year = cal.get(Calendar.YEAR);
if (cal.isSet(Calendar.ERA)
&& cal.get(Calendar.ERA) == GregorianCalendar.BC) {
/**
* calculate year using astronomical system:
* year n BCE => astronomical year -n + 1
*/
year = 0 - year + 1;
}
if (year > 9999 || year < -9999) {
throw new IllegalArgumentException("Calendar has more than four " +
"year digits, cannot be formatted as ISO8601: " + year);
}
return year;
}
/**
* Appends a zero-padded number to the given string buffer.
* <p/>
* This is an internal helper method which doesn't perform any
* validation on the given arguments.
*
* @param buf String buffer to append to
* @param n number to append
* @param precision number of digits to append
*/
private static void appendZeroPaddedInt(StringBuffer buf, int n, int precision) {
if (n < 0) {
buf.append('-');
n = -n;
}
for (int exp = precision - 1; exp > 0; exp--) {
if (n < Math.pow(10, exp)) {
buf.append('0');
} else {
break;
}
}
buf.append(n);
}
}

View file

@ -1 +0,0 @@
Extract from jackrabbit-2.1.1-src.zip

View file

@ -1,111 +0,0 @@
/**
* Copyright (C) 2013 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
import java.io.File;
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.PatternLayout;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fr.devinsy.util.FileIterator;
/**
*
*/
public class FileIteratorSandbox
{
private static final Logger logger;
static
{
// Initialize logger.
org.apache.log4j.BasicConfigurator.configure();
org.apache.log4j.Logger.getRootLogger().setLevel(org.apache.log4j.Level.DEBUG);
logger = LoggerFactory.getLogger(FileIteratorSandbox.class);
//
org.apache.log4j.Logger defaultLogger = org.apache.log4j.Logger.getRootLogger();
defaultLogger.removeAllAppenders();
defaultLogger.addAppender(new ConsoleAppender(new PatternLayout("%d{ISO8601} - dutils [%-5p] %34.34c.%-25M - %m%n")));
//
logger.debug("Log initialized.");
}
/**
*
*/
public static void main(final String[] args)
{
test();
}
/**
*
*/
protected static void test()
{
System.out.println("user.dir=" + System.getProperty("user.dir"));
try
{
// File f = new File("TestTree/DirectoryOne/titi2");
// File f = new File("/home/cpm/.kde//cache-cpmstar");
File f = new File("tests/TestTree/xine.jpg");
System.out.println("exists=" + f.exists());
System.out.println("canonical path = " + f.getCanonicalPath());
System.out.println("absolute path = " + f.getAbsolutePath());
System.out.println("name = " + f.getName());
System.out.println("parent = " + f.getParent());
System.out.println("path = " + f.getPath());
System.out.println("path = " + f.lastModified());
System.out.println("path = " + f.length());
System.out.println("path = " + f.isFile());
System.out.println("path = " + f.isDirectory());
System.out.println("list = " + f.list());
System.out.println("----");
// FileIterator i = new FileIterator(new File("tests/TestTree"));
FileIterator i = new FileIterator(new File("tests/TestTree/xine.jpg"), null, true);
// FileIterator i = new FileIterator(new
// File("/home/cpm/.kde/cache-cpmstar"), ".*cache.*", false);
// FileIterator i = new FileIterator(new File("tests/TestTree"),
// ".*dsc.*", false);
// FileIterator i = new FileIterator(new
// File("/home/cpm/Images/Photos/"));
// FileIterator i = new FileIterator(new
// File("/home/cpm/Images/Photos/"), ".*\\.(JPG|jpg)", false);
// FileIterator i = new FileIterator(new
// File("/home/cpm/Images/Photos/"), ".*anni_moi.*", false);
while (i.hasNext())
{
// System.out.println(i.toString());
System.out.println("File=[" + i.next().getPath() + "]");
}
i.reset();
System.out.println("Cardinal=" + i.finalCountdown());
}
catch (Exception exception)
{
System.out.println("ERROR:" + exception.getMessage());
}
}
}

View file

@ -1,19 +0,0 @@
import org.junit.Test;
public class Foot1Test
{
// private Logger logger =
// LoggerFactory.getLogger(PdfGenerationAmqpServiceInjectedTest.class);
/**
*
*/
@Test
public void test1a()
{
// logger.debug("===== test starting...");
// logger.debug("===== test done.");
}
}

View file

@ -1 +0,0 @@
test sioux

Binary file not shown.

Before

Width:  |  Height:  |  Size: 771 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 869 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 853 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 798 KiB

View file

@ -1 +0,0 @@
azertyuiop

View file

@ -1 +0,0 @@
good weather today

View file

@ -1 +0,0 @@
Ceci est un test.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 771 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 869 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 853 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 798 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

View file

@ -1,108 +0,0 @@
package fr.devinsy.util.cmdexec;
/**
* Copyright (C) 2013 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.PatternLayout;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
*/
class CmdExecSandbox
{
static private final Logger logger;
static
{
// Initialize logger.
org.apache.log4j.BasicConfigurator.configure();
org.apache.log4j.Logger.getRootLogger().setLevel(org.apache.log4j.Level.INFO);
logger = LoggerFactory.getLogger(CmdExecSandbox.class);
logger.info("Enter");
//
logger.info("Set the log file format…");
org.apache.log4j.Logger defaultLogger = org.apache.log4j.Logger.getRootLogger();
defaultLogger.removeAllAppenders();
defaultLogger.addAppender(new ConsoleAppender(new PatternLayout("%d{ISO8601} - dutils [%-5p] %34.34c.%-25M - %m%n")));
logger.info("… done.");
logger.debug("Exit");
}
/**
*
*/
public static String check(final String title, final StringBuffer source, final String model)
{
String result;
if (source.indexOf(model) == -1)
{
result = String.format("%-40s -> KO <-", title) + "\nGet:\n" + source + "\nWaiting:\n" + model;
}
else
{
result = String.format("%-40s [ OK ] ", title);
}
//
return (result);
}
/**
*
*/
public static void main(final String[] args)
{
System.out.println("Automatic test action for CmdExec!");
test1();
}
/**
*
*/
public static void test1()
{
try
{
System.out.println("Launch…s");
// String command = "/bin/sort -r /etc/passwd";
String[] command = { "/usr/bin/sort", "-r", "/etc/passwd" };
CmdExec cmd = new CmdExec(command, StreamGobbler.StreamWay.BUFFER, StreamGobbler.StreamWay.BUFFER);
System.out.println("exitVal=[" + cmd.getExitValue() + "]");
System.out.println("out=[" + cmd.getOutStream() + "]");
System.out.println("err=[" + cmd.getErrStream() + "]");
}
catch (Exception exception)
{
exception.printStackTrace();
logger.info("ERRRO=" + exception);
}
}
}

View file

@ -27,10 +27,6 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import fr.devinsy.util.strings.StringList;
import fr.devinsy.util.strings.StringListCharIterator;
import fr.devinsy.util.strings.StringListCharPosition;
/**
*
* @author Christian P. Momon

View file

@ -1,67 +0,0 @@
/**
* Copyright (C) 2014 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.util.rss;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.junit.Before;
import org.junit.Test;
import fr.devinsy.util.rss.RSSCache;
/**
*
* @author Christian P. Momon
*/
public class RSSCacheTest
{
static protected org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(RSSCacheTest.class);
/**
*
*/
@Before
public void before()
{
BasicConfigurator.configure();
Logger.getRootLogger().setLevel(Level.ERROR);
}
/**
*
*/
@Test
public void test01()
{
//
logger.debug("===== test starting...");
RSSCache cache = RSSCache.instance();
cache.put("ALPHA", "Mignonne, allons voir si la rose");
cache.put("BRAVO", "Qui ce matin avoit desclose");
cache.put("CHARLIE", "Sa robe de pourpre au Soleil,");
cache.setOudated("CHARLIE");
//
logger.debug("===== test done.");
}
}

View file

@ -1,131 +0,0 @@
/**
* Copyright (C) 2014 Christian Pierre MOMON
*
* This file is part of Devinsy-utils.
*
* Devinsy-utils 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 3 of the License, or
* (at your option) any later version.
*
* Devinsy-utils 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.util.xml;
import java.io.File;
import java.io.FileNotFoundException;
import javax.xml.stream.XMLStreamException;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.junit.Before;
import fr.devinsy.util.strings.StringList;
/**
*
* @author Christian P. Momon
*/
public class XMLReaderTest
{
static private org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(XMLReaderTest.class);
/**
*
*/
@Before
public void before()
{
BasicConfigurator.configure();
Logger.getRootLogger().setLevel(Level.ERROR);
}
/**
* @throws XMLStreamException
* @throws FileNotFoundException
* @throws XMLBadFormatException
*
*/
// @Test
public void testFoo01() throws FileNotFoundException, XMLStreamException, XMLBadFormatException
{
//
logger.debug("===== test starting...");
// XMLReader in = new XMLReader(new
// File("/home/cpm/C/Puck/TY/Ebrei 08.puc"));
// XMLReader in = new XMLReader(new
// File("/home/cpm/C/Puck/TY/T/kidarep.xml"));
XMLReader in = new XMLReader(new File("/home/cpm/C/Puck/TY/T2/sikevadb-2014-06-08-17h55mn49s.xml"));
boolean ended = false;
while (!ended)
{
XMLTag tag = in.readTag();
if (tag == null)
{
ended = true;
}
else
{
// System.out.println(String.format("tag %s", tag.getLabel()));
}
//
logger.debug("===== test done.");
}
System.out.println("over");
}
/**
* @throws XMLStreamException
* @throws FileNotFoundException
* @throws XMLBadFormatException
*
*/
// @Test
public void testFoo02() throws FileNotFoundException, XMLStreamException, XMLBadFormatException
{
//
logger.debug("===== test starting...");
// XMLReader in = new XMLReader(new
// File("/home/cpm/C/Puck/TY/Ebrei 08.puc"));
XMLReader in = new XMLReader(new File("/home/cpm/C/Puck/TY/T/accounts.xml"));
// XMLReader in = new XMLReader(new
// File("/home/cpm/C/Puck/TY/T2/sikevadb-2014-06-08-17h55mn49s.xml"));
boolean ended = false;
StringList buffer = new StringList();
while (!ended)
{
XMLTag tag = in.readTag();
if (tag == null)
{
ended = true;
}
else
{
if (tag.getContent() != null)
{
System.out.println(buffer.append(tag.getContent()));
}
}
//
logger.debug("===== test done.");
}
System.out.println("over");
}
}

View file

@ -1,19 +0,0 @@
package one;
import org.junit.Assert;
import org.junit.Test;
public class Foo2Test
{
/**
*
*/
@Test
public void test2a()
{
// logger.debug("===== test starting...");
Assert.assertEquals(true, true);
// logger.debug("===== test done.");
}
}