001: /*
002: * Copyright 2005-2007 Noelios Consulting.
003: *
004: * The contents of this file are subject to the terms of the Common Development
005: * and Distribution License (the "License"). You may not use this file except in
006: * compliance with the License.
007: *
008: * You can obtain a copy of the license at
009: * http://www.opensource.org/licenses/cddl1.txt See the License for the specific
010: * language governing permissions and limitations under the License.
011: *
012: * When distributing Covered Code, include this CDDL HEADER in each file and
013: * include the License file at http://www.opensource.org/licenses/cddl1.txt If
014: * applicable, add the following below this CDDL HEADER, with the fields
015: * enclosed by brackets "[]" replaced with your own identifying information:
016: * Portions Copyright [yyyy] [name of copyright owner]
017: */
018:
019: package com.noelios.restlet.local;
020:
021: import org.restlet.Application;
022: import org.restlet.Client;
023: import org.restlet.data.CharacterSet;
024: import org.restlet.data.Encoding;
025: import org.restlet.data.Language;
026: import org.restlet.data.MediaType;
027: import org.restlet.data.Metadata;
028: import org.restlet.data.Request;
029: import org.restlet.resource.Variant;
030: import org.restlet.service.MetadataService;
031:
032: import com.noelios.restlet.ClientHelper;
033:
034: /**
035: * Connector to the local resources accessible via file system, class loaders
036: * and similar mechanisms. Here is the list of parameters that are supported:
037: * <table>
038: * <tr>
039: * <th>Parameter name</th>
040: * <th>Value type</th>
041: * <th>Default value</th>
042: * <th>Description</th>
043: * </tr>
044: * <tr>
045: * <td>timeToLive</td>
046: * <td>int</td>
047: * <td>600</td>
048: * <td>Time to live for a file representation before it expires (in seconds).</td>
049: * </tr>
050: * </table>
051: *
052: * @see org.restlet.data.LocalReference
053: * @author Jerome Louvel (contact@noelios.com)
054: * @author Thierry Boileau
055: */
056: public class LocalClientHelper extends ClientHelper {
057: /**
058: * Constructor. Note that the common list of metadata associations based on
059: * extensions is added, see the addCommonExtensions() method.
060: *
061: * @param client
062: * The client to help.
063: */
064: public LocalClientHelper(Client client) {
065: super (client);
066: }
067:
068: /**
069: * Returns the metadata service associated to a request.
070: *
071: * @param request
072: * The request to lookup.
073: * @return The metadata service associated to a request.
074: */
075: public MetadataService getMetadataService(Request request) {
076: MetadataService result = null;
077: Application application = (Application) request.getAttributes()
078: .get(Application.KEY);
079:
080: if (application != null) {
081: result = application.getMetadataService();
082: } else {
083: result = new MetadataService();
084: }
085:
086: return result;
087: }
088:
089: /**
090: * Updates some variant metadata based on a given entry name with
091: * extensions.
092: *
093: * @param metadataService
094: * The parent metadata service.
095: * @param entryName
096: * The entry name with extensions.
097: * @param variant
098: * The variant to update.
099: */
100: public void updateMetadata(MetadataService metadataService,
101: String entryName, Variant variant) {
102: if (variant != null) {
103: String[] tokens = entryName.split("\\.");
104: Metadata current;
105:
106: // We found a potential variant
107: for (int j = 1; j < tokens.length; j++) {
108: current = metadataService.getMetadata(tokens[j]);
109: if (current != null) {
110: // Metadata extension detected
111: if (current instanceof MediaType)
112: variant.setMediaType((MediaType) current);
113: if (current instanceof CharacterSet)
114: variant.setCharacterSet((CharacterSet) current);
115: if (current instanceof Encoding)
116: variant.getEncodings().add((Encoding) current);
117: if (current instanceof Language)
118: variant.getLanguages().add((Language) current);
119: }
120:
121: int dashIndex = tokens[j].indexOf('-');
122: if (dashIndex != -1) {
123: // We found a language extension with a region area
124: // specified
125: // Try to find a language matching the primary part of the
126: // extension
127: String primaryPart = tokens[j].substring(0,
128: dashIndex);
129: current = metadataService.getMetadata(primaryPart);
130: if (current instanceof Language)
131: variant.getLanguages().add((Language) current);
132: }
133: }
134:
135: // If no language is defines, take the default language
136: if (variant.getLanguages().isEmpty()) {
137: variant.getLanguages().add(
138: metadataService.getDefaultLanguage());
139: }
140: }
141: }
142:
143: /**
144: * Returns the time to live for a file representation before it expires (in
145: * seconds).
146: *
147: * @return The time to live for a file representation before it expires (in
148: * seconds).
149: */
150: public int getTimeToLive() {
151: return Integer.parseInt(getParameters().getFirstValue(
152: "timeToLive", "600"));
153: }
154:
155: }
|