/*
 NeoDatis ODB : Native Object Database (odb.info@neodatis.org)
 Copyright (C) 2007 NeoDatis Inc. http://www.neodatis.org

 "This file is part of the NeoDatis ODB open source object database".

 NeoDatis ODB is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public
 License as published by the Free Software Foundation; either
 version 2.1 of the License, or (at your option) any later version.

 NeoDatis ODB is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser General Public
 License along with this library; if not, write to the Free Software
 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */
package org.neodatis.odb.gui.objectbrowser.update;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

import org.neodatis.odb.OID;
import org.neodatis.odb.Objects;
import org.neodatis.odb.core.layers.layer2.meta.AbstractObjectInfo;
import org.neodatis.odb.core.layers.layer2.meta.ArrayObjectInfo;
import org.neodatis.odb.core.layers.layer2.meta.AtomicNativeObjectInfo;
import org.neodatis.odb.core.layers.layer2.meta.ClassAttributeInfo;
import org.neodatis.odb.core.layers.layer2.meta.ClassInfo;
import org.neodatis.odb.core.layers.layer2.meta.CollectionObjectInfo;
import org.neodatis.odb.core.layers.layer2.meta.NonNativeNullObjectInfo;
import org.neodatis.odb.core.layers.layer2.meta.NonNativeObjectInfo;
import org.neodatis.odb.core.layers.layer2.meta.NullNativeObjectInfo;
import org.neodatis.odb.core.layers.layer2.meta.ObjectReference;
import org.neodatis.odb.core.layers.layer3.IStorageEngine;
import org.neodatis.odb.core.server.layers.layer2.meta.ClientNonNativeObjectInfo;
import org.neodatis.odb.gui.GUIConstant;
import org.neodatis.odb.gui.IBrowserContainer;
import org.neodatis.odb.gui.Messages;
import org.neodatis.odb.gui.component.GUITool;
import org.neodatis.odb.gui.objectbrowser.hierarchy.HierarchicObjectBrowserPanel;
import org.neodatis.odb.gui.objectbrowser.hierarchy.ModalObjectBrowserDialog;
import org.neodatis.odb.impl.core.layers.layer3.engine.StorageEngineConstant;
import org.neodatis.odb.impl.core.query.criteria.CriteriaQuery;
import org.neodatis.odb.impl.tool.ObjectTool;
import org.neodatis.tool.DLogger;
import org.neodatis.tool.ILogger;
import org.neodatis.tool.wrappers.OdbString;
import org.neodatis.tool.wrappers.map.OdbHashMap;

public class ObjectIntrospectorPanel extends JPanel implements ActionListener {

	private IStorageEngine storageEngine;
	private ClassInfo classInfo;

	private JButton btCreate;
	private JButton btCancel;
	private Map textFields;
	private Map idsTextFieldsForButton;
	private Map classNames;

	private IBrowserContainer browser;
	private NonNativeObjectInfo nnoi;
	private ILogger logger;

	public ObjectIntrospectorPanel(IStorageEngine aStorageEngine, ClassInfo ci, IBrowserContainer aBrowser, NonNativeObjectInfo nnoi,
			ILogger logger) {
		this.storageEngine = aStorageEngine;
		this.classInfo = ci;
		textFields = new OdbHashMap();
		idsTextFieldsForButton = new OdbHashMap();
		classNames = new OdbHashMap();
		this.browser = aBrowser;
		this.nnoi = nnoi;
		this.logger = logger;

		init();
	}

	private void init() {
		JTextField textField = null;
		ClassAttributeInfo cai = null;
		int nbAttributes = classInfo.getAttributes().size();

		JPanel panelLabels = new JPanel(new GridLayout(nbAttributes + 1, 1, 5, 5));
		JPanel panelFields = new JPanel(new GridLayout(nbAttributes + 1, 1, 5, 5));
		JPanel panel1 = null;
		JPanel panel2 = null;
		String text = Messages.getString("Update object of type ") + classInfo.getFullClassName() + Messages.getString(" with oid= ")
				+ nnoi.getOid();
		JPanel headerPanel = GUITool.buildHeaderPanel(text);

		setLayout(new BorderLayout(4, 4));
		add(headerPanel, BorderLayout.NORTH);
		Color headerCellColor = new Color(0, 100, 15);

		JLabel label1 = new JLabel(Messages.getString("Attributes"));
		label1.setBackground(headerCellColor);
		panel1 = new JPanel();
		panel1.add(label1);
		panelLabels.add(panel1);

		JLabel label3 = new JLabel(Messages.getString("Value"));
		label3.setBackground(headerCellColor);

		panel2 = new JPanel();
		panel2.add(label3);
		panelFields.add(panel2);

		JButton btChoose = null;
		Dimension labelDimension = new Dimension(80, 20);
		JLabel label = null;
		AbstractObjectInfo aoi = null;
		for (int i = 0; i < nbAttributes; i++) {
			cai = classInfo.getAttributeInfo(i);
			aoi = nnoi.getAttributeValueFromId(cai.getId());
			if (cai.isNative()) {
				if (cai.getAttributeType().isAtomicNative()) {

					panel1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
					label = new JLabel(cai.getName(), JLabel.LEFT);
					label.setPreferredSize(labelDimension);
					panel1.add(label);
					panelLabels.add(panel1);

					/*
					 * if (cai.getAttributeType().isDate()) { DateTimePanel
					 * dtPanel = new DateTimePanel((Date) aoi.getObject());
					 * panel1.add(dtPanel); } else {
					 */
					textField = new JTextField(20);

					if (nnoi != null && !aoi.isNull() && aoi.isAtomicNativeObject()) {
						textField.setText(ObjectTool.atomicNativeObjectToString((AtomicNativeObjectInfo) aoi,
								ObjectTool.ID_CALLER_IS_ODB_EXPLORER));
					} else {
						textField.setText(GUIConstant.NULL_OBJECT_LABEL);
					}
					panel1.add(textField);
					// }
				} else if (cai.getAttributeType().isArrayOrCollection()) {
					textField = new JTextField(8);
					panel1 = new JPanel(new FlowLayout(FlowLayout.LEFT));

					label = new JLabel(cai.getName(), JLabel.LEFT);
					label.setPreferredSize(labelDimension);

					panel1.add(label);
					panel1.add(textField);
					JComboBox combo = buildClassesCombo();
					panel1.add(combo);
					btChoose = new JButton(Messages.getString("Add an object"));
					panel1.add(btChoose);
					btChoose.setActionCommand("browse-add." + cai.getFullClassname());
					btChoose.addActionListener(this);
					panelLabels.add(panel1);
					idsTextFieldsForButton.put(btChoose, textField);
					classNames.put(btChoose, combo);
				}

			} else {
				textField = new JTextField(4);
				NonNativeObjectInfo nn = (NonNativeObjectInfo) nnoi.getAttributeValueFromId(cai.getId());
				if (nnoi != null && nn != null && !nn.isNull()) {
					textField.setText(String.valueOf(nn.getOid()));
				} else {
					textField.setText("null object");
				}
				panel1 = new JPanel(new FlowLayout(FlowLayout.LEFT));

				label = new JLabel(cai.getName(), JLabel.LEFT);
				label.setPreferredSize(labelDimension);

				panel1.add(label);
				panel1.add(textField);
				btChoose = new JButton(Messages.getString("Choose the object"));
				panel1.add(btChoose);
				btChoose.setActionCommand("browse-set." + cai.getFullClassname());
				btChoose.addActionListener(this);

				panelLabels.add(panel1);
				idsTextFieldsForButton.put(btChoose, textField);
			}

			textFields.put(cai, textField);
		}

		JPanel optionPanel = new JPanel();
		btCreate = new JButton(Messages.getString("Save Object"));
		btCancel = new JButton(Messages.getString("Cancel"));
		optionPanel.add(btCancel);
		optionPanel.add(btCreate);
		btCreate.setActionCommand("update");
		btCancel.setActionCommand("cancel");

		btCreate.addActionListener(this);
		btCancel.addActionListener(this);

		JPanel panelContent = new JPanel(new BorderLayout(5, 5));

		JPanel panel4 = new JPanel();
		panel4.add(panelLabels);
		panelContent.add(panel4, BorderLayout.CENTER);
		JPanel panel3 = new JPanel(new BorderLayout(5, 5));

		panel3.add(new JScrollPane(panelContent), BorderLayout.CENTER);
		panel3.add(optionPanel, BorderLayout.SOUTH);

		add(panel3, BorderLayout.CENTER);

	}

	private JComboBox buildClassesCombo() {
		Vector vector = new Vector();
		Iterator iterator = storageEngine.getSession(true).getMetaModel().getAllClasses().iterator();
		ClassInfo ci = null;
		while (iterator.hasNext()) {
			ci = (ClassInfo) iterator.next();
			vector.add(ci.getFullClassName());
		}
		return new JComboBox(vector);
	}

	public void actionPerformed(ActionEvent e) {
		String action = e.getActionCommand();
		String tokenSet = "browse-set.";
		String tokenAdd = "browse-add.";
		if (action.startsWith(tokenSet)) {
			String className = OdbString.substring(action, tokenSet.length(), action.length());
			try {
				OID oid = chooseObject(className);
				if (oid != StorageEngineConstant.NULL_OBJECT_ID) {
					JTextField idTextField = (JTextField) idsTextFieldsForButton.get(e.getSource());
					idTextField.setText(String.valueOf(oid));
				}
			} catch (Exception e1) {
				logger.error("Error setting field", e1);
			}
		}
		if (action.startsWith(tokenAdd)) {
			String className = ((JComboBox) classNames.get(e.getSource())).getSelectedItem().toString();
			try {
				OID oid = chooseObject(className);
				if (oid != StorageEngineConstant.NULL_OBJECT_ID) {
					JTextField idTextField = (JTextField) idsTextFieldsForButton.get(e.getSource());
					String ids = idTextField.getText();
					idTextField.setText(ids + (ids.length() > 0 ? "," : "") + String.valueOf(oid));
				}
			} catch (Exception e1) {
				logger.error("Error setting field", e1);
			}
		}
		if ("update".equals(action)) {
			try {
				updateObject();
			} catch (Exception e1) {
				logger.error("Error setting updating", e1);
				JOptionPane.showMessageDialog(this, "Error while updating object : " + e1.getMessage());
			}
		}
		if ("cancel".equals(action)) {
			btCancel.setEnabled(false);
			btCreate.setEnabled(false);
		}

	}

	private void updateObject() throws Exception {

		Iterator iterator = textFields.keySet().iterator();
		ClassAttributeInfo cai = null;
		NonNativeObjectInfo newNnoi = null;
		if(storageEngine.isLocal()){
			newNnoi = new NonNativeObjectInfo(classInfo);	
		}else{
			newNnoi = new ClientNonNativeObjectInfo(classInfo);
		}
		
		newNnoi.setOid(nnoi.getOid());
		newNnoi.setPosition(nnoi.getPosition());

		while (iterator.hasNext()) {
			cai = (ClassAttributeInfo) iterator.next();
			String value = null;
			/*
			 * if (cai.getAttributeType().isDate()) { Date dt = null; try { dt =
			 * ((DateTimePanel) textFields.get(cai)).getDate(); value =
			 * ObjectTool.format.format(dt);
			 * 
			 * } catch (Exception e) { value = GUIConstant.NULL_OBJECT_LABEL; }
			 * } else {
			 */
			JTextField tfValue = (JTextField) textFields.get(cai);
			value = tfValue.getText();
			// }
			if (cai.isNative()) {
				if (value.equals(GUIConstant.NULL_OBJECT_LABEL)) {
					newNnoi.setAttributeValue(cai.getId(), new NullNativeObjectInfo(cai.getAttributeType()));
				} else if (cai.getAttributeType().isAtomicNative()) {
					newNnoi.setAttributeValue(cai.getId(), ObjectTool.stringToObjectInfo(cai.getAttributeType().getId(), value,
							ObjectTool.ID_CALLER_IS_ODB_EXPLORER,null));
				} else {
					if (cai.getAttributeType().isCollection()) {
						// Must be array of collection
						Collection c = new ArrayList();
						StringTokenizer tokenizer = new StringTokenizer(value, ",");
						while (tokenizer.hasMoreElements()) {
							c.add(new ObjectReference(OIDBuilder.buildObjectOID(tokenizer.nextElement().toString())));
						}
						CollectionObjectInfo coi = new CollectionObjectInfo(c);
						newNnoi.setAttributeValue(cai.getId(), coi);
					}
					if (cai.getAttributeType().isArray()) {
						// Must be array of collection

						StringTokenizer tokenizer = new StringTokenizer(value, ",");
						Object[] objects = new Object[tokenizer.countTokens()];
						int i = 0;
						while (tokenizer.hasMoreElements()) {
							objects[i++] = new ObjectReference(OIDBuilder.buildObjectOID(tokenizer.nextElement().toString()));
						}
						ArrayObjectInfo aoi = new ArrayObjectInfo(objects);
						newNnoi.setAttributeValue(cai.getId(), aoi);
					}

				}
			} else {
				if (value != null && value.length() > 0) {
					newNnoi.setAttributeValue(cai.getId(), new ObjectReference(OIDBuilder.buildObjectOID(value)));
				} else {
					newNnoi.setAttributeValue(cai.getId(), new NonNativeNullObjectInfo(cai.getClassInfo()));
				}
			}
		}
		DLogger.info("Updating object:" + newNnoi);
		OID id = storageEngine.updateObject(newNnoi, false);
		btCancel.setEnabled(false);
		btCreate.setEnabled(false);
		btCreate.setText(Messages.getString("Object updated : id = " + id));

	}

	private OID chooseObject(String className) throws Exception {
		Objects l = storageEngine.getObjectInfos(new CriteriaQuery(className), true, -1, -1, false);
		// TODO: Try to avoid copying the list here. TreeModel needs a list
		// because it uses get(index) and indexOf(Object)
		List list = new ArrayList(l.size());
		list.addAll(l);
		ClassInfo classInfoToBrowse = storageEngine.getSession(true).getMetaModel().getClassInfo(className, true);
		HierarchicObjectBrowserPanel panel = new HierarchicObjectBrowserPanel(browser, storageEngine, classInfoToBrowse, list, false,
				logger);
		ModalObjectBrowserDialog modalBrowser = new ModalObjectBrowserDialog(panel);
		modalBrowser.pack();
		modalBrowser.setVisible(true);
		if (modalBrowser.objectHasBeenChoosen()) {
			return panel.getSelectedOid();
		}
		return StorageEngineConstant.NULL_OBJECT_ID;
	}

}

 

Ads help maintain this website.