Index: C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/component/AssociationMgt.java
===================================================================
--- C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/component/AssociationMgt.java (revision 921)
+++ C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/component/AssociationMgt.java (working copy)
@@ -1,66 +1,65 @@
package org.trails.component;
+import ognl.Ognl;
+import ognl.OgnlException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.annotations.ComponentClass;
+import org.apache.tapestry.annotations.InjectObject;
+import org.apache.tapestry.annotations.Parameter;
+import org.apache.tapestry.link.ILinkRenderer;
+import org.trails.descriptor.DescriptorService;
+import org.trails.descriptor.IClassDescriptor;
+import org.trails.descriptor.ObjectReferenceDescriptor;
+import org.trails.descriptor.extension.OwningObjectReferenceDescriptor;
+import org.trails.exception.TrailsRuntimeException;
+import org.trails.page.PageResolver;
+import org.trails.persistence.PersistenceService;
/**
- * @author kenneth.colassi nhhockeyplayer@hotmail.com
- * @OneToOne use case.
This guy manages the owning side user interface of a
+ * @OneToOne use case.
+ *
+ * This guy manages the owning side user interface of a
* OneToOne association. Owner-<>-----Association
+ *
+ * @author kenneth.colassi nhhockeyplayer@hotmail.com
*/
-@ComponentClass(allowBody = true, allowInformalParameters = true)
+@ComponentClass(allowBody = false)
public abstract class AssociationMgt extends TrailsComponent
{
-/*
protected static final Log LOG = LogFactory.getLog(AssociationMgt.class);
+
+ @InjectObject("service:trails.core.PageResolver")
+ public abstract PageResolver getPageResolver();
- @Bean(lifecycle = Lifecycle.REQUEST)
- public abstract TrailsValidationDelegate getDelegate();
-
- public abstract String getCreateExpression();
+ @Parameter(defaultValue = "page.descriptorService")
+ public abstract DescriptorService getDescriptorService();
- public abstract void setCreateExpression(String CreateExpression);
+ @Parameter(defaultValue = "page.persistenceService")
+ public abstract PersistenceService getPersistenceService();
@Parameter(required = true, cache = true)
public abstract ObjectReferenceDescriptor getDescriptor();
-
public abstract void setDescriptor(ObjectReferenceDescriptor descriptor);
@Parameter(required = true, cache = true)
- public abstract Object getOwner();
-
- public abstract void setOwner(Object owner);
-
- @Parameter(required = true, cache = true)
public abstract Object getAssociation();
-
public abstract void setAssociation(Object association);
- @Parameter(required = true, cache = true)
- public abstract Object getValue();
-
- public abstract void setValue(Object value);
-
- @Parameter(required = true, cache = true)
- public abstract Object getModel();
-
- public abstract void setModel(Object bytes);
-
- @InjectState("callbackStack")
- public abstract CallbackStack getCallbackStack();
-
- public abstract void setCallbackStack(CallbackStack stack);
-
- @InjectObject("service:trails.core.PageResolver")
- public abstract PageResolver getPageResolver();
-
- @InjectObject("service:trails.core.PersistenceService")
- public abstract PersistenceService getPersistenceService();
-
- @InjectObject("service:trails.core.EditorService")
- public abstract BlockFinder getBlockFinder();
-
- @InjectObject("service:trails.core.DescriptorService")
- public abstract DescriptorService getDescriptorService();
+ /**
+ * The object which owns the instance being edited
+ */
+ @Parameter(required = false, defaultValue = "page.model")
+ public abstract Object getOwner();
+ public abstract void setOwner (Object owner);
+
+ /**
+ * Ognl expression to invoke on the model to create a new child instance
+ */
+ @Parameter(required = false)
+ public abstract String getCreateExpression();
public IClassDescriptor getClassDescriptor()
{
@@ -67,6 +66,14 @@
return getDescriptorService().getClassDescriptor(getDescriptor().getPropertyType());
}
+ /**
+ * org.apache.tapestry.contrib.link.ButtonLinkRenderer
+ *
+ * @return
+ */
+ @InjectObject(value = "service:trails.core.AddNewLinkRenderer")
+ public abstract ILinkRenderer getRenderer();
+
public AssociationMgt()
{
super();
@@ -92,31 +99,31 @@
return getDescriptor().getPropertyType().getClass();
}
- AssociationCallback buildCallback()
+ /**
+ * (non-Javadoc)
+ *
+ * @see org.apache.tapestry.AbstractComponent#prepareForRender(org.apache.tapestry.IRequestCycle)
+ */
+ protected void prepareForRender(IRequestCycle cycle)
{
- AssociationCallback callback = new AssociationCallback(getPage().getRequestCycle().getPage().getPageName(),
- getModel(), getDescriptor());
- return callback;
+ super.prepareForRender(cycle);
+ //if ( getAssociation()== null )
+ // addNew (cycle);
}
-
+
public void addNew(IRequestCycle cycle)
{
- getCallbackStack().push(buildCallback());
-
- String currentEditPageName = getPage().getRequestCycle().getPage().getPageName();
- EditPage ownerEditPage = (EditPage) getPageResolver().resolvePage(cycle, getDescriptor().getClass(),
- PageType.Edit);
-
- try
+ try {
+ Object newModel = buildNewMemberInstance();
+ setAssociation(newModel);
+
+ executeOgnlExpression(getDescriptor().findAddExpression(), newModel);
+ } catch (InstantiationException e)
{
- Object newModel = buildNewMemberInstance();
- EditCallback nextPage = new EditCallback(ownerEditPage.getPageName(), newModel);
-
- ((EditPage) cycle.getPage(currentEditPageName)).setNextPage(nextPage);
- nextPage.performCallback(cycle);
- } catch (Exception ex)
+ throw new TrailsRuntimeException(e, getOwner().getClass());
+ } catch (IllegalAccessException e)
{
- throw new TrailsRuntimeException(ex, getDescriptor().getClass().getClass());
+ throw new TrailsRuntimeException(e, getOwner().getClass());
}
}
@@ -122,9 +129,11 @@
public void remove(IRequestCycle cycle)
{
- *//**
+ this.executeOgnlExpression(getDescriptor().getRemoveExpression(), getAssociation());
+ /**
* This is a direct hit on the same page. No need to setup callbackstack.
- *//*
+ */
+ /*
EditPage editPage = (EditPage) getPageResolver().resolvePage(cycle, getDescriptor().getClass(), PageType.Edit);
AssociationCallback callback = buildCallback();
@@ -137,20 +146,21 @@
String currentEditPageName = getPage().getRequestCycle().getPage().getPageName();
((EditPage) cycle.getPage(currentEditPageName)).setNextPage(nextPage);
nextPage.performCallback(cycle);
- }
-
- public IPage edit(Object member)
+ */
+ }
+
+ private void executeOgnlExpression(String ognlExpression, Object newObject)
{
- AssociationCallback callback = new AssociationCallback(getPage().getRequestCycle().getPage().getPageName(),
- getModel(), getDescriptor());
- getCallbackStack().push(callback);
- EditPage editPage = (EditPage) getPageResolver().resolvePage(getPage().getRequestCycle(),
- Utils.checkForCGLIB(member.getClass()), PageType.Edit);
-
- editPage.setModel(member);
- return editPage;
- }
-
+ try
+ {
+ Ognl.setValue(ognlExpression, getOwner(), newObject);
+ Ognl.getValue(ognlExpression, getOwner());
+ } catch (OgnlException e)
+ {
+ throw new TrailsRuntimeException(e, getOwner().getClass());
+ }
+ }
+
protected Object buildNewMemberInstance() throws InstantiationException, IllegalAccessException
{
Object associationModel;
@@ -182,11 +192,34 @@
}
return associationModel;
+ }
+
+ /*
+ AssociationCallback buildCallback()
+ {
+ AssociationCallback callback = new AssociationCallback(getPage().getRequestCycle().getPage().getPageName(),
+ getModel(), getDescriptor());
+ return callback;
}
+ public IPage edit(Object member)
+ {
+ AssociationCallback callback = new AssociationCallback(getPage().getRequestCycle().getPage().getPageName(),
+ getModel(), getDescriptor());
+ getCallbackStack().push(callback);
+ EditPage editPage = (EditPage) getPageResolver().resolvePage(getPage().getRequestCycle(),
+ Utils.checkForCGLIB(member.getClass()), PageType.Edit);
+
+ editPage.setModel(member);
+ return editPage;
+ }
+
+
+
+ */
+
public OwningObjectReferenceDescriptor getOwningObjectReferenceDescriptor()
{
return getDescriptor().getExtension(OwningObjectReferenceDescriptor.class);
- }
- */
+ }
}
Index: C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/component/blob/BlobDownloadService.java
===================================================================
--- C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/component/blob/BlobDownloadService.java (revision 921)
+++ C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/component/blob/BlobDownloadService.java (working copy)
@@ -1,5 +1,10 @@
package org.trails.component.blob;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.HashMap;
+import java.util.Map;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hivemind.util.Defense;
@@ -16,11 +21,6 @@
import org.trails.persistence.PersistenceService;
import org.trails.util.Utils;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.HashMap;
-import java.util.Map;
-
public class BlobDownloadService implements IEngineService
{
@@ -44,6 +44,12 @@
private static final String BYTES_PROPERTY = "property";
+ private static final String CONTENT_TYPE = "contentType";
+
+ private static final String FILE_NAME = "fileName";
+
+ private static final String FILE_PATH = "filePath";
+
public ILink getLink(boolean post, Object parameter)
{
@@ -57,6 +63,21 @@
parameters.put(ENTITY_NAME, asset.getEntityName());
parameters.put(BYTES_PROPERTY, asset.getBytesProperty());
+ if (asset.getContentType() != null)
+ {
+ parameters.put(CONTENT_TYPE, asset.getContentType());
+ }
+
+ if (asset.getFileName() != null)
+ {
+ parameters.put(FILE_NAME, asset.getFileName());
+ }
+
+ if (asset.getFilePath() != null)
+ {
+ parameters.put(FILE_PATH, asset.getFilePath());
+ }
+
return _linkFactory.constructLink(this, false, parameters, true);
}
@@ -63,50 +84,60 @@
public void service(IRequestCycle cycle) throws IOException
{
- String blobID = cycle.getParameter(BLOBID);
- String entityName = cycle.getParameter(ENTITY_NAME);
- String bytesProp = cycle.getParameter(BYTES_PROPERTY);
+ synchronized (cycle)
+ {
+ String blobID = cycle.getParameter(BLOBID);
+ String entityName = cycle.getParameter(ENTITY_NAME);
+ String bytesProp = cycle.getParameter(BYTES_PROPERTY);
- IClassDescriptor classDescriptor = descriptorService.getClassDescriptor(Utils.classForName(entityName));
- IPropertyDescriptor propertyDescriptor = classDescriptor.getPropertyDescriptor(bytesProp);
- BlobDescriptorExtension blobDescriptor = propertyDescriptor.getExtension(BlobDescriptorExtension.class);
+ String contentType = cycle.getParameter(CONTENT_TYPE);
+ String fileName = cycle.getParameter(FILE_NAME);
+ String filePath = cycle.getParameter(FILE_PATH);
- if (blobDescriptor != null && blobID != null && !"".equals(blobID))
- {
- Object model = persistenceService.getInstance(classDescriptor.getType(), Integer.valueOf(blobID));
+ IClassDescriptor classDescriptor = descriptorService.getClassDescriptor(Utils.classForName(entityName));
+ IPropertyDescriptor propertyDescriptor = classDescriptor.getPropertyDescriptor(bytesProp);
+ BlobDescriptorExtension blobDescriptor = propertyDescriptor.getExtension(BlobDescriptorExtension.class);
- if (model != null)
+ if (blobDescriptor != null && blobID != null && !"".equals(blobID))
{
- String fileName = filePersister.getFileName(classDescriptor, propertyDescriptor, model);
- String contentType = filePersister.getContentType(classDescriptor, propertyDescriptor, model);
- byte[] bytes = filePersister.getData(classDescriptor, propertyDescriptor, model);
+ Object model = persistenceService.getInstance(classDescriptor.getType(), Integer.valueOf(blobID));
- if (bytes.length > 0)
+ if (model != null)
{
- _response.setHeader("Expires", "0");
- _response.setHeader("Cache-Control", "must-revalidate, post-check=0,pre-check=0");
- _response.setHeader("Pragma", "public");
- _response.setHeader("Content-Disposition",
- blobDescriptor.getContentDisposition().getValue() + (fileName != null ? "; filename=" + fileName : ""));
- _response.setContentLength(bytes.length);
+ contentType = filePersister.getContentType(classDescriptor, propertyDescriptor, model);
+ fileName = filePersister.getFileName(classDescriptor, propertyDescriptor, model);
+ filePath = filePersister.getFilePath(classDescriptor, propertyDescriptor, model);
+ byte[] bytes = filePersister.getData(classDescriptor, propertyDescriptor, model);
+
+ if (bytes.length > 0)
+ {
+ _response.setHeader("Expires", "0");
+ _response.setHeader("Cache-Control", "must-revalidate, post-check=0,pre-check=0");
+ _response.setHeader("Pragma", "public");
+ _response.setHeader("Content-Disposition", blobDescriptor.getContentDisposition().getValue()
+ + (fileName != null ? "; filename=" + fileName : ""));
+ _response.setContentLength(bytes.length);
- OutputStream output = _response.getOutputStream(contentType != null ? new ContentType(contentType) : new ContentType());
- output.write(bytes);
- } else
- {
- String errorText = "BlobDownloadServcie: entityName->" + entityName + ", blobID ->" +
- blobID + " : has not been ingested yet";
- LOG.info(errorText);
-// muted kwc - throw new TrailsRuntimeException(errorText);
+ OutputStream output = _response.getOutputStream(contentType != null ? new ContentType(
+ contentType) : new ContentType());
+ output.write(bytes);
+ } else
+ {
+ String errorText = "BlobDownloadServcie: entityName->" + entityName + ", blobID ->" + blobID
+ + " : has not been ingested yet";
+ LOG.info(errorText);
+ // muted kwc - throw new
+ // TrailsRuntimeException(errorText);
+ }
}
- }
- } else
- {
- String errorText = "BlobDownloadServcie: entityName->" + entityName + ", blobID ->" + blobID +
- " : has not been ingested yet";
- LOG.info(errorText);
- // muted kwc - throw new TrailsRuntimeException(errorText);
+ } else
+ {
+ String errorText = "BlobDownloadServcie: entityName->" + entityName + ", blobID ->" + blobID
+ + " : has not been ingested yet";
+ LOG.info(errorText);
+ // muted kwc - throw new TrailsRuntimeException(errorText);
+ }
}
}
Index: C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/component/blob/DefaultFilePersister.java
===================================================================
--- C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/component/blob/DefaultFilePersister.java (revision 921)
+++ C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/component/blob/DefaultFilePersister.java (working copy)
@@ -1,5 +1,12 @@
package org.trails.component.blob;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+import ognl.Ognl;
+import ognl.OgnlException;
+
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.hivemind.util.PropertyUtils;
@@ -11,13 +18,9 @@
import org.trails.descriptor.extension.ITrailsBlob;
import org.trails.persistence.PersistenceService;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-
-
/**
- * The Trails {@link org.trails.component.blob.IFilePersister} default implementation.
+ * The Trails {@link org.trails.component.blob.IFilePersister} default
+ * implementation.
*/
public class DefaultFilePersister implements IFilePersister
{
@@ -23,10 +26,11 @@
{
PersistenceService persistenceService;
+
BlobDownloadService blobDownloadService;
public void store(IClassDescriptor classDescriptor, IPropertyDescriptor propertyDescriptor, Object model,
- IUploadFile file)
+ IUploadFile file)
{
BlobDescriptorExtension blobDescriptorExtension = getBlobDescriptorExtension(propertyDescriptor);
@@ -50,11 +54,11 @@
} else if (blobDescriptorExtension.isITrailsBlob())
{
ITrailsBlob trailsBlob = (ITrailsBlob) PropertyUtils.read(model, propertyDescriptor.getName());
+ trailsBlob.setContentType(file.getContentType());
trailsBlob.setFileName(file.getFileName());
trailsBlob.setFilePath(file.getFilePath());
- trailsBlob.setContentType(file.getContentType());
trailsBlob.setBytes(data);
- //@todo check for NPE
+ // @todo check for NPE
}
}
}
@@ -99,8 +103,30 @@
{
String id = pk.toString();
- return new TrailsBlobAsset(blobDownloadService, classDescriptor.getType().getName(), id,
- propertyDescriptor.getName());
+ BlobDescriptorExtension blobDescriptorExtension = getBlobDescriptorExtension(propertyDescriptor);
+ ITrailsBlob trailsBlob = null;
+
+ if (blobDescriptorExtension.isBytes())
+ trailsBlob = (ITrailsBlob) model;
+ else if (blobDescriptorExtension.isITrailsBlob())
+ {
+ trailsBlob = (ITrailsBlob) PropertyUtils.read(model, propertyDescriptor.getName());
+
+ try
+ {
+ if (Ognl.getValue(propertyDescriptor.getName(), model) != null)
+ {
+ trailsBlob = (ITrailsBlob) Ognl.getValue(propertyDescriptor.getName(), model);
+ }
+ } catch (OgnlException e)
+ {
+ e.printStackTrace();
+ }
+ }
+ if (trailsBlob != null)
+ return new TrailsBlobAsset(blobDownloadService, classDescriptor.getType().getName(), id,
+ propertyDescriptor.getName(), trailsBlob.getContentType(), trailsBlob.getFileName(), trailsBlob
+ .getFilePath());
}
return null;
}
@@ -114,7 +140,6 @@
return blobDescriptorExtension.getContentType();
}
-
if (blobDescriptorExtension.isITrailsBlob())
{
ITrailsBlob trailsBlob = (ITrailsBlob) PropertyUtils.read(model, propertyDescriptor.getName());
@@ -148,6 +173,27 @@
return null;
}
+ public String getFilePath(IClassDescriptor classDescriptor, IPropertyDescriptor propertyDescriptor, Object model)
+ {
+ BlobDescriptorExtension blobDescriptorExtension = getBlobDescriptorExtension(propertyDescriptor);
+
+ if (StringUtils.isNotEmpty(blobDescriptorExtension.getFilePath()))
+ {
+ return blobDescriptorExtension.getFilePath();
+ }
+
+ if (blobDescriptorExtension.isITrailsBlob())
+ {
+ ITrailsBlob trailsBlob = (ITrailsBlob) PropertyUtils.read(model, propertyDescriptor.getName());
+ if (trailsBlob != null)
+ {
+ return trailsBlob.getFilePath();
+ }
+ }
+
+ return null;
+ }
+
private BlobDescriptorExtension getBlobDescriptorExtension(IPropertyDescriptor propertyDescriptor)
{
return propertyDescriptor.getExtension(BlobDescriptorExtension.class);
Index: C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/component/blob/IFilePersister.java
===================================================================
--- C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/component/blob/IFilePersister.java (revision 921)
+++ C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/component/blob/IFilePersister.java (working copy)
@@ -21,5 +21,7 @@
String getFileName(IClassDescriptor classDescriptor, IPropertyDescriptor propertyDescriptor, Object model);
+ String getFilePath(IClassDescriptor classDescriptor, IPropertyDescriptor propertyDescriptor, Object model);
+
void delete(IClassDescriptor classDescriptor, IPropertyDescriptor propertyDescriptor, Object model);
}
Index: C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/component/blob/image/MimedImage.java
===================================================================
--- C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/component/blob/image/MimedImage.java (revision 0)
+++ C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/component/blob/image/MimedImage.java (revision 0)
@@ -0,0 +1,167 @@
+package org.trails.component.blob.image;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import ognl.Ognl;
+import ognl.OgnlException;
+
+import org.apache.hivemind.util.PropertyUtils;
+import org.apache.tapestry.IAsset;
+import org.apache.tapestry.IMarkupWriter;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.Tapestry;
+import org.apache.tapestry.annotations.ComponentClass;
+import org.apache.tapestry.annotations.InjectObject;
+import org.apache.tapestry.annotations.Parameter;
+import org.apache.tapestry.asset.AssetFactory;
+import org.apache.tapestry.html.Image;
+import org.trails.descriptor.IPropertyDescriptor;
+import org.trails.descriptor.extension.BlobDescriptorExtension;
+import org.trails.descriptor.extension.ITrailsBlob;
+import org.trails.persistence.PersistenceService;
+
+/**
+ * This widget overloads the src attribute of
+ *
+ * @Image It substitutes icons when tapestry fails to negotiate a proper
+ * src for uploadable media. This is exclusively intended for
+ * org.trails.descriptor.extension.ITrailsBlob
+ *
+ * And yes it makes sense to reimplement all this to a dedicated
+ * hivemind service for the mere sake of threading all renderable
+ * icons or images.
+ *
+ * @author kenneth.colassi nhhockeyplayer@hotmail.com
+ */
+
+@ComponentClass(allowBody = false, allowInformalParameters = true)
+public abstract class MimedImage extends Image
+{
+ private Map map = new HashMap();
+
+ @InjectObject("service:tapestry.asset.ClasspathAssetFactory")
+ public abstract AssetFactory getClasspathAssetFactory();
+
+ @InjectObject("service:trails.core.PersistenceService")
+ public abstract PersistenceService getPersistenceService();
+
+ @Parameter(required = true)
+ public abstract IPropertyDescriptor getPropertyDescriptor();
+
+ public abstract void setPropertyDescriptor(IPropertyDescriptor propertyDescriptor);
+
+ @Parameter(required = true)
+ public abstract Object getBytes();
+
+ public abstract void setBytes(Object bytes);
+
+ @Parameter(required = true)
+ public abstract Object getModel();
+
+ public abstract void setModel(Object bytes);
+
+ @Parameter(required = true)
+ public abstract IAsset getImage();
+
+ public abstract void setImage(IAsset image);
+
+ public BlobDescriptorExtension getBlobDescriptorExtension()
+ {
+ return getPropertyDescriptor().getExtension(BlobDescriptorExtension.class);
+ }
+
+ public MimedImage()
+ {
+ /**
+ * Map keyes MUST adhere to standard mime
+ */
+ map.put("application/x-zip-compressed", "/org/trails/component/blob/image/asset/winzip.gif");
+ map.put("application/pdf", "/org/trails/component/blob/image/asset/icadobe.gif");
+ map.put("application/msword", "/org/trails/component/blob/image/asset/icdoc.gif");
+ map.put("application/vnd.visio", "/org/trails/component/blob/image/asset/icdoc.gif");
+ map.put("application/vnd.ms-powerpoint", "/org/trails/component/blob/image/asset/icppt.gif");
+ map.put("application/vnd.ms-excel", "/org/trails/component/blob/image/asset/icxls.gif");
+ map.put("application/octet-stream", "/org/trails/component/blob/image/asset/icgen.gif");
+
+ map.put("text/html", "/org/trails/component/blob/image/asset/ichtm.gif");
+ map.put("text/plain", "/org/trails/component/blob/image/asset/ictxt.gif");
+ map.put("text/css", "/org/trails/component/blob/image/asset/ictxt.gif");
+ map.put("text/xml", "/org/trails/component/blob/image/asset/icxml.gif");
+
+ map.put("image/tiff", "/org/trails/component/blob/image/asset/icgen.gif");
+
+ map.put("video/avi", "/org/trails/component/blob/image/asset/icwmp.gif");
+ map.put("video/mpeg", "/org/trails/component/blob/image/asset/icwmp.gif");
+ map.put("video/mp4", "/org/trails/component/blob/image/asset/icwmp.gif");
+ map.put("video/quicktime", "/org/trails/component/blob/image/asset/icwmp.gif");
+ map.put("video/x-ms-wmv", "/org/trails/component/blob/image/asset/icwmp.gif");
+
+ }
+
+ @Override
+ protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
+ {
+ if (cycle.isRewinding())
+ return;
+
+ IAsset imageAsset = getImage();
+
+ if (imageAsset == null)
+ throw Tapestry.createRequiredParameterException(this, "image");
+
+ writer.beginEmpty("img");
+
+ ITrailsBlob trailsBlob = null;
+ String contentType = null;
+
+ if (getBlobDescriptorExtension().isBytes())
+ trailsBlob = (ITrailsBlob) getModel();
+ else if (getBlobDescriptorExtension().isITrailsBlob())
+ {
+ trailsBlob = (ITrailsBlob) PropertyUtils.read(getModel(), getPropertyDescriptor().getName());
+
+ try
+ {
+ if (Ognl.getValue(getPropertyDescriptor().getName(), getModel()) != null)
+ {
+ trailsBlob = (ITrailsBlob) Ognl.getValue(getPropertyDescriptor().getName(), getModel());
+ }
+ } catch (OgnlException e)
+ {
+ e.printStackTrace();
+ }
+ }
+ contentType = trailsBlob.getContentType();
+
+ if (contentType == null)
+ {
+ writer.attribute("src", imageAsset.buildURL());
+ } else if (contentType.equalsIgnoreCase("image/jpeg") || contentType.equalsIgnoreCase("image/pjpeg")
+ || contentType.equalsIgnoreCase("image/tiff") || contentType.equalsIgnoreCase("image/bmp")
+ || contentType.equalsIgnoreCase("video/mpeg") || contentType.equalsIgnoreCase("video/quicktime")
+ || contentType.equalsIgnoreCase("video/x-msvideo") || contentType.equalsIgnoreCase("image/gif"))
+ {
+ writer.attribute("src", imageAsset.buildURL());
+ } else
+ {
+ AssetFactory fact = getClasspathAssetFactory();
+
+ IAsset asset;
+
+ if (map.containsKey(contentType))
+ {
+ asset = fact.createAbsoluteAsset(map.get(contentType).toString(), null, null);
+ writer.attribute("src", asset.buildURL());
+ } else
+ {
+ asset = fact.createAbsoluteAsset(map.get("application/octet-stream").toString(), null, null);
+ writer.attribute("src", asset.buildURL());
+ }
+ }
+
+ renderInformalParameters(writer, cycle);
+
+ writer.closeTag();
+ }
+}
Index: C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/component/blob/TrailsBlobAsset.java
===================================================================
--- C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/component/blob/TrailsBlobAsset.java (revision 921)
+++ C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/component/blob/TrailsBlobAsset.java (working copy)
@@ -1,12 +1,13 @@
package org.trails.component.blob;
+import java.io.InputStream;
+
import org.apache.tapestry.asset.AbstractAsset;
import org.apache.tapestry.engine.ILink;
-import java.io.InputStream;
-
/**
- * An implementation of {@link org.apache.tapestry.IAsset} for assets that are entity properties.
+ * An implementation of {@link org.apache.tapestry.IAsset} for assets that are
+ * entity properties.
*/
public class TrailsBlobAsset extends AbstractAsset
{
@@ -19,6 +20,12 @@
private String bytesProperty;
+ private String fileName;
+
+ private String filePath;
+
+ private String contentType;
+
public TrailsBlobAsset(BlobDownloadService chartService, String entityName, String id, String bytesProperty)
{
super(null, null);
@@ -28,6 +35,19 @@
this.bytesProperty = bytesProperty;
}
+ public TrailsBlobAsset(BlobDownloadService chartService, String entityName, String id, String bytesProperty,
+ String contentType, String fileName, String filePath)
+ {
+ super(null, null);
+ this.bytesService = chartService;
+ this.entityName = entityName;
+ this.id = id;
+ this.bytesProperty = bytesProperty;
+ this.contentType = contentType;
+ this.fileName = fileName;
+ this.filePath = filePath;
+ }
+
public String getBytesProperty()
{
return bytesProperty;
@@ -43,9 +63,25 @@
return id;
}
+ public String getContentType()
+ {
+ return contentType;
+ }
+
+ public String getFileName()
+ {
+ return fileName;
+ }
+
+ public String getFilePath()
+ {
+ return filePath;
+ }
+
public String buildURL()
{
- ILink l = bytesService.getLink(false, new Object[]{this});
+ ILink l = bytesService.getLink(false, new Object[]
+ { this });
return l.getURL();
}
Index: C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/component/blob/TrailsDownload.java
===================================================================
--- C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/component/blob/TrailsDownload.java (revision 921)
+++ C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/component/blob/TrailsDownload.java (working copy)
@@ -59,6 +59,12 @@
return getFilePersister().getFileName(getClassDescriptor(), getPropertyDescriptor(), getModel());
}
+
+ public String getFilePath()
+ {
+ return getFilePersister().getFilePath(getClassDescriptor(), getPropertyDescriptor(), getModel());
+ }
+
public IAsset getNoIcon()
{
return getContextAssetFactory().createAbsoluteAsset(noIcon, null, null);
Index: C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/descriptor/CollectionDescriptor.java
===================================================================
--- C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/descriptor/CollectionDescriptor.java (revision 921)
+++ C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/descriptor/CollectionDescriptor.java (working copy)
@@ -22,6 +22,7 @@
public class CollectionDescriptor extends TrailsPropertyDescriptor
+ implements IReferenceSupport
{
protected static final Log LOG = LogFactory.getLog(CollectionDescriptor.class);
@@ -182,7 +183,7 @@
return new CollectionDescriptor(getBeanType(), this);
}
- private String findAddExpression()
+ public String findAddExpression()
{
final String method = "add";
@@ -204,7 +205,7 @@
}
- private String findRemoveExpression()
+ public String findRemoveExpression()
{
return findExpression("remove");
}
Index: C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/descriptor/extension/BlobDescriptorExtension.java
===================================================================
--- C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/descriptor/extension/BlobDescriptorExtension.java (revision 921)
+++ C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/descriptor/extension/BlobDescriptorExtension.java (working copy)
@@ -51,9 +51,11 @@
private BlobType blobType = BlobType.BYTES;
+ private String contentType = "";
+
private String fileName = "";
- private String contentType = "";
+ private String filePath = "";
private ContentDisposition contentDisposition = ContentDisposition.INLINE;
@@ -91,6 +93,16 @@
return fileName;
}
+ public String getContentType()
+ {
+ return contentType;
+ }
+
+ public void setContentType(String contentType)
+ {
+ this.contentType = contentType;
+ }
+
public void setFileName(String fileName)
{
this.fileName = fileName;
@@ -96,14 +108,14 @@
this.fileName = fileName;
}
- public String getContentType()
+ public String getFilePath()
{
- return contentType;
+ return filePath;
}
- public void setContentType(String contentType)
+ public void setFilePath(String filePath)
{
- this.contentType = contentType;
+ this.filePath = filePath;
}
public RenderType getRenderType()
Index: C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/descriptor/extension/OwningObjectReferenceDescriptor.java
===================================================================
--- C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/descriptor/extension/OwningObjectReferenceDescriptor.java (revision 921)
+++ C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/descriptor/extension/OwningObjectReferenceDescriptor.java (working copy)
@@ -3,6 +3,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.trails.descriptor.IDescriptorExtension;
+import org.trails.descriptor.IReferenceSupport;
/**
@@ -32,7 +33,7 @@
* @see org.trails.component.AssociationSelect
* @see org.trails.component.AssociationMgt
*/
-public class OwningObjectReferenceDescriptor implements IDescriptorExtension
+public class OwningObjectReferenceDescriptor implements IDescriptorExtension, IReferenceSupport
{
protected static final Log LOG = LogFactory.getLog(OwningObjectReferenceDescriptor.class);
@@ -38,6 +39,8 @@
protected static final Log LOG = LogFactory.getLog(OwningObjectReferenceDescriptor.class);
private String inverseProperty = null;
+ private String addExpression = null;
+ private String removeExpression = null;
public String getInverseProperty()
{
@@ -49,4 +52,50 @@
this.inverseProperty = inverseProperty;
}
+ public String getAddExpression()
+ {
+ if (addExpression == null)
+ {
+ // addExpression returns the name of the property descriptor
+ // which equates to the lower case singular name of the actual property
+ // as it lives within the class as a class member
+ // (ie. Person == beanType)
+ // (ie. UploadableMedia == propertyType)
+ // (ie. findAddExpression == photo)
+ addExpression = findAddExpression();
+ }
+ return addExpression;
+ }
+
+ public void setAddExpression(String addExpression)
+ {
+ this.addExpression = addExpression;
+ }
+
+ public String getRemoveExpression()
+ {
+ if (removeExpression == null)
+ {
+ removeExpression = findRemoveExpression();
+ }
+ return removeExpression;
+ }
+
+ public void setRemoveExpression(String removeExpression)
+ {
+ this.removeExpression = removeExpression;
+ }
+
+ public String findAddExpression()
+ {
+ String expression = "NOP";
+
+ return expression;
+ }
+ public String findRemoveExpression()
+ {
+ String expression = "NOP";
+
+ return expression;
+ }
}
Index: C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/descriptor/IReferenceSupport.java
===================================================================
--- C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/descriptor/IReferenceSupport.java (revision 0)
+++ C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/descriptor/IReferenceSupport.java (revision 0)
@@ -0,0 +1,42 @@
+package org.trails.descriptor;
+
+public interface IReferenceSupport extends Cloneable {
+
+ /**
+ * InverseProperty was implemented so TrailsPagesService could articulate
+ * and retrieve the inverse
+ *
+ * The automated way this guy gets set:
+ * 1. HibernateDescriptorDecorator on bootstrap
+ * 2. decoration annotation handlers on bootstrap
+ */
+ public String getInverseProperty();
+
+ public void setInverseProperty(String inverseProperty);
+
+ /**
+ * Expression support was added so EditPage could articulate
+ */
+ public String getAddExpression();
+
+ public void setAddExpression(String addExpression);
+
+ public String getRemoveExpression();
+
+ public void setRemoveExpression(String removeExpression);
+
+ public String findAddExpression();
+
+ public String findRemoveExpression();
+
+ /*
+ public String getSwapExpression();
+
+ public void setSwapExpression(String swapExpression);
+
+
+ public String findExpression(String method, String defaultValue);
+
+ public String findExpression(String method);
+ */
+}
\ No newline at end of file
Index: C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/descriptor/ObjectReferenceDescriptor.java
===================================================================
--- C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/descriptor/ObjectReferenceDescriptor.java (revision 921)
+++ C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/descriptor/ObjectReferenceDescriptor.java (working copy)
@@ -18,8 +18,23 @@
* @see HibernateDescriptorDecorator
*/
public class ObjectReferenceDescriptor extends TrailsPropertyDescriptor
+ implements IReferenceSupport
{
- private Class actualType;
+ private Class propertyType;
+
+ private String inverseProperty = null;
+ private String addExpression = null;
+ private String removeExpression = null;
+
+ public String getInverseProperty()
+ {
+ return inverseProperty;
+ }
+
+ public void setInverseProperty(String inverseProperty)
+ {
+ this.inverseProperty = inverseProperty;
+ }
public ObjectReferenceDescriptor(Class beanType, IPropertyDescriptor descriptor,
Class actualType)
@@ -35,7 +50,7 @@
Class beanType, Class declaredType, Class actualType)
{
super(beanType, declaredType);
- this.actualType = actualType;
+ this.propertyType = actualType;
}
/* (non-Javadoc)
@@ -43,7 +58,7 @@
*/
public Class getPropertyType()
{
- return actualType;
+ return propertyType;
}
/* (non-Javadoc)
@@ -56,6 +71,59 @@
public Object clone()
{
+ // beanType is the parent Class type
+ // propertyType is the property Class type
return new ObjectReferenceDescriptor(getBeanType(), this, getPropertyType());
}
+
+ public String getAddExpression()
+ {
+ if (addExpression == null)
+ {
+ // addExpression returns the name of the property descriptor
+ // which equates to the lower case singular name of the actual property
+ // as it lives within the class as a class member
+ // (ie. Person == beanType)
+ // (ie. UploadableMedia == propertyType)
+ // (ie. findAddExpression == photo)
+ addExpression = findAddExpression();
+ }
+ return addExpression;
+ }
+
+ public void setAddExpression(String addExpression)
+ {
+ this.addExpression = addExpression;
+ }
+
+ public String getRemoveExpression()
+ {
+ if (removeExpression == null)
+ {
+ removeExpression = findRemoveExpression();
+ }
+ return removeExpression;
+ }
+
+ public void setRemoveExpression(String removeExpression)
+ {
+ this.removeExpression = removeExpression;
+ }
+
+ public String findAddExpression()
+ {
+ String expression = "";
+
+ expression = this.getName();
+
+ return expression;
+ }
+ public String findRemoveExpression()
+ {
+ String expression = "";
+
+ expression = this.getName();
+
+ return expression;
+ }
}
\ No newline at end of file
Index: C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/engine/TrailsPagesService.java
===================================================================
--- C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/engine/TrailsPagesService.java (revision 921)
+++ C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/engine/TrailsPagesService.java (working copy)
@@ -1,7 +1,9 @@
package org.trails.engine;
-import ognl.Ognl;
-import ognl.OgnlException;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
import org.apache.commons.lang.StringUtils;
import org.apache.hivemind.ApplicationRuntimeException;
import org.apache.hivemind.util.Defense;
@@ -17,15 +19,18 @@
import org.apache.tapestry.services.ResponseRenderer;
import org.trails.Trails;
import org.trails.builder.BuilderDirector;
-import org.trails.exception.TrailsRuntimeException;
import org.trails.descriptor.CollectionDescriptor;
import org.trails.descriptor.IClassDescriptor;
-import org.trails.page.*;
+import org.trails.descriptor.IReferenceSupport;
+import org.trails.descriptor.TrailsPropertyDescriptor;
+import org.trails.exception.TrailsRuntimeException;
+import org.trails.page.EditPage;
+import org.trails.page.IActivatableTrailsPage;
+import org.trails.page.ModelPage;
+import org.trails.page.PageResolver;
+import org.trails.page.PageType;
import org.trails.services.ServiceConstants;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
+import org.trails.util.Utils;
public class TrailsPagesService implements IEngineService
{
@@ -97,8 +102,8 @@
IClassDescriptor classDescriptor =
(IClassDescriptor) dataSqueezer.unsqueeze(cycle.getParameter(ServiceConstants.CLASS_DESCRIPTOR));
Object model = unsqueezeIfNotNull(cycle, ServiceConstants.MODEL);
- CollectionDescriptor collectionDescriptor =
- (CollectionDescriptor) unsqueezeIfNotNull(cycle, ServiceConstants.ASSOC_DESCRIPTOR);
+ TrailsPropertyDescriptor collectionDescriptor =
+ (TrailsPropertyDescriptor) unsqueezeIfNotNull(cycle, ServiceConstants.ASSOC_DESCRIPTOR);
Object parent = unsqueezeIfNotNull(cycle, ServiceConstants.PAERNT_MODEL);
activateTrailsPage(cycle, pageType, classDescriptor, model, parent, collectionDescriptor);
@@ -106,7 +111,7 @@
responseRenderer.renderResponse(cycle);
}
- private void activateTrailsPage(IRequestCycle cycle, PageType pageType, IClassDescriptor classDescriptor, Object model, Object parent, CollectionDescriptor collectionDescriptor)
+ private void activateTrailsPage(IRequestCycle cycle, PageType pageType, IClassDescriptor classDescriptor, Object model, Object parent, TrailsPropertyDescriptor objectReferenceDescriptor)
{
IPage rawPage = null;
@@ -154,10 +159,15 @@
if (PageType.NEW.equals(pageType))
{
((ModelPage) page).setModelNew(true);
- if ((collectionDescriptor != null) && (parent != null) &&
- (!StringUtils.isEmpty(collectionDescriptor.getInverseProperty())))
+ if ((objectReferenceDescriptor != null) && (parent != null) )
{
- PropertyUtils.write(model, collectionDescriptor.getInverseProperty(), parent);
+ if ( Utils.implementsInterface (objectReferenceDescriptor.getClass(), IReferenceSupport.class) ) {
+ IReferenceSupport referenceDescriptor = (IReferenceSupport) objectReferenceDescriptor;
+ if ( ! StringUtils.isEmpty(referenceDescriptor.getInverseProperty()) )
+ {
+ PropertyUtils.write(model, referenceDescriptor.getInverseProperty(), parent);
+ }
+ }
}
} else
{
@@ -167,7 +177,7 @@
if (page instanceof EditPage)
{
((EditPage) page).setParent(parent);
- ((EditPage) page).setAssociationDescriptor(collectionDescriptor);
+ ((EditPage) page).setAssociationDescriptor(objectReferenceDescriptor);
}
}
Index: C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/engine/TrailsPagesServiceParameter.java
===================================================================
--- C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/engine/TrailsPagesServiceParameter.java (revision 921)
+++ C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/engine/TrailsPagesServiceParameter.java (working copy)
@@ -5,6 +5,7 @@
import org.apache.hivemind.util.Defense;
import org.trails.descriptor.CollectionDescriptor;
import org.trails.descriptor.IClassDescriptor;
+import org.trails.descriptor.TrailsPropertyDescriptor;
import org.trails.page.PageType;
@@ -14,7 +15,7 @@
private PageType pageType;
private IClassDescriptor classDescriptor;
private Object model;
- private CollectionDescriptor associationDescriptor;
+ private TrailsPropertyDescriptor associationDescriptor;
private Object parent;
public TrailsPagesServiceParameter(PageType pageType, IClassDescriptor classDescriptor)
@@ -31,7 +32,7 @@
this.model = model;
}
- public TrailsPagesServiceParameter(PageType pageType, IClassDescriptor classDescriptor, Object model, CollectionDescriptor associationDescriptor, Object parent)
+ public TrailsPagesServiceParameter(PageType pageType, IClassDescriptor classDescriptor, Object model, TrailsPropertyDescriptor associationDescriptor, Object parent)
{
this(pageType, classDescriptor, model);
this.associationDescriptor = associationDescriptor;
@@ -53,7 +54,7 @@
return model;
}
- public CollectionDescriptor getAssociationDescriptor()
+ public TrailsPropertyDescriptor getAssociationDescriptor()
{
return associationDescriptor;
}
Index: C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/link/TrailsLink.java
===================================================================
--- C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/link/TrailsLink.java (revision 921)
+++ C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/link/TrailsLink.java (working copy)
@@ -9,8 +9,8 @@
import org.apache.tapestry.engine.ILink;
import org.apache.tapestry.link.AbstractLinkComponent;
import org.apache.tapestry.link.ILinkRenderer;
-import org.trails.descriptor.CollectionDescriptor;
import org.trails.descriptor.IClassDescriptor;
+import org.trails.descriptor.TrailsPropertyDescriptor;
import org.trails.engine.TrailsPagesServiceParameter;
import org.trails.page.PageType;
@@ -42,7 +42,8 @@
public abstract Object getModel();
@Parameter
- public abstract CollectionDescriptor getAssociationDescriptor();
+ //kwc public abstract CollectionDescriptor getAssociationDescriptor();
+ public abstract TrailsPropertyDescriptor getAssociationDescriptor();
@Parameter
public abstract Object getParent();
Index: C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/page/EditPage.java
===================================================================
--- C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/page/EditPage.java (revision 921)
+++ C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/page/EditPage.java (working copy)
@@ -11,6 +11,11 @@
*/
package org.trails.page;
+import java.util.HashMap;
+
+import ognl.Ognl;
+import ognl.OgnlException;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.tapestry.IRequestCycle;
@@ -19,9 +24,13 @@
import org.apache.tapestry.callback.ICallback;
import org.apache.tapestry.engine.ILink;
import org.trails.callback.UrlCallback;
-import org.trails.util.Utils;
+import org.trails.descriptor.CollectionDescriptor;
+import org.trails.descriptor.IReferenceSupport;
+import org.trails.descriptor.ObjectReferenceDescriptor;
import org.trails.engine.TrailsPagesServiceParameter;
+import org.trails.exception.TrailsRuntimeException;
import org.trails.persistence.PersistenceException;
+import org.trails.util.Utils;
import org.trails.validation.TrailsValidationDelegate;
/**
@@ -26,7 +35,7 @@
/**
* This page will edit an instance contained in the model property
- *
+ *
* @author Chris Nelson
*/
public abstract class EditPage extends ModelPage implements IAssociationPage
@@ -31,7 +40,6 @@
*/
public abstract class EditPage extends ModelPage implements IAssociationPage
{
-
private static final Log LOG = LogFactory.getLog(EditPage.class);
@Bean(lifecycle = Lifecycle.REQUEST)
@@ -47,7 +55,8 @@
{
if (getCallbackStack() != null && !getCallbackStack().isEmpty())
{
- // When saving objects with assigned IDs, we need to removed the last element of the stack.
+ // When saving objects with assigned IDs, we need to removed the
+ // last element of the stack.
getCallbackStack().pop();
}
return linkToThisPage();
@@ -57,7 +66,8 @@
private ILink defaultCallback()
{
- return getTrailsPagesService().getLink(false, new TrailsPagesServiceParameter(PageType.LIST, getClassDescriptor()));
+ return getTrailsPagesService().getLink(false,
+ new TrailsPagesServiceParameter(PageType.LIST, getClassDescriptor()));
}
private ILink linkToThisPage()
@@ -62,8 +72,10 @@
private ILink linkToThisPage()
{
- return getTrailsPagesService()
- .getLink(false, new TrailsPagesServiceParameter(PageType.EDIT, getClassDescriptor(), getModel(), getAssociationDescriptor(), getParent()));
+ return getTrailsPagesService().getLink(
+ false,
+ new TrailsPagesServiceParameter(PageType.EDIT, getClassDescriptor(), getModel(),
+ getAssociationDescriptor(), getParent()));
}
protected ICallback callbackToThisPage()
@@ -119,9 +131,30 @@
{
if (save())
{
- if (cameFromCollection())
+ if (getAssociationDescriptor() != null &&
+ Utils.implementsInterface(getAssociationDescriptor().getClass(), IReferenceSupport.class))
{
- Utils.executeOgnlExpression(getAssociationDescriptor().getAddExpression(), getModel(), getParent());
+ IReferenceSupport referenceDescriptor = (IReferenceSupport) getAssociationDescriptor();
+
+ /**
+ * Ok, it's either an element of a collection or just a reference
+ */
+ if ( referenceDescriptor instanceof CollectionDescriptor )
+ {
+ // add element to collection and reattach parent
+ Utils.executeOgnlExpression(referenceDescriptor.getAddExpression(), getModel(), getParent());
+ getPersistenceService().reattach(getParent());
+ } else if ( referenceDescriptor instanceof ObjectReferenceDescriptor )
+ {
+ try
+ {
+ Ognl.setValue(((ObjectReferenceDescriptor) referenceDescriptor).getName(), getParent(),
+ getModel());
+ } catch (OgnlException e)
+ {
+ throw new TrailsRuntimeException(e, getParent().getClass());
+ }
+ }
getPersistenceService().save(getParent());
}
return goBack(cycle);
@@ -135,8 +168,12 @@
try
{
if (cameFromCollection())
+ // if (
+ // Utils.implementsInterface(getAssociationDescriptor().getClass(),
+ // IReferenceSupport.class))
{
- Utils.executeOgnlExpression(getAssociationDescriptor().getRemoveExpression(), getModel(), getParent());
+ IReferenceSupport referenceDescriptor = (IReferenceSupport) getAssociationDescriptor();
+ Utils.executeOgnlExpression(referenceDescriptor.getRemoveExpression(), getModel(), getParent());
getPersistenceService().save(getParent());
}
@@ -161,15 +198,16 @@
*/
public String getTitle()
{
- Object[] params = new Object[]{getClassDescriptor().getDisplayName()};
+ Object[] params = new Object[]
+ { getClassDescriptor().getDisplayName() };
if (cameFromCollection() && isModelNew())
{
- return getResourceBundleMessageSource()
- .getMessageWithDefaultValue("org.trails.i18n.add", params, "[TRAILS][ORG.TRAILS.I18N.ADD]");
+ return getResourceBundleMessageSource().getMessageWithDefaultValue("org.trails.i18n.add", params,
+ "[TRAILS][ORG.TRAILS.I18N.ADD]");
} else
{
- return getResourceBundleMessageSource()
- .getMessageWithDefaultValue("org.trails.i18n.edit", params, "[TRAILS][ORG.TRAILS.I18N.EDIT]");
+ return getResourceBundleMessageSource().getMessageWithDefaultValue("org.trails.i18n.edit", params,
+ "[TRAILS][ORG.TRAILS.I18N.EDIT]");
}
}
Index: C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/page/IAssociationPage.java
===================================================================
--- C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/page/IAssociationPage.java (revision 921)
+++ C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/page/IAssociationPage.java (working copy)
@@ -1,6 +1,6 @@
package org.trails.page;
-import org.trails.descriptor.CollectionDescriptor;
+import org.trails.descriptor.TrailsPropertyDescriptor;
public interface IAssociationPage extends IModelPage
{
@@ -5,9 +5,9 @@
public interface IAssociationPage extends IModelPage
{
- CollectionDescriptor getAssociationDescriptor();
+ TrailsPropertyDescriptor getAssociationDescriptor();
- void setAssociationDescriptor(CollectionDescriptor associationDescriptor);
+ void setAssociationDescriptor(TrailsPropertyDescriptor associationDescriptor);
Object getParent();
Index: C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/persistence/PersistenceService.java
===================================================================
--- C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/persistence/PersistenceService.java (revision 921)
+++ C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/persistence/PersistenceService.java (working copy)
@@ -28,6 +28,10 @@
public List getInstances(Class type, int startIndex, int maxResults);
+ public void reattachCollection(Object[] models);
+ public void reattach(Object instance);
+ public T merge(T instance);
+
/**
* @return a List containing all the classes this persistence
* service knows about
Index: C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/util/Utils.java
===================================================================
--- C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/util/Utils.java (revision 921)
+++ C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/java/org/trails/util/Utils.java (working copy)
@@ -163,4 +163,18 @@
throw new TrailsRuntimeException(e, model.getClass());
}
}
+
+ public static boolean implementsInterface (Class clazz, Class interfaze) {
+ boolean result = false;
+
+ Class [] interfaces = clazz.getInterfaces();
+ for ( int i = 0; i < interfaces.length; i++) {
+ Class anInterface = interfaces[i];
+ if ( anInterface.getCanonicalName().equalsIgnoreCase(interfaze.getCanonicalName())) {
+ result = true;
+ break;
+ }
+ }
+ return result;
+ }
}
Index: C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/resources/org/trails/component/AssociationMgt.html
===================================================================
--- C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/resources/org/trails/component/AssociationMgt.html (revision 921)
+++ C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/resources/org/trails/component/AssociationMgt.html (working copy)
@@ -3,7 +3,7 @@
-
+
@@ -10,18 +10,43 @@
|
+
|
-
+
+
+
+
+
+
+
+
|
Index: C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/resources/org/trails/component/AssociationMgt.jwc
===================================================================
--- C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/resources/org/trails/component/AssociationMgt.jwc (revision 921)
+++ C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/resources/org/trails/component/AssociationMgt.jwc (working copy)
@@ -1,28 +0,0 @@
-
-
-
-
-
-
-
-
- "int"
-
-
-
- listener:addNew
- true
- page.isModelNew()
-
-
- listener:remove
- false
- page.isModelNew()
-
-
-
- Ognl expression to invoke on the model to create a new association instance
-
-
Index: C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/resources/org/trails/component/blob/image/MimedImage.jwc
===================================================================
--- C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/resources/org/trails/component/blob/image/MimedImage.jwc (revision 0)
+++ C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/resources/org/trails/component/blob/image/MimedImage.jwc (revision 0)
@@ -0,0 +1,9 @@
+
+
+
+
+
Index: C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/resources/org/trails/component/blob/TrailsDownload.html
===================================================================
--- C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/resources/org/trails/component/blob/TrailsDownload.html (revision 921)
+++ C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/resources/org/trails/component/blob/TrailsDownload.html (working copy)
@@ -1,6 +1,17 @@
-
+
+
+
+
+
Index: C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/resources/org/trails/page/Editors.html
===================================================================
--- C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/resources/org/trails/page/Editors.html (revision 921)
+++ C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/resources/org/trails/page/Editors.html (working copy)
@@ -84,4 +84,16 @@
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/resources/org/trails/page/Editors.page
===================================================================
--- C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/resources/org/trails/page/Editors.page (revision 921)
+++ C:/Prototype/Mavenized/Product/trails/trunk/trails/modules/trails-core/src/main/resources/org/trails/page/Editors.page (working copy)
@@ -59,6 +59,17 @@
descriptor
+
+ model
+ descriptor
+
+
+
+ model
+ model[#this.descriptor.name]
+ descriptor
+
+
model[#this.descriptor.name]
descriptor