X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=system%2Fgeneral%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fsystem%2Fgraph%2Fcomponent%2FCheckExternallyRequiredVisitor.java;h=67343161f66290f5b71384e65971c0131a968f13;hb=49ce7cb8387601982d5e6ef186ce206d38f6e3d7;hp=025608a9169eab08fe06ed7afc02d888a2b13973;hpb=aa78ce0aeaa36871bd926eefa1eabf9cb3254c7a;p=utils diff --git a/system/general/src/main/java/org/wamblee/system/graph/component/CheckExternallyRequiredVisitor.java b/system/general/src/main/java/org/wamblee/system/graph/component/CheckExternallyRequiredVisitor.java index 025608a9..67343161 100644 --- a/system/general/src/main/java/org/wamblee/system/graph/component/CheckExternallyRequiredVisitor.java +++ b/system/general/src/main/java/org/wamblee/system/graph/component/CheckExternallyRequiredVisitor.java @@ -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. @@ -12,27 +12,36 @@ * 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 externally required services: - * + * Visitor that checks whether all required external interfaces of the container + * 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 @@ -42,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 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); + } } } } - }