You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by si...@apache.org on 2012/03/07 20:25:09 UTC
svn commit: r1298048 - in
/commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph:
./ shortestpath/
Author: simonetripodi
Date: Wed Mar 7 19:25:09 2012
New Revision: 1298048
URL: http://svn.apache.org/viewvc?rev=1298048&view=rev
Log:
started defining the function that get the edges weight - edges are now graph type agnostic
Added:
commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/WeightedEdges.java (with props)
commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultWeightedEdgesSelector.java (with props)
commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/WeightedEdgesSelector.java (with props)
Modified:
commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/CommonsGraph.java
commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultHeuristicBuilder.java
commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultPathSourceSelector.java
commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultShortestPathAlgorithmSelector.java
commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultTargetSourceSelector.java
Modified: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/CommonsGraph.java
URL: http://svn.apache.org/viewvc/commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/CommonsGraph.java?rev=1298048&r1=1298047&r2=1298048&view=diff
==============================================================================
--- commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/CommonsGraph.java (original)
+++ commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/CommonsGraph.java Wed Mar 7 19:25:09 2012
@@ -43,10 +43,9 @@ import org.apache.commons.graph.model.Di
import org.apache.commons.graph.model.UndirectedMutableGraph;
import org.apache.commons.graph.scc.DefaultSccAlgorithmSelector;
import org.apache.commons.graph.scc.SccAlgorithmSelector;
-import org.apache.commons.graph.shortestpath.DefaultPathSourceSelector;
-import org.apache.commons.graph.shortestpath.PathSourceSelector;
+import org.apache.commons.graph.shortestpath.DefaultWeightedEdgesSelector;
+import org.apache.commons.graph.shortestpath.WeightedEdgesSelector;
import org.apache.commons.graph.spanning.DefaultSpanningTreeSourceSelector;
-import org.apache.commons.graph.spanning.SpanningTreeSourceSelector;
import org.apache.commons.graph.visit.DefaultVisitSourceSelector;
import org.apache.commons.graph.visit.VisitSourceSelector;
@@ -104,10 +103,10 @@ public final class CommonsGraph<V, E, G
* @param <G>
* @param graph
*/
- public static <V, WE, W, G extends Graph<V, WE, W>> PathSourceSelector<V, WE, W, G> findShortestPath( G graph )
+ public static <V, WE, G extends Graph<V, WE>> WeightedEdgesSelector<V, WE, G> findShortestPath( G graph )
{
- graph = checkNotNull( graph, "Minimum spanning tree can not be calculated on null graph" );
- return new DefaultPathSourceSelector<V, WE, W, G>( graph );
+ graph = checkNotNull( graph, "Shortest path can not be calculated on null graph" );
+ return new DefaultWeightedEdgesSelector<V, WE, G>( graph );
}
/**
@@ -234,17 +233,6 @@ public final class CommonsGraph<V, E, G
return synchronizedObject( graph, MutableGraph.class );
}
- /**
- * Returns a synchronized (thread-safe) {@link WeightedGraph} backed by the specified Graph.
- *
- * @param graph
- * @return
- */
- public static <V, WE, W> Graph<V, WE> synchronize( WeightedGraph<V, WE, W> graph )
- {
- return synchronizedObject( graph, WeightedGraph.class );
- }
-
/**
* Wrap the given object in a proxed one where all methods declared in the given interface will be synchronized.
*
Added: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/WeightedEdges.java
URL: http://svn.apache.org/viewvc/commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/WeightedEdges.java?rev=1298048&view=auto
==============================================================================
--- commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/WeightedEdges.java (added)
+++ commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/WeightedEdges.java Wed Mar 7 19:25:09 2012
@@ -0,0 +1,28 @@
+package org.apache.commons.graph;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+// TODO find a better name
+public interface WeightedEdges<E, W>
+{
+
+ W getWeightForEdge( E edge );
+
+}
Propchange: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/WeightedEdges.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/WeightedEdges.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/WeightedEdges.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultHeuristicBuilder.java
URL: http://svn.apache.org/viewvc/commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultHeuristicBuilder.java?rev=1298048&r1=1298047&r2=1298048&view=diff
==============================================================================
--- commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultHeuristicBuilder.java (original)
+++ commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultHeuristicBuilder.java Wed Mar 7 19:25:09 2012
@@ -27,6 +27,7 @@ import java.util.Set;
import org.apache.commons.graph.DirectedGraph;
import org.apache.commons.graph.Graph;
+import org.apache.commons.graph.WeightedEdges;
import org.apache.commons.graph.WeightedPath;
import org.apache.commons.graph.collections.FibonacciHeap;
import org.apache.commons.graph.weight.OrderedMonoid;
@@ -37,15 +38,18 @@ final class DefaultHeuristicBuilder<V, W
private final G graph;
+ private final WeightedEdges<WE, W> weightedEdges;
+
private final V start;
private final V goal;
private final WO weightOperations;
- public DefaultHeuristicBuilder( G graph, V source, V target, WO weightOperations )
+ public DefaultHeuristicBuilder( G graph, WeightedEdges<WE, W> weightedEdges, V source, V target, WO weightOperations )
{
this.graph = graph;
+ this.weightedEdges = weightedEdges;
this.start = source;
this.goal = target;
this.weightOperations = weightOperations;
@@ -89,8 +93,7 @@ final class DefaultHeuristicBuilder<V, W
}
closedSet.add( current );
-
- @SuppressWarnings( "unchecked" ) // unsafe cast protected by the instanceof statement that already verifies the assignment
+
Iterable<V> connected = ( graph instanceof DirectedGraph ) ? ( (DirectedGraph<V, WE>) graph ).getOutbound( current )
: graph.getConnectedVertices( current );
for ( V v : connected )
@@ -99,7 +102,7 @@ final class DefaultHeuristicBuilder<V, W
{
WE edge = graph.getEdge( current, v );
// note that the weight of current can never be undefined
- W tentativeGScore = weightOperations.append( gScores.getWeight( current ), edge.getWeight() );
+ W tentativeGScore = weightOperations.append( gScores.getWeight( current ), weightedEdges.getWeightForEdge( edge ) );
// if the first condition fails, v has already been visited (its weight is defined)
if ( openSet.add( v ) || weightOperations.compare( tentativeGScore, gScores.getWeight( v ) ) < 0 )
Modified: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultPathSourceSelector.java
URL: http://svn.apache.org/viewvc/commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultPathSourceSelector.java?rev=1298048&r1=1298047&r2=1298048&view=diff
==============================================================================
--- commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultPathSourceSelector.java (original)
+++ commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultPathSourceSelector.java Wed Mar 7 19:25:09 2012
@@ -27,18 +27,22 @@ import java.util.Map;
import org.apache.commons.graph.Graph;
import org.apache.commons.graph.UndirectedGraph;
import org.apache.commons.graph.VertexPair;
+import org.apache.commons.graph.WeightedEdges;
import org.apache.commons.graph.WeightedPath;
import org.apache.commons.graph.weight.OrderedMonoid;
-public final class DefaultPathSourceSelector<V, WE, W, G extends Graph<V, WE>>
+final class DefaultPathSourceSelector<V, WE, W, G extends Graph<V, WE>>
implements PathSourceSelector<V, WE, W, G>
{
private final G graph;
- public DefaultPathSourceSelector( G graph )
+ private final WeightedEdges<WE, W> weightedEdges;
+
+ public DefaultPathSourceSelector( G graph, WeightedEdges<WE, W> weightedEdges )
{
this.graph = graph;
+ this.weightedEdges = weightedEdges;
}
/**
@@ -55,11 +59,11 @@ public final class DefaultPathSourceSele
for ( WE we : graph.getEdges() )
{
VertexPair<V> vertexPair = graph.getVertices( we );
- shortestPaths.addShortestDistance( vertexPair.getHead(), vertexPair.getTail(), we.getWeight() );
+ shortestPaths.addShortestDistance( vertexPair.getHead(), vertexPair.getTail(), weightedEdges.getWeightForEdge( we ) );
if ( graph instanceof UndirectedGraph )
{
- shortestPaths.addShortestDistance( vertexPair.getTail(), vertexPair.getHead(), we.getWeight() );
+ shortestPaths.addShortestDistance( vertexPair.getTail(), vertexPair.getHead(), weightedEdges.getWeightForEdge( we ) );
}
}
@@ -139,7 +143,7 @@ public final class DefaultPathSourceSele
public TargetSourceSelector<V, WE, W, G> from( V source )
{
source = checkNotNull( source, "Shortest path can not be calculated from a null source" );
- return new DefaultTargetSourceSelector<V, WE, W, G>( graph, source );
+ return new DefaultTargetSourceSelector<V, WE, W, G>( graph, weightedEdges, source );
}
}
\ No newline at end of file
Modified: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultShortestPathAlgorithmSelector.java
URL: http://svn.apache.org/viewvc/commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultShortestPathAlgorithmSelector.java?rev=1298048&r1=1298047&r2=1298048&view=diff
==============================================================================
--- commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultShortestPathAlgorithmSelector.java (original)
+++ commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultShortestPathAlgorithmSelector.java Wed Mar 7 19:25:09 2012
@@ -26,6 +26,7 @@ import java.util.Queue;
import java.util.Set;
import org.apache.commons.graph.Graph;
+import org.apache.commons.graph.WeightedEdges;
import org.apache.commons.graph.WeightedPath;
import org.apache.commons.graph.collections.FibonacciHeap;
import org.apache.commons.graph.weight.OrderedMonoid;
@@ -36,13 +37,16 @@ final class DefaultShortestPathAlgorithm
private final G graph;
+ private final WeightedEdges<WE, W> weightedEdges;
+
private final V source;
private final V target;
- public DefaultShortestPathAlgorithmSelector( G graph, V source, V target )
+ public DefaultShortestPathAlgorithmSelector( G graph, WeightedEdges<WE, W> weightedEdges, V source, V target )
{
this.graph = graph;
+ this.weightedEdges = weightedEdges;
this.source = source;
this.target = target;
}
@@ -53,7 +57,7 @@ final class DefaultShortestPathAlgorithm
public <WO extends OrderedMonoid<W>> HeuristicBuilder<V, WE, W, G, WO> applyingAStar( WO weightOperations )
{
weightOperations = checkNotNull( weightOperations, "A* algorithm can not be applied using null weight operations" );
- return new DefaultHeuristicBuilder<V, WE, W, G, WO>( graph, source, target, weightOperations );
+ return new DefaultHeuristicBuilder<V, WE, W, G, WO>( graph, weightedEdges, source, target, weightOperations );
}
/**
@@ -94,7 +98,7 @@ final class DefaultShortestPathAlgorithm
WE edge = graph.getEdge( vertex, v );
if ( shortestDistances.alreadyVisited( vertex ) )
{
- W shortDist = weightOperations.append( shortestDistances.getWeight( vertex ), edge.getWeight() );
+ W shortDist = weightOperations.append( shortestDistances.getWeight( vertex ), weightedEdges.getWeightForEdge( edge ) );
if ( !shortestDistances.alreadyVisited( v )
|| weightOperations.compare( shortDist, shortestDistances.getWeight( v ) ) < 0 )
Modified: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultTargetSourceSelector.java
URL: http://svn.apache.org/viewvc/commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultTargetSourceSelector.java?rev=1298048&r1=1298047&r2=1298048&view=diff
==============================================================================
--- commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultTargetSourceSelector.java (original)
+++ commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultTargetSourceSelector.java Wed Mar 7 19:25:09 2012
@@ -23,6 +23,7 @@ import static org.apache.commons.graph.u
import org.apache.commons.graph.Graph;
import org.apache.commons.graph.VertexPair;
+import org.apache.commons.graph.WeightedEdges;
import org.apache.commons.graph.WeightedPath;
import org.apache.commons.graph.weight.OrderedMonoid;
@@ -32,11 +33,14 @@ final class DefaultTargetSourceSelector<
private final G graph;
+ private final WeightedEdges<WE, W> weightedEdges;
+
private final V source;
- public DefaultTargetSourceSelector( G graph, V source )
+ public DefaultTargetSourceSelector( G graph, WeightedEdges<WE, W> weightedEdges, V source )
{
this.graph = graph;
+ this.weightedEdges = weightedEdges;
this.source = source;
}
@@ -62,7 +66,7 @@ final class DefaultTargetSourceSelector<
if ( shortestDistances.alreadyVisited( u ) )
{
- W shortDist = weightOperations.append( shortestDistances.getWeight( u ), edge.getWeight() );
+ W shortDist = weightOperations.append( shortestDistances.getWeight( u ), weightedEdges.getWeightForEdge( edge ) );
if ( !shortestDistances.alreadyVisited( v )
|| weightOperations.compare( shortDist, shortestDistances.getWeight( v ) ) < 0 )
@@ -85,7 +89,7 @@ final class DefaultTargetSourceSelector<
if ( shortestDistances.alreadyVisited( u ) )
{
- W shortDist = weightOperations.append( shortestDistances.getWeight( u ), edge.getWeight() );
+ W shortDist = weightOperations.append( shortestDistances.getWeight( u ), weightedEdges.getWeightForEdge( edge ) );
if ( !shortestDistances.alreadyVisited( v )
|| weightOperations.compare( shortDist, shortestDistances.getWeight( v ) ) < 0 )
@@ -124,7 +128,7 @@ final class DefaultTargetSourceSelector<
public ShortestPathAlgorithmSelector<V, WE, W, G> to( V target )
{
target = checkNotNull( target, "Shortest path can not be calculated to a null target" );
- return new DefaultShortestPathAlgorithmSelector<V, WE, W, G>( graph, source, target );
+ return new DefaultShortestPathAlgorithmSelector<V, WE, W, G>( graph, weightedEdges, source, target );
}
}
Added: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultWeightedEdgesSelector.java
URL: http://svn.apache.org/viewvc/commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultWeightedEdgesSelector.java?rev=1298048&view=auto
==============================================================================
--- commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultWeightedEdgesSelector.java (added)
+++ commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultWeightedEdgesSelector.java Wed Mar 7 19:25:09 2012
@@ -0,0 +1,44 @@
+package org.apache.commons.graph.shortestpath;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import static org.apache.commons.graph.utils.Assertions.checkNotNull;
+
+import org.apache.commons.graph.Graph;
+import org.apache.commons.graph.WeightedEdges;
+
+public final class DefaultWeightedEdgesSelector<V, WE, G extends Graph<V, WE>>
+ implements WeightedEdgesSelector<V, WE, G>
+{
+
+ private final G graph;
+
+ public DefaultWeightedEdgesSelector( G graph )
+ {
+ this.graph = graph;
+ }
+
+ public <W> PathSourceSelector<V, WE, W, G> whereEdgesHaveWeights( WeightedEdges<WE, W> weightedEdges )
+ {
+ weightedEdges = checkNotNull( weightedEdges, "Function to calculate edges weight can not be null." );
+ return new DefaultPathSourceSelector<V, WE, W, G>( graph, weightedEdges );
+ }
+
+}
Propchange: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultWeightedEdgesSelector.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultWeightedEdgesSelector.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/DefaultWeightedEdgesSelector.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/WeightedEdgesSelector.java
URL: http://svn.apache.org/viewvc/commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/WeightedEdgesSelector.java?rev=1298048&view=auto
==============================================================================
--- commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/WeightedEdgesSelector.java (added)
+++ commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/WeightedEdgesSelector.java Wed Mar 7 19:25:09 2012
@@ -0,0 +1,32 @@
+package org.apache.commons.graph.shortestpath;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.commons.graph.Graph;
+import org.apache.commons.graph.WeightedEdges;
+
+// TODO find a better name
+public interface WeightedEdgesSelector<V, WE, G extends Graph<V, WE>>
+{
+
+ // TODO find a better sentence
+ <W> PathSourceSelector<V, WE, W, G> whereEdgesHaveWeights( WeightedEdges<WE, W> weightedEdges );
+
+}
Propchange: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/WeightedEdgesSelector.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/WeightedEdgesSelector.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: commons/sandbox/graph/branches/drop-marker-interfaces-feature/src/main/java/org/apache/commons/graph/shortestpath/WeightedEdgesSelector.java
------------------------------------------------------------------------------
svn:mime-type = text/plain