(no commit message)
[utils] / system / general / src / main / java / org / wamblee / system / graph / component / CheckExternallyRequiredVisitor.java
index 9e412b6fdbacbb5b3f4e8de6cb4feb1e63bea8b9..1ce53d0732e4de4d67f35785ed04604781c71215 100644 (file)
  * 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 java.util.List;
+
+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;
 
 /**
  * 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 Log LOG = LogFactory.getLog(CheckExternallyRequiredVisitor.class);
+
+    private Graph _graph;
+
+    public CheckExternallyRequiredVisitor(Graph aGraph) {
+        _graph = aGraph;
     }
 
     @Override
@@ -39,10 +49,30 @@ 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.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);
+                }
             }
         }
     }