Tom Page
2019-03-19 14:10:21 +00:00
5 changed files with 21 additions and 772 deletions

View File

@@ -81,7 +81,7 @@
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</version>
<version>1.7.26</version>
</dependency>
<!-- Test dependencies -->
@@ -108,7 +108,7 @@
<dependency>
<groupId>com.carrotsearch.randomizedtesting</groupId>
<artifactId>randomizedtesting-runner</artifactId>
<version>2.5.0</version>
<version>2.7.2</version>
<scope>test</scope>
</dependency>
<dependency>
@@ -117,21 +117,6 @@
<version>1.1.0</version>
<scope>test</scope>
</dependency>
<!-- NLP -->
<dependency>
<groupId>edu.emory.mathcs.nlp</groupId>
<artifactId>nlp4j</artifactId>
<version>1.1.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>edu.emory.mathcs.nlp</groupId>
<artifactId>nlp4j-english</artifactId>
<version>1.1.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>

View File

@@ -1,189 +0,0 @@
/*
* Copyright (C) 2005-2013 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.solr.nlp;
import java.io.ByteArrayInputStream;
import java.io.StringReader;
import java.text.BreakIterator;
import edu.emory.mathcs.nlp.decode.AbstractNLPDecoder;
import edu.emory.mathcs.nlp.decode.DecodeConfig;
import edu.emory.mathcs.nlp.decode.NLPDecoder;
/**
* @author Andy
*
*/
public class NLPFilter
{
/**
*
*/
private static final String S_12 = "Everyone please note my blog on Donews http://blog.donews.com/pangshengdong. What I say is not necessarily right, but I am confident that if you read it carefully it should give you a start.";
/**
*
*/
private static final String S_11 = "The JW considers itself THE kingdom of God on earth. ('Kindom Hall') So it is only to be expected that they do not see a reason to run to and report everything to the government.";
/**
*
*/
private static final String S_10 = "\"It's too much, there's only us two, how are we going to eat this?\" I asked young Zhao as I looked at him in surprise.";
/**
*
*/
private static final String S_9 = "Wang first asked: \"Are you sure you want the original inscription ground off?\" Without thinking twice about it, Huang said yes.";
/**
*
*/
private static final String S_8 = "The agency said it confirmed American Continental's preferred stock rating at C. American Continental's thrift unit, Los Angeles-based Lincoln Savings & Loan Association, is in receivership and the parent company has filed for protection from creditor lawsuits under Chapter 11 of the federal Bankruptcy Code.";
/**
*
*/
private static final String S_7 = "Bharat Ratna Avul Pakir Jainulabdeen Abdul Kalam is also called as Dr. A.P.J Abdul Kalam.";
/**
*
*/
private static final String S_6 = "After seeing the list of what would not be open and/or on duty... which I'm also quite sure is not complete... I 'll go out on a limb.... and predict... that this will not happen.";
/**
*
*/
private static final String S_5 = "No, to my mind, the Journal did not \"defend sleaze, fraud, waste, embezzlement, influence-peddling and abuse of the public trust...\" it defended appropriate constitutional safeguards and practical common sense.";
/**
*
*/
private static final String S_4 = "The luxury auto maker last year sold 1,214 cars in the U.S. Howard Mosher, president and chief executive officer, said he anticipates growth for the luxury auto maker in Britain and Europe, and in Far Eastern markets.";
private static final String S_1 = "At some schools, even professionals boasting Ph.D. degrees are coming back to school for Master's degrees.";
private static final String S_2 = "If Harvard doesn't come through, I 'll take the test to get into Yale. many parents set goals for their children, or maybe they don't set a goal.";
private static final String S_3 = "He adds, in a far less amused tone, that the government has been talking about making Mt. Kuanyin a national park for a long time, and has banned construction or use of the mountain.";
public static void main(String[] args)
{
NLPDecoder decoder = new NLPDecoder(new ByteArrayInputStream(getXMLConfig().getBytes()));
String output = decoder.decode("Andy Hind is a Techincal Architext at Alfresco Software in Maidenhead, England. He has worked there for 11 years sinces Aug 2005. Alfresco is Great! London is the capital city of England where Mr Fish lives. My dog has no nose. how does he smell? Awful! N.B.C broadcast stuff in 1984", AbstractNLPDecoder.FORMAT_RAW);
System.out.println(output);
System.out.println();
output = decoder.decode(S_1, AbstractNLPDecoder.FORMAT_RAW);
System.out.println(output);
System.out.println();
output = decoder.decode(S_2, AbstractNLPDecoder.FORMAT_RAW);
System.out.println(output);
System.out.println();
output = decoder.decode(S_3, AbstractNLPDecoder.FORMAT_RAW);
System.out.println(output);
System.out.println();
output = decoder.decode(S_4, AbstractNLPDecoder.FORMAT_RAW);
System.out.println(output);
System.out.println();
output = decoder.decode(S_5, AbstractNLPDecoder.FORMAT_RAW);
System.out.println(output);
System.out.println();
output = decoder.decode(S_6, AbstractNLPDecoder.FORMAT_RAW);
System.out.println(output);
System.out.println();
output = decoder.decode(S_7, AbstractNLPDecoder.FORMAT_RAW);
System.out.println(output);
System.out.println();
output = decoder.decode(S_8, AbstractNLPDecoder.FORMAT_RAW);
System.out.println(output);
System.out.println();
output = decoder.decode(S_9, AbstractNLPDecoder.FORMAT_RAW);
System.out.println(output);
System.out.println();
output = decoder.decode(S_10, AbstractNLPDecoder.FORMAT_RAW);
System.out.println(output);
System.out.println();
output = decoder.decode(S_11, AbstractNLPDecoder.FORMAT_RAW);
System.out.println(output);
System.out.println();
output = decoder.decode(S_12, AbstractNLPDecoder.FORMAT_RAW);
System.out.println(output);
System.out.println();
BreakIterator bi = BreakIterator.getSentenceInstance();
bi.setText(S_1);
printEachForward(bi, S_1);
System.out.println("============================");
bi.setText(S_2);
printEachForward(bi, S_2);
System.out.println("============================");
bi.setText(S_3);
printEachForward(bi, S_3);
System.out.println("============================");
bi.setText(S_4);
printEachForward(bi, S_4);
System.out.println("============================");
bi.setText(S_5);
printEachForward(bi, S_5);
System.out.println("============================");
bi.setText(S_6);
printEachForward(bi, S_6);
System.out.println("============================");
bi.setText(S_7);
printEachForward(bi, S_7);
System.out.println("============================");
bi.setText(S_8);
printEachForward(bi, S_8);
System.out.println("============================");
bi.setText(S_9);
printEachForward(bi, S_9);
System.out.println("============================");
bi.setText(S_10);
printEachForward(bi, S_10);
System.out.println("============================");
bi.setText(S_11);
printEachForward(bi, S_11);
System.out.println("============================");
bi.setText(S_12);
printEachForward(bi, S_12);
System.out.println("============================");
}
public static void printEachForward(BreakIterator boundary, String source) {
int start = boundary.first();
for (int end = boundary.next();
end != BreakIterator.DONE;
start = end, end = boundary.next()) {
System.out.println(source.substring(start,end));
}
}
private static String getXMLConfig()
{
return "<configuration>\n"
+ " <lexica>\n"
+ " <ambiguity_classes field=\"word_form_simplified_lowercase\">edu/emory/mathcs/nlp/lexica/en-ambiguity-classes-simplified-lowercase.xz</ambiguity_classes>\n"
+ " <word_clusters field=\"word_form_simplified_lowercase\">edu/emory/mathcs/nlp/lexica/en-brown-clusters-simplified-lowercase.xz</word_clusters>\n"
+ " <named_entity_gazetteers field=\"word_form_simplified\">edu/emory/mathcs/nlp/lexica/en-named-entity-gazetteers-simplified.xz</named_entity_gazetteers>\n"
+ " <word_embeddings field=\"word_form_undigitalized\">edu/emory/mathcs/nlp/lexica/en-word-embeddings-undigitalized.xz</word_embeddings>\n"
+ " </lexica>\n"
+ " <models>\n"
+ " <pos>edu/emory/mathcs/nlp/models/en-pos.xz</pos>\n"
+ " <ner>edu/emory/mathcs/nlp/models/en-ner.xz</ner>\n"
+ " <dep>edu/emory/mathcs/nlp/models/en-dep.xz</dep>\n"
+ " </models>\n"
+ "</configuration>\n";
}
}

View File

@@ -1,546 +0,0 @@
/*
* Copyright (C) 2005-2013 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.solr.nlp;
/*
Porter stemmer in Java. The original paper is in
Porter, 1980, An algorithm for suffix stripping, Program, Vol. 14,
no. 3, pp 130-137,
See also http://www.tartarus.org/~martin/PorterStemmer/index.html
Bug 1 (reported by Gonzalo Parra 16/10/99) fixed as marked below.
Tthe words 'aed', 'eed', 'oed' leave k at 'a' for step 3, and b[k-1]
is then out outside the bounds of b.
Similarly,
Bug 2 (reported by Steve Dyrdahl 22/2/00) fixed as marked below.
'ion' by itself leaves j = -1 in the test for 'ion' in step 5, and
b[j] is then outside the bounds of b.
Release 3.
[ This version is derived from Release 3, modified by Brian Goetz to
optimize for fewer object creations. ]
*/
import java.io.IOException;
import java.io.InputStream;
import java.io.FileInputStream;
import org.apache.lucene.util.ArrayUtil;
/**
*
* Stemmer, implementing the Porter Stemming Algorithm
*
* The Stemmer class transforms a word into its root form. The input
* word can be provided a character at time (by calling add()), or at once
* by calling one of the various stem(something) methods.
*/
class PorterStemmer
{
private char[] b;
private int i, /* offset into b */
j, k, k0;
private boolean dirty = false;
private static final int INITIAL_SIZE = 50;
public PorterStemmer() {
b = new char[INITIAL_SIZE];
i = 0;
}
/**
* reset() resets the stemmer so it can stem another word. If you invoke
* the stemmer by calling add(char) and then stem(), you must call reset()
* before starting another word.
*/
public void reset() { i = 0; dirty = false; }
/**
* Add a character to the word being stemmed. When you are finished
* adding characters, you can call stem(void) to process the word.
*/
public void add(char ch) {
if (b.length <= i) {
b = ArrayUtil.grow(b, i+1);
}
b[i++] = ch;
}
/**
* After a word has been stemmed, it can be retrieved by toString(),
* or a reference to the internal buffer can be retrieved by getResultBuffer
* and getResultLength (which is generally more efficient.)
*/
@Override
public String toString() { return new String(b,0,i); }
/**
* Returns the length of the word resulting from the stemming process.
*/
public int getResultLength() { return i; }
/**
* Returns a reference to a character buffer containing the results of
* the stemming process. You also need to consult getResultLength()
* to determine the length of the result.
*/
public char[] getResultBuffer() { return b; }
/* cons(i) is true <=> b[i] is a consonant. */
private final boolean cons(int i) {
switch (b[i]) {
case 'a': case 'e': case 'i': case 'o': case 'u':
return false;
case 'y':
return (i==k0) ? true : !cons(i-1);
default:
return true;
}
}
/* m() measures the number of consonant sequences between k0 and j. if c is
a consonant sequence and v a vowel sequence, and <..> indicates arbitrary
presence,
<c><v> gives 0
<c>vc<v> gives 1
<c>vcvc<v> gives 2
<c>vcvcvc<v> gives 3
....
*/
private final int m() {
int n = 0;
int i = k0;
while(true) {
if (i > j)
return n;
if (! cons(i))
break;
i++;
}
i++;
while(true) {
while(true) {
if (i > j)
return n;
if (cons(i))
break;
i++;
}
i++;
n++;
while(true) {
if (i > j)
return n;
if (! cons(i))
break;
i++;
}
i++;
}
}
/* vowelinstem() is true <=> k0,...j contains a vowel */
private final boolean vowelinstem() {
int i;
for (i = k0; i <= j; i++)
if (! cons(i))
return true;
return false;
}
/* doublec(j) is true <=> j,(j-1) contain a double consonant. */
private final boolean doublec(int j) {
if (j < k0+1)
return false;
if (b[j] != b[j-1])
return false;
return cons(j);
}
/* cvc(i) is true <=> i-2,i-1,i has the form consonant - vowel - consonant
and also if the second c is not w,x or y. this is used when trying to
restore an e at the end of a short word. e.g.
cav(e), lov(e), hop(e), crim(e), but
snow, box, tray.
*/
private final boolean cvc(int i) {
if (i < k0+2 || !cons(i) || cons(i-1) || !cons(i-2))
return false;
else {
int ch = b[i];
if (ch == 'w' || ch == 'x' || ch == 'y') return false;
}
return true;
}
private final boolean ends(String s) {
int l = s.length();
int o = k-l+1;
if (o < k0)
return false;
for (int i = 0; i < l; i++)
if (b[o+i] != s.charAt(i))
return false;
j = k-l;
return true;
}
/* setto(s) sets (j+1),...k to the characters in the string s, readjusting
k. */
void setto(String s) {
int l = s.length();
int o = j+1;
for (int i = 0; i < l; i++)
b[o+i] = s.charAt(i);
k = j+l;
dirty = true;
}
/* r(s) is used further down. */
void r(String s) { if (m() > 0) setto(s); }
/* step1() gets rid of plurals and -ed or -ing. e.g.
caresses -> caress
ponies -> poni
ties -> ti
caress -> caress
cats -> cat
feed -> feed
agreed -> agree
disabled -> disable
matting -> mat
mating -> mate
meeting -> meet
milling -> mill
messing -> mess
meetings -> meet
*/
private final void step1() {
if (b[k] == 's') {
if (ends("sses")) k -= 2;
else if (ends("ies")) setto("i");
else if (b[k-1] != 's') k--;
}
if (ends("eed")) {
if (m() > 0)
k--;
}
else if ((ends("ed") || ends("ing")) && vowelinstem()) {
k = j;
if (ends("at")) setto("ate");
else if (ends("bl")) setto("ble");
else if (ends("iz")) setto("ize");
else if (doublec(k)) {
int ch = b[k--];
if (ch == 'l' || ch == 's' || ch == 'z')
k++;
}
else if (m() == 1 && cvc(k))
setto("e");
}
}
/* step2() turns terminal y to i when there is another vowel in the stem. */
private final void step2() {
if (ends("y") && vowelinstem()) {
b[k] = 'i';
dirty = true;
}
}
/* step3() maps double suffices to single ones. so -ization ( = -ize plus
-ation) maps to -ize etc. note that the string before the suffix must give
m() > 0. */
private final void step3() {
if (k == k0) return; /* For Bug 1 */
switch (b[k-1]) {
case 'a':
if (ends("ational")) { r("ate"); break; }
if (ends("tional")) { r("tion"); break; }
break;
case 'c':
if (ends("enci")) { r("ence"); break; }
if (ends("anci")) { r("ance"); break; }
break;
case 'e':
if (ends("izer")) { r("ize"); break; }
break;
case 'l':
if (ends("bli")) { r("ble"); break; }
if (ends("alli")) { r("al"); break; }
if (ends("entli")) { r("ent"); break; }
if (ends("eli")) { r("e"); break; }
if (ends("ousli")) { r("ous"); break; }
break;
case 'o':
if (ends("ization")) { r("ize"); break; }
if (ends("ation")) { r("ate"); break; }
if (ends("ator")) { r("ate"); break; }
break;
case 's':
if (ends("alism")) { r("al"); break; }
if (ends("iveness")) { r("ive"); break; }
if (ends("fulness")) { r("ful"); break; }
if (ends("ousness")) { r("ous"); break; }
break;
case 't':
if (ends("aliti")) { r("al"); break; }
if (ends("iviti")) { r("ive"); break; }
if (ends("biliti")) { r("ble"); break; }
break;
case 'g':
if (ends("logi")) { r("log"); break; }
}
}
/* step4() deals with -ic-, -full, -ness etc. similar strategy to step3. */
private final void step4() {
switch (b[k]) {
case 'e':
if (ends("icate")) { r("ic"); break; }
if (ends("ative")) { r(""); break; }
if (ends("alize")) { r("al"); break; }
break;
case 'i':
if (ends("iciti")) { r("ic"); break; }
break;
case 'l':
if (ends("ical")) { r("ic"); break; }
if (ends("ful")) { r(""); break; }
break;
case 's':
if (ends("ness")) { r(""); break; }
break;
}
}
/* step5() takes off -ant, -ence etc., in context <c>vcvc<v>. */
private final void step5() {
if (k == k0) return; /* for Bug 1 */
switch (b[k-1]) {
case 'a':
if (ends("al")) break;
return;
case 'c':
if (ends("ance")) break;
if (ends("ence")) break;
return;
case 'e':
if (ends("er")) break; return;
case 'i':
if (ends("ic")) break; return;
case 'l':
if (ends("able")) break;
if (ends("ible")) break; return;
case 'n':
if (ends("ant")) break;
if (ends("ement")) break;
if (ends("ment")) break;
/* element etc. not stripped before the m */
if (ends("ent")) break;
return;
case 'o':
if (ends("ion") && j >= 0 && (b[j] == 's' || b[j] == 't')) break;
/* j >= 0 fixes Bug 2 */
if (ends("ou")) break;
return;
/* takes care of -ous */
case 's':
if (ends("ism")) break;
return;
case 't':
if (ends("ate")) break;
if (ends("iti")) break;
return;
case 'u':
if (ends("ous")) break;
return;
case 'v':
if (ends("ive")) break;
return;
case 'z':
if (ends("ize")) break;
return;
default:
return;
}
if (m() > 1)
k = j;
}
/* step6() removes a final -e if m() > 1. */
private final void step6() {
j = k;
if (b[k] == 'e') {
int a = m();
if (a > 1 || a == 1 && !cvc(k-1))
k--;
}
if (b[k] == 'l' && doublec(k) && m() > 1)
k--;
}
/**
* Stem a word provided as a String. Returns the result as a String.
*/
public String stem(String s) {
if (stem(s.toCharArray(), s.length()))
return toString();
else
return s;
}
/** Stem a word contained in a char[]. Returns true if the stemming process
* resulted in a word different from the input. You can retrieve the
* result with getResultLength()/getResultBuffer() or toString().
*/
public boolean stem(char[] word) {
return stem(word, word.length);
}
/** Stem a word contained in a portion of a char[] array. Returns
* true if the stemming process resulted in a word different from
* the input. You can retrieve the result with
* getResultLength()/getResultBuffer() or toString().
*/
public boolean stem(char[] wordBuffer, int offset, int wordLen) {
reset();
if (b.length < wordLen) {
b = new char[ArrayUtil.oversize(wordLen, Character.BYTES)];
}
System.arraycopy(wordBuffer, offset, b, 0, wordLen);
i = wordLen;
return stem(0);
}
/** Stem a word contained in a leading portion of a char[] array.
* Returns true if the stemming process resulted in a word different
* from the input. You can retrieve the result with
* getResultLength()/getResultBuffer() or toString().
*/
public boolean stem(char[] word, int wordLen) {
return stem(word, 0, wordLen);
}
/** Stem the word placed into the Stemmer buffer through calls to add().
* Returns true if the stemming process resulted in a word different
* from the input. You can retrieve the result with
* getResultLength()/getResultBuffer() or toString().
*/
public boolean stem() {
return stem(0);
}
public boolean stem(int i0) {
k = i - 1;
k0 = i0;
if (k > k0+1) {
step1(); step2(); step3(); step4(); step5(); step6();
}
// Also, a word is considered dirty if we lopped off letters
// Thanks to Ifigenia Vairelles for pointing this out.
if (i != k+1)
dirty = true;
i = k+1;
return dirty;
}
/* Test program for demonstrating the Stemmer. It reads a file and
* stems each word, writing the result to standard out.
* Usage: Stemmer file-name
public static void main(String[] args) {
PorterStemmer s = new PorterStemmer();
for (int i = 0; i < args.length; i++) {
try {
InputStream in = new FileInputStream(args[i]);
byte[] buffer = new byte[1024];
int bufferLen, offset, ch;
bufferLen = in.read(buffer);
offset = 0;
s.reset();
while(true) {
if (offset < bufferLen)
ch = buffer[offset++];
else {
bufferLen = in.read(buffer);
offset = 0;
if (bufferLen < 0)
ch = -1;
else
ch = buffer[offset++];
}
if (Character.isLetter((char) ch)) {
s.add(Character.toLowerCase((char) ch));
}
else {
s.stem();
System.out.print(s.toString());
s.reset();
if (ch < 0)
break;
else {
System.out.print((char) ch);
}
}
}
in.close();
}
catch (IOException e) {
System.out.println("error reading " + args[i]);
}
}
}*/
}

View File

@@ -22,7 +22,7 @@
</distributionManagement>
<properties>
<dependency.alfresco-data-model.version>8.24</dependency.alfresco-data-model.version>
<dependency.alfresco-data-model.version>8.28</dependency.alfresco-data-model.version>
</properties>
<dependencies>
@@ -43,12 +43,11 @@
<artifactId>jackson-annotations</artifactId>
<version>2.9.8</version>
</dependency>
<!-- provided dependencies -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
<version>3.1.0</version>
</dependency>
<!-- Test dependencies -->
@@ -67,7 +66,7 @@
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
<version>1.7.26</version>
</dependency>
</dependencies>

View File

@@ -35,7 +35,7 @@ json-20160212.jar http://code.google.com/p/json-simple/
xml-resolver-1.2.jar https://github.com/FasterXML/jackson
neethi-3.0.3.jar http://ws.apache.org/commons/neethi/
commons-logging-1.2.jar http://jakarta.apache.org/commons/
commons-lang3-3.4.jar http://jakarta.apache.org/commons/
commons-lang3-3.8.1.jar http://jakarta.apache.org/commons/
spring-web-3.2.14.RELEASE.jar http://projects.spring.io/spring-framework/
mybatis-3.3.0.jar http://www.mybatis.org/
chemistry-opencmis-commons-impl-1.1.0.jar http://chemistry.apache.org/
@@ -59,16 +59,16 @@ quartz-2.3.0.jar http://quartz-scheduler.org/
jackson-core-2.9.8.jar http://jackson.codehaus.org/
jackson-annotations-2.9.8.jar http://jackson.codehaus.org/
commons-httpclient-3.1-HTTPCLIENT-1265.jar http://jakarta.apache.org/commons/
spring-beans-5.0.4.RELEASE.jar http://projects.spring.io/spring-framework/
spring-core-5.0.4.RELEASE.jar http://projects.spring.io/spring-framework/
spring-context-5.0.4.RELEASE.jar http://projects.spring.io/spring-framework/
spring-jdbc-5.0.4.RELEASE.jar http://projects.spring.io/spring-framework/
spring-expression-5.0.4.RELEASE.jar http://projects.spring.io/spring-framework/
spring-orm-5.0.4.RELEASE.jar http://projects.spring.io/spring-framework/
spring-jcl-5.0.4.RELEASE.jar http://projects.spring.io/spring-framework/
spring-aop-5.0.4.RELEASE.jar http://projects.spring.io/spring-framework/
spring-tx-5.0.4.RELEASE.jar http://projects.spring.io/spring-framework/
spring-context-support-5.0.4.RELEASE.jar http://projects.spring.io/spring-framework/
spring-aop-5.1.4.RELEASE.jar http://projects.spring.io/spring-framework/
spring-beans-5.1.4.RELEASE.jar http://projects.spring.io/spring-framework/
spring-context-5.1.4.RELEASE.jar http://projects.spring.io/spring-framework/
spring-context-support-5.1.4.RELEASE.jar http://projects.spring.io/spring-framework/
spring-core-5.1.4.RELEASE.jar http://projects.spring.io/spring-framework/
spring-expression-5.1.4.RELEASE.jar http://projects.spring.io/spring-framework/
spring-jcl-5.1.4.RELEASE.jar http://projects.spring.io/spring-framework/
spring-jdbc-5.1.4.RELEASE.jar http://projects.spring.io/spring-framework/
spring-orm-5.1.4.RELEASE.jar http://projects.spring.io/spring-framework/
spring-tx-5.1.4.RELEASE.jar http://projects.spring.io/spring-framework/
xercesImpl-2.11.0-alfresco-patched-20180402.jar http://xerces.apache.org/xerces2-j
guessencoding-1.4.jar http://docs.codehaus.org/display/GUESSENC/
xml-apis-1.4.01.jar https://github.com/FasterXML/jackson
@@ -77,19 +77,19 @@ acegi-security-0.8.2_patched.jar http://sourceforge.net/projects/acegisec
=== CDDL 1.0 ===
jta-1.0.1b.jar http://geronimo.apache.org/
jta-1.1.jar http://geronimo.apache.org/
=== CDDL 1.1 ===
jaxb-core-2.3.0.1.jar http://jaxb.java.net/
jaxb-api-2.3.1.jar http://jaxb.java.net/
jaxb-impl-2.3.1.jar http://jaxb.java.net/
jaxb-xjc-2.3.1.jar http://jaxb.java.net/
jaxb-impl-2.3.2.jar http://jaxb.java.net/
jaxb-xjc-2.3.2.jar http://jaxb.java.net/
javax.activation-api-1.2.0.jar https://github.com/javaee/activation/blob/master/LICENSE.txt
=== BSD ===
jibx-run-1.2.6.jar http://jibx.sourceforge.net/
jibx-run-1.3.1.jar http://jibx.sourceforge.net/
=== Part of Apache Solr (Licenses listed separately) ===