Here am I again.

I am struggling for 2 days now to load an image from the filesystem into my
webpage.
The image needs to be loaded based on the product id.

The steps I did was:

1. Implemented a FileSystemAssetFactory based on the ClasspathAssetFactory
2. Implemented a FileSystemResource;
See the code below:
In my html the following code is generated:

<img src="
/advertaza/assets/classpath/6675930334be219a/C:/tmp/pictures/8/71/1001/thumb1.jpg
" alt=""/>

As you can see the file system path is exposed into the webpage. I don't
want this.
The second problem is that the image is not loaded/visible in the webpage.

What am I doing wrong? Are there tapestry guru's who can help me out?

Thanks,
Peter

/*
*My quick example code
*/

public String getThumbnailPath() {
         Asset asset = assetSource.getAsset(null,
"file:/8/71/1001/thumb1.jpg", null);
         return asset.toClientURL();
    }
public class FileSystemAssetFactory implements AssetFactory {

    private final ClasspathAssetAliasManager aliasManager;

    private final Map<Resource, String> resourceToDefaultPath =
CollectionFactory.newConcurrentMap();

    private final FileSystemResource rootResource;

    private final AssetPathConverter converter;

    private final boolean invariant;


    public FileSystemAssetFactory(ClasspathAssetAliasManager aliasManager,
AssetPathConverter converter) {
        this.aliasManager = aliasManager;
        this.converter = converter;

        rootResource = new FileSystemResource("C:/tmp/pictures/");
        invariant = converter.isInvariant();
    }


    private String clientURL(Resource resource) {
        String defaultPath = resourceToDefaultPath.get(resource);

        if (defaultPath == null) {
            defaultPath = buildDefaultPath(resource);

            resourceToDefaultPath.put(resource, defaultPath);
        }

        return converter.convertAssetPath(defaultPath);
    }

    private String buildDefaultPath(Resource resource) {
        //boolean requiresDigest = cache.requiresDigest(resource);

        String path = resource.getPath();
        int lastdotx = path.lastIndexOf('.');
        path = path.substring(0, lastdotx + 1)  + path.substring(lastdotx);

          return aliasManager.toClientURL(path);
    }

    public Asset createAsset(final Resource resource) {
        return new AbstractAsset(invariant) {
            public Resource getResource() {
                return resource;
            }

            public String toClientURL() {
                return clientURL(resource);
            }
        };
    }

    public Resource getRootResource() {
        return rootResource;
    }

}

public class FileSystemResource extends AbstractResource {

    private static final int PRIME = 37;

    /**
     * Constructor with the root path
     * @param path the root
     */
    public FileSystemResource(String path) {
        super(path);
    }

    /**
     *
     */
    @Override
    protected Resource newResource(String path) {
        return new FileSystemResource(path);
    }

    @Override
    public URL toURL() {
        String filePath = getPath();
        File file = new File(filePath);

        if (file != null && file.exists()) {
            try {
                return file.toURL();
            }
            catch (MalformedURLException ex) {
                throw new RuntimeException(ex);
            }
        }
        return null;
    }

    @Override
    public String toString() {
        return getPath();
    }

    @Override
    public int hashCode() {
        return PRIME * getPath().hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;

        final FileSystemResource other = (FileSystemResource) obj;

        return getPath().equals(other.getPath());
    }

}

Reply via email to