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.util.Collections.unmodifiableSet; 023 024 import java.util.HashMap; 025 import java.util.HashSet; 026 import java.util.Map; 027 import java.util.Set; 028 029 import org.apache.commons.graph.Edge; 030 import org.apache.commons.graph.Graph; 031 import org.apache.commons.graph.Vertex; 032 033 /** 034 * Basic abstract in-memory based of a simple read-only {@link Graph} implementation. 035 * 036 * Subclasses may load adjacency list/edges set in the constructor, 037 * or expose {@link org.apache.commons.graph.MutableGraph} APIs. 038 * 039 * @param <V> the Graph vertices type 040 * @param <E> the Graph edges type 041 */ 042 public abstract class BaseGraph<V extends Vertex, E extends Edge<V>> 043 implements Graph<V, E> 044 { 045 046 private final Map<V, Set<E>> adjacencyList = new HashMap<V, Set<E>>(); 047 048 private final Set<E> allEdges = new HashSet<E>(); 049 050 /** 051 * {@inheritDoc} 052 */ 053 public final Set<V> getVertices() 054 { 055 return unmodifiableSet( adjacencyList.keySet() ); 056 } 057 058 /** 059 * {@inheritDoc} 060 */ 061 public final Set<E> getEdges() 062 { 063 return unmodifiableSet( allEdges ); 064 } 065 066 /** 067 * {@inheritDoc} 068 */ 069 public final Set<E> getEdges( V v ) 070 { 071 return unmodifiableSet( adjacencyList.get( v ) ); 072 } 073 074 /** 075 * {@inheritDoc} 076 */ 077 public final Set<V> getVertices( E e ) 078 { 079 Set<V> vertices = new HashSet<V>(); 080 081 vertices.add( e.getHead() ); 082 vertices.add( e.getTail() ); 083 084 return unmodifiableSet( vertices ); 085 } 086 087 /** 088 * Returns the adjacency list where stored vertex/edges. 089 * 090 * @return the adjacency list where stored vertex/edges. 091 */ 092 protected final Map<V, Set<E>> getAdjacencyList() 093 { 094 return adjacencyList; 095 } 096 097 /** 098 * Returns the set with all Graph edges. 099 * 100 * @return the set with all Graph edges. 101 */ 102 protected final Set<E> getAllEdges() 103 { 104 return allEdges; 105 } 106 107 }