All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.openas2.partner.XMLPartnershipFactory Maven / Gradle / Ivy

Go to download

Open source implementation of the AS2 standard for signed encrypted and compressed document transfer

There is a newer version: 2.10.1
Show newest version
package org.openas2.partner;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openas2.OpenAS2Exception;
import org.openas2.schedule.HasSchedule;
import org.openas2.Session;
import org.openas2.WrappedException;
import org.openas2.params.InvalidParameterException;
import org.openas2.support.FileMonitorAdapter;
import org.openas2.util.AS2Util;
import org.openas2.util.XMLUtil;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


/**
 * original author unknown
 * 

* this release added logic to store partnerships and provide methods for partner/partnership command line processor * * @author joseph mcverry */ public class XMLPartnershipFactory extends BasePartnershipFactory implements HasSchedule { public static final String PARAM_FILENAME = "filename"; public static final String PARAM_INTERVAL = "interval"; private Map partners; private Log logger = LogFactory.getLog(XMLPartnershipFactory.class.getSimpleName()); private int getRefreshInterval() throws InvalidParameterException { return getParameterInt(PARAM_INTERVAL, false); } String getFilename() throws InvalidParameterException { return getParameter(PARAM_FILENAME, true); } public Map getPartners() { if (partners == null) { partners = new HashMap(); } return partners; } private void setPartners(Map map) { partners = map; } public void init(Session session, Map parameters) throws OpenAS2Exception { super.init(session, parameters); refresh(); } void refresh() throws OpenAS2Exception { try (FileInputStream inputStream = new FileInputStream(getFilename())) { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder parser = factory.newDocumentBuilder(); Document document = parser.parse(inputStream); Element root = document.getDocumentElement(); NodeList rootNodes = root.getChildNodes(); Node rootNode; String nodeName; Map newPartners = new HashMap(); List newPartnerships = new ArrayList(); for (int i = 0; i < rootNodes.getLength(); i++) { rootNode = rootNodes.item(i); nodeName = rootNode.getNodeName(); if (nodeName.equals("partner")) { loadPartner(newPartners, rootNode); } else if (nodeName.equals("partnership")) { loadPartnership(newPartners, newPartnerships, rootNode); } } synchronized (this) { setPartners(newPartners); setPartnerships(newPartnerships); } } catch (Exception e) { throw new WrappedException(e); } } private void loadAttributes(Node node, Partnership partnership) throws OpenAS2Exception { Map nodes = XMLUtil.mapAttributeNodes(node.getChildNodes(), "attribute", "name", "value"); AS2Util.attributeEnhancer(nodes); partnership.getAttributes().putAll(nodes); } public void loadPartner(Map partners, Node node) throws OpenAS2Exception { String[] requiredAttributes = {"name"}; Map newPartner = XMLUtil.mapAttributes(node, requiredAttributes); String name = newPartner.get("name"); if (partners.get(name) != null) { throw new OpenAS2Exception("Partner is defined more than once: " + name); } partners.put(name, newPartner); } private void loadPartnerIDs(Map partners, String partnershipName, Node partnershipNode, String partnerType, Map idMap) throws OpenAS2Exception { Node partnerNode = XMLUtil.findChildNode(partnershipNode, partnerType); if (partnerNode == null) { throw new OpenAS2Exception("Partnership \"" + partnershipName + "\" is missing sender"); } Map partnerAttr = XMLUtil.mapAttributes(partnerNode); // check for a partner name, and look up in partners list if one is found String partnerName = partnerAttr.get("name"); if (partnerName != null) { Map map = (Map) partners.get(partnerName); Map partner = map; if (partner == null) { throw new OpenAS2Exception("Partnership " + partnershipName + " has an undefined " + partnerType + ": " + partnerName); } idMap.putAll(partner); } // copy all other attributes to the partner id map idMap.putAll(partnerAttr); } public void loadPartnership(Map partners, List partnerships, Node node) throws OpenAS2Exception { Partnership partnership = new Partnership(); String[] requiredAttributes = {"name"}; Map psAttributes = XMLUtil.mapAttributes(node, requiredAttributes); String name = psAttributes.get("name"); if (getPartnership(partnerships, name) != null) { throw new OpenAS2Exception("Partnership is defined more than once: " + name); } partnership.setName(name); // load the sender and receiver information loadPartnerIDs(partners, name, node, "sender", partnership.getSenderIDs()); loadPartnerIDs(partners, name, node, "receiver", partnership.getReceiverIDs()); // read in the partnership attributes loadAttributes(node, partnership); // add the partnership to the list of available partnerships partnerships.add(partnership); } public void storePartnership() throws OpenAS2Exception { String fn = getFilename(); DecimalFormat df = new DecimalFormat("0000000"); long l = 0; File f = null; while (true) { f = new File(fn + '.' + df.format(l)); if (f.exists() == false) { break; } l++; } logger.info("backing up " + fn + " to " + f.getName()); File fr = new File(fn); fr.renameTo(f); try { PrintWriter pw = new PrintWriter(new FileOutputStream(fn)); Map partner = partners; pw.println(""); Iterator> partnerIt = partner.entrySet().iterator(); while (partnerIt.hasNext()) { Map.Entry ptrnData = partnerIt.next(); HashMap partnerMap = (HashMap) ptrnData.getValue(); pw.print(" > attrIt = partnerMap.entrySet().iterator(); while (attrIt.hasNext()) { Map.Entry attribute = attrIt.next(); pw.print(attribute.getKey() + "=\"" + attribute.getValue() + "\""); if (attrIt.hasNext()) { pw.print("\n "); } } pw.println("/>"); } List partnerShips = getPartnerships(); ListIterator partnerLIt = partnerShips.listIterator(); while (partnerLIt.hasNext()) { Partnership partnership = partnerLIt.next(); pw.println(" "); pw.println(" "); pw.println(" "); Map partnershipMap = partnership.getAttributes(); Iterator> partnershipIt = partnershipMap.entrySet().iterator(); while (partnershipIt.hasNext()) { Map.Entry partnershipData = partnershipIt.next(); pw.println(" "); } pw.println(" "); } pw.println(""); pw.flush(); pw.close(); } catch (FileNotFoundException e) { throw new WrappedException(e); } } @Override public void schedule(ScheduledExecutorService executor) throws OpenAS2Exception { new FileMonitorAdapter() { @Override public void onConfigFileChanged() throws OpenAS2Exception { refresh(); logger.debug("- Partnerships Reloaded -"); } }.scheduleIfNeed(executor, new File(getFilename()), getRefreshInterval(), TimeUnit.SECONDS); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy