001 /*
002 *
003 * $Revision: 15371 $ $Date: 2009-06-15 16:50:47 +0200 (Mon, 15 Jun 2009) $
004 *
005 * This file is part of *** M y C o R e ***
006 * See http://www.mycore.de/ for details.
007 *
008 * This program is free software; you can use it, redistribute it
009 * and / or modify it under the terms of the GNU General Public License
010 * (GPL) as published by the Free Software Foundation; either version 2
011 * of the License or (at your option) any later version.
012 *
013 * This program is distributed in the hope that it will be useful, but
014 * WITHOUT ANY WARRANTY; without even the implied warranty of
015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
016 * GNU General Public License for more details.
017 *
018 * You should have received a copy of the GNU General Public License
019 * along with this program, in a file called gpl.txt or license.txt.
020 * If not, write to the Free Software Foundation Inc.,
021 * 59 Temple Place - Suite 330, Boston, MA 02111-1307 USA
022 */
023
024 package org.mycore.backend.hibernate;
025
026 import java.sql.Timestamp;
027 import java.text.DateFormat;
028 import java.text.SimpleDateFormat;
029 import java.util.ArrayList;
030 import java.util.List;
031
032 import org.hibernate.Criteria;
033 import org.hibernate.Session;
034 import org.hibernate.criterion.Projections;
035 import org.hibernate.criterion.Restrictions;
036 import org.hibernate.tool.hbm2ddl.SchemaUpdate;
037
038 import org.mycore.access.mcrimpl.MCRAccessStore;
039 import org.mycore.access.mcrimpl.MCRRuleMapping;
040 import org.mycore.backend.hibernate.tables.MCRACCESS;
041 import org.mycore.backend.hibernate.tables.MCRACCESSPK;
042 import org.mycore.backend.hibernate.tables.MCRACCESSRULE;
043
044 /**
045 * Hibernate implementation of acceess store to manage access rights
046 *
047 * @author Arne Seifert
048 *
049 */
050 public class MCRHIBAccessStore extends MCRAccessStore {
051 private static final DateFormat DATE_FORMAT = new SimpleDateFormat(sqlDateformat);
052
053 public MCRHIBAccessStore() {
054 createTables();
055 }
056
057 public String getRuleID(String objID, String ACPool) {
058
059 Session session = MCRHIBConnection.instance().getSession();
060 Criteria c = session.createCriteria(MCRACCESS.class).setProjection(Projections.property("rule.rid")).add(
061 Restrictions.eq("key.objid", objID)).add(Restrictions.eq("key.acpool", ACPool));
062 return (String) c.uniqueResult();
063 }
064
065 public void createTables() {
066 try {
067 // update schema -> first time create table
068 new SchemaUpdate(MCRHIBConnection.instance().getConfiguration()).execute(true, true);
069 } catch (Exception e) {
070 logger.error("error at createTables()", e);
071 }
072 }
073
074 /**
075 * method creates a new AccessDefinition in db
076 *
077 * @param rulemapping
078 * with values
079 */
080 public void createAccessDefinition(MCRRuleMapping rulemapping) {
081
082 if (!existAccessDefinition(rulemapping.getPool(), rulemapping.getObjId())) {
083 Session session = MCRHIBConnection.instance().getSession();
084 MCRACCESSRULE accessRule = getAccessRule(rulemapping.getRuleId());
085 if (accessRule == null) {
086 throw new NullPointerException("Cannot map a null rule.");
087 }
088 MCRACCESS accdef = new MCRACCESS();
089
090 accdef.setKey(new MCRACCESSPK(rulemapping.getPool(), rulemapping.getObjId()));
091 accdef.setRule(accessRule);
092 accdef.setCreator(rulemapping.getCreator());
093 accdef.setCreationdate(Timestamp.valueOf(DATE_FORMAT.format(rulemapping.getCreationdate())));
094 session.save(accdef);
095 }
096 }
097
098 /**
099 * internal helper method to check existance of object
100 *
101 * @param ruleid
102 * @param pool
103 * @param objid
104 * @return boolean value
105 */
106 @SuppressWarnings("unchecked")
107 private boolean existAccessDefinition(String pool, String objid) {
108 Session session = MCRHIBConnection.instance().getSession();
109 MCRACCESSPK key = new MCRACCESSPK(pool, objid);
110 List<MCRACCESS> l = session.createCriteria(MCRACCESS.class).add(Restrictions.eq("key", key)).list();
111 if (l.size() == 1) {
112 return true;
113 }
114 return false;
115 }
116
117 public boolean existsRule(String objid, String pool) {
118 Session session = MCRHIBConnection.instance().getSession();
119
120 if (objid == null || objid.equals("")) {
121 logger.warn("empty parameter objid in existsRule");
122 return false;
123 }
124
125 Criteria criteria = session.createCriteria(MCRACCESS.class);
126 criteria.setProjection(Projections.rowCount());
127 criteria.add(Restrictions.eq("key.objid", objid));
128 if (pool != null && !pool.equals("")) {
129 criteria.add(Restrictions.eq("key.acpool", pool));
130 }
131 int count = ((Number) criteria.uniqueResult()).intValue();
132 if (count > 0) {
133 return true;
134 }
135 return false;
136 }
137
138 /**
139 * delete given definition in db
140 *
141 * @param rulemapping
142 * rule to be deleted
143 */
144 public void deleteAccessDefinition(MCRRuleMapping rulemapping) {
145
146 Session session = MCRHIBConnection.instance().getSession();
147 session.createQuery(
148 "delete MCRACCESS " + "where ACPOOL = '" + rulemapping.getPool() + "'" + " AND OBJID = '" + rulemapping.getObjId() + "'")
149 .executeUpdate();
150 }
151
152 /**
153 * update AccessDefinition in db for given MCRAccessData
154 */
155 public void updateAccessDefinition(MCRRuleMapping rulemapping) {
156 Session session = MCRHIBConnection.instance().getSession();
157 MCRACCESSRULE accessRule = getAccessRule(rulemapping.getRuleId());
158 if (accessRule == null) {
159 throw new NullPointerException("Cannot map a null rule.");
160 }
161 // update
162 MCRACCESS accdef = (MCRACCESS) session.get(MCRACCESS.class, new MCRACCESSPK(rulemapping.getPool(), rulemapping.getObjId()));
163 accdef.setRule(accessRule);
164 accdef.setCreator(rulemapping.getCreator());
165 accdef.setCreationdate(Timestamp.valueOf(DATE_FORMAT.format(rulemapping.getCreationdate())));
166 session.update(accdef);
167 }
168
169 /**
170 * method returns AccessDefinition for given key values
171 *
172 * @param ruleid
173 * name of rule
174 * @param pool
175 * name of accesspool
176 * @param objid
177 * objectid of MCRObject
178 * @return MCRAccessData
179 */
180 public MCRRuleMapping getAccessDefinition(String pool, String objid) {
181
182 Session session = MCRHIBConnection.instance().getSession();
183 MCRRuleMapping rulemapping = new MCRRuleMapping();
184 MCRACCESS data = ((MCRACCESS) session.createCriteria(MCRACCESS.class).add(Restrictions.eq("key", new MCRACCESSPK(pool, objid)))
185 .list().get(0));
186 if (data != null) {
187 rulemapping.setCreationdate(data.getCreationdate());
188 rulemapping.setCreator(data.getCreator());
189 rulemapping.setObjId(data.getKey().getObjid());
190 rulemapping.setPool(data.getKey().getAcpool());
191 rulemapping.setRuleId(data.getRule().getRid());
192 }
193 session.evict(data);
194 return rulemapping;
195 }
196
197 @SuppressWarnings("unchecked")
198 public ArrayList<String> getMappedObjectId(String pool) {
199
200 Session session = MCRHIBConnection.instance().getSession();
201 ArrayList<String> ret = new ArrayList<String>();
202
203 List<MCRACCESS> l = session.createQuery("from MCRACCESS where ACPOOL = '" + pool + "'").list();
204 for (int i = 0; i < l.size(); i++) {
205 ret.add(((MCRACCESS) l.get(i)).getKey().getObjid());
206 }
207
208 return ret;
209 }
210
211 @SuppressWarnings("unchecked")
212 public ArrayList<String> getPoolsForObject(String objid) {
213
214 Session session = MCRHIBConnection.instance().getSession();
215 ArrayList<String> ret = new ArrayList<String>();
216 List<MCRACCESS> l = session.createQuery("from MCRACCESS where OBJID = '" + objid + "'").list();
217 for (int i = 0; i < l.size(); i++) {
218 MCRACCESS access = (MCRACCESS) l.get(i);
219 ret.add(access.getKey().getAcpool());
220 }
221
222 return ret;
223 }
224
225 @SuppressWarnings("unchecked")
226 public ArrayList<String> getDatabasePools() {
227
228 ArrayList<String> ret = new ArrayList<String>();
229 Session session = MCRHIBConnection.instance().getSession();
230 List<MCRACCESS> l = session.createCriteria(MCRACCESS.class).list();
231 for (int i = 0; i < l.size(); i++) {
232 if (!ret.contains(((MCRACCESS) l.get(i)).getKey().getAcpool())) {
233 ret.add(((MCRACCESS) l.get(i)).getKey().getAcpool());
234 }
235 }
236 return ret;
237 }
238
239 @SuppressWarnings("unchecked")
240 public List getDistinctStringIDs() {
241 List<String> ret;
242 Session session = MCRHIBConnection.instance().getSession();
243 String query = "select distinct(key.objid) from MCRACCESS order by OBJID";
244 ret = session.createQuery(query).list();
245 return ret;
246 }
247
248 private static MCRACCESSRULE getAccessRule(String rid) {
249 Session session = MCRHIBConnection.instance().getSession();
250 return (MCRACCESSRULE) session.get(MCRACCESSRULE.class, rid);
251 }
252 }