/*
 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.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.ObjectReference;
import org.neodatis.odb.core.layers.layer3.IStorageEngine;
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 NewObjectPanel 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 ILogger logger;

	private IBrowserContainer browser;

	public NewObjectPanel(IStorageEngine aStorageEngine, ClassInfo ci, IBrowserContainer aBrowser, ILogger logger) {
		this.storageEngine = aStorageEngine;
		this.classInfo = ci;
		textFields = new OdbHashMap();
		idsTextFieldsForButton = new OdbHashMap();
		classNames = new OdbHashMap();
		this.browser = aBrowser;
		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;
		// Creates a panel for fields
		// JPanel fieldsPanel = new JPanel(new
		// GridLayout(nbAttributes+2,2,4,4));

		setLayout(new BorderLayout(4, 4));
		Color headerFontColor = Color.LIGHT_GRAY;
		Color headerCellColor = new Color(0, 100, 15);

		JLabel label1 = new JLabel(Messages.getString("Attribute Name"));
		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;
		for (int i = 0; i < nbAttributes; i++) {
			cai = classInfo.getAttributeInfo(i);

			if (cai.isNative()) {
				if (cai.getAttributeType().isAtomicNative()) {
					textField = new JTextField(20);
					panel1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
					label = new JLabel(cai.getName(), JLabel.LEFT);
					label.setPreferredSize(labelDimension);
					panel1.add(label);
					panel1.add(textField);

					if (cai.getAttributeType().isDate()) {
						panel1.add(new JLabel("(dd/MM/yyyy HH:mm:ss:SSS)"));
					}

					panelLabels.add(panel1);
				} 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);
				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("Create&commit"));
		btCancel = new JButton(Messages.getString("Cancel"));
		optionPanel.add(btCancel);
		optionPanel.add(btCreate);
		btCreate.setActionCommand("create");
		btCancel.setActionCommand("cancel");

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

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

		JPanel panel4 = new JPanel();
		panel4.add(panelLabels);
		// panel5.add(panelLabels);

		// panelContent.add(panel5,BorderLayout.WEST);
		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);
		add(GUITool.buildHeaderPanel(Messages.getString("Create a new object of type ") + classInfo.getFullClassName()), BorderLayout.NORTH);

	}

	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 ("create".equals(action)) {
			try {
				createObject();
			} catch (Exception e1) {
				logger.error("Error creating object", e1);
				JOptionPane.showMessageDialog(this, "Error while creating object : " + e1.getMessage());
			}
		}

	}

	private void createObject() throws Exception {

		Iterator iterator = textFields.keySet().iterator();
		ClassAttributeInfo cai = null;
		NonNativeObjectInfo nnoi = new NonNativeObjectInfo(classInfo);

		while (iterator.hasNext()) {
			cai = (ClassAttributeInfo) iterator.next();
			JTextField tfValue = (JTextField) textFields.get(cai);
			String value = tfValue.getText();
			if (cai.isNative()) {
				if (cai.getAttributeType().isAtomicNative()) {
					nnoi.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);
						nnoi.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);
						nnoi.setAttributeValue(cai.getId(), aoi);
					}

				}
			} else {
				if (value != null && value.length() > 0) {
					nnoi.setAttributeValue(cai.getId(), new ObjectReference(OIDBuilder.buildObjectOID(value)));
				} else {
					nnoi.setAttributeValue(cai.getId(), new NonNativeNullObjectInfo(cai.getClassInfo()));
				}
			}
		}
		DLogger.info("Creating object:" + nnoi);

		// OID id =
		// storageEngine.getObjectWriter().writeNonNativeObjectInfo(StorageEngineConstant.NULL_OBJECT_ID,
		// nnoi, -1, true,true);
		OID id = storageEngine.writeObjectInfo(StorageEngineConstant.NULL_OBJECT_ID, nnoi, -1, true);
		btCancel.setEnabled(false);
		btCreate.setEnabled(false);
		btCreate.setText(Messages.getString("Object Created : 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.