/*
* Copyright 2003-2010 Tufts University Licensed under the
* Educational Community License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may
* obtain a copy of the License at
*
* http://www.osedu.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an "AS IS"
* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
/*
* AssetResource.java
*
* Created on January 23, 2004, 11:21 AM
*/
package tufts.vue;
/**
*
* @author akumar03
*/
import osid.dr.*;
import tufts.oki.dr.fedora.*;
import org.w3c.dom.Document;
import org.w3c.dom.Text;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import fedora.server.types.gen.*;
import java.io.*;
import java.net.*;
import javax.swing.*;
/** * A wrapper for Fedora Object implementation of osid.dr.Asset which can be used as the user object in a
* DefaultMutableTreeNode. It implements the Resource interface specification.
*/
public class AssetResource extends URLResource {
/** Creates a new instance of AssetResource */
public static final int DC_NAMESPACE_LENGTH = 3 ;// (dc:) the namespacepresent in metadata fields. Beginning is chopped off for clean rendering
public static final String DISSEMINATION_ID = "getDublinCore";
public static final String DC_FIELD_ID = "fedora.disseminationURL";
public static final String DISSEMINATION_INFOSTRUCTURE_ID = "fedora.dissemination";
public static final String VUE_INFOSTRUCTURE_ID = "fedora.vue";
public static final String VUE_DEFAULT_VIEW_ID = "fedora.vue.defaultView";
public static final String[] dcFields = tufts.oki.dr.fedora.DR.DC_FIELDS;
public static final String DC_NAMESPACE = tufts.oki.dr.fedora.DR.DC_NAMESPACE;
private Asset asset;
private CastorFedoraObject castorFedoraObject; // stripped version of fedora object for saving and restoring in castor will work only with this implementation of DR API.
public AssetResource() {
super();
setClientType(Resource.ASSET_FEDORA);
}
public AssetResource(Asset asset) throws osid.dr.DigitalRepositoryException,osid.OsidException {
this();
setAsset(asset);
}
public void setAsset(Asset asset) throws osid.dr.DigitalRepositoryException,osid.OsidException {
this.asset = asset;
setPropertiesByAsset();
setSpec(asset.getInfoField(new tufts.oki.dr.fedora.PID(VUE_DEFAULT_VIEW_ID)).getValue().toString());
setClientType(Resource.ASSET_FEDORA);
setTitle(asset.getDisplayName());
this.castorFedoraObject = new CastorFedoraObject((FedoraObject)asset);
}
public Asset getAsset() {
return this.asset;
}
private void setPropertiesByAsset() {
try {
if(!(asset.getAssetType().getKeyword().equals("fedora:BDEF") || asset.getAssetType().getKeyword().equals("fedora:BMECH"))){
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
//InputStream dublinCoreInputStream = new ByteArrayInputStream(((MIMETypedStream)(asset.getInfoField(new PID("getDublinCore")).getValue())).getStream());
URL dcUrl = getDCUrl();
if(dcUrl !=null) {
InputStream dublinCoreInputStream = dcUrl.openStream();
Document document = factory.newDocumentBuilder().parse(dublinCoreInputStream);
for(int i=0;i<dcFields.length;i++) {
NodeList list = document.getElementsByTagName(DC_NAMESPACE+dcFields[i]);
if(list != null && list.getLength() != 0) {
// only picks the first element
if(list.item(0).getFirstChild() != null)
setProperty(dcFields[i], list.item(0).getFirstChild().getNodeValue());
}
}
}
}
} catch (Exception ex) {ex.printStackTrace();}
}
private URL getDCUrl() {
URL url = null;
try {
boolean flag = true;
osid.dr.InfoFieldIterator i = asset.getInfoRecord(new PID(DISSEMINATION_ID)).getInfoFields();
while(i.hasNext() && flag) {
osid.dr.InfoField infoField = i.next();
if(infoField.getInfoPart().getId().getIdString().equals(DC_FIELD_ID)) {
url = new URL(infoField.getValue().toString());
}
}
} catch (Exception ex) {ex.printStackTrace();}
return url;
}
public void setCastorFedoraObject(CastorFedoraObject castorFedoraObject) throws osid.dr.DigitalRepositoryException,osid.OsidException {
this.castorFedoraObject = castorFedoraObject;
this.asset = this.castorFedoraObject.getFedoraObject();
setSpec(asset.getInfoField(new tufts.oki.dr.fedora.PID(VUE_DEFAULT_VIEW_ID)).getValue().toString());
setClientType(Resource.ASSET_FEDORA);
setPropertiesByAsset();
}
public CastorFedoraObject getCastorFedoraObject() {
return this.castorFedoraObject;
}
//todo:menu will be generated in AssetResource.
public static AbstractAction getFedoraAction(osid.dr.InfoRecord infoRecord,osid.dr.DigitalRepository dr) throws osid.dr.DigitalRepositoryException {
final DR mDR = (DR)dr;
final tufts.oki.dr.fedora.InfoRecord mInfoRecord = (tufts.oki.dr.fedora.InfoRecord)infoRecord;
try {
AbstractAction fedoraAction = new AbstractAction(infoRecord.getId().getIdString()) {
public void actionPerformed(java.awt.event.ActionEvent actionEvent) {
try {
//String fedoraUrl = mDR.getFedoraProperties().getProperty("url.fedora.get","http://vue-dl.tccs..tufts.edu:8080/fedora/get");
String fedoraUrl = mInfoRecord.getInfoField(new PID(FedoraUtils.getFedoraProperty(mDR, "DisseminationURLInfoPartId"))).getValue().toString();
URL url = new URL(fedoraUrl);
URLConnection connection = url.openConnection();
System.out.println("FEDORA ACTION: Content-type:"+connection.getContentType()+" for url :"+fedoraUrl);
VueUtil.openURL(fedoraUrl);
} catch(Exception ex) { }
}
};
return fedoraAction;
} catch(Exception ex) {
throw new osid.dr.DigitalRepositoryException("FedoraUtils.getFedoraAction "+ex.getMessage());
}
}
}