001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements.  See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership.  The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the
007     * "License"); you may not use this file except in compliance
008     * with the License.  You may obtain a copy of the License at
009     * 
010     *      http://www.apache.org/licenses/LICENSE-2.0
011     * 
012     * Unless required by applicable law or agreed to in writing, software
013     * distributed under the License is distributed on an "AS IS" BASIS,
014     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    package org.apache.oozie.service;
019    
020    import org.apache.oozie.store.StoreException;
021    import org.apache.oozie.service.Service;
022    import org.apache.oozie.service.Services;
023    import org.apache.oozie.store.SLAStore;
024    import org.apache.oozie.store.Store;
025    import org.apache.oozie.store.WorkflowStore;
026    import org.apache.oozie.store.CoordinatorStore;
027    import org.apache.oozie.ErrorCode;
028    import javax.persistence.EntityManager;
029    
030    /**
031     * Base service for persistency of jobs and actions.
032     */
033    public class StoreService implements Service {
034    
035        /**
036         * Return instance of store.
037         *
038         * @return {@link Store}.
039         */
040        @SuppressWarnings("unchecked")
041        public <S extends Store> S getStore(Class<S> klass) throws StoreException {
042            if (WorkflowStore.class.equals(klass)) {
043                return (S) Services.get().get(WorkflowStoreService.class).create();
044            }
045            else {
046                if (CoordinatorStore.class.equals(klass)) {
047                    return (S) Services.get().get(CoordinatorStoreService.class).create();
048                }
049                else {
050                    if (SLAStore.class.equals(klass)) {
051                        return (S) Services.get().get(SLAStoreService.class).create();
052                    }
053                }
054            }
055            // to do add checks for other stores - coordinator and SLA stores
056            throw new StoreException(ErrorCode.E0607, " can not get store StoreService.getStore(Class)", "");
057        }
058    
059        /**
060         * Return instance of store with an EntityManager pointing to an existing Store.
061         *
062         * @return {@link Store}.
063         */
064        @SuppressWarnings("unchecked")
065        public <S extends Store, T extends Store> S getStore(Class<S> klass, T store) throws StoreException {
066            if (WorkflowStore.class.equals(klass)) {
067                return (S) Services.get().get(WorkflowStoreService.class).create(store);
068            }
069            else {
070                if (CoordinatorStore.class.equals(klass)) {
071                    return (S) Services.get().get(CoordinatorStoreService.class).create(store);
072                }
073                else {
074                    if (SLAStore.class.equals(klass)) {
075                        return (S) Services.get().get(SLAStoreService.class).create(store);
076                    }
077                }
078            }
079            throw new StoreException(ErrorCode.E0607, " StoreService.getStore(Class, store)", "");
080        }
081    
082        /**
083         * Return the public interface of the service.
084         *
085         * @return {@link StoreService}.
086         */
087        public Class<? extends Service> getInterface() {
088            return StoreService.class;
089        }
090    
091        private JPAService jpaService;
092    
093        /**
094         * Initializes the {@link StoreService}.
095         *
096         * @param services services instance.
097         */
098        public void init(Services services) throws ServiceException {
099            jpaService = Services.get().get(JPAService.class);
100            if (jpaService == null) {
101                throw new ServiceException(ErrorCode.E0610);
102            }
103        }
104    
105        /**
106         * Destroy the StoreService
107         */
108        public void destroy() {
109        }
110    
111        /**
112         * Return EntityManager
113         */
114        public EntityManager getEntityManager() {
115            return jpaService.getEntityManager();
116        }
117    }