Advertisement
Wity

Untitled

Oct 24th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //balík s třídou knihoven
  2. package cz.digipaper.fato.rule;
  3.  
  4. //používané třídy
  5. import javax.xml.parsers.DocumentBuilderFactory;
  6. import javax.xml.parsers.DocumentBuilder;
  7. import org.w3c.dom.Document;
  8. import org.w3c.dom.NodeList;
  9.  
  10. import com.google.gdata.data.dublincore.Date;
  11.  
  12. import org.w3c.dom.Node;
  13. import org.w3c.dom.Element;
  14. import java.io.InputStream;
  15. import java.io.Serializable;
  16. import java.util.HashMap;
  17. import java.util.List;
  18. import java.util.Map;
  19.  
  20. import org.alfresco.model.ContentModel;
  21. import org.alfresco.repo.action.executer.ActionExecuterAbstractBase;
  22. import org.alfresco.service.ServiceRegistry;
  23. import org.alfresco.service.cmr.action.Action;
  24. import org.alfresco.service.cmr.action.ParameterDefinition;
  25. import org.alfresco.service.cmr.model.FileFolderService;
  26. import org.alfresco.service.cmr.repository.ContentData;
  27. import org.alfresco.service.cmr.repository.ContentReader;
  28. import org.alfresco.service.cmr.repository.NodeRef;
  29. import org.alfresco.service.cmr.repository.NodeService;
  30. import org.alfresco.service.cmr.repository.StoreRef;
  31. import org.alfresco.service.cmr.search.ResultSet;
  32. import org.alfresco.service.cmr.search.SearchService;
  33. import org.alfresco.service.namespace.QName;
  34. import org.springframework.extensions.webscripts.WebScriptException;
  35.  
  36. //definice základní třídy ActionExecuterAbstractBase a jejího rozšíření ReadXml
  37. public class ReadXml extends ActionExecuterAbstractBase {
  38.  
  39.     //privátní proměnná (je viditelná pouze pro tuto třídu ReadXml)
  40.     private ServiceRegistry serviceRegistry;
  41.  
  42.     //umožnění přepsat zděděnou funkci z ActionExecuterAbstractBase
  43.     @Override
  44.     protected void executeImpl(Action action, NodeRef nodeRef) { //Metoda bez návratové hodnoty pro spuštění čtení XML
  45.         // TODO Auto-generated method stub
  46.         System.out.println("Ahoj já jsem tvoje pravidlo");
  47.  
  48.         // Zjisteni mimetype
  49.         NodeService nodeService = serviceRegistry.getNodeService();
  50.         ContentData contentData = (ContentData) nodeService.getProperty(nodeRef, ContentModel.PROP_CONTENT);
  51.         String originalMimeType = contentData.getMimetype();
  52.  
  53.         System.out.println(originalMimeType);
  54. //ošetření aby příchozí dokument byl pouze typu XML aby se to nesnažilo přečíst třeba obrázek
  55.         if (originalMimeType.equals("text/xml")) {
  56.             try {
  57.            
  58.                 ContentReader reader = serviceRegistry.getContentService().getReader(nodeRef, ContentModel.PROP_CONTENT);
  59.                 InputStream originalInputStream = reader.getContentInputStream();
  60.            
  61.                 DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); //Tovární API pro vytvoření parseru pro XML hierarchii  
  62.                 DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); //Vytvoření instance pro vytvoření dokumentu
  63.                 Document doc = dBuilder.parse(originalInputStream); //Vytvoření samotného dokumentu, do kterého jsou naparsovanány data z výše vytvořeného dokumentu
  64.    
  65.                 doc.getDocumentElement().normalize(); // Normalizace dat v dokumentu (úprava, pro zjednodušení parsování)
  66.    
  67.                 System.out.println("Root element :" + doc.getDocumentElement().getNodeName()); //vypiš Aktuální element : "název aktuálního elemetnu" např. <zamestnanci></zamestnanci> Nejspíš vždy první element
  68.    
  69.                 NodeList nList = doc.getElementsByTagName("Hlavicky"); //přiřazení prvků s tagem "Hlavicky" do listu
  70.    
  71.                 System.out.println("----------------------------"); //vypiš ---------------------------
  72.    
  73.                 for (int temp = 0; temp < nList.getLength(); temp++) { //Cyklus od 0 do N (počet prvků v dokumentu)
  74.  
  75.                     Node nNode = nList.item(temp); //Vytvoření Uzlu z listu (prvek z listu získám na základě indexu "temp")
  76.  
  77.                     System.out.println("\nRoot Element :" + nNode.getNodeName()); //vypiš Aktuálně první a hlavní element : "název aktuálního elemetnu" např. <zamestnanci></zamestnanci>
  78.                    
  79.                    
  80.                     if (nNode.getNodeType() == Node.ELEMENT_NODE) { // Pokud je uzel typu "Element" (obsahuje níže uvedené atributy jako ID, jméno, aj)
  81.  
  82.                         Element eElement = (Element) nNode; // Vytvoření se objekt Element pomocí přetypování z uzlu a vypíšou se data, které obsahuje
  83.  
  84.                         System.out.println("Číslo : " + eElement.getElementsByTagName("CISLO").item(0).getTextContent());                                            
  85.                         System.out.println("Firma : " + eElement.getElementsByTagName("FIRMA").item(0).getTextContent()); //jelikož obsahuje text
  86.                         System.out.println("Ič : " + eElement.getElementsByTagName("IC").item(0).getTextContent());
  87.                         System.out.println("Termín zahájení : " + eElement.getElementsByTagName("DATUMZAHAJENI").item(0).getTextContent());
  88.                         System.out.println("Předpokládané ukončení : " + eElement.getElementsByTagName("DATUMPREDPUKON").item(0).getTextContent());
  89.                         System.out.println("Smluvní cena : " + eElement.getElementsByTagName("PLANOBRAT").item(0).getTextContent());
  90.                         System.out.println("Zbývá vyfakturovat : " + eElement.getElementsByTagName("ZISK").item(0).getTextContent());
  91.                         System.out.println("Náklad došlé faktury : " + eElement.getElementsByTagName("NAKLADY").item(0).getTextContent());
  92.  
  93.                         //CISLO
  94.                         String cislo = eElement.getElementsByTagName("CISLO").item(0).getTextContent(); //vytvoření proměnné cislo, do které se uloží obsah elementu z XML
  95.                         String query = "@fato\\:cislosmlouvy:" + cislo; //vytvoří se proměnná query do které se uloží číslo smlouvy aktuálně prohledávaného dokumentu
  96.                        
  97.                        
  98.                         System.out.println("Hledám subdodávku s číslem: " + query);
  99.                         // NodeRef je datový typ refence na node
  100.                         NodeRef subdodavkaFolder = search(query, cislo);
  101.                             if (subdodavkaFolder == null) { //Zjištění jestli dokument existuje
  102.                                 System.out.println("Přeskakuji, subdodávka nenalezena.");
  103.                                 continue; //pokud dokument neexistuje tak přeskoč
  104.                             }
  105.                         System.out.println("Naplňuji nová data do: " + subdodavkaFolder);
  106.                        
  107.                         //FIRMA
  108.                         String subdodavatel = eElement.getElementsByTagName("FIRMA").item(0).getTextContent();
  109.                        
  110.                         //IC moje nejde
  111.                         String ico_subdodavatel = eElement.getElementsByTagName("IC").item(0).getTextContent();
  112.                        
  113.                         //  PLANOBRAT -- Smluvní cena
  114.                         // Vyčte si z dokumentu částku jako String
  115.                         String celkova_cena_subdodavky_string = eElement.getElementsByTagName("PLANOBRAT").item(0).getTextContent();
  116.                         int celkova_cena_subdodavky = Integer.parseInt(celkova_cena_subdodavky_string);
  117.                        
  118.                        
  119.                        
  120.                         //  ZISK                       
  121.                         // Vyčte si z dokumentu jako String
  122.                         String zbyvajici_prostredky_subdodavky_string = eElement.getElementsByTagName("ZISK").item(0).getTextContent();
  123.                         // Vytvoří číslo (typu integer) ze získaného stringu
  124.                         int zbyvajici_prostredky_subdodavky = Integer.parseInt(zbyvajici_prostredky_subdodavky_string);
  125.                        
  126.                         // DATUM ZAHAJENI
  127.                        
  128.                         String termin_zahajeni_string = eElement.getElementsByTagName("DATUMZAHAJENI").item(0).getTextContent(); //Děláme z toho do alfresca datum
  129.                         int denIndex = termin_zahajeni_string.indexOf('.');
  130.                         String den = termin_zahajeni_string.substring(0, denIndex);
  131.                         termin_zahajeni_string = termin_zahajeni_string.substring(denIndex + 1, termin_zahajeni_string.length());
  132.  
  133.                         int mesicIndex = termin_zahajeni_string.indexOf('.');
  134.                         String mesic = termin_zahajeni_string.substring(0, mesicIndex);
  135.                         termin_zahajeni_string = termin_zahajeni_string.substring(mesicIndex + 1, termin_zahajeni_string.length());
  136.  
  137.                         String rok = termin_zahajeni_string;
  138.  
  139.                         String datumString = den + "-" + mesic + "-" + rok;
  140.  
  141.                         //Date termin_zahajeni = new Date(datumString); //todle odkomentovat, dole ve funkci zmenit typ ze string na date a parametr datumString na termin_zahajeni a v content-mode.xml přepsat typ na d:date a potom je problém se serilizací
  142.                        
  143.                         // DATUM DOKONCENI
  144.                         String termin_dokonceni = eElement.getElementsByTagName("DATUMPREDPUKON").item(0).getTextContent();
  145.                        
  146.                         // NAKLADY
  147.                         // Vyčte si z dokumentu jako String
  148.                         String vyfakturovano_string = eElement.getElementsByTagName("NAKLADY").item(0).getTextContent();
  149.                         // Vytvoří číslo (typu integer) ze získaného stringu
  150.                         int vyfakturovano = Integer.parseInt(vyfakturovano_string);
  151.                
  152.                        
  153.                         //nastaví metadata
  154.                         setMetadata(cislo, subdodavatel, ico_subdodavatel, celkova_cena_subdodavky, zbyvajici_prostredky_subdodavky, datumString, termin_dokonceni, vyfakturovano, subdodavkaFolder);
  155.                     }
  156.                 }
  157.                
  158.             } catch (Exception e) { //Když nastane v TRY bloku chyba, vypíše se vyjímka
  159.                 e.printStackTrace();
  160.             }
  161.         } else { //pokud dokument není typu TEXT/XML tak vypiš vyjímku.
  162.             throw new WebScriptException("Soubor neni text/xml");
  163.         }
  164.  
  165.     }
  166.     // Privátní funkce, která nemá návratovou hodnotu a nastaví metadata.
  167.     private void setMetadata(String cislo, String subdodavatel, String ico_subdodavatel, int celkova_cena_subdodavky, int zbyvajici_prostredky_subdodavky, String termin_zahajeni, String termin_dokonceni, int vyfakturovano, NodeRef nodeRef) { //parametry funkce
  168.         Map<QName,Serializable> metadata = new HashMap<QName,Serializable>();
  169.         //do metadata vloží proměnnou skrze danou konstantu
  170.         metadata.put(FatoXmlModel.PROP_FATO_SUBDODAVKA_CISLO, cislo);
  171.         metadata.put(FatoXmlModel.PROP_FATO_SUBDODAVKA_SUBDODAVATEL_NAZEV, subdodavatel);
  172.         metadata.put(FatoXmlModel.PROP_FATO_SUBDODAVKA_ICO_SUBDODAVATEL_NAZEV, ico_subdodavatel);
  173.         metadata.put(FatoXmlModel.PROP_FATO_SUBDODAVKA_CELKOVA_CENA_SUBDODAVKY, celkova_cena_subdodavky);
  174.         metadata.put(FatoXmlModel.PROP_FATO_SUBDODAVKA_ZBYVAJICI_PROSTREDKY_SUBDODAVKY, zbyvajici_prostredky_subdodavky);
  175.         metadata.put(FatoXmlModel.PROP_FATO_SUBDODAVKA_TERMIN_ZAHAJENI, termin_zahajeni);
  176.         metadata.put(FatoXmlModel.PROP_FATO_SUBDODAVKA_TERMIN_DOKONCENI, termin_dokonceni);
  177.         metadata.put(FatoXmlModel.PROP_FATO_SUBDODAVKA_VYFAKTUROVANO, vyfakturovano);
  178.        
  179.         serviceRegistry.getNodeService().addProperties(nodeRef, metadata); //Uložení metadat do dokumentu
  180.     }
  181.  
  182.     //dříve využívaná funkce pro tvorbu složky v případě, že ještě neexistovala
  183.     private NodeRef createSubdodavkaFolder(NodeRef parent, String cislo) { //privátní funkce s parametry parent a cislo
  184.         FileFolderService fileFolderService = serviceRegistry.getFileFolderService();
  185.         NodeRef newSubdodavkaNodeRef = fileFolderService.create(parent, "subdodavka_" + cislo, FatoXmlModel.TYPE_FATO_SUBDODAVKA_SLOZKA)
  186.                 .getNodeRef();
  187.  
  188.         return newSubdodavkaNodeRef;
  189.  
  190.     }
  191. //Privátní vyhledávací funkce
  192.     private NodeRef search(String query, String cislo) {
  193.         SearchService searchService = serviceRegistry.getSearchService();
  194.         StoreRef storeRef = new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore");
  195.  
  196.         // správně by to mělo najít složku
  197.         ResultSet rs = searchService.query(storeRef, SearchService.LANGUAGE_LUCENE, query);
  198.  
  199.         NodeRef resultNodeRef = null;
  200.  
  201.         try {
  202.             if (rs.length() != 0) { //Pokud výsledek hledání není nulový
  203.                 resultNodeRef = rs.getNodeRef(0);
  204.  
  205.                 System.out.println("Našel jsem: " + resultNodeRef);
  206.  
  207.                 return resultNodeRef;
  208.  
  209.             }
  210.         } finally { //uzavření celého vyhledávání
  211.             rs.close();
  212.         }
  213.         return resultNodeRef;
  214.  
  215.     }
  216.  
  217.     @Override
  218.     protected void addParameterDefinitions(List<ParameterDefinition> param) {
  219.         // TODO Auto-generated method stub
  220.  
  221.     }
  222.  
  223.     public void setServiceRegistry(ServiceRegistry serviceRegistry) {
  224.         this.serviceRegistry = serviceRegistry;
  225.     }
  226.  
  227. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement