/*
* Copyright to the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.rioproject.serviceui;
import net.jini.core.entry.Entry;
import net.jini.core.lookup.ServiceItem;
import net.jini.lookup.entry.UIDescriptor;
import net.jini.lookup.ui.attribute.UIFactoryTypes;
import net.jini.lookup.ui.factory.JComponentFactory;
import javax.swing.*;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;
/**
* The UILoader class is a helper for use with the ServiceUI
*
* @author Dennis Reedy
*/
public class UILoader {
/**
* This method returns an array JComponents from a UIDescriptor that contain
* an JComponentFactory for a given role
*
* @param role The role to use
* @param serviceItem The ServiceItem to use
*
* @return An array of JComponents
*/
@SuppressWarnings("unchecked")
public static JComponent[] loadUI(String role, ServiceItem serviceItem) {
try {
int attrCount = serviceItem.attributeSets.length;
Entry[] attr = serviceItem.attributeSets;
List<UIDescriptor> list = new ArrayList<UIDescriptor>();
for(int i = 0; i < attrCount; ++i) {
if(attr[i] instanceof UIDescriptor) {
UIDescriptor desc = (UIDescriptor)attr[i];
if(desc.attributes == null) {
continue;
}
if(!desc.role.equals(role)) {
continue;
}
for (Object attribute : desc.attributes) {
if (attribute instanceof UIFactoryTypes) {
UIFactoryTypes factoryTypes =
(UIFactoryTypes) attribute;
boolean found;
found = factoryTypes.isAssignableTo(
JComponentFactory.class);
if (found) {
// Should also look through required packages
// here
list.add(desc);
}
}
}
}
}
List factoryList = new ArrayList();
for (UIDescriptor desc : list) {
Object uiFactory;
try {
uiFactory =
desc.getUIFactory(serviceItem.service
.getClass().getClassLoader());
if (uiFactory instanceof JComponentFactory)
factoryList.add(uiFactory);
} catch (ClassNotFoundException e) {
System.out.println(
"Class not found. Could not unmarshall " +
"the UI factory.");
e.printStackTrace();
}
}
JComponent[] jComponents = new JComponent[factoryList.size()];
for(int i = 0; i < factoryList.size(); i++) {
JComponentFactory factory =
(JComponentFactory)factoryList.get(i);
jComponents[i] = factory.getJComponent(serviceItem);
}
return (jComponents);
} catch(MalformedURLException e) {
e.printStackTrace();
} catch(IOException e) {
e.printStackTrace();
}
return (new JComponent[0]);
}
/**
* This method returns an array of UI Factories that have been loaded from
* each <code>UIDescriptor</code> found. This method will return all
* <code>UIDescriptor</code> entries regardless of their role or factory
* type
*
* @param serviceItem The ServiceItem to load
* @return An array of loaded ui objects
*/
@SuppressWarnings("unchecked")
public static Object[] loadUI(ServiceItem serviceItem) {
try {
int attrCount = serviceItem.attributeSets.length;
Entry[] attr = serviceItem.attributeSets;
List<UIDescriptor> list = new ArrayList<UIDescriptor>();
for(int i = 0; i < attrCount; ++i) {
if(attr[i] instanceof UIDescriptor) {
UIDescriptor desc = (UIDescriptor)attr[i];
if(desc.attributes == null) {
continue;
}
for (Object attribute : desc.attributes) {
if (attribute instanceof UIFactoryTypes) {
// Should also look through required packages here
list.add(desc);
}
}
}
}
List factoryList = new ArrayList();
for (UIDescriptor desc : list) {
Object uiFactory;
try {
uiFactory = desc.getUIFactory(serviceItem.service
.getClass().getClassLoader());
factoryList.add(uiFactory);
} catch (ClassNotFoundException cnfe) {
System.out.println(
"Class not found. Could not unmarshall " +
"the UI factory.");
cnfe.printStackTrace();
}
}
return (factoryList.toArray());
} catch(MalformedURLException e) {
e.printStackTrace();
} catch(IOException e) {
e.printStackTrace();
}
return (new Object[0]);
}
}