From 57d28b65f67aa9d7881b6066e60a69b0b9dc80e5 Mon Sep 17 00:00:00 2001 From: Dmitry Lomov Date: Mon, 4 Jun 2012 13:15:33 +0200 Subject: [PATCH] More refactorings of SerializationManager --- .../psi/stubs/StubSerializationHelper.java | 6 +- ...anager.java => StubSerializationUtil.java} | 31 +++--- .../src/com/intellij/psi/stubs/StubTree.java | 3 +- .../psi/stubs/SerializationManager.java | 70 ++++++++++++ .../psi/stubs/SerializedStubTree.java | 100 ------------------ .../psi/stubs/SerializationManagerEx.java | 0 .../psi/stubs/SerializationManagerImpl.java | 47 +------- 7 files changed, 90 insertions(+), 167 deletions(-) rename platform/core-api/src/com/intellij/psi/stubs/{SerializationManager.java => StubSerializationUtil.java} (53%) create mode 100644 platform/indexing-api/src/com/intellij/psi/stubs/SerializationManager.java delete mode 100644 platform/indexing-impl/src/com/intellij/psi/stubs/SerializedStubTree.java rename platform/{core-api => lang-api}/src/com/intellij/psi/stubs/SerializationManagerEx.java (100%) diff --git a/platform/core-api/src/com/intellij/psi/stubs/StubSerializationHelper.java b/platform/core-api/src/com/intellij/psi/stubs/StubSerializationHelper.java index 3abfa1fa394b..358847d16e92 100644 --- a/platform/core-api/src/com/intellij/psi/stubs/StubSerializationHelper.java +++ b/platform/core-api/src/com/intellij/psi/stubs/StubSerializationHelper.java @@ -32,14 +32,14 @@ import java.util.List; * Author: dmitrylomov */ public class StubSerializationHelper { - private static final Logger LOG = Logger.getInstance("#com.intellij.psi.stubs.SerializationManagerBase"); + private static final Logger LOG = Logger.getInstance("#com.intellij.psi.stubs.StubSerializationHelper"); private AbstractStringEnumerator myNameStorage; protected final TIntObjectHashMap> myIdToSerializer = new TIntObjectHashMap>(); protected final TObjectIntHashMap> mySerializerToId = new TObjectIntHashMap>(); - protected StubSerializationHelper(AbstractStringEnumerator nameStorage) { + public StubSerializationHelper(AbstractStringEnumerator nameStorage) { myNameStorage = nameStorage; } public void assignId(@NotNull final StubSerializer serializer) throws IOException { @@ -59,7 +59,7 @@ public class StubSerializationHelper { } private void doSerialize(final StubElement rootStub, final StubOutputStream stream) throws IOException { - final StubSerializer serializer = SerializationManager.getInstance().getSerializer(rootStub); + final StubSerializer serializer = StubSerializationUtil.getSerializer(rootStub); DataInputOutputUtil.writeINT(stream, getClassId(serializer)); serializer.serialize(rootStub, stream); diff --git a/platform/core-api/src/com/intellij/psi/stubs/SerializationManager.java b/platform/core-api/src/com/intellij/psi/stubs/StubSerializationUtil.java similarity index 53% rename from platform/core-api/src/com/intellij/psi/stubs/SerializationManager.java rename to platform/core-api/src/com/intellij/psi/stubs/StubSerializationUtil.java index 46267da19c59..45f610676d80 100644 --- a/platform/core-api/src/com/intellij/psi/stubs/SerializationManager.java +++ b/platform/core-api/src/com/intellij/psi/stubs/StubSerializationUtil.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,25 +13,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -/* - * @author max - */ package com.intellij.psi.stubs; -import com.intellij.openapi.application.ApplicationManager; +/** + * Author: dmitrylomov + */ +public abstract class StubSerializationUtil { + private StubSerializationUtil() {} -import java.io.InputStream; -import java.io.OutputStream; + public static StubSerializer getSerializer(StubElement rootStub) { + if (rootStub instanceof PsiFileStub) { + final PsiFileStub fileStub = (PsiFileStub)rootStub; + return fileStub.getType(); + } -public abstract class SerializationManager { - - public static SerializationManager getInstance() { - return ApplicationManager.getApplication().getComponent(SerializationManager.class); + return rootStub.getStubType(); } - - public abstract void registerSerializer(StubSerializer serializer); - - public abstract StubSerializer getSerializer(StubElement rootStub); - -} \ No newline at end of file +} diff --git a/platform/core-impl/src/com/intellij/psi/stubs/StubTree.java b/platform/core-impl/src/com/intellij/psi/stubs/StubTree.java index d1021e2be84c..6b13f81de73b 100644 --- a/platform/core-impl/src/com/intellij/psi/stubs/StubTree.java +++ b/platform/core-impl/src/com/intellij/psi/stubs/StubTree.java @@ -67,13 +67,12 @@ public class StubTree { public Map> indexStubTree() { final Map> result = new HashMap>(); - SerializationManager serializationManager = SerializationManager.getInstance(); StubIndexSink sink = new StubIndexSink(result); for (int i = 0, plainListSize = myPlainList.size(); i < plainListSize; i++) { final StubElement stub = myPlainList.get(i); sink.myStubIdx = i; - serializationManager.getSerializer(stub).indexStub(stub, sink); + StubSerializationUtil.getSerializer(stub).indexStub(stub, sink); } return result; diff --git a/platform/indexing-api/src/com/intellij/psi/stubs/SerializationManager.java b/platform/indexing-api/src/com/intellij/psi/stubs/SerializationManager.java new file mode 100644 index 000000000000..4426bd038967 --- /dev/null +++ b/platform/indexing-api/src/com/intellij/psi/stubs/SerializationManager.java @@ -0,0 +1,70 @@ +/* + * Copyright 2000-2009 JetBrains s.r.o. + * + * 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. + */ + +/* + * @author max + */ +package com.intellij.psi.stubs; + +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.extensions.Extensions; +import com.intellij.psi.tree.IElementType; +import com.intellij.psi.tree.IStubFileElementType; + +import java.util.ArrayList; +import java.util.List; + +public abstract class SerializationManager { + + protected final List> myAllSerializers = new ArrayList>(); + private volatile boolean mySerializersLoaded = false; + + public static SerializationManager getInstance() { + return ApplicationManager.getApplication().getComponent(SerializationManager.class); + } + + public void registerSerializer(StubSerializer serializer) { + myAllSerializers.add(serializer); + } + + protected void initSerializers() { + if (mySerializersLoaded) return; + synchronized (this) { + if (mySerializersLoaded) return; + for (StubElementTypeHolderEP holderEP : Extensions.getExtensions(StubElementTypeHolderEP.EP_NAME)) { + holderEP.initialize(); + } + final IElementType[] stubElementTypes = IElementType.enumerate(new IElementType.Predicate() { + public boolean matches(final IElementType type) { + return type instanceof StubSerializer; + } + }); + for (IElementType type : stubElementTypes) { + if (type instanceof IStubFileElementType && + ((IStubFileElementType)type).getExternalId().equals(PsiFileStubImpl.TYPE.getExternalId())) { + continue; + } + StubSerializer stubSerializer = (StubSerializer)type; + + if (!myAllSerializers.contains(stubSerializer)) { + registerSerializer(stubSerializer); + } + } + mySerializersLoaded = true; + } + } + +} \ No newline at end of file diff --git a/platform/indexing-impl/src/com/intellij/psi/stubs/SerializedStubTree.java b/platform/indexing-impl/src/com/intellij/psi/stubs/SerializedStubTree.java deleted file mode 100644 index 47a07ed76341..000000000000 --- a/platform/indexing-impl/src/com/intellij/psi/stubs/SerializedStubTree.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2000-2009 JetBrains s.r.o. - * - * 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. - */ - -/* - * @author max - */ -package com.intellij.psi.stubs; - -import com.intellij.util.io.UnsyncByteArrayInputStream; -import org.jetbrains.annotations.Nullable; - -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; - -public class SerializedStubTree { - private final byte[] myBytes; - private final int myLength; - private StubElement myStubElement; - - public SerializedStubTree(final byte[] bytes, int length, @Nullable StubElement stubElement) { - myBytes = bytes; - myLength = length; - myStubElement = stubElement; - } - - public SerializedStubTree(DataInput in) throws IOException { - myLength = in.readInt(); - myBytes = new byte[myLength]; - myStubElement = null; - in.readFully(myBytes); - } - - public void write(DataOutput out) throws IOException{ - out.writeInt(myLength); - out.write(myBytes, 0, myLength); - } - - // willIndexStub is one time optimization hint, once can safely pass false - public StubElement getStub(boolean willIndexStub) { - StubElement stubElement = myStubElement; - if (stubElement != null) { - // not null myStubElement means we just built SerializedStubTree for indexing, - // if we request stub for indexing we can safely use it - myStubElement = null; - if (willIndexStub) return stubElement; - } - return SerializationManagerEx.getInstanceEx().deserialize(new UnsyncByteArrayInputStream(myBytes)); - } - - public boolean equals(final Object that) { - if (this == that) { - return true; - } - if (!(that instanceof SerializedStubTree)) { - return false; - } - final SerializedStubTree thatTree = (SerializedStubTree)that; - final int length = myLength; - if (length != thatTree.myLength) { - return false; - } - - final byte[] thisBytes = myBytes; - final byte[] thatBytes = thatTree.myBytes; - for (int i=0; i< length; i++) { - if (thisBytes[i] != thatBytes[i]) { - return false; - } - } - - return true; - } - - public int hashCode() { - if (myBytes == null) - return 0; - - int result = 1; - for (int i = 0; i < myLength; i++) { - result = 31 * result + myBytes[i]; - } - - return result; - } - -} \ No newline at end of file diff --git a/platform/core-api/src/com/intellij/psi/stubs/SerializationManagerEx.java b/platform/lang-api/src/com/intellij/psi/stubs/SerializationManagerEx.java similarity index 100% rename from platform/core-api/src/com/intellij/psi/stubs/SerializationManagerEx.java rename to platform/lang-api/src/com/intellij/psi/stubs/SerializationManagerEx.java diff --git a/platform/lang-api/src/com/intellij/psi/stubs/SerializationManagerImpl.java b/platform/lang-api/src/com/intellij/psi/stubs/SerializationManagerImpl.java index d7dab205dee1..e438e9d38b59 100644 --- a/platform/lang-api/src/com/intellij/psi/stubs/SerializationManagerImpl.java +++ b/platform/lang-api/src/com/intellij/psi/stubs/SerializationManagerImpl.java @@ -17,26 +17,17 @@ package com.intellij.psi.stubs; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.components.ApplicationComponent; -import com.intellij.openapi.diagnostic.LogUtil; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.util.ShutDownTracker; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.psi.tree.IElementType; -import com.intellij.psi.tree.IStubFileElementType; import com.intellij.util.io.AbstractStringEnumerator; -import com.intellij.util.io.DataInputOutputUtil; import com.intellij.util.io.PersistentStringEnumerator; -import gnu.trove.TIntObjectHashMap; -import gnu.trove.TObjectIntHashMap; import org.jetbrains.annotations.NotNull; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.util.ArrayList; -import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; /* @@ -49,9 +40,7 @@ public class SerializationManagerImpl extends SerializationManagerEx implements private final File myFile = new File(PathManager.getIndexRoot(), "rep.names"); private final AtomicBoolean myShutdownPerformed = new AtomicBoolean(false); private AbstractStringEnumerator myNameStorage; - private final List> myAllSerializers = new ArrayList>(); private StubSerializationHelper myStubSerializationHelper; - private volatile boolean mySerializersLoaded = false; public SerializationManagerImpl() { myFile.getParentFile().mkdirs(); @@ -145,7 +134,7 @@ public class SerializationManagerImpl extends SerializationManagerEx implements } public void registerSerializer(@NotNull StubSerializer serializer) { - myAllSerializers.add(serializer); + super.registerSerializer(serializer); try { myStubSerializationHelper.assignId(serializer); } @@ -156,31 +145,9 @@ public class SerializationManagerImpl extends SerializationManagerEx implements } - private synchronized void initSerializers() { - if (mySerializersLoaded) return; - for(StubElementTypeHolderEP holderEP: Extensions.getExtensions(StubElementTypeHolderEP.EP_NAME)) { - holderEP.initialize(); - } - final IElementType[] stubElementTypes = IElementType.enumerate(new IElementType.Predicate() { - public boolean matches(final IElementType type) { - return type instanceof StubSerializer; - } - }); - for(IElementType type: stubElementTypes) { - if (type instanceof IStubFileElementType && ((IStubFileElementType) type).getExternalId().equals(PsiFileStubImpl.TYPE.getExternalId())) { - continue; - } - StubSerializer stubSerializer = (StubSerializer) type; - - if (!myAllSerializers.contains(stubSerializer)) { - registerSerializer(stubSerializer); - } - } - mySerializersLoaded = true; - } public void serialize(StubElement rootStub, OutputStream stream) { - if (!mySerializersLoaded) initSerializers(); + initSerializers(); try { myStubSerializationHelper.serialize(rootStub, stream); } @@ -190,17 +157,9 @@ public class SerializationManagerImpl extends SerializationManagerEx implements } } - public StubSerializer getSerializer(final StubElement rootStub) { - if (rootStub instanceof PsiFileStub) { - final PsiFileStub fileStub = (PsiFileStub)rootStub; - return fileStub.getType(); - } - - return rootStub.getStubType(); - } public StubElement deserialize(InputStream stream) { - if (!mySerializersLoaded) initSerializers(); + initSerializers(); try { return myStubSerializationHelper.deserialize(stream);