public void unregisterKeyStroke(KeyStroke ks, JComponent c) { // component may have already been removed from the hierarchy, we // need to look up the container using the componentKeyStrokeMap. ComponentKeyStrokePair ckp = new ComponentKeyStrokePair(c, ks); Container topContainer = componentKeyStrokeMap.get(ckp); if (topContainer == null) { // never heard of this pairing, so bail return; } Hashtable keyMap = containerMap.get(topContainer); if (keyMap == null) { // this should never happen, but I'm being safe Thread.dumpStack(); return; } Object tmp = keyMap.get(ks); if (tmp == null) { // this should never happen, but I'm being safe Thread.dumpStack(); return; } if (tmp instanceof JComponent && tmp == c) { keyMap.remove(ks); // remove the KeyStroke from the Map // System.out.println("removed a stroke" + ks); } else if (tmp instanceof Vector) { // this means there is more than one component reg for this key Vector v = (Vector) tmp; v.removeElement(c); if (v.isEmpty()) { keyMap.remove(ks); // remove the KeyStroke from the Map // System.out.println("removed a ks vector"); } } if (keyMap.isEmpty()) { // if no more bindings in this table containerMap.remove(topContainer); // remove table to enable GC // System.out.println("removed a container"); } componentKeyStrokeMap.remove(ckp); // Check for EmbeddedFrame case, they know how to process accelerators even // when focus is not in Java if (topContainer instanceof EmbeddedFrame) { ((EmbeddedFrame) topContainer).unregisterAccelerator(ks); } }
public void paintComponent(Graphics g) { super.paintComponent(g); if (uneHashtable.get(unEtat) != null) { g.setColor((Color) uneHashtable.get(unEtat)); g.fillRect(100, 20, 40, 40); } }
/** * Implements CallListener.callEnded. Stops sounds that are playing at the moment if there're any. * Removes the call panel and disables the hangup button. */ public void callEnded(CallEvent event) { Call sourceCall = event.getSourceCall(); NotificationManager.stopSound(NotificationManager.BUSY_CALL); NotificationManager.stopSound(NotificationManager.INCOMING_CALL); NotificationManager.stopSound(NotificationManager.OUTGOING_CALL); if (activeCalls.get(sourceCall) != null) { CallPanel callPanel = (CallPanel) activeCalls.get(sourceCall); this.removeCallPanelWait(callPanel); } }
public void propertyChange(PropertyChangeEvent e) { if (e.getPropertyName().equals("minimum") && startAtMin) { start = getMinimum(); } if (e.getPropertyName().equals("minimum") || e.getPropertyName().equals("maximum")) { Enumeration keys = getLabelTable().keys(); Hashtable<Object, Object> hashtable = new Hashtable<Object, Object>(); // Save the labels that were added by the developer while (keys.hasMoreElements()) { Object key = keys.nextElement(); Object value = labelTable.get(key); if (!(value instanceof LabelUIResource)) { hashtable.put(key, value); } } clear(); createLabels(); // Add the saved labels keys = hashtable.keys(); while (keys.hasMoreElements()) { Object key = keys.nextElement(); put(key, hashtable.get(key)); } ((JSlider) e.getSource()).setLabelTable(this); } }
public final Class getColumnClass(int columnIndex) { try { Method[] m = (Method[]) voGetterMethods.get(attributeNames[columnIndex]); return m[m.length - 1].getReturnType(); } catch (Exception ex) { ex.printStackTrace(); return String.class; } }
/** * register keystrokes here which are for the WHEN_IN_FOCUSED_WINDOW case. Other types of * keystrokes will be handled by walking the hierarchy That simplifies some potentially hairy * stuff. */ public void registerKeyStroke(KeyStroke k, JComponent c) { Container topContainer = getTopAncestor(c); if (topContainer == null) { return; } Hashtable keyMap = containerMap.get(topContainer); if (keyMap == null) { // lazy evaluate one keyMap = registerNewTopContainer(topContainer); } Object tmp = keyMap.get(k); if (tmp == null) { keyMap.put(k, c); } else if (tmp instanceof Vector) { // if there's a Vector there then add to it. Vector v = (Vector) tmp; if (!v.contains(c)) { // only add if this keystroke isn't registered for this component v.addElement(c); } } else if (tmp instanceof JComponent) { // if a JComponent is there then remove it and replace it with a vector // Then add the old compoennt and the new compoent to the vector // then insert the vector in the table if (tmp != c) { // this means this is already registered for this component, no need to dup Vector<JComponent> v = new Vector<JComponent>(); v.addElement((JComponent) tmp); v.addElement(c); keyMap.put(k, v); } } else { System.out.println("Unexpected condition in registerKeyStroke"); Thread.dumpStack(); } componentKeyStrokeMap.put(new ComponentKeyStrokePair(c, k), topContainer); // Check for EmbeddedFrame case, they know how to process accelerators even // when focus is not in Java if (topContainer instanceof EmbeddedFrame) { ((EmbeddedFrame) topContainer).registerAccelerator(k); } }
/** * Returns the image information of the specified path, if it represents an image information. * Otherwise returns null. * * @param path the tree path. * @return the image information. */ protected XmlInformation getInformation(TreePath path) { String path_str = ""; Object[] paths = path.getPath(); for (int i = 1; i < paths.length; i++) { String name = (String) ((DefaultMutableTreeNode) paths[i]).getUserObject(); path_str += "/" + name; } XmlInformation info = (XmlInformation) hash_info.get(path_str); return info; }
public void unregisterMenuBar(JMenuBar mb) { Container topContainer = getTopAncestor(mb); if (topContainer == null) { return; } Hashtable keyMap = containerMap.get(topContainer); if (keyMap != null) { Vector v = (Vector) keyMap.get(JMenuBar.class); if (v != null) { v.removeElement(mb); if (v.isEmpty()) { keyMap.remove(JMenuBar.class); if (keyMap.isEmpty()) { // remove table to enable GC containerMap.remove(topContainer); } } } } }
public void displayPage(JEditorPane pane, String text) { try { File helpFile = new File((String) locations.get(text)); String loc = "file:" + helpFile.getAbsolutePath(); URL page = new URL(loc); pane.setPage(page); } catch (IOException ioe) { JOptionPane.showMessageDialog(null, "Help Topic Unavailable"); pane.getParent().repaint(); } }
private void save() { try { Document doc = XmlUtil.getDocument(); Element root = doc.createElement("profiles"); doc.appendChild(root); Enumeration<String> keys = table.keys(); while (keys.hasMoreElements()) { table.get(keys.nextElement()).appendTo(root); } FileUtil.setText(new File(filename), FileUtil.utf8, XmlUtil.toString(doc)); } catch (Exception ignore) { } }
public void registerMenuBar(JMenuBar mb) { Container top = getTopAncestor(mb); if (top == null) { return; } Hashtable keyMap = containerMap.get(top); if (keyMap == null) { // lazy evaluate one keyMap = registerNewTopContainer(top); } // use the menubar class as the key Vector menuBars = (Vector) keyMap.get(JMenuBar.class); if (menuBars == null) { // if we don't have a list of menubars, // then make one. menuBars = new Vector(); keyMap.put(JMenuBar.class, menuBars); } if (!menuBars.contains(mb)) { menuBars.addElement(mb); } }
public final Object getValueAt(int rowIndex, int colIndex) { try { Method[] m = (Method[]) voGetterMethods.get(attributeNames[colIndex]); Object obj = valueObjects.get(rowIndex); for (int i = 0; i < m.length - 1; i++) { obj = (ValueObject) m[i].invoke(obj, new Object[0]); if (obj == null) { return null; } } return m[m.length - 1].invoke(obj, new Object[0]); } catch (Exception ex) { ex.printStackTrace(); return null; } }
public Icon getCachedIcon(File f) { return iconCache.get(f); }
/** * This method is called when the focused component (and none of its ancestors) want the key * event. This will look up the keystroke to see if any chidren (or subchildren) of the specified * container want a crack at the event. If one of them wants it, then it will "DO-THE-RIGHT-THING" */ public boolean fireKeyboardAction(KeyEvent e, boolean pressed, Container topAncestor) { if (e.isConsumed()) { System.out.println("Acquired pre-used event!"); Thread.dumpStack(); } // There may be two keystrokes associated with a low-level key event; // in this case a keystroke made of an extended key code has a priority. KeyStroke ks; KeyStroke ksE = null; if (e.getID() == KeyEvent.KEY_TYPED) { ks = KeyStroke.getKeyStroke(e.getKeyChar()); } else { if (e.getKeyCode() != e.getExtendedKeyCode()) { ksE = KeyStroke.getKeyStroke(e.getExtendedKeyCode(), e.getModifiers(), !pressed); } ks = KeyStroke.getKeyStroke(e.getKeyCode(), e.getModifiers(), !pressed); } Hashtable keyMap = containerMap.get(topAncestor); if (keyMap != null) { // this container isn't registered, so bail Object tmp = null; // extended code has priority if (ksE != null) { tmp = keyMap.get(ksE); if (tmp != null) { ks = ksE; } } if (tmp == null) { tmp = keyMap.get(ks); } if (tmp == null) { // don't do anything } else if (tmp instanceof JComponent) { JComponent c = (JComponent) tmp; if (c.isShowing() && c.isEnabled()) { // only give it out if enabled and visible fireBinding(c, ks, e, pressed); } } else if (tmp instanceof Vector) { // more than one comp registered for this Vector v = (Vector) tmp; // There is no well defined order for WHEN_IN_FOCUSED_WINDOW // bindings, but we give precedence to those bindings just // added. This is done so that JMenus WHEN_IN_FOCUSED_WINDOW // bindings are accessed before those of the JRootPane (they // both have a WHEN_IN_FOCUSED_WINDOW binding for enter). for (int counter = v.size() - 1; counter >= 0; counter--) { JComponent c = (JComponent) v.elementAt(counter); // System.out.println("Trying collision: " + c + " vector = "+ v.size()); if (c.isShowing() && c.isEnabled()) { // don't want to give these out fireBinding(c, ks, e, pressed); if (e.isConsumed()) return true; } } } else { System.out.println("Unexpected condition in fireKeyboardAction " + tmp); // This means that tmp wasn't null, a JComponent, or a Vector. What is it? Thread.dumpStack(); } } if (e.isConsumed()) { return true; } // if no one else handled it, then give the menus a crack // The're handled differently. The key is to let any JMenuBars // process the event if (keyMap != null) { Vector v = (Vector) keyMap.get(JMenuBar.class); if (v != null) { Enumeration iter = v.elements(); while (iter.hasMoreElements()) { JMenuBar mb = (JMenuBar) iter.nextElement(); if (mb.isShowing() && mb.isEnabled()) { // don't want to give these out boolean extended = (ksE != null) && !ksE.equals(ks); if (extended) { fireBinding(mb, ksE, e, pressed); } if (!extended || !e.isConsumed()) { fireBinding(mb, ks, e, pressed); } if (e.isConsumed()) { return true; } } } } } return e.isConsumed(); }
/** * Handles the <tt>ActionEvent</tt> generated when user presses one of the buttons in this panel. */ public void actionPerformed(ActionEvent evt) { JButton button = (JButton) evt.getSource(); String buttonName = button.getName(); if (buttonName.equals("call")) { Component selectedPanel = mainFrame.getSelectedTab(); // call button is pressed over an already open call panel if (selectedPanel != null && selectedPanel instanceof CallPanel && ((CallPanel) selectedPanel).getCall().getCallState() == CallState.CALL_INITIALIZATION) { NotificationManager.stopSound(NotificationManager.BUSY_CALL); NotificationManager.stopSound(NotificationManager.INCOMING_CALL); CallPanel callPanel = (CallPanel) selectedPanel; Iterator participantPanels = callPanel.getParticipantsPanels(); while (participantPanels.hasNext()) { CallParticipantPanel panel = (CallParticipantPanel) participantPanels.next(); panel.setState("Connecting"); } Call call = callPanel.getCall(); answerCall(call); } // call button is pressed over the call list else if (selectedPanel != null && selectedPanel instanceof CallListPanel && ((CallListPanel) selectedPanel).getCallList().getSelectedIndex() != -1) { CallListPanel callListPanel = (CallListPanel) selectedPanel; GuiCallParticipantRecord callRecord = (GuiCallParticipantRecord) callListPanel.getCallList().getSelectedValue(); String stringContact = callRecord.getParticipantName(); createCall(stringContact); } // call button is pressed over the contact list else if (selectedPanel != null && selectedPanel instanceof ContactListPanel) { // call button is pressed when a meta contact is selected if (isCallMetaContact) { Object[] selectedContacts = mainFrame.getContactListPanel().getContactList().getSelectedValues(); Vector telephonyContacts = new Vector(); for (int i = 0; i < selectedContacts.length; i++) { Object o = selectedContacts[i]; if (o instanceof MetaContact) { Contact contact = ((MetaContact) o).getDefaultContact(OperationSetBasicTelephony.class); if (contact != null) telephonyContacts.add(contact); else { new ErrorDialog( this.mainFrame, Messages.getI18NString("warning").getText(), Messages.getI18NString( "contactNotSupportingTelephony", new String[] {((MetaContact) o).getDisplayName()}) .getText()) .showDialog(); } } } if (telephonyContacts.size() > 0) createCall(telephonyContacts); } else if (!phoneNumberCombo.isComboFieldEmpty()) { // if no contact is selected checks if the user has chosen // or has // writen something in the phone combo box String stringContact = phoneNumberCombo.getEditor().getItem().toString(); createCall(stringContact); } } else if (selectedPanel != null && selectedPanel instanceof DialPanel) { String stringContact = phoneNumberCombo.getEditor().getItem().toString(); createCall(stringContact); } } else if (buttonName.equalsIgnoreCase("hangup")) { Component selectedPanel = this.mainFrame.getSelectedTab(); if (selectedPanel != null && selectedPanel instanceof CallPanel) { NotificationManager.stopSound(NotificationManager.BUSY_CALL); NotificationManager.stopSound(NotificationManager.INCOMING_CALL); NotificationManager.stopSound(NotificationManager.OUTGOING_CALL); CallPanel callPanel = (CallPanel) selectedPanel; Call call = callPanel.getCall(); if (removeCallTimers.containsKey(callPanel)) { ((Timer) removeCallTimers.get(callPanel)).stop(); removeCallTimers.remove(callPanel); } removeCallPanel(callPanel); if (call != null) { ProtocolProviderService pps = call.getProtocolProvider(); OperationSetBasicTelephony telephony = mainFrame.getTelephonyOpSet(pps); Iterator participants = call.getCallParticipants(); while (participants.hasNext()) { try { // now we hang up the first call participant in the // call telephony.hangupCallParticipant((CallParticipant) participants.next()); } catch (OperationFailedException e) { logger.error("Hang up was not successful: " + e); } } } } } else if (buttonName.equalsIgnoreCase("minimize")) { JCheckBoxMenuItem hideCallPanelItem = mainFrame.getMainMenu().getViewMenu().getHideCallPanelItem(); if (!hideCallPanelItem.isSelected()) hideCallPanelItem.setSelected(true); this.setCallPanelVisible(false); } else if (buttonName.equalsIgnoreCase("restore")) { JCheckBoxMenuItem hideCallPanelItem = mainFrame.getMainMenu().getViewMenu().getHideCallPanelItem(); if (hideCallPanelItem.isSelected()) hideCallPanelItem.setSelected(false); this.setCallPanelVisible(true); } }
/** * Analyze class fields and fill in "voSetterMethods","voGetterMethods","indexes",reverseIndexes" * attributes. * * @param prefix e.g. "attrx.attry." * @param parentMethods getter methods of parent v.o. * @param classType class to analyze */ private void analyzeClassFields( Hashtable vosAlreadyProcessed, String prefix, Method[] parentMethods, Class classType) { try { Integer num = (Integer) vosAlreadyProcessed.get(classType); if (num == null) num = new Integer(0); num = new Integer(num.intValue() + 1); if (num.intValue() > 10) return; vosAlreadyProcessed.put(classType, num); // retrieve all getter and setter methods defined in the specified value object... String attributeName = null; Method[] methods = classType.getMethods(); String aName = null; for (int i = 0; i < methods.length; i++) { attributeName = methods[i].getName(); if (attributeName.startsWith("get") && methods[i].getParameterTypes().length == 0 && ValueObject.class.isAssignableFrom(methods[i].getReturnType())) { aName = getAttributeName(attributeName, classType); Method[] newparentMethods = new Method[parentMethods.length + 1]; System.arraycopy(parentMethods, 0, newparentMethods, 0, parentMethods.length); newparentMethods[parentMethods.length] = methods[i]; analyzeClassFields( vosAlreadyProcessed, prefix + aName + ".", newparentMethods, methods[i].getReturnType()); } if (attributeName.startsWith("get") && methods[i].getParameterTypes().length == 0 && (methods[i].getReturnType().equals(String.class) || methods[i].getReturnType().equals(Long.class) || methods[i].getReturnType().equals(Long.TYPE) || methods[i].getReturnType().equals(Float.class) || methods[i].getReturnType().equals(Float.TYPE) || methods[i].getReturnType().equals(Short.class) || methods[i].getReturnType().equals(Short.TYPE) || methods[i].getReturnType().equals(Double.class) || methods[i].getReturnType().equals(Double.TYPE) || methods[i].getReturnType().equals(BigDecimal.class) || methods[i].getReturnType().equals(java.util.Date.class) || methods[i].getReturnType().equals(java.sql.Date.class) || methods[i].getReturnType().equals(java.sql.Timestamp.class) || methods[i].getReturnType().equals(Integer.class) || methods[i].getReturnType().equals(Integer.TYPE) || methods[i].getReturnType().equals(Character.class) || methods[i].getReturnType().equals(Boolean.class) || methods[i].getReturnType().equals(boolean.class) || methods[i].getReturnType().equals(ImageIcon.class) || methods[i].getReturnType().equals(Icon.class) || methods[i].getReturnType().equals(byte[].class) || methods[i].getReturnType().equals(Object.class) || ValueObject.class.isAssignableFrom(methods[i].getReturnType()))) { attributeName = getAttributeName(attributeName, classType); // try { // if // (classType.getMethod("set"+attributeName.substring(0,1).toUpperCase()+attributeName.substring(1),new Class[]{methods[i].getReturnType()})!=null) Method[] newparentMethods = new Method[parentMethods.length + 1]; System.arraycopy(parentMethods, 0, newparentMethods, 0, parentMethods.length); newparentMethods[parentMethods.length] = methods[i]; voGetterMethods.put(prefix + attributeName, newparentMethods); // } catch (NoSuchMethodException ex) { // } } else if (attributeName.startsWith("is") && methods[i].getParameterTypes().length == 0 && (methods[i].getReturnType().equals(Boolean.class) || methods[i].getReturnType().equals(boolean.class))) { attributeName = getAttributeName(attributeName, classType); Method[] newparentMethods = new Method[parentMethods.length + 1]; System.arraycopy(parentMethods, 0, newparentMethods, 0, parentMethods.length); newparentMethods[parentMethods.length] = methods[i]; voGetterMethods.put(prefix + attributeName, newparentMethods); } else if (attributeName.startsWith("set") && methods[i].getParameterTypes().length == 1) { attributeName = getAttributeName(attributeName, classType); try { if (classType.getMethod( "get" + attributeName.substring(0, 1).toUpperCase() + attributeName.substring(1), new Class[0]) != null) { Method[] newparentMethods = new Method[parentMethods.length + 1]; System.arraycopy(parentMethods, 0, newparentMethods, 0, parentMethods.length); newparentMethods[parentMethods.length] = methods[i]; voSetterMethods.put(prefix + attributeName, newparentMethods); } } catch (NoSuchMethodException ex) { try { if (classType.getMethod( "is" + attributeName.substring(0, 1).toUpperCase() + attributeName.substring(1), new Class[0]) != null) { Method[] newparentMethods = new Method[parentMethods.length + 1]; System.arraycopy(parentMethods, 0, newparentMethods, 0, parentMethods.length); newparentMethods[parentMethods.length] = methods[i]; voSetterMethods.put(prefix + attributeName, newparentMethods); } } catch (NoSuchMethodException exx) { } } } } // fill in indexes with the colProperties indexes first; after them, it will be added the // other indexes (of attributes not mapped with grid column...) HashSet alreadyAdded = new HashSet(); int i = 0; for (i = 0; i < attributeNames.length; i++) { reverseIndexes.put(attributeNames[i], new Integer(i)); alreadyAdded.add(attributeNames[i]); } Enumeration en = voGetterMethods.keys(); while (en.hasMoreElements()) { attributeName = en.nextElement().toString(); if (!alreadyAdded.contains(attributeName)) { reverseIndexes.put(attributeName, new Integer(i)); i++; } } } catch (Exception ex) { ex.printStackTrace(); } }
/** Runs this thread. */ public void run() { CommonFileChooser file_chooser = new CommonFileChooser(); file_chooser.setDialogTitle("Choose a directory."); file_chooser.setMultiSelectionEnabled(false); file_chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); if (file_chooser.showSaveDialog(pane) == JFileChooser.APPROVE_OPTION) { try { File directory = file_chooser.getSelectedFile(); directory.mkdirs(); // Outputs the variability XML file. String path = FileManager.unitePath(directory.getAbsolutePath(), "package.xml"); File file = new File(path); if (file.exists()) { String message = "Overwrite to " + file.getPath() + " ?"; if (0 != JOptionPane.showConfirmDialog( pane, message, "Confirmation", JOptionPane.YES_NO_OPTION)) { return; } } XmlVariabilityHolder holder = new XmlVariabilityHolder(); Variability[] records = getSelectedRecords(); for (int i = 0; i < records.length; i++) { XmlVariability variability = new XmlVariability(records[i]); holder.addVariability(variability); } holder.write(file); // Copies the report XML document files. Hashtable hash_xml = new Hashtable(); for (int i = 0; i < records.length; i++) { XmlMagRecord[] mag_records = records[i].getMagnitudeRecords(); for (int j = 0; j < mag_records.length; j++) hash_xml.put(mag_records[j].getImageXmlPath(), this); } Vector failed_list = new Vector(); Enumeration keys = hash_xml.keys(); while (keys.hasMoreElements()) { String xml_path = (String) keys.nextElement(); try { File src_file = desktop.getFileManager().newFile(xml_path); File dst_file = new File(FileManager.unitePath(directory.getAbsolutePath(), xml_path)); if (dst_file.exists() == false) FileManager.copy(src_file, dst_file); } catch (Exception exception) { failed_list.addElement(xml_path); } } if (failed_list.size() > 0) { String header = "Failed to copy the following XML files:"; MessagesDialog dialog = new MessagesDialog(header, failed_list); dialog.show(pane, "Error", JOptionPane.ERROR_MESSAGE); } // Copies the image files. failed_list = new Vector(); keys = hash_xml.keys(); while (keys.hasMoreElements()) { path = (String) keys.nextElement(); try { XmlInformation info = XmlReport.readInformation(desktop.getFileManager().newFile(path)); path = info.getImage().getContent(); File src_file = desktop.getFileManager().newFile(path); File dst_file = new File(FileManager.unitePath(directory.getAbsolutePath(), path)); if (dst_file.exists() == false) FileManager.copy(src_file, dst_file); } catch (Exception exception) { failed_list.addElement(path); } } if (failed_list.size() > 0) { String header = "Failed to copy the following image files:"; MessagesDialog dialog = new MessagesDialog(header, failed_list); dialog.show(pane, "Error", JOptionPane.ERROR_MESSAGE); } // Creates the sub catalog database. try { DiskFileSystem file_system = new DiskFileSystem( new File( directory.getAbsolutePath(), net.aerith.misao.pixy.Properties.getDatabaseDirectoryName())); CatalogDBManager new_manager = new GlobalDBManager(file_system).getCatalogDBManager(); Hashtable hash_stars = new Hashtable(); for (int i = 0; i < records.length; i++) { CatalogStar star = records[i].getStar(); CatalogDBReader reader = new CatalogDBReader(desktop.getDBManager().getCatalogDBManager()); StarList list = reader.read(star.getCoor(), 0.5); for (int j = 0; j < list.size(); j++) { CatalogStar s = (CatalogStar) list.elementAt(j); hash_stars.put(s.getOutputString(), s); } } keys = hash_stars.keys(); while (keys.hasMoreElements()) { String string = (String) keys.nextElement(); CatalogStar star = (CatalogStar) hash_stars.get(string); new_manager.addElement(star); } } catch (Exception exception) { String message = "Failed to create sub catalog database."; JOptionPane.showMessageDialog(pane, message, "Error", JOptionPane.ERROR_MESSAGE); } String message = "Completed."; JOptionPane.showMessageDialog(pane, message); } catch (IOException exception) { String message = "Failed."; JOptionPane.showMessageDialog(pane, message, "Error", JOptionPane.ERROR_MESSAGE); } } }
public Profile getProfile(String name) { Profile p = table.get(name); if (p == null) p = new Profile(name); return p; }