http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/climatology/clim/wls.py
----------------------------------------------------------------------
diff --git a/climatology/clim/wls.py b/climatology/clim/wls.py
new file mode 100755
index 0000000..d7ed8a5
--- /dev/null
+++ b/climatology/clim/wls.py
@@ -0,0 +1,798 @@
+#!/usr/bin/env python
+#-----------------------------------------------------------------------------
+# Name:        filelist.py
+# Purpose:     File listing class/functions.
+#
+# Author:      Brian Wilson
+#
+# Created:     Mon Apr 10 11:01:06 2006
+# Copyright:   (c) 2006, California Institute of Technology.
+#              U.S. Government Sponsorship acknowledged.
+#-----------------------------------------------------------------------------
+#
+USAGE = """
+filelist.py [--help] [--bottomUp] [--directory] [--delete]
+            [--fetchDir <outputDir>] [--fetchWitSubDirs]
+            [--list] [--matchUrl] --quiet] [--regex '.*\.[cC]']
+            [--size] [--topOnly] [--url]
+            [--wildcard '*.txt.*'] [--xml]  <topPaths ...>
+
+Recursively traverse and print (with full paths or URL's) all files
+under the topPath(s) that match ANY of one or more regular expressions
+and/or wildcard glob) strings.  By default, it simply prints the matches,
+but one can also get their sizes, fetch them, or delete them.
+
+The topPaths can be a mixture of local and remote (ftp or http)
+paths, in which case a list of URL's is returned.  If xml mode is
+turned on, then the output is an XML list.
+
+If no regex or wildcard patterns are specified, then ALL files
+are returned.  If files are fetched, then the URL's are
+REWRITTEN to point to the local copies.
+
+"""
+# See the bottom of the file for exact switches and example of use.
+
+import sys, os, re, string, getopt, types, getpass
+import urllib, urllib2, urlparse, time, shutil, socket, stat
+from fnmatch import fnmatchcase
+from ftplib import FTP
+#import dataenc
+
+def matchAnyThenConstrain(root, name, haveRegs, regs, haveWilds, wildCards,
+                          constraintFunction):
+    """Return True if the file name matches any of the compiled regular
+    expressions or any of the wildcard (glob) specs, and (if present) the
+    constraintFunction returns True.  The regex can be a pair of match &
+    substitution patterns.  The 'name' of the file might be altered by a
+    regex substitution and/or the constraintFunction.
+    """
+    if not haveRegs and not haveWilds:
+        if constraintFunction is not None:
+            return constraintFunction(root, name)
+        else:
+            return (True, name)
+    else:
+        match = False
+        if haveRegs:
+            for reg in regs:
+                pattern, subst = reg
+                if pattern.search(name):
+                    match = True
+                    if subst:
+                        name = pattern.sub(subst, name)
+                    break
+        if haveWilds and not match:
+            for wild in wildCards:
+                if fnmatchcase(name, wild):
+                    match = True
+                    break
+        if match and constraintFunction is not None:
+            match, name = constraintFunction(root, name)
+        return (match, name)
+
+
+# Users call this function
+def filelist(urlPaths, regSpecs=[], wildCards=[], needCredentials=False, 
userCredentials=None,
+             matchFunction=matchAnyThenConstrain, constraintFunction=None,
+             matchUrl=False, walkDirectories=True,
+             urlMode=True, xmlMode=True, quietMode=False, verboseMode=False, 
getFileInfo=False,
+             fetchDir=None, fetchIfNewer=False, fetchWithSubDirs=False,
+             directoryMode=False, listMode=False, deleteMode=False, 
topDown=True,
+             stream=sys.stdout):
+    """Recursively traverse and print (with full paths or URL's) all files
+    under the topPath(s) that match one or more regular expressions and/or
+    wildcard (glob) strings, and an optional constraint (T/F) function to
+    further winnow the candidate matches.  (The matchFunction can also be
+    entirely replaced with custom logic.)
+
+    By default, it simply generates the matches, but one can also fetch them,
+    get their sizes, or delete them (if they are local files).
+    Handles local directory paths and ftp/http URL's.
+
+    Returns three file lists: matched, actually fetched, & destination names.
+    """
+    try:
+        matchedFiles = []       # source files that match criteria
+        fetchedFiles = []       # files that were actually fetched this run
+        destinationFiles = []   # destination (local) file names (rewritten 
URL)
+
+        topPaths = []
+        for url in urlPaths:
+            if url == '' or url == None: continue
+            remote, protocol, netloc, path = remoteUrl(url)
+            if not remote: url = os.path.abspath(url)
+            if url[-1] == '/': url = url[:-1]
+            topPaths.append(url)
+
+        if needCredentials and userCredentials is None:
+            userCredentials = promptForCredentials(topPaths)
+
+        if fetchDir:
+            workDir = os.path.join(fetchDir, '.tmp')
+            # fetch into tmp directory & then rename so fetching is atomic
+            try: os.mkdir(workDir)
+            except: pass
+            if not os.path.exists(workDir):
+                die("filelist: Cannot write to fetch directory %s" % fetchDir)
+
+        if isinstance(topPaths, types.StringType): topPaths = [topPaths]
+        regSpecs = [s for s in regSpecs if s != '' and s != None]
+        wildCards = [s for s in wildCards if s != '' and s != None]
+
+        haveRegs = False; regs = []; haveWilds = False; haveMatchFunction = 
False
+        if len(regSpecs) > 0:
+            haveRegs = True
+            regs = []
+            for reg in regSpecs:
+                (pattern, subst) = parse_re_with_subst(reg)
+                regs.append( (re.compile(pattern), subst) )
+        if len(wildCards) > 0:
+            haveWilds = True
+
+        prefix = ''
+        extra = ''
+        suffix = ''
+        if deleteMode:
+            suffix += ' deleted.'
+            if '.' in topPaths:
+                die("filelist: Recursively deleting from the dot (.) path is 
not safe.  Shame.")
+
+        if directoryMode: listMode = False
+        if listMode: getFileInfo = True
+        if quietMode: stream = None
+        sumSizes = 0
+        if xmlMode:
+            matchedFiles.append('<files>')
+            fetchedFiles.append('<files>')
+            _output('<files>', destinationFiles, stream)
+            prefix += '  <file>'
+            suffix += '</file>'
+
+        for top in topPaths:
+            if verboseMode: warn('filelist: searching', top)
+            topMatchCount = 0; topFetchCount = 0
+
+            for root, dirs, files, infos in walk(top, userCredentials, 
walkDirectories, topDown):
+                if verboseMode: warn('filelist: found files in', root)
+                remote, protocol, netloc, path = remoteUrl(root)
+                if directoryMode:
+                    contents = dirs
+                else:
+                    contents = files
+
+                for i in range(len(contents)):
+                    line = ''
+                    file = contents[i]
+                    try:
+                        info = infos[i]
+                    except:
+                        info = None
+                    if matchUrl:
+                        name = os.path.join(root, file)
+                    else:
+                        name = file
+
+                    match, newname = matchFunction(root, name, haveRegs, regs,
+                                                   haveWilds, wildCards, 
constraintFunction)
+                    if match:
+                        line = ''
+                        topMatchCount += 1
+                        fn = os.path.join(root, file)
+
+                        if getFileInfo or (fetchIfNewer and not remote):
+                            if remote:
+                                if info and getFileInfo:
+                                    if listMode: line = info.line
+                                    extra = ' ' + str(info.size) + ' ' + 
str(info.modTime)
+                                    sumSizes += info.size
+                            else:
+                                st = os.stat(fn)
+                                line = ' '.join( map(str, \
+                                        (st.st_mode, st.st_uid, st.st_gid, 
st.st_size, st.st_mtime, fn)))
+                                info = FileInfo(line, st.st_size, st.st_mtime, 
st.st_uid, st.st_gid, st.st_mode)
+                                if getFileInfo:
+                                    extra = ' ' + str(info.size) + ' ' + 
str(info.modTime)
+                                    sumSizes += info.size
+
+                        if not remote and urlMode: fn = makeFileUrl(fn)
+                        matchedFiles.append(prefix + fn + extra + suffix)
+
+                        if matchUrl:
+                            newfn = newname
+                        else:
+                            newfn = os.path.join(root, newname)
+                        newr, newp, newloc, newpath = remoteUrl(newfn)
+                        newfile = os.path.split(newpath)[1]
+
+                        if fetchDir:
+                            if fetchDir == '.': fetchDir = os.getcwd()
+                            if fetchWithSubDirs:
+                                destDir = os.path.join(fetchDir, newpath[1:])
+                            else:
+                                destDir = fetchDir
+                                destFile = os.path.join(destDir, newfile)
+                                tmpFile = os.path.join(workDir, newfile)
+
+                            if shouldFetch(remote, destFile, fetchIfNewer, 
info):
+                                if not quietMode:
+                                    warn('filelist: Fetching ', fn)
+                                    warn('filelist: Writing  ', destFile)
+                                try:
+                                    os.makedirs(destDir)
+                                except:
+                                    # kludge, makedirs throws exception if any 
part of path exists
+                                    pass
+                                if remote:
+                                    urllib.urlretrieve(fn, tmpFile)
+                                else:
+                                    shutil.copyfile(fn, tmpFile)
+                                os.rename(tmpFile, destFile)   # atomic rename 
of file into destDir
+
+                                topFetchCount += 1
+                                fetchedFiles.append(prefix + fn + suffix)
+                                if getFileInfo: line = line + ' ' + destFile
+
+                                # now rewrite URL to point to local copy of 
file
+                                fn = destFile
+                                if not remote and urlMode: fn = makeFileUrl(fn)
+
+                        if not listMode:
+                            line = prefix + fn + extra + suffix
+                        _output(line, destinationFiles, stream)
+                        if deleteMode:
+                            if remote:
+                                die('filelist: Cannot delete remote files 
(yet)')
+                            else:
+                                os.unlink(fn)
+
+            if verboseMode and fetchDir:
+                warn('filelist: Matched %d files from %s' % (topMatchCount, 
top))
+                warn('filelist: Fetched %d files from %s' % (topFetchCount, 
top))
+        if fetchDir:
+            for f in os.listdir(workDir): os.remove(os.path.join(workDir, f))
+            os.rmdir(workDir)
+
+        if xmlMode:
+            matchedFiles.append('</files>')
+            fetchedFiles.append('</files>')
+            _output('<files>', destinationFiles, stream)
+
+        if getFileInfo:
+            if xmlMode:
+                line = '<totalSize>%s</totalSize>' % sumSizes
+            else:
+                line = '#filelist: total size %s' % sumSizes
+            matchedFiles.append(line)
+            _output(line, destinationFiles, stream)
+
+    except KeyboardInterrupt:
+        if fetchDir:
+            for f in os.listdir(workDir): os.remove(os.path.join(workDir, f))
+            os.rmdir(workDir)
+        die('filelist: Keyboard Interrupt')
+
+    return (matchedFiles, fetchedFiles, destinationFiles)
+
+
+def shouldFetch(remote, destFile, fetchIfNewer, srcFileInfo):
+    if remote:
+        if os.path.exists(destFile):
+            doFetch = False
+        else:
+            doFetch = True
+    else:
+        if os.path.exists(destFile):
+            if fetchIfNewer:
+                destModTime = os.path.getmtime(destFile)
+                if destModTime < srcFileInfo.modTime:
+                    doFetch = True
+                else:
+                    doFetch = False
+            else:
+                doFetch = False
+        else:
+            doFetch = True
+    return doFetch
+
+def _output(line, lines, stream=None):
+    """Internal function: Add line to output lines and optionally print to 
stream."""
+    lines.append(line)
+    if stream: print >>stream, line
+
+class FileInfo:
+    """Holder class for those file info. elements that are consistent among 
local
+    files (output of stat), ftp directories, http, etc.  Minimum useful fields 
are
+    modification time and size.  Line contains usual string output of ls -l.
+    """
+    def __init__(self, line, size, modTime, userId=None, groupId=None, 
protectMode=None):
+        self.line=line; self.size=size; self.modTime=modTime
+        self.userId=userId; self.groupId=groupId; self.protectMode=protectMode
+
+class UserCredential(object):
+    """Container for user credential info. like username, password, 
certificate, etc.
+    """
+    def __init__(self, username=None, password=None, validInterval=None, 
certificate=None):
+        self.username = username
+        self.password = password
+        self.validInterval = validInterval     # tuple of Ints (days, hours, 
minutes)
+        if password is not None and validInterval is None:
+            die('UserCredential: If password is present, validInterval is also 
required.')
+        self.certificate = certificate
+
+    def getPassword(self):
+        pw = self._password
+        if pw:
+            pw, daynumber, timestamp = dataenc.pass_dec(pw)
+            if dataenc.unexpired(daynumber, timestamp, self.validInterval):
+                return pw
+            else:
+                return None
+        else:
+            return None
+    def setPassword(self, pw):
+        if pw and pw != '':
+            self._password = dataenc.pass_enc(pw, daynumber=True, 
timestamp=True)
+        else:
+            self._password = pw
+    password = property(getPassword, setPassword)
+
+class UserCredentials:
+    """Contains dictionary of (url, credential) pairs and optionally an 
httpProxy.
+    """
+    def __init__(self, httpProxy=None, credentials={}):
+        self.httpProxy = httpProxy
+        self.credentials = credentials
+    def add(self, url, credential):
+        self.credentials[url] = credential; return self
+    def forUrl(self, url):
+        for key in self.credentials:
+            if url.startswith(key):
+                return self.credentials[key]
+        return None
+
+def promptForCredentials(urls, httpProxy=None):
+    if httpProxy == None:
+        httpProxy = raw_input('Enter HTTP proxy [none]: ')
+        if httpProxy == '': httpProxy = None
+    credentials = UserCredentials(httpProxy)
+    localUserName = getpass.getuser()
+    for url in urls:
+        remote, protocol, netloc, path = remoteUrl(url)
+        if remote:
+            username, password, validInterval = promptForCredential(url, 
localUserName)
+            credential = UserCredential(username, password, validInterval)
+            credentials.add(url, credential)
+    return credentials
+
+def promptForCredential(url, localUserName):
+    remote, protocol, netloc, path = remoteUrl(url)
+    if protocol == 'ftp':
+        defaultUserName = 'anonymous'
+    else:
+        defaultUserName = localUserName
+    username = raw_input('Need credentials for URL %s\nUsername [%s]: ' \
+                         % (url, defaultUserName))
+    if username == '': username = defaultUserName
+    password = ''
+    while password == '':
+        password = getpass.getpass()
+    validInterval = [0, 1, 0]
+    if password != '':
+        response = raw_input('Enter valid time period for credential [(days, 
hours, minutes) = 0 1 0]: ')
+        if response != '':
+            validInterval = response.split()
+    return (username, password, validInterval)
+
+class DirectoryWalker:
+    """Recursively walk directories using the protocol specified in a URL.
+    Sublclasses handle ftp, http, sftp, local file system, etc.
+    """
+    def __init__(self, userCredentials=None, retries=3, sleepTime=5):
+        self.userCredentials = userCredentials
+        self.retries = retries
+        self.sleepTime = sleepTime
+
+    def walk(self, top, walkDirectories=True):
+        """Recursively walk directories on a remote site to retrieve file 
lists.
+        """
+        remote, protocol, netloc, path = remoteUrl(top)
+        status, dir_listing = self.retrieveDirList(top)
+        if status:
+            if len(dir_listing) == 0:
+                yield (top, [], [], [])
+            else:
+                (dirs, files, infos) = self.parseDirList(dir_listing, path)
+                yield (top, dirs, files, infos)
+
+                if walkDirectories:
+                    for dir in dirs:
+                        # Depth-first recursion
+                        for root, dirs, files, infos in self.walk(top + '/' + 
dir, walkDirectories):
+                            yield (root, dirs, files, infos)
+        else:
+            warn('DirectoryWalker: error, unable to retrieve directory listing 
at', top)
+            yield (top, [], [], [])
+
+    def retrieveDirList(self, url):
+        """Retrieve directory listing as a list of text lines.  Returns 
(status, dirList)."""
+        pass
+    def parseDirList(self, dirList, path=None):
+        """Parse directory listing (text) and return three lists (dirs, files, 
fileInfos)."""
+        pass
+
+class FtpDirectoryWalker(DirectoryWalker):
+    """Recursively walk directories on an ftp site."""
+    def __init__(self, userCredentials=None, retries=3, sleepTime=5):
+        DirectoryWalker.__init__(self, userCredentials, retries, sleepTime)
+
+    def retrieveDirList(self, url):
+        """Retrieve a directory listing via ftp with retries.
+        """
+        remote, protocol, netloc, path = remoteUrl(url)
+        credential = None
+        if self.userCredentials:
+            credential = self.userCredentials.forUrl(url)
+        dir = ''; dir_list = []
+        ftp = FTP()
+        for i in range(self.retries):
+            try:
+                ftp.connect(netloc)
+                if credential is None or \
+                   credential.username == 'anonymous' or \
+                   credential.username == '':
+                    ftp.login()
+                else:
+                    ftp.login(credential.username, credential.password)
+                ftp.cwd(path)
+                ftp.retrlines('LIST', dir_list.append)
+                ftp.quit()
+                dir = '\n'.join(dir_list)
+                return (True, dir)
+            except:
+                pass
+            time.sleep(self.sleepTime)
+            warn('FtpDirectoryWalker: connect retry to ', netloc, path)
+        return (False, dir)
+
+    def parseDirList(self, dir, path=None):
+        """Parse long directory listing returned by ftp or (ls -l).
+        Separate entries into directories and files.
+        """
+        dirs = []; files = []; infos = []
+        for entry in dir.split('\n'):
+            fields = entry.split()
+            if len(fields) < 7: continue
+            fn = fields[-1]
+            if fn == '.' or fn == '..': continue
+            if re.match('^d', fields[0])and fields[0][7] == 'r':
+                dirs.append(fn)
+            else:
+                files.append(fn)
+                info = FileInfo(entry, int(fields[4]), '-'.join(fields[5:8]), \
+                                fields[2], fields[3], fields[0])
+                infos.append(info)
+        return (dirs, files, infos)
+
+class DirListingParser(object):
+    """Base class for directory listing parsers."""
+    def __init__(self, regex):
+        self.regex = regex
+        self.compiledRegex = re.compile(self.regex)
+        
+    def parse(self, dir, listingHtml):
+        """Return (dirs, files, infos)."""
+        dirs = []; files = []; infos = []
+        raise NotImplementedError, "Override this method in sub class."
+    
+class ApacheDirListingParser(DirListingParser):
+    """Parser class for apache."""
+    def parse(self, dir, listingHtml):
+        dirs = []; files = []; infos = []
+        items = self.compiledRegex.findall(listingHtml)
+        for item, itemName in items:
+            if itemName.strip() == 'Parent Directory': continue
+            if isinstance(item, str):
+                name = item
+            else:
+                name, dateTime, size = item[:]
+
+            if name.endswith('/'):
+                type = 'd'
+                dirs.append(name[:-1])
+            else:
+                type = '-'
+                files.append(name)
+            #not doing file info
+            '''
+            size = size.lower()
+            if size.endswith('k'):
+                size = int(size[:-1]) * 1024
+            elif size.endswith('m'):
+                size = int(size[:-1]) * 1024 * 1024
+            else:
+                size = -1
+            line = '%s---------  1 ? ? %15d %s %s' % (type, size, dateTime, 
name)
+            info = FileInfo(line, size, dateTime)
+            '''
+            infos.append(None)
+        return (dirs, files, infos)
+    
+class CDAACDirListingParser(DirListingParser):
+    """Parser class for CDAAC data server."""
+    def parse(self, dir, listingHtml):
+        dirs = []; files = []; infos = []
+        items = self.compiledRegex.findall(listingHtml)
+        for item, itemName in items:
+            if itemName.strip() == 'Parent Directory': continue
+            if isinstance(item, str):
+                name = item
+            else:
+                name, dateTime, size = item[:]
+            if name.endswith('/'):
+                type = 'd'
+                dirs.append(name)
+            else:
+                type = '-'
+                files.append(name)
+            #not doing file info
+            '''
+            size = size.lower()
+            if size.endswith('k'):
+                size = int(size[:-1]) * 1024
+            elif size.endswith('m'):
+                size = int(size[:-1]) * 1024 * 1024
+            else:
+                size = -1
+            line = '%s---------  1 ? ? %15d %s %s' % (type, size, dateTime, 
name)
+            info = FileInfo(line, size, dateTime)
+            '''
+            infos.append(None)
+        return (dirs, files, infos)
+
+class HttpDirectoryWalker(DirectoryWalker):
+    """Recursively walk directories on an http (web) site to retrieve file 
lists.
+    Handles many styles of HTML directory listings, but still very FRAGILE.
+    """
+    
+    #list of directory listing parser plugins
+    DIR_LIST_REGEX_PLUGINS = [
+        #apache 2.0.55 directory listing
+        ApacheDirListingParser(r'(?i)alt="\[.*?\]">\s*<A 
HREF="(?P<name>.*?)">(.*?)</A>'),
+        #CDAAC (COSMIC Data)
+        CDAACDirListingParser(r'(?i)<LI><A HREF="(?P<name>.*?)">(.*?)</A>'),
+        ]
+    
+    def __init__(self, userCredentials=None, retries=3, sleepTime=5):
+        DirectoryWalker.__init__(self, userCredentials, retries, sleepTime)
+        if self.userCredentials:
+            if self.userCredentials.httpProxy:
+                os.environ['http_proxy'] = self.userCredentials.httpProxy
+                # global kludge, default proxyHandler looks up proxy there
+            passwordMgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
+            for url, cred in self.userCredentials.credentials.iteritems():
+                passwordMgr.add_password(None, url, cred.username, 
cred.password)
+            authHandler = urllib2.HTTPBasicAuthHandler(passwordMgr)
+            opener = urllib2.build_opener(authHandler)
+        else:
+#            opener = urllib2.build_opener()
+            opener = None
+#        opener.add_headers = [('User-agent', 'Mozilla/5.0')]
+        self.opener = opener
+
+    def retrieveDirList(self, url):
+        """Retrieve an HTML directory listing via http with retries.
+        """
+###        url = os.path.join(url, 'contents.html')     ### hack for DAP 
servers at GES-DISC
+        dir_listing = ''
+        proxies = {}
+        for i in range(self.retries):
+            try:
+                if self.opener:
+                    response = self.opener.open(url)
+                else:
+                    response = urllib.urlopen(url)
+            except IOError, e:
+                if hasattr(e, 'reason'):
+                    warn('HttpDirectoryWalker: Error, failed to reach server 
because: %s' % e.reason)
+                elif hasattr(e, 'code'):
+                    warn('HttpDirectoryWalker: Server could not fulfill 
request, error code %s' % e.code)
+            else:
+                dir_listing = response.read()
+                return (True, dir_listing)
+            time.sleep(self.sleepTime)
+            warn('HttpDirectoryWalker: retrying ', url)
+        return (False, dir_listing)
+
+    reDirPath = re.compile(r'(?i)<H1>.*?Index of\s*?(\S+?)\s*?</H1>')
+
+    def parseDirList(self, dir, path):
+        """Parse fragile HTML directory listings returned by various HTTP 
servers,
+        including Apache and OpenDAP.  Separate entries into directories and 
files.
+        """
+        dirs = []; files = []; infos = []
+        if path:
+            match = HttpDirectoryWalker.reDirPath.search(dir)
+            if not match:
+                die('HttpDirectoryWalker: Cannot find directory name %s in 
HTML listing:\n%s' % (path, dir))
+            dirName = match.group(1)
+            if dirName not in path:
+                warn('HttpDirectoryWalker: Directory name %s in HTML listing 
does not agree with path %s:\n%s' % (dirName, path, dir))
+
+        # Try to find directory lines that contain file info
+        reDirListWithStat = re.compile( \
+            r'(?i)<A HREF=[\'"]*?(?P<name>[^\?].*?' + dirName + 
r'.*?)[\'"]*?>.*?</A>\s*(?P<dateTime>\S+ \S+)\s+?(?P<size>\S+)\s*?$')
+        items = reDirListWithStat.findall(dir)
+        # If not, then try to find simple directory lines
+        if len(items) == 0:
+            reDirList = re.compile( \
+                r'(?i)<A HREF=[\'"]*?(?P<name>[^\?].*?' + dirName + 
r'.*?)[\'"]*?>.*?</A>')
+            items = reDirList.findall(dir)
+            
+        if len(items) != 0:
+            dateTime = '? ?'; size = ''
+            for item in items:
+                if isinstance(item, str):
+                    name = item
+                else:
+                    name, dateTime, size = item[:]
+                if dirName not in name: continue
+    
+                if name.endswith('/'):
+                    type = 'd'
+                    dirs.append(name)
+                else:
+                    type = '-'
+                    files.append(name)
+                size = size.lower()
+                if size.endswith('k'):
+                    size = int(size[:-1]) * 1024
+                elif size.endswith('m'):
+                    size = int(size[:-1]) * 1024 * 1024
+                else:
+                    size = -1
+                line = '%s---------  1 ? ? %15d %s %s' % (type, size, 
dateTime, name)
+                info = FileInfo(line, size, dateTime)
+                infos.append(info)
+                print line
+        
+        #try plugins
+        else:
+            for plugin in self.DIR_LIST_REGEX_PLUGINS:
+                pluginResults = plugin.parse(dirName, dir)
+                if len(pluginResults[0]) != 0 or len(pluginResults[1]) != 0 or 
\
+                    len(pluginResults[2]) != 0: return pluginResults
+                
+        return (dirs, files, infos)
+
+
+def walk(top, userCredentials=None, walkDirectories=True, topDown=True):
+    """Recursively walk directories to retrieve file lists.
+    Returns the topPath, contained subdirectories and files, and
+    optionally FileInfo objects (if info is included in protocol results).
+    Handles local directory paths and ftp/http protocols (URL's).
+    """
+    remote, protocol, netloc, path = remoteUrl(top)
+    if remote:
+        if protocol == 'ftp':
+            ftpWalker = FtpDirectoryWalker(userCredentials)
+            for root, dirs, files, infos in ftpWalker.walk(top, 
walkDirectories):
+                yield (root, dirs, files, infos)
+        elif protocol == 'http':
+#            import pdb; pdb.set_trace()
+            httpWalker = HttpDirectoryWalker(userCredentials)
+            for root, dirs, files,infos in httpWalker.walk(top, 
walkDirectories):
+                yield (root, dirs, files, infos)
+        elif protocol == 'sftp':
+            sftpWalker = SftpDirectoryWalker(userCredentials)
+            for root, dirs, files,infos in sftpWalker.walk(top, 
walkDirectories):
+                yield (root, dirs, files, infos)
+        else:
+            die('filelist: Cannot handle protocol ', protocol)
+    else:
+        if walkDirectories:
+            for root, dirs, files in os.walk(top, topDown):
+                yield (root, dirs, files, [])
+        else:
+            files = os.listdir(top)
+            yield (top, [], files, [])
+
+def remoteUrl(url):
+    """Returns True if the URL is remote; also returns protocol,
+    net location (host:port), and path."""
+    protocol, netloc, path, params, query, fragment = urlparse.urlparse(url)
+    if protocol == '':
+        return (False, protocol, netloc, path)
+    else:
+        return (True, protocol, netloc, path)
+
+
+# utils
+RE_WITH_SUBST_PATTERN = re.compile(r'^s/(.+)/(.+)/$')
+def parse_re_with_subst(str):
+    match = RE_WITH_SUBST_PATTERN.match(str)
+    if match:
+        return (match.group(1), match.group(2))
+    else:
+        return (str, None)
+
+def hostName():
+    return socket.gethostbyaddr(socket.gethostname())[0]
+
+FILE_URL_PREFIX = 'file://' + hostName()
+def makeFileUrl(file):
+    return FILE_URL_PREFIX + file
+
+def warn(*str): sys.stderr.write(' '.join(str) + '\n')
+def die(str, status=1): warn(str); sys.exit(status)
+
+def main():
+    """Main function for outside scripts to call."""
+
+    from sys import argv
+
+    if len(argv) < 2: die(USAGE)
+    try:
+        opts, argv = getopt.getopt(argv[1:], 'hbcdf:ilqr:stuvw:x',
+                         ['help', 'bottomUp', 'credentials', 'delete', 
'directory',
+                          'fetchDir=', 'fetchIfNewer', 'fetchWithSubDirs', 
'info',
+                          'list', 'quiet', 'regex=', 'size', 'topOnly',
+                          'url', 'verbose', 'wildcard=', 'xml'])
+    except getopt.GetoptError, (msg, bad_opt):
+        die("%s error: Bad option: %s, %s" % (argv[0], bad_opt, msg))
+
+    regSpecs = []; wildCards = []; matchUrl=False; walkDirectories = True
+    needCredentials = False; userCredentials = None
+    urlMode=False; xmlMode=False; quietMode=False; verboseMode=False; 
getFileInfo=False
+    fetchDir = None; fetchIfNewer=False; fetchWithSubDirs=False
+    directoryMode = False; deleteMode = False; topDown = True; listMode = False
+
+    for opt, val in opts:
+        if opt   in ('-h', '--help'):       die(USAGE)
+        elif opt in ('-b', '--bottomUp'):   topDown = False
+        elif opt in ('-c', '--credentials'):   needCredentials = True
+        elif opt in ('-d', '--directory'):  directoryMode=True
+        elif opt in ('--delete'):           deleteMode=True
+        elif opt in ('-f', '--fetchDir'):   fetchDir = val
+                                            # retrieve remote files to this dir
+        elif opt in ('--fetchIfNewer'):     fetchIfNewer=True
+                                            # only fetch if src file is newer 
than existing dest file
+        elif opt in ('--fetchWithSubDirs'): fetchWithSubDirs=True
+                                            # mirror subdirectories when 
fetching
+        elif opt in ('-i', '--info'):       getFileInfo=True
+        elif opt in ('-l', '--list'):       listMode=True
+        elif opt in ('-m', '--matchUrl'):   matchUrl=True
+                                            # regexs match entire URL/path, 
not just file name
+        elif opt in ('-q', '--quiet'):      quietMode=True
+                                            # don't print files during walk
+        elif opt in ('-r', '--regex'):      regSpecs.append(val)
+        elif opt in ('-s', '--size'):       sizeMode=True
+        elif opt in ('-t', '--topOnly'):    walkDirectories=False
+        elif opt in ('-u', '--url'):        urlMode=True
+                                            # return URL's (file:, ftp:, 
http:, etc.)
+        elif opt in ('-v', '--verbose'):    verboseMode=True
+        elif opt in ('-w', '--wildcard'):   wildCards.append(val)
+        elif opt in ('-x', '--xml'):        xmlMode=True   # return list in 
XML format
+        else: die(USAGE)
+
+#    import pdb; pdb.set_trace()
+
+    matchedFiles, fetchedFiles, destinationFiles = \
+            filelist(argv, regSpecs, wildCards, needCredentials, 
userCredentials,
+                     matchAnyThenConstrain, None, matchUrl, walkDirectories,
+                     urlMode, xmlMode, quietMode, verboseMode, getFileInfo,
+                     fetchDir, fetchIfNewer, fetchWithSubDirs,
+                     directoryMode, listMode, deleteMode, topDown)
+
+    if quietMode:
+        if listMode == 'match':
+            print matchedFiles
+        elif listMode == 'fetch':
+            print fetchedFiles
+        elif listMode == 'destination':
+            print destinationFiles
+        else:
+            pass
+
+
+if __name__ ==  '__main__': main()

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/climatology/setup.py
----------------------------------------------------------------------
diff --git a/climatology/setup.py b/climatology/setup.py
new file mode 100644
index 0000000..de2e030
--- /dev/null
+++ b/climatology/setup.py
@@ -0,0 +1,9 @@
+
+from setuptools import setup
+
+setup(name='Climatology',
+      version='0.1dev0',
+      packages=['clim'])
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/data-access/.gitignore
----------------------------------------------------------------------
diff --git a/data-access/.gitignore b/data-access/.gitignore
new file mode 100644
index 0000000..7be00a9
--- /dev/null
+++ b/data-access/.gitignore
@@ -0,0 +1,4 @@
+*.c
+build
+dist
+*.egg-info
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/data-access/README.md
----------------------------------------------------------------------
diff --git a/data-access/README.md b/data-access/README.md
new file mode 100644
index 0000000..f2ebe7a
--- /dev/null
+++ b/data-access/README.md
@@ -0,0 +1,58 @@
+data-access
+=====
+
+Python module that provides API access to the NEXUS datastores.
+
+# Developer Setup
+
+## Database Setup
+
+1. Download and unzip [Apache Solr 
5.3.1](http://archive.apache.org/dist/lucene/solr/5.3.1/)
+
+    1. Copy the [nexustiles](config/schemas/solr/nexustiles) directory into 
`$SOLR_INSTALL_DIR/server/solr`
+    2. Copy the [dataset](config/schemas/solr/dataset) directory into 
`$SOLR_INSTALL_DIR/server/solr`
+    3. Download [JTS Topology Suite 
v1.13](https://sourceforge.net/projects/jts-topo-suite/files/jts/1.13/) and 
extract the zip.
+    4. From the exploded JTS zip, copy `$JTS_ZIP/lib/jts-1.13.jar` and 
`$JTS_ZIP/lib/jtsio-1.13.jar` into `$SOLR_INSTALL_DIR/server/lib/ext`
+    5. Start Solr using `$SOLR_INSTALL_DIR/bin/solr start` then open up the 
admin page (http://localhost:8983) to make sure there are no errors
+
+2. Download and unzip [Apache Cassandra 
2.2.x](http://cassandra.apache.org/download/)
+
+    1. Start cassandra `$CASSANDRA_INSTALL_DIR/bin/cassandra`
+    2. Open a cqlsh session `$CASSANDRA_INSTALL_DIR/bin/cqlsh`
+    3. Execute the DDL located in 
[nexustiles.cql](config/schemas/cassandra/nexustiles.cql)
+
+## Code Installation
+
+**NOTE** This project has a dependency on 
[nexus-messages](https://github.jpl.nasa.gov/thuang/nexus/tree/master/nexus-ingest/nexus-messages).
 Make sure nexus-messages is installed in the same environment you will be 
using for this module.
+
+1. Setup a separate conda env or activate an existing one
+
+    ````
+    conda create --name nexus-data-access python
+    source activate nexus-data-access
+    ````
+
+2. Install conda dependencies
+
+    ````
+    conda install numpy
+    ````
+
+3. Install cython `pip install cython`
+
+4. Run `python setup.py install`
+
+5. Run `python test/nexustilestest.py` to validate the installation worked
+    1. If you get an error like the following
+
+        ````
+        
/Users/user/.pyxbld/temp.macosx-10.5-x86_64-2.7/pyrex/cassandra/numpy_parser.c:266:10:
 fatal error: 'numpyFlags.h' file not found
+        ...
+        ImportError: Building module nexustiles.dao.CassandraProxy failed: 
['ImportError: Building module cassandra.numpy_parser failed: ["CompileError: 
command \'gcc\' failed with exit status 1\\n"]\n']
+        ````
+
+        It can be fixed by copying the `numpyFlags.h` file from the 
`cassandra` library to the python include library
+
+        ````
+        cp 
/path/to/anaconda/env/lib/python2.7/site-packages/cassandra/numpyFlags.h 
/path/to/anaconda/env/include/python2.7/numpyFlags.h
+        ````
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/data-access/config/schemas/cassandra/nexustiles.cql
----------------------------------------------------------------------
diff --git a/data-access/config/schemas/cassandra/nexustiles.cql 
b/data-access/config/schemas/cassandra/nexustiles.cql
new file mode 100644
index 0000000..f0b8e36
--- /dev/null
+++ b/data-access/config/schemas/cassandra/nexustiles.cql
@@ -0,0 +1,8 @@
+CREATE KEYSPACE IF NOT EXISTS nexustiles WITH REPLICATION = { 'class' : 
'SimpleStrategy', 'replication_factor' : 1 };
+
+DROP TABLE IF EXISTS nexustiles.sea_surface_temp;
+
+CREATE TABLE nexustiles.sea_surface_temp  (
+       tile_id         uuid PRIMARY KEY,
+       tile_blob       blob
+);

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/contractions_ca.txt
----------------------------------------------------------------------
diff --git 
a/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/contractions_ca.txt
 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/contractions_ca.txt
new file mode 100644
index 0000000..307a85f
--- /dev/null
+++ 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/contractions_ca.txt
@@ -0,0 +1,8 @@
+# Set of Catalan contractions for ElisionFilter
+# TODO: load this as a resource from the analyzer and sync it in build.xml
+d
+l
+m
+n
+s
+t

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/contractions_fr.txt
----------------------------------------------------------------------
diff --git 
a/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/contractions_fr.txt
 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/contractions_fr.txt
new file mode 100644
index 0000000..f1bba51
--- /dev/null
+++ 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/contractions_fr.txt
@@ -0,0 +1,15 @@
+# Set of French contractions for ElisionFilter
+# TODO: load this as a resource from the analyzer and sync it in build.xml
+l
+m
+t
+qu
+n
+s
+j
+d
+c
+jusqu
+quoiqu
+lorsqu
+puisqu

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/contractions_ga.txt
----------------------------------------------------------------------
diff --git 
a/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/contractions_ga.txt
 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/contractions_ga.txt
new file mode 100644
index 0000000..9ebe7fa
--- /dev/null
+++ 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/contractions_ga.txt
@@ -0,0 +1,5 @@
+# Set of Irish contractions for ElisionFilter
+# TODO: load this as a resource from the analyzer and sync it in build.xml
+d
+m
+b

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/contractions_it.txt
----------------------------------------------------------------------
diff --git 
a/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/contractions_it.txt
 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/contractions_it.txt
new file mode 100644
index 0000000..cac0409
--- /dev/null
+++ 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/contractions_it.txt
@@ -0,0 +1,23 @@
+# Set of Italian contractions for ElisionFilter
+# TODO: load this as a resource from the analyzer and sync it in build.xml
+c
+l 
+all 
+dall 
+dell 
+nell 
+sull 
+coll 
+pell 
+gl 
+agl 
+dagl 
+degl 
+negl 
+sugl 
+un 
+m 
+t 
+s 
+v 
+d

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/hyphenations_ga.txt
----------------------------------------------------------------------
diff --git 
a/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/hyphenations_ga.txt
 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/hyphenations_ga.txt
new file mode 100644
index 0000000..4d2642c
--- /dev/null
+++ 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/hyphenations_ga.txt
@@ -0,0 +1,5 @@
+# Set of Irish hyphenations for StopFilter
+# TODO: load this as a resource from the analyzer and sync it in build.xml
+h
+n
+t

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stemdict_nl.txt
----------------------------------------------------------------------
diff --git 
a/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stemdict_nl.txt 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stemdict_nl.txt
new file mode 100644
index 0000000..4410729
--- /dev/null
+++ b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stemdict_nl.txt
@@ -0,0 +1,6 @@
+# Set of overrides for the dutch stemmer
+# TODO: load this as a resource from the analyzer and sync it in build.xml
+fiets  fiets
+bromfiets      bromfiets
+ei     eier
+kind   kinder

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stoptags_ja.txt
----------------------------------------------------------------------
diff --git 
a/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stoptags_ja.txt 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stoptags_ja.txt
new file mode 100644
index 0000000..71b7508
--- /dev/null
+++ b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stoptags_ja.txt
@@ -0,0 +1,420 @@
+#
+# This file defines a Japanese stoptag set for JapanesePartOfSpeechStopFilter.
+#
+# Any token with a part-of-speech tag that exactly matches those defined in 
this
+# file are removed from the token stream.
+#
+# Set your own stoptags by uncommenting the lines below.  Note that comments 
are
+# not allowed on the same line as a stoptag.  See LUCENE-3745 for frequency 
lists,
+# etc. that can be useful for building you own stoptag set.
+#
+# The entire possible tagset is provided below for convenience.
+#
+#####
+#  noun: unclassified nouns
+#名詞
+#
+#  noun-common: Common nouns or nouns where the sub-classification is undefined
+#名詞-一般
+#
+#  noun-proper: Proper nouns where the sub-classification is undefined 
+#名詞-固有名詞
+#
+#  noun-proper-misc: miscellaneous proper nouns
+#名詞-固有名詞-一般
+#
+#  noun-proper-person: Personal names where the sub-classification is undefined
+#名詞-固有名詞-人名
+#
+#  noun-proper-person-misc: names that cannot be divided into surname and 
+#  given name; foreign names; names where the surname or given name is unknown.
+#  e.g. お市の方
+#名詞-固有名詞-人名-一般
+#
+#  noun-proper-person-surname: Mainly Japanese surnames.
+#  e.g. 山田
+#名詞-固有名詞-人名-姓
+#
+#  noun-proper-person-given_name: Mainly Japanese given names.
+#  e.g. 太郎
+#名詞-固有名詞-人名-名
+#
+#  noun-proper-organization: Names representing organizations.
+#  e.g. 通産省, NHK
+#名詞-固有名詞-組織
+#
+#  noun-proper-place: Place names where the sub-classification is undefined
+#名詞-固有名詞-地域
+#
+#  noun-proper-place-misc: Place names excluding countries.
+#  e.g. アジア, バルセロナ, 京都
+#名詞-固有名詞-地域-一般
+#
+#  noun-proper-place-country: Country names. 
+#  e.g. 日本, オーストラリア
+#名詞-固有名詞-地域-国
+#
+#  noun-pronoun: Pronouns where the sub-classification is undefined
+#名詞-代名詞
+#
+#  noun-pronoun-misc: miscellaneous pronouns: 
+#  e.g. それ, ここ, あいつ, あなた, あちこち, いくつ, 
どこか, なに, みなさん, みんな, わたくし, われわれ
+#名詞-代名詞-一般
+#
+#  noun-pronoun-contraction: Spoken language contraction made by combining a 
+#  pronoun and the particle 'wa'.
+#  e.g. ありゃ, こりゃ, こりゃあ, そりゃ, そりゃあ 
+#名詞-代名詞-縮約
+#
+#  noun-adverbial: Temporal nouns such as names of days or months that behave 
+#  like adverbs. Nouns that represent amount or ratios and can be used 
adverbially,
+#  e.g. 金曜, 一月, 午後, 少量
+#名詞-副詞可能
+#
+#  noun-verbal: Nouns that take arguments with case and can appear followed by 
+#  'suru' and related verbs (する, できる, なさる, くださる)
+#  e.g. インプット, 愛着, 悪化, 悪戦苦闘, 一安心, 下取り
+#名詞-サ変接続
+#
+#  noun-adjective-base: The base form of adjectives, words that appear before 
な ("na")
+#  e.g. 健康, 安易, 駄目, だめ
+#名詞-形容動詞語幹
+#
+#  noun-numeric: Arabic numbers, Chinese numerals, and counters like 何 
(回), 数.
+#  e.g. 0, 1, 2, 何, 数, 幾
+#名詞-数
+#
+#  noun-affix: noun affixes where the sub-classification is undefined
+#名詞-非自立
+#
+#  noun-affix-misc: Of adnominalizers, the case-marker の ("no"), and words 
that 
+#  attach to the base form of inflectional words, words that cannot be 
classified 
+#  into any of the other categories below. This category includes indefinite 
nouns.
+#  e.g. あかつき, 暁, かい, 甲斐, 気, きらい, 嫌い, くせ, 
癖, こと, 事, ごと, 毎, しだい, 次第, 
+#       順, せい, 所為, ついで, 序で, つもり, 積もり, 点, 
どころ, の, はず, 筈, はずみ, 弾み, 
+#       拍子, ふう, ふり, 振り, ほう, 方, 旨, もの, 物, 者, 
ゆえ, 故, ゆえん, 所以, わけ, 訳,
+#       わり, 割り, 割, ん-口語/, もん-口語/
+#名詞-非自立-一般
+#
+#  noun-affix-adverbial: noun affixes that that can behave as adverbs.
+#  e.g. あいだ, 間, あげく, 挙げ句, あと, 後, 余り, 以外, 
以降, 以後, 以上, 以前, 一方, うえ, 
+#       上, うち, 内, おり, 折り, かぎり, 限り, きり, 
っきり, 結果, ころ, 頃, さい, 際, 最中, さなか, 
+#       最中, じたい, 自体, たび, 度, ため, 為, つど, 都度, 
とおり, 通り, とき, 時, ところ, 所, 
+#       とたん, 途端, なか, 中, のち, 後, ばあい, 場合, 日, 
ぶん, 分, ほか, 他, まえ, 前, まま, 
+#       儘, 侭, みぎり, 矢先
+#名詞-非自立-副詞可能
+#
+#  noun-affix-aux: noun affixes treated as 助動詞 ("auxiliary verb") in 
school grammars 
+#  with the stem よう(だ) ("you(da)").
+#  e.g.  よう, やう, 様 (よう)
+#名詞-非自立-助動詞語幹
+#  
+#  noun-affix-adjective-base: noun affixes that can connect to the indeclinable
+#  connection form な (aux "da").
+#  e.g. みたい, ふう
+#名詞-非自立-形容動詞語幹
+#
+#  noun-special: special nouns where the sub-classification is undefined.
+#名詞-特殊
+#
+#  noun-special-aux: The そうだ ("souda") stem form that is used for 
reporting news, is 
+#  treated as 助動詞 ("auxiliary verb") in school grammars, and attach to 
the base 
+#  form of inflectional words.
+#  e.g. そう
+#名詞-特殊-助動詞語幹
+#
+#  noun-suffix: noun suffixes where the sub-classification is undefined.
+#名詞-接尾
+#
+#  noun-suffix-misc: Of the nouns or stem forms of other parts of speech that 
connect 
+#  to ガル or タイ and can combine into compound nouns, words that cannot 
be classified into
+#  any of the other categories below. In general, this category is more 
inclusive than 
+#  接尾語 ("suffix") and is usually the last element in a compound noun.
+#  e.g. おき, かた, 方, 甲斐 (がい), がかり, ぎみ, 気味, 
ぐるみ, (~した) さ, 次第, 済 (ず) み,
+#       よう, (でき)っこ, 感, 観, 性, 学, 類, 面, 用
+#名詞-接尾-一般
+#
+#  noun-suffix-person: Suffixes that form nouns and attach to person names 
more often
+#  than other nouns.
+#  e.g. 君, 様, 著
+#名詞-接尾-人名
+#
+#  noun-suffix-place: Suffixes that form nouns and attach to place names more 
often 
+#  than other nouns.
+#  e.g. 町, 市, 県
+#名詞-接尾-地域
+#
+#  noun-suffix-verbal: Of the suffixes that attach to nouns and form nouns, 
those that 
+#  can appear before スル ("suru").
+#  e.g. 化, 視, 分け, 入り, 落ち, 買い
+#名詞-接尾-サ変接続
+#
+#  noun-suffix-aux: The stem form of そうだ (様態) that is used to 
indicate conditions, 
+#  is treated as 助動詞 ("auxiliary verb") in school grammars, and attach 
to the 
+#  conjunctive form of inflectional words.
+#  e.g. そう
+#名詞-接尾-助動詞語幹
+#
+#  noun-suffix-adjective-base: Suffixes that attach to other nouns or the 
conjunctive 
+#  form of inflectional words and appear before the copula だ ("da").
+#  e.g. 的, げ, がち
+#名詞-接尾-形容動詞語幹
+#
+#  noun-suffix-adverbial: Suffixes that attach to other nouns and can behave 
as adverbs.
+#  e.g. 後 (ご), 以後, 以降, 以前, 前後, 中, 末, 上, 時 (じ)
+#名詞-接尾-副詞可能
+#
+#  noun-suffix-classifier: Suffixes that attach to numbers and form nouns. 
This category 
+#  is more inclusive than 助数詞 ("classifier") and includes common nouns 
that attach 
+#  to numbers.
+#  e.g. 個, つ, 本, 冊, パーセント, cm, kg, カ月, か国, 区画, 
時間, 時半
+#名詞-接尾-助数詞
+#
+#  noun-suffix-special: Special suffixes that mainly attach to inflecting 
words.
+#  e.g. (楽し) さ, (考え) 方
+#名詞-接尾-特殊
+#
+#  noun-suffix-conjunctive: Nouns that behave like conjunctions and join two 
words 
+#  together.
+#  e.g. (日本) 対 (アメリカ), 対 (アメリカ), (3) 対 (5), (女優) 
兼 (主婦)
+#名詞-接続詞的
+#
+#  noun-verbal_aux: Nouns that attach to the conjunctive particle て ("te") 
and are 
+#  semantically verb-like.
+#  e.g. ごらん, ご覧, 御覧, 頂戴
+#名詞-動詞非自立的
+#
+#  noun-quotation: text that cannot be segmented into words, proverbs, Chinese 
poetry, 
+#  dialects, English, etc. Currently, the only entry for 名詞 
引用文字列 ("noun quotation") 
+#  is いわく ("iwaku").
+#名詞-引用文字列
+#
+#  noun-nai_adjective: Words that appear before the auxiliary verb ない 
("nai") and
+#  behave like an adjective.
+#  e.g. 申し訳, 仕方, とんでも, 違い
+#名詞-ナイ形容詞語幹
+#
+#####
+#  prefix: unclassified prefixes
+#接頭詞
+#
+#  prefix-nominal: Prefixes that attach to nouns (including adjective stem 
forms) 
+#  excluding numerical expressions.
+#  e.g. お (水), 某 (氏), 同 (社), 故 (~氏), 高 (品質), お 
(見事), ご (立派)
+#接頭詞-名詞接続
+#
+#  prefix-verbal: Prefixes that attach to the imperative form of a verb or a 
verb
+#  in conjunctive form followed by なる/なさる/くださる.
+#  e.g. お (読みなさい), お (座り)
+#接頭詞-動詞接続
+#
+#  prefix-adjectival: Prefixes that attach to adjectives.
+#  e.g. お (寒いですねえ), バカ (でかい)
+#接頭詞-形容詞接続
+#
+#  prefix-numerical: Prefixes that attach to numerical expressions.
+#  e.g. 約, およそ, 毎時
+#接頭詞-数接続
+#
+#####
+#  verb: unclassified verbs
+#動詞
+#
+#  verb-main:
+#動詞-自立
+#
+#  verb-auxiliary:
+#動詞-非自立
+#
+#  verb-suffix:
+#動詞-接尾
+#
+#####
+#  adjective: unclassified adjectives
+#形容詞
+#
+#  adjective-main:
+#形容詞-自立
+#
+#  adjective-auxiliary:
+#形容詞-非自立
+#
+#  adjective-suffix:
+#形容詞-接尾
+#
+#####
+#  adverb: unclassified adverbs
+#副詞
+#
+#  adverb-misc: Words that can be segmented into one unit and where adnominal 
+#  modification is not possible.
+#  e.g. あいかわらず, 多分
+#副詞-一般
+#
+#  adverb-particle_conjunction: Adverbs that can be followed by の, は, に, 
+#  な, する, だ, etc.
+#  e.g. こんなに, そんなに, あんなに, なにか, なんでも
+#副詞-助詞類接続
+#
+#####
+#  adnominal: Words that only have noun-modifying forms.
+#  e.g. この, その, あの, どの, いわゆる, なんらかの, 
何らかの, いろんな, こういう, そういう, ああいう, 
+#       どういう, こんな, そんな, あんな, どんな, 大きな, 
小さな, おかしな, ほんの, たいした, 
+#       「(, も) さる (ことながら)」, 微々たる, 堂々たる, 
単なる, いかなる, 我が」「同じ, 亡き
+#連体詞
+#
+#####
+#  conjunction: Conjunctions that can occur independently.
+#  e.g. が, けれども, そして, じゃあ, それどころか
+接続詞
+#
+#####
+#  particle: unclassified particles.
+助詞
+#
+#  particle-case: case particles where the subclassification is undefined.
+助詞-格助詞
+#
+#  particle-case-misc: Case particles.
+#  e.g. から, が, で, と, に, へ, より, を, の, にて
+助詞-格助詞-一般
+#
+#  particle-case-quote: the "to" that appears after nouns, a person’s 
speech, 
+#  quotation marks, expressions of decisions from a meeting, reasons, 
judgements,
+#  conjectures, etc.
+#  e.g. ( だ) と (述べた.), ( である) と (して執行猶予...)
+助詞-格助詞-引用
+#
+#  particle-case-compound: Compounds of particles and verbs that mainly behave 
+#  like case particles.
+#  e.g. という, といった, とかいう, として, とともに, とå…
±ã«, でもって, にあたって, に当たって, に当って,
+#       にあたり, に当たり, に当り, に当たる, にあたる, 
において, に於いて,に於て, における, に於ける, 
+#       にかけ, にかけて, にかんし, に関し, にかんして, 
に関して, にかんする, に関する, に際し, 
+#       に際して, にしたがい, に従い, に従う, 
にしたがって, に従って, にたいし, に対し, にたいして, 
+#       に対して, にたいする, に対する, について, につき, 
につけ, につけて, につれ, につれて, にとって,
+#       にとり, にまつわる, によって, に依って, に因って, 
により, に依り, に因り, による, に依る, に因る, 
+#       にわたって, にわたる, をもって, を以って, を通じ, 
を通じて, を通して, をめぐって, をめぐり, をめぐる,
+#       って-口語/, ちゅう-関西弁「という」/, (何) ていう 
(人)-口語/, っていう-口語/, といふ, とかいふ
+助詞-格助詞-連語
+#
+#  particle-conjunctive:
+#  e.g. から, からには, が, けれど, けれども, けど, し, 
つつ, て, で, と, ところが, どころか, とも, ども, 
+#       ながら, なり, ので, のに, ば, ものの, や ( した), 
やいなや, (ころん) じゃ(いけない)-口語/, 
+#       (行っ) ちゃ(いけない)-口語/, (言っ) たって 
(しかたがない)-口語/, (それがなく)ったって (平気)-口語/
+助詞-接続助詞
+#
+#  particle-dependency:
+#  e.g. こそ, さえ, しか, すら, は, も, ぞ
+助詞-係助詞
+#
+#  particle-adverbial:
+#  e.g. がてら, かも, くらい, 位, ぐらい, しも, (学校) 
じゃ(これが流行っている)-口語/, 
+#       (それ)じゃあ (よくない)-口語/, ずつ, (私) なぞ, 
など, (私) なり (に), (先生) なんか (大嫌い)-口語/,
+#       (私) なんぞ, (先生) なんて (大嫌い)-口語/, のみ, だ
け, (私) だって-口語/, だに, 
+#       (彼)ったら-口語/, (お茶) でも (いかが), 等 (とう), 
(今後) とも, ばかり, ばっか-口語/, ばっかり-口語/,
+#       ほど, 程, まで, 迄, (誰) も (が)([助詞-格助詞] および 
[助詞-係助詞] の前に位置する「も」)
+助詞-副助詞
+#
+#  particle-interjective: particles with interjective grammatical roles.
+#  e.g. (松島) や
+助詞-間投助詞
+#
+#  particle-coordinate:
+#  e.g. と, たり, だの, だり, とか, なり, や, やら
+助詞-並立助詞
+#
+#  particle-final:
+#  e.g. かい, かしら, さ, ぜ, (だ)っけ-口語/, (とまってる) 
で-方言/, な, ナ, なあ-口語/, ぞ, ね, ネ, 
+#       ねぇ-口語/, ねえ-口語/, ねん-方言/, の, のう-口語/, 
や, よ, ヨ, よぉ-口語/, わ, わい-口語/
+助詞-終助詞
+#
+#  particle-adverbial/conjunctive/final: The particle "ka" when unknown 
whether it is 
+#  adverbial, conjunctive, or sentence final. For example:
+#       (a) 「A か B か」. Ex:「(国内で運用する) 
か,(海外で運用する) か (.)」
+#       (b) Inside an adverb phrase. Ex:「(幸いという) か (, 死者
はいなかった.)」
+#           「(祈りが届いたせい) か (, 試験に合格した.)」
+#       (c) 「かのように」. Ex:「(何もなかった) か 
(のように振る舞った.)」
+#  e.g. か
+助詞-副助詞/並立助詞/終助詞
+#
+#  particle-adnominalizer: The "no" that attaches to nouns and modifies 
+#  non-inflectional words.
+助詞-連体化
+#
+#  particle-adnominalizer: The "ni" and "to" that appear following nouns and 
adverbs 
+#  that are giongo, giseigo, or gitaigo.
+#  e.g. に, と
+助詞-副詞化
+#
+#  particle-special: A particle that does not fit into one of the above 
classifications. 
+#  This includes particles that are used in Tanka, Haiku, and other poetry.
+#  e.g. かな, けむ, ( しただろう) に, (あんた) 
にゃ(わからん), (俺) ん (家)
+助詞-特殊
+#
+#####
+#  auxiliary-verb:
+助動詞
+#
+#####
+#  interjection: Greetings and other exclamations.
+#  e.g. おはよう, おはようございます, こんにちは, 
こんばんは, ありがとう, どうもありがとう, 
ありがとうございます, 
+#       いただきます, ごちそうさま, さよなら, さようなら, 
はい, いいえ, ごめん, ごめんなさい
+#感動詞
+#
+#####
+#  symbol: unclassified Symbols.
+記号
+#
+#  symbol-misc: A general symbol not in one of the categories below.
+#  e.g. [○◎@$〒→+]
+記号-一般
+#
+#  symbol-comma: Commas
+#  e.g. [,、]
+記号-読点
+#
+#  symbol-period: Periods and full stops.
+#  e.g. [..。]
+記号-句点
+#
+#  symbol-space: Full-width whitespace.
+記号-空白
+#
+#  symbol-open_bracket:
+#  e.g. [({‘“『【]
+記号-括弧開
+#
+#  symbol-close_bracket:
+#  e.g. [)}’”』」】]
+記号-括弧閉
+#
+#  symbol-alphabetic:
+#記号-アルファベット
+#
+#####
+#  other: unclassified other
+#その他
+#
+#  other-interjection: Words that are hard to classify as noun-suffixes or 
+#  sentence-final particles.
+#  e.g. (だ)ァ
+その他-間投
+#
+#####
+#  filler: Aizuchi that occurs during a conversation or sounds inserted as 
filler.
+#  e.g. あの, うんと, えと
+フィラー
+#
+#####
+#  non-verbal: non-verbal sound.
+非言語音
+#
+#####
+#  fragment:
+#語断片
+#
+#####
+#  unknown: unknown part of speech.
+#未知語
+#
+##### End of file

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_ar.txt
----------------------------------------------------------------------
diff --git 
a/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_ar.txt 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_ar.txt
new file mode 100644
index 0000000..046829d
--- /dev/null
+++ 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_ar.txt
@@ -0,0 +1,125 @@
+# This file was created by Jacques Savoy and is distributed under the BSD 
license.
+# See http://members.unine.ch/jacques.savoy/clef/index.html.
+# Also see http://www.opensource.org/licenses/bsd-license.html
+# Cleaned on October 11, 2009 (not normalized, so use before normalization)
+# This means that when modifying this list, you might need to add some 
+# redundant entries, for example containing forms with both أ and ا
+من
+ومن
+منها
+منه
+في
+وفي
+فيها
+فيه
+و
+ف
+ثم
+او
+أو
+ب
+بها
+به
+ا
+Ø£
+اى
+اي
+أي
+أى
+لا
+ولا
+الا
+ألا
+إلا
+لكن
+ما
+وما
+كما
+فما
+عن
+مع
+اذا
+إذا
+ان
+أن
+إن
+انها
+أنها
+إنها
+انه
+أنه
+إنه
+بان
+بأن
+فان
+فأن
+وان
+وأن
+وإن
+التى
+التي
+الذى
+الذي
+الذين
+الى
+الي
+إلى
+إلي
+على
+عليها
+عليه
+اما
+أما
+إما
+ايضا
+أيضا
+كل
+وكل
+لم
+ولم
+لن
+ولن
+هى
+هي
+هو
+وهى
+وهي
+وهو
+فهى
+فهي
+فهو
+انت
+أنت
+لك
+لها
+له
+هذه
+هذا
+تلك
+ذلك
+هناك
+كانت
+كان
+يكون
+تكون
+وكانت
+وكان
+غير
+بعض
+قد
+نحو
+بين
+بينما
+منذ
+ضمن
+حيث
+الان
+الآن
+خلال
+بعد
+قبل
+حتى
+عند
+عندما
+لدى
+جميع

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_bg.txt
----------------------------------------------------------------------
diff --git 
a/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_bg.txt 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_bg.txt
new file mode 100644
index 0000000..1ae4ba2
--- /dev/null
+++ 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_bg.txt
@@ -0,0 +1,193 @@
+# This file was created by Jacques Savoy and is distributed under the BSD 
license.
+# See http://members.unine.ch/jacques.savoy/clef/index.html.
+# Also see http://www.opensource.org/licenses/bsd-license.html
+а
+аз
+ако
+ала
+бе
+без
+беше
+би
+бил
+била
+били
+било
+близо
+бъдат
+бъде
+бяха
+в
+вас
+ваш
+ваша
+вероятно
+вече
+взема
+ви
+вие
+винаги
+все
+всеки
+всички
+всичко
+всяка
+във
+въпреки
+върху
+г
+ги
+главно
+го
+д
+да
+дали
+до
+докато
+докога
+дори
+досега
+доста
+е
+едва
+един
+ето
+за
+зад
+заедно
+заради
+засега
+затова
+защо
+защото
+и
+из
+или
+им
+има
+имат
+иска
+й
+каза
+как
+каква
+какво
+както
+какъв
+като
+кога
+когато
+което
+които
+кой
+който
+колко
+която
+къде
+където
+към
+ли
+м
+ме
+между
+мен
+ми
+мнозина
+мога
+могат
+може
+моля
+момента
+му
+н
+на
+над
+назад
+най
+направи
+напред
+например
+нас
+не
+него
+нея
+ни
+ние
+никой
+нито
+но
+някои
+някой
+няма
+обаче
+около
+освен
+особено
+от
+отгоре
+отново
+още
+пак
+по
+повече
+повечето
+под
+поне
+поради
+после
+почти
+прави
+пред
+преди
+през
+при
+пък
+първо
+с
+са
+само
+се
+сега
+си
+скоро
+след
+сме
+според
+сред
+срещу
+сте
+съм
+със
+също
+т
+тази
+така
+такива
+такъв
+там
+твой
+те
+тези
+ти
+тн
+то
+това
+тогава
+този
+той
+толкова
+точно
+трябва
+тук
+тъй
+тя
+тях
+у
+харесва
+ч
+че
+често
+чрез
+ще
+щом
+я

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_ca.txt
----------------------------------------------------------------------
diff --git 
a/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_ca.txt 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_ca.txt
new file mode 100644
index 0000000..3da65de
--- /dev/null
+++ 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_ca.txt
@@ -0,0 +1,220 @@
+# Catalan stopwords from http://github.com/vcl/cue.language (Apache 2 Licensed)
+a
+abans
+ací
+ah
+així
+això
+al
+als
+aleshores
+algun
+alguna
+algunes
+alguns
+alhora
+allà
+allí
+allò
+altra
+altre
+altres
+amb
+ambdós
+ambdues
+apa
+aquell
+aquella
+aquelles
+aquells
+aquest
+aquesta
+aquestes
+aquests
+aquí
+baix
+cada
+cadascú
+cadascuna
+cadascunes
+cadascuns
+com
+contra
+d'un
+d'una
+d'unes
+d'uns
+dalt
+de
+del
+dels
+des
+després
+dins
+dintre
+donat
+doncs
+durant
+e
+eh
+el
+els
+em
+en
+encara
+ens
+entre
+érem
+eren
+éreu
+es
+és
+esta
+està
+estàvem
+estaven
+estàveu
+esteu
+et
+etc
+ets
+fins
+fora
+gairebé
+ha
+han
+has
+havia
+he
+hem
+heu
+hi 
+ho
+i
+igual
+iguals
+ja
+l'hi
+la
+les
+li
+li'n
+llavors
+m'he
+ma
+mal
+malgrat
+mateix
+mateixa
+mateixes
+mateixos
+me
+mentre
+més
+meu
+meus
+meva
+meves
+molt
+molta
+moltes
+molts
+mon
+mons
+n'he
+n'hi
+ne
+ni
+no
+nogensmenys
+només
+nosaltres
+nostra
+nostre
+nostres
+o
+oh
+oi
+on
+pas
+pel
+pels
+per
+però
+perquè
+poc 
+poca
+pocs
+poques
+potser
+propi
+qual
+quals
+quan
+quant 
+que
+què
+quelcom
+qui
+quin
+quina
+quines
+quins
+s'ha
+s'han
+sa
+semblant
+semblants
+ses
+seu 
+seus
+seva
+seva
+seves
+si
+sobre
+sobretot
+sóc
+solament
+sols
+son 
+són
+sons 
+sota
+sou
+t'ha
+t'han
+t'he
+ta
+tal
+també
+tampoc
+tan
+tant
+tanta
+tantes
+teu
+teus
+teva
+teves
+ton
+tons
+tot
+tota
+totes
+tots
+un
+una
+unes
+uns
+us
+va
+vaig
+vam
+van
+vas
+veu
+vosaltres
+vostra
+vostre
+vostres

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_cz.txt
----------------------------------------------------------------------
diff --git 
a/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_cz.txt 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_cz.txt
new file mode 100644
index 0000000..53c6097
--- /dev/null
+++ 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_cz.txt
@@ -0,0 +1,172 @@
+a
+s
+k
+o
+i
+u
+v
+z
+dnes
+cz
+tímto
+budeš
+budem
+byli
+jseš
+můj
+svým
+ta
+tomto
+tohle
+tuto
+tyto
+jej
+zda
+proč
+máte
+tato
+kam
+tohoto
+kdo
+kteří
+mi
+nám
+tom
+tomuto
+mít
+nic
+proto
+kterou
+byla
+toho
+protože
+asi
+ho
+naši
+napište
+re
+což
+tím
+takže
+svých
+její
+svými
+jste
+aj
+tu
+tedy
+teto
+bylo
+kde
+ke
+pravé
+ji
+nad
+nejsou
+či
+pod
+téma
+mezi
+přes
+ty
+pak
+vám
+ani
+když
+však
+neg
+jsem
+tento
+článku
+články
+aby
+jsme
+před
+pta
+jejich
+byl
+ještě
+až
+bez
+také
+pouze
+první
+vaše
+která
+nás
+nový
+tipy
+pokud
+může
+strana
+jeho
+své
+jiné
+zprávy
+nové
+není
+vás
+jen
+podle
+zde
+už
+být
+více
+bude
+již
+než
+který
+by
+které
+co
+nebo
+ten
+tak
+má
+při
+od
+po
+jsou
+jak
+další
+ale
+si
+se
+ve
+to
+jako
+za
+zpět
+ze
+do
+pro
+je
+na
+atd
+atp
+jakmile
+přičemž
+já
+on
+ona
+ono
+oni
+ony
+my
+vy
+jí
+ji
+mě
+mne
+jemu
+tomu
+těm
+těmu
+němu
+němuž
+jehož
+jíž
+jelikož
+jež
+jakož
+načež

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_da.txt
----------------------------------------------------------------------
diff --git 
a/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_da.txt 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_da.txt
new file mode 100644
index 0000000..42e6145
--- /dev/null
+++ 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_da.txt
@@ -0,0 +1,110 @@
+ | From svn.tartarus.org/snowball/trunk/website/algorithms/danish/stop.txt
+ | This file is distributed under the BSD License.
+ | See http://snowball.tartarus.org/license.php
+ | Also see http://www.opensource.org/licenses/bsd-license.html
+ |  - Encoding was converted to UTF-8.
+ |  - This notice was added.
+ |
+ | NOTE: To use this file with StopFilterFactory, you must specify 
format="snowball"
+
+ | A Danish stop word list. Comments begin with vertical bar. Each stop
+ | word is at the start of a line.
+
+ | This is a ranked list (commonest to rarest) of stopwords derived from
+ | a large text sample.
+
+
+og           | and
+i            | in
+jeg          | I
+det          | that (dem. pronoun)/it (pers. pronoun)
+at           | that (in front of a sentence)/to (with infinitive)
+en           | a/an
+den          | it (pers. pronoun)/that (dem. pronoun)
+til          | to/at/for/until/against/by/of/into, more
+er           | present tense of "to be"
+som          | who, as
+på           | on/upon/in/on/at/to/after/of/with/for, on
+de           | they
+med          | with/by/in, along
+han          | he
+af           | of/by/from/off/for/in/with/on, off
+for          | at/for/to/from/by/of/ago, in front/before, because
+ikke         | not
+der          | who/which, there/those
+var          | past tense of "to be"
+mig          | me/myself
+sig          | oneself/himself/herself/itself/themselves
+men          | but
+et           | a/an/one, one (number), someone/somebody/one
+har          | present tense of "to have"
+om           | round/about/for/in/a, about/around/down, if
+vi           | we
+min          | my
+havde        | past tense of "to have"
+ham          | him
+hun          | she
+nu           | now
+over         | over/above/across/by/beyond/past/on/about, over/past
+da           | then, when/as/since
+fra          | from/off/since, off, since
+du           | you
+ud           | out
+sin          | his/her/its/one's
+dem          | them
+os           | us/ourselves
+op           | up
+man          | you/one
+hans         | his
+hvor         | where
+eller        | or
+hvad         | what
+skal         | must/shall etc.
+selv         | myself/youself/herself/ourselves etc., even
+her          | here
+alle         | all/everyone/everybody etc.
+vil          | will (verb)
+blev         | past tense of "to stay/to remain/to get/to become"
+kunne        | could
+ind          | in
+når          | when
+være         | present tense of "to be"
+dog          | however/yet/after all
+noget        | something
+ville        | would
+jo           | you know/you see (adv), yes
+deres        | their/theirs
+efter        | after/behind/according to/for/by/from, later/afterwards
+ned          | down
+skulle       | should
+denne        | this
+end          | than
+dette        | this
+mit          | my/mine
+også         | also
+under        | under/beneath/below/during, below/underneath
+have         | have
+dig          | you
+anden        | other
+hende        | her
+mine         | my
+alt          | everything
+meget        | much/very, plenty of
+sit          | his, her, its, one's
+sine         | his, her, its, one's
+vor          | our
+mod          | against
+disse        | these
+hvis         | if
+din          | your/yours
+nogle        | some
+hos          | by/at
+blive        | be/become
+mange        | many
+ad           | by/through
+bliver       | present tense of "to be/to become"
+hendes       | her/hers
+været        | be
+thi          | for (conj)
+jer          | you
+sådan        | such, like this/like that

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_de.txt
----------------------------------------------------------------------
diff --git 
a/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_de.txt 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_de.txt
new file mode 100644
index 0000000..86525e7
--- /dev/null
+++ 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_de.txt
@@ -0,0 +1,294 @@
+ | From svn.tartarus.org/snowball/trunk/website/algorithms/german/stop.txt
+ | This file is distributed under the BSD License.
+ | See http://snowball.tartarus.org/license.php
+ | Also see http://www.opensource.org/licenses/bsd-license.html
+ |  - Encoding was converted to UTF-8.
+ |  - This notice was added.
+ |
+ | NOTE: To use this file with StopFilterFactory, you must specify 
format="snowball"
+
+ | A German stop word list. Comments begin with vertical bar. Each stop
+ | word is at the start of a line.
+
+ | The number of forms in this list is reduced significantly by passing it
+ | through the German stemmer.
+
+
+aber           |  but
+
+alle           |  all
+allem
+allen
+aller
+alles
+
+als            |  than, as
+also           |  so
+am             |  an + dem
+an             |  at
+
+ander          |  other
+andere
+anderem
+anderen
+anderer
+anderes
+anderm
+andern
+anderr
+anders
+
+auch           |  also
+auf            |  on
+aus            |  out of
+bei            |  by
+bin            |  am
+bis            |  until
+bist           |  art
+da             |  there
+damit          |  with it
+dann           |  then
+
+der            |  the
+den
+des
+dem
+die
+das
+
+daß            |  that
+
+derselbe       |  the same
+derselben
+denselben
+desselben
+demselben
+dieselbe
+dieselben
+dasselbe
+
+dazu           |  to that
+
+dein           |  thy
+deine
+deinem
+deinen
+deiner
+deines
+
+denn           |  because
+
+derer          |  of those
+dessen         |  of him
+
+dich           |  thee
+dir            |  to thee
+du             |  thou
+
+dies           |  this
+diese
+diesem
+diesen
+dieser
+dieses
+
+
+doch           |  (several meanings)
+dort           |  (over) there
+
+
+durch          |  through
+
+ein            |  a
+eine
+einem
+einen
+einer
+eines
+
+einig          |  some
+einige
+einigem
+einigen
+einiger
+einiges
+
+einmal         |  once
+
+er             |  he
+ihn            |  him
+ihm            |  to him
+
+es             |  it
+etwas          |  something
+
+euer           |  your
+eure
+eurem
+euren
+eurer
+eures
+
+für            |  for
+gegen          |  towards
+gewesen        |  p.p. of sein
+hab            |  have
+habe           |  have
+haben          |  have
+hat            |  has
+hatte          |  had
+hatten         |  had
+hier           |  here
+hin            |  there
+hinter         |  behind
+
+ich            |  I
+mich           |  me
+mir            |  to me
+
+
+ihr            |  you, to her
+ihre
+ihrem
+ihren
+ihrer
+ihres
+euch           |  to you
+
+im             |  in + dem
+in             |  in
+indem          |  while
+ins            |  in + das
+ist            |  is
+
+jede           |  each, every
+jedem
+jeden
+jeder
+jedes
+
+jene           |  that
+jenem
+jenen
+jener
+jenes
+
+jetzt          |  now
+kann           |  can
+
+kein           |  no
+keine
+keinem
+keinen
+keiner
+keines
+
+können         |  can
+könnte         |  could
+machen         |  do
+man            |  one
+
+manche         |  some, many a
+manchem
+manchen
+mancher
+manches
+
+mein           |  my
+meine
+meinem
+meinen
+meiner
+meines
+
+mit            |  with
+muss           |  must
+musste         |  had to
+nach           |  to(wards)
+nicht          |  not
+nichts         |  nothing
+noch           |  still, yet
+nun            |  now
+nur            |  only
+ob             |  whether
+oder           |  or
+ohne           |  without
+sehr           |  very
+
+sein           |  his
+seine
+seinem
+seinen
+seiner
+seines
+
+selbst         |  self
+sich           |  herself
+
+sie            |  they, she
+ihnen          |  to them
+
+sind           |  are
+so             |  so
+
+solche         |  such
+solchem
+solchen
+solcher
+solches
+
+soll           |  shall
+sollte         |  should
+sondern        |  but
+sonst          |  else
+über           |  over
+um             |  about, around
+und            |  and
+
+uns            |  us
+unse
+unsem
+unsen
+unser
+unses
+
+unter          |  under
+viel           |  much
+vom            |  von + dem
+von            |  from
+vor            |  before
+während        |  while
+war            |  was
+waren          |  were
+warst          |  wast
+was            |  what
+weg            |  away, off
+weil           |  because
+weiter         |  further
+
+welche         |  which
+welchem
+welchen
+welcher
+welches
+
+wenn           |  when
+werde          |  will
+werden         |  will
+wie            |  how
+wieder         |  again
+will           |  want
+wir            |  we
+wird           |  will
+wirst          |  willst
+wo             |  where
+wollen         |  want
+wollte         |  wanted
+würde          |  would
+würden         |  would
+zu             |  to
+zum            |  zu + dem
+zur            |  zu + der
+zwar           |  indeed
+zwischen       |  between
+

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_el.txt
----------------------------------------------------------------------
diff --git 
a/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_el.txt 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_el.txt
new file mode 100644
index 0000000..232681f
--- /dev/null
+++ 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_el.txt
@@ -0,0 +1,78 @@
+# Lucene Greek Stopwords list
+# Note: by default this file is used after GreekLowerCaseFilter,
+# so when modifying this file use 'σ' instead of 'ς' 
+ο
+η
+το
+οι
+τα
+του
+τησ
+των
+τον
+την
+και 
+κι
+κ
+ειμαι
+εισαι
+ειναι
+ειμαστε
+ειστε
+στο
+στον
+στη
+στην
+μα
+αλλα
+απο
+για
+προσ
+με
+σε
+ωσ
+παρα
+αντι
+κατα
+μετα
+θα
+να
+δε
+δεν
+μη
+μην
+επι
+ενω
+εαν
+αν
+τοτε
+που
+πωσ
+ποιοσ
+ποια
+ποιο
+ποιοι
+ποιεσ
+ποιων
+ποιουσ
+αυτοσ
+αυτη
+αυτο
+αυτοι
+αυτων
+αυτουσ
+αυτεσ
+αυτα
+εκεινοσ
+εκεινη
+εκεινο
+εκεινοι
+εκεινεσ
+εκεινα
+εκεινων
+εκεινουσ
+οπωσ
+ομωσ
+ισωσ
+οσο
+οτι

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_en.txt
----------------------------------------------------------------------
diff --git 
a/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_en.txt 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_en.txt
new file mode 100644
index 0000000..2c164c0
--- /dev/null
+++ 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_en.txt
@@ -0,0 +1,54 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# a couple of test stopwords to test that the words are really being
+# configured from this file:
+stopworda
+stopwordb
+
+# Standard english stop words taken from Lucene's StopAnalyzer
+a
+an
+and
+are
+as
+at
+be
+but
+by
+for
+if
+in
+into
+is
+it
+no
+not
+of
+on
+or
+such
+that
+the
+their
+then
+there
+these
+they
+this
+to
+was
+will
+with

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_es.txt
----------------------------------------------------------------------
diff --git 
a/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_es.txt 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_es.txt
new file mode 100644
index 0000000..487d78c
--- /dev/null
+++ 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_es.txt
@@ -0,0 +1,356 @@
+ | From svn.tartarus.org/snowball/trunk/website/algorithms/spanish/stop.txt
+ | This file is distributed under the BSD License.
+ | See http://snowball.tartarus.org/license.php
+ | Also see http://www.opensource.org/licenses/bsd-license.html
+ |  - Encoding was converted to UTF-8.
+ |  - This notice was added.
+ |
+ | NOTE: To use this file with StopFilterFactory, you must specify 
format="snowball"
+
+ | A Spanish stop word list. Comments begin with vertical bar. Each stop
+ | word is at the start of a line.
+
+
+ | The following is a ranked list (commonest to rarest) of stopwords
+ | deriving from a large sample of text.
+
+ | Extra words have been added at the end.
+
+de             |  from, of
+la             |  the, her
+que            |  who, that
+el             |  the
+en             |  in
+y              |  and
+a              |  to
+los            |  the, them
+del            |  de + el
+se             |  himself, from him etc
+las            |  the, them
+por            |  for, by, etc
+un             |  a
+para           |  for
+con            |  with
+no             |  no
+una            |  a
+su             |  his, her
+al             |  a + el
+  | es         from SER
+lo             |  him
+como           |  how
+más            |  more
+pero           |  pero
+sus            |  su plural
+le             |  to him, her
+ya             |  already
+o              |  or
+  | fue        from SER
+este           |  this
+  | ha         from HABER
+sí             |  himself etc
+porque         |  because
+esta           |  this
+  | son        from SER
+entre          |  between
+  | está     from ESTAR
+cuando         |  when
+muy            |  very
+sin            |  without
+sobre          |  on
+  | ser        from SER
+  | tiene      from TENER
+también        |  also
+me             |  me
+hasta          |  until
+hay            |  there is/are
+donde          |  where
+  | han        from HABER
+quien          |  whom, that
+  | están      from ESTAR
+  | estado     from ESTAR
+desde          |  from
+todo           |  all
+nos            |  us
+durante        |  during
+  | estados    from ESTAR
+todos          |  all
+uno            |  a
+les            |  to them
+ni             |  nor
+contra         |  against
+otros          |  other
+  | fueron     from SER
+ese            |  that
+eso            |  that
+  | había      from HABER
+ante           |  before
+ellos          |  they
+e              |  and (variant of y)
+esto           |  this
+mí             |  me
+antes          |  before
+algunos        |  some
+qué            |  what?
+unos           |  a
+yo             |  I
+otro           |  other
+otras          |  other
+otra           |  other
+él             |  he
+tanto          |  so much, many
+esa            |  that
+estos          |  these
+mucho          |  much, many
+quienes        |  who
+nada           |  nothing
+muchos         |  many
+cual           |  who
+  | sea        from SER
+poco           |  few
+ella           |  she
+estar          |  to be
+  | haber      from HABER
+estas          |  these
+  | estaba     from ESTAR
+  | estamos    from ESTAR
+algunas        |  some
+algo           |  something
+nosotros       |  we
+
+      | other forms
+
+mi             |  me
+mis            |  mi plural
+tú             |  thou
+te             |  thee
+ti             |  thee
+tu             |  thy
+tus            |  tu plural
+ellas          |  they
+nosotras       |  we
+vosotros       |  you
+vosotras       |  you
+os             |  you
+mío            |  mine
+mía            |
+míos           |
+mías           |
+tuyo           |  thine
+tuya           |
+tuyos          |
+tuyas          |
+suyo           |  his, hers, theirs
+suya           |
+suyos          |
+suyas          |
+nuestro        |  ours
+nuestra        |
+nuestros       |
+nuestras       |
+vuestro        |  yours
+vuestra        |
+vuestros       |
+vuestras       |
+esos           |  those
+esas           |  those
+
+               | forms of estar, to be (not including the infinitive):
+estoy
+estás
+está
+estamos
+estáis
+están
+esté
+estés
+estemos
+estéis
+estén
+estaré
+estarás
+estará
+estaremos
+estaréis
+estarán
+estaría
+estarías
+estaríamos
+estaríais
+estarían
+estaba
+estabas
+estábamos
+estabais
+estaban
+estuve
+estuviste
+estuvo
+estuvimos
+estuvisteis
+estuvieron
+estuviera
+estuvieras
+estuviéramos
+estuvierais
+estuvieran
+estuviese
+estuvieses
+estuviésemos
+estuvieseis
+estuviesen
+estando
+estado
+estada
+estados
+estadas
+estad
+
+               | forms of haber, to have (not including the infinitive):
+he
+has
+ha
+hemos
+habéis
+han
+haya
+hayas
+hayamos
+hayáis
+hayan
+habré
+habrás
+habrá
+habremos
+habréis
+habrán
+habría
+habrías
+habríamos
+habríais
+habrían
+había
+habías
+habíamos
+habíais
+habían
+hube
+hubiste
+hubo
+hubimos
+hubisteis
+hubieron
+hubiera
+hubieras
+hubiéramos
+hubierais
+hubieran
+hubiese
+hubieses
+hubiésemos
+hubieseis
+hubiesen
+habiendo
+habido
+habida
+habidos
+habidas
+
+               | forms of ser, to be (not including the infinitive):
+soy
+eres
+es
+somos
+sois
+son
+sea
+seas
+seamos
+seáis
+sean
+seré
+serás
+será
+seremos
+seréis
+serán
+sería
+serías
+seríamos
+seríais
+serían
+era
+eras
+éramos
+erais
+eran
+fui
+fuiste
+fue
+fuimos
+fuisteis
+fueron
+fuera
+fueras
+fuéramos
+fuerais
+fueran
+fuese
+fueses
+fuésemos
+fueseis
+fuesen
+siendo
+sido
+  |  sed also means 'thirst'
+
+               | forms of tener, to have (not including the infinitive):
+tengo
+tienes
+tiene
+tenemos
+tenéis
+tienen
+tenga
+tengas
+tengamos
+tengáis
+tengan
+tendré
+tendrás
+tendrá
+tendremos
+tendréis
+tendrán
+tendría
+tendrías
+tendríamos
+tendríais
+tendrían
+tenía
+tenías
+teníamos
+teníais
+tenían
+tuve
+tuviste
+tuvo
+tuvimos
+tuvisteis
+tuvieron
+tuviera
+tuvieras
+tuviéramos
+tuvierais
+tuvieran
+tuviese
+tuvieses
+tuviésemos
+tuvieseis
+tuviesen
+teniendo
+tenido
+tenida
+tenidos
+tenidas
+tened
+

http://git-wip-us.apache.org/repos/asf/incubator-sdap-nexus/blob/ff98fa34/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_eu.txt
----------------------------------------------------------------------
diff --git 
a/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_eu.txt 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_eu.txt
new file mode 100644
index 0000000..25f1db9
--- /dev/null
+++ 
b/data-access/config/schemas/solr-7.1.0/nexustiles/conf/lang/stopwords_eu.txt
@@ -0,0 +1,99 @@
+# example set of basque stopwords
+al
+anitz
+arabera
+asko
+baina
+bat
+batean
+batek
+bati
+batzuei
+batzuek
+batzuetan
+batzuk
+bera
+beraiek
+berau
+berauek
+bere
+berori
+beroriek
+beste
+bezala
+da
+dago
+dira
+ditu
+du
+dute
+edo
+egin
+ere
+eta
+eurak
+ez
+gainera
+gu
+gutxi
+guzti
+haiei
+haiek
+haietan
+hainbeste
+hala
+han
+handik
+hango
+hara
+hari
+hark
+hartan
+hau
+hauei
+hauek
+hauetan
+hemen
+hemendik
+hemengo
+hi
+hona
+honek
+honela
+honetan
+honi
+hor
+hori
+horiei
+horiek
+horietan
+horko
+horra
+horrek
+horrela
+horretan
+horri
+hortik
+hura
+izan
+ni
+noiz
+nola
+non
+nondik
+nongo
+nor
+nora
+ze
+zein
+zen
+zenbait
+zenbat
+zer
+zergatik
+ziren
+zituen
+zu
+zuek
+zuen
+zuten


Reply via email to