/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/*
* DefaultCustomObjectEditor.java
*
* Created on 11.03.2009, 16:56:02
*/
package de.cismet.cids.editors;
import Sirius.server.localserver.attribute.ObjectAttribute;
import Sirius.server.middleware.types.MetaClass;
import Sirius.server.middleware.types.MetaClassStore;
import org.jdesktop.beansbinding.Binding;
import org.jdesktop.beansbinding.BindingGroup;
import org.jdesktop.beansbinding.ELProperty;
import org.jdesktop.el.impl.ValueExpressionImpl;
import java.lang.reflect.Field;
import java.util.List;
import de.cismet.cids.dynamics.CidsBean;
import de.cismet.cids.dynamics.DisposableCidsBeanStore;
/**
* DOCUMENT ME!
*
* @author thorsten
* @version $Revision$, $Date$
*/
public class DefaultCustomObjectEditor extends javax.swing.JPanel implements DisposableCidsBeanStore {
//~ Static fields/initializers ---------------------------------------------
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(
DefaultCustomObjectEditor.class);
//~ Instance fields --------------------------------------------------------
protected CidsBean cidsBean;
//~ Constructors -----------------------------------------------------------
/**
* Creates new form DefaultCustomObjectEditor.
*/
public DefaultCustomObjectEditor() {
initComponents();
}
//~ Methods ----------------------------------------------------------------
/**
* This method is called from within the constructor to initialize the form. WARNING: Do NOT modify this code. The
* content of this method is always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
final javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 400, Short.MAX_VALUE));
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 300, Short.MAX_VALUE));
} // </editor-fold>//GEN-END:initComponents
@Override
public CidsBean getCidsBean() {
return cidsBean;
}
@Override
public synchronized void setCidsBean(final CidsBean cidsBean) {
this.cidsBean = cidsBean;
try {
final BindingGroup bindingGroup = getBindingGroupFormChildClass();
setMetaClassInformationToMetaClassStoreComponentsInBindingGroup(bindingGroup, cidsBean);
bindingGroup.unbind();
bindingGroup.bind();
boundAndReadyNotify();
} catch (Exception e) {
throw new RuntimeException("Bindingproblems occur", e); // NOI18N
}
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws NoSuchFieldException DOCUMENT ME!
* @throws IllegalArgumentException DOCUMENT ME!
* @throws IllegalAccessException DOCUMENT ME!
*/
private BindingGroup getBindingGroupFormChildClass() throws NoSuchFieldException,
IllegalArgumentException,
IllegalAccessException {
BindingGroup bindingGroup = null;
if (this instanceof BindingGroupStore) {
bindingGroup = ((BindingGroupStore)this).getBindingGroup();
} else {
final Field bindingGroupField = getClass().getDeclaredField("bindingGroup"); // NOI18N
bindingGroupField.setAccessible(true);
bindingGroup = (BindingGroup)bindingGroupField.get(this);
}
return bindingGroup;
}
/**
* DOCUMENT ME!
*
* @param bindingGroup DOCUMENT ME!
* @param cidsBean DOCUMENT ME!
*/
public static void setMetaClassInformationToMetaClassStoreComponentsInBindingGroup(final BindingGroup bindingGroup,
final CidsBean cidsBean) {
final List<Binding> bindings = bindingGroup.getBindings();
for (final Binding binding : bindings) {
if (binding.getTargetObject() instanceof MetaClassStore) {
// log.fatal("MetaClassStores gefunden");
String fieldname = null;
try {
final MetaClassStore mcs = (MetaClassStore)binding.getTargetObject();
final ELProperty p = (ELProperty)binding.getSourceProperty();
String expr = getPropertyStringOutOfELProperty(p);
expr = expr.substring(expr.indexOf(".") + 1); // NOI18N
expr = expr.substring(0, expr.length() - 1);
// in expr steckt in den allermeisten faellen ein feldname
// es kann aber auch sein, dass ein zusammengesetzter feldname vorkommt: subobject.fieldname
fieldname = expr;
final ObjectAttribute oa = cidsBean.getMetaObject().getAttributeByFieldName(fieldname);
final String domain = cidsBean.getMetaObject().getDomain();
final int foreignClassId = oa.getMai().getForeignKeyClassId();
final MetaClass foreignClass = CidsObjectEditorFactory.getMetaClass(domain, foreignClassId);
mcs.setMetaClass(foreignClass);
} catch (Exception e) {
log.error("Error during Bind: " + fieldname + " of " + cidsBean.getMetaObject().getMetaClass(), e);
}
}
}
}
/**
* DOCUMENT ME!
*
* @param p DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
private static String getPropertyStringOutOfELProperty(final ELProperty p) throws Exception {
final Field expressionField = p.getClass().getDeclaredField("expression"); // NOI18N
expressionField.setAccessible(true);
final ValueExpressionImpl valueExpression = (ValueExpressionImpl)expressionField.get(p);
return valueExpression.getExpressionString();
}
/**
* DOCUMENT ME!
*/
public void boundAndReadyNotify() {
}
@Override
public void dispose() {
try {
final BindingGroup bindingGroup = getBindingGroupFormChildClass();
bindingGroup.unbind();
} catch (Exception ex) {
throw new RuntimeException("Binding Problem!", ex); // NOI18N
}
}
// Variables declaration - do not modify//GEN-BEGIN:variables
// End of variables declaration//GEN-END:variables
}