From: Robert L. <rle...@us...> - 2007-03-01 15:55:25
|
Update of /cvsroot/ccmtools/ccmtools/src/ccmtools/CppGenerator In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv26491/src/ccmtools/CppGenerator Modified Files: CppAssemblyGenerator.java CppGenerator.java Log Message: *) disconnect implemented *) multiple receptacle prepared Index: CppGenerator.java =================================================================== RCS file: /cvsroot/ccmtools/ccmtools/src/ccmtools/CppGenerator/CppGenerator.java,v retrieving revision 1.38 retrieving revision 1.39 diff -C2 -d -r1.38 -r1.39 *** CppGenerator.java 19 Jan 2007 12:07:16 -0000 1.38 --- CppGenerator.java 1 Mar 2007 15:55:20 -0000 1.39 *************** *** 1091,1094 **** --- 1091,1113 ---- return getLocalCxxName((MUsesDef)currentNode, Text.SCOPE_SEPARATOR); } + else if (data_type.equals("MultipleReceptacleType")) + { + MUsesDef uses = (MUsesDef) currentNode; + MComponentDef component = uses.getComponent(); + return component.getIdentifier() + "_" + uses.getIdentifier() + "_Connections"; + } + else if (data_type.equals("MultipleReceptacleName")) + { + MUsesDef uses = (MUsesDef) currentNode; + MComponentDef component = uses.getComponent(); + MContainer module = component.getDefinedIn(); + if (module == null) + { + return Text.SCOPE_SEPARATOR + component.getIdentifier() + "_" + + uses.getIdentifier() + "_Connections"; + } + return getLocalCxxName(module, Text.SCOPE_SEPARATOR) + Text.SCOPE_SEPARATOR + + component.getIdentifier() + "_" + uses.getIdentifier() + "_Connections"; + } else if(data_type.startsWith("MOperation")) { Index: CppAssemblyGenerator.java =================================================================== RCS file: /cvsroot/ccmtools/ccmtools/src/ccmtools/CppGenerator/CppAssemblyGenerator.java,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** CppAssemblyGenerator.java 28 Feb 2007 10:54:52 -0000 1.6 --- CppAssemblyGenerator.java 1 Mar 2007 15:55:20 -0000 1.7 *************** *** 16,19 **** --- 16,20 ---- import java.util.List; import java.util.Map; + import java.util.Set; import java.util.logging.Logger; import ccmtools.CcmtoolsException; *************** *** 34,37 **** --- 35,39 ---- import ccmtools.parser.idl.metamodel.ComponentIDL.MHomeDef; import ccmtools.parser.idl.metamodel.ComponentIDL.MProvidesDef; + import ccmtools.parser.idl.metamodel.ComponentIDL.MUsesDef; import ccmtools.ui.UserInterfaceDriver; import ccmtools.utils.Text; *************** *** 166,169 **** --- 168,175 ---- return variable_AssemblyCcmRemove(); } + if (data_type.equals("AssemblyDisconnect")) + { + return variable_AssemblyDisconnect(); + } return super.data_MComponentDef(data_type, data_value); } *************** *** 353,384 **** { Connection c = (Connection) e; ! StringBuilder code = new StringBuilder(); ! String code_tail; ! Port target = c.getReceptacle(); ! String target_name = target.getConnector(); ! if (target.getComponent() == null) ! { ! // connect to an outer facet ! code.append(TAB2 + "if(" + target_name + "_) {\n"); ! String real_type = comp_def.getIdentifier() + "_" + target_name + "_impl"; ! code.append(TAB3 + real_type + "* facet = dynamic_cast<" + real_type + "*>(" ! + target_name + "_);\n"); ! code.append(TAB3 + "facet->target = "); ! code_tail = ";\n" + TAB2 + "}\n"; ! outer_facets.add(target_name); ! } ! else ! { ! // connect to the receptacle of an inner component ! code.append(TAB2); ! code.append(target.getComponent()); ! code.append("_->connect_"); ! code.append(target_name); ! code.append("("); ! code_tail = ");\n"; ! } ! Port source = c.getFacet(); ! code.append(getFacetValue(source)); ! code.append(code_tail); activation_code.append(code); } --- 359,363 ---- { Connection c = (Connection) e; ! StringBuilder code = generate_AssemblyCcmActivate(c, comp_def, outer_facets); activation_code.append(code); } *************** *** 417,420 **** --- 396,488 ---- } + private StringBuilder generate_AssemblyCcmActivate( Connection c, MComponentDef comp_def, + Set<String> outer_facets ) + { + StringBuilder code = new StringBuilder(); + Port source = c.getFacet(); + String source_value = getFacetValue(source, comp_def); + Port target = c.getReceptacle(); + String target_name = target.getConnector(); + if (target.getComponent() == null) + { + // connect to an outer facet + if (outer_multiple_receptacle_) + { + throw new RuntimeException("invalid loop"); + } + code.append(TAB2 + "if(" + target_name + "_) {\n"); + String real_type = comp_def.getIdentifier() + "_" + target_name + "_impl"; + code.append(TAB3 + real_type + "* facet = dynamic_cast<" + real_type + "*>(" + + target_name + "_);\n"); + code.append(TAB3 + "facet->target = "); + outer_facets.add(target_name); + code.append(source_value); + code.append(";\n" + TAB2 + "}\n"); + } + else + { + // connect to the receptacle of an inner component + if (outer_multiple_receptacle_) + { + // TODO + code.append(TAB2 + "// TODO: multiple receptacle\n"); + } + else + { + code.append(TAB2); + code.append(target.getComponent()); + code.append("_->connect_"); + code.append(target_name); + code.append("("); + code.append(source_value); + code.append(");\n"); + } + } + return code; + } + + private static MUsesDef outer_receptacle_; + + private static boolean outer_multiple_receptacle_; + + private static String getFacetValue( Port source, MComponentDef comp_def ) + { + outer_receptacle_ = null; + outer_multiple_receptacle_ = false; + StringBuilder code = new StringBuilder(); + String source_name = source.getConnector(); + if (source.getComponent() == null) + { + // connect from an outer receptacle + for (Object o : comp_def.getReceptacles()) + { + MUsesDef u = (MUsesDef) o; + if (u.getIdentifier().equals(source_name)) + { + outer_receptacle_ = u; + break; + } + } + if (outer_receptacle_ == null) + { + throw new RuntimeException("cannot find receptacle: " + source_name); + } + outer_multiple_receptacle_ = outer_receptacle_.isMultiple(); + if (outer_multiple_receptacle_) + code.append("ctx->get_connections_"); + else + code.append("ctx->get_connection_"); + } + else + { + // connect from the facet of an inner component + code.append(source.getComponent()); + code.append("_->provide_"); + } + code.append(source_name); + code.append("()"); + return code.toString(); + } + protected String variable_AssemblyCcmRemove() { *************** *** 428,431 **** --- 496,551 ---- } + protected String variable_AssemblyDisconnect() + { + if (currentAssembly == null) + return ""; + StringBuilder code = new StringBuilder(); + for (AssemblyElement e : currentAssembly.getElements()) + { + if (e instanceof Connection) + { + Connection c = (Connection) e; + Port source = c.getFacet(); + if (source.getComponent() == null) + { + code.append(TAB).append("if(receptacle==\""); + code.append(source.getConnector()).append("\") {\n"); + Port target = c.getReceptacle(); + if (target.getComponent() == null) + { + // the user disconnects a receptacle which has been + // connected to a facet implementation of the assembly + code.append(TAB2).append("throw ::Components::Exception("); + code.append("\"cannnot disconnect loop\");\n"); + } + else + { + // disconnect from inner component + { + // calculate 'outer_multiple_receptacle_' + getFacetValue(source, currentAssembly.getCcmComponent()); + } + code.append(TAB2).append("try {\n"); + if (outer_multiple_receptacle_) + { + // TODO disconnect multiple receptacle + code.append(TAB3 + "// TODO: multiple receptacle\n"); + } + else + { + code.append(TAB3).append(target.getComponent()); + code.append("_->disconnect_").append(target.getConnector()); + code.append("();\n"); + } + code.append(TAB2).append("} catch(...) {/* OOPS */}\n"); + code.append(TAB2).append("return;\n"); + } + code.append(TAB).append("}\n"); + } + } + } + return code.toString(); + } + private Map<String, Map<String, MComponentDef>> assembly_local_components_ = new HashMap<String, Map<String, MComponentDef>>(); *************** *** 533,538 **** if (target.getComponent() == null && target.getConnector().equals(name)) { Port source = c.getFacet(); ! return getFacetValue(source); } } --- 653,659 ---- if (target.getComponent() == null && target.getConnector().equals(name)) { + MComponentDef comp_def = currentAssembly.getCcmComponent(); Port source = c.getFacet(); ! return getFacetValue(source, comp_def); } } *************** *** 541,563 **** } - private static String getFacetValue( Port source ) - { - StringBuilder code = new StringBuilder(); - if (source.getComponent() == null) - { - // connect from an outer receptacle - code.append("ctx->get_connection_"); - } - else - { - // connect from the facet of an inner component - code.append(source.getComponent()); - code.append("_->provide_"); - } - code.append(source.getConnector()); - code.append("()"); - return code.toString(); - } - protected String generateOperationImpl( MProvidesDef provides, MOperationDef op ) { --- 662,665 ---- |