stdpeergroupparamadv.java

来自「JXTA&#8482 is a set of open, generalize」· Java 代码 · 共 518 行 · 第 1/2 页

JAVA
518
字号
     * <p/>     * The result (very unwisely) is the internal map of this Advertisement.      * Modifying it results in changes to this Advertisement.     * For safety the Map should be copied before being modified.     *     * @return the application entries described in this Advertisement.     */    public Map<ModuleClassID, Object> getApps() {        return apps;    }    /**     * Replaces the table of services described by this Advertisement. All     * existing entries are lost.     *     * @param servicesTable the services table     */    public void setServices(Map<ModuleClassID, Object> servicesTable) {        if(servicesTable.containsKey(null)) {            throw new IllegalArgumentException("null key in servicesTable");        }                if(servicesTable.containsValue(null)) {            throw new IllegalArgumentException("null value in servicesTable");        }                        if (servicesTable == this.services) {            return;        }        this.services.clear();        if (null != servicesTable) {            this.services.putAll(servicesTable);        }    }    /**     * Replaces the table of protocols described by this Advertisement. All     * existing entries are lost.     *     * @param protosTable The message transport descriptors for the group.     */    public void setProtos(Map<ModuleClassID, Object> protosTable) {        if(protosTable.containsKey(null)) {            throw new IllegalArgumentException("null key in protosTable");        }                if(protosTable.containsValue(null)) {            throw new IllegalArgumentException("null value in protosTable");        }                        if (protosTable == this.transports) {            return;        }        this.transports.clear();        if (null != protosTable) {            this.transports.putAll(protosTable);        }    }    /**     * Replaces the table of applications described by this Advertisement. All     * existing entries are lost.     *     * @param appsTable The application descriptors for the group.     */    public void setApps(Map<ModuleClassID, Object> appsTable) {        if(appsTable.containsKey(null)) {            throw new IllegalArgumentException("null key in appsTable");        }                if(appsTable.containsValue(null)) {            throw new IllegalArgumentException("null value in appsTable");        }                        if (appsTable == this.apps) {            return;        }        this.apps.clear();        if (null != appsTable) {            this.apps.putAll(appsTable);        }    }    private void initialize(XMLElement doc) {        if (!doc.getName().equals(PARAM_TAG)) {            throw new IllegalArgumentException("Can not construct " + getClass().getName() + "from doc containing a " + doc.getName());        }        // set defaults        int appCount = 0;        Enumeration<XMLElement> modules = doc.getChildren();        while (modules.hasMoreElements()) {            XMLElement module = modules.nextElement();            String tagName = module.getName();            Map<ModuleClassID, Object> theTable;            if (SVC_TAG.equals(tagName)) {                theTable = services;            } else if (APP_TAG.equals(tagName)) {                theTable = apps;            } else if (PROTO_TAG.equals(tagName)) {                theTable = transports;            } else {                if (Logging.SHOW_WARNING && LOG.isLoggable(Level.WARNING)) {                    LOG.log(Level.WARNING, "Unhandled top-level tag : " + tagName);                }                continue;            }            ModuleSpecID specID = null;            ModuleClassID classID = null;            ModuleImplAdvertisement inLineAdv = null;            try {                if (module.getTextValue() != null) {                    specID = (ModuleSpecID) IDFactory.fromURI(new URI(module.getTextValue()));                }                // Check for children anyway.                Enumeration<XMLElement> fields = module.getChildren();                while (fields.hasMoreElements()) {                    XMLElement field = fields.nextElement();                    String fieldName = field.getName();                    if (MCID_TAG.equals(fieldName)) {                        classID = (ModuleClassID) IDFactory.fromURI(new URI(field.getTextValue()));                    } else if (MSID_TAG.equals(field.getName())) {                        specID = (ModuleSpecID) IDFactory.fromURI(new URI(field.getTextValue()));                    } else if (MIA_TAG.equals(field.getName())) {                        inLineAdv = (ModuleImplAdvertisement) AdvertisementFactory.newAdvertisement(field);                    } else {                        if (Logging.SHOW_WARNING && LOG.isLoggable(Level.WARNING)) {                            LOG.log(Level.WARNING, "Unhandled field : " + fieldName);                        }                    }                }            } catch (Exception any) {                if (Logging.SHOW_WARNING && LOG.isLoggable(Level.WARNING)) {                    LOG.log(Level.WARNING, "Broken entry; skipping", any);                }                continue;            }            if (inLineAdv == null && specID == null) {                if (Logging.SHOW_WARNING && LOG.isLoggable(Level.WARNING)) {                    LOG.warning("Insufficent entry; skipping");                }                continue;            }            Object theValue;            if (inLineAdv != null) {                specID = inLineAdv.getModuleSpecID();                theValue = inLineAdv;            } else {                theValue = specID;            }            if (classID == null) {                classID = specID.getBaseClass();            }            // For applications, the role does not matter. We just create a             // unique role ID on the fly.            // When outputing the adv we get rid of it to save space.            if (theTable == apps) {                // Only the first (or only) one may use the base class.                if (classID == PeerGroup.applicationClassID) {                    if (appCount++ != 0) {                        classID = IDFactory.newModuleClassID(classID);                    }                }            }            theTable.put(classID, theValue);        }    }    /**     * {@inheritDoc}     */    public Document getDocument(MimeMediaType encodeAs) {        StructuredDocument doc = StructuredDocumentFactory.newStructuredDocument(encodeAs, PARAM_TAG);        outputModules(doc, services, SVC_TAG);        outputModules(doc, transports, PROTO_TAG);        outputModules(doc, apps, APP_TAG);        return doc;    }    private void outputModules(StructuredDocument doc, Map<ModuleClassID, Object> modulesTable, String mainTag) {        for (Map.Entry<ModuleClassID, Object> entry : modulesTable.entrySet()) {            ModuleClassID mcid = entry.getKey();            Object val = entry.getValue();            Element m;            if(null == mcid) {                throw new IllegalStateException("null ModuleClassID in " + mainTag );            }                        // For applications, we ignore the role ID. It is not meaningfull,            // and a new one is assigned on the fly when loading this adv.            if (val instanceof Advertisement) {                m = doc.createElement(mainTag);                doc.appendChild(m);                if (modulesTable != apps && !mcid.equals(mcid.getBaseClass())) {                    // It is not an app and there is a role ID. Output it.                    Element i = doc.createElement(MCID_TAG, mcid.toString());                    m.appendChild(i);                }                StructuredDocument advdoc = (StructuredDocument) ((Advertisement) val).getDocument(doc.getMimeType());                StructuredDocumentUtils.copyElements(doc, m, advdoc);            } else if (val instanceof ModuleSpecID) {                if (modulesTable == apps || mcid.equals(mcid.getBaseClass())) {                    // Either it is an app or there is no role ID.                    // So the specId is good enough.                    m = doc.createElement(mainTag, val.toString());                    doc.appendChild(m);                } else {                    // The role ID matters, so the classId must be separate.                    m = doc.createElement(mainTag);                    doc.appendChild(m);                    Element i;                    i = doc.createElement(MCID_TAG, mcid.toString());                    m.appendChild(i);                    i = doc.createElement(MSID_TAG, val.toString());                    m.appendChild(i);                }            } else {                if (Logging.SHOW_SEVERE && LOG.isLoggable(Level.SEVERE)) {                    LOG.severe("unsupported descriptor for " + mcid + " in " + mainTag +" module table : " + val);                }                throw new IllegalStateException("unsupported descriptor for " + mcid + " in " + mainTag +" module table : " + val);            }        }    }}

⌨️ 快捷键说明

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