http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/ranger_solrj/src/main/java/org/apache/solr/common/util/StrUtils.java
----------------------------------------------------------------------
diff --git 
a/ranger_solrj/src/main/java/org/apache/solr/common/util/StrUtils.java 
b/ranger_solrj/src/main/java/org/apache/solr/common/util/StrUtils.java
new file mode 100644
index 0000000..8ac87d7
--- /dev/null
+++ b/ranger_solrj/src/main/java/org/apache/solr/common/util/StrUtils.java
@@ -0,0 +1,309 @@
+/*
+ * 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.
+ */
+
+package org.apache.solr.common.util;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Locale;
+import java.io.IOException;
+
+import org.apache.solr.common.SolrException;
+
+/**
+ *
+ */
+public class StrUtils {
+  public static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6',
+      '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
+
+  /**
+   * Split a string based on a separator, but don't split if it's inside
+   * a string.  Assume '\' escapes the next char both inside and
+   * outside strings.
+   */
+  public static List<String> splitSmart(String s, char separator) {
+    ArrayList<String> lst = new ArrayList<>(4);
+    int pos=0, start=0, end=s.length();
+    char inString=0;
+    char ch=0;
+    while (pos < end) {
+      char prevChar=ch;
+      ch = s.charAt(pos++);
+      if (ch=='\\') {    // skip escaped chars
+        pos++;
+      } else if (inString != 0 && ch==inString) {
+        inString=0;
+      } else if (ch=='\'' || ch=='"') {
+        // If char is directly preceeded by a number or letter
+        // then don't treat it as the start of a string.
+        // Examples: 50" TV, or can't
+        if (!Character.isLetterOrDigit(prevChar)) {
+          inString=ch;
+        }
+      } else if (ch==separator && inString==0) {
+        lst.add(s.substring(start,pos-1));
+        start=pos;
+      }
+    }
+    if (start < end) {
+      lst.add(s.substring(start,end));
+    }
+
+    /***
+    if (SolrCore.log.isLoggable(Level.FINEST)) {
+      SolrCore.log.trace("splitCommand=" + lst);
+    }
+    ***/
+
+    return lst;
+  }
+
+  /** Splits a backslash escaped string on the separator.
+   * <p>
+   * Current backslash escaping supported:
+   * <br> \n \t \r \b \f are escaped the same as a Java String
+   * <br> Other characters following a backslash are produced verbatim (\c 
=&gt; c)
+   *
+   * @param s  the string to split
+   * @param separator the separator to split on
+   * @param decode decode backslash escaping
+   */
+  public static List<String> splitSmart(String s, String separator, boolean 
decode) {
+    ArrayList<String> lst = new ArrayList<>(2);
+    StringBuilder sb = new StringBuilder();
+    int pos=0, end=s.length();
+    while (pos < end) {
+      if (s.startsWith(separator,pos)) {
+        if (sb.length() > 0) {
+          lst.add(sb.toString());
+          sb=new StringBuilder();
+        }
+        pos+=separator.length();
+        continue;
+      }
+
+      char ch = s.charAt(pos++);
+      if (ch=='\\') {
+        if (!decode) sb.append(ch);
+        if (pos>=end) break;  // ERROR, or let it go?
+        ch = s.charAt(pos++);
+        if (decode) {
+          switch(ch) {
+            case 'n' : ch='\n'; break;
+            case 't' : ch='\t'; break;
+            case 'r' : ch='\r'; break;
+            case 'b' : ch='\b'; break;
+            case 'f' : ch='\f'; break;
+          }
+        }
+      }
+
+      sb.append(ch);
+    }
+
+    if (sb.length() > 0) {
+      lst.add(sb.toString());
+    }
+
+    return lst;
+  }
+
+  /**
+   * Splits file names separated by comma character.
+   * File names can contain comma characters escaped by backslash '\'
+   *
+   * @param fileNames the string containing file names
+   * @return a list of file names with the escaping backslashed removed
+   */
+  public static List<String> splitFileNames(String fileNames) {
+    if (fileNames == null)
+      return Collections.<String>emptyList();
+
+    List<String> result = new ArrayList<>();
+    for (String file : fileNames.split("(?<!\\\\),")) {
+      result.add(file.replaceAll("\\\\(?=,)", ""));
+    }
+
+    return result;
+  }
+
+  /** 
+   * Creates a backslash escaped string, joining all the items. 
+   * @see #escapeTextWithSeparator
+   */
+  public static String join(List<?> items, char separator) {
+    StringBuilder sb = new StringBuilder(items.size() << 3);
+    boolean first=true;
+    for (Object o : items) {
+      String item = o.toString();
+      if (first) {
+        first = false;
+      } else {
+        sb.append(separator);
+      }
+      appendEscapedTextToBuilder(sb, item, separator);
+    }
+    return sb.toString();
+  }
+
+
+
+  public static List<String> splitWS(String s, boolean decode) {
+    ArrayList<String> lst = new ArrayList<>(2);
+    StringBuilder sb = new StringBuilder();
+    int pos=0, end=s.length();
+    while (pos < end) {
+      char ch = s.charAt(pos++);
+      if (Character.isWhitespace(ch)) {
+        if (sb.length() > 0) {
+          lst.add(sb.toString());
+          sb=new StringBuilder();
+        }
+        continue;
+      }
+
+      if (ch=='\\') {
+        if (!decode) sb.append(ch);
+        if (pos>=end) break;  // ERROR, or let it go?
+        ch = s.charAt(pos++);
+        if (decode) {
+          switch(ch) {
+            case 'n' : ch='\n'; break;
+            case 't' : ch='\t'; break;
+            case 'r' : ch='\r'; break;
+            case 'b' : ch='\b'; break;
+            case 'f' : ch='\f'; break;
+          }
+        }
+      }
+
+      sb.append(ch);
+    }
+
+    if (sb.length() > 0) {
+      lst.add(sb.toString());
+    }
+
+    return lst;
+  }
+
+  public static List<String> toLower(List<String> strings) {
+    ArrayList<String> ret = new ArrayList<>(strings.size());
+    for (String str : strings) {
+      ret.add(str.toLowerCase(Locale.ROOT));
+    }
+    return ret;
+  }
+
+
+
+  /** Return if a string starts with '1', 't', or 'T'
+   *  and return false otherwise.
+   */
+  public static boolean parseBoolean(String s) {
+    char ch = s.length()>0 ? s.charAt(0) : 0;
+    return (ch=='1' || ch=='t' || ch=='T');
+  }
+  
+  /** how to transform a String into a boolean... more flexible than
+   * Boolean.parseBoolean() to enable easier integration with html forms.
+   */
+  public static boolean parseBool(String s) {
+    if( s != null ) {
+      if( s.startsWith("true") || s.startsWith("on") || s.startsWith("yes") ) {
+        return true;
+      }
+      if( s.startsWith("false") || s.startsWith("off") || s.equals("no") ) {
+        return false;
+      }
+    }
+    throw new SolrException( SolrException.ErrorCode.BAD_REQUEST, "invalid 
boolean value: "+s );
+  }
+
+  /**
+   * {@link NullPointerException} and {@link SolrException} free version of 
{@link #parseBool(String)}
+   * @return parsed boolean value (or def, if s is null or invalid)
+   */
+  public static boolean parseBool(String s, boolean def) {
+    if( s != null ) {
+      if( s.startsWith("true") || s.startsWith("on") || s.startsWith("yes") ) {
+        return true;
+      }
+      if( s.startsWith("false") || s.startsWith("off") || s.equals("no") ) {
+        return false;
+      }
+    }
+    return def;
+  }
+  
+  /**
+   * URLEncodes a value, replacing only enough chars so that
+   * the URL may be unambiguously pasted back into a browser.
+   * <p>
+   * Characters with a numeric value less than 32 are encoded.
+   * &amp;,=,%,+,space are encoded.
+   */
+  public static void partialURLEncodeVal(Appendable dest, String val) throws 
IOException {
+    for (int i=0; i<val.length(); i++) {
+      char ch = val.charAt(i);
+      if (ch < 32) {
+        dest.append('%');
+        if (ch < 0x10) dest.append('0');
+        dest.append(Integer.toHexString(ch));
+      } else {
+        switch (ch) {
+          case ' ': dest.append('+'); break;
+          case '&': dest.append("%26"); break;
+          case '%': dest.append("%25"); break;
+          case '=': dest.append("%3D"); break;
+          case '+': dest.append("%2B"); break;
+          default : dest.append(ch); break;
+        }
+      }
+    }
+  }
+
+  /** 
+   * Creates a new copy of the string with the separator backslash escaped.
+   * @see #join
+   */
+  public static String escapeTextWithSeparator(String item, char separator) {
+    StringBuilder sb = new StringBuilder(item.length() * 2);
+    appendEscapedTextToBuilder(sb, item, separator);
+    return sb.toString();
+  }  
+
+  /**
+   * writes chars from item to out, backslash escaping as needed based on 
separator -- 
+   * but does not append the seperator itself
+   */
+  public static void appendEscapedTextToBuilder(StringBuilder out, 
+                                                 String item, 
+                                                 char separator) {
+    for (int i = 0; i < item.length(); i++) {
+      char ch = item.charAt(i);
+      if (ch == '\\' || ch == separator) { 
+        out.append('\\');
+      }
+      out.append(ch);
+    }
+  }
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/ranger_solrj/src/main/java/org/apache/solr/common/util/URLUtil.java
----------------------------------------------------------------------
diff --git 
a/ranger_solrj/src/main/java/org/apache/solr/common/util/URLUtil.java 
b/ranger_solrj/src/main/java/org/apache/solr/common/util/URLUtil.java
new file mode 100644
index 0000000..6d273ec
--- /dev/null
+++ b/ranger_solrj/src/main/java/org/apache/solr/common/util/URLUtil.java
@@ -0,0 +1,50 @@
+/*
+ * 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.
+ */
+
+package org.apache.solr.common.util;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class URLUtil {
+  
+  public final static Pattern URL_PREFIX = Pattern.compile("^([a-z]*?://).*");
+  
+  public static String removeScheme(String url) {
+    Matcher matcher = URL_PREFIX.matcher(url);
+    if (matcher.matches()) {
+      return url.substring(matcher.group(1).length());
+    }
+    
+    return url;
+  }
+  
+  public static boolean hasScheme(String url) {
+    Matcher matcher = URL_PREFIX.matcher(url);
+    return matcher.matches();
+  }
+  
+  public static String getScheme(String url) {
+    Matcher matcher = URL_PREFIX.matcher(url);
+    if (matcher.matches()) {
+      return matcher.group(1);
+    }
+    
+    return null;
+  }
+  
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/ranger_solrj/src/main/java/org/apache/solr/common/util/XML.java
----------------------------------------------------------------------
diff --git a/ranger_solrj/src/main/java/org/apache/solr/common/util/XML.java 
b/ranger_solrj/src/main/java/org/apache/solr/common/util/XML.java
new file mode 100644
index 0000000..50a6da2
--- /dev/null
+++ b/ranger_solrj/src/main/java/org/apache/solr/common/util/XML.java
@@ -0,0 +1,207 @@
+/*
+ * 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.
+ */
+
+package org.apache.solr.common.util;
+
+import java.io.Writer;
+import java.io.IOException;
+import java.util.Map;
+
+/**
+ *
+ */
+public class XML {
+
+  //
+  // copied from some of my personal code...  -YCS
+  // table created from python script.
+  // only have to escape quotes in attribute values, and don't really have to 
escape '>'
+  // many chars less than 0x20 are *not* valid XML, even when escaped!
+  // for example, <foo>&#0;<foo> is invalid XML.
+  private static final String[] chardata_escapes=
+  
{"#0;","#1;","#2;","#3;","#4;","#5;","#6;","#7;","#8;",null,null,"#11;","#12;",null,"#14;","#15;","#16;","#17;","#18;","#19;","#20;","#21;","#22;","#23;","#24;","#25;","#26;","#27;","#28;","#29;","#30;","#31;",null,null,null,null,null,null,"&amp;",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"&lt;",null,"&gt;"};
+
+  private static final String[] attribute_escapes=
+  
{"#0;","#1;","#2;","#3;","#4;","#5;","#6;","#7;","#8;",null,null,"#11;","#12;",null,"#14;","#15;","#16;","#17;","#18;","#19;","#20;","#21;","#22;","#23;","#24;","#25;","#26;","#27;","#28;","#29;","#30;","#31;",null,null,"&quot;",null,null,null,"&amp;",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"&lt;"};
+
+
+
+  /*****************************************
+   #Simple python script used to generate the escape table above.  -YCS
+   #
+   #use individual char arrays or one big char array for better efficiency
+   # or byte array?
+   #other={'&':'amp', '<':'lt', '>':'gt', "'":'apos', '"':'quot'}
+   #
+   other={'&':'amp', '<':'lt'}
+
+   maxi=ord(max(other.keys()))+1
+   table=[None] * maxi
+   #NOTE: invalid XML chars are "escaped" as #nn; *not* &#nn; because
+   #a real XML escape would cause many strict XML parsers to choke.
+   for i in range(0x20): table[i]='#%d;' % i
+   for i in '\n\r\t ': table[ord(i)]=None
+   for k,v in other.items():
+    table[ord(k)]='&%s;' % v
+
+   result=""
+   for i in range(maxi):
+     val=table[i]
+     if not val: val='null'
+     else: val='"%s"' % val
+     result += val + ','
+
+   print result
+   ****************************************/
+
+
+/*********
+ *
+ * @throws IOException If there is a low-level I/O error.
+ */
+  public static void escapeCharData(String str, Writer out) throws IOException 
{
+    escape(str, out, chardata_escapes);
+  }
+
+  public static void escapeAttributeValue(String str, Writer out) throws 
IOException {
+    escape(str, out, attribute_escapes);
+  }
+
+  public static void escapeAttributeValue(char [] chars, int start, int 
length, Writer out) throws IOException {
+    escape(chars, start, length, out, attribute_escapes);
+  }
+
+
+  public final static void writeXML(Writer out, String tag, String val) throws 
IOException {
+    out.write('<');
+    out.write(tag);
+    if (val == null) {
+      out.write('/');
+      out.write('>');
+    } else {
+      out.write('>');
+      escapeCharData(val,out);
+      out.write('<');
+      out.write('/');
+      out.write(tag);
+      out.write('>');
+    }
+  }
+
+  /** does NOT escape character data in val, must already be valid XML */
+  public final static void writeUnescapedXML(Writer out, String tag, String 
val, Object... attrs) throws IOException {
+    out.write('<');
+    out.write(tag);
+    for (int i=0; i<attrs.length; i++) {
+      out.write(' ');
+      out.write(attrs[i++].toString());
+      out.write('=');
+      out.write('"');
+      out.write(attrs[i].toString());
+      out.write('"');
+    }
+    if (val == null) {
+      out.write('/');
+      out.write('>');
+    } else {
+      out.write('>');
+      out.write(val);
+      out.write('<');
+      out.write('/');
+      out.write(tag);
+      out.write('>');
+    }
+  }
+
+  /** escapes character data in val */
+  public final static void writeXML(Writer out, String tag, String val, 
Object... attrs) throws IOException {
+    out.write('<');
+    out.write(tag);
+    for (int i=0; i<attrs.length; i++) {
+      out.write(' ');
+      out.write(attrs[i++].toString());
+      out.write('=');
+      out.write('"');
+      escapeAttributeValue(attrs[i].toString(), out);
+      out.write('"');
+    }
+    if (val == null) {
+      out.write('/');
+      out.write('>');
+    } else {
+      out.write('>');
+      escapeCharData(val,out);
+      out.write('<');
+      out.write('/');
+      out.write(tag);
+      out.write('>');
+    }
+  }
+
+  /** escapes character data in val */
+  public static void writeXML(Writer out, String tag, String val, Map<String, 
String> attrs) throws IOException {
+    out.write('<');
+    out.write(tag);
+    for (Map.Entry<String, String> entry : attrs.entrySet()) {
+      out.write(' ');
+      out.write(entry.getKey());
+      out.write('=');
+      out.write('"');
+      escapeAttributeValue(entry.getValue(), out);
+      out.write('"');
+    }
+    if (val == null) {
+      out.write('/');
+      out.write('>');
+    } else {
+      out.write('>');
+      escapeCharData(val,out);
+      out.write('<');
+      out.write('/');
+      out.write(tag);
+      out.write('>');
+    }
+  }
+
+  private static void escape(char [] chars, int offset, int length, Writer 
out, String [] escapes) throws IOException{
+     for (int i=offset; i<length; i++) {
+      char ch = chars[i];
+      if (ch<escapes.length) {
+        String replacement = escapes[ch];
+        if (replacement != null) {
+          out.write(replacement);
+          continue;
+        }
+      }
+      out.write(ch);
+    }
+  }
+
+  private static void escape(String str, Writer out, String[] escapes) throws 
IOException {
+    for (int i=0; i<str.length(); i++) {
+      char ch = str.charAt(i);
+      if (ch<escapes.length) {
+        String replacement = escapes[ch];
+        if (replacement != null) {
+          out.write(replacement);
+          continue;
+        }
+      }
+      out.write(ch);
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/ranger_solrj/src/main/java/org/apache/solr/common/util/XMLErrorLogger.java
----------------------------------------------------------------------
diff --git 
a/ranger_solrj/src/main/java/org/apache/solr/common/util/XMLErrorLogger.java 
b/ranger_solrj/src/main/java/org/apache/solr/common/util/XMLErrorLogger.java
new file mode 100644
index 0000000..7f45ff9
--- /dev/null
+++ b/ranger_solrj/src/main/java/org/apache/solr/common/util/XMLErrorLogger.java
@@ -0,0 +1,84 @@
+/*
+ * 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.
+ */
+
+package org.apache.solr.common.util;
+
+import org.slf4j.Logger;
+
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import javax.xml.transform.ErrorListener;
+import javax.xml.transform.TransformerException;
+import javax.xml.stream.Location;
+import javax.xml.stream.XMLReporter;
+
+public final class XMLErrorLogger implements 
ErrorHandler,ErrorListener,XMLReporter {
+
+  private final Logger log;
+
+  public XMLErrorLogger(Logger log) {
+    this.log = log;
+  }
+
+  // ErrorHandler
+
+  @Override
+  public void warning(SAXParseException e) {
+    log.warn("XML parse warning in \""+e.getSystemId()+"\", line 
"+e.getLineNumber()+", column "+e.getColumnNumber()+": "+e.getMessage());
+  }
+
+  @Override
+  public void error(SAXParseException e) throws SAXException {
+    throw e;
+  }
+
+  @Override
+  public void fatalError(SAXParseException e) throws SAXException {
+    throw e;
+  }
+
+  // ErrorListener
+
+  @Override
+  public void warning(TransformerException e) {
+    log.warn(e.getMessageAndLocation());
+  }
+
+  @Override
+  public void error(TransformerException e) throws TransformerException {
+    throw e;
+  }
+
+  @Override
+  public void fatalError(TransformerException e) throws TransformerException {
+    throw e;
+  }
+
+  // XMLReporter
+
+  @Override
+  public void report(String message, String errorType, Object 
relatedInformation, Location loc) {
+    final StringBuilder sb = new StringBuilder("XML parser reported 
").append(errorType);
+    if (loc !=  null) {
+      sb.append(" in \"").append(loc.getSystemId()).append("\", line ")
+        .append(loc.getLineNumber()).append(", column 
").append(loc.getColumnNumber());
+    }
+    log.warn(sb.append(": ").append(message).toString());
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/ranger_solrj/src/main/java/org/apache/solr/common/util/package-info.java
----------------------------------------------------------------------
diff --git 
a/ranger_solrj/src/main/java/org/apache/solr/common/util/package-info.java 
b/ranger_solrj/src/main/java/org/apache/solr/common/util/package-info.java
new file mode 100644
index 0000000..1da825f
--- /dev/null
+++ b/ranger_solrj/src/main/java/org/apache/solr/common/util/package-info.java
@@ -0,0 +1,23 @@
+/*
+ * 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.
+ */
+ 
+/** 
+ * Common utility classes reused on both clients &amp; server.
+ */
+package org.apache.solr.common.util;
+
+

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/ranger_solrj/src/main/java/overview.html
----------------------------------------------------------------------
diff --git a/ranger_solrj/src/main/java/overview.html 
b/ranger_solrj/src/main/java/overview.html
new file mode 100644
index 0000000..7a534ed
--- /dev/null
+++ b/ranger_solrj/src/main/java/overview.html
@@ -0,0 +1,21 @@
+<!--
+ 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.
+-->
+<html>
+<body>
+Apache Solr Search Server: Solr-j
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/security-admin/pom.xml
----------------------------------------------------------------------
diff --git a/security-admin/pom.xml b/security-admin/pom.xml
index 78b7e7f..e507afe 100644
--- a/security-admin/pom.xml
+++ b/security-admin/pom.xml
@@ -244,6 +244,11 @@
                </exclusions>
                </dependency>
                <dependency>
+                       <groupId>org.apache.ranger</groupId>
+                       <artifactId>ranger_solrj</artifactId>
+                       <version>${ranger.solrj.version}</version>
+               </dependency>           
+               <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                </dependency>

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/security-admin/scripts/install.properties
----------------------------------------------------------------------
diff --git a/security-admin/scripts/install.properties 
b/security-admin/scripts/install.properties
index 03d09eb..ae66576 100644
--- a/security-admin/scripts/install.properties
+++ b/security-admin/scripts/install.properties
@@ -58,6 +58,14 @@ db_name=ranger
 db_user=rangeradmin
 db_password=
 
+#Source for Audit DB 
+# * audit_db is solr or db
+audit_store=db
+
+# * audit_solr_url URL to Solr. E.g. http://<solr_host>:6083/solr/ranger_audits
+audit_solr_url=
+
+
 #
 # DB UserId for storing auditlog infromation
 # 
@@ -69,6 +77,8 @@ audit_db_name=ranger_audit
 audit_db_user=rangerlogger
 audit_db_password=
 
+
+
 #------------------------- DB CONFIG - END ----------------------------------
 
 #

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/security-admin/scripts/setup.sh
----------------------------------------------------------------------
diff --git a/security-admin/scripts/setup.sh b/security-admin/scripts/setup.sh
index 6c992f7..04e22eb 100755
--- a/security-admin/scripts/setup.sh
+++ b/security-admin/scripts/setup.sh
@@ -129,8 +129,13 @@ init_variables(){
        getPropertyFromFile 'db_root_password' $PROPFILE db_user
        getPropertyFromFile 'db_user' $PROPFILE db_user
        getPropertyFromFile 'db_password' $PROPFILE db_password
-       getPropertyFromFile 'audit_db_user' $PROPFILE audit_db_user
-       getPropertyFromFile 'audit_db_password' $PROPFILE audit_db_password
+       if [ "${audit_store}" == "solr" ]
+       then
+           getPropertyFromFile 'audit_solr_url' $PROPFILE audit_solr_url
+       else
+           getPropertyFromFile 'audit_db_user' $PROPFILE audit_db_user
+           getPropertyFromFile 'audit_db_password' $PROPFILE audit_db_password
+       fi
 }
 
 wait_for_tomcat_shutdown() {
@@ -820,6 +825,19 @@ update_properties() {
                newPropertyValue="com.microsoft.sqlserver.jdbc.SQLServerDriver"
                updatePropertyToFile $propertyName $newPropertyValue $to_file
        fi
+
+       if [ "${audit_store}" == "solr" ]
+        then
+                propertyName=xa.audit.solr.url
+                newPropertyValue=${audit_solr_url}
+                updatePropertyToFile $propertyName $newPropertyValue $to_file
+        fi
+
+        propertyName=xa.audit.db.type
+        newPropertyValue=${audit_store}
+        updatePropertyToFile $propertyName $newPropertyValue $to_file
+
+
        propertyName=xa.webapp.url.root
        newPropertyValue="${policymgr_external_url}"
        updatePropertyToFile $propertyName $newPropertyValue $to_file
@@ -878,41 +896,43 @@ update_properties() {
        fi
 
        ###########
-       audit_db_password_alias=auditDB.jdbc.password
+       if [ "${audit_store}" != "solr" ]
+       then
+           audit_db_password_alias=auditDB.jdbc.password
 
-       echo "Starting configuration for Audit DB credentials:"
+           echo "Starting configuration for Audit DB credentials:"
 
-       if [ "${keystore}" != "" ]
-       then
+           if [ "${keystore}" != "" ]
+           then
                $JAVA_HOME/bin/java -cp "cred/lib/*" 
org.apache.ranger.credentialapi.buildks create "$audit_db_password_alias" 
-value "$audit_db_password" -provider jceks://file$keystore
 
                propertyName=auditDB.jdbc.credential.alias
                newPropertyValue="${audit_db_password_alias}"
                updatePropertyToFile $propertyName $newPropertyValue $to_file
-
+               
                propertyName=auditDB.jdbc.credential.provider.path
                newPropertyValue="${keystore}"
                updatePropertyToFile $propertyName $newPropertyValue $to_file
-
+               
                propertyName=auditDB.jdbc.password
                newPropertyValue="_"
                updatePropertyToFile $propertyName $newPropertyValue $to_file
-       else
+           else
                propertyName=auditDB.jdbc.password
                newPropertyValue="${audit_db_password}"
                updatePropertyToFile $propertyName $newPropertyValue $to_file
-       fi
+           fi
 
-       if test -f $keystore; then
+           if test -f $keystore; then
                chown -R ${unix_user}:${unix_group} ${keystore}
                #echo "$keystore found."
-       else
+           else
                #echo "$keystore not found. so use clear text password"
                propertyName=auditDB.jdbc.password
                newPropertyValue="${audit_db_password}"
                updatePropertyToFile $propertyName $newPropertyValue $to_file
+           fi
        fi
-
 }
 
 create_audit_db_user(){
@@ -1404,4 +1424,4 @@ execute_java_patches
 else
        exit 1
 fi
-echo "Installation of Ranger PolicyManager Web Application is completed."
\ No newline at end of file
+echo "Installation of Ranger PolicyManager Web Application is completed."

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/security-admin/src/main/java/org/apache/ranger/biz/AssetMgr.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/biz/AssetMgr.java 
b/security-admin/src/main/java/org/apache/ranger/biz/AssetMgr.java
index 3c3bd77..839f1fc 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/AssetMgr.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/AssetMgr.java
@@ -66,6 +66,7 @@ import org.apache.ranger.service.XPermMapService;
 import org.apache.ranger.service.XPolicyService;
 import org.apache.ranger.service.XTrxLogService;
 import org.apache.ranger.service.XUserService;
+import org.apache.ranger.solr.SolrAccessAuditsService;
 import org.apache.ranger.util.RestUtil;
 import org.apache.ranger.view.VXAccessAuditList;
 import org.apache.ranger.view.VXAsset;
@@ -135,6 +136,9 @@ public class AssetMgr extends AssetMgrBase {
        XUserMgr xUserMgr;
 
        @Autowired
+       SolrAccessAuditsService solrAccessAuditsService;
+
+       @Autowired
        @Qualifier(value = "transactionManager")
        PlatformTransactionManager txManager;
        
@@ -1776,7 +1780,12 @@ public class AssetMgr extends AssetMgrBase {
                }else 
if(!searchCriteria.getSortType().equalsIgnoreCase("asc")&& 
!searchCriteria.getSortType().equalsIgnoreCase("desc")){
                        searchCriteria.setSortType("desc");
                }
-               return xAccessAuditService.searchXAccessAudits(searchCriteria);
+               if 
(xaBizUtil.getAuditDBType().equalsIgnoreCase(RangerBizUtil.AUDIT_STORE_SOLR)) {
+                       return 
solrAccessAuditsService.searchXAccessAudits(searchCriteria);
+               } else {
+                       return 
xAccessAuditService.searchXAccessAudits(searchCriteria);
+               }
+               //return 
xAccessAuditService.searchXAccessAudits(searchCriteria);
        }
 
        public VXTrxLogList getTransactionReport(String transactionId) {

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/security-admin/src/main/java/org/apache/ranger/biz/RangerBizUtil.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/biz/RangerBizUtil.java 
b/security-admin/src/main/java/org/apache/ranger/biz/RangerBizUtil.java
index b8659aa..37cc3d7 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/RangerBizUtil.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/RangerBizUtil.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
- package org.apache.ranger.biz;
+package org.apache.ranger.biz;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -83,15 +83,17 @@ public class RangerBizUtil {
        Map<String, Integer> classTypeMappings = new HashMap<String, Integer>();
        private int maxFirstNameLength;
        int maxDisplayNameLength = 150;
-       boolean defaultAutoApprove = true;
-       boolean showBlockedContent = true;
        public final String EMPTY_CONTENT_DISPLAY_NAME = "...";
        boolean enableResourceAccessControl;
        private Random random;
        private static final String PATH_CHARS = 
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrst0123456789-_.";
        private static char[] PATH_CHAR_SET = PATH_CHARS.toCharArray();
        private static int PATH_CHAR_SET_LEN = PATH_CHAR_SET.length;
-       
+       public static final String AUDIT_STORE_RDBMS = "DB";
+       public static final String AUDIT_STORE_SOLR = "solr";
+
+       String auditDBType = AUDIT_STORE_RDBMS;
+
        static String fileSeparator = PropertiesUtil.getProperty(
                        "xa.file.separator", "/");
 
@@ -100,19 +102,20 @@ public class RangerBizUtil {
                                "xa.user.firstname.maxlength", "16"));
                maxDisplayNameLength = PropertiesUtil.getIntProperty(
                                "xa.bookmark.name.maxlen", 
maxDisplayNameLength);
-               showBlockedContent = PropertiesUtil.getBooleanProperty(
-                               "xa.content.show_blocked", showBlockedContent);
-               defaultAutoApprove = PropertiesUtil.getBooleanProperty(
-                               "xa.mod.default", defaultAutoApprove);
 
                groupEditableClasses = new HashSet<Class<?>>(
                                Arrays.asList(groupEditableClassesList));
                enableResourceAccessControl = PropertiesUtil.getBooleanProperty(
                                "xa.resource.accessControl.enabled", true);
+               auditDBType = PropertiesUtil.getProperty("xa.audit.db.type",
+                               auditDBType).toLowerCase();
+
+               logger.info("Audit datasource is " + auditDBType);
                random = new Random();
        }
 
-       public <T extends XXDBBase> List<? extends XXDBBase> getParentObjects(T 
object) {
+       public <T extends XXDBBase> List<? extends XXDBBase> getParentObjects(
+                       T object) {
                List<XXDBBase> parentObjectList = null;
                // if (checkParentAcess.contains(object.getMyClassType())) {
                // parentObjectList = new ArrayList<MBase>();
@@ -216,8 +219,8 @@ public class RangerBizUtil {
        }
 
        public String getDisplayNameForClassName(XXDBBase obj) {
-               String classTypeDisplayName = 
RangerConstants.getLabelFor_ClassTypes(obj
-                               .getMyClassType());
+               String classTypeDisplayName = RangerConstants
+                               .getLabelFor_ClassTypes(obj.getMyClassType());
                if (classTypeDisplayName == null) {
                        logger.error(
                                        "Error get name for class type. obj=" + 
obj.toString(),
@@ -254,7 +257,8 @@ public class RangerBizUtil {
         * @param userProfile
         * @return
         */
-       public String generatePublicName(VXPortalUser userProfile, XXPortalUser 
gjUser) {
+       public String generatePublicName(VXPortalUser userProfile,
+                       XXPortalUser gjUser) {
                return generatePublicName(userProfile.getFirstName(),
                                userProfile.getLastName());
        }
@@ -298,7 +302,8 @@ public class RangerBizUtil {
 
        public XXDBBase getMObject(VXDataObject vXDataObject) {
                if (vXDataObject != null) {
-                       return getMObject(vXDataObject.getMyClassType(), 
vXDataObject.getId());
+                       return getMObject(vXDataObject.getMyClassType(),
+                                       vXDataObject.getId());
                }
                return null;
        }
@@ -308,8 +313,8 @@ public class RangerBizUtil {
                        return null;
                }
                if (objClassType == RangerConstants.CLASS_TYPE_USER_PROFILE) {
-                       return 
userMgr.mapXXPortalUserVXPortalUser(daoManager.getXXPortalUser().getById(
-                                       objId));
+                       return userMgr.mapXXPortalUserVXPortalUser(daoManager
+                                       .getXXPortalUser().getById(objId));
                }
                try {
                        AbstractBaseResourceService<?, ?> myService = 
AbstractBaseResourceService
@@ -426,9 +431,10 @@ public class RangerBizUtil {
                                                        xResourceList, xUserId, 
permission, reqTableType,
                                                        reqColumnType, false);
                                        if (!matchFound) {
-                                               vXResponse.setMsgDesc("You're 
not permitted to perform "
-                                                               + "the action 
for resource path : "
-                                                               + resourceName);
+                                               vXResponse
+                                                               
.setMsgDesc("You're not permitted to perform "
+                                                                               
+ "the action for resource path : "
+                                                                               
+ resourceName);
                                                
vXResponse.setStatusCode(VXResponse.STATUS_ERROR);
                                                return vXResponse;
                                        }
@@ -438,9 +444,10 @@ public class RangerBizUtil {
                                        boolean matchFound = 
matchHivePolicy(resourceName,
                                                        xResourceList, xUserId, 
permission);
                                        if (!matchFound) {
-                                               vXResponse.setMsgDesc("You're 
not permitted to perform "
-                                                               + "the action 
for resource path : "
-                                                               + resourceName);
+                                               vXResponse
+                                                               
.setMsgDesc("You're not permitted to perform "
+                                                                               
+ "the action for resource path : "
+                                                                               
+ resourceName);
                                                
vXResponse.setStatusCode(VXResponse.STATUS_ERROR);
                                                return vXResponse;
                                        }
@@ -477,34 +484,34 @@ public class RangerBizUtil {
                        vXResponse.setStatusCode(VXResponse.STATUS_SUCCESS);
                        return vXResponse;
                } else if (assetType == AppConstants.ASSET_KNOX) {
-                               String[] requestResNameList = 
resourceNames.split(",");
-                               for (String resourceName : requestResNameList) {
-                                       boolean matchFound = 
matchKnoxPolicy(resourceName,
-                                                       xResourceList, 
vXResponse, xUserId, permission);
-                                       if (!matchFound) {
-                                               vXResponse.setMsgDesc("You're 
not permitted to perform "
-                                                               + "the action 
for resource path : " + resourceName);
-                                               
vXResponse.setStatusCode(VXResponse.STATUS_ERROR);
-                                               return vXResponse;
-                                       }
+                       String[] requestResNameList = resourceNames.split(",");
+                       for (String resourceName : requestResNameList) {
+                               boolean matchFound = 
matchKnoxPolicy(resourceName,
+                                               xResourceList, vXResponse, 
xUserId, permission);
+                               if (!matchFound) {
+                                       vXResponse.setMsgDesc("You're not 
permitted to perform "
+                                                       + "the action for 
resource path : " + resourceName);
+                                       
vXResponse.setStatusCode(VXResponse.STATUS_ERROR);
+                                       return vXResponse;
+                               }
+                       }
+                       vXResponse.setStatusCode(VXResponse.STATUS_SUCCESS);
+                       return vXResponse;
+               } else if (assetType == AppConstants.ASSET_STORM) {
+                       String[] requestResNameList = resourceNames.split(",");
+                       for (String resourceName : requestResNameList) {
+                               boolean matchFound = 
matchStormPolicy(resourceName,
+                                               xResourceList, vXResponse, 
xUserId, permission);
+                               if (!matchFound) {
+                                       vXResponse.setMsgDesc("You're not 
permitted to perform "
+                                                       + "the action for 
resource path : " + resourceName);
+                                       
vXResponse.setStatusCode(VXResponse.STATUS_ERROR);
+                                       return vXResponse;
                                }
-                               
vXResponse.setStatusCode(VXResponse.STATUS_SUCCESS);
-                               return vXResponse;      
-        } else if (assetType == AppConstants.ASSET_STORM) {
-            String[] requestResNameList = resourceNames.split(",");
-            for (String resourceName : requestResNameList) {
-                boolean matchFound = matchStormPolicy(resourceName,
-                        xResourceList, vXResponse, xUserId, permission);
-                if (!matchFound) {
-                    vXResponse.setMsgDesc("You're not permitted to perform "
-                            + "the action for resource path : " + 
resourceName);
-                    vXResponse.setStatusCode(VXResponse.STATUS_ERROR);
-                    return vXResponse;
-                }
-            }
-            vXResponse.setStatusCode(VXResponse.STATUS_SUCCESS);
-            return vXResponse;
-        }
+                       }
+                       vXResponse.setStatusCode(VXResponse.STATUS_SUCCESS);
+                       return vXResponse;
+               }
                return vXResponse;
        }
 
@@ -619,21 +626,26 @@ public class RangerBizUtil {
         * @return
         */
        public boolean matchHbasePolicy(String resourceName,
-                       List<XXResource> xResourceList, VXResponse vXResponse, 
Long xUserId,
-                       int permission) {
-               if(stringUtil.isEmpty(resourceName) || xResourceList==null || 
xUserId==null){
+                       List<XXResource> xResourceList, VXResponse vXResponse,
+                       Long xUserId, int permission) {
+               if (stringUtil.isEmpty(resourceName) || xResourceList == null
+                               || xUserId == null) {
                        return false;
                }
 
-               String[] splittedResources = stringUtil.split(resourceName, 
fileSeparator);
+               String[] splittedResources = stringUtil.split(resourceName,
+                               fileSeparator);
                if (splittedResources.length < 1 || splittedResources.length > 
3) {
                        logger.debug("Invalid resourceName name : " + 
resourceName);
                        return false;
                }
 
-               String tblName    = splittedResources.length > 0 ? 
splittedResources[0] : StringUtil.WILDCARD_ASTERISK;
-               String colFamName = splittedResources.length > 1 ? 
splittedResources[1] : StringUtil.WILDCARD_ASTERISK;
-               String colName    = splittedResources.length > 2 ? 
splittedResources[2] : StringUtil.WILDCARD_ASTERISK;
+               String tblName = splittedResources.length > 0 ? 
splittedResources[0]
+                               : StringUtil.WILDCARD_ASTERISK;
+               String colFamName = splittedResources.length > 1 ? 
splittedResources[1]
+                               : StringUtil.WILDCARD_ASTERISK;
+               String colName = splittedResources.length > 2 ? 
splittedResources[2]
+                               : StringUtil.WILDCARD_ASTERISK;
 
                boolean policyMatched = false;
                // check all resources whether Hbase policy is enabled in any 
resource
@@ -643,29 +655,38 @@ public class RangerBizUtil {
                                continue;
                        }
                        Long resourceId = xResource.getId();
-                       boolean hasPermission = checkUsrPermForPolicy(xUserId, 
permission, resourceId);
+                       boolean hasPermission = checkUsrPermForPolicy(xUserId, 
permission,
+                                       resourceId);
                        // if permission is enabled then load Tables,column 
family and
                        // columns list from resource
-                       if (! hasPermission) {
+                       if (!hasPermission) {
                                continue;
                        }
 
                        // 1. does the policy match the table?
-                       String[] xTables = 
stringUtil.isEmpty(xResource.getTables()) ? null : 
stringUtil.split(xResource.getTables(), ",");
+                       String[] xTables = 
stringUtil.isEmpty(xResource.getTables()) ? null
+                                       : 
stringUtil.split(xResource.getTables(), ",");
 
-                       boolean matchFound = (xTables == null || xTables.length 
== 0) ? true : matchPath(tblName, xTables);
+                       boolean matchFound = (xTables == null || xTables.length 
== 0) ? true
+                                       : matchPath(tblName, xTables);
 
-                       if(matchFound) {
+                       if (matchFound) {
                                // 2. does the policy match the column?
-                               String[] xColumnFamilies = 
stringUtil.isEmpty(xResource.getColumnFamilies()) ? null : 
stringUtil.split(xResource.getColumnFamilies(), ",");
+                               String[] xColumnFamilies = 
stringUtil.isEmpty(xResource
+                                               .getColumnFamilies()) ? null : 
stringUtil.split(
+                                               xResource.getColumnFamilies(), 
",");
+
+                               matchFound = (xColumnFamilies == null || 
xColumnFamilies.length == 0) ? true
+                                               : matchPath(colFamName, 
xColumnFamilies);
 
-                               matchFound = (xColumnFamilies == null || 
xColumnFamilies.length == 0) ? true : matchPath(colFamName, xColumnFamilies);
-                               
-                               if(matchFound) {
+                               if (matchFound) {
                                        // 3. does the policy match the 
columnFamily?
-                                       String[] xColumns = 
stringUtil.isEmpty(xResource.getColumns()) ? null : 
stringUtil.split(xResource.getColumns(), ",");
+                                       String[] xColumns = 
stringUtil.isEmpty(xResource
+                                                       .getColumns()) ? null : 
stringUtil.split(
+                                                       xResource.getColumns(), 
",");
 
-                                       matchFound = (xColumns == null || 
xColumns.length == 0) ? true : matchPath(colName, xColumns);
+                                       matchFound = (xColumns == null || 
xColumns.length == 0) ? true
+                                                       : matchPath(colName, 
xColumns);
                                }
                        }
 
@@ -699,19 +720,24 @@ public class RangerBizUtil {
                        List<XXResource> xResourceList, Long xUserId, int 
permission,
                        int reqTableType, int reqColumnType, boolean 
isUdfPolicy) {
 
-               if(stringUtil.isEmpty(resourceName) || xResourceList==null || 
xUserId==null){
+               if (stringUtil.isEmpty(resourceName) || xResourceList == null
+                               || xUserId == null) {
                        return false;
                }
 
-               String[] splittedResources = stringUtil.split(resourceName, 
fileSeparator);// get list of resources
+               String[] splittedResources = stringUtil.split(resourceName,
+                               fileSeparator);// get list of resources
                if (splittedResources.length < 1 || splittedResources.length > 
3) {
                        logger.debug("Invalid resource name : " + resourceName);
                        return false;
                }
-               
-               String dbName  = splittedResources.length > 0 ? 
splittedResources[0] : StringUtil.WILDCARD_ASTERISK;
-               String tblName = splittedResources.length > 1 ? 
splittedResources[1] : StringUtil.WILDCARD_ASTERISK;
-               String colName = splittedResources.length > 2 ? 
splittedResources[2] : StringUtil.WILDCARD_ASTERISK;
+
+               String dbName = splittedResources.length > 0 ? 
splittedResources[0]
+                               : StringUtil.WILDCARD_ASTERISK;
+               String tblName = splittedResources.length > 1 ? 
splittedResources[1]
+                               : StringUtil.WILDCARD_ASTERISK;
+               String colName = splittedResources.length > 2 ? 
splittedResources[2]
+                               : StringUtil.WILDCARD_ASTERISK;
 
                boolean policyMatched = false;
                for (XXResource xResource : xResourceList) {
@@ -720,21 +746,24 @@ public class RangerBizUtil {
                        }
 
                        Long resourceId = xResource.getId();
-                       boolean hasPermission = checkUsrPermForPolicy(xUserId, 
permission, resourceId);
+                       boolean hasPermission = checkUsrPermForPolicy(xUserId, 
permission,
+                                       resourceId);
 
-                       if (! hasPermission) {
+                       if (!hasPermission) {
                                continue;
                        }
 
                        // 1. does the policy match the database?
-                       String[] xDatabases = 
stringUtil.isEmpty(xResource.getDatabases()) ? null : 
stringUtil.split(xResource.getDatabases(), ",");
+                       String[] xDatabases = 
stringUtil.isEmpty(xResource.getDatabases()) ? null
+                                       : 
stringUtil.split(xResource.getDatabases(), ",");
 
-                       boolean matchFound = (xDatabases == null || 
xDatabases.length == 0) ? true : matchPath(dbName, xDatabases);
+                       boolean matchFound = (xDatabases == null || 
xDatabases.length == 0) ? true
+                                       : matchPath(dbName, xDatabases);
 
-                       if (! matchFound) {
+                       if (!matchFound) {
                                continue;
                        }
-                       
+
                        // Type(either UDFs policy or non-UDFs policy) of 
current policy
                        // should be of same as type of policy being iterated
                        if (!stringUtil.isEmpty(xResource.getUdfs()) && 
!isUdfPolicy) {
@@ -743,9 +772,10 @@ public class RangerBizUtil {
 
                        if (isUdfPolicy) {
                                // 2. does the policy match the UDF?
-                               String[] xUdfs = 
stringUtil.isEmpty(xResource.getUdfs()) ? null : 
stringUtil.split(xResource.getUdfs(), ",");
-                               
-                               if(! matchPath(tblName, xUdfs)) {
+                               String[] xUdfs = 
stringUtil.isEmpty(xResource.getUdfs()) ? null
+                                               : 
stringUtil.split(xResource.getUdfs(), ",");
+
+                               if (!matchPath(tblName, xUdfs)) {
                                        continue;
                                } else {
                                        policyMatched = true;
@@ -753,11 +783,13 @@ public class RangerBizUtil {
                                }
                        } else {
                                // 2. does the policy match the table?
-                               String[] xTables = 
stringUtil.isEmpty(xResource.getTables()) ? null : 
stringUtil.split(xResource.getTables(), ",");
+                               String[] xTables = 
stringUtil.isEmpty(xResource.getTables()) ? null
+                                               : 
stringUtil.split(xResource.getTables(), ",");
 
-                               matchFound = (xTables == null || xTables.length 
== 0) ? true : matchPath(tblName, xTables);
+                               matchFound = (xTables == null || xTables.length 
== 0) ? true
+                                               : matchPath(tblName, xTables);
 
-                               if(xResource.getTableType() == 
AppConstants.POLICY_EXCLUSION) {
+                               if (xResource.getTableType() == 
AppConstants.POLICY_EXCLUSION) {
                                        matchFound = !matchFound;
                                }
 
@@ -766,11 +798,13 @@ public class RangerBizUtil {
                                }
 
                                // 3. does current policy match the column?
-                               String[] xColumns = 
stringUtil.isEmpty(xResource.getColumns()) ? null : 
stringUtil.split(xResource.getColumns(), ",");
+                               String[] xColumns = 
stringUtil.isEmpty(xResource.getColumns()) ? null
+                                               : 
stringUtil.split(xResource.getColumns(), ",");
 
-                               matchFound = (xColumns == null || 
xColumns.length == 0) ? true : matchPath(colName, xColumns);
+                               matchFound = (xColumns == null || 
xColumns.length == 0) ? true
+                                               : matchPath(colName, xColumns);
 
-                               if(xResource.getColumnType() == 
AppConstants.POLICY_EXCLUSION) {
+                               if (xResource.getColumnType() == 
AppConstants.POLICY_EXCLUSION) {
                                        matchFound = !matchFound;
                                }
 
@@ -784,6 +818,7 @@ public class RangerBizUtil {
                }
                return policyMatched;
        }
+
        /**
         * returns true if user is having required permission on given Hbase
         * resource
@@ -796,8 +831,8 @@ public class RangerBizUtil {
         * @return
         */
        private boolean matchKnoxPolicy(String resourceName,
-                       List<XXResource> xResourceList, VXResponse vXResponse, 
Long xUserId,
-                       int permission) {
+                       List<XXResource> xResourceList, VXResponse vXResponse,
+                       Long xUserId, int permission) {
 
                String[] splittedResources = stringUtil.split(resourceName,
                                fileSeparator);
@@ -817,11 +852,12 @@ public class RangerBizUtil {
                        Long resourceId = xResource.getId();
                        boolean hasPermission = checkUsrPermForPolicy(xUserId, 
permission,
                                        resourceId);
-                       // if permission is enabled then load 
Topologies,services list from resource
+                       // if permission is enabled then load 
Topologies,services list from
+                       // resource
                        if (hasPermission) {
                                String[] xTopologies = 
(xResource.getTopologies() == null || xResource
-                                               
.getTopologies().equalsIgnoreCase("")) ? null : stringUtil
-                                               
.split(xResource.getTopologies(), ",");
+                                               
.getTopologies().equalsIgnoreCase("")) ? null
+                                               : 
stringUtil.split(xResource.getTopologies(), ",");
                                String[] xServices = (xResource.getServices() 
== null || xResource
                                                
.getServices().equalsIgnoreCase("")) ? null
                                                : 
stringUtil.split(xResource.getServices(), ",");
@@ -833,30 +869,31 @@ public class RangerBizUtil {
                                        // check whether given table resource 
matches with any
                                        // existing topology resource
                                        if (index == 0) {
-                                               if(xTopologies!=null){
-                                               for (String xTopology : 
xTopologies) {
-                                                       if 
(matchPath(splittedResources[index], xTopology)) {
-                                                               matchFound = 
true;
-                                                               continue;
+                                               if (xTopologies != null) {
+                                                       for (String xTopology : 
xTopologies) {
+                                                               if 
(matchPath(splittedResources[index],
+                                                                               
xTopology)) {
+                                                                       
matchFound = true;
+                                                                       
continue;
+                                                               }
                                                        }
                                                }
-                                               }
-                                               if(!matchFound) {
+                                               if (!matchFound) {
                                                        break;
                                                }
                                        } // check whether given service 
resource matches with
                                                // any existing service resource
                                        else if (index == 1) {
-                                               if(xServices!=null){
-                                               for (String xService : 
xServices) {
-                                                       if 
(matchPath(splittedResources[index],
-                                                                       
xService)) {
-                                                               matchFound = 
true;
-                                                               continue;
+                                               if (xServices != null) {
+                                                       for (String xService : 
xServices) {
+                                                               if 
(matchPath(splittedResources[index],
+                                                                               
xService)) {
+                                                                       
matchFound = true;
+                                                                       
continue;
+                                                               }
                                                        }
                                                }
-                                               }
-                                               if(!matchFound) {
+                                               if (!matchFound) {
                                                        break;
                                                }
                                        }
@@ -870,85 +907,84 @@ public class RangerBizUtil {
                return policyMatched;
        }
 
-       /**
-        * returns true if user is having required permission on given STORM
-        * resource
-        * 
-        * @param resourceName
-        * @param xResourceList
-        * @param vXResponse
-        * @param xUserId
-        * @param permission
-        * @return
-        */
-       private boolean matchStormPolicy(String resourceName,
-                       List<XXResource> xResourceList, VXResponse vXResponse, 
Long xUserId,
-                       int permission) {
- 
-               String[] splittedResources = stringUtil.split(resourceName,
-                               fileSeparator);
-               int numberOfResources = splittedResources.length;
-               if (numberOfResources < 1 || numberOfResources > 3) {
-                       logger.debug("Invalid policy name : " + resourceName);
-                       return false;
-               }
- 
-               boolean policyMatched = false;
-               // check all resources whether Knox policy is enabled in any 
resource
-               // of provided resource list
-               for (XXResource xResource : xResourceList) {
-                       if (xResource.getResourceStatus() != 
AppConstants.STATUS_ENABLED) {
-                               continue;
-                       }
-                       Long resourceId = xResource.getId();
-                       boolean hasPermission = checkUsrPermForPolicy(xUserId, 
permission,
-                                       resourceId);
-                       // if permission is enabled then load 
Topologies,services list from resource
-                       if (hasPermission) {
-                               String[] xTopologies = 
(xResource.getTopologies() == null || xResource
-                                               
.getTopologies().equalsIgnoreCase("")) ? null : stringUtil
-                                               
.split(xResource.getTopologies(), ",");
-                               /*String[] xServices = (xResource.getServices() 
== null || xResource
-                                               
.getServices().equalsIgnoreCase("")) ? null
-                                               : 
stringUtil.split(xResource.getServices(), ",");*/
- 
-                               boolean matchFound = false;
- 
-                               for (int index = 0; index < numberOfResources; 
index++) {
-                                       matchFound = false;
-                                       // check whether given table resource 
matches with any
-                                       // existing topology resource
-                                       if (index == 0) {
-                                               if(xTopologies!=null){
-                                               for (String xTopology : 
xTopologies) {
-                                                       if 
(matchPath(splittedResources[index], xTopology)) {
-                                                               matchFound = 
true;
-                                                               continue;
-                                                       }
-                                               }
-                                               }
-                                       } // check whether given service 
resource matches with
-                                               // any existing service resource
-                                       /*else if (index == 1) {
-                                               if(xServices!=null){
-                                               for (String xService : 
xServices) {
-                                                       if 
(matchPath(splittedResources[index],
-                                                                       
xService)) {
-                                                               matchFound = 
true;
-                                                               continue;
-                                                       }
-                                               }
-                                               }
-                                       }*/
-                               }
-                               if (matchFound) {
-                                       policyMatched = true;
-                                       break;
-                               }
-                       }
-               }
-               return policyMatched;
-       }
+       /**
+        * returns true if user is having required permission on given STORM
+        * resource
+        * 
+        * @param resourceName
+        * @param xResourceList
+        * @param vXResponse
+        * @param xUserId
+        * @param permission
+        * @return
+        */
+       private boolean matchStormPolicy(String resourceName,
+                       List<XXResource> xResourceList, VXResponse vXResponse,
+                       Long xUserId, int permission) {
+
+               String[] splittedResources = stringUtil.split(resourceName,
+                               fileSeparator);
+               int numberOfResources = splittedResources.length;
+               if (numberOfResources < 1 || numberOfResources > 3) {
+                       logger.debug("Invalid policy name : " + resourceName);
+                       return false;
+               }
+
+               boolean policyMatched = false;
+               // check all resources whether Knox policy is enabled in any 
resource
+               // of provided resource list
+               for (XXResource xResource : xResourceList) {
+                       if (xResource.getResourceStatus() != 
AppConstants.STATUS_ENABLED) {
+                               continue;
+                       }
+                       Long resourceId = xResource.getId();
+                       boolean hasPermission = checkUsrPermForPolicy(xUserId, 
permission,
+                                       resourceId);
+                       // if permission is enabled then load 
Topologies,services list from
+                       // resource
+                       if (hasPermission) {
+                               String[] xTopologies = 
(xResource.getTopologies() == null || xResource
+                                               
.getTopologies().equalsIgnoreCase("")) ? null
+                                               : 
stringUtil.split(xResource.getTopologies(), ",");
+                               /*
+                                * String[] xServices = 
(xResource.getServices() == null ||
+                                * xResource 
.getServices().equalsIgnoreCase("")) ? null :
+                                * stringUtil.split(xResource.getServices(), 
",");
+                                */
+
+                               boolean matchFound = false;
+
+                               for (int index = 0; index < numberOfResources; 
index++) {
+                                       matchFound = false;
+                                       // check whether given table resource 
matches with any
+                                       // existing topology resource
+                                       if (index == 0) {
+                                               if (xTopologies != null) {
+                                                       for (String xTopology : 
xTopologies) {
+                                                               if 
(matchPath(splittedResources[index],
+                                                                               
xTopology)) {
+                                                                       
matchFound = true;
+                                                                       
continue;
+                                                               }
+                                                       }
+                                               }
+                                       } // check whether given service 
resource matches with
+                                               // any existing service resource
+                                       /*
+                                        * else if (index == 1) { 
if(xServices!=null){ for (String
+                                        * xService : xServices) { if
+                                        * (matchPath(splittedResources[index], 
xService)) {
+                                        * matchFound = true; continue; } } } }
+                                        */
+                               }
+                               if (matchFound) {
+                                       policyMatched = true;
+                                       break;
+                               }
+                       }
+               }
+               return policyMatched;
+       }
 
        /**
         * returns path without meta characters
@@ -1027,8 +1063,11 @@ public class RangerBizUtil {
                for (XXPermMap permMap : permMapList) {
                        if (permMap.getPermType() == permission) {
                                if (permMap.getPermFor() == 
AppConstants.XA_PERM_FOR_GROUP) {
-                                       // check whether permission is enabled 
for public group or a group to which user belongs
-                                       matchFound = (publicGroupId != null && 
publicGroupId == permMap.getGroupId()) || isGroupInList(permMap.getGroupId(), 
userGroups);
+                                       // check whether permission is enabled 
for public group or a
+                                       // group to which user belongs
+                                       matchFound = (publicGroupId != null && 
publicGroupId == permMap
+                                                       .getGroupId())
+                                                       || 
isGroupInList(permMap.getGroupId(), userGroups);
                                } else if (permMap.getPermFor() == 
AppConstants.XA_PERM_FOR_USER) {
                                        // check whether permission is enabled 
to user
                                        matchFound = 
permMap.getUserId().equals(xUserId);
@@ -1040,9 +1079,10 @@ public class RangerBizUtil {
                }
                return matchFound;
        }
-       
+
        public Long getPublicGroupId() {
-               XXGroup xXGroupPublic = 
daoManager.getXXGroup().findByGroupName(RangerConstants.GROUP_PUBLIC);
+               XXGroup xXGroupPublic = daoManager.getXXGroup().findByGroupName(
+                               RangerConstants.GROUP_PUBLIC);
 
                return xXGroupPublic != null ? xXGroupPublic.getId() : null;
        }
@@ -1194,7 +1234,7 @@ public class RangerBizUtil {
         */
        private boolean matchPath(String pathToCheckFragment,
                        String wildCardPathFragment) {
-               if(pathToCheckFragment == null || wildCardPathFragment == null) 
{
+               if (pathToCheckFragment == null || wildCardPathFragment == 
null) {
                        return false;
                }
 
@@ -1220,7 +1260,7 @@ public class RangerBizUtil {
                        }
                }
        }
-       
+
        private boolean matchPath(String pathToCheck, String[] wildCardPaths) {
                if (pathToCheck != null && wildCardPaths != null) {
                        for (String wildCardPath : wildCardPaths) {
@@ -1229,7 +1269,7 @@ public class RangerBizUtil {
                                }
                        }
                }
-               
+
                return false;
        }
 
@@ -1308,4 +1348,12 @@ public class RangerBizUtil {
                }
        }
 
+       public String getAuditDBType() {
+               return auditDBType;
+       }
+
+       public void setAuditDBType(String auditDBType) {
+               this.auditDBType = auditDBType;
+       }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/security-admin/src/main/java/org/apache/ranger/biz/XAuditMgr.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/biz/XAuditMgr.java 
b/security-admin/src/main/java/org/apache/ranger/biz/XAuditMgr.java
index 9d69a95..d9812f9 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/XAuditMgr.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/XAuditMgr.java
@@ -17,9 +17,46 @@
  * under the License.
  */
 
- package org.apache.ranger.biz;
+package org.apache.ranger.biz;
+
+import org.apache.ranger.common.SearchCriteria;
+import org.apache.ranger.solr.SolrAccessAuditsService;
+import org.apache.ranger.view.VXAccessAudit;
+import org.apache.ranger.view.VXAccessAuditList;
+import org.apache.ranger.view.VXLong;
+import org.springframework.beans.factory.annotation.Autowired;
 
 public class XAuditMgr extends XAuditMgrBase {
 
-}
+       @Autowired
+       SolrAccessAuditsService solrAccessAuditsService;
+
+       @Autowired
+       RangerBizUtil rangerBizUtil;
+
+       @Override
+       public VXAccessAudit getXAccessAudit(Long id) {
+               // TODO Auto-generated method stub
+               return super.getXAccessAudit(id);
+       }
 
+       @Override
+       public VXAccessAuditList searchXAccessAudits(SearchCriteria 
searchCriteria) {
+               if (rangerBizUtil.getAuditDBType().equalsIgnoreCase("solr")) {
+                       return 
solrAccessAuditsService.searchXAccessAudits(searchCriteria);
+               } else {
+                       return super.searchXAccessAudits(searchCriteria);
+               }
+       }
+
+       @Override
+       public VXLong getXAccessAuditSearchCount(SearchCriteria searchCriteria) 
{
+               if (rangerBizUtil.getAuditDBType().equalsIgnoreCase("solr")) {
+                       return solrAccessAuditsService
+                                       
.getXAccessAuditSearchCount(searchCriteria);
+               } else {
+                       return super.getXAccessAuditSearchCount(searchCriteria);
+               }
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/security-admin/src/main/java/org/apache/ranger/db/RangerDaoManagerBase.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/db/RangerDaoManagerBase.java 
b/security-admin/src/main/java/org/apache/ranger/db/RangerDaoManagerBase.java
index b1482b6..962eb02 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/db/RangerDaoManagerBase.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/db/RangerDaoManagerBase.java
@@ -321,6 +321,9 @@ public abstract class RangerDaoManagerBase {
        }
 
        public XXAccessAuditDao getXXAccessAudit() {
+               //Load appropriate class based on audit store
+               //TODO: Need to fix this, currently hard coding Solr
+               
                return new XXAccessAuditDao(this);
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/security-admin/src/main/java/org/apache/ranger/solr/SolrAccessAuditsService.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/solr/SolrAccessAuditsService.java
 
b/security-admin/src/main/java/org/apache/ranger/solr/SolrAccessAuditsService.java
new file mode 100644
index 0000000..d5d68b1
--- /dev/null
+++ 
b/security-admin/src/main/java/org/apache/ranger/solr/SolrAccessAuditsService.java
@@ -0,0 +1,253 @@
+/*
+ * 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.
+ */
+
+package org.apache.ranger.solr;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.apache.ranger.common.MessageEnums;
+import org.apache.ranger.common.RESTErrorUtil;
+import org.apache.ranger.common.SearchCriteria;
+import org.apache.ranger.common.SearchField;
+import org.apache.ranger.common.SortField;
+import org.apache.ranger.common.StringUtil;
+import org.apache.ranger.common.SearchField.DATA_TYPE;
+import org.apache.ranger.common.SearchField.SEARCH_TYPE;
+import org.apache.ranger.common.SortField.SORT_ORDER;
+import org.apache.ranger.view.VXAccessAudit;
+import org.apache.ranger.view.VXAccessAuditList;
+import org.apache.ranger.view.VXLong;
+import org.apache.solr.client.solrj.SolrClient;
+import org.apache.solr.client.solrj.response.QueryResponse;
+import org.apache.solr.common.SolrDocument;
+import org.apache.solr.common.SolrDocumentList;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Service;
+
+@Service
+@Scope("singleton")
+public class SolrAccessAuditsService {
+       static Logger logger = Logger.getLogger(SolrAccessAuditsService.class);
+
+       @Autowired
+       SolrMgr solrMgr;
+
+       @Autowired
+       SolrUtil solrUtil;
+
+       @Autowired
+       RESTErrorUtil restErrorUtil;
+
+       @Autowired
+       StringUtil stringUtil;
+
+       public List<SortField> sortFields = new ArrayList<SortField>();
+       public List<SearchField> searchFields = new ArrayList<SearchField>();
+
+       public SolrAccessAuditsService() {
+
+               searchFields.add(new SearchField("id", "id",
+                               SearchField.DATA_TYPE.STRING, 
SearchField.SEARCH_TYPE.FULL));
+               searchFields.add(new SearchField("accessType", "access",
+                               SearchField.DATA_TYPE.STRING, 
SearchField.SEARCH_TYPE.FULL));
+               searchFields.add(new SearchField("aclEnforcer", "enforcer",
+                               SearchField.DATA_TYPE.STRING, 
SearchField.SEARCH_TYPE.FULL));
+               searchFields.add(new SearchField("agentId", "agent",
+                               SearchField.DATA_TYPE.STRING, 
SearchField.SEARCH_TYPE.FULL));
+               searchFields.add(new SearchField("repoName", "repo",
+                               SearchField.DATA_TYPE.STRING, 
SearchField.SEARCH_TYPE.FULL));
+               searchFields.add(new SearchField("sessionId", "sess",
+                               SearchField.DATA_TYPE.STRING, 
SearchField.SEARCH_TYPE.FULL));
+               searchFields.add(new SearchField("requestUser", "reqUser",
+                               SearchField.DATA_TYPE.STRING, 
SearchField.SEARCH_TYPE.FULL));
+               searchFields.add(new SearchField("requestData", "reqData",
+                               SearchField.DATA_TYPE.STRING, 
SearchField.SEARCH_TYPE.PARTIAL));
+               searchFields.add(new SearchField("resourcePath", "resource",
+                               SearchField.DATA_TYPE.STRING, 
SearchField.SEARCH_TYPE.PARTIAL));
+               searchFields.add(new SearchField("clientIP", "cliIP",
+                               SearchField.DATA_TYPE.STRING, 
SearchField.SEARCH_TYPE.FULL));
+
+               searchFields.add(new SearchField("auditType", "logType",
+                               SearchField.DATA_TYPE.INTEGER, 
SearchField.SEARCH_TYPE.FULL));
+               searchFields.add(new SearchField("accessResult", "result",
+                               SearchField.DATA_TYPE.INTEGER, 
SearchField.SEARCH_TYPE.FULL));
+               // searchFields.add(new SearchField("assetId", "obj.assetId",
+               // SearchField.DATA_TYPE.INTEGER, 
SearchField.SEARCH_TYPE.FULL));
+               searchFields.add(new SearchField("policyId", "policy",
+                               SearchField.DATA_TYPE.INTEGER, 
SearchField.SEARCH_TYPE.FULL));
+               searchFields.add(new SearchField("repoType", "repoType",
+                               SearchField.DATA_TYPE.INTEGER, 
SearchField.SEARCH_TYPE.FULL));
+
+               searchFields.add(new SearchField("resourceType", "resType",
+                               SearchField.DATA_TYPE.STRING, 
SearchField.SEARCH_TYPE.FULL));
+               searchFields.add(new SearchField("reason", "reason",
+                               SearchField.DATA_TYPE.STRING, 
SearchField.SEARCH_TYPE.FULL));
+               searchFields.add(new SearchField("action", "action",
+                               SearchField.DATA_TYPE.STRING, 
SearchField.SEARCH_TYPE.FULL));
+
+               searchFields.add(new SearchField("startDate", "evtTime",
+                               DATA_TYPE.DATE, 
SEARCH_TYPE.GREATER_EQUAL_THAN));
+               searchFields.add(new SearchField("endDate", "evtTime", 
DATA_TYPE.DATE,
+                               SEARCH_TYPE.LESS_EQUAL_THAN));
+
+               sortFields.add(new SortField("eventTime", "evtTime", true,
+                               SORT_ORDER.DESC));
+       }
+
+       public VXAccessAuditList searchXAccessAudits(SearchCriteria 
searchCriteria) {
+
+               // Make call to Solr
+               SolrClient solrClient = solrMgr.getSolrClient();
+
+               if (solrClient == null) {
+                       logger.warn("Solr client is null, so not running the 
query.");
+                       throw restErrorUtil.createRESTException(
+                                       "Error connecting to search engine",
+                                       MessageEnums.ERROR_SYSTEM);
+               }
+
+               VXAccessAuditList returnList = new VXAccessAuditList();
+               List<VXAccessAudit> xAccessAuditList = new 
ArrayList<VXAccessAudit>();
+
+               QueryResponse response = 
solrUtil.searchResources(searchCriteria,
+                               searchFields, sortFields, solrClient);
+               if (response == null) {
+                       logger.warn("Error running search query. 
searchCriteria="
+                                       + searchCriteria.toString());
+                       throw restErrorUtil.createRESTException(
+                                       "Error running search query", 
MessageEnums.ERROR_SYSTEM);
+               }
+               SolrDocumentList docs = response.getResults();
+               for (int i = 0; i < docs.size(); i++) {
+                       SolrDocument doc = docs.get(i);
+                       VXAccessAudit vXAccessAudit = populateViewBean(doc);
+                       xAccessAuditList.add(vXAccessAudit);
+               }
+
+               returnList.setResultSize((int) docs.getNumFound());
+               returnList.setStartIndex((int) docs.getStart());
+               returnList.setVXAccessAudits(xAccessAuditList);
+
+               return returnList;
+       }
+
+       /**
+        * @param doc
+        * @return
+        */
+       private VXAccessAudit populateViewBean(SolrDocument doc) {
+               VXAccessAudit accessAudit = new VXAccessAudit();
+               Object value = null;
+               logger.info("doc=" + doc.toString());
+
+               value = doc.getFieldValue("id");
+               if (value != null) {
+                       // TODO: Converting ID to hashcode for now
+                       accessAudit.setId((long) value.hashCode());
+               }
+
+               value = doc.getFieldValue("access");
+               if (value != null) {
+                       accessAudit.setAccessType(value.toString());
+               }
+
+               value = doc.getFieldValue("enforcer");
+               if (value != null) {
+                       accessAudit.setAclEnforcer(value.toString());
+               }
+               value = doc.getFieldValue("agent");
+               if (value != null) {
+                       accessAudit.setAgentId(value.toString());
+               }
+               value = doc.getFieldValue("repo");
+               if (value != null) {
+                       accessAudit.setRepoName(value.toString());
+               }
+               value = doc.getFieldValue("sess");
+               if (value != null) {
+                       accessAudit.setSessionId(value.toString());
+               }
+               value = doc.getFieldValue("reqUser");
+               if (value != null) {
+                       accessAudit.setRequestUser(value.toString());
+               }
+               value = doc.getFieldValue("reqData");
+               if (value != null) {
+                       accessAudit.setRequestData(value.toString());
+               }
+               value = doc.getFieldValue("resource");
+               if (value != null) {
+                       accessAudit.setResourcePath(value.toString());
+               }
+               value = doc.getFieldValue("cliIP");
+               if (value != null) {
+                       accessAudit.setClientIP(value.toString());
+               }
+               value = doc.getFieldValue("logType");
+               if (value != null) {
+                       // TODO: Need to see what logType maps to in UI
+//                     accessAudit.setAuditType(solrUtil.toInt(value));
+               }
+               value = doc.getFieldValue("result");
+               if (value != null) {
+                       accessAudit.setAccessResult(solrUtil.toInt(value));
+               }
+               value = doc.getFieldValue("policy");
+               if (value != null) {
+                       accessAudit.setPolicyId(solrUtil.toLong(value));
+               }
+               value = doc.getFieldValue("repoType");
+               if (value != null) {
+                       accessAudit.setRepoType(solrUtil.toInt(value));
+               }
+               value = doc.getFieldValue("resType");
+               if (value != null) {
+                       accessAudit.setResourceType(value.toString());
+               }
+               value = doc.getFieldValue("reason");
+               if (value != null) {
+                       accessAudit.setResultReason(value.toString());
+               }
+               value = doc.getFieldValue("action");
+               if (value != null) {
+                       accessAudit.setAction(value.toString());
+               }
+               value = doc.getFieldValue("evtTime");
+               if (value != null) {
+                       accessAudit.setEventTime(solrUtil.toDate(value));
+               }
+               return accessAudit;
+       }
+
+       /**
+        * @param searchCriteria
+        * @return
+        */
+       public VXLong getXAccessAuditSearchCount(SearchCriteria searchCriteria) 
{
+               long count = 100;
+
+               VXLong vXLong = new VXLong();
+               vXLong.setValue(count);
+               return vXLong;
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/security-admin/src/main/java/org/apache/ranger/solr/SolrMgr.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/solr/SolrMgr.java 
b/security-admin/src/main/java/org/apache/ranger/solr/SolrMgr.java
new file mode 100644
index 0000000..60ef902
--- /dev/null
+++ b/security-admin/src/main/java/org/apache/ranger/solr/SolrMgr.java
@@ -0,0 +1,99 @@
+/*
+ * 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.
+ */
+
+package org.apache.ranger.solr;
+
+import java.util.Date;
+
+import org.apache.log4j.Logger;
+import org.apache.ranger.biz.RangerBizUtil;
+import org.apache.ranger.common.PropertiesUtil;
+import org.apache.solr.client.solrj.SolrClient;
+import org.apache.solr.client.solrj.impl.BinaryRequestWriter;
+import org.apache.solr.client.solrj.impl.HttpSolrClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * This class initializes Solr
+ *
+ */
+@Component
+public class SolrMgr {
+
+       static final Logger logger = Logger.getLogger(SolrMgr.class);
+
+       @Autowired
+       RangerBizUtil rangerBizUtil;
+
+       static final Object lock = new Object();
+
+       SolrClient solrClient = null;
+       Date lastConnectTime = null;
+       boolean initDone = false;
+
+       public SolrMgr() {
+
+       }
+
+       void connect() {
+               if (!initDone) {
+                       synchronized (lock) {
+                               if (!initDone) {
+                                       if 
(rangerBizUtil.getAuditDBType().equalsIgnoreCase("solr")) {
+                                               String solrURL = PropertiesUtil
+                                                               
.getProperty("xa.audit.solr.url");
+                                               if (solrURL == null || 
solrURL.isEmpty()) {
+                                                       logger.fatal("Solr URL 
for Audit is empty");
+                                               }
+                                               try {
+                                                       solrClient = new 
HttpSolrClient(solrURL);
+                                                       if (solrClient == null) 
{
+                                                               
logger.fatal("Can't connect to Solr. URL="
+                                                                               
+ solrURL);
+                                                       } else {
+                                                               initDone = true;
+                                                               if (solrClient 
instanceof HttpSolrClient) {
+                                                                       
HttpSolrClient httpSolrClient = (HttpSolrClient) solrClient;
+                                                                       
httpSolrClient.setAllowCompression(true);
+                                                                       
httpSolrClient.setConnectionTimeout(1000);
+                                                                       // 
httpSolrClient.setSoTimeout(10000);
+                                                                       
httpSolrClient.setMaxRetries(1);
+                                                                       
httpSolrClient.setRequestWriter(new BinaryRequestWriter());
+                                                               }
+                                                       }
+                                                       
+                                               } catch (Throwable t) {
+                                                       logger.fatal("Can't 
connect to Solr server. URL="
+                                                                       + 
solrURL, t);
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       public SolrClient getSolrClient() {
+               if (solrClient == null) {
+                       connect();
+               }
+               return solrClient;
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/security-admin/src/main/java/org/apache/ranger/solr/SolrUtil.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/solr/SolrUtil.java 
b/security-admin/src/main/java/org/apache/ranger/solr/SolrUtil.java
new file mode 100644
index 0000000..2ce63a7
--- /dev/null
+++ b/security-admin/src/main/java/org/apache/ranger/solr/SolrUtil.java
@@ -0,0 +1,327 @@
+/*
+ * 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.
+ */
+
+package org.apache.ranger.solr;
+
+import java.text.SimpleDateFormat;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.TimeZone;
+
+import org.apache.log4j.Logger;
+import org.apache.ranger.common.MessageEnums;
+import org.apache.ranger.common.PropertiesUtil;
+import org.apache.ranger.common.RESTErrorUtil;
+import org.apache.ranger.common.SearchCriteria;
+import org.apache.ranger.common.SearchField;
+import org.apache.ranger.common.SortField;
+import org.apache.ranger.common.StringUtil;
+import org.apache.ranger.common.SearchField.SEARCH_TYPE;
+import org.apache.solr.client.solrj.SolrClient;
+import org.apache.solr.client.solrj.SolrQuery;
+import org.apache.solr.client.solrj.SolrQuery.ORDER;
+import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.client.solrj.response.QueryResponse;
+import org.apache.solr.client.solrj.util.ClientUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class SolrUtil {
+       static final Logger logger = Logger.getLogger(SolrUtil.class);
+
+       @Autowired
+       RESTErrorUtil restErrorUtil;
+
+       @Autowired
+       StringUtil stringUtil;
+
+       SimpleDateFormat dateFormat = new SimpleDateFormat(
+                       "yyyy-MM-dd'T'HH:mm:ss'Z'");
+
+       public SolrUtil() {
+               String timeZone = 
PropertiesUtil.getProperty("xa.solr.timezone");
+               if (timeZone != null) {
+                       logger.info("Setting timezone to " + timeZone);
+                       try {
+                               
dateFormat.setTimeZone(TimeZone.getTimeZone(timeZone));
+                       } catch (Throwable t) {
+                               logger.error("Error setting timezone. 
timeZone=" + timeZone);
+                       }
+               }
+       }
+
+       public QueryResponse runQuery(SolrClient solrClient, SolrQuery 
solrQuery) {
+               if (solrQuery != null) {
+                       QueryResponse response;
+                       try {
+                               response = solrClient.query(solrQuery);
+                               return response;
+                       } catch (Throwable e) {
+                               logger.error("Error from Solr server.", e);
+                       }
+               }
+               return null;
+       }
+
+       public QueryResponse searchResources(SearchCriteria searchCriteria,
+                       List<SearchField> searchFields, List<SortField> 
sortFieldList,
+                       SolrClient solrClient) {
+               SolrQuery query = new SolrQuery();
+               query.setQuery("*:*");
+               if (searchCriteria.getParamList() != null) {
+                       // For now assuming there is only date field where 
range query will
+                       // be done. If we there are more than one, then we 
should create a
+                       // hashmap for each field name
+                       Date fromDate = null;
+                       Date toDate = null;
+                       String dateFieldName = null;
+
+                       for (SearchField searchField : searchFields) {
+                               Object paramValue = 
searchCriteria.getParamValue(searchField
+                                               .getClientFieldName());
+                               if (paramValue == null || 
paramValue.toString().isEmpty()) {
+                                       continue;
+                               }
+                               String fieldName = searchField.getFieldName();
+                               if (paramValue instanceof Collection) {
+                                       String fq = orList(fieldName, 
(Collection<?>) paramValue);
+                                       if (fq != null) {
+                                               query.addFilterQuery(fq);
+                                       }
+                               } else if (searchField.getDataType() == 
SearchField.DATA_TYPE.DATE) {
+                                       if (!(paramValue instanceof Date)) {
+                                               logger.error("Search file is 
not of java object instanceof Date");
+                                       } else {
+                                               if (searchField.getSearchType() 
== SEARCH_TYPE.GREATER_EQUAL_THAN
+                                                               || 
searchField.getSearchType() == SEARCH_TYPE.GREATER_THAN) {
+                                                       fromDate = (Date) 
paramValue;
+                                                       dateFieldName = 
fieldName;
+                                               } else if 
(searchField.getSearchType() == SEARCH_TYPE.LESS_EQUAL_THAN
+                                                               || 
searchField.getSearchType() == SEARCH_TYPE.LESS_THAN) {
+                                                       toDate = (Date) 
paramValue;
+                                               }
+                                       }
+                               } else if (searchField.getSearchType() == 
SEARCH_TYPE.GREATER_EQUAL_THAN
+                                               || searchField.getSearchType() 
== SEARCH_TYPE.GREATER_THAN
+                                               || searchField.getSearchType() 
== SEARCH_TYPE.LESS_EQUAL_THAN
+                                               || searchField.getSearchType() 
== SEARCH_TYPE.LESS_THAN) {
+                                       // TODO: Need to handle range here
+                               } else {
+                                       String fq = setField(fieldName, 
paramValue);
+                                       if (fq != null) {
+                                               query.addFilterQuery(fq);
+                                       }
+                               }
+                       }
+                       if (fromDate != null || toDate != null) {
+                               String fq = setDateRange(dateFieldName, 
fromDate, toDate);
+                               if (fq != null) {
+                                       query.addFilterQuery(fq);
+                               }
+                       }
+               }
+
+               setSortClause(searchCriteria, sortFieldList, query);
+               query.setStart(searchCriteria.getStartIndex());
+               query.setRows(searchCriteria.getMaxRows());
+
+               // Fields to get
+               // query.setFields("myClassType", "id", "score", "globalId");
+               if (logger.isDebugEnabled()) {
+                       logger.debug("SOLR QUERY=" + query.toString());
+               }
+               QueryResponse response = runQuery(solrClient, query);
+
+               if (response == null || response.getStatus() != 0) {
+                       logger.error("Error running query. query=" + 
query.toString()
+                                       + ", response=" + response);
+                       throw restErrorUtil.createRESTException("Error running 
query",
+                                       MessageEnums.ERROR_SYSTEM);
+               }
+               return response;
+       }
+
+       public String setField(String fieldName, Object value) {
+               if (value == null || value.toString().trim().length() == 0) {
+                       return null;
+               }
+               return fieldName
+                               + ":"
+                               + 
ClientUtils.escapeQueryChars(value.toString().trim()
+                                               .toLowerCase());
+       }
+
+       public String setDateRange(String fieldName, Date fromDate, Date 
toDate) {
+               String fromStr = "*";
+               String toStr = "NOW";
+               if (fromDate != null) {
+                       fromStr = dateFormat.format(fromDate);
+               }
+               if (toDate != null) {
+                       toStr = dateFormat.format(toDate);
+               }
+               return fieldName + ":[" + fromStr + " TO " + toStr + "]";
+       }
+
+       public String orList(String fieldName, Collection<?> valueList) {
+               if (valueList == null || valueList.size() == 0) {
+                       return null;
+               }
+               String expr = "";
+               int count = -1;
+               for (Object value : valueList) {
+                       count++;
+                       if (count > 0) {
+                               expr += " OR ";
+                       }
+                       expr += fieldName
+                                       + ":"
+                                       + 
ClientUtils.escapeQueryChars(value.toString()
+                                                       .toLowerCase());
+               }
+               if (valueList.size() == 0) {
+                       return expr;
+               } else {
+                       return "(" + expr + ")";
+               }
+
+       }
+
+       public String andList(String fieldName, Collection<?> valueList) {
+               if (valueList == null || valueList.size() == 0) {
+                       return null;
+               }
+               String expr = "";
+               int count = -1;
+               for (Object value : valueList) {
+                       count++;
+                       if (count > 0) {
+                               expr += " AND ";
+                       }
+                       expr += fieldName
+                                       + ":"
+                                       + 
ClientUtils.escapeQueryChars(value.toString()
+                                                       .toLowerCase());
+               }
+               if (valueList.size() == 0) {
+                       return expr;
+               } else {
+                       return "(" + expr + ")";
+               }
+       }
+
+       public void setSortClause(SearchCriteria searchCriteria,
+                       List<SortField> sortFields, SolrQuery query) {
+
+               // TODO: We are supporting single sort field only for now
+               String sortBy = searchCriteria.getSortBy();
+               String querySortBy = null;
+               if (!stringUtil.isEmpty(sortBy)) {
+                       sortBy = sortBy.trim();
+                       for (SortField sortField : sortFields) {
+                               if 
(sortBy.equalsIgnoreCase(sortField.getParamName())) {
+                                       querySortBy = sortField.getFieldName();
+                                       // Override the sortBy using the 
normalized value
+                                       
searchCriteria.setSortBy(sortField.getParamName());
+                                       break;
+                               }
+                       }
+               }
+
+               if (querySortBy == null) {
+                       for (SortField sortField : sortFields) {
+                               if (sortField.isDefault()) {
+                                       querySortBy = sortField.getFieldName();
+                                       // Override the sortBy using the 
default value
+                                       
searchCriteria.setSortBy(sortField.getParamName());
+                                       
searchCriteria.setSortType(sortField.getDefaultOrder()
+                                                       .name());
+                                       break;
+                               }
+                       }
+               }
+
+               if (querySortBy != null) {
+                       // Add sort type
+                       String sortType = searchCriteria.getSortType();
+                       ORDER order = ORDER.asc;
+                       if (sortType != null && 
sortType.equalsIgnoreCase("desc")) {
+                               order = ORDER.desc;
+
+                       }
+                       query.addSort(querySortBy, order);
+               }
+       }
+
+       // Utility methods
+       public int toInt(Object value) {
+               if (value == null) {
+                       return 0;
+               }
+               if (value instanceof Integer) {
+                       return (Integer) value;
+               }
+               if (value.toString().isEmpty()) {
+                       return 0;
+               }
+               try {
+                       return new Integer(value.toString());
+               } catch (Throwable t) {
+                       logger.error("Error converting value to integer. 
value=" + value, t);
+               }
+               return 0;
+       }
+
+       public long toLong(Object value) {
+               if (value == null) {
+                       return 0;
+               }
+               if (value instanceof Long) {
+                       return (Long) value;
+               }
+               if (value.toString().isEmpty()) {
+                       return 0;
+               }
+               try {
+                       return new Long(value.toString());
+               } catch (Throwable t) {
+                       logger.error("Error converting value to long. value=" + 
value, t);
+               }
+               return 0;
+       }
+
+       public Date toDate(Object value) {
+               if (value == null) {
+                       return null;
+               }
+               if (value instanceof Date) {
+                       return (Date) value;
+               }
+               try {
+                       // TODO: Do proper parsing based on Solr response value
+                       return new Date(value.toString());
+               } catch (Throwable t) {
+                       logger.error("Error converting value to date. value=" + 
value, t);
+               }
+               return null;
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/src/main/assembly/hbase-agent.xml
----------------------------------------------------------------------
diff --git a/src/main/assembly/hbase-agent.xml 
b/src/main/assembly/hbase-agent.xml
index 6ab569f..8dfbd5e 100644
--- a/src/main/assembly/hbase-agent.xml
+++ b/src/main/assembly/hbase-agent.xml
@@ -36,6 +36,12 @@
                 <includes>
                     <include>com.google.code.gson:gson*</include>
                     <include>org.eclipse.persistence:eclipselink</include>
+                   
<include>org.apache.ranger:ranger_solrj:jar:${ranger.solrj.version}</include>
+                   
<include>org.apache.httpcomponents:httpclient:jar:${httpcomponent.httpclient.version}</include>
+                   
<include>org.apache.httpcomponents:httpcore:jar:${httpcomponent.httpcore.version}</include>
+                   
<include>org.apache.httpcomponents:httpmime:jar:${httpcomponent.httpmime.version}</include>
+                   <include>org.noggit:noggit:jar:${noggit.version}</include>
+                   
<include>org.apache.zookeeper:zookeeper:jar:${zookeeper.version}</include>
                 </includes>
                 <unpack>false</unpack>
             </dependencySet>

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/src/main/assembly/hdfs-agent.xml
----------------------------------------------------------------------
diff --git a/src/main/assembly/hdfs-agent.xml b/src/main/assembly/hdfs-agent.xml
index 7929231..27c2bf0 100644
--- a/src/main/assembly/hdfs-agent.xml
+++ b/src/main/assembly/hdfs-agent.xml
@@ -37,6 +37,12 @@
                                        
<include>com.google.code.gson:gson*</include>
                                        
<include>org.eclipse.persistence:javax.persistence</include>
                                        
<include>org.eclipse.persistence:eclipselink</include>
+                                       
<include>org.apache.ranger:ranger_solrj:jar:${ranger.solrj.version}</include>
+                                       
<include>org.apache.httpcomponents:httpclient:jar:${httpcomponent.httpclient.version}</include>
+                                       
<include>org.apache.httpcomponents:httpcore:jar:${httpcomponent.httpcore.version}</include>
+                                       
<include>org.apache.httpcomponents:httpmime:jar:${httpcomponent.httpmime.version}</include>
+                                       
<include>org.noggit:noggit:jar:${noggit.version}</include>
+                                       
<include>org.apache.zookeeper:zookeeper:jar:${zookeeper.version}</include>
                                </includes>
                                <unpack>false</unpack>
                        </dependencySet>

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/src/main/assembly/hive-agent.xml
----------------------------------------------------------------------
diff --git a/src/main/assembly/hive-agent.xml b/src/main/assembly/hive-agent.xml
index e9035b4..f0bacb6 100644
--- a/src/main/assembly/hive-agent.xml
+++ b/src/main/assembly/hive-agent.xml
@@ -37,6 +37,12 @@
                     <include>com.google.code.gson:gson*</include>
                                        
<include>org.eclipse.persistence:eclipselink</include>
                     
<include>org.eclipse.persistence:javax.persistence</include>
+                   
<include>org.apache.ranger:ranger_solrj:jar:${ranger.solrj.version}</include>
+                   
<include>org.apache.httpcomponents:httpclient:jar:${httpcomponent.httpclient.version}</include>
+                   
<include>org.apache.httpcomponents:httpcore:jar:${httpcomponent.httpcore.version}</include>
+                   
<include>org.apache.httpcomponents:httpmime:jar:${httpcomponent.httpmime.version}</include>
+                   <include>org.noggit:noggit:jar:${noggit.version}</include>
+                   
<include>org.apache.zookeeper:zookeeper:jar:${zookeeper.version}</include>
                 </includes>
                 <unpack>false</unpack>
             </dependencySet>

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/src/main/assembly/knox-agent.xml
----------------------------------------------------------------------
diff --git a/src/main/assembly/knox-agent.xml b/src/main/assembly/knox-agent.xml
index 25604b2..fe7000a 100644
--- a/src/main/assembly/knox-agent.xml
+++ b/src/main/assembly/knox-agent.xml
@@ -41,6 +41,12 @@
                     <include>com.google.code.gson:gson*</include>
                     <include>org.eclipse.persistence:eclipselink</include>
                     
<include>org.eclipse.persistence:javax.persistence</include>
+                   
<include>org.apache.ranger:ranger_solrj:jar:${ranger.solrj.version}</include>
+                   
<include>org.apache.httpcomponents:httpclient:jar:${httpcomponent.httpclient.version}</include>
+                   
<include>org.apache.httpcomponents:httpcore:jar:${httpcomponent.httpcore.version}</include>
+                   
<include>org.apache.httpcomponents:httpmime:jar:${httpcomponent.httpmime.version}</include>
+                   <include>org.noggit:noggit:jar:${noggit.version}</include>
+                   
<include>org.apache.zookeeper:zookeeper:jar:${zookeeper.version}</include>
                 </includes>
                 <unpack>false</unpack>
             </dependencySet>

Reply via email to