revert compiler-message to receive only one file
[idea/community.git] / jps / jps-builders / src / org / jetbrains / jps / incremental / CompiledClass.java
1 /*
2  * Copyright 2000-2012 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.jetbrains.jps.incremental;
17
18 import com.intellij.openapi.diagnostic.Logger;
19 import com.intellij.openapi.util.UserDataHolderBase;
20 import com.intellij.openapi.util.io.FileUtil;
21 import com.intellij.util.Function;
22 import com.intellij.util.containers.ContainerUtil;
23 import org.jetbrains.annotations.NotNull;
24 import org.jetbrains.annotations.Nullable;
25 import org.jetbrains.jps.builders.BuildTarget;
26
27 import java.io.File;
28 import java.io.IOException;
29 import java.util.Collection;
30 import java.util.Collections;
31 import java.util.List;
32
33 /**
34  * In-memory representation of JVM *.class file produced by a compiler.
35  *
36  * @see ModuleLevelBuilder.OutputConsumer#registerCompiledClass(BuildTarget, CompiledClass)
37  * @author Eugene Zhuravlev
38  *         Date: 11/18/12
39  */
40 public class CompiledClass extends UserDataHolderBase{
41   private final static Logger LOG = Logger.getInstance(CompiledClass.class);
42
43   @NotNull
44   private final File myOutputFile;
45   @NotNull
46   private final Collection<File> mySourceFiles;
47   @Nullable
48   private final String myClassName;
49   @NotNull
50   private BinaryContent myContent;
51
52   private boolean myIsDirty = false;
53
54   /**
55    * @param outputFile  path where generated *.class file needs to be stored
56    * @param sourceFiles paths to classes which were used to produce the JVM class (for Java language it always contains single *.java file)
57    * @param className   fully qualified dot-separated name of the class
58    * @param content     content which need to be written to {@code outputFile}
59    */
60   public CompiledClass(@NotNull File outputFile, @NotNull Collection<File> sourceFiles, @Nullable String className, @NotNull BinaryContent content) {
61     myOutputFile = outputFile;
62     mySourceFiles = sourceFiles;
63     myClassName = className;
64     myContent = content;
65     LOG.assertTrue(!mySourceFiles.isEmpty());
66   }
67
68   public CompiledClass(@NotNull File outputFile, @NotNull File sourceFile, @Nullable String className, @NotNull BinaryContent content) {
69     this(outputFile, Collections.singleton(sourceFile), className, content);
70   }
71
72   public void save() throws IOException {
73     myContent.saveToFile(myOutputFile);
74     myIsDirty = false;
75   }
76
77   @NotNull
78   public File getOutputFile() {
79     return myOutputFile;
80   }
81
82   @NotNull
83   public Collection<File> getSourceFiles() {
84     return mySourceFiles;
85   }
86
87   @NotNull
88   public List<String> getSourceFilesPaths() {
89     return ContainerUtil.map(mySourceFiles, new Function<File, String>() {
90       @Override
91       public String fun(File file) {
92         return file.getPath();
93       }
94     });
95   }
96
97   /**
98    * @deprecated use {@link CompiledClass#getSourceFiles()} or {{@link CompiledClass#getSourceFilesPaths()}
99    */
100   @Deprecated
101   @NotNull
102   public File getSourceFile() {
103     //noinspection ConstantConditions
104     return ContainerUtil.getFirstItem(getSourceFiles());
105   }
106
107   @Nullable
108   public String getClassName() {
109     return myClassName;
110   }
111
112   @NotNull
113   public BinaryContent getContent() {
114     return myContent;
115   }
116
117   public void setContent(@NotNull BinaryContent content) {
118     myContent = content;
119     myIsDirty = true;
120   }
121
122   public boolean isDirty() {
123     return myIsDirty;
124   }
125
126   @Override
127   public boolean equals(Object o) {
128     if (this == o) return true;
129     if (o == null || getClass() != o.getClass()) return false;
130
131     CompiledClass aClass = (CompiledClass)o;
132
133     if (!FileUtil.filesEqual(myOutputFile, aClass.myOutputFile)) return false;
134
135     return true;
136   }
137
138   @Override
139   public int hashCode() {
140     return FileUtil.fileHashCode(myOutputFile);
141   }
142
143   @Override
144   public String toString() {
145     return "CompiledClass{" +
146            "myOutputFile=" + myOutputFile +
147            ", mySourceFiles=" + mySourceFiles +
148            ", myIsDirty=" + myIsDirty +
149            '}';
150   }
151 }