/* * A CCNx command line utility. * * Copyright (C) 2010 Palo Alto Research Center, Inc. * * This work is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License version 2 as published by the * Free Software Foundation. * This work is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ package org.ccnx.ccn.utils; import java.io.IOException; import java.util.logging.Level; import org.ccnx.ccn.CCNHandle; import org.ccnx.ccn.KeyManager; import org.ccnx.ccn.config.SystemConfiguration; import org.ccnx.ccn.impl.CCNFlowControl.SaveType; import org.ccnx.ccn.impl.support.Log; import org.ccnx.ccn.io.content.Header.HeaderObject; import org.ccnx.ccn.profiles.VersioningProfile; import org.ccnx.ccn.profiles.metadata.MetadataProfile; import org.ccnx.ccn.protocol.ContentName; import org.ccnx.ccn.protocol.ContentObject; import org.ccnx.ccn.protocol.MalformedContentNameStringException; /* * Deprecated. We don't believe there are many (if any) old repositories with old style headers at this point. */ @Deprecated public class updateheader { public static void usage() { System.out.println("usage: updateheader [-log level] <ccnname> [<ccnname>*>]\n Assumes content is in a repository."); } public static void moveHeader(String ccnxName, CCNHandle handle) throws MalformedContentNameStringException, IOException { ContentName fileName = ContentName.parse(ccnxName); // Want a versioned name, either this version or latest version ContentName fileVersionedName = null; if (VersioningProfile.hasTerminalVersion(fileName)) { fileVersionedName = fileName; } else { ContentObject fileObject = VersioningProfile.getLatestVersion(fileName, null, SystemConfiguration.getDefaultTimeout(), null, handle); if (null == fileObject) { System.out.println("Cannot find file " + fileName + " to update. Skipping."); return; } fileVersionedName = fileObject.name().subname(0, fileName.count() + 1); } // Should only update content in repositories -- makes no sense to bother with other // content, really. HeaderObject newHeader = new HeaderObject(MetadataProfile.headerName(fileVersionedName), null, handle); newHeader.updateInBackground(); HeaderObject oldHeader = new HeaderObject(MetadataProfile.oldHeaderName(fileVersionedName), null, handle); oldHeader.updateInBackground(); oldHeader.waitForData(SystemConfiguration.getDefaultTimeout()); if (!oldHeader.available()) { System.out.println("No old-style header found. Skipping " + ccnxName); oldHeader.cancelInterest(); newHeader.cancelInterest(); return; } // if we get here, the initial background update should have completed for oldHeader if (newHeader.available()) { System.out.println("Already have a new header: " + newHeader.getVersionedName() + ", skipping file " + ccnxName); } else { newHeader.cancelInterest(); newHeader.setupSave(SaveType.REPOSITORY); newHeader.save(oldHeader.header()); newHeader.close(); } } /** * @param args */ public static void main(String[] args) { int arg = 0; if ((args.length == 0) || ((args.length >= 1) && ((args[0].equals("--help")) || (args[0].equals("-h"))))) { usage(); System.exit(1); } if ((args.length > 2) && (args[0].equals("-log"))) { Log.setDefaultLevel(Level.parse(args[1])); arg += 2; } CCNHandle handle = CCNHandle.getHandle(); for (int i=arg; i < args.length; ++i) { try { moveHeader(args[i], handle); } catch (Exception e) { System.out.println("Exception processing file " + args[i] + ": " + e); e.printStackTrace(); } } handle.close(); KeyManager.closeDefaultKeyManager(); } }