/** * Copyright 2010 JBoss Inc * * Licensed under the Apache 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.apache.org/licenses/LICENSE-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 org.eclipse.webdav.internal.kernel; import java.io.IOException; import java.io.StreamTokenizer; import org.eclipse.webdav.IResponse; /** * An EntityTag is a ConditionFactor describing some state of a resource represented * as an opaque string. See section 3.11 of the HTTP/1.1 spec. */ public class EntityTag extends ConditionFactor { private static int bcnt = 0; private static String basetime = Long.toHexString(new java.util.Date().getTime()); private String eTag = null; // represents some state of a resource expressed as a ETag private boolean weak = false; /** * Construct a EntityTag. Should never be called. */ private EntityTag() { super(); } /** * Construct a EntityTag with the given opaque string tag. * * @param tag the opaque string defining the entity tag */ public EntityTag(String tag) { this.eTag = tag; } /** * Create an EntityTag by parsing the given If header as defined by * section 3.11 of the HTTP/1.1 spec. * * @param tokenizer a StreamTokenizer on the contents of a WebDAV If header * @return the parsed ConditionFactor (EntityTag) * @exception WebDAVException thrown if there is a syntax error in the If header */ public static ConditionFactor create(StreamTokenizer tokenizer) throws WebDAVException { EntityTag entityTag = new EntityTag(); try { int token = tokenizer.ttype; if (token == '[') token = tokenizer.nextToken(); else throw new WebDAVException(IResponse.SC_BAD_REQUEST, Policy.bind("error.parseMissing", String.valueOf(token), "[")); //$NON-NLS-1$ //$NON-NLS-2$ if (token == '"') { //$NON-NLS-1$ entityTag.setETag(tokenizer.sval); token = tokenizer.nextToken(); } else throw new WebDAVException(IResponse.SC_BAD_REQUEST, Policy.bind("error.parseMissingQuotedString", String.valueOf(token))); //$NON-NLS-1$ if (token == ']') token = tokenizer.nextToken(); else throw new WebDAVException(IResponse.SC_BAD_REQUEST, Policy.bind("error.parseMissing", String.valueOf(token), "]")); //$NON-NLS-1$ //$NON-NLS-2$ } catch (IOException exc) { // ignore or log? } return entityTag; } /** * Compare with another EntityTag. * * @param etag the entity tag to compare * @return true if the tags are equal, false otherwise */ public boolean equals(Object etag) { return etag != null && etag instanceof EntityTag && getETag().equals(((EntityTag) etag).getETag()); } /** * Construct a unique EntityTag. The tag is constructed by concatening the * current time with the current thread's hash code. * * @return a unique entity tag that servers may use for any purpose */ public static EntityTag generateEntityTag() { String xx = basetime + ":" + Integer.toHexString(Thread.currentThread().hashCode()); //$NON-NLS-1$ bcnt++; xx += ":" + bcnt; //$NON-NLS-1$ return new EntityTag(xx); } /** * Get the ETag of this EntityTag. The ETag represents some state of the * resource in the containing Condition. * * @return the etag */ public String getETag() { return eTag; } /** * Is this a weak EntityTag? * * @return true if this is a weak entity tag */ public boolean isWeak() { return weak; } /** * Set the ETag of this EntityTag. The ETag represents some state of the * resource in the containing Condition, for example, the lock token. * * @value the etag to set */ public void setETag(String value) { eTag = value; } /** * Set the strength of this EntityTag. * value true indicates this is a weak entity tag */ public void setWeak(boolean value) { weak = value; } /** * Return a String representation of this EntityTag as defined by the If * header in section 9.4 of the WebDAV spec. * * @return a string representation of this entity tag */ public String toString() { StringBuffer buffer = new StringBuffer(); if (not()) buffer.append("Not "); //$NON-NLS-1$ if (isWeak()) buffer.append("W/"); //$NON-NLS-1$ buffer.append("[\""); //$NON-NLS-1$ buffer.append(getETag()); buffer.append("\"]"); //$NON-NLS-1$ return buffer.toString(); } }