Wstęp
Dokument w systemie PlusWorkflow zawiera informację o pliku(nazwa, rozmiar, wersja itp.) i indeksach (polach zdefiniowanych w klasie dokumentów). Dokumenty są zawsze zapisywane w archiwum systemowym. Mogą być również przypisywane do zadań.
Wersja pliku, a dokument
W systemie PlusWorkflow wersjonowane są wyłącznie pliki, a nie dokumenty. Plik zawsze posiada wersję, natomiast dokument odnosi się zawszę do najnowszej wersji pliku z którym jest powiązany.
Implementacja
WfDocument
Klasa WfDocument reprezentuje dokument w systemie. Tworzy powiązanie między klasami WfFile, WfFileVersion oraz indeksami dokumentu(wartościami z tabeli pm_idx_000x).
WfFile
Klasa WfFile reprezentuje plik w systemie. Zawiera podstawowe informacje o pliku.
WfFileVersion
Klasa WfFileVersion reprezentuje wersję pliku w systemie. Relacja między obiektami WfFile, a WfFileVersion to 1-do-1
Operacje na dokumentach
Do wykonywania operacji na dokumentach należy używać usługi DocumentService. Umożliwia ona dodawania nowych dokumentów, zmianę indeksów, usunięcie, dołączanie lub odłączenie z/do procesu/zadania.
Przykłady:
InputStream inputStream = ...
DocumentClassService documentClassService=ServiceFactory.getDocumentClassService();
DocumentService documentService=ServiceFactory.getDocumentService();
DocumentClass documentClass = documentClassService.getDocumentClass( "klasa" );
Map<Long, Object> idx = new HashMap<Long, Object>();
idx.put( 1L, "wartość tekstowa" );
idx.put( 2L, 555 );
idx.put( 3L, new Date() );
DocumentDefinition definition = new DocumentDefinition();
definition.setDocumentClassId( documentClass.getId() );
definition.setFileName( "nazwa.pdf" );
definition.setDescription( "opis" );
definition.setUserName( "admin" );
definition.setIndexes( idx );
definition.setInputStream( inputStream );
definition.setActivityId( "103_proces1_zadanie1" );//parametry opcjonalne jeżeli nie zostaną podane dokument zostanie dodany tylko do archiwum
definition.setProcessId( "103_proces1" );// nie będzie dołączony do żadnego procesu
WfDocument document = documentService.addDocument( definition );
documentService.attachDocumentToProcess( documentId, documentClassId, "admin", "103_proces1", "103_proces1_zadanie1" );
Wyszukiwanie dokumentów
Do wyszukiwania dokumentów należy używać klasy DocumentFinder
DocumentFinder documentFinder=FinderFactory.getDocumentFinder();
Map<Long, Object> idx = new HashMap<Long, Object>();
idx.put( 1L, "wartość tekstowa" );
idx.put( 2L, 555 );
idx.put( 3L, new Date() );//wartości indeksów po których chcemy wyszukiwać
List<Sorter> sorters=new ArrayList<Sorter>();
sorters.add( new Sorter("3",SortDirection.DESC) );//sorujemy malejąco po indeksie o id 3
CountedResult<WfDocument> result=documentFinder.findByIndexes( idx, sorters, documentClassId, start, limit );
long total=result.getTotal();//liczba wszystkich pasujących dokumentów
List<WfDocument> documents=result.getData();//lista znalezionych dokumentów ograniczona przez start i limit
Przedstawiona wyżej metoda wyszukuje dokumenty o indeksach równych (operator '=' ) podanym wartościom i wszystkie warunki łączy operatorem logicznym AND. Jeżeli chcemy stworzyć bardziej zaawansowane warunki wyszukiwania możemy wykorzystać następującą metodę:
DocumentFinder documentFinder = FinderFactory.getDocumentFinder();
List<IndexFilter> filters = new ArrayList<IndexFilter>();
filters.add( new SimpleIndexFilter( 3L, date, FilterOperator.GT ) );//Greater then '>'
filters.add( new SimpleIndexFilter( 1L, "%test%", FilterOperator.LIKE ) );//definiujemy operatory wyszukiwania
CountedResult<WfDocument> result = documentFinder.findByIndexes( filters, sorters, documentClassId, start, limit );
W powyższym przykładzie zdefiniowaliśmy operatory wyszukiwania, lecz warunki nadal są połączone logicznym operatorem AND. Aby to zmienić możemy wykorzystać grupowanie filtrów:
List<IndexFilter> filters = new ArrayList<IndexFilter>();
GroupIndexFilter gif = new GroupIndexFilter( LogicOperator.OR );//tworzymy grupę warunków połączonych operatorem OR
gif.addFilter( new SimpleIndexFilter( 3L, date, FilterOperator.GT ) );
gif.addFilter( new SimpleIndexFilter( 1L, "%test%", FilterOperator.LIKE ) );
GroupIndexFilter subGroup=new GroupIndexFilter(LogicOperator.AND);// tworzymy kolejną grupę warunków
subGroup.addFilter( new SimpleIndexFilter( 5L, "abc") );
subGroup.addFilter( new SimpleIndexFilter( 2L, 555 ) );
gif.addFilter( subGroup );//do grupy warunków możmy dodać inną grupę tworząc drzewo warunków
filters.add( gif );
CountedResult<WfDocument> result = documentFinder.findByIndexes( filters, sorters, documentClassId, start, limit );
Powyższy przykład utworzy następujący warunek: idx_3 > date OR idx_1 = '%test' OR ( idx_5 = 'abc' AND idx_2 = 555 )
