001    package org.apache.commons.graph.model;
002    
003    /*
004     * Licensed to the Apache Software Foundation (ASF) under one
005     * or more contributor license agreements.  See the NOTICE file
006     * distributed with this work for additional information
007     * regarding copyright ownership.  The ASF licenses this file
008     * to you under the Apache License, Version 2.0 (the
009     * "License"); you may not use this file except in compliance
010     * with the License.  You may obtain a copy of the License at
011     *
012     *   http://www.apache.org/licenses/LICENSE-2.0
013     *
014     * Unless required by applicable law or agreed to in writing,
015     * software distributed under the License is distributed on an
016     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017     * KIND, either express or implied.  See the License for the
018     * specific language governing permissions and limitations
019     * under the License.
020     */
021    
022    import static java.lang.String.format;
023    
024    import java.util.HashSet;
025    
026    import org.apache.commons.graph.Edge;
027    import org.apache.commons.graph.Graph;
028    import org.apache.commons.graph.GraphException;
029    import org.apache.commons.graph.MutableGraph;
030    import org.apache.commons.graph.Vertex;
031    
032    /**
033     * Basic abstract in-memory based of a simple mutable {@link Graph} implementation.
034     *
035     * @param <V> the Graph vertices type
036     * @param <E> the Graph edges type
037     */
038    public abstract class BaseMutableGraph<V extends Vertex, E extends Edge<V>>
039        extends BaseGraph<V, E>
040        implements MutableGraph<V, E>
041    {
042    
043        /**
044         * {@inheritDoc}
045         */
046        public final void addVertex( V v )
047        {
048            if ( v == null )
049            {
050                throw new GraphException( "Impossible to add a null Vertex to the Graph" );
051            }
052    
053            if ( getAdjacencyList().containsKey( v ) ){
054                throw new GraphException( format( "Vertex '%s' already present in the Graph", v ) );
055            }
056    
057            getAdjacencyList().put( v, new HashSet<E>() );
058    
059            decorateAddVertex( v );
060        }
061    
062        /**
063         * 
064         *
065         * @param v
066         */
067        protected abstract void decorateAddVertex( V v );
068    
069        /**
070         * {@inheritDoc}
071         */
072        public final void removeVertex( V v )
073        {
074            if ( v == null )
075            {
076                throw new GraphException( "Impossible to remove a null Vertex from the Graph" );
077            }
078    
079            if ( !getAdjacencyList().containsKey( v ) ){
080                throw new GraphException( format( "Vertex '%s' not present in the Graph", v ) );
081            }
082    
083            getAdjacencyList().remove( v );
084    
085            decorateRemoveVertex( v );
086        }
087    
088        /**
089         * 
090         *
091         * @param v
092         */
093        protected abstract void decorateRemoveVertex( V v );
094    
095        /**
096         * {@inheritDoc}
097         */
098        public final void addEdge( E e )
099        {
100            checkEdge( e );
101    
102            getAllEdges().add( e );
103            getAdjacencyList().get( e.getHead() ).add( e );
104    
105            decorateAddEdge( e );
106        }
107    
108        /**
109         * 
110         *
111         * @param e
112         */
113        protected abstract void decorateAddEdge( E e );
114    
115        /**
116         * {@inheritDoc}
117         */
118        public final void removeEdge( E e )
119        {
120            checkEdge( e );
121    
122            getAllEdges().remove( e );
123            getAdjacencyList().get( e.getHead() ).remove( e );
124    
125            decorateRemoveEdge( e );
126        }
127    
128        /**
129         * 
130         *
131         * @param e
132         */
133        protected abstract void decorateRemoveEdge( E e );
134    
135        /**
136         * Utility method to check if Vertices in the given Edge are present in the Graph.
137         *
138         * @param e the Edge which Vertices have to be checked
139         */
140        private final void checkEdge( E e )
141        {
142            if ( !getAdjacencyList().containsKey( e.getHead() ) )
143            {
144                throw new GraphException( format( "Vertex '%s' not present in the Graph", e.getHead() ) );
145            }
146            if ( !getAdjacencyList().containsKey( e.getTail() ) )
147            {
148                throw new GraphException( format( "Vertex '%s' not present in the Graph", e.getTail() ) );
149            }
150        }
151    
152    }