Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //balík s třídou knihoven
- package cz.digipaper.fato.rule;
- //používané třídy
- import javax.xml.parsers.DocumentBuilderFactory;
- import javax.xml.parsers.DocumentBuilder;
- import org.w3c.dom.Document;
- import org.w3c.dom.NodeList;
- import com.google.gdata.data.dublincore.Date;
- import org.w3c.dom.Node;
- import org.w3c.dom.Element;
- import java.io.InputStream;
- import java.io.Serializable;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import org.alfresco.model.ContentModel;
- import org.alfresco.repo.action.executer.ActionExecuterAbstractBase;
- import org.alfresco.service.ServiceRegistry;
- import org.alfresco.service.cmr.action.Action;
- import org.alfresco.service.cmr.action.ParameterDefinition;
- import org.alfresco.service.cmr.model.FileFolderService;
- import org.alfresco.service.cmr.repository.ContentData;
- import org.alfresco.service.cmr.repository.ContentReader;
- import org.alfresco.service.cmr.repository.NodeRef;
- import org.alfresco.service.cmr.repository.NodeService;
- import org.alfresco.service.cmr.repository.StoreRef;
- import org.alfresco.service.cmr.search.ResultSet;
- import org.alfresco.service.cmr.search.SearchService;
- import org.alfresco.service.namespace.QName;
- import org.springframework.extensions.webscripts.WebScriptException;
- //definice základní třídy ActionExecuterAbstractBase a jejího rozšíření ReadXml
- public class ReadXml extends ActionExecuterAbstractBase {
- //privátní proměnná (je viditelná pouze pro tuto třídu ReadXml)
- private ServiceRegistry serviceRegistry;
- //umožnění přepsat zděděnou funkci z ActionExecuterAbstractBase
- @Override
- protected void executeImpl(Action action, NodeRef nodeRef) { //Metoda bez návratové hodnoty pro spuštění čtení XML
- // TODO Auto-generated method stub
- System.out.println("Ahoj já jsem tvoje pravidlo");
- // Zjisteni mimetype
- NodeService nodeService = serviceRegistry.getNodeService();
- ContentData contentData = (ContentData) nodeService.getProperty(nodeRef, ContentModel.PROP_CONTENT);
- String originalMimeType = contentData.getMimetype();
- System.out.println(originalMimeType);
- //ošetření aby příchozí dokument byl pouze typu XML aby se to nesnažilo přečíst třeba obrázek
- if (originalMimeType.equals("text/xml")) {
- try {
- ContentReader reader = serviceRegistry.getContentService().getReader(nodeRef, ContentModel.PROP_CONTENT);
- InputStream originalInputStream = reader.getContentInputStream();
- DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); //Tovární API pro vytvoření parseru pro XML hierarchii
- DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); //Vytvoření instance pro vytvoření dokumentu
- Document doc = dBuilder.parse(originalInputStream); //Vytvoření samotného dokumentu, do kterého jsou naparsovanány data z výše vytvořeného dokumentu
- doc.getDocumentElement().normalize(); // Normalizace dat v dokumentu (úprava, pro zjednodušení parsování)
- 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
- NodeList nList = doc.getElementsByTagName("Hlavicky"); //přiřazení prvků s tagem "Hlavicky" do listu
- System.out.println("----------------------------"); //vypiš ---------------------------
- for (int temp = 0; temp < nList.getLength(); temp++) { //Cyklus od 0 do N (počet prvků v dokumentu)
- Node nNode = nList.item(temp); //Vytvoření Uzlu z listu (prvek z listu získám na základě indexu "temp")
- System.out.println("\nRoot Element :" + nNode.getNodeName()); //vypiš Aktuálně první a hlavní element : "název aktuálního elemetnu" např. <zamestnanci></zamestnanci>
- if (nNode.getNodeType() == Node.ELEMENT_NODE) { // Pokud je uzel typu "Element" (obsahuje níže uvedené atributy jako ID, jméno, aj)
- Element eElement = (Element) nNode; // Vytvoření se objekt Element pomocí přetypování z uzlu a vypíšou se data, které obsahuje
- System.out.println("Číslo : " + eElement.getElementsByTagName("CISLO").item(0).getTextContent());
- System.out.println("Firma : " + eElement.getElementsByTagName("FIRMA").item(0).getTextContent()); //jelikož obsahuje text
- System.out.println("Ič : " + eElement.getElementsByTagName("IC").item(0).getTextContent());
- System.out.println("Termín zahájení : " + eElement.getElementsByTagName("DATUMZAHAJENI").item(0).getTextContent());
- System.out.println("Předpokládané ukončení : " + eElement.getElementsByTagName("DATUMPREDPUKON").item(0).getTextContent());
- System.out.println("Smluvní cena : " + eElement.getElementsByTagName("PLANOBRAT").item(0).getTextContent());
- System.out.println("Zbývá vyfakturovat : " + eElement.getElementsByTagName("ZISK").item(0).getTextContent());
- System.out.println("Náklad došlé faktury : " + eElement.getElementsByTagName("NAKLADY").item(0).getTextContent());
- //CISLO
- String cislo = eElement.getElementsByTagName("CISLO").item(0).getTextContent(); //vytvoření proměnné cislo, do které se uloží obsah elementu z XML
- String query = "@fato\\:cislosmlouvy:" + cislo; //vytvoří se proměnná query do které se uloží číslo smlouvy aktuálně prohledávaného dokumentu
- System.out.println("Hledám subdodávku s číslem: " + query);
- // NodeRef je datový typ refence na node
- NodeRef subdodavkaFolder = search(query, cislo);
- if (subdodavkaFolder == null) { //Zjištění jestli dokument existuje
- System.out.println("Přeskakuji, subdodávka nenalezena.");
- continue; //pokud dokument neexistuje tak přeskoč
- }
- System.out.println("Naplňuji nová data do: " + subdodavkaFolder);
- //FIRMA
- String subdodavatel = eElement.getElementsByTagName("FIRMA").item(0).getTextContent();
- //IC moje nejde
- String ico_subdodavatel = eElement.getElementsByTagName("IC").item(0).getTextContent();
- // PLANOBRAT -- Smluvní cena
- // Vyčte si z dokumentu částku jako String
- String celkova_cena_subdodavky_string = eElement.getElementsByTagName("PLANOBRAT").item(0).getTextContent();
- int celkova_cena_subdodavky = Integer.parseInt(celkova_cena_subdodavky_string);
- // ZISK
- // Vyčte si z dokumentu jako String
- String zbyvajici_prostredky_subdodavky_string = eElement.getElementsByTagName("ZISK").item(0).getTextContent();
- // Vytvoří číslo (typu integer) ze získaného stringu
- int zbyvajici_prostredky_subdodavky = Integer.parseInt(zbyvajici_prostredky_subdodavky_string);
- // DATUM ZAHAJENI
- String termin_zahajeni_string = eElement.getElementsByTagName("DATUMZAHAJENI").item(0).getTextContent(); //Děláme z toho do alfresca datum
- int denIndex = termin_zahajeni_string.indexOf('.');
- String den = termin_zahajeni_string.substring(0, denIndex);
- termin_zahajeni_string = termin_zahajeni_string.substring(denIndex + 1, termin_zahajeni_string.length());
- int mesicIndex = termin_zahajeni_string.indexOf('.');
- String mesic = termin_zahajeni_string.substring(0, mesicIndex);
- termin_zahajeni_string = termin_zahajeni_string.substring(mesicIndex + 1, termin_zahajeni_string.length());
- String rok = termin_zahajeni_string;
- String datumString = den + "-" + mesic + "-" + rok;
- //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í
- // DATUM DOKONCENI
- String termin_dokonceni = eElement.getElementsByTagName("DATUMPREDPUKON").item(0).getTextContent();
- // NAKLADY
- // Vyčte si z dokumentu jako String
- String vyfakturovano_string = eElement.getElementsByTagName("NAKLADY").item(0).getTextContent();
- // Vytvoří číslo (typu integer) ze získaného stringu
- int vyfakturovano = Integer.parseInt(vyfakturovano_string);
- //nastaví metadata
- setMetadata(cislo, subdodavatel, ico_subdodavatel, celkova_cena_subdodavky, zbyvajici_prostredky_subdodavky, datumString, termin_dokonceni, vyfakturovano, subdodavkaFolder);
- }
- }
- } catch (Exception e) { //Když nastane v TRY bloku chyba, vypíše se vyjímka
- e.printStackTrace();
- }
- } else { //pokud dokument není typu TEXT/XML tak vypiš vyjímku.
- throw new WebScriptException("Soubor neni text/xml");
- }
- }
- // Privátní funkce, která nemá návratovou hodnotu a nastaví metadata.
- 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
- Map<QName,Serializable> metadata = new HashMap<QName,Serializable>();
- //do metadata vloží proměnnou skrze danou konstantu
- metadata.put(FatoXmlModel.PROP_FATO_SUBDODAVKA_CISLO, cislo);
- metadata.put(FatoXmlModel.PROP_FATO_SUBDODAVKA_SUBDODAVATEL_NAZEV, subdodavatel);
- metadata.put(FatoXmlModel.PROP_FATO_SUBDODAVKA_ICO_SUBDODAVATEL_NAZEV, ico_subdodavatel);
- metadata.put(FatoXmlModel.PROP_FATO_SUBDODAVKA_CELKOVA_CENA_SUBDODAVKY, celkova_cena_subdodavky);
- metadata.put(FatoXmlModel.PROP_FATO_SUBDODAVKA_ZBYVAJICI_PROSTREDKY_SUBDODAVKY, zbyvajici_prostredky_subdodavky);
- metadata.put(FatoXmlModel.PROP_FATO_SUBDODAVKA_TERMIN_ZAHAJENI, termin_zahajeni);
- metadata.put(FatoXmlModel.PROP_FATO_SUBDODAVKA_TERMIN_DOKONCENI, termin_dokonceni);
- metadata.put(FatoXmlModel.PROP_FATO_SUBDODAVKA_VYFAKTUROVANO, vyfakturovano);
- serviceRegistry.getNodeService().addProperties(nodeRef, metadata); //Uložení metadat do dokumentu
- }
- //dříve využívaná funkce pro tvorbu složky v případě, že ještě neexistovala
- private NodeRef createSubdodavkaFolder(NodeRef parent, String cislo) { //privátní funkce s parametry parent a cislo
- FileFolderService fileFolderService = serviceRegistry.getFileFolderService();
- NodeRef newSubdodavkaNodeRef = fileFolderService.create(parent, "subdodavka_" + cislo, FatoXmlModel.TYPE_FATO_SUBDODAVKA_SLOZKA)
- .getNodeRef();
- return newSubdodavkaNodeRef;
- }
- //Privátní vyhledávací funkce
- private NodeRef search(String query, String cislo) {
- SearchService searchService = serviceRegistry.getSearchService();
- StoreRef storeRef = new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore");
- // správně by to mělo najít složku
- ResultSet rs = searchService.query(storeRef, SearchService.LANGUAGE_LUCENE, query);
- NodeRef resultNodeRef = null;
- try {
- if (rs.length() != 0) { //Pokud výsledek hledání není nulový
- resultNodeRef = rs.getNodeRef(0);
- System.out.println("Našel jsem: " + resultNodeRef);
- return resultNodeRef;
- }
- } finally { //uzavření celého vyhledávání
- rs.close();
- }
- return resultNodeRef;
- }
- @Override
- protected void addParameterDefinitions(List<ParameterDefinition> param) {
- // TODO Auto-generated method stub
- }
- public void setServiceRegistry(ServiceRegistry serviceRegistry) {
- this.serviceRegistry = serviceRegistry;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement