From: Robert L. <rle...@us...> - 2007-03-08 13:38:57
|
Update of /cvsroot/ccmtools/ccmtools/src/ccmtools/CppGenerator In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv11158/src/ccmtools/CppGenerator Modified Files: CppAssemblyGenerator.java Log Message: new prototype Index: CppAssemblyGenerator.java =================================================================== RCS file: /cvsroot/ccmtools/ccmtools/src/ccmtools/CppGenerator/CppAssemblyGenerator.java,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** CppAssemblyGenerator.java 5 Mar 2007 09:21:21 -0000 1.8 --- CppAssemblyGenerator.java 8 Mar 2007 13:38:51 -0000 1.9 *************** *** 144,150 **** protected String data_MComponentDef( String data_type, String data_value ) { ! if (data_type.equals("AssemblyInnerComponentVariable")) { ! return variable_AssemblyInnerComponentVariable(); } if (data_type.equals("AssemblyInnerComponentVariableCreation")) --- 144,151 ---- protected String data_MComponentDef( String data_type, String data_value ) { ! if (data_type.equals("AssemblyImplVariable")) { ! return variable_AssemblyInnerComponentVariable() ! + variable_AssemblySingleToMultipleCookieVariable(); } if (data_type.equals("AssemblyInnerComponentVariableCreation")) *************** *** 154,162 **** if (data_type.equals("AssemblyInnerComponentInclude")) { ! return variable_AssemblyInnerComponentInclude(); ! } ! if (data_type.equals("AssemblyInnerHomeInclude")) ! { ! return variable_AssemblyInnerHomeInclude(); } if (data_type.equals("AssemblyCcmActivate")) --- 155,159 ---- if (data_type.equals("AssemblyInnerComponentInclude")) { ! return variable_AssemblyInnerHomeInclude() + variable_AssemblyInnerComponentInclude(); } if (data_type.equals("AssemblyCcmActivate")) *************** *** 168,185 **** return variable_AssemblyCcmRemove(); } ! if(data_type.equals("AssemblyImplBase")) { ! // TODO ! return "/* AssemblyImplBase */"; } ! if(data_type.equals("AssemblyImplPrototype")) { ! // TODO ! return "// AssemblyImplPrototype"; } ! if(data_type.equals("AssemblyImplDefinition")) { ! // TODO ! return "// AssemblyImplDefinition"; } return super.data_MComponentDef(data_type, data_value); --- 165,187 ---- return variable_AssemblyCcmRemove(); } ! if (data_type.equals("AssemblyImplBase")) { ! return "\n" + TAB + ", virtual public ::Components::ComponentDelegator"; } ! if (data_type.equals("AssemblyImplPrototype")) { ! final String VV = TAB + "virtual "; ! final String O = "::Components::Object::SmartPtr"; ! final String C = "::Components::Cookie"; ! final String N = "::Components::FeatureName"; ! StringBuilder c = new StringBuilder(); ! c.append(VV + O + " provide(const std::string& name);\n"); ! c.append(VV + C + " connect(const " + N + "& name, " + O + " f);\n"); ! c.append(VV + "void disconnect(const " + N + "& name, " + C + " const& ck);\n"); ! return c.toString(); } ! if (data_type.equals("AssemblyImplDefinition")) { ! return variable_AssemblyImplDefinition(); } return super.data_MComponentDef(data_type, data_value); *************** *** 188,198 **** protected String variable_AssemblyInnerComponentVariable() { ! StringBuffer code = new StringBuffer(); Map<String, MComponentDef> map = getAssemblyLocalComponents(); for (String key : map.keySet()) { MComponentDef comp_def = map.get(key); ! String cpp_type = getLocalCxxName(comp_def, "::"); ! code.append(TAB + cpp_type + "::SmartPtr " + key + "_;\n"); for (Object o : comp_def.getFacets()) { --- 190,199 ---- protected String variable_AssemblyInnerComponentVariable() { ! StringBuilder code = new StringBuilder(); Map<String, MComponentDef> map = getAssemblyLocalComponents(); for (String key : map.keySet()) { MComponentDef comp_def = map.get(key); ! code.append(TAB + "::Components::CCMObject::SmartPtr " + key + "_;\n"); for (Object o : comp_def.getFacets()) { *************** *** 267,278 **** code_creation.append(TAB).append("assert("); code_creation.append(keyless_var).append(");\n"); ! final String obj_type = "::wamas::platform::utils::SmartPtr< ::Components::CCMObject>"; ! String obj_var = createLocalVar(local_var_map, obj_type, code_homes); ! code_creation.append(TAB).append(obj_var); ! code_creation.append(" = ").append(keyless_var).append("->create_component();\n"); ! String cpp_type = getLocalCxxName(comp_def, "::"); ! code_creation.append(TAB).append(key); ! code_creation.append("_.eat(dynamic_cast< ").append(cpp_type); ! code_creation.append("*>(").append(obj_var).append(".ptr()));\n"); } else --- 268,273 ---- code_creation.append(TAB).append("assert("); code_creation.append(keyless_var).append(");\n"); ! code_creation.append(TAB).append(key).append("_ = "); ! code_creation.append(keyless_var).append("->create_component();\n"); } else *************** *** 291,297 **** code_creation.append(key).append("_);\n"); } - StringBuilder result = new StringBuilder(); - result.append(code_homes); - result.append(code_creation); for (AssemblyElement e : currentAssembly.getElements()) { --- 286,289 ---- *************** *** 300,315 **** Constant c = (Constant) e; Port target = c.getTarget(); String value = c.getValue().toString(); StringBuilder code = new StringBuilder(); ! code.append(TAB); ! code.append(target.getComponent()); ! code.append("_->"); code.append(target.getConnector()); code.append("("); code.append(value); code.append(");\n"); ! result.append(code); } } return result.toString(); } --- 292,314 ---- Constant c = (Constant) e; Port target = c.getTarget(); + String target_comp = target.getComponent(); String value = c.getValue().toString(); StringBuilder code = new StringBuilder(); ! String target_type = getLocalCxxName(map.get(target_comp), "::") + "*"; ! String target_var = createLocalVar(local_var_map, target_type, code_homes); ! code.append(TAB + target_var + " = dynamic_cast< " + target_type + ">("); ! code.append(target_comp + "_.ptr());\n"); ! code.append(TAB + "assert(" + target_var + ");\n"); ! code.append(TAB + target_var + "->"); code.append(target.getConnector()); code.append("("); code.append(value); code.append(");\n"); ! code_creation.append(code); } } + StringBuilder result = new StringBuilder(); + result.append(code_homes); + result.append(code_creation); return result.toString(); } *************** *** 317,333 **** protected String variable_AssemblyInnerComponentInclude() { HashSet<String> include_set = new HashSet<String>(); ! StringBuffer code = new StringBuffer(); ! Map<String, MComponentDef> map = getAssemblyLocalComponents(); ! for (String key : map.keySet()) ! { ! MComponentDef comp_def = map.get(key); ! String inc_name = getLocalCxxIncludeName(comp_def); ! if (!include_set.contains(inc_name)) ! { ! code.append("#include <" + inc_name + "_gen.h>\n"); ! include_set.add(inc_name); ! } ! } return code.toString(); } --- 316,324 ---- protected String variable_AssemblyInnerComponentInclude() { + if (currentAssembly == null) + return ""; HashSet<String> include_set = new HashSet<String>(); ! StringBuilder code = new StringBuilder(); ! // TODO return code.toString(); } *************** *** 358,368 **** } ! protected String variable_AssemblyCcmActivate() { if (currentAssembly == null) return ""; MComponentDef comp_def = (MComponentDef) currentNode; ! StringBuilder activation_code = new StringBuilder(); ! HashSet<String> outer_facets = new HashSet<String>(); for (AssemblyElement e : currentAssembly.getElements()) { --- 349,358 ---- } ! protected String variable_AssemblySingleToMultipleCookieVariable() { if (currentAssembly == null) return ""; MComponentDef comp_def = (MComponentDef) currentNode; ! StringBuilder code = new StringBuilder(); for (AssemblyElement e : currentAssembly.getElements()) { *************** *** 370,392 **** { Connection c = (Connection) e; ! StringBuilder code = generate_AssemblyCcmActivate(c, comp_def, outer_facets); ! activation_code.append(code); } ! else if (e instanceof Attribute) { ! Attribute a = (Attribute) e; ! Port target = a.getTarget(); ! String source = a.getSource(); ! StringBuilder code = new StringBuilder(); ! code.append(TAB2); ! code.append(target.getComponent()); ! code.append("_->"); ! code.append(target.getConnector()); ! code.append("(this->"); ! code.append(source); ! code.append("_);\n"); ! activation_code.append(code); } } for (Object o : comp_def.getFacets()) { --- 360,421 ---- { Connection c = (Connection) e; ! Port source = c.getFacet(); ! if (source.getComponent() == null) ! { ! Port target = c.getReceptacle(); ! String target_comp = target.getComponent(); ! if (target_comp != null) ! { ! String source_name = source.getConnector(); ! MUsesDef outer_receptacle = getReceptacle(comp_def, source_name); ! MComponentDef inner_comp = getAssemblyLocalComponents().get(target_comp); ! String target_name = target.getConnector(); ! MUsesDef inner_receptacle = getReceptacle(inner_comp, target_name); ! boolean outer_multiple = outer_receptacle.isMultiple(); ! boolean inner_multiple = inner_receptacle.isMultiple(); ! if (outer_multiple != inner_multiple) ! { ! code.append(TAB).append("::Components::Cookie "); ! code.append(source_name).append("_;\n"); ! } ! } ! } } ! } ! return code.toString(); ! } ! ! protected String variable_AssemblyImplDefinition() ! { ! if (currentAssembly == null) ! return ""; ! MComponentDef comp_def = (MComponentDef) currentNode; ! StringBuilder provide = new StringBuilder(); ! StringBuilder connect = new StringBuilder(); ! StringBuilder disconnect = new StringBuilder(); ! HashSet<String> outer_facets = new HashSet<String>(); ! for (AssemblyElement e : currentAssembly.getElements()) ! { ! if (e instanceof Connection) { ! Connection c = (Connection) e; ! Port source = c.getFacet(); ! Port target = c.getReceptacle(); ! if (target.getComponent() == null) ! { ! // connect to an outer facet ! String target_name = target.getConnector(); ! outer_facets.add(target_name); ! generateProvideImpl(target_name, source, provide); ! } ! if (source.getComponent() == null) ! { ! // connect from an outer receptacle ! String source_name = source.getConnector(); ! generateConnectionImpl(source_name, target, connect, disconnect); ! } } } + // for (Object o : comp_def.getFacets()) { *************** *** 399,558 **** } } ! Map<String, MComponentDef> map = getAssemblyLocalComponents(); ! for (String key : map.keySet()) { ! activation_code.append(TAB2 + key + "_->configuration_complete();\n"); } ! return activation_code.toString(); } ! 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() { - StringBuilder code = new StringBuilder(); Map<String, MComponentDef> map = getAssemblyLocalComponents(); ! for (String key : map.keySet()) { ! code.append(TAB2 + key + "_->remove();\n"); } ! return code.toString(); } ! private 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(); --- 428,623 ---- } } ! // ! StringBuilder c = new StringBuilder(); ! String CLS = comp_def.getIdentifier() + "_impl::"; ! final String O = "::Components::Object::SmartPtr"; ! final String C = "::Components::Cookie"; ! final String N = "::Components::FeatureName"; ! c.append(O + "\n" + CLS + "provide(const std::string& name)\n{\n"); ! c.append(provide); ! c.append(TAB + "throw ::Components::InvalidName();\n"); ! c.append("}\n\n"); ! c.append(C + "\n" + CLS + "connect(const " + N + "& name, " + O + " f)\n{\n"); ! c.append(connect); ! c.append(TAB + "throw ::Components::InvalidName();\n"); ! c.append("}\n\n"); ! c.append("void\n" + CLS + "disconnect(const " + N + "& name, " + C + " const& ck)\n{\n"); ! c.append(disconnect); ! c.append(TAB + "throw ::Components::InvalidName();\n"); ! c.append("}\n\n"); ! return c.toString(); ! } ! ! // connect to an outer facet ! private void generateProvideImpl( String target_name, Port source, StringBuilder code ) ! { ! code.append(TAB + "if(name==\"" + target_name + "\")\n"); ! code.append(TAB + "{\n"); ! if (source.getComponent() == null) { ! // special use case: facet/receptacle loop ! code.append(TAB2 + "return ::Components::Object::SmartPtr();\n"); } ! else ! { ! // connect from an inner facet ! code.append(TAB2 + "return " + source.getComponent()); ! code.append("_->provide_facet(\"" + source.getConnector() + "\");\n"); ! } ! code.append(TAB + "}\n"); } ! // connect from an outer receptacle ! private void generateConnectionImpl( String source_name, Port target, ! StringBuilder connect_code, StringBuilder disconnect_code ) { ! connect_code.append(TAB + "if(name==\"" + source_name + "\")\n"); ! connect_code.append(TAB + "{\n"); ! disconnect_code.append(TAB + "if(name==\"" + source_name + "\")\n"); ! disconnect_code.append(TAB + "{\n"); ! String target_comp = target.getComponent(); String target_name = target.getConnector(); ! MComponentDef comp_def = (MComponentDef) currentNode; ! if (target_comp == null) { ! // special use case: facet/receptacle loop String real_type = comp_def.getIdentifier() + "_" + target_name + "_impl"; ! String impl_code = TAB2 + real_type + "* impl = dynamic_cast<" + real_type + "*>(get_" ! + target_name + "());\n"; ! connect_code.append(impl_code); ! connect_code.append(TAB2 + "impl->target = f;\n"); ! disconnect_code.append(impl_code); ! disconnect_code.append(TAB2 + "impl->target.forget();\n"); } else { ! // connect to an inner receptacle ! MUsesDef outer_receptacle = getReceptacle(comp_def, source_name); ! MComponentDef inner_comp = getAssemblyLocalComponents().get(target_comp); ! MUsesDef inner_receptacle = getReceptacle(inner_comp, target_name); ! boolean outer_multiple = outer_receptacle.isMultiple(); ! boolean inner_multiple = inner_receptacle.isMultiple(); ! if (outer_multiple == inner_multiple) { ! // both receptacles are single or multiple ! connect_code.append(TAB2 + "return " + target_comp + "_->connect(\""); ! connect_code.append(target_name + "\", f);\n"); ! disconnect_code.append(TAB2 + target_comp + "_->disconnect(\""); ! disconnect_code.append(target_name + "\", ck);\n"); ! disconnect_code.append(TAB2 + "return;\n"); } else { ! if (outer_multiple) ! { ! throw new RuntimeException("cannot connect outer multiple receptacle " ! + source_name + " with inner single receptacle " + target_name); ! } ! // connect outer single receptacle with inner multiple receptacle ! connect_code.append(TAB2 + source_name + "_ = "); ! connect_code.append(target_comp + "_->connect(\""); ! connect_code.append(target_name + "\", f);\n"); ! connect_code.append(TAB2 + "return " + source_name + "_;\n"); ! disconnect_code.append(TAB2 + target_comp + "_->disconnect(\""); ! disconnect_code.append(target_name + "\", " + source_name + "_);\n"); ! disconnect_code.append(TAB2 + "return;\n"); } } ! connect_code.append(TAB + "}\n"); ! disconnect_code.append(TAB + "}\n"); } ! private static MUsesDef getReceptacle( MComponentDef comp_def, String name ) ! { ! for (Object o : comp_def.getReceptacles()) ! { ! MUsesDef u = (MUsesDef) o; ! if (u.getIdentifier().equals(name)) ! return u; ! } ! throw new RuntimeException("cannot find receptacle: " + name); ! } ! protected String variable_AssemblyCcmActivate() { ! if (currentAssembly == null) ! return ""; ! StringBuilder activation_code = new StringBuilder(); ! for (AssemblyElement e : currentAssembly.getElements()) { ! if (e instanceof Connection) { ! Connection c = (Connection) e; ! Port source = c.getFacet(); ! Port target = c.getReceptacle(); ! String source_comp = source.getComponent(); ! String target_comp = target.getComponent(); ! if (source_comp != null && target_comp != null) { ! activation_code.append(TAB2); ! activation_code.append(target_comp); ! activation_code.append("_->connect(\""); ! activation_code.append(target.getConnector()); ! activation_code.append("\", "); ! activation_code.append(source_comp); ! activation_code.append("_->provide_facet(\""); ! activation_code.append(source.getConnector()); ! activation_code.append("\"));\n"); } } ! else if (e instanceof Attribute) { ! Attribute a = (Attribute) e; ! activation_code.append(generateCopyAttribute(a, true)); } } ! Map<String, MComponentDef> map = getAssemblyLocalComponents(); ! for (String key : map.keySet()) { ! activation_code.append(TAB2 + key + "_->configuration_complete();\n"); } ! return activation_code.toString(); } ! private StringBuilder generateCopyAttribute( Attribute a, boolean create_block ) { Map<String, MComponentDef> map = getAssemblyLocalComponents(); ! Port target = a.getTarget(); ! String target_comp = target.getComponent(); ! String source = a.getSource(); ! StringBuilder code = new StringBuilder(); ! String target_type = getLocalCxxName(map.get(target_comp), "::") + "*"; ! String HEAD; ! if (create_block) { ! code.append(TAB2 + "{\n"); ! HEAD = TAB3; } ! else ! { ! HEAD = TAB2; ! } ! code.append(HEAD + target_type + " target = dynamic_cast< " + target_type + ">("); ! code.append(target_comp + "_.ptr());\n"); ! code.append(HEAD + "assert(target);\n"); ! code.append(HEAD + "target->"); ! code.append(target.getConnector()); ! code.append("(this->"); ! code.append(source); ! code.append("_);\n"); ! if (create_block) ! { ! code.append(TAB2 + "}\n"); ! } ! return code; } ! protected String variable_AssemblyCcmRemove() { StringBuilder code = new StringBuilder(); ! Map<String, MComponentDef> map = getAssemblyLocalComponents(); ! for (String key : map.keySet()) { ! code.append(TAB2 + key + "_->remove();\n"); } return code.toString(); *************** *** 625,632 **** return variable_AssemblyTargetVariable(); } - if (dataType.equals("AssemblyGetFacetCode")) - { - return variable_AssemblyGetFacetCode(); - } return super.data_MProvidesDef(dataType, dataValue); } --- 690,693 ---- *************** *** 640,676 **** } - protected String variable_AssemblyGetFacetCode() - { - if (currentAssembly == null) - return ""; - MProvidesDef provides = (MProvidesDef) currentNode; - StringBuilder result = new StringBuilder(); - result.append(TAB).append("if(ccm_activate_ok) {\n"); - result.append(TAB2).append("facet->target = "); - result.append(getAssemblyInitFacetTargetValue(provides)).append(";\n"); - result.append(TAB).append("}\n"); - return result.toString(); - } - - private String getAssemblyInitFacetTargetValue( MProvidesDef provides ) - { - String name = provides.getIdentifier(); - for (AssemblyElement e : currentAssembly.getElements()) - { - if (e instanceof Connection) - { - Connection c = (Connection) e; - Port target = c.getReceptacle(); - if (target.getComponent() == null && target.getConnector().equals(name)) - { - MComponentDef comp_def = currentAssembly.getCcmComponent(); - Port source = c.getFacet(); - return getFacetValue(source, comp_def); - } - } - } - throw new RuntimeException("facet " + name + " is not connected to an inner component"); - } - protected String generateOperationImpl( MProvidesDef provides, MOperationDef op ) { --- 701,704 ---- *************** *** 711,714 **** --- 739,743 ---- StringBuilder result = new StringBuilder(); boolean empty = true; + Map<String, MComponentDef> map = getAssemblyLocalComponents(); for (AssemblyElement e : currentAssembly.getElements()) { *************** *** 718,736 **** if (a.getSource().equals(source)) { - Port target = a.getTarget(); - StringBuilder code = new StringBuilder(); - code.append(TAB2); - code.append(target.getComponent()); - code.append("_->"); - code.append(target.getConnector()); - code.append("(this->"); - code.append(source); - code.append("_);\n"); if (empty) { ! result.append(TAB + "if(ccm_activate_ok) {\n"); empty = false; } ! result.append(code); } } --- 747,760 ---- if (a.getSource().equals(source)) { if (empty) { ! result.append(TAB + "if(ccm_activate_ok)\n" + TAB + "{\n"); ! result.append(generateCopyAttribute(a, false)); empty = false; } ! else ! { ! throw new RuntimeException("attribute \"" + source + "\""); ! } } } |