package gr.ntua.ivml.mint.concurrent.queue.consumers; import gr.ntua.ivml.mint.concurrent.queue.util.OAIRepositoryManager; import gr.ntua.ivml.mint.concurrent.queue.util.SHA1Generator; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.HashMap; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.ConsumerCancelledException; import com.rabbitmq.client.QueueingConsumer; import com.rabbitmq.client.ShutdownSignalException; public class PublicationItemConsumer implements Runnable{ private String queueHost; private String queueName; private ConnectionFactory factory; private Connection connection; private Channel channel; private QueueingConsumer consumer; private QueueingConsumer.Delivery delivery; private HashMap<String, Object> header; private OAIRepositoryManager manager; private SHA1Generator gen; private String orgName; //private boolean isLastItem; private String publicationDate; private String prefix; private String payload; private String reportId; public PublicationItemConsumer(){ gen = new SHA1Generator(); manager = new OAIRepositoryManager(); factory = new ConnectionFactory(); queueHost = gr.ntua.ivml.mint.util.Config.get("oai.queue.host"); queueName = gr.ntua.ivml.mint.util.Config.get("oai.queue.name"); factory.setHost(queueHost); try { connection = factory.newConnection(); channel = connection.createChannel(); channel.queueDeclare(queueName, true, false, false, null); channel.basicQos(1); consumer = new QueueingConsumer(channel); channel.basicConsume(queueName, false, consumer); } catch (IOException e) { e.printStackTrace(); } } private String cleanXML(String xml){ int ind = xml.indexOf("?>"); xml = xml.substring(ind+2); return xml; } @Override public void run() { while(true){ try { delivery = consumer.nextDelivery(); header = (HashMap<String, Object>)delivery.getProperties().getHeaders(); this.orgName = header.get("orgName").toString(); this.prefix = header.get("prefix").toString(); this.publicationDate = header.get("publicationDate").toString(); //this.isLastItem = (Boolean)header.get("isLastItem"); this.reportId = header.get("reportId").toString(); payload = new String(delivery.getBody(), "UTF-8"); payload = this.cleanXML(payload); String hash = gen.generate(payload); if(manager.itemExists(hash, this.orgName)){ manager.addConflictedItem(hash, this.reportId, this.orgName); //manager.increaseConflictedItems(this.reportId); //manager.increaseTotalItems(this.reportId); }else{ manager.addItem(hash, payload, this.orgName, this.prefix); //manager.increaseInsertedItems(this.reportId); //manager.increaseTotalItems(this.reportId); } /*if(isLastItem){ manager.closeReport(this.reportId); System.out.println("Last Item Found"); }*/ try { channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false); } catch (IOException e) { e.printStackTrace(); } } catch (ShutdownSignalException e) { e.printStackTrace(); } catch (ConsumerCancelledException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } }