1 / 41

Introduction to UIMA

Introduction to UIMA. Dr. Judith Eckle -Kohler, Richard Eckart de Castilho, Roland Kluge, Dr. Torsten Zesch. Part 1: UIMA. UIMA – Unstructured Information Management Architecture. M ajor goal: transform unstructured information to structured information

Download Presentation

Introduction to UIMA

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Introductionto UIMA Dr. Judith Eckle-Kohler, Richard Eckart de Castilho, Roland Kluge, Dr. Torsten Zesch

  2. Part 1: UIMA 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  3. UIMA – Unstructured Information Management Architecture Major goal: • transform unstructured information to structured information … in order to discover knowledge that is relevant to an end user • Component-based architecture for analysis of unstructured content like text, video, audio • How it works: think of UIMA components as machines in an assembly line 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  4. A Short History of UIMA • Unstructured Information Management Architecture • Originallydevelopedat IBM – today an Apache project • Used in commercialaswellaseducationalcontexts • LanguageWare, Watson (IBM) • uimaFIT (TU Darmstadt, University of Colorado) • DKPro Core (!) (TU Darmstadt) • manymore... • Java and C++ implementations 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  5. Learning toreadisdifficultforcomputers … $�Ⱶ�‡⃗⃝⏏%Ⱶ $%$�ᐆ﬩ ⃗⃝ᐆ↕ ⧫ᐆ%¥ ﬩↕%б↕ -- $ᐆ⠼∇бᐆ ↕⧫ᐆ⁆ #%‡ ↕%Ⱶ⁂ ᐆ⁑ᐆ‡ $ᐆ⠼∇бᐆ ↕⧫ᐆ⁆ #%‡ $%$$Ⱶᐆ % ﬩�‡⃗⃝Ⱶᐆ ⁍∇б¥, $%$�ᐆ﬩ �‡ $�Ⱶ�‡⃗⃝⏏%Ⱶ ⧫∇⏏﬩ᐆ⧫∇Ⱶ¥﬩ =%⁆ ⃗⃝ᐆ↕ % ⧫ᐆ%¥ ﬩↕%б↕ �‡ Ⱶ�⠼ᐆ, %##∇б¥�‡⃗⃝ ↕∇ % ↕ᐆ%= ∇⠼ ﬩#�ᐆ‡↕�﬩↕﬩ �‡ �↕%Ⱶ⁆. б%↕⧫ᐆб ↕⧫%‡ #∇‡⠼⏏﬩�‡⃗⃝ $%$�ᐆ﬩, ⧫ᐆ%б�‡⃗⃝ =∇бᐆ ↕⧫%‡ ∇‡ᐆ Ⱶ%‡⃗⃝⏏%⃗⃝ᐆ ⃗⃝�⁑ᐆ﬩ ‡ᐆ⁍$∇б‡﬩ % =ᐆ‡↕%Ⱶ $∇∇﬩↕, %##∇б¥�‡⃗⃝ ↕∇ ↕⧫ᐆ ‡ᐆ⁍ ﬩↕⏏¥⁆, ⁍⧫�#⧫ ↕ᐆ﬩↕ᐆ¥ ﬩ᐆ⁑ᐆ‡-=∇‡↕⧫-∇Ⱶ¥ �‡⠼%‡↕﬩ "�‡ =%‡⁆ ᐆ⏏б∇∘ᐆ%‡ #∇⏏‡↕б�ᐆ﬩, ∘%бᐆ‡↕﬩ %бᐆ ⁍%б⁆ ∇⠼ ⃗⃝�⁑�‡⃗⃝ % $�Ⱶ�‡⃗⃝⏏%Ⱶ ᐆ¥⏏#%↕�∇‡ ↕∇ ↕⧫ᐆ�б ⁂�¥﬩ %‡¥ ↕б⁆ ↕∇ ﬩∘ᐆ%⁂ ∇‡Ⱶ⁆ ∇‡ᐆ Ⱶ%‡⃗⃝⏏%⃗⃝ᐆ," ﬩%�¥ ﬩↕⏏¥⁆ %⏏↕⧫∇б ↗%#⁋⏏ᐆ﬩ =ᐆ⧫Ⱶᐆб ∇⠼ ↕⧫ᐆ Ⱶ%‡⃗⃝⏏%⃗⃝ᐆ, #∇⃗⃝‡�↕�∇‡, %‡¥ ¥ᐆ⁑ᐆⱵ∇∘=ᐆ‡↕ Ⱶ%$ %↕ ↕⧫ᐆ �‡↕ᐆб‡%↕�∇‡%Ⱶ ﬩#⧫∇∇Ⱶ ⠼∇б %¥⁑%‡#ᐆ¥ ﬩↕⏏¥�ᐆ﬩ �‡ ↕б�ᐆ﬩↕ᐆ, �↕%Ⱶ⁆. "↕⧫ᐆ⁆ %бᐆ %⠼б%�¥ [↕⧫ᐆ�б #⧫�Ⱶ¥бᐆ‡] =�⃗⃝⧫↕ ﬩⏏⠼⠼ᐆб ⁍⧫ᐆ‡ ↕⧫ᐆ⁆ ⃗⃝ᐆ↕ ↕∇ ﬩#⧫∇∇Ⱶ %‡¥ ﬩∇ ∇‡," =ᐆ⧫Ⱶᐆб ﬩%�¥. "$ᐆ#%⏏﬩ᐆ ∇⠼ ∇⏏б бᐆ﬩⏏Ⱶ↕﬩, � ¥∇⏏$↕ ↕⧫%↕ ⁑ᐆб⁆ =⏏#⧫.“ Unstructured text 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  6. Analysis Levels in Text Processing unstructured Segmentation Morphology Syntax Semantics structured 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  7. UIMA Pipeline Example Collection Reader Segmentation CAS Analysis Engine 1 Morphology CAS … Syntax Semantics Analysis Engine n CAS CAS Consumer 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  8. UIMA Example Pipeline for Text Processing Collection Reader CAS Segmenter Segmentation CAS Morphology POS Tagger CAS Syntax NamedEntityRec. CAS Semantics CAS Consumer 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  9. UIMA Concepts I Pipeline Stages/Components: • Collection Reader: startofpipeline, abstractionofinputfiles • Analysis Engine: performsanalysis (tokenization, segmentation, etc.) • CAS Consumer: e.g. forwriting out results (XML, text, console) 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  10. UIMA Concepts II Data Structures • Common Analysis System (CAS): „datatransferobject“ • Type System: representationofannotations, contractedinterfacebetweencomponents • Indexes: accessingannotations • Views: e.g. raw HTML view, cleanedtextview • Subject-of-Analysis (SofA): e.g., documenttextofthecurrentview 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  11. Common Analysis System (CAS) • High-density data structure, functions like an in-memory database • Provides access to • primary data (document/artifact under consideration) • secondary data (meta-data/annotations) 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  12. Type System A UIMA type systemspecifiesthe type ofdatathatcanbemanipulatedbyannotatorcomponents. • UIMA provides an “object-oriented” type system • A type system defines two kinds of objects: • Types (Type -> class) • Features (Feature -> class member, Feature Structure -> instance) 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  13. Type System • Single inheritance • Sub-type polymorphism • Primitive types: integer, float, boolean, String • Built-in complextypes: arrays, lists, Annotation • Type systemispartofcommunicationcontractbetweencomponents 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  14. Example Type System 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  15. Type System Editor (Eclipse) File: src/main/resources/desc/types/TypeSystem.xml Java package name of generated classes • JCasGengenerates Java classesfrom XML 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  16. Java + CAS = JCas • JCasmaps CAS typesintothe Java type system • JCasGengenerates Java classesfromthe XML type systemdescriptor • Token.java– featurestructurewrapperwithgettersandsetters • Token_type.java– type wrapper (cf. Java ‘Class’ class) • Do not edittheseautomaticallygenerated Java classesmanually! • JCaswrapperscannotbeused stand-alone • XML type systemdescriptors still neededtoinitializetheunderlying CAS • Java Code Example: JCasjCas = …; Token token = new Token(jCas); // newallocatesmemory in the CAS! token.addToIndexes(); // neverforgetthis! 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  17. Indexes • Recap: featurestructures (FS) arestored on theheap • Components cannotdirectlyaccess FS, but only via indexes • Feature structuresonlyaccessiblewhenaddedto an index • Feature structurescanonlyberemovedfromindex, neverfromCAS • Properties of an index (excerpt): • Typetobeindexed (indeximplicitlycontains all sub-types) • Kind: bag, set, sorted (seenextslide) • Example: Built-in Annotation index • Type: Annotation • Kind: sorted, begin (standard), end (reverse) 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  18. Figure: Indexes Bag Set Sorted (0,2 v = “Hi”) (7,10 v = “Tom”) (3,6 v = “old”) (7,10 v = “Tim”) (0,2 v = “Ho”) (3,6 v = “red”) (0,2 v = “Hi”) (7,10 v = “Tom”) (3,6 v = “old”) (0,2 v = “Hi”) (0,2 v = “Ho”) (3,6 v = “old”) (3,6 v = “red”) (7,10 v = “Tim”) (7,10 v = “Tom”) duplicatesallowed unordered nokeys noduplicates unordered keysonlytestequality duplicatesallowed ordered 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  19. Indexes – all youneedtoknow • normallynobodyneedstodefineindexes • indexes are the only way for UIMA annotators to access annotations in the CAS • it is necessary to generate these indexes, they are not provided automatically within UIMA 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  20. Views andSofAs – Conceptual • CASrepresentstheanalysisof a singleartifact (a document) • Eachviewcontains a copyoftheartifact, • referredtoastheSubjectof Analysis (SofA) – theprimarydataassociatedwith a view (asreturnedbygetDocumentText()), • and a setofindexes, theFSIndexRepository,that UIMA annotatorsusetoaccessdata in the CAS • Usualsetting: Viewisonerepresentationoftheartifact, e.g. • Translation scenario: original text, translatedtext • Transformation scenario: original text, transformedtext • Multi-modal scenario: videoframes, close-captions 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  21. Figure: Views andSofAs Base CAS View “_InitialView” SofA FS “_InitialView” Logical Physical SofAunawarecomponentreceivesdefaultview in process (CAS) whencallinggetDocumentText() Base CAS View “Text” SofA FS “Text” Logical Physical View “HTML” SofA FS “HTML” SofAawarecomponentreceivesbase CAS in process(CAS) needstocallgetView(viewName) 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  22. Views andSofAs – Use Cases • CASrepresentstheanalysisof a singleartifact (a document) • This istrue in mostapplications • But: Views can also beusedtocompare different artifacts (mostlypairs) • thisrequires a customizedreaderthatreads in severalartifactsinto a single CAS, • andthenstoreseachartifact in a separate view. 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  23. Part 2: uimaFIT 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  24. uimaFIT • „add-on“ for UIMA simplifyingtypicaldevelopmenttasks • forinstance: • consistencywith XML descriptorfiles • componentconfiguration • (shared) resourcemanagement • CAS/JCasaccess • Componentbaseclasses • @ConfigurationParameterannotation • Factories • http://code.google.com/p/uimafit/ 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  25. Steps of Implementing a Collection Reader • subclasstheuimaFITcomponentJCasCollectionReader_ImplBase • Methodstobeimplemented: • voidgetNext(JCas): storenextdocument in thegivenoutputparameter • booleanhasNext() • Progress[] getProgress(): returnsprogressinformation • commonimplementation:newProgress[]{newProgressImpl(remaining, total, Progress.ENTITIES)} • voidclose(): freeresources • Optional: • voidinitialize(UimaContext): maybeusedforopeningfiles etc. 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  26. Steps of Implementing an Annotator • subclasstheuimaFITcomponentJCasAnnotator_ImplBase • voidprocess(JCas)performstheactualanalysis • Optional: • voidinitialize(UimaContext): maybeusedforopeningfiles etc. • alwayscallsuper.initialize(context); publicclassNameAnnotator extendsJCasAnnotator_ImplBase { @Override publicvoidprocess(JCasaJCas) throwsAnalysisEngineProcessException {} } 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  27. Steps of Implementing a CAS Consumer I • uimaFITdoes not distinguishbetween CAS Consumer and Annotation Engine (as UIMA does): • Bothareinitializedalmostidentically in uimaFIT • See implementationofJCasConsumer_ImplBaseandJCasAnnotator_ImplBase • The onlydifferencebetweentheinitializationof a CAS Consumer and an Analysis Engine in uimaFITistheabilityof multi-threading • multi-threading isallowedfor Analysis Enginesbydefault, but itis not allowedfor CAS Consumers 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  28. Steps of Implementing a CAS Consumer II • subclasstheuimaFITcomponentJCasConsumer_ImplBase • voidprocess(JCas)extractsdatafromthe CAS • Optional: • voidinitialize(UimaContext): maybeusedforopeningfilesetc. • alwayscallsuper.initialize(context); • voidcollectionProcessComplete(): iscalledwhen all CASeshavebeenprocessed publicclassAnnotationFrequencyConsumer extendsJCasConsumer_ImplBase { @Override publicvoidprocess(JCasaJCas) throwsAnalysisEngineProcessException{} } 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  29. Create and Configure Your Component - @ConfigurationParameter • uimaFITprovidesuswith a powerful annotation-basedconfigurationmechanism • declarepropertyasfield (any primitive + classeswith String-onlyconstructor, Locale, Pattern, …) • addannotation @ConfigurationParameter • Attributes (excerpt): • name: referredtowhenconfiguringthecomponent • mandatory: failifmissing/null • defaultValue: string publicstatic final String PARAM_DICTIONARY_FILE = "dictionaryFile"; @ConfigurationParameter(name = PARAM_DICTIONARY_FILE, mandatory = true) private File dictionaryFile; 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  30. Create and Configure Your Component: @ConfigurationParameter – Best Practices • Best Practice: usethefieldnameasvalueofthestringconstant • Example: • public static final String PARAM_DICTIONARY_FILE = "dictionaryFile"; • private File dictionaryFile; publicstatic final String PARAM_DICTIONARY_FILE = "dictionaryFile"; @ConfigurationParameter(name = PARAM_DICTIONARY_FILE, mandatory = true) private File dictionaryFile; 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  31. Create and Configure Your Component: @ConfigurationParameter – Best Practices • Best Practice: attributesmandatory, default • Ifpossible, setthedefaultvalue, evenifmandatory=true • Why: componentsare not ableto handle a nullvalue • In theexample, itis not possibletoset a defaultvalue, as a meaningfulvaluecanonlybesetby a user publicstatic final String PARAM_DICTIONARY_FILE = "dictionaryFile"; @ConfigurationParameter(name = PARAM_DICTIONARY_FILE, mandatory = true) private File dictionaryFile; 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  32. Create and Configure Your Component II • uimaFITinstantiatesthecomponentsforyou! • AnalysisEngineFactory.createPrimitiveDescription • foranalysisenginesand CAS consumers • CollectionReaderFactory.createDescription • forcollectionreaders CollectionReaderDescriptionreader = createDescription( TextReader.class, TextReader.PARAM_PATH, "src/test/resources/txt", TextReader.PARAM_PATTERNS, new String[] {"[+]*.txt"}, TextReader.PARAM_LANGUAGE, "de"); AnalysisEngineDescriptionsegmenter = createPrimitiveDescription(BreakIteratorSegmenter.class); AnalysisEngineDescriptionconsumer = createPrimitiveDescription(FrequencyConsumer.class); SimplePipeline.runPipeline(reader, segmenter, consumer); 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  33. Using and Exploring Annotations • The utilityclassorg.uimafit.util.JCasUtilprovidesconvenientaccesstotheannotations. • selectCoveredisthepreferredwaytoretrieveannotationsfromthe CAS int i = 0; for(Sentencesentence : JCasUtil.select(jCas, Sentence.class)) { System.out.println("Tokens ofsentence " + (i++) + ":"); for(Token token : JCasUtil.selectCovered(jCas, Token.class, sentence)) { System.out.println(token.getCoveredText()); } } 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  34. Manually Creating JCas Instances JCasjCas = JCasFactory.createJCas(); jCas.setDocumentText("sometext"); jCas.setDocumentLanguage("en"); // IMPORTANT! AnalysisEngineDescriptiontokenizer = createPrimitiveDescription(MyTokenizer.class); runPipeline(jCas, tokenizer); for(Token token : JCasUtil.select(jCas, Token.class)){ System.out.println(token.getCoveredText()); } 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  35. uimaFIT Best Practices – descriptions Ifavailable, usethe Factory methodsofuimaFITtocreatecomponentdescriptions, e.g., CollectionReaderFactory.createDescription • Why: a readercreatedthiswaycanbeused multiple times in different pipelines (seeexamplepipelinein de.tudarmstadt.kdsl.teaching.dkprocore.intro) 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  36. uimaFIT Best Practices – CollectionReader • Alwayssettheparameter PARAM_LANGUAGE, thisisrequiredbymany Analysis Engines • Alwayssettheparameters PARAM_PATH and PARAM_PATTERNS in combination • PARAM_PATTERNS isspecifiedby ANT-style patterns, i.e., youhavetoset a patternthatspecifiesthefilestobeincluded, seehttp://ant.apache.org/manual/dirtasks.html#patterns • Goodtoknow: CollectionReaderinstancescan also processcompressedfiles (zipformat) 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  37. Type System Auto-Discovery • uimaFITneedstoknowthe XML type systemdescriptor'slocationatruntime, see http://code.google.com/p/uimafit/wiki/TypeDescriptorDetection • Either • createfilesrc/resources/META-INF/types.txt • addpathtoyour XML file in thefollowingmanner: • classpath*:desc/types/*.xml • (uimaFITwill takeintoaccountany XML file in desc/types) • Or • addVM optionto Launch Configuration: • -Dorg.apache.uima.fit.type.import_pattern=classpath*:desc/types/*.xml • Formoreinformationsee Chapter 7 oftheuimaFitGuide at http://code.google.com/p/uimafit 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  38. Can youanswerthesequestions? • Whatis UIMA? • What is uimaFIT? • WhatisthebenefitofusinguimaFITcomponentdescriptions? • What is the basic structure of UIMA-based projects? • Whatis an Annotation? • How do you create a new annotation type? • How do you add annotations to a JCas? • Why do you need to call addToIndexes()? • When do you need different views of an artifact? • How to implement a Collection Reader? (Annotator, CAS Consumer) 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  39. Exercises (I) • Take a lookatuimaFIT’sJCasUtil • UIMA Basics • Exploretheproject • Pipeline, CR, AE, Consumer • TypesystemDescriptor: • src/test/resources/desc/types/TypeSystem.xml • src/test/resources/META-INF/org.uimafit/types.txt • Micro-corpus • src/test/resources/txt • (optional) explorethestructureofthemultimoduleproject • pom.xml • aggregator's pom.xml 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  40. Exercises (II) • UIMA Exploring • Objective: Write your own pipeline and analyze the results • Get the uimaexploring.exercise project • Write your own NameAnnotator which looks up each token in a name list (src/main/resources/dictionaries/names.txt) • read in dictionary in initialize(UimaContext) method • Write a NamePrintConsumer which nicely prints out your name annotations; output how many name annotations you have assigned (for each document/all documents in total) • Hint: collectionProcessComplete() may be helpful • Serialize your CASes to XML and use the GUI tools to examine their contents 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

  41. References • T. Götz, O. Suhre, 2004: Design andimplementationofthe UIMA Common Analysis System, IBM Systems Journal Vol 43 #3, p. 476-489 • http://uima.apache.org/doc-uima-why.html • http://uimafit.googlecode.com/svn/tags/uimafit-parent-1.4.0/apidocs/index.html 29.05.2013 | Dr. J. Eckle-Kohler, R. Eckart de Castilho, R. Kluge, Dr. T. Zesch

More Related