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    }