Jaxx-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
May 2010
- 2 participants
- 78 discussions
r1931 - trunk/jaxx-runtime/src/main/java/jaxx/runtime/validator/field
by tchemit@users.nuiton.org 23 May '10
by tchemit@users.nuiton.org 23 May '10
23 May '10
Author: tchemit
Date: 2010-05-23 21:00:50 +0200 (Sun, 23 May 2010)
New Revision: 1931
Url: http://nuiton.org/repositories/revision/jaxx/1931
Log:
add againstMe property in validator
Modified:
trunk/jaxx-runtime/src/main/java/jaxx/runtime/validator/field/CollectionUniqueKeyValidator.java
Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/validator/field/CollectionUniqueKeyValidator.java
===================================================================
--- trunk/jaxx-runtime/src/main/java/jaxx/runtime/validator/field/CollectionUniqueKeyValidator.java 2010-05-23 13:35:09 UTC (rev 1930)
+++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/validator/field/CollectionUniqueKeyValidator.java 2010-05-23 19:00:50 UTC (rev 1931)
@@ -55,18 +55,28 @@
* @since 1.5
*/
protected String collectionFieldName;
+
/**
* la liste des propriétés d'une entrée de la collection qui définit la
* clef unique.
*/
protected String[] keys;
+
/**
* Une propriété optionnelle pour valider que l'objet reflétée par cette
* propriété ne viole pas l'intégrité de la clef unique.
* Cela permet de valider l'unicité sans que l'objet soit dans la collection
*/
protected String againstProperty;
+
/**
+ * Une propriété optionnelle pour utiliser l'objet en cours de validation pour
+ * valider que l'objet reflétée par cette propriété ne viole pas l'intégrité de la clef unique.
+ * Cela permet de valider l'unicité sans que l'objet soit dans la collection
+ */
+ protected boolean againstMe;
+
+ /**
* Lors de l'utilisation de la againstProperty et qu'un ne peut pas utiliser
* le equals sur l'objet, on peut spécifier une expression pour exclure des
* tests lors de la recherche de la violation de clef unique.
@@ -85,6 +95,10 @@
return keys;
}
+ public boolean getAgainstMe() {
+ return againstMe;
+ }
+
public void setKeys(String[] keys) {
if (keys != null && keys.length == 1 && keys[0].indexOf(',') != -1) {
this.keys = keys[0].split(",");
@@ -109,6 +123,10 @@
this.againstIndexExpression = againstIndexExpression;
}
+ public void setAgainstMe(boolean againstMe) {
+ this.againstMe = againstMe;
+ }
+
@Override
public void validate(Object object) throws ValidationException {
@@ -124,13 +142,14 @@
log.debug("collection found : " + col);
}
Object againstBean = againstProperty == null ? null :
- getFieldValue(againstProperty, object);
+ getFieldValue(againstProperty, object);
if (log.isDebugEnabled()) {
log.debug("againtBean = " + againstBean);
}
Integer againstIndex = (Integer) (againstIndexExpression == null ?
- -1 : getFieldValue(againstIndexExpression, object));
+ -1 :
+ getFieldValue(againstIndexExpression, object));
if (againstIndex == null) {
againstIndex = -1;
}
@@ -139,10 +158,19 @@
return;
}
+ if (againstMe) {
+ // try on this object
+ againstBean = object;
+ if (log.isDebugEnabled()) {
+ log.debug("againtBean from me = " + againstBean);
+ }
+ }
+
+
boolean answer = true;
Integer againstHashCode = againstBean == null ?
- null : getUniqueKeyHashCode(againstBean);
+ null : getUniqueKeyHashCode(againstBean);
if (log.isDebugEnabled()) {
log.debug("hash for new key " + againstHashCode);
}
@@ -168,7 +196,7 @@
// utilisation de againstBean
if (againstIndex != -1) {
if (index != againstIndex &&
- hash.equals(againstHashCode)) {
+ hash.equals(againstHashCode)) {
// on a deja rencontre cette clef unique,
// donc la validation a echouee
answer = false;
@@ -176,7 +204,7 @@
}
} else {
if (!againstBean.equals(o) &&
- hash.equals(againstHashCode)) {
+ hash.equals(againstHashCode)) {
// on a deja rencontre cette clef unique,
// donc la validation a echouee
answer = false;
@@ -246,7 +274,7 @@
if (!Collection.class.isInstance(obj)) {
throw new ValidationException("field " + fieldName +
- " is not a collection type! (" + obj.getClass() + ')');
+ " is not a collection type! (" + obj.getClass() + ')');
}
return (Collection<?>) obj;
}
1
0
23 May '10
Author: tchemit
Date: 2010-05-23 15:35:09 +0200 (Sun, 23 May 2010)
New Revision: 1930
Url: http://nuiton.org/repositories/revision/jaxx/1930
Log:
Evolution #633: BlockingLayerUI can accept som component NOT to be blocked
reformat code
Modified:
trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/BlockingLayerUI.java
trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/BlockingLayerUI2.java
Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/BlockingLayerUI.java
===================================================================
--- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/BlockingLayerUI.java 2010-05-23 13:29:53 UTC (rev 1929)
+++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/BlockingLayerUI.java 2010-05-23 13:35:09 UTC (rev 1930)
@@ -24,6 +24,12 @@
*/
package jaxx.runtime.swing;
+import org.jdesktop.jxlayer.JXLayer;
+import org.jdesktop.jxlayer.plaf.AbstractLayerUI;
+
+import javax.swing.Action;
+import javax.swing.ImageIcon;
+import javax.swing.JComponent;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Component;
@@ -34,21 +40,17 @@
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
-import javax.swing.Action;
-import javax.swing.ImageIcon;
-import javax.swing.JComponent;
-import org.jdesktop.jxlayer.JXLayer;
-import org.jdesktop.jxlayer.plaf.AbstractLayerUI;
+import java.util.Arrays;
+import java.util.List;
/**
- *
* A JXLayer ui implementation that permits to block a component but still
* allow an action when clicking on the right-top icon painted on the layer.
- *
+ * <p/>
* You can change the blocking and accepting icon.
- *
+ * <p/>
* To hook an click on the layer's icon, you can :
- *
+ * <p/>
* <ul><li>pass an Action via method {@link #setAcceptAction(Action)}</li>
* <li>override the method {@link #acceptEvent(MouseEvent, JXLayer)}</li>
* </ul>
@@ -59,51 +61,50 @@
public class BlockingLayerUI extends AbstractLayerUI<JComponent> {
public static final String CAN_CLICK_PROPERTY = "canClick";
+
public static final String ACCEPT_ICON_PROPERTY = "acceptIcon";
+
public static final String BLOCK_ICON_PROPERTY = "blockIcon";
+
public static final String BLOCK_PROPERTY = "block";
// private static final long serialVersionUID = 1L;
- /**
- * Action to be treated when click on icon
- */
+ /** Action to be treated when click on icon */
protected Action acceptAction;
- /**
- * Icon when you can not click
- */
+ /** Icon when you can not click */
protected BufferedImage blockIcon;
- /**
- * Icon when you can click
- */
+ /** Icon when you can click */
protected BufferedImage acceptIcon;
- /**
- * Optinal color to put fill background when blocking
- */
+ /** Optinal color to put fill background when blocking */
protected Color blockingColor;
- /**
- * Internal state to known when we can accept click
- */
+ /** Internal state to known when we can accept click */
protected boolean canClick;
/**
* A flag to enable or disable the use of the icon.
- *
- * If set to false, no icon will be displayed and no action
+ * <p/>
+ * If set to false, no icon will be displayed and no action
* will be possible.
- *
+ * <p/>
* By default, this is active.
*/
protected boolean useIcon = true;
- /**
- * Internal state when should block event and paint layer
- */
+ /** Internal state when should block event and paint layer */
protected boolean block;
+ /** Extra components names to accept even in block mode */
+ protected List<String> acceptedComponentNames;
+
+ public void setAcceptedComponentNames(String... acceptedComponentNames) {
+ this.acceptedComponentNames = Arrays.asList(acceptedComponentNames);
+ setDirty(true);
+ }
+
public void setAcceptAction(Action acceptAction) {
this.acceptAction = acceptAction;
}
@@ -186,19 +187,46 @@
@Override
protected void processKeyEvent(KeyEvent e, JXLayer<JComponent> l) {
- if (useIcon || block) {
+ if (useIcon) {
e.consume();
+ return;
}
+
+ if (block) {
+ Object source = e.getSource();
+ if (!(source instanceof JComponent)) {
+ e.consume();
+ return;
+ }
+ JComponent comp = (JComponent) source;
+ String compName = comp.getName();
+ if (acceptedComponentNames == null ||
+ !acceptedComponentNames.contains(compName)) {
+ e.consume();
+ }
+ }
}
@Override
protected void processMouseMotionEvent(MouseEvent e, JXLayer<JComponent> l) {
if (useIcon) {
updateCanClickState(l, e);
- }
- if (useIcon || block) {
e.consume();
}
+
+ if (block) {
+ Object source = e.getSource();
+ if (!(source instanceof JComponent)) {
+ e.consume();
+ return;
+ }
+ JComponent comp = (JComponent) source;
+ String compName = comp.getName();
+ if (acceptedComponentNames == null ||
+ !acceptedComponentNames.contains(compName)) {
+ e.consume();
+ }
+ }
}
@Override
@@ -218,10 +246,36 @@
break;
}
}
- if (useIcon || block) {
+ if (useIcon) {
+
e.consume();
+ return;
}
+ if (block) {
+ Object source = e.getSource();
+ if (!(source instanceof JComponent)) {
+ e.consume();
+ return;
+ }
+ JComponent comp = (JComponent) source;
+ String compName = comp.getName();
+ if (acceptedComponentNames == null ||
+ !acceptedComponentNames.contains(compName)) {
+ e.consume();
+ return;
+ }
+ switch (e.getID()) {
+ case MouseEvent.MOUSE_ENTERED:
+ break;
+ case MouseEvent.MOUSE_EXITED:
+ break;
+ case MouseEvent.MOUSE_CLICKED:
+ acceptEvent(e, l);
+ break;
+ }
+ }
+
}
@Override
Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/BlockingLayerUI2.java
===================================================================
--- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/BlockingLayerUI2.java 2010-05-23 13:29:53 UTC (rev 1929)
+++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/BlockingLayerUI2.java 2010-05-23 13:35:09 UTC (rev 1930)
@@ -24,6 +24,12 @@
*/
package jaxx.runtime.swing;
+import org.jdesktop.jxlayer.JXLayer;
+import org.jdesktop.jxlayer.plaf.AbstractLayerUI;
+
+import javax.swing.Action;
+import javax.swing.ImageIcon;
+import javax.swing.JComponent;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Component;
@@ -34,55 +40,46 @@
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
-import javax.swing.Action;
-import javax.swing.ImageIcon;
-import javax.swing.JComponent;
-import org.jdesktop.jxlayer.JXLayer;
/**
- *
* A JXLayer ui implementation that permits to block a component but still
* allow an action when clicking everywhere on the layer.
- *
+ * <p/>
* Moreover, an icon can be added on the right-top icon painted and changed
* when the mouse is over the layer.
- *
+ * <p/>
* You can change the blocking and accepting icon.
- *
+ * <p/>
* To hook an click on the layer's icon, you can :
- *
+ * <p/>
* <ul><li>pass an Action via method {@link #setAcceptAction(Action)}</li>
- * <li>override the method {@link #acceptEvent(java.awt.event.MouseEvent, org.jdesktop.jxlayer.JXLayer)}</li>
+ * <li>override the method {@link #acceptEvent(MouseEvent, JXLayer)}</li>
* </ul>
*
* @author tchemit <chemit(a)codelutin.com>
* @since 1.3
*/
-public class BlockingLayerUI2 extends org.jdesktop.jxlayer.plaf.AbstractLayerUI<JComponent> {
+public class BlockingLayerUI2 extends AbstractLayerUI<JComponent> {
public static final String CAN_CLICK_PROPERTY = "canClick";
+
public static final String ACCEPT_ICON_PROPERTY = "acceptIcon";
+
public static final String BLOCK_ICON_PROPERTY = "blockIcon";
- private static final long serialVersionUID = 1L;
- /**
- * Action to be treated when click on icon
- */
+
+ /** Action to be treated when click on icon */
protected Action acceptAction;
- /**
- * Icon when you can not click
- */
+
+ /** Icon when you can not click */
protected BufferedImage blockIcon;
- /**
- * Icon when you can click
- */
+
+ /** Icon when you can click */
protected BufferedImage acceptIcon;
- /**
- * Optinal color to put fill background when blocking
- */
+
+ /** Optinal color to put fill background when blocking */
protected Color blockingColor;
- /**
- * Internal state to known when we can accept click
- */
+
+ /** Internal state to known when we can accept click */
protected boolean canClick;
public void setAcceptAction(Action acceptAction) {
@@ -171,7 +168,7 @@
}
break;
}
- e.consume();
+ e.consume();
}
@Override
1
0
23 May '10
Author: tchemit
Date: 2010-05-23 15:29:53 +0200 (Sun, 23 May 2010)
New Revision: 1929
Url: http://nuiton.org/repositories/revision/jaxx/1929
Log:
Evolution #632: Introduce jaxx.runtime.swing.layer package
Added:
trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/layer/
1
0
22 May '10
Author: tchemit
Date: 2010-05-22 11:02:09 +0200 (Sat, 22 May 2010)
New Revision: 1928
Url: http://nuiton.org/repositories/revision/jaxx/1928
Log:
clean code
Modified:
trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/EntityComboBoxHandler.java
Modified: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/EntityComboBoxHandler.java
===================================================================
--- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/EntityComboBoxHandler.java 2010-05-22 09:01:47 UTC (rev 1927)
+++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/EntityComboBoxHandler.java 2010-05-22 09:02:09 UTC (rev 1928)
@@ -32,6 +32,8 @@
import org.apache.commons.logging.LogFactory;
import static org.nuiton.i18n.I18n._;
import static org.nuiton.i18n.I18n.n_;
+
+import org.jdesktop.swingx.autocomplete.AutoCompleteDecorator;
import org.jdesktop.swingx.autocomplete.ObjectToStringConverter;
import javax.swing.JPopupMenu;
@@ -134,11 +136,11 @@
// init combobox renderer base on given decorator
ui.getCombobox().setRenderer(new DecoratorListCellRenderer(d));
- this.convertor = newDecoratedObjectToStringConverter(d);
+ convertor = newDecoratedObjectToStringConverter(d);
// keep a trace of original document (to make possible reverse autom-complete)
JTextComponent editorComponent = (JTextComponent) ui.getCombobox().getEditor().getEditorComponent();
- this.originalDocument = editorComponent.getDocument();
+ originalDocument = editorComponent.getDocument();
// build popup
preparePopup(d);
@@ -409,7 +411,7 @@
@Override
public String getPreferredStringForItem(Object item) {
- return item instanceof String ? (String) item : (item == null ? "" : decorator.toString(item));
+ return item instanceof String ? (String) item : item == null ? "" : decorator.toString(item);
}
};
}
@@ -423,7 +425,7 @@
*/
public static void decorate(JComboBox combo, ObjectToStringConverter convertor) {
- org.jdesktop.swingx.autocomplete.AutoCompleteDecorator.decorate(combo, convertor);
+ AutoCompleteDecorator.decorate(combo, convertor);
}
/**
1
0
22 May '10
Author: tchemit
Date: 2010-05-22 11:01:47 +0200 (Sat, 22 May 2010)
New Revision: 1927
Url: http://nuiton.org/repositories/revision/jaxx/1927
Log:
fires selected property
Modified:
trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/CardLayout2Ext.java
Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/CardLayout2Ext.java
===================================================================
--- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/CardLayout2Ext.java 2010-05-20 05:35:13 UTC (rev 1926)
+++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/CardLayout2Ext.java 2010-05-22 09:01:47 UTC (rev 1927)
@@ -24,41 +24,45 @@
*/
package jaxx.runtime.swing;
-import java.awt.Container;
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeSupport;
import jaxx.runtime.JAXXObject;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import java.awt.Container;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+
/**
* Une extension de {@link CardLayout2} pour pouvoir automatiquement afficher un
* contenu à partir de la propriété {@link #selected}.
- *
+ * <p/>
* Ainsi, en changeant cette propriété via la méthode {@link #setSelected(String)},
* le contenu sera changé automatiquement, ce qui permet une utilisation direct
* dans jaxx sans à avoir à écrire d'écouteur.
*
* @author tchemit <chemit(a)codelutin.com>
+ * @see CardLayout2
* @since 1.3
- * @see CardLayout2
*/
public class CardLayout2Ext extends CardLayout2 {
/** log */
static private Log log = LogFactory.getLog(CardLayout2.class);
+
private static final long serialVersionUID = 1L;
+
public static final String SELECTED_PROPERTY_NAME = "selected";
- /**
- * pour propager les changements dans le modèle vers l'ui
- */
+
+ /** pour propager les changements dans le modèle vers l'ui */
protected PropertyChangeSupport pcs;
- /**
- * le contenu sélectionné
- */
+
+ /** le contenu sélectionné */
protected String selected;
+
private String containerName;
+
private JAXXObject ui;
+
private Container container;
public CardLayout2Ext(JAXXObject ui, String containerName) {
@@ -91,8 +95,7 @@
String oldSelected = this.selected;
this.selected = selected;
show(getContainer(), selected);
- //TODO-TC20100311 : should propagate the selected ?
-// pcs.firePropertyChange(SELECTED_PROPERTY_NAME, oldSelected, selected);
+ pcs.firePropertyChange(SELECTED_PROPERTY_NAME, oldSelected, selected);
}
public Container getContainer() {
1
0
r1926 - in trunk/jaxx-compiler/src/main/java/jaxx/compiler: . binding decorators tags
by tchemit@users.nuiton.org 20 May '10
by tchemit@users.nuiton.org 20 May '10
20 May '10
Author: tchemit
Date: 2010-05-20 07:35:13 +0200 (Thu, 20 May 2010)
New Revision: 1926
Url: http://nuiton.org/repositories/revision/jaxx/1926
Log:
improve override mecanism
Modified:
trunk/jaxx-compiler/src/main/java/jaxx/compiler/CompiledObject.java
trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/DataBinding.java
trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/DataListener.java
trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/DataSource.java
trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/DefaultCompiledObjectDecorator.java
trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/DefaultObjectHandler.java
Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/CompiledObject.java
===================================================================
--- trunk/jaxx-compiler/src/main/java/jaxx/compiler/CompiledObject.java 2010-05-18 18:11:11 UTC (rev 1925)
+++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/CompiledObject.java 2010-05-20 05:35:13 UTC (rev 1926)
@@ -273,6 +273,16 @@
}
/**
+ * {@code true} when overrides an object in the superclass of the class
+ * being compiled AND type is also override.
+ *
+ * @return {@code true} if this object is an override AND override type
+ */
+ public boolean isOverrideType() {
+ return isOverride() && !getObjectClass().equals(getOverrideType());
+ }
+
+ /**
* Sets whether this class overrides an identically-named object in the
* parent class.
*
@@ -709,4 +719,8 @@
public int getGenericTypesLength() {
return genericTypes == null ? 0 : genericTypes.length;
}
+
+ public String getGetterName() {
+ return "get"+StringUtils.capitalize(id);
+ }
}
Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/DataBinding.java
===================================================================
--- trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/DataBinding.java 2010-05-18 18:11:11 UTC (rev 1925)
+++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/DataBinding.java 2010-05-20 05:35:13 UTC (rev 1926)
@@ -217,6 +217,31 @@
processDataBinding = getProcessDataBindingCode(compiler, dataSource, binding);
+ Set<String> ids = dataSource.getOverrideIds();
+
+ if (binding && ids != null && !ids.isEmpty()) {
+
+ // there is some overrides, check trackers
+ DataListener[] listeners = dataSource.getTrackers();
+ for (DataListener listener : listeners) {
+ String code = listener.getAddListenerCode();
+ String newCode = replaceOverrides(compiler, ids, code);
+ if (code.equals(newCode)) {
+ listener.addListenerCode = newCode;
+ if (dataSource.showLog()) {
+ log.info("Replace overrides [" + code + "] --> [" + newCode + "]");
+ }
+ }
+ code = listener.getRemoveListenerCode();
+ newCode = replaceOverrides(compiler, ids, code);
+ if (code.equals(newCode)) {
+ listener.removeListenerCode = newCode;
+ if (dataSource.showLog()) {
+ log.info("Replace overrides [" + code + "] --> [" + newCode + "]");
+ }
+ }
+ }
+ }
return binding;
}
@@ -244,13 +269,17 @@
String objectCode = dataSource.getObjectCode();
+ Set<String> overrideIds = dataSource.getOverrideIds();
// no need to test objectCode not null if on root object
boolean needTest = objectCode != null && !objectCode.trim().isEmpty() && !compiler.getRootObject().getId().equals(objectCode + " != null");
if (needTest) {
+
+ objectCode = replaceOverrides(compiler, overrideIds, objectCode);
+
buffer.append("if (").append(objectCode).append(") {").append(eol);
}
- String assiggment = getAssignment(compiler, dataSource.getOverrideIds());
- buffer.append(JavaFileGenerator.indent(assiggment, needTest ? 4 : 0, false, eol));
+ String assignment = getAssignment(compiler, overrideIds);
+ buffer.append(JavaFileGenerator.indent(assignment, needTest ? 4 : 0, false, eol));
if (needTest) {
buffer.append(eol).append("}");
}
@@ -260,16 +289,24 @@
protected String getAssignment(JAXXCompiler compiler, Set<String> overrides) {
String s = getAssignment();
+ s = replaceOverrides(compiler, overrides, s);
+
+ return s;
+ }
+
+ protected String replaceOverrides(JAXXCompiler compiler, Set<String> overrides, String code) {
if (overrides != null && !overrides.isEmpty()) {
- String tmp = s;
+ String tmp = code;
for (String override : overrides) {
CompiledObject o = compiler.getCompiledObject(override);
- tmp = tmp.replaceFirst(override + ".", o.getJavaCode() + ".");
+ tmp = tmp.replaceAll(override + "\\.", o.getGetterName() + "().");
+// tmp = tmp.replaceFirst(override + ".", o.getJavaCode() + ".");
}
- log.info("Assignment with overrides (" + s + ") = " + tmp);
- s = tmp;
+ if (dataSource.showLog()) {
+ log.info("Assignment with overrides [" + code + "] to [" + tmp + "]");
+ }
+ code = tmp;
}
-
- return s;
+ return code;
}
}
\ No newline at end of file
Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/DataListener.java
===================================================================
--- trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/DataListener.java 2010-05-18 18:11:11 UTC (rev 1925)
+++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/DataListener.java 2010-05-20 05:35:13 UTC (rev 1926)
@@ -49,13 +49,16 @@
/**
* code of the add listener
*/
- protected final String addListenerCode;
+ protected String addListenerCode;
/**
* code of the remove listener
*/
- protected final String removeListenerCode;
+ protected String removeListenerCode;
- public DataListener(String symbol, String objectCode, String addListenerCode, String removeListenerCode) {
+ public DataListener(String symbol,
+ String objectCode,
+ String addListenerCode,
+ String removeListenerCode) {
this.symbol = symbol;
this.objectCode = objectCode;
this.addListenerCode = addListenerCode;
Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/DataSource.java
===================================================================
--- trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/DataSource.java 2010-05-18 18:11:11 UTC (rev 1925)
+++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/DataSource.java 2010-05-20 05:35:13 UTC (rev 1926)
@@ -277,7 +277,7 @@
break;
case JavaParserTreeConstants.JJTPRIMARYEXPRESSION:
type = determineExpressionType(node);
- if (showLog()) {
+ if (log.isDebugEnabled()) {
log.debug("result of determineExpressionType for " + node.getText() + " = " + type);
}
break;
@@ -366,8 +366,10 @@
} catch (NoSuchMethodException e) {
if (showLog()) {
log.info("Could not find method " + methodName + ", code : " + code + " on : " + contextClass);
- for (MethodDescriptor descriptor : contextClass.getMethodDescriptors()) {
- log.info(" - " + Modifier.toString(descriptor.getModifiers()) + " " + descriptor.getName() + "(...) : " + descriptor.getReturnType());
+ if (log.isDebugEnabled()) {
+ for (MethodDescriptor descriptor : contextClass.getMethodDescriptors()) {
+ log.debug(" - " + Modifier.toString(descriptor.getModifiers()) + " " + descriptor.getName() + "(...) : " + descriptor.getReturnType());
+ }
}
}
// happens for methods defined in the current JAXX file via scripts
Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/DefaultCompiledObjectDecorator.java
===================================================================
--- trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/DefaultCompiledObjectDecorator.java 2010-05-18 18:11:11 UTC (rev 1925)
+++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/DefaultCompiledObjectDecorator.java 2010-05-20 05:35:13 UTC (rev 1926)
@@ -35,7 +35,6 @@
import jaxx.compiler.java.JavaMethod;
import jaxx.compiler.script.ScriptInitializer;
import jaxx.compiler.types.TypeManager;
-import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -84,28 +83,24 @@
log.debug("finalize " + id);
}
- if (object.isOverride()) {
+ boolean override = object.isOverride();
- // add a specialized getter, only if type has changed
+ if (override) {
- if (object.getObjectClass().equals(object.getOverrideType())) {
+ if (object.isOverrideType()) {
- // type is the same do nothing
+ // add a specialized getter, only if type has changed
- return;
- }
+ String methodName = object.getGetterName();
- // add a specialized getter
+ String body = "return (" + fqn + ") super." + methodName + "();";
- String methodName = "get" + StringUtils.capitalize(id);
-
- String body = "return (" + fqn + ") " + id + ";";
-
- if (log.isDebugEnabled()) {
- log.debug("Add specialized getter " + methodName + " : " + body);
+ if (log.isDebugEnabled()) {
+ log.debug("Add specialized getter " + methodName + " : " + body);
+ }
+ JavaMethod getter = JavaFileGenerator.newMethod(Modifier.PUBLIC, fqn, methodName, body, true);
+ javaFile.addMethod(getter);
}
- JavaMethod getter = JavaFileGenerator.newMethod(Modifier.PUBLIC, fqn, methodName, body, true);
- javaFile.addMethod(getter);
} else {
int access = id.startsWith("$") ? Modifier.PRIVATE : Modifier.PROTECTED;
@@ -113,73 +108,120 @@
JavaField field = JavaFileGenerator.newField(access, className, id, false, "this");
javaFile.addSimpleField(field);
} else {
-
- JavaField field = JavaFileGenerator.newField(access, fqn, id, object.isOverride());
+
+ JavaField field = JavaFileGenerator.newField(access, fqn, id, override);
javaFile.addField(field, object.isJavaBean());
}
}
- if (!compiler.inlineCreation(object) && !root.equals(object)) {
- javaFile.addMethod(JavaFileGenerator.newMethod(Modifier.PROTECTED, "void", object.getCreationMethodName(), getCreationCode(compiler, object), object.isOverride()));
+ if (compiler.inlineCreation(object) || root.equals(object)) {
+
+ // nothing more to do here
+ return;
}
-// if (!object.isOverride() && !(object instanceof ScriptInitializer)) {
-// String id = object.getId();
-// int access = id.startsWith("$") ? Modifier.PRIVATE : Modifier.PROTECTED;
-// if (object == root) {
-// JavaField field = JavaFileGenerator.newField(access, className, id, false, "this");
-// javaFile.addSimpleField(field);
-// } else {
-// JavaField field = JavaFileGenerator.newField(access, JAXXCompiler.getCanonicalName(object), id, object.isOverride());
-// javaFile.addField(field, object.isJavaBean());
-// }
-// }
-//
-// if (!compiler.inlineCreation(object) && object != root) {
-// javaFile.addMethod(JavaFileGenerator.newMethod(Modifier.PROTECTED, "void", object.getCreationMethodName(), getCreationCode(compiler, object), object.isOverride()));
-// }
+ String code = getCreationCode(compiler, object);
+
+ // tchemit 20100519 Do not add the method only if overriden and code is null
+
+ if (code != null) {
+
+ JavaMethod javaMethod = JavaFileGenerator.newMethod(
+ Modifier.PROTECTED,
+ "void",
+ object.getCreationMethodName(),
+ code,
+ override
+ );
+ javaFile.addMethod(javaMethod);
+ }
}
@Override
public String getCreationCode(JAXXCompiler compiler, CompiledObject object) throws CompilerException {
if (object instanceof ScriptInitializer) {
- return object.getInitializationCode(compiler);
+ throw new IllegalStateException("A script initializer can not come in getCreationcode method!");
}
String eol = JAXXCompiler.getLineSeparator();
+
StringBuffer result = new StringBuffer();
- if (compiler.getRootObject() == object || compiler.inlineCreation(object)) {
+ StringBuilder init = new StringBuilder();
+
+ if (compiler.getRootObject().equals(object) || compiler.inlineCreation(object)) {
result.append("// inline creation of ").append(object.getId());
}
- if (object.isOverride() && object.getOverrideType() == object.getObjectClass()) {
- //TC-20090309 on utilise le super code quand l'objet est de meme type
- result.append("super.").append(object.getCreationMethodName()).append("();");
+
+ if (object.isJavaBean() && object.getJavaBeanInitCode() != null) {
+ init.append(object.getJavaBeanInitCode());
+ } else if (object.getInitializer() != null) {
+ init.append(object.getInitializer());
+ }
+
+ boolean addToObjectMap = true;
+ String id = TypeManager.getJavaCode(object.getId());
+ String constructorParams = object.getConstructorParams();
+
+ if (object.isOverride()) {
+
+ if (init.length() == 0 && constructorParams == null) {
+
+ // no init code is given, no need to add to objectMap
+ addToObjectMap = false;
+ }
+ }
+
+ if (addToObjectMap && init.length() == 0) {
+
+ // on special init, use constructor
+ String canonicalName = JAXXCompiler.getCanonicalName(object);
+ init.append("new ").append(canonicalName).append("(");
+
+ if (constructorParams != null) {
+ init.append(constructorParams);
+ }
+ init.append(")");
+ }
+
+ String superCall = "super." + object.getCreationMethodName() + "();";
+
+ if (addToObjectMap) {
+ result.append(eol);
+ result.append("$objectMap.put(");
+ result.append(id);
+ result.append(", ");
+ result.append(object.getId()).append(" = ");
+ result.append(init);
+ result.append(");");
+ result.append(eol);
} else {
- String init = object.getId() + " = ";
- if (object.isJavaBean() && object.getJavaBeanInitCode() != null) {
- init += object.getJavaBeanInitCode();
- } else if (object.getInitializer() != null) {
- init += object.getInitializer();
- } else {
- String canonicalName = JAXXCompiler.getCanonicalName(object);
- init += "new " + canonicalName + "(";
- String constructorParams = object.getConstructorParams();
- if (constructorParams != null) {
- init += constructorParams;
- }
- init += ")";
+ if (object.isOverride()) {
+
+ // when override has no special init code, just use the super method
+
+ result.append(superCall);
+
}
- result.append(eol);
- result.append("$objectMap.put(").append(TypeManager.getJavaCode(object.getId())).append(", ").append(init).append(");");
}
- result.append(eol);
+
String initCode = object.getInitializationCode(compiler);
if (initCode != null && initCode.length() > 0) {
- result.append(initCode);
+ result.append(eol).append(initCode);
}
// add client properties
addClientProperties(object, result, eol);
- return result.toString();
+
+ String code = result.toString();
+
+ if (!compiler.inlineCreation(object) &&
+ object.isOverride() &&
+ superCall.equals(code.trim())) {
+
+ // special case : when override but do nothing more
+ // method creation can be skipped
+ return null;
+ }
+ return code;
}
@Override
@@ -220,8 +262,8 @@
if (object instanceof ScriptInitializer) {
// initializer has special direct treatment : can not be in a method
- // just push code to compiler
- code.append(getCreationCode(compiler, object));
+ // just push code to compiler
+ code.append(object.getInitializationCode(compiler));
// nothing to initialize of a script
return lastWasMethodCall;
Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/DefaultObjectHandler.java
===================================================================
--- trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/DefaultObjectHandler.java 2010-05-18 18:11:11 UTC (rev 1925)
+++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/DefaultObjectHandler.java 2010-05-20 05:35:13 UTC (rev 1926)
@@ -822,7 +822,6 @@
object.appendInitializationCode(setPropertyCode);
}
compiler.getBindingHelper().registerDataBinding(object.getId() + "." + propertyName, binding, setPropertyCode);
-// compiler.getBindingHelper().registerDataBinding(binding, object.getId() + "." + propertyName, setPropertyCode);
} catch (UnsupportedAttributeException e) {
compiler.reportError("class " + object.getObjectClass().getName() + " does not support attribute '" + propertyName + "'");
}
1
0
r1925 - trunk/jaxx-demo/src/main/java/jaxx/demo/feature/databinding
by tchemit@users.nuiton.org 18 May '10
by tchemit@users.nuiton.org 18 May '10
18 May '10
Author: tchemit
Date: 2010-05-18 20:11:11 +0200 (Tue, 18 May 2010)
New Revision: 1925
Url: http://nuiton.org/repositories/revision/jaxx/1925
Log:
reformat
Modified:
trunk/jaxx-demo/src/main/java/jaxx/demo/feature/databinding/DemoUIModel.java
Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/feature/databinding/DemoUIModel.java
===================================================================
--- trunk/jaxx-demo/src/main/java/jaxx/demo/feature/databinding/DemoUIModel.java 2010-05-18 18:09:45 UTC (rev 1924)
+++ trunk/jaxx-demo/src/main/java/jaxx/demo/feature/databinding/DemoUIModel.java 2010-05-18 18:11:11 UTC (rev 1925)
@@ -25,6 +25,7 @@
package jaxx.demo.feature.databinding;
import javax.swing.*;
+import java.beans.PropertyChangeListener;
import java.io.File;
/**
@@ -66,33 +67,33 @@
void firePropertyChange(String name, Object oldValue, Object newValue);
/**
- * Register a general {@link java.beans.PropertyChangeListener}.
+ * Register a general {@link PropertyChangeListener}.
*
* @param listener the listener to register
*/
- void addPropertyChangeListener(java.beans.PropertyChangeListener listener);
+ void addPropertyChangeListener(PropertyChangeListener listener);
/**
- * Register a {@link java.beans.PropertyChangeListener}. for the given {@code propertyName}.
+ * Register a {@link PropertyChangeListener}. for the given {@code propertyName}.
*
* @param property the property name to listen
* @param listener the listener to register
*/
- void addPropertyChangeListener(String property, java.beans.PropertyChangeListener listener);
+ void addPropertyChangeListener(String property, PropertyChangeListener listener);
/**
- * Unregister a general {@link java.beans.PropertyChangeListener}.
+ * Unregister a general {@link PropertyChangeListener}.
*
* @param listener the listener to unregister
*/
- void removePropertyChangeListener(java.beans.PropertyChangeListener listener);
+ void removePropertyChangeListener(PropertyChangeListener listener);
/**
- * Unregister a {@link java.beans.PropertyChangeListener}. for the given {@code propertyName}.
+ * Unregister a {@link PropertyChangeListener}. for the given {@code propertyName}.
*
* @param property the property name to listen
* @param listener the listener to unregister
*/
- void removePropertyChangeListener(String property, java.beans.PropertyChangeListener listener);
+ void removePropertyChangeListener(String property, PropertyChangeListener listener);
}
1
0
r1924 - trunk/maven-jaxx-plugin/src/test/java/org/nuiton/jaxx/plugin
by tchemit@users.nuiton.org 18 May '10
by tchemit@users.nuiton.org 18 May '10
18 May '10
Author: tchemit
Date: 2010-05-18 20:09:45 +0200 (Tue, 18 May 2010)
New Revision: 1924
Url: http://nuiton.org/repositories/revision/jaxx/1924
Log:
use new api
Modified:
trunk/maven-jaxx-plugin/src/test/java/org/nuiton/jaxx/plugin/JaxxBaseTest.java
Modified: trunk/maven-jaxx-plugin/src/test/java/org/nuiton/jaxx/plugin/JaxxBaseTest.java
===================================================================
--- trunk/maven-jaxx-plugin/src/test/java/org/nuiton/jaxx/plugin/JaxxBaseTest.java 2010-05-18 18:09:18 UTC (rev 1923)
+++ trunk/maven-jaxx-plugin/src/test/java/org/nuiton/jaxx/plugin/JaxxBaseTest.java 2010-05-18 18:09:45 UTC (rev 1924)
@@ -103,7 +103,7 @@
@SuppressWarnings("unchecked")
protected void assertError(JAXXEngine engine, String file, int nbCompiler) throws Exception {
- JAXXCompilerFile[] compilers = engine.getCompilingFiles();
+ JAXXCompilerFile[] compilers = engine.getCompiledFiles();
assertEquals(nbCompiler, compilers.length);
List<String> errors = engine.getErrors();
assertTrue("should have found at least one error for " + file, errors != null && !errors.isEmpty());
1
0
18 May '10
Author: tchemit
Date: 2010-05-18 20:09:18 +0200 (Tue, 18 May 2010)
New Revision: 1923
Url: http://nuiton.org/repositories/revision/jaxx/1923
Log:
remove nasty binding
Modified:
trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/MemoryStatusWidget.jaxx
Modified: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/MemoryStatusWidget.jaxx
===================================================================
--- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/MemoryStatusWidget.jaxx 2010-05-18 18:08:14 UTC (rev 1922)
+++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/MemoryStatusWidget.jaxx 2010-05-18 18:09:18 UTC (rev 1923)
@@ -26,8 +26,7 @@
<JComponent implements='java.awt.event.ActionListener'
foreground='{Color.BLACK}'
- background='{Color.WHITE}'
- font='{new JLabel().getFont()}'>
+ background='{Color.WHITE}'>
<javax.swing.Timer id='timer' javaBean='null'/>
@@ -105,7 +104,7 @@
void $afterCompleteSetup() {
- //FontRenderContext frc = new FontRenderContext(null, false, false);
+ setFont(new JLabel().getFont());
Rectangle2D bounds = getFont().getStringBounds(memoryTestStr, frc);
Dimension dim = new Dimension((int) bounds.getWidth(), (int) bounds .getHeight());
setPreferredSize(dim);
1
0
r1922 - in trunk/jaxx-compiler/src/main/java/jaxx/compiler: . binding decorators tasks
by tchemit@users.nuiton.org 18 May '10
by tchemit@users.nuiton.org 18 May '10
18 May '10
Author: tchemit
Date: 2010-05-18 20:08:14 +0200 (Tue, 18 May 2010)
New Revision: 1922
Url: http://nuiton.org/repositories/revision/jaxx/1922
Log:
- Evolution #625: Improve data binding with inheritance
- Improve JAXXEngine and JAXXTask (simplify a lot...)
Modified:
trunk/jaxx-compiler/src/main/java/jaxx/compiler/JAXXCompiler.java
trunk/jaxx-compiler/src/main/java/jaxx/compiler/JAXXEngine.java
trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/DataBinding.java
trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/DataSource.java
trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/DefaultCompiledObjectDecorator.java
trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/CompileFirstPassTask.java
trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/CompileSecondPassTask.java
trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/FinalizeTask.java
trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/GenerateTask.java
trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/InitTask.java
trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/JAXXEngineTask.java
trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/ProfileTask.java
trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/StyleSheetTask.java
Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/JAXXCompiler.java
===================================================================
--- trunk/jaxx-compiler/src/main/java/jaxx/compiler/JAXXCompiler.java 2010-05-18 18:04:03 UTC (rev 1921)
+++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/JAXXCompiler.java 2010-05-18 18:08:14 UTC (rev 1922)
@@ -110,7 +110,7 @@
* inner classes (including enumerations), because currently they don't
* always resolve (but will generally run without error anyway).
*/
- public static boolean STRICT_CHECKS = false;
+ public static boolean STRICT_CHECKS;
public static final String JAXX_NAMESPACE =
@@ -1307,34 +1307,30 @@
return;
}
- // register the jaxx file into the engine
- URL jaxxURL = getClassLoader().getResource(
- className.replace('.', '/') + ".jaxx");
- URL classURL = getClassLoader().getResource(
- className.replace('.', '/') + ".class");
- if (jaxxURL == null || classURL == null) {
+ // register the jaxx file into the engine
- // unknown class
- //FIXME-TC20100502 : should throw something or at least warn
+ URL jaxxURL = ClassDescriptorHelper.getURL(getClassLoader(), className, "jaxx");
+
+ if (jaxxURL == null) {
+
+ // not a jaxx file, can quit now
return;
}
- try {
- File jaxxFile = URLtoFile(jaxxURL);
- File classFile = URLtoFile(classURL);
- if (classFile.lastModified() > jaxxFile.lastModified()) {
- return; // class file is newer, no need to recompile
- }
- } catch (Exception e) {
- // do nothing
+ if (!engine.isCompileFirstPassTask()) {
+ throw new IllegalStateException(
+ "Internal error: adding dependency class " +
+ className + " during second compilation pass");
}
+ //FIXME tchemit 20100518 Must unify this with ClassDescriptorHelper to use the less costless resource
if (jaxxURL.toString().startsWith("file:")) {
File jaxxFile = URLtoFile(jaxxURL);
try {
jaxxFile = jaxxFile.getCanonicalFile();
} catch (IOException ex) {
- // ignore ?
+ // ignore ? (at least log it...)
+ log.error(ex);
}
String jaxxFileName =
className.substring(className.lastIndexOf(".") + 1) +
@@ -1343,12 +1339,7 @@
assert jaxxFile.getName().equalsIgnoreCase(jaxxFileName) :
"expecting file name to match " +
className + ", but found " + jaxxFile.getName();
- if (jaxxFile.getName().equals(jaxxFileName)) { // check case match
- if (!engine.isFirstCompilePassTask()) {
- throw new AssertionError(
- "Internal error: adding dependency class " +
- className + " during second compilation pass");
- }
+ if (jaxxFile.getName().equals(jaxxFileName)) {
engine.addFileToCompile(jaxxFile, className);
}
}
Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/JAXXEngine.java
===================================================================
--- trunk/jaxx-compiler/src/main/java/jaxx/compiler/JAXXEngine.java 2010-05-18 18:04:03 UTC (rev 1921)
+++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/JAXXEngine.java 2010-05-18 18:08:14 UTC (rev 1922)
@@ -60,10 +60,10 @@
/** configuration of the launchor and underlines compilers */
protected final CompilerConfiguration configuration;
- /** original list of files to run */
+ /** original list of files to compile (says the detected modfied files) */
protected final JAXXCompilerFile[] incomingFiles;
- /** Files to be treated while compilation. */
+ /** Files to compile */
protected final List<JAXXCompilerFile> compilingFiles;
/** Warnings detected while running. */
@@ -103,7 +103,9 @@
addFileToCompile(compilerFile);
}
- incomingFiles = getCompilingFiles();
+ // fix once for all incoming files to compile
+ incomingFiles = compilingFiles.toArray(
+ new JAXXCompilerFile[compilingFiles.size()]);
}
public JAXXEngineTask[] getTasks() {
@@ -151,13 +153,34 @@
return incomingFiles;
}
- public JAXXCompilerFile[] getCompilingFiles() {
- return compilingFiles.toArray(
- new JAXXCompilerFile[compilingFiles.size()]);
+// public JAXXCompilerFile[] getCompilingFiles() {
+// return compilingFiles.toArray(
+// new JAXXCompilerFile[compilingFiles.size()]);
+// }
+
+ public JAXXCompilerFile[] getFilesToCompile() {
+ List<JAXXCompilerFile> files = new ArrayList<JAXXCompilerFile>();
+ for (JAXXCompilerFile file : compilingFiles) {
+ if (file.getCompiler() == null) {
+ files.add(file);
+ }
+ }
+ return files.toArray(new JAXXCompilerFile[files.size()]);
}
+ public JAXXCompilerFile[] getCompiledFiles() {
+ List<JAXXCompilerFile> files = new ArrayList<JAXXCompilerFile>();
+ for (JAXXCompilerFile file : compilingFiles) {
+ if (file.getCompiler() != null) {
+ files.add(file);
+ }
+ }
+ // always send a copy to be safe.
+ return files.toArray(new JAXXCompilerFile[files.size()]);
+ }
+
public boolean containsJaxxFileClassName(String className) {
- for (JAXXCompilerFile file : getCompilingFiles()) {
+ for (JAXXCompilerFile file : compilingFiles) {
if (className.equals(file.getClassName())) {
return true;
}
@@ -165,7 +188,7 @@
return false;
}
- public boolean isFirstCompilePassTask() {
+ public boolean isCompileFirstPassTask() {
return currentTask != null &&
CompileFirstPassTask.TASK_NAME.equals(currentTask.getName());
}
@@ -362,8 +385,8 @@
*/
public void addFileToCompile(File jaxxFile, String jaxxClassName) {
- if (isVerbose()) {
- log.info("file = " + jaxxFile + ", fqn = " + jaxxClassName);
+ if (log.isDebugEnabled()) {
+ log.debug("file = " + jaxxFile + ", fqn = " + jaxxClassName);
}
JAXXCompilerFile file = new JAXXCompilerFile(jaxxFile, jaxxClassName);
Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/DataBinding.java
===================================================================
--- trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/DataBinding.java 2010-05-18 18:04:03 UTC (rev 1921)
+++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/DataBinding.java 2010-05-18 18:08:14 UTC (rev 1922)
@@ -25,6 +25,7 @@
package jaxx.compiler.binding;
+import jaxx.compiler.CompiledObject;
import jaxx.compiler.CompilerException;
import jaxx.compiler.JAXXCompiler;
import jaxx.compiler.java.JavaFileGenerator;
@@ -37,6 +38,7 @@
import java.util.ArrayList;
import java.util.List;
+import java.util.Set;
/**
* Represents a data binding in a JAXX file. <code>DataBinding</code> uses
@@ -45,56 +47,43 @@
*/
public class DataBinding {
- /**
- * Logger
- */
+ /** Logger */
protected static final Log log = LogFactory.getLog(DataBinding.class);
- /**
- * Id of the data binding
- */
+
+ /** Id of the data binding */
private String id;
- /**
- * Real Id of the data binding (can be suffix by a number for css binding to avoid collisions)
- */
+
+ /** Real Id of the data binding (can be suffix by a number for css binding to avoid collisions) */
private String realId;
- /**
- * Constant id build from the {@link #realId} and used instead of {@link #realId} in generated code
- */
+
+ /** Constant id build from the {@link #realId} and used instead of {@link #realId} in generated code */
protected String constantId;
- /**
- * source of the data binding
- */
+
+ /** source of the data binding */
private String source;
+
/**
* A Java snippet which will cause the destination property to be updated with the current value of
* the binding.
*/
private String assignment;
- /**
- * A internal flag to
- */
+
+ /** A internal flag to */
private boolean quickNoDependencies;
- /**
- * Compiled data source
- */
+ /** Compiled data source */
protected DataSource dataSource;
- /**
- * code to add to processDataBinding (null if no binding)
- */
+ /** code to add to processDataBinding (null if no binding) */
protected String processDataBinding;
- /**
- * code to register the databinding (null if no binding)
- */
+
+ /** code to register the databinding (null if no binding) */
protected String initDataBinding;
- /**
- * Extra method to add to the binding
- */
+
+ /** Extra method to add to the binding */
protected final List<JavaMethod> methods = new ArrayList<JavaMethod>();
- /**
- * internal state passed to {@code true} when {@link #compile(jaxx.compiler.JAXXCompiler)} method is invoked
- */
+
+ /** internal state passed to {@code true} when {@link #compile(JAXXCompiler)} method is invoked */
private boolean compiled;
/**
@@ -180,7 +169,7 @@
*
* @param compiler compiler which includes the data binding
* @return {@code true} if the expression has dependencies, {@code false} otherwise
- * @throws jaxx.compiler.CompilerException if a compilation error occurs
+ * @throws CompilerException if a compilation error occurs
*/
public boolean compile(JAXXCompiler compiler) throws CompilerException {
@@ -212,7 +201,7 @@
// was compiled
compiled = true;
- if (DataBindingHelper.SHOW_LOG || log.isDebugEnabled()) {
+ if (dataSource.showLog()) {
if (binding) {
log.info("detect a databinding : " + this);
} else {
@@ -260,10 +249,27 @@
if (needTest) {
buffer.append("if (").append(objectCode).append(") {").append(eol);
}
- buffer.append(JavaFileGenerator.indent(getAssignment(), needTest ? 4 : 0, false, eol));
+ String assiggment = getAssignment(compiler, dataSource.getOverrideIds());
+ buffer.append(JavaFileGenerator.indent(assiggment, needTest ? 4 : 0, false, eol));
if (needTest) {
buffer.append(eol).append("}");
}
return buffer.toString();
}
+
+ protected String getAssignment(JAXXCompiler compiler, Set<String> overrides) {
+ String s = getAssignment();
+
+ if (overrides != null && !overrides.isEmpty()) {
+ String tmp = s;
+ for (String override : overrides) {
+ CompiledObject o = compiler.getCompiledObject(override);
+ tmp = tmp.replaceFirst(override + ".", o.getJavaCode() + ".");
+ }
+ log.info("Assignment with overrides (" + s + ") = " + tmp);
+ s = tmp;
+ }
+
+ return s;
+ }
}
\ No newline at end of file
Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/DataSource.java
===================================================================
--- trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/DataSource.java 2010-05-18 18:04:03 UTC (rev 1921)
+++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/DataSource.java 2010-05-18 18:08:14 UTC (rev 1922)
@@ -52,7 +52,14 @@
import java.beans.Introspector;
import java.io.StringReader;
import java.lang.reflect.Modifier;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
/**
* Represents a Java expression which fires a <code>PropertyChangeEvent</code> when it can be
@@ -62,40 +69,29 @@
*/
public class DataSource {
- /**
- * Logger
- */
+ /** Logger */
protected static final Log log = LogFactory.getLog(DataSource.class);
- /**
- * type attached to "null" constants in parsed expressions
- */
+ /** type attached to "null" constants in parsed expressions */
private class NULL {
}
- /**
- * id of data source
- */
+ /** id of data source */
private final String id;
- /**
- * Constant id
- */
+
+ /** Constant id */
protected final String constantId;
- /**
- * The Java source code for the expression.
- */
+
+ /** The Java source code for the expression. */
private final String source;
- /**
- * The current <code>JAXXCompiler</code>.
- */
+
+ /** The current <code>JAXXCompiler</code>. */
private final JAXXCompiler compiler;
- /**
- * List of detected tracker (if none found, it is not a data binding)
- */
+
+ /** List of detected tracker (if none found, it is not a data binding) */
private final List<DataListener> trackers;
- /**
- * the delegate of property to be required
- */
+
+ /** the delegate of property to be required */
private String objectCode;
protected final List<JavaMethod> methods;
@@ -116,7 +112,7 @@
this.source = source;
this.compiler = compiler;
this.methods = methods;
- this.trackers = new ArrayList<DataListener>();
+ trackers = new ArrayList<DataListener>();
}
public String getObjectCode() {
@@ -142,6 +138,11 @@
return b.toString();
}
+ public boolean showLog() {
+// return DataBindingHelper.SHOW_LOG || log.isDebugEnabled();
+ return DataBindingHelper.SHOW_LOG;
+ }
+
/**
* Compiles the data source expression and listener. This method calls methods in <code>JAXXCompiler</code>
* to add the Java code that performs the data source setup. Adding listeners to <code>DataSource</code> is
@@ -150,13 +151,12 @@
* expression will be compiled and evaluated at runtime to yield the <code>DataSource's</code> listener.
*
* @return <code>true</code> if the expression has dependencies, <code>false</code> otherwise
- * @throws jaxx.compiler.CompilerException
- * if a compilation error occurs
+ * @throws CompilerException if a compilation error occurs
* @throws IllegalStateException if data source was already compiled
*/
protected boolean compile() throws CompilerException, IllegalStateException {
- if (DataBindingHelper.SHOW_LOG || log.isDebugEnabled()) {
+ if (showLog()) {
log.info("======= Start compile of " + source);
}
JavaParser p = new JavaParser(new StringReader(source));
@@ -185,7 +185,7 @@
// scan accepted expressions to detect dependencies and track listeners
for (SimpleNode node : expressions.keySet()) {
- if (DataBindingHelper.SHOW_LOG || log.isDebugEnabled()) {
+ if (showLog()) {
log.info("Will parse expression " + node.getText());
}
scanNode(node);
@@ -204,7 +204,7 @@
// no requirements
- this.objectCode = "";
+ objectCode = "";
} else {
// build the fully test from requirements
@@ -212,11 +212,16 @@
StringBuilder buffer = new StringBuilder();
Iterator<String> itr = result.iterator();
- buffer.append(itr.next()).append(" != null");
+
+ overrideIds = new HashSet<String>();
+
+ String realSource = getJavaCode(itr.next());
+ buffer.append(realSource).append(" != null");
while (itr.hasNext()) {
- buffer.append(" && ").append(itr.next()).append(" != null");
+ realSource = getJavaCode(itr.next());
+ buffer.append(" && ").append(realSource).append(" != null");
}
- this.objectCode = buffer.toString().trim();
+ objectCode = buffer.toString().trim();
}
}
castsExpressions.clear();
@@ -224,16 +229,34 @@
return isBinding;
}
+ private Set<String> overrideIds;
+
+ private String getJavaCode(String s) {
+ CompiledObject o = compiler.getCompiledObject(s);
+ if (o != null && o.isOverride()) {
+
+ if (showLog()) {
+ log.info("Use an override identifier : " + o.getJavaCode());
+ }
+
+ overrideIds.add(s);
+ }
+ return s;
+ }
+
+ public Set<String> getOverrideIds() {
+ return overrideIds;
+ }
+
/**
* Examines a node to identify any dependencies it contains.
*
* @param node node to scan
- * @throws jaxx.compiler.CompilerException
- * ?
+ * @throws CompilerException ?
*/
private void scanNode(SimpleNode node) throws CompilerException {
if (node.getId() == JavaParserTreeConstants.JJTMETHODDECLARATION ||
- node.getId() == JavaParserTreeConstants.JJTFIELDDECLARATION) {
+ node.getId() == JavaParserTreeConstants.JJTFIELDDECLARATION) {
return;
}
if (log.isTraceEnabled()) {
@@ -254,7 +277,7 @@
break;
case JavaParserTreeConstants.JJTPRIMARYEXPRESSION:
type = determineExpressionType(node);
- if (log.isDebugEnabled()) {
+ if (showLog()) {
log.debug("result of determineExpressionType for " + node.getText() + " = " + type);
}
break;
@@ -276,11 +299,12 @@
* @return the class descriptor of the return type or null
*/
private ClassDescriptor determineExpressionType(SimpleNode expression) {
- if (log.isTraceEnabled()) {
- log.trace("for expression " + expression.getText());
- }
assert expression.getId() == JavaParserTreeConstants.JJTPRIMARYEXPRESSION;
SimpleNode prefix = expression.getChild(0);
+ if (log.isDebugEnabled()) {
+ log.debug("for expression " + expression.getText() + " - prefix " + prefix + " - nb childrens of prefix: " + prefix.jjtGetNumChildren() + ", nb childrens of expression : " + expression.jjtGetNumChildren());
+ }
+
if (prefix.jjtGetNumChildren() == 1) {
int type = prefix.getChild(0).getId();
if (type == JavaParserTreeConstants.JJTLITERAL || type == JavaParserTreeConstants.JJTEXPRESSION) {
@@ -340,6 +364,12 @@
}
return method.getReturnType();
} catch (NoSuchMethodException e) {
+ if (showLog()) {
+ log.info("Could not find method " + methodName + ", code : " + code + " on : " + contextClass);
+ for (MethodDescriptor descriptor : contextClass.getMethodDescriptors()) {
+ log.info(" - " + Modifier.toString(descriptor.getModifiers()) + " " + descriptor.getName() + "(...) : " + descriptor.getReturnType());
+ }
+ }
// happens for methods defined in the current JAXX file via scripts
String propertyName = null;
if (methodName.startsWith("is")) {
@@ -360,15 +390,16 @@
// check this is a javaBean
CompiledObject compiledObject = compiler.getObjects().get(propertyName);
if (compiledObject != null && compiledObject.isJavaBean()) {
- if (DataBindingHelper.SHOW_LOG || log.isDebugEnabled()) {
- log.info("Detect a dependency from a script method '" + newMethod.getName() + "' which reflect a javaBean property " + propertyName);
- log.info("Try to add a listener [symbol:" + bindingId + ",objectCode:" + "null" + "]");
+ String objectCode = null;
+ if (showLog()) {
+ log.info("Detect a dependency from compiled object [" + objectCode + "]a script method '" + newMethod.getName() + "' which reflect a javaBean property " + propertyName);
+ log.info("Try to add a listener [symbol:" + bindingId + ",objectCode:" + objectCode + "]");
log.debug(">> lastnode = " + lastNode + "(), suffix = " + suffix.getText() + ", expression = " + expression.getText());
}
addListener(bindingId,
- null,
- "addPropertyChangeListener(\"" + propertyName + "\", this);" + JAXXCompiler.getLineSeparator(),
- "removePropertyChangeListener(\"" + propertyName + "\", this);" + JAXXCompiler.getLineSeparator());
+ objectCode,
+ "addPropertyChangeListener(\"" + propertyName + "\", this);" + JAXXCompiler.getLineSeparator(),
+ "removePropertyChangeListener(\"" + propertyName + "\", this);" + JAXXCompiler.getLineSeparator());
}
contextClass = newMethod.getReturnType();
}
@@ -486,16 +517,16 @@
FieldDescriptor newField = compiler.getScriptField(memberName);
if (newField != null) {
contextClass = newField.getType();
- if (DataBindingHelper.SHOW_LOG || log.isDebugEnabled()) {
+ if (showLog()) {
log.info("Detect a dependency from a script field '" + newField + "'");
log.info("Try to add a listenenr [symbol:" + tokensSeenSoFar.toString() + ",objectCode:" + null + "]");
}
String eol = JAXXCompiler.getLineSeparator();
addListener(tokensSeenSoFar.toString(),
- null,
- "addPropertyChangeListener(\"" + memberName + "\", this);" + eol,
+ null,
+ "addPropertyChangeListener(\"" + memberName + "\", this);" + eol,
// "addPropertyChangeListener(\"" + memberName + "\", " + listenerId + ");" + eol,
- "removePropertyChangeListener(\"" + memberName + "\", this);" + eol);
+"removePropertyChangeListener(\"" + memberName + "\", this);" + eol);
// "removePropertyChangeListener(\"" + memberName + "\", " + listenerId + ");" + eol);
assert contextClass != null : "script field '" + memberName + "' is defined, but has type null";
@@ -540,14 +571,14 @@
try {
if (handler.isMemberBound(memberName)) {
String bindingId = objectCode + "." + memberName + (method ? "()" : "");
- if (DataBindingHelper.SHOW_LOG || log.isDebugEnabled()) {
+ if (showLog()) {
log.info("Detect a dependency from a event handler for memberName '" + memberName + "' for class " + objectClass);
log.info("Try to add a listenenr [symbol:" + bindingId + ", objectCode:" + objectCode + "]");
}
addListener(bindingId,
- objectCode,
- getAddMemberListenerCode(handler, objectCode, memberName, "this", compiler),
- getRemoveMemberListenerCode(handler, objectCode, memberName, "this", compiler));
+ objectCode,
+ getAddMemberListenerCode(handler, objectCode, memberName, "this", compiler),
+ getRemoveMemberListenerCode(handler, objectCode, memberName, "this", compiler));
}
} catch (UnsupportedAttributeException e) {
// ignore -- this is thrown for methods like toString(), for which there is no tracking and
@@ -620,8 +651,8 @@
ClassDescriptor eventClass = DefaultObjectHandler.getEventClass(eventInfo.getListenerClass());
if (!methodExists) {
methods.add(new JavaMethod(Modifier.PUBLIC, "void", methodName,
- new JavaArgument[]{new JavaArgument(JAXXCompiler.getCanonicalName(eventClass), "event")}, null,
- "propertyChange(null);", false));
+ new JavaArgument[]{new JavaArgument(JAXXCompiler.getCanonicalName(eventClass), "event")}, null,
+ "propertyChange(null);", false));
}
String code = objectCode + (eventInfo.getModelName() != null ? ".get" + StringUtils.capitalize(eventInfo.getModelName()) + "()" : "");
result.append("$bindingSources.put(\"").append(code).append("\", ").append(code).append(");").append(JAXXCompiler.getLineSeparator());
@@ -630,16 +661,16 @@
result.append(JAXXCompiler.getLineSeparator());
if (eventInfo.getModelName() != null) {
result.append(getAddMemberListenerCode(handler, objectCode, "get" + StringUtils.capitalize(eventInfo.getModelName()),
- JAXXUtil.class.getSimpleName() + ".getDataBindingUpdateListener(" + (compiler.getOutputClassName() + ".this") + ", " + constantId + ")",
- compiler));
+ JAXXUtil.class.getSimpleName() + ".getDataBindingUpdateListener(" + compiler.getOutputClassName() + ".this" + ", " + constantId + ")",
+ compiler));
}
return result.toString();
}
String propertyName = null;
if (memberName.startsWith("get")) {
- propertyName = Introspector.decapitalize(memberName.substring("get".length()));
+ propertyName = Introspector.decapitalize(memberName.substring(3));
} else if (memberName.startsWith("is")) {
- propertyName = Introspector.decapitalize(memberName.substring("is".length()));
+ propertyName = Introspector.decapitalize(memberName.substring(2));
} else {
try {
handler.getBeanClass().getFieldDescriptor(memberName);
@@ -690,8 +721,8 @@
if (!methodExists) {
ClassDescriptor eventClass = DefaultObjectHandler.getEventClass(eventInfo.getListenerClass());
methods.add(new JavaMethod(Modifier.PUBLIC, "void", methodName,
- new JavaArgument[]{new JavaArgument(JAXXCompiler.getCanonicalName(eventClass), "event")}, null,
- "propertyChange(null);", false));
+ new JavaArgument[]{new JavaArgument(JAXXCompiler.getCanonicalName(eventClass), "event")}, null,
+ "propertyChange(null);", false));
}
try {
String modelMemberName = eventInfo.getModelName() != null ? "get" + StringUtils.capitalize(eventInfo.getModelName()) : null;
@@ -706,8 +737,8 @@
result.append("}").append(eol);
if (eventInfo.getModelName() != null) {
result.append(getRemoveMemberListenerCode(handler, objectCode, "get" + StringUtils.capitalize(eventInfo.getModelName()),
- JAXXUtil.class.getSimpleName() + ".getDataBindingUpdateListener(" + compiler.getOutputClassName() + ".this, " + constantId + ")",
- compiler));
+ JAXXUtil.class.getSimpleName() + ".getDataBindingUpdateListener(" + compiler.getOutputClassName() + ".this, " + constantId + ")",
+ compiler));
}
return result.toString();
} catch (NoSuchMethodException e) {
Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/DefaultCompiledObjectDecorator.java
===================================================================
--- trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/DefaultCompiledObjectDecorator.java 2010-05-18 18:04:03 UTC (rev 1921)
+++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/DefaultCompiledObjectDecorator.java 2010-05-18 18:08:14 UTC (rev 1922)
@@ -29,44 +29,115 @@
import jaxx.compiler.CompiledObjectDecorator;
import jaxx.compiler.CompilerException;
import jaxx.compiler.JAXXCompiler;
+import jaxx.compiler.java.JavaField;
import jaxx.compiler.java.JavaFile;
import jaxx.compiler.java.JavaFileGenerator;
+import jaxx.compiler.java.JavaMethod;
import jaxx.compiler.script.ScriptInitializer;
import jaxx.compiler.types.TypeManager;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import java.lang.reflect.Modifier;
import java.util.Map.Entry;
/**
* The default decorator to use on all compiled objects.
- *
+ *
* @author tchemit <chemit(a)codelutin.com>
+ * @plexus.component role-hint="default" role="jaxx.compiler.CompiledObjectDecorator"
* @since 1.2
- * @plexus.component role-hint="default" role="jaxx.compiler.CompiledObjectDecorator"
*/
public class DefaultCompiledObjectDecorator implements CompiledObjectDecorator {
+
+ /** Logger */
+ protected static final Log log =
+ LogFactory.getLog(DefaultCompiledObjectDecorator.class);
+
@Override
public String getName() {
return "default";
}
@Override
- public void finalizeCompiler(JAXXCompiler compiler, CompiledObject root, CompiledObject object, JavaFile javaFile, String packageName, String className, String fullClassName) {
+ public void finalizeCompiler(JAXXCompiler compiler,
+ CompiledObject root,
+ CompiledObject object,
+ JavaFile javaFile,
+ String packageName,
+ String className,
+ String fullClassName) {
- if (!object.isOverride() && !(object instanceof ScriptInitializer)) {
- String id = object.getId();
+ if (object instanceof ScriptInitializer) {
+
+ // nothing to finalize
+ return;
+ }
+
+ String fqn = JAXXCompiler.getCanonicalName(object);
+
+ String id = object.getId();
+
+ if (log.isDebugEnabled()) {
+ log.debug("finalize " + id);
+ }
+
+ if (object.isOverride()) {
+
+ // add a specialized getter, only if type has changed
+
+ if (object.getObjectClass().equals(object.getOverrideType())) {
+
+ // type is the same do nothing
+
+ return;
+ }
+
+ // add a specialized getter
+
+ String methodName = "get" + StringUtils.capitalize(id);
+
+ String body = "return (" + fqn + ") " + id + ";";
+
+ if (log.isDebugEnabled()) {
+ log.debug("Add specialized getter " + methodName + " : " + body);
+ }
+ JavaMethod getter = JavaFileGenerator.newMethod(Modifier.PUBLIC, fqn, methodName, body, true);
+ javaFile.addMethod(getter);
+ } else {
+
int access = id.startsWith("$") ? Modifier.PRIVATE : Modifier.PROTECTED;
- if (object == root) {
- javaFile.addSimpleField(JavaFileGenerator.newField(access, className, id, false, "this"));
+ if (root.equals(object)) {
+ JavaField field = JavaFileGenerator.newField(access, className, id, false, "this");
+ javaFile.addSimpleField(field);
} else {
- javaFile.addField(JavaFileGenerator.newField(access, JAXXCompiler.getCanonicalName(object), id, object.isOverride()), object.isJavaBean());
+
+ JavaField field = JavaFileGenerator.newField(access, fqn, id, object.isOverride());
+ javaFile.addField(field, object.isJavaBean());
}
}
- if (!compiler.inlineCreation(object) && object != root) {
+ if (!compiler.inlineCreation(object) && !root.equals(object)) {
javaFile.addMethod(JavaFileGenerator.newMethod(Modifier.PROTECTED, "void", object.getCreationMethodName(), getCreationCode(compiler, object), object.isOverride()));
}
+
+// if (!object.isOverride() && !(object instanceof ScriptInitializer)) {
+// String id = object.getId();
+// int access = id.startsWith("$") ? Modifier.PRIVATE : Modifier.PROTECTED;
+// if (object == root) {
+// JavaField field = JavaFileGenerator.newField(access, className, id, false, "this");
+// javaFile.addSimpleField(field);
+// } else {
+// JavaField field = JavaFileGenerator.newField(access, JAXXCompiler.getCanonicalName(object), id, object.isOverride());
+// javaFile.addField(field, object.isJavaBean());
+// }
+// }
+//
+// if (!compiler.inlineCreation(object) && object != root) {
+// javaFile.addMethod(JavaFileGenerator.newMethod(Modifier.PROTECTED, "void", object.getCreationMethodName(), getCreationCode(compiler, object), object.isOverride()));
+// }
}
@Override
@@ -145,7 +216,18 @@
@Override
public boolean createInitializer(JAXXCompiler compiler, CompiledObject root, CompiledObject object, StringBuffer code, boolean lastWasMethodCall) {
String eol = JAXXCompiler.getLineSeparator();
- if (object == root) {
+
+ if (object instanceof ScriptInitializer) {
+
+ // initializer has special direct treatment : can not be in a method
+ // just push code to compiler
+ code.append(getCreationCode(compiler, object));
+
+ // nothing to initialize of a script
+ return lastWasMethodCall;
+ }
+
+ if (root.equals(object)) {
String rootCode = root.getInitializationCode(compiler);
if (rootCode != null && rootCode.length() > 0) {
code.append("// inline creation of ").append(object.getId()).append(eol);
Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/CompileFirstPassTask.java
===================================================================
--- trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/CompileFirstPassTask.java 2010-05-18 18:04:03 UTC (rev 1921)
+++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/CompileFirstPassTask.java 2010-05-18 18:08:14 UTC (rev 1922)
@@ -44,30 +44,25 @@
/** Logger */
private static final Log log = LogFactory.getLog(CompileFirstPassTask.class);
- private static final long serialVersionUID = -1L;
-
+ /** Task name */
public static final String TASK_NAME = "CompileFirstPass";
public CompileFirstPassTask() {
super(TASK_NAME);
}
- protected boolean compiled;
-
@Override
public boolean perform(JAXXEngine engine) throws Exception {
boolean success = true;
- compiled = true;
- while (compiled) {
- // at each round, says nothing has to be compiled
- // the method treateFile will if required change the state
- compiled = false;
+ JAXXCompilerFile[] undone = engine.getFilesToCompile();
- JAXXCompilerFile[] files = engine.getCompilingFiles();
+ while (undone.length > 0) {
- for (JAXXCompilerFile jaxxFile : files) {
+ // start a new round of compilation
+ for (JAXXCompilerFile jaxxFile : undone) {
+
boolean successForFile = treateFile(engine, jaxxFile);
if (!successForFile) {
@@ -76,6 +71,9 @@
success = false;
}
}
+
+ // prepare next round
+ undone = engine.getFilesToCompile();
}
return success;
}
@@ -86,32 +84,21 @@
boolean isVerbose = engine.isVerbose();
if (isVerbose) {
- log.info(getName() + " for " + jaxxFile.getClassName());
+ log.info("start " + jaxxFile.getClassName());
}
- JAXXCompiler compiler = jaxxFile.getCompiler();
-
- if (compiler != null) {
-
- // file already registred
- return true;
- }
-
boolean success = true;
- // mark to have another round to treate new files
- compiled = true;
-
CompilerConfiguration configuration = engine.getConfiguration();
- compiler = engine.newCompiler(jaxxFile);
+ JAXXCompiler compiler = engine.newCompiler(jaxxFile);
addStartProfileTime(engine, compiler);
compiler.compileFirstPass();
if (configuration.isAutoImportCss() && !compiler.isIdentCssFound()) {
- // check if can add ident css file
+ // check if we can add ident css file
File cssFile = jaxxFile.getCssFile();
Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/CompileSecondPassTask.java
===================================================================
--- trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/CompileSecondPassTask.java 2010-05-18 18:04:03 UTC (rev 1921)
+++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/CompileSecondPassTask.java 2010-05-18 18:08:14 UTC (rev 1922)
@@ -24,15 +24,12 @@
*/
package jaxx.compiler.tasks;
-import jaxx.compiler.CompilerException;
import jaxx.compiler.JAXXCompiler;
import jaxx.compiler.JAXXCompilerFile;
import jaxx.compiler.JAXXEngine;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import java.util.Arrays;
-
/**
* Task to execute the Second round of compile.
*
@@ -45,8 +42,7 @@
private static final Log log =
LogFactory.getLog(CompileSecondPassTask.class);
- private static final long serialVersionUID = -1L;
-
+ /** Task name */
public static final String TASK_NAME = "CompileSecondPass";
public CompileSecondPassTask() {
@@ -58,16 +54,20 @@
boolean success = true;
boolean isVerbose = engine.isVerbose();
- JAXXCompilerFile[] files = engine.getCompilingFiles();
+ // check all files are attached to a compiler
+ checkAllFilesCompiled(engine);
+ JAXXCompilerFile[] files = engine.getCompiledFiles();
+
for (JAXXCompilerFile jaxxFile : files) {
String className = jaxxFile.getClassName();
if (isVerbose) {
- log.info(getName() + " for " + className);
+ log.info("start " + className);
}
- JAXXCompiler compiler = getSafeCompiler(jaxxFile);
+ JAXXCompiler compiler = jaxxFile.getCompiler();
+
addStartProfileTime(engine, compiler);
if (log.isDebugEnabled()) {
log.debug("runInitializers for " + className);
@@ -89,15 +89,7 @@
}
}
- // check that compilation set was not altered during pass 2
- JAXXCompilerFile[] jaxxFilesClone = engine.getCompilingFiles();
- if (jaxxFilesClone.length > files.length) {
- throw new CompilerException(
- "Internal error: compilation set altered during pass" +
- " 2 (was " + Arrays.toString(jaxxFilesClone) +
- ", modified to " + Arrays.toString(files) + ")"
- );
- }
return success;
}
+
}
\ No newline at end of file
Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/FinalizeTask.java
===================================================================
--- trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/FinalizeTask.java 2010-05-18 18:04:03 UTC (rev 1921)
+++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/FinalizeTask.java 2010-05-18 18:08:14 UTC (rev 1922)
@@ -43,8 +43,7 @@
/** Logger */
private static final Log log = LogFactory.getLog(FinalizeTask.class);
- private static final long serialVersionUID = -1L;
-
+ /** Task name */
public static final String TASK_NAME = "Finalize";
public FinalizeTask() {
@@ -56,12 +55,17 @@
boolean success = true;
boolean isVerbose = engine.getConfiguration().isVerbose();
- for (JAXXCompilerFile jaxxFile : engine.getCompilingFiles()) {
+ // check all files are attached to a compiler
+ checkAllFilesCompiled(engine);
+ JAXXCompilerFile[] files = engine.getCompiledFiles();
+
+ for (JAXXCompilerFile jaxxFile : files) {
+
if (isVerbose) {
- log.info(getName() + " for " + jaxxFile.getClassName());
+ log.info("start " + jaxxFile.getClassName());
}
- JAXXCompiler compiler = getSafeCompiler(jaxxFile);
+ JAXXCompiler compiler = jaxxFile.getCompiler();
addStartProfileTime(engine, compiler);
compiler.finalizeCompiler();
addEndProfileTime(engine, compiler);
Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/GenerateTask.java
===================================================================
--- trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/GenerateTask.java 2010-05-18 18:04:03 UTC (rev 1921)
+++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/GenerateTask.java 2010-05-18 18:08:14 UTC (rev 1922)
@@ -42,8 +42,7 @@
/** Logger */
private static final Log log = LogFactory.getLog(GenerateTask.class);
- private static final long serialVersionUID = -1L;
-
+ /** Task name */
public static final String TASK_NAME = "Generate";
public GenerateTask() {
@@ -52,6 +51,10 @@
@Override
public boolean perform(JAXXEngine engine) throws Exception {
+
+ // check all files are attached to a compiler
+ checkAllFilesCompiled(engine);
+
boolean success = true;
boolean verbose = engine.isVerbose();
@@ -59,13 +62,15 @@
JavaFileGenerator generator =
new JavaFileGenerator(JAXXCompiler.getLineSeparator(), verbose);
- for (JAXXCompilerFile jaxxFile : engine.getCompilingFiles()) {
+ JAXXCompilerFile[] files = engine.getCompiledFiles();
+
+ for (JAXXCompilerFile jaxxFile : files) {
if (verbose) {
- log.info(getName() + " for " + jaxxFile.getClassName());
+ log.info("start " + jaxxFile.getClassName());
}
- JAXXCompiler compiler = getSafeCompiler(jaxxFile);
+ JAXXCompiler compiler = jaxxFile.getCompiler();
addStartProfileTime(engine, compiler);
compiler.generate(generator);
addEndProfileTime(engine, compiler);
Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/InitTask.java
===================================================================
--- trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/InitTask.java 2010-05-18 18:04:03 UTC (rev 1921)
+++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/InitTask.java 2010-05-18 18:08:14 UTC (rev 1922)
@@ -38,13 +38,12 @@
*/
public class InitTask extends JAXXEngineTask {
- private static final long serialVersionUID = -1L;
-
- public static final String TASK_NAME = "Init";
-
/** Logger */
private static final Log log = LogFactory.getLog(InitTask.class);
+ /** Task name */
+ public static final String TASK_NAME = "Init";
+
public InitTask() {
super(TASK_NAME);
}
@@ -76,7 +75,7 @@
}
if (configuration.isVerbose()) {
- log.info("will init " + JAXXFactory.class.getName());
+ log.info("Will init " + JAXXFactory.class.getName());
}
JAXXFactory.initFactory();
Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/JAXXEngineTask.java
===================================================================
--- trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/JAXXEngineTask.java 2010-05-18 18:04:03 UTC (rev 1921)
+++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/JAXXEngineTask.java 2010-05-18 18:08:14 UTC (rev 1922)
@@ -24,13 +24,10 @@
*/
package jaxx.compiler.tasks;
-import jaxx.compiler.CompilerException;
import jaxx.compiler.JAXXCompiler;
import jaxx.compiler.JAXXCompilerFile;
import jaxx.compiler.JAXXEngine;
-import java.io.Serializable;
-
/**
* Base class to implement a task to be launched by a {@link JAXXEngine}.
* <p/>
@@ -39,49 +36,51 @@
* @author tchemit <chemit(a)codelutin.com>
* @since 2.0.2
*/
-public abstract class JAXXEngineTask implements Serializable {
+public abstract class JAXXEngineTask {
+ /** Task name */
private final String name;
public JAXXEngineTask(String name) {
this.name = name;
}
+ /**
+ * Performs the task on the given {@code engine}.
+ *
+ * @param engine the engine to use
+ * @return {@code false} if task failed (with no exception), {@code true} otherwise.
+ * @throws Exception if any error
+ */
public abstract boolean perform(JAXXEngine engine) throws Exception;
-
public String getName() {
return name;
}
+ /**
+ * Checks the engine does not have any more files to discover.
+ *
+ * @param engine the engine to test
+ * @throws IllegalStateException if there is still some files to discover.
+ */
+ protected void checkAllFilesCompiled(JAXXEngine engine) throws IllegalStateException {
+ JAXXCompilerFile[] undone = engine.getFilesToCompile();
+
+ if (undone.length > 0) {
+
+ throw new IllegalStateException("Can not start '" + getName() + "', there is still files to process in '" + CompileFirstPassTask.TASK_NAME);
+ }
+ }
+
protected void addStartProfileTime(JAXXEngine engine,
JAXXCompiler compiler) {
engine.addProfileTime(compiler, name + "_start");
}
+
protected void addEndProfileTime(JAXXEngine engine,
JAXXCompiler compiler) {
engine.addProfileTime(compiler, name + "_end");
}
-
- protected JAXXCompiler getSafeCompiler(JAXXCompilerFile engine) {
- JAXXCompiler compiler = engine.getCompiler();
- if (compiler == null) {
- throw new CompilerException(
- "Internal error: could not find compiler for " +
- engine.getClassName() + " during task [" + getName() + "]"
- );
- }
-
- return compiler;
- }
-//
-// protected JAXXCompiler getSafeCompiler(JAXXEngine engine,
-// String className) {
-// JAXXCompiler compiler = engine.getCompiler(
-// className,
-// "Internal error: could not find compiler for " + className +
-// " during task [" + getName() + "]");
-// return compiler;
-// }
}
Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/ProfileTask.java
===================================================================
--- trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/ProfileTask.java 2010-05-18 18:04:03 UTC (rev 1921)
+++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/ProfileTask.java 2010-05-18 18:08:14 UTC (rev 1922)
@@ -39,8 +39,7 @@
/** Logger */
private static final Log log = LogFactory.getLog(ProfileTask.class);
- private static final long serialVersionUID = -1L;
-
+ /** Task name */
public static final String TASK_NAME = "Profile";
public ProfileTask() {
Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/StyleSheetTask.java
===================================================================
--- trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/StyleSheetTask.java 2010-05-18 18:04:03 UTC (rev 1921)
+++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/StyleSheetTask.java 2010-05-18 18:08:14 UTC (rev 1922)
@@ -41,8 +41,7 @@
/** Logger */
private static final Log log = LogFactory.getLog(StyleSheetTask.class);
- private static final long serialVersionUID = -1L;
-
+ /** Task name */
public static final String TASK_NAME = "StyleSheet";
public StyleSheetTask() {
@@ -51,18 +50,26 @@
@Override
public boolean perform(JAXXEngine engine) throws Exception {
+
+ // check all files are attached to a compiler
+ checkAllFilesCompiled(engine);
+
boolean success = true;
boolean isVerbose = engine.getConfiguration().isVerbose();
- JAXXCompilerFile[] files = engine.getCompilingFiles();
+
+ JAXXCompilerFile[] files = engine.getCompiledFiles();
+
for (JAXXCompilerFile jaxxFile : files) {
String className = jaxxFile.getClassName();
if (isVerbose) {
- log.info(getName() + " for " + className);
+ log.info("start " + className);
}
- JAXXCompiler compiler = getSafeCompiler(jaxxFile);
+
+ JAXXCompiler compiler = jaxxFile.getCompiler();
addStartProfileTime(engine, compiler);
compiler.applyStylesheets();
addEndProfileTime(engine, compiler);
+
if (compiler.isFailed()) {
success = false;
}
1
0