package org.kisst.gft;
import com.ibm.mq.MQException;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.Status;
import org.eclipse.jgit.pgm.Main;
import org.kisst.jms.ActiveMqSystem;
import org.kisst.jms.JmsSystem;
import org.kisst.jms.JmsUtil;
import org.kisst.mq.MsgMover;
import org.kisst.mq.QueueManager;
import org.kisst.props4j.Props;
import org.kisst.props4j.SimpleProps;
import org.kisst.util.FileUtil;
import org.kisst.util.JarLoader;
import org.kisst.util.TemplateUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import java.io.File;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.HashMap;
public class GftCli2 extends GftCli {
final Logger logger= LoggerFactory.getLogger(GftCli2.class);
private final Cli.StringOption putmsg = cli.stringOption("p","putmsg", "puts a message from the named file on the input queue",null);
private final Cli.StringOption delmsg = cli.stringOption("d","delmsg","selector", null);
private final Cli.StringOption mvmsg = cli.stringOption("m","mvmsg","move message with <str> as msgid (or @all) from errorqueue to main queue", null);
private final Cli.SubCommand jgit =cli.subCommand("jgit", "run jgit CLI");
private final Cli.SubCommand git =cli.subCommand("git", "run jgit CLI");
private final Cli.SubCommand backup =cli.subCommand("backup", "backup the config directory to git");
private final String[] newargs;
public GftCli2(String topname, String args[]) {
super(topname, args);
newargs = cli.parse(args);
}
@Override public boolean localCommand() {
return backup.isSet() || jgit.isSet() || git.isSet() | mvmsg.isSet() | delmsg.isSet() | putmsg.isSet() || super.localCommand();
}
public boolean handle() {
if (super.handle())
return true;
SimpleProps props=new SimpleProps();
props.load(getConfigFile());
props=(SimpleProps) props.getProps(topname);
if (jgit.isSet() || git.isSet()) {
if (System.getProperty("jgit.gitprefix")==null)
System.setProperty("jgit.gitprefix",props.getString("jgit.gitprefix","D:\\git"));
try {Main.main(newargs);}
catch (Exception e) { throw new RuntimeException(e); }
}
else if (backup.isSet()) {
backup(newargs, props);
}
else if (putmsg.isSet())
putmsg(props,putmsg.get());
else if (delmsg.isSet())
delmsg(props, delmsg.get());
else if (mvmsg.isSet())
moveMessage(props, mvmsg.get());
else
return false;
return true;
}
private void backup(String[] args, SimpleProps props) {
if (System.getProperty("jgit.gitprefix")==null)
System.setProperty("jgit.gitprefix",props.getString("jgit.gitprefix","D:\\git"));
try {
boolean newRepo=false;
if (! new File(".git").isDirectory()) {
System.out.println("No backup repository yet, will create a new git repository");
if (! new File(".gitignore").isFile()) {
System.out.println("No .gitignore file, will create default, ignoring logs and ssh keys");
PrintWriter writer = new PrintWriter(".gitignore", "UTF-8");
writer.println("config/ssh");
writer.println("logs");
writer.close();
}
newRepo=true;
}
Git git = Git.init().call();
Status status= git.status().call();
boolean newConfigFile=false;
for (String str: status.getUntracked() ) {
if (str.startsWith("config/")) {
System.out.println("New "+str);
newConfigFile=true;
}
}
if (newConfigFile || newRepo || status.hasUncommittedChanges()) {
git.add().addFilepattern("config").call();
git.add().addFilepattern(".gitignore").call();
for (String str: status.getAdded()) { System.out.println("Added "+str); }
for (String str: status.getChanged()) { System.out.println("Changed "+str); }
for (String str: status.getMissing()) { System.out.println("Missing "+str); }
for (String str: status.getModified()) { System.out.println("Modified "+str); }
for (String str: status.getRemoved()) { System.out.println("Removed "+str); }
for (String str: status.getUncommittedChanges()) { System.out.println("Uncommitted "+str); }
String comment = getGitComment(args);
if (comment.length()==0)
System.out.println("Nothng backed up, commit is mandatory");
else {
for (String str: status.getMissing()) { git.rm().addFilepattern(str).call(); }
git.commit().setMessage(comment).call();
}
}
else
System.out.println("No changes to backup");
}
catch (Exception e) { throw new RuntimeException(e); }
}
private String getGitComment(String[] args) {
if (args.length==0) {
System.out.println("commit commentaar is verplicht, type een regel die beschrijft waarom of wat er veranderd is, b.v. een RFC nummer");
return System.console().readLine().trim();
}
String comment=args[0];
for (int i=1; i<args.length; i++)
comment+=" "+args[i];
return comment;
}
private String getQueue(SimpleProps props) {
HashMap<String, Object> context = new HashMap<String, Object>();
context.put("global", props.get("global", null));
String queuename = TemplateUtil.processTemplate(props.getString("listener.main.queue"), context);
return queuename;
}
private JmsSystem getQueueSystem(Props props) {
new JarLoader(props, "gft").getMainClasses();
Props qmprops=props.getProps("mq.host.main");
String type=qmprops.getString("type");
if ("ActiveMq".equals(type))
return new ActiveMqSystem(qmprops);
else if ("Jms".equals(type))
return new JmsSystem(qmprops);
else
throw new RuntimeException("Unknown type of queueing system "+type);
}
private void putmsg(SimpleProps props, String filename) {
logger.info("gft put");
JmsSystem queueSystem=getQueueSystem(props);
String queuename = getQueue(props);
String data=null;
if (filename==null || "-".equals(filename)) {
logger.info("loading data from standard input");
data= FileUtil.loadString(new InputStreamReader(System.in));
}
else {
logger.info("loading data from file "+filename);
data=FileUtil.loadString(filename);
}
logger.info("sending message");
queueSystem.getQueue(queuename).send(data);
logger.info("send the following message to the queue {}",queuename);
logger.debug("data send was {}",data);
System.out.println("Sent message to "+queuename);
queueSystem.close();
}
private void delmsg(SimpleProps props,String selector) {
JmsSystem queueSystem=getQueueSystem(props);
String queuename = getQueue(props);
logger.info("removing the following message "+selector);
try {
Session session = queueSystem.getConnection().createSession(true, Session.SESSION_TRANSACTED);
MessageConsumer consumer = session.createConsumer(session.createQueue(queuename), selector);
Message msg = consumer.receive(5000);
if (msg==null)
logger.info("Could not find message "+selector);
else {
session.commit();
logger.info("Removed message "+selector);
}
queueSystem.close();
}
catch (JMSException e) { throw JmsUtil.wrapJMSException(e); }
}
private void moveMessage(Props props, String msgid) {
String src=props.getString("listener.main.errorqueue");
String dest=props.getString("listener.main.queue");
try {
JmsSystem jmsSystem = new JmsSystem(props.getProps("mq.host.main"));
MsgMover.moveMessage(new QueueManager(jmsSystem.createMQQueueManager()), src, dest, msgid);
}
catch (MQException e) { throw new RuntimeException(e); }
}
}