001 /* 002 * JBoss DNA (http://www.jboss.org/dna) 003 * See the COPYRIGHT.txt file distributed with this work for information 004 * regarding copyright ownership. Some portions may be licensed 005 * to Red Hat, Inc. under one or more contributor license agreements. 006 * See the AUTHORS.txt file in the distribution for a full listing of 007 * individual contributors. 008 * 009 * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA 010 * is licensed to you under the terms of the GNU Lesser General Public License as 011 * published by the Free Software Foundation; either version 2.1 of 012 * the License, or (at your option) any later version. 013 * 014 * JBoss DNA is distributed in the hope that it will be useful, 015 * but WITHOUT ANY WARRANTY; without even the implied warranty of 016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 017 * Lesser General Public License for more details. 018 * 019 * You should have received a copy of the GNU Lesser General Public 020 * License along with this software; if not, write to the Free 021 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 022 * 02110-1301 USA, or see the FSF site: http://www.fsf.org. 023 */ 024 package org.jboss.dna.connector.store.jpa.util; 025 026 import java.util.HashMap; 027 import java.util.Map; 028 import java.util.Set; 029 import javax.persistence.EntityManager; 030 import net.jcip.annotations.NotThreadSafe; 031 import org.jboss.dna.connector.store.jpa.model.common.WorkspaceEntity; 032 033 /** 034 * A manager and cache for {@link WorkspaceEntity} objects. 035 * 036 * @author Randall Hauch 037 */ 038 @NotThreadSafe 039 public class Workspaces { 040 041 private final EntityManager entityManager; 042 private final Map<String, WorkspaceEntity> cache = new HashMap<String, WorkspaceEntity>(); 043 044 public Workspaces( EntityManager manager ) { 045 this.entityManager = manager; 046 } 047 048 /** 049 * Create a workspace with the supplied name. 050 * 051 * @param workspaceName the name of the workspace; may not be null 052 * @return the workspace entity, or null if there already was a workspace with the supplied name 053 */ 054 public WorkspaceEntity create( String workspaceName ) { 055 assert workspaceName != null; 056 WorkspaceEntity entity = cache.get(workspaceName); 057 if (entity != null) return null; 058 entity = WorkspaceEntity.findByName(entityManager, workspaceName, false); 059 if (entity != null) return null; 060 // Create one ... 061 entity = WorkspaceEntity.findByName(entityManager, workspaceName, true); 062 cache.put(workspaceName, entity); 063 return entity; 064 } 065 066 /** 067 * Get the workspace with the supplied name, and optionally create a new one if missing. 068 * 069 * @param workspaceName the name of the workspace; never null 070 * @param createIfRequired true if the workspace should be created if there is no existing workspace with the supplied name 071 * @return the workspace entity, or null if no workspace existed with the supplied name and <code>createIfRequired</code> was 072 * false 073 */ 074 public WorkspaceEntity get( String workspaceName, 075 boolean createIfRequired ) { 076 WorkspaceEntity entity = cache.get(workspaceName); 077 if (entity == null) { 078 entity = WorkspaceEntity.findByName(entityManager, workspaceName, createIfRequired); 079 if (entity != null) { 080 cache.put(workspaceName, entity); 081 } 082 } 083 return entity; 084 } 085 086 /** 087 * Find the set of names for the existing workspaces. 088 * 089 * @return the set of names; never null 090 */ 091 public Set<String> getWorkspaceNames() { 092 return WorkspaceEntity.findAllNames(entityManager); 093 } 094 095 /** 096 * Remove the entity representation of the workspace. This does not remove any other data associated with the workspace other 097 * than the {@link WorkspaceEntity} record. 098 * 099 * @param workspaceName the name of the workspace; may not be null 100 * @return true if the workspace record was found and removed, or false if there was no workspace with the supplied name 101 */ 102 public boolean destroy( String workspaceName ) { 103 assert workspaceName != null; 104 WorkspaceEntity entity = cache.remove(workspaceName); 105 if (entity == null) { 106 entity = WorkspaceEntity.findByName(entityManager, workspaceName, false); 107 } 108 if (entity != null) { 109 entityManager.remove(entity); 110 } 111 return entity != null; 112 } 113 }