You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2010/05/07 15:53:14 UTC

svn commit: r942073 - /httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/

Author: olegk
Date: Fri May  7 13:53:13 2010
New Revision: 942073

URL: http://svn.apache.org/viewvc?rev=942073&view=rev
Log:
Tweaked logging in caching components

Modified:
    httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/CacheEntry.java
    httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/CacheInvalidator.java
    httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/CacheableRequestPolicy.java
    httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/CachedResponseSuitabilityChecker.java
    httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/CachingHttpClient.java
    httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/ResponseCachingPolicy.java

Modified: httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/CacheEntry.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/CacheEntry.java?rev=942073&r1=942072&r2=942073&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/CacheEntry.java (original)
+++ httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/CacheEntry.java Fri May  7 13:53:13 2010
@@ -395,4 +395,10 @@ public class CacheEntry implements Seria
         return Collections.unmodifiableSet(this.variantURIs);
     }
 
+    @Override
+    public String toString() {
+        return "[request date=" + requestDate + "; response date=" + responseDate
+                + "; status=" + status + "]";
+    }
+
 }

Modified: httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/CacheInvalidator.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/CacheInvalidator.java?rev=942073&r1=942072&r2=942073&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/CacheInvalidator.java (original)
+++ httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/CacheInvalidator.java Fri May  7 13:53:13 2010
@@ -48,7 +48,7 @@ public class CacheInvalidator {
     private final HttpCache<CacheEntry> cache;
     private final URIExtractor uriExtractor;
 
-    private final Log LOG = LogFactory.getLog(CacheInvalidator.class);
+    private final Log log = LogFactory.getLog(getClass());
 
     /**
      *
@@ -68,17 +68,15 @@ public class CacheInvalidator {
      * @param req The HttpRequest to that host
      */
     public void flushInvalidatedCacheEntries(HttpHost host, HttpRequest req) {
-        LOG.debug("CacheInvalidator: flushInvalidatedCacheEntries, BEGIN");
-
         if (requestShouldNotBeCached(req)) {
-            LOG.debug("CacheInvalidator: flushInvalidatedCacheEntries, Request should not be cached");
+            log.debug("Request should not be cached");
 
             try {
                 String theUri = uriExtractor.getURI(host, req);
 
                 CacheEntry parent = cache.getEntry(theUri);
 
-                LOG.debug("CacheInvalidator: flushInvalidatedCacheEntries: " + parent);
+                log.debug("parent entry: " + parent);
 
                 if (parent != null) {
                     for (String variantURI : parent.getVariantURIs()) {
@@ -86,9 +84,9 @@ public class CacheInvalidator {
                     }
                     cache.removeEntry(theUri);
                 }
-            } catch (HttpCacheOperationException coe) {
-                LOG.warn("Cache: Was unable to REMOVE an entry from the cache based on the uri provided.", coe);
-                // TODO: track failed state
+            } catch (HttpCacheOperationException ex) {
+                log.debug("Was unable to REMOVE an entry from the cache based on the uri provided",
+                        ex);
             }
         }
     }

Modified: httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/CacheableRequestPolicy.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/CacheableRequestPolicy.java?rev=942073&r1=942072&r2=942073&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/CacheableRequestPolicy.java (original)
+++ httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/CacheableRequestPolicy.java Fri May  7 13:53:13 2010
@@ -42,7 +42,7 @@ import org.apache.http.annotation.Immuta
 @Immutable
 public class CacheableRequestPolicy {
 
-    private final Log LOG = LogFactory.getLog(CacheableRequestPolicy.class);
+    private final Log log = LogFactory.getLog(getClass());
 
     /**
      * Determines if an HttpRequest can be served from the cache.
@@ -56,17 +56,17 @@ public class CacheableRequestPolicy {
 
         ProtocolVersion pv = request.getRequestLine().getProtocolVersion();
         if (CachingHttpClient.HTTP_1_1.compareToVersion(pv) != 0) {
-            LOG.debug("CacheableRequestPolicy: Request WAS NOT serveable from Cache.");
+            log.debug("Request was not serveable from cache");
             return false;
         }
 
         if (!method.equals(HeaderConstants.GET_METHOD)) {
-            LOG.debug("CacheableRequestPolicy: Request WAS NOT serveable from Cache.");
+            log.debug("Request was not serveable from cache");
             return false;
         }
 
         if (request.getHeaders(HeaderConstants.PRAGMA).length > 0) {
-            LOG.debug("CacheableRequestPolicy: Request WAS NOT serveable from Cache.");
+            log.debug("Request was not serveable from cache");
             return false;
         }
 
@@ -75,19 +75,19 @@ public class CacheableRequestPolicy {
             for (HeaderElement cacheControlElement : cacheControl.getElements()) {
                 if (HeaderConstants.CACHE_CONTROL_NO_STORE.equalsIgnoreCase(cacheControlElement
                         .getName())) {
-                    LOG.debug("CacheableRequestPolicy: Request WAS NOT serveable from Cache.");
+                    log.debug("Request was not serveable from Cache");
                     return false;
                 }
 
                 if (HeaderConstants.CACHE_CONTROL_NO_CACHE.equalsIgnoreCase(cacheControlElement
                         .getName())) {
-                    LOG.debug("CacheableRequestPolicy: Request WAS NOT serveable from Cache.");
+                    log.debug("Request was not serveable from cache");
                     return false;
                 }
             }
         }
 
-        LOG.debug("CacheableRequestPolicy: Request WAS serveable from Cache.");
+        log.debug("Request was serveable from cache");
         return true;
     }
 

Modified: httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/CachedResponseSuitabilityChecker.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/CachedResponseSuitabilityChecker.java?rev=942073&r1=942072&r2=942073&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/CachedResponseSuitabilityChecker.java (original)
+++ httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/CachedResponseSuitabilityChecker.java Fri May  7 13:53:13 2010
@@ -43,7 +43,7 @@ import org.apache.http.annotation.Immuta
 @Immutable
 public class CachedResponseSuitabilityChecker {
 
-    private final Log LOG = LogFactory.getLog(CachedResponseSuitabilityChecker.class);
+    private final Log log = LogFactory.getLog(getClass());
 
     /**
      * @param host
@@ -56,29 +56,29 @@ public class CachedResponseSuitabilityCh
      */
     public boolean canCachedResponseBeUsed(HttpHost host, HttpRequest request, CacheEntry entry) {
         if (!entry.isResponseFresh()) {
-            LOG.debug("CachedResponseSuitabilityChecker: Cache Entry was NOT fresh enough");
+            log.debug("Cache entry was not fresh enough");
             return false;
         }
 
         if (!entry.contentLengthHeaderMatchesActualLength()) {
-            LOG.debug("CachedResponseSuitabilityChecker: Cache Entry Content Length and header information DO NOT match.");
+            log.debug("Cache entry Content-Length and header information do not match");
             return false;
         }
 
         if (entry.modifiedSince(request)) {
-            LOG.debug("CachedResponseSuitabilityChecker: Cache Entry modified times didn't line up.  Cache Entry should NOT be used.");
+            log.debug("Cache entry modified times didn't line up. Cache Entry should not be used");
             return false;
         }
 
         for (Header ccHdr : request.getHeaders(HeaderConstants.CACHE_CONTROL)) {
             for (HeaderElement elt : ccHdr.getElements()) {
                 if (HeaderConstants.CACHE_CONTROL_NO_CACHE.equals(elt.getName())) {
-                    LOG.debug("CachedResponseSuitabilityChecker: Response contained NO CACHE directive, cache was NOT suitable.");
+                    log.debug("Response contained NO CACHE directive, cache was not suitable");
                     return false;
                 }
 
                 if (HeaderConstants.CACHE_CONTROL_NO_STORE.equals(elt.getName())) {
-                    LOG.debug("CachedResponseSuitabilityChecker: Response contained NO SORE directive, cache was NOT suitable.");
+                    log.debug("Response contained NO SORE directive, cache was not suitable");
                     return false;
                 }
 
@@ -86,12 +86,12 @@ public class CachedResponseSuitabilityCh
                     try {
                         int maxage = Integer.parseInt(elt.getValue());
                         if (entry.getCurrentAgeSecs() > maxage) {
-                            LOG.debug("CachedResponseSuitabilityChecker: Response from cache was NOT suitable due to max age.");
+                            log.debug("Response from cache was NOT suitable due to max age");
                             return false;
                         }
-                    } catch (NumberFormatException nfe) {
+                    } catch (NumberFormatException ex) {
                         // err conservatively
-                        LOG.debug("CachedResponseSuitabilityChecker: Response from cache was NOT suitable. "+nfe);
+                        log.debug("Response from cache was malformed: " + ex.getMessage());
                         return false;
                     }
                 }
@@ -100,12 +100,12 @@ public class CachedResponseSuitabilityCh
                     try {
                         int maxstale = Integer.parseInt(elt.getValue());
                         if (entry.getFreshnessLifetimeSecs() > maxstale) {
-                            LOG.debug("CachedResponseSuitabilityChecker: Response from cache was NOT suitable due to Max stale freshness");
+                            log.debug("Response from cache was not suitable due to Max stale freshness");
                             return false;
                         }
-                    } catch (NumberFormatException nfe) {
+                    } catch (NumberFormatException ex) {
                         // err conservatively
-                        LOG.debug("CachedResponseSuitabilityChecker: Response from cache was NOT suitable. "+nfe);
+                        log.debug("Response from cache was malformed: " + ex.getMessage());
                         return false;
                     }
                 }
@@ -114,19 +114,20 @@ public class CachedResponseSuitabilityCh
                     try {
                         int minfresh = Integer.parseInt(elt.getValue());
                         if (entry.getFreshnessLifetimeSecs() < minfresh) {
-                            LOG.debug("CachedResponseSuitabilityChecker: Response from cache was NOT suitable due to min fresh freshness requirement");
+                            log.debug("Response from cache was not suitable due to min fresh " +
+                                    "freshness requirement");
                             return false;
                         }
-                    } catch (NumberFormatException nfe) {
+                    } catch (NumberFormatException ex) {
                         // err conservatively
-                        LOG.debug("CachedResponseSuitabilityChecker: Response from cache was NOT suitable. " + nfe);
+                        log.debug("Response from cache was malformed: " + ex.getMessage());
                         return false;
                     }
                 }
             }
         }
 
-        LOG.debug("CachedResponseSuitabilityChecker: Response from cache was suitable.");
+        log.debug("Response from cache was suitable");
         return true;
     }
 }

Modified: httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/CachingHttpClient.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/CachingHttpClient.java?rev=942073&r1=942072&r2=942073&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/CachingHttpClient.java (original)
+++ httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/CachingHttpClient.java Fri May  7 13:53:13 2010
@@ -91,7 +91,7 @@ public class CachingHttpClient implement
     private final ResponseProtocolCompliance responseCompliance;
     private final RequestProtocolCompliance requestCompliance;
 
-    private final Log LOG = LogFactory.getLog(CachingHttpClient.class);
+    private final Log log = LogFactory.getLog(getClass());
 
     public CachingHttpClient() {
         this.backend = new DefaultHttpClient();
@@ -330,8 +330,8 @@ public class CachingHttpClient implement
         CacheEntry entry = null;
         try {
             entry = responseCache.getEntry(uri);
-        } catch (HttpCacheOperationException probablyIgnore) {
-            LOG.warn("Cache: Was unable to get an entry from the cache based on the uri provided.", probablyIgnore);
+        } catch (HttpCacheOperationException ex) {
+            log.debug("Was unable to get an entry from the cache based on the uri provided", ex);
         }
 
         if (entry == null || !entry.hasVariants())
@@ -340,7 +340,7 @@ public class CachingHttpClient implement
         String variantUri = uriExtractor.getVariantURI(target, request, entry);
         try {
             return responseCache.getEntry(variantUri);
-        } catch (HttpCacheOperationException probablyIgnore) {
+        } catch (HttpCacheOperationException ex) {
             return null;
         }
     }
@@ -384,11 +384,19 @@ public class CachingHttpClient implement
         CacheEntry entry = getCacheEntry(target, request);
         if (entry == null) {
             cacheMisses.getAndIncrement();
-            LOG.debug("CLIENT: Cache Miss.");
+            if (log.isDebugEnabled()) {
+                RequestLine rl = request.getRequestLine();
+                log.debug("Cache miss [host: " + target + "; uri: " + rl.getUri() + "]");
+
+            }
             return callBackend(target, request, context);
         }
 
-        LOG.debug("CLIENT: Cache HIT.");
+        if (log.isDebugEnabled()) {
+            RequestLine rl = request.getRequestLine();
+            log.debug("Cache hit [host: " + target + "; uri: " + rl.getUri() + "]");
+
+        }
         cacheHits.getAndIncrement();
 
         if (suitabilityChecker.canCachedResponseBeUsed(target, request, entry)) {
@@ -396,14 +404,14 @@ public class CachingHttpClient implement
         }
 
         if (entry.isRevalidatable()) {
-            LOG.debug("CLIENT: Revalidate the entry.");
+            log.debug("Revalidating the cache entry");
 
             try {
                 return revalidateCacheEntry(target, request, context, entry);
             } catch (IOException ioex) {
                 HttpResponse response = responseGenerator.generateResponse(entry);
                 response.addHeader(HeaderConstants.WARNING, "111 Revalidation Failed - " + ioex.getMessage());
-                LOG.debug("111 revalidation failed due to exception: " + ioex);
+                log.debug("111 revalidation failed due to exception: " + ioex);
                 return response;
             } catch (ProtocolException e) {
                 throw new ClientProtocolException(e);
@@ -433,7 +441,7 @@ public class CachingHttpClient implement
         Date requestDate = getCurrentDate();
 
         try {
-            LOG.debug("CLIENT: Calling the backend.");
+            log.debug("Calling the backend");
             HttpResponse backendResponse = backend.execute(target, request, context);
             return handleBackendResponse(target, request, requestDate, getCurrentDate(),
                                          backendResponse);
@@ -447,8 +455,11 @@ public class CachingHttpClient implement
 
     }
 
-    protected HttpResponse revalidateCacheEntry(HttpHost target, HttpRequest request,
-                                                HttpContext context, CacheEntry cacheEntry) throws IOException, ProtocolException {
+    protected HttpResponse revalidateCacheEntry(
+            HttpHost target,
+            HttpRequest request,
+            HttpContext context,
+            CacheEntry cacheEntry) throws IOException, ProtocolException {
         HttpRequest conditionalRequest = conditionalRequestBuilder.buildConditionalRequest(request, cacheEntry);
         Date requestDate = getCurrentDate();
 
@@ -472,10 +483,12 @@ public class CachingHttpClient implement
         if (entry.hasVariants()) {
             try {
                 String uri = uriExtractor.getURI(target, request);
-                HttpCacheUpdateCallback<CacheEntry> callback = storeVariantEntry(target, request, entry);
+                HttpCacheUpdateCallback<CacheEntry> callback = storeVariantEntry(
+                        target, request, entry);
                 responseCache.updateCacheEntry(uri, callback);
-            } catch (HttpCacheOperationException probablyIgnore) {
-                LOG.warn("Cache: Was unable to PUT/UPDATE an entry into the cache based on the uri provided.", probablyIgnore);
+            } catch (HttpCacheOperationException ex) {
+                log.debug("Was unable to PUT/UPDATE an entry into the cache based on the uri provided",
+                        ex);
             }
         } else {
             storeNonVariantEntry(target, request, entry);
@@ -486,13 +499,15 @@ public class CachingHttpClient implement
         String uri = uriExtractor.getURI(target, req);
         try {
             responseCache.putEntry(uri, entry);
-        } catch (HttpCacheOperationException probablyIgnore) {
-            LOG.warn("Cache: Was unable to PUT an entry into the cache based on the uri provided.", probablyIgnore);
+        } catch (HttpCacheOperationException ex) {
+            log.debug("Was unable to PUT an entry into the cache based on the uri provided", ex);
         }
     }
 
-    protected HttpCacheUpdateCallback<CacheEntry> storeVariantEntry(final HttpHost target, final HttpRequest req,
-                                                                    final CacheEntry entry) {
+    protected HttpCacheUpdateCallback<CacheEntry> storeVariantEntry(
+            final HttpHost target,
+            final HttpRequest req,
+            final CacheEntry entry) {
 
         return new HttpCacheUpdateCallback<CacheEntry>() {
             public CacheEntry getUpdatedEntry(CacheEntry existing) throws HttpCacheOperationException {
@@ -502,7 +517,11 @@ public class CachingHttpClient implement
         };
     }
 
-    protected CacheEntry doGetUpdatedParentEntry(CacheEntry existing, HttpHost target, HttpRequest req, CacheEntry entry) throws HttpCacheOperationException {
+    protected CacheEntry doGetUpdatedParentEntry(
+            CacheEntry existing,
+            HttpHost target,
+            HttpRequest req,
+            CacheEntry entry) throws HttpCacheOperationException {
 
         String variantURI = uriExtractor.getVariantURI(target, req, entry);
         responseCache.putEntry(variantURI, entry);
@@ -514,10 +533,14 @@ public class CachingHttpClient implement
         }
     }
 
-    protected HttpResponse handleBackendResponse(HttpHost target, HttpRequest request,
-                                                 Date requestDate, Date responseDate, HttpResponse backendResponse) throws IOException {
+    protected HttpResponse handleBackendResponse(
+            HttpHost target,
+            HttpRequest request,
+            Date requestDate,
+            Date responseDate,
+            HttpResponse backendResponse) throws IOException {
 
-        LOG.debug("CLIENT: Handling Backend response.");
+        log.debug("Handling Backend response");
         responseCompliance.ensureProtocolCompliance(request, backendResponse);
 
         boolean cacheable = responseCachingPolicy.isResponseCacheable(request, backendResponse);
@@ -530,8 +553,11 @@ public class CachingHttpClient implement
                 return responseReader.getReconstructedResponse();
             }
 
-            CacheEntry entry = cacheEntryGenerator.generateEntry(requestDate, responseDate,
-                                                                 backendResponse, responseReader.getResponseBytes());
+            CacheEntry entry = cacheEntryGenerator.generateEntry(
+                    requestDate,
+                    responseDate,
+                    backendResponse,
+                    responseReader.getResponseBytes());
             storeInCache(target, request, entry);
             return responseGenerator.generateResponse(entry);
         }
@@ -539,9 +565,8 @@ public class CachingHttpClient implement
         String uri = uriExtractor.getURI(target, request);
         try {
             responseCache.removeEntry(uri);
-        } catch (HttpCacheOperationException coe) {
-            LOG.warn("Cache: Was unable to remove an entry from the cache based on the uri provided.", coe);
-            // TODO: track failed state
+        } catch (HttpCacheOperationException ex) {
+            log.debug("Was unable to remove an entry from the cache based on the uri provided", ex);
         }
         return backendResponse;
     }

Modified: httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/ResponseCachingPolicy.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/ResponseCachingPolicy.java?rev=942073&r1=942072&r2=942073&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/ResponseCachingPolicy.java (original)
+++ httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/impl/ResponseCachingPolicy.java Fri May  7 13:53:13 2010
@@ -46,7 +46,7 @@ import org.apache.http.impl.cookie.DateU
 public class ResponseCachingPolicy {
 
     private final int maxObjectSizeBytes;
-    private final Log LOG = LogFactory.getLog(ResponseCachingPolicy.class);
+    private final Log log = LogFactory.getLog(getClass());
 
     /**
      *
@@ -67,7 +67,7 @@ public class ResponseCachingPolicy {
         boolean cacheable = false;
 
         if (!HeaderConstants.GET_METHOD.equals(httpMethod)) {
-            LOG.debug("ResponseCachingPolicy: response was not cacheable.");
+            log.debug("Response was not cacheable.");
             return false;
         }
 
@@ -79,18 +79,18 @@ public class ResponseCachingPolicy {
         case HttpStatus.SC_GONE:
             // these response codes MAY be cached
             cacheable = true;
-            LOG.debug("ResponseCachingPolicy: response WAS cacheable.");
+            log.debug("Response was cacheable");
             break;
         case HttpStatus.SC_PARTIAL_CONTENT:
             // we don't implement Range requests and hence are not
             // allowed to cache partial content
-            LOG.debug("ResponseCachingPolicy: response was not cacheable (Partial Content).");
+            log.debug("Response was not cacheable (Partial Content)");
             return cacheable;
 
         default:
             // If the status code is not one of the recognized
             // available codes in HttpStatus Don't Cache
-            LOG.debug("ResponseCachingPolicy: response was not cacheable (Unknown Status code).");
+            log.debug("Response was not cacheable (Unknown Status code)");
             return cacheable;
         }
 
@@ -175,12 +175,12 @@ public class ResponseCachingPolicy {
      */
     public boolean isResponseCacheable(HttpRequest request, HttpResponse response) {
         if (requestProtocolGreaterThanAccepted(request)) {
-            LOG.debug("ResponseCachingPolicy: response was not cacheable.");
+            log.debug("Response was not cacheable.");
             return false;
         }
 
         if (request.getRequestLine().getUri().contains("?") && !isExplicitlyCacheable(response)) {
-            LOG.debug("ResponseCachingPolicy: response was not cacheable.");
+            log.debug("Response was not cacheable.");
             return false;
         }