在 src 中新建 org.vwpolo.login.service 包,如果修改Activator這個控制插件生命週期的這個類,爲了閱讀方便,將他重命名了
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.util.tracker.ServiceTracker;
import org.vwpolo.services.LoginService;
public class StartLoginActivator implements BundleActivator {
private BundleContext context = null;
private ServiceTracker tracker = null;
private LoginDialog loginDialog = new LoginDialog(null);
/*
* (non-Javadoc)
* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
*/
public void start(BundleContext context) throws Exception {
this.context = context;
tracker = new ServiceTracker(context, LoginService.class.getName(),
new LoginServiceTracker(context,loginDialog));
tracker.open();
loginDialog.open();
}
/*
* (non-Javadoc)
* @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
*/
public void stop(BundleContext context) throws Exception {
tracker.close();
}
}
package org.vwpolo.login.service;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTrackerCustomizer;
import org.vwpolo.services.LoginService;
/**
* @author 劉堯興
*
*/
public class LoginServiceTracker implements ServiceTrackerCustomizer {
private LoginDialog loginDialog;
private BundleContext bundleContext;
public LoginServiceTracker(BundleContext bundleContext,LoginDialog loginDialog) {
this.loginDialog = loginDialog;
this.bundleContext = bundleContext;
}
@Override
public Object addingService(ServiceReference reference) {
LoginService service = (LoginService)bundleContext.getService(reference);
loginDialog.addLoginService(service);
return service;
}
@Override
public void modifiedService(ServiceReference reference, Object serviceObject) {
LoginService service = (LoginService)bundleContext.getService(reference);
loginDialog.setLoginService(service);
}
@Override
public void removedService(ServiceReference reference, Object serviceObject) {
LoginService service = (LoginService)bundleContext.getService(reference);
loginDialog.removeLoginService(service);
}
}
package org.vwpolo.login.service;
import java.util.ArrayList;
public class LoginDialog extends TitleAreaDialog {
private Text passwordText;
private Text userNameText;
private LoginService loginService;
private List<LoginService> loginServiceList = new ArrayList<LoginService>();
/**
* Create the dialog
* @param parentShell
*/
public LoginDialog(Shell parentShell) {
super(parentShell);
}
/**
* Create the dialog
* @param parentShell
*/
public LoginDialog(Shell parentShell, LoginService loginService) {
super(parentShell);
this.loginService = loginService;
}
/**
* @param service
*/
public void addLoginService(LoginService service) {
loginServiceList.add(service);
this.loginService = service;
}
/**
* @param service
*/
public void setLoginService(LoginService service) {
this.loginService = service;
}
/**
* @param service
*/
public void removeLoginService(LoginService service) {
loginServiceList.remove(service);
if(loginServiceList.size() == 0)
loginService = null;
else
this.loginService = loginServiceList.get(loginServiceList.size() - 1);
}
/**
* Create contents of the dialog
* @param parent
*/
@Override
protected Control createDialogArea(Composite parent) {
Composite area = (Composite) super.createDialogArea(parent);
Composite container = new Composite(area, SWT.NONE);
final GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 2;
container.setLayout(gridLayout);
container.setLayoutData(new GridData(GridData.FILL_BOTH));
final Label label = new Label(container, SWT.NONE);
label.setText("用戶名");
userNameText = new Text(container, SWT.BORDER);
final GridData gd_userNameText = new GridData(SWT.FILL, SWT.CENTER, true, false);
userNameText.setLayoutData(gd_userNameText);
final Label label_1 = new Label(container, SWT.NONE);
label_1.setText("密 碼");
passwordText = new Text(container, SWT.BORDER);
final GridData gd_passwordText = new GridData(SWT.FILL, SWT.CENTER, true, false);
passwordText.setLayoutData(gd_passwordText);
setTitle("歡迎登錄");
setMessage("請輸入用戶名和密碼");
//
return area;
}
/**
* Create contents of the button bar
* @param parent
*/
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, IDialogConstants.OK_ID, "登錄",
true);
createButton(parent, IDialogConstants.CANCEL_ID,
"取消", false);
}
/**
* Return the initial size of the dialog
*/
@Override
protected Point getInitialSize() {
return new Point(359, 221);
}
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText("歡迎登錄");
}
protected void buttonPressed(int buttonId) {
if (buttonId == IDialogConstants.OK_ID) {
if(!doLogin()) {
setErrorMessage("用戶名或密碼錯誤!");
return;
}
}
}
private boolean doLogin() {
String userName = userNameText.getText().trim();
String password = passwordText.getText().trim();
if(loginService == null) {
System.out.println("登錄服務不可用!");
return false;
}
boolean success = loginService.login(userName, password);
if(success)
System.out.println("登錄成功!");
else
System.out.println("登錄失敗!");
return success;
}
MANIFEST.MF文件內容爲:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: StartLoginBundle Plug-in
Bundle-SymbolicName: StartLoginBundle
Bundle-Version: 1.0.0
Bundle-Activator: org.vwpolo.login.service.StartLoginActivator
Import-Package: org.eclipse.jface,
org.eclipse.jface.dialogs,
org.eclipse.jface.window,
org.eclipse.swt,
org.eclipse.swt.events,
org.eclipse.swt.graphics,
org.eclipse.swt.layout,
org.eclipse.swt.widgets,
org.osgi.framework;version="1.3.0",
org.osgi.util.tracker;version="1.3.3",
org.vwpolo.services
Eclipse-LazyStart: true
Export-Package: org.vwpolo.login.service