/*
*------------------------------------------------------------------------------
* Copyright (C) 2006-2012 University of Dundee & Open Microscopy Environment.
* 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.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*------------------------------------------------------------------------------
*/
package org.openmicroscopy.shoola.examples.data;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.openmicroscopy.shoola.env.Container;
import org.openmicroscopy.shoola.env.LookupNames;
import org.openmicroscopy.shoola.env.config.Registry;
import org.openmicroscopy.shoola.env.data.AdminService;
import org.openmicroscopy.shoola.env.data.OmeroDataService;
import org.openmicroscopy.shoola.env.data.OmeroImageService;
import org.openmicroscopy.shoola.env.data.events.ActivateAgents;
import org.openmicroscopy.shoola.env.data.events.ConnectedEvent;
import org.openmicroscopy.shoola.env.data.events.ExitApplication;
import org.openmicroscopy.shoola.env.data.events.ViewInPluginEvent;
import org.openmicroscopy.shoola.env.data.login.LoginService;
import org.openmicroscopy.shoola.env.data.login.UserCredentials;
import omero.gateway.SecurityContext;
import org.openmicroscopy.shoola.env.event.AgentEvent;
import org.openmicroscopy.shoola.env.event.AgentEventListener;
import omero.gateway.model.ExperimenterData;
import omero.gateway.model.GroupData;
import omero.gateway.model.ImageData;
/**
* Connect to OMERO w/o splash-screen. The credentials might have already
* been stored locally.
* This example shows how to
* - connect
* - retrieve images given a collection of ids.
* - retrieve the thumbnails
* - retrieve the raw data.
*
* Note that the example directly uses the service, to load the data
* asynchronously, you could use the service view.
*
* @author Jean-Marie Burel
* <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a>
* @since 4.4
*/
public class LoginHeadless
implements AgentEventListener
{
LoginHeadless(boolean withUI)
{
String homeDir = "";
Container container = null;
try {
container = Container.startupInHeadlessMode(homeDir, null,
LookupNames.KNIME);
} catch (Exception e) {
e.printStackTrace();
}
Registry reg = container.getRegistry();
LoginService svc = (LoginService) reg.lookup(LookupNames.LOGIN);
UserCredentials uc = new UserCredentials("root", "omero",
"localhost", UserCredentials.HIGH);
int value = svc.login(uc);
if (value == LoginService.CONNECTED) {
System.err.println("connected");
//For testing purpose. Now start the UI if required.
if (withUI) reg.getEventBus().post(new ActivateAgents());
//List
AdminService adminSvc = reg.getAdminService();
//If you need information about the user.
ExperimenterData exp = adminSvc.getUserDetails();
//All the groups the user is member of
Collection<GroupData> groups = adminSvc.getAvailableUserGroups();
System.err.println(groups);
//The user is logged into his/her default group.
//Security Context is mainly for now only using the group
// idea is to support multi-server.
long groupId = exp.getDefaultGroup().getId();
SecurityContext ctx = new SecurityContext(groupId);
List<Long> imageIds = new ArrayList<Long>();
//Retrieve the image.
//To be modified.
imageIds.add(122L);
imageIds.add(151L);
OmeroDataService dataSvc = reg.getDataService();
OmeroImageService imgSvc = reg.getImageService();
try {
//1 Load images knowing image's id.
Set images = dataSvc.getImages(ctx, ImageData.class, imageIds,
-1);
System.err.println("images:"+images.size());
//Retrieve the thumbnails. This method should probably be
//cleaned up since in that case we have to specify the pixels
//historically we could have more than one pixels ID per image
Iterator i = images.iterator();
List<Long> pixels = new ArrayList<Long>();
ImageData img;
while (i.hasNext()) {
img = (ImageData) i.next();
pixels.add(img.getDefaultPixels().getId());
}
//2. Load thumbnails with maximum size of 96.
//The aspect ratio is respected if the image is not square.
/*
Map<Long, BufferedImage> thumbnails =
imgSvc.getThumbnailSet(ctx, pixels, 96);
System.err.println("thumbnails:"+thumbnails.size());
*/
//3. Raw data access. To get a given plane.
/*
int z = 0, t = 0, c = 0;
byte[] plane = imgSvc.getPlane(ctx, pixels.get(0), z, t, c);
System.err.println("plane:"+plane.length);
*/
} catch (Exception e) {
e.printStackTrace();
}
//4. Listen to selection
reg.getEventBus().register(this, ViewInPluginEvent.class);
//Listen to the disconnect.
reg.getEventBus().register(this, ConnectedEvent.class);
//when you done need to exit. so session is closed.
//This should be used when the UI is not activated.
ExitApplication a = new ExitApplication(false);
a.setSecurityContext(new SecurityContext(groupId));
if (!withUI) reg.getEventBus().post(a);
}
}
/**
* Listen to events posted on the event bus.
*/
public void eventFired(AgentEvent e) {
//we are now disconnected
if (e instanceof ConnectedEvent) {
//Exit in that case, do not do that when really used as a plugin.
//valid in the context of that demo.
ConnectedEvent evt = (ConnectedEvent) e;
if (!evt.isConnected()) System.exit(0);
} else if (e instanceof ViewInPluginEvent) {
ViewInPluginEvent evt = (ViewInPluginEvent) e;
System.err.println(evt.getPlugin() == LookupNames.KNIME);
//Could be image/dataset/project etc.
//whatever we decide to turn on. At the moment only
//images.
System.err.println(evt.getDataObjects());
}
}
public static void main(String[] args)
{
boolean ui = false;
if (args != null && args.length > 0) {
String v;
for (int i = 0; i < args.length; i++) {
v = args[i];
if (v != null) {
v = v.trim().toLowerCase();
if (v.equals("true") || v.equals("t")) {
ui = true;
break;
}
}
}
}
new LoginHeadless(ui);
}
}