(no commit message)
[utils] / system / general / src / main / java / org / wamblee / system / graph / component / CheckExternallyRequiredVisitor.java
index 9e412b6fdbacbb5b3f4e8de6cb4feb1e63bea8b9..67343161f66290f5b71384e65971c0131a968f13 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2008 the original author or authors.
+ * Copyright 2005-2010 the original author or authors.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * 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.
- */ 
+ */
 package org.wamblee.system.graph.component;
 
 import org.wamblee.system.core.SystemAssemblyException;
 import org.wamblee.system.graph.Edge;
+import org.wamblee.system.graph.Graph;
 import org.wamblee.system.graph.Node;
 import org.wamblee.system.graph.Visitor;
 
+import java.util.List;
+import java.util.logging.Logger;
+
 /**
  * Visitor that checks whether all required external interfaces of the container
- * are provided. 
+ * are provided.
+ * 
  * @author Erik Brakkee
- *
  */
 public class CheckExternallyRequiredVisitor implements Visitor {
-    
-    public CheckExternallyRequiredVisitor() { 
-        // Empty.
+    private static final Logger LOG = Logger
+        .getLogger(CheckExternallyRequiredVisitor.class.getName());
+
+    private Graph graph;
+
+    /**
+     * Creates a new CheckExternallyRequiredVisitor object.
+     * 
+     */
+    public CheckExternallyRequiredVisitor(Graph aGraph) {
+        graph = aGraph;
     }
 
     @Override
@@ -39,12 +51,35 @@ public class CheckExternallyRequiredVisitor implements Visitor {
 
     @Override
     public void visitNode(Node aNode) {
-        if ( aNode instanceof ExternalRequiredInterfaceNode) { 
-            ExternalRequiredInterfaceNode required = (ExternalRequiredInterfaceNode) aNode; 
-            if ( !required.getRequired().isOptional() && required.getRequired().getProvider() == null) { 
-                throw new SystemAssemblyException(aNode + ": External required interface is not provided");
+        if (aNode instanceof ExternalRequiredInterfaceNode) {
+            ExternalRequiredInterfaceNode required = (ExternalRequiredInterfaceNode) aNode;
+
+            if (!required.getRequired().isOptional() &&
+                (required.getRequired().getProvider() == null)) {
+                throw new SystemAssemblyException(aNode +
+                    ": External required interface is not provided");
+            }
+
+            List<Edge> edges = graph.findIncoming(aNode);
+
+            if (edges.isEmpty()) {
+                LOG.warning(aNode + ": Superfluous required interface");
+            }
+
+            for (Edge edge : edges) {
+                Node from = edge.getFrom();
+                assert from instanceof RequiredInterfaceNode;
+
+                RequiredInterfaceNode reqNode = (RequiredInterfaceNode) from;
+
+                if (!reqNode.getRequired().isOptional() &&
+                    required.getRequired().isOptional()) {
+                    throw new SystemAssemblyException(
+                        aNode +
+                            ": externally required interface is optional but a corresponding internal required interface is mandatory: " +
+                            reqNode);
+                }
             }
         }
     }
-
 }