Thank you very much for your answers.

I think with Jürgen's code corrections and the existing script provider for ooRexx I can go on with the further development on my own. If not I know where to ask :)

Thanks again,
-Rainer Hahnekamp

Am Mittwoch, den 07.09.2005, 10:04 +0200 schrieb Jürgen Schmidt:
Hi Rainer,

Rainer Hahnekamp wrote:
> Hi Jürgen,
> 
> thanks for your answer. According to my version of the developer's guide
> there is no need for a function named _getComponentFactory. Maybe I
> misunderstood something here...

no you didn't misunderstood the guide. _getComponentFactory is the newer 
suggested way to go because it uses a component context. For creating a 
new instance of a service you should use XMultiCompopnentFactory instead 
of XMultiServiceFactory. But the old __getServiceFactory should work 
also as well as XMultiServiceFactory. This is documented in the latest 
version of the DevGuide which of course is not online until now. But i 
will update it after my vacation.

But you have two errors in your code, see below ...

> For a better understanding I'm posting my 3 classes. As you can see
> there is no "real" language implemented. That's because I just want to
> try if I can get that thing working.
> ---------------------------
> import com.sun.star.uno.Type;
> import com.sun.star.uno.Any;
> import com.sun.star.lang.IllegalArgumentException;
> import com.sun.star.lang.WrappedTargetException;
> import com.sun.star.reflection.InvocationTargetException;
> import com.sun.star.script.CannotConvertException;
> 
> import com.sun.star.script.provider.XScriptContext;
> import com.sun.star.script.provider.XScript;
> import com.sun.star.script.provider.ScriptFrameworkErrorException;
> import com.sun.star.script.provider.ScriptFrameworkErrorType;
> 
> import com.sun.star.script.framework.provider.ClassLoaderFactory;
> import com.sun.star.script.framework.container.ScriptMetaData;
> 
> public class _javascript_ implements XScript {
> 	private XScriptContext xScriptContext;
> 	private ScriptMetaData scriptMetaData;
> 	
> 	public _javascript_(XScriptContext xsc, ScriptMetaData smd) {
> 		this.xScriptContext = xsc;
> 		this.scriptMetaData = smd;
> 	}
> 	public Object invoke(Object[] aParams, short[][] aOutParamIndex, Object[][] aOutParam) throws com.sun.star.script.provider.ScriptFrameworkErrorException, com.sun.star.reflection.InvocationTargetException {
> 		aOutParamIndex[0] = new short[0];
> 		aOutParam[0] = new Object[0];
> 		
> 		ClassLoader cl = null;
> 		try {
> 			cl = ClassLoaderFactory.getURLClassLoader(scriptMetaData);
> 		}
> 		catch (java.lang.Exception e) {
> 			throw new ScriptFrameworkErrorException(e.getMessage(), null, scriptMetaData.getLanguageName(), scriptMetaData.getLanguage(), ScriptFrameworkErrorType.UNKNOWN);
> 		}
> 		scriptMetaData.loadSource();
> 		String source = scriptMetaData.getSource();
> 		Any result = null;
> 		if (result == null) {
> 			return new Any(new Type(), null);
> 		}
> 		else {
> 			return result;
> 		}
> 	}
> }
> ---------------------------
> import com.sun.star.script.framework.provider.ScriptEditor;
> import com.sun.star.script.provider.XScriptContext;
> import com.sun.star.script.framework.container.ScriptMetaData;
> 
> import javax.swing.*;
> 
> public class ScriptEditorForJava implements ScriptEditor {
> 	public Object execute() throws Exception {
> 		return null;
> 	}
> 	public void indicateErrorLine(int lineNum) {
> 		return;
> 	}
> 	public void edit(XScriptContext context, ScriptMetaData entry) {
> 		JFrame frame = new JFrame();
> 		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
> 		JTextArea ts = new JTextArea();
> 		entry.loadSource();
> 		ts.setText(entry.getSource());
> 		
> 		frame.getContentPane().add(ts);
> 		frame.setSize(400, 400);
> 		frame.show();
> 	}
> 	
> 	public String getTemplate() {
> 		return "the code for _javascript_";
> 	}
> 	
> 	public String getExtension() {
> 		return "y1";
> 	}
> }
> ---------------------------
> import com.sun.star.uno.XComponentContext;
> import com.sun.star.lang.XMultiServiceFactory;
> import com.sun.star.lang.XSingleServiceFactory;
> import com.sun.star.registry.XRegistryKey;
> import com.sun.star.comp.loader.FactoryHelper;
> import com.sun.star.lang.XServiceInfo;
> import com.sun.star.lang.XInitialization;
> 
> import com.sun.star.script.provider.ScriptFrameworkErrorException;
> import com.sun.star.script.provider.XScriptContext;
> import com.sun.star.script.provider.XScript;
> import com.sun.star.script.framework.provider.ScriptProvider;
> import com.sun.star.script.framework.provider.ScriptEditor;
> import com.sun.star.script.framework.container.ScriptMetaData;
> 
> public class ScriptProviderForJava {
> public static class _ScriptProviderForJava extends ScriptProvider {
> 	public _ScriptProviderForJava(XComponentContext ctx) {
> 		super(ctx, "Java");
> 	}
> 	public XScript getScript(String scriptURI) throws com.sun.star.uno.RuntimeException, ScriptFrameworkErrorException {
> 		_javascript_ script = null;
> 		try {
> 			ScriptMetaData scriptMetaData = getScriptData(scriptURI);
> 			XScriptContext xScriptContext = getScriptingContext();
> 			script = new _javascript_(xScriptContext, scriptMetaData);
> 		}
> 		catch (com.sun.star.uno.Exception e) {
> 			System.err.println("Failed to get script: " + scriptURI);
> 		}
> 		
> 		return script;
> 	}
> 	public boolean hasScriptEditor() {
> 		return true;
> 	}
> 	public ScriptEditor getScriptEditor() {
> 		return new ScriptEditorForJava();
> 	}
> }
> public static XSingleServiceFactory _getServiceFactory(String implName, XMultiServiceFactory multiFactory, XRegistryKey regKey) {
it should be __getServiceFactory with two underscores
> 	XSingleServiceFactory xSingleServiceFactory = null;
> 	if(implName.equals(ScriptProviderForJava._ScriptProviderForJava.class.getName())) {
> 		xSingleServiceFactory = FactoryHelper.getServiceFactory(ScriptProviderForJava._ScriptProviderForJava.class, "com.sun.star.script.provider.ScriptProviderForJava", multiFactory, regKey);
> 	}
> 	return xSingleServiceFactory;
> 	}
> public static boolean __writeRegistryServiceInfo(XRegistryKey regKey) {
> 	String impl = "ScriptProviderForJava$_ScriptProvderForJava";
a type in the string, better you use
String impl = _ScriptProvderForJava.class.geTName();
That has the advantage that it works for Java 1.5 as well because Java 
has changed the class format in Java 1.5 and inner classes have changed.
Correct this twi erros and it shoudl work. I've tried to register at 
least the new built jar file and it worked fine.

Juergen

Reply via email to