/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.nbstudio.project; import com.intersys.objects.CacheException; import com.intersys.objects.CacheQuery; import java.beans.PropertyChangeListener; import java.io.IOException; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.Icon; import javax.swing.ImageIcon; import org.nbstudio.core.Connection; import org.nbstudio.project.customizer.CacheProjectCustomizerProvider; import org.netbeans.api.project.Project; import org.netbeans.api.project.ProjectInformation; import org.netbeans.spi.project.ProjectState; import org.netbeans.spi.project.support.LookupProviderSupport; import org.openide.filesystems.FileObject; import org.openide.util.ImageUtilities; import org.openide.util.Lookup; import org.openide.util.lookup.Lookups; /** * * @author daimor */ public class CacheProject implements Project { private Lookup lkp; private final FileObject prj; private final ProjectState state; private final Connection conn; private final String cacheProject; private List<String> items = null; public CacheProject(FileObject prj, ProjectState state) throws IOException, CacheException { this.prj = prj; this.state = state; Properties propsProject = new Properties(); FileObject projectFile = prj.getFileObject(CacheProjectFactory.PROJECT_FILE); propsProject.load(projectFile.getInputStream()); this.cacheProject = propsProject.getProperty("server.project"); String addr = propsProject.getProperty("server.addr"); String port = propsProject.getProperty("server.port"); if (addr == null || port == null) { throw new IOException("Error in project properties"); } String namespace = propsProject.getProperty("server.namespace"); String login = propsProject.getProperty("server.login"); String pass = propsProject.getProperty("server.pass"); String url = "jdbc:Cache://" + addr + ":" + port + "/" + namespace; conn = new Connection(prj.getName(), addr, port, namespace, login, pass); } public List<String> getItems() { if (this.items != null) { return this.items; } this.items = new ArrayList<>(); if ((getProjectName() == null) || (getProjectName().isEmpty())) { return this.items; } try { CacheQuery q = new CacheQuery(getConnection().getAssociatedConnection(), "%Studio.Project", "ProjectItemsList"); java.sql.ResultSet rs = q.execute(new Object[]{getProjectName()}); while (rs.next()) { String fileName = rs.getString("Name"); String fileType = rs.getString("Type"); if ("CLS".equalsIgnoreCase(fileType)) { fileName += ".cls"; } Pattern pattern = Pattern.compile("(\\w+)\\.(\\w+)\\."); Matcher matcher = pattern.matcher(fileName); while (matcher.find()) { fileName = matcher.replaceFirst("$1\\/$2\\."); matcher = pattern.matcher(fileName); } String[] path = fileName.split("\\/"); StringBuilder newPath = new StringBuilder(); for (String string : path) { if (newPath.length() > 0) { newPath.append("."); } newPath.append(string); items.add(newPath.toString()); } } } catch (CacheException | SQLException ex) { ex.printStackTrace(); } return this.items; } public boolean containsItem(String fileName) { if (this.items == null) { getItems(); } assert (items != null); if (items.isEmpty()) { return true; } return items.contains(fileName); } @Override public FileObject getProjectDirectory() { return prj; } public String getProjectName() { return this.cacheProject; } @Override public boolean equals(Object obj) { if (obj instanceof CacheProject) { return this.prj.equals(((CacheProject) obj).getProjectDirectory()); } else { return false; } } @Override public int hashCode() { int hash = 7; hash = 97 * hash + Objects.hashCode(this.prj); return hash; } @Override public Lookup getLookup() { if (lkp == null) { lkp = Lookups.fixed(new Object[]{ this, new Info(), new CacheProjectLogicalView(this), new CacheProjectCustomizerProvider(this) }); } return LookupProviderSupport.createCompositeLookup( lkp, "Projects/org-nbstudio-project/Lookup"); } public Connection getConnection() { return conn; } public final class Info implements ProjectInformation { @Override public String getName() { return prj.getName(); } @Override public String getDisplayName() { return getName(); } @Override public Icon getIcon() { return new ImageIcon(ImageUtilities.loadImage("resources/prjFilesIcon.gif")); } @Override public Project getProject() { return CacheProject.this; } @Override public void addPropertyChangeListener(PropertyChangeListener listener) { } @Override public void removePropertyChangeListener(PropertyChangeListener listener) { } } }