tufts.vue.PublishUtil.java Source code

Java tutorial

Introduction

Here is the source code for tufts.vue.PublishUtil.java

Source

/*
* 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.
 */

package tufts.vue;

/**
 *
 * @author  akumar03
 */

import java.util.Vector;
import java.util.Iterator;
import java.io.*;
import java.net.*;
import org.apache.commons.net.ftp.*;
import java.util.*;
import java.util.zip.*;

import fedora.server.management.FedoraAPIM;
import fedora.server.utilities.StreamUtility;
//import fedora.client.ingest.AutoIngestor;

import tufts.vue.action.*;

public class PublishUtil implements tufts.vue.DublinCoreConstants {
    public static final String VUE_MIME_TYPE = VueResources.getString("vue.type");
    public static final String BINARY_MIME_TYPE = "application/binary";
    public static final String ZIP_MIME_TYPE = "application/zip";
    public static final int BUFFER_SIZE = 10240;// size for transferring files
    public static final String IMSCP_MANIFEST_ORGANIZATION = "%organization%";
    public static final String IMSCP_MANIFEST_METADATA = "%metadata%";
    public static final String IMSCP_MANIFEST_RESOURCES = "%resources%";
    public static final String RESOURCE_FOLDER = "resource:resources" + File.separator;
    public static File activeMapFile;
    public static String IMSManifest; // the string is written to manifest file;

    /** Creates a new instance of PublishUtil */
    public PublishUtil() {
    }

    public static File createZip(LWMap map, Vector resourceVector)
            throws IOException, URISyntaxException, CloneNotSupportedException, ZipException {

        System.out.println("Creating a zip file");
        IMSCP imscp = new IMSCP();
        try {
            if (map.getFile() == null) {
                VueUtil.alert(VueResources.getString("dialog.exporterror.message"),
                        VueResources.getString("dialog.exporterror.title"));
                return null;
            }
            String saveEntry = VueUtil.getDefaultUserFolder() + File.separator + map.getFile().getName();
            File saveMapFile = new File(saveEntry);

            ActionUtil.marshallMap(saveMapFile, map);
            LWMap saveMap = tufts.vue.action.OpenAction.loadMap(saveEntry);
            //TODO: Need to add resources in zip file
            /**
            Iterator i = resourceVector.iterator();
            while(i.hasNext()) {
                Vector vector = (Vector)i.next();
                Boolean b = (Boolean)(vector.elementAt(0));
                if(b.booleanValue()) {
            Resource r = (Resource)(vector.elementAt(1));
            String rFileName = r.getSpec();
            File rFile = new File(rFileName);
            String entry = RESOURCE_FOLDER+rFile.getName();
            imscp.putEntry(entry,rFile);  
            replaceResource(saveMap,r,new MapResource(RESOURCE_FOLDER+rFile.getName()));
                }
            }
                
            ActionUtil.marshallMap(saveMapFile,saveMap);
             */
            imscp.putEntry(saveMap.getFile().getName(), saveMapFile);
            saveMapFile.deleteOnExit();
            imscp.closeZOS();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return imscp.getFile();

    }

    public static File createIMSCP(Vector resourceVector)
            throws IOException, URISyntaxException, CloneNotSupportedException {
        String IMSCPMetadata = "";
        String IMSCPOrganization = "";
        String IMSCPResources = "";
        int resourceCount = 2; //resourceIdentifier 1 is used for map
        Properties props = tufts.vue.VUE.getActiveMap().getMetadata().asProperties();
        IMSCPMetadata += getMetadataString(props);
        IMSCPResources += getResourceTag(props, IMSCP.MAP_FILE, 1);
        IMSCPOrganization += "<organization identifier=\"TOC1\" structure=\"hierarchical\">";
        IMSCPOrganization += "<title>IMS Content Package of VUE Map</title> ";
        IMSCPOrganization += "<item identifier=\"ITEM1\" identifierref=\"RESOURCE1\">";
        IMSCPOrganization += "<title> VUE Cocept Map</title>";
        LWMap saveMap = (LWMap) tufts.vue.VUE.getActiveMap().clone();
        IMSCP imscp = new IMSCP();
        Iterator i = resourceVector.iterator();
        while (i.hasNext()) {
            Vector vector = (Vector) i.next();
            Resource r = (Resource) (vector.elementAt(1));
            Boolean b = (Boolean) (vector.elementAt(0));
            File file = new File(new URL(r.getSpec()).getFile());
            //File file = new File((String)vector.elementAt(1));
            if (b.booleanValue()) {
                System.out.println("FileName = " + file.getName() + " index =" + resourceVector.indexOf(vector));
                //resourceTable.setValueAt("Processing",resourceVector.indexOf(vector),STATUS_COL);
                String entry = IMSCP.RESOURCE_FILES + File.separator + file.getName();
                imscp.putEntry(entry, file);
                IMSCPResources += getResourceTag(r.getProperties().asProperties(), entry, resourceCount);
                IMSCPOrganization += getItemTag("ITEM" + resourceCount, "RESOURCE" + resourceCount,
                        "Resource " + resourceCount + " in Concept Map");
                //resourceTable.setValueAt("Done",resourceVector.indexOf(vector),STATUS_COL);
                replaceResource(saveMap, r,
                        Resource.getFactory().get(IMSCP.RESOURCE_FILES + File.separatorChar + file.getName()));
                //replaceResource(saveMap,r,new MapResource(IMSCP.RESOURCE_FILES+File.separatorChar+file.getName()));
                resourceCount++;
            }
        }
        saveMap(saveMap);
        imscp.putEntry(IMSCP.MAP_FILE, activeMapFile);
        IMSCPOrganization += "</item>";
        IMSCPOrganization += "</organization>";
        IMSManifest = readRawManifest();
        IMSManifest = IMSManifest.replaceAll(IMSCP_MANIFEST_METADATA, IMSCPMetadata).trim();
        IMSManifest = IMSManifest.replaceAll(IMSCP_MANIFEST_ORGANIZATION, IMSCPOrganization);
        IMSManifest = IMSManifest.replaceAll(IMSCP_MANIFEST_RESOURCES, IMSCPResources);

        File IMSManifestFile = File.createTempFile("imsmanifest", ".xml");
        BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(IMSManifestFile));
        fos.write(IMSManifest.getBytes());
        fos.close();
        imscp.putEntry(IMSCP.MANIFEST_FILE, IMSManifestFile);
        System.out.println("Writing Active Map : " + activeMapFile.getName());
        imscp.closeZOS();
        return imscp.getFile();
    }

    public static String getMetadataString(Properties dcFields) {
        String metadata = "";
        Enumeration e = dcFields.keys();
        while (e.hasMoreElements()) {
            String field = (String) e.nextElement();
            if (isSupportedMetadataField(field))
                metadata += "<" + DC_NAMESPACE + field + ">" + dcFields.getProperty(field) + "</" + DC_NAMESPACE
                        + field + ">";
        }
        return metadata;
    }

    public static String getResourceTag(Properties dcFields, String entry, int resourceCount) {
        String resourceTag = "";
        String identifier = "RESOURCE" + resourceCount;
        resourceTag = "<resource identifier=\"" + identifier + "\" type=\"webcontent\" href=\"" + entry + "\">\n";
        resourceTag += "<file  href=\"" + entry + "\"/>\n";
        resourceTag += "<metadata>\n";
        resourceTag += "<schema>Dublin Core</schema> \n";
        resourceTag += "<schemaversion>1.1</schemaversion> \n";
        resourceTag += getMetadataString(dcFields);
        resourceTag += "</metadata>\n";
        resourceTag += "</resource>\n";
        return resourceTag;
    }

    public static String getItemTag(String item, String resource, String title) {
        String itemTag = "";
        itemTag += "<item identifier=\"" + item + "\" identifierref=\"" + resource + "\">";
        itemTag += "<title>" + title + "</title>";
        itemTag += "</item>";
        return itemTag;
    }

    public static String readRawManifest() {
        String s = "";
        try {
            BufferedInputStream fis = new BufferedInputStream(VueResources.getURL("imsmanifest").openStream());
            byte[] buf = new byte[BUFFER_SIZE];
            int ch;
            int len;
            while ((len = fis.read(buf)) > 0) {
                s = s + new String(buf);
            }
            fis.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return s;
    }

    public static void replaceResource(LWMap map, Resource r1, Resource r2) {
        tufts.vue.action.Archive.replaceResource(map, r1, r2);
    }

    public static void saveActiveMap() throws IOException, CloneNotSupportedException {
        LWMap map = (LWMap) tufts.vue.VUE.getActiveMap().clone();

        activeMapFile = map.getFile();
        if (activeMapFile == null) {
            String prefix = "concept_map";
            String suffix = ".vue";
            activeMapFile = File.createTempFile(prefix, suffix);
        }
        ActionUtil.marshallMap(activeMapFile, map);
    }

    public static File saveMap(LWMap map) throws IOException {
        activeMapFile = map.getFile();
        if (activeMapFile == null) {
            String prefix = "concept_map";
            String suffix = ".vue";
            activeMapFile = File.createTempFile(prefix, suffix);
        }
        ActionUtil.marshallMap(activeMapFile, map);
        return activeMapFile;
    }

    public static boolean isSupportedMetadataField(String field) {
        for (int i = 0; i < DC_FIELDS.length; i++) {
            if (DC_FIELDS[i].equalsIgnoreCase(field))
                return true;
        }
        return false;
    }

}