diff options
author | lresende <lresende@13f79535-47bb-0310-9956-ffa450edef68> | 2008-12-05 05:23:34 +0000 |
---|---|---|
committer | lresende <lresende@13f79535-47bb-0310-9956-ffa450edef68> | 2008-12-05 05:23:34 +0000 |
commit | eaed3bce4b4cf918885d6c4e589970876cf61d70 (patch) | |
tree | ff83f4329aa7f1f62278f858ebba5aa6f8dee7c2 /branches/sca-java-1.x/modules/contribution-impl/src/main | |
parent | af380ef0af6e6a034381bebfc4a9a3e0f585f9a3 (diff) |
Delaying initialization of Contribution repository to avoid creation of target directory. No refactoring or removal of obsolete code was done to maintain backward compatibility.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@723588 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'branches/sca-java-1.x/modules/contribution-impl/src/main')
-rw-r--r-- | branches/sca-java-1.x/modules/contribution-impl/src/main/java/org/apache/tuscany/sca/contribution/service/impl/ContributionRepositoryImpl.java | 332 |
1 files changed, 201 insertions, 131 deletions
diff --git a/branches/sca-java-1.x/modules/contribution-impl/src/main/java/org/apache/tuscany/sca/contribution/service/impl/ContributionRepositoryImpl.java b/branches/sca-java-1.x/modules/contribution-impl/src/main/java/org/apache/tuscany/sca/contribution/service/impl/ContributionRepositoryImpl.java index 9375cb917f..d567aa5c68 100644 --- a/branches/sca-java-1.x/modules/contribution-impl/src/main/java/org/apache/tuscany/sca/contribution/service/impl/ContributionRepositoryImpl.java +++ b/branches/sca-java-1.x/modules/contribution-impl/src/main/java/org/apache/tuscany/sca/contribution/service/impl/ContributionRepositoryImpl.java @@ -65,7 +65,9 @@ import org.apache.tuscany.sca.monitor.Problem.Severity; public class ContributionRepositoryImpl implements ContributionRepository { private static final String NS = "http://tuscany.apache.org/xmlns/1.0-SNAPSHOT"; private static final String DOMAIN_INDEX_FILENAME = "sca-domain.xml"; - private final File rootFile; + private boolean initialized = false; + private String repository = null; + private File rootFile = null; private Map<String, String> contributionLocations = new HashMap<String, String>(); private Map<String, Contribution> contributionMap = new HashMap<String, Contribution>(); @@ -125,97 +127,25 @@ public class ContributionRepositoryImpl implements ContributionRepository { */ public ContributionRepositoryImpl(final String repository, XMLInputFactory factory, Monitor monitor) throws IOException { this.monitor = monitor; - String root = repository; - if (repository == null) { - root = AccessController.doPrivileged(new PrivilegedAction<String>() { - public String run() { - // Default to <user.home>/.tuscany/domains/local/ - String userHome = System.getProperty("user.home"); - String slash = File.separator; - return userHome + slash + ".tuscany" + slash + "domains" + slash + "local" + slash; - } - }); - } - - // Allow privileged access to File. Requires FilePermission in security policy file. - final String finalRoot = root; - this.rootFile = AccessController.doPrivileged(new PrivilegedAction<File>() { - public File run() { - return new File(finalRoot); - } - }); - - // Allow privileged access to File. Requires FilePermission in security policy file. - this.domain = AccessController.doPrivileged(new PrivilegedAction<URI>() { - public URI run() { - return rootFile.toURI(); - } - }); - - // Allow privileged access to mkdir. Requires FilePermission in security policy file. - try { - AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() { - public Object run() throws IOException { - FileHelper.forceMkdir(rootFile); - return null; - } - }); - } catch (PrivilegedActionException e) { - error("PrivilegedActionException", rootFile, (IOException)e.getException()); - throw (IOException)e.getException(); - } - - // Allow privileged access to test file. Requires FilePermissions in security policy file. - Boolean notDirectory = AccessController.doPrivileged(new PrivilegedAction<Boolean>() { - public Boolean run() { - return (!rootFile.exists() || !rootFile.isDirectory() || !rootFile.canRead()); - } - }); - if (notDirectory) { - error("RootNotDirectory", rootFile, repository); - throw new IOException("The root is not a directory: " + repository); - } + this.repository = repository; this.factory = factory; } + public URI getDomain() { return domain; } - /** - * Resolve contribution location in the repository -> root repository / - * contribution file -> contribution group id / artifact id / version - * - * @param contribution - * @return - */ - private File mapToFile(URL sourceURL) { - String fileName = FileHelper.toFile(sourceURL).getName(); - return new File(rootFile, "contributions" + File.separator + fileName); - } - - /** - * Write a specific source InputStream to a file on disk - * - * @param source contents of the file to be written to disk - * @param target file to be written - * @throws IOException - */ - public static void copy(InputStream source, File target) throws IOException { - BufferedOutputStream out = null; - BufferedInputStream in = null; - - try { - out = new BufferedOutputStream(new FileOutputStream(target)); - in = new BufferedInputStream(source); - IOHelper.copy(in, out); - } finally { - IOHelper.closeQuietly(out); - IOHelper.closeQuietly(in); - } - } - public URL store(final String contribution, URL sourceURL, InputStream contributionStream) throws IOException { + if(! initialized) { + try { + initializeRepository(); + } catch(Exception e) { + //ignore + } + } + + // where the file should be stored in the repository final File location = mapToFile(sourceURL); FileHelper.forceMkdir(location.getParentFile()); @@ -244,6 +174,14 @@ public class ContributionRepositoryImpl implements ContributionRepository { } public URL store(String contribution, URL sourceURL) throws IOException { + if(! initialized) { + try { + initializeRepository(); + } catch(Exception e) { + //ignore + } + } + // where the file should be stored in the repository File location = mapToFile(sourceURL); File source = FileHelper.toFile(sourceURL); @@ -270,6 +208,15 @@ public class ContributionRepositoryImpl implements ContributionRepository { } public URL find(String contribution) { + if(! initialized) { + try { + initializeRepository(); + } catch(Exception e) { + //ignore + } + } + + if (contribution == null) { return null; } @@ -287,6 +234,15 @@ public class ContributionRepositoryImpl implements ContributionRepository { } public void remove(String contribution) { + if(! initialized) { + try { + initializeRepository(); + } catch(Exception e) { + //ignore + } + } + + URL contributionURL = this.find(contribution); if (contributionURL != null) { // remove @@ -304,8 +260,147 @@ public class ContributionRepositoryImpl implements ContributionRepository { return new ArrayList<String>(contributionLocations.keySet()); } - public void init() { - File domainFile = new File(rootFile, "sca-domain.xml"); + /** + * Contribution Registry methods + */ + + + public void addContribution(Contribution contribution) { + contributionMap.put(contribution.getURI(), contribution); + contributions.add(contribution); + } + + public void removeContribution(Contribution contribution) { + contributionMap.remove(contribution.getURI()); + contributions.remove(contribution); + } + + public void updateContribution(Contribution contribution) { + Contribution oldContribution = contributionMap.remove(contribution.getURI()); + contributions.remove(oldContribution); + contributionMap.put(contribution.getURI(), contribution); + contributions.add(contribution); + } + + public Contribution getContribution(String uri) { + return contributionMap.get(uri); + } + + public List<Contribution> getContributions() { + return Collections.unmodifiableList(contributions); + } + + + /** + * Resolve contribution location in the repository -> root repository / + * contribution file -> contribution group id / artifact id / version + * + * @param contribution + * @return + */ + private File mapToFile(URL sourceURL) { + String fileName = FileHelper.toFile(sourceURL).getName(); + return new File(rootFile, "contributions" + File.separator + fileName); + } + + + /** + * Persist contribution state to xml file in the repository + */ + private void saveMap() { + File domainFile = new File(rootFile, DOMAIN_INDEX_FILENAME); + FileOutputStream os = null; + try { + os = new FileOutputStream(domainFile); + PrintWriter writer = new PrintWriter(new OutputStreamWriter(os, "UTF-8")); + writer.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); + writer.println("<domain uri=\"" + getDomain() + "\" xmlns=\"" + NS + "\">"); + for (Map.Entry<String, String> e : contributionLocations.entrySet()) { + writer.println(" <contribution uri=\"" + e.getKey() + "\" location=\"" + e.getValue() + "\"/>"); + } + writer.println("</domain>"); + writer.flush(); + } catch (IOException e) { + IllegalArgumentException ae = new IllegalArgumentException(e); + error("IllegalArgumentException", os, ae); + throw ae; + } finally { + IOHelper.closeQuietly(os); + } + } + + /** + * Initialize contribution repository + * @throws IOException + */ + private void initializeRepository() throws IOException { + String root = this.repository; + if (root == null) { + root = AccessController.doPrivileged(new PrivilegedAction<String>() { + public String run() { + // Default to <user.home>/.tuscany/domains/local/ + String userHome = System.getProperty("user.home"); + String slash = File.separator; + return userHome + slash + ".tuscany" + slash + "domains" + slash + "local" + slash; + } + }); + } + + // Allow privileged access to File. Requires FilePermission in security policy file. + final String finalRoot = root; + this.rootFile = AccessController.doPrivileged(new PrivilegedAction<File>() { + public File run() { + return new File(finalRoot); + } + }); + + // Allow privileged access to File. Requires FilePermission in security policy file. + this.domain = AccessController.doPrivileged(new PrivilegedAction<URI>() { + public URI run() { + return rootFile.toURI(); + } + }); + + // Allow privileged access to mkdir. Requires FilePermission in security policy file. + try { + AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() { + public Object run() throws IOException { + FileHelper.forceMkdir(rootFile); + return null; + } + }); + } catch (PrivilegedActionException e) { + error("PrivilegedActionException", rootFile, (IOException)e.getException()); + throw (IOException)e.getException(); + } + + // Allow privileged access to test file. Requires FilePermissions in security policy file. + Boolean notDirectory = AccessController.doPrivileged(new PrivilegedAction<Boolean>() { + public Boolean run() { + return (!rootFile.exists() || !rootFile.isDirectory() || !rootFile.canRead()); + } + }); + if (notDirectory) { + error("RootNotDirectory", rootFile, repository); + throw new IOException("The root is not a directory: " + repository); + } + + } + + + /** + * + */ + void init() { + if(! initialized) { + try { + initializeRepository(); + } catch(Exception e) { + //ignore + } + } + + File domainFile = new File(rootFile, "sca-domain.xml"); if (!domainFile.isFile()) { return; } @@ -346,54 +441,29 @@ public class ContributionRepositoryImpl implements ContributionRepository { } } - private void saveMap() { - File domainFile = new File(rootFile, DOMAIN_INDEX_FILENAME); - FileOutputStream os = null; + /** + * Utility functions + */ + + /** + * Write a specific source InputStream to a file on disk + * + * @param source contents of the file to be written to disk + * @param target file to be written + * @throws IOException + */ + private static void copy(InputStream source, File target) throws IOException { + BufferedOutputStream out = null; + BufferedInputStream in = null; + try { - os = new FileOutputStream(domainFile); - PrintWriter writer = new PrintWriter(new OutputStreamWriter(os, "UTF-8")); - writer.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); - writer.println("<domain uri=\"" + getDomain() + "\" xmlns=\"" + NS + "\">"); - for (Map.Entry<String, String> e : contributionLocations.entrySet()) { - writer.println(" <contribution uri=\"" + e.getKey() + "\" location=\"" + e.getValue() + "\"/>"); - } - writer.println("</domain>"); - writer.flush(); - } catch (IOException e) { - IllegalArgumentException ae = new IllegalArgumentException(e); - error("IllegalArgumentException", os, ae); - throw ae; + out = new BufferedOutputStream(new FileOutputStream(target)); + in = new BufferedInputStream(source); + IOHelper.copy(in, out); } finally { - IOHelper.closeQuietly(os); + IOHelper.closeQuietly(out); + IOHelper.closeQuietly(in); } } - - public void destroy() { - } - - public void addContribution(Contribution contribution) { - contributionMap.put(contribution.getURI(), contribution); - contributions.add(contribution); - } - - public void removeContribution(Contribution contribution) { - contributionMap.remove(contribution.getURI()); - contributions.remove(contribution); - } - - public void updateContribution(Contribution contribution) { - Contribution oldContribution = contributionMap.remove(contribution.getURI()); - contributions.remove(oldContribution); - contributionMap.put(contribution.getURI(), contribution); - contributions.add(contribution); - } - - public Contribution getContribution(String uri) { - return contributionMap.get(uri); - } - - public List<Contribution> getContributions() { - return Collections.unmodifiableList(contributions); - } } |