stdpeergroupparamadv.java
来自「JXTA™ 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 + -
显示快捷键?