Support for Solr as Audit Destination.

Project: http://git-wip-us.apache.org/repos/asf/incubator-ranger/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ranger/commit/40aa090d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ranger/tree/40aa090d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ranger/diff/40aa090d

Branch: refs/heads/master
Commit: 40aa090d7b23a524b9900f5b722d02b48c06b947
Parents: 8e6acd5
Author: Don Bosco Durai <[email protected]>
Authored: Tue Mar 17 14:17:30 2015 -0700
Committer: Don Bosco Durai <[email protected]>
Committed: Tue Mar 17 14:17:30 2015 -0700

----------------------------------------------------------------------
 agents-audit/pom.xml                            |   28 +-
 .../audit/provider/AuditProviderFactory.java    |   23 +-
 .../audit/provider/BaseAuditProvider.java       |    5 +-
 .../provider/kafka/KafkaAuditProvider.java      |    2 +-
 .../audit/provider/solr/SolrAuditProvider.java  |  275 ++++
 hbase-agent/conf/ranger-hbase-audit-changes.cfg |   12 +
 hbase-agent/conf/ranger-hbase-audit.xml         |   48 +
 hbase-agent/scripts/install.properties          |    6 +
 hdfs-agent/conf/ranger-hdfs-audit-changes.cfg   |   11 +
 hdfs-agent/conf/ranger-hdfs-audit.xml           |   48 +
 hdfs-agent/scripts/install.properties           |    7 +
 hive-agent/conf/ranger-hive-audit-changes.cfg   |   12 +
 hive-agent/conf/ranger-hive-audit.xml           |   48 +
 hive-agent/scripts/install.properties           |    6 +
 knox-agent/conf/ranger-knox-audit-changes.cfg   |   12 +
 knox-agent/conf/ranger-knox-audit.xml           |   48 +
 knox-agent/scripts/install.properties           |    6 +
 plugin-yarn/conf/ranger-yarn-audit-changes.cfg  |   12 +
 plugin-yarn/conf/ranger-yarn-audit.xml          |   48 +
 plugin-yarn/scripts/install.properties          |    6 +
 pom.xml                                         |    9 +
 ranger_solrj/.gitignore                         |    1 +
 ranger_solrj/pom.xml                            |   55 +
 .../solr/client/solrj/ResponseParser.java       |   53 +
 .../apache/solr/client/solrj/SolrClient.java    |  416 ++++++
 .../org/apache/solr/client/solrj/SolrQuery.java | 1109 ++++++++++++++++
 .../apache/solr/client/solrj/SolrRequest.java   |  137 ++
 .../apache/solr/client/solrj/SolrResponse.java  |   65 +
 .../apache/solr/client/solrj/SolrServer.java    |   25 +
 .../solr/client/solrj/SolrServerException.java  |   54 +
 .../client/solrj/StreamingResponseCallback.java |   37 +
 .../client/solrj/beans/BindingException.java    |   29 +
 .../solrj/beans/DocumentObjectBinder.java       |  470 +++++++
 .../apache/solr/client/solrj/beans/Field.java   |   38 +
 .../solr/client/solrj/beans/package-info.java   |   23 +
 .../client/solrj/impl/BinaryRequestWriter.java  |  120 ++
 .../client/solrj/impl/BinaryResponseParser.java |   64 +
 .../solr/client/solrj/impl/CloudSolrClient.java | 1232 ++++++++++++++++++
 .../solr/client/solrj/impl/CloudSolrServer.java |   61 +
 .../solrj/impl/ConcurrentUpdateSolrClient.java  |  492 +++++++
 .../solrj/impl/ConcurrentUpdateSolrServer.java  |   46 +
 .../client/solrj/impl/HttpClientConfigurer.java |   97 ++
 .../solr/client/solrj/impl/HttpClientUtil.java  |  365 ++++++
 .../solr/client/solrj/impl/HttpSolrClient.java  |  821 ++++++++++++
 .../solr/client/solrj/impl/HttpSolrServer.java  |   41 +
 .../client/solrj/impl/LBHttpSolrClient.java     |  730 +++++++++++
 .../client/solrj/impl/LBHttpSolrServer.java     |   43 +
 .../client/solrj/impl/NoOpResponseParser.java   |   83 ++
 .../impl/StreamingBinaryResponseParser.java     |   91 ++
 .../client/solrj/impl/XMLResponseParser.java    |  465 +++++++
 .../solr/client/solrj/impl/package-info.java    |   24 +
 .../apache/solr/client/solrj/package-info.java  |   23 +
 .../solrj/request/AbstractUpdateRequest.java    |  144 ++
 .../solrj/request/CollectionAdminRequest.java   |  860 ++++++++++++
 .../request/ContentStreamUpdateRequest.java     |   78 ++
 .../client/solrj/request/CoreAdminRequest.java  |  593 +++++++++
 .../client/solrj/request/DirectXmlRequest.java  |   66 +
 .../solrj/request/DocumentAnalysisRequest.java  |  199 +++
 .../solrj/request/FieldAnalysisRequest.java     |  270 ++++
 .../client/solrj/request/IsUpdateRequest.java   |   26 +
 .../request/JavaBinUpdateRequestCodec.java      |  251 ++++
 .../solr/client/solrj/request/LukeRequest.java  |  120 ++
 .../solr/client/solrj/request/QueryRequest.java |   89 ++
 .../client/solrj/request/RequestWriter.java     |  146 +++
 .../solr/client/solrj/request/SolrPing.java     |  111 ++
 .../client/solrj/request/UpdateRequest.java     |  463 +++++++
 .../solr/client/solrj/request/package-info.java |   23 +
 .../solrj/response/AnalysisResponseBase.java    |  252 ++++
 .../solrj/response/CollectionAdminResponse.java |   79 ++
 .../solrj/response/CoreAdminResponse.java       |   58 +
 .../response/DocumentAnalysisResponse.java      |  258 ++++
 .../solr/client/solrj/response/FacetField.java  |  176 +++
 .../solrj/response/FieldAnalysisResponse.java   |  204 +++
 .../client/solrj/response/FieldStatsInfo.java   |  191 +++
 .../solr/client/solrj/response/Group.java       |   69 +
 .../client/solrj/response/GroupCommand.java     |  125 ++
 .../client/solrj/response/GroupResponse.java    |   56 +
 .../client/solrj/response/IntervalFacet.java    |   85 ++
 .../client/solrj/response/LukeResponse.java     |  270 ++++
 .../solr/client/solrj/response/PivotField.java  |   97 ++
 .../client/solrj/response/QueryResponse.java    |  586 +++++++++
 .../solr/client/solrj/response/RangeFacet.java  |  126 ++
 .../client/solrj/response/SolrPingResponse.java |   28 +
 .../client/solrj/response/SolrResponseBase.java |   91 ++
 .../solrj/response/SpellCheckResponse.java      |  273 ++++
 .../client/solrj/response/TermsResponse.java    |   89 ++
 .../client/solrj/response/UpdateResponse.java   |   30 +
 .../client/solrj/response/package-info.java     |   24 +
 .../solr/client/solrj/util/ClientUtils.java     |  251 ++++
 .../solr/client/solrj/util/package-info.java    |   23 +
 .../org/apache/solr/common/EnumFieldValue.java  |  116 ++
 .../org/apache/solr/common/SolrDocument.java    |  396 ++++++
 .../apache/solr/common/SolrDocumentList.java    |   68 +
 .../org/apache/solr/common/SolrException.java   |  208 +++
 .../apache/solr/common/SolrInputDocument.java   |  301 +++++
 .../org/apache/solr/common/SolrInputField.java  |  232 ++++
 .../org/apache/solr/common/StringUtils.java     |   26 +
 .../org/apache/solr/common/cloud/Aliases.java   |   63 +
 .../solr/common/cloud/BeforeReconnect.java      |   22 +
 .../solr/common/cloud/ClosableThread.java       |   27 +
 .../apache/solr/common/cloud/ClusterState.java  |  397 ++++++
 .../solr/common/cloud/ClusterStateUtil.java     |  230 ++++
 .../solr/common/cloud/CompositeIdRouter.java    |  327 +++++
 .../solr/common/cloud/ConnectionManager.java    |  237 ++++
 .../common/cloud/DefaultConnectionStrategy.java |   75 ++
 .../solr/common/cloud/DefaultZkACLProvider.java |   45 +
 .../cloud/DefaultZkCredentialsProvider.java     |   41 +
 .../apache/solr/common/cloud/DocCollection.java |  201 +++
 .../org/apache/solr/common/cloud/DocRouter.java |  227 ++++
 .../solr/common/cloud/HashBasedRouter.java      |   81 ++
 .../solr/common/cloud/ImplicitDocRouter.java    |  104 ++
 .../apache/solr/common/cloud/OnReconnect.java   |   22 +
 .../apache/solr/common/cloud/PlainIdRouter.java |   23 +
 .../org/apache/solr/common/cloud/Replica.java   |   48 +
 .../apache/solr/common/cloud/RoutingRule.java   |   71 +
 .../solr/common/cloud/SaslZkACLProvider.java    |   49 +
 .../org/apache/solr/common/cloud/Slice.java     |  196 +++
 .../apache/solr/common/cloud/SolrZkClient.java  |  736 +++++++++++
 .../apache/solr/common/cloud/SolrZooKeeper.java |  103 ++
 ...ParamsAllAndReadonlyDigestZkACLProvider.java |   89 ++
 ...tCredentialsDigestZkCredentialsProvider.java |   60 +
 .../apache/solr/common/cloud/ZkACLProvider.java |   28 +
 .../cloud/ZkClientConnectionStrategy.java       |  113 ++
 .../apache/solr/common/cloud/ZkCmdExecutor.java |  111 ++
 .../solr/common/cloud/ZkConfigManager.java      |  145 +++
 .../solr/common/cloud/ZkCoreNodeProps.java      |   74 ++
 .../common/cloud/ZkCredentialsProvider.java     |   45 +
 .../apache/solr/common/cloud/ZkNodeProps.java   |  154 +++
 .../apache/solr/common/cloud/ZkOperation.java   |   37 +
 .../apache/solr/common/cloud/ZkStateReader.java |  925 +++++++++++++
 .../solr/common/cloud/ZooKeeperException.java   |   33 +
 .../apache/solr/common/cloud/package-info.java  |   23 +
 .../org/apache/solr/common/luke/FieldFlag.java  |   70 +
 .../apache/solr/common/luke/package-info.java   |   23 +
 .../org/apache/solr/common/package-info.java    |   23 +
 .../solr/common/params/AnalysisParams.java      |   60 +
 .../solr/common/params/AppendedSolrParams.java  |   55 +
 .../solr/common/params/CollectionParams.java    |   74 ++
 .../apache/solr/common/params/CommonParams.java |  228 ++++
 .../solr/common/params/CoreAdminParams.java     |  151 +++
 .../solr/common/params/CursorMarkParams.java    |   48 +
 .../solr/common/params/DefaultSolrParams.java   |   68 +
 .../apache/solr/common/params/DisMaxParams.java |   78 ++
 .../apache/solr/common/params/EventParams.java  |   29 +
 .../apache/solr/common/params/ExpandParams.java |   32 +
 .../apache/solr/common/params/FacetParams.java  |  405 ++++++
 .../apache/solr/common/params/GroupParams.java  |   71 +
 .../solr/common/params/HighlightParams.java     |   82 ++
 .../solr/common/params/MapSolrParams.java       |   88 ++
 .../common/params/ModifiableSolrParams.java     |  210 +++
 .../solr/common/params/MoreLikeThisParams.java  |   74 ++
 .../solr/common/params/MultiMapSolrParams.java  |   92 ++
 .../common/params/QueryElevationParams.java     |   53 +
 .../solr/common/params/RequiredSolrParams.java  |  155 +++
 .../apache/solr/common/params/ShardParams.java  |   56 +
 .../apache/solr/common/params/SimpleParams.java |   50 +
 .../apache/solr/common/params/SolrParams.java   |  363 ++++++
 .../solr/common/params/SpatialParams.java       |   41 +
 .../solr/common/params/SpellingParams.java      |  174 +++
 .../apache/solr/common/params/StatsParams.java  |   28 +
 .../solr/common/params/TermVectorParams.java    |   66 +
 .../apache/solr/common/params/TermsParams.java  |  120 ++
 .../apache/solr/common/params/UpdateParams.java |   72 +
 .../apache/solr/common/params/package-info.java |   22 +
 .../org/apache/solr/common/util/Base64.java     |  153 +++
 .../org/apache/solr/common/util/ByteUtils.java  |  126 ++
 .../apache/solr/common/util/ContentStream.java  |   81 ++
 .../solr/common/util/ContentStreamBase.java     |  260 ++++
 .../solr/common/util/DataInputInputStream.java  |   27 +
 .../org/apache/solr/common/util/DateUtil.java   |  260 ++++
 .../apache/solr/common/util/ExecutorUtil.java   |   64 +
 .../solr/common/util/FastInputStream.java       |  253 ++++
 .../solr/common/util/FastOutputStream.java      |  233 ++++
 .../java/org/apache/solr/common/util/Hash.java  |  422 ++++++
 .../org/apache/solr/common/util/IOUtils.java    |   37 +
 .../apache/solr/common/util/IteratorChain.java  |   87 ++
 .../apache/solr/common/util/JavaBinCodec.java   |  820 ++++++++++++
 .../solr/common/util/JsonRecordReader.java      |  586 +++++++++
 .../org/apache/solr/common/util/NamedList.java  |  708 ++++++++++
 .../solr/common/util/ObjectReleaseTracker.java  |   62 +
 .../org/apache/solr/common/util/RetryUtil.java  |   43 +
 .../solr/common/util/SimpleOrderedMap.java      |   67 +
 .../common/util/SolrjNamedThreadFactory.java    |   50 +
 .../org/apache/solr/common/util/StrUtils.java   |  309 +++++
 .../org/apache/solr/common/util/URLUtil.java    |   50 +
 .../java/org/apache/solr/common/util/XML.java   |  207 +++
 .../apache/solr/common/util/XMLErrorLogger.java |   84 ++
 .../apache/solr/common/util/package-info.java   |   23 +
 ranger_solrj/src/main/java/overview.html        |   21 +
 security-admin/pom.xml                          |    5 +
 security-admin/scripts/install.properties       |   10 +
 security-admin/scripts/setup.sh                 |   48 +-
 .../java/org/apache/ranger/biz/AssetMgr.java    |   11 +-
 .../org/apache/ranger/biz/RangerBizUtil.java    |  434 +++---
 .../java/org/apache/ranger/biz/XAuditMgr.java   |   41 +-
 .../apache/ranger/db/RangerDaoManagerBase.java  |    3 +
 .../ranger/solr/SolrAccessAuditsService.java    |  253 ++++
 .../java/org/apache/ranger/solr/SolrMgr.java    |   99 ++
 .../java/org/apache/ranger/solr/SolrUtil.java   |  327 +++++
 src/main/assembly/hbase-agent.xml               |    6 +
 src/main/assembly/hdfs-agent.xml                |    6 +
 src/main/assembly/hive-agent.xml                |    6 +
 src/main/assembly/knox-agent.xml                |    6 +
 src/main/assembly/storm-agent.xml               |    6 +
 storm-agent/conf/ranger-storm-audit-changes.cfg |   13 +
 storm-agent/conf/ranger-storm-audit.xml         |   48 +
 storm-agent/scripts/install.properties          |    6 +
 207 files changed, 30674 insertions(+), 219 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/agents-audit/pom.xml
----------------------------------------------------------------------
diff --git a/agents-audit/pom.xml b/agents-audit/pom.xml
index e54ec36..6715575 100644
--- a/agents-audit/pom.xml
+++ b/agents-audit/pom.xml
@@ -63,9 +63,29 @@
        <version>${log4j.version}</version>
     </dependency>
     <dependency>
-       <groupId>org.apache.kafka</groupId>
-       <artifactId>kafka_2.10</artifactId>
-       <version>0.8.2.0</version>
-</dependency>
+      <groupId>org.apache.kafka</groupId>
+      <artifactId>kafka_2.10</artifactId>
+      <version>${kafka.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.ranger</groupId>
+      <artifactId>ranger_solrj</artifactId>
+      <version>${ranger.solrj.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpclient</artifactId>
+      <version>${httpcomponent.httpclient.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpmime</artifactId>
+      <version>${httpcomponent.httpmime.version}</version>
+    </dependency>      
+    <dependency>
+      <groupId>org.noggit</groupId>
+      <artifactId>noggit</artifactId>
+      <version>${noggit.version}</version>
+    </dependency>    
   </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/agents-audit/src/main/java/org/apache/ranger/audit/provider/AuditProviderFactory.java
----------------------------------------------------------------------
diff --git 
a/agents-audit/src/main/java/org/apache/ranger/audit/provider/AuditProviderFactory.java
 
b/agents-audit/src/main/java/org/apache/ranger/audit/provider/AuditProviderFactory.java
index 9fbe29f..bb8fa6d 100644
--- 
a/agents-audit/src/main/java/org/apache/ranger/audit/provider/AuditProviderFactory.java
+++ 
b/agents-audit/src/main/java/org/apache/ranger/audit/provider/AuditProviderFactory.java
@@ -26,6 +26,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.ranger.audit.provider.hdfs.HdfsAuditProvider;
 import org.apache.ranger.audit.provider.kafka.KafkaAuditProvider;
+import org.apache.ranger.audit.provider.solr.SolrAuditProvider;
 
 
 /*
@@ -43,6 +44,7 @@ public class AuditProviderFactory {
        private static final String AUDIT_HDFS_IS_ENABLED_PROP  = 
"xasecure.audit.hdfs.is.enabled";
        private static final String AUDIT_LOG4J_IS_ENABLED_PROP = 
"xasecure.audit.log4j.is.enabled" ;
        private static final String AUDIT_KAFKA_IS_ENABLED_PROP = 
"xasecure.audit.kafka.is.enabled";
+       private static final String AUDIT_SOLR_IS_ENABLED_PROP = 
"xasecure.audit.solr.is.enabled";
        
        private static final int AUDIT_ASYNC_MAX_QUEUE_SIZE_DEFAULT     = 10 * 
1024;
        private static final int AUDIT_ASYNC_MAX_FLUSH_INTERVAL_DEFAULT =  5 * 
1000;
@@ -99,8 +101,9 @@ public class AuditProviderFactory {
                boolean isAuditToHdfsEnabled  = 
BaseAuditProvider.getBooleanProperty(props, AUDIT_HDFS_IS_ENABLED_PROP, false);
                boolean isAuditToLog4jEnabled = 
BaseAuditProvider.getBooleanProperty(props, AUDIT_LOG4J_IS_ENABLED_PROP, false);
                boolean isAuditToKafkaEnabled  = 
BaseAuditProvider.getBooleanProperty(props, AUDIT_KAFKA_IS_ENABLED_PROP, false);
+               boolean isAuditToSolrEnabled  = 
BaseAuditProvider.getBooleanProperty(props, AUDIT_SOLR_IS_ENABLED_PROP, false);
 
-               if(!isEnabled || !(isAuditToDbEnabled || isAuditToHdfsEnabled 
|| isAuditToKafkaEnabled || isAuditToLog4jEnabled)) {
+               if(!isEnabled || !(isAuditToDbEnabled || isAuditToHdfsEnabled 
|| isAuditToKafkaEnabled || isAuditToLog4jEnabled || isAuditToSolrEnabled)) {
                        LOG.info("AuditProviderFactory: Audit not enabled..");
 
                        mProvider = getDefaultProvider();
@@ -111,6 +114,7 @@ public class AuditProviderFactory {
                List<AuditProvider> providers = new ArrayList<AuditProvider>();
 
                if(isAuditToDbEnabled) {
+                       LOG.info("DbAuditProvider is enabled");
                        DbAuditProvider dbProvider = new DbAuditProvider();
 
                        boolean isAuditToDbAsync = 
BaseAuditProvider.getBooleanProperty(props, 
DbAuditProvider.AUDIT_DB_IS_ASYNC_PROP, false);
@@ -128,6 +132,8 @@ public class AuditProviderFactory {
                }
 
                if(isAuditToHdfsEnabled) {
+                       LOG.info("HdfsAuditProvider is enabled");
+
                        HdfsAuditProvider hdfsProvider = new 
HdfsAuditProvider();
 
                        boolean isAuditToHdfsAsync = 
BaseAuditProvider.getBooleanProperty(props, 
HdfsAuditProvider.AUDIT_HDFS_IS_ASYNC_PROP, false);
@@ -156,7 +162,20 @@ public class AuditProviderFactory {
                                providers.add(kafkaProvider);
                        }
                }
-               
+
+               if(isAuditToSolrEnabled) {
+                       LOG.info("SolrAuditProvider is enabled");
+                       SolrAuditProvider solrProvider = new 
SolrAuditProvider();
+                       solrProvider.init(props);
+                       
+                       if( solrProvider.isAsync()) {
+                               AsyncAuditProvider asyncProvider = new 
AsyncAuditProvider("MySolrAuditProvider", solrProvider.getMaxQueueSize(), 
solrProvider.getMaxFlushInterval(), solrProvider);
+                               providers.add(asyncProvider);
+                       } else {
+                               providers.add(solrProvider);
+                       }
+               }
+
                if(isAuditToLog4jEnabled) {
                        Log4jAuditProvider log4jProvider = new 
Log4jAuditProvider();
 

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/agents-audit/src/main/java/org/apache/ranger/audit/provider/BaseAuditProvider.java
----------------------------------------------------------------------
diff --git 
a/agents-audit/src/main/java/org/apache/ranger/audit/provider/BaseAuditProvider.java
 
b/agents-audit/src/main/java/org/apache/ranger/audit/provider/BaseAuditProvider.java
index 14e6220..a068b8f 100644
--- 
a/agents-audit/src/main/java/org/apache/ranger/audit/provider/BaseAuditProvider.java
+++ 
b/agents-audit/src/main/java/org/apache/ranger/audit/provider/BaseAuditProvider.java
@@ -40,7 +40,7 @@ public abstract class BaseAuditProvider implements 
AuditProvider {
        private int maxQueueSize     =  AUDIT_ASYNC_MAX_QUEUE_SIZE_DEFAULT;
        private int maxFlushInterval = AUDIT_ASYNC_MAX_FLUSH_INTERVAL_DEFAULT;
 
-       
+       protected Properties props = null;
 
        public BaseAuditProvider() {
        }
@@ -48,7 +48,8 @@ public abstract class BaseAuditProvider implements 
AuditProvider {
        @Override
        public void init(Properties props) {
                LOG.info("BaseAuditProvider.init()");
-
+               this.props = props;
+               
                mLogFailureReportMinIntervalInMs = getIntProperty(props, 
AUDIT_LOG_FAILURE_REPORT_MIN_INTERVAL_PROP, 60 * 1000);
 
        }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/agents-audit/src/main/java/org/apache/ranger/audit/provider/kafka/KafkaAuditProvider.java
----------------------------------------------------------------------
diff --git 
a/agents-audit/src/main/java/org/apache/ranger/audit/provider/kafka/KafkaAuditProvider.java
 
b/agents-audit/src/main/java/org/apache/ranger/audit/provider/kafka/KafkaAuditProvider.java
index 54e73ea..0ec8790 100644
--- 
a/agents-audit/src/main/java/org/apache/ranger/audit/provider/kafka/KafkaAuditProvider.java
+++ 
b/agents-audit/src/main/java/org/apache/ranger/audit/provider/kafka/KafkaAuditProvider.java
@@ -117,7 +117,7 @@ public class KafkaAuditProvider extends BaseAuditProvider {
                        }
                } catch (Throwable t) {
                        LOG.error("Error sending message to Kafka topic. 
topic=" + topic
-                                       + ", message=" + message);
+                                       + ", message=" + message, t);
                }
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/agents-audit/src/main/java/org/apache/ranger/audit/provider/solr/SolrAuditProvider.java
----------------------------------------------------------------------
diff --git 
a/agents-audit/src/main/java/org/apache/ranger/audit/provider/solr/SolrAuditProvider.java
 
b/agents-audit/src/main/java/org/apache/ranger/audit/provider/solr/SolrAuditProvider.java
new file mode 100644
index 0000000..1b463e6
--- /dev/null
+++ 
b/agents-audit/src/main/java/org/apache/ranger/audit/provider/solr/SolrAuditProvider.java
@@ -0,0 +1,275 @@
+/*
+ * 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.audit.provider.solr;
+
+import java.util.Date;
+import java.util.Properties;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.ranger.audit.model.AuditEventBase;
+import org.apache.ranger.audit.model.AuthzAuditEvent;
+import org.apache.ranger.audit.provider.BaseAuditProvider;
+import org.apache.ranger.audit.provider.MiscUtil;
+import org.apache.solr.client.solrj.SolrClient;
+import org.apache.solr.client.solrj.impl.HttpSolrClient;
+import org.apache.solr.client.solrj.response.UpdateResponse;
+import org.apache.solr.common.SolrInputDocument;
+
+public class SolrAuditProvider extends BaseAuditProvider {
+       private static final Log LOG = 
LogFactory.getLog(SolrAuditProvider.class);
+
+       public static final String AUDIT_MAX_QUEUE_SIZE_PROP = 
"xasecure.audit.solr.async.max.queue.size";
+       public static final String AUDIT_MAX_FLUSH_INTERVAL_PROP = 
"xasecure.audit.solr.async.max.flush.interval.ms";
+       public static final String AUDIT_RETRY_WAIT_PROP = 
"xasecure.audit.solr.retry.ms";
+
+       static final Object lock = new Object();
+       SolrClient solrClient = null;
+       Date lastConnectTime = null;
+       long lastFailTime = 0;
+
+       int retryWaitTime = 30000;
+
+       public SolrAuditProvider() {
+       }
+
+       @Override
+       public void init(Properties props) {
+               LOG.info("init() called");
+               super.init(props);
+
+               setMaxQueueSize(BaseAuditProvider.getIntProperty(props,
+                               AUDIT_MAX_QUEUE_SIZE_PROP, 
AUDIT_ASYNC_MAX_QUEUE_SIZE_DEFAULT));
+               setMaxFlushInterval(BaseAuditProvider.getIntProperty(props,
+                               AUDIT_MAX_QUEUE_SIZE_PROP,
+                               AUDIT_ASYNC_MAX_FLUSH_INTERVAL_DEFAULT));
+               retryWaitTime = BaseAuditProvider.getIntProperty(props,
+                               AUDIT_RETRY_WAIT_PROP, retryWaitTime);
+       }
+
+       void connect() {
+               if (solrClient == null) {
+                       synchronized (lock) {
+                               if (solrClient == null) {
+                                       String solrURL = 
BaseAuditProvider.getStringProperty(props,
+                                                       
"xasecure.audit.solr.solr_url");
+
+                                       if (lastConnectTime != null) {
+                                               // Let's wait for enough time 
before retrying
+                                               long diff = 
System.currentTimeMillis()
+                                                               - 
lastConnectTime.getTime();
+                                               if (diff < retryWaitTime) {
+                                                       if 
(LOG.isDebugEnabled()) {
+                                                               
LOG.debug("Ignore connecting to solr url="
+                                                                               
+ solrURL + ", lastConnect=" + diff
+                                                                               
+ "ms");
+                                                       }
+                                                       return;
+                                               }
+                                       }
+                                       lastConnectTime = new Date();
+
+                                       if (solrURL == null || 
solrURL.isEmpty()) {
+                                               LOG.fatal("Solr URL for Audit 
is empty");
+                                               return;
+                                       }
+
+                                       try {
+                                               // TODO: Need to support 
SolrCloud also
+                                               solrClient = new 
HttpSolrClient(solrURL);
+                                               if (solrClient instanceof 
HttpSolrClient) {
+                                                       HttpSolrClient 
httpSolrClient = (HttpSolrClient) solrClient;
+                                                       
httpSolrClient.setAllowCompression(true);
+                                                       
httpSolrClient.setConnectionTimeout(1000);
+                                                       // 
solrClient.setSoTimeout(10000);
+                                                       
httpSolrClient.setMaxRetries(1);
+                                               }
+                                       } catch (Throwable t) {
+                                               LOG.fatal("Can't connect to 
Solr server. URL="
+                                                               + solrURL, t);
+                                       }
+                               }
+                       }
+               }
+       }
+
+       /*
+        * (non-Javadoc)
+        * 
+        * @see
+        * org.apache.ranger.audit.provider.AuditProvider#log(org.apache.ranger.
+        * audit.model.AuditEventBase)
+        */
+       @Override
+       public void log(AuditEventBase event) {
+               if (!(event instanceof AuthzAuditEvent)) {
+                       LOG.error(event.getClass().getName()
+                                       + " audit event class type is not 
supported");
+                       return;
+               }
+               AuthzAuditEvent authzEvent = (AuthzAuditEvent) event;
+               // TODO: This should be done at a higher level
+
+               if (authzEvent.getAgentHostname() == null) {
+                       authzEvent.setAgentHostname(MiscUtil.getHostname());
+               }
+
+               if (authzEvent.getLogType() == null) {
+                       authzEvent.setLogType("RangerAudit");
+               }
+
+               if (authzEvent.getEventId() == null) {
+                       authzEvent.setEventId(MiscUtil.generateUniqueId());
+               }
+
+               try {
+                       if (solrClient == null) {
+                               connect();
+                               if (solrClient == null) {
+                                       // Solr is still not initialized. So 
need to throw error
+                                       return;
+                               }
+                       }
+
+                       if (lastFailTime > 0) {
+                               long diff = System.currentTimeMillis() - 
lastFailTime;
+                               if (diff < retryWaitTime) {
+                                       if (LOG.isDebugEnabled()) {
+                                               LOG.debug("Ignore sending 
audit. lastConnect=" + diff
+                                                               + " ms");
+                                       }
+                                       return;
+                               }
+                       }
+                       // Convert AuditEventBase to Solr document
+                       SolrInputDocument document = toSolrDoc(authzEvent);
+                       UpdateResponse response = solrClient.add(document);
+                       if (response.getStatus() != 0) {
+                               lastFailTime = System.currentTimeMillis();
+
+                               // System.out.println("Response=" + 
response.toString()
+                               // + ", status= " + response.getStatus() + ", 
event="
+                               // + event);
+                               // throw new Exception("Aborting. event=" + 
event +
+                               // ", response="
+                               // + response.toString());
+                       } else {
+                               lastFailTime = 0;
+                       }
+
+               } catch (Throwable t) {
+                       LOG.error("Error sending message to Solr", t);
+               }
+
+       }
+
+       /*
+        * (non-Javadoc)
+        * 
+        * @see org.apache.ranger.audit.provider.AuditProvider#start()
+        */
+       @Override
+       public void start() {
+               connect();
+       }
+
+       /*
+        * (non-Javadoc)
+        * 
+        * @see org.apache.ranger.audit.provider.AuditProvider#stop()
+        */
+       @Override
+       public void stop() {
+               // TODO Auto-generated method stub
+
+       }
+
+       /*
+        * (non-Javadoc)
+        * 
+        * @see org.apache.ranger.audit.provider.AuditProvider#waitToComplete()
+        */
+       @Override
+       public void waitToComplete() {
+               // TODO Auto-generated method stub
+
+       }
+
+       /*
+        * (non-Javadoc)
+        * 
+        * @see org.apache.ranger.audit.provider.AuditProvider#isFlushPending()
+        */
+       @Override
+       public boolean isFlushPending() {
+               // TODO Auto-generated method stub
+               return false;
+       }
+
+       /*
+        * (non-Javadoc)
+        * 
+        * @see 
org.apache.ranger.audit.provider.AuditProvider#getLastFlushTime()
+        */
+       @Override
+       public long getLastFlushTime() {
+               // TODO Auto-generated method stub
+               return 0;
+       }
+
+       /*
+        * (non-Javadoc)
+        * 
+        * @see org.apache.ranger.audit.provider.AuditProvider#flush()
+        */
+       @Override
+       public void flush() {
+               // TODO Auto-generated method stub
+
+       }
+
+       SolrInputDocument toSolrDoc(AuthzAuditEvent auditEvent) {
+               SolrInputDocument doc = new SolrInputDocument();
+               doc.addField("id", auditEvent.getEventId());
+               doc.addField("access", auditEvent.getAccessType());
+               doc.addField("enforcer", auditEvent.getAclEnforcer());
+               doc.addField("agent", auditEvent.getAgentId());
+               doc.addField("repo", auditEvent.getRepositoryName());
+               doc.addField("sess", auditEvent.getSessionId());
+               doc.addField("reqUser", auditEvent.getUser());
+               doc.addField("reqData", auditEvent.getRequestData());
+               doc.addField("resource", auditEvent.getResourcePath());
+               doc.addField("cliIP", auditEvent.getClientIP());
+               doc.addField("logType", auditEvent.getLogType());
+               doc.addField("result", auditEvent.getAccessResult());
+               doc.addField("policy", auditEvent.getPolicyId());
+               doc.addField("repoType", auditEvent.getRepositoryType());
+               doc.addField("resType", auditEvent.getResourceType());
+               doc.addField("reason", auditEvent.getResultReason());
+               doc.addField("action", auditEvent.getAction());
+               doc.addField("evtTime", auditEvent.getEventTime());
+               return doc;
+       }
+       
+       public boolean isAsync() {
+               return true;
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/hbase-agent/conf/ranger-hbase-audit-changes.cfg
----------------------------------------------------------------------
diff --git a/hbase-agent/conf/ranger-hbase-audit-changes.cfg 
b/hbase-agent/conf/ranger-hbase-audit-changes.cfg
index e5c381a..221d20a 100644
--- a/hbase-agent/conf/ranger-hbase-audit-changes.cfg
+++ b/hbase-agent/conf/ranger-hbase-audit-changes.cfg
@@ -31,3 +31,15 @@ 
xasecure.audit.hdfs.config.local.buffer.flush.interval.seconds     %XAAUDIT.HDFS
 xasecure.audit.hdfs.config.local.buffer.rollover.interval.seconds  
%XAAUDIT.HDFS.LOCAL_BUFFER_ROLLOVER_INTERVAL_SECONDS%   mod create-if-not-exists
 xasecure.audit.hdfs.config.local.archive.directory                 
%XAAUDIT.HDFS.LOCAL_ARCHIVE_DIRECTORY%                  mod create-if-not-exists
 xasecure.audit.hdfs.config.local.archive.max.file.count            
%XAAUDIT.HDFS.LOCAL_ARCHIVE_MAX_FILE_COUNT%             mod create-if-not-exists
+
+#xasecure.audit.kafka.is.enabled                                    
%XAAUDIT.KAFKA.IS_ENABLED%                             mod create-if-not-exists
+#xasecure.audit.kafka.is.async                                      
%XAAUDIT.KAFKA.IS_ASYNC%                               mod create-if-not-exists
+#xasecure.audit.kafka.async.max.queue.size                          
%XAAUDIT.KAFKA.MAX_QUEUE_SIZE%                         mod create-if-not-exists
+#xasecure.audit.kafka.async.max.flush.interval.ms                   
%XAAUDIT.KAFKA.MAX_FLUSH_INTERVAL_MS%                  mod create-if-not-exists
+#xasecure.audit.kafka.broker_list                                   
%XAAUDIT.KAFKA.BROKER_LIST%                            mod create-if-not-exists
+#xasecure.audit.kafka.topic_name                                    
%XAAUDIT.KAFKA.TOPIC_NAME%                             mod create-if-not-exists
+
+xasecure.audit.solr.is.enabled                                    
%XAAUDIT.SOLR.IS_ENABLED%                               mod create-if-not-exists
+xasecure.audit.solr.async.max.queue.size                          
%XAAUDIT.SOLR.MAX_QUEUE_SIZE%                           mod create-if-not-exists
+xasecure.audit.solr.async.max.flush.interval.ms                   
%XAAUDIT.SOLR.MAX_FLUSH_INTERVAL_MS%                    mod create-if-not-exists
+xasecure.audit.solr.solr_url                                      
%XAAUDIT.SOLR.SOLR_URL%                                 mod create-if-not-exists

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/hbase-agent/conf/ranger-hbase-audit.xml
----------------------------------------------------------------------
diff --git a/hbase-agent/conf/ranger-hbase-audit.xml 
b/hbase-agent/conf/ranger-hbase-audit.xml
index b39696b..e5bfb89 100644
--- a/hbase-agent/conf/ranger-hbase-audit.xml
+++ b/hbase-agent/conf/ranger-hbase-audit.xml
@@ -183,4 +183,52 @@
                <name>xasecure.audit.log4j.async.max.flush.interval.ms</name>
                <value>30000</value>
        </property>     
+       
+       <!-- Kafka audit provider configuration -->
+       <property>
+               <name>xasecure.audit.kafka.is.enabled</name>
+               <value>false</value>
+       </property>     
+
+       <property>
+               <name>xasecure.audit.kafka.async.max.queue.size</name>
+               <value>1</value>
+       </property>     
+
+       <property>
+               <name>xasecure.audit.kafka.async.max.flush.interval.ms</name>
+               <value>1000</value>
+       </property>     
+       
+       <property>
+               <name>xasecure.audit.kafka.broker_list</name>
+               <value>localhost:9092</value>
+       </property>     
+
+       <property>
+               <name>xasecure.audit.kafka.topic_name</name>
+               <value>ranger_audits</value>
+       </property>     
+       
+       <!-- Ranger audit provider configuration -->
+       <property>
+               <name>xasecure.audit.ranger.is.enabled</name>
+               <value>false</value>
+       </property>     
+       
+       <property>
+               <name>xasecure.audit.ranger.async.max.queue.size</name>
+               <value>1</value>
+       </property>     
+
+       <property>
+               <name>xasecure.audit.ranger.async.max.flush.interval.ms</name>
+               <value>1000</value>
+       </property>     
+       
+       <property>
+               <name>xasecure.audit.solr.solr_url</name>
+               <value>http://localhost:6083/solr/ranger_audits</value>
+       </property>     
+
 </configuration>

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/hbase-agent/scripts/install.properties
----------------------------------------------------------------------
diff --git a/hbase-agent/scripts/install.properties 
b/hbase-agent/scripts/install.properties
index 5a81ad4..7ff29c9 100644
--- a/hbase-agent/scripts/install.properties
+++ b/hbase-agent/scripts/install.properties
@@ -89,6 +89,12 @@ XAAUDIT.HDFS.LOCAL_BUFFER_FLUSH_INTERVAL_SECONDS=60
 XAAUDIT.HDFS.LOCAL_BUFFER_ROLLOVER_INTERVAL_SECONDS=600
 XAAUDIT.HDFS.LOCAL_ARCHIVE_MAX_FILE_COUNT=10
 
+#Solr Audit Provder
+XAAUDIT.SOLR.IS_ENABLED=false
+XAAUDIT.SOLR.MAX_QUEUE_SIZE=1
+XAAUDIT.SOLR.MAX_FLUSH_INTERVAL_MS=1000
+XAAUDIT.SOLR.SOLR_URL=http://localhost:6083/solr/ranger_audits
+
 #
 # SSL Client Certificate Information
 #

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/hdfs-agent/conf/ranger-hdfs-audit-changes.cfg
----------------------------------------------------------------------
diff --git a/hdfs-agent/conf/ranger-hdfs-audit-changes.cfg 
b/hdfs-agent/conf/ranger-hdfs-audit-changes.cfg
index e5c381a..8d31016 100644
--- a/hdfs-agent/conf/ranger-hdfs-audit-changes.cfg
+++ b/hdfs-agent/conf/ranger-hdfs-audit-changes.cfg
@@ -31,3 +31,14 @@ 
xasecure.audit.hdfs.config.local.buffer.flush.interval.seconds     %XAAUDIT.HDFS
 xasecure.audit.hdfs.config.local.buffer.rollover.interval.seconds  
%XAAUDIT.HDFS.LOCAL_BUFFER_ROLLOVER_INTERVAL_SECONDS%   mod create-if-not-exists
 xasecure.audit.hdfs.config.local.archive.directory                 
%XAAUDIT.HDFS.LOCAL_ARCHIVE_DIRECTORY%                  mod create-if-not-exists
 xasecure.audit.hdfs.config.local.archive.max.file.count            
%XAAUDIT.HDFS.LOCAL_ARCHIVE_MAX_FILE_COUNT%             mod create-if-not-exists
+
+#xasecure.audit.kafka.is.enabled                                    
%XAAUDIT.KAFKA.IS_ENABLED%                             mod create-if-not-exists
+#xasecure.audit.kafka.async.max.queue.size                          
%XAAUDIT.KAFKA.MAX_QUEUE_SIZE%                         mod create-if-not-exists
+#xasecure.audit.kafka.async.max.flush.interval.ms                   
%XAAUDIT.KAFKA.MAX_FLUSH_INTERVAL_MS%                  mod create-if-not-exists
+#xasecure.audit.kafka.broker_list                                   
%XAAUDIT.KAFKA.BROKER_LIST%                            mod create-if-not-exists
+#xasecure.audit.kafka.topic_name                                    
%XAAUDIT.KAFKA.TOPIC_NAME%                             mod create-if-not-exists
+
+xasecure.audit.solr.is.enabled                                    
%XAAUDIT.SOLR.IS_ENABLED%                               mod create-if-not-exists
+xasecure.audit.solr.async.max.queue.size                          
%XAAUDIT.SOLR.MAX_QUEUE_SIZE%                           mod create-if-not-exists
+xasecure.audit.solr.async.max.flush.interval.ms                   
%XAAUDIT.SOLR.MAX_FLUSH_INTERVAL_MS%                    mod create-if-not-exists
+xasecure.audit.solr.solr_url                                      
%XAAUDIT.SOLR.SOLR_URL%                                 mod create-if-not-exists

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/hdfs-agent/conf/ranger-hdfs-audit.xml
----------------------------------------------------------------------
diff --git a/hdfs-agent/conf/ranger-hdfs-audit.xml 
b/hdfs-agent/conf/ranger-hdfs-audit.xml
index d26345d..09114ad 100644
--- a/hdfs-agent/conf/ranger-hdfs-audit.xml
+++ b/hdfs-agent/conf/ranger-hdfs-audit.xml
@@ -183,4 +183,52 @@
                <name>xasecure.audit.log4j.async.max.flush.interval.ms</name>
                <value>30000</value>
        </property>     
+       
+       <!-- Kafka audit provider configuration -->
+       <property>
+               <name>xasecure.audit.kafka.is.enabled</name>
+               <value>false</value>
+       </property>     
+
+       <property>
+               <name>xasecure.audit.kafka.async.max.queue.size</name>
+               <value>1</value>
+       </property>     
+
+       <property>
+               <name>xasecure.audit.kafka.async.max.flush.interval.ms</name>
+               <value>1000</value>
+       </property>     
+       
+       <property>
+               <name>xasecure.audit.kafka.broker_list</name>
+               <value>localhost:9092</value>
+       </property>     
+
+       <property>
+               <name>xasecure.audit.kafka.topic_name</name>
+               <value>ranger_audits</value>
+       </property>     
+       
+       <!-- Ranger audit provider configuration -->
+       <property>
+               <name>xasecure.audit.ranger.is.enabled</name>
+               <value>false</value>
+       </property>     
+       
+       <property>
+               <name>xasecure.audit.ranger.async.max.queue.size</name>
+               <value>1</value>
+       </property>     
+
+       <property>
+               <name>xasecure.audit.ranger.async.max.flush.interval.ms</name>
+               <value>1000</value>
+       </property>     
+       
+       <property>
+               <name>xasecure.audit.solr.solr_url</name>
+               <value>http://localhost:6083/solr/ranger_audits</value>
+       </property>     
+       
 </configuration>

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/hdfs-agent/scripts/install.properties
----------------------------------------------------------------------
diff --git a/hdfs-agent/scripts/install.properties 
b/hdfs-agent/scripts/install.properties
index 93790e3..2e1b61a 100644
--- a/hdfs-agent/scripts/install.properties
+++ b/hdfs-agent/scripts/install.properties
@@ -89,6 +89,13 @@ XAAUDIT.HDFS.LOCAL_BUFFER_FLUSH_INTERVAL_SECONDS=60
 XAAUDIT.HDFS.LOCAL_BUFFER_ROLLOVER_INTERVAL_SECONDS=600
 XAAUDIT.HDFS.LOCAL_ARCHIVE_MAX_FILE_COUNT=10
 
+#Solr Audit Provder
+XAAUDIT.SOLR.IS_ENABLED=false
+XAAUDIT.SOLR.MAX_QUEUE_SIZE=1
+XAAUDIT.SOLR.MAX_FLUSH_INTERVAL_MS=1000
+XAAUDIT.SOLR.SOLR_URL=http://localhost:6083/solr/ranger_audits
+
+
 #
 # SSL Client Certificate Information
 #

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/hive-agent/conf/ranger-hive-audit-changes.cfg
----------------------------------------------------------------------
diff --git a/hive-agent/conf/ranger-hive-audit-changes.cfg 
b/hive-agent/conf/ranger-hive-audit-changes.cfg
index 9fa7608..2d6d414 100644
--- a/hive-agent/conf/ranger-hive-audit-changes.cfg
+++ b/hive-agent/conf/ranger-hive-audit-changes.cfg
@@ -31,3 +31,15 @@ 
xasecure.audit.hdfs.config.local.buffer.flush.interval.seconds     %XAAUDIT.HDFS
 xasecure.audit.hdfs.config.local.buffer.rollover.interval.seconds  
%XAAUDIT.HDFS.LOCAL_BUFFER_ROLLOVER_INTERVAL_SECONDS%   mod create-if-not-exists
 xasecure.audit.hdfs.config.local.archive.directory                 
%XAAUDIT.HDFS.LOCAL_ARCHIVE_DIRECTORY%                  mod create-if-not-exists
 xasecure.audit.hdfs.config.local.archive.max.file.count            
%XAAUDIT.HDFS.LOCAL_ARCHIVE_MAX_FILE_COUNT%             mod create-if-not-exists
+
+#xasecure.audit.kafka.is.enabled                                    
%XAAUDIT.KAFKA.IS_ENABLED%                             mod create-if-not-exists
+#xasecure.audit.kafka.is.async                                      
%XAAUDIT.KAFKA.IS_ASYNC%                               mod create-if-not-exists
+#xasecure.audit.kafka.async.max.queue.size                          
%XAAUDIT.KAFKA.MAX_QUEUE_SIZE%                         mod create-if-not-exists
+#xasecure.audit.kafka.async.max.flush.interval.ms                   
%XAAUDIT.KAFKA.MAX_FLUSH_INTERVAL_MS%                  mod create-if-not-exists
+#xasecure.audit.kafka.broker_list                                   
%XAAUDIT.KAFKA.BROKER_LIST%                            mod create-if-not-exists
+#xasecure.audit.kafka.topic_name                                    
%XAAUDIT.KAFKA.TOPIC_NAME%                             mod create-if-not-exists
+
+xasecure.audit.solr.is.enabled                                    
%XAAUDIT.SOLR.IS_ENABLED%                               mod create-if-not-exists
+xasecure.audit.solr.async.max.queue.size                          
%XAAUDIT.SOLR.MAX_QUEUE_SIZE%                           mod create-if-not-exists
+xasecure.audit.solr.async.max.flush.interval.ms                   
%XAAUDIT.SOLR.MAX_FLUSH_INTERVAL_MS%                    mod create-if-not-exists
+xasecure.audit.solr.solr_url                                      
%XAAUDIT.SOLR.SOLR_URL%                                 mod create-if-not-exists

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/hive-agent/conf/ranger-hive-audit.xml
----------------------------------------------------------------------
diff --git a/hive-agent/conf/ranger-hive-audit.xml 
b/hive-agent/conf/ranger-hive-audit.xml
index d011b24..e753336 100644
--- a/hive-agent/conf/ranger-hive-audit.xml
+++ b/hive-agent/conf/ranger-hive-audit.xml
@@ -183,4 +183,52 @@
                <name>xasecure.audit.log4j.async.max.flush.interval.ms</name>
                <value>30000</value>
        </property>     
+       
+       <!-- Kafka audit provider configuration -->
+       <property>
+               <name>xasecure.audit.kafka.is.enabled</name>
+               <value>false</value>
+       </property>     
+
+       <property>
+               <name>xasecure.audit.kafka.async.max.queue.size</name>
+               <value>1</value>
+       </property>     
+
+       <property>
+               <name>xasecure.audit.kafka.async.max.flush.interval.ms</name>
+               <value>1000</value>
+       </property>     
+       
+       <property>
+               <name>xasecure.audit.kafka.broker_list</name>
+               <value>localhost:9092</value>
+       </property>     
+
+       <property>
+               <name>xasecure.audit.kafka.topic_name</name>
+               <value>ranger_audits</value>
+       </property>     
+       
+       <!-- Ranger audit provider configuration -->
+       <property>
+               <name>xasecure.audit.ranger.is.enabled</name>
+               <value>false</value>
+       </property>     
+       
+       <property>
+               <name>xasecure.audit.ranger.async.max.queue.size</name>
+               <value>1</value>
+       </property>     
+
+       <property>
+               <name>xasecure.audit.ranger.async.max.flush.interval.ms</name>
+               <value>1000</value>
+       </property>     
+       
+       <property>
+               <name>xasecure.audit.solr.solr_url</name>
+               <value>http://localhost:6083/solr/ranger_audits</value>
+       </property>     
+       
 </configuration>

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/hive-agent/scripts/install.properties
----------------------------------------------------------------------
diff --git a/hive-agent/scripts/install.properties 
b/hive-agent/scripts/install.properties
index bbd1849..75b1b5d 100644
--- a/hive-agent/scripts/install.properties
+++ b/hive-agent/scripts/install.properties
@@ -89,6 +89,12 @@ XAAUDIT.HDFS.LOCAL_BUFFER_FLUSH_INTERVAL_SECONDS=60
 XAAUDIT.HDFS.LOCAL_BUFFER_ROLLOVER_INTERVAL_SECONDS=600
 XAAUDIT.HDFS.LOCAL_ARCHIVE_MAX_FILE_COUNT=10
 
+#Solr Audit Provder
+XAAUDIT.SOLR.IS_ENABLED=false
+XAAUDIT.SOLR.MAX_QUEUE_SIZE=1
+XAAUDIT.SOLR.MAX_FLUSH_INTERVAL_MS=1000
+XAAUDIT.SOLR.SOLR_URL=http://localhost:6083/solr/ranger_audits
+
 #
 # SSL Client Certificate Information
 #

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/knox-agent/conf/ranger-knox-audit-changes.cfg
----------------------------------------------------------------------
diff --git a/knox-agent/conf/ranger-knox-audit-changes.cfg 
b/knox-agent/conf/ranger-knox-audit-changes.cfg
index 7ae334e..f97d10f 100644
--- a/knox-agent/conf/ranger-knox-audit-changes.cfg
+++ b/knox-agent/conf/ranger-knox-audit-changes.cfg
@@ -31,3 +31,15 @@ 
xasecure.audit.hdfs.config.local.buffer.flush.interval.seconds     %XAAUDIT.HDFS
 xasecure.audit.hdfs.config.local.buffer.rollover.interval.seconds  
%XAAUDIT.HDFS.LOCAL_BUFFER_ROLLOVER_INTERVAL_SECONDS%   mod create-if-not-exists
 xasecure.audit.hdfs.config.local.archive.directory                 
%XAAUDIT.HDFS.LOCAL_ARCHIVE_DIRECTORY%                  mod create-if-not-exists
 xasecure.audit.hdfs.config.local.archive.max.file.count            
%XAAUDIT.HDFS.LOCAL_ARCHIVE_MAX_FILE_COUNT%             mod create-if-not-exists
+
+#xasecure.audit.kafka.is.enabled                                    
%XAAUDIT.KAFKA.IS_ENABLED%                             mod create-if-not-exists
+#xasecure.audit.kafka.is.async                                      
%XAAUDIT.KAFKA.IS_ASYNC%                               mod create-if-not-exists
+#xasecure.audit.kafka.async.max.queue.size                          
%XAAUDIT.KAFKA.MAX_QUEUE_SIZE%                         mod create-if-not-exists
+#xasecure.audit.kafka.async.max.flush.interval.ms                   
%XAAUDIT.KAFKA.MAX_FLUSH_INTERVAL_MS%                  mod create-if-not-exists
+#xasecure.audit.kafka.broker_list                                   
%XAAUDIT.KAFKA.BROKER_LIST%                            mod create-if-not-exists
+#xasecure.audit.kafka.topic_name                                    
%XAAUDIT.KAFKA.TOPIC_NAME%                             mod create-if-not-exists
+
+xasecure.audit.solr.is.enabled                                    
%XAAUDIT.SOLR.IS_ENABLED%                               mod create-if-not-exists
+xasecure.audit.solr.async.max.queue.size                          
%XAAUDIT.SOLR.MAX_QUEUE_SIZE%                           mod create-if-not-exists
+xasecure.audit.solr.async.max.flush.interval.ms                   
%XAAUDIT.SOLR.MAX_FLUSH_INTERVAL_MS%                    mod create-if-not-exists
+xasecure.audit.solr.solr_url                                      
%XAAUDIT.SOLR.SOLR_URL%                                 mod create-if-not-exists

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/knox-agent/conf/ranger-knox-audit.xml
----------------------------------------------------------------------
diff --git a/knox-agent/conf/ranger-knox-audit.xml 
b/knox-agent/conf/ranger-knox-audit.xml
index 0fdcefc..6f0adb9 100644
--- a/knox-agent/conf/ranger-knox-audit.xml
+++ b/knox-agent/conf/ranger-knox-audit.xml
@@ -183,4 +183,52 @@
                <name>xasecure.audit.log4j.async.max.flush.interval.ms</name>
                <value>30000</value>
        </property>     
+       
+       <!-- Kafka audit provider configuration -->
+       <property>
+               <name>xasecure.audit.kafka.is.enabled</name>
+               <value>false</value>
+       </property>     
+
+       <property>
+               <name>xasecure.audit.kafka.async.max.queue.size</name>
+               <value>1</value>
+       </property>     
+
+       <property>
+               <name>xasecure.audit.kafka.async.max.flush.interval.ms</name>
+               <value>1000</value>
+       </property>     
+       
+       <property>
+               <name>xasecure.audit.kafka.broker_list</name>
+               <value>localhost:9092</value>
+       </property>     
+
+       <property>
+               <name>xasecure.audit.kafka.topic_name</name>
+               <value>ranger_audits</value>
+       </property>     
+       
+       <!-- Ranger audit provider configuration -->
+       <property>
+               <name>xasecure.audit.ranger.is.enabled</name>
+               <value>false</value>
+       </property>     
+       
+       <property>
+               <name>xasecure.audit.ranger.async.max.queue.size</name>
+               <value>1</value>
+       </property>     
+
+       <property>
+               <name>xasecure.audit.ranger.async.max.flush.interval.ms</name>
+               <value>1000</value>
+       </property>     
+       
+       <property>
+               <name>xasecure.audit.solr.solr_url</name>
+               <value>http://localhost:6083/solr/ranger_audits</value>
+       </property>     
+       
 </configuration>

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/knox-agent/scripts/install.properties
----------------------------------------------------------------------
diff --git a/knox-agent/scripts/install.properties 
b/knox-agent/scripts/install.properties
index d821c5d..ecd9813 100644
--- a/knox-agent/scripts/install.properties
+++ b/knox-agent/scripts/install.properties
@@ -92,6 +92,12 @@ XAAUDIT.HDFS.LOCAL_BUFFER_FLUSH_INTERVAL_SECONDS=60
 XAAUDIT.HDFS.LOCAL_BUFFER_ROLLOVER_INTERVAL_SECONDS=600
 XAAUDIT.HDFS.LOCAL_ARCHIVE_MAX_FILE_COUNT=10
 
+#Solr Audit Provder
+XAAUDIT.SOLR.IS_ENABLED=false
+XAAUDIT.SOLR.MAX_QUEUE_SIZE=1
+XAAUDIT.SOLR.MAX_FLUSH_INTERVAL_MS=1000
+XAAUDIT.SOLR.SOLR_URL=http://localhost:6083/solr/ranger_audits
+
 #
 # SSL Client Certificate Information
 #

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/plugin-yarn/conf/ranger-yarn-audit-changes.cfg
----------------------------------------------------------------------
diff --git a/plugin-yarn/conf/ranger-yarn-audit-changes.cfg 
b/plugin-yarn/conf/ranger-yarn-audit-changes.cfg
index 4f2c5a2..e0dbea2 100644
--- a/plugin-yarn/conf/ranger-yarn-audit-changes.cfg
+++ b/plugin-yarn/conf/ranger-yarn-audit-changes.cfg
@@ -31,3 +31,15 @@ 
xasecure.audit.hdfs.config.local.buffer.flush.interval.seconds     %XAAUDIT.HDFS
 xasecure.audit.hdfs.config.local.buffer.rollover.interval.seconds  
%XAAUDIT.HDFS.LOCAL_BUFFER_ROLLOVER_INTERVAL_SECONDS%   mod create-if-not-exists
 xasecure.audit.hdfs.config.local.archive.directory                 
%XAAUDIT.HDFS.LOCAL_ARCHIVE_DIRECTORY%                  mod create-if-not-exists
 xasecure.audit.hdfs.config.local.archive.max.file.count            
%XAAUDIT.HDFS.LOCAL_ARCHIVE_MAX_FILE_COUNT%             mod create-if-not-exists
+
+#xasecure.audit.kafka.is.enabled                                    
%XAAUDIT.KAFKA.IS_ENABLED%                             mod create-if-not-exists
+#xasecure.audit.kafka.is.async                                      
%XAAUDIT.KAFKA.IS_ASYNC%                               mod create-if-not-exists
+#xasecure.audit.kafka.async.max.queue.size                          
%XAAUDIT.KAFKA.MAX_QUEUE_SIZE%                         mod create-if-not-exists
+#xasecure.audit.kafka.async.max.flush.interval.ms                   
%XAAUDIT.KAFKA.MAX_FLUSH_INTERVAL_MS%                  mod create-if-not-exists
+#xasecure.audit.kafka.broker_list                                   
%XAAUDIT.KAFKA.BROKER_LIST%                            mod create-if-not-exists
+#xasecure.audit.kafka.topic_name                                    
%XAAUDIT.KAFKA.TOPIC_NAME%                             mod create-if-not-exists
+
+xasecure.audit.solr.is.enabled                                    
%XAAUDIT.SOLR.IS_ENABLED%                               mod create-if-not-exists
+xasecure.audit.solr.async.max.queue.size                          
%XAAUDIT.SOLR.MAX_QUEUE_SIZE%                           mod create-if-not-exists
+xasecure.audit.solr.async.max.flush.interval.ms                   
%XAAUDIT.SOLR.MAX_FLUSH_INTERVAL_MS%                    mod create-if-not-exists
+xasecure.audit.solr.solr_url                                      
%XAAUDIT.SOLR.SOLR_URL%                                 mod create-if-not-exists

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/plugin-yarn/conf/ranger-yarn-audit.xml
----------------------------------------------------------------------
diff --git a/plugin-yarn/conf/ranger-yarn-audit.xml 
b/plugin-yarn/conf/ranger-yarn-audit.xml
index c0096a4..f1e9687 100644
--- a/plugin-yarn/conf/ranger-yarn-audit.xml
+++ b/plugin-yarn/conf/ranger-yarn-audit.xml
@@ -184,4 +184,52 @@
                <name>xasecure.audit.log4j.async.max.flush.interval.ms</name>
                <value>30000</value>
        </property>     
+       
+       <!-- Kafka audit provider configuration -->
+       <property>
+               <name>xasecure.audit.kafka.is.enabled</name>
+               <value>false</value>
+       </property>     
+
+       <property>
+               <name>xasecure.audit.kafka.async.max.queue.size</name>
+               <value>1</value>
+       </property>     
+
+       <property>
+               <name>xasecure.audit.kafka.async.max.flush.interval.ms</name>
+               <value>1000</value>
+       </property>     
+       
+       <property>
+               <name>xasecure.audit.kafka.broker_list</name>
+               <value>localhost:9092</value>
+       </property>     
+
+       <property>
+               <name>xasecure.audit.kafka.topic_name</name>
+               <value>ranger_audits</value>
+       </property>     
+       
+       <!-- Ranger audit provider configuration -->
+       <property>
+               <name>xasecure.audit.ranger.is.enabled</name>
+               <value>false</value>
+       </property>     
+       
+       <property>
+               <name>xasecure.audit.ranger.async.max.queue.size</name>
+               <value>1</value>
+       </property>     
+
+       <property>
+               <name>xasecure.audit.ranger.async.max.flush.interval.ms</name>
+               <value>1000</value>
+       </property>     
+       
+       <property>
+               <name>xasecure.audit.solr.solr_url</name>
+               <value>http://localhost:6083/solr/ranger_audits</value>
+       </property>     
+
 </configuration>

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/plugin-yarn/scripts/install.properties
----------------------------------------------------------------------
diff --git a/plugin-yarn/scripts/install.properties 
b/plugin-yarn/scripts/install.properties
index d2d1ffe..bbe9f7f 100644
--- a/plugin-yarn/scripts/install.properties
+++ b/plugin-yarn/scripts/install.properties
@@ -89,6 +89,12 @@ XAAUDIT.HDFS.LOCAL_BUFFER_FLUSH_INTERVAL_SECONDS=60
 XAAUDIT.HDFS.LOCAL_BUFFER_ROLLOVER_INTERVAL_SECONDS=600
 XAAUDIT.HDFS.LOCAL_ARCHIVE_MAX_FILE_COUNT=10
 
+#Solr Audit Provder
+XAAUDIT.SOLR.IS_ENABLED=false
+XAAUDIT.SOLR.MAX_QUEUE_SIZE=1
+XAAUDIT.SOLR.MAX_FLUSH_INTERVAL_MS=1000
+XAAUDIT.SOLR.SOLR_URL=http://localhost:6083/solr/ranger_audits
+
 #
 # SSL Client Certificate Information
 #

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index ef39d37..00c8339 100644
--- a/pom.xml
+++ b/pom.xml
@@ -88,6 +88,7 @@
   <module>knox-agent</module>
   <module>storm-agent</module>
   <module>plugin-yarn</module>
+  <module>ranger_solrj</module>
   <module>security-admin</module>
   <module>ugsync</module>
   <module>unixauthclient</module>
@@ -129,6 +130,9 @@
                <hamcrest.all.version>1.3</hamcrest.all.version>
                <hbase.version>0.99.2</hbase.version>
                <hive.version>1.2.0-SNAPSHOT</hive.version>
+               
<httpcomponent.httpmime.version>4.2.5</httpcomponent.httpmime.version>
+               
<httpcomponent.httpclient.version>4.2.5</httpcomponent.httpclient.version>
+               
<httpcomponent.httpcore.version>4.2.5</httpcomponent.httpcore.version>
                <calcite.version>0.9.2-incubating</calcite.version>
                <tez.version>0.5.2</tez.version>
                <javassist.version>3.12.1.GA</javassist.version>
@@ -138,16 +142,20 @@
                <jersey-bundle.version>1.17.1</jersey-bundle.version>
                <jersey-client.version>2.6</jersey-client.version>
                <junit.version>4.11</junit.version>
+               <kafka.version>0.8.2.0</kafka.version>
                <mockito.version>1.8.4</mockito.version>
                <hamcrest-version>1.3</hamcrest-version>
                <knox.gateway.version>0.5.0</knox.gateway.version>
                <local.lib.dir>${project.basedir}/../lib/local</local.lib.dir>
                <log4j.version>1.2.17</log4j.version>
                
<mysql-connector-java.version>5.1.31</mysql-connector-java.version>
+               <noggit.version>0.6</noggit.version>
                
<owasp-java-html-sanitizer.version>r239</owasp-java-html-sanitizer.version>
                
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
                
<security-agent-install-dir>hadoop-security/plugins</security-agent-install-dir>
                <slf4j-api.version>1.7.5</slf4j-api.version>
+               <!--<solr.version>5.0.0</solr.version>-->
+               <ranger.solrj.version>0.4.0</ranger.solrj.version>
                
<springframework.spring.version>2.5.6</springframework.spring.version>
                <!--
                
<springframework.spring.version>3.1.3.RELEASE</springframework.spring.version>
@@ -162,6 +170,7 @@
                <tomcat.commons.el.version>5.5.23</tomcat.commons.el.version>
                <tomcat.embed.version>7.0.55</tomcat.embed.version>
                <velocity.version>1.7</velocity.version>
+               <zookeeper.version>3.4.6</zookeeper.version>
                <powermock.version>1.5.6</powermock.version>
                <aspectj.version>1.8.2</aspectj.version>
                <findbugs.plugin.version>3.0.0</findbugs.plugin.version>

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/ranger_solrj/.gitignore
----------------------------------------------------------------------
diff --git a/ranger_solrj/.gitignore b/ranger_solrj/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/ranger_solrj/.gitignore
@@ -0,0 +1 @@
+/target/

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/ranger_solrj/pom.xml
----------------------------------------------------------------------
diff --git a/ranger_solrj/pom.xml b/ranger_solrj/pom.xml
new file mode 100644
index 0000000..2b86140
--- /dev/null
+++ b/ranger_solrj/pom.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd"; 
xmlns="http://maven.apache.org/POM/4.0.0";
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.apache.ranger</groupId>
+    <artifactId>ranger</artifactId>
+    <version>0.4.0</version>
+  </parent>
+  <groupId>org.apache.ranger</groupId>
+  <artifactId>ranger_solrj</artifactId>
+  <version>0.4.0</version>
+  <name>ranger_solrj</name>
+  <url>http://maven.apache.org</url>
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+  <dependencies>
+    <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+      <version>${commons.io.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpclient</artifactId>
+      <version>${httpcomponent.httpclient.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpcore</artifactId>
+      <version>${httpcomponent.httpcore.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpmime</artifactId>
+      <version>${httpcomponent.httpmime.version}</version>
+    </dependency>      
+    <dependency>
+      <groupId>org.noggit</groupId>
+      <artifactId>noggit</artifactId>
+      <version>${noggit.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <version>${slf4j-api.version}</version>
+    </dependency>   
+    <dependency>
+      <groupId>org.apache.zookeeper</groupId>
+      <artifactId>zookeeper</artifactId>
+      <version>${zookeeper.version}</version>
+    </dependency>
+  </dependencies>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/ranger_solrj/src/main/java/org/apache/solr/client/solrj/ResponseParser.java
----------------------------------------------------------------------
diff --git 
a/ranger_solrj/src/main/java/org/apache/solr/client/solrj/ResponseParser.java 
b/ranger_solrj/src/main/java/org/apache/solr/client/solrj/ResponseParser.java
new file mode 100644
index 0000000..d5c3b38
--- /dev/null
+++ 
b/ranger_solrj/src/main/java/org/apache/solr/client/solrj/ResponseParser.java
@@ -0,0 +1,53 @@
+/*
+ * 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.client.solrj;
+
+import java.io.Reader;
+import java.io.InputStream;
+import org.apache.solr.common.util.NamedList;
+
+/**
+ * 
+ *
+ * @since solr 1.3
+ */
+public abstract class ResponseParser
+{
+  public abstract String getWriterType(); // for example: wt=XML, JSON, etc
+
+  public abstract NamedList<Object> processResponse(InputStream body, String 
encoding);
+
+  public abstract NamedList<Object> processResponse(Reader reader);
+  
+  /**
+   * A well behaved ResponseParser will return its content-type.
+   * 
+   * @return the content-type this parser expects to parse
+   */
+  public String getContentType() {
+    return null;
+  }
+  
+  /**
+   * @return the version param passed to solr
+   */
+  public String getVersion()
+  {
+    return "2.2";
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/40aa090d/ranger_solrj/src/main/java/org/apache/solr/client/solrj/SolrClient.java
----------------------------------------------------------------------
diff --git 
a/ranger_solrj/src/main/java/org/apache/solr/client/solrj/SolrClient.java 
b/ranger_solrj/src/main/java/org/apache/solr/client/solrj/SolrClient.java
new file mode 100644
index 0000000..28b7f4f
--- /dev/null
+++ b/ranger_solrj/src/main/java/org/apache/solr/client/solrj/SolrClient.java
@@ -0,0 +1,416 @@
+/*
+ * 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.client.solrj;
+
+import org.apache.solr.client.solrj.SolrRequest.METHOD;
+import org.apache.solr.client.solrj.beans.DocumentObjectBinder;
+import org.apache.solr.client.solrj.impl.StreamingBinaryResponseParser;
+import org.apache.solr.client.solrj.request.QueryRequest;
+import org.apache.solr.client.solrj.request.SolrPing;
+import org.apache.solr.client.solrj.request.UpdateRequest;
+import org.apache.solr.client.solrj.response.QueryResponse;
+import org.apache.solr.client.solrj.response.SolrPingResponse;
+import org.apache.solr.client.solrj.response.UpdateResponse;
+import org.apache.solr.common.SolrDocument;
+import org.apache.solr.common.SolrDocumentList;
+import org.apache.solr.common.SolrInputDocument;
+import org.apache.solr.common.StringUtils;
+import org.apache.solr.common.params.CommonParams;
+import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.util.NamedList;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Abstraction through which all communication with a Solr server may be routed
+ *
+ * @since 5.0, replaced {@code SolrServer}
+ */
+public abstract class SolrClient implements Serializable, Closeable {
+
+  private static final long serialVersionUID = 1L;
+  private DocumentObjectBinder binder;
+
+  /**
+   * Adds a collection of documents
+   * @param docs  the collection of documents
+   * @throws IOException If there is a low-level I/O error.
+   */
+  public UpdateResponse add(Collection<SolrInputDocument> docs) throws 
SolrServerException, IOException {
+    return add(docs, -1);
+  }
+
+  /**
+   * Adds a collection of documents, specifying max time before they become 
committed
+   * @param docs  the collection of documents
+   * @param commitWithinMs  max time (in ms) before a commit will happen 
+   * @throws IOException If there is a low-level I/O error.
+   * @since solr 3.5
+   */
+  public UpdateResponse add(Collection<SolrInputDocument> docs, int 
commitWithinMs) throws SolrServerException, IOException {
+    UpdateRequest req = new UpdateRequest();
+    req.add(docs);
+    req.setCommitWithin(commitWithinMs);
+    return req.process(this);
+  }
+
+  /**
+   * Adds a collection of beans
+   * @param beans  the collection of beans
+   * @throws IOException If there is a low-level I/O error.
+   */
+  public UpdateResponse addBeans(Collection<?> beans) throws 
SolrServerException, IOException {
+    return addBeans(beans, -1);
+  }
+
+  /**
+   * Adds a collection of beans specifying max time before they become 
committed
+   * @param beans  the collection of beans
+   * @param commitWithinMs  max time (in ms) before a commit will happen 
+   * @throws IOException If there is a low-level I/O error.
+   * @since solr 3.5
+   */
+  public UpdateResponse addBeans(Collection<?> beans, int commitWithinMs) 
throws SolrServerException, IOException {
+    DocumentObjectBinder binder = this.getBinder();
+    ArrayList<SolrInputDocument> docs =  new ArrayList<>(beans.size());
+    for (Object bean : beans) {
+      docs.add(binder.toSolrInputDocument(bean));
+    }
+    return add(docs, commitWithinMs);
+  }
+
+  /**
+   * Adds a single document
+   * @param doc  the input document
+   * @throws IOException If there is a low-level I/O error.
+   */
+  public UpdateResponse add(SolrInputDocument doc) throws SolrServerException, 
IOException {
+    return add(doc, -1);
+  }
+
+  /**
+   * Adds a single document specifying max time before it becomes committed
+   * @param doc  the input document
+   * @param commitWithinMs  max time (in ms) before a commit will happen 
+   * @throws IOException If there is a low-level I/O error.
+   * @since solr 3.5
+   */
+  public UpdateResponse add(SolrInputDocument doc, int commitWithinMs) throws 
SolrServerException, IOException {
+    UpdateRequest req = new UpdateRequest();
+    req.add(doc);
+    req.setCommitWithin(commitWithinMs);
+    return req.process(this);
+  }
+
+  /**
+   * Adds a single bean
+   * @param obj  the input bean
+   * @throws IOException If there is a low-level I/O error.
+   */
+  public UpdateResponse addBean(Object obj) throws IOException, 
SolrServerException {
+    return addBean(obj, -1);
+  }
+
+  /**
+   * Adds a single bean specifying max time before it becomes committed
+   * @param obj  the input bean
+   * @param commitWithinMs  max time (in ms) before a commit will happen 
+   * @throws IOException If there is a low-level I/O error.
+   * @since solr 3.5
+   */
+  public UpdateResponse addBean(Object obj, int commitWithinMs) throws 
IOException, SolrServerException {
+    return add(getBinder().toSolrInputDocument(obj),commitWithinMs);
+  }
+
+  /**
+   * Performs an explicit commit, causing pending documents to be committed 
for indexing
+   * <p>
+   * waitFlush=true and waitSearcher=true to be inline with the defaults for 
plain HTTP access
+   * @throws IOException If there is a low-level I/O error.
+   */
+  public UpdateResponse commit() throws SolrServerException, IOException {
+    return commit(true, true);
+  }
+
+  /**
+   * Performs an explicit optimize, causing a merge of all segments to one.
+   * <p>
+   * waitFlush=true and waitSearcher=true to be inline with the defaults for 
plain HTTP access
+   * <p>
+   * Note: In most cases it is not required to do explicit optimize
+   * @throws IOException If there is a low-level I/O error.
+   */
+  public UpdateResponse optimize() throws SolrServerException, IOException {
+    return optimize(true, true, 1);
+  }
+
+  /**
+   * Performs an explicit commit, causing pending documents to be committed 
for indexing
+   * @param waitFlush  block until index changes are flushed to disk
+   * @param waitSearcher  block until a new searcher is opened and registered 
as the main query searcher, making the changes visible 
+   * @throws IOException If there is a low-level I/O error.
+   */
+  public UpdateResponse commit(boolean waitFlush, boolean waitSearcher) throws 
SolrServerException, IOException {
+    return new UpdateRequest().setAction(UpdateRequest.ACTION.COMMIT, 
waitFlush, waitSearcher).process( this );
+  }
+
+  /**
+   * Performs an explicit commit, causing pending documents to be committed 
for indexing
+   * @param waitFlush  block until index changes are flushed to disk
+   * @param waitSearcher  block until a new searcher is opened and registered 
as the main query searcher, making the changes visible
+   * @param softCommit makes index changes visible while neither fsync-ing 
index files nor writing a new index descriptor
+   * @throws IOException If there is a low-level I/O error.
+   */
+  public UpdateResponse commit(boolean waitFlush, boolean waitSearcher, 
boolean softCommit) throws SolrServerException, IOException {
+    return new UpdateRequest().setAction(UpdateRequest.ACTION.COMMIT, 
waitFlush, waitSearcher, softCommit).process( this );
+  }
+
+  /**
+   * Performs an explicit optimize, causing a merge of all segments to one.
+   * <p>
+   * Note: In most cases it is not required to do explicit optimize
+   * @param waitFlush  block until index changes are flushed to disk
+   * @param waitSearcher  block until a new searcher is opened and registered 
as the main query searcher, making the changes visible 
+   * @throws IOException If there is a low-level I/O error.
+   */
+  public UpdateResponse optimize(boolean waitFlush, boolean waitSearcher) 
throws SolrServerException, IOException {
+    return optimize(waitFlush, waitSearcher, 1);
+  }
+
+  /**
+   * Performs an explicit optimize, causing a merge of all segments to one.
+   * <p>
+   * Note: In most cases it is not required to do explicit optimize
+   * @param waitFlush  block until index changes are flushed to disk
+   * @param waitSearcher  block until a new searcher is opened and registered 
as the main query searcher, making the changes visible 
+   * @param maxSegments  optimizes down to at most this number of segments
+   * @throws IOException If there is a low-level I/O error.
+   */
+  public UpdateResponse optimize(boolean waitFlush, boolean waitSearcher, int 
maxSegments) throws SolrServerException, IOException {
+    return new UpdateRequest().setAction(UpdateRequest.ACTION.OPTIMIZE, 
waitFlush, waitSearcher, maxSegments).process( this );
+  }
+
+  /**
+   * Performs a rollback of all non-committed documents pending.
+   * <p>
+   * Note that this is not a true rollback as in databases. Content you have 
previously
+   * added may have been committed due to autoCommit, buffer full, other 
client performing
+   * a commit etc.
+   * @throws IOException If there is a low-level I/O error.
+   */
+  public UpdateResponse rollback() throws SolrServerException, IOException {
+    return new UpdateRequest().rollback().process( this );
+  }
+
+  /**
+   * Deletes a single document by unique ID
+   * @param id  the ID of the document to delete
+   * @throws IOException If there is a low-level I/O error.
+   */
+  public UpdateResponse deleteById(String id) throws SolrServerException, 
IOException {
+    return deleteById(id, -1);
+  }
+
+  /**
+   * Deletes a single document by unique ID, specifying max time before commit
+   * @param id  the ID of the document to delete
+   * @param commitWithinMs  max time (in ms) before a commit will happen 
+   * @throws IOException If there is a low-level I/O error.
+   * @since 3.6
+   */
+  public UpdateResponse deleteById(String id, int commitWithinMs) throws 
SolrServerException, IOException {
+    UpdateRequest req = new UpdateRequest();
+    req.deleteById(id);
+    req.setCommitWithin(commitWithinMs);
+    return req.process(this);
+  }
+
+  /**
+   * Deletes a list of documents by unique ID
+   * @param ids  the list of document IDs to delete 
+   * @throws IOException If there is a low-level I/O error.
+   */
+  public UpdateResponse deleteById(List<String> ids) throws 
SolrServerException, IOException {
+    return deleteById(ids, -1);
+  }
+
+  /**
+   * Deletes a list of documents by unique ID, specifying max time before 
commit
+   * @param ids  the list of document IDs to delete 
+   * @param commitWithinMs  max time (in ms) before a commit will happen 
+   * @throws IOException If there is a low-level I/O error.
+   * @since 3.6
+   */
+  public UpdateResponse deleteById(List<String> ids, int commitWithinMs) 
throws SolrServerException, IOException {
+    UpdateRequest req = new UpdateRequest();
+    req.deleteById(ids);
+    req.setCommitWithin(commitWithinMs);
+    return req.process(this);
+  }
+
+  /**
+   * Deletes documents from the index based on a query
+   * @param query  the query expressing what documents to delete
+   * @throws IOException If there is a low-level I/O error.
+   */
+  public UpdateResponse deleteByQuery(String query) throws 
SolrServerException, IOException {
+    return deleteByQuery(query, -1);
+  }
+
+  /**
+   * Deletes documents from the index based on a query, specifying max time 
before commit
+   * @param query  the query expressing what documents to delete
+   * @param commitWithinMs  max time (in ms) before a commit will happen 
+   * @throws IOException If there is a low-level I/O error.
+   * @since 3.6
+   */
+  public UpdateResponse deleteByQuery(String query, int commitWithinMs) throws 
SolrServerException, IOException {
+    UpdateRequest req = new UpdateRequest();
+    req.deleteByQuery(query);
+    req.setCommitWithin(commitWithinMs);
+    return req.process(this);
+  }
+
+  /**
+   * Issues a ping request to check if the server is alive
+   * @throws IOException If there is a low-level I/O error.
+   */
+  public SolrPingResponse ping() throws SolrServerException, IOException {
+    return new SolrPing().process(this);
+  }
+
+  /**
+   * Performs a query to the Solr server
+   * @param params  an object holding all key/value parameters to send along 
the request
+   */
+  public QueryResponse query(SolrParams params) throws SolrServerException, 
IOException {
+    return new QueryRequest(params).process(this);
+  }
+
+  /**
+   * Performs a query to the Solr server
+   * @param params  an object holding all key/value parameters to send along 
the request
+   * @param method  specifies the HTTP method to use for the request, such as 
GET or POST
+   */
+  public QueryResponse query(SolrParams params, METHOD method) throws 
SolrServerException, IOException {
+    return new QueryRequest(params, method).process(this);
+  }
+
+  /**
+   * Query solr, and stream the results.  Unlike the standard query, this will 
+   * send events for each Document rather then add them to the QueryResponse.
+   *
+   * Although this function returns a 'QueryResponse' it should be used with 
care
+   * since it excludes anything that was passed to callback.  Also note that
+   * future version may pass even more info to the callback and may not return 
+   * the results in the QueryResponse.
+   *
+   * @since solr 4.0
+   */
+  public QueryResponse queryAndStreamResponse(SolrParams params, 
StreamingResponseCallback callback) throws SolrServerException, IOException
+  {
+    ResponseParser parser = new StreamingBinaryResponseParser(callback);
+    QueryRequest req = new QueryRequest(params);
+    req.setStreamingResponseCallback(callback);
+    req.setResponseParser(parser);
+    return req.process(this);
+  }
+
+  /**
+   * Retrieves the SolrDocument associated with the given identifier.
+   *
+   * @return retrieved SolrDocument, null if no document is found.
+   */
+  public SolrDocument getById(String id) throws SolrServerException, 
IOException {
+    return getById(id, null);
+  }
+
+  /**
+   * Retrieves the SolrDocument associated with the given identifier and uses
+   * the SolrParams to execute the request.
+   *
+   * @return retrieved SolrDocument, null if no document is found.
+   */
+  public SolrDocument getById(String id, SolrParams params) throws 
SolrServerException, IOException {
+    SolrDocumentList docs = getById(Arrays.asList(id), params);
+    if (!docs.isEmpty()) {
+      return docs.get(0);
+    }
+    return null;
+  }
+
+  /**
+   * Retrieves the SolrDocuments associated with the given identifiers.
+   * If a document was not found, it will not be added to the SolrDocumentList.
+   */
+  public SolrDocumentList getById(Collection<String> ids) throws 
SolrServerException, IOException {
+    return getById(ids, null);
+  }
+
+  /**
+   * Retrieves the SolrDocuments associated with the given identifiers and uses
+   * the SolrParams to execute the request.
+   * If a document was not found, it will not be added to the SolrDocumentList.
+   */
+  public SolrDocumentList getById(Collection<String> ids, SolrParams params) 
throws SolrServerException, IOException {
+    if (ids == null || ids.isEmpty()) {
+      throw new IllegalArgumentException("Must provide an identifier of a 
document to retrieve.");
+    }
+
+    ModifiableSolrParams reqParams = new ModifiableSolrParams(params);
+    if (StringUtils.isEmpty(reqParams.get(CommonParams.QT))) {
+      reqParams.set(CommonParams.QT, "/get");
+    }
+    reqParams.set("ids", (String[]) ids.toArray());
+
+    return query(reqParams).getResults();
+  }
+  
+  /**
+   * SolrServer implementations need to implement how a request is actually 
processed
+   */
+  public abstract NamedList<Object> request(final SolrRequest request) throws 
SolrServerException, IOException;
+
+  public DocumentObjectBinder getBinder() {
+    if(binder == null){
+      binder = new DocumentObjectBinder();
+    }
+    return binder;
+  }
+
+  /**
+   * Release allocated resources.
+   *
+   * @since solr 4.0
+   * @deprecated Use close() instead.
+   */
+  @Deprecated
+  public abstract void shutdown();
+
+  //@SuppressWarnings("deprecation")
+  public void close() throws IOException {
+    shutdown();
+  }
+}

Reply via email to