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 @@ - + + + ognl:byteArrayAsset.fileName + + 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 @@ 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