⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlwriter.java

📁 一个用于排队系统仿真的开源软件,有非常形象的图象仿真过程!
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
                writeQueueSection(doc, elem, model, stationKey);
                writeTunnelSection(doc, elem, model, stationKey);
                writeRouterSection(doc, elem, model, stationKey);
            }else if(STATION_TYPE_FORK.equals(stationType)){
                writeQueueSection(doc, elem, model, stationKey);
                writeTunnelSection(doc, elem, model, stationKey);
                writeForkSection(doc, elem, model, stationKey);
            }else if(STATION_TYPE_JOIN.equals(stationType)){
                writeJoinSection(doc, elem, model, stationKey);
                writeTunnelSection(doc, elem, model, stationKey);
                writeRouterSection(doc, elem, model, stationKey);
            }else if(STATION_TYPE_SINK.equals(stationType)){
                writeSinkSection(doc, elem, model, stationKey);
            }
            simNode.appendChild(elem);
        }
    }

    /**
     * Writes a Join input section
     * <br>Author: Bertoli Marco
     * @param doc document root
     * @param node node where created section should be appended
     * @param model data structure
     * @param stationKey search's key for join
     */
    private static void writeJoinSection(Document doc, Node node, CommonModel model, Object stationKey) {
        Element join = doc.createElement(XML_E_STATION_SECTION);
        join.setAttribute(XML_A_STATION_SECTION_CLASSNAME, CLASSNAME_JOIN);
        node.appendChild(join);
    }

    /**
     * Writes a Fork output section
     * <br>Author: Bertoli Marco
     * @param doc document root
     * @param node node where created section should be appended
     * @param model data structure
     * @param stationKey search's key for fork
     */
    private static void writeForkSection(Document doc, Node node, CommonModel model, Object stationKey) {
        Element fork = doc.createElement(XML_E_STATION_SECTION);
        fork.setAttribute(XML_A_STATION_SECTION_CLASSNAME, CLASSNAME_FORK);
        node.appendChild(fork);
        // Creates jobsPerLink parameter
        XMLParameter jobsPerLink = new XMLParameter(
                "jobsPerLink", model.getStationNumberOfServers(stationKey).getClass().getName(), null, model.getStationNumberOfServers(stationKey).toString(), false
        );
        // Creates block parameter
        XMLParameter block = new XMLParameter(
                "block", model.getForkBlock(stationKey).getClass().getName(), null, model.getForkBlock(stationKey).toString(), false
        );
        //...and adds them as fork's children
        jobsPerLink.appendParameterElement(doc, fork);
        block.appendParameterElement(doc, fork);

    }

    static protected void writeSourceSection(Document doc, Node nodeNode,
                                             CommonModel model, Object stationKey){
        Element elem = doc.createElement(XML_E_STATION_SECTION);
        elem.setAttribute(XML_A_STATION_SECTION_CLASSNAME, CLASSNAME_SOURCE);
        nodeNode.appendChild(elem);
        Vector classes = model.getClassKeys();
        //obtain classes that must be generated by this source
        Vector refClasses = getClassesForSource(model, stationKey);
        XMLParameter[] distrParams = new XMLParameter[classes.size()];
        for(int i=0; i<distrParams.length; i++){
            //if current class must be generated by this source
            Object currentClass = classes.get(i);
            if(refClasses.contains(currentClass)){
                distrParams[i] = DistributionWriter.getDistributionParameter(
                        (Distribution)model.getClassDistribution(currentClass),
                        model, currentClass
                );
            }else{
                //otherwise write a null parameter
                String name = "ServiceTimeStrategy";
                distrParams[i] = new XMLParameter(name,
                        strategiesClasspathBase + serviceStrategiesSuffix + name,
                        model.getClassName(currentClass), "null", true);
            }
        }
        //creating global service strategy parameter
        String gspName = "ServiceStrategy";
        XMLParameter globalStrategyParameter = new XMLParameter(
                gspName, strategiesClasspathBase + gspName, null, distrParams, false
        );
        //finally, create node from pareameters and append it to the section element
        globalStrategyParameter.appendParameterElement(doc, elem);
    }

    static protected void writeSinkSection(Document doc, Node nodeNode,
                                           CommonModel model, Object stationKey){
        Element elem = doc.createElement(XML_E_STATION_SECTION);
        elem.setAttribute(XML_A_STATION_SECTION_CLASSNAME, CLASSNAME_SINK);
        nodeNode.appendChild(elem);
    }

    static protected void writeQueueSection(Document doc, Node nodeNode,
                                            CommonModel model, Object stationKey){
        //creating element representing queue section
        Element queue = doc.createElement(XML_E_STATION_SECTION);
        queue.setAttribute(XML_A_STATION_SECTION_CLASSNAME, CLASSNAME_QUEUE);
        nodeNode.appendChild(queue);
        //creating queue inner parameters
        //first create queue size node element
        String queueSize = model.getStationQueueCapacity(stationKey)==null ?
                "-1" : model.getStationQueueCapacity(stationKey).toString();
        XMLParameter queueLength = new XMLParameter(
                "size", "java.lang.Integer", null, queueSize, false
        );
        //...and add it to queue element's children
        queueLength.appendParameterElement(doc, queue);
        
        // Drop policies. They are different for each customer class
        XMLParameter[] queueDropStrategies = new XMLParameter[model.getClassKeys().size()];
        XMLParameter queueDropStrategy = new XMLParameter("dropStrategies",
                String.class.getName(),
                null, queueDropStrategies, false
        );
        Vector classes = model.getClassKeys();
        for(int i=0; i<queueDropStrategies.length; i++){
            String dropStrategy = model.getDropRule(stationKey, classes.get(i));
            queueDropStrategies[i] = new XMLParameter(
                    "dropStrategy",
                    String.class.getName(),
                    model.getClassName(classes.get(i)), (String)dropRulesNamesMatchings.get(dropStrategy), true
            );
        }
        queueDropStrategy.appendParameterElement(doc, queue);
        
        /*queue get strategy, which is fixed to FCFS, as difference between strategies can
        be resolved by queueput strategies*/
        XMLParameter queueGetStrategy = new XMLParameter(
                "FCFSstrategy", strategiesClasspathBase + queuegetStrategiesSuffix + "FCFSstrategy",
                null, (String)null, false
        );
        queueGetStrategy.appendParameterElement(doc, queue);
        /*At last, queue put parameter, which can be defined differently for each
        customerclass, so a more complex parameter structure is required*/
        XMLParameter[] queuePutStrategies = new XMLParameter[model.getClassKeys().size()];
        XMLParameter queuePutStrategy = new XMLParameter(
                "NetStrategy", strategiesClasspathBase + "QueuePutStrategy",
                null, queuePutStrategies, false
        );
        for(int i=0; i<queuePutStrategies.length; i++){
            String queueStrategy = model.getQueueStrategy(stationKey, classes.get(i));
            String queueputStrategyName = (String)queuePutStrategyNamesMatchings.get(queueStrategy);
            queuePutStrategies[i] = new XMLParameter(
                    queueputStrategyName,
                    strategiesClasspathBase + queueputStrategiesSuffix + queueputStrategyName,
                    model.getClassName(classes.get(i)), (String)null, true
            );
        }
        queuePutStrategy.appendParameterElement(doc, queue);
    }

    static protected void writeTerminalSection(Document doc, Node nodeNode,
                                               CommonModel model, Object stationKey){
        Element elem = doc.createElement(XML_E_STATION_SECTION);
        elem.setAttribute(XML_A_STATION_SECTION_CLASSNAME, CLASSNAME_TERMINAL);
        nodeNode.appendChild(elem);
        Vector classes = model.getClassKeys();
        //obtain classes that must be generated by this terminal
        Vector refClasses = getClassesForTerminal(model, stationKey);
        XMLParameter[] distrParams = new XMLParameter[classes.size()];
        for(int i=0; i<distrParams.length; i++){
            //if current class must be generated by this terminal
            Object currentClass = classes.get(i);
            if(refClasses.contains(currentClass)){
                distrParams[i] = new XMLParameter("numberOfJobs",
                        "java.lang.Integer", model.getClassName(currentClass),
                        model.getClassPopulation(currentClass).toString(), true
                );
            }else{
                //otherwise write a null parameter
                distrParams[i] = new XMLParameter("numberOfJobs",
                        "java.lang.Integer", model.getClassName(currentClass),
                        "-1", true
                );
            }
        }
        //creating global population parameter
        XMLParameter globalStrategyParameter = new XMLParameter(
                "NumberOfJobs", "java.lang.Integer", null, distrParams, false
        );
        //finally, create node from pareameters and append it to the section element
        globalStrategyParameter.appendParameterElement(doc, elem);
    }

    static protected void writeServerSection(Document doc, Node nodeNode,
                                             CommonModel model, Object stationKey){
        Element elem = doc.createElement(XML_E_STATION_SECTION);
        elem.setAttribute(XML_A_STATION_SECTION_CLASSNAME, CLASSNAME_SERVER);
        nodeNode.appendChild(elem);
        Vector classes = model.getClassKeys();
        //creating number of servers node element
        Integer maxJobs = model.getStationNumberOfServers(stationKey);
        XMLParameter numOfServers = new XMLParameter(
                "maxJobs", "java.lang.Integer", null,
                maxJobs != null ? maxJobs.toString() : "-1", false
        );
        numOfServers.appendParameterElement(doc, elem);
        //creating visits node element
        XMLParameter[] visits = new XMLParameter[classes.size()];
        for(int i=0; i<visits.length; i++){
            visits[i] = new XMLParameter("numberOfVisits", "java.lang.Integer",
                    model.getClassName(classes.get(i)), "1", true);
        }
        XMLParameter visitsParam = new XMLParameter("numberOfVisits",
                "java.lang.Integer", null, visits, false);
        visitsParam.appendParameterElement(doc, elem);

        getServiceSection(model, stationKey).appendParameterElement(doc, elem);
    }

    /**
     * Returns a service section rapresentation in XMLParameter format
     * @param model model data structure
     * @param stationKey search's key for current station
     * @return service section rapresentation in XMLParameter format
     * Author: Bertoli Marco
     */
    protected static XMLParameter getServiceSection(CommonModel model, Object stationKey) {
        Vector classes = model.getClassKeys();
        //creating set of service time distributions
        XMLParameter[] distrParams = new XMLParameter[classes.size()];
        Object currentClass;
        for(int i=0; i<distrParams.length; i++){
            currentClass = classes.get(i);
            Object serviceDistribution = model.getServiceTimeDistribution(stationKey, currentClass);
            if (serviceDistribution instanceof Distribution)
                // Service time is a Distribution and not a LDService
                distrParams[i] = DistributionWriter.getDistributionParameter(
                        (Distribution)serviceDistribution,
                        model, currentClass);
            else if (serviceDistribution instanceof ZeroStrategy)
                // Zero Service Time Strategy --- Bertoli Marco
                distrParams[i] = new XMLParameter("ZeroTimeServiceStrategy", ZeroStrategy.getEngineClassPath(), model.getClassName(currentClass), (String)null, true);
            else {
                // Load dependent Service Time Strategy --- Bertoli Marco
                LDStrategy strategy = (LDStrategy) serviceDistribution;
                XMLParameter[] ranges = new XMLParameter[strategy.getRangeNumber()];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -