1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | public void doBinding(XUINode resource, XUI xui) throws XUIBindingException, MalformedURLException, IOException { if(resource.getAttributeValue("type").equals("java")) { String className = resource.getAttributeValue("class"); String aURLString = resource.getAttributeValue("uri"); URL url = null; // get the url ... if it's not a valid URL, then try and grab // it as a relative URL (i.e. java.io.File). If that fails // re-throw the exception, it's toast try { url = new URL("jar:" + aURLString + "!/"); } catch (MalformedURLException mue) { String s = "jar:file://" + new File(aURLString) .getAbsolutePath().replace("\\", "/") + "!/"; url = new URL(s); if(url == null) { // it really was malformed after all throw new MalformedURLException("Couldn't bind to: " + aURLString); } } // get a jar connection JarURLConnection jarConnection = (JarURLConnection)url.openConnection(); // get the jar file JarFile jarFile = jarConnection.getJarFile(); // jar files have entries. Cycle through the entries until finding // the class sought after. Enumeration entries = jarFile.entries(); // the class that will be the entry point into the model JarEntry modelClassEntry = null; Class modelClass = null; XUIClassLoader xuiLoader = new XUIClassLoader(this.getClass().getClassLoader()); while(entries.hasMoreElements()) { JarEntry remoteClass = (JarEntry)entries.nextElement(); // load the classes if(remoteClass.getName().endsWith(".class")) { // have to get the second last word between period marks. This // is because the convention allows for: // org.purnamaproject.xui.XUI // that is, the periods can represent packages. StringTokenizer st = new StringTokenizer(remoteClass.getName(), "."); String previousToken = st.nextToken(); String currentToken = ""; String nameOfClassToLoad = previousToken; while(st.hasMoreTokens()) { currentToken = st.nextToken(); if(currentToken.equals("class")) nameOfClassToLoad = previousToken; else { nameOfClassToLoad += currentToken; } } // get an output stream (byte based) attach it to the //inputstream from the jar file based on the jar entry. ByteArrayOutputStream baos = new ByteArrayOutputStream(); InputStream is = jarFile.getInputStream(remoteClass); final byte[] bytes = new byte[1024]; int read = 0; while ((read = is.read(bytes)) >= 0) { baos.write(bytes, 0, read); } Class c = xuiLoader.getXUIClass(nameOfClassToLoad, baos); // check for the class that has the init method. if(remoteClass.getName().equals(className + ".class")) { modelClassEntry = remoteClass; modelClass = c; } } else { String imageNameLowerCase = remoteClass.getName().toLowerCase(); if(imageNameLowerCase.endsWith(".jpeg") || imageNameLowerCase.endsWith(".jpg") || imageNameLowerCase.endsWith(".gif") || imageNameLowerCase.endsWith(".png")) { // add resources (images) XUIResources.getInstance().addResource(remoteClass, jarFile); } } } // now instantiate the model. try { // create a new instance of this class Object o = modelClass.newInstance(); // get the method called 'init'. This is part of the API // requirement Method m = modelClass.getMethod("init", new Class[] {XUI.class}); // at last, call the method up. m.invoke(o, new Object[] {xui}); } catch(InstantiationException ie) { ie.printStackTrace(); } catch(IllegalAccessException iae) { iae.printStackTrace(); } catch(NoSuchMethodException nsm) { nsm.printStackTrace(); } catch(InvocationTargetException ite) { System.out.println(ite.getTargetException()); ite.printStackTrace(); } } else { throw new XUIBindingException( "This platform/API requires Java libraries."); } } |
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |