Eclipse UI Forms – Hinzufügen eines Textfeldes mit einer Scrollbar

Februar 1, 2009

FormToolkit toolkit= new FormToolkit ( composite.getDisplay() );

Text textField= toolkit.createText ( newMessageFieldsComposite, „“,  SWT.MULTI | SWT.V_SCROLL );

Editierbare Tabellen – Löschen, Hinzufügen, Ändern von Elementen

Februar 1, 2009

Bei diesen Operationen muss man (create/update/delete kurz crud)

1.) das Objekt aus dem Modell cruden

modell.add/remove(yourObject)

2.) das Objekt aus der Tabelle entfernen

tableViewer.remove ( yourObject);

oder

tableViewer.add ( yourObject);

oder

tableViewer.update(yourObject, String[] properties);

//die Properties, die sich verändert haben, oder null für unbekannt

RCP – Klapp ein, Klapp aus – Bestandteile der GUI aus- und einblenden

Dezember 21, 2008

Section expandableSection= toolkit.createSection ( composite, Section.EXPANDED |  Section.TITLE_BAR | Section.TWISTIE | Section.EXPANDED | Section.DESCRIPTION );
expandableSection.setText(„Titel“);
expandableSection.setDescription ( „Beschreibung“ );
MyComposite composite= new MyComposite(expandableSection);

//+setClient bestimmt welche Komponente angezeigt wird, sobald ausgeklappt wird

expandableSection.setClient ( composite);

//+reflow berechnet das Layout neu; dieses muss gemacht werden, sobald eine expansion statt findet
expandableSection.addExpansionListener( new ExpansionAdapter() {
public void expansionStateChanged( ExpansionEvent e ) {
managedForm.reflow( true );
}
} );

//—————oder so————————
ExpandableComposite exp= toolkit.createExpandableComposite(composite,
ExpandableComposite.TWISTIE|
ExpandableComposite.CLIENT_INDENT);
exp.setText(„Titel“);
MyComposite composite = new MyComposite(exp);

//+setClient bestimmt welche Komponente angezeigt wird, sobald ausgeklappt wird
exp.setClient(composite);

//+reflow berechnet das Layout neu; dieses muss gemacht werden, sobald eine Expansion statt findet
exp.addExpansionListener(new ExpansionAdapter() {
public void expansionStateChanged(ExpansionEvent e) {
managedForm.reflow(true);
}
});

No ‘jboss’ MBeanServer found

Dezember 17, 2008

Diese Fehlermeldung kommt unter bestimmten Umständen, wenn man listBindings(„“) macht:

java.lang.IllegalStateException: No ‘jboss’ MBeanServer found!
at org.jboss.mx.util.MBeanServerLocator.locateJBoss(MBeanServerLocator.java:122)
at org.jboss.ejb.plugins.keygenerator.hilo.HiLoKeyGeneratorFactory.readResolve(HiLoKeyGeneratorFactory.java:420)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)

Die Bedeutung ist, dass irgendeine Komponente auf den Client geholt wird, die dann beim (unmarshalen) auf dem Client eine bestimmte Server Komponente braucht (z.B. den jboss-MBeanServer). Diese Server Komponente gibt es aber natürlich auf dem Client nicht. So weit ich weiß ist z.B. der HiLoKeyGeneratorFactory eine Komponente für die Datenbank (eben um Schlüssel zu generieren) – die Datenbank hat aber auf dem Client nichts zu suchen. Da macht es: ZACK!

Save on close – Inhalt einer View automatisch bei beenden speichern

Dezember 16, 2008

Ich benütze für dieses Mal eine Online-Source-Datenbank (hier kickjava.com).

Hier kann man den Sourcecode von Java-Klassen schön formatiert und meistens verlinkt betrachten.

Die Syntax ist recht einfach, so dass man schnell eigenen Anfragen über die URL starten kann:

z.B. http://kickjava.com/src/org/eclipse/ui/internal/EditorManager.java.htm

org.eclipse.ui.internal.WorkbenchPage

public void hideView(IViewReference ref) {

….

if (view instanceof ISaveablePart){
ISaveablePart saveable = (ISaveablePart)view;
if (saveable.isSaveOnCloseNeeded()) {
IWorkbenchWindow window = view.getSite().getWorkbenchWindow();
boolean success = EditorManager.saveAll(Collections.singletonList(view), true, true, false, window);
if (!success) {
// the user cancelled.
return;
}
promptedForSave = true;
}
}
}

….

nun das org.eclipse.ui.internal.EditorManager.saveAll


979 public boolean saveAll(boolean confirm, boolean closing, boolean addNonPartSources) {

980 // Get the list of dirty editors and views. If it is
981
// empty just return.
982
ISaveablePart[] parts = page.getDirtyParts();
983 if (parts.length == 0) {
984 return true;
985 }
986 // saveAll below expects a mutable list
987
List JavaDoc dirtyParts = new ArrayList JavaDoc(parts.length);
988 for (int i = 0; i < parts.length; i++) {
989 dirtyParts.add(parts[i]);
990 }
991
992 // If confirmation is required ..
993
return saveAll(dirtyParts, confirm, closing, addNonPartSources, window);
994 }
995

Also alle, die dirty sind werden abgespeichert.

Zusammenfassend:

Das Interface ISaveablePart implementieren

isSaveOnCloseNeeded implementieren

isDirty implementieren

(wenn isDirty true zurückgibt, dann erscheint ein kleines Sternchen neben der Tab-Überschrift, so wie man es von Eclipse-Editoren kennt, in denen man editiert hat)

Eclipse Error: The type java.lang.Object cannot be resolved

November 25, 2008

Diesen Fehler bekam ich (nachdem ich eine Menge Sachen mit Eclipse gemacht hatte – und es deswegen auch einmal neu starten musste – genaue Ursache aber unbekannt).

Folgende Dinge habe ich gemacht – und danach ging es wieder – leider kann ich nicht genau ermitteln, wie ich diesen Fehler beseitigt habe:

1.) JDK überprüft

2.) Projekte gelöscht (nicht auf Disk), die ich in verschiedenen Versionen öfter hatte

3.) Alle Build-Path-Fehler beseitigt

4.) Clean und Refresh

5.) Neu-Starten

Ich weiß nicht welcher dieser Vorgänge das Problem gelöst hat, da ich sie immer wieder neu kombiniert habe. Aber einer war dabei – und vielleicht kann ich das das nächste Mal noch besser einkreisen.

Wie finde ich die Sourcen zu einem Jar (jboss)

November 24, 2008

Nachdem ich die letzte Zeit nach den Sourcen von jboss-deployers-impl.jar gesucht habe, habe ich das heute mal einfach bei google eingegeben. Und zwar nicht nur die Klasse MainDeployerImpl.java die ich gesucht habe, sondern den Namen der .jar-Datei

Unter der URL http://repository.jboss.com/maven2/org/jboss/deployers/jboss-deployers-impl/2.0.0.CR5/

gibt es die Datei zum herunterladen und unter:

http://repository.jboss.com/maven2/ den ganzen jboss im source-tree

Endlich

Was geschieht beim Deployment eines VirtualFiles

November 24, 2008

VFSScanner.add(Profile, VirtualFile) / VFSScanner.remove(Profile, String name)

Wir untersuchen das add(..) – das remove geht analog.

diese sind in folgender Unterklasse implementiert:

Hier ein Link zum JBoss Deployment Framework

system/org.jboss.system.server.profileservice.DeploymentPhaseVFSScanner (jeder Scanner ist einer Phase zugeordnet -Bootstrap, Deployer, Application)

hier wird aus dem File ein org.jboss.deployers.vfs.spi.client.VFSDeployment Objekt gemacht und dieses zum Profile hinzugefügt (in der Phase Application).

system/org.jboss.system.server.profile.basic.MetaDataAwareProfile extends system/org.jboss.system.server.profile.basic.ProfileImpl

In den Profiles sind alle Deployments eingetragen (Name -> Deployment) für jede Phase:

private LinkedHashMap<String, VFSDeployment> bootstraps = new LinkedHashMap<String, VFSDeployment>();
private LinkedHashMap<String, VFSDeployment> applications = new LinkedHashMap<String, VFSDeployment>();
private LinkedHashMap<String, VFSDeployment> deployers = new LinkedHashMap<String, VFSDeployment>();

Diese werde benützt von:

system/org.jboss.system.server.profileservice.ProfileServiceBootstrap.loadProfile(String name) -> name ist default (wenn ich es auf minimal setze, werden trotzdem die Files im Verzeichnis server/default/deploy geladen) – ich sehe auch nirgends, wo dieses Feld gesetzt werden kann – immer nur der Wert „default“

in loadProfile werden folgende Schritte gemacht (für alle Application-Deployments):

org.jboss.deployers.client.spi.DeployerClient.MainDeployer.add (jedes Deployment)

MainDeployer.process();

MainDeployer.checkComplete();

da MainDeployer nur ein Interface ist, schauen wir uns die Klasse:

org.jboss.deployers.plugins.main.MainDeployerImpl

addDeployment (…) hier werden auch die DeploymentKontexte überprüft

process() –> deployers.process(deployContexts, undeployContexts);

wir suchen nach deployers:

org.jboss.deployers.spi.deployer.Deployers.process(deployContexts, undeployContexts);

jetzt noch die Implementierung:

org.jboss.deployers.plugins.deployers.DeployersImpl.process

AbstractVFSDeploymentContext( – für .war/oder directories) wird in einen org.jboss.deployers.plugins.deployers.DeploymentControllerContext eingepackt

AbstractKernelController.install(deploymentControllerContext) ist implementiert in

jboss-kernel/org.jboss.dependency.plugins.AbstractController (DeploymentControllerContext)

Diesen sehr interessanten Stacktrace bekomme ich bei einem Deployment Fehler (allerdings ein .war)

(…)

at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3887)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4370)
at tomcat/org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeployInternal(TomcatDeployment.java:352)
at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeploy(TomcatDeployment.java:140)

server/org.jboss.web.deployers.AbstractWarDeployment.start(AbstractWarDeployment.java:459)
server/org.jboss.web.deployers.WebModule.startModule(WebModule.java:118)
server/org.jboss.web.deployers.WebModule.start(WebModule.java:96)
(reflect…)

mbeans/org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:157)
mbeans/org.jboss.mx.server.Invocation.dispatch(Invocation.java:96)
mbeans/org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
mbeans/org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
jmx/org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668)
system-jmx/org.jboss.system.microcontainer.ServiceProxy.invoke(ServiceProxy.java:206)
at $Proxy36.start(Unknown Source)

system-jmx/org.jboss.system.microcontainer.StartStopLifecycleAction.installAction (StartStopLifecycleAction.java:42)

org.jboss.system.microcontainer.ServiceControllerContextAction.installAction(ServiceControllerContextAction.java:1)

jboss-dependency/org.jboss.dependency.plugins.action.SimpleControllerContextAction.

simpleInstallAction(SimpleControllerContextAction.java:62)

jboss-dependency/org.jboss.dependency.plugins.action.AccessControllerContextAction.install

(AccessControllerContextAction.java:71)

jboss-dependency/org.jboss.dependency.plugins.AbstractControllerContextActions.install

(AbstractControllerContextActions.java:51)
jboss-dependency/org.jboss.dependency.plugins.AbstractControllerContext.install

(AbstractControllerContext.java:348)
system-jmx/org.jboss.system.microcontainer.ServiceControllerContext.install

(ServiceControllerContext.java:286)
jboss-dependency/org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1598)
jboss-dependency/org.jboss.dependency.plugins.AbstractController.incrementState

(AbstractController.java:934)
jboss-dependency/org.jboss.dependency.plugins.AbstractController.resolveContexts

(AbstractController.java:1062)
jboss-dependency/org.jboss.dependency.plugins.AbstractController.resolveContexts

(AbstractController.java:984)
jboss-dependency/org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
jboss-dependency/org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
system-jmx/at org.jboss.system.ServiceController.doChange(ServiceController.java:672)
system-jmx/at org.jboss.system.ServiceController.start(ServiceController.java:444)
system-jmx/org.jboss.system.deployers.ServiceDeployer.start(ServiceDeployer.java:146)
at org.jboss.system.deployers.ServiceDeployer.deploy(ServiceDeployer.java:104)
at org.jboss.system.deployers.ServiceDeployer.deploy(ServiceDeployer.java:1)
at org.jboss.deployers.spi.deployer.helpers.AbstractSimpleRealDeployer.internalDeploy(AbstractSimpleRealDeployer.java:62)
at org.jboss.deployers.spi.deployer.helpers.AbstractRealDeployer.deploy(AbstractRealDeployer.java:50)
at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:169)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1285)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1003)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1024)
at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:944)
at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1598)
at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1062)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:627)
at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:541)
at org.jboss.system.server.profileservice.ProfileServiceBootstrap.loadProfile(ProfileServiceBootstrap.java:270)
at org.jboss.system.server.profileservice.ProfileServiceBootstrap.start(ProfileServiceBootstrap.java:144)
at org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.java:409)
at org.jboss.Main.boot(Main.java:213)
at org.jboss.Main$1.run(Main.java:552)
at java.lang.Thread.run(Unknown Source)

Besonders interessant finde ich auch die Klasse org.jboss.deployers.plugins.main.MainDeployerImpl - diese finde ich aber leider nirgends in den von mir runtergeladenen jboss-sourcen.

So ich behalte das mal als Denkansatz und dann geht es im nächsten Blog-Eintrag weiter – dieser ist eh schon so unübersichtlich, dass ich das Ziel aus den Augen verloren habe (aber eine Menge dazugelernt :) )

Erster JBoss-Bug gefunden – Ein Grund zu feiern

November 19, 2008

Heute habe ich den ersten Fehler im neuen JBoss AS 5 CR2 gefunden (also den ersten für mich). In der Klasse ProfileServiceBootstrap – ich hab es sofort an die Entwickler geschrieben – und mittlerweile ist es korrigiert. Das ist mein erster offizieller Beitrag zu JBoss.

Hier noch der alte Code mit Hinweis auf den Fehler:

if(profileService == null)
throw new IllegalStateException(„The ProfileService has not been injected“);
log.debug(„Using ProfileService: “ + profileService);
if(profileService == null)  <<<<< I think this should be the mainDeployer
throw new IllegalStateException(„The MainDeployer has not been injected“);

Es ist beeindruckend, wie schnell OpenSource funktioniert. Ich habe den Fehler um 0.10 gemeldet, erstes Feedback um  0.15 und er war um 01.24 korrigiert.

Empfehlung für Tutorials – LaLiLuna

November 15, 2008

Auf Laliluna habe ich schöne Tutorials gefunden – sogar in 3 Sprachen

http://www.laliluna.de/ejb-3-tutorial-jboss.html


Follow

Get every new post delivered to your Inbox.