FormToolkit toolkit= new FormToolkit ( composite.getDisplay() );
Text textField= toolkit.createText ( newMessageFieldsComposite, „“, SWT.MULTI | SWT.V_SCROLL );
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
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!
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
dirtyParts = new ArrayList
(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)
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.
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
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
)
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.
Auf Laliluna habe ich schöne Tutorials gefunden – sogar in 3 Sprachen
http://www.laliluna.de/ejb-3-tutorial-jboss.html