package org.openedit.entermedia.modules; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.List; import org.openedit.data.Searcher; import org.openedit.entermedia.Asset; import org.openedit.entermedia.MediaArchive; import org.openedit.entermedia.RelatedAsset; import org.openedit.entermedia.RelatedAssetTracker; import com.openedit.OpenEditException; import com.openedit.WebPageRequest; import com.openedit.hittracker.CompositeHitTracker; import com.openedit.hittracker.HitTracker; import com.openedit.users.User; public class RelatedAssetsModule extends BaseMediaModule { public void addRelatedAsset( WebPageRequest inRequest ) throws OpenEditException { MediaArchive mediaArchive = getMediaArchive(inRequest); String[] relatedassetid = inRequest.getRequestParameters( "relatedtoassetid" ); if( relatedassetid == null) { //someone created a new Asset relatedassetid = inRequest.getRequestParameters( "newassetid" ); } if(relatedassetid == null) { return; } String type = inRequest.getRequestParameter( "type" ); boolean redirect = Boolean.parseBoolean(inRequest.findValue("redirect")); String parentrelationship = inRequest.findValue("parentrelationship"); String assetid = inRequest.getRequestParameter("assetid"); Asset source = mediaArchive.getAsset(assetid); if(source == null) { throw new OpenEditException("Source is null"); } String[] catalogs = inRequest.getRequestParameters("relatedtocatalogid"); String catalogid = mediaArchive.getCatalogId(); for (int i = 0; i < relatedassetid.length; i++) { if( catalogs != null) { catalogid = catalogs[i]; } MediaArchive savestore = getMediaArchive(catalogid); Asset target = savestore.getAsset(relatedassetid[i]); target.setProperty("datatype", type); createRelationship(savestore, type, parentrelationship, source, target, inRequest.getUser()); } if(redirect) { String path = source.getSourcePath(); //TODO: Should go back to related Asset list inRequest.redirect(mediaArchive.getLinkToAssetDetails(path)); } } private void createRelationship(MediaArchive MediaArchive, String type, String parentrelationship, Asset source, Asset target, User inUser) { if( target == null) { throw new OpenEditException("target is null"); } List<RelatedAsset> relatives = (List)source.getRelatedAssets(); //Check to see if this relationship already exists. for (Iterator iterator = relatives.iterator(); iterator.hasNext();) { RelatedAsset rel = (RelatedAsset) iterator.next(); if(rel.get("relatedtoassetid") == target.getId() && rel.get("relatedtocatalogid") == target.getCatalogId()) { return; } } RelatedAsset related = new RelatedAsset(); related.setAssetId(source.getId()); related.setRelatedToAssetId(target.getId()); related.setRelatedToCatalogId(target.getCatalogId()); related.setType(type); source.addRelatedAsset(related ); MediaArchive.saveAsset( source ,null); if(parentrelationship != null) { RelatedAsset back = new RelatedAsset(); back.setAssetId(target.getId()); back.setRelatedToAssetId(source.getId()); back.setRelatedToCatalogId(source.getCatalogId()); back.setType(parentrelationship); target.addRelatedAsset( back ); MediaArchive.saveAsset( target ,inUser); } } public void loadRelatedAssets( WebPageRequest inRequest ) throws OpenEditException { Asset asset = getAsset(inRequest); MediaArchive archive = getMediaArchive(inRequest); Searcher searcher = archive.getSearcherManager().getSearcher(archive.getCatalogId(), "relatedasset"); HitTracker related = searcher.fieldSearch("assetid", asset.getId()); inRequest.putPageValue("relatedhits", related); } /* * This will load a tracker of all the assets that happen to be related to this one, even transitively. */ public RelatedAssetTracker loadAllRelatedAssets( WebPageRequest inRequest ) throws OpenEditException { RelatedAssetTracker list = (RelatedAssetTracker)inRequest.getPageValue("relatedhits"); if( list != null ) { return list; } MediaArchive MediaArchive = getMediaArchive(inRequest); Asset Asset = getAsset(inRequest); if( Asset == null) { return null; } List all = new ArrayList(); all.addAll(Asset.getRelatedAssets()); //initial list HashSet targets = new HashSet(); targets.add(Asset.getCatalogId()+":::"+Asset.getId()); for (Iterator iterator = all.iterator(); iterator.hasNext();) { RelatedAsset rp = (RelatedAsset) iterator.next(); targets.add(rp.getRelatedToCatalogId()+":::"+rp.getRelatedToAssetId()); } for (int i = 0; i < all.size(); i++) //iterate through all. new ones added to the end of the list during iteration will also be checked. { RelatedAsset relatedAsset = (RelatedAsset) all.get(i); String catalogid = relatedAsset.getRelatedToCatalogId(); if(catalogid == null) { catalogid = MediaArchive.getCatalogId(); } MediaArchive targetstore = getMediaArchive(catalogid); Asset target = targetstore.getAsset( relatedAsset.getRelatedToAssetId()); if(target == null) { Asset.removeRelatedAsset(catalogid, relatedAsset.getRelatedToAssetId()); MediaArchive.saveAsset(Asset, inRequest.getUser()); continue; } //Go one level deeper Collection newOnes = target.getRelatedAssets(); //for each item in the list, add all their relatives for (Iterator iterator = newOnes.iterator(); iterator.hasNext();) { RelatedAsset newRelated = (RelatedAsset) iterator.next(); if (!all.contains(newRelated) && !targets.contains(newRelated.getRelatedToCatalogId()+":::"+newRelated.getRelatedToAssetId())) { targets.add(newRelated.getRelatedToCatalogId()+":::"+newRelated.getRelatedToAssetId()); all.add(newRelated); //put this new one at the end of the list. we will check check its relations eventually } } } RelatedAssetTracker tracker = new RelatedAssetTracker(); tracker.addAll(all); inRequest.putPageValue("relatedhits", tracker); return tracker; } public CompositeHitTracker getAllTracker(WebPageRequest inReq) throws Exception { MediaArchive MediaArchive = getMediaArchive(inReq); Asset Asset = getAsset(inReq); CompositeHitTracker composite = new CompositeHitTracker(); composite.ensureHasSubTracker(inReq, MediaArchive.getCatalogId()); composite.addToSubTracker(MediaArchive.getCatalogId(), Asset); RelatedAssetTracker relatedtracker = loadAllRelatedAssets(inReq); for (Iterator iterator = relatedtracker.iterator(); iterator.hasNext();) { RelatedAsset item = (RelatedAsset) iterator.next(); String catalogid = item.getRelatedToCatalogId(); MediaArchive targetstore = getMediaArchive(catalogid); Asset target = targetstore.getAsset( item.getRelatedToAssetId()); composite.ensureHasSubTracker(inReq, catalogid); composite.addToSubTracker(catalogid, target); } composite.setHitsName("allrelatedhits"); composite.setCatalogId(MediaArchive.getCatalogId()); inReq.putPageValue(composite.getHitsName(), composite); inReq.putSessionValue(composite.getSessionId(), composite); return composite; } public void removeRelatedAsset(WebPageRequest inRequest) throws OpenEditException { String sourceid = inRequest.getRequestParameter("assetid"); String targetid = inRequest.getRequestParameter("targetid"); String catalogid = inRequest.getRequestParameter("targetcatalogid"); MediaArchive sourcestore = getMediaArchive(inRequest); if(catalogid == null) { catalogid = sourcestore.getCatalogId(); } MediaArchive targetStore = getMediaArchive(catalogid); Asset target = targetStore.getAsset(targetid); target.removeRelatedAsset(sourcestore.getCatalogId(), sourceid); targetStore.saveAsset(target, inRequest.getUser()); Asset source = sourcestore.getAsset(sourceid); source.removeRelatedAsset(targetStore.getCatalogId(),targetid); sourcestore.saveAsset(source, inRequest.getUser()); inRequest.removePageValue("relatedhits"); loadAllRelatedAssets(inRequest); } // // private Asset loadAsset(WebPageRequest inRequest) { // String sourcepath = inRequest.findValue("sourcepath"); // return getMediaArchive(inRequest).getAssetBySourcePath(sourcepath); // // } // // public void removeRelatedAsset( WebPageRequest inRequest ) throws OpenEditException // { // StoreEditor editor = getStoreEditor( inRequest ); // Asset Asset = editor.getCurrentAsset(); // String[] assetIds = inRequest.getRequestParameters( "relatedid" ); // for ( int i = 0; i < assetIds.length; i++ ) // { // Asset.removeRelatedAsset( assetIds[i] ); // } // editor.saveAsset( Asset ); // } // // public void updateRelatedAssetIds( WebPageRequest inRequest ) throws OpenEditException // { // StoreEditor editor = getStoreEditor( inRequest ); // Asset Asset = editor.getCurrentAsset(); // // String[] assetIds = inRequest.getRequestParameters( "assetid" ); // for ( int i = 0; i < assetIds.length; i++ ) // { // String add = inRequest.getRequestParameter( assetIds[i] + ".value" ); // if(add != null) // { // Asset.addRelatedAssetId( assetIds[i] ); // } // else // { // Asset.removeRelatedAssetId(assetIds[i]); // } // } // editor.saveAsset( Asset ); // } // // public void relateAssetsInCategory( WebPageRequest inRequest ) throws OpenEditException // { // StoreEditor editor = getStoreEditor( inRequest ); // Asset Asset = editor.getCurrentAsset(); // String catalogid = inRequest.getRequestParameter("categoryid"); // // MediaArchive MediaArchive = getMediaArchive(inRequest); // if(catalogid == null){ // return; // } // Category cat = MediaArchive.getCategory(catalogid); // if(cat != null) // { // List assetList = MediaArchive.getAssetsInCatalog(cat); // for (Iterator iter = assetList.iterator(); iter.hasNext();) // { // Asset current = (Asset) iter.next(); // current.addRelatedAssetId( Asset.getId() ); // editor.saveAsset( current ); // // } // } // // } // // public void unrelateAssetsInCategory( WebPageRequest inRequest ) throws OpenEditException // { // StoreEditor editor = getStoreEditor( inRequest ); // Asset Asset = editor.getCurrentAsset(); // String catalogid = inRequest.getRequestParameter("categoryid"); // MediaArchive MediaArchive = getMediaArchive(inRequest); // if(catalogid == null) // { // return; // } // Category cat = MediaArchive.getCatalog(catalogid); // if(cat != null) // { // List assetList = MediaArchive.getAssetsInCatalog(cat); // for (Iterator iter = assetList.iterator(); iter.hasNext();) // { // Asset current = (Asset) iter.next(); // current.removeRelatedAssetId( Asset.getId() ); // editor.saveAsset( current ); // } // } // } }