/* * Copyright (c) 2002-2009 "Neo Technology," * Network Engine for Objects in Lund AB [http://neotechnology.com] * * This file is part of Neo4j. * * Neo4j is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.neo4j.kernel.impl.core; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.transaction.TransactionManager; import org.neo4j.graphdb.RelationshipType; import org.neo4j.kernel.impl.nioneo.store.RelationshipTypeData; import org.neo4j.kernel.impl.persistence.EntityIdGenerator; import org.neo4j.kernel.impl.persistence.PersistenceManager; import org.neo4j.kernel.impl.util.ArrayMap; public class RelationshipTypeHolder { private ArrayMap<String,Integer> relTypes = new ArrayMap<String,Integer>( 5, true, true ); private Map<Integer,String> relTranslation = new ConcurrentHashMap<Integer,String>(); private final TransactionManager transactionManager; private final PersistenceManager persistenceManager; private final EntityIdGenerator idGenerator; private final RelationshipTypeCreator relTypeCreator; RelationshipTypeHolder( TransactionManager transactionManager, PersistenceManager persistenceManager, EntityIdGenerator idGenerator, RelationshipTypeCreator relTypeCreator ) { this.transactionManager = transactionManager; this.persistenceManager = persistenceManager; this.idGenerator = idGenerator; this.relTypeCreator = relTypeCreator; } void addRawRelationshipTypes( RelationshipTypeData[] types ) { for ( int i = 0; i < types.length; i++ ) { addRawRelationshipType( types[i] ); } } void addRawRelationshipType( RelationshipTypeData type ) { relTypes.put( type.getName(), type.getId() ); relTranslation.put( type.getId(), type.getName() ); } public RelationshipType addValidRelationshipType( String name, boolean create ) { if ( relTypes.get( name ) == null ) { if ( !create ) { return null; } int id = createRelationshipType( name ); relTranslation.put( id, name ); } else { relTranslation.put( relTypes.get( name ), name ); } return new RelationshipTypeImpl( name ); } boolean isValidRelationshipType( RelationshipType type ) { return relTypes.get( type.name() ) != null; } private static class RelationshipTypeImpl implements RelationshipType { private String name; RelationshipTypeImpl( String name ) { assert name != null; this.name = name; } public String name() { return name; } public String toString() { return name; } public boolean equals( Object o ) { if ( !(o instanceof RelationshipType) ) { return false; } return name.equals( ((RelationshipType) o).name() ); } public int hashCode() { return name.hashCode(); } } private synchronized int createRelationshipType( String name ) { Integer id = relTypes.get( name ); if ( id != null ) { return id; } id = relTypeCreator.getOrCreate( transactionManager, idGenerator, persistenceManager, this, name ); addRelType( name, id ); return id; } void addRelType( String name, Integer id ) { relTypes.put( name, id ); } void removeRelType( String name ) { relTypes.remove( name ); } void removeRelType( int id ) { String name = relTranslation.remove( id ); if ( name != null ) { relTypes.remove( name ); } } int getIdFor( RelationshipType type ) { return getIdFor( type.name() ); } public Integer getIdFor( String name ) { return relTypes.get( name ); } RelationshipType getRelationshipType( int id ) { String name = relTranslation.get( id ); if ( name != null ) { return new RelationshipTypeImpl( name ); } return null; } public Iterable<RelationshipType> getRelationshipTypes() { List<RelationshipType> relTypeList = new ArrayList<RelationshipType>(); for ( String name : relTypes.keySet() ) { relTypeList.add( new RelationshipTypeImpl( name ) ); } return relTypeList; } void clear() { relTypes = new ArrayMap<String,Integer>(); relTranslation = new HashMap<Integer,String>(); } }