/* * Copyright (c) 2014, 2016 Hewlett-Packard Development Company, L.P. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.aaa.h2.persistence; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.apache.commons.lang3.StringEscapeUtils; import org.opendaylight.aaa.api.IDMStoreUtil; import org.opendaylight.aaa.api.model.Grant; import org.opendaylight.aaa.api.model.Grants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * * @author peter.mellquist@hp.com * */ public class GrantStore extends AbstractStore { private static final Logger LOG = LoggerFactory.getLogger(GrantStore.class); protected final static String SQL_ID = "grantid"; protected final static String SQL_TENANTID = "domainid"; protected final static String SQL_USERID = "userid"; protected final static String SQL_ROLEID = "roleid"; private static final String TABLE_NAME = "GRANTS"; protected GrantStore() { super(TABLE_NAME); } @Override protected String getTableCreationStatement() { return "CREATE TABLE GRANTS " + "(grantid VARCHAR(128) PRIMARY KEY," + "domainid VARCHAR(128) NOT NULL, " + "userid VARCHAR(128) NOT NULL, " + "roleid VARCHAR(128) NOT NULL)"; } protected Grant fromResultSet(ResultSet rs) throws SQLException { Grant grant = new Grant(); try { grant.setGrantid(rs.getString(SQL_ID)); grant.setDomainid(rs.getString(SQL_TENANTID)); grant.setUserid(rs.getString(SQL_USERID)); grant.setRoleid(rs.getString(SQL_ROLEID)); } catch (SQLException sqle) { LOG.error("SQL Exception: ", sqle); throw sqle; } return grant; } protected Grants getGrants(String did, String uid) throws StoreException { Grants grants = new Grants(); try (Connection conn = dbConnect(); PreparedStatement pstmt = conn .prepareStatement("SELECT * FROM grants WHERE domainid = ? AND userid = ?")) { pstmt.setString(1, did); pstmt.setString(2, uid); LOG.debug("query string: {}", pstmt.toString()); grants.setGrants(listFromStatement(pstmt)); } catch (SQLException s) { throw new StoreException("SQL Exception : " + s); } return grants; } protected Grants getGrants(String userid) throws StoreException { Grants grants = new Grants(); try (Connection conn = dbConnect(); PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM GRANTS WHERE userid = ? ")) { pstmt.setString(1, userid); LOG.debug("query string: {}", pstmt.toString()); grants.setGrants(listFromStatement(pstmt)); } catch (SQLException s) { throw new StoreException("SQL Exception : " + s); } return grants; } protected Grant getGrant(String id) throws StoreException { try (Connection conn = dbConnect(); PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM GRANTS WHERE grantid = ? ")) { pstmt.setString(1, id); LOG.debug("query string: ", pstmt.toString()); return firstFromStatement(pstmt); } catch (SQLException s) { throw new StoreException("SQL Exception : " + s); } } protected Grant getGrant(String did, String uid, String rid) throws StoreException { try (Connection conn = dbConnect(); PreparedStatement pstmt = conn .prepareStatement("SELECT * FROM GRANTS WHERE domainid = ? AND userid = ? AND roleid = ? ")) { pstmt.setString(1, did); pstmt.setString(2, uid); pstmt.setString(3, rid); LOG.debug("query string: {}", pstmt.toString()); return firstFromStatement(pstmt); } catch (SQLException s) { throw new StoreException("SQL Exception : " + s); } } protected Grant createGrant(Grant grant) throws StoreException { String query = "insert into grants (grantid,domainid,userid,roleid) values(?,?,?,?)"; try (Connection conn = dbConnect(); PreparedStatement statement = conn.prepareStatement(query)) { statement.setString( 1, IDMStoreUtil.createGrantid(grant.getUserid(), grant.getDomainid(), grant.getRoleid())); statement.setString(2, grant.getDomainid()); statement.setString(3, grant.getUserid()); statement.setString(4, grant.getRoleid()); int affectedRows = statement.executeUpdate(); if (affectedRows == 0) { throw new StoreException("Creating grant failed, no rows affected."); } grant.setGrantid(IDMStoreUtil.createGrantid(grant.getUserid(), grant.getDomainid(), grant.getRoleid())); return grant; } catch (SQLException s) { throw new StoreException("SQL Exception : " + s); } } protected Grant deleteGrant(String grantid) throws StoreException { grantid = StringEscapeUtils.escapeHtml4(grantid); Grant savedGrant = this.getGrant(grantid); if (savedGrant == null) { return null; } String query = String.format("DELETE FROM GRANTS WHERE grantid = '%s'", grantid); try (Connection conn = dbConnect(); Statement statement = conn.createStatement()) { int deleteCount = statement.executeUpdate(query); LOG.debug("deleted {} records", deleteCount); return savedGrant; } catch (SQLException s) { throw new StoreException("SQL Exception : " + s); } } }