package com.limegroup.gnutella.licenses; import java.net.URL; import java.net.MalformedURLException; import java.util.HashMap; import java.util.Map; import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.Log; import com.limegroup.gnutella.Assert; /** * A collection of constants & utilities for Creative Commons licenses */ public final class CCConstants { private static final Log LOG = LogFactory.getLog(CCLicense.class); /** * The string that is inserted into QRP & goes out in license queries * when searching for Creative Commons licenses. * * THIS CAN NEVER EVER CHANGE. * (And, if you really do change it for some reason, make sure * that you update the value in the various .xsd files.) */ public static final String CC_URI_PREFIX = "creativecommons.org/licenses/"; /** * The string that indicates all subsequent information is the URL where the * CC license is stored. */ public static final String URL_INDICATOR = "verify at"; /** The header to include in RDF documents */ public static final String CC_RDF_HEADER = "<!-- <rdf:RDF xmlns=\"http://web.resource.org/cc/\"" + " xmlns:dc=\"http://purl.org/dc/elements/1.1/\"" + " xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">"; /** The footer of the RDF block */ public static final String CC_RDF_FOOTER = "</rdf:RDF> -->"; /** various types of licenses and combinations of permited/prohibited uses */ public static final int ATTRIBUTION = 0; public static final int ATTRIBUTION_NO_DERIVS = 0x1; public static final int ATTRIBUTION_NON_COMMERCIAL = 0x2; public static final int ATTRIBUTION_NON_COMMERCIAL_NO_DERIVS = ATTRIBUTION_NON_COMMERCIAL | ATTRIBUTION_NO_DERIVS; public static final int ATTRIBUTION_SHARE = 0x4; public static final int ATTRIBUTION_SHARE_NON_COMMERCIAL = ATTRIBUTION_SHARE | ATTRIBUTION_NON_COMMERCIAL; /** URI's for each type of license */ public static final String ATTRIBUTION_URI = "http://creativecommons.org/licenses/by/2.5/"; public static final String ATTRIBUTION_NO_DERIVS_URI = "http://creativecommons.org/licenses/by-nd/2.5/"; public static final String ATTRIBUTION_NON_COMMERCIAL_URI = "http://creativecommons.org/licenses/by-nc/2.5/"; public static final String ATTRIBUTION_NON_COMMERCIAL_NO_DERIVS_URI = "http://creativecommons.org/licenses/by-nc-nd/2.5/"; public static final String ATTRIBUTION_SHARE_URI = "http://creativecommons.org/licenses/by-sa/2.5/"; public static final String ATTRIBUTION_SHARE_NON_COMMERCIAL_URI = "http://creativecommons.org/licenses/by-nc-sa/2.5/"; private static final Map LICENSE_URI_MAP; static { LICENSE_URI_MAP = new HashMap(); LICENSE_URI_MAP.put(new Integer(ATTRIBUTION),ATTRIBUTION_URI); LICENSE_URI_MAP.put(new Integer(ATTRIBUTION_NO_DERIVS),ATTRIBUTION_NO_DERIVS_URI); LICENSE_URI_MAP.put(new Integer(ATTRIBUTION_NON_COMMERCIAL),ATTRIBUTION_NON_COMMERCIAL_URI); LICENSE_URI_MAP.put(new Integer(ATTRIBUTION_NON_COMMERCIAL_NO_DERIVS),ATTRIBUTION_NON_COMMERCIAL_NO_DERIVS_URI); LICENSE_URI_MAP.put(new Integer(ATTRIBUTION_SHARE),ATTRIBUTION_SHARE_URI); LICENSE_URI_MAP.put(new Integer(ATTRIBUTION_SHARE_NON_COMMERCIAL),ATTRIBUTION_SHARE_NON_COMMERCIAL_URI); } public static String getLicenseURI(int licenseType) { return (String) LICENSE_URI_MAP.get(new Integer(licenseType)); } public static String getLicenseElement(int licenseType) { Integer licenseTypeI = new Integer(licenseType); Assert.that(LICENSE_URI_MAP.containsKey(licenseTypeI)); StringBuffer ret = new StringBuffer(); // header - the description of the license ret.append("<License rdf:about=\"").append(LICENSE_URI_MAP.get(licenseTypeI)).append("\">"); // all licenses require attribution and permit reproduction and distribution ret.append("<requires rdf:resource=\"http://web.resource.org/cc/Attribution\" />"); ret.append("<permits rdf:resource=\"http://web.resource.org/cc/Reproduction\" />"); ret.append("<permits rdf:resource=\"http://web.resource.org/cc/Distribution\" />"); // are derivative works allowed? if ((licenseType & ATTRIBUTION_NO_DERIVS) == 0) ret.append("<permits rdf:resource=\"http://web.resource.org/cc/DerivativeWorks\" />"); // is commercial use prohibited? if ((licenseType & ATTRIBUTION_NON_COMMERCIAL) != 0) ret.append("<prohibits rdf:resource=\"http://web.resource.org/cc/CommercialUse\" />"); // is share-alike required? if ((licenseType & ATTRIBUTION_SHARE) != 0) ret.append("<requires rdf:resource=\"http://web.resource.org/cc/ShareAlike\" />"); // all license require a notice ret.append("<requires rdf:resource=\"http://web.resource.org/cc/Notice\" />"); ret.append("</License>"); return ret.toString(); } /** * Guesses a license deed URL from a license string. */ static URL guessLicenseDeed(String license) { if(license == null) return null; // find where "creativecommons.org/licenses/" is. int idx = license.indexOf(CCConstants.CC_URI_PREFIX); if(idx == -1) return null; // find the "http://" before it. int httpIdx = license.lastIndexOf("http://", idx); if(httpIdx == -1) return null; // make sure that there's a space before it or it's the start. if(httpIdx != 0 && license.charAt(httpIdx-1) != ' ') return null; // find where the first space is after the http://. // if it's before the creativecommons.org part, that's bad. int spaceIdx = license.indexOf(" ", httpIdx); if(spaceIdx == -1) spaceIdx = license.length(); else if(spaceIdx < idx) return null; try { return new URL(license.substring(httpIdx, spaceIdx)); } catch(MalformedURLException bad) { LOG.warn("Unable to create URL from license: " + license, bad); return null; } } }