Java tutorial
/* * Copyright 2008-2009 the original (zyc@hasor.net). * * 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.dev.toos.constcode.model; import java.io.InputStream; import java.util.ArrayList; import java.util.Hashtable; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import org.dev.toos.constcode.model.ConstGroup.FromType; import org.dev.toos.constcode.model.group.FileConstCodeGroup; import org.dev.toos.constcode.model.group.JARSourceConstCodeGroup; import org.dev.toos.internal.util.Message; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceVisitor; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.IJarEntryResource; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.internal.core.JarPackageFragmentRoot; /** * * @version : 2013-2-2 * @author (zyc@byshell.org) */ public class ConstModel { private static final String ResourceName = "/META-INF/core-codes.xml"; // private IJavaProject javaProject = null; private boolean isLoadedLibrary = false; private Map<String, ConstGroup> constGroupMap = new Hashtable<String, ConstGroup>(); private List<ConstGroup> constGroupList = new ArrayList<ConstGroup>(); private ConstGroup currentGroup = null; // // // /**ConstCodeModel*/ public ConstModel(IJavaProject javaProject) { this.javaProject = javaProject; } /**???*/ public String getProjectName() { return this.javaProject.getElementName(); } /**?*/ public IJavaProject getProject() { return this.javaProject; } /**?*/ public String getTitle() { return "(" + this.getProjectName() + ")"; } /**?*/ public void initLoad(IProgressMonitor monitor) throws CoreException { IJavaElement[] javaElements = this.javaProject.getChildren(); if (javaElements != null) { //A.??? Map<String, Object> findRes = new Hashtable<String, Object>(); for (int j = 0; j < javaElements.length; j++) { IJavaElement element = javaElements[j]; if (element instanceof JarPackageFragmentRoot == false) iterateItem(element, ResourceName, findRes); Message.updateTask(monitor, "scanning project ' " + javaProject.getElementName() + " '...", javaElements.length, j); } //B.? for (Entry<String, Object> ent : findRes.entrySet()) { String key = ent.getKey(); Object var = ent.getValue(); if (var instanceof IJarEntryResource) this.loadConst4Jar(key, (IJarEntryResource) var); else if (var instanceof IResource) this.loadConst4Res(key, (IResource) var); } } } /**?Source*/ public void cleanLibraryGroup() { this.isLoadedLibrary = false; ArrayList<ConstGroup> libGroup = new ArrayList<ConstGroup>(); for (ConstGroup group : constGroupList) if (group.getType() != FromType.Source) libGroup.add(group); for (ConstGroup group : libGroup) constGroupList.remove(constGroupMap.remove(group.getName())); } /**?*/ public void initLoadLibrary(IProgressMonitor monitor) throws CoreException { // IJavaElement[] javaElements = javaProject.getChildren(); if (javaElements != null) { //A.??? Map<String, Object> findRes = new Hashtable<String, Object>(); for (int j = 0; j < javaElements.length; j++) { IJavaElement element = javaElements[j]; if (element instanceof JarPackageFragmentRoot == true) iterateItem(element, ResourceName, findRes); Message.updateTask(monitor, "scanning project ' " + javaProject.getElementName() + " '...", javaElements.length, j); } //B.? for (Entry<String, Object> ent : findRes.entrySet()) { String key = ent.getKey(); Object var = ent.getValue(); if (var instanceof IJarEntryResource) this.loadConst4Jar(key, (IJarEntryResource) var); else if (var instanceof IResource) this.loadConst4Res(key, (IResource) var); } } this.isLoadedLibrary = true; } /**??*/ public void refresh(IProgressMonitor monitor) throws CoreException { //A. IJavaElement[] javaElements = javaProject.getChildren(); if (javaElements == null) { this.constGroupMap = new Hashtable<String, ConstGroup>(); this.constGroupList = new ArrayList<ConstGroup>(); } //B.??? Map<String, Object> findRes = new Hashtable<String, Object>(); for (int j = 0; j < javaElements.length; j++) { IJavaElement element = javaElements[j]; if (this.isLoadedLibrary == true) // iterateItem(element, ResourceName, findRes); else { //Src if (element instanceof JarPackageFragmentRoot == false) iterateItem(element, ResourceName, findRes); } Message.updateTask(monitor, "scanning project ' " + javaProject.getElementName() + " '...", javaElements.length, j); } /*----------------------------------------------*/ List<String> scanRes = null; List<String> nowRes = null; //C.?scanRes? scanRes = new ArrayList<String>(findRes.keySet()); nowRes = new ArrayList<String>(this.constGroupMap.keySet()); scanRes.removeAll(nowRes); for (String itemStr : scanRes) { Object resObj = findRes.get(itemStr); if (resObj instanceof IJarEntryResource) this.loadConst4Jar(itemStr, (IJarEntryResource) resObj); else this.loadConst4Res(itemStr, (IResource) resObj); } //D.?nowRes?? scanRes = new ArrayList<String>(findRes.keySet()); nowRes = new ArrayList<String>(this.constGroupMap.keySet()); nowRes.removeAll(scanRes); for (String itemStr : nowRes) { ConstGroup constGroup = this.constGroupMap.get(itemStr); this.constGroupMap.remove(itemStr); this.constGroupList.remove(constGroup); } //E. for (ConstGroup groupItem : this.constGroupList) groupItem.reloadData(); } public void save(IProgressMonitor monitor) { for (ConstGroup groupItem : this.constGroupList) { try { groupItem.beginSave(); groupItem.save(); groupItem.finishSave(); } catch (Throwable e) { Message.errorInfo("save Group error " + groupItem.getName() + ".", e); } } } /**??*/ public void setGroup(String groupName) { if (groupName == null || groupName.equals("")) { this.currentGroup = null; return; } this.currentGroup = this.constGroupMap.get(groupName); } /**?*/ public ConstGroup group(String groupName) { if (groupName == null) return null; return this.constGroupMap.get(groupName); } // // get/set // /**??XML?*/ public List<ConstGroup> getGroups() { return this.constGroupList; } /**??*/ public boolean isLoadedLibrary() { return isLoadedLibrary; } /**??*/ public ConstGroup getCurrentGroup() { return currentGroup; } // // ??...... // /**??*/ private void iterateItem(Object atElement, String resourceName, Map<String, Object> findRes) throws CoreException { if (atElement instanceof IFolder) { this.iterateIFolder((IFolder) atElement, resourceName, findRes); } else if (atElement instanceof IFile) { this.iterateIFile((IFile) atElement, resourceName, findRes); } else if (atElement instanceof IJavaElement) { this.iterateIJavaElement((IJavaElement) atElement, resourceName, findRes); } else if (atElement instanceof IJarEntryResource) { this.iterateIJarEntryResource((IJarEntryResource) atElement, resourceName, findRes); } } /**?*/ private void iterateIJavaElement(IJavaElement atElement, String resourceName, Map<String, Object> findRes) throws CoreException { if (atElement.exists() == false) return; switch (atElement.getElementType()) { /*package root*/ case IJavaElement.PACKAGE_FRAGMENT_ROOT: { IPackageFragmentRoot e = (IPackageFragmentRoot) atElement; Object[] resourcesItem = e.getNonJavaResources(); if (resourcesItem != null) for (Object element : resourcesItem) iterateItem(element, resourceName, findRes); // IJavaElement[] childs = e.getChildren(); // if (childs != null) // for (IJavaElement elementItem : childs) // iterateItem(elementItem, resourceName); break; } /*package*/ case IJavaElement.PACKAGE_FRAGMENT: { IPackageFragment e = (IPackageFragment) atElement; Object[] resourcesItem = e.getNonJavaResources(); if (resourcesItem != null) for (Object element : resourcesItem) iterateItem(element, resourceName, findRes); // IJavaElement[] childs = e.getChildren(); // if (childs != null) // for (IJavaElement elementItem : childs) // iterateItem(elementItem, resourceName); break; } } } /**Jar*/ private void iterateIJarEntryResource(IJarEntryResource atElement, final String resourceName, Map<String, Object> findRes) throws CoreException { if (atElement.getFullPath().toString().endsWith(resourceName) == true) { //System.out.println(atElement.getFullPath().toString()); JarPackageFragmentRoot root = (JarPackageFragmentRoot) atElement.getPackageFragmentRoot(); String name = root.getJar().getName(); findRes.put(name, atElement); } IJarEntryResource[] resourcesItem = atElement.getChildren(); if (resourcesItem != null) for (IJarEntryResource element : resourcesItem) iterateItem(element, resourceName, findRes); } /***/ private void iterateIFolder(IFolder atElement, final String resourceName, final Map<String, Object> findRes) throws CoreException { if (atElement.exists() == false) return;//loadResource atElement.accept(new IResourceVisitor() { @Override public boolean visit(IResource resource) throws CoreException { if (resource.exists() == false) return true; if (resource.getLocation().toString().endsWith(resourceName) == true) { //System.out.println(resource.getType() + "\t" + resource.getLocation().toString()); findRes.put(resource.getLocation().toString(), resource); } return true; } }); } /***/ private void iterateIFile(IFile atElement, String resourceName, Map<String, Object> findRes) throws CoreException { if (atElement.exists() == false) return; // System.out.println(atElement.getType() + "\t" + atElement.getName()); } // // ???...... // /**?jar */ private void loadConst4Jar(String name, IJarEntryResource atElement) { //1. ConstGroup groupModel = this.constGroupMap.get(name); if (groupModel == null) { InputStream inStream = null; String resourceName = atElement.getName(); try { // if (atElement.) JarPackageFragmentRoot root = (JarPackageFragmentRoot) atElement.getPackageFragmentRoot(); ZipFile jar = root.getJar(); ZipEntry zipEntry = jar.getEntry(atElement.getFullPath().toString().substring(1)); if (zipEntry == null) return; inStream = jar.getInputStream(zipEntry); if (inStream == null) return; } catch (Exception e) { Message.errorInfo("load IJarEntryResource " + resourceName + "?", e); return; } // groupModel = new JARSourceConstCodeGroup(name, inStream); groupModel.initGroup(); this.constGroupMap.put(name, groupModel); this.constGroupList.add(groupModel); groupModel.loadData(); } else groupModel.reloadData(); } /**????? */ private void loadConst4Res(String name, IResource resource) { //1. ConstGroup groupModel = this.constGroupMap.get(name); if (groupModel == null) { groupModel = new FileConstCodeGroup(name, (IFile) resource); groupModel.initGroup(); this.constGroupMap.put(name, groupModel); this.constGroupList.add(groupModel); groupModel.loadData(); } else groupModel.reloadData(); } }