Java tutorial
/* * Adito * * Copyright (C) 2003-2006 3SP LTD. All Rights Reserved * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.adito.networkplaces; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.maverick.util.URLUTF8Encoder; import com.adito.boot.ReplacementEngine; import com.adito.boot.Replacer; import com.adito.boot.Util; import com.adito.policyframework.PolicyDatabaseFactory; import com.adito.policyframework.ResourceUtil; import com.adito.security.SessionInfo; import com.adito.vfs.VFSProvider; import com.adito.vfs.VFSProviderManager; import com.adito.vfs.VFSRepository; import com.adito.vfs.VFSStore; import com.adito.vfs.utils.URI; import com.adito.vfs.utils.URI.MalformedURIException; import com.adito.vfs.webdav.DAVBundleActionMessageException; import com.adito.vfs.webdav.DAVUtilities; public final class NetworkPlaceUtil { final static Log log = LogFactory.getLog(NetworkPlaceUtil.class); /** * Create a valid VFS URI from a path. * * @param path path * @return URI * @throws IllegalArgumentException if URI cannot be create */ public static URI createURIForPath(String path) { NetworkPlace np = createNetworkPlaceForPath(path); try { String userInfo = URLUTF8Encoder.encode(np.getUsername(), false); if (!Util.isNullOrTrimmedBlank(np.getPassword())) { userInfo = URLUTF8Encoder.encode(np.getUsername(), false); } URI uri = new URI(np.getScheme(), userInfo, np.getHost(), np.getPort(), np.getPath(), null, null); return uri; } catch (Exception e) { throw new IllegalArgumentException("Could not create URI."); } } /** * Create a network place object given a path. * * @param path * @return network place * @throws IllegalArgumentException if resource cannot be created * */ public static NetworkPlace createNetworkPlaceForPath(String path) { NetworkPlace np = null; try { np = new DefaultNetworkPlace(1, 0, "", "", "", "", path, 0, "", "", NetworkPlace.TYPE_HIDDEN, false, false, false, false, false, null, null); NetworkPlaceUtil.convertNetworkPlace(np); } catch (Exception e) { log.error(e); throw new IllegalArgumentException("Could not convert path to network place."); } VFSProvider provider = VFSProviderManager.getInstance().getProvider(np.getScheme()); if (provider == null) { throw new IllegalArgumentException("No provider " + np.getScheme()); } return np; } /** * Get a list of {@link NetworkPlaceItem} objects that may be used by the user * of the given session. * * @param session * @return network place items * @throws DAVBundleActionMessageException * @throws Exception */ public static List<NetworkPlaceItem> refreshNetworkMounts(VFSRepository repository, SessionInfo session) throws DAVBundleActionMessageException, Exception { List<NetworkPlaceItem> networkPlaceItems = new ArrayList<NetworkPlaceItem>(); List granted = ResourceUtil.getGrantedResource(session, NetworkPlacePlugin.NETWORK_PLACE_RESOURCE_TYPE); for (Iterator i = granted.iterator(); i.hasNext();) { NetworkPlace np = (NetworkPlace) i.next(); try { VFSProvider provider = VFSProviderManager.getInstance().getProvider(np.getScheme()); if (provider == null) { if (np.getScheme().equals("")) { URI uri = createURIForPath(np.getPath()); provider = VFSProviderManager.getInstance().getProvider(uri.getScheme()); } if (provider == null) throw new Exception("No provider for network place URI " + np.getPath()); } if (np.getType() != NetworkPlace.TYPE_HIDDEN) { // Create a store so we can get the mount path VFSStore store = repository.getStore(provider.getScheme()); NetworkPlaceItem npi = new NetworkPlaceItem( np, store.getMountPath(np.getResourceName()), PolicyDatabaseFactory.getInstance() .getPoliciesAttachedToResource(np, session.getUser().getRealm()), np.sessionPasswordRequired(session)); networkPlaceItems.add(npi); } } catch (Exception e) { log.warn("Failed to register " + np.getResourceName() + " with store.", e); } } return networkPlaceItems; } /** * Convert a network place that only has a path into a network * place with separate elements. Used by the install task * and when creating a network place using the <i>URI</i> type * * @param networkPlace * @throws Exception */ public static void convertNetworkPlace(NetworkPlace networkPlace) throws Exception { if (Util.isNullOrTrimmedBlank(networkPlace.getScheme())) { String path = networkPlace.getPath(); Replacer r = new Replacer() { public String getReplacement(Pattern pattern, Matcher matcher, String replacementPattern) { String match = matcher.group(); String key = match.substring(2, match.length() - 1); try { int idx = key.indexOf(":"); if (idx == -1) { throw new Exception("String replacement pattern is in incorrect format for " + key + ". Must be <TYPE>:<key>"); } String type = key.substring(0, idx); key = key.substring(idx + 1); return "_prototype_" + type + "_" + key + "_"; } catch (Exception e) { NetworkPlaceInstall.log.error("Failed to replace.", e); } return "prototype"; } }; // Replace all replacement variables with prototype values ReplacementEngine engine = new ReplacementEngine(); engine.addPattern(NetworkPlaceInstall.VARIABLE_PATTERN, r, null); path = engine.replace(path); // URI newUri = null; // Is it a UNC path if (path.startsWith("\\\\")) { try { newUri = new URI("smb:" + path.replace('\\', '/')); } catch (MalformedURIException murie) { murie.printStackTrace(); } } // Is this a supported RI? if (newUri == null) { int idx = path.indexOf(':'); if (idx > 1) { // index of 1 would mean a windows absolute path // Is it an non windows absolute file URI? String rpath = path.substring(idx + 1); String scheme = path.substring(0, idx); if (scheme.equals("file")) { if (rpath.startsWith("//") && !rpath.startsWith("///") && (rpath.length() < 4 || rpath.charAt(3) != ':')) { path = scheme + ":/" + rpath; } } newUri = new URI(path); } } // Is it a local file? (wont work for replacements) boolean switchSlash = false; if (newUri == null) { if (path.contains("\\")) { switchSlash = true; } try { String scheme; if (path.toLowerCase().endsWith(".jar")) { scheme = "jar"; } else if (path.toLowerCase().endsWith(".zip")) { scheme = "zip"; } else { scheme = "file"; } newUri = new URI(scheme + ":///" + DAVUtilities.stripLeadingSlash(path.replace('\\', '/'))); } catch (MalformedURIException e) { e.printStackTrace(); } } // Convert the network place if required if (newUri != null) { engine = new ReplacementEngine(); r = new Replacer() { public String getReplacement(Pattern pattern, Matcher matcher, String replacementPattern) { String match = matcher.group(); String key = match.substring(11, match.length() - 1); try { int idx = key.indexOf("_"); if (idx == -1) { throw new Exception("String replacement pattern is in incorrect format for " + key + ". Must be <TYPE>:<key>"); } String type = key.substring(0, idx); key = key.substring(idx + 1); return "${" + type + ":" + key + "}"; } catch (Exception e) { NetworkPlaceInstall.log.error("Failed to replace.", e); } return "prototype"; } }; engine.addPattern(NetworkPlaceInstall.PROTOTYPE_PATTERN, r, null); String newScheme = newUri.getScheme(); String newHost = newUri.getHost(); if (!Util.isNullOrTrimmedBlank(newHost)) { newHost = engine.replace(newHost); } int newPort = Math.max(newUri.getPort(), 0); String newPath = newUri.getPath(); if (!Util.isNullOrTrimmedBlank(newPath)) { newPath = Util.urlDecode(engine.replace(newPath)); } if (newPath.startsWith("/") && newPath.length() > 2 && newPath.charAt(2) == ':') { newPath = newPath.substring(1); } if (switchSlash) { newPath = newPath.replace('/', '\\'); } String newFragment = newUri.getFragment(); if (!Util.isNullOrTrimmedBlank(newFragment)) { newFragment = engine.replace(newFragment); } String newUserinfo = newUri.getUserinfo(); int idx = newUserinfo == null ? -1 : newUserinfo.indexOf(':'); String newUsername = newUserinfo; String newPassword = ""; if (idx != -1) { newPassword = newUsername.substring(idx + 1); newUsername = newUsername.substring(0, idx); } if (!Util.isNullOrTrimmedBlank(newUsername)) { newUsername = Util.urlDecode(engine.replace(newUsername)); } if (!Util.isNullOrTrimmedBlank(newPassword)) { newPassword = Util.urlDecode(engine.replace(newPassword)); } networkPlace.setScheme(Util.emptyWhenNull(newScheme)); networkPlace.setHost(Util.emptyWhenNull(newHost)); networkPlace.setPort(newPort); networkPlace.setPath(Util.emptyWhenNull(newPath)); networkPlace.setUsername(Util.emptyWhenNull(newUsername)); networkPlace.setPassword(Util.emptyWhenNull(newPassword)); // networkPlace.setFragment(newFragment); } } } }