Repository: incubator-ranger
Updated Branches:
  refs/heads/master 0699c3401 -> cb58449b6


RANGER-901: fields that track policies/tags in a service are moved from 
x_service to x_service_version_info table

Signed-off-by: Madhan Neethiraj <[email protected]>


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

Branch: refs/heads/master
Commit: cb58449b6b61d65b722f03da6bf9b65a1f5c6fbc
Parents: 0699c34
Author: Abhay Kulkarni <[email protected]>
Authored: Thu Apr 7 12:17:04 2016 -0700
Committer: Madhan Neethiraj <[email protected]>
Committed: Thu Apr 21 12:44:29 2016 -0700

----------------------------------------------------------------------
 .../contextenricher/RangerTagEnricher.java      |   2 +-
 .../mysql/patches/022-split-service-table.sql   |  29 +++
 .../oracle/patches/022-split-service-table.sql  |  36 ++++
 .../patches/022-split-service-table.sql         |  32 +++
 .../patches/022-split-service-table.sql         |  31 +++
 .../patches/022-split-service-table.sql         |  55 ++++++
 .../org/apache/ranger/biz/ServiceDBStore.java   | 123 +++++++++---
 .../java/org/apache/ranger/biz/TagDBStore.java  |  23 ++-
 .../org/apache/ranger/common/AppConstants.java  |  10 +-
 .../apache/ranger/db/RangerDaoManagerBase.java  |  11 +-
 .../java/org/apache/ranger/db/XXServiceDao.java |  65 ------
 .../ranger/db/XXServiceVersionInfoDao.java      | 131 ++++++++++++
 .../ranger/entity/XXServiceVersionInfo.java     | 197 +++++++++++++++++++
 .../PatchForServiceVersionInfo_J10004.java      | 122 ++++++++++++
 .../service/RangerServiceResourceService.java   |   2 +-
 .../ranger/service/RangerServiceService.java    |  35 +++-
 .../service/RangerServiceServiceBase.java       |  24 ++-
 .../ranger/service/RangerTagDefService.java     |   2 +-
 .../service/RangerTagResourceMapService.java    |   6 +-
 .../apache/ranger/service/RangerTagService.java |   2 +-
 .../resources/META-INF/jpa_named_queries.xml    |  30 ++-
 .../apache/ranger/biz/TestServiceDBStore.java   |  43 ++++
 .../service/TestRangerServiceService.java       |  41 ++++
 .../service/TestRangerServiceServiceBase.java   |  15 ++
 24 files changed, 941 insertions(+), 126 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/cb58449b/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerTagEnricher.java
----------------------------------------------------------------------
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerTagEnricher.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerTagEnricher.java
index 9d3d201..206385c 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerTagEnricher.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerTagEnricher.java
@@ -339,8 +339,8 @@ public class RangerTagEnricher extends 
RangerAbstractContextEnricher {
 
                                if (serviceTags != null) {
                                        tagEnricher.setServiceTags(serviceTags);
+                                       lastKnownVersion = 
serviceTags.getTagVersion() == null ? -1L : serviceTags.getTagVersion();
                                        
LOG.info("RangerTagRefresher.populateTags() - Updated tags-cache to new version 
of tags, lastKnownVersion=" + lastKnownVersion + "; newVersion=" + 
serviceTags.getTagVersion());
-                                       lastKnownVersion = 
serviceTags.getTagVersion();
                                        hasProvidedTagsToReceiver = true;
                                } else {
                                        if (LOG.isDebugEnabled()) {

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/cb58449b/security-admin/db/mysql/patches/022-split-service-table.sql
----------------------------------------------------------------------
diff --git a/security-admin/db/mysql/patches/022-split-service-table.sql 
b/security-admin/db/mysql/patches/022-split-service-table.sql
new file mode 100644
index 0000000..962e715
--- /dev/null
+++ b/security-admin/db/mysql/patches/022-split-service-table.sql
@@ -0,0 +1,29 @@
+-- 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.
+
+DROP TABLE IF EXISTS `x_service_version_info`;
+
+CREATE TABLE `x_service_version_info` (
+`id` bigint(20) NOT NULL AUTO_INCREMENT,
+`service_id` bigint(20) NOT NULL,
+`policy_version` bigint(20) NOT NULL DEFAULT 0,
+`policy_update_time` datetime DEFAULT NULL,
+`tag_version` bigint(20) NOT NULL DEFAULT 0,
+`tag_update_time` datetime DEFAULT NULL,
+primary key (`id`),
+CONSTRAINT `x_service_version_info_service_id` FOREIGN KEY (`service_id`) 
REFERENCES `x_service` (`id`) 
+);
+CREATE INDEX x_service_version_info_IDX_service_id ON 
x_service_version_info(service_id);
+

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/cb58449b/security-admin/db/oracle/patches/022-split-service-table.sql
----------------------------------------------------------------------
diff --git a/security-admin/db/oracle/patches/022-split-service-table.sql 
b/security-admin/db/oracle/patches/022-split-service-table.sql
new file mode 100644
index 0000000..7059be2
--- /dev/null
+++ b/security-admin/db/oracle/patches/022-split-service-table.sql
@@ -0,0 +1,36 @@
+-- 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.
+
+/
+DROP SEQUENCE IF EXISTS x_service_version_info_seq;
+
+CREATE SEQUENCE x_service_version_info_seq START WITH 1 INCREMENT BY 1 NOCACHE 
NOCYCLE;
+
+DROP TABLE IF EXISTS `x_service_version_info`;
+
+CREATE TABLE `x_service_version_info` (
+id NUMBER(20) NOT NULL,
+service_id NUMBER(20) NOT NULL,
+policy_version NUMBER(20) NOT NULL DEFAULT 0,
+policy_update_time DATE DEFAULT NULL NULL,
+tag_version NUMBER(20) NOT NULL DEFAULT 0,
+tag_update_time DATE DEFAULT NULL NULL,
+primary key (id),
+CONSTRAINT x_service_version_info_service_id FOREIGN KEY (service_id) 
REFERENCES x_service(id) 
+);
+CREATE INDEX x_service_version_info_IDX_service_id ON 
x_service_version_info(service_id);
+
+commit;
+

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/cb58449b/security-admin/db/postgres/patches/022-split-service-table.sql
----------------------------------------------------------------------
diff --git a/security-admin/db/postgres/patches/022-split-service-table.sql 
b/security-admin/db/postgres/patches/022-split-service-table.sql
new file mode 100644
index 0000000..5fe1ef2
--- /dev/null
+++ b/security-admin/db/postgres/patches/022-split-service-table.sql
@@ -0,0 +1,32 @@
+-- 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.
+
+DROP TABLE IF EXISTS x_service_version_info;
+DROP SEQUENCE IF EXISTS x_service_version_info_seq;
+
+CREATE SEQUENCE x_service_version_info_seq;
+
+CREATE TABLE x_service_version_info (
+ id BIGINT DEFAULT nextval('x_service_version_info_seq'::regclass),
+service_id bigint NOT NULL,
+policy_version bigint NOT NULL DEFAULT '0',
+policy_update_time TIMESTAMP DEFAULT NULL,
+tag_version bigint NOT NULL DEFAULT '0',
+tag_update_time TIMESTAMP DEFAULT NULL,
+primary key (id),
+CONSTRAINT x_service_version_info_service_id FOREIGN KEY (service_id) 
REFERENCES x_service (id) 
+);
+CREATE INDEX x_service_version_info_IDX_service_id ON 
x_service_version_info(service_id);
+

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/cb58449b/security-admin/db/sqlanywhere/patches/022-split-service-table.sql
----------------------------------------------------------------------
diff --git a/security-admin/db/sqlanywhere/patches/022-split-service-table.sql 
b/security-admin/db/sqlanywhere/patches/022-split-service-table.sql
new file mode 100644
index 0000000..d32966d
--- /dev/null
+++ b/security-admin/db/sqlanywhere/patches/022-split-service-table.sql
@@ -0,0 +1,31 @@
+-- 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.
+
+CREATE TABLE dbo.x_service_version_info(
+       id bigint IDENTITY NOT NULL,
+       service_id bigint NOT NULL,
+       policy_version bigint NOT NULL DEFAULT 0,
+       policy_update_time datetime DEFAULT NULL NULL,
+       tag_version bigint NOT NULL DEFAULT 0,
+       tag_update_time datetime DEFAULT NULL NULL,
+       CONSTRAINT x_service_version_info_PK_id PRIMARY KEY CLUSTERED(id)
+)
+GO
+ALTER TABLE dbo.x_service_version_info ADD CONSTRAINT 
x_service_version_info_service_id FOREIGN KEY(service_id) REFERENCES 
dbo.x_service (id)
+GO
+CREATE NONCLUSTERED INDEX x_service_version_info_IDX_service_id ON 
dbo.x_service_version_info(service_id ASC)
+GO
+
+exit

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/cb58449b/security-admin/db/sqlserver/patches/022-split-service-table.sql
----------------------------------------------------------------------
diff --git a/security-admin/db/sqlserver/patches/022-split-service-table.sql 
b/security-admin/db/sqlserver/patches/022-split-service-table.sql
new file mode 100644
index 0000000..3be0416
--- /dev/null
+++ b/security-admin/db/sqlserver/patches/022-split-service-table.sql
@@ -0,0 +1,55 @@
+-- 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.
+
+GO
+IF (OBJECT_ID('x_service_version_info_service_id') IS NOT NULL)
+BEGIN
+    ALTER TABLE [dbo].[x_service_version_info] DROP CONSTRAINT 
x_service_version_info_service_id
+END
+GO
+IF (OBJECT_ID('x_service_version_info') IS NOT NULL)
+BEGIN
+    DROP TABLE [dbo].[x_service_version_info]
+END
+GO
+SET ANSI_NULLS ON
+GO
+SET QUOTED_IDENTIFIER ON
+GO
+SET ANSI_PADDING ON
+GO
+CREATE TABLE [dbo].[x_service_version_info](
+       [id] [bigint] IDENTITY(1,1) NOT NULL,
+       [service_id] [bigint] NOT NULL,
+       [policy_version] [bigint] NOT NULL DEFAULT 0,
+       [policy_update_time] [datetime2] DEFAULT NULL NULL,
+       [tag_version] [bigint] NOT NULL DEFAULT 0,
+       [tag_update_time] [datetime2] DEFAULT NULL NULL,
+       PRIMARY KEY CLUSTERED 
+(
+       [id] ASC
+)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
+) ON [PRIMARY]
+GO
+ALTER TABLE [dbo].[x_service_version_info] WITH CHECK ADD CONSTRAINT 
[x_service_version_info_service_id] FOREIGN KEY([service_id]) REFERENCES 
[dbo].[x_service] ([id])
+GO
+CREATE NONCLUSTERED INDEX [x_service_version_info_IDX_service_id] ON 
[x_service_version_info]
+(
+   [service_id] ASC
+)
+WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE 
= OFF) ON [PRIMARY]
+GO
+
+exit

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/cb58449b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java 
b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
index 7ef950a..53b33b2 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
@@ -1404,10 +1404,6 @@ public class ServiceDBStore extends AbstractServiceStore 
{
                        service.setCreateTime(existing.getCreateTime());
                        service.setGuid(existing.getGuid());
                        service.setVersion(existing.getVersion());
-                       
service.setPolicyUpdateTime(existing.getPolicyUpdateTime());
-                       service.setPolicyVersion(existing.getPolicyVersion());
-                       service.setTagVersion(existing.getTagVersion());
-                       service.setTagUpdateTime(existing.getTagUpdateTime());
 
                        service = svcService.update(service);
 
@@ -2052,7 +2048,13 @@ public class ServiceDBStore extends AbstractServiceStore 
{
                        throw new Exception("service does not exist. name=" + 
serviceName);
                }
 
-               if (lastKnownVersion == null || serviceDbObj.getPolicyVersion() 
== null || !lastKnownVersion.equals(serviceDbObj.getPolicyVersion())) {
+               XXServiceVersionInfo serviceVersionInfoDbObj = 
daoMgr.getXXServiceVersionInfo().findByServiceName(serviceName);
+
+               if (serviceVersionInfoDbObj == null) {
+                       LOG.warn("serviceVersionInfo does not exist. name=" + 
serviceName);
+               }
+
+               if (lastKnownVersion == null || serviceVersionInfoDbObj == null 
|| serviceVersionInfoDbObj.getPolicyVersion() == null || 
!lastKnownVersion.equals(serviceVersionInfoDbObj.getPolicyVersion())) {
                        ret = 
RangerServicePoliciesCache.getInstance().getServicePolicies(serviceName, this);
                }
 
@@ -2075,9 +2077,9 @@ public class ServiceDBStore extends AbstractServiceStore {
        @Override
        public Long getServicePolicyVersion(String serviceName) {
 
-               XXService serviceDbObj = 
daoMgr.getXXService().findByName(serviceName);
+               XXServiceVersionInfo serviceVersionInfoDbObj = 
daoMgr.getXXServiceVersionInfo().findByServiceName(serviceName);
 
-               return serviceDbObj != null ? serviceDbObj.getPolicyVersion() : 
null;
+               return serviceVersionInfoDbObj != null ? 
serviceVersionInfoDbObj.getPolicyVersion() : null;
        }
 
        @Override
@@ -2094,6 +2096,12 @@ public class ServiceDBStore extends AbstractServiceStore 
{
                        throw new Exception("service does not exist. name=" + 
serviceName);
                }
 
+               XXServiceVersionInfo serviceVersionInfoDbObj = 
daoMgr.getXXServiceVersionInfo().findByServiceName(serviceName);
+
+               if (serviceVersionInfoDbObj == null) {
+                       LOG.warn("serviceVersionInfo does not exist. name=" + 
serviceName);
+               }
+
                RangerServiceDef serviceDef = 
getServiceDef(serviceDbObj.getType());
 
                if (serviceDef == null) {
@@ -2113,12 +2121,17 @@ public class ServiceDBStore extends 
AbstractServiceStore {
                                                throw new 
Exception("service-def does not exist. id=" + tagServiceDbObj.getType());
                                        }
 
+                                       XXServiceVersionInfo 
tagServiceVersionInfoDbObj = 
daoMgr.getXXServiceVersionInfo().findByServiceId(serviceDbObj.getTagService());
+
+                                       if (tagServiceVersionInfoDbObj == null) 
{
+                                               LOG.warn("serviceVersionInfo 
does not exist. name=" + tagServiceDbObj.getName());
+                                       }
                                        tagPolicies = new 
ServicePolicies.TagPolicies();
 
                                        
tagPolicies.setServiceId(tagServiceDbObj.getId());
                                        
tagPolicies.setServiceName(tagServiceDbObj.getName());
-                                       
tagPolicies.setPolicyVersion(tagServiceDbObj.getPolicyVersion());
-                                       
tagPolicies.setPolicyUpdateTime(tagServiceDbObj.getPolicyUpdateTime());
+                                       
tagPolicies.setPolicyVersion(tagServiceVersionInfoDbObj == null ? null : 
tagServiceVersionInfoDbObj.getPolicyVersion());
+                                       
tagPolicies.setPolicyUpdateTime(tagServiceVersionInfoDbObj == null ? null : 
tagServiceVersionInfoDbObj.getPolicyUpdateTime());
                                        
tagPolicies.setPolicies(getServicePoliciesFromDb(tagServiceDbObj));
                                        
tagPolicies.setServiceDef(tagServiceDef);
                                }
@@ -2134,8 +2147,8 @@ public class ServiceDBStore extends AbstractServiceStore {
 
                ret.setServiceId(serviceDbObj.getId());
                ret.setServiceName(serviceDbObj.getName());
-               ret.setPolicyVersion(serviceDbObj.getPolicyVersion());
-               ret.setPolicyUpdateTime(serviceDbObj.getPolicyUpdateTime());
+               ret.setPolicyVersion(serviceVersionInfoDbObj == null ? null : 
serviceVersionInfoDbObj.getPolicyVersion());
+               ret.setPolicyUpdateTime(serviceVersionInfoDbObj == null ? null 
: serviceVersionInfoDbObj.getPolicyUpdateTime());
                ret.setPolicies(policies);
                ret.setServiceDef(serviceDef);
                ret.setTagPolicies(tagPolicies);
@@ -2404,20 +2417,34 @@ public class ServiceDBStore extends 
AbstractServiceStore {
                XXServiceDao serviceDao = daoMgr.getXXService();
 
                XXService serviceDbObj = serviceDao.getById(service.getId());
-
                if(serviceDbObj == null) {
                        LOG.warn("updatePolicyVersion(serviceId=" + 
service.getId() + "): service not found");
 
                        return;
                }
 
-               
service.setPolicyVersion(getNextVersion(service.getPolicyVersion()));
-               service.setPolicyUpdateTime(new Date());
+               XXServiceVersionInfoDao serviceVersionInfoDao = 
daoMgr.getXXServiceVersionInfo();
+
+               XXServiceVersionInfo serviceVersionInfoDbObj = 
serviceVersionInfoDao.findByServiceId(service.getId());
+
+               if(serviceVersionInfoDbObj != null) {
+                       
serviceVersionInfoDbObj.setPolicyVersion(getNextVersion(serviceVersionInfoDbObj.getPolicyVersion()));
+                       serviceVersionInfoDbObj.setPolicyUpdateTime(new Date());
 
-               serviceDbObj.setPolicyVersion(service.getPolicyVersion());
-               serviceDbObj.setPolicyUpdateTime(service.getPolicyUpdateTime());
+                       serviceVersionInfoDao.update(serviceVersionInfoDbObj);
 
-               serviceDao.update(serviceDbObj);
+               } else {
+                       LOG.warn("updatePolicyVersion(service=" + 
serviceDbObj.getName() + "): serviceVersionInfo not found, creating it..");
+
+                       serviceVersionInfoDbObj = new XXServiceVersionInfo();
+                       
serviceVersionInfoDbObj.setServiceId(serviceDbObj.getId());
+                       
serviceVersionInfoDbObj.setPolicyVersion(getNextVersion(serviceDbObj.getPolicyVersion()));
+                       
serviceVersionInfoDbObj.setTagVersion(serviceDbObj.getTagVersion());
+                       serviceVersionInfoDbObj.setPolicyUpdateTime(new Date());
+                       
serviceVersionInfoDbObj.setTagUpdateTime(serviceDbObj.getTagUpdateTime());
+
+                       serviceVersionInfoDao.create(serviceVersionInfoDbObj);
+               }
 
                // if this is a tag service, update all services that refer to 
this tag service
                // so that next policy-download from plugins will get updated 
tag policies
@@ -2427,10 +2454,25 @@ public class ServiceDBStore extends 
AbstractServiceStore {
 
                        if(CollectionUtils.isNotEmpty(referringServices)) {
                                for(XXService referringService : 
referringServices) {
-                                       
referringService.setPolicyVersion(getNextVersion(referringService.getPolicyVersion()));
-                                       
referringService.setPolicyUpdateTime(service.getPolicyUpdateTime());
 
-                                       serviceDao.update(referringService);
+                                       serviceVersionInfoDbObj = 
serviceVersionInfoDao.findByServiceId(referringService.getId());
+                                       if (serviceVersionInfoDbObj != null) {
+
+                                               
serviceVersionInfoDbObj.setPolicyVersion(getNextVersion(serviceVersionInfoDbObj.getPolicyVersion()));
+                                               
serviceVersionInfoDbObj.setPolicyUpdateTime(service.getPolicyUpdateTime());
+
+                                               
serviceVersionInfoDao.update(serviceVersionInfoDbObj);
+                                       } else {
+                                               
LOG.warn("updatePolicyVersion(service=" + referringService.getName() + "): 
serviceVersionInfo not found, creating it..");
+                                               serviceVersionInfoDbObj = new 
XXServiceVersionInfo();
+                                               
serviceVersionInfoDbObj.setServiceId(referringService.getId());
+                                               
serviceVersionInfoDbObj.setPolicyVersion(getNextVersion(referringService.getPolicyVersion()));
+                                               
serviceVersionInfoDbObj.setTagVersion(referringService.getTagVersion());
+                                               
serviceVersionInfoDbObj.setPolicyUpdateTime(new Date());
+                                               
serviceVersionInfoDbObj.setTagUpdateTime(referringService.getTagUpdateTime());
+
+                                               
serviceVersionInfoDao.create(serviceVersionInfoDbObj);
+                                       }
                                }
                        }
                }
@@ -2766,25 +2808,52 @@ public class ServiceDBStore extends 
AbstractServiceStore {
                boolean isTagServiceDef = 
StringUtils.equals(serviceDef.getName(), 
EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_TAG_NAME);
 
                XXServiceDao serviceDao = daoMgr.getXXService();
+               XXServiceVersionInfoDao serviceVersionInfoDao = 
daoMgr.getXXServiceVersionInfo();
 
                List<XXService> services = 
serviceDao.findByServiceDefId(serviceDef.getId());
 
                if(CollectionUtils.isNotEmpty(services)) {
                        for(XXService service : services) {
-                               
service.setPolicyVersion(getNextVersion(service.getPolicyVersion()));
-                               
service.setPolicyUpdateTime(serviceDef.getUpdateTime());
+                               XXServiceVersionInfo serviceVersionInfo = 
serviceVersionInfoDao.findByServiceId(service.getId());
+                               if (serviceVersionInfo != null) {
+                                       
serviceVersionInfo.setPolicyVersion(getNextVersion(serviceVersionInfo.getPolicyVersion()));
+                                       
serviceVersionInfo.setPolicyUpdateTime(serviceDef.getUpdateTime());
 
-                               serviceDao.update(service);
+                                       
serviceVersionInfoDao.update(serviceVersionInfo);
+                               } else {
+                                       
LOG.warn("updateServicesForServiceDefUpdate(service=" + service.getName() + "): 
serviceVersionInfo not found, creating it..");
+                                       serviceVersionInfo = new 
XXServiceVersionInfo();
+                                       
serviceVersionInfo.setServiceId(service.getId());
+                                       
serviceVersionInfo.setPolicyVersion(getNextVersion(service.getPolicyVersion()));
+                                       
serviceVersionInfo.setTagVersion(service.getTagVersion());
+                                       
serviceVersionInfo.setPolicyUpdateTime(new Date());
+                                       
serviceVersionInfo.setTagUpdateTime(service.getTagUpdateTime());
+
+                                       
serviceVersionInfoDao.create(serviceVersionInfo);
+                               }
 
                                if(isTagServiceDef) {
                                        List<XXService> referrringServices = 
serviceDao.findByTagServiceId(service.getId());
 
                                        
if(CollectionUtils.isNotEmpty(referrringServices)) {
                                                for(XXService referringService 
: referrringServices) {
-                                                       
referringService.setPolicyVersion(getNextVersion(referringService.getPolicyVersion()));
-                                                       
referringService.setPolicyUpdateTime(serviceDef.getUpdateTime());
-
-                                                       
serviceDao.update(referringService);
+                                                       serviceVersionInfo = 
serviceVersionInfoDao.findByServiceId(referringService.getId());
+                                                       if (serviceVersionInfo 
!= null) {
+                                                               
serviceVersionInfo.setPolicyVersion(getNextVersion(serviceVersionInfo.getPolicyVersion()));
+                                                               
serviceVersionInfo.setPolicyUpdateTime(serviceDef.getUpdateTime());
+
+                                                               
serviceVersionInfoDao.update(serviceVersionInfo);
+                                                       } else {
+                                                               
LOG.warn("updateServicesForServiceDefUpdate(service=" + 
referringService.getName() + "): serviceVersionInfo not found, creating it..");
+                                                               
serviceVersionInfo = new XXServiceVersionInfo();
+                                                               
serviceVersionInfo.setServiceId(referringService.getId());
+                                                               
serviceVersionInfo.setPolicyVersion(getNextVersion(referringService.getPolicyVersion()));
+                                                               
serviceVersionInfo.setTagVersion(referringService.getTagVersion());
+                                                               
serviceVersionInfo.setPolicyUpdateTime(new Date());
+                                                               
serviceVersionInfo.setTagUpdateTime(referringService.getTagUpdateTime());
+
+                                                               
serviceVersionInfoDao.create(serviceVersionInfo);
+                                                       }
                                                }
                                        }
                                }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/cb58449b/security-admin/src/main/java/org/apache/ranger/biz/TagDBStore.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/biz/TagDBStore.java 
b/security-admin/src/main/java/org/apache/ranger/biz/TagDBStore.java
index e11dad6..5f298d9 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/TagDBStore.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/TagDBStore.java
@@ -39,6 +39,7 @@ import org.apache.ranger.entity.XXResourceDef;
 import org.apache.ranger.entity.XXService;
 import org.apache.ranger.entity.XXServiceDef;
 import org.apache.ranger.entity.XXServiceResource;
+import org.apache.ranger.entity.XXServiceVersionInfo;
 import org.apache.ranger.entity.XXTag;
 import org.apache.ranger.entity.XXTagAttribute;
 import org.apache.ranger.entity.XXTagAttributeDef;
@@ -909,7 +910,13 @@ public class TagDBStore extends AbstractTagStore {
                        throw new Exception("service does not exist. name=" + 
serviceName);
                }
 
-               if (lastKnownVersion == null || xxService.getTagVersion() == 
null || !lastKnownVersion.equals(xxService.getTagVersion())) {
+               XXServiceVersionInfo serviceVersionInfoDbObj = 
daoManager.getXXServiceVersionInfo().findByServiceName(serviceName);
+
+               if (serviceVersionInfoDbObj == null) {
+                       LOG.warn("serviceVersionInfo does not exist. name=" + 
serviceName);
+               }
+
+               if (lastKnownVersion == null || serviceVersionInfoDbObj == null 
|| serviceVersionInfoDbObj.getTagVersion() == null || 
!lastKnownVersion.equals(serviceVersionInfoDbObj.getTagVersion())) {
                        ret = 
RangerServiceTagsCache.getInstance().getServiceTags(serviceName, this);
                }
 
@@ -932,9 +939,9 @@ public class TagDBStore extends AbstractTagStore {
        @Override
        public Long getTagVersion(String serviceName) {
 
-               XXService serviceDbObj = 
daoManager.getXXService().findByName(serviceName);
+               XXServiceVersionInfo serviceVersionInfoDbObj = 
daoManager.getXXServiceVersionInfo().findByServiceName(serviceName);
 
-               return serviceDbObj != null ? serviceDbObj.getTagVersion() : 
null;
+               return serviceVersionInfoDbObj != null ? 
serviceVersionInfoDbObj.getTagVersion() : null;
        }
 
        @Override
@@ -952,6 +959,12 @@ public class TagDBStore extends AbstractTagStore {
                        throw new Exception("service does not exist. name=" + 
serviceName);
                }
 
+               XXServiceVersionInfo serviceVersionInfoDbObj = 
daoManager.getXXServiceVersionInfo().findByServiceName(serviceName);
+
+               if (serviceVersionInfoDbObj == null) {
+                       LOG.warn("serviceVersionInfo does not exist for service 
[" + serviceName + "]");
+               }
+
                RangerServiceDef serviceDef = 
svcStore.getServiceDef(xxService.getType());
 
                if (serviceDef == null) {
@@ -992,8 +1005,8 @@ public class TagDBStore extends AbstractTagStore {
                ret = new ServiceTags();
 
                ret.setServiceName(xxService.getName());
-               ret.setTagVersion(xxService.getTagVersion());
-               ret.setTagUpdateTime(xxService.getTagUpdateTime());
+               ret.setTagVersion(serviceVersionInfoDbObj == null ? null : 
serviceVersionInfoDbObj.getTagVersion());
+               ret.setTagUpdateTime(serviceVersionInfoDbObj == null ? null : 
serviceVersionInfoDbObj.getTagUpdateTime());
                ret.setTagDefinitions(tagDefMap);
                ret.setTags(tagMap);
                ret.setServiceResources(resources);

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/cb58449b/security-admin/src/main/java/org/apache/ranger/common/AppConstants.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/common/AppConstants.java 
b/security-admin/src/main/java/org/apache/ranger/common/AppConstants.java
index 3851069..e9c7ac0 100644
--- a/security-admin/src/main/java/org/apache/ranger/common/AppConstants.java
+++ b/security-admin/src/main/java/org/apache/ranger/common/AppConstants.java
@@ -589,9 +589,14 @@ public class AppConstants extends RangerCommonEnums {
        public static final int CLASS_TYPE_RANGER_POLICY_ITEM_ROWFILTER_INFO = 
1051;
 
        /**
+        * CLASS_TYPE_XA_SERVICE_VERSION_INFO is an element of enum ClassTypes. 
Its value is "CLASS_TYPE_XA_SERVICE_VERSION_INFO".
+        */
+       public static final int CLASS_TYPE_XA_SERVICE_VERSION_INFO = 1052;
+
+       /**
         * Max value for enum ClassTypes_MAX
         */
-       public static final int ClassTypes_MAX = 1051;
+       public static final int ClassTypes_MAX = 1052;
        
        /***************************************************************
         * Enum values for Default SortOrder
@@ -953,6 +958,9 @@ public class AppConstants extends RangerCommonEnums {
                if( elementValue == 1033 ) {
                        return "XA Service Def"; //CLASS_TYPE_XA_SERVICE_DEF
                }
+               if( elementValue == 1052 ) {
+                       return "XA Service Version Info"; 
//CLASS_TYPE_XA_SERVICE_VERSION_INFO
+               }
                return null;
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/cb58449b/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 6559850..21efcf9 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
@@ -195,7 +195,9 @@ public abstract class RangerDaoManagerBase {
                if (classType== 
AppConstants.CLASS_TYPE_RANGER_POLICY_ITEM_ROWFILTER_INFO) {
                        return getXXPolicyItemRowFilterInfo();
                }
-
+               if (classType== 
AppConstants.CLASS_TYPE_XA_SERVICE_VERSION_INFO) {
+                       return getXXServiceVersionInfo();
+               }
                logger.error("No DaoManager found for classType=" + classType, 
new Throwable());
                return null;
        }
@@ -358,7 +360,9 @@ public abstract class RangerDaoManagerBase {
                if (className.equals("XXPolicyItemRowFilterInfo")) {
                        return getXXPolicyItemRowFilterInfo();
                }
-
+               if (className.equals("XXServiceVersionInfo")) {
+                       return getXXServiceVersionInfo();
+               }
                logger.error("No DaoManager found for className=" + className, 
new Throwable());
                return null;
        }
@@ -576,5 +580,8 @@ public abstract class RangerDaoManagerBase {
                return new XXPolicyItemRowFilterInfoDao(this);
        }
 
+       public XXServiceVersionInfoDao getXXServiceVersionInfo() {
+               return new XXServiceVersionInfoDao(this);
+       }
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/cb58449b/security-admin/src/main/java/org/apache/ranger/db/XXServiceDao.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/db/XXServiceDao.java 
b/security-admin/src/main/java/org/apache/ranger/db/XXServiceDao.java
index 54c48dc..240345f 100644
--- a/security-admin/src/main/java/org/apache/ranger/db/XXServiceDao.java
+++ b/security-admin/src/main/java/org/apache/ranger/db/XXServiceDao.java
@@ -18,12 +18,10 @@
 package org.apache.ranger.db;
 
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
 
 import javax.persistence.NoResultException;
 
-import org.apache.commons.collections.CollectionUtils;
 import org.apache.ranger.common.db.BaseDao;
 import org.apache.ranger.entity.XXService;
 
@@ -83,48 +81,6 @@ public class XXServiceDao extends BaseDao<XXService> {
                }
        }
 
-       public void updateServiceForServiceResourceUpdate(Long resourceId, Date 
updateTime) {
-               if (resourceId == null) {
-                       return;
-               }
-
-               try {
-                       List<XXService> services = 
getEntityManager().createNamedQuery("XXService.findByServiceResourceId", 
tClass).setParameter("resourceId", resourceId).getResultList();
-
-                       updateTagVersionAndTagUpdateTime(services, updateTime);
-               } catch (NoResultException e) {
-                       return;
-               }
-       }
-
-       public void updateServiceForTagUpdate(Long tagId, Date updateTime) {
-               if (tagId == null) {
-                       return;
-               }
-
-               try {
-                       List<XXService> services = 
getEntityManager().createNamedQuery("XXService.findByTagId", 
tClass).setParameter("tagId", tagId).getResultList();
-
-                       updateTagVersionAndTagUpdateTime(services, updateTime);
-               } catch (NoResultException e) {
-                       return;
-               }
-       }
-
-       public void updateServiceForTagDefUpdate(Long tagDefId, Date 
updateTime) {
-               if (tagDefId == null) {
-                       return;
-               }
-
-               try {
-                       List<XXService> services = 
getEntityManager().createNamedQuery("XXService.findByTagDefId", 
tClass).setParameter("tagDefId", tagDefId).getResultList();
-
-                       updateTagVersionAndTagUpdateTime(services, updateTime);
-               } catch (NoResultException e) {
-                       return;
-               }
-       }
-
        public void updateSequence() {
                Long maxId = getMaxIdOfXXService();
 
@@ -134,25 +90,4 @@ public class XXServiceDao extends BaseDao<XXService> {
 
                updateSequence("X_SERVICE_SEQ", maxId + 1);
        }
-
-       private void updateTagVersionAndTagUpdateTime(List<XXService> services, 
Date updateTime) {
-               if(CollectionUtils.isEmpty(services)) {
-                       return;
-               }
-
-               if(updateTime == null) {
-                       updateTime = new Date();
-               }
-
-               for(XXService service : services) {
-                       Long currentTagVersion = service.getTagVersion();
-
-                       if(currentTagVersion == null) {
-                               currentTagVersion = Long.valueOf(0);
-                       }
-
-                       service.setTagVersion(currentTagVersion + 1);
-                       service.setTagUpdateTime(updateTime);
-               }
-       }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/cb58449b/security-admin/src/main/java/org/apache/ranger/db/XXServiceVersionInfoDao.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/db/XXServiceVersionInfoDao.java
 
b/security-admin/src/main/java/org/apache/ranger/db/XXServiceVersionInfoDao.java
new file mode 100644
index 0000000..5291045
--- /dev/null
+++ 
b/security-admin/src/main/java/org/apache/ranger/db/XXServiceVersionInfoDao.java
@@ -0,0 +1,131 @@
+/*
+ * 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.db;
+
+import java.util.Date;
+import java.util.List;
+
+import javax.persistence.NoResultException;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.ranger.common.db.BaseDao;
+import org.apache.ranger.entity.XXServiceVersionInfo;
+
+/**
+ */
+
+public class XXServiceVersionInfoDao extends BaseDao<XXServiceVersionInfo> {
+       /**
+        * Default Constructor
+        */
+       public XXServiceVersionInfoDao(RangerDaoManagerBase daoManager) {
+               super(daoManager);
+       }
+
+       public XXServiceVersionInfo findByServiceName(String serviceName) {
+               if (serviceName == null) {
+                       return null;
+               }
+               try {
+                       return getEntityManager()
+                                       
.createNamedQuery("XXServiceVersionInfo.findByServiceName", tClass)
+                                       .setParameter("serviceName", 
serviceName).getSingleResult();
+               } catch (NoResultException e) {
+                       return null;
+               }
+       }
+
+       public XXServiceVersionInfo findByServiceId(Long serviceId) {
+               if (serviceId == null) {
+                       return null;
+               }
+               try {
+                       return 
getEntityManager().createNamedQuery("XXServiceVersionInfo.findByServiceId", 
tClass)
+                                       .setParameter("serviceId", 
serviceId).getSingleResult();
+               } catch (NoResultException e) {
+                       return null;
+               }
+       }
+
+       public void updateServiceVersionInfoForServiceResourceUpdate(Long 
resourceId, Date updateTime) {
+               if (resourceId == null) {
+                       return;
+               }
+
+               try {
+                       List<XXServiceVersionInfo> serviceVersionInfos = 
getEntityManager().createNamedQuery("XXServiceVersionInfo.findByServiceResourceId",
 tClass).setParameter("resourceId", resourceId).getResultList();
+
+                       updateTagVersionAndTagUpdateTime(serviceVersionInfos, 
updateTime);
+               } catch (NoResultException e) {
+                       return;
+               }
+       }
+
+       public void updateServiceVersionInfoForTagUpdate(Long tagId, Date 
updateTime) {
+               if (tagId == null) {
+                       return;
+               }
+
+               try {
+                       List<XXServiceVersionInfo> serviceVersionInfos = 
getEntityManager().createNamedQuery("XXServiceVersionInfo.findByTagId", 
tClass).setParameter("tagId", tagId).getResultList();
+
+                       updateTagVersionAndTagUpdateTime(serviceVersionInfos, 
updateTime);
+               } catch (NoResultException e) {
+                       return;
+               }
+       }
+
+       public void updateServiceVersionInfoForTagDefUpdate(Long tagDefId, Date 
updateTime) {
+               if (tagDefId == null) {
+                       return;
+               }
+
+               try {
+                       List<XXServiceVersionInfo> serviceVersionInfos = 
getEntityManager().createNamedQuery("XXServiceVersionInfo.findByTagDefId", 
tClass).setParameter("tagDefId", tagDefId).getResultList();
+
+                       updateTagVersionAndTagUpdateTime(serviceVersionInfos, 
updateTime);
+               } catch (NoResultException e) {
+                       return;
+               }
+       }
+
+       private void 
updateTagVersionAndTagUpdateTime(List<XXServiceVersionInfo> 
serviceVersionInfos, Date updateTime) {
+               if(CollectionUtils.isEmpty(serviceVersionInfos)) {
+                       return;
+               }
+
+               if(updateTime == null) {
+                       updateTime = new Date();
+               }
+
+               for(XXServiceVersionInfo serviceVersionInfo : 
serviceVersionInfos) {
+                       Long currentTagVersion = 
serviceVersionInfo.getTagVersion();
+
+                       if(currentTagVersion == null) {
+                               currentTagVersion = Long.valueOf(0);
+                       }
+
+                       if (updateTime == null) {
+                               updateTime = new Date();
+                       }
+
+                       serviceVersionInfo.setTagVersion(currentTagVersion + 1);
+                       serviceVersionInfo.setTagUpdateTime(updateTime);
+               }
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/cb58449b/security-admin/src/main/java/org/apache/ranger/entity/XXServiceVersionInfo.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/entity/XXServiceVersionInfo.java
 
b/security-admin/src/main/java/org/apache/ranger/entity/XXServiceVersionInfo.java
new file mode 100644
index 0000000..921e72f
--- /dev/null
+++ 
b/security-admin/src/main/java/org/apache/ranger/entity/XXServiceVersionInfo.java
@@ -0,0 +1,197 @@
+/*
+ * 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.entity;
+
+import java.util.Date;
+
+import javax.persistence.Cacheable;
+import javax.persistence.Entity;
+import javax.persistence.Column;
+import javax.persistence.EntityListeners;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.apache.ranger.common.AppConstants;
+import org.apache.ranger.common.DateUtil;
+
+@EntityListeners( org.apache.ranger.common.db.JPABeanCallbacks.class)
+@Entity
+@Cacheable
+@XmlRootElement
+@Table(name = "x_service_version_info")
+public class XXServiceVersionInfo extends Object implements 
java.io.Serializable {
+       private static final long serialVersionUID = 1L;
+
+       @Id
+       @SequenceGenerator(name = "X_SERVICE_VERSION_INFO_SEQ", sequenceName = 
"X_SERVICE_VERSION_INFO_SEQ", allocationSize = 1)
+       @GeneratedValue(strategy = GenerationType.AUTO, generator = 
"X_SERVICE_VERSION_INFO_SEQ")
+       @Column(name = "id")
+       protected Long id;
+
+       @Column(name = "service_id")
+       protected Long serviceId;
+
+       @Column(name = "policy_version")
+       protected Long policyVersion;
+
+       @Temporal(TemporalType.TIMESTAMP)
+       @Column(name="policy_update_time"   )
+       protected Date policyUpdateTime = DateUtil.getUTCDate();
+
+       @Column(name = "tag_version")
+       protected Long tagVersion;
+
+       @Temporal(TemporalType.TIMESTAMP)
+       @Column(name="tag_update_time"   )
+       protected Date tagUpdateTime = DateUtil.getUTCDate();
+
+       /**
+        * Default constructor. This will set all the attributes to default 
value.
+        */
+       public XXServiceVersionInfo ( ) {
+       }
+
+       public int getMyClassType( ) {
+           return AppConstants.CLASS_TYPE_NONE;
+       }
+
+       public String getMyDisplayValue() {
+               return null;
+       }
+
+       public void setId(Long id) {
+               this.id = id;
+       }
+
+       public Long getId() {
+               return this.id;
+       }
+
+       public void setServiceId(Long serviceId) {
+               this.serviceId = serviceId;
+       }
+
+       public Long getServiceId() {
+               return this.serviceId;
+       }
+
+       public void setPolicyVersion(Long policyVersion) {
+               this.policyVersion = policyVersion;
+       }
+
+       public Long getPolicyVersion() {
+               return this.policyVersion;
+       }
+
+       public void setPolicyUpdateTime( Date updateTime ) {
+               this.policyUpdateTime = updateTime;
+       }
+
+       public Date getPolicyUpdateTime( ) {
+               return this.policyUpdateTime;
+       }
+
+       public void setTagVersion(Long tagVersion) {
+               this.tagVersion = tagVersion;
+       }
+
+       public Long getTagVersion() {
+               return this.tagVersion;
+       }
+
+       public void setTagUpdateTime( Date updateTime ) {
+               this.tagUpdateTime = updateTime;
+       }
+
+       public Date getTagUpdateTime( ) {
+               return this.tagUpdateTime;
+       }
+
+
+       /**
+        * This return the bean content in string format
+        * @return formatedStr
+       */
+       @Override
+       public String toString( ) {
+               String str = "XXServiceVersionInfo={";
+               str += "id={" + id + "} ";
+               str += "serviceId={" + serviceId + "} ";
+               str += "policyVersion={" + policyVersion + "} ";
+               str += "policyUpdateTime={" + policyUpdateTime + "} ";
+               str += "tagVersion={" + tagVersion + "} ";
+               str += "tagUpdateTime={" + tagUpdateTime + "} ";
+               str += "}";
+               return str;
+       }
+
+       /**
+        * Checks for all attributes except referenced db objects
+        * @return true if all attributes match
+       */
+       @Override
+       public boolean equals( Object obj) {
+               if (obj == null)
+                       return false;
+               if (this == obj)
+                       return true;
+               if (!super.equals(obj))
+                       return false;
+               if (getClass() != obj.getClass())
+                       return false;
+               XXServiceVersionInfo other = (XXServiceVersionInfo) obj;
+               if ((this.id == null && other.id != null) || (this.id != null 
&& !this.id.equals(other.id))) {
+                       return false;
+               }
+               if ((this.serviceId == null && other.serviceId != null) || 
(this.serviceId != null && !this.serviceId.equals(other.serviceId))) {
+                       return false;
+               }
+               if ((this.policyVersion == null && other.policyVersion != null) 
|| (this.policyVersion != null && 
!this.policyVersion.equals(other.policyVersion))) {
+                       return false;
+               }
+               if ((this.policyUpdateTime == null && other.policyUpdateTime != 
null) || (this.policyUpdateTime != null && 
!this.policyUpdateTime.equals(other.policyUpdateTime))) {
+                       return false;
+               }
+               if ((this.tagVersion == null && other.tagVersion != null) || 
(this.tagVersion != null && !this.tagVersion.equals(other.tagVersion))) {
+                       return false;
+               }
+               if ((this.tagUpdateTime == null && other.tagUpdateTime != null) 
|| (this.tagUpdateTime != null && 
!this.tagUpdateTime.equals(other.tagUpdateTime))) {
+                       return false;
+               }
+               return true;
+       }
+
+       public static boolean equals(Object object1, Object object2) {
+               if (object1 == object2) {
+                       return true;
+               }
+               if ((object1 == null) || (object2 == null)) {
+                       return false;
+               }
+               return object1.equals(object2);
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/cb58449b/security-admin/src/main/java/org/apache/ranger/patch/PatchForServiceVersionInfo_J10004.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/patch/PatchForServiceVersionInfo_J10004.java
 
b/security-admin/src/main/java/org/apache/ranger/patch/PatchForServiceVersionInfo_J10004.java
new file mode 100644
index 0000000..380cca0
--- /dev/null
+++ 
b/security-admin/src/main/java/org/apache/ranger/patch/PatchForServiceVersionInfo_J10004.java
@@ -0,0 +1,122 @@
+/*
+ * 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.patch;
+
+import java.util.Date;
+import java.util.List;
+import org.apache.log4j.Logger;
+import org.apache.ranger.db.RangerDaoManager;
+import org.apache.ranger.entity.XXService;
+import org.apache.ranger.entity.XXServiceVersionInfo;
+
+import org.apache.ranger.util.CLIUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class PatchForServiceVersionInfo_J10004 extends BaseLoader {
+       private static Logger logger = Logger
+                       .getLogger(PatchForServiceVersionInfo_J10004.class);
+
+       @Autowired
+       RangerDaoManager daoManager;
+
+       public static void main(String[] args) {
+               logger.info("main()");
+               try {
+                       PatchForServiceVersionInfo_J10004 loader = 
(PatchForServiceVersionInfo_J10004) CLIUtil
+                                       
.getBean(PatchForServiceVersionInfo_J10004.class);
+
+                       loader.init();
+                       while (loader.isMoreToProcess()) {
+                               loader.load();
+                       }
+                       logger.info("Load complete. Exiting!!!");
+                       System.exit(0);
+               } catch (Exception e) {
+                       logger.error("Error loading", e);
+                       System.exit(1);
+               }
+       }
+
+       @Override
+       public void init() throws Exception {
+               // Do Nothing
+       }
+
+       @Override
+       public void execLoad() {
+               logger.info("==> ServiceVersionInfoPatch.execLoad()");
+               copyVersionsFromServiceToServiceVersionInfo();
+               logger.info("<== ServiceVersionInfoPatch.execLoad()");
+       }
+
+       public void copyVersionsFromServiceToServiceVersionInfo() {
+               List<XXService> allServices = 
daoManager.getXXService().getAll();
+               Date now = new Date();
+
+               for (XXService xService : allServices) {
+
+                       boolean needToCreateServiceVersionInfo = false;
+                       XXServiceVersionInfo serviceVersionInfoDbObj = 
daoManager.getXXServiceVersionInfo().findByServiceId(xService.getId());
+
+                       if (serviceVersionInfoDbObj == null) {
+                               needToCreateServiceVersionInfo = true;
+                               serviceVersionInfoDbObj = new 
XXServiceVersionInfo();
+                               
serviceVersionInfoDbObj.setServiceId(xService.getId());
+                       }
+                       
serviceVersionInfoDbObj.setPolicyVersion(xService.getPolicyVersion() == null ? 
1L : xService.getPolicyVersion());
+                       
serviceVersionInfoDbObj.setTagVersion(xService.getTagVersion());
+                       
serviceVersionInfoDbObj.setPolicyUpdateTime(xService.getPolicyUpdateTime());
+                       
serviceVersionInfoDbObj.setTagUpdateTime(xService.getTagUpdateTime());
+
+                       if (needToCreateServiceVersionInfo) {
+                               
daoManager.getXXServiceVersionInfo().create(serviceVersionInfoDbObj);
+                               logger.info("Created serviceVesionInfo for 
serviceName [" + xService.getName() + "]");
+                       } else {
+                               
daoManager.getXXServiceVersionInfo().update(serviceVersionInfoDbObj);
+                               logger.info("Updated serviceVesionInfo for 
serviceName [" + xService.getName() + "]");
+                       }
+
+                       // Consider this scenario:
+                       // 1. ranger-admin is upgraded to use versions from 
x_service_version_info table;
+                       // 2. there are updates to policies and/or tags;
+                       // 3. no plug-ins download service-policies;
+                       // 4. upgrade is rolled back, for ranger-admin to use 
versions from x_service table;
+                       // 5. Now plug-in downloads service-policies.
+                       // In this scenario, plug-ins will miss the policy/tag 
updates down in step 2. To ensure that
+                       // plug-ins get updated policies/tags, we increment 
versions in x_service table when x_service_version_info
+                       // table is updated in this patch. This may cause one 
potentially unnecessary download to plugin in case
+                       // step 2 above did not take place, but it is safer.
+
+                       xService.setPolicyVersion(xService.getPolicyVersion() 
== null ? 2L : xService.getPolicyVersion() + 1);
+                       xService.setTagVersion(xService.getTagVersion() + 1);
+
+                       xService.setPolicyUpdateTime(now);
+                       xService.setTagUpdateTime(now);
+
+                       daoManager.getXXService().update(xService);
+                       logger.info("Incremented policy and tag versions for 
serviceName [" + xService.getName() + "]");
+               }
+       }
+
+       @Override
+       public void printStats() {
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/cb58449b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceResourceService.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/service/RangerServiceResourceService.java
 
b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceResourceService.java
index 807ad61..0621e75 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/service/RangerServiceResourceService.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceResourceService.java
@@ -63,7 +63,7 @@ public class RangerServiceResourceService extends 
RangerServiceResourceServiceBa
                RangerServiceResource ret = super.postUpdate(resource);
 
                if (serviceUpdateNeeded) {
-                       
daoMgr.getXXService().updateServiceForServiceResourceUpdate(resource.getId(), 
resource.getUpdateTime());
+                       
daoMgr.getXXServiceVersionInfo().updateServiceVersionInfoForServiceResourceUpdate(resource.getId(),
 resource.getUpdateTime());
                }
 
                return ret;

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/cb58449b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceService.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/service/RangerServiceService.java
 
b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceService.java
index a8f54f6..8c2e568 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/service/RangerServiceService.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceService.java
@@ -20,6 +20,7 @@ package org.apache.ranger.service;
 import java.io.IOException;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -32,10 +33,12 @@ import org.apache.ranger.common.JSONUtil;
 import org.apache.ranger.common.PasswordUtils;
 import org.apache.ranger.common.PropertiesUtil;
 import org.apache.ranger.common.view.VTrxLogAttr;
+import org.apache.ranger.db.XXServiceVersionInfoDao;
 import org.apache.ranger.entity.XXService;
 import org.apache.ranger.entity.XXServiceBase;
 import org.apache.ranger.entity.XXServiceConfigMap;
 import org.apache.ranger.entity.XXServiceDef;
+import org.apache.ranger.entity.XXServiceVersionInfo;
 import org.apache.ranger.entity.XXTrxLog;
 import org.apache.ranger.plugin.model.RangerService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -107,7 +110,6 @@ public class RangerServiceService extends 
RangerServiceServiceBase<XXService, Ra
                        configs.put(svcConfMap.getConfigkey(), configValue);
                }
                vService.setConfigs(configs);
-               
                return vService;
        }
        
@@ -291,4 +293,35 @@ public class RangerServiceService extends 
RangerServiceServiceBase<XXService, Ra
                return configs;
        }
 
+       public RangerService postCreate(XXService xObj) {
+               XXServiceVersionInfo serviceVersionInfo = new 
XXServiceVersionInfo();
+
+               serviceVersionInfo.setServiceId(xObj.getId());
+               serviceVersionInfo.setPolicyVersion(1L);
+               serviceVersionInfo.setTagVersion(1L);
+               Date now = new Date();
+               serviceVersionInfo.setPolicyUpdateTime(now);
+               serviceVersionInfo.setTagUpdateTime(now);
+
+               XXServiceVersionInfoDao serviceVersionInfoDao = 
daoMgr.getXXServiceVersionInfo();
+
+               XXServiceVersionInfo createdServiceVersionInfo = 
serviceVersionInfoDao.create(serviceVersionInfo);
+
+               return createdServiceVersionInfo != null ? 
super.postCreate(xObj) : null;
+       }
+
+       protected XXService preDelete(Long id) {
+               XXService ret = super.preDelete(id);
+
+               if (ret != null) {
+                       XXServiceVersionInfoDao serviceVersionInfoDao = 
daoMgr.getXXServiceVersionInfo();
+
+                       XXServiceVersionInfo serviceVersionInfo = 
serviceVersionInfoDao.findByServiceId(id);
+
+                       if (serviceVersionInfo != null) {
+                               
serviceVersionInfoDao.remove(serviceVersionInfo.getId());
+                       }
+               }
+               return ret;
+       }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/cb58449b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceServiceBase.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/service/RangerServiceServiceBase.java
 
b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceServiceBase.java
index 594d091..33c7d71 100755
--- 
a/security-admin/src/main/java/org/apache/ranger/service/RangerServiceServiceBase.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceServiceBase.java
@@ -31,6 +31,7 @@ import org.apache.ranger.common.SortField.SORT_ORDER;
 import org.apache.ranger.entity.XXService;
 import org.apache.ranger.entity.XXServiceBase;
 import org.apache.ranger.entity.XXServiceDef;
+import org.apache.ranger.entity.XXServiceVersionInfo;
 import org.apache.ranger.plugin.model.RangerService;
 import org.apache.ranger.plugin.util.SearchFilter;
 import org.apache.ranger.view.RangerServiceList;
@@ -92,10 +93,9 @@ public abstract class RangerServiceServiceBase<T extends 
XXServiceBase, V extend
                xObj.setType(xServiceDef.getId());
                xObj.setName(vObj.getName());
                xObj.setTagService(tagServiceId);
-               xObj.setPolicyVersion(vObj.getPolicyVersion());
-               xObj.setTagVersion(vObj.getTagVersion());
-               xObj.setPolicyUpdateTime(vObj.getPolicyUpdateTime());
-               xObj.setTagUpdateTime(vObj.getTagUpdateTime());
+               if (OPERATION_CONTEXT == OPERATION_CREATE_CONTEXT) {
+                       xObj.setTagVersion(vObj.getTagVersion());
+               }
                xObj.setDescription(vObj.getDescription());
                xObj.setIsEnabled(vObj.getIsEnabled());
                return xObj;
@@ -112,10 +112,18 @@ public abstract class RangerServiceServiceBase<T extends 
XXServiceBase, V extend
                vObj.setName(xObj.getName());
                vObj.setDescription(xObj.getDescription());
                vObj.setTagService(xTagService != null ? xTagService.getName() 
: null);
-               vObj.setPolicyVersion(xObj.getPolicyVersion());
-               vObj.setTagVersion(xObj.getTagVersion());
-               vObj.setPolicyUpdateTime(xObj.getPolicyUpdateTime());
-               vObj.setTagUpdateTime(xObj.getTagUpdateTime());
+               XXServiceVersionInfo versionInfoObj = 
daoMgr.getXXServiceVersionInfo().findByServiceId(xObj.getId());
+               if (versionInfoObj != null) {
+                       
vObj.setPolicyVersion(versionInfoObj.getPolicyVersion());
+                       vObj.setTagVersion(versionInfoObj.getTagVersion());
+                       
vObj.setPolicyUpdateTime(versionInfoObj.getPolicyUpdateTime());
+                       
vObj.setTagUpdateTime(versionInfoObj.getTagUpdateTime());
+               } else {
+                       vObj.setPolicyVersion(xObj.getPolicyVersion());
+                       vObj.setTagVersion(xObj.getTagVersion());
+                       vObj.setPolicyUpdateTime(xObj.getPolicyUpdateTime());
+                       vObj.setTagUpdateTime(xObj.getTagUpdateTime());
+               }
                vObj.setIsEnabled(xObj.getIsenabled());
                return vObj;
        }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/cb58449b/security-admin/src/main/java/org/apache/ranger/service/RangerTagDefService.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/service/RangerTagDefService.java
 
b/security-admin/src/main/java/org/apache/ranger/service/RangerTagDefService.java
index beb6295..8a3d14d 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/service/RangerTagDefService.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/service/RangerTagDefService.java
@@ -54,7 +54,7 @@ public class RangerTagDefService extends 
RangerTagDefServiceBase<XXTagDef, Range
        public RangerTagDef postUpdate(XXTagDef tagDef) {
                RangerTagDef ret = super.postUpdate(tagDef);
 
-               
daoMgr.getXXService().updateServiceForTagDefUpdate(tagDef.getId(), 
tagDef.getUpdateTime());
+               
daoMgr.getXXServiceVersionInfo().updateServiceVersionInfoForTagDefUpdate(tagDef.getId(),
 tagDef.getUpdateTime());
 
                return ret;
        }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/cb58449b/security-admin/src/main/java/org/apache/ranger/service/RangerTagResourceMapService.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/service/RangerTagResourceMapService.java
 
b/security-admin/src/main/java/org/apache/ranger/service/RangerTagResourceMapService.java
index 257821d..391774e 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/service/RangerTagResourceMapService.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/service/RangerTagResourceMapService.java
@@ -54,7 +54,7 @@ public class RangerTagResourceMapService extends 
RangerTagResourceMapServiceBase
        public RangerTagResourceMap postCreate(XXTagResourceMap tagResMap) {
                RangerTagResourceMap ret = super.postCreate(tagResMap);
 
-               
daoMgr.getXXService().updateServiceForTagUpdate(tagResMap.getTagId(), 
tagResMap.getUpdateTime());
+               
daoMgr.getXXServiceVersionInfo().updateServiceVersionInfoForServiceResourceUpdate(tagResMap.getResourceId(),
 tagResMap.getUpdateTime());
 
                return ret;
        }
@@ -63,7 +63,7 @@ public class RangerTagResourceMapService extends 
RangerTagResourceMapServiceBase
        public RangerTagResourceMap postUpdate(XXTagResourceMap tagResMap) {
                RangerTagResourceMap ret = super.postUpdate(tagResMap);
 
-               
daoMgr.getXXService().updateServiceForTagUpdate(tagResMap.getTagId(), 
tagResMap.getUpdateTime());
+               
daoMgr.getXXServiceVersionInfo().updateServiceVersionInfoForServiceResourceUpdate(tagResMap.getResourceId(),
 tagResMap.getUpdateTime());
 
                return ret;
        }
@@ -73,7 +73,7 @@ public class RangerTagResourceMapService extends 
RangerTagResourceMapServiceBase
                XXTagResourceMap tagResMap = super.preDelete(id);
 
                if (tagResMap != null) {
-                       
daoMgr.getXXService().updateServiceForServiceResourceUpdate(tagResMap.getResourceId(),
 null);
+                       
daoMgr.getXXServiceVersionInfo().updateServiceVersionInfoForServiceResourceUpdate(tagResMap.getResourceId(),
 null);
                }
 
                return tagResMap;

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/cb58449b/security-admin/src/main/java/org/apache/ranger/service/RangerTagService.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/service/RangerTagService.java 
b/security-admin/src/main/java/org/apache/ranger/service/RangerTagService.java
index 34ed0ad..28b9115 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/service/RangerTagService.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/service/RangerTagService.java
@@ -55,7 +55,7 @@ public class RangerTagService extends 
RangerTagServiceBase<XXTag, RangerTag> {
        public RangerTag postUpdate(XXTag tag) {
                RangerTag ret = super.postUpdate(tag);
 
-               daoMgr.getXXService().updateServiceForTagUpdate(tag.getId(), 
tag.getUpdateTime());
+               
daoMgr.getXXServiceVersionInfo().updateServiceVersionInfoForTagUpdate(tag.getId(),
 tag.getUpdateTime());
 
                return ret;
        }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/cb58449b/security-admin/src/main/resources/META-INF/jpa_named_queries.xml
----------------------------------------------------------------------
diff --git a/security-admin/src/main/resources/META-INF/jpa_named_queries.xml 
b/security-admin/src/main/resources/META-INF/jpa_named_queries.xml
index 0f65243..39c8ec3 100644
--- a/security-admin/src/main/resources/META-INF/jpa_named_queries.xml
+++ b/security-admin/src/main/resources/META-INF/jpa_named_queries.xml
@@ -402,25 +402,35 @@
                <query>select obj from XXService obj where obj.tagService = 
:tagServiceId</query>
        </named-query>
 
-       <named-query name="XXService.findByServiceResourceId">
+       <!-- XXServiceVersionInfo -->
+       <named-query name="XXServiceVersionInfo.findByServiceName">
                <query>
-                       select obj from XXService obj where obj.id in
-                         (select res.serviceId from XXServiceResource res, 
XXTagResourceMap tagRes
-                           where res.id = :resourceId and res.id = 
tagRes.resourceId)
+                       select obj from XXServiceVersionInfo obj, XXService 
service where obj.serviceId = service.id and service.name = :serviceName
                </query>
        </named-query>
 
-       <named-query name="XXService.findByTagId">
+       <named-query name="XXServiceVersionInfo.findByServiceId">
+               <query>select obj from XXServiceVersionInfo obj where 
obj.serviceId = :serviceId</query>
+       </named-query>
+
+       <named-query name="XXServiceVersionInfo.findByServiceResourceId">
+               <query>
+                       select obj from XXServiceVersionInfo obj where 
obj.serviceId in
+                       (select res.serviceId from XXServiceResource res where 
res.id = :resourceId)
+               </query>
+       </named-query>
+
+       <named-query name="XXServiceVersionInfo.findByTagId">
                <query>
-                       select obj from XXService obj where obj.id in
-                         (select res.serviceId from XXServiceResource res, 
XXTagResourceMap tagRes, XXTag tag
-                           where res.id = tagRes.resourceId and tagRes.tagId = 
tag.id and tag.id = :tagId)
+                       select obj from XXServiceVersionInfo obj where 
obj.serviceId in
+                       (select res.serviceId from XXServiceResource res, 
XXTagResourceMap tagRes
+                       where res.id = tagRes.resourceId and tagRes.tagId = 
:tagId)
                </query>
        </named-query>
 
-       <named-query name="XXService.findByTagDefId">
+       <named-query name="XXServiceVersionInfo.findByTagDefId">
                <query>
-                       select obj from XXService obj where obj.id in
+                       select obj from XXServiceVersionInfo obj where 
obj.serviceId in
                        (select res.serviceId from XXServiceResource res, 
XXTagResourceMap tagRes, XXTag tag
                        where res.id = tagRes.resourceId and tagRes.tagId = 
tag.id and tag.type = :tagDefId)
                </query>

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/cb58449b/security-admin/src/test/java/org/apache/ranger/biz/TestServiceDBStore.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/test/java/org/apache/ranger/biz/TestServiceDBStore.java 
b/security-admin/src/test/java/org/apache/ranger/biz/TestServiceDBStore.java
index 61e13da..7af5c45 100644
--- a/security-admin/src/test/java/org/apache/ranger/biz/TestServiceDBStore.java
+++ b/security-admin/src/test/java/org/apache/ranger/biz/TestServiceDBStore.java
@@ -1200,6 +1200,8 @@ public class TestServiceDBStore {
        public void test20updateService() throws Exception {
                XXServiceDao xServiceDao = Mockito.mock(XXServiceDao.class);
                XXService xService = Mockito.mock(XXService.class);
+               XXServiceVersionInfoDao xServiceVersionInfoDao = 
Mockito.mock(XXServiceVersionInfoDao.class);
+               XXServiceVersionInfo xServiceVersionInfo = 
Mockito.mock(XXServiceVersionInfo.class);
                XXServiceConfigMapDao xServiceConfigMapDao = Mockito
                                .mock(XXServiceConfigMapDao.class);
                XXServiceConfigDefDao xServiceConfigDefDao = Mockito
@@ -1288,6 +1290,10 @@ public class TestServiceDBStore {
                
Mockito.when(svcService.getPopulatedViewObject(xService)).thenReturn(
                                rangerService);
 
+               
Mockito.when(daoManager.getXXServiceVersionInfo()).thenReturn(xServiceVersionInfoDao);
+               
Mockito.when(xServiceVersionInfoDao.findByServiceId(Id)).thenReturn(xServiceVersionInfo);
+               
Mockito.when(xServiceVersionInfoDao.update(xServiceVersionInfo)).thenReturn(xServiceVersionInfo);
+
                RangerService dbRangerService = serviceDBStore
                                .updateService(rangerService);
                Assert.assertNotNull(dbRangerService);
@@ -1309,6 +1315,8 @@ public class TestServiceDBStore {
                XXPolicyDao xPolicyDao = Mockito.mock(XXPolicyDao.class);
                XXServiceDao xServiceDao = Mockito.mock(XXServiceDao.class);
                XXService xService = Mockito.mock(XXService.class);
+               XXServiceVersionInfoDao xServiceVersionInfoDao = 
Mockito.mock(XXServiceVersionInfoDao.class);
+               XXServiceVersionInfo xServiceVersionInfo = 
Mockito.mock(XXServiceVersionInfo.class);
                XXPolicyItemDao xPolicyItemDao = 
Mockito.mock(XXPolicyItemDao.class);
                XXPolicyItemDataMaskInfoDao xxPolicyItemDataMaskInfoDao = 
Mockito.mock(XXPolicyItemDataMaskInfoDao.class);
                XXPolicyItemRowFilterInfoDao xxPolicyItemRowFilterInfoDao = 
Mockito.mock(XXPolicyItemRowFilterInfoDao.class);
@@ -1479,6 +1487,10 @@ public class TestServiceDBStore {
                
Mockito.when(svcService.getPopulatedViewObject(xService)).thenReturn(
                                rangerService);
 
+               
Mockito.when(daoManager.getXXServiceVersionInfo()).thenReturn(xServiceVersionInfoDao);
+               
Mockito.when(xServiceVersionInfoDao.findByServiceId(Id)).thenReturn(xServiceVersionInfo);
+               
Mockito.when(xServiceVersionInfoDao.update(xServiceVersionInfo)).thenReturn(xServiceVersionInfo);
+
                
Mockito.when(daoManager.getXXPolicyItem()).thenReturn(xPolicyItemDao);
                Mockito.when(xPolicyItemDao.findByPolicyId(policyItem.getId()))
                                .thenReturn(policyItemList);
@@ -1683,7 +1695,9 @@ public class TestServiceDBStore {
                XXPolicy xPolicy = Mockito.mock(XXPolicy.class);
                XXPolicyDao xPolicyDao = Mockito.mock(XXPolicyDao.class);
                XXServiceDao xServiceDao = Mockito.mock(XXServiceDao.class);
+               XXServiceVersionInfoDao xServiceVersionInfoDao = 
Mockito.mock(XXServiceVersionInfoDao.class);
                XXService xService = Mockito.mock(XXService.class);
+               XXServiceVersionInfo xServiceVersionInfo = 
Mockito.mock(XXServiceVersionInfo.class);
                XXPolicyItemDao xPolicyItemDao = 
Mockito.mock(XXPolicyItemDao.class);
                XXServiceConfigDefDao xServiceConfigDefDao = Mockito
                                .mock(XXServiceConfigDefDao.class);
@@ -1844,6 +1858,10 @@ public class TestServiceDBStore {
 
                Mockito.when(daoManager.getXXService()).thenReturn(xServiceDao);
                Mockito.when(xServiceDao.findByName(name)).thenReturn(xService);
+               
Mockito.when(daoManager.getXXServiceVersionInfo()).thenReturn(xServiceVersionInfoDao);
+               
Mockito.when(xServiceVersionInfoDao.findByServiceId(Id)).thenReturn(xServiceVersionInfo);
+               
Mockito.when(xServiceVersionInfoDao.update(xServiceVersionInfo)).thenReturn(xServiceVersionInfo);
+
                
Mockito.when(svcService.getPopulatedViewObject(xService)).thenReturn(
                                rangerService);
 
@@ -1992,8 +2010,10 @@ public class TestServiceDBStore {
                XXPolicy xPolicy = Mockito.mock(XXPolicy.class);
                XXServiceDao xServiceDao = Mockito.mock(XXServiceDao.class);
                XXService xService = Mockito.mock(XXService.class);
+               XXServiceVersionInfoDao xServiceVersionInfoDao = 
Mockito.mock(XXServiceVersionInfoDao.class);
                XXServiceDefDao xServiceDefDao = 
Mockito.mock(XXServiceDefDao.class);
                XXServiceDef xServiceDef = Mockito.mock(XXServiceDef.class);
+               XXServiceVersionInfo xServiceVersionInfo = 
Mockito.mock(XXServiceVersionInfo.class);
                XXPolicyResourceDao xPolicyResourceDao = Mockito
                                .mock(XXPolicyResourceDao.class);
                XXPolicyResourceMapDao xPolicyResourceMapDao = Mockito
@@ -2064,6 +2084,10 @@ public class TestServiceDBStore {
                
Mockito.when(svcService.getPopulatedViewObject(xService)).thenReturn(
                                rangerService);
 
+               
Mockito.when(daoManager.getXXServiceVersionInfo()).thenReturn(xServiceVersionInfoDao);
+               
Mockito.when(xServiceVersionInfoDao.findByServiceId(Id)).thenReturn(xServiceVersionInfo);
+               
Mockito.when(xServiceVersionInfoDao.update(xServiceVersionInfo)).thenReturn(xServiceVersionInfo);
+
                
Mockito.when(daoManager.getXXServiceDef()).thenReturn(xServiceDefDao);
                Mockito.when(xServiceDefDao.findByName(rangerService.getType()))
                                .thenReturn(xServiceDef);
@@ -2152,6 +2176,9 @@ public class TestServiceDBStore {
                setup();
                XXServiceDao xServiceDao = Mockito.mock(XXServiceDao.class);
                XXService xService = Mockito.mock(XXService.class);
+               XXServiceVersionInfoDao xServiceVersionInfoDao = 
Mockito.mock(XXServiceVersionInfoDao.class);
+               XXServiceVersionInfo xServiceVersionInfo = 
Mockito.mock(XXServiceVersionInfo.class);
+
                XXPolicyItemDao xPolicyItemDao = 
Mockito.mock(XXPolicyItemDao.class);
                XXPolicyItemDataMaskInfoDao xPolicyItemDataMaskInfoDao = 
Mockito.mock(XXPolicyItemDataMaskInfoDao.class);
                XXPolicyItemRowFilterInfoDao xPolicyItemRowFilterInfoDao = 
Mockito.mock(XXPolicyItemRowFilterInfoDao.class);
@@ -2338,6 +2365,10 @@ public class TestServiceDBStore {
                Mockito.when(daoManager.getXXService()).thenReturn(xServiceDao);
                Mockito.when(xServiceDao.getById(Id)).thenReturn(xService);
 
+               
Mockito.when(daoManager.getXXServiceVersionInfo()).thenReturn(xServiceVersionInfoDao);
+               
Mockito.when(xServiceVersionInfoDao.findByServiceId(Id)).thenReturn(xServiceVersionInfo);
+               
Mockito.when(xServiceVersionInfoDao.update(xServiceVersionInfo)).thenReturn(xServiceVersionInfo);
+
                Mockito.when(daoManager.getXXServiceConfigDef()).thenReturn(
                                xServiceConfigDefDao);
                Mockito.when(
@@ -2435,6 +2466,7 @@ public class TestServiceDBStore {
        @Test
        public void test33getServicePoliciesIfUpdated() throws Exception {
                XXServiceDao xServiceDao = Mockito.mock(XXServiceDao.class);
+               XXServiceVersionInfoDao xServiceVersionInfoDao = 
Mockito.mock(XXServiceVersionInfoDao.class);
 
                XXServiceDefDao xServiceDefDao = 
Mockito.mock(XXServiceDefDao.class);
                XXServiceDef xServiceDef = Mockito.mock(XXServiceDef.class);
@@ -2456,10 +2488,21 @@ public class TestServiceDBStore {
                xService.setUpdatedByUserId(Id);
                xService.setUpdateTime(new Date());
 
+               XXServiceVersionInfo xServiceVersionInfo = new 
XXServiceVersionInfo();
+
+               xServiceVersionInfo.setServiceId(Id);
+               xServiceVersionInfo.setPolicyVersion(1L);
+               xServiceVersionInfo.setPolicyUpdateTime(new Date());
+               xServiceVersionInfo.setTagVersion(1L);
+               xServiceVersionInfo.setTagUpdateTime(new Date());
+
                String serviceName = "HDFS_1";
                Long lastKnownVersion = 1l;
                Mockito.when(daoManager.getXXService()).thenReturn(xServiceDao);
+               
Mockito.when(daoManager.getXXServiceVersionInfo()).thenReturn(xServiceVersionInfoDao);
                
Mockito.when(xServiceDao.findByName(serviceName)).thenReturn(xService);
+               
Mockito.when(xServiceVersionInfoDao.findByServiceName(serviceName)).thenReturn(xServiceVersionInfo);
+               
Mockito.when(xServiceVersionInfoDao.findByServiceId(Id)).thenReturn(xServiceVersionInfo);
                
Mockito.when(svcService.getPopulatedViewObject(xService)).thenReturn(
                                rangerService);
 

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/cb58449b/security-admin/src/test/java/org/apache/ranger/service/TestRangerServiceService.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/test/java/org/apache/ranger/service/TestRangerServiceService.java
 
b/security-admin/src/test/java/org/apache/ranger/service/TestRangerServiceService.java
index 215506e..c8cb716 100644
--- 
a/security-admin/src/test/java/org/apache/ranger/service/TestRangerServiceService.java
+++ 
b/security-admin/src/test/java/org/apache/ranger/service/TestRangerServiceService.java
@@ -32,10 +32,12 @@ import org.apache.ranger.db.XXServiceConfigMapDao;
 import org.apache.ranger.db.XXServiceDao;
 import org.apache.ranger.db.XXServiceDefDao;
 
+import org.apache.ranger.db.XXServiceVersionInfoDao;
 import org.apache.ranger.entity.XXPortalUser;
 import org.apache.ranger.entity.XXService;
 import org.apache.ranger.entity.XXServiceConfigMap;
 import org.apache.ranger.entity.XXServiceDef;
+import org.apache.ranger.entity.XXServiceVersionInfo;
 import org.apache.ranger.entity.XXTrxLog;
 import org.apache.ranger.plugin.model.RangerService;
 
@@ -197,6 +199,19 @@ public class TestRangerServiceService {
                xServiceDef.setGuid("1427365526516_835_0");
                xServiceDef.setId(userId);
 
+               XXServiceVersionInfoDao xServiceVersionInfoDao = 
Mockito.mock(XXServiceVersionInfoDao.class);
+
+               XXServiceVersionInfo serviceVersionInfo = new 
XXServiceVersionInfo();
+               serviceVersionInfo.setServiceId(xService.getId());
+               
serviceVersionInfo.setPolicyVersion(xService.getPolicyVersion());
+               
serviceVersionInfo.setPolicyUpdateTime(xService.getPolicyUpdateTime());
+               serviceVersionInfo.setTagVersion(xService.getTagVersion());
+               
serviceVersionInfo.setTagUpdateTime(xService.getTagUpdateTime());
+
+               
Mockito.when(daoManager.getXXServiceVersionInfo()).thenReturn(xServiceVersionInfoDao);
+               
Mockito.when(xServiceVersionInfoDao.findByServiceId(xService.getId())).thenReturn(
+                               serviceVersionInfo);
+
                
Mockito.when(daoManager.getXXPortalUser()).thenReturn(xPortalUserDao);
                Mockito.when(xPortalUserDao.getById(userId)).thenReturn(tUser);
 
@@ -264,6 +279,19 @@ public class TestRangerServiceService {
                xServiceDef.setGuid("1427365526516_835_0");
                xServiceDef.setId(userId);
 
+               XXServiceVersionInfoDao xServiceVersionInfoDao = 
Mockito.mock(XXServiceVersionInfoDao.class);
+
+               XXServiceVersionInfo serviceVersionInfo = new 
XXServiceVersionInfo();
+               serviceVersionInfo.setServiceId(xService.getId());
+               
serviceVersionInfo.setPolicyVersion(xService.getPolicyVersion());
+               
serviceVersionInfo.setPolicyUpdateTime(xService.getPolicyUpdateTime());
+               serviceVersionInfo.setTagVersion(xService.getTagVersion());
+               
serviceVersionInfo.setTagUpdateTime(xService.getTagUpdateTime());
+
+               
Mockito.when(daoManager.getXXServiceVersionInfo()).thenReturn(xServiceVersionInfoDao);
+               
Mockito.when(xServiceVersionInfoDao.findByServiceId(xService.getId())).thenReturn(
+                               serviceVersionInfo);
+
                
Mockito.when(daoManager.getXXPortalUser()).thenReturn(xPortalUserDao);
                Mockito.when(xPortalUserDao.getById(userId)).thenReturn(tUser);
 
@@ -337,6 +365,19 @@ public class TestRangerServiceService {
                xServiceDef.setGuid("1427365526516_835_0");
                xServiceDef.setId(userId);
 
+               XXServiceVersionInfoDao xServiceVersionInfoDao = 
Mockito.mock(XXServiceVersionInfoDao.class);
+
+               XXServiceVersionInfo serviceVersionInfo = new 
XXServiceVersionInfo();
+               serviceVersionInfo.setServiceId(xService.getId());
+               
serviceVersionInfo.setPolicyVersion(xService.getPolicyVersion());
+               
serviceVersionInfo.setPolicyUpdateTime(xService.getPolicyUpdateTime());
+               serviceVersionInfo.setTagVersion(xService.getTagVersion());
+               
serviceVersionInfo.setTagUpdateTime(xService.getTagUpdateTime());
+
+               
Mockito.when(daoManager.getXXServiceVersionInfo()).thenReturn(xServiceVersionInfoDao);
+               
Mockito.when(xServiceVersionInfoDao.findByServiceId(xService.getId())).thenReturn(
+                               serviceVersionInfo);
+
                Mockito.when(daoManager.getXXService()).thenReturn(xServiceDao);
                Mockito.when(xServiceDao.getAll()).thenReturn(xServiceList);
 

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/cb58449b/security-admin/src/test/java/org/apache/ranger/service/TestRangerServiceServiceBase.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/test/java/org/apache/ranger/service/TestRangerServiceServiceBase.java
 
b/security-admin/src/test/java/org/apache/ranger/service/TestRangerServiceServiceBase.java
index 5dff936..216c338 100644
--- 
a/security-admin/src/test/java/org/apache/ranger/service/TestRangerServiceServiceBase.java
+++ 
b/security-admin/src/test/java/org/apache/ranger/service/TestRangerServiceServiceBase.java
@@ -32,8 +32,10 @@ import org.apache.ranger.common.UserSessionBase;
 import org.apache.ranger.common.db.BaseDao;
 import org.apache.ranger.db.RangerDaoManager;
 import org.apache.ranger.db.XXServiceDefDao;
+import org.apache.ranger.db.XXServiceVersionInfoDao;
 import org.apache.ranger.entity.XXService;
 import org.apache.ranger.entity.XXServiceDef;
+import org.apache.ranger.entity.XXServiceVersionInfo;
 import org.apache.ranger.plugin.model.RangerService;
 import org.apache.ranger.plugin.util.SearchFilter;
 import org.apache.ranger.security.context.RangerContextHolder;
@@ -169,6 +171,19 @@ public class TestRangerServiceServiceBase {
                RangerService rangerService = rangerService();
                XXService service = service();
 
+               XXServiceVersionInfoDao xServiceVersionInfoDao = 
Mockito.mock(XXServiceVersionInfoDao.class);
+
+               XXServiceVersionInfo serviceVersionInfo = new 
XXServiceVersionInfo();
+               serviceVersionInfo.setServiceId(service.getId());
+               serviceVersionInfo.setPolicyVersion(service.getPolicyVersion());
+               
serviceVersionInfo.setPolicyUpdateTime(service.getPolicyUpdateTime());
+               serviceVersionInfo.setTagVersion(service.getTagVersion());
+               
serviceVersionInfo.setPolicyUpdateTime(service.getTagUpdateTime());
+
+               
Mockito.when(daoManager.getXXServiceVersionInfo()).thenReturn(xServiceVersionInfoDao);
+               
Mockito.when(xServiceVersionInfoDao.findByServiceId(service.getId())).thenReturn(
+                               serviceVersionInfo);
+
                
Mockito.when(daoManager.getXXServiceDef()).thenReturn(xServiceDefDao);
                
Mockito.when(xServiceDefDao.getById(service.getType())).thenReturn(
                                xServiceDef);

Reply via email to