001: /*******************************************************************************
002: * Licensed to the Apache Software Foundation (ASF) under one
003: * or more contributor license agreements. See the NOTICE file
004: * distributed with this work for additional information
005: * regarding copyright ownership. The ASF licenses this file
006: * to you under the Apache License, Version 2.0 (the
007: * "License"); you may not use this file except in compliance
008: * with the License. You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing,
013: * software distributed under the License is distributed on an
014: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015: * KIND, either express or implied. See the License for the
016: * specific language governing permissions and limitations
017: * under the License.
018: *******************************************************************************/package org.ofbiz.base.location;
019:
020: import java.net.MalformedURLException;
021: import java.net.URL;
022:
023: import org.ofbiz.base.component.ComponentConfig;
024: import org.ofbiz.base.component.ComponentException;
025: import org.ofbiz.base.util.Debug;
026: import org.ofbiz.base.util.UtilURL;
027:
028: /**
029: * A special location resolver that uses Strings like URLs, but with more options
030: *
031: */
032:
033: public class ComponentLocationResolver implements LocationResolver {
034:
035: public static final String module = ComponentLocationResolver.class
036: .getName();
037:
038: public URL resolveLocation(String location)
039: throws MalformedURLException {
040: StringBuffer baseLocation = ComponentLocationResolver
041: .getBaseLocation(location);
042: URL fileUrl = UtilURL.fromFilename(baseLocation.toString());
043:
044: if (fileUrl == null) {
045: Debug.logWarning(
046: "Unable to get file URL for component location; expanded location was ["
047: + baseLocation
048: + "], original location was [" + location
049: + "]", module);
050: }
051:
052: return fileUrl;
053: }
054:
055: public static StringBuffer getBaseLocation(String location)
056: throws MalformedURLException {
057: StringBuffer baseLocation = new StringBuffer(FlexibleLocation
058: .stripLocationType(location));
059:
060: // componentName is between the first slash and the second
061: int firstSlash = baseLocation.indexOf("/");
062: int secondSlash = baseLocation.indexOf("/", firstSlash + 1);
063: if (firstSlash != 0 || secondSlash == -1) {
064: throw new MalformedURLException(
065: "Bad component location ["
066: + location
067: + "]: base location missing slashes ["
068: + baseLocation
069: + "], first="
070: + firstSlash
071: + ", second="
072: + secondSlash
073: + "; should be like: component://{component-name}/relative/path");
074: }
075: String componentName = baseLocation.substring(firstSlash + 1,
076: secondSlash);
077:
078: // got the componentName, now remove it from the baseLocation, removing the second slash too (just in case the rootLocation has one)
079: baseLocation.delete(0, secondSlash + 1);
080:
081: String rootLocation;
082: try {
083: rootLocation = ComponentConfig
084: .getRootLocation(componentName);
085: } catch (ComponentException e) {
086: String errMsg = "Could not get root location for component with name ["
087: + componentName + "], error was: " + e.toString();
088: Debug.logError(e, errMsg, module);
089: throw new MalformedURLException(errMsg);
090: }
091:
092: // if there is not a forward slash between the two, add it
093: if (baseLocation.charAt(0) != '/'
094: && rootLocation.charAt(rootLocation.length() - 1) != '/') {
095: baseLocation.insert(0, '/');
096: }
097:
098: // insert the root location and we're done
099: baseLocation.insert(0, rootLocation);
100:
101: return baseLocation;
102: }
103: }
|