@Override protected Object readResolve() { super.readResolve(); // FJE: If the propertyMap field has something in it, it could be: // a pre-1.3b66 token that contains a HashMap<?,?>, or // a pre-1.3b78 token that actually has the CaseInsensitiveHashMap<?>. // Newer tokens will use propertyMapCI so we only need to make corrections // if the old field has data in it. if (propertyMap != null) { if (propertyMap instanceof CaseInsensitiveHashMap) { propertyMapCI = (CaseInsensitiveHashMap<Object>) propertyMap; } else { propertyMapCI = new CaseInsensitiveHashMap<Object>(); propertyMapCI.putAll(propertyMap); propertyMap.clear(); // It'll never be written out, but we should free the memory. } propertyMap = null; } // 1.3 b77 if (exposedAreaGUID == null) { exposedAreaGUID = new GUID(); } return this; }
/** * Given a string (normally from the JTextArea which holds the properties for a Property Type) * this method converts those lines into a List of EditTokenProperty objects. It checks for * duplicates along the way, ignoring any it finds. (Should produce a list of warnings to indicate * which ones are duplicates. See the Light/Sight code for examples.) * * @param propertyText * @return */ private List<TokenProperty> parseTokenProperties(String propertyText) throws IllegalArgumentException { List<TokenProperty> propertyList = new ArrayList<TokenProperty>(); BufferedReader reader = new BufferedReader(new StringReader(propertyText)); CaseInsensitiveHashMap<String> caseCheck = new CaseInsensitiveHashMap<String>(); List<String> errlog = new LinkedList<String>(); try { String original, line; while ((original = reader.readLine()) != null) { line = original = original.trim(); if (line.length() == 0) { continue; } TokenProperty property = new TokenProperty(); // Prefix while (true) { if (line.startsWith("*")) { property.setShowOnStatSheet(true); line = line.substring(1); continue; } if (line.startsWith("@")) { property.setOwnerOnly(true); line = line.substring(1); continue; } if (line.startsWith("#")) { property.setGMOnly(true); line = line.substring(1); continue; } // Ran out of special characters break; } // default value // had to do this here since the short name is not built // to take advantage of multiple opening/closing parenthesis // in a single property line int indexDefault = line.indexOf(":"); if (indexDefault > 0) { String defaultVal = line.substring(indexDefault + 1).trim(); if (defaultVal.length() > 0) { property.setDefaultValue(defaultVal); } // remove the default value from the end of the string... line = line.substring(0, indexDefault); } // Suffix // (Really should handle nested parens here) int index = line.indexOf("("); if (index > 0) { String shortName = line.substring(index + 1, line.lastIndexOf(")")).trim(); if (shortName.length() > 0) { property.setShortName(shortName); } line = line.substring(0, index).trim(); } property.setName(line); // Since property names are not case-sensitive, let's make sure that we don't // already have this name represented somewhere in the list. String old = caseCheck.get(line); if (old != null) { // Perhaps these properties should produce warnings at all, but what it someone // is actually <b>using them as property names!</b> if (old.startsWith("---")) errlog.add( I18N.getText("msg.error.mtprops.properties.duplicateComment", original, old)); else errlog.add(I18N.getText("msg.error.mtprops.properties.duplicate", original, old)); } else { propertyList.add(property); caseCheck.put(line, original); } } } catch (IOException ioe) { // If this happens, I'll check into the nearest insane asylum MapTool.showError("IOException during parsing of properties?!", ioe); } caseCheck.clear(); if (!errlog.isEmpty()) { errlog.add(0, I18N.getText("msg.error.mtprops.properties.title", editingType)); errlog.add(I18N.getText("msg.error.mtprops.properties.ending")); MapTool.showFeedback(errlog.toArray()); errlog.clear(); throw new IllegalArgumentException(); // Don't save the properties... } return propertyList; }