pop3store.java

来自「Eclipse RCP下编写的工作管理软件代码」· Java 代码 · 共 1,194 行 · 第 1/3 页

JAVA
1,194
字号
				client = new POP3Client();
				if (debug) {
					client.setDebug(true);
				}
				client.setHost(host);
				if (port != -1) {
					client.setPort(port);
				}
				if (authMode.equals(NORMAL_AUTH)) {
					client.setAuthorizationMode(POP3Client.NORMAL_AUTHORIZATION);
				} else if (authMode.equals(APOP_AUTH)) {
					client.setAuthorizationMode(POP3Client.APOP_AUTHORIZATION);
				}
				client.setTimeout(timeout);
				client.setUser(user);
				client.setPassword(password);
				//延迟连接
//				client.connect();
			}
			// MessageReceiver 傪弶婜壔偡傞.
			if (offlineMode) {
				receiver = new OfflineMessageReceiver();
			} else if (receiveImmediatery) {
				receiver = new DefaultMessageReceiver(client);
			} else {
				receiver = new BackgroundMessageReceiver(new DefaultMessageReceiver(client));
				((BackgroundMessageReceiver) receiver).start();
			}
			return true;
		} finally {
			try {
				if (client != null) {
					client.disconnect();			// 偡偖偵愗抐偡傞.
				}
			} catch (IOException ioe) {
				debugOut("POP3Store.protocolConnect():" + ioe);
				ioe.printStackTrace();
			}
		}
	}

	/**
	 * 愙懕傪暵偠傞.
	 * 僒乕僶偲偺愙懕傪愗抐偡傞.
	 *
	 * @throws MessagingException	僄儔乕偑敪惗偟偨応崌.
	 */
	public synchronized void close() throws MessagingException {
		try {
			if (receiver != null) {
				if (receiver instanceof BackgroundMessageReceiver) {
					((BackgroundMessageReceiver) receiver).stopReceiving();
				}
				receiver = null;
			}
			timerThread = null;	// 嶲徠傪僋儕傾偡傞. 偙偺僗儗僢僪偼 POP3Folder.isConnected() == false 偲側偭偨帪揰偱廔椆偡傞.
			MessageIndex.saveAll();
		} catch (IOException ioe) {
			ioe.printStackTrace();
		} finally {
			super.close();
			debugOut("POP3Store.close():closed.");
		}
	}

	/**
	 * 僨僼僅儖僩僼僅儖僟傪曉偡.
	 * 尰嵼偺幚憰偱偼丄POP3DefaultFolder 偺僀儞僗僞儞僗傪曉偟偰偄傞.
	 *
	 * @return	僨僼僅儖僩僼僅儖僟.尰嵼偼 POP3DefaultFolder偺僀儞僗僞儞僗.
	 * @throws MessagingException	僄儔乕偑敪惗偟偨応崌.
	 */
	public synchronized Folder getDefaultFolder() throws MessagingException {
		return getFolder("");
	}

	/**
	 * 巜掕偝傟偨柤慜偺僼僅儖僟傪曉偡.
	 * POP3Store 偱偼丄斾妑帪偵僼僅儖僟柤偺戝暥帤彫暥帤偼嬫暿偟側偄.
	 * 偨偩偟丄僼僅儖僟嶌惉帪偺柤徧偲偟偰偼丄戝暥帤乛彫暥帤偼曐帩偝傟傞.
	 *
	 * JavaMail偺巇條偱偼丄乽Folder 僆僽僕僃僋僩偼Store偵傛偭偰僉儍僢僔儏偝傟側偄乿
	 * 偲側偭偰偄傞偨傔丄摨堦偺僼僅儖僟柤偑巜掕偝傟偨応崌偵傕丄堎側傞 Folder 僆僽僕僃僋僩偑曉偝傟傞.
	 *
	 * @param	name	僼僅儖僟偺柤慜.戝暥帤乛彫暥帤偼嬫暿偝傟側偄."INBOX" 偼摿暿側僼僅儖僟柤偱偁傞.
	 *                  POP3Store偱偼丄"" 乮嬻暥帤楍乯偼僨僼僅儖僩僼僅儖僟傪昞偡.
	 * @return		巜掕偝傟偨柤慜偵懳墳偡傞僼僅儖僟.
	 * @exception	javax.mail.MessagingException	僄儔乕偑敪惗偟偨応崌.
	 * @exception	java.lang.IllegalStateException	愙懕忬懺偵側偄応崌.
	 */
	public Folder getFolder(String name) throws MessagingException {
		if (! isConnected()) {
			throw new IllegalStateException("Not connected");
		}
		if (name.startsWith("/")) {
			name = name.substring(1);
		}
		if (name.equalsIgnoreCase(INBOX_NAME)) {
			name = INBOX_NAME;
		}
		POP3Folder folder = null;
		synchronized (masterFolders) {
			POP3Folder masterfolder = null;
			
			Enumeration e = masterFolders.keys();	
			while (e.hasMoreElements()) { // 斾妑帪偵偼丄戝暥帤乛彫暥帤傪柍帇偡傞.
				String mastername = (String) e.nextElement();
				if (name.equalsIgnoreCase(mastername)) {
					masterfolder = (POP3Folder) masterFolders.get(mastername);
					name = mastername;	// 偡偱偵懚嵼偡傞僼僅儖僟偲摨堦偺柤慜偲偡傞.
				}
			}
			if (name.equals("")) {
				folder = new POP3DefaultFolder(this);
			} else {
				folder = new POP3Folder(this, name);
			}
			if (masterfolder == null) {
				masterfolder = folder;
				masterFolders.put(name, masterfolder);
			}	
		}
		return folder;
	}

	/**
	 * 巜掕偝傟偨柤慜偺僼僅儖僟傪曉偡.
	 * 撪晹偱丄getFolder(url.getFile()) 傪屇傃弌偟偰偄傞.
	 *
	 * @param	url	僼僅儖僟偺柤慜.
	 * @exception	javax.mail.MessagingException.
	 * @exception	java.lang.IllegalStateException	愙懕忬懺偵側偄応崌.
	 */
	public Folder getFolder(URLName url) throws MessagingException {
		return getFolder(url.getFile());
	}
	
	/**
	 * 僀儞僫乕僋儔僗偐傜屇傃弌偡偨傔偵嵞搙 protected 愰尵偡傞.
	 *
	 * @param	type	僀儀儞僩偺僞僀僾丅
	 * @param	message	捠抦偡傞儊僢僙乕僕丅
	 */
	protected void notifyStoreListeners(int type, String message) {
		super.notifyStoreListeners(type, message);
	}
	
	/**
	 * 偙偺僆僽僕僃僋僩偑晄梫偵側偭偨帪揰偱屇傃弌偝傟傞丅
	 */
	protected void finalize() throws Throwable {
		try {
			if (isConnected()) {
				close();
			}
		} finally {
			super.finalize();
		}
	}
		
	// 偙傟埲崀偼 POP3Store 撈帺偺儊僜僢僪
	/**
	 * 僨僶僢僌弌椡.
	 * debug 僼傿乕儖僪偑 true 偺応崌偵偺傒 System.err 偵儊僢僙乕僕傪弌椡偡傞.
	 *
	 * @param msg	弌椡儊僢僙乕僕.
	 */
	protected void debugOut(String msg) {
		if (debug) {
			StringBuffer sb = new StringBuffer("DEBUG:");
			sb.append(msg);
			System.err.println(sb.toString());
		}
	}
	
	/**
	 * Store 傪弶婜壔偡傞.
	 */
	private void initStore(URLName urlname) {
//		initShutdownHook();
		loadProperties();
		loadParameters(urlname);
		loadUIDL();

		// root僨傿儗僋僩儕偑懚嵼偟側偄応崌偵偼嶌惉偡傞.
		if (! getRootDirectory().exists()) {
			getRootDirectory().mkdirs();
		}
		
		// INBOX 僼僅儖僟偑懚嵼偟側偄応崌偼嶌惉偡傞.
		File inboxFolder = new File(rootDirectory, INBOX_NAME);
		if (! inboxFolder.exists()) {
			inboxFolder.mkdirs();
		}
	}
	
	/**
	 * 僔儍僢僩僟僂儞僼僢僋傪捛壛偡傞丅
	 */
	private void initShutdownHook() {
		try {
			Class[] paramClass = new Class[1];
			paramClass[0] = Thread.class;
			
			Method method = Runtime.class.getMethod("addShutdownHook", paramClass);
			Runtime runtime = Runtime.getRuntime();
			
			Object[] param = new Object[1];
			param[0] = new Thread() {
				public void run() {
					try {
						debugOut("POP3Store shutdown now");
						close();
					} catch (MessagingException me) {
						me.printStackTrace();
					}
				}
			};
			method.invoke(runtime, param);
		} catch (IllegalAccessException iae) {
			iae.printStackTrace();
			debugOut("POP3Store.initShutodownHook:IllegalAccessException:" + iae);
		} catch (NoSuchMethodException nsme) {	// JDK1.3 埲慜偺僶乕僕儑儞偵偼丄addShutdownHook 偼懚嵼偟側偄丅
//			nsme.printStackTrace();
			debugOut("POP3Store.initShutdownHook:NoSuchMethodException:" + nsme);
		} catch (InvocationTargetException ite) {
			Throwable t = ite.getTargetException();
			if (t instanceof Error) {
				throw (Error) t;	// 僄儔乕偼偦偺傑傑搳偘傞丅
			} else if (t instanceof Exception) {
				debugOut("POP3Store.initShutdownHook:InvocationTergetException:targetException:" + t);
			}
		}
	}
	
	/**
	 * 僾儘僷僥傿傪撉傒崬傒丄奺僼傿乕儖僪傪弶婜壔偡傞.
	 */
	private void loadProperties() {
		// 儖乕僩僨傿儗僋僩儕傪摼傞.
		String root = session.getProperty(ROOTDIRECTORY_PROPERTY);
		if (root == null) {
			rootDirectory = new File(System.getProperty("user.dir"));
		} else {
			rootDirectory = new File(root);
		}
		debugOut(ROOTDIRECTORY_PROPERTY + "=" + rootDirectory.getAbsolutePath());
		
		// 庴怣娫妘傪僾儘僷僥傿偐傜摼傞.
		String interval = session.getProperty(INTERVAL_PROPERTY);
		if (interval == null) {
			checkInterval = DEFAULT_CHECK_INTERVAL;
		} else {
			checkInterval = Long.parseLong(interval) * 1000L * 60L;	// 儈儕昩偵曄姺偡傞.
		}
		debugOut(INTERVAL_PROPERTY + "=" + checkInterval + " (ms)");

		// 庴怣偟偨儊僢僙乕僕傪僒乕僶偵巆偡偐傪摼傞.
		String los = session.getProperty(LEAVE_ON_SERVER_PROPERTY);
		if (los == null) {
			leaveOnServer = true;
		} else {
			leaveOnServer = Boolean.valueOf(los).booleanValue();
		}
		debugOut(LEAVE_ON_SERVER_PROPERTY + "=" + leaveOnServer);
		
		// 僆僼儔僀儞儌乕僪偱摦嶌偡傞偐傪摼傞.
		String off = session.getProperty(OFFLINEMODE_PROPERTY);
		if (off == null) {
			offlineMode = false;
		} else {
			offlineMode = Boolean.valueOf(off).booleanValue();
		}
		debugOut(OFFLINEMODE_PROPERTY + '=' + offlineMode);
		
		// 擣徹儌乕僪傪弶婜壔偡傞.
		String auth = session.getProperty(AUTHMODE_PROPERTY);
		if (auth == null) {
			authMode = NORMAL_AUTH;
		} else {
			authMode = auth.toUpperCase();
		}
		debugOut(AUTHMODE_PROPERTY + '=' + authMode);

		// 儊僢僙乕僕傪庴怣偡傞僼僅儖僟柤傪摼傞.
		String fname = session.getProperty(RECEIVING_FOLDER_PROPERTY);
		if (fname == null) {
			receivingFolderName = INBOX_NAME;
		} else {
			receivingFolderName = fname;
		}
		debugOut(RECEIVING_FOLDER_PROPERTY + '=' + receivingFolderName);
		
		// 儊僢僙乕僕庴怣傾僋僔儑儞傪摼傞.
		String actns = session.getProperty(CHECK_ACTION_PROPERTY);
		if (actns == null) {
			checkActions.addElement(RECEIVING_ACTION_OPEN);
			checkActions.addElement(RECEIVING_ACTION_HASNEWMESSAGES);
		} else {
			StringTokenizer tokenizer = new StringTokenizer(actns.trim(), ",");
			while (tokenizer.hasMoreTokens()) {
				checkActions.addElement(tokenizer.nextToken());
			}
		}
		Enumeration e  = checkActions.elements();
		actns = "";
		while (e.hasMoreElements()) {
			actns += (String) e.nextElement() + ",";
		}
		debugOut(CHECK_ACTION_PROPERTY + '=' + actns);
		actns = null;
	
		// 儊僢僙乕僕傪捈偪偵庴怣偡傞偐傪寛掕偡傞.
		String im = session.getProperty(RECEIVE_IMMEDIATERY_PROPERTY);
		if (im == null) {
			receiveImmediatery = false;
		} else {
			receiveImmediatery = Boolean.valueOf(im).booleanValue();
		}
		debugOut(RECEIVE_IMMEDIATERY_PROPERTY + '=' + receiveImmediatery);
		
		// 塀偟僼僅儖僟傪儕僗僩傾僢僾偡傞偐傪寛掕偡傞丅
		String lhf = session.getProperty(LIST_HIDDEN_FOLDERS_PROPERTY);
		if (lhf == null) {
			listHiddenFolders = false;
		} else {
			listHiddenFolders = Boolean.valueOf(lhf).booleanValue();
		}
		// File.isHidden() 儊僜僢僪偑僒億乕僩偝傟偰偄側偄娐嫬偱偼
		// isHidden僆僾僔儑儞偑僒億乕僩偝傟側偄偙偲傪僨僶僢僌弌椡偵昞帵偡傞丅
		if (! SubFolderFilter.isHiddenMethodSupported()) {
			debugOut("WARNING:" + LIST_HIDDEN_FOLDERS_PROPERTY + " not supported because method File.isHidden() not exists, ignored.");
		}
		debugOut(LIST_HIDDEN_FOLDERS_PROPERTY + '=' + listHiddenFolders);

		// Socket偺僞僀儉傾僂僩帪娫傪寛掕偡傞丅
		String to = session.getProperty(TIMEOUT_PROPERTY);
		if (to == null) {
			timeout = 0;
		} else {
			timeout = Integer.parseInt(to);
		}
		debugOut(TIMEOUT_PROPERTY + '=' + timeout);
	}
	
	
	/**
	 * URLName偵巜掕偝傟偨僷儔儊乕僞傪撉傒崬傓.
	 *
	 * @param	urlname	URLName.
	 */
	private void loadParameters(URLName urlname) {
		Hashtable options = parseParameters(urlname);
		Enumeration e = options.keys();
		debugOut("POP3Store.loadParameters(): parameter loading...");
		String params = "";
		while (e.hasMoreElements()) {
			String key = (String) e.nextElement();
			String value = (String) options.get(key);
			if (params.length() > 0) {
				params += ',';
			}
			params += key + '=' + value;
		}
		debugOut(params);
		String rd = (String) options.get(LOCALSTORE_KEY);
		if (rd != null) {
			rootDirectory = new File(rd);
			debugOut("rootDirectory has changed to " + rootDirectory);
		}
		
		String am = (String) options.get(AUTHMODE_KEY);
		if (am != null) {
			authMode = am;
			debugOut("authMode has changed to " + authMode);
		}
		
		debugOut("POP3Store.loadParameters(): done.");
	}
	
	/**
	 * 巜掕偝傟偨URLName撪偺僷儔儊乕僞傪僷乕僗偡傞.
	 *
	 * @param	urlname	夝愅懳徾偲側傞 URLName.
	 * @return	夝愅寢壥傪奿擺偟偨 Hashtable.
	 */
	private Hashtable parseParameters(URLName urlname) {
		Hashtable options = new Hashtable();
		String optstr = urlname.getFile();
		if (optstr != null) {
			final int startpos = optstr.indexOf('?');
			if (startpos != -1 && startpos < optstr.length() - 1) {
				optstr = optstr.substring(startpos + 1);
				StringTokenizer st = new StringTokenizer(optstr, "&");
				while (st.hasMoreTokens()) {
					String pair = st.nextToken();
					int eqpos = pair.indexOf('=');
					String lvalue = (eqpos != -1) ? pair.substring(0, eqpos) : null;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?