source code formatting.
[utils] / system / general / src / main / java / org / wamblee / system / graph / component / CheckExternallyRequiredVisitor.java
index 025608a9169eab08fe06ed7afc02d888a2b13973..63eadfbe49c4a9ec317d718db68251f130ac1221 100644 (file)
 /*
  * Copyright 2008 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.
  * 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.
- */ 
+ */
 package org.wamblee.system.graph.component;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
 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;
+
+
 /**
- * Visitor that checks externally required services: 
- * <ul>
- *   <li>
- * </ul>
- * 
- * @author Erik Brakkee
+ * Visitor that checks whether all required external interfaces of the
+ * container are provided.
  *
+ * @author Erik Brakkee
  */
 public class CheckExternallyRequiredVisitor implements Visitor {
-    
-    public CheckExternallyRequiredVisitor() { 
-        // Empty.
+    /**
+     * DOCUMENT ME!
+     */
+    private Log LOG = LogFactory.getLog(CheckExternallyRequiredVisitor.class);
+
+    /**
+     * DOCUMENT ME!
+     */
+    private Graph graph;
+
+    /**
+     * Creates a new CheckExternallyRequiredVisitor object.
+     *
+     * @param aGraph DOCUMENT ME!
+     */
+    public CheckExternallyRequiredVisitor(Graph aGraph) {
+        graph = aGraph;
     }
 
+    /**
+     * DOCUMENT ME!
+     *
+     * @param aEdge DOCUMENT ME!
+     */
     @Override
     public void visitEdge(Edge aEdge) {
         // Empty.
     }
 
+    /**
+     * DOCUMENT ME!
+     *
+     * @param aNode DOCUMENT ME!
+     */
     @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.warn(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);
+                }
             }
         }
     }
-
 }